diff -urN v2.2.15/linux/CREDITS linux/CREDITS --- v2.2.15/linux/CREDITS Wed May 3 17:16:29 2000 +++ linux/CREDITS Wed Jun 7 14:26:42 2000 @@ -1636,6 +1636,13 @@ E: Frederic.Potter@masi.ibp.fr D: Some PCI kernel support +N: Peter Pregler +E: Peter_Pregler@email.com +D: V4L-Driver for the CPiA PPC2 driven parallel connected camera. +P: 1024D/554D35AE 1314 1889 46A5 14F3 EE4D 1958 4A9C 2B10 554D 35AE +S: (ask for current address) +S: Austria + N: Stefan Probst E: sp@caldera.de D: The Linux Support Team Erlangen, 1993-97 @@ -1744,6 +1751,13 @@ S: 95170 Deuil La Barre S: France +N: Aristeu Sergio Rozanski Filho +E: aris@conectiva.com.br +D: Support for EtherExpress 10 ISA (i82595) in eepro driver +S: Rua Tocantins, 89 - Cristo Rei +S: 80050-430 - Curitiba - Parana +S: Brazil + N: Alessandro Rubini E: rubini@ipvvis.unipv.it D: the gpm mouse server and kernel support for it @@ -1758,7 +1772,9 @@ N: Paul Russell E: Paul.Russell@rustcorp.com.au -W: http://www.rustcorp.com +W: http://netfilter.filewatcher.org/ipchains +W: http://www.samba.org/netfilter/ipchains +W: http://netfilter.kernelnotes.org/ipchains D: Ruggedly handsome. D: Developed Generic IP Firewalling Chains with Michael Neuling. @@ -2260,15 +2276,15 @@ S: The Netherlands N: David Woodhouse -E: David.Woodhouse@mvhi.com -E: Dave@imladris.demon.co.uk -D: Extensive ARCnet rewrite -D: ARCnet COM20020, COM90xx IO-MAP drivers -D: SO_BINDTODEVICE in 2.1.x (from Elliot Poger's code in 2.0.31) -D: Contributed to NCPFS rewrite for 2.1.x dcache -D: Alpha platforms: SX164, LX164 and Ruffian ported to 2.1.x -S: 29, David Bull Way -S: Milton, Cambridge. CB4 6DP +E: dwmw2@infradead.org +E: dwmw2@redhat.com +D: ARCnet stuff, Applicom board driver, SO_BINDTODEVICE, +D: some Alpha platform porting from 2.0, Memory Technology Devices, +D: Acquire watchdog timer, PC speaker driver maintenance, +D: various other stuff that annoyed me by not working. +S: c/o Red Hat UK Limited +S: 35-36 Cambridge Place +S: Cambridge. CB2 1NS S: England N: Frank Xia diff -urN v2.2.15/linux/Documentation/Changes linux/Documentation/Changes --- v2.2.15/linux/Documentation/Changes Tue Jan 4 10:12:10 2000 +++ linux/Documentation/Changes Wed Jun 7 14:26:42 2000 @@ -264,7 +264,7 @@ As of 2.1.102, the IP firewalling code has been replaced; ipfwadm will no longer work. You need to obtain "ipchains," available from -http://www.rustcorp.com/linux/ipchains/ , and use that instead of +http://netfilter.filewatcher.org/ipchains/ , and use that instead of ipfwadm. To use masq forwarding you will need to obtain "ipmasqadm," @@ -718,8 +718,9 @@ ========= The 1.3.9 release: -ftp://ftp.rustcorp.com/ipchains/ipchains-1.3.9.tar.gz -ftp://ftp.rustcorp.com/ipchains/ipchains-1.3.9.tar.bz2 +http://netfilter.filewatcher.org/ipchains/ipchains-1.3.9.tar.bz2 +http://www.samba.org/netfilter/ipchains/ipchains-1.3.9.tar.bz2 +http://netfilter.kernelnotes.org/ipchains/ipchains-1.3.9.tar.bz2 IP Masq Adm =========== diff -urN v2.2.15/linux/Documentation/Configure.help linux/Documentation/Configure.help --- v2.2.15/linux/Documentation/Configure.help Wed May 3 17:16:30 2000 +++ linux/Documentation/Configure.help Wed Jun 7 14:26:42 2000 @@ -9,8 +9,8 @@ # http://jf.gee.kyoto-u.ac.jp/JF/JF-ftp/euc/Configure.help.euc # - Russian, by kaf@linux.nevod.perm.su, at # http://nevod.perm.su/service/linux/doc/kernel/Configure.help -# - French, by David Bourgin (dbourgin@wsc.com), at -# http://www.linux-kheops.com/traduc/kernels/ +# - French, by Pierre Tane (tanep@bigfoot.com), at +# http://www.traduc.org/kernelfr # - Spanish, by Carlos Perelló Marín (fperllo@ehome.encis.es), at # http://visar.csustan.edu/~carlos/ # - Italian, by Alessandro Rubini (rubini@linux.it), at @@ -207,6 +207,11 @@ Most normal users won't need the RAM disk functionality, and can thus say N here. +Default RAM disk size +CONFIG_BLK_DEV_RAM_SIZE + The default value is 4096. Only change this if you know what are + you doing. If you are using IBM S/390, then set this to 8192. + Initial RAM disk (initrd) support CONFIG_BLK_DEV_INITRD The initial RAM disk is a RAM disk that is loaded by the boot loader @@ -2374,7 +2379,7 @@ ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. Also, you will need the ipchains tool (available on the WWW at - http://www.rustcorp.com/linux/ipchains/) to allow selective blocking + http://netfilter.kernelnotes.org/ipchains/) to allow selective blocking of Internet traffic based on type, origin and destination. Note that the Linux firewall code has changed and the old program called ipfwadm won't work anymore. Please read the IPCHAINS-HOWTO. @@ -2443,9 +2448,26 @@ special protocol designed for doing this job), say Y here. In case the boot ROM of your network card was designed for booting Linux and does BOOTP itself, providing all necessary information on the kernel - command line, you can say N here. If unsure, say Y. Note that if you - want to use BOOTP, a BOOTP server must be operating on your network. - Read Documentation/nfsroot.txt for details. + command line, you can say N here. + + If unsure, say Y. Note that if you want to use BOOTP, a BOOTP server + must be operating on your network. Read Documentation/nfsroot.txt + for details. + +DHCP support +CONFIG_IP_PNP_DHCP + If you want your Linux box to mount its whole root filesystem (the + one containing the directory /) from some other computer over the + net via NFS and you want the IP address of your computer to be + discovered automatically at boot time using the DHCP protocol (a + special protocol designed for doing this job), say Y here. In case + the boot ROM of your network card was designed for booting Linux and + does DHCP itself, providing all necessary information on the kernel + command line, you can say N here. + + If unsure, say Y. Note that if you want to use DHCP, a DHCP server + must be operating on your network. Read Documentation/nfsroot.txt + for details. RARP support CONFIG_IP_PNP_RARP @@ -3844,11 +3866,10 @@ IBM ServeRAID Support CONFIG_SCSI_IPS This is support for the IBM ServeRAID hardware RAID controllers. - Consult the SCSI-HOWTO, available via anonymous FTP from - ftp://metalab.unc.edu/pub/Linux/docs/HOWTO, and the file - README.ips in drivers/scsi for more information. If this driver - does not work correctly without modification please contact the - author by email at ipslinux@us.ibm.com. + See http://www.developer.ibm.com/welcome/netfinity/serveraid.html + for more information. If this driver does not work correctly + without modification please contact the author by email at + ipslinux@us.ibm.com. BusLogic SCSI support CONFIG_SCSI_BUSLOGIC @@ -5694,6 +5715,46 @@ If you want to compile this as a module, say M and read Documentation/modules.txt. The module will be called comx-proto-fr.o. +Generic HDLC driver +CONFIG_HDLC + Say Y to this option if your Linux box contains a WAN card supported + by this driver and you are planning to connect the box to a WAN + ( = Wide Area Network). You will need supporting software from + ftp://ftp.pm.waw.pl/pub/Linux/hdlc/ + + If unsure, say N here. + +SDL RISCom/N2 driver +CONFIG_N2 + This driver is for RISCom/N2 single or dual channel ISA cards + made by SDL Communications Inc. + If you have such a card, say Y here. This driver requires + Generic HDLC driver and its supporting utility available from + ftp://ftp.pm.waw.pl/pub/Linux/hdlc/ + Note that N2csu and N2dds cards are not supported by this driver. + + If unsure, say N here. + +Moxa C101 driver +CONFIG_C101 + This driver is for C101 SuperSync ISA cards made by Moxa + Technologies Co., Ltd. + If you have such a card, say Y here. This driver requires + Generic HDLC driver and its supporting utility available from + ftp://ftp.pm.waw.pl/pub/Linux/hdlc/ + + If unsure, say N here. + +SBE wanXL driver +CONFIG_WANXL + This driver is for wanXL PCI cards made by SBE Inc. + If you have such a card, say Y here. This driver requires + Generic HDLC driver and its supporting utility available from + ftp://ftp.pm.waw.pl/pub/Linux/hdlc/ and a firmware available + from SBE Inc. + + If unsure, say N here. + Ethernet (10 or 100Mbit) CONFIG_NET_ETHERNET Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common @@ -6320,9 +6381,10 @@ EtherExpress PRO support CONFIG_EEXPRESS_PRO - If you have a network (Ethernet) card of this type, say Y. Note - however that the EtherExpress PRO/100 Ethernet card has its own - separate driver. Please read the Ethernet-HOWTO, available via FTP + If you have a network (Ethernet) card of this type, say Y. This + driver supports intel i82595{FX,TX} based boards. Note however + that the EtherExpress PRO/100 Ethernet card has its own separate + driver. Please read the Ethernet-HOWTO, available via FTP (user: anonymous) in ftp://metalab.unc.edu/pub/Linux/docs/HOWTO. This driver is also available as a module ( = code which can be @@ -7929,6 +7991,18 @@ To use the new attributes, it is recommended to use the flags '-f 600 -d 755' on the ncpmount command line. +nls default codepage +CONFIG_NLS_DEFAULT + The default NLS used when mounting filesystem. Currently, the valid + values are cp437, cp737, cp775, cp850, cp852, cp855, cp857, cp860, + cp861, cp862, cp863, cp864, cp865, cp866, cp869, cp874, cp932, cp936, + cp949, cp950, iso8859-1, iso8859-2, iso8859-3, iso8859-4, iso8859-5, + iso8859-6, iso8859-7, iso8859-8, iso8859-9, iso8859-14, iso8859-15, + koi8-r. If you specify a wrong value, it will use the built-in NLS; + compatible with iso8859-1. + + If unsure, specify it as "cp437". + nls codepage 437 CONFIG_NLS_CODEPAGE_437 The Microsoft fat filesystem family can deal with filenames in @@ -8107,6 +8181,48 @@ only, not to the file contents. You can include several codepages; say Y here if you want to include the DOS codepage for Thai. +nls codepage 932 +CONFIG_NLS_CODEPAGE_932 + The Microsoft fat filesystem family can deal with filenames in + native language character sets. These character sets are stored in + so-called DOS codepages. You need to include the appropriate + codepage if you want to be able to read/write these filenames on + DOS/Windows partitions correctly. This does apply to the filenames + only, not to the file contents. You can include several codepages; + say Y here if you want to include the DOS codepage for Shift-JIS. + +nls codepage 936 +CONFIG_NLS_CODEPAGE_936 + The Microsoft fat filesystem family can deal with filenames in + native language character sets. These character sets are stored in + so-called DOS codepages. You need to include the appropriate + codepage if you want to be able to read/write these filenames on + DOS/Windows partitions correctly. This does apply to the filenames + only, not to the file contents. You can include several codepages; + say Y here if you want to include the DOS codepage for Simplified + Chinese(GBK). + +nls codepage 949 +CONFIG_NLS_CODEPAGE_949 + The Microsoft fat filesystem family can deal with filenames in + native language character sets. These character sets are stored in + so-called DOS codepages. You need to include the appropriate + codepage if you want to be able to read/write these filenames on + DOS/Windows partitions correctly. This does apply to the filenames + only, not to the file contents. You can include several codepages; + say Y here if you want to include the DOS codepage for UHC. + +nls codepage 950 +CONFIG_NLS_CODEPAGE_950 + The Microsoft fat filesystem family can deal with filenames in + native language character sets. These character sets are stored in + so-called DOS codepages. You need to include the appropriate + codepage if you want to be able to read/write these filenames on + DOS/Windows partitions correctly. This does apply to the filenames + only, not to the file contents. You can include several codepages; + say Y here if you want to include the DOS codepage for Traditional + Chinese(Big5). + nls iso8859-1 CONFIG_NLS_ISO8859_1 If you want to display filenames with native language characters @@ -9206,14 +9322,6 @@ backlight at all, or it might print a lot of errors to the console, especially if you are using gpm. -Ignore multiple suspend/standby events -CONFIG_APM_IGNORE_MULTIPLE_SUSPEND - This option is necessary on the IBM Thinkpad 560, but should work on - all other laptops. When the APM BIOS returns multiple suspend or - standby events while one is already being processed they will be - ignored. Without this the Thinkpad 560 has troubles with the user - level daemon apmd, and with the PCMCIA package pcmcia-cs. - Ignore multiple suspend/resume cycles CONFIG_APM_IGNORE_SUSPEND_BOUNCE This option is necessary on the Dell Inspiron 3200 and others, but @@ -9349,6 +9457,18 @@ module, say M here and read Documentation/modules.txt. Most people will say N. +SBC-60XX Watchdog Timer +CONFIG_60XX_WDT + This driver can be used with the watchdog timer found on some + single board computers, namely the 6010 PII based computer. + It may well work with other cards. It reads port 0x443 to enable + and re-set the watchdog timer, and reads port 0x45 to disable + the watchdog. If you have a card that behave in similar ways, + you can probably make this driver work with your card as well. + + You can compile this driver directly into the kernel, or use + it as a module. The module will be called sbc60xxwdt.o. + Enhanced Real Time Clock Support CONFIG_RTC If you say Y here and create a character special file /dev/rtc with @@ -10169,6 +10289,22 @@ lspci -n and look for the PCI ID 5333:CA00. This driver differs slightly from OSS/Free, so PLEASE READ Documentation/sound/sonicvibes. + +Trident 4DWave DX/NX or SiS 7018 PCI Audio Core or ALi 5451 +CONFIG_SOUND_TRIDENT + Say Y or M if you have a PCI sound card utilizing the Trident + 4DWave-DX/NX chipset or your mother board chipset has SiS 7018 + built-in, or if you have an ALi 5451. The SiS 7018 PCI Audio Core + is embedded in SiS960 Super South Bridge and SiS540/630 Single + Chipset. + + Use lspci -n to find out if your sound card or chipset uses + Trident 4DWave or SiS 7018. PCI ID 1023:2000 or 1023:2001 stands + for Trident 4Dwave. PCI ID 1039:7018 stands for SiS7018. + PCI ID 10b9:5451 stands for ALi 5451. + + This driver differs slightly from OSS/Free, so PLEASE READ the + comments at the beginning of driver/sound/trident.c Rockwell WaveArtist CONFIG_SOUND_WAVEARTIST @@ -12118,7 +12254,13 @@ FBA devices CONFIG_DASD_FBA - FBA devices are currently unsupported. + FBA devices are e.g. the Vitual disk in storage under VM/ESA and others. + +Diag access to CMS formatted minidisk +CONFIG_DASD_MDSK + By using this access method you can acess any disk supported by VM/ESA. + You have to format the disk using CMS and then specify the parameter + dasd_force_diag= in the parameter line of the kernel. Compaq SMART2 support CONFIG_BLK_CPQ_DA diff -urN v2.2.15/linux/Documentation/computone.txt linux/Documentation/computone.txt --- v2.2.15/linux/Documentation/computone.txt Tue Jan 4 10:12:10 2000 +++ linux/Documentation/computone.txt Wed Jun 7 14:26:42 2000 @@ -6,12 +6,12 @@ These notes are for the drivers which have already been integrated into the kernel and have been tested on Linux kernels 2.0, 2.2, and 2.3. -Version: 1.2.4 -Date: 12/15/99 +Version: 1.2.9 +Date: 04/12/2000 Author: Andrew Manison Testing: larryg@computone.com Support: support@computone.com -Fixes and Updates: Doug McNash +Fixes and Updates: Doug McNash Proc Filesystem and Kernel Integration: Mike Warfield @@ -28,7 +28,7 @@ products previous to the Intelliport II. This driver was developed on the v2.0.x Linux tree and has been tested up -to v2.2.13; it will probably not work with earlier v1.X kernels,. +to v2.2.14; it will probably not work with earlier v1.X kernels,. 2. QUICK INSTALLATION @@ -43,49 +43,48 @@ Note the hardware address from the Computone ISA cards installed into the system. These are required for editing ip2.h or editing - /etc/config.modules, or for specification on the modprobe + /etc/modules.conf, or for specification on the modprobe command line. + Note that the /etc/modules.conf file is named /etc/conf.modules + with older versions of the module utilities. + Software - Module installation: -a) Obtain driver-kernel patch file -b) Copy to the linux source tree root, Run ip2build (if not patch) -c) Determine free irq/address to use if any (configure BIOS if need be) -d) Run "make config" or "make menuconfig" or "make xconfig" +a) Determine free irq/address to use if any (configure BIOS if need be) +b) Run "make config" or "make menuconfig" or "make xconfig" Select (m) module for CONFIG_COMPUTONE under character devices. CONFIG_PCI and CONFIG_MODULES also may need to be set. -e) Set address on ISA cards then: +c) Set address on ISA cards then: edit /usr/src/linux/drivers/char/ip2/ip2.h if needed or - edit /etc/conf.modules (or /etc/modules.conf) if needed (module). + edit /etc/modules.conf if needed (module). or both to match this setting. -f) Run "make dep" -g) Run "make modules" -h) Run "make modules_install" -i) Run "/sbin/depmod -a" -j) install driver using `modprobe ip2 ` (options listed below) -k) run ip2mkdev (either the script below or the binary version) +d) Run "make dep" +e) Run "make modules" +f) Run "make modules_install" +g) Run "/sbin/depmod -a" +h) install driver using `modprobe ip2 ` (options listed below) +i) run ip2mkdev (either the script below or the binary version) Kernel installation: -a) Obtain driver-kernel patch file -b) Copy to the linux source tree root, Run ip2build (if not patch) -c) Determine free irq/address to use if any (configure BIOS if need be) -d) Run "make config" or "make menuconfig" or "make xconfig" +a) Determine free irq/address to use if any (configure BIOS if need be) +b) Run "make config" or "make menuconfig" or "make xconfig" Select (y) kernel for CONFIG_COMPUTONE under character devices. CONFIG_PCI may need to be set if you have PCI bus. -e) Set address on ISA cards then: +c) Set address on ISA cards then: edit /usr/src/linux/drivers/char/ip2/ip2.h -f) Run "make dep" -g) Run "make zImage" or whatever target you prefer. -h) mv /usr/src/linux/arch/i386/boot/zImage to /boot. -i) Add new config for this kernel into /etc/lilo.conf, run "lilo" +d) Run "make dep" +e) Run "make zImage" or whatever target you prefer. +f) mv /usr/src/linux/arch/i386/boot/zImage to /boot. +g) Add new config for this kernel into /etc/lilo.conf, run "lilo" or copy to a floppy disk and boot from that floppy disk. -j) Reboot using this kernel -k) run ip2mkdev (either the script below or the binary version) +h) Reboot using this kernel +i) run ip2mkdev (either the script below or the binary version) 3. INSTALLATION @@ -162,6 +161,22 @@ Linux tty naming conventions: ttyF0 - ttyF255 for normal devices, and cuf0 - cuf255 for callout devices. +If you are using devfs, existing devices are automatically created within +the devfs name space. Normal devices will be ttf/0 - ttf/255 and callout +devices will be cuf/0 - cuf/255. With devfs installed, ip2mkdev will +create symbolic links in /dev from the old conventional names to the newer +devfs names as follows: + + /dev/ip2ipl[n] -> /dev/ip2/ipl[n] n = 0 - 3 + /dev/ip2stat[n] -> /dev/ip2/stat[n] n = 0 - 3 + /dev/ttyF[n] -> /dev/ttf/[n] n = 0 - 255 + /dev/cuf[n] -> /dev/cuf/[n] n = 0 - 255 + +Only devices for existing ports and boards will be created. + +You do not need to run ip2mkdev if you are using devfs and only want to +use the devfs native device names. + 4. USING THE DRIVERS @@ -195,14 +210,49 @@ use the ip2mkdev script, you must have procfs enabled and the proc file system mounted on /proc. -6. NOTES +You do not need to run ip2mkdev if you are using devfs and only want to +use the devfs native device names. + + +6. DEVFS + +DEVFS is the DEVice File System available as an add on package for the +2.2.x kernels and available as a configuration option in 2.3.46 and higher. +Devfs allows for the automatic creation and management of device names +under control of the device drivers themselves. The Devfs namespace is +hierarchial and reduces the clutter present in the normal flat /dev +namespace. Devfs names and conventional device names may be intermixed. +A userspace daemon, devfsd, exists to allow for automatic creation and +management of symbolic links from the devfs name space to the conventional +names. More details on devfs can be found on the DEVFS home site at + or in the file kernel +documenation files, .../linux/Documenation/filesystems/devfs/REAME. + +If you are using devfs, existing devices are automatically created within +the devfs name space. Normal devices will be ttf/0 - ttf/255 and callout +devices will be cuf/0 - cuf/255. With devfs installed, ip2mkdev will +create symbolic links in /dev from the old conventional names to the newer +devfs names as follows: + + /dev/ip2ipl[n] -> /dev/ip2/ipl[n] n = 0 - 3 + /dev/ip2stat[n] -> /dev/ip2/stat[n] n = 0 - 3 + /dev/ttyF[n] -> /dev/ttf/[n] n = 0 - 255 + /dev/cuf[n] -> /dev/cuf/[n] n = 0 - 255 + +Only devices for existing ports and boards will be created. + +You do not need to run ip2mkdev if you are using devfs and only want to +use the devfs native device names. + + +7. NOTES This is a release version of the driver, but it is impossible to test it in all configurations of Linux. If there is any anomalous behaviour that does not match the standard serial port's behaviour please let us know. -7. ip2mkdev shell script +8. ip2mkdev shell script Previously, this script was simply attached here. It is now attached as a shar archive to make it easier to extract the script from the documentation. @@ -223,15 +273,15 @@ # To extract the files from this archive, save it to some FILE, remove # everything before the `!/bin/sh' line above, then type `sh FILE'. # -# Made on 1999-12-17 16:06 EST by . -# Source directory was `/mnt2/src/linux-2.3.33/Documentation'. +# Made on 2000-03-10 11:55 EST by . +# Source directory was `/mnt1/src/linux-2.3.50c/Documentation'. # # Existing files will *not* be overwritten unless `-c' is specified. # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ -# 3300 -rwxr-xr-x ip2mkdev +# 4061 -rwxr-xr-x ip2mkdev # save_IFS="${IFS}" IFS="${IFS}:" @@ -278,7 +328,7 @@ fi rm -f 1231235999 $$.touch # -if mkdir _sh06360; then +if mkdir _sh17088; then $echo 'x -' 'creating lock directory' else $echo 'failed to create lock directory' @@ -291,7 +341,7 @@ $echo 'x -' extracting 'ip2mkdev' '(text)' sed 's/^X//' << 'SHAR_EOF' > 'ip2mkdev' && #!/bin/sh - -X +# # ip2mkdev # # Make or remove devices as needed for Computone Intelliport drivers @@ -300,16 +350,48 @@ # with it. That prevents us from screwing up open ttys, ownership # and permissions on a running system! # -# This script will NOT remove devices that no longer exist because -# their board or interface box has been removed. If you want to get -# rid of them, you can manually do an "rm -f /dev/ttyF* /dev/cuaf*" -# before running this script, which will then recreate all the valid -# devices +# This script will NOT remove devices that no longer exist if their +# board or interface box has been removed. If you want to get rid +# of them, you can manually do an "rm -f /dev/ttyF* /dev/cuaf*" +# before running this script. Running this script will then recreate +# all the valid devices. # # =mhw= # Michael H. Warfield # mhw@wittsend.com # +# Updated 03/09/2000 for devfs support in ip2 drivers. =mhw= +# +X +if test -d /dev/ip2 ; then +# This is devfs mode... We don't do anything except create symlinks +# from the real devices to the old names! +X cd /dev +X echo "Creating symbolic links to devfs devices" +X for i in `ls ip2` ; do +X if test ! -L ip2$i ; then +X # Remove it incase it wasn't a symlink (old device) +X rm -f ip2$i +X ln -s ip2/$i ip2$i +X fi +X done +X for i in `ls ttf` ; do +X if test ! -L ttyF$i ; then +X # Remove it incase it wasn't a symlink (old device) +X rm -f ttyF$i +X ln -s ttyf/$i ttyF$i +X fi +X done +X for i in `ls cuf` ; do +X if test ! -L cuf$i ; then +X # Remove it incase it wasn't a symlink (old device) +X rm -f cuf$i +X ln -s cuf/$i cuf$i +X fi +X done +X exit 0 +fi +X if test ! -f /proc/tty/drivers then X echo "\ @@ -344,8 +426,8 @@ # Ok... So we got the driver loaded and we can locate the procfs files. # Next we need our major numbers. X -TTYMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/tty/!d' -e 's/.*tty.[ ]*\([0-9]*\)[ ]*.*/\1/' < /proc/tty/drivers` -CUAMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/cu/!d' -e 's/.*cu.[ ]*\([0-9]*\)[ ]*.*/\1/' < /proc/tty/drivers` +TTYMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/tt/!d' -e 's/.*tt[^ ]*[ ]*\([0-9]*\)[ ]*.*/\1/' < /proc/tty/drivers` +CUAMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/cu/!d' -e 's/.*cu[^ ]*[ ]*\([0-9]*\)[ ]*.*/\1/' < /proc/tty/drivers` BRDMAJOR=`sed -e '/^Driver: /!d' -e 's/.*IMajor=\([0-9]*\)[ ]*.*/\1/' < /proc/tty/driver/ip2` X echo "\ @@ -426,20 +508,20 @@ X Xexit 0 SHAR_EOF - $shar_touch -am 1217160599 'ip2mkdev' && + $shar_touch -am 03101153100 'ip2mkdev' && chmod 0755 'ip2mkdev' || $echo 'restore of' 'ip2mkdev' 'failed' if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \ && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then md5sum -c << SHAR_EOF >/dev/null 2>&1 \ || $echo 'ip2mkdev:' 'MD5 check failed' -eccd181f4a2005e47a969fc83885df61 ip2mkdev +b0671abeba07b0a9266b70aaf24509b3 ip2mkdev SHAR_EOF else shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'ip2mkdev'`" - test 3300 -eq "$shar_count" || - $echo 'ip2mkdev:' 'original size' '3300,' 'current size' "$shar_count!" + test 4061 -eq "$shar_count" || + $echo 'ip2mkdev:' 'original size' '4061,' 'current size' "$shar_count!" fi fi -rm -fr _sh06360 +rm -fr _sh17088 exit 0 diff -urN v2.2.15/linux/Documentation/kbuild/config-language.txt linux/Documentation/kbuild/config-language.txt --- v2.2.15/linux/Documentation/kbuild/config-language.txt Mon Feb 1 12:03:20 1999 +++ linux/Documentation/kbuild/config-language.txt Wed Jun 7 14:26:42 2000 @@ -1,5 +1,5 @@ Config Language Specification -21 January 1999 +18 October 1999 Michael Elizabeth Chastain, @@ -82,7 +82,10 @@ double-quoted string. If the word is unquoted or double quoted, then $-substition will be performed on the word. - A /symbol/ is a single unquoted word. + A /symbol/ is a single unquoted word. A symbol must have a name of + the form CONFIG_*. scripts/mkdep.c relies on this convention in order + to generate dependencies on individual CONFIG_* symbols instead of + making one massive dependency on include/linux/autoconf.h. A /dep/ is a dependency. Syntactically, it is a /word/. At run time, a /dep/ must evaluate to "y", "m", "n", or "". @@ -117,6 +120,7 @@ Dependent statements: dep_bool /prompt/ /symbol/ /dep/ ... + dep_mbool /prompt/ /symbol/ /dep/ ... dep_hex /prompt/ /symbol/ /word/ /dep/ ... dep_int /prompt/ /symbol/ /word/ /dep/ ... dep_string /prompt/ /symbol/ /word/ /dep/ ... @@ -189,7 +193,7 @@ Configure: implemented Menuconfig: implemented -Xconfig: does not display, but writes to output files +Xconfig: implemented mconfig: implemented Example: @@ -355,8 +359,8 @@ number is a legal value. Configure: implemented -Menuconfig: not implemented -Xconfig: not implemented +Menuconfig: implemented +Xconfig: implemented mconfig: implemented Example: @@ -377,14 +381,14 @@ legal value. Configure: implemented -Menuconfig: not implemented -Xconfig: not implemented +Menuconfig: implemented +Xconfig: implemented mconfig: implemented Example: - # Not from the corpus - define_int CONFIG_UID_TORVALDS 2026 + # drivers/char/ftape/Config.in + define_int CONFIG_FT_ALPHA_CLOCK 0 @@ -394,8 +398,8 @@ are any ASCII string, except for the characters '"' and '\\'. Configure: implemented -Menuconfig: not implemented -Xconfig: not implemented +Menuconfig: implemented +Xconfig: implemented mconfig: implemented Example @@ -414,17 +418,22 @@ instead of define_bool to define tristate values. This aids in static type checking. -Configure: not implemented -Menuconfig: not implemented -Xconfig: not implemented +Configure: implemented +Menuconfig: implemented +Xconfig: implemented mconfig: implemented Example: - # not from the corpus - if [ "$CONFIG_ZFTAPE" != "n" ]; then - comment 'The compressor will be built as a module only!' - define_tristate CONFIG_ZFT_COMPRESSOR m + # drivers/video/Config.in + 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 @@ -433,22 +442,62 @@ This verb evaluates all of the dependencies in the dependency list. Any dependency which has a value of "y" does not restrict the input -range. Any dependency which has a value of "n", or which has some -other value, restricts the input range to "n". +range. Any dependency which has an empty value is ignored. +Any dependency which has a value of "n", or which has some other value, +(like "m") restricts the input range to "n". Quoting dependencies is not +allowed. Using dependencies with an empty value possible is not +recommended. See also dep_mbool below. If the input range is restricted to the single choice "n", dep_bool silently assigns "n" to /symbol/. If the input range has more than one choice, dep_bool displays /prompt/ to the user, accepts a value from the user, and assigns that value to /symbol/. -Configure: not implemented -Menuconfig: not implemented -XConfig: not implemented +Configure: implemented +Menuconfig: implemented +XConfig: implemented mconfig: implemented - # not from the corpus - dep_bool 'RZ1000 chipset bugfix/support' CONFIG_BLK_DEV_RZ1000 $CONFIG_PCI +Example: + + # drivers/net/Config.in + dep_bool 'Aironet 4500/4800 PCI support 'CONFIG_AIRONET4500_PCI $CONFIG_PCI + +Known bugs: +- Xconfig does not write "# foo is not set" to .config (as well as + "#unset foo" to autoconf.h) if command is disabled by its dependencies. + + +=== dep_mbool /prompt/ /symbol/ /dep/ ... + +This verb evaluates all of the dependencies in the dependency list. +Any dependency which has a value of "y" or "m" does not restrict the +input range. Any dependency which has an empty value is ignored. +Any dependency which has a value of "n", or which has some other value, +restricts the input range to "n". Quoting dependencies is not allowed. +Using dependencies with an empty value possible is not recommended. +If the input range is restricted to the single choice "n", dep_bool +silently assigns "n" to /symbol/. If the input range has more than +one choice, dep_bool displays /prompt/ to the user, accepts a value +from the user, and assigns that value to /symbol/. + +Notice that the only difference between dep_bool and dep_mbool +is in the way of treating the "m" value as a dependency. + +Configure: implemented +Menuconfig: implemented +XConfig: implemented +mconfig: not implemented + +Example: + + # Not from the corpus + dep_mbool 'Packet socket: mmapped IO' CONFIG_PACKET_MMAP $CONFIG_PACKET + +Known bugs: +- Xconfig does not write "# foo is not set" to .config (as well as + "#unset foo" to autoconf.h) if command is disabled by its dependencies. === dep_hex /prompt/ /symbol/ /word/ /dep/ ... @@ -464,13 +513,15 @@ -=== dep_tristate /prompt/ /symbol /dep/ ... +=== dep_tristate /prompt/ /symbol/ /dep/ ... This verb evaluates all of the dependencies in the dependency list. -Any dependency which as a value of "y" does not restrict the input range. +Any dependency which has a value of "y" does not restrict the input range. Any dependency which has a value of "m" restricts the input range to -"m" or "n". Any dependency which has a value of "n", or which has some -other value, restricts the input range to "n". +"m" or "n". Any dependency which has an empty value is ignored. +Any dependency which has a value of "n", or which has some other value, +restricts the input range to "n". Quoting dependencies is not allowed. +Using dependencies with an empty value possible is not recommended. If the input range is restricted to the single choice "n", dep_tristate silently assigns "n" to /symbol/. If the input range has more than @@ -478,10 +529,18 @@ from the user, and assigns that value to /symbol/. Configure: implemented -Menuconfig: implemented (but silently ignores dependencies after the first) -Xconfig: implemented (but silently ignores dependencies after the first) +Menuconfig: implemented +Xconfig: implemented mconfig: implemented +Example: + + # drivers/char/Config.in + dep_tristate 'Parallel printer support' CONFIG_PRINTER $CONFIG_PARPORT + +Known bugs: +- Xconfig does not write "# foo is not set" to .config (as well as + "#unset foo" to autoconf.h) if command is disabled by its dependencies. === unset /symbol/ ... @@ -492,9 +551,16 @@ Configure: implemented Menuconfig: implemented -Xconfig: not implemented +Xconfig: implemented (with bugs) mconfig: implemented +Example: + + # arch/mips/config.in + unset CONFIG_PCI + unset CONFIG_MIPS_JAZZ + unset CONFIG_VIDEO_G364 + === choice /prompt/ /word/ /word/ @@ -525,6 +591,14 @@ Xconfig: implemented mconfig: implemented +Example: + + # arch/i386/config.in + choice ' PCI access mode' \ + "BIOS CONFIG_PCI_GOBIOS \ + Direct CONFIG_PCI_GODIRECT \ + Any CONFIG_PCI_GOANY" Any + === nchoice /prompt/ /symbol/ /prompt/ /symbol/ ... @@ -555,32 +629,40 @@ /expr/ may contain the following atoms and operators. Note that, unlike shell, you must use double quotes around every atom. - "..." a literal - "$..." a variable - - /atom/ = /atom/ true if atoms have identical value - /atom/ != /atom/ true if atoms have different value + /atom/: + "..." a literal + "$..." a variable + + /expr/: + /atom/ = /atom/ true if atoms have identical value + /atom/ != /atom/ true if atoms have different value + + /expr/: + /expr/ -o /expr/ true if either expression is true + /expr/ -a /expr/ true if both expressions are true + ! /expr/ true if expression is not true + +Note that a naked /atom/ is not a valid /expr/. If you try to use it +as such: + + # Do not do this. + if [ "$CONFIG_EXPERIMENTAL" ]; then + bool 'Bogus experimental feature' CONFIG_BOGUS + fi - /expr/ -o /expr/ true if either expression is true - /expr/ -a /expr/ true if both expressions are true - ! /expr/ true if expression is not true +... then you will be surprised, because CONFIG_EXPERIMENTAL never has a +value of the empty string! It is always "y" or "n", and both of these +are treated as true (non-empty) by the bash-based interpreters Configure +and Menuconfig. Configure: implemented Menuconfig: implemented XConfig: implemented, with bugs mconfig: implemented -Xconfig has several known bugs, and probably some unknown bugs too: - -- In a comparison, if the left-hand atom is a variable and that variable - is from a choice list, the right-hand atom must be "y". - -- In a comparison, if the right-hand atom is a variable and that variable - is from a choice list, you lose. tkparse will throw a segmentation - violation, silently generate bizarre TCL code, or something else. +Xconfig has some known bugs, and probably some unknown bugs too: -- tkparse gives the wrong precedence to -o, -a, and !. Don't use both - -o and -a in an expression. Don't use ! at all. +- literals with an empty "" value are not properly handled. diff -urN v2.2.15/linux/Documentation/kernel-docs.txt linux/Documentation/kernel-docs.txt --- v2.2.15/linux/Documentation/kernel-docs.txt Tue Jan 4 10:12:10 2000 +++ linux/Documentation/kernel-docs.txt Wed Jun 7 14:26:42 2000 @@ -164,6 +164,18 @@ different situations. We also investigate the complex topic of DMA". + * Title: "Device Drivers Concluded" + Author: Georg v. Zezschwitz. + URL: http://www2.linuxjournal.com/lj-issues/issue28/1287.html + Keywords: address spaces, pages, pagination, page management, + demand loading, swapping, memory protection, memory mapping, mmap, + virtual memory areas (VMAs), vremap, PCI. + Description: Finally, the above turned out into a five articles + series. This latest one's introduction reads: "This is the last of + five articles about character device drivers. In this final + section, Georg deals with memory mapping devices, beginning with + an overall description of the Linux memory management concepts". + * Title: "Network Buffers And Memory Management" Author: Alan Cox. URL: http://www.ssc.com/lj/issue30/kk30.html @@ -234,11 +246,26 @@ Description: 68 pages paper on writing character drivers. A little bit old (1.993, 1.994) although still useful. + * Title: "Design and Implementation of the Second Extended + Filesystem" + Author: Rémy Card, Theodore Ts'o, Stephen Tweedie. + URL: http://web.mit.edu/tytso/www/linux/ext2intro.html + Keywords: ext2, linux fs history, inode, directory, link, devices, + VFS, physical structure, performance, benchmarks, ext2fs library, + ext2fs tools, e2fsck. + Description: Paper written by three of the top ext2 hackers. + Covers Linux filesystems history, ext2 motivation, ext2 features, + design, physical structure on disk, performance, benchmarks, + e2fsck's passes description... A must read! + Notes: This paper was first published in the Proceedings of the + First Dutch International Symposium on Linux, ISBN 90-367-0385-9. + * Title: "The Second Extended Filesystem" Author: Matthew Wilcox. URL: http://pocket.fluff.org/~mrw/linux/ext2.txt Keywords: ext2, filesystem. - Description: Description of ext2's blocks, directories, inodes ... + Description: Description of ext2's blocks, directories, inodes... + Notes: Seems to be DOWN. Anyone knows another link for it? * Title: "Analysis of the Ext2fs structure" Author: Louis-Dominique Dubeau. @@ -247,6 +274,15 @@ Description: Description of ext2's blocks, directories, inodes, bitmaps, invariants ... + * Title: "Journaling the Linux ext2fs Filesystem" + Author: Stephen C. Tweedie. + URL: + ftp://ftp.uk.linux.org:/pub/linux/sct/fs/jfs/journal-design.ps.gz + Keywords: ext3, journalist. + Description: Excellent 8-pages paper explaining the journaling + capabilities added to ext2 by the author, showing different + problems faced and the alternatives chosen. + * Title: "Kernel API changes from 2.0 to 2.2" Author: Richard Gooch. URL: @@ -258,7 +294,7 @@ * Title: "Kernel API changes from 2.2 to 2.3" Author: Richard Gooch. URL: - http://www.atnf.csiro.au/~rgooch/linux/docs/porting-to-2.2.html + http://www.atnf.csiro.au/~rgooch/linux/docs/porting-to-2.3.html Keywords: 2.3, changes. Description: Kernel functions/structures/variables which changed from 2.2.x to 2.3.x. @@ -295,6 +331,81 @@ want a mechanism that is scalable. This means a large number of inactive FDs cost very little in memory and CPU time to manage". + * Title: "The Kernel Hacking HOWTO" + Author: Various Talented People, and Rusty. + URL: http://www.samba.org/~netfilter/kernel-hacking-HOWTO.html + Keywords: HOWTO, kernel contexts, deadlock, locking, modules, + symbols, return conventions. + Description: From the Introduction: "Please understand that I + never wanted to write this document, being grossly underqualified, + but I always wanted to read it, and this was the only way. I + simply explain some best practices, and give reading entry-points + into the kernel sources. I avoid implementation details: that's + what the code is for, and I ignore whole tracts of useful + routines. This document assumes familiarity with C, and an + understanding of what the kernel is, and how it is used. It was + originally written for the 2.3 kernels, but nearly all of it + applies to 2.2 too; 2.0 is slightly different. ". + + * Title: "ALSA 0.5.0 Developer documentation" + Author: Stephan 'Jumpy' Bartels . + URL: http://www.math.TU-Berlin.de/~sbartels/alsa/ + Keywords: ALSA, sound, soundcard, driver, lowlevel, hardware. + Description: Advanced Linux Sound Architecture for developers, + both at kernel and user-level sides. Work in progress. ALSA is + supposed to be Linux's next generation sound architecture. + + * Title: "Programming Guide for Linux USB Device Drivers" + Author: Detlef Fliegl. + URL: http://usb.in.tum.de/usbdoc/ + Keywords: USB, universal serial bus. + Description: A must-read. From the Preface: "This document should + give detailed information about the current state of the USB + subsystem and its API for USB device drivers. The first section + will deal with the basics of USB devices. You will learn about + different types of devices and their properties. Going into detail + you will see how USB devices communicate on the bus. The second + section gives an overview of the Linux USB subsystem [2] and the + device driver framework. Then the API and its data structures will + be explained step by step. The last section of this document + contains a reference of all API calls and their return codes". + Notes: Beware: the main page states: "This document may not be + published, printed or used in excerpts without explicit permission + of the author". Fortunately, it may still be read... + + * Title: "Tour Of the Linux Kernel Source" + Author: Vijo Cherian. + URL: http://www.geocities.com/vijoc/tolks/tolks.html + Keywords: . + Description: A classic of this page! Was lost for a while and is + back again. Thanks Vijo! TOLKS: the name says it all. A tour of + the sources, describing directories, files, variables, data + structures... It covers general stuff, device drivers, + filesystems, IPC and Networking Code. + + * Title: "Linux Kernel Mailing List Glossary" + Author: John Levon. + URL: http://www.movement.uklinux.net/glossary.html + Keywords: glossary, terms, linux-kernel. + Description: From the introduction: "This glossary is intended as + a brief description of some of the acronyms and terms you may hear + during discussion of the Linux kernel". + + * Title: "Linux Kernel Locking HOWTO" + Author: Various Talented People, and Rusty. + URL: + http://netfilter.kernelnotes.org/unreliable-guides/kernel-locking- + HOWTO.html + Keywords: locks, locking, spinlock, semaphore, atomic, race + condition, bottom halves, tasklets, softirqs. + Description: The title says it all: document describing the + locking system in the Linux Kernel either in uniprocessor or SMP + systems. + Notes: "It was originally written for the later (>2.3.47) 2.3 + kernels, but most of it applies to 2.2 too; 2.0 is slightly + different". Freely redistributable under the conditions of the GNU + General Public License. + BOOKS: (Not on-line) * Title: "Linux Device Drivers" @@ -366,15 +477,33 @@ * Title: "Linux Core Kernel Commentary. Guide to Insider's Knowledge on the Core Kernel od the Linux Code" Author: Scott Maxwell. - Publisher: ???. + Publisher: Coriolis. Date: 1999. Pages: 592. ISBN: 1-57610-469-9 - Notes: CD-ROM included. + Notes: CD-ROM included. Line by line commentary of the kernel + code. + + * Title: "Linux IP Stacks Commentary" + Author: Stephen Satchell and HBJ Clifford. + Publisher: Coriolis. + Date: 2000. + Pages: ???. + ISBN: 1-57610-470-2 + Notes: Line by line source code commentary book. + + * Title: "Programming for the real world - POSIX.4" + Author: Bill O. Gallmeister. + Publisher: O'Reilly & Associates, Inc.. + Date: 1995. + Pages: ???. + ISBN: I-56592-074-0 + Notes: Though not being directly about Linux, Linux aims to be + POSIX. Good reference. MISCELLANEOUS: - * Name: Linux Source Driver. + * Name: "Linux Source Driver" URL: http://lsd.linux.cz Keywords: Browsing source code. Description: "Linux Source Driver (LSD) is an application, which @@ -385,27 +514,27 @@ and variables) and LSD can generate patches for you on the fly (files, directories or kernel)". - * Name: Cross-Referencing Linux. + * Name: "Cross-Referencing Linux" URL: http://lxr.linux.no/source/ Keywords: Browsing source code. Description: Another web-based Linux kernel source code browser. Lots of cross references to variables and functions. You can see where they are defined and where they are used. - * Name: Linux Weekly News. + * Name: "Linux Weekly News" URL: http://lwn.net Keywords: latest kernel news. Description: The title says it all. There's a fixed kernel section summarizing developers' work, bug fixes, new features and versions produced during the week. Published every Thursday. - * Name: Kernel Traffic. + * Name: "Kernel Traffic" URL: http://kt.linuxcare.com Keywords: linux-kernel mailing list, weekly kernel news. Description: Weekly newsletter covering the most relevant discussions of the linux-kernel mailing list. - * Name: CuTTiNG.eDGe.LiNuX. + * Name: "CuTTiNG.eDGe.LiNuX" URL: http://edge.kernelnotes.org Keywords: changelist. Description: Site which provides the changelist for every kernel @@ -413,7 +542,7 @@ the patches and describes them. Pointers to the patches are there, too. - * Name: New linux-kernel Mailing List FAQ. + * Name: "New linux-kernel Mailing List FAQ" URL: Original site: http://www.altern.org/andrebalsa/doc/lkml-faq.html URL: U.S. mirror site: @@ -433,6 +562,45 @@ Description: Set of slides, presumably from a presentation on the Linux VFS layer. Covers version 2.1.x, with dentries and the dcache. + + * Name: "Gary's Enciclopedia - The Linux Kernel" + Author: Gary (I suppose...). + URL: http://members.aa.net/~swear/pedia/kernel.html + Keywords: links, not found here?. + Description: Gary's Enciclopedia exists to allow the rapid finding + of documentation and other information of interest to GNU/Linux + users. It has about 4000 links to external pages in 150 major + categories. This link is for kernel-specific links, documents, + sites... Look there if you could not find here whar you were + looking for. + + * Name: "The home page of Linux-MM" + Author: The Linux-MM team. + URL: http://www.linux.eu.org/Linux-MM/ + Keywords: memory management, Linux-MM, mm patches, TODO, docs, + mailing list. + Description: Site devoted to Linux Memory Mangement development. + Memory related patches, HOWTOs, links, mm developers... Don't miss + it if you are interested in memory management development! + + * Name: "Kernel Newbies IRC Channel" + URL: http://www.surriel.com/kernelnewbies.shtml + Keywords: IRC, newbies, channel, asking doubts. + Description: #kernelnewbies on irc.openprojects.net. From the web + page: "#kernelnewbies is an IRC network dedicated to the 'newbie' + kernel hacker. The audience mostly consists of people who are + learning about the kernel, working on kernel projects or + professional kernel hackers that want to help less seasoned kernel + people. [...] #kernelnewbies is on the Open Projects IRC Network, + try irc.openprojects.net or irc..openprojects.net as your + server and then /join #kernelnewbies". + + * Name: "linux-kernel mailing list archives and search engines" + URL: http://www.uwsg.indiana.edu/hypermail/linux/kernel/index.html + URL: http://www.kernelnotes.org/lnxlists/linux-kernel/ + Keywords: linux-kernel, archives, search. + Description: Some of the linux-kernel mailing list archivers. If + you have a better/another one, please let me know. _________________________________________________________________ - Document last updated on Tue Nov 30 11:20:00 CET 1999 + Document last updated on Mon Apr 17 18:07:07 CEST 2000 diff -urN v2.2.15/linux/Documentation/networking/shaper.txt linux/Documentation/networking/shaper.txt --- v2.2.15/linux/Documentation/networking/shaper.txt Tue Apr 28 14:22:04 1998 +++ linux/Documentation/networking/shaper.txt Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ Traffic Shaper For Linux -This is the current ALPHA release of the traffic shaper for Linux. It works +This is the current BETA release of the traffic shaper for Linux. It works within the following limits: o Minimum shaping speed is currently about 9600 baud (it can only @@ -37,13 +37,12 @@ mrouted tunnels via a traffic shaper to control bandwidth usage. The shaper is device/route based. This makes it very easy to use -with any setup BUT less flexible. You may well want to combine this patch -with Mike McLagan 's patch to allow routes to be -specified by source/destination pairs. +with any setup BUT less flexible. You may need to use iproute2 to set up +multiple route tables to get the flexibility. There is no "borrowing" or "sharing" scheme. This is a simple -traffic limiter. I'd like to implement Van Jacobson and Sally Floyd's CBQ -architecture into Linux one day (maybe in 2.1 sometime) and do this with -style. +traffic limiter. We implement Van Jacobson and Sally Floyd's CBQ +architecture into Linux 2.2. THis is the preferred solution. Shaper is +for simple or back compatible setups. Alan diff -urN v2.2.15/linux/Documentation/nfsroot.txt linux/Documentation/nfsroot.txt --- v2.2.15/linux/Documentation/nfsroot.txt Wed Jun 24 14:30:07 1998 +++ linux/Documentation/nfsroot.txt Wed Jun 7 14:26:42 2000 @@ -24,7 +24,7 @@ kernel configuration. Note that NFS cannot be loaded as a module in this case. The configuration script will then ask you whether you want to use nfsroot, and if yes what kind of auto configuration -system you want to use. Selecting both BOOTP and RARP is safe. +system you want to use. Selecting both DHCP/BOOTP and RARP is safe. @@ -88,14 +88,14 @@ If this parameter is missing from the kernel command line, all fields are assumed to be empty, and the defaults mentioned below apply. In general this means that the kernel tries to configure everything using both - RARP and BOOTP (depending on what has been enabled during kernel confi- - guration, and if both what protocol answer got in first). + RARP and DHCP/BOOTP (depending on what has been enabled during kernel + configuration, and if both what protocol answer got in first). IP address of the client. If empty, the address will either - be determined by RARP or BOOTP. What protocol is used de- - pends on what has been enabled during kernel configuration + be determined by RARP or DHCP/BOOTP. What protocol is used + depends on what has been enabled during kernel configuration and on the parameter. If this parameter is not - empty, neither RARP nor BOOTP will be used. + empty, neither RARP nor DHCP/BOOTP will be used. IP address of the NFS server. If RARP is used to determine the client address and this parameter is NOT empty only @@ -103,31 +103,35 @@ different RARP and NFS server, specify your RARP server here (or leave it blank), and specify your NFS server in the `nfsroot' parameter (see above). If this entry is blank - the address of the server is used which answered the RARP - or BOOTP request. + the address of the server is used which answered the RARP, + or the server address in the DHCP/BOOTP reply. (Note that + this may *not* be the DHCP/BOOTP server itself.) IP address of a gateway if the server is on a different subnet. If this entry is empty no gateway is used and the - server is assumed to be on the local network, unless a - value has been received by BOOTP. + server is assumed to be on the local network, unless + overridden by DHCP/BOOTP reply. Netmask for local network interface. If this is empty, the netmask is derived from the client IP address assuming - classful addressing, unless overridden in BOOTP reply. + classful addressing, unless overridden by DHCP/BOOTP reply. Name of the client. If empty, the client IP address is - used in ASCII notation, or the value received by BOOTP. + used in ASCII notation, unless overridden by DHCP/BOOTP + reply. Name of network device to use. If this is empty, all devices are used for RARP and BOOTP requests, and the first one we receive a reply on is configured. If you have only one device, you can safely leave this blank. - Method to use for autoconfiguration. If this is either - 'rarp' or 'bootp', the specified protocol is used. - If the value is 'both' or empty, both protocols are used - so far as they have been enabled during kernel configura- - tion. 'off' means no autoconfiguration. + Method to use for autoconfiguration. If this is 'dhcp', + 'bootp', or 'rarp', the specified protocol is used. If + the value is 'both' or empty, then both BOOTP and RARP are + used so far as they are configured into the kernel. (For + backward compatibility, DHCP will not be used in this + case, unless BOOTP is not configured.) If the value is + 'off', no autoconfiguration of any kind occurs. The parameter can appear alone as the value to the `ip' parameter (without all the ':' characters before) in which case auto- @@ -161,12 +165,13 @@ You can then remove the dummy device /dev/boot255 again. There is no real device available for it. + The other two kernel command line parameters cannot be substi- - tuted with rdev. Therefore, using this method the kernel will - by default use RARP and/or BOOTP, and if it gets an answer via + tuted with rdev. Therefore, using this method the kernel will by + default use DHCP/BOOTP and/or RARP, and if it gets an answer via RARP will mount the directory /tftpboot// as its - root. If it got a BOOTP answer the directory name in that answer - is used. + root. If it gets a DHCP/BOOTP answer the directory name in that + answer is used. 3.2) Using LILO diff -urN v2.2.15/linux/Documentation/sound/ChangeLog.ymfsb linux/Documentation/sound/ChangeLog.ymfsb --- v2.2.15/linux/Documentation/sound/ChangeLog.ymfsb Wed Dec 31 16:00:00 1969 +++ linux/Documentation/sound/ChangeLog.ymfsb Wed Jun 7 14:26:42 2000 @@ -0,0 +1,19 @@ +Sun May 21 15:14:37 2000 Daisuke Nagano + + * ymf_sb.c: Add 'master_vol' module parameter to change + 'PCM out Vol" of AC'97. + Should I support AC'97 mixer by implementing original mixer + codes... ? + + * ymf_sb.c: remove native UART401 support. External MIDI port + should be supported by sb_midi driver. + + *ymf_sb.c: add support for SPDIF OUT. Module parameter + 'spdif_out' is now available. + + +Tue May 16 19:29:29 2000 Daisuke Nagano + + * ymf_sb.c (checkCodec): add a little delays for reset devices. + + * ymf_sb.c (readRegWord): fixed addressing bug. diff -urN v2.2.15/linux/Documentation/sound/PSS-updates linux/Documentation/sound/PSS-updates --- v2.2.15/linux/Documentation/sound/PSS-updates Wed Dec 31 16:00:00 1969 +++ linux/Documentation/sound/PSS-updates Wed Jun 7 14:26:42 2000 @@ -0,0 +1,88 @@ + This file contains notes for users of PSS sound cards who wish to use the +newly added features of the newest version of this driver. + + The major enhancements present in this new revision of this driver is the +addition of two new module parameters that allow you to take full advantage of +all the features present on your PSS sound card. These features include the +ability to enable both the builtin CDROM and joystick ports. + +pss_enable_joystick + + This parameter is basically a flag. A 0 will leave the joystick port +disabled, while a non-zero value would enable the joystick port. The default +setting is pss_enable_joystick=0 as this keeps this driver fully compatable +with systems that were using previous versions of this driver. If you wish to +enable the joystick port you will have to add pss_enable_joystick=1 as an +argument to the driver. To actually use the joystick port you will then have +to load the joystick driver itself. Just remember to load the joystick driver +AFTER the pss sound driver. + +pss_cdrom_port + + This parameter takes a port address as its parameter. Any available port +address can be specified to enable the CDROM port, except for 0x0 and -1 as +these values would leave the port disabled. Like the joystick port, the cdrom +port will require that an appropiate CDROM driver be loaded before you can make +use of the newly enabled CDROM port. Like the joystick port option above, +remember to load the CDROM driver AFTER the pss sound driver. While it may +differ on some PSS sound cards, all the PSS sound cards that I have seen have a +builtin Wearnes CDROM port. If this is the case with your PSS sound card you +should load aztcd with the appropiate port option that matches the port you +assigned to the CDROM port when you loaded your pss sound driver. (ex. +modprobe pss pss_cdrom_port=0x340 && modprobe aztcd aztcd=0x340) The default +setting of this parameter leaves the CDROM port disabled to maintain full +compatability with systems using previous versions of this driver. + + Other options have also been added for the added convenience and utility +of the user. These options are only available if this driver is loaded as a +module. + +pss_no_sound + + This module parameter is a flag that can be used to tell the driver to +just configure non-sound components. 0 configures all components, a non-0 +value will only attept to configure the CDROM and joystick ports. This +parameter can be used by a user who only wished to use the builtin joystick +and/or CDROM port(s) of his PSS sound card. If this driver is loaded with this +parameter and with the paramter below set to true then a user can safely unload +this driver with the following command "rmmod pss && rmmod ad1848 && rmmod +mpu401 && rmmod sound && rmmod soundcore" and retain the full functionality of +his CDROM and/or joystick port(s) while gaining back the memory previously used +by the sound drivers. This default setting of this parameter is 0 to retain +full behavioral compatability with previous versions of this driver. + +pss_keep_settings + + This parameter can be used to specify whether you want the driver to reset +all emulations whenever its unloaded. This can be useful for those who are +sharing resources (io ports, IRQ's, DMA's) between different ISA cards. This +flag can also be useful in that future versions of this driver may reset all +emulations by default on the driver's unloading (as it probably should), so +specifying it now will ensure that all future versions of this driver will +continue to work as expected. The default value of this parameter is 1 to +retain full behavioral compatability with previous versions of this driver. + +pss_firmware + + This parameter can be used to specify the file containing the firmware +code so that a user could tell the driver where that file is located instead +of having to put it in a predefined location with a predefined name. The +default setting of this parameter is "/etc/sound/pss_synth" as this was the +path and filename the hardcoded value in the previous versions of this driver. + +Examples: + +# Normal PSS sound card system, loading of drivers. +# Should be specified in an rc file (ex. Slackware uses /etc/rc.d/rc.modules). + +/sbin/modprobe pss pss_io=0x220 mpu_io=0x338 mpu_irq=9 mss_io=0x530 mss_irq=10 mss_dma=1 pss_cdrom_port=0x340 pss_enable_joystick=1 +/sbin/modprobe aztcd aztcd=0x340 +/sbin/modprobe joystick + +# System using the PSS sound card just for its CDROM and joystick ports. +# Should be specified in an rc file (ex. Slackware uses /etc/rc.d/rc.modules). + +/sbin/modprobe pss pss_io=0x220 pss_cdrom_port=0x340 pss_enable_joystick=1 pss_no_sound=1 +/sbin/rmmod pss && /sbin/rmmod ad1848 && /sbin/rmmod mpu401 && /sbin/rmmod sound && /sbin/rmmod soundcore # This line not needed, but saves memory. +/sbin/modprobe aztcd aztcd=0x340 +/sbin/modprobe joystick diff -urN v2.2.15/linux/Documentation/sound/README.ymfsb linux/Documentation/sound/README.ymfsb --- v2.2.15/linux/Documentation/sound/README.ymfsb Wed Dec 31 16:00:00 1969 +++ linux/Documentation/sound/README.ymfsb Wed Jun 7 14:26:42 2000 @@ -0,0 +1,143 @@ +Legacy audio driver for YMF7xx PCI cards. + + +FIRST OF ALL +============ + + This code references YAMAHA's sample codes and data sheets. + I respect and thank for all people they made open the informations + about YMF7xx cards. + + And this codes heavily based on Jeff Garzik 's + VIA 82Cxxx driver (via82cxxx.c). I also respect him. + + +DISCLIMER +========= + + This driver is currently at early ALPHA stage. It may cause serious + damage to your computer when used. + PLEASE USE IT AT YOUR OWN RISK. + + +ABOUT THIS DRIVER +================= + + This code enables you to use your YMF724[A-F], YMF740[A-C], YMF744, YMF754 + cards. When enabled, your card acts as "SoundBlaster Pro" compatible card. + It can only play 22.05kHz / 8bit / Stereo samples, control external MIDI + port. + If you want to use your card as recent "16-bit" card, you should wait for + Alsa (or OSS) driver. Ofcource you can write native PCI driver for your + cards :) + + +INSTALL +======= + + This codes currently requires YAMAHA's header file: Hwmcode.h and + 724hwmcode.c + It can be found at alsa's ftp (or mirror) sites. + + ftp://ftp.alsa-project.org/pub/manuals/yamaha/pci/ + + Hwmcode.h is contained in 754smpls.zip available at above URL. + + + To compile driver module, extract source archive and place above headers + in the directory. + And type 'make'. When it goes well, you will get ymfsb.o. + Copy it to /lib/modules//misc/ and do 'depmod -a'. + Before modprobe, insert following line in /etc/modules.conf: + + # /etc/modules.conf + options sb support=1 + + +USAGE +===== + + # modprobe ymfsb + + +OPTIONS FOR MODULE +================== + + io : SB base address (0x220, 0x240, 0x260, 0x280) + synth_io : OPL3 base address (0x388, 0x398, 0x3a0, 0x3a8) + dma : DMA number (0,1,3) + master_volume: AC'97 PCM out Vol (0-100) + spdif_out : SPDIF-out flag (0:disable 1:enable) + + These options will change in future... + + +TODO +==== + + TOO LOT. + Ofcource we have not to satisfy such a poor code like this :-< + + +FREQUENCY +========= + + When playing sounds via this driver, you will hear its pitch is slightly + lower than original sounds. Since this driver recognizes your card acts + with 21.739kHz sample rates rather than 22.050kHz (I think it must be + hardware restriction). So many players become tone deafness. + To prevent this, you should express some options to your sound player + that specify correct sample frequency. For example, to play your MP3 file + correctly with mpg123, specify the frequency like following: + + % mpg123 -r 21739 foo.mp3 + + Ofcource it potentially contains sample-rate-conversion, and may destroy + your sound. But you must remember that this card currently only handle + samples up to 21.739kHz B-( + + +SPDIF OUT +========= + + With installing modules with option 'spdif_out=1', you can enjoy your + sounds from SPDIF-out of your card (if it had). + Its Fs is fixed to 48kHz (It never means the sample frequency become + up to 48kHz. All sounds via SPDIF-out also 22kHz samples). So your + digital-in capable components has to be able to handle 48kHz Fs. + + +COPYING +======= + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +AVAILABILITY +============ + + The latest version of this driver may be available at: + + http://member.nifty.ne.jp/Breeze/linux/index.html + + When the native DS-XG driver is available (from alsa, OSS, or else), + this code will have to be expired. + + +AUTHOR +====== + + Daisuke Nagano + diff -urN v2.2.15/linux/Documentation/sound/TODO.ymfsb linux/Documentation/sound/TODO.ymfsb --- v2.2.15/linux/Documentation/sound/TODO.ymfsb Wed Dec 31 16:00:00 1969 +++ linux/Documentation/sound/TODO.ymfsb Wed Jun 7 14:26:42 2000 @@ -0,0 +1,7 @@ +YMF_SB driver + +TODO: + * support for multiple cards + (set the different SB_IO,MPU_IO,OPL_IO for each cards) + + * support for OPL (dmfm) : There will be no demand... :-< diff -urN v2.2.15/linux/Documentation/video4linux/README.cpia linux/Documentation/video4linux/README.cpia --- v2.2.15/linux/Documentation/video4linux/README.cpia Wed May 3 17:16:30 2000 +++ linux/Documentation/video4linux/README.cpia Wed Jun 7 14:26:42 2000 @@ -55,12 +55,12 @@ CONFIG_VIDEO_CPIA_PP=m CONFIG_VIDEO_CPIA_PP_DMA=y -For autoloading of all those modules you need to tell kerneld some -stuff. Add the following line to your kerneld config-file +For autoloading of all those modules you need to tell modutils some +stuff. Add the following line to your modutils config-file (e.g. /etc/modules.conf or wherever your distribution does store that stuff): -options parport_pc dma=3 irq=7 +options parport_pc io=0x378 irq=7 dma=3 alias char-major-81 cpia_pp The first line tells the dma/irq channels to use. Those _must_ match @@ -124,7 +124,7 @@ - a simple test application based on Xt is available at [3] - another test-application based on gqcam-0.4 (uses GTK) -- gqcam-0.5 should work +- gqcam-0.6 should work - xawtv-3.x (also the webcam) - xawtv-2.46 - w3cam (cgi-interface and vidcat, e.g. you may try out 'vidcat |xv @@ -158,7 +158,7 @@ --------------------------------------------------------------------------- TODO: -- port to linux 2.3.X ++ port to linux 2.3.X - using ieee1284 support in the kernel (when it works) - multiple camera support (struct camera or something) - This should work, but hasn't been tested yet. @@ -186,12 +186,14 @@ - Scott J. Bertin for cleanups, the proc-filesystem and much more - Jarl Totland for setting up the mailing list - and maintaining the web-server[3] + and maintaining the original web-server and for registering the + sourceforge project[3] - Manuel J. Petit de Gabriel for providing help with Isabel (http://isabel.dit.upm.es/) - Henry Bruce for providing developers information about the CPiA chip, I wish all companies would treat Linux as seriously -- FIXME for fixes related to the 1.02 firmware +- Chris Whiteford for fixes related to the + 1.02 firmware - special kudos to all the tester whose machines crashed and/or will crash. :) @@ -201,4 +203,4 @@ 1. http://www.risc.uni-linz.ac.at/people/ppregler mailto:Peter_Pregler@email.com 2. see the file COPYING in the top directory of the kernel tree - 3. http://home.eunet.no/~jtotland/vision/ + 3. http://webcam.sourceforge.net diff -urN v2.2.15/linux/Documentation/watchdog.txt linux/Documentation/watchdog.txt --- v2.2.15/linux/Documentation/watchdog.txt Wed Jun 24 14:30:07 1998 +++ linux/Documentation/watchdog.txt Wed Jun 7 14:26:42 2000 @@ -79,15 +79,21 @@ People keep asking about the WDT watchdog timer hardware: The phone contacts for Industrial Computer Source are: -US: 619 677 0877 (sales) 0895 (fax) -UK: 01243 533900 -France (1) 69.18.74.30 +Industrial Computer Source +http://www.indcompsrc.com +ICS Advent, San Diego +6260 Sequence Dr. +San Diego, CA 92121-4371 +Phone (858) 677-0877 +FAX: (858) 677-0895 +> +ICS Advent Europe, UK +Oving Road +Chichester, +West Sussex, +PO19 4ET, UK +Phone: 00.44.1243.533900 -Industrial Computer Source -9950 Barnes Canyon Road -San Diego, CA - -http://www.industry.net/indcompsrc and please mention Linux when enquiring. diff -urN v2.2.15/linux/MAINTAINERS linux/MAINTAINERS --- v2.2.15/linux/MAINTAINERS Wed May 3 17:16:30 2000 +++ linux/MAINTAINERS Wed Jun 7 14:26:42 2000 @@ -257,7 +257,7 @@ DIGI RIGHTSWITCH NETWORK DRIVER P: Rick Richardson -M: rick@dgii.com +M: rick@remotepoint.com L: linux-net@vger.rutgers.edu W: http://www.dgii.com/linux/ S: Maintained @@ -364,6 +364,12 @@ W: http://www.icp-vortex.com/ S: Supported +GENERIC HDLC DRIVER AND N2, C101 AND WANXL DRIVERS +P: Krzysztof Halasa +M: khc@pm.waw.pl +W: http://hq.pm.waw.pl/hdlc/ +S: Maintained + HAYES ESP SERIAL DRIVER P: Andrew J. Robinson M: arobinso@nyx.net @@ -403,12 +409,12 @@ IBM ServeRAID RAID DRIVER P: Keith Mitchell M: ipslinux@us.ibm.com -W: http://www.developer.ibm.com/welcome/netfinity/serveraid_beta.html +W: http://www.developer.ibm.com/welcome/netfinity/serveraid.html S: Supported IDE DRIVER [GENERAL] P: Andre Hedrick -M: hedrick@astro.dyer.vanderbilt.edu +M: andre@linux-ide.org L: linux-kernel@vger.rutgers.edu S: Maintained @@ -427,7 +433,9 @@ IP FIREWALL P: Paul Russell M: Paul.Russell@rustcorp.com.au -W: http://www.rustcorp.com/linux/ipchains +W: http://netfilter.filewatcher.org/ipchains +W: http://www.samba.org/netfilter/ipchains +W: http://netfilter.kernelnotes.org/ipchains S: Supported IP MASQUERADING: @@ -864,6 +872,13 @@ L: linux-net@vger.rutgers.edu L: linux-tr@emissary.aus-etc.com S: Maintained + +TRIDENT 4DWAVE/SIS 7018 PCI AUDIO CORE/ALi 5451 +P: Ollie Lho +M: ollie@sis.com.tw +L: linux-kernel@vger.rutgers.edu +S: Supported + U14-34F SCSI DRIVER P: Dario Ballabio diff -urN v2.2.15/linux/Makefile linux/Makefile --- v2.2.15/linux/Makefile Wed May 3 17:16:30 2000 +++ linux/Makefile Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ VERSION = 2 PATCHLEVEL = 2 -SUBLEVEL = 15 +SUBLEVEL = 16 EXTRAVERSION = ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) diff -urN v2.2.15/linux/arch/alpha/boot/bootp.c linux/arch/alpha/boot/bootp.c --- v2.2.15/linux/arch/alpha/boot/bootp.c Mon Aug 9 12:04:38 1999 +++ linux/arch/alpha/boot/bootp.c Wed Jun 7 14:26:42 2000 @@ -171,8 +171,7 @@ srm_printk("Initrd positioned at %#lx\n", initrd_start); #endif - nbytes = srm_dispatch(CCB_GET_ENV, ENV_BOOTED_OSFLAGS, - envval, sizeof(envval)); + nbytes = callback_getenv(ENV_BOOTED_OSFLAGS, envval, sizeof(envval)); if (nbytes < 0 || nbytes >= sizeof(envval)) { nbytes = 0; } diff -urN v2.2.15/linux/arch/alpha/boot/main.c linux/arch/alpha/boot/main.c --- v2.2.15/linux/arch/alpha/boot/main.c Mon Aug 9 12:04:38 1999 +++ linux/arch/alpha/boot/main.c Wed Jun 7 14:26:42 2000 @@ -107,15 +107,15 @@ char bootdev[256]; long result; - result = srm_dispatch(CCB_GET_ENV, ENV_BOOTED_DEV, bootdev, 255); + result = callback_getenv(ENV_BOOTED_DEV, bootdev, 255); if (result < 0) return result; - return srm_dispatch(CCB_OPEN, bootdev, result & 255); + return callback_open(bootdev, result & 255); } static inline long close(long dev) { - return srm_dispatch(CCB_CLOSE, dev); + return callback_close(dev); } static inline long load(long dev, unsigned long addr, unsigned long count) @@ -124,7 +124,7 @@ extern char _end; long result, boot_size = &_end - (char *) BOOT_ADDR; - result = srm_dispatch(CCB_GET_ENV, ENV_BOOTED_FILE, bootfile, 255); + result = callback_getenv(ENV_BOOTED_FILE, bootfile, 255); if (result < 0) return result; result &= 255; @@ -132,7 +132,7 @@ if (result) srm_printk("Boot file specification (%s) not implemented\n", bootfile); - return srm_dispatch(CCB_READ, dev, count, addr, boot_size/512 + 1); + return callback_read(dev, count, addr, boot_size/512 + 1); } /* @@ -176,8 +176,7 @@ return; } - nbytes = srm_dispatch(CCB_GET_ENV, ENV_BOOTED_OSFLAGS, - envval, sizeof(envval)); + nbytes = callback_getenv(ENV_BOOTED_OSFLAGS, envval, sizeof(envval)); if (nbytes < 0) { nbytes = 0; } diff -urN v2.2.15/linux/arch/alpha/config.in linux/arch/alpha/config.in --- v2.2.15/linux/arch/alpha/config.in Wed May 3 17:16:30 2000 +++ linux/arch/alpha/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ # # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Kernel configuration of Linux for Alpha machines" diff -urN v2.2.15/linux/arch/alpha/kernel/alpha_ksyms.c linux/arch/alpha/kernel/alpha_ksyms.c --- v2.2.15/linux/arch/alpha/kernel/alpha_ksyms.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/kernel/alpha_ksyms.c Wed Jun 7 14:26:42 2000 @@ -48,6 +48,8 @@ extern void __divqu (void); extern void __remqu (void); +EXPORT_SYMBOL(init_mm); + EXPORT_SYMBOL(alpha_mv); EXPORT_SYMBOL(enable_irq); EXPORT_SYMBOL(disable_irq); diff -urN v2.2.15/linux/arch/alpha/kernel/bios32.c linux/arch/alpha/kernel/bios32.c --- v2.2.15/linux/arch/alpha/kernel/bios32.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/kernel/bios32.c Wed Jun 7 14:26:42 2000 @@ -327,6 +327,28 @@ */ #define ALIGN(val,align) (((val) + ((align) - 1)) & ~((align) - 1)) +static short __inline__ +__disable_dev(struct pci_dev *dev) +{ + unsigned short cmd, orig_cmd; + + pcibios_read_config_word(dev->bus->number, dev->devfn, + PCI_COMMAND, &cmd); + + orig_cmd = cmd; + cmd &= (~PCI_COMMAND_IO & ~PCI_COMMAND_MEMORY & ~PCI_COMMAND_MASTER); + + pcibios_write_config_word(dev->bus->number, dev->devfn, + PCI_COMMAND, cmd); + return orig_cmd; +} + +static void __inline__ +__enable_dev(struct pci_dev *dev, short orig_cmd) +{ + pcibios_write_config_word(dev->bus->number, dev->devfn, + PCI_COMMAND, orig_cmd); +} /* * The following structure records initial configuration of devices @@ -344,6 +366,7 @@ struct srm_io_reset *next; struct pci_dev *dev; u32 io; + short cmd; u8 reg; } *srm_io_resets; @@ -354,6 +377,7 @@ { struct srm_irq_reset *qreset; struct srm_io_reset *ireset; + struct pci_dev *last_dev; /* Reset any IRQs that we changed. */ for (qreset = srm_irq_resets; qreset ; qreset = qreset->next) { @@ -370,6 +394,15 @@ #endif } + /* Disable any devices which had IO addresses that we changed. */ + last_dev = NULL; + for (ireset = srm_io_resets; ireset ; ireset = ireset->next) { + if (ireset->dev != last_dev) { + ireset->cmd = __disable_dev(ireset->dev); + last_dev = ireset->dev; + } + } + /* Reset any IO addresses that we changed. */ for (ireset = srm_io_resets; ireset ; ireset = ireset->next) { pcibios_write_config_dword(ireset->dev->bus->number, @@ -383,31 +416,40 @@ ireset->io); #endif } + + /* Re-enable any devices which had IO addresses that we changed. */ + last_dev = NULL; + for (ireset = srm_io_resets; ireset ; ireset = ireset->next) { + if (ireset->dev != last_dev) { + __enable_dev(ireset->dev, ireset->cmd); + last_dev = ireset->dev; + } + } } static void new_irq_reset(struct pci_dev *dev, u8 irq) { - struct srm_irq_reset *n; - n = kmalloc(sizeof(*n), GFP_KERNEL); + struct srm_irq_reset *new; + new = kmalloc(sizeof(*new), GFP_KERNEL); - n->next = srm_irq_resets; - n->dev = dev; - n->irq = irq; - srm_irq_resets = n; + new->next = srm_irq_resets; + new->dev = dev; + new->irq = irq; + srm_irq_resets = new; } static void new_io_reset(struct pci_dev *dev, u8 reg, u32 io) { - struct srm_io_reset *n; - n = kmalloc(sizeof(*n), GFP_KERNEL); + struct srm_io_reset *new; + new = kmalloc(sizeof(*new), GFP_KERNEL); - n->next = srm_io_resets; - n->dev = dev; - n->reg = reg; - n->io = io; - srm_io_resets = n; + new->next = srm_io_resets; + new->dev = dev; + new->reg = reg; + new->io = io; + srm_io_resets = new; } @@ -418,9 +460,6 @@ static void __init disable_dev(struct pci_dev *dev) { - struct pci_bus *bus; - unsigned short cmd; - /* * HACK: the PCI-to-EISA bridge does not seem to identify * itself as a bridge... :-( @@ -442,10 +481,11 @@ /* * We don't have code that will init the CYPRESS bridge correctly * so we do the next best thing, and depend on the previous - * console code to do the right thing, and ignore it here... :-\ + * console code to do the right thing, and ignore it mostly... :-\ */ if (dev->vendor == PCI_VENDOR_ID_CONTAQ && - dev->device == PCI_DEVICE_ID_CONTAQ_82C693) { + dev->device == PCI_DEVICE_ID_CONTAQ_82C693 && + PCI_FUNC(dev->devfn) == 0) { DBG_DEVS(("disable_dev: ignoring CYPRESS bridge...\n")); return; } @@ -463,12 +503,7 @@ DBG_DEVS(("disable_dev: disabling %04x:%04x\n", dev->vendor, dev->device)); - bus = dev->bus; - pcibios_read_config_word(bus->number, dev->devfn, PCI_COMMAND, &cmd); - - /* hack, turn it off first... */ - cmd &= (~PCI_COMMAND_IO & ~PCI_COMMAND_MEMORY & ~PCI_COMMAND_MASTER); - pcibios_write_config_word(bus->number, dev->devfn, PCI_COMMAND, cmd); + (void)__disable_dev(dev); } @@ -489,6 +524,7 @@ unsigned int orig_base; unsigned int alignto; unsigned long handle; + int start_idx = 0; /* * HACK: the PCI-to-EISA bridge does not seem to identify @@ -511,18 +547,24 @@ /* * We don't have code that will init the CYPRESS bridge correctly * so we do the next best thing, and depend on the previous - * console code to do the right thing, and ignore it here... :-\ + * console code to do the right thing, and ignore it mostly... :-\ */ if (dev->vendor == PCI_VENDOR_ID_CONTAQ && dev->device == PCI_DEVICE_ID_CONTAQ_82C693) { + int func = PCI_FUNC(dev->devfn); + if (func == 0) { DBG_DEVS(("layout_dev: ignoring CYPRESS bridge...\n")); return; + } + if (func == 1 || func == 2) { + start_idx = 4; /* bypass BAR 0 - 3 for the IDE devs */ + } } bus = dev->bus; pcibios_read_config_word(bus->number, dev->devfn, PCI_COMMAND, &cmd); - for (idx = 0; idx <= 5; idx++) { + for (idx = start_idx; idx <= 5; idx++) { off = PCI_BASE_ADDRESS_0 + 4*idx; /* * Figure out how much space and of what type this @@ -713,6 +755,46 @@ dev->device, dev->class, cmd|PCI_COMMAND_MASTER)); } +/* We must save away the current bridge settings for restore during exit. */ +static void __init +save_bridge_setup(struct pci_dev *bridge) +{ + unsigned int dword; + + pcibios_read_config_dword(bridge->bus->number, bridge->devfn, + PCI_IO_BASE, &dword); + new_io_reset(bridge, PCI_IO_BASE, dword); + + pcibios_read_config_dword(bridge->bus->number, bridge->devfn, + PCI_IO_BASE_UPPER16, &dword); + new_io_reset(bridge, PCI_IO_BASE_UPPER16, dword); + + pcibios_read_config_dword(bridge->bus->number, bridge->devfn, + PCI_PREF_BASE_UPPER32, &dword); + new_io_reset(bridge, PCI_PREF_BASE_UPPER32, dword); + + pcibios_read_config_dword(bridge->bus->number, bridge->devfn, + PCI_PREF_LIMIT_UPPER32, &dword); + new_io_reset(bridge, PCI_PREF_LIMIT_UPPER32, dword); + + pcibios_read_config_dword(bridge->bus->number, bridge->devfn, + PCI_MEMORY_BASE, &dword); + new_io_reset(bridge, PCI_MEMORY_BASE, dword); + + pcibios_read_config_dword(bridge->bus->number, bridge->devfn, + PCI_PREF_MEMORY_BASE, &dword); + new_io_reset(bridge, PCI_PREF_MEMORY_BASE, dword); + + /* Must use dword that contains PCI_BRIDGE_CONTROL. */ + pcibios_read_config_dword(bridge->bus->number, bridge->devfn, + PCI_INTERRUPT_LINE, &dword); + new_io_reset(bridge, PCI_INTERRUPT_LINE, dword); + + pcibios_read_config_dword(bridge->bus->number, bridge->devfn, + PCI_COMMAND, &dword); + new_io_reset(bridge, PCI_COMMAND, dword); +} + static int __init layout_bus(struct pci_bus *bus) { @@ -764,6 +846,7 @@ if ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA) found_vga = 1; } + /* * Recursively allocate space for all of the sub-buses: */ @@ -772,6 +855,7 @@ for (child = bus->children; child; child = child->next) { found_vga += layout_bus(child); } + /* * Align the current bases on 4K and 1MB boundaries: */ @@ -783,6 +867,8 @@ DBG_DEVS(("layout_bus: config bus %d bridge\n", bus->number)); + save_bridge_setup(bridge); + /* * Set up the top and bottom of the PCI I/O segment * for this bus. @@ -1364,7 +1450,6 @@ layout_hoses(void) { struct linux_hose_info * hose; - int i; /* On multiple bus machines, we play games with pci_root in order that all of the busses are probed as part of the normal PCI diff -urN v2.2.15/linux/arch/alpha/kernel/core_irongate.c linux/arch/alpha/kernel/core_irongate.c --- v2.2.15/linux/arch/alpha/kernel/core_irongate.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/kernel/core_irongate.c Wed Jun 7 14:26:42 2000 @@ -295,7 +295,7 @@ IRONGATE0->agpmode); } #else -#define irongate_register_dump(x) 1 +#define irongate_register_dump(x) #endif void __init diff -urN v2.2.15/linux/arch/alpha/kernel/core_mcpcia.c linux/arch/alpha/kernel/core_mcpcia.c --- v2.2.15/linux/arch/alpha/kernel/core_mcpcia.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/kernel/core_mcpcia.c Wed Jun 7 14:26:42 2000 @@ -662,6 +662,65 @@ } void +mcpcia_print_system_area(unsigned long la_ptr) +{ + struct el_common *frame; + int i; + + struct IOD_subpacket { + unsigned long base; + unsigned int whoami; + unsigned int rsvd1; + unsigned int pci_rev; + unsigned int cap_ctrl; + unsigned int hae_mem; + unsigned int hae_io; + unsigned int int_ctl; + unsigned int int_reg; + unsigned int int_mask0; + unsigned int int_mask1; + unsigned int mc_err0; + unsigned int mc_err1; + unsigned int cap_err; + unsigned int rsvd2; + unsigned int pci_err1; + unsigned int mdpa_stat; + unsigned int mdpa_syn; + unsigned int mdpb_stat; + unsigned int mdpb_syn; + unsigned int rsvd3; + unsigned int rsvd4; + unsigned int rsvd5; + } *iodpp; + + frame = (struct el_common *)la_ptr; + + iodpp = (struct IOD_subpacket *) (la_ptr + frame->sys_offset); + + for (i = 0; i < hose_count; i++, iodpp++) { + printk("IOD %d Register Subpacket - Bridge Base Address %16lx\n", + i, iodpp->base); + printk(" WHOAMI = %8x\n", iodpp->whoami); + printk(" PCI_REV = %8x\n", iodpp->pci_rev); + printk(" CAP_CTRL = %8x\n", iodpp->cap_ctrl); + printk(" HAE_MEM = %8x\n", iodpp->hae_mem); + printk(" HAE_IO = %8x\n", iodpp->hae_io); + printk(" INT_CTL = %8x\n", iodpp->int_ctl); + printk(" INT_REG = %8x\n", iodpp->int_reg); + printk(" INT_MASK0 = %8x\n", iodpp->int_mask0); + printk(" INT_MASK1 = %8x\n", iodpp->int_mask1); + printk(" MC_ERR0 = %8x\n", iodpp->mc_err0); + printk(" MC_ERR1 = %8x\n", iodpp->mc_err1); + printk(" CAP_ERR = %8x\n", iodpp->cap_err); + printk(" PCI_ERR1 = %8x\n", iodpp->pci_err1); + printk(" MDPA_STAT = %8x\n", iodpp->mdpa_stat); + printk(" MDPA_SYN = %8x\n", iodpp->mdpa_syn); + printk(" MDPB_STAT = %8x\n", iodpp->mdpb_stat); + printk(" MDPB_SYN = %8x\n", iodpp->mdpb_syn); + } +} + +void mcpcia_machine_check(unsigned long vector, unsigned long la_ptr, struct pt_regs * regs) { @@ -709,6 +768,7 @@ if (vector != 0x620 && vector != 0x630 && ! MCPCIA_mcheck_expected[cpu]) { mcpcia_print_uncorrectable(mchk_logout); + mcpcia_print_system_area(la_ptr); } } diff -urN v2.2.15/linux/arch/alpha/kernel/irq.c linux/arch/alpha/kernel/irq.c --- v2.2.15/linux/arch/alpha/kernel/irq.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/kernel/irq.c Wed Jun 7 14:26:42 2000 @@ -896,7 +896,14 @@ unsigned long __init init_IRQ(unsigned long memory) { wrent(entInt, 0); + alpha_mv.init_irq(); + + /* If we had wanted SRM console printk echoing early, undo it now. */ + if (alpha_using_srm && srmcons_output) { + unregister_srm_console(); + } + return memory; } diff -urN v2.2.15/linux/arch/alpha/kernel/proto.h linux/arch/alpha/kernel/proto.h --- v2.2.15/linux/arch/alpha/kernel/proto.h Tue Jan 4 10:12:11 2000 +++ linux/arch/alpha/kernel/proto.h Wed Jun 7 14:26:42 2000 @@ -60,6 +60,7 @@ struct linux_hose_info *hose); extern void irongate_init_arch(unsigned long *, unsigned long *); extern void irongate_machine_check(u64, u64, struct pt_regs *); +extern int irongate_pci_clr_err(void); /* core_lca.c */ extern int lca_hose_read_config_byte (u8, u8, u8, u8 *value, @@ -164,6 +165,9 @@ /* setup.c */ extern unsigned long srm_hae; +extern int srmcons_output; +extern void register_srm_console(void); +extern void unregister_srm_console(void); /* smp.c */ extern void setup_smp(void); @@ -219,6 +223,7 @@ extern int ptrace_cancel_bpt (struct task_struct *child); /* ../mm/init.c */ +extern void switch_to_system_map(void); void srm_paging_stop(void); /* irq.c */ diff -urN v2.2.15/linux/arch/alpha/kernel/setup.c linux/arch/alpha/kernel/setup.c --- v2.2.15/linux/arch/alpha/kernel/setup.c Tue Jan 4 10:12:11 2000 +++ linux/arch/alpha/kernel/setup.c Wed Jun 7 14:26:42 2000 @@ -40,7 +40,7 @@ #include #include #include - +#include #include "proto.h" @@ -52,6 +52,15 @@ int alpha_using_srm, alpha_use_srm_setup; #endif +/* Using SRM callbacks for initial console output. This works from + setup_arch() time through the end of init_IRQ(), as those places + are under our control. + + By default, OFF; set it with a bootcommand arg of "srmcons". +*/ +int srmcons_output = 0; + +/* For PS/2 presence */ unsigned char aux_device_present = 0xaa; #define N(a) (sizeof(a)/sizeof(a[0])) @@ -144,23 +153,31 @@ setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * memory_end_p) { - extern char _end[]; - struct alpha_machine_vector *vec = NULL; struct percpu_struct *cpu; char *type_name, *var_name, *p; unsigned long memory_end_override = 0; + extern char _end; + void *kernel_end = &_end; /* End of the kernel. */ hwrpb = (struct hwrpb_struct*) __va(INIT_HWRPB->phys_addr); +#ifdef CONFIG_ALPHA_GENERIC + /* Assume that we've booted from SRM if we havn't booted from MILO. + Detect the later by looking for "MILO" in the system serial nr. */ + alpha_using_srm = strncmp((const char *)hwrpb->ssn, "MILO", 4) != 0; +#endif + + kernel_end = callback_init(kernel_end); + /* - * Locate the command line. - */ + Process the command line. - /* Hack for Jensen... since we're restricted to 8 or 16 chars for + Hack for Jensen... since we're restricted to 8 or 16 chars for boot flags depending on the boot mode, we need some shorthand. This should do for installation. Later we'll add other - abbreviations as well... */ + abbreviations as well... + */ if (strcmp(COMMAND_LINE, "INSTALL") == 0) { strcpy(command_line, "root=/dev/fd0 load_ramdisk=1"); } else { @@ -198,11 +215,20 @@ memory_end_override = get_memory_end_override(p+4); continue; } + if (strncmp(p, "srmcons", 7) == 0) { + srmcons_output = 1; + continue; + } } /* Replace the command line, not that we've killed it with strtok. */ strcpy(command_line, saved_command_line); + /* If we want SRM console printk echoing early, do it now. */ + if (alpha_using_srm && srmcons_output) { + register_srm_console(); + } + /* * Indentify and reconfigure for the current system. */ @@ -228,12 +254,6 @@ alpha_mv = *vec; } -#ifdef CONFIG_ALPHA_GENERIC - /* Assume that we've booted from SRM if we havn't booted from MILO. - Detect the later by looking for "MILO" in the system serial nr. */ - alpha_using_srm = strncmp((const char *)hwrpb->ssn, "MILO", 4) != 0; -#endif - printk("%s on %s%s%s using machine vector %s from %s\n", #ifdef CONFIG_ALPHA_GENERIC "Booting GENERIC", @@ -258,7 +278,7 @@ wrmces(0x7); /* Find our memory. */ - *memory_start_p = (unsigned long) _end; + *memory_start_p = (unsigned long)kernel_end; *memory_end_p = find_end_memory(); if (memory_end_override && memory_end_override < *memory_end_p) { printk("Overriding memory size from %luMB to %luMB\n", @@ -342,7 +362,7 @@ struct memdesc_struct * memdesc; memdesc = (struct memdesc_struct *) - (INIT_HWRPB->mddt_offset + (unsigned long) INIT_HWRPB); + (hwrpb->mddt_offset + (unsigned long)hwrpb); cluster = memdesc->cluster; for (i = memdesc->numclusters ; i > 0; i--, cluster++) { @@ -421,7 +441,7 @@ static int rawhide_indices[] = {0,0,0,1,1,2,2,3,3,4,4}; static char tsunami_names[][16] = { - "0", "DP264", "Warhol", "Windjammer", "Monet", "Clipper", + "EarlyMonet", "DP264", "Warhol", "Windjammer", "Monet", "Clipper", "Goldrush", "Webbrick", "Catamaran" }; static int tsunami_indices[] = {0,1,2,3,4,5,6,7,8}; @@ -508,7 +528,7 @@ static struct alpha_machine_vector *tsunami_vecs[] __initlocaldata = { - NULL, + &monet_mv, /* HACK for early Monets */ &dp264_mv, /* dp264 */ &dp264_mv, /* warhol */ &dp264_mv, /* windjammer */ @@ -543,7 +563,7 @@ if (!vec) { /* Member ID is a bit-field. */ - long member = (variation >> 10) & 0x3f; + long member = HWRPB_MEMBER_ID(variation); switch (type) { case ST_DEC_ALCOR: @@ -832,3 +852,65 @@ return len; } + +#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM) +/* + * Manage the SRM callbacks as a "console". + */ +static struct console srmcons; + +void __init register_srm_console(void) +{ + register_console(&srmcons); +} + +void __init unregister_srm_console(void) +{ + unregister_console(&srmcons); +} + +static void srm_console_write(struct console *co, const char *s, + unsigned count) +{ + srm_printk(s); +} + +static kdev_t srm_console_device(struct console *c) +{ + /* Huh? */ + return MKDEV(TTY_MAJOR, 64 + c->index); +} + +static int srm_console_wait_key(struct console *co) +{ + /* Huh? */ + return 1; +} + +static int __init srm_console_setup(struct console *co, char *options) +{ + return 1; +} + +static struct console srmcons = { + "srm0", + srm_console_write, + NULL, + srm_console_device, + srm_console_wait_key, + NULL, + srm_console_setup, + CON_PRINTBUFFER | CON_ENABLED, /* fake it out */ + -1, + 0, + NULL +}; + +#else +void __init register_srm_console(void) +{ +} +void __init unregister_srm_console(void) +{ +} +#endif diff -urN v2.2.15/linux/arch/alpha/kernel/smp.c linux/arch/alpha/kernel/smp.c --- v2.2.15/linux/arch/alpha/kernel/smp.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/kernel/smp.c Wed Jun 7 14:26:42 2000 @@ -693,7 +693,7 @@ return -EBUSY; while (*(void **)lock) - schedule(); + barrier(); goto again; } diff -urN v2.2.15/linux/arch/alpha/kernel/sys_dp264.c linux/arch/alpha/kernel/sys_dp264.c --- v2.2.15/linux/arch/alpha/kernel/sys_dp264.c Tue Jan 4 10:12:11 2000 +++ linux/arch/alpha/kernel/sys_dp264.c Wed Jun 7 14:26:42 2000 @@ -393,7 +393,12 @@ layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE); common_pci_fixup(monet_map_irq, monet_swizzle); SMC669_Init(1); - es1888_init(); + + /* HACK: early Monets had a member ID of 0 and the ES1888 + located in a non-standard spot, so do this only for + official Monets */ + if (HWRPB_MEMBER_ID(hwrpb->sys_variation) != 0) + es1888_init(); } static void __init diff -urN v2.2.15/linux/arch/alpha/kernel/sys_mikasa.c linux/arch/alpha/kernel/sys_mikasa.c --- v2.2.15/linux/arch/alpha/kernel/sys_mikasa.c Sun Sep 6 10:34:33 1998 +++ linux/arch/alpha/kernel/sys_mikasa.c Wed Jun 7 14:26:42 2000 @@ -155,13 +155,14 @@ mikasa_machine_check(unsigned long vector, unsigned long la_ptr, struct pt_regs * regs) { -#define MCHK_NO_DEVSEL 0x205L -#define MCHK_NO_TABT 0x204L +#define MCHK_NO_DEVSEL 0x205U +#define MCHK_NO_TABT 0x204U struct el_common *mchk_header; struct el_apecs_procdata *mchk_procdata; struct el_apecs_mikasa_sysdata_mcheck *mchk_sysdata; unsigned long *ptr; + unsigned int code; /* workaround EGCS problem */ int i; mchk_header = (struct el_common *)la_ptr; @@ -193,9 +194,11 @@ * ignore the machine check. */ - if (apecs_mcheck_expected - && ((unsigned int)mchk_header->code == MCHK_NO_DEVSEL - || (unsigned int)mchk_header->code == MCHK_NO_TABT)) { + code = mchk_header->code; /* workaround EGCS problem */ + + if (apecs_mcheck_expected && + (code == MCHK_NO_DEVSEL || code == MCHK_NO_TABT)) + { apecs_mcheck_expected = 0; apecs_mcheck_taken = 1; mb(); @@ -214,9 +217,9 @@ vector); } else { - printk(KERN_CRIT "APECS machine check:\n"); - printk(KERN_CRIT " vector=0x%lx la_ptr=0x%lx\n", - vector, la_ptr); + printk(KERN_CRIT "MIKASA APECS machine check:\n"); + printk(KERN_CRIT " vector=0x%lx la_ptr=0x%lx code=0x%x\n", + vector, la_ptr, code); printk(KERN_CRIT " pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n", regs->pc, mchk_header->size, mchk_header->proc_offset, @@ -274,7 +277,7 @@ DO_DEFAULT_RTC, DO_CIA_IO, DO_CIA_BUS, - machine_check: mikasa_machine_check, + machine_check: cia_machine_check, max_dma_address: ALPHA_MAX_DMA_ADDRESS, nr_irqs: 32, diff -urN v2.2.15/linux/arch/alpha/kernel/sys_nautilus.c linux/arch/alpha/kernel/sys_nautilus.c --- v2.2.15/linux/arch/alpha/kernel/sys_nautilus.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/kernel/sys_nautilus.c Wed Jun 7 14:26:42 2000 @@ -94,7 +94,7 @@ { unsigned char control; - cli(); + __cli(); /* Reset periodic interrupt frequency. */ CMOS_WRITE(0x26, RTC_FREQ_SELECT); @@ -105,7 +105,7 @@ CMOS_WRITE(control, RTC_CONTROL); CMOS_READ(RTC_INTR_FLAGS); - sti(); + __sti(); } #endif @@ -115,7 +115,7 @@ break; case LINUX_REBOOT_CMD_RESTART: { - int v; + unsigned char v; irongate_hose_read_config_byte(0, 0x07<<3, 0x43, &v, 0); irongate_hose_write_config_byte(0, 0x07<<3, 0x43, v | 0x80, 0); outb(1, 0x92); @@ -504,7 +504,8 @@ break; } - printk(KERN_CRIT "> NAUTILUS Machine check 0x%x [%s]\n", vector, mchk_class); + printk(KERN_CRIT "> NAUTILUS Machine check 0x%lx [%s]\n", + vector, mchk_class); if ( cpu_analysis ) ev6_cpu_machine_check( vector, diff -urN v2.2.15/linux/arch/alpha/kernel/time.c linux/arch/alpha/kernel/time.c --- v2.2.15/linux/arch/alpha/kernel/time.c Mon Aug 9 12:04:38 1999 +++ linux/arch/alpha/kernel/time.c Wed Jun 7 14:26:42 2000 @@ -236,7 +236,7 @@ { void (*irq_handler)(int, void *, struct pt_regs *); unsigned int year, mon, day, hour, min, sec, cc1, cc2; - unsigned long cycle_freq, one_percent; + unsigned long cycle_freq, ppm_error; long diff; /* @@ -261,17 +261,29 @@ cc1 = cc2; } - /* If the given value is within 1% of what we calculated, - accept it. Otherwise, use what we found. */ - cycle_freq = hwrpb->cycle_freq; - one_percent = cycle_freq / 100; + /* This code used to check for a 1% error. + * PWS600au reports 598802395 which is way off. (ntpd has problems.) + * So I tightened down the check. Hal Murray, Feb 27, 2000. + * + * HWRPB cycle_freq may be 0 (uninitialized) due to MILO, so make + * sure that we handle this case by forcing use of est_cycle_freq. + */ + if (!(cycle_freq = hwrpb->cycle_freq)) + cycle_freq = est_cycle_freq; + diff = cycle_freq - est_cycle_freq; if (diff < 0) diff = -diff; - if (diff > one_percent) { + ppm_error = (diff * 1000000L) / cycle_freq; +#if 0 + printk("Alpha clock init: HWRPB %lu, Measured %lu, error=%lu ppm.\n", + hwrpb->cycle_freq, est_cycle_freq, ppm_error); +#endif + if (ppm_error > 1000) { + printk("HWRPB cycle frequency (%lu) seems inaccurate -" + " using the measured value of %lu Hz\n", + cycle_freq, est_cycle_freq); cycle_freq = est_cycle_freq; - printk("HWRPB cycle frequency bogus. Estimated %lu Hz\n", - cycle_freq); } else { est_cycle_freq = 0; diff -urN v2.2.15/linux/arch/alpha/kernel/traps.c linux/arch/alpha/kernel/traps.c --- v2.2.15/linux/arch/alpha/kernel/traps.c Tue Jan 4 10:12:11 2000 +++ linux/arch/alpha/kernel/traps.c Wed Jun 7 14:26:42 2000 @@ -652,7 +652,7 @@ got_exception: /* Ok, we caught the exception, but we don't want it. Is there someone to pass it along to? */ - if ((fixup = search_exception_table(pc)) != 0) { + if ((fixup = search_exception_table(pc, regs.gp)) != 0) { unsigned long newpc; newpc = fixup_exception(una_reg, fixup, pc); diff -urN v2.2.15/linux/arch/alpha/lib/Makefile linux/arch/alpha/lib/Makefile --- v2.2.15/linux/arch/alpha/lib/Makefile Sat Jan 16 17:02:51 1999 +++ linux/arch/alpha/lib/Makefile Wed Jun 7 14:26:42 2000 @@ -2,13 +2,18 @@ # Makefile for alpha-specific library files.. # +.S.s: + $(CC) -D__ASSEMBLY__ $(AFLAGS) -E -o $*.s $< +.S.o: + $(CC) -D__ASSEMBLY__ $(AFLAGS) -c -o $*.o $< + OBJS = __divqu.o __remqu.o __divlu.o __remlu.o memset.o memcpy.o io.o \ checksum.o csum_partial_copy.o strlen.o \ strcat.o strcpy.o strncat.o strncpy.o stxcpy.o stxncpy.o \ strchr.o strrchr.o \ copy_user.o clear_user.o strncpy_from_user.o strlen_user.o \ csum_ipv6_magic.o strcasecmp.o semaphore.o \ - srm_dispatch.o srm_fixup.o srm_puts.o srm_printk.o + callback_srm.o callback_init.o srm_puts.o srm_printk.o lib.a: $(OBJS) $(AR) rcs lib.a $(OBJS) diff -urN v2.2.15/linux/arch/alpha/lib/callback_init.c linux/arch/alpha/lib/callback_init.c --- v2.2.15/linux/arch/alpha/lib/callback_init.c Wed Dec 31 16:00:00 1969 +++ linux/arch/alpha/lib/callback_init.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,83 @@ +/* + * arch/alpha/lib/callback_init.c + */ + +#include +#include +#include +#include +#include + +#include "../kernel/proto.h" + +int callback_init_done = 0; + +/* This is the SRM version. Maybe there will be a DBM version. */ + +void * __init callback_init(void * kernel_end) +{ + int i, j; + unsigned long vaddr = CONSOLE_REMAP_START; + struct crb_struct * crb; + pgd_t * pgd = pgd_offset_k(vaddr); + pmd_t * pmd; + void * two_pte_pages; + + /* Always page align the end of the kernel. */ + kernel_end = (void *) + (((unsigned long)kernel_end + ~PAGE_MASK) & PAGE_MASK); + + if (!alpha_using_srm) { + switch_to_system_map(); + return kernel_end; + } + + /* Allocate some memory for the pages. */ + two_pte_pages = kernel_end; + kernel_end = two_pte_pages + 2*PAGE_SIZE; + memset(two_pte_pages, 0, 2*PAGE_SIZE); + + /* Starting at the HWRPB, locate the CRB. */ + crb = (struct crb_struct *)((char *)hwrpb + hwrpb->crb_offset); + + /* Tell the console whither the console is to be remapped. */ + if (srm_fixup(vaddr, (unsigned long)hwrpb)) + __halt(); /* "We're boned." --Bender */ + + /* Edit the procedure descriptors for DISPATCH and FIXUP. */ + crb->dispatch_va = (struct procdesc_struct *) + (vaddr + (unsigned long)crb->dispatch_va - crb->map[0].va); + crb->fixup_va = (struct procdesc_struct *) + (vaddr + (unsigned long)crb->fixup_va - crb->map[0].va); + + switch_to_system_map(); + + /* + * Set up the first and second level PTEs for console callbacks. + * There is an assumption here that only one of each is needed, + * and this allows for 8MB. Currently (late 1999), big consoles + * are still under 3MB. + */ + pgd_set(pgd, (pmd_t *)two_pte_pages); + pmd = pmd_offset(pgd, vaddr); + pmd_set(pmd, (pte_t *)(two_pte_pages + PAGE_SIZE)); + + /* + * Set up the third level PTEs and update the virtual addresses + * of the CRB entries. + */ + for (i = 0; i < crb->map_entries; ++i) { + unsigned long paddr = crb->map[i].pa; + crb->map[i].va = vaddr; + for (j = 0; j < crb->map[i].count; ++j) { + set_pte(pte_offset(pmd, vaddr), + mk_pte_phys(paddr, PAGE_KERNEL)); + paddr += PAGE_SIZE; + vaddr += PAGE_SIZE; + } + } + + callback_init_done = 1; + return kernel_end; +} + diff -urN v2.2.15/linux/arch/alpha/lib/callback_srm.S linux/arch/alpha/lib/callback_srm.S --- v2.2.15/linux/arch/alpha/lib/callback_srm.S Wed Dec 31 16:00:00 1969 +++ linux/arch/alpha/lib/callback_srm.S Wed Jun 7 14:26:42 2000 @@ -0,0 +1,102 @@ +/* + * arch/alpha/lib/callback_srm.S + */ + +#include +#include + +.text +#define HWRPB_CRB_OFFSET 0xc0 + +#if defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) +.align 4 +srm_dispatch: +#if defined(CONFIG_ALPHA_GENERIC) + ldl $4,alpha_using_srm + beq $4,nosrm +#endif + ldq $0,hwrpb # gp is set up by CALLBACK macro. + ldl $25,0($25) # Pick up the wrapper data. + mov $20,$21 # Shift arguments right. + mov $19,$20 + ldq $1,HWRPB_CRB_OFFSET($0) + mov $18,$19 + mov $17,$18 + mov $16,$17 + addq $0,$1,$2 # CRB address + ldq $27,0($2) # DISPATCH procedure descriptor (VMS call std) + extwl $25,0,$16 # SRM callback function code + ldq $3,8($27) # call address + extwl $25,2,$25 # argument information (VMS calling std) + jmp ($3) # Return directly to caller of wrapper. + +.align 4 +.globl srm_fixup +.ent srm_fixup +srm_fixup: + ldgp $29,0($27) +#if defined(CONFIG_ALPHA_GENERIC) + ldl $4,alpha_using_srm + beq $4,nosrm +#endif + ldq $0,hwrpb + ldq $1,HWRPB_CRB_OFFSET($0) + addq $0,$1,$2 # CRB address + ldq $27,16($2) # VA of FIXUP procedure descriptor + ldq $3,8($27) # call address + lda $25,2($31) # two integer arguments + jmp ($3) # Return directly to caller of srm_fixup. +.end srm_fixup + +#if defined(CONFIG_ALPHA_GENERIC) +.align 3 +nosrm: + lda $0,-1($31) + ret +#endif + +#define CALLBACK(NAME, CODE, ARG_CNT) \ +.align 4; .globl callback_##NAME; .ent callback_##NAME; callback_##NAME##: \ +ldgp $29,0($27); br $25,srm_dispatch; .word CODE, ARG_CNT; .end callback_##NAME + +#else /* defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) */ + +#define CALLBACK(NAME, CODE, ARG_CNT) \ +.align 3; .globl callback_##NAME; .ent callback_##NAME; callback_##NAME##: \ +lda $0,-1($31); ret; .end callback_##NAME + +.align 3 +.globl srm_fixup +.ent srm_fixup +srm_fixup: + lda $0,-1($31) + ret +.end srm_fixup +#endif /* defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) */ + +CALLBACK(puts, CCB_PUTS, 4) +CALLBACK(open, CCB_OPEN, 3) +CALLBACK(close, CCB_CLOSE, 2) +CALLBACK(read, CCB_READ, 5) +CALLBACK(getenv, CCB_GET_ENV, 4) +CALLBACK(setenv, CCB_SET_ENV, 4) +CALLBACK(getc, CCB_GETC, 2) +CALLBACK(reset_term, CCB_RESET_TERM, 2) +CALLBACK(term_int, CCB_SET_TERM_INT, 3) +CALLBACK(term_ctl, CCB_SET_TERM_CTL, 3) +CALLBACK(process_keycode, CCB_PROCESS_KEYCODE, 3) +CALLBACK(ioctl, CCB_IOCTL, 6) +CALLBACK(write, CCB_WRITE, 5) +CALLBACK(reset_env, CCB_RESET_ENV, 4) +CALLBACK(save_env, CCB_SAVE_ENV, 1) +CALLBACK(pswitch, CCB_PSWITCH, 3) +CALLBACK(bios_emul, CCB_BIOS_EMUL, 5) + +.data +__alpha_using_srm: # For use by bootpheader + .long 7 # value is not 1 for link debugging + .weak alpha_using_srm; alpha_using_srm = __alpha_using_srm +__callback_init_done: # For use by bootpheader + .long 7 # value is not 1 for link debugging + .weak callback_init_done; callback_init_done = __callback_init_done + diff -urN v2.2.15/linux/arch/alpha/lib/copy_user.S linux/arch/alpha/lib/copy_user.S --- v2.2.15/linux/arch/alpha/lib/copy_user.S Fri Apr 30 08:22:19 1999 +++ linux/arch/alpha/lib/copy_user.S Wed Jun 7 14:26:42 2000 @@ -80,7 +80,7 @@ extql $3,$7,$3 extqh $2,$7,$1 bis $3,$1,$1 - stq $1,0($6) + EXO( stq $1,0($6) ) addq $7,8,$7 subq $0,8,$0 addq $6,8,$6 diff -urN v2.2.15/linux/arch/alpha/lib/srm_dispatch.S linux/arch/alpha/lib/srm_dispatch.S --- v2.2.15/linux/arch/alpha/lib/srm_dispatch.S Mon Oct 12 11:40:12 1998 +++ linux/arch/alpha/lib/srm_dispatch.S Wed Dec 31 16:00:00 1969 @@ -1,43 +0,0 @@ -/* - * arch/alpha/lib/srm_dispatch.S - */ - -.globl srm_dispatch -.ent srm_dispatch -srm_dispatch: - .frame $30,30,$26 - subq $30,80,$30 - stq $26,0($30) - stq $8,8($30) - stq $9,16($30) - stq $10,24($30) - stq $11,32($30) - stq $12,40($30) - stq $13,48($30) - stq $14,56($30) - stq $15,64($30) - stq $29,72($30) - .mask 0x2400FF00, -80 - .prologue 0 - - ldq $1,hwrpb - ldq $2,0xc0($1) /* crb offset */ - addq $2,$1,$2 /* crb */ - ldq $27,0($2) /* dispatch procedure value */ - - ldq $2,8($27) /* dispatch call address */ - jsr $26,($2) /* call it (weird VMS call seq) */ - - ldq $26,0($30) - ldq $8,8($30) - ldq $9,16($30) - ldq $10,24($30) - ldq $11,32($30) - ldq $12,40($30) - ldq $13,48($30) - ldq $14,56($30) - ldq $15,64($30) - ldq $29,72($30) - addq $30,80,$30 - ret $31,($26),1 -.end srm_dispatch diff -urN v2.2.15/linux/arch/alpha/lib/srm_fixup.S linux/arch/alpha/lib/srm_fixup.S --- v2.2.15/linux/arch/alpha/lib/srm_fixup.S Mon Oct 12 11:40:12 1998 +++ linux/arch/alpha/lib/srm_fixup.S Wed Dec 31 16:00:00 1969 @@ -1,42 +0,0 @@ -/* - * arch/alpha/lib/srm_fixup.S - */ - -.globl srm_fixup -.ent srm_fixup -srm_fixup: - .frame $30,30,$26 - subq $30,80,$30 - stq $26,0($30) - stq $8,8($30) - stq $9,16($30) - stq $10,24($30) - stq $11,32($30) - stq $12,40($30) - stq $13,48($30) - stq $14,56($30) - stq $15,64($30) - stq $29,72($30) - .mask 0x2400FF00, -80 - .prologue 0 - - ldq $2,0xc0($17) /* crb offset */ - addq $2,$1,$2 /* crb */ - ldq $27,16($2) /* fixup procedure value */ - - ldq $2,8($27) /* dispatch call address */ - jsr $26,($2) /* call it (weird VMS call seq) */ - - ldq $26,0($30) - ldq $8,8($30) - ldq $9,16($30) - ldq $10,24($30) - ldq $11,32($30) - ldq $12,40($30) - ldq $13,48($30) - ldq $14,56($30) - ldq $15,64($30) - ldq $29,72($30) - addq $30,80,$30 - ret $31,($26),1 -.end srm_fixup diff -urN v2.2.15/linux/arch/alpha/lib/srm_printk.c linux/arch/alpha/lib/srm_printk.c --- v2.2.15/linux/arch/alpha/lib/srm_printk.c Mon Oct 12 11:40:12 1998 +++ linux/arch/alpha/lib/srm_printk.c Wed Jun 7 14:26:42 2000 @@ -10,12 +10,31 @@ { static char buf[1024]; va_list args; - long i; + long len, num_lf; + char *src, *dst; va_start(args, fmt); - i = vsprintf(buf,fmt,args); + len = vsprintf(buf, fmt, args); va_end(args); - srm_puts(buf); - return i; + /* Count number of linefeeds in string. */ + num_lf = 0; + for (src = buf; *src; ++src) { + if (*src == '\n') { + ++num_lf; + } + } + + /* Expand each linefeed into carriage-return/linefeed. */ + if (num_lf) { + for (dst = src + num_lf; src >= buf; ) { + if (*src == '\n') { + *dst-- = '\r'; + } + *dst-- = *src--; + } + } + + srm_puts(buf, num_lf+len); + return len; } diff -urN v2.2.15/linux/arch/alpha/lib/srm_puts.c linux/arch/alpha/lib/srm_puts.c --- v2.2.15/linux/arch/alpha/lib/srm_puts.c Mon Oct 12 11:40:12 1998 +++ linux/arch/alpha/lib/srm_puts.c Wed Jun 7 14:26:42 2000 @@ -5,30 +5,19 @@ #include #include -void -srm_puts(const char *str) +long +srm_puts(const char *str, long len) { - /* Expand \n to \r\n as we go. */ + long remaining, written; - while (*str) { - long len; - const char *e = str; + if (!callback_init_done) + return len; - if (*str == '\n') { - if (srm_dispatch(CCB_PUTS, 0, "\r", 1) < 0) - return; - ++e; - } - - e = strchr(e, '\n') ? : strchr(e, '\0'); - len = e - str; - - while (len > 0) { - long written = srm_dispatch(CCB_PUTS, 0, str, len); - if (written < 0) - return; - len -= written & 0xffffffff; - str += written & 0xffffffff; - } - } + for (remaining = len; remaining > 0; remaining -= written) + { + written = callback_puts(0, str, remaining); + written &= 0xffffffff; + str += written; + } + return len; } diff -urN v2.2.15/linux/arch/alpha/mm/extable.c linux/arch/alpha/mm/extable.c --- v2.2.15/linux/arch/alpha/mm/extable.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/mm/extable.c Wed Jun 7 14:26:42 2000 @@ -36,8 +36,8 @@ register unsigned long gp __asm__("$29"); -unsigned -search_exception_table(unsigned long addr) +static unsigned +search_exception_table_without_gp(unsigned long addr) { unsigned ret; @@ -59,4 +59,39 @@ #endif return 0; +} + +unsigned +search_exception_table(unsigned long addr, unsigned long exc_gp) +{ + unsigned ret; + +#ifndef CONFIG_MODULES + ret = search_one_table(__start___ex_table, __stop___ex_table - 1, + addr - exc_gp); + if (ret) return ret; +#else + /* The kernel is the last "module" -- no need to treat it special. */ + struct module *mp; + for (mp = module_list; mp ; mp = mp->next) { + if (!mp->ex_table_start) + continue; + ret = search_one_table(mp->ex_table_start, + mp->ex_table_end - 1, addr - exc_gp); + if (ret) return ret; + } +#endif + + /* + * The search failed with the exception gp. To be safe, try the + * old method before giving up. + */ + ret = search_exception_table_without_gp(addr); + if (ret) { + printk(KERN_ALERT, "%s: [%lx] EX_TABLE search fail with" + "exc frame GP, success with raw GP\n", + current->comm, addr); + return ret; + } + return 0; } diff -urN v2.2.15/linux/arch/alpha/mm/fault.c linux/arch/alpha/mm/fault.c --- v2.2.15/linux/arch/alpha/mm/fault.c Wed May 3 17:16:30 2000 +++ linux/arch/alpha/mm/fault.c Wed Jun 7 14:26:42 2000 @@ -147,11 +147,11 @@ no_context: /* Are we prepared to handle this fault as an exception? */ - if ((fixup = search_exception_table(regs->pc)) != 0) { + if ((fixup = search_exception_table(regs->pc, regs->gp)) != 0) { unsigned long newpc; newpc = fixup_exception(dpf_reg, fixup, regs->pc); -#if 0 - printk("%s: Exception at [<%lx>] (%lx)\n", +#if 1 + printk("%s: Exception at [<%lx>] (%lx) handled successfully.\n", current->comm, regs->pc, newpc); #endif regs->pc = newpc; diff -urN v2.2.15/linux/arch/alpha/mm/init.c linux/arch/alpha/mm/init.c --- v2.2.15/linux/arch/alpha/mm/init.c Tue Jan 4 10:12:11 2000 +++ linux/arch/alpha/mm/init.c Wed Jun 7 14:26:42 2000 @@ -182,6 +182,44 @@ return (struct thread_struct *) __reload_tss(pcb); } +void +switch_to_system_map(void) +{ + unsigned long newptbr; + struct thread_struct *original_pcb_ptr; + + memset(swapper_pg_dir, 0, PAGE_SIZE); + newptbr = ((unsigned long) swapper_pg_dir - PAGE_OFFSET) >> PAGE_SHIFT; + pgd_val(swapper_pg_dir[1023]) = + (newptbr << 32) | pgprot_val(PAGE_KERNEL); + + + /* Also set up the real kernel PCB while we're at it. */ + init_task.tss.ptbr = newptbr; + init_task.tss.pal_flags = 1; /* set FEN, clear everything else */ + init_task.tss.flags = 0; + + hwrpb->vptb = 0xfffffffe00000000; + hwrpb_update_checksum(hwrpb); + + wrvptptr(0xfffffffe00000000); + original_pcb_ptr = load_PCB(&init_task.tss); + tbia(); + + /* Save off the contents of the original PCB so that we can + restore the original console's page tables for a clean reboot. + + Note that the PCB is supposed to be a physical address, but + since KSEG values also happen to work, folks get confused. + Check this here. */ + + if ((unsigned long)original_pcb_ptr < PAGE_OFFSET) { + original_pcb_ptr = (struct thread_struct *) + phys_to_virt((unsigned long) original_pcb_ptr); + } + original_pcb = *original_pcb_ptr; +} + /* * paging_init() sets up the page tables: in the alpha version this actually * unmaps the bootup page table (as we're now in KSEG, so we don't need it). @@ -190,10 +228,8 @@ paging_init(unsigned long start_mem, unsigned long end_mem) { int i; - unsigned long newptbr; struct memclust_struct * cluster; struct memdesc_struct * memdesc; - struct thread_struct *original_pcb_ptr; /* initialize mem_map[] */ start_mem = free_area_init(start_mem, end_mem); @@ -221,41 +257,7 @@ clear_bit(PG_reserved, &mem_map[pfn++].flags); } - /* Initialize the kernel's page tables. Linux puts the vptb in - the last slot of the L1 page table. */ memset((void *) ZERO_PAGE(0), 0, PAGE_SIZE); - memset(swapper_pg_dir, 0, PAGE_SIZE); - newptbr = MAP_NR(swapper_pg_dir); - pgd_val(swapper_pg_dir[1023]) = - (newptbr << 32) | pgprot_val(PAGE_KERNEL); - - /* Set the vptb. This is often done by the bootloader, but - shouldn't be required. */ - if (hwrpb->vptb != 0xfffffffe00000000) { - wrvptptr(0xfffffffe00000000); - hwrpb->vptb = 0xfffffffe00000000; - hwrpb_update_checksum(hwrpb); - } - - /* Also set up the real kernel PCB while we're at it. */ - init_task.tss.ptbr = newptbr; - init_task.tss.pal_flags = 1; /* set FEN, clear everything else */ - init_task.tss.flags = 0; - original_pcb_ptr = load_PCB(&init_task.tss); - tbia(); - - /* Save off the contents of the original PCB so that we can - restore the original console's page tables for a clean reboot. - - Note that the PCB is supposed to be a physical address, but - since KSEG values also happen to work, folks get confused. - Check this here. */ - - if ((unsigned long)original_pcb_ptr < PAGE_OFFSET) { - original_pcb_ptr = (struct thread_struct *) - phys_to_virt((unsigned long) original_pcb_ptr); - } - original_pcb = *original_pcb_ptr; return start_mem; } diff -urN v2.2.15/linux/arch/alpha/vmlinux.lds linux/arch/alpha/vmlinux.lds --- v2.2.15/linux/arch/alpha/vmlinux.lds Tue May 13 22:41:00 1997 +++ linux/arch/alpha/vmlinux.lds Wed Jun 7 14:26:42 2000 @@ -1,10 +1,11 @@ OUTPUT_FORMAT("elf64-alpha") ENTRY(__start) +PHDRS { kernel PT_LOAD ; } SECTIONS { . = 0xfffffc0000310000; _text = .; - .text : { *(.text) } + .text : { *(.text) } :kernel .text2 : { *(.text2) } _etext = .; diff -urN v2.2.15/linux/arch/arm/config.in linux/arch/arm/config.in --- v2.2.15/linux/arch/arm/config.in Thu Jan 14 10:29:28 1999 +++ linux/arch/arm/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ # # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Linux Kernel Configuration" @@ -132,7 +132,7 @@ if [ "$CONFIG_ARCH_EBSA285" = "y" -o \ "$CONFIG_ARCH_EBSA110" = "y" -o \ "$CONFIG_ARCH_VNC" = "y" ]; then - string 'Initial kernel command string' CONFIG_CMDLINE + string 'Initial kernel command string' CONFIG_CMDLINE "" fi endmenu diff -urN v2.2.15/linux/arch/i386/config.in linux/arch/i386/config.in --- v2.2.15/linux/arch/i386/config.in Wed May 3 17:16:30 2000 +++ linux/arch/i386/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ # # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Linux Kernel Configuration" @@ -109,7 +109,6 @@ bool ' Enable PM at boot time' CONFIG_APM_DO_ENABLE bool ' Make CPU Idle calls when idle' CONFIG_APM_CPU_IDLE bool ' Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK - bool ' Ignore multiple suspend' CONFIG_APM_IGNORE_MULTIPLE_SUSPEND bool ' Ignore multiple suspend/resume cycles' CONFIG_APM_IGNORE_SUSPEND_BOUNCE bool ' RTC stores time in GMT' CONFIG_APM_RTC_IS_GMT bool ' Allow interrupts during APM BIOS calls' CONFIG_APM_ALLOW_INTS diff -urN v2.2.15/linux/arch/i386/kernel/apm.c linux/arch/i386/kernel/apm.c --- v2.2.15/linux/arch/i386/kernel/apm.c Wed May 3 17:16:30 2000 +++ linux/arch/i386/kernel/apm.c Wed Jun 7 14:26:42 2000 @@ -126,6 +126,9 @@ * Register the /proc/apm entry even on SMP so that * scripts that check for it before doing power off * work (Jim Avera ). + * 1.13: Fix the Thinkpad (again) :-( (CONFIG_APM_IGNORE_MULTIPLE_SUSPENDS + * is now the way life works). + * Fix thinko in suspend() (wrong return). * * APM 1.1 Reference: * @@ -318,9 +321,7 @@ #endif static int suspends_pending = 0; static int standbys_pending = 0; -#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND static int waiting_for_resume = 0; -#endif #ifdef CONFIG_APM_RTC_IS_GMT # define clock_cmos_diff 0 @@ -343,7 +344,7 @@ static struct timer_list apm_timer; -static char driver_version[] = "1.12"; /* no spaces */ +static char driver_version[] = "1.13"; /* no spaces */ static char * apm_event_name[] = { "system standby", @@ -883,19 +884,19 @@ static int suspend(void) { int err; - int ret; struct apm_user *as; get_time_diff(); err = apm_set_power_state(APM_STATE_SUSPEND); reinit_timer(); set_time(); - ret = (err == APM_SUCCESS) || (err == APM_NO_ERROR); - if (!ret) + if (err == APM_NO_ERROR) + err = APM_SUCCESS; + if (err != APM_SUCCESS) apm_error("suspend", err); for (as = user_list; as != NULL; as = as->next) { as->suspend_wait = 0; - as->suspend_result = (ret ? 0 : -EIO); + as->suspend_result = ((err == APM_SUCCESS) ? 0 : -EIO); } wake_up_interruptible(&apm_suspend_waitqueue); return err; @@ -975,14 +976,7 @@ switch (event) { case APM_SYS_STANDBY: case APM_USER_STANDBY: -#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND - if (waiting_for_resume) - break; -#endif if (send_event(event, APM_STANDBY_RESUME, NULL)) { -#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND - waiting_for_resume = 1; -#endif if (standbys_pending <= 0) standby(); } @@ -999,14 +993,18 @@ if (ignore_bounce) break; #endif -#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND + /* + * If we are already processing a SUSPEND, + * then further SUSPEND events from the BIOS + * will be ignored. We also return here to + * cope with the fact that the Thinkpads keep + * sending a SUSPEND event until something else + * happens! + */ if (waiting_for_resume) - break; -#endif + return; if (send_event(event, APM_NORMAL_RESUME, NULL)) { -#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND waiting_for_resume = 1; -#endif if (suspends_pending <= 0) (void) suspend(); } @@ -1015,9 +1013,7 @@ case APM_NORMAL_RESUME: case APM_CRITICAL_RESUME: case APM_STANDBY_RESUME: -#ifdef CONFIG_APM_IGNORE_MULTIPLE_SUSPEND waiting_for_resume = 0; -#endif #ifdef CONFIG_APM_IGNORE_SUSPEND_BOUNCE last_resume = jiffies; ignore_bounce = 1; @@ -1049,8 +1045,10 @@ int err; if ((standbys_pending > 0) || (suspends_pending > 0)) { - if ((apm_bios_info.version > 0x100) && (pending_count-- < 0)) { + if ((apm_bios_info.version > 0x100) && (pending_count-- <= 0)) { pending_count = 4; + if (debug) + printk(KERN_DEBUG "apm: setting state busy\n"); err = apm_set_power_state(APM_STATE_BUSY); if (err) apm_error("busy", err); @@ -1066,7 +1064,7 @@ static int check_apm_user(struct apm_user *as, const char *func) { if ((as == NULL) || (as->magic != APM_BIOS_MAGIC)) { - printk(KERN_ERR "apm: %s passed bad filp", func); + printk(KERN_ERR "apm: %s passed bad filp\n", func); return 1; } return 0; @@ -1169,7 +1167,7 @@ } else if (!send_event(APM_USER_SUSPEND, APM_NORMAL_RESUME, as)) return -EAGAIN; if (suspends_pending <= 0) { - if (!suspend()) + if (suspend() != APM_SUCCESS) return -EIO; } else { as->suspend_wait = 1; @@ -1220,7 +1218,7 @@ as1 = as1->next) ; if (as1 == NULL) - printk(KERN_ERR "apm: filp not in user list"); + printk(KERN_ERR "apm: filp not in user list\n"); else as1->next = as->next; } @@ -1234,7 +1232,7 @@ as = (struct apm_user *)kmalloc(sizeof(*as), GFP_KERNEL); if (as == NULL) { - printk(KERN_ERR "apm: cannot allocate struct of size %d bytes", + printk(KERN_ERR "apm: cannot allocate struct of size %d bytes\n", sizeof(*as)); return -ENOMEM; } diff -urN v2.2.15/linux/arch/i386/kernel/bios32.c linux/arch/i386/kernel/bios32.c --- v2.2.15/linux/arch/i386/kernel/bios32.c Wed May 3 17:16:31 2000 +++ linux/arch/i386/kernel/bios32.c Wed Jun 7 14:26:42 2000 @@ -1050,17 +1050,17 @@ } } -static void __init pci_fixup_rcc(struct pci_dev *d) +static void __init pci_fixup_serverworks(struct pci_dev *d) { /* - * Find and scan busses behind RCC LE north bridge chips + * Find and scan busses behind ServerWorks north bridge chips */ struct pci_bus *bus; unsigned char busno, busmax; pci_probe |= PCI_NO_PEER_FIXUP; pci_read_config_byte(d, 0x44, &busno); pci_read_config_byte(d, 0x45, &busmax); - printk("PCI: Scanning RCC HE/LE Peer Bus Bridge %02x/%02x\n", + printk("PCI: Scanning ServerWorks HE/LE Peer Bus Bridge %02x/%02x\n", PCI_SLOT(d->devfn), PCI_FUNC(d->devfn)); pci_fixup_peer_bus_scan(busno, busmax); } @@ -1118,8 +1118,9 @@ static struct dev_ex __initdata dev_ex_table[] = { { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx, "Scanning peer host bridges" }, - { PCI_VENDOR_ID_RCC, PCI_DEVICE_ID_RCC_HE, pci_fixup_rcc, "Scanning peer host bridges" }, - { PCI_VENDOR_ID_RCC, PCI_DEVICE_ID_RCC_LE, pci_fixup_rcc, "Scanning peer host bridges" }, + { PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HE, pci_fixup_serverworks, "Scanning peer host bridges" }, + { PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_LE, pci_fixup_serverworks, "Scanning peer host bridges" }, + { PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CMIC_HE, pci_fixup_serverworks, "Scanning peer host bridges" }, { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_6010, pci_fixup_compaq, "Scanning peer host bridges" }, { PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF, pci_fixup_umc_ide, "Working around UM8886BF bugs" } }; diff -urN v2.2.15/linux/arch/i386/kernel/io_apic.c linux/arch/i386/kernel/io_apic.c --- v2.2.15/linux/arch/i386/kernel/io_apic.c Wed May 3 17:16:31 2000 +++ linux/arch/i386/kernel/io_apic.c Wed Jun 7 14:26:42 2000 @@ -1279,6 +1279,7 @@ /* Patch to set the IO-APIC physical IDs based on the values stored in the MPC table */ /* by Matt Domsch Tue Dec 21 12:25:05 CST 1999 */ +/* Hacked by Alan Cox to ignore drug induced BIOS tables */ static void __init setup_ioapic_ids_from_mpc(void) { @@ -1291,18 +1292,25 @@ /* Read the register 0 value */ *(int *)®_00 = io_apic_read(apic, 0); - if(reg_00.ID != mp_apics[apic].mpc_apicid) { - /* Change the value */ - printk("...changing IO-APIC physical APIC ID to %d\n", mp_apics[apic].mpc_apicid); - reg_00.ID = mp_apics[apic].mpc_apicid; - io_apic_write(apic, 0, *(int *)®_00); + if(reg_00.ID != mp_apics[apic].mpc_apicid) + { + if(mp_apics[apic].mpc_apicid>15) + printk(KERN_ERR "BIOS wants to set APIC ID to %d, ignoring and praying the BIOS setup is ok\n", + mp_apics[apic].mpc_apicid); + else + { + /* Change the value */ + printk("...changing IO-APIC physical APIC ID to %d\n", mp_apics[apic].mpc_apicid); + reg_00.ID = mp_apics[apic].mpc_apicid; + io_apic_write(apic, 0, *(int *)®_00); - /* - * Sanity check - */ - *(int *)®_00 = io_apic_read(apic, 0); - if (reg_00.ID != mp_apics[apic].mpc_apicid) - panic("could not set ID"); + /* + * Sanity check + */ + *(int *)®_00 = io_apic_read(apic, 0); + if (reg_00.ID != mp_apics[apic].mpc_apicid) + panic("could not set ID"); + } } } } diff -urN v2.2.15/linux/arch/i386/kernel/irq.c linux/arch/i386/kernel/irq.c --- v2.2.15/linux/arch/i386/kernel/irq.c Wed May 3 17:16:31 2000 +++ linux/arch/i386/kernel/irq.c Wed Jun 7 14:26:42 2000 @@ -221,12 +221,12 @@ if (irq & 8) { inb(0xA1); /* DUMMY */ outb(cached_A1,0xA1); + outb(0x60+(irq&7),0xA0);/* Specific EOI to slave */ outb(0x62,0x20); /* Specific EOI to cascade */ - outb(0x20,0xA0); } else { inb(0x21); /* DUMMY */ outb(cached_21,0x21); - outb(0x20,0x20); + outb(0x60+irq,0x20); /* Specific EOI to master */ } } @@ -442,6 +442,10 @@ * Global interrupt locks for SMP. Allow interrupts to come in on any * CPU, yet make cli/sti act globally to protect critical regions.. */ +#if defined (__SMP__) || DEBUG_SPINLOCKS > 0 +spinlock_t i386_bh_lock = SPIN_LOCK_UNLOCKED; +#endif + #ifdef __SMP__ unsigned char global_irq_holder = NO_PROC_ID; unsigned volatile int global_irq_lock; @@ -449,7 +453,6 @@ atomic_t global_bh_count; atomic_t global_bh_lock; -spinlock_t i386_bh_lock = SPIN_LOCK_UNLOCKED; /* * "global_cli()" is a special case, in that it can hold the @@ -971,8 +974,24 @@ unsigned int i; unsigned long delay; + /* + * something may have generated an irq long ago and we want to + * flush such a longstanding irq before considering it as spurious. + */ + spin_lock_irq(&irq_controller_lock); + for (i = NR_IRQS-1; i > 0; i--) + if (!irq_desc[i].action) + irq_desc[i].handler->startup(i); + spin_unlock_irq(&irq_controller_lock); + + /* Wait for longstanding interrupts to trigger. */ + for (delay = jiffies + HZ/50; time_after(delay, jiffies); ) + /* about 20ms delay */ synchronize_irq(); + /* - * first, enable any unassigned irqs + * enable any unassigned irqs + * (we must startup again here because if a longstanding irq + * happened in the previous stage, it may have masked itself) */ spin_lock_irq(&irq_controller_lock); for (i = NR_IRQS-1; i > 0; i--) { diff -urN v2.2.15/linux/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c --- v2.2.15/linux/arch/i386/kernel/setup.c Wed May 3 17:16:31 2000 +++ linux/arch/i386/kernel/setup.c Wed Jun 7 14:26:42 2000 @@ -23,6 +23,10 @@ * * Improved Intel cache detection. * Dave Jones , October 1999 + * + * Added proper Cascades CPU and L2 cache detection for Cascades + * and 8-way type cache happy bunch from Intel:^) + * Dragan Stancevic , May 2000 */ /* @@ -98,7 +102,7 @@ extern int root_mountflags; extern int _etext, _edata, _end; -extern unsigned long cpu_hz; +extern unsigned long cpu_khz; /* * This is set up by the setup-routine at boot-time @@ -770,8 +774,8 @@ { X86_VENDOR_INTEL, 6, { "Pentium Pro A-step", "Pentium Pro", NULL, "Pentium II (Klamath)", NULL, "Pentium II (Deschutes)", "Mobile Pentium II", - "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL, NULL, - NULL, NULL, NULL, NULL, NULL }}, + "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL, + "Pentium III (Cascades)", NULL, NULL, NULL, NULL, NULL }}, { X86_VENDOR_AMD, 4, { NULL, NULL, NULL, "486 DX/2", NULL, NULL, NULL, "486 DX/2-WB", "486 DX/4", "486 DX/4-WB", NULL, NULL, NULL, NULL, "Am5x86-WT", @@ -847,24 +851,26 @@ c->x86_cache_size = 0; break; - case 0x41: + case 0x41: /* 4-way 128 */ c->x86_cache_size = 128; break; - case 0x42: - case 0x82: /*Detect 256-Kbyte cache on Coppermine*/ + case 0x42: /* 4-way 256 */ + case 0x82: /* 8-way 256 */ c->x86_cache_size = 256; break; - case 0x43: + case 0x43: /* 4-way 512 */ c->x86_cache_size = 512; break; - case 0x44: + case 0x44: /* 4-way 1024 */ + case 0x84: /* 8-way 1024 */ c->x86_cache_size = 1024; break; - case 0x45: + case 0x45: /* 4-way 2048 */ + case 0x85: /* 8-way 2048 */ c->x86_cache_size = 2048; break; @@ -1005,8 +1011,8 @@ p += sprintf(p, "stepping\t: unknown\n"); if (c->x86_capability & X86_FEATURE_TSC) { - p += sprintf(p, "cpu MHz\t\t: %lu.%06lu\n", - cpu_hz / 1000000, (cpu_hz % 1000000)); + p += sprintf(p, "cpu MHz\t\t: %lu.%03lu\n", + cpu_khz / 1000, cpu_khz % 1000); } /* Cache size */ diff -urN v2.2.15/linux/arch/i386/kernel/smp.c linux/arch/i386/kernel/smp.c --- v2.2.15/linux/arch/i386/kernel/smp.c Wed May 3 17:16:31 2000 +++ linux/arch/i386/kernel/smp.c Wed Jun 7 14:26:42 2000 @@ -1358,7 +1358,7 @@ } cycles_t cacheflush_time; -extern unsigned long cpu_hz; +extern unsigned long cpu_khz; static void smp_tune_scheduling (void) { @@ -1374,7 +1374,7 @@ * the cache size) */ - if (!cpu_hz) { + if (!cpu_khz) { /* * this basically disables processor-affinity * scheduling on SMP without a TSC. @@ -1386,12 +1386,12 @@ if (cachesize == -1) cachesize = 8; /* Pentiums */ - cacheflush_time = cpu_hz/1024*cachesize/5000; + cacheflush_time = cpu_khz/1024*cachesize/5; } printk("per-CPU timeslice cutoff: %ld.%02ld usecs.\n", - (long)cacheflush_time/(cpu_hz/1000000), - ((long)cacheflush_time*100/(cpu_hz/1000000)) % 100); + (long)cacheflush_time/(cpu_khz/1000), + ((long)cacheflush_time*100/(cpu_khz/1000)) % 100); } unsigned int prof_multiplier[NR_CPUS]; diff -urN v2.2.15/linux/arch/i386/kernel/time.c linux/arch/i386/kernel/time.c --- v2.2.15/linux/arch/i386/kernel/time.c Wed May 3 17:16:31 2000 +++ linux/arch/i386/kernel/time.c Wed Jun 7 14:26:42 2000 @@ -62,7 +62,7 @@ #include "irq.h" -unsigned long cpu_hz; /* Detected as we calibrate the TSC */ +unsigned long cpu_khz; /* Detected as we calibrate the TSC */ /* Number of usecs that the last interrupt was delayed */ static int delay_at_last_interrupt; @@ -665,12 +665,12 @@ * The formula is (10^6 * 2^32) / (2^32 * 1 / (clocks/us)) = * clock/second. Our precision is about 100 ppm. */ - { unsigned long eax=0, edx=1000000; + { unsigned long eax=0, edx=1000; __asm__("divl %2" - :"=a" (cpu_hz), "=d" (edx) + :"=a" (cpu_khz), "=d" (edx) :"r" (tsc_quotient), "0" (eax), "1" (edx)); - printk("Detected %ld Hz processor.\n", cpu_hz); + printk("Detected %ld kHz processor.\n", cpu_khz); } } } diff -urN v2.2.15/linux/arch/i386/kernel/traps.c linux/arch/i386/kernel/traps.c --- v2.2.15/linux/arch/i386/kernel/traps.c Tue Feb 16 14:20:05 1999 +++ linux/arch/i386/kernel/traps.c Wed Jun 7 14:26:42 2000 @@ -162,33 +162,41 @@ printk("%08lx ", *stack++); } printk("\nCall Trace: "); - stack = (unsigned long *) esp; - i = 1; - module_start = PAGE_OFFSET + (max_mapnr << PAGE_SHIFT); - module_start = ((module_start + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)); - module_end = module_start + MODULE_RANGE; - while (((long) stack & 4095) != 0) { - addr = *stack++; - /* - * If the address is either in the text segment of the - * kernel, or in the region which contains vmalloc'ed - * memory, it *may* be the address of a calling - * routine; if so, print it so that someone tracing - * down the cause of the crash will be able to figure - * out the call path that was taken. - */ - if (((addr >= (unsigned long) &_stext) && - (addr <= (unsigned long) &_etext)) || - ((addr >= module_start) && (addr <= module_end))) { - if (i && ((i % 8) == 0)) - printk("\n "); - printk("[<%08lx>] ", addr); - i++; + if (!esp || (esp & 3)) + printk("Bad EIP value."); + else { + stack = (unsigned long *) esp; + i = 1; + module_start = PAGE_OFFSET + (max_mapnr << PAGE_SHIFT); + module_start = ((module_start + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)); + module_end = module_start + MODULE_RANGE; + while (((long) stack & 4095) != 0) { + addr = *stack++; + /* + * If the address is either in the text segment of the + * kernel, or in the region which contains vmalloc'ed + * memory, it *may* be the address of a calling + * routine; if so, print it so that someone tracing + * down the cause of the crash will be able to figure + * out the call path that was taken. + */ + if (((addr >= (unsigned long) &_stext) && + (addr <= (unsigned long) &_etext)) || + ((addr >= module_start) && (addr <= module_end))) { + if (i && ((i % 8) == 0)) + printk("\n "); + printk("[<%08lx>] ", addr); + i++; + } } } printk("\nCode: "); - for(i=0;i<20;i++) + if (!regs->eip || regs->eip==-1) + printk("Bad EIP value."); + else { + for(i=0;i<20;i++) printk("%02x ", ((unsigned char *)regs->eip)[i]); + } } printk("\n"); } diff -urN v2.2.15/linux/arch/m68k/config.in linux/arch/m68k/config.in --- v2.2.15/linux/arch/m68k/config.in Tue May 11 09:57:14 1999 +++ linux/arch/m68k/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ # # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Linux/68k Kernel Configuration" diff -urN v2.2.15/linux/arch/mips/baget/vacserial.c linux/arch/mips/baget/vacserial.c --- v2.2.15/linux/arch/mips/baget/vacserial.c Mon Aug 9 12:04:38 1999 +++ linux/arch/mips/baget/vacserial.c Wed Jun 7 14:26:42 2000 @@ -2162,7 +2162,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } diff -urN v2.2.15/linux/arch/mips/config.in linux/arch/mips/config.in --- v2.2.15/linux/arch/mips/config.in Mon Aug 9 12:04:38 1999 +++ linux/arch/mips/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ # # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Linux Kernel Configuration" diff -urN v2.2.15/linux/arch/ppc/8xx_io/uart.c linux/arch/ppc/8xx_io/uart.c --- v2.2.15/linux/arch/ppc/8xx_io/uart.c Wed Dec 23 09:44:40 1998 +++ linux/arch/ppc/8xx_io/uart.c Wed Jun 7 14:26:42 2000 @@ -2050,7 +2050,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } diff -urN v2.2.15/linux/arch/ppc/config.in linux/arch/ppc/config.in --- v2.2.15/linux/arch/ppc/config.in Tue Jan 4 10:12:12 2000 +++ linux/arch/ppc/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ # $Id: config.in,v 1.92.2.4 1999/09/10 01:23:40 paulus Exp $ # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Linux/PowerPC Kernel Configuration" @@ -96,7 +96,7 @@ if [ "$CONFIG_PREP" = "y" -o "$CONFIG_ALL_PPC" = "y" ]; then bool 'PReP bootloader kernel arguments' CONFIG_CMDLINE_BOOL y if [ "$CONFIG_CMDLINE_BOOL" = "y" ] ; then - string 'Initial kernel command string' CONFIG_CMDLINE console=ttyS0,9600 console=tty0 root=/dev/sda2 + string 'Initial kernel command string' CONFIG_CMDLINE "console=ttyS0,9600 console=tty0 root=/dev/sda2" fi fi diff -urN v2.2.15/linux/arch/s390/Makefile linux/arch/s390/Makefile --- v2.2.15/linux/arch/s390/Makefile Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/Makefile Wed Jun 7 14:26:42 2000 @@ -52,11 +52,15 @@ MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot +MAKESILO = $(MAKE) -C arch/$(ARCH)/tools/silo + +MAKEDASDFMT = $(MAKE) -C arch/$(ARCH)/tools/dasdfmt + silo: - @$(MAKEBOOT) silo + @$(MAKESILO) silo dasdfmt: - @$(MAKEBOOT) dasdfmt + @$(MAKEDASDFMT) dasdfmt image: vmlinux @$(MAKEBOOT) image diff -urN v2.2.15/linux/arch/s390/boot/Makefile linux/arch/s390/boot/Makefile --- v2.2.15/linux/arch/s390/boot/Makefile Wed May 3 17:16:31 2000 +++ linux/arch/s390/boot/Makefile Wed Jun 7 14:26:42 2000 @@ -24,7 +24,7 @@ $(OBJCOPY) -O binary $< $@ image: $(CONFIGURE) $(TOPDIR)/vmlinux \ - iplfba.boot ipleckd.boot + iplfba.boot ipleckd.boot ipldump.boot $(OBJCOPY) -O binary $(TOPDIR)/vmlinux image $(NM) $(TOPDIR)/vmlinux | grep -v '\(compiled\)\|\( [aU] \)\|\(\.\)\|\(LASH[RL]DI\)' | sort > $(TOPDIR)/System.map @@ -34,5 +34,5 @@ dep: clean: - rm -f image listing iplfba.boot ipleckd.boot + rm -f image listing iplfba.boot ipleckd.boot ipldump.boot diff -urN v2.2.15/linux/arch/s390/boot/ipldump.S linux/arch/s390/boot/ipldump.S --- v2.2.15/linux/arch/s390/boot/ipldump.S Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/boot/ipldump.S Wed Jun 7 14:26:42 2000 @@ -0,0 +1,179 @@ +/* + * arch/s390/boot/ipldump.S + * + * S390 version + * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), + * + * Tape dump ipl record. Put it on a tape and ipl from it and it will + * write a dump of the real storage after the ipl record on that tape. + */ + +#include +#include +#include + +#define IPL_BS 1024 + .org 0 + .long 0x00080000,0x80000000+_start # The first 24 bytes are loaded + .long 0x07000000,0x60000001 # by ipl to addresses 0-23. + .long 0x02000000,0x20000000+IPL_BS # (a PSW and two CCWs). + .long 0x00000000,0x00000000 + .long 0x00000000,0x00000000 # svc old psw + .long 0x00000000,0x00000000 # program check old psw + .long 0x00000000,0x00000000 # machine check old psw + .long 0x00000000,0x00000000 # io old psw + .long 0x00000000,0x00000000 + .long 0x00000000,0x00000000 + .long 0x00000000,0x00000000 + .long 0x000a0000,0x00000058 # external new psw + .long 0x000a0000,0x00000060 # svc new psw + .long 0x000a0000,0x00000068 # program check new psw + .long 0x000a0000,0x00000070 # machine check new psw + .long 0x00080000,0x80000000+.Lioint # io new psw + + .org 0x100 + .globl _start +_start: + l %r1,0xb8 # load ipl subchannel number +# +# find out memory size +# + mvc 104(8,0),.Lpcmem0 # setup program check handler + slr %r3,%r3 + lhi %r2,1 + sll %r2,20 +.Lloop0: + l %r0,0(%r3) # test page + ar %r3,%r2 # add 1M + jnm .Lloop0 # r1 < 0x80000000 -> loop +.Lchkmem0: + n %r3,.L4malign0 # align to multiples of 4M + st %r3,.Lmemsize # store memory size +.Lmemok: + +# +# first write a tape mark +# + bras %r14,.Ltapemark +# +# write real storage to tape +# + slr %r2,%r2 # start at address 0 + bras %r14,.Lwriter # load ramdisk +# +# write another tape mark +# + bras %r14,.Ltapemark +# +# everything written, stop processor +# + lpsw .Lstopped +# +# subroutine for writing to tape +# Paramters: +# R1 = device number +# R2 = start address +# R3 = length +.Lwriter: + st %r14,.Lldret + la %r12,.Lorbread # r12 = address of orb + la %r5,.Lirb # r5 = address of irb + st %r2,.Lccwwrite+4 # initialize CCW data addresses + lctl %c6,%c6,.Lcr6 + slr %r2,%r2 +.Lldlp: + lhi %r6,3 # 3 retries +.Lssch: + ssch 0(%r12) # write chunk of IPL_BS bytes + jnz .Llderr +.Lw4end: + bras %r14,.Lwait4io + tm 8(%r5),0x82 # do we have a problem ? + jnz .Lrecov + l %r0,.Lccwwrite+4 # update CCW data addresses + ahi %r0,IPL_BS + st %r0,.Lccwwrite+4 + clr %r0,%r3 # enough ? + jl .Lldlp +.Ldone: + l %r14,.Lldret + br %r14 # r2 contains the total size +.Lrecov: + bras %r14,.Lsense # do the sensing + brct %r6,.Lssch # dec. retry count & branch + j .Llderr +.Ltapemark: + st %r14,.Lldret + la %r12,.Lorbmark # r12 = address of orb + la %r5,.Lirb # r5 = address of irb + lctl %c6,%c6,.Lcr6 + ssch 0(%r12) # write a tape mark + jnz .Llderr + bras %r14,.Lwait4io + l %r14,.Lldret + br %r14 +# +# Sense subroutine +# +.Lsense: + st %r14,.Lsnsret + la %r7,.Lorbsense + ssch 0(%r7) # start sense command + jnz .Llderr + bras %r14,.Lwait4io + l %r14,.Lsnsret + tm 8(%r5),0x82 # do we have a problem ? + jnz .Llderr + br %r14 +# +# Wait for interrupt subroutine +# +.Lwait4io: + lpsw .Lwaitpsw +.Lioint: + c %r1,0xb8 # compare subchannel number + jne .Lwait4io + tsch 0(%r5) + slr %r0,%r0 + tm 8(%r5),0x82 # do we have a problem ? + jnz .Lwtexit + tm 8(%r5),0x04 # got device end ? + jz .Lwait4io +.Lwtexit: + br %r14 +.Llderr: + lpsw .Lcrash + + .align 8 +.Lorbread: + .long 0x00000000,0x0080ff00,.Lccwwrite + .align 8 +.Lorbsense: + .long 0x00000000,0x0080ff00,.Lccwsense + .align 8 +.Lorbmark: + .long 0x00000000,0x0080ff00,.Lccwmark + .align 8 +.Lccwwrite: + .long 0x01200000+IPL_BS,0x00000000 +.Lccwsense: + .long 0x04200001,0x00000000 +.Lccwmark: + .long 0x1f200001,0x00000000 +.Lwaitpsw: + .long 0x020a0000,0x80000000+.Lioint + +.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +.Lcr6: .long 0xff000000 + .align 8 +.Lcrash:.long 0x000a0000,0x00000000 +.Lstopped: .long 0x000a0000,0x00001234 +.Lpcmem0:.long 0x00080000,0x80000000 + .Lchkmem0 +.L4malign0:.long 0xffc00000 +.Lmemsize:.long 0 +.Lldret:.long 0 +.Lsnsret: .long 0 + + .org IPL_BS + diff -urN v2.2.15/linux/arch/s390/boot/ipleckd.S linux/arch/s390/boot/ipleckd.S --- v2.2.15/linux/arch/s390/boot/ipleckd.S Wed May 3 17:16:31 2000 +++ linux/arch/s390/boot/ipleckd.S Wed Jun 7 14:26:42 2000 @@ -140,17 +140,16 @@ lr %r15,%r4 # save number or blocks slr %r7,%r7 icm %r7,3,.Lrdcdata+14 # load heads to r7 - clc .Lrdcdata+3(2),.L3390 - jne .L010 # 3380 or 3390 ? - lhi %r6,12 # setup r6 correct! - j .L011 -.L010: - clc .Lrdcdata+3(2),.L9343 - jne .L013 lhi %r6,9 - j .L011 -.L013: + clc .Lrdcdata+3(2),.L9343 + je .L011 lhi %r6,10 + clc .Lrdcdata+3(2),.L3380 + je .L011 + lhi %r6,12 + clc .Lrdcdata+3(2),.L3390 + je .L011 + bras %r14,.Ldisab .L011: # loop for nbl times .Lrdloop: @@ -246,9 +245,12 @@ .L3390: .word 0x3390 .L9343: - .word 0x9343 + .word 0x934a +.L3380: + .word 0x3380 .Lnull: .long 0x00000000,0x00000000 + .align 4 .Lrdcdata: .long 0x00000000,0x00000000 .long 0x00000000,0x00000000 diff -urN v2.2.15/linux/arch/s390/config.in linux/arch/s390/config.in --- v2.2.15/linux/arch/s390/config.in Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ - +# # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Linux Kernel Configuration" define_bool CONFIG_ARCH_S390 y @@ -43,6 +43,11 @@ endmenu source drivers/s390/Config.in +comment 'Character devices' +bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS +if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then + int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256 +fi if [ "$CONFIG_NET" = "y" ]; then source net/Config.in diff -urN v2.2.15/linux/arch/s390/defconfig linux/arch/s390/defconfig --- v2.2.15/linux/arch/s390/defconfig Wed May 3 17:16:31 2000 +++ linux/arch/s390/defconfig Wed Jun 7 14:26:42 2000 @@ -19,7 +19,7 @@ # CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set -# CONFIG_KMOD is not set +CONFIG_KMOD=y # # General setup @@ -42,10 +42,13 @@ # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_INITRD=y -CONFIG_MDISK=y -# CONFIG_MDISK_SYNC is not set +CONFIG_BLK_DEV_XPRAM=y +CONFIG_BLK_DEV_INITRD=y +# CONFIG_MDISK is not set CONFIG_DASD=y CONFIG_DASD_ECKD=y +CONFIG_DASD_FBA=y +CONFIG_DASD_MDSK=y # # S/390 Network device support @@ -64,6 +67,8 @@ CONFIG_3215_CONSOLE=y CONFIG_HWC=y CONFIG_HWC_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 # # Networking options @@ -122,6 +127,7 @@ # CONFIG_NTFS_FS is not set # CONFIG_HPFS_FS is not set CONFIG_PROC_FS=y +# CONFIG_DEVPTS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_EXT2_FS=y @@ -134,8 +140,7 @@ # # CONFIG_CODA_FS is not set CONFIG_NFS_FS=y -CONFIG_NFSD=y -# CONFIG_NFSD_SUN is not set +# CONFIG_NFSD is not set CONFIG_SUNRPC=y CONFIG_LOCKD=y # CONFIG_SMB_FS is not set diff -urN v2.2.15/linux/arch/s390/kernel/Makefile linux/arch/s390/kernel/Makefile --- v2.2.15/linux/arch/s390/kernel/Makefile Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/Makefile Wed Jun 7 14:26:42 2000 @@ -20,7 +20,8 @@ O_TARGET := kernel.o O_OBJS := lowcore.o entry.o bitmap.o traps.o time.o process.o irq.o \ setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ - s390fpu.o s390io.o reipl.o + s390fpu.o s390io.o reipl.o debug.o s390_ext.o s390dyn.o \ + s390mach.o OX_OBJS := s390_ksyms.o MX_OBJS := diff -urN v2.2.15/linux/arch/s390/kernel/cpcmd.c linux/arch/s390/kernel/cpcmd.c --- v2.2.15/linux/arch/s390/kernel/cpcmd.c Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/kernel/cpcmd.c Wed Jun 7 14:26:42 2000 @@ -7,6 +7,7 @@ */ #include +#include #include #include @@ -40,14 +41,5 @@ : "a" (obuffer), "d" (olen) : "2", "3" ); } -} - -int sys_msgcp(char *str) -{ - char buffer[256]; - - sprintf(buffer, "MSG * %s", str); - cpcmd(buffer, NULL, 0); - cpcmd("STOP", NULL, 0); } diff -urN v2.2.15/linux/arch/s390/kernel/debug.c linux/arch/s390/kernel/debug.c --- v2.2.15/linux/arch/s390/kernel/debug.c Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/kernel/debug.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,283 @@ +#include +#include +#include +#include +#include + +#ifdef MODULE +#include +#endif + +#include + +#include "debug.h" + +debug_info_t debug_areas[MAX_DEBUG_AREAS]; +debug_info_t *free_area = 0; +static int initialized = 0; + +static spinlock_t debug_lock = SPIN_LOCK_UNLOCKED; + +debug_info_t * +debug_register (char *name, int page_order, int nr_areas) +{ + debug_info_t *rc = 0; + int i; + long flags; + + if ( ! initialized ){ + debug_init(); + initialized = 1; + } + if (!free_area) + { + printk (KERN_WARNING "No free debug area\n"); + return NULL; + } + spin_lock_irqsave (&debug_lock, flags); + rc = free_area; + free_area = *((debug_info_t **) rc); + + rc->areas = (debug_entry_t **) kmalloc (nr_areas * + sizeof (debug_entry_t *), + GFP_ATOMIC); + if (!rc->areas) + { + goto noareas; + } + + for (i = 0; i < nr_areas; i++) + { + rc->areas[i] = (debug_entry_t *) __get_free_pages (GFP_ATOMIC, + page_order); + if (!rc->areas[i]) + { + for (i--; i >= 0; i--) + { + free_pages ((unsigned long) rc->areas[i], page_order); + } + goto nopages; + } + } + + rc->page_order = page_order; + rc->nr_areas = nr_areas; + rc->name = kmalloc (strlen (name) + 1, GFP_ATOMIC); + strncpy (rc->name, name, strlen (name)); + rc->name[strlen (name)] = 0; + rc->active_entry = kmalloc (nr_areas, GFP_ATOMIC); + memset(rc->active_entry, 0, nr_areas * sizeof(int)); + printk (KERN_INFO "reserved %d areas of %d pages for debugging %s\n", + nr_areas, 1 << page_order, name); + goto exit; + +nopages: +noareas: + free_area = rc; +exit: + spin_unlock_irqrestore (&debug_lock, flags); + return rc; +} + +void +debug_unregister (debug_info_t * id, char *name) +{ + int i = id->nr_areas; + long flags; + spin_lock_irqsave (&debug_lock, flags); + printk (KERN_INFO "freeing debug area %p named '%s'\n", id, name); + if (strncmp (name, id->name, strlen (name))) + { + printk (KERN_ERR "name '%s' does not match against '%s'\n", + name, id->name); + } + for (i--; i >= 0; i--) + { + free_pages ((unsigned long) id->areas[i], id->page_order); + } + kfree (id->areas); + kfree (id->name); + *((debug_info_t **) id) = free_area; + free_area = id; + spin_unlock_irqrestore (&debug_lock, flags); + return; +} + +static inline void +proceed_active_entry (debug_info_t * id) +{ + id->active_entry[id->active_area] = + (id->active_entry[id->active_area]++) % + ((PAGE_SIZE / sizeof (debug_entry_t)) << (id->page_order)); +} + +static inline void +proceed_active_area (debug_info_t * id) +{ + id->active_area = (id->active_area++) % id->nr_areas; +} + +static inline debug_entry_t * +get_active_entry (debug_info_t * id) +{ + return &id->areas[id->active_area][id->active_entry[id->active_area]]; +} + +static inline debug_entry_t * +debug_common ( debug_info_t * id ) +{ + debug_entry_t * active; + proceed_active_entry (id); + active = get_active_entry (id); + STCK (active->id.stck); + active->id.stck = active->id.stck >> 4; + active->id.fields.cpuid = smp_processor_id (); + active->caller = __builtin_return_address (0); + return active; +} + +void +debug_event (debug_info_t * id, int level, unsigned int tag) +{ + long flags; + debug_entry_t *active; + if (!id) + { + return; + } + if (level < id->level) + { + return; + } + spin_lock_irqsave (&id->lock, flags); + active = debug_common(id); + active->tag.tag = tag; + spin_unlock_irqrestore (&id->lock, flags); + return; +} + +void +debug_text_event (debug_info_t * id, int level, char tag[4]) +{ + long flags; + debug_entry_t *active; + if (!id) + { + return; + } + if (level < id->level) + { + return; + } + spin_lock_irqsave (&id->lock, flags); + active = debug_common(id); + strncpy ( active->tag.text, tag, 4); + ASCEBC (active->tag.text, 4 ); + spin_unlock_irqrestore (&id->lock, flags); + return; +} + +void +debug_exception (debug_info_t * id, int level, unsigned int tag) +{ + long flags; + debug_entry_t *active; + if (!id) + { + return; + } + if (level < id->level) + { + return; + } + spin_lock_irqsave (&id->lock, flags); + active = debug_common(id); + active->tag.tag = tag; + proceed_active_area (id); + spin_unlock_irqrestore (&id->lock, flags); + + return; +} + +void +debug_text_exception (debug_info_t * id, int level, char tag[4]) +{ + long flags; + debug_entry_t *active; + if (!id) + { + return; + } + if (level < id->level) + { + return; + } + spin_lock_irqsave (&id->lock, flags); + active = debug_common(id); + strncpy ( active->tag.text, tag, 4); + ASCEBC (active->tag.text, 4 ); + proceed_active_area (id); + spin_unlock_irqrestore (&id->lock, flags); + return; +} + +int +debug_init (void) +{ + int rc = 0; + int i; + for (i = 0; i < MAX_DEBUG_AREAS - 1; i++) + { + *(debug_info_t **) (&debug_areas[i]) = + (debug_info_t *) (&debug_areas[i + 1]); + } + *(debug_info_t **) (&debug_areas[i]) = (debug_info_t *) NULL; + free_area = &(debug_areas[0]); + printk (KERN_INFO "%d areas reserved for debugging information\n", + MAX_DEBUG_AREAS); + return rc; +} + +#ifdef MODULE +int +init_module (void) +{ + int rc = 0; + rc = debug_init (); + if (rc) + { + printk (KERN_INFO "An error occurred with debug_init\n"); + } + + { /* test section */ + debug_info_t *a[4]; + printk (KERN_INFO "registering 1, %p\n", a[0] = + debug_register ("debug1", 1, 1)); + printk (KERN_INFO "registering 2, %p\n", a[1] = + debug_register ("debug2", 1, 2)); + printk (KERN_INFO "registering 3, %p\n", a[2] = + debug_register ("debug3", 2, 1)); + printk (KERN_INFO "registering 4, %p\n", a[3] = + debug_register ("debug4", 2, 2)); + debug_unregister (a[0], "debug1"); + debug_unregister (a[1], "debug3"); + printk (KERN_INFO "registering 1, %p\n", a[0] = + debug_register ("debug5", 1, 1)); + printk (KERN_INFO "registering 2, %p\n", a[1] = + debug_register ("debug6", 1, 2)); + debug_unregister (a[2], "debug2"); + debug_unregister (a[3], "debug4"); + debug_unregister (a[0], "debug5"); + debug_unregister (a[1], "debug6"); + } + return rc; +} + +void +cleanup_module (void) +{ + + return; +} + +#endif /* MODULE */ diff -urN v2.2.15/linux/arch/s390/kernel/debug.h linux/arch/s390/kernel/debug.h --- v2.2.15/linux/arch/s390/kernel/debug.h Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/kernel/debug.h Wed Jun 7 14:26:42 2000 @@ -0,0 +1,55 @@ + +#ifndef DEBUG_H +#define DEBUG_H + +#include + +#define MAX_DEBUG_AREAS 16 + +#define STCK(x) asm volatile ("STCK %0":"=m" (x)) + +typedef struct +{ + union + { + struct + { + unsigned long long cpuid:4; + unsigned long long clock:60; + } + fields; + unsigned long long stck; + } + id; + void *caller; + union + { + unsigned long tag; + char text[4]; + } + tag; +} +debug_entry_t; + +typedef struct +{ + char *name; + int level; + int nr_areas; + int page_order; + debug_entry_t **areas; + int active_area; + int *active_entry; + spinlock_t lock; +} +debug_info_t; + +int debug_init (void); +debug_info_t *debug_register (char *name, int pages_index, int nr_areas); +void debug_unregister (debug_info_t * id, char *name); +void debug_event (debug_info_t * id, int level, unsigned int tag); +void debug_text_event (debug_info_t * id, int level, char tag[4]); +void debug_exception (debug_info_t * id, int level, unsigned int tag); +void debug_text_exception (debug_info_t * id, int level, char tag[4]); + +#endif diff -urN v2.2.15/linux/arch/s390/kernel/ebcdic.c linux/arch/s390/kernel/ebcdic.c --- v2.2.15/linux/arch/s390/kernel/ebcdic.c Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/kernel/ebcdic.c Wed Jun 7 14:26:42 2000 @@ -161,7 +161,156 @@ /* - * EBCDIC 037 conversion table: + * ASCII (IBM PC 437) -> EBCDIC 500 + */ +__u8 _ascebc_500[256] = +{ + /*00 NUL SOH STX ETX EOT ENQ ACK BEL */ + 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, + /*08 BS HT LF VT FF CR SO SI */ + /* ->NL */ + 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + /*10 DLE DC1 DC2 DC3 DC4 NAK SYN ETB */ + 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, + /*18 CAN EM SUB ESC FS GS RS US */ + /* ->IGS ->IRS ->IUS */ + 0x18, 0x19, 0x3F, 0x27, 0x22, 0x1D, 0x1E, 0x1F, + /*20 SP ! " # $ % & ' */ + 0x40, 0x4F, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, + /*28 ( ) * + , - . / */ + 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, + /*30 0 1 2 3 4 5 6 7 */ + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + /*38 8 9 : ; < = > ? */ + 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, + /*40 @ A B C D E F G */ + 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + /*48 H I J K L M N O */ + 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, + /*50 P Q R S T U V W */ + 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, + /*58 X Y Z [ \ ] ^ _ */ + 0xE7, 0xE8, 0xE9, 0x4A, 0xE0, 0x5A, 0x5F, 0x6D, + /*60 ` a b c d e f g */ + 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + /*68 h i j k l m n o */ + 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, + /*70 p q r s t u v w */ + 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, + /*78 x y z { | } ~ DL */ + 0xA7, 0xA8, 0xA9, 0xC0, 0xBB, 0xD0, 0xA1, 0x07, + /*80*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*88*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*90*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*98*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*A0*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*A8*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*B0*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*B8*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*C0*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*C8*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*D0*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*D8*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*E0 sz */ + 0x3F, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*E8*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*F0*/ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + /*F8*/ + 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x3F, 0xFF +}; + +/* + * EBCDIC 500 -> ASCII (IBM PC 437) + */ +__u8 _ebcasc_500[256] = +{ + /* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */ + 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F, + /* 0x08 -GE -SPS -RPT VT FF CR SO SI */ + 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + /* 0x10 DLE DC1 DC2 DC3 -RES -NL BS -POC + -ENP ->LF */ + 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07, + /* 0x18 CAN EM -UBS -CU1 -IFS -IGS -IRS -ITB + -IUS */ + 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + /* 0x20 -DS -SOS FS -WUS -BYP LF ETB ESC + -INP */ + 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B, + /* 0x28 -SA -SFE -SM -CSP -MFA ENQ ACK BEL + -SW */ + 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, + /* 0x30 ---- ---- SYN -IR -PP -TRN -NBS EOT */ + 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04, + /* 0x38 -SBS -IT -RFF -CU3 DC4 NAK ---- SUB */ + 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A, + /* 0x40 SP RSP ä ---- */ + 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86, + /* 0x48 [ . < ( + ! */ + 0x87, 0xA4, 0x5B, 0x2E, 0x3C, 0x28, 0x2B, 0x21, + /* 0x50 & ---- */ + 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07, + /* 0x58 ß ] $ * ) ; ^ */ + 0x8D, 0xE1, 0x5D, 0x24, 0x2A, 0x29, 0x3B, 0x5E, + /* 0x60 - / ---- Ä ---- ---- ---- */ + 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F, + /* 0x68 ---- , % _ > ? */ + 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, + /* 0x70 ---- ---- ---- ---- ---- ---- ---- */ + 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + /* 0x78 * ` : # @ ' = " */ + 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, + /* 0x80 * a b c d e f g */ + 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + /* 0x88 h i ---- ---- ---- */ + 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1, + /* 0x90 ° j k l m n o p */ + 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, + /* 0x98 q r ---- ---- */ + 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07, + /* 0xA0 ~ s t u v w x */ + 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + /* 0xA8 y z ---- ---- ---- ---- */ + 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07, + /* 0xB0 ---- § ---- */ + 0x9B, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC, + /* 0xB8 ---- | ---- ---- ---- ---- */ + 0xAB, 0x07, 0xAA, 0x7C, 0x07, 0x07, 0x07, 0x07, + /* 0xC0 { A B C D E F G */ + 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + /* 0xC8 H I ---- ö ---- */ + 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07, + /* 0xD0 } J K L M N O P */ + 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, + /* 0xD8 Q R ---- ü */ + 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98, + /* 0xE0 \ S T U V W X */ + 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + /* 0xE8 Y Z ---- Ö ---- ---- ---- */ + 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07, + /* 0xF0 0 1 2 3 4 5 6 7 */ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + /* 0xF8 8 9 ---- ---- Ü ---- ---- ---- */ + 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07 +}; + + +/* + * EBCDIC 037/500 conversion table: * from upper to lower case */ __u8 _ebc_tolower[256] = @@ -202,7 +351,7 @@ /* - * EBCDIC 037 conversion table: + * EBCDIC 037/500 conversion table: * from lower to upper case */ __u8 _ebc_toupper[256] = diff -urN v2.2.15/linux/arch/s390/kernel/entry.S linux/arch/s390/kernel/entry.S --- v2.2.15/linux/arch/s390/kernel/entry.S Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/entry.S Wed Jun 7 14:26:42 2000 @@ -89,6 +89,13 @@ enable = 0x03 daton = 0x04 +/* + * Base Address of this Module --- saved in __LC_ENTRY_BASE + */ + .globl entry_base +entry_base: + +#define BASED(name) name-entry_base(%r13) #if 0 /* some code left lying around in case we need a @@ -118,59 +125,38 @@ * R15 - kernel stack pointer */ -#define SAVE_ALL1(psworg) \ - st %r15,__LC_SAVE_AREA ; \ +#define SAVE_ALL(psworg) \ + stm %r13,%r15,__LC_SAVE_AREA ; \ + stam %a2,%a4,__LC_SAVE_AREA+12 ; \ + basr %r13,0 ; /* temp base pointer */ \ + l %r13,.Lentry_base-.(%r13) ; /* load &entry_base to %r13 */ \ tm psworg+1,0x01 ; /* test problem state bit */ \ - jz 0f ; /* skip stack setup save */ \ + bz BASED(.+12) ; /* skip stack & access regs setup */ \ l %r15,__LC_KERNEL_STACK ; /* problem state -> load ksp */ \ -0: ahi %r15,-SP_SIZE ; /* make room for registers & psw */ \ - srl %r15,3 ; \ - sll %r15,3 ; /* align stack pointer to 8 */ \ - stm %r0,%r14,SP_R0(%r15) ; /* store gprs 0-14 to kernel stack */ \ + lam %a2,%a4,BASED(.Lc_ac) ; /* set ac.reg. 2 to primary space */ \ + /* and access reg. 4 to home space */ \ +0: s %r15,BASED(.Lc_spsize); /* make room for registers & psw */ \ + n %r15,BASED(.Lc0xfffffff8) ; /* align stack pointer to 8 */ \ + stm %r0,%r12,SP_R0(%r15) ; /* store gprs 0-12 to kernel stack */ \ st %r2,SP_ORIG_R2(%r15) ; /* store original content of gpr 2 */ \ - mvc SP_RF(4,%r15),__LC_SAVE_AREA ; /* move R15 to stack */ \ + mvc SP_RD(12,%r15),__LC_SAVE_AREA ; /* move R13-R15 to stack */ \ stam %a0,%a15,SP_AREGS(%r15) ; /* store access registers to kst. */ \ + mvc SP_AREGS+8(12,%r15),__LC_SAVE_AREA+12 ; /* store ac. regs */ \ mvc SP_PSW(8,%r15),psworg ; /* move user PSW to stack */ \ - xc 0(7,%r15),0(%r15) ; /* clear back chain & trap ind. */ \ - mvi SP_TRAP+3(%r15),psworg ; /* store trap indication in pt_regs */ \ - slr %r0,%r0 ; \ - sar %a2,%r0 ; /* set ac.reg. 2 to primary space */ \ - lhi %r0,1 ; \ - sar %a4,%r0 ; /* set access reg. 4 to home space */ + la %r0,psworg ; /* store trap indication */ \ + st %r0,SP_TRAP(%r15) ; \ + xc 0(4,%r15),0(%r15) ; /* clear back chain */ -#define RESTORE_ALL1 \ - mvc 0x50(8,0),SP_PSW(%r15) ; /* move user PSW to lowcore */ \ +#define RESTORE_ALL \ + mvc __LC_RETURN_PSW(8,0),SP_PSW(%r15) ; /* move user PSW to lowcore */ \ lam %a0,%a15,SP_AREGS(%r15) ; /* load the access registers */ \ lm %r0,%r15,SP_R0(%r15) ; /* load gprs 0-15 of user */ \ - ni 0x51(0),0xfd ; /* clear wait state bit */ \ - lpsw 0x50 /* back to caller */ - -#if CONFIG_REMOTE_DEBUG -#define SAVE_ALL(psworg) \ - SAVE_ALL1(psworg) \ - tm psworg+1,0x01 ; /* test problem state bit */ \ - jz 0f ; /* skip stack setup save */ \ - stctl %c0,%c15,SP_CRREGS(%r15) ; /* save control regs for remote debugging */ \ -0: - -#define RESTORE_ALL \ - tm SP_PSW+1(%r15),0x01 ; /* test problem state bit */ \ - jz 0f ; /* skip cr restore */ \ - lctl %c0,%c15,SP_CRREGS(%r15) ; /* store control regs for remote debugging */ \ -0: RESTORE_ALL1 -#else - -#define SAVE_ALL(psworg) \ - SAVE_ALL1(psworg) - -#define RESTORE_ALL \ - RESTORE_ALL1 -#endif + ni __LC_RETURN_PSW+1(0),0xfd ; /* clear wait state bit */ \ + lpsw __LC_RETURN_PSW /* back to caller */ #define GET_CURRENT /* load pointer to task_struct to R9 */ \ - lhi %r9,-8192 ; \ - nr %r9,15 - + lr %r9,%r15 ; \ + n %r9,BASED(.Lc0xffffe000) /* * Scheduler resume function, called by switch_to @@ -181,22 +167,24 @@ */ .globl resume resume: + basr %r1,0 # setup base pointer +resume_base: l %r4,_TSS_PTREGS(%r3) tm SP_PSW-SP_PTREGS(%r4),0x40 # is the new process using per ? - jz RES_DN1 # if not we're fine + bz resume_noper-resume_base(%r1) # if not we're fine stctl %r9,%r11,24(%r15) # We are using per stuff clc _TSS_PER(12,%r3),24(%r15) - je RES_DN1 # we got away without bashing TLB's + be resume_noper-resume_base(%r1) # we got away w/o bashing TLB's lctl %c9,%c11,_TSS_PER(%r3) # Nope we didn't -RES_DN1: +resume_noper: stm %r6,%r15,24(%r15) # store resume registers of prev task st %r15,_TSS_KSP(%r2) # store kernel stack ptr to prev->tss.ksp - lhi %r0,-8192 - nr %r0,%r15 + lr %r0,%r15 + n %r0,.Lc0xffffe000-resume_base(%r1) l %r15,_TSS_KSP(%r3) # load kernel stack ptr from next->tss.ksp - lhi %r1,8191 + l %r1,.Lc8191-resume_base(%r1) or %r1,%r15 - ahi %r1,1 + la %r1,1(%r1) st %r1,__LC_KERNEL_STACK # __LC_KERNEL_STACK = new kernel stack stam %a2,%a2,_TSS_AR2(%r2) # store kernel access reg. 2 stam %a4,%a4,_TSS_AR4(%r2) # store kernel access reg. 4 @@ -213,40 +201,19 @@ * are executed with interrupts enabled. */ -sysc_lit: - sysc_bhmask: .long bh_mask - sysc_bhactive: .long bh_active - sysc_do_signal: .long do_signal - sysc_do_bottom_half:.long do_bottom_half - sysc_schedule: .long schedule - sysc_trace: .long syscall_trace -#ifdef __SMP__ - sysc_schedtail: .long schedule_tail -#endif - sysc_clone: .long sys_clone - sysc_fork: .long sys_fork - sysc_vfork: .long sys_vfork - sysc_sigreturn: .long sys_sigreturn - sysc_rt_sigreturn: .long sys_rt_sigreturn - sysc_execve: .long sys_execve - sysc_sigsuspend: .long sys_sigsuspend - sysc_rt_sigsuspend: .long sys_rt_sigsuspend - .globl system_call system_call: SAVE_ALL(0x20) - XC SP_SVC_STEP(4,%r15),SP_SVC_STEP(%r15) + xc SP_SVC_STEP(4,%r15),SP_SVC_STEP(%r15) pgm_system_call: - basr %r13,0 - ahi %r13,sysc_lit-. # setup base pointer R13 to sysc_lit slr %r8,%r8 # gpr 8 is call save (-> tracesys) ic %r8,0x8B # get svc number from lowcore stosm 24(%r15),0x03 # reenable interrupts GET_CURRENT # load pointer to task_struct to R9 sll %r8,2 - l %r8,sys_call_table-sysc_lit(8,%r13) # get address of system call + l %r8,sys_call_table-entry_base(8,%r13) # get address of system call tm flags+3(%r9),0x20 # PF_TRACESYS - jnz sysc_tracesys + bnz BASED(sysc_tracesys) basr %r14,%r8 # call sys_xxxx st %r2,SP_R2(%r15) # store return value (change R2 on stack) # ATTENTION: check sys_execve_glue before @@ -255,26 +222,26 @@ sysc_return: GET_CURRENT # load pointer to task_struct to R9 tm SP_PSW+1(%r15),0x01 # returning to user ? - jno sysc_leave # no-> skip bottom half, resched & signal + bno BASED(sysc_leave) # no-> skip bottom half, resched & signal # # check, if bottom-half has to be done # - l %r1,sysc_bhmask-sysc_lit(%r13) + l %r1,BASED(.Lbhmask) l %r0,0(%r1) - l %r1,sysc_bhactive-sysc_lit(%r13) + l %r1,BASED(.Lbhactive) n %r0,0(%r1) - jnz sysc_handle_bottom_half + bnz BASED(sysc_handle_bottom_half) # # check, if reschedule is needed # sysc_return_bh: icm %r0,15,need_resched(%r9) # get need_resched from task_struct - jnz sysc_reschedule + bnz BASED(sysc_reschedule) icm %r0,15,sigpending(%r9) # get sigpending from task_struct - jnz sysc_signal_return + bnz BASED(sysc_signal_return) sysc_leave: icm %r0,15,SP_SVC_STEP(%r15) # get sigpending from task_struct - jnz pgm_svcret + bnz BASED(pgm_svcret) stnsm 24(%r15),disable # disable I/O and ext. interrupts RESTORE_ALL @@ -284,24 +251,24 @@ sysc_signal_return: la %r2,SP_PTREGS(%r15) # load pt_regs sr %r3,%r3 # clear *oldset - l %r1,sysc_do_signal-sysc_lit(%r13) - la %r14,sysc_leave-sysc_lit(%r13) + l %r1,BASED(.Ldo_signal) + la %r14,BASED(sysc_leave) br %r1 # return point is sysc_leave # # call trace before and after sys_call # sysc_tracesys: - l %r1,sysc_trace-sysc_lit(%r13) - lhi %r2,-ENOSYS + l %r1,BASED(.Ltrace) + l %r2,BASED(.Lc_ENOSYS) st %r2,SP_R2(%r15) # give sysc_trace an -ENOSYS retval basr %r14,%r1 lm %r3,%r6,SP_R3(%r15) l %r2,SP_ORIG_R2(%r15) basr %r14,%r8 # call sys_xxx st %r2,SP_R2(%r15) # store return value - l %r1,sysc_trace-sysc_lit(%r13) - la %r14,sysc_return-sysc_lit(%r13) + l %r1,BASED(.Ltrace) + la %r14,BASED(sysc_return) br %r1 # return point is sysc_return @@ -310,16 +277,16 @@ # is zero # sysc_handle_bottom_half: - l %r1,sysc_do_bottom_half-sysc_lit(%r13) - la %r14,sysc_return_bh-sysc_lit(%r13) + l %r1,BASED(.Ldo_bottom_half) + la %r14,BASED(sysc_return_bh) br %r1 # call do_bottom_half # # call schedule with sysc_return as return-address # sysc_reschedule: - l %r1,sysc_schedule-sysc_lit(%r13) - la %r14,sysc_return-sysc_lit(%r13) + l %r1,BASED(.Lschedule) + la %r14,BASED(sysc_return) br %r1 # call scheduler, return to sysc_return # @@ -328,17 +295,17 @@ .globl ret_from_fork ret_from_fork: basr %r13,0 - ahi %r13,sysc_lit-. # setup base pointer R13 to $SYSCDAT + l %r13,.Lentry_base-.(%r13) # setup base pointer to &entry_base GET_CURRENT # load pointer to task_struct to R9 stosm 24(%r15),0x03 # reenable interrupts sr %r0,%r0 # child returns 0 st %r0,SP_R2(%r15) # store return value (change R2 on stack) #ifdef __SMP__ - l %r1,sysc_schedtail-sysc_lit(%r13) - la %r14,sysc_return-sysc_lit(%r13) + l %r1,BASED(.Lschedtail) + la %r14,BASED(sysc_return) br %r1 # call schedule_tail, return to sysc_return #else - j sysc_return + b BASED(sysc_return) #endif # @@ -349,22 +316,22 @@ # sys_clone_glue: la %r2,SP_PTREGS(%r15) # load pt_regs - l %r1,sysc_clone-sysc_lit(%r13) + l %r1,BASED(.Lclone) br %r1 # branch to sys_clone sys_fork_glue: la %r2,SP_PTREGS(%r15) # load pt_regs - l %r1,sysc_fork-sysc_lit(%r13) + l %r1,BASED(.Lfork) br %r1 # branch to sys_fork sys_vfork_glue: la %r2,SP_PTREGS(%r15) # load pt_regs - l %r1,sysc_vfork-sysc_lit(%r13) + l %r1,BASED(.Lvfork) br %r1 # branch to sys_vfork sys_execve_glue: la %r2,SP_PTREGS(%r15) # load pt_regs - l %r1,sysc_execve-sysc_lit(%r13) + l %r1,BASED(.Lexecve) lr %r12,%r14 # save return address basr %r14,%r1 # call sys_execve ltr %r2,%r2 # check if execve failed @@ -374,12 +341,12 @@ sys_sigreturn_glue: la %r2,SP_PTREGS(%r15) # load pt_regs as parameter - l %r1,sysc_sigreturn-sysc_lit(%r13) + l %r1,BASED(.Lsigreturn) br %r1 # branch to sys_sigreturn sys_rt_sigreturn_glue: la %r2,SP_PTREGS(%r15) # load pt_regs as parameter - l %r1,sysc_rt_sigreturn-sysc_lit(%r13) + l %r1,BASED(.Lrt_sigreturn) br %r1 # branch to sys_sigreturn # @@ -394,7 +361,7 @@ lr %r4,%r3 # move history1 parameter lr %r3,%r2 # move history0 parameter la %r2,SP_PTREGS(%r15) # load pt_regs as first parameter - l %r1,sysc_sigsuspend-sysc_lit(%r13) + l %r1,BASED(.Lsigsuspend) la %r14,4(%r14) # skip store of return value br %r1 # branch to sys_sigsuspend @@ -402,7 +369,7 @@ lr %r4,%r3 # move sigsetsize parameter lr %r3,%r2 # move unewset parameter la %r2,SP_PTREGS(%r15) # load pt_regs as first parameter - l %r1,sysc_rt_sigsuspend-sysc_lit(%r13) + l %r1,BASED(.Lrt_sigsuspend) la %r14,4(%r14) # skip store of return value br %r1 # branch to sys_rt_sigsuspend @@ -415,7 +382,7 @@ .long sys_write .long sys_open /* 5 */ .long sys_close - .long sys_waitpid + .long sys_ni_syscall /* old waitpid syscall holder */ .long sys_creat .long sys_link .long sys_unlink /* 10 */ @@ -426,7 +393,7 @@ .long sys_chmod /* 15 */ .long sys_lchown .long sys_ni_syscall /* old break syscall holder */ - .long sys_stat + .long sys_ni_syscall /* old stat syscall holder */ .long sys_lseek .long sys_getpid /* 20 */ .long sys_mount @@ -436,7 +403,7 @@ .long sys_stime /* 25 */ .long sys_ptrace .long sys_alarm - .long sys_fstat + .long sys_ni_syscall /* old fstat syscall holder */ .long sys_pause .long sys_utime /* 30 */ .long sys_ni_syscall /* old stty syscall holder */ @@ -467,7 +434,7 @@ .long sys_ni_syscall /* old mpx syscall holder */ .long sys_setpgid .long sys_ni_syscall /* old ulimit syscall holder */ - .long sys_olduname + .long sys_ni_syscall /* old uname syscall holder */ .long sys_umask /* 60 */ .long sys_chroot .long sys_ustat @@ -476,8 +443,8 @@ .long sys_getpgrp /* 65 */ .long sys_setsid .long sys_sigaction - .long sys_sgetmask - .long sys_ssetmask + .long sys_ni_syscall /* old sgetmask syscall holder */ + .long sys_ni_syscall /* old ssetmask syscall holder */ .long sys_setreuid /* 70 */ .long sys_setregid .long sys_sigsuspend_glue @@ -490,9 +457,9 @@ .long sys_settimeofday .long sys_getgroups /* 80 */ .long sys_setgroups - .long old_select + .long sys_ni_syscall /* old select syscall holder */ .long sys_symlink - .long sys_lstat + .long sys_ni_syscall /* old lstat syscall holder */ .long sys_readlink /* 85 */ .long sys_uselib .long sys_swapon @@ -517,7 +484,7 @@ .long sys_newstat .long sys_newlstat .long sys_newfstat - .long sys_uname + .long sys_ni_syscall /* old uname syscall holder */ .long sys_ni_syscall /* 110 */ /* iopl for i386 */ .long sys_vhangup .long sys_idle @@ -599,22 +566,14 @@ .long sys_ni_syscall /* streams1 */ .long sys_ni_syscall /* streams2 */ .long sys_vfork_glue /* 190 */ - .rept 254-190 + .rept 255-190 .long sys_ni_syscall .endr - .long sys_msgcp /* 255 */ /* * Program check handler routine */ -pgm_lit: - pgm_handle_per: .long handle_per_exception - pgm_jump_table: .long pgm_check_table - pgm_sysc_ret: .long sysc_return - pgm_sysc_lit: .long sysc_lit - pgm_do_signal: .long do_signal - .globl pgm_check_handler pgm_check_handler: /* @@ -630,115 +589,132 @@ * we just ignore the PER event (FIXME: is there anything we have to do * for LPSW?). */ + + stm %r13,%r15,__LC_SAVE_AREA + stam %a2,%a4,__LC_SAVE_AREA+12 + basr %r13,0 # temp base pointer + l %r13,.Lentry_base-.(%r13)# load &entry_base to %r13 tm __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception - jz pgm_sv # skip if not + bz BASED(pgm_sv) # skip if not tm __LC_PGM_OLD_PSW,0x40 # test if per event recording is on - jnz pgm_sv # skip if it is + bnz BASED(pgm_sv) # skip if it is # ok its one of the special cases, now we need to find out which one clc __LC_PGM_OLD_PSW(8),__LC_SVC_NEW_PSW - je pgm_svcper + be BASED(pgm_svcper) # no interesting special case, ignore PER event + lm %r13,%r15,__LC_SAVE_AREA lpsw 0x28 # it was a single stepped SVC that is causing all the trouble pgm_svcper: - SAVE_ALL(0x20) + tm 0x21,0x01 # test problem state bit + bz BASED(.+12) # skip stack & access regs setup + l %r15,__LC_KERNEL_STACK # problem state -> load ksp + lam %a2,%a4,BASED(.Lc_ac) # set ac.reg. 2 to primary space + # and access reg. 4 to home space + s %r15,BASED(.Lc_spsize) # make room for registers & psw + n %r15,BASED(.Lc0xfffffff8) # align stack pointer to 8 + stm %r0,%r12,SP_R0(%r15) # store gprs 0-12 to kernel stack + st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 + mvc SP_RD(12,%r15),__LC_SAVE_AREA # move R13-R15 to stack + stam %a0,%a15,SP_AREGS(%r15) # store access registers to kst. + mvc SP_AREGS+8(12,%r15),__LC_SAVE_AREA+12 # store ac. regs + mvc SP_PSW(8,%r15),0x20 # move user PSW to stack + la %r0,0x20 # store trap indication + st %r0,SP_TRAP(%r15) + xc 0(4,%r15),0(%r15) # clear back chain mvi SP_SVC_STEP(%r15),1 # make SP_SVC_STEP nonzero mvc SP_PGM_OLD_ILC(4,%r15),__LC_PGM_ILC # save program check information - j pgm_system_call # now do the svc + b BASED(pgm_system_call) # now do the svc pgm_svcret: - mvc __LC_PGM_ILC(4),SP_PGM_OLD_ILC(%r15) # restore program check info - lhi %r0,0x28 - st %r0,SP_TRAP(%r15) # set new trap indicator - j pgm_no_sv + mvi SP_TRAP+3(%r15),0x28 # set trap indication back to pgm_chk + lh %r7,SP_PGM_OLD_ILC(%r15) # get ilc from stack + xc SP_SVC_STEP(4,%r15),SP_SVC_STEP(%r15) + b BASED(pgm_no_sv) pgm_sv: - SAVE_ALL(0x28) -pgm_no_sv: - XC SP_SVC_STEP(4,%r15),SP_SVC_STEP(%r15) - basr %r13,0 - ahi %r13,pgm_lit-. # setup base pointer R13 to $PGMDAT + tm 0x29,0x01 # test problem state bit + bz BASED(.+12) # skip stack & access regs setup + l %r15,__LC_KERNEL_STACK # problem state -> load ksp + lam %a2,%a4,BASED(.Lc_ac) # set ac.reg. 2 to primary space + # and access reg. 4 to home space + s %r15,BASED(.Lc_spsize) # make room for registers & psw + n %r15,BASED(.Lc0xfffffff8) # align stack pointer to 8 + stm %r0,%r12,SP_R0(%r15) # store gprs 0-12 to kernel stack + st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 + mvc SP_RD(12,%r15),__LC_SAVE_AREA # move R13-R15 to stack + stam %a0,%a15,SP_AREGS(%r15) # store access registers to kst. + mvc SP_AREGS+8(12,%r15),__LC_SAVE_AREA+12 # store ac. regs + mvc SP_PSW(8,%r15),0x28 # move user PSW to stack + la %r0,0x28 # store trap indication + st %r0,SP_TRAP(%r15) + xc 0(4,%r15),0(%r15) # clear back chain + xc SP_SVC_STEP(4,%r15),SP_SVC_STEP(%r15) lh %r7,__LC_PGM_ILC # load instruction length +pgm_no_sv: lh %r8,__LC_PGM_INT_CODE # N.B. saved int code used later KEEP it stosm 24(%r15),0x03 # reenable interrupts lr %r3,%r8 - lhi %r0,0x7f + la %r0,0x7f nr %r3,%r0 # clear per-event-bit - je pgm_dn # none of Martins exceptions occured bypass - l %r9,pgm_jump_table-pgm_lit(%r13) + be BASED(pgm_dn) # none of Martins exceptions occured bypass + l %r9,BASED(.Ljump_table) sll %r3,2 l %r9,0(%r3,%r9) # load address of handler routine la %r2,SP_PTREGS(%r15) # address of register-save area srl %r3,2 - chi %r3,0x4 # protection-exception ? - jne pgm_go # if not, + cl %r3,BASED(.Lc4) # protection-exception ? + bne BASED(pgm_go) # if not, l %r5,SP_PSW+4(15) # load psw addr sr %r5,%r7 # substract ilc from psw st %r5,SP_PSW+4(15) # store corrected psw addr pgm_go: basr %r14,%r9 # branch to interrupt-handler -pgm_dn: lhi %r0,0x80 +pgm_dn: la %r0,0x80 nr %r8,%r0 # check for per exception - je pgm_return + be BASED(pgm_return) la %r2,SP_PTREGS(15) # address of register-save area - l %r9,pgm_handle_per-pgm_lit(%r13) # load adr. of per handler - l %r14,pgm_sysc_ret-pgm_lit(%r13) # load adr. of system return - l %r13,pgm_sysc_lit-pgm_lit(%r13) + l %r9,BASED(.Lhandle_per) # load adr. of per handler + la %r14,BASED(sysc_return) # load adr. of system return br %r9 # branch to handle_per_exception # # the backend code is the same as for sys-call # pgm_return: - l %r14,pgm_sysc_ret-pgm_lit(%r13) - l %r13,pgm_sysc_lit-pgm_lit(%r13) - br %r14 - -default_trap_handler: - .globl default_trap_handler - lpsw 112 + b BASED(sysc_return) /* * IO interrupt handler routine */ -io_lit: - io_do_IRQ: .long do_IRQ - io_schedule: .long schedule - io_do_signal: .long do_signal - io_bhmask: .long bh_mask - io_bhactive: .long bh_active - io_do_bottom_half:.long do_bottom_half - .globl io_int_handler io_int_handler: SAVE_ALL(0x38) - basr %r13,0 - ahi %r13,io_lit-. # setup base pointer R13 to $IODAT la %r2,SP_PTREGS(%r15) # address of register-save area sr %r3,%r3 icm %r3,%r3,__LC_SUBCHANNEL_NR # load subchannel nr & extend to int l %r4,__LC_IO_INT_PARM # load interuption parm - l %r9,io_do_IRQ-io_lit(%r13) # load address of do_IRQ + l %r9,BASED(.Ldo_IRQ) # load address of do_IRQ basr %r14,%r9 # branch to standard irq handler io_return: GET_CURRENT # load pointer to task_struct to R9 tm SP_PSW+1(%r15),0x01 # returning to user ? - jz io_leave # no-> skip resched & signal + bz BASED(io_leave) # no-> skip resched & signal stosm 24(%r15),0x03 # reenable interrupts # # check, if bottom-half has to be done # - l %r1,io_bhmask-io_lit(%r13) + l %r1,BASED(.Lbhmask) l %r0,0(%r1) - l %r1,io_bhactive-io_lit(%r13) + l %r1,BASED(.Lbhactive) n %r0,0(%r1) - jnz io_handle_bottom_half + bnz BASED(io_handle_bottom_half) io_return_bh: # # check, if reschedule is needed # icm %r0,15,need_resched(%r9) # get need_resched from task_struct - jnz io_reschedule + bnz BASED(io_reschedule) icm %r0,15,sigpending(%r9) # get sigpending from task_struct - jnz io_signal_return + bnz BASED(io_signal_return) io_leave: stnsm 24(%r15),disable # disable I/O and ext. interrupts RESTORE_ALL @@ -748,16 +724,16 @@ # is zero # io_handle_bottom_half: - l %r1,io_do_bottom_half-io_lit(%r13) - la %r14,io_return_bh-io_lit(%r13) + l %r1,BASED(.Ldo_bottom_half) + la %r14,BASED(io_return_bh) br %r1 # call do_bottom_half # # call schedule with io_return as return-address # io_reschedule: - l %r1,io_schedule-io_lit(%r13) - la %r14,io_return-io_lit(%r13) + l %r1,BASED(.Lschedule) + la %r14,BASED(io_return) br %r1 # call scheduler, return to io_return # @@ -766,103 +742,48 @@ io_signal_return: la %r2,SP_PTREGS(%r15) # load pt_regs sr %r3,%r3 # clear *oldset - l %r1,io_do_signal-io_lit(%r13) - la %r14,io_leave-io_lit(%r13) + l %r1,BASED(.Ldo_signal) + la %r14,BASED(io_leave) br %r1 # return point is io_leave /* * External interrupt handler routine */ -ext_lit: - ext_timer_int: .long do_timer_interrupt -#ifdef __SMP__ - ext_call_int: .long do_ext_call_interrupt -#endif -#ifdef CONFIG_HWC - ext_hwc_int: .long do_hwc_interrupt -#endif -#ifdef CONFIG_MDISK - ext_mdisk_int: .long do_mdisk_interrupt -#endif -#ifdef CONFIG_IUCV - ext_iucv_int: .long do_iucv_interrupt -#endif - ext_io_lit: .long io_lit - ext_io_return: .long io_return - .globl ext_int_handler ext_int_handler: SAVE_ALL(0x18) - basr %r13,0 - ahi %r13,ext_lit-. # setup base pointer R13 to $EXTDAT la %r2,SP_PTREGS(%r15) # address of register-save area lh %r3,__LC_EXT_INT_CODE # error code -#ifdef __SMP__ - chi %r3,0x1202 # EXTERNAL_CALL - jne ext_no_extcall - l %r9,ext_call_int-ext_lit(%r13) # load ext_call_interrupt - l %r14,ext_io_return-ext_lit(%r13) - l %r13,ext_io_lit-ext_lit(%r13) - br %r9 # branch to ext call handler -ext_no_extcall: -#endif - chi %r3,0x1004 # CPU_TIMER - jne ext_no_timer - l %r9,ext_timer_int-ext_lit(%r13) # load timer_interrupt - l %r14,ext_io_return-ext_lit(%r13) - l %r13,ext_io_lit-ext_lit(%r13) - br %r9 # branch to ext call handler -ext_no_timer: -#ifdef CONFIG_HWC - chi %r3,0x2401 # HWC interrupt - jne ext_no_hwc - l %r9,ext_hwc_int-ext_lit(%r13) # load addr. of hwc routine - l %r14,ext_io_return-ext_lit(%r13) - l %r13,ext_io_lit-ext_lit(%r13) + lr %r1,%r3 # calculate index + srl %r1,8 # = (code + (code >> 8)) & 0xff + alr %r1,%r3 + n %r1,BASED(.Lc0xff) + sll %r1,2 + l %r9,BASED(.Lext_hash) + l %r9,0(%r1,%r9) # get first list entry for hash value + ltr %r9,%r9 # == NULL ? + bz BASED(io_return) # yes, nothing to do, exit +ext_int_loop: + ch %r3,8(%r9) # compare external interrupt code + be BASED(ext_int_found) + icm %r9,15,0(%r9) # next list entry + bnz BASED(ext_int_loop) + b BASED(io_return) +ext_int_found: + l %r9,4(%r9) # get handler address + la %r14,BASED(io_return) br %r9 # branch to ext call handler -ext_no_hwc: -#endif -#ifdef CONFIG_MDISK - chi %r3,0x2603 # diag 250 (VM) interrupt - jne ext_no_mdisk - l %r9,ext_mdisk_int-ext_lit(%r13) - l %r14,ext_io_return-ext_lit(%r13) - l %r13,ext_io_lit-ext_lit(%r13) - br %r9 # branch to ext call handler -ext_no_mdisk: -#endif -#ifdef CONFIG_IUCV - chi %r3,0x4000 # diag 250 (VM) interrupt - jne ext_no_iucv - l %r9,ext_iucv_int-ext_lit(%r13) - l %r14,ext_io_return-ext_lit(%r13) - l %r13,ext_io_lit-ext_lit(%r13) - br %r9 # branch to ext call handler -ext_no_iucv: -#endif - - l %r14,ext_io_return-ext_lit(%r13) - l %r13,ext_io_lit-ext_lit(%r13) - br %r14 # use backend code of io_int_handler /* * Machine check handler routines */ -mcck_lit: - mcck_crw_pending: .long do_crw_pending - .globl mcck_int_handler mcck_int_handler: SAVE_ALL(0x30) - basr %r13,0 - ahi %r13,mcck_lit-. # setup base pointer R13 to $MCCKDAT - tm __LC_MCCK_CODE+1,0x40 - jno mcck_no_crw - l %r1,mcck_crw_pending-mcck_lit(%r13) - basr %r14,%r1 # call do_crw_pending -mcck_no_crw: + l %r1,BASED(.Ls390_mcck) + basr %r14,%r1 # call machine check handler mcck_return: RESTORE_ALL @@ -877,11 +798,11 @@ lam %a0,%a15,__LC_AREGS_SAVE_AREA stosm 0(%r15),daton # now we can turn dat on lm %r6,%r15,24(%r15) # load registers from clone - bras %r14,restart_go - .long start_secondary -restart_go: - l %r14,0(%r14) + basr %r14,0 + l %r14,restart_addr-.(%r14) br %r14 # branch to start_secondary +restart_addr: + .long start_secondary #else /* * If we do not run with SMP enabled, let the new CPU crash ... @@ -898,8 +819,49 @@ #endif +/* + * Integer constants + */ + .align 4 +.Lc0xfffffff8: .long -8 # to align stack pointer to 8 +.Lc0xffffe000: .long -8192 # to round stack pointer to &task_struct +.Lc8191: .long 8191 +.Lc_spsize: .long SP_SIZE +.Lc_ac: .long 0,0,1 +.Lc_ENOSYS: .long -ENOSYS +.Lc4: .long 4 +.Lc0x1202: .long 0x1202 +.Lc0x1004: .long 0x1004 +.Lc0x2401: .long 0x2401 +.Lc0x4000: .long 0x4000 +.Lc0xff: .long 0xff +/* + * Symbol constants + */ +.Lbhactive: .long bh_active +.Lbhmask: .long bh_mask +.Ls390_mcck: .long s390_do_machine_check +.Ldo_IRQ: .long do_IRQ +.Ldo_bottom_half: + .long do_bottom_half +.Ldo_signal: .long do_signal +.Lentry_base: .long entry_base +.Lext_hash: .long ext_int_hash +.Lhandle_per: .long handle_per_exception +.Ljump_table: .long pgm_check_table +.Lschedule: .long schedule +.Lclone: .long sys_clone +.Lexecve: .long sys_execve +.Lfork: .long sys_fork +.Lrt_sigreturn:.long sys_rt_sigreturn +.Lrt_sigsuspend: + .long sys_rt_sigsuspend +.Lsigreturn: .long sys_sigreturn +.Lsigsuspend: .long sys_sigsuspend +.Ltrace: .long syscall_trace +.Lvfork: .long sys_vfork - - - +#ifdef __SMP__ +.Lschedtail: .long schedule_tail +#endif diff -urN v2.2.15/linux/arch/s390/kernel/head.S linux/arch/s390/kernel/head.S --- v2.2.15/linux/arch/s390/kernel/head.S Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/head.S Wed Jun 7 14:26:42 2000 @@ -481,10 +481,7 @@ .org 0x10000 .globl start start: basr %r13,0 # get base -.LPG1: lctl %c1,%c1,.Lpstd-.LPG1(%r13) # load pstd - lctl %c7,%c7,.Lpstd-.LPG1(%r13) # load sstd - lctl %c13,%c13,.Lpstd-.LPG1(%r13) # load hstd - lctl %c0,%c0,.Lcr0-.LPG1(%r13) # set CR0 +.LPG1: lctl %c0,%c15,.Lctl-.LPG1(%r13) # load all control registers l %r12,.Lparm1-.LPG1(%r13) # pointer to parameter area # @@ -529,15 +526,40 @@ adbr %f0,%f2 # test IEEE add instruction oi MACHINE_FLAGS+3-PARMAREA(%r12),2 # set IEEE fpu flag .Lchkfpu: +# +# find out if we have the CSP instruction +# + mvc 104(8,0),.Lpccsp-.LPG1(%r13) # setup program check handler + la %r0,0 + lr %r1,%r0 + la %r2,.Lflt0-.LPG1(%r13) + csp %r0,%r2 # Test CSP instruction + oi MACHINE_FLAGS+3-PARMAREA(%r12),8 # set CSP flag +.Lchkcsp: lpsw .Lentry-.LPG1(13) # jump to _stext in primary-space, # virtual and never return ... .align 8 .Lentry:.long 0x04080000,0x80000000 + _stext -.Lpstd: .long .Lpgd+0x7F # segment-table -.Lcr0: .long 0x04b50002 +.Lctl: .long 0x04b50002 # cr0: various things + .long .Lpgd+0x7f # cr1: primary space segment table + .long 0 # cr2: access register translation + .long 0 # cr3: instruction authorization + .long 0 # cr4: instruction authorization + .long 0 # cr5: various things + .long 0 # cr6: I/O interrupts + .long .Lpgd+0x7f # cr7: secondary space segment table + .long 0 # cr8: access registers translation + .long 0 # cr9: tracing off + .long 0 # cr10: tracing off + .long 0 # cr11: tracing off + .long 0 # cr12: tracing off + .long .Lpgd+0x7f # cr13: home space segment table + .long 0xc0000000 # cr14: machine check handling off + .long 0 # cr15: linkage stack operations .Lpcmem:.long 0x00080000,0x80000000 + .Lchkmem .Lpcfpu:.long 0x00080000,0x80000000 + .Lchkfpu +.Lpccsp:.long 0x00080000,0x80000000 + .Lchkcsp .Lflt0: .double 0 .Lparm1:.long PARMAREA .L4malign:.long 0xffc00000 @@ -600,9 +622,8 @@ jo .-4 # branch back, if not finish # check control registers stctl %c0,%c15,0(%r15) - l %r0,0(%r15) - o %r0,.Lcr0or-.LPG2(%r13) # enable sigp external ints. - st %r0,0(%r15) + oc 2(1,%r15),.Locbits+5-.LPG2(%r13) # enable sigp external ints. + oc 0(1,%r15),.Locbits+4-.LPG2(%r13) # low addresss proctection lctl %c0,%c15,0(%r15) # @@ -621,7 +642,7 @@ .Linittu: .long init_task_union .Lbss_bgn: .long __bss_start .Lbss_end: .long _end -.Lcr0or: .long 0x00002000 +.Locbits: .long 0x01020408,0x10204080 .align 4 .Laregs: .long 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 .align 8 diff -urN v2.2.15/linux/arch/s390/kernel/irq.c linux/arch/s390/kernel/irq.c --- v2.2.15/linux/arch/s390/kernel/irq.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/irq.c Wed Jun 7 14:26:42 2000 @@ -372,7 +372,7 @@ if ( ioinfo[irq] == INVALID_STORAGE_AREA ) return( -ENODEV); - action = ioinfo[irq]->irq_desc.action; + action = (struct irqaction *) ioinfo[irq]->irq_desc.action; if (action) { @@ -401,7 +401,7 @@ { } -unsigned long __init init_IRQ(unsigned long memory) +__initfunc(unsigned long init_IRQ( unsigned long memory)) { return s390_init_IRQ( memory); } @@ -420,5 +420,6 @@ void *dev_id) { return( s390_request_irq( irq, handler, irqflags, devname, dev_id ) ); + } diff -urN v2.2.15/linux/arch/s390/kernel/irqextras390.c linux/arch/s390/kernel/irqextras390.c --- v2.2.15/linux/arch/s390/kernel/irqextras390.c Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/kernel/irqextras390.c Wed Jun 7 14:26:42 2000 @@ -33,3 +33,4 @@ break; } } + diff -urN v2.2.15/linux/arch/s390/kernel/process.c linux/arch/s390/kernel/process.c --- v2.2.15/linux/arch/s390/kernel/process.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/process.c Wed Jun 7 14:26:42 2000 @@ -18,6 +18,7 @@ #define __KERNEL_SYSCALLS__ #include +#include #include #include #include diff -urN v2.2.15/linux/arch/s390/kernel/ptrace.c linux/arch/s390/kernel/ptrace.c --- v2.2.15/linux/arch/s390/kernel/ptrace.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/ptrace.c Wed Jun 7 14:26:42 2000 @@ -474,6 +474,10 @@ } ret = -ESRCH; // printk("child=%lX child->flags=%lX",child,child->flags); + /* I added child!=current line so we can get the */ + /* ieee_instruction_pointer from the user structure DJB */ + if(child!=current) + { if (!(child->flags & PF_PTRACED)) goto out; if (child->state != TASK_STOPPED) @@ -483,7 +487,7 @@ } if (child->p_pptr != current) goto out; - + } switch (request) { /* If I and D space are separate, these will need to be fixed. */ diff -urN v2.2.15/linux/arch/s390/kernel/reipl.S linux/arch/s390/kernel/reipl.S --- v2.2.15/linux/arch/s390/kernel/reipl.S Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/reipl.S Wed Jun 7 14:26:42 2000 @@ -12,6 +12,9 @@ do_reipl: basr %r13,0 .Lpg0: lpsw .Lnewpsw-.Lpg0(%r13) .Lpg1: lctl %c6,%c6,.Lall-.Lpg0(%r13) + stctl %c0,%c0,.Lctlsave-.Lpg0(%r13) + ni .Lctlsave-.Lpg0(%r13),0xef + lctl %c0,%c0,.Lctlsave-.Lpg0(%r13) lr %r1,%r2 mvc __LC_PGM_NEW_PSW(8,0),.Lpcnew-.Lpg0(%r13) stsch .Lschib-.Lpg0(%r13) @@ -41,8 +44,9 @@ .Ldisab: st %r14,.Ldispsw+4-.Lpg0(%r13) lpsw .Ldispsw-.Lpg0(%r13) .align 8 -.Lall: .long 0xff000000; +.Lall: .long 0xff000000 .Lnull: .long 0x00000000 +.Lctlsave: .long 0x00000000 .align 8 .Lnewpsw: .long 0x00080000,0x80000000+.Lpg1 .Lpcnew: .long 0x00080000,0x80000000+.Lecs diff -urN v2.2.15/linux/arch/s390/kernel/s390_ext.c linux/arch/s390/kernel/s390_ext.c --- v2.2.15/linux/arch/s390/kernel/s390_ext.c Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/kernel/s390_ext.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,77 @@ +/* + * arch/s390/kernel/s390_ext.c + * + * S390 version + * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com), + * Martin Schwidefsky (schwidefsky@de.ibm.com) + */ + +#include +#include +#include +#include + +/* + * Simple hash strategy: index = ((code >> 8) + code) & 0xff; + * ext_int_hash[index] is the start of the list for all external interrupts + * that hash to this index. With the current set of external interrupts + * (0x1202 external call, 0x1004 cpu timer, 0x2401 hwc console and 0x4000 + * iucv) this is always the first element. + */ +ext_int_info_t *ext_int_hash[256] = { 0, }; +ext_int_info_t ext_int_info_timer; +ext_int_info_t ext_int_info_hwc; + +int register_external_interrupt(__u16 code, ext_int_handler_t handler) { + ext_int_info_t *p; + int index; + + index = (code + (code >> 8)) & 0xff; + p = ext_int_hash[index]; + while (p != NULL) { + if (p->code == code) + return -EBUSY; + p = p->next; + } + if (code == 0x1004) /* time_init is done before kmalloc works :-/ */ + p = &ext_int_info_timer; + else if (code == 0x2401) /* hwc_init is done too early too */ + p = &ext_int_info_hwc; + else + p = (ext_int_info_t *) + kmalloc(sizeof(ext_int_info_t), GFP_ATOMIC); + if (p == NULL) + return -ENOMEM; + p->code = code; + p->handler = handler; + p->next = ext_int_hash[index]; + ext_int_hash[index] = p; + return 0; +} + +int unregister_external_interrupt(__u16 code, ext_int_handler_t handler) { + ext_int_info_t *p, *q; + int index; + + index = (code + (code >> 8)) & 0xff; + q = NULL; + p = ext_int_hash[index]; + while (p != NULL) { + if (p->code == code && p->handler == handler) + break; + q = p; + p = p->next; + } + if (p == NULL) + return -ENOENT; + if (q != NULL) + q->next = p->next; + else + ext_int_hash[index] = p->next; + if (code != 0x1004 && code != 0x2401) + kfree(p); + return 0; +} + + diff -urN v2.2.15/linux/arch/s390/kernel/s390_ksyms.c linux/arch/s390/kernel/s390_ksyms.c --- v2.2.15/linux/arch/s390/kernel/s390_ksyms.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/s390_ksyms.c Wed Jun 7 14:26:42 2000 @@ -8,6 +8,14 @@ #include #include #include +#include +#if CONFIG_CHANDEV +#include +#endif +#if CONFIG_IP_MULTICAST +#include +#endif + /* * I/O subsystem @@ -24,6 +32,12 @@ EXPORT_SYMBOL(get_irq_next); /* + * External interrupts + */ +EXPORT_SYMBOL(register_external_interrupt); +EXPORT_SYMBOL(unregister_external_interrupt); + +/* * memory management */ EXPORT_SYMBOL(init_mm); @@ -57,10 +71,19 @@ EXPORT_SYMBOL(__global_save_flags); EXPORT_SYMBOL(__global_restore_flags); EXPORT_SYMBOL(global_bh_lock); +EXPORT_SYMBOL(synchronize_bh); EXPORT_SYMBOL(kernel_flag); #endif EXPORT_SYMBOL(kernel_thread); -EXPORT_SYMBOL(synchronize_bh); EXPORT_SYMBOL(csum_fold); - +#if CONFIG_CHANDEV +EXPORT_SYMBOL(chandev_register_and_probe); +EXPORT_SYMBOL(chandev_unregister); +EXPORT_SYMBOL(chandev_initdevice); +EXPORT_SYMBOL(chandev_initnetdevice); +#endif +#if CONFIG_IP_MULTICAST +/* Required for lcs gigibit ethernet multicast support */ +EXPORT_SYMBOL(arp_mc_map); +#endif diff -urN v2.2.15/linux/arch/s390/kernel/s390dyn.c linux/arch/s390/kernel/s390dyn.c --- v2.2.15/linux/arch/s390/kernel/s390dyn.c Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/kernel/s390dyn.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,206 @@ +/* + * arch/s390/kernel/s390dyn.c + * S/390 dynamic device attachment + * + * S390 version + * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Author(s): Ingo Adlung (adlung@de.ibm.com) + */ + +#include +#include + +#include +#include +#include + +static devreg_t *devreg_anchor = NULL; +static spinlock_t dyn_lock = SPIN_LOCK_UNLOCKED; + +int s390_device_register( devreg_t *drinfo ) +{ + unsigned long flags; + + int ret = 0; + devreg_t *pdevreg = devreg_anchor; + + if ( drinfo == NULL ) + return( -EINVAL ); + + spin_lock_irqsave( &dyn_lock, flags ); + + while ( (pdevreg != NULL) && (ret ==0) ) + { + if ( pdevreg == drinfo ) + { + ret = -EINVAL; + } + else + { + if ( ( (pdevreg->flag & DEVREG_TYPE_DEVNO) + && (pdevreg->ci.devno ) ) + && ( (drinfo->flag & DEVREG_TYPE_DEVNO ) + && (drinfo->ci.devno ) ) ) + { + ret = -EBUSY; + } + else if ( (pdevreg->flag & DEVREG_EXACT_MATCH) + && (drinfo->flag & DEVREG_EXACT_MATCH ) ) + { + if ( memcmp( &pdevreg->ci.hc, &drinfo->ci.hc, 6) ) + ret = -EBUSY; + } + else if ( (pdevreg->flag & DEVREG_MATCH_DEV_TYPE) + && (drinfo->flag & DEVREG_MATCH_DEV_TYPE ) ) + { + if ( (pdevreg->ci.hc.dtype == drinfo->ci.hc.dtype) + && (pdevreg->ci.hc.dmode == drinfo->ci.hc.dmode) ) + ret = -EBUSY; + } + else if ( (pdevreg->flag & DEVREG_MATCH_CU_TYPE) + && (drinfo->flag & DEVREG_MATCH_CU_TYPE ) ) + { + if ( (pdevreg->ci.hc.ctype == drinfo->ci.hc.ctype) + && (pdevreg->ci.hc.cmode == drinfo->ci.hc.cmode) ) + ret = -EBUSY; + } + else if ( (pdevreg->flag & DEVREG_NO_CU_INFO) + && (drinfo->flag & DEVREG_NO_CU_INFO ) ) + { + if ( (pdevreg->ci.hnc.dtype == drinfo->ci.hnc.dtype) + && (pdevreg->ci.hnc.dmode == drinfo->ci.hnc.dmode) ) + ret = -EBUSY; + } + + pdevreg = pdevreg->next; + + } /* endif */ + + } /* endwhile */ + + /* + * only enqueue if no collision was found ... + */ + if ( ret == 0 ) + { + drinfo->next = devreg_anchor; + drinfo->prev = NULL; + + if ( devreg_anchor != NULL ) + { + devreg_anchor->prev = drinfo; + + } /* endif */ + + } /* endif */ + + spin_unlock_irqrestore( &dyn_lock, flags ); + + return( ret); +} + + +int s390_device_unregister( devreg_t *dreg ) +{ + unsigned long flags; + + int ret = -EINVAL; + devreg_t *pdevreg = devreg_anchor; + + if ( dreg == NULL ) + return( -EINVAL ); + + spin_lock_irqsave( &dyn_lock, flags ); + + while ( (pdevreg != NULL ) + && ( ret != 0 ) ) + { + if ( pdevreg == dreg ) + { + devreg_t *dprev = pdevreg->prev; + devreg_t *dnext = pdevreg->next; + + if ( (dprev != NULL) && (dnext != NULL) ) + { + dnext->prev = dprev; + dprev->next = dnext; + } + if ( (dprev != NULL) && (dnext == NULL) ) + { + dprev->next = NULL; + } + if ( (dprev == NULL) && (dnext != NULL) ) + { + dnext->prev = NULL; + + } /* else */ + + ret = 0; + } + else + { + pdevreg = pdevreg->next; + + } /* endif */ + + } /* endwhile */ + + spin_unlock_irqrestore( &dyn_lock, flags ); + + return( ret); +} + + +devreg_t * s390_search_devreg( ioinfo_t *ioinfo ) +{ + unsigned long flags; + + devreg_t *pdevreg = devreg_anchor; + + if ( ioinfo == NULL ) + return( NULL ); + + spin_lock_irqsave( &dyn_lock, flags ); + + while ( pdevreg != NULL ) + { + if ( (pdevreg->flag & DEVREG_TYPE_DEVNO ) + && (ioinfo->ui.flags.dval == 1 ) + && (ioinfo->devno == pdevreg->ci.devno) ) + { + break; + } + else if ( pdevreg->flag & DEVREG_EXACT_MATCH ) + { + if ( memcmp( &pdevreg->ci.hc, + &ioinfo->senseid.cu_type, 6 ) ) + break; + } + else if ( pdevreg->flag & DEVREG_MATCH_DEV_TYPE ) + { + if ( (pdevreg->ci.hc.dtype == ioinfo->senseid.dev_type ) + && (pdevreg->ci.hc.dmode == ioinfo->senseid.dev_model) ) + break; + } + else if ( pdevreg->flag & DEVREG_MATCH_CU_TYPE ) + { + if ( (pdevreg->ci.hc.ctype == ioinfo->senseid.cu_type ) + && (pdevreg->ci.hc.cmode == ioinfo->senseid.cu_model) ) + break; + } + else if ( pdevreg->flag & DEVREG_NO_CU_INFO ) + { + if ( (pdevreg->ci.hnc.dtype == ioinfo->senseid.dev_type ) + && (pdevreg->ci.hnc.dmode == ioinfo->senseid.dev_model) ) + break; + } + + pdevreg = pdevreg->next; + + } /* endwhile */ + + spin_unlock_irqrestore( &dyn_lock, flags ); + + return( pdevreg); +} + diff -urN v2.2.15/linux/arch/s390/kernel/s390io.c linux/arch/s390/kernel/s390io.c --- v2.2.15/linux/arch/s390/kernel/s390io.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/s390io.c Wed Jun 7 14:26:42 2000 @@ -4,7 +4,7 @@ * * S390 version * Copyright (C) 1999, 2000 IBM Deutschland Entwicklung GmbH, - IBM Corporation + * IBM Corporation * Author(s): Ingo Adlung (adlung@de.ibm.com) */ @@ -27,26 +27,34 @@ #include #include #include +#include #include #include +#include +#include #undef CONFIG_DEBUG_IO +#define CONFIG_DEBUG_CRW #define REIPL_DEVID_MAGIC 0x87654321 -struct irqaction init_IRQ_action; +struct s390_irqaction init_IRQ_action; unsigned int highest_subchannel; ioinfo_t *ioinfo_head = NULL; ioinfo_t *ioinfo_tail = NULL; ioinfo_t *ioinfo[__MAX_SUBCHANNELS] = { [0 ... (__MAX_SUBCHANNELS-1)] = INVALID_STORAGE_AREA }; -spinlock_t sync_isc; // synchronous irq processing lock -psw_t io_sync_wait; // wait PSW for sync IO, prot. by sync_isc -psw_t io_new_psw; // save I/O new PSW, prot. by sync_isc -int cons_dev = -1; // identify console device -int init_IRQ_complete = 0; -schib_t init_schib; + +static spinlock_t sync_isc = SPIN_LOCK_UNLOCKED; + // synchronous irq processing lock +static psw_t io_sync_wait; // wait PSW for sync IO, prot. by sync_isc +static psw_t io_new_psw; // save I/O new PSW, prot. by sync_isc +static int cons_dev = -1; // identify console device +static int init_IRQ_complete = 0; +static schib_t init_schib; +static irb_t init_irb; +static __u64 irq_IPL_TOD; /* * Dummy controller type for unused interrupts @@ -63,12 +71,18 @@ }; static void init_IRQ_handler( int irq, void *dev_id, struct pt_regs *regs); -static int s390_setup_irq(unsigned int irq, struct irqaction * new); +static int s390_setup_irq(unsigned int irq, struct s390_irqaction * new); static void s390_process_subchannels( void); -static void s390_device_recognition( void); -static int s390_validate_subchannel( int irq); -static int s390_SenseID( int irq, senseid_t *sid); +static void s390_device_recognition_all( void); +static void s390_device_recognition_irq( int irq); +static int s390_validate_subchannel( int irq, int enable); +static int s390_SenseID( int irq, senseid_t *sid, __u8 lpm); +static int s390_SetPGID( int irq, __u8 lpm, pgid_t *pgid); +static int s390_SensePGID( int irq, __u8 lpm, pgid_t *pgid); static int s390_process_IRQ( unsigned int irq ); +static int disable_subchannel( unsigned int irq); + +int s390_DevicePathVerification( int irq, __u8 domask ); extern int do_none(unsigned int irq, int cpu, struct pt_regs * regs); extern int enable_none(unsigned int irq); @@ -83,6 +97,7 @@ // fix me ! must be removed with 2.3.x and follow-up releases // static void * alloc_bootmem( unsigned long size); +static int free_bootmem( unsigned long buffer, unsigned long size); static unsigned long memory_start = 0; void s390_displayhex(char *str,void *ptr,s32 cnt); @@ -90,13 +105,13 @@ void s390_displayhex(char *str,void *ptr,s32 cnt) { s32 cnt1,cnt2,maxcnt2; - u32 *currptr=(u32 *)ptr; + u32 *currptr=(__u32 *)ptr; printk("\n%s\n",str); for(cnt1=0;cnt116) maxcnt2=16; @@ -106,19 +121,21 @@ } } -int s390_request_irq( unsigned int irq, - void (*handler)(int, void *, struct pt_regs *), + +int s390_request_irq_special( int irq, + io_handler_func_t io_handler, + not_oper_handler_func_t not_oper_handler, unsigned long irqflags, const char *devname, void *dev_id) { int retval; - struct irqaction *action; + struct s390_irqaction *action; if (irq >= __MAX_SUBCHANNELS) return -EINVAL; - if ( !handler || !dev_id ) + if ( !io_handler || !dev_id ) return -EINVAL; /* @@ -128,8 +145,9 @@ */ if ( init_IRQ_complete ) { - action = (struct irqaction *) - kmalloc(sizeof(struct irqaction), GFP_KERNEL); + action = (struct s390_irqaction *) + kmalloc( sizeof(struct s390_irqaction), + GFP_KERNEL); } else { @@ -143,27 +161,64 @@ } /* endif */ - action->handler = handler; + action->handler = io_handler; action->flags = irqflags; - action->mask = 0; action->name = devname; - action->next = NULL; action->dev_id = dev_id; retval = s390_setup_irq(irq, action); - if ( retval && init_IRQ_complete ) + if ( init_IRQ_complete ) + { + if ( !retval ) + { + s390_DevicePathVerification( irq, 0 ); + } + else { kfree(action); } /* endif */ + } /* endif */ + + if ( retval == 0 ) + { + ioinfo[irq]->ui.flags.newreq = 1; + ioinfo[irq]->nopfunc = not_oper_handler; + } + return retval; } + +int s390_request_irq( unsigned int irq, + void (*handler)(int, void *, struct pt_regs *), + unsigned long irqflags, + const char *devname, + void *dev_id) +{ + int ret; + + ret = s390_request_irq_special( irq, + (io_handler_func_t)handler, + NULL, + irqflags, + devname, + dev_id); + + if ( ret == 0 ) + { + ioinfo[irq]->ui.flags.newreq = 0; + + } /* endif */ + + return( ret); +} + void s390_free_irq(unsigned int irq, void *dev_id) { - unsigned int flags; + unsigned long flags; int ret; unsigned int count = 0; @@ -198,11 +253,59 @@ do { - ret = ioinfo[irq]->irq_desc.handler->disable(irq); + ret = disable_subchannel( irq); count++; - if ( count == 3 ) + if ( ret == -EBUSY ) + { + int iret; + + /* + * kill it ! + * ... we first try sync and eventually + * try terminating the current I/O by + * an async request, twice halt, then + * clear. + */ + if ( count < 2 ) + { + iret = halt_IO( irq, + 0xC8C1D3E3, + DOIO_WAIT_FOR_INTERRUPT ); + + if ( iret == -EBUSY ) + { + halt_IO( irq, 0xC8C1D3E3, 0); + s390irq_spin_unlock_irqrestore( irq, flags); + tod_wait( 200000 ); /* 200 ms */ + s390irq_spin_lock_irqsave( irq, flags); + + } /* endif */ + } + else + { + iret = clear_IO( irq, + 0x40C3D3D9, + DOIO_WAIT_FOR_INTERRUPT ); + + if ( iret == -EBUSY ) + { + clear_IO( irq, 0xC8C1D3E3, 0); + s390irq_spin_unlock_irqrestore( irq, flags); + tod_wait( 1000000 ); /* 1000 ms */ + s390irq_spin_lock_irqsave( irq, flags); + + } /* endif */ + + } /* endif */ + + if ( count == 2 ) + { + /* give it a very last try ... */ + disable_subchannel( irq); + + if ( ioinfo[irq]->ui.flags.busy ) { printk( KERN_CRIT"free_irq(%04X) " "- device %04X busy, retry " @@ -212,6 +315,12 @@ } /* endif */ + break; /* sigh, let's give up ... */ + + } /* endif */ + + } /* endif */ + } while ( ret == -EBUSY ); if ( init_IRQ_complete ) @@ -219,12 +328,12 @@ ioinfo[irq]->irq_desc.action = NULL; ioinfo[irq]->ui.flags.ready = 0; - - ioinfo[irq]->irq_desc.handler->enable = &enable_none; - ioinfo[irq]->irq_desc.handler->disable = &disable_none; - + ioinfo[irq]->irq_desc.handler->enable = enable_none; + ioinfo[irq]->irq_desc.handler->disable = disable_none; ioinfo[irq]->ui.flags.unready = 0; /* deregister ended */ + ioinfo[irq]->nopfunc = NULL; + s390irq_spin_unlock_irqrestore( irq, flags); } else @@ -329,6 +438,16 @@ { ioinfo[irq]->schib.pmcw.ena = 1; + if ( irq == cons_dev ) + { + ioinfo[irq]->schib.pmcw.isc = 7; + } + else + { + ioinfo[irq]->schib.pmcw.isc = 3; + + } /* endif */ + do { ccode = msch( irq, &(ioinfo[irq]->schib) ); @@ -349,9 +468,7 @@ */ ioinfo[irq]->ui.flags.s_pend = 1; - s390_process_IRQ( irq ); - ioinfo[irq]->ui.flags.s_pend = 0; ret = -EIO; /* might be overwritten */ @@ -360,6 +477,12 @@ retry--; break; + case 2: + tod_wait(100); /* allow for recovery */ + ret = -EBUSY; + retry--; + break; + case 3: ioinfo[irq]->ui.flags.oper = 0; ret = -ENODEV; @@ -452,7 +575,7 @@ s390_process_IRQ( irq ); ioinfo[irq]->ui.flags.s_pend = 0; - ret = -EBUSY; /* might be overwritten */ + ret = -EIO; /* might be overwritten */ /* ... on re-driving the */ /* ... msch() call */ retry--; @@ -471,7 +594,7 @@ "device %04X received !\n", irq, ioinfo[irq]->devstat.devno); - ret = -ENODEV; // never reached + ret = -EBUSY; break; case 3 : @@ -502,8 +625,7 @@ } - -int s390_setup_irq(unsigned int irq, struct irqaction * new) +int s390_setup_irq( unsigned int irq, struct s390_irqaction * new) { unsigned long flags; int rc = 0; @@ -522,9 +644,9 @@ { ioinfo[irq]->irq_desc.action = new; ioinfo[irq]->irq_desc.status = 0; - ioinfo[irq]->irq_desc.handler->enable = &enable_subchannel; - ioinfo[irq]->irq_desc.handler->disable = &disable_subchannel; - ioinfo[irq]->irq_desc.handler->handle = &handle_IRQ_event; + ioinfo[irq]->irq_desc.handler->enable = enable_subchannel; + ioinfo[irq]->irq_desc.handler->disable = disable_subchannel; + ioinfo[irq]->irq_desc.handler->handle = handle_IRQ_event; ioinfo[irq]->ui.flags.ready = 1; @@ -559,6 +681,22 @@ return( ret ); } +int free_bootmem( unsigned long buffer, unsigned long size) +{ + int ret = 0; + + /* + * We don't have buffer management, thus a free + * must follow the matching alloc. + */ + if ( buffer == (memory_start - size) ) + memory_start -= size; + else + ret = -EINVAL; + + return( ret ); +} + unsigned long s390_init_IRQ( unsigned long memstart) { unsigned long flags; /* PSW flags */ @@ -571,6 +709,8 @@ atomic_set(&S390_lowcore.local_bh_count,0); atomic_set(&S390_lowcore.local_irq_count,0); + asm volatile ("STCK %0" : "=m" (irq_IPL_TOD)); + /* * As we don't know about the calling environment * we assure running disabled. Before leaving the @@ -597,7 +737,7 @@ cr6 = 0x10000000; asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); - s390_device_recognition(); + s390_device_recognition_all(); init_IRQ_complete = 1; @@ -631,22 +771,21 @@ /* * The flag usage is mutal exclusive ... */ - if ( (flag & DOIO_RETURN_CHAN_END) + if ( (flag & DOIO_EARLY_NOTIFICATION) && (flag & DOIO_REPORT_ALL ) ) { return( -EINVAL ); } /* endif */ - memset( &(ioinfo[irq]->orb), '\0', sizeof( orb_t) ); - /* * setup ORB */ + ioinfo[irq]->orb.intparm = (__u32)&ioinfo[irq]->u_intparm; ioinfo[irq]->orb.fmt = 1; ioinfo[irq]->orb.pfch = !(flag & DOIO_DENY_PREFETCH); - ioinfo[irq]->orb.spnd = (flag & DOIO_ALLOW_SUSPEND); + ioinfo[irq]->orb.spnd = (flag & DOIO_ALLOW_SUSPEND ? TRUE : FALSE); ioinfo[irq]->orb.ssic = ( (flag & DOIO_ALLOW_SUSPEND ) && (flag & DOIO_SUPPRESS_INTER) ); @@ -656,7 +795,7 @@ } else { - ioinfo[irq]->orb.lpm = ioinfo[irq]->schib.pmcw.pam; + ioinfo[irq]->orb.lpm = ioinfo[irq]->opm; } /* endif */ @@ -694,6 +833,12 @@ } /* endif */ + if ( flag & DOIO_DONT_CALL_INTHDLR ) + { + ioinfo[irq]->ui.flags.repnone = 1; + + } /* endif */ + /* * Issue "Start subchannel" and process condition code */ @@ -713,6 +858,10 @@ '\0', sizeof( irb_t) ); } /* endif */ + memset( &ioinfo[irq]->devstat.ii.irb, + '\0', + sizeof( irb_t) ); + /* * initialize device status information */ @@ -734,7 +883,7 @@ * or if we are to return all interrupt info. * Default is to call IRQ handler at secondary status only */ - if ( flag & DOIO_RETURN_CHAN_END ) + if ( flag & DOIO_EARLY_NOTIFICATION ) { ioinfo[irq]->ui.flags.fast = 1; } @@ -744,15 +893,7 @@ } /* endif */ - if ( flag & DOIO_VALID_LPM ) - { - ioinfo[irq]->lpm = lpm; /* specific path */ - } - else - { - ioinfo[irq]->lpm = 0xff; /* any path */ - - } /* endif */ + ioinfo[irq]->ulpm = ioinfo[irq]->orb.lpm; /* * If synchronous I/O processing is requested, we have @@ -764,13 +905,16 @@ */ if ( flag & DOIO_WAIT_FOR_INTERRUPT ) { - int io_sub; + int io_sub = -1; __u32 io_parm; psw_t io_new_psw; int ccode; + uint64_t time_start; + uint64_t time_curr; int ready = 0; struct _lowcore *lc = NULL; + int do_retry = 1; /* * We shouldn't perform a TPI loop, waiting for an @@ -812,8 +956,7 @@ break; } /* endswitch */ - io_sync_wait.addr = (unsigned long) &&io_wakeup - | 0x80000000L; + io_sync_wait.addr = FIX_PSW(&&io_wakeup); /* * Martin didn't like modifying the new PSW, now we take @@ -821,27 +964,67 @@ */ *(__u32 *)__LC_SYNC_IO_WORD = 1; + asm volatile ("STCK %0" : "=m" (time_start)); + + time_start = time_start >> 32; + + do + { + if ( flag & DOIO_TIMEOUT ) + { + tpi_info_t tpi_info; + do { + if ( tpi(&tpi_info) == 1 ) + { + io_sub = tpi_info.irq; + break; + } + else + { + tod_wait(100); /* usecs */ + asm volatile ("STCK %0" : "=m" (time_curr)); + if ( ((time_curr >> 32) - time_start ) >= 3 ) + do_retry = 0; + + } /* endif */ + + } while ( do_retry ); + } + else + { asm volatile ( "lpsw %0" : : "m" (io_sync_wait) ); + io_wakeup: - io_parm = *(__u32 *)__LC_IO_INT_PARM; io_sub = (__u32)*(__u16 *)__LC_SUBCHANNEL_NR; + } /* endif */ + + if ( do_retry ) ready = s390_process_IRQ( io_sub ); - } while ( !((io_sub == irq) && (ready == 1)) ); + /* + * surrender when retry count's exceeded ... + */ + } while ( !( ( io_sub == irq ) + && ( ready == 1 )) + && do_retry ); *(__u32 *)__LC_SYNC_IO_WORD = 0; + if ( !do_retry ) + ret = -ETIMEDOUT; + } /* endif */ break; case 1 : /* status pending */ - ioinfo[irq]->devstat.flag |= DEVSTAT_STATUS_PENDING; + ioinfo[irq]->devstat.flag = DEVSTAT_START_FUNCTION + | DEVSTAT_STATUS_PENDING; /* * initialize the device driver specific devstat irb area @@ -866,6 +1049,7 @@ ioinfo[irq]->ui.flags.s_pend = 0; ioinfo[irq]->ui.flags.busy = 0; ioinfo[irq]->ui.flags.doio = 0; + ioinfo[irq]->ui.flags.repall = 0; ioinfo[irq]->ui.flags.w4final = 0; @@ -880,11 +1064,30 @@ */ if ( ioinfo[irq]->devstat.ii.irb.scsw.cc == 3 ) { + if ( flag & DOIO_VALID_LPM ) + { + ioinfo[irq]->opm &= ~(ioinfo[irq]->devstat.ii.irb.esw.esw1.lpum); + } + else + { + ioinfo[irq]->opm = 0; + + } /* endif */ + + if ( ioinfo[irq]->opm == 0 ) + { ret = -ENODEV; - ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; ioinfo[irq]->ui.flags.oper = 0; + } + else + { + ret = -EIO; + + } /* endif */ -#if CONFIG_DEBUG_IO + ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; + +#ifdef CONFIG_DEBUG_IO { char buffer[80]; @@ -921,7 +1124,7 @@ ((devstat_t *)(ioinfo[irq]->irq_desc.action->dev_id))->ii.sense.data, ((devstat_t *)(ioinfo[irq]->irq_desc.action->dev_id))->rescnt); - } + } /* endif */ } #endif } @@ -940,18 +1143,32 @@ ret = -EBUSY; break; - default: /* device not operational */ + default: /* device/path not operational */ - ret = -ENODEV; - ioinfo[irq]->ui.flags.oper = 0; + if ( flag & DOIO_VALID_LPM ) + { + ioinfo[irq]->opm &= ~lpm; + } + else + { + ioinfo[irq]->opm = 0; + + } /* endif */ + if ( ioinfo[irq]->opm == 0 ) + { + ioinfo[irq]->ui.flags.oper = 0; ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; + } /* endif */ + + ret = -ENODEV; + memcpy( ioinfo[irq]->irq_desc.action->dev_id, &(ioinfo[irq]->devstat), sizeof( devstat_t) ); -#if CONFIG_DEBUG_IO +#ifdef CONFIG_DEBUG_IO { char buffer[80]; @@ -971,16 +1188,40 @@ } /* endswitch */ - if ( ( flag & DOIO_WAIT_FOR_INTERRUPT ) - && ( sync_isc_locked ) ) + if ( sync_isc_locked ) { - disable_cpu_sync_isc( irq ); + int iret; + int retry = 5; + int halt = 0; - spin_unlock_irqrestore( &sync_isc, psw_flags); + do + { + iret = disable_cpu_sync_isc( irq ); + retry--; + + /* try stopping it ... */ + if ( (iret == -EBUSY) && !halt ) + { + halt_IO( irq, 0x00004711, 0 ); + halt = 1; + + } /* endif */ + + tod_wait( 100); + + } while ( retry && (iret == -EBUSY ) ); sync_isc_locked = 0; // local setting ioinfo[irq]->ui.flags.syncio = 0; // global setting + spin_unlock_irqrestore( &sync_isc, psw_flags); + + } /* endif */ + + if ( flag & DOIO_DONT_CALL_INTHDLR ) + { + ioinfo[irq]->ui.flags.repnone = 0; + } /* endif */ return( ret); @@ -1005,8 +1246,8 @@ return( -ENODEV); } - /* handler registered ? */ - if ( !ioinfo[irq]->ui.flags.ready ) + /* handler registered ? or free_irq() in process already ? */ + if ( !ioinfo[irq]->ui.flags.ready || ioinfo[irq]->ui.flags.unready ) { return( -ENODEV ); @@ -1125,7 +1366,7 @@ */ int halt_IO( int irq, unsigned long user_intparm, - unsigned int flag) /* possible DOIO_WAIT_FOR_INTERRUPT */ + unsigned long flag) /* possible DOIO_WAIT_FOR_INTERRUPT */ { int ret; int ccode; @@ -1161,7 +1402,8 @@ /* * We don't allow for halt_io with a sync do_IO() requests pending. */ - else if ( ioinfo[irq]->ui.flags.syncio ) + else if ( ioinfo[irq]->ui.flags.syncio + && (flag & DOIO_WAIT_FOR_INTERRUPT)) { ret = -EBUSY; } @@ -1289,8 +1531,7 @@ break; } /* endswitch */ - io_sync_wait.addr = (unsigned long)&&hio_wakeup - | 0x80000000L; + io_sync_wait.addr = FIX_PSW(&&hio_wakeup); /* * Martin didn't like modifying the new PSW, now we take @@ -1385,14 +1626,13 @@ } /* endswitch */ - if ( ( flag & DOIO_WAIT_FOR_INTERRUPT ) - && ( sync_isc_locked ) ) + if ( sync_isc_locked ) { + disable_cpu_sync_isc( irq ); + sync_isc_locked = 0; // local setting ioinfo[irq]->ui.flags.syncio = 0; // global setting - disable_cpu_sync_isc( irq ); - spin_unlock_irqrestore( &sync_isc, psw_flags); } /* endif */ @@ -1402,1382 +1642,2755 @@ return( ret ); } - /* - * do_IRQ() handles all normal I/O device IRQ's (the special - * SMP cross-CPU interrupts have their own specific - * handlers). - * - * Returns: 0 - no ending status received, no further action taken - * 1 - interrupt handler was called with ending status + * Note: The "intparm" parameter is not used by the clear_IO() function + * itself, as no ORB is built for the CSCH instruction. However, + * it allows the device interrupt handler to associate the upcoming + * interrupt with the clear_IO() request. */ -asmlinkage void do_IRQ( struct pt_regs regs, - unsigned int irq, - __u32 s390_intparm ) +int clear_IO( int irq, + unsigned long user_intparm, + unsigned long flag) /* possible DOIO_WAIT_FOR_INTERRUPT */ { -#ifdef CONFIG_FAST_IRQ + int ret; int ccode; - tpi_info_t tpi_info; - int new_irq; -#endif - int use_irq = irq; -// __u32 use_intparm = s390_intparm; + unsigned long psw_flags; + + int sync_isc_locked = 0; + + if ( irq > highest_subchannel || irq < 0 ) + { + ret = -ENODEV; + } - // - // fix me !!! - // - // We need to schedule device recognition, the interrupt stays - // pending. We need to dynamically allocate an ioinfo structure. - // if ( ioinfo[irq] == INVALID_STORAGE_AREA ) { - return; + return( -ENODEV); } /* - * take fast exit if CPU is in sync. I/O state - * - * Note: we have to turn off the WAIT bit and re-disable - * interrupts prior to return as this was the initial - * entry condition to synchronous I/O. + * we only allow for halt_IO if the device has an I/O handler associated */ - if ( *(__u32 *)__LC_SYNC_IO_WORD ) + else if ( !ioinfo[irq]->ui.flags.ready ) { - regs.psw.mask &= ~(_PSW_WAIT_MASK_BIT | _PSW_IO_MASK_BIT); - - return; - - } /* endif */ - - s390irq_spin_lock(use_irq); - -#ifdef CONFIG_FAST_IRQ - do { -#endif /* CONFIG_FAST_IRQ */ - - s390_process_IRQ( use_irq ); - -#ifdef CONFIG_FAST_IRQ - + ret = -ENODEV; + } /* - * more interrupts pending ? + * we ignore the halt_io() request if ending_status was received but + * a SENSE operation is waiting for completion. */ - ccode = tpi( &tpi_info ); - - if ( ! ccode ) - break; // no, leave ... - - new_irq = tpi_info.irq; -// use_intparm = tpi_info.intparm; - + else if ( ioinfo[irq]->ui.flags.w4sense ) + { + ret = 0; + } /* - * if the interrupt is for a different irq we - * release the current irq lock and obtain - * a new one ... + * We don't allow for halt_io with a sync do_IO() requests pending. + * Concurrent I/O is possible in SMP environments only, but the + * sync. I/O request can be gated to one CPU at a time only. */ - if ( new_irq != use_irq ) + else if ( ioinfo[irq]->ui.flags.syncio ) { - s390irq_spin_unlock(use_irq); - use_irq = new_irq; - s390irq_spin_lock(use_irq); - - } /* endif */ - - } while ( 1 ); - -#endif /* CONFIG_FAST_IRQ */ - - s390irq_spin_unlock(use_irq); - - return; + ret = -EBUSY; } - + else + { /* - * s390_process_IRQ() handles status pending situations and interrupts - * - * Called by : do_IRQ() - for "real" interrupts - * s390_start_IO, halt_IO() - * - status pending cond. after SSCH, or HSCH - * disable_subchannel() - status pending conditions (after MSCH) - * - * Returns: 0 - no ending status received, no further action taken - * 1 - interrupt handler was called with ending status + * If sync processing was requested we lock the sync ISC, + * modify the device to present interrupts for this ISC only + * and switch the CPU to handle this ISC + the console ISC + * exclusively. */ -int s390_process_IRQ( unsigned int irq ) + if ( flag & DOIO_WAIT_FOR_INTERRUPT ) { - int ccode; /* condition code from tsch() operation */ - int irb_cc; /* condition code from irb */ - int sdevstat; /* effective struct devstat size to copy */ - unsigned int fctl; /* function control */ - unsigned int stctl; /* status control */ - unsigned int actl; /* activity control */ - struct irqaction *action; - struct pt_regs regs; /* for interface compatibility only */ - - int issense = 0; - int ending_status = 0; - int allow4handler = 1; - int chnchk = 0; -#if 0 - int cpu = smp_processor_id(); + // + // check whether we run recursively (sense processing) + // + if ( !ioinfo[irq]->ui.flags.syncio ) + { + spin_lock_irqsave( &sync_isc, psw_flags); - kstat.irqs[cpu][irq]++; -#endif - action = ioinfo[irq]->irq_desc.action; + ret = enable_cpu_sync_isc( irq); - /* - * It might be possible that a device was not-oper. at the time - * of free_irq() processing. This means the handler is no longer - * available when the device possibly becomes ready again. In - * this case we perform delayed disable_subchannel() processing. - */ - if ( action == NULL ) + if ( ret ) { - if ( !ioinfo[irq]->ui.flags.d_disable ) + spin_unlock_irqrestore( &sync_isc, + psw_flags); + return( ret); + } + else { - printk( KERN_CRIT"s390_process_IRQ(%04X) " - "- no interrupt handler registered" - "for device %04X !\n", - irq, - ioinfo[irq]->devstat.devno); + sync_isc_locked = 1; // local + ioinfo[irq]->ui.flags.syncio = 1; // global + + } /* endif */ } /* endif */ } /* endif */ /* - * retrieve the i/o interrupt information (irb), - * update the device specific status information - * and possibly call the interrupt handler. - * - * Note 1: At this time we don't process the resulting - * condition code (ccode) from tsch(), although - * we probably should. - * - * Note 2: Here we will have to check for channel - * check conditions and call a channel check - * handler. - * - * Note 3: If a start function was issued, the interruption - * parameter relates to it. If a halt function was - * issued for an idle device, the intparm must not - * be taken from lowcore, but from the devstat area. + * Issue "Halt subchannel" and process condition code */ - ccode = tsch( irq, &(ioinfo[irq]->devstat.ii.irb) ); + ccode = csch( irq ); - // - // We must only accumulate the status if initiated by do_IO() or halt_IO() - // - if ( ioinfo[irq]->ui.flags.busy ) + switch ( ccode ) { + case 0: + + ioinfo[irq]->ui.flags.haltio = 1; + + if ( !ioinfo[irq]->ui.flags.doio ) { - ioinfo[irq]->devstat.dstat |= ioinfo[irq]->devstat.ii.irb.scsw.dstat; - ioinfo[irq]->devstat.cstat |= ioinfo[irq]->devstat.ii.irb.scsw.cstat; + ioinfo[irq]->ui.flags.busy = 1; + ioinfo[irq]->u_intparm = user_intparm; + ioinfo[irq]->devstat.cstat = 0; + ioinfo[irq]->devstat.dstat = 0; + ioinfo[irq]->devstat.lpum = 0; + ioinfo[irq]->devstat.flag = DEVSTAT_CLEAR_FUNCTION; + ioinfo[irq]->devstat.scnt = 0; + } else { - ioinfo[irq]->devstat.dstat = ioinfo[irq]->devstat.ii.irb.scsw.dstat; - ioinfo[irq]->devstat.cstat = ioinfo[irq]->devstat.ii.irb.scsw.cstat; - - ioinfo[irq]->devstat.flag = 0; // reset status flags + ioinfo[irq]->devstat.flag |= DEVSTAT_CLEAR_FUNCTION; } /* endif */ - ioinfo[irq]->devstat.lpum = ioinfo[irq]->devstat.ii.irb.esw.esw1.lpum; - - if ( ioinfo[irq]->ui.flags.busy) + /* + * If synchronous I/O processing is requested, we have + * to wait for the corresponding interrupt to occur by + * polling the interrupt condition. However, as multiple + * interrupts may be outstanding, we must not just wait + * for the first interrupt, but must poll until ours + * pops up. + */ + if ( flag & DOIO_WAIT_FOR_INTERRUPT ) { - ioinfo[irq]->devstat.intparm = ioinfo[irq]->u_intparm; + int io_sub; + __u32 io_parm; + psw_t io_new_psw; + int ccode; - } /* endif */ + int ready = 0; + struct _lowcore *lc = NULL; /* - * reset device-busy bit if no longer set in irb + * We shouldn't perform a TPI loop, waiting for + * an interrupt to occur, but should load a + * WAIT PSW instead. Otherwise we may keep the + * channel subsystem busy, not able to present + * the interrupt. When our sync. interrupt + * arrived we reset the I/O old PSW to its + * original value. */ - if ( (ioinfo[irq]->devstat.dstat & DEV_STAT_BUSY ) - && ((ioinfo[irq]->devstat.ii.irb.scsw.dstat & DEV_STAT_BUSY) == 0)) - { - ioinfo[irq]->devstat.dstat &= ~DEV_STAT_BUSY; + memcpy( &io_new_psw, + &lc->io_new_psw, + sizeof(psw_t)); - } /* endif */ + ccode = iac(); + + switch (ccode) { + case 0: // primary-space + io_sync_wait.mask = _IO_PSW_MASK + | _PSW_PRIM_SPACE_MODE + | _PSW_IO_WAIT; + break; + case 1: // secondary-space + io_sync_wait.mask = _IO_PSW_MASK + | _PSW_SEC_SPACE_MODE + | _PSW_IO_WAIT; + break; + case 2: // access-register + io_sync_wait.mask = _IO_PSW_MASK + | _PSW_ACC_REG_MODE + | _PSW_IO_WAIT; + break; + case 3: // home-space + io_sync_wait.mask = _IO_PSW_MASK + | _PSW_HOME_SPACE_MODE + | _PSW_IO_WAIT; + break; + default: + panic( "halt_IO() : unexpected " + "address-space-control %d\n", + ccode); + break; + } /* endswitch */ + + io_sync_wait.addr = FIX_PSW(&&cio_wakeup); /* - * Save residual count and CCW information in case primary and - * secondary status are presented with different interrupts. + * Martin didn't like modifying the new PSW, now we take + * a fast exit in do_IRQ() instead */ - if ( ioinfo[irq]->devstat.ii.irb.scsw.stctl & SCSW_STCTL_PRIM_STATUS ) - { - ioinfo[irq]->devstat.rescnt = ioinfo[irq]->devstat.ii.irb.scsw.count; - -#if CONFIG_DEBUG_IO - if ( irq != cons_dev ) - printk( "s390_process_IRQ( %04X ) : " - "residual count from irb after tsch() %d\n", - irq, ioinfo[irq]->devstat.rescnt ); -#endif - } /* endif */ + *(__u32 *)__LC_SYNC_IO_WORD = 1; - if ( ioinfo[irq]->devstat.ii.irb.scsw.cpa != 0 ) + do { - ioinfo[irq]->devstat.cpa = ioinfo[irq]->devstat.ii.irb.scsw.cpa; - } /* endif */ + asm volatile ( "lpsw %0" : : "m" (io_sync_wait) ); +cio_wakeup: + io_parm = *(__u32 *)__LC_IO_INT_PARM; + io_sub = (__u32)*(__u16 *)__LC_SUBCHANNEL_NR; - irb_cc = ioinfo[irq]->devstat.ii.irb.scsw.cc; + ready = s390_process_IRQ( io_sub ); - // - // check for any kind of channel or interface control check but don't - // issue the message for the console device - // - if ( (ioinfo[irq]->devstat.ii.irb.scsw.cstat - & ( SCHN_STAT_CHN_DATA_CHK - | SCHN_STAT_CHN_CTRL_CHK - | SCHN_STAT_INTF_CTRL_CHK ) ) - && (irq != cons_dev ) ) - { - printk( "Channel-Check or Interface-Control-Check " - "received\n" - " ... device %04X on subchannel %04X, dev_stat " - ": %02X sch_stat : %02X\n", - ioinfo[irq]->devstat.devno, - irq, - ioinfo[irq]->devstat.dstat, - ioinfo[irq]->devstat.cstat); + } while ( !((io_sub == irq) && (ready == 1)) ); - chnchk = 1; + *(__u32 *)__LC_SYNC_IO_WORD = 0; } /* endif */ - issense = ioinfo[irq]->devstat.ii.irb.esw.esw0.erw.cons; - - if ( issense ) - { - ioinfo[irq]->devstat.scnt = - ioinfo[irq]->devstat.ii.irb.esw.esw0.erw.scnt; - ioinfo[irq]->devstat.flag |= - DEVSTAT_FLAG_SENSE_AVAIL; + ret = 0; + break; - sdevstat = sizeof( devstat_t); - -#if CONFIG_DEBUG_IO - if ( irq != cons_dev ) - printk( "s390_process_IRQ( %04X ) : " - "concurrent sense bytes avail %d\n", - irq, ioinfo[irq]->devstat.scnt ); -#endif - } - else - { - /* don't copy the sense data area ! */ - sdevstat = sizeof( devstat_t) - SENSE_MAX_COUNT; - - } /* endif */ + case 1 : /* status pending */ - switch ( irb_cc ) { - case 1: /* status pending */ + ioinfo[irq]->devstat.flag |= DEVSTAT_STATUS_PENDING; - ioinfo[irq]->devstat.flag |= DEVSTAT_STATUS_PENDING; + /* + * initialize the device driver specific devstat irb area + */ + memset( &((devstat_t *) ioinfo[irq]->irq_desc.action->dev_id)->ii.irb, + '\0', sizeof( irb_t) ); - case 0: /* normal i/o interruption */ + /* + * Let the common interrupt handler process the pending + * status. However, we must avoid calling the user + * action handler, as it won't be prepared to handle + * a pending status during do_IO() processing inline. + * This also implies that s390_process_IRQ must + * terminate synchronously - especially if device + * sensing is required. + */ + ioinfo[irq]->ui.flags.s_pend = 1; + ioinfo[irq]->ui.flags.busy = 1; + ioinfo[irq]->ui.flags.doio = 1; - fctl = ioinfo[irq]->devstat.ii.irb.scsw.fctl; - stctl = ioinfo[irq]->devstat.ii.irb.scsw.stctl; - actl = ioinfo[irq]->devstat.ii.irb.scsw.actl; + s390_process_IRQ( irq ); + + ioinfo[irq]->ui.flags.s_pend = 0; + ioinfo[irq]->ui.flags.busy = 0; + ioinfo[irq]->ui.flags.doio = 0; + ioinfo[irq]->ui.flags.repall = 0; + ioinfo[irq]->ui.flags.w4final = 0; - if ( chnchk && (ioinfo[irq]->senseid.cu_type == 0x3088)) + ioinfo[irq]->devstat.flag |= DEVSTAT_FINAL_STATUS; + + /* + * In multipath mode a condition code 3 implies the last + * path has gone, except we have previously restricted + * the I/O to a particular path. A condition code 1 + * (0 won't occur) results in return code EIO as well + * as 3 with another path than the one used (i.e. path available mask is non-zero). + */ + if ( ioinfo[irq]->devstat.ii.irb.scsw.cc == 3 ) + { + ret = -ENODEV; + ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; + ioinfo[irq]->ui.flags.oper = 0; + } + else + { + ret = -EIO; + ioinfo[irq]->devstat.flag &= ~DEVSTAT_NOT_OPER; + ioinfo[irq]->ui.flags.oper = 1; + + } /* endif */ + + break; + + case 2 : /* busy */ + + ret = -EBUSY; + break; + + default: /* device not operational */ + + ret = -ENODEV; + break; + + } /* endswitch */ + + if ( sync_isc_locked ) { - char buffer[80]; + disable_cpu_sync_isc( irq ); - sprintf( buffer, "s390_process_IRQ(%04X) - irb for " - "device %04X after channel check\n", - irq, - ioinfo[irq]->devstat.devno ); + sync_isc_locked = 0; // local setting + ioinfo[irq]->ui.flags.syncio = 0; // global setting + + spin_unlock_irqrestore( &sync_isc, psw_flags); - s390_displayhex( buffer, - &(ioinfo[irq]->devstat.ii.irb) , - sizeof(irb_t)); } /* endif */ - ioinfo[irq]->stctl |= stctl; + } /* endif */ + + return( ret ); +} - ending_status = ( stctl & SCSW_STCTL_SEC_STATUS ) - || ( stctl == (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND) ) - || ( (fctl == SCSW_FCTL_HALT_FUNC) && (stctl == SCSW_STCTL_STATUS_PEND) ); /* - * Check for unsolicited interrupts - for debug purposes only + * do_IRQ() handles all normal I/O device IRQ's (the special + * SMP cross-CPU interrupts have their own specific + * handlers). * - * We only consider an interrupt as unsolicited, if the device was not - * actively in use (busy) and an interrupt other than an ALERT status - * was received. + * Returns: 0 - no ending status received, no further action taken + * 1 - interrupt handler was called with ending status + */ +asmlinkage void do_IRQ( struct pt_regs regs, + unsigned int irq, + __u32 s390_intparm ) + { +#ifdef CONFIG_FAST_IRQ + int ccode; + tpi_info_t tpi_info; + int new_irq; +#endif + int use_irq = irq; + + // + // fix me !!! + // + // We need to schedule device recognition, the interrupt stays + // pending. We need to dynamically allocate an ioinfo structure. + // + if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + { + return; /* this keeps the device boxed ... */ + } + + /* + * take fast exit if CPU is in sync. I/O state * - * Note: We must not issue a message to the console, if the - * unsolicited interrupt applies to the console device - * itself ! + * Note: we have to turn off the WAIT bit and re-disable + * interrupts prior to return as this was the initial + * entry condition to synchronous I/O. */ -#if CONFIG_DEBUG_IO - if ( ( irq != cons_dev ) - && !( stctl & SCSW_STCTL_ALERT_STATUS ) - && ( ioinfo[irq]->ui.flags.busy == 0 ) ) + if ( *(__u32 *)__LC_SYNC_IO_WORD ) { - char buffer[80]; + regs.psw.mask &= ~(_PSW_WAIT_MASK_BIT | _PSW_IO_MASK_BIT); - printk( "Unsolicited interrupt received for device %04X on subchannel %04X\n" - " ... device status : %02X subchannel status : %02X\n", - ioinfo[irq]->devstat.devno, - irq, - ioinfo[irq]->devstat.dstat, - ioinfo[irq]->devstat.cstat); + return; - sprintf( buffer, "s390_process_IRQ(%04X) - irb for " - "device %04X, ending_status %d\n", - irq, - ioinfo[irq]->devstat.devno, - ending_status); + } /* endif */ - s390_displayhex( buffer, - &(ioinfo[irq]->devstat.ii.irb) , - sizeof(irb_t)); + s390irq_spin_lock(use_irq); - } /* endif */ +#ifdef CONFIG_FAST_IRQ + do { +#endif /* CONFIG_FAST_IRQ */ + + s390_process_IRQ( use_irq ); + +#ifdef CONFIG_FAST_IRQ + + /* + * more interrupts pending ? + */ + ccode = tpi( &tpi_info ); + + if ( ! ccode ) + break; // no, leave ... + + new_irq = tpi_info.irq; + + /* + * if the interrupt is for a different irq we + * release the current irq lock and obtain + * a new one ... + */ + if ( new_irq != use_irq ) + { + s390irq_spin_unlock(use_irq); + use_irq = new_irq; + s390irq_spin_lock(use_irq); + + } /* endif */ + + } while ( 1 ); + +#endif /* CONFIG_FAST_IRQ */ + + s390irq_spin_unlock(use_irq); + + return; + } + + /* + * s390_process_IRQ() handles status pending situations and interrupts + * + * Called by : do_IRQ() - for "real" interrupts + * s390_start_IO, halt_IO() + * - status pending cond. after SSCH, or HSCH + * disable_subchannel() - status pending conditions (after MSCH) + * + * Returns: 0 - no ending status received, no further action taken + * 1 - interrupt handler was called with ending status + */ +int s390_process_IRQ( unsigned int irq ) +{ + int ccode; /* cond code from tsch() operation */ + int irb_cc; /* cond code from irb */ + int sdevstat; /* struct devstat size to copy */ + unsigned int fctl; /* function control */ + unsigned int stctl; /* status control */ + unsigned int actl; /* activity control */ + struct s390_irqaction *action; + struct pt_regs regs; /* for interface compatibility only */ + + int issense = 0; + int ending_status = 0; + int allow4handler = 1; + int chnchk = 0; +#if 0 + int cpu = smp_processor_id(); + + kstat.irqs[cpu][irq]++; #endif - /* - * Check whether we must issue a SENSE CCW ourselves if there is no - * concurrent sense facility installed for the subchannel. - * - * Note: We should check for ioinfo[irq]->ui.flags.consns but VM - * violates the ESA/390 architecture and doesn't present an - * operand exception for virtual devices without concurrent - * sense facility available/supported when enabling the - * concurrent sense facility. + + if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + { + /* we can't properly process the interrupt ... */ + tsch( irq, &init_irb ); + return( 1 ); + } + else + { + action = ioinfo[irq]->irq_desc.action; + + } /* endif */ + +#ifdef CONFIG_DEBUG_IO + /* + * It might be possible that a device was not-oper. at the time + * of free_irq() processing. This means the handler is no longer + * available when the device possibly becomes ready again. In + * this case we perform delayed disable_subchannel() processing. */ - if ( ( ( ioinfo[irq]->devstat.ii.irb.scsw.dstat & DEV_STAT_UNIT_CHECK ) - && ( !issense ) ) - || ( ioinfo[irq]->ui.flags.delsense && ending_status ) ) + if ( action == NULL ) { - int ret_io; - ccw1_t *s_ccw = &ioinfo[irq]->senseccw; - unsigned long s_flag = 0; + if ( !ioinfo[irq]->ui.flags.d_disable ) + { + printk( KERN_CRIT"s390_process_IRQ(%04X) " + "- no interrupt handler registered " + "for device %04X !\n", + irq, + ioinfo[irq]->devstat.devno); + + } /* endif */ + } /* endif */ +#endif + + /* + * retrieve the i/o interrupt information (irb), + * update the device specific status information + * and possibly call the interrupt handler. + * + * Note 1: At this time we don't process the resulting + * condition code (ccode) from tsch(), although + * we probably should. + * + * Note 2: Here we will have to check for channel + * check conditions and call a channel check + * handler. + * + * Note 3: If a start function was issued, the interruption + * parameter relates to it. If a halt function was + * issued for an idle device, the intparm must not + * be taken from lowcore, but from the devstat area. + */ + ccode = tsch( irq, &(ioinfo[irq]->devstat.ii.irb) ); + + // + // We must only accumulate the status if the device is busy already + // + if ( ioinfo[irq]->ui.flags.busy ) + { + ioinfo[irq]->devstat.dstat |= ioinfo[irq]->devstat.ii.irb.scsw.dstat; + ioinfo[irq]->devstat.cstat |= ioinfo[irq]->devstat.ii.irb.scsw.cstat; + } + else + { + ioinfo[irq]->devstat.dstat = ioinfo[irq]->devstat.ii.irb.scsw.dstat; + ioinfo[irq]->devstat.cstat = ioinfo[irq]->devstat.ii.irb.scsw.cstat; + + ioinfo[irq]->devstat.flag = 0; // reset status flags + + } /* endif */ + + ioinfo[irq]->devstat.lpum = ioinfo[irq]->devstat.ii.irb.esw.esw1.lpum; + + if ( ioinfo[irq]->ui.flags.busy) + { + ioinfo[irq]->devstat.intparm = ioinfo[irq]->u_intparm; + + } /* endif */ + + /* + * reset device-busy bit if no longer set in irb + */ + if ( (ioinfo[irq]->devstat.dstat & DEV_STAT_BUSY ) + && ((ioinfo[irq]->devstat.ii.irb.scsw.dstat & DEV_STAT_BUSY) == 0)) + { + ioinfo[irq]->devstat.dstat &= ~DEV_STAT_BUSY; + + } /* endif */ + + /* + * Save residual count and CCW information in case primary and + * secondary status are presented with different interrupts. + */ + if ( ioinfo[irq]->devstat.ii.irb.scsw.stctl + & ( SCSW_STCTL_PRIM_STATUS | SCSW_STCTL_INTER_STATUS ) ) + { + ioinfo[irq]->devstat.rescnt = ioinfo[irq]->devstat.ii.irb.scsw.count; + ioinfo[irq]->devstat.cpa = ioinfo[irq]->devstat.ii.irb.scsw.cpa; + +#ifdef CONFIG_DEBUG_IO + if ( irq != cons_dev ) + printk( "s390_process_IRQ( %04X ) : " + "residual count from irb after tsch() %d\n", + irq, ioinfo[irq]->devstat.rescnt ); +#endif + + } /* endif */ + + irb_cc = ioinfo[irq]->devstat.ii.irb.scsw.cc; + + // + // check for any kind of channel or interface control check but don't + // issue the message for the console device + // + if ( (ioinfo[irq]->devstat.ii.irb.scsw.cstat + & ( SCHN_STAT_CHN_DATA_CHK + | SCHN_STAT_CHN_CTRL_CHK + | SCHN_STAT_INTF_CTRL_CHK ) ) + && (irq != cons_dev ) ) + { + printk( "Channel-Check or Interface-Control-Check " + "received\n" + " ... device %04X on subchannel %04X, dev_stat " + ": %02X sch_stat : %02X\n", + ioinfo[irq]->devstat.devno, + irq, + ioinfo[irq]->devstat.dstat, + ioinfo[irq]->devstat.cstat); + + chnchk = 1; + + } /* endif */ + + issense = ioinfo[irq]->devstat.ii.irb.esw.esw0.erw.cons; + + if ( issense ) + { + ioinfo[irq]->devstat.scnt = + ioinfo[irq]->devstat.ii.irb.esw.esw0.erw.scnt; + ioinfo[irq]->devstat.flag |= + DEVSTAT_FLAG_SENSE_AVAIL; + + sdevstat = sizeof( devstat_t); + +#ifdef CONFIG_DEBUG_IO + if ( irq != cons_dev ) + printk( "s390_process_IRQ( %04X ) : " + "concurrent sense bytes avail %d\n", + irq, ioinfo[irq]->devstat.scnt ); +#endif + } + else + { + /* don't copy the sense data area ! */ + sdevstat = sizeof( devstat_t) - SENSE_MAX_COUNT; + + } /* endif */ + + switch ( irb_cc ) { + case 1: /* status pending */ + + ioinfo[irq]->devstat.flag |= DEVSTAT_STATUS_PENDING; + + case 0: /* normal i/o interruption */ + + fctl = ioinfo[irq]->devstat.ii.irb.scsw.fctl; + stctl = ioinfo[irq]->devstat.ii.irb.scsw.stctl; + actl = ioinfo[irq]->devstat.ii.irb.scsw.actl; + + if ( chnchk && (ioinfo[irq]->senseid.cu_type == 0x3088)) + { + char buffer[80]; + + sprintf( buffer, "s390_process_IRQ(%04X) - irb for " + "device %04X after channel check\n", + irq, + ioinfo[irq]->devstat.devno ); + + s390_displayhex( buffer, + &(ioinfo[irq]->devstat.ii.irb) , + sizeof(irb_t)); + } /* endif */ + + ioinfo[irq]->stctl |= stctl; + + ending_status = ( stctl & SCSW_STCTL_SEC_STATUS ) + || ( stctl == (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND) ) + || ( (fctl == SCSW_FCTL_HALT_FUNC) && (stctl == SCSW_STCTL_STATUS_PEND) ) + || ( (fctl == SCSW_FCTL_CLEAR_FUNC) && (stctl == SCSW_STCTL_STATUS_PEND) ); + + /* + * Check for unsolicited interrupts - for debug purposes only + * + * We only consider an interrupt as unsolicited, if the device was not + * actively in use (busy) and an interrupt other than an ALERT status + * was received. + * + * Note: We must not issue a message to the console, if the + * unsolicited interrupt applies to the console device + * itself ! + */ +#ifdef CONFIG_DEBUG_IO + if ( ( irq != cons_dev ) + && !( stctl & SCSW_STCTL_ALERT_STATUS ) + && ( ioinfo[irq]->ui.flags.busy == 0 ) ) + { + char buffer[80]; + + printk( "Unsolicited interrupt received for device %04X on subchannel %04X\n" + " ... device status : %02X subchannel status : %02X\n", + ioinfo[irq]->devstat.devno, + irq, + ioinfo[irq]->devstat.dstat, + ioinfo[irq]->devstat.cstat); + + sprintf( buffer, "s390_process_IRQ(%04X) - irb for " + "device %04X, ending_status %d\n", + irq, + ioinfo[irq]->devstat.devno, + ending_status); + + s390_displayhex( buffer, + &(ioinfo[irq]->devstat.ii.irb) , + sizeof(irb_t)); + + } /* endif */ + +#endif + /* + * take fast exit if no handler is available + */ + if ( !action ) + return( ending_status ); + + /* + * Check whether we must issue a SENSE CCW ourselves if there is no + * concurrent sense facility installed for the subchannel. + * + * Note: We should check for ioinfo[irq]->ui.flags.consns but VM + * violates the ESA/390 architecture and doesn't present an + * operand exception for virtual devices without concurrent + * sense facility available/supported when enabling the + * concurrent sense facility. + */ + if ( ( ( ioinfo[irq]->devstat.ii.irb.scsw.dstat & DEV_STAT_UNIT_CHECK ) + && ( !issense ) ) + || ( ioinfo[irq]->ui.flags.delsense && ending_status ) ) + { + int ret_io; + ccw1_t *s_ccw = &ioinfo[irq]->senseccw; + unsigned long s_flag = 0; + + if ( ending_status ) + { + /* + * We copy the current status information into the device driver + * status area. Then we can use the local devstat area for device + * sensing. When finally calling the IRQ handler we must not overlay + * the original device status but copy the sense data only. + */ + memcpy( action->dev_id, + &(ioinfo[irq]->devstat), + sizeof( devstat_t) ); + + s_ccw->cmd_code = CCW_CMD_BASIC_SENSE; + s_ccw->cda = (char *)virt_to_phys( ioinfo[irq]->sense_data); + s_ccw->count = SENSE_MAX_COUNT; + s_ccw->flags = CCW_FLAG_SLI; + + /* + * If free_irq() or a sync do_IO/s390_start_IO() is in + * process we have to sense synchronously + */ + if ( ioinfo[irq]->ui.flags.unready || ioinfo[irq]->ui.flags.syncio ) + { + s_flag = DOIO_WAIT_FOR_INTERRUPT; + + } /* endif */ + + /* + * Reset status info + * + * It does not matter whether this is a sync. or async. + * SENSE request, but we have to assure we don't call + * the irq handler now, but keep the irq in busy state. + * In sync. mode s390_process_IRQ() is called recursively, + * while in async. mode we re-enter do_IRQ() with the + * next interrupt. + * + * Note : this may be a delayed sense request ! + */ + allow4handler = 0; + + ioinfo[irq]->ui.flags.fast = 0; + ioinfo[irq]->ui.flags.repall = 0; + ioinfo[irq]->ui.flags.w4final = 0; + ioinfo[irq]->ui.flags.delsense = 0; + + ioinfo[irq]->devstat.cstat = 0; + ioinfo[irq]->devstat.dstat = 0; + ioinfo[irq]->devstat.rescnt = SENSE_MAX_COUNT; + + ioinfo[irq]->ui.flags.w4sense = 1; + + ret_io = s390_start_IO( irq, + s_ccw, + 0xE2C5D5E2, // = SENSe + 0, // n/a + s_flag); + } + else + { + /* + * we received an Unit Check but we have no final + * status yet, therefore we must delay the SENSE + * processing. However, we must not report this + * intermediate status to the device interrupt + * handler. + */ + ioinfo[irq]->ui.flags.fast = 0; + ioinfo[irq]->ui.flags.repall = 0; + + ioinfo[irq]->ui.flags.delsense = 1; + allow4handler = 0; + + } /* endif */ + + } /* endif */ + + /* + * we allow for the device action handler if . + * - we received ending status + * - the action handler requested to see all interrupts + * - we received an intermediate status + * - fast notification was requested (primary status) + * - unsollicited interrupts + * + */ + if ( allow4handler ) + { + allow4handler = ending_status + || ( ioinfo[irq]->ui.flags.repall ) + || ( stctl & SCSW_STCTL_INTER_STATUS ) + || ( (ioinfo[irq]->ui.flags.fast ) && (stctl & SCSW_STCTL_PRIM_STATUS) ) + || ( ioinfo[irq]->ui.flags.oper == 0 ); + + } /* endif */ + + /* + * We used to copy the device status information right before + * calling the device action handler. However, in status + * pending situations during do_IO() or halt_IO(), as well as + * enable_subchannel/disable_subchannel processing we must + * synchronously return the status information and must not + * call the device action handler. + * + */ + if ( allow4handler ) + { + /* + * if we were waiting for sense data we copy the sense + * bytes only as the original status information was + * saved prior to sense already. + */ + if ( ioinfo[irq]->ui.flags.w4sense ) + { + int sense_count = SENSE_MAX_COUNT-ioinfo[irq]->devstat.rescnt; + +#ifdef CONFIG_DEBUG_IO + if ( irq != cons_dev ) + printk( "s390_process_IRQ( %04X ) : " + "BASIC SENSE bytes avail %d\n", + irq, sense_count ); +#endif + ioinfo[irq]->ui.flags.w4sense = 0; + ((devstat_t *)(action->dev_id))->flag |= DEVSTAT_FLAG_SENSE_AVAIL; + ((devstat_t *)(action->dev_id))->scnt = sense_count; + + if ( sense_count >= 0 ) + { + memcpy( ((devstat_t *)(action->dev_id))->ii.sense.data, + &(ioinfo[irq]->sense_data), + sense_count); + } + else + { +#if 1 + panic( "s390_process_IRQ(%04x) encountered " + "negative sense count\n", + irq); +#else + printk( KERN_CRIT"s390_process_IRQ(%04x) encountered " + "negative sense count\n", + irq); +#endif + } /* endif */ + } + else + { + memcpy( action->dev_id, &(ioinfo[irq]->devstat), sdevstat ); + + } /* endif */ + + } /* endif */ + + /* + * for status pending situations other than deferred interrupt + * conditions detected by s390_process_IRQ() itself we must not + * call the handler. This will synchronously be reported back + * to the caller instead, e.g. when detected during do_IO(). + */ + if ( ioinfo[irq]->ui.flags.s_pend + || ioinfo[irq]->ui.flags.unready + || ioinfo[irq]->ui.flags.repnone ) + { + if ( ending_status ) + { + + ioinfo[irq]->ui.flags.busy = 0; + ioinfo[irq]->ui.flags.doio = 0; + ioinfo[irq]->ui.flags.haltio = 0; + ioinfo[irq]->ui.flags.fast = 0; + ioinfo[irq]->ui.flags.repall = 0; + ioinfo[irq]->ui.flags.w4final = 0; + + ioinfo[irq]->devstat.flag |= DEVSTAT_FINAL_STATUS; + action->dev_id->flag |= DEVSTAT_FINAL_STATUS; + + } /* endif */ + + allow4handler = 0; + + } /* endif */ + + /* + * Call device action handler if applicable + */ + if ( allow4handler ) + { + + /* + * We only reset the busy condition when we are sure that no further + * interrupt is pending for the current I/O request (ending_status). + */ + if ( ending_status || !ioinfo[irq]->ui.flags.oper ) + { + ioinfo[irq]->ui.flags.oper = 1; /* dev IS oper */ + + ioinfo[irq]->ui.flags.busy = 0; + ioinfo[irq]->ui.flags.doio = 0; + ioinfo[irq]->ui.flags.haltio = 0; + ioinfo[irq]->ui.flags.fast = 0; + ioinfo[irq]->ui.flags.repall = 0; + ioinfo[irq]->ui.flags.w4final = 0; + + ioinfo[irq]->devstat.flag |= DEVSTAT_FINAL_STATUS; + ((devstat_t *)(action->dev_id))->flag |= DEVSTAT_FINAL_STATUS; + + if ( ioinfo[irq]->ui.flags.newreq ) + { + action->handler( irq, ioinfo[irq]->u_intparm ); + } + else + { + ((io_handler_func1_t)action->handler)( irq, action->dev_id, ®s ); + + } /* endif */ + + // + // reset intparm after final status or we will badly present unsolicited + // interrupts with a intparm value possibly no longer valid. + // + ioinfo[irq]->devstat.intparm = 0; + + // + // Was there anything queued ? Start the pending channel program + // if there is one. + // + if ( ioinfo[irq]->ui.flags.doio_q ) + { + int ret; + + ret = s390_start_IO( irq, + ioinfo[irq]->qcpa, + ioinfo[irq]->qintparm, + ioinfo[irq]->qlpm, + ioinfo[irq]->qflag); + + ioinfo[irq]->ui.flags.doio_q = 0; + + /* + * If s390_start_IO() failed call the device's interrupt + * handler, the IRQ related devstat area was setup by + * s390_start_IO() accordingly already (status pending + * condition). + */ + if ( ret ) + { + if ( ioinfo[irq]->ui.flags.newreq ) + { + action->handler( irq, ioinfo[irq]->u_intparm ); + } + else + { + ((io_handler_func1_t)action->handler)( irq, action->dev_id, ®s ); + + } /* endif */ + + } /* endif */ + + } /* endif */ + + } + else + { + ioinfo[irq]->ui.flags.w4final = 1; + + /* + * Eventually reset subchannel PCI status and + * set the PCI or SUSPENDED flag in the user + * device status block if appropriate. + */ + if ( ioinfo[irq]->devstat.cstat & SCHN_STAT_PCI ) + { + ((devstat_t *)(action->dev_id))->flag |= DEVSTAT_PCI; + ioinfo[irq]->devstat.cstat &= ~SCHN_STAT_PCI; + } + else if ( actl & SCSW_ACTL_SUSPENDED ) + { + ((devstat_t *)(action->dev_id))->flag |= DEVSTAT_SUSPENDED; + + } /* endif */ + + if ( ioinfo[irq]->ui.flags.newreq ) + { + action->handler( irq, ioinfo[irq]->u_intparm ); + } + else + { + ((io_handler_func1_t)action->handler)( irq, + action->dev_id, + ®s ); + + } /* endif */ + + } /* endif */ + + } /* endif */ + + break; + + case 3: /* device/path not operational */ + + ioinfo[irq]->ui.flags.busy = 0; + ioinfo[irq]->ui.flags.doio = 0; + ioinfo[irq]->ui.flags.haltio = 0; + + ioinfo[irq]->devstat.cstat = 0; + ioinfo[irq]->devstat.dstat = 0; + + if ( ioinfo[irq]->ulpm != ioinfo[irq]->opm ) + { + /* + * either it was the only path or it was restricted ... + */ + ioinfo[irq]->opm &= ~(ioinfo[irq]->devstat.ii.irb.esw.esw1.lpum); + } + else + { + ioinfo[irq]->opm = 0; + + } /* endif */ + + if ( ioinfo[irq]->opm == 0 ) + { + ioinfo[irq]->ui.flags.oper = 0; + + } /* endif */ + + ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; + ioinfo[irq]->devstat.flag |= DEVSTAT_FINAL_STATUS; + + /* + * When we find a device "not oper" we save the status + * information into the device status area and call the + * device specific interrupt handler. + * + * Note: currently we don't have any way to reenable + * the device unless an unsolicited interrupt + * is presented. We don't check for spurious + * interrupts on "not oper" conditions. + */ + + if ( ( ioinfo[irq]->ui.flags.fast ) + && ( ioinfo[irq]->ui.flags.w4final ) ) + { + /* + * If a new request was queued already, we have + * to simulate the "not oper" status for the + * queued request by switching the "intparm" value + * and notify the interrupt handler. + */ + if ( ioinfo[irq]->ui.flags.doio_q ) + { + ioinfo[irq]->devstat.intparm = ioinfo[irq]->qintparm; + + } /* endif */ + + } /* endif */ + + ioinfo[irq]->ui.flags.fast = 0; + ioinfo[irq]->ui.flags.repall = 0; + ioinfo[irq]->ui.flags.w4final = 0; + + /* + * take fast exit if no handler is available + */ + if ( !action ) + return( ending_status ); + + memcpy( action->dev_id, &(ioinfo[irq]->devstat), sdevstat ); + + ioinfo[irq]->devstat.intparm = 0; + + if ( !ioinfo[irq]->ui.flags.s_pend ) + { + if ( ioinfo[irq]->ui.flags.newreq ) + { + action->handler( irq, ioinfo[irq]->u_intparm ); + } + else + { + ((io_handler_func1_t)action->handler)( irq, action->dev_id, ®s ); + + } /* endif */ + + } /* endif */ + + ending_status = 1; + + break; + + } /* endswitch */ + + return( ending_status ); +} + +/* + * Set the special i/o-interruption sublass 7 for the + * device specified by parameter irq. There can only + * be a single device been operated on this special + * isc. This function is aimed being able to check + * on special device interrupts in disabled state, + * without having to delay I/O processing (by queueing) + * for non-console devices. + * + * Setting of this isc is done by set_cons_dev(), while + * reset_cons_dev() resets this isc and re-enables the + * default isc3 for this device. wait_cons_dev() allows + * to actively wait on an interrupt for this device in + * disabed state. When the interrupt condition is + * encountered, wait_cons_dev(9 calls do_IRQ() to have + * the console device driver processing the interrupt. + */ +int set_cons_dev( int irq ) +{ + int ccode; + unsigned long cr6 __attribute__ ((aligned (8))); + int rc = 0; + + if ( cons_dev != -1 ) + { + rc = -EBUSY; + } + else if ( (irq > highest_subchannel) || (irq < 0) ) + { + rc = -ENODEV; + } + else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + { + return( -ENODEV); + } + else + { + /* + * modify the indicated console device to operate + * on special console interrupt sublass 7 + */ + ccode = stsch( irq, &(ioinfo[irq]->schib) ); + + if (ccode) + { + rc = -ENODEV; + ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; + } + else + { + ioinfo[irq]->schib.pmcw.isc = 7; + + ccode = msch( irq, &(ioinfo[irq]->schib) ); + + if (ccode) + { + rc = -EIO; + } + else + { + cons_dev = irq; + + /* + * enable console I/O-interrupt sublass 7 + */ + asm volatile ("STCTL 6,6,%0": "=m" (cr6)); + cr6 |= 0x01000000; + asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + + } /* endif */ + + } /* endif */ + + } /* endif */ + + return( rc); +} + +int reset_cons_dev( int irq) +{ + int rc = 0; + int ccode; + long cr6 __attribute__ ((aligned (8))); + + if ( cons_dev != -1 ) + { + rc = -EBUSY; + } + else if ( (irq > highest_subchannel) || (irq < 0) ) + { + rc = -ENODEV; + } + else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + { + return( -ENODEV); + } + else + { + /* + * reset the indicated console device to operate + * on default console interrupt sublass 3 + */ + ccode = stsch( irq, &(ioinfo[irq]->schib) ); + + if (ccode) + { + rc = -ENODEV; + ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; + } + else + { + + ioinfo[irq]->schib.pmcw.isc = 3; + + ccode = msch( irq, &(ioinfo[irq]->schib) ); + + if (ccode) + { + rc = -EIO; + } + else + { + cons_dev = -1; + + /* + * disable special console I/O-interrupt sublass 7 + */ + asm volatile ("STCTL 6,6,%0": "=m" (cr6)); + cr6 &= 0xFEFFFFFF; + asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + + } /* endif */ + + } /* endif */ + + } /* endif */ + + return( rc); +} + +int wait_cons_dev( int irq ) +{ + int rc = 0; + long save_cr6; + + if ( irq == cons_dev ) + { + + /* + * before entering the spinlock we may already have + * processed the interrupt on a different CPU ... + */ + if ( ioinfo[irq]->ui.flags.busy == 1 ) + { + long cr6 __attribute__ ((aligned (8))); + + /* + * disable all, but isc 7 (console device) + */ + asm volatile ("STCTL 6,6,%0": "=m" (cr6)); + save_cr6 = cr6; + cr6 &= 0x01FFFFFF; + asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + + do { + tpi_info_t tpi_info; + if (tpi(&tpi_info) == 1) { + s390_process_IRQ( tpi_info.irq ); + } else { + s390irq_spin_unlock(irq); + tod_wait(100); + s390irq_spin_lock(irq); + } + eieio(); + } while (ioinfo[irq]->ui.flags.busy == 1); + + /* + * restore previous isc value + */ + asm volatile ("STCTL 6,6,%0": "=m" (cr6)); + cr6 = save_cr6; + asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + + } /* endif */ + + } + else + { + rc = EINVAL; + + } /* endif */ + + + return(rc); +} + + +int enable_cpu_sync_isc( int irq ) +{ + int ccode; + long cr6 __attribute__ ((aligned (8))); + + int count = 0; + int rc = 0; + + if ( irq <= highest_subchannel && ioinfo[irq] != INVALID_STORAGE_AREA ) + { + ccode = stsch( irq, &(ioinfo[irq]->schib) ); + + if ( !ccode ) + { + ioinfo[irq]->schib.pmcw.isc = 5; + + do + { + ccode = msch( irq, &(ioinfo[irq]->schib) ); + + if (ccode == 0 ) + { + /* + * enable interrupt subclass in CPU + */ + asm volatile ("STCTL 6,6,%0": "=m" (cr6)); + cr6 |= 0x04000000; // enable sync isc 5 + cr6 &= 0xEFFFFFFF; // disable standard isc 3 + asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + } + else if (ccode == 3) + { + rc = -ENODEV; // device not-oper - very unlikely + + } + else if (ccode == 2) + { + rc = -EBUSY; // device busy - should not happen + + } + else if (ccode == 1) + { + // + // process pending status + // + ioinfo[irq]->ui.flags.s_pend = 1; + + s390_process_IRQ( irq ); + + ioinfo[irq]->ui.flags.s_pend = 0; + + count++; + + } /* endif */ + + } while ( ccode == 1 && count < 3 ); + + if ( count == 3) + { + rc = -EIO; + + } /* endif */ + } + else + { + rc = -ENODEV; // device is not-operational + + } /* endif */ + } + else + { + rc = -EINVAL; + + } /* endif */ + + return( rc); +} + +int disable_cpu_sync_isc( int irq) +{ + int rc = 0; + int retry = 5; + int ccode; + long cr6 __attribute__ ((aligned (8))); + + if ( irq <= highest_subchannel && ioinfo[irq] != INVALID_STORAGE_AREA ) + { + ccode = stsch( irq, &(ioinfo[irq]->schib) ); + + ioinfo[irq]->schib.pmcw.isc = 3; + + do { + + ccode = msch( irq, &(ioinfo[irq]->schib) ); + + switch ( ccode ) { + case 0: + /* + * disable interrupt subclass in CPU + */ + asm volatile ("STCTL 6,6,%0": "=m" (cr6)); + cr6 &= 0xFBFFFFFF; // disable sync isc 5 + cr6 |= 0x10000000; // enable standard isc 3 + asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + break; + case 1: + ioinfo[irq]->ui.flags.s_pend = 1; + s390_process_IRQ( irq ); + ioinfo[irq]->ui.flags.s_pend = 0; + retry--; + rc = -EIO; + break; + case 2: + rc = -EBUSY; + break; + default: + rc = -ENODEV; + break; + } /* endswitch */ + + } while ( retry && (ccode ==1) ); + } + else + { + rc = -EINVAL; + + } /* endif */ + + return( rc); +} + +// +// Input : +// devno - device number +// ps - pointer to sense ID data area +// +// Output : none +// +void VM_virtual_device_info( unsigned int devno, + senseid_t *ps ) +{ + diag210_t diag_data; + int ccode; + + int error = 0; + + diag_data.vrdcdvno = devno; + diag_data.vrdclen = sizeof( diag210_t); + ccode = diag210( (diag210_t *)virt_to_phys( &diag_data ) ); + ps->reserved = 0xff; + + switch (diag_data.vrdcvcla) { + case 0x80: + + switch (diag_data.vrdcvtyp) { + case 00: + + ps->cu_type = 0x3215; + + break; + + default: + + error = 1; + + break; + + } /* endswitch */ + + break; + + case 0x40: + + switch (diag_data.vrdcvtyp) { + case 0xC0: + + ps->cu_type = 0x5080; + + break; + + case 0x80: + + ps->cu_type = 0x2250; + + break; + + case 0x04: + + ps->cu_type = 0x3277; + + break; + + case 0x01: + + ps->cu_type = 0x3278; + + break; + + default: + + error = 1; + + break; + + } /* endswitch */ + + break; + + case 0x20: + + switch (diag_data.vrdcvtyp) { + case 0x84: + + ps->cu_type = 0x3505; + + break; + + case 0x82: + + ps->cu_type = 0x2540; + + break; + + case 0x81: + + ps->cu_type = 0x2501; + + break; + + default: + + error = 1; + + break; + + } /* endswitch */ + + break; + + case 0x10: + + switch (diag_data.vrdcvtyp) { + case 0x84: + + ps->cu_type = 0x3525; + + break; + + case 0x82: + + ps->cu_type = 0x2540; + + break; + + case 0x4F: + case 0x4E: + case 0x48: + + ps->cu_type = 0x3820; + + break; + + case 0x4D: + case 0x49: + case 0x45: + + ps->cu_type = 0x3800; + + break; + + case 0x4B: + + ps->cu_type = 0x4248; + + break; + + case 0x4A: + + ps->cu_type = 0x4245; + + break; + + case 0x47: + + ps->cu_type = 0x3262; + + break; - if (ending_status) - { - /* - * We copy the current status information into the device driver - * status area. Then we can use the local devstat area for device - * sensing. When finally calling the IRQ handler we must not overlay - * the original device status but copy the sense data only. - */ - memcpy( ioinfo[irq]->irq_desc.action->dev_id, - &(ioinfo[irq]->devstat), - sizeof( devstat_t) ); + case 0x43: - s_ccw->cmd_code = CCW_CMD_BASIC_SENSE; - s_ccw->cda = (char *)virt_to_phys( ioinfo[irq]->devstat.ii.sense.data); - s_ccw->count = SENSE_MAX_COUNT; - s_ccw->flags = CCW_FLAG_SLI; + ps->cu_type = 0x3203; - /* - * If free_irq() or a sync do_IO/s390_start_IO() is in - * process we have to sense synchronously - */ - if ( ioinfo[irq]->ui.flags.unready || ioinfo[irq]->ui.flags.syncio ) - { - s_flag = DOIO_WAIT_FOR_INTERRUPT; + break; - } /* endif */ + case 0x42: - /* - * Reset status info - * - * It does not matter whether this is a sync. or async. - * SENSE request, but we have to assure we don't call - * the irq handler now, but keep the irq in busy state. - * In sync. mode s390_process_IRQ() is called recursively, - * while in async. mode we re-enter do_IRQ() with the - * next interrupt. - * - * Note : this may be a delayed sense request ! - */ - allow4handler = 0; + ps->cu_type = 0x3211; - ioinfo[irq]->ui.flags.fast = 0; - ioinfo[irq]->ui.flags.repall = 0; - ioinfo[irq]->ui.flags.w4final = 0; - ioinfo[irq]->ui.flags.delsense = 0; + break; - ioinfo[irq]->devstat.cstat = 0; - ioinfo[irq]->devstat.dstat = 0; - ioinfo[irq]->devstat.rescnt = SENSE_MAX_COUNT; + case 0x41: - ioinfo[irq]->ui.flags.w4sense = 1; - - ret_io = s390_start_IO( irq, - s_ccw, - 0xE2C5D5E2, // = SENSe - 0, // n/a - s_flag); - } - else - { - /* - * we received an Unit Check but we have no final - * status yet, therefore we must delay the SENSE - * processing. However, we must not report this - * intermediate status to the device interrupt - * handler. - */ - ioinfo[irq]->ui.flags.fast = 0; - ioinfo[irq]->ui.flags.repall = 0; + ps->cu_type = 0x1403; - ioinfo[irq]->ui.flags.delsense = 1; - allow4handler = 0; + break; - } /* endif */ + default: - } /* endif */ + error = 1; - /* - * we allow for the device action handler if . - * - we received ending status - * - the action handler requested to see all interrupts - * - we received a PCI - * - fast notification was requested (primary status) - * - unsollicited interrupts - * - */ - if ( allow4handler ) - { - allow4handler = ending_status - || ( ioinfo[irq]->ui.flags.repall ) - || ( ioinfo[irq]->devstat.ii.irb.scsw.cstat & SCHN_STAT_PCI ) - || ( (ioinfo[irq]->ui.flags.fast ) && (stctl & SCSW_STCTL_PRIM_STATUS) ) - || ( ioinfo[irq]->ui.flags.oper == 0 ); + break; - } /* endif */ + } /* endswitch */ - /* - * We used to copy the device status information right before - * calling the device action handler. However, in status - * pending situations during do_IO() or halt_IO(), as well as - * enable_subchannel/disable_subchannel processing we must - * synchronously return the status information and must not - * call the device action handler. - * - */ - if ( allow4handler ) - { - /* - * if we were waiting for sense data we copy the sense - * bytes only as the original status information was - * saved prior to sense already. - */ - if ( ioinfo[irq]->ui.flags.w4sense ) - { - int sense_count = SENSE_MAX_COUNT-ioinfo[irq]->devstat.rescnt; + break; -#if CONFIG_DEBUG_IO - if ( irq != cons_dev ) - printk( "s390_process_IRQ( %04X ) : " - "BASIC SENSE bytes avail %d\n", - irq, sense_count ); -#endif - ioinfo[irq]->ui.flags.w4sense = 0; - ((devstat_t *)(action->dev_id))->flag |= DEVSTAT_FLAG_SENSE_AVAIL; - ((devstat_t *)(action->dev_id))->scnt = sense_count; + case 0x08: - if (sense_count >= 0) - { - memcpy( ((devstat_t *)(action->dev_id))->ii.sense.data, - &(ioinfo[irq]->devstat.ii.sense.data), - sense_count); - } - else - { -#if 1 - panic( "s390_process_IRQ(%04x) encountered " - "negative sense count\n", - irq); -#else - printk( KERN_CRIT"s390_process_IRQ(%04x) encountered " - "negative sense count\n", - irq); -#endif - } /* endif */ - } - else - { - memcpy( action->dev_id, &(ioinfo[irq]->devstat), sdevstat ); + switch (diag_data.vrdcvtyp) { + case 0x82: - } /* endif */ + ps->cu_type = 0x3422; - } /* endif */ + break; - /* - * for status pending situations other than deferred interrupt - * conditions detected by s390_process_IRQ() itself we must not - * call the handler. This will synchronously be reported back - * to the caller instead, e.g. when detected during do_IO(). - */ - if ( ioinfo[irq]->ui.flags.s_pend ) - allow4handler = 0; + case 0x81: - /* - * Call device action handler if applicable - */ - if ( allow4handler ) - { + ps->cu_type = 0x3490; - /* - * We only reset the busy condition when we are sure that no further - * interrupt is pending for the current I/O request (ending_status). - */ - if ( ending_status || !ioinfo[irq]->ui.flags.oper ) - { - ioinfo[irq]->ui.flags.oper = 1; /* dev IS oper */ + break; - ioinfo[irq]->ui.flags.busy = 0; - ioinfo[irq]->ui.flags.doio = 0; - ioinfo[irq]->ui.flags.haltio = 0; - ioinfo[irq]->ui.flags.fast = 0; - ioinfo[irq]->ui.flags.repall = 0; - ioinfo[irq]->ui.flags.w4final = 0; + case 0x10: - ioinfo[irq]->devstat.flag |= DEVSTAT_FINAL_STATUS; - ((devstat_t *)(action->dev_id))->flag |= DEVSTAT_FINAL_STATUS; + ps->cu_type = 0x3420; - action->handler( irq, action->dev_id, ®s); + break; - // - // reset intparm after final status or we will badly present unsolicited - // interrupts with a intparm value possibly no longer valid. - // - ioinfo[irq]->devstat.intparm = 0; + case 0x02: - // - // Was there anything queued ? Start the pending channel program - // if there is one. - // - if ( ioinfo[irq]->ui.flags.doio_q ) - { - int ret; + ps->cu_type = 0x3430; - ret = s390_start_IO( irq, - ioinfo[irq]->qcpa, - ioinfo[irq]->qintparm, - ioinfo[irq]->qlpm, - ioinfo[irq]->qflag); + break; - ioinfo[irq]->ui.flags.doio_q = 0; + case 0x01: - /* - * If s390_start_IO() failed call the device's interrupt - * handler, the IRQ related devstat area was setup by - * s390_start_IO() accordingly already (status pending - * condition). - */ - if ( ret ) - { - action->handler( irq, action->dev_id, ®s); + ps->cu_type = 0x3480; - } /* endif */ + break; - } /* endif */ + case 0x42: - } - else - { - ioinfo[irq]->ui.flags.w4final = 1; - action->handler( irq, action->dev_id, ®s); + ps->cu_type = 0x3424; - } /* endif */ + break; - } /* endif */ + case 0x44: - break; + ps->cu_type = 0x9348; - case 3: /* device not operational */ + break; - ioinfo[irq]->ui.flags.oper = 0; + default: - ioinfo[irq]->ui.flags.busy = 0; - ioinfo[irq]->ui.flags.doio = 0; - ioinfo[irq]->ui.flags.haltio = 0; + error = 1; - ioinfo[irq]->devstat.cstat = 0; - ioinfo[irq]->devstat.dstat = 0; - ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; - ioinfo[irq]->devstat.flag |= DEVSTAT_FINAL_STATUS; + break; - /* - * When we find a device "not oper" we save the status - * information into the device status area and call the - * device specific interrupt handler. - * - * Note: currently we don't have any way to reenable - * the device unless an unsolicited interrupt - * is presented. We don't check for spurious - * interrupts on "not oper" conditions. - */ + } /* endswitch */ - if ( ( ioinfo[irq]->ui.flags.fast ) - && ( ioinfo[irq]->ui.flags.w4final ) ) - { - /* - * If a new request was queued already, we have - * to simulate the "not oper" status for the - * queued request by switching the "intparm" value - * and notify the interrupt handler. - */ - if ( ioinfo[irq]->ui.flags.doio_q ) - { - ioinfo[irq]->devstat.intparm = ioinfo[irq]->qintparm; + break; - } /* endif */ + case 02: /* special device class ... */ - } /* endif */ + switch (diag_data.vrdcvtyp) { + case 0x20: /* OSA */ - ioinfo[irq]->ui.flags.fast = 0; - ioinfo[irq]->ui.flags.repall = 0; - ioinfo[irq]->ui.flags.w4final = 0; + ps->cu_type = 0x3088; + ps->cu_model = 0x60; - memcpy( action->dev_id, &(ioinfo[irq]->devstat), sdevstat ); + break; - ioinfo[irq]->devstat.intparm = 0; + default: - if ( !ioinfo[irq]->ui.flags.s_pend ) - action->handler( irq, action->dev_id, ®s); + error = 1; + break; - ending_status = 1; + } /* endswitch */ + + break; + + default: + + error = 1; break; - } /* endswitch */ + } /* endswitch */ + + if ( error ) + {printk( "DIAG X'210' for device %04X returned (cc = %d): vdev class : %02X, " + "vdev type : %04X \n ... rdev class : %02X, rdev type : %04X, rdev model: %02X\n", + devno, + ccode, + diag_data.vrdcvcla, + diag_data.vrdcvtyp, + diag_data.vrdcrccl, + diag_data.vrdccrty, + diag_data.vrdccrmd ); + + } /* endif */ - return( ending_status ); } /* - * Set the special i/o-interruption sublass 7 for the - * device specified by parameter irq. There can only - * be a single device been operated on this special - * isc. This function is aimed being able to check - * on special device interrupts in disabled state, - * without having to delay I/O processing (by queueing) - * for non-console devices. + * This routine returns the characteristics for the device + * specified. Some old devices might not provide the necessary + * command code information during SenseID processing. In this + * case the function returns -EINVAL. Otherwise the function + * allocates a decice specific data buffer and provides the + * device characteristics together with the buffer size. Its + * the callers responability to release the kernel memory if + * not longer needed. In case of persistent I/O problems -EBUSY + * is returned. * - * Setting of this isc is done by set_cons_dev(), while - * reset_cons_dev() resets this isc and re-enables the - * default isc3 for this device. wait_cons_dev() allows - * to actively wait on an interrupt for this device in - * disabed state. When the interrupt condition is - * encountered, wait_cons_dev(9 calls do_IRQ() to have - * the console device driver processing the interrupt. + * The function may be called enabled or disabled. However, the + * caller must have locked the irq it is requesting data for. + * + * Note : It would have been nice to collect this information + * during init_IRQ() processing but this is not possible + * + * a) without statically pre-allocation fixed size buffers + * as virtual memory management isn't available yet. + * + * b) without unnecessarily increase system startup by + * evaluating devices eventually not used at all. */ -int set_cons_dev( int irq ) +int read_dev_chars( int irq, void **buffer, int length ) { - int ccode; - unsigned long cr6 __attribute__ ((aligned (8))); - int rc = 0; + unsigned int flags; + ccw1_t *rdc_ccw; + devstat_t devstat; + char *rdc_buf; + int devflag; + + int ret = 0; + int emulated = 0; + int retry = 5; - if ( cons_dev != -1 ) + if ( !buffer || !length ) { - rc = -EBUSY; - } - else if ( (irq > highest_subchannel) || (irq < 0) ) + return( -EINVAL ); + + } /* endif */ + + if ( (irq > highest_subchannel) || (irq < 0 ) ) { - rc = -ENODEV; + return( -ENODEV ); + } else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) { return( -ENODEV); } - else - { - /* - * modify the indicated console device to operate - * on special console interrupt sublass 7 - */ - ccode = stsch( irq, &(ioinfo[irq]->schib) ); - if (ccode) - { - rc = -ENODEV; - ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; - } - else + if ( ioinfo[irq]->ui.flags.oper == 0 ) { - ioinfo[irq]->schib.pmcw.isc = 7; - - ccode = msch( irq, &(ioinfo[irq]->schib) ); + return( -ENODEV ); - if (ccode) - { - rc = -EIO; - } - else - { - cons_dev = irq; + } /* endif */ /* - * enable console I/O-interrupt sublass 7 + * Before playing around with irq locks we should assure + * running disabled on (just) our CPU. Sync. I/O requests + * also require to run disabled. + * + * Note : as no global lock is required, we must not use + * cli(), but __cli() instead. */ - asm volatile ("STCTL 6,6,%0": "=m" (cr6)); - cr6 |= 0x01000000; - asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + __save_flags(flags); + __cli(); - } /* endif */ + rdc_ccw = &ioinfo[irq]->senseccw; - } /* endif */ + if ( !ioinfo[irq]->ui.flags.ready ) + { + ret = request_irq( irq, + init_IRQ_handler, + 0, "RDC", &devstat ); - } /* endif */ + if ( !ret ) + { + emulated = 1; - return( rc); -} + } /* endif */ -int reset_cons_dev( int irq) -{ - int rc = 0; - int ccode; - long cr6 __attribute__ ((aligned (8))); + } /* endif */ - if ( cons_dev != -1 ) - { - rc = -EBUSY; - } - else if ( (irq > highest_subchannel) || (irq < 0) ) + if ( !ret ) { - rc = -ENODEV; - } - else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + if ( ! *buffer ) { - return( -ENODEV); + rdc_buf = kmalloc( length, GFP_KERNEL); } else { - /* - * reset the indicated console device to operate - * on default console interrupt sublass 3 - */ - ccode = stsch( irq, &(ioinfo[irq]->schib) ); + rdc_buf = *buffer; - if (ccode) + } /* endif */ + + if ( !rdc_buf ) { - rc = -ENODEV; - ioinfo[irq]->devstat.flag |= DEVSTAT_NOT_OPER; + ret = -ENOMEM; } else { + do + { + rdc_ccw->cmd_code = CCW_CMD_RDC; + rdc_ccw->cda = (char *)virt_to_phys( rdc_buf ); + rdc_ccw->count = length; + rdc_ccw->flags = CCW_FLAG_SLI; + + memset( (devstat_t *)(ioinfo[irq]->irq_desc.action->dev_id), + '\0', + sizeof( devstat_t)); + + ret = s390_start_IO( irq, + rdc_ccw, + 0x00524443, // RDC + 0, // n/a + DOIO_WAIT_FOR_INTERRUPT + | DOIO_DONT_CALL_INTHDLR ); + retry--; + devflag = ((devstat_t *)(ioinfo[irq]->irq_desc.action->dev_id))->flag; - ioinfo[irq]->schib.pmcw.isc = 3; + } while ( ( retry ) + && ( ret || (devflag & DEVSTAT_STATUS_PENDING) ) ); - ccode = msch( irq, &(ioinfo[irq]->schib) ); + } /* endif */ - if (ccode) - { - rc = -EIO; - } - else + if ( !retry ) { - cons_dev = -1; + ret = -EBUSY; + + } /* endif */ + + __restore_flags(flags); /* - * disable special console I/O-interrupt sublass 7 + * on success we update the user input parms */ - asm volatile ("STCTL 6,6,%0": "=m" (cr6)); - cr6 &= 0xFEFFFFFF; - asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + if ( !ret ) + { + *buffer = rdc_buf; } /* endif */ + if ( emulated ) + { + free_irq( irq, &devstat); + } /* endif */ } /* endif */ - return( rc); + return( ret ); } -int wait_cons_dev( int irq ) -{ - int rc = 0; - long save_cr6; - - if ( irq == cons_dev ) - { - /* - * before entering the spinlock we may already have - * processed the interrupt on a different CPU ... + * Read Configuration data */ - if ( ioinfo[irq]->ui.flags.busy == 1 ) +int read_conf_data( int irq, void **buffer, int *length, __u8 lpm ) { - long cr6 __attribute__ ((aligned (8))); + unsigned long flags; + int ciw_cnt; - /* - * disable all, but isc 7 (console device) - */ - asm volatile ("STCTL 6,6,%0": "=m" (cr6)); - save_cr6 = cr6; - cr6 &= 0x01FFFFFF; - asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + int found = 0; // RCD CIW found + int ret = 0; // return code - do { - tpi_info_t tpi_info; - if (tpi(&tpi_info) == 1) { - s390_process_IRQ( tpi_info.irq ); - } else { - s390irq_spin_unlock(irq); - tod_wait(100); - s390irq_spin_lock(irq); + if ( (irq > highest_subchannel) || (irq < 0 ) ) + { + return( -ENODEV ); } - eieio(); - } while (ioinfo[irq]->ui.flags.busy == 1); + else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + { + return( -ENODEV); + } + else if ( !buffer || !length ) + { + return( -EINVAL); + } + else if ( ioinfo[irq]->ui.flags.oper == 0 ) + { + return( -ENODEV ); + } + else if ( ioinfo[irq]->ui.flags.esid == 0 ) + { + return( -EOPNOTSUPP ); + + } /* endif */ /* - * restore previous isc value + * scan for RCD command in extended SenseID data */ - asm volatile ("STCTL 6,6,%0": "=m" (cr6)); - cr6 = save_cr6; - asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); - } /* endif */ - - } - else + for ( ciw_cnt = 0; (found == 0) && (ciw_cnt < 62); ciw_cnt++ ) { - rc = EINVAL; + if ( ioinfo[irq]->senseid.ciw[ciw_cnt].ct == CIW_TYPE_RCD ) + { + /* + * paranoia check ... + */ + if ( ioinfo[irq]->senseid.ciw[ciw_cnt].cmd != 0 ) + { + found = 1; } /* endif */ + break; + } /* endif */ - return(rc); -} - + } /* endfor */ -int enable_cpu_sync_isc( int irq ) + if ( found ) { - int ccode; - long cr6 __attribute__ ((aligned (8))); - - int count = 0; - int rc = 0; + devstat_t devstat; /* inline device status area */ + devstat_t *pdevstat; + int ioflags; + + ccw1_t *rcd_ccw = &ioinfo[irq]->senseccw; + char *rcd_buf = NULL; + int emulated = 0; /* no i/O handler installed */ + int retry = 5; /* retry count */ - if ( irq <= highest_subchannel && ioinfo[irq] != INVALID_STORAGE_AREA ) - { - ccode = stsch( irq, &(ioinfo[irq]->schib) ); + __save_flags(flags); + __cli(); - if ( !ccode ) + if ( !ioinfo[irq]->ui.flags.ready ) { - ioinfo[irq]->schib.pmcw.isc = 5; + pdevstat = &devstat; + ret = request_irq( irq, + init_IRQ_handler, + 0, "RCD", pdevstat ); - do + if ( !ret ) { - ccode = msch( irq, &(ioinfo[irq]->schib) ); + emulated = 1; - if (ccode == 0 ) - { - /* - * enable interrupt subclass in CPU - */ - asm volatile ("STCTL 6,6,%0": "=m" (cr6)); - cr6 |= 0x04000000; // enable sync isc 5 - cr6 &= 0xEFFFFFFF; // disable standard isc 3 - asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + } /* endif */ } - else if (ccode == 3) + else { - rc = -ENODEV; // device not-oper - very unlikely + pdevstat = ioinfo[irq]->irq_desc.action->dev_id; - } - else if (ccode == 2) - { - rc = -EBUSY; // device busy - should not happen + } /* endif */ + if ( !ret ) + { + if ( init_IRQ_complete ) + { + rcd_buf = kmalloc( ioinfo[irq]->senseid.ciw[ciw_cnt].count, + GFP_KERNEL); } - else if (ccode == 1) + else { - // - // process pending status - // - ioinfo[irq]->ui.flags.s_pend = 1; - - s390_process_IRQ( irq ); + rcd_buf = alloc_bootmem( ioinfo[irq]->senseid.ciw[ciw_cnt].count); - ioinfo[irq]->ui.flags.s_pend = 0; + } /* endif */ - count++; + if ( rcd_buf == NULL ) + { + ret = -ENOMEM; } /* endif */ - } while ( ccode == 1 && count < 3 ); + if ( !ret ) + { + memset( rcd_buf, + '\0', + ioinfo[irq]->senseid.ciw[ciw_cnt].count); - if ( count == 3) + do { - rc = -EIO; + rcd_ccw->cmd_code = ioinfo[irq]->senseid.ciw[ciw_cnt].cmd; + rcd_ccw->cda = (char *)virt_to_phys( rcd_buf ); + rcd_ccw->count = ioinfo[irq]->senseid.ciw[ciw_cnt].count; + rcd_ccw->flags = CCW_FLAG_SLI; - } /* endif */ + memset( pdevstat, '\0', sizeof( devstat_t)); + + if ( lpm ) + { + ioflags = DOIO_WAIT_FOR_INTERRUPT + | DOIO_VALID_LPM + | DOIO_DONT_CALL_INTHDLR; } else { - rc = -ENODEV; // device is not-operational + ioflags = DOIO_WAIT_FOR_INTERRUPT + | DOIO_DONT_CALL_INTHDLR; } /* endif */ + + ret = s390_start_IO( irq, + rcd_ccw, + 0x00524344, // == RCD + lpm, + ioflags ); + + switch ( ret ) { + case 0 : + case -EIO : + + if ( !(pdevstat->flag & ( DEVSTAT_STATUS_PENDING + | DEVSTAT_NOT_OPER + | DEVSTAT_FLAG_SENSE_AVAIL ) ) ) + { + retry = 0; // we got it ... } else { - rc = -EINVAL; + retry--; // try again ... } /* endif */ - return( rc); -} + break; -int disable_cpu_sync_isc( int irq) -{ - int rc = 0; - int ccode; - long cr6 __attribute__ ((aligned (8))); + default : // -EBUSY, -ENODEV, ??? + retry = 0; - if ( irq <= highest_subchannel && ioinfo[irq] != INVALID_STORAGE_AREA ) - { - ccode = stsch( irq, &(ioinfo[irq]->schib) ); + } /* endswitch */ - ioinfo[irq]->schib.pmcw.isc = 3; + } while ( retry ); - ccode = msch( irq, &(ioinfo[irq]->schib) ); + } /* endif */ - if (ccode) + __restore_flags( flags ); + + } /* endif */ + + /* + * on success we update the user input parms + */ + if ( ret == 0 ) + { + *length = ioinfo[irq]->senseid.ciw[ciw_cnt].count; + *buffer = rcd_buf; + } + else { - rc = -EIO; + if ( rcd_buf != NULL ) + { + if ( init_IRQ_complete ) + { + kfree( rcd_buf ); } else { + free_bootmem( (unsigned long)rcd_buf, + ioinfo[irq]->senseid.ciw[ciw_cnt].count); - /* - * enable interrupt subclass in CPU - */ - asm volatile ("STCTL 6,6,%0": "=m" (cr6)); - cr6 &= 0xFBFFFFFF; // disable sync isc 5 - cr6 |= 0x10000000; // enable standard isc 3 - asm volatile ("LCTL 6,6,%0":: "m" (cr6):"memory"); + } /* endif */ + + } /* endif */ + + *buffer = NULL; + *length = 0; } /* endif */ + if ( emulated ) + free_irq( irq, pdevstat); } else { - rc = -EINVAL; + ret = -EOPNOTSUPP; } /* endif */ - return( rc); + return( ret ); + } -// -// Input : -// devno - device number -// ps - pointer to sense ID data area -// -// Output : none -// -void VM_virtual_device_info( unsigned int devno, - senseid_t *ps ) +int get_dev_info( int irq, dev_info_t * pdi) { - diag210_t diag_data; - int ccode; - - int error = 0; - - diag_data.vrdcdvno = devno; - diag_data.vrdclen = sizeof( diag210_t); - ccode = diag210( (diag210_t *)virt_to_phys( &diag_data ) ); - ps->reserved = 0xff; - - switch (diag_data.vrdcvcla) { - case 0x80: + return( get_dev_info_by_irq( irq, pdi)); +} - switch (diag_data.vrdcvtyp) { - case 00: - ps->cu_type = 0x3215; +static int __inline__ get_next_available_irq( ioinfo_t *pi) +{ + int ret_val; + while ( TRUE ) + { + if ( pi->ui.flags.oper ) + { + ret_val = pi->irq; break; + } + else + { + pi = pi->next; - default: - - error = 1; - + // + // leave at end of list unconditionally + // + if ( pi == NULL ) + { + ret_val = -ENODEV; break; + } - } /* endswitch */ + } /* endif */ - break; + } /* endwhile */ - case 0x40: + return ret_val; +} - switch (diag_data.vrdcvtyp) { - case 0xC0: - ps->cu_type = 0x5080; +int get_irq_first( void ) +{ + int ret_irq; - break; + if ( ioinfo_head ) + { + if ( ioinfo_head->ui.flags.oper ) + { + ret_irq = ioinfo_head->irq; + } + else if ( ioinfo_head->next ) + { + ret_irq = get_next_available_irq( ioinfo_head->next ); - case 0x80: + } + else + { + ret_irq = -ENODEV; - ps->cu_type = 0x2250; + } /* endif */ + } + else + { + ret_irq = -ENODEV; - break; + } /* endif */ - case 0x04: + return ret_irq; +} - ps->cu_type = 0x3277; +int get_irq_next( int irq ) +{ + int ret_irq; - break; + if ( ioinfo[irq] != INVALID_STORAGE_AREA ) + { + if ( ioinfo[irq]->next ) + { + if ( ioinfo[irq]->next->ui.flags.oper ) + { + ret_irq = ioinfo[irq]->next->irq; + } + else + { + ret_irq = get_next_available_irq( ioinfo[irq]->next ); - case 0x01: + } /* endif */ + } + else + { + ret_irq = -ENODEV; - ps->cu_type = 0x3278; + } /* endif */ + } + else + { + ret_irq = -EINVAL; - break; + } /* endif */ - default: + return ret_irq; +} - error = 1; +int get_dev_info_by_irq( int irq, dev_info_t *pdi) +{ - break; + if ( irq > highest_subchannel || irq < 0 ) + { + return -ENODEV; + } + else if ( pdi == NULL ) + { + return -EINVAL; + } + else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + { + return( -ENODEV); + } + else + { + pdi->devno = ioinfo[irq]->schib.pmcw.dev; + pdi->irq = irq; - } /* endswitch */ + if ( ioinfo[irq]->ui.flags.oper ) + { + pdi->status = 0; + memcpy( &(pdi->sid_data), + &ioinfo[irq]->senseid, + sizeof( senseid_t)); + } + else + { + pdi->status = DEVSTAT_NOT_OPER; + memcpy( &(pdi->sid_data), + '\0', + sizeof( senseid_t)); + pdi->sid_data.cu_type = 0xFFFF; - break; + } /* endif */ - case 0x20: + if ( ioinfo[irq]->ui.flags.ready ) + pdi->status |= DEVSTAT_DEVICE_OWNED; - switch (diag_data.vrdcvtyp) { - case 0x84: + return 0; - ps->cu_type = 0x3505; + } /* endif */ - break; +} - case 0x82: - ps->cu_type = 0x2540; +int get_dev_info_by_devno( unsigned int devno, dev_info_t *pdi) +{ + int i; + int rc = -ENODEV; - break; + if ( devno > 0x0000ffff ) + { + return -ENODEV; + } + else if ( pdi == NULL ) + { + return -EINVAL; + } + else + { - case 0x81: + for ( i=0; i <= highest_subchannel; i++ ) + { - ps->cu_type = 0x2501; + if ( ioinfo[i] != INVALID_STORAGE_AREA + && ioinfo[i]->schib.pmcw.dev == devno ) + { + if ( ioinfo[i]->ui.flags.oper ) + { + pdi->status = 0; + pdi->irq = i; + pdi->devno = devno; - break; + memcpy( &(pdi->sid_data), + &ioinfo[i]->senseid, + sizeof( senseid_t)); + } + else + { + pdi->status = DEVSTAT_NOT_OPER; + pdi->irq = i; + pdi->devno = devno; - default: + memcpy( &(pdi->sid_data), '\0', sizeof( senseid_t)); + pdi->sid_data.cu_type = 0xFFFF; - error = 1; + } /* endif */ + if ( ioinfo[i]->ui.flags.ready ) + pdi->status |= DEVSTAT_DEVICE_OWNED; + + rc = 0; /* found */ break; - } /* endswitch */ + } /* endif */ + + } /* endfor */ - break; + return( rc); - case 0x10: + } /* endif */ - switch (diag_data.vrdcvtyp) { - case 0x84: +} - ps->cu_type = 0x3525; +int get_irq_by_devno( unsigned int devno ) +{ + int i; + int rc = -1; - break; + if ( devno <= 0x0000ffff ) + { + for ( i=0; i <= highest_subchannel; i++ ) + { + if ( (ioinfo[i] != INVALID_STORAGE_AREA ) + && (ioinfo[i]->schib.pmcw.dev == devno) + && (ioinfo[i]->schib.pmcw.dnv == 1 ) ) + { + rc = i; + break; - case 0x82: + } /* endif */ - ps->cu_type = 0x2540; + } /* endfor */ - break; + } /* endif */ - case 0x4F: - case 0x4E: - case 0x48: + return( rc); +} - ps->cu_type = 0x3820; +unsigned int get_devno_by_irq( int irq ) +{ - break; + if ( ( irq > highest_subchannel ) + || ( irq < 0 ) + || ( ioinfo[irq] == INVALID_STORAGE_AREA ) ) + { + return -1; - case 0x4D: - case 0x49: - case 0x45: + } /* endif */ - ps->cu_type = 0x3800; + /* + * we don't need to check for the device be operational + * as the initial STSCH will always present the device + * number defined by the IOCDS regardless of the device + * existing or not. However, there could be subchannels + * defined who's device number isn't valid ... + */ + if ( ioinfo[irq]->schib.pmcw.dnv ) + return( ioinfo[irq]->schib.pmcw.dev ); + else + return -1; +} - break; +/* + * s390_device_recognition_irq + * + * Used for individual device recognition. Issues the device + * independant SenseID command to obtain info the device type. + * + */ +void s390_device_recognition_irq( int irq ) +{ + int ret; + unsigned long psw_flags; - case 0x4B: + /* + * We issue the SenseID command on I/O subchannels we think are + * operational only. + */ + if ( ( ioinfo[irq] != INVALID_STORAGE_AREA ) + && ( ioinfo[irq]->schib.pmcw.st == 0 ) + && ( ioinfo[irq]->ui.flags.oper == 1 ) ) + { + int irq_ret; + devstat_t devstat; + + irq_ret = request_irq( irq, + init_IRQ_handler, + 0, + "INIT", + &devstat); - ps->cu_type = 0x4248; + if ( !irq_ret ) + { + /* + * avoid sync processing (STSCH/MSCH) for every + * single I/O during boot (IPL) processing. + */ + spin_lock_irqsave( &sync_isc, psw_flags); - break; + ret = enable_cpu_sync_isc( irq); - case 0x4A: + if ( ret ) + { + spin_unlock_irqrestore( &sync_isc, psw_flags); + } + else + { + ioinfo[irq]->ui.flags.syncio = 1; // global - ps->cu_type = 0x4245; + memset( &ioinfo[irq]->senseid, '\0', sizeof( senseid_t)); - break; + s390_SenseID( irq, &ioinfo[irq]->senseid, 0xff ); +#if 0 /* FIXME */ + /* + * We initially check the configuration data for + * those devices with more than a single path + */ + if ( ioinfo[irq]->schib.pmcw.pim != 0x80 ) + { + char *prcd; + int lrcd; - case 0x47: + ret = read_conf_data( irq, (void **)&prcd, &lrcd, 0 ); - ps->cu_type = 0x3262; + if ( !ret ) // on success only ... + { +#ifdef CONFIG_DEBUG_IO + char buffer[80]; - break; + sprintf( buffer, + "RCD for device(%04X)/" + "subchannel(%04X) returns :\n", + ioinfo[irq]->schib.pmcw.dev, + irq ); + + s390_displayhex( buffer, prcd, lrcd ); +#endif + if ( init_IRQ_complete ) + { + kfree( prcd ); + } + else + { + free_bootmem( (unsigned long)prcd, lrcd ); - case 0x43: + } /* endif */ - ps->cu_type = 0x3203; + } /* endif */ - break; + } /* endif */ +#endif + s390_DevicePathVerification( irq, 0 ); - case 0x42: + disable_cpu_sync_isc( irq ); - ps->cu_type = 0x3211; + ioinfo[irq]->ui.flags.syncio = 0; // global - break; + spin_unlock_irqrestore( &sync_isc, psw_flags); - case 0x41: + } /* endif */ - ps->cu_type = 0x1403; + free_irq( irq, &devstat ); - break; + } /* endif */ - default: + } /* endif */ - error = 1; +} - break; +/* + * s390_device_recognition_all + * + * Used for system wide device recognition. + * + */ +void s390_device_recognition_all( void) +{ + int irq = 0; /* let's start with subchannel 0 ... */ - } /* endswitch */ + do + { + s390_device_recognition_irq( irq ); - break; + irq ++; - case 0x08: + } while ( irq <= highest_subchannel ); - switch (diag_data.vrdcvtyp) { - case 0x82: +} - ps->cu_type = 0x3422; - break; +/* + * s390_search_devices + * + * Determines all subchannels available to the system. + * + */ +void s390_process_subchannels( void) +{ + int ret; + int irq = 0; /* Evaluate all subchannels starting with 0 ... */ - case 0x81: + do + { + ret = s390_validate_subchannel( irq, 0); - ps->cu_type = 0x3490; + irq++; - break; + } while ( (ret != -ENXIO) && (irq < __MAX_SUBCHANNELS) ); - case 0x10: + highest_subchannel = --irq; - ps->cu_type = 0x3420; + printk( "\nHighest subchannel number detected: %u\n", + highest_subchannel); +} - break; +/* + * s390_validate_subchannel() + * + * Process the subchannel for the requested irq. Returns 1 for valid + * subchannels, otherwise 0. + */ +int s390_validate_subchannel( int irq, int enable ) +{ - case 0x02: + int retry; /* retry count for status pending conditions */ + int ccode; /* condition code for stsch() only */ + int ccode2; /* condition code for other I/O routines */ + schib_t *p_schib; + int ret; - ps->cu_type = 0x3430; + /* + * The first subchannel that is not-operational (ccode==3) + * indicates that there aren't any more devices available. + */ + if ( ( init_IRQ_complete ) + && ( ioinfo[irq] != INVALID_STORAGE_AREA ) ) + { + p_schib = &ioinfo[irq]->schib; + } + else + { + p_schib = &init_schib; - break; + } /* endif */ - case 0x01: + /* + * If we knew the device before we assume the worst case ... + */ + if ( ioinfo[irq] != INVALID_STORAGE_AREA ) + { + ioinfo[irq]->ui.flags.oper = 0; + ioinfo[irq]->ui.flags.dval = 0; - ps->cu_type = 0x3480; + } /* endif */ - break; + ccode = stsch( irq, p_schib); - case 0x42: + if ( !ccode ) + { + /* + * ... just being curious we check for non I/O subchannels + */ + if ( p_schib->pmcw.st ) + { + printk( "Subchannel %04X reports " + "non-I/O subchannel type %04X\n", + irq, + p_schib->pmcw.st); - ps->cu_type = 0x3424; + if ( ioinfo[irq] != INVALID_STORAGE_AREA ) + ioinfo[irq]->ui.flags.oper = 0; - break; + } /* endif */ - case 0x44: + if ( p_schib->pmcw.dnv ) + { + if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + { - ps->cu_type = 0x9348; + if ( !init_IRQ_complete ) + { + ioinfo[irq] = + (ioinfo_t *)alloc_bootmem( sizeof(ioinfo_t)); + } + else + { + ioinfo[irq] = + (ioinfo_t *)kmalloc( sizeof(ioinfo_t), + GFP_KERNEL ); - break; + } /* endif */ - default: + memset( ioinfo[irq], '\0', sizeof( ioinfo_t)); + memcpy( &ioinfo[irq]->schib, + &init_schib, + sizeof( schib_t)); + ioinfo[irq]->irq_desc.status = IRQ_DISABLED; + ioinfo[irq]->irq_desc.handler = &no_irq_type; - error = 1; + /* + * We have to insert the new ioinfo element + * into the linked list, either at its head, + * its tail or insert it. + */ + if ( ioinfo_head == NULL ) /* first element */ + { + ioinfo_head = ioinfo[irq]; + ioinfo_tail = ioinfo[irq]; + } + else if ( irq < ioinfo_head->irq ) /* new head */ + { + ioinfo[irq]->next = ioinfo_head; + ioinfo_head->prev = ioinfo[irq]; + ioinfo_head = ioinfo[irq]; + } + else if ( irq > ioinfo_tail->irq ) /* new tail */ + { + ioinfo_tail->next = ioinfo[irq]; + ioinfo[irq]->prev = ioinfo_tail; + ioinfo_tail = ioinfo[irq]; + } + else /* insert element */ + { + ioinfo_t *pi = ioinfo_head; + do + { + if ( irq < pi->next->irq ) + { + ioinfo[irq]->next = pi->next; + ioinfo[irq]->prev = pi; + pi->next->prev = ioinfo[irq]; + pi->next = ioinfo[irq]; break; - } /* endswitch */ - - break; + } /* endif */ - default: + pi = pi->next; - error = 1; + } while ( 1 ); - break; + } /* endif */ - } /* endswitch */ + } /* endif */ - if ( error ) - {printk( "DIAG X'210' for device %04X returned (cc = %d): vdev class : %02X, " - "vdev type : %04X \n ... rdev class : %02X, rdev type : %04X, rdev model: %02X\n", - devno, - ccode, - diag_data.vrdcvcla, - diag_data.vrdcvtyp, - diag_data.vrdcrccl, - diag_data.vrdccrty, - diag_data.vrdccrmd ); + // initialize some values ... + ioinfo[irq]->ui.flags.pgid_supp = 1; - } /* endif */ + ioinfo[irq]->opm = ioinfo[irq]->schib.pmcw.pim + & ioinfo[irq]->schib.pmcw.pam + & ioinfo[irq]->schib.pmcw.pom; -} + printk( "Detected device %04X on subchannel %04X" + " - PIM = %02X, PAM = %02X, POM = %02X\n", + ioinfo[irq]->schib.pmcw.dev, + irq, + ioinfo[irq]->schib.pmcw.pim, + ioinfo[irq]->schib.pmcw.pam, + ioinfo[irq]->schib.pmcw.pom); /* - * This routine returns the characteristics for the device - * specified. Some old devices might not provide the necessary - * command code information during SenseID processing. In this - * case the function returns -EINVAL. Otherwise the function - * allocates a decice specific data buffer and provides the - * device characteristics together with the buffer size. Its - * the callers responability to release the kernel memory if - * not longer needed. In case of persistent I/O problems -EBUSY - * is returned. - * - * The function may be called enabled or disabled. However, the - * caller must have locked the irq it is requesting data for. - * - * Note : It would have been nice to collect this information - * during init_IRQ() processing but this is not possible - * - * a) without statically pre-allocation fixed size buffers - * as virtual memory management isn't available yet. - * - * b) without unnecessarily increase system startup by - * evaluating devices eventually not used at all. + * initialize ioinfo structure + */ + ioinfo[irq]->irq = irq; + ioinfo[irq]->nopfunc = NULL; + ioinfo[irq]->ui.flags.busy = 0; + ioinfo[irq]->ui.flags.ready = 0; + ioinfo[irq]->ui.flags.dval = 1; + ioinfo[irq]->devstat.intparm = 0; + ioinfo[irq]->devstat.devno = ioinfo[irq]->schib.pmcw.dev; + ioinfo[irq]->devno = ioinfo[irq]->schib.pmcw.dev; + + /* + * We should have at least one CHPID ... */ -int read_dev_chars( int irq, void **buffer, int length ) + if ( ioinfo[irq]->opm ) { - unsigned int flags; - ccw1_t *rdc_ccw; - devstat_t devstat; - char *rdc_buf; - int devflag; - - int ret = 0; - int emulated = 0; - int retry = 5; - - if ( !buffer || !length ) + /* + * We now have to initially ... + * ... set "interruption sublass" + * ... enable "concurrent sense" + * ... enable "multipath mode" if more than one + * CHPID is available. This is done regardless + * whether multiple paths are available for us. + * + * Note : we don't enable the device here, this is temporarily + * done during device sensing below. + */ + ioinfo[irq]->schib.pmcw.isc = 3; /* could be smth. else */ + ioinfo[irq]->schib.pmcw.csense = 1; /* concurrent sense */ + ioinfo[irq]->schib.pmcw.ena = enable; + ioinfo[irq]->schib.pmcw.intparm = + ioinfo[irq]->schib.pmcw.dev; + + if ( ( ioinfo[irq]->opm != 0x80 ) + && ( ioinfo[irq]->opm != 0x40 ) + && ( ioinfo[irq]->opm != 0x20 ) + && ( ioinfo[irq]->opm != 0x10 ) + && ( ioinfo[irq]->opm != 0x08 ) + && ( ioinfo[irq]->opm != 0x04 ) + && ( ioinfo[irq]->opm != 0x02 ) + && ( ioinfo[irq]->opm != 0x01 ) ) { - return( -EINVAL ); + ioinfo[irq]->schib.pmcw.mp = 1; /* multipath mode */ } /* endif */ - if ( (irq > highest_subchannel) || (irq < 0 ) ) - { - return( -ENODEV ); + retry = 5; - } - else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + do { - return( -ENODEV); - } + ccode2 = msch_err( irq, &ioinfo[irq]->schib); - if ( ioinfo[irq]->ui.flags.oper == 0 ) - { - return( -ENODEV ); + switch (ccode2) { + case 0: // successful completion + // + // concurrent sense facility available ... + // + ioinfo[irq]->ui.flags.oper = 1; + ioinfo[irq]->ui.flags.consns = 1; + ret = 0; + break; - } /* endif */ + case 1: // status pending + // + // How can we have a pending status as + // device is disabled for interrupts ? + // Anyway, process it ... + // + ioinfo[irq]->ui.flags.s_pend = 1; + s390_process_IRQ( irq); + ioinfo[irq]->ui.flags.s_pend = 0; + retry--; + ret = -EIO; + break; + case 2: // busy /* - * Before playing around with irq locks we should assure - * running disabled on (just) our CPU. Sync. I/O requests - * also require to run disabled. - * - * Note : as no global lock is required, we must not use - * cli(), but __cli() instead. + * we mark it not-oper as we can't + * properly operate it ! */ - __save_flags(flags); - __cli(); + ioinfo[irq]->ui.flags.oper = 0; + tod_wait( 100); /* allow for recovery */ + retry--; + ret = -EBUSY; + break; - rdc_ccw = &ioinfo[irq]->senseccw; + case 3: // not operational + ioinfo[irq]->ui.flags.oper = 0; + retry = 0; + ret = -ENODEV; + break; - if ( !ioinfo[irq]->ui.flags.ready ) - { - ret = request_irq( irq, - init_IRQ_handler, - 0, "RDC", &devstat ); + default: +#define PGMCHK_OPERAND_EXC 0x15 - if ( !ret ) + if ( (ccode2 & PGMCHK_OPERAND_EXC) == PGMCHK_OPERAND_EXC ) { - emulated = 1; + /* + * re-issue the modify subchannel without trying to + * enable the concurrent sense facility + */ + ioinfo[irq]->schib.pmcw.csense = 0; - } /* endif */ - - } /* endif */ + ccode2 = msch_err( irq, &ioinfo[irq]->schib); - if ( !ret ) - { - if ( ! *buffer ) + if ( ccode2 != 0 ) { - rdc_buf = kmalloc( length, GFP_KERNEL); + printk( " ... msch() (2) failed with CC = %X\n", + ccode2 ); + ioinfo[irq]->ui.flags.oper = 0; + ret = -EIO; } else { - rdc_buf = *buffer; + ioinfo[irq]->ui.flags.oper = 1; + ioinfo[irq]->ui.flags.consns = 0; + ret = 0; } /* endif */ - - if ( !rdc_buf ) - { - ret = -ENOMEM; } else { - do - { - rdc_ccw->cmd_code = CCW_CMD_RDC; - rdc_ccw->cda = (char *)virt_to_phys( rdc_buf ); - rdc_ccw->count = length; - rdc_ccw->flags = CCW_FLAG_SLI; - - ret = s390_start_IO( irq, - rdc_ccw, - 0x00524443, // RDC - 0, // n/a - DOIO_WAIT_FOR_INTERRUPT ); - retry--; - devflag = ((devstat_t *)(ioinfo[irq]->irq_desc.action->dev_id))->flag; - - } while ( ( retry ) - && ( ret || (devflag & DEVSTAT_STATUS_PENDING) ) ); + printk( " ... msch() (1) failed with CC = %X\n", + ccode2); + ioinfo[irq]->ui.flags.oper = 0; + ret = -EIO; } /* endif */ - if ( !retry ) - { - ret = -EBUSY; + retry = 0; + break; - } /* endif */ + } /* endswitch */ - __restore_flags(flags); + } while ( ccode2 && retry ); - /* - * on success we update the user input parms - */ - if ( !ret ) + if ( (ccode2 != 0) && (ccode2 != 3) && (!retry) ) { - *buffer = rdc_buf; + printk( " ... msch() retry count for " + "subchannel %04X exceeded, CC = %d\n", + irq, + ccode2); } /* endif */ + } + else + { + /* no path available ... */ + ioinfo[irq]->ui.flags.oper = 0; + ret = -ENODEV; - if ( emulated ) + } /* endif */ + } + else { - free_irq( irq, &devstat); + ret = -ENODEV; } /* endif */ + } + else + { + + ret = -ENXIO; } /* endif */ @@ -2785,19 +4398,38 @@ } /* - * Read Configuration data + * s390_SenseID + * + * Try to obtain the 'control unit'/'device type' information + * associated with the subchannel. + * + * The function is primarily meant to be called without irq + * action handler in place. However, it also allows for + * use with an action handler in place. If there is already + * an action handler registered assure it can handle the + * s390_SenseID() related device interrupts - interruption + * parameter used is 0x00E2C9C4 ( SID ). */ -int read_conf_data( int irq, void **buffer, int *length ) +int s390_SenseID( int irq, senseid_t *sid, __u8 lpm ) { - int found = 0; - int ciw_cnt = 0; - unsigned int flags; + ccw1_t sense_ccw[2]; /* ccw area for SenseID command */ + senseid_t isid; /* internal sid */ + devstat_t devstat; /* required by request_irq() */ + __u8 pathmask; /* calulate path mask */ + __u8 domask; /* path mask to use */ + int inlreq; /* inline request_irq() */ + int irq_ret; /* return code */ + devstat_t *pdevstat; /* ptr to devstat in use */ + int retry; /* retry count */ + int io_retry; /* retry indicator */ - int ret = 0; + senseid_t *psid = sid;/* start with the external buffer */ + int sbuffer = 0; /* switch SID data buffer */ if ( (irq > highest_subchannel) || (irq < 0 ) ) { return( -ENODEV ); + } else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) { @@ -2811,686 +4443,720 @@ } /* endif */ - /* - * scan for RCD command in extended SenseID data - */ - for ( ; (found == 0) && (ciw_cnt < 62); ciw_cnt++ ) - { - if ( ioinfo[irq]->senseid.ciw[ciw_cnt].ct == CIW_TYPE_RCD ) - { - found = 1; - break; - } /* endif */ - - } /* endfor */ - - if ( found ) - { - ccw1_t *rcd_ccw = &ioinfo[irq]->senseccw; - devstat_t devstat; - char *rcd_buf; - int devflag; - - int emulated = 0; - int retry = 5; - - __save_flags(flags); - __cli(); - if ( !ioinfo[irq]->ui.flags.ready ) { - ret = request_irq( irq, - init_IRQ_handler, - 0, "RCD", &devstat ); - if ( !ret ) - { - emulated = 1; - - } /* endif */ - - } /* endif */ - - if ( !ret ) - { - rcd_buf = kmalloc( ioinfo[irq]->senseid.ciw[ciw_cnt].count, - GFP_KERNEL); - - do - { - rcd_ccw->cmd_code = ioinfo[irq]->senseid.ciw[ciw_cnt].cmd; - rcd_ccw->cda = (char *)virt_to_phys( rcd_buf ); - rcd_ccw->count = ioinfo[irq]->senseid.ciw[ciw_cnt].count; - rcd_ccw->flags = CCW_FLAG_SLI; - - ret = s390_start_IO( irq, - rcd_ccw, - 0x00524344, // == RCD - 0, // n/a - DOIO_WAIT_FOR_INTERRUPT ); - - retry--; - - devflag = ((devstat_t *)(ioinfo[irq]->irq_desc.action->dev_id))->flag; - - } while ( ( retry ) - && ( ret || (devflag & DEVSTAT_STATUS_PENDING) ) ); - - if ( !retry ) - ret = -EBUSY; - - __restore_flags(flags); - - } /* endif */ + pdevstat = &devstat; /* - * on success we update the user input parms + * Perform SENSE ID command processing. We have to request device + * ownership and provide a dummy I/O handler. We issue sync. I/O + * requests and evaluate the devstat area on return therefore + * we don't need a real I/O handler in place. */ - if ( !ret ) - { - *length = ioinfo[irq]->senseid.ciw[ciw_cnt].count; - *buffer = rcd_buf; - - } /* endif */ + irq_ret = request_irq( irq, init_IRQ_handler, 0, "SID", &devstat); - if ( emulated ) - free_irq( irq, &devstat); + if ( irq_ret == 0 ) + inlreq = 1; } else { - ret = -EINVAL; + inlreq = 0; + irq_ret = 0; + pdevstat = ioinfo[irq]->irq_desc.action->dev_id; } /* endif */ - return( ret ); - -} - -int get_dev_info( int irq, dev_info_t *pdi) + if ( irq_ret == 0 ) { - return( get_dev_info_by_irq( irq, pdi) ); -} + int i; + s390irq_spin_lock( irq); -static int __inline__ get_next_available_irq( ioinfo_t *pi) + // more than one path installed ? + if ( ioinfo[irq]->schib.pmcw.pim != 0x80 ) { - int ret_val; - - while ( TRUE ) - { - if ( pi->ui.flags.oper ) - { - ret_val = pi->irq; - break; + sense_ccw[0].cmd_code = CCW_CMD_SUSPEND_RECONN; + sense_ccw[0].cda = 0; + sense_ccw[0].count = 0; + sense_ccw[0].flags = CCW_FLAG_SLI | CCW_FLAG_CC; + + sense_ccw[1].cmd_code = CCW_CMD_SENSE_ID; + sense_ccw[1].cda = (char *)virt_to_phys( psid ); + sense_ccw[1].count = sizeof( senseid_t); + sense_ccw[1].flags = CCW_FLAG_SLI; } else { - pi = pi->next; - - // - // leave at end of list unconditionally - // - if ( pi == NULL ) - { - ret_val = -ENODEV; - break; - } + sense_ccw[0].cmd_code = CCW_CMD_SENSE_ID; + sense_ccw[0].cda = (char *)virt_to_phys( psid ); + sense_ccw[0].count = sizeof( senseid_t); + sense_ccw[0].flags = CCW_FLAG_SLI; } /* endif */ - } /* endwhile */ - - return ret_val; -} + for ( i = 0 ; (i < 8) ; i++ ) + { + pathmask = 0x80 >> i; + domask = ioinfo[irq]->opm & pathmask; -int get_irq_first( void ) -{ - int ret_irq; + if ( lpm ) + domask &= lpm; - if ( ioinfo_head ) - { - if ( ioinfo_head->ui.flags.oper ) - { - ret_irq = ioinfo_head->irq; - } - else if ( ioinfo_head->next ) + if ( domask ) { - ret_irq = get_next_available_irq( ioinfo_head->next ); + psid->cu_type = 0xFFFF; /* initialize fields ... */ + psid->cu_model = 0; + psid->dev_type = 0; + psid->dev_model = 0; - } - else - { - ret_irq = -ENODEV; + retry = 5; /* retry count */ + io_retry = 1; /* enable retries */ - } /* endif */ - } - else + /* + * We now issue a SenseID request. In case of BUSY, + * STATUS PENDING or non-CMD_REJECT error conditions + * we run simple retries. + */ + do { - ret_irq = -ENODEV; - - } /* endif */ + memset( pdevstat, '\0', sizeof( devstat_t) ); - return ret_irq; -} + irq_ret = s390_start_IO( irq, + sense_ccw, + 0x00E2C9C4, // == SID + domask, + DOIO_WAIT_FOR_INTERRUPT + | DOIO_TIMEOUT + | DOIO_VALID_LPM + | DOIO_DONT_CALL_INTHDLR ); -int get_irq_next( int irq ) -{ - int ret_irq; + // + // The OSA_E FE card possibly causes -ETIMEDOUT + // conditions, as the SenseID may stay start + // pending. This will cause start_IO() to finally + // halt the operation we should retry. If the halt + // fails this may cause -EBUSY we simply retry + // and eventually clean up with free_irq(). + // - if ( ioinfo[irq] != INVALID_STORAGE_AREA ) + if ( psid->cu_type == 0xFFFF ) { - if ( ioinfo[irq]->next ) + if ( pdevstat->flag & DEVSTAT_STATUS_PENDING ) { - if ( ioinfo[irq]->next->ui.flags.oper ) +#ifdef CONFIG_DEBUG_IO + printk( "SenseID : device %04X on " + "Subchannel %04X " + "reports pending status, " + "retry : %d\n", + ioinfo[irq]->schib.pmcw.dev, + irq, + retry); +#endif + } /* endif */ + + if ( pdevstat->flag & DEVSTAT_FLAG_SENSE_AVAIL ) { - ret_irq = ioinfo[irq]->next->irq; - } - else + /* + * if the device doesn't support the SenseID + * command further retries wouldn't help ... + */ + if ( pdevstat->ii.sense.data[0] + & (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ) ) { - ret_irq = get_next_available_irq( ioinfo[irq]->next ); - - } /* endif */ +#ifdef CONFIG_DEBUG_IO + printk( "SenseID : device %04X on " + "Subchannel %04X " + "reports cmd reject or " + "intervention required\n", + ioinfo[irq]->schib.pmcw.dev, + irq); +#endif + io_retry = 1; } +#ifdef CONFIG_DEBUG_IO else { - ret_irq = -ENODEV; + printk( "SenseID : UC on " + "dev %04X, " + "retry %d, " + "lpum %02X, " + "cnt %02d, " + "sns :" + " %02X%02X%02X%02X " + "%02X%02X%02X%02X ...\n", + ioinfo[irq]->schib.pmcw.dev, + retry, + pdevstat->lpum, + pdevstat->scnt, + pdevstat->ii.sense.data[0], + pdevstat->ii.sense.data[1], + pdevstat->ii.sense.data[2], + pdevstat->ii.sense.data[3], + pdevstat->ii.sense.data[4], + pdevstat->ii.sense.data[5], + pdevstat->ii.sense.data[6], + pdevstat->ii.sense.data[7]); } /* endif */ +#endif } - else + else if ( ( pdevstat->flag & DEVSTAT_NOT_OPER ) + || ( irq_ret == -ENODEV ) ) { - ret_irq = -EINVAL; +#ifdef CONFIG_DEBUG_IO + printk( "SenseID : path %02X for " + "device %04X on " + "subchannel %04X " + "is 'not operational'\n", + domask, + ioinfo[irq]->schib.pmcw.dev, + irq); +#endif - } /* endif */ + io_retry = 0; + ioinfo[irq]->opm &= ~domask; - return ret_irq; } - -int get_dev_info_by_irq( int irq, dev_info_t *pdi) -{ - - if ( irq > highest_subchannel || irq < 0 ) - { - return -ENODEV; - } - else if ( pdi == NULL ) - { - return -EINVAL; +#ifdef CONFIG_DEBUG_IO + else if ( (pdevstat->flag != + ( DEVSTAT_START_FUNCTION + | DEVSTAT_FINAL_STATUS ) ) + && !(pdevstat->flag & + DEVSTAT_STATUS_PENDING ) ) + { + printk( "SenseID : start_IO() for " + "device %04X on " + "subchannel %04X " + "returns %d, retry %d, " + "status %04X\n", + ioinfo[irq]->schib.pmcw.dev, + irq, + irq_ret, + retry, + pdevstat->flag); + + } /* endif */ +#endif } - else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) + else // we got it ... { - return( -ENODEV); - } - else + if ( !sbuffer ) // switch buffers { - pdi->devno = ioinfo[irq]->schib.pmcw.dev; - pdi->irq = irq; + /* + * we report back the + * first hit only + */ + psid = &isid; - if ( ioinfo[irq]->ui.flags.oper ) + if ( ioinfo[irq]->schib.pmcw.pim != 0x80 ) { - pdi->status = 0; - memcpy( &(pdi->sid_data), - &ioinfo[irq]->senseid, - sizeof( senseid_t)); + sense_ccw[1].cda = (char *)virt_to_phys( psid ); } else { - pdi->status = DEVSTAT_NOT_OPER; - memcpy( &(pdi->sid_data), - '\0', - sizeof( senseid_t)); - pdi->sid_data.cu_type = 0xFFFF; + sense_ccw[0].cda = (char *)virt_to_phys( psid ); } /* endif */ - if ( ioinfo[irq]->ui.flags.ready ) - pdi->status |= DEVSTAT_DEVICE_OWNED; + /* + * if just the very first + * was requested to be + * sensed disable further + * scans. + */ + if ( !lpm ) + lpm = domask; - return 0; + sbuffer = 1; } /* endif */ -} - - -int get_dev_info_by_devno( unsigned int devno, dev_info_t *pdi) + if ( pdevstat->rescnt < (sizeof( senseid_t) - 8) ) { - int i; - int rc = -ENODEV; + ioinfo[irq]->ui.flags.esid = 1; - if ( devno > 0x0000ffff ) - { - return -ENODEV; - } - else if ( pdi == NULL ) - { - return -EINVAL; - } - else - { + } /* endif */ - for ( i=0; i <= highest_subchannel; i++ ) - { + io_retry = 0; - if ( ioinfo[i] != INVALID_STORAGE_AREA - && ioinfo[i]->schib.pmcw.dev == devno ) - { - if ( ioinfo[i]->ui.flags.oper ) - { - pdi->status = 0; - pdi->irq = i; - pdi->devno = devno; + } /* endif */ - memcpy( &(pdi->sid_data), - &ioinfo[i]->senseid, - sizeof( senseid_t)); - } - else + if ( io_retry ) { - pdi->status = DEVSTAT_NOT_OPER; - pdi->irq = i; - pdi->devno = devno; + retry--; - memcpy( &(pdi->sid_data), '\0', sizeof( senseid_t)); - pdi->sid_data.cu_type = 0xFFFF; + if ( retry == 0 ) + { + io_retry = 0; } /* endif */ - if ( ioinfo[i]->ui.flags.ready ) - pdi->status |= DEVSTAT_DEVICE_OWNED; + } /* endif */ - rc = 0; /* found */ - break; + } while ( (io_retry) ); - } /* endif */ + } /* endif - domask */ } /* endfor */ - return( rc); + s390irq_spin_unlock( irq); - } /* endif */ + /* + * If we installed the irq action handler we have to + * release it too. + */ + if ( inlreq ) + free_irq( irq, pdevstat); -} + /* + * if running under VM check there ... perhaps we should do + * only if we suffered a command reject, but it doesn't harm + */ + if ( ( sid->cu_type == 0xFFFF ) + && ( MACHINE_IS_VM ) ) + { + VM_virtual_device_info( ioinfo[irq]->schib.pmcw.dev, + sid ); + } /* endif */ -int get_irq_by_devno( unsigned int devno ) + if ( sid->cu_type == 0xFFFF ) { - int i; - int rc = -1; + /* + * SenseID CU-type of 0xffff indicates that no device + * information could be retrieved (pre-init value). + * + * If we can't couldn't identify the device type we + * consider the device "not operational". + */ +#ifdef CONFIG_DEBUG_IO + printk( "SenseID : unknown device %04X on subchannel %04X\n", + ioinfo[irq]->schib.pmcw.dev, + irq); +#endif + ioinfo[irq]->ui.flags.oper = 0; - if ( devno <= 0x0000ffff ) + } /* endif */ + + /* + * Issue device info message if unit was operational . + */ + if ( ioinfo[irq]->ui.flags.oper ) { - for ( i=0; i <= highest_subchannel; i++ ) + if ( sid->dev_type != 0 ) { - if ( (ioinfo[i] != INVALID_STORAGE_AREA ) - && (ioinfo[i]->schib.pmcw.dev == devno) - && (ioinfo[i]->schib.pmcw.dnv == 1 ) ) + printk( "SenseID : device %04X reports: CU Type/Mod = %04X/%02X," + " Dev Type/Mod = %04X/%02X\n", + ioinfo[irq]->schib.pmcw.dev, + sid->cu_type, + sid->cu_model, + sid->dev_type, + sid->dev_model); + } + else { - rc = i; - break; + printk( "SenseID : device %04X reports:" + " Dev Type/Mod = %04X/%02X\n", + ioinfo[irq]->schib.pmcw.dev, + sid->cu_type, + sid->cu_model); } /* endif */ - } /* endfor */ - } /* endif */ - return( rc); -} - -unsigned int get_devno_by_irq( int irq ) -{ - - if ( ( irq > highest_subchannel ) - || ( irq < 0 ) - || ( ioinfo[irq] == INVALID_STORAGE_AREA ) ) - { - return -1; + if ( ioinfo[irq]->ui.flags.oper ) + irq_ret = 0; + else + irq_ret = -ENODEV; } /* endif */ - /* - * we don't need to check for the device be operational - * as the initial STSCH will always present the device - * number defined by the IOCDS regardless of the device - * existing or not. However, there could be subchannels - * defined who's device number isn't valid ... - */ - if ( ioinfo[irq]->schib.pmcw.dnv ) - return( ioinfo[irq]->schib.pmcw.dev ); - else - return -1; + return( irq_ret ); } -/* - * s390_device_recognition - * - * Used for system wide device recognition. Issues the device - * independant SenseID command to obtain info the device type. - * - */ -void s390_device_recognition( void) +static int __inline__ s390_SetMultiPath( int irq ) { + int cc; - int irq = 0; /* let's start with subchannel 0 ... */ + cc = stsch( irq, &ioinfo[irq]->schib ); - do - { - /* - * We issue the SenseID command on I/O subchannels we think are - * operational only. - */ - if ( ( ioinfo[irq] != INVALID_STORAGE_AREA ) - && ( ioinfo[irq]->schib.pmcw.st == 0 ) - && ( ioinfo[irq]->ui.flags.oper == 1 ) ) + if ( !cc ) { - s390_SenseID( irq, &ioinfo[irq]->senseid ); + ioinfo[irq]->schib.pmcw.mp = 1; /* multipath mode */ - } /* endif */ - - irq ++; + cc = msch( irq, &ioinfo[irq]->schib ); - } while ( irq <= highest_subchannel ); + } /* endif */ + return( cc); } - /* - * s390_search_devices + * Device Path Verification * - * Determines all subchannels available to the system. + * Path verification is accomplished by checking which paths (CHPIDs) are + * available. Further, a path group ID is set, if possible in multipath + * mode, otherwise in single path mode. * */ -void s390_process_subchannels( void) +int s390_DevicePathVerification( int irq, __u8 usermask ) { - int isValid; - int irq = 0; /* Evaluate all subchannels starting with 0 ... */ +#if 1 + int ccode; + __u8 pathmask; + __u8 domask; - do - { - isValid = s390_validate_subchannel( irq); + int ret = 0; - irq++; + if ( ioinfo[irq]->ui.flags.pgid_supp == 0 ) + { + return( 0); // just exit ... - } while ( isValid && irq < __MAX_SUBCHANNELS ); + } /* endif */ - highest_subchannel = --irq; + ccode = stsch( irq, &(ioinfo[irq]->schib) ); - printk( "\nHighest subchannel number detected: %u\n", - highest_subchannel); + if ( ccode ) + { + ret = -ENODEV; } - + else if ( ioinfo[irq]->schib.pmcw.pim == 0x80 ) + { /* - * s390_validate_subchannel() - * - * Process the subchannel for the requested irq. Returns 1 for valid - * subchannels, otherwise 0. + * no error, just not required for single path only devices */ -int s390_validate_subchannel( int irq ) + ioinfo[irq]->ui.flags.pgid_supp = 0; + ret = 0; + } + else { + int i; + pgid_t pgid; + __u8 dev_path; + int first = 1; + + ioinfo[irq]->opm = ioinfo[irq]->schib.pmcw.pim + & ioinfo[irq]->schib.pmcw.pam + & ioinfo[irq]->schib.pmcw.pom; - int retry; /* retry count for status pending conditions */ - int ccode; /* condition code for stsch() only */ - int ccode2; /* condition code for other I/O routines */ - schib_t *p_schib; - - /* - * The first subchannel that is not-operational (ccode==3) - * indicates that there aren't any more devices available. - */ - if ( ( init_IRQ_complete ) - && ( ioinfo[irq] != INVALID_STORAGE_AREA ) ) + if ( usermask ) { - p_schib = &ioinfo[irq]->schib; + dev_path = usermask; } else { - p_schib = &init_schib; + dev_path = ioinfo[irq]->opm; } /* endif */ - ccode = stsch( irq, p_schib); - - if ( ccode == 0) - { /* - * ... just being curious we check for non I/O subchannels + * let's build a path group ID if we don't have one yet */ - if ( p_schib->pmcw.st ) + if ( ioinfo[irq]->ui.flags.pgid == 0) { - printk( "Subchannel %04X reports " - "non-I/O subchannel type %04X\n", - irq, - p_schib->pmcw.st); + ioinfo[irq]->pgid.cpu_addr = *(__u16 *)__LC_CPUADDR; + ioinfo[irq]->pgid.cpu_id = ((cpuid_t *)__LC_CPUID)->ident; + ioinfo[irq]->pgid.cpu_model = ((cpuid_t *)__LC_CPUID)->machine; + ioinfo[irq]->pgid.tod_high = *(__u32 *)&irq_IPL_TOD; - if ( ioinfo[irq] != INVALID_STORAGE_AREA ) - ioinfo[irq]->ui.flags.oper = 0; + ioinfo[irq]->ui.flags.pgid = 1; } /* endif */ - if ( p_schib->pmcw.dnv ) - { - if ( ioinfo[irq] == INVALID_STORAGE_AREA ) - { + memcpy( &pgid, &ioinfo[irq]->pgid, sizeof(pgid_t)); - if ( !init_IRQ_complete ) + for ( i = 0; i < 8 && !ret ; i++) { - ioinfo[irq] = - (ioinfo_t *)alloc_bootmem( sizeof(ioinfo_t)); - } - else + pathmask = 0x80 >> i; + + domask = dev_path & pathmask; + + if ( domask ) { - ioinfo[irq] = - (ioinfo_t *)kmalloc( sizeof(ioinfo_t), - GFP_KERNEL ); + ret = s390_SetPGID( irq, domask, &pgid ); - } /* endif */ + /* + * For the *first* path we are prepared + * for recovery + * + * - If we fail setting the PGID we assume its + * using a different PGID already (VM) we + * try to sense. + */ + if ( ret == -EOPNOTSUPP && first ) + { + *(int *)&pgid = 0; - memset( ioinfo[irq], '\0', sizeof( ioinfo_t)); - memcpy( &ioinfo[irq]->schib, - &init_schib, - sizeof( schib_t)); - ioinfo[irq]->irq_desc.status = IRQ_DISABLED; - ioinfo[irq]->irq_desc.handler = &no_irq_type; + ret = s390_SensePGID( irq, domask, &pgid); + first = 0; + if ( ret == 0 ) + { /* - * We have to insert the new ioinfo element - * into the linked list, either at its head, - * its tail or insert it. + * Check whether we retrieved + * a reasonable PGID ... */ - if ( ioinfo_head == NULL ) /* first element */ + if ( pgid.inf.ps.state1 == SNID_STATE1_GROUPED ) { - ioinfo_head = ioinfo[irq]; - ioinfo_tail = ioinfo[irq]; + memcpy( &(ioinfo[irq]->pgid), + &pgid, + sizeof(pgid_t) ); } - else if (irq < ioinfo_head->irq) /* new head */ + else // ungrouped or garbage ... { - ioinfo[irq]->next = ioinfo_head; - ioinfo_head->prev = ioinfo[irq]; - ioinfo_head = ioinfo[irq]; + ret = -EOPNOTSUPP; + + } /* endif */ } - else if (irq > ioinfo_tail->irq) /* new tail */ + else { - ioinfo_tail->next = ioinfo[irq]; - ioinfo[irq]->prev = ioinfo_tail; - ioinfo_tail = ioinfo[irq]; + ioinfo[irq]->ui.flags.pgid_supp = 0; + +#ifdef CONFIG_DEBUG_IO + printk( "PathVerification(%04X) " + "- Device %04X doesn't " + " support path grouping\n", + irq, + ioinfo[irq]->schib.pmcw.dev); +#endif + + } /* endif */ } - else /* insert element */ + else if ( ret ) { - ioinfo_t *pi = ioinfo_head; - do - { - if ( irq < pi->next->irq ) - { - ioinfo[irq]->next = pi->next; - ioinfo[irq]->prev = pi; - pi->next->prev = ioinfo[irq]; - pi->next = ioinfo[irq]; - break; +#ifdef CONFIG_DEBUG_IO + printk( "PathVerification(%04X) " + "- Device %04X doesn't " + " support path grouping\n", + irq, + ioinfo[irq]->schib.pmcw.dev); - } /* endif */ +#endif - pi = pi->next; + ioinfo[irq]->ui.flags.pgid_supp = 0; - } while ( 1 ); + } /* endif */ } /* endif */ + } /* endfor */ + } /* endif */ - printk( "Detected device %04X on subchannel %04X" - " - PIM = %02X, PAM = %02X, POM = %02X\n", - ioinfo[irq]->schib.pmcw.dev, - irq, - ioinfo[irq]->schib.pmcw.pim, - ioinfo[irq]->schib.pmcw.pam, - ioinfo[irq]->schib.pmcw.pom); + return ret; +#else + return 0; +#endif +} /* - * We now have to initially ... - * ... set "interruption sublass" - * ... enable "concurrent sense" - * ... enable "multipath mode" if more than - * one CHPID is available + * s390_SetPGID + * + * Set Path Group ID * - * Note : we don't enable the device here, this is temporarily - * done during device sensing below. */ - ioinfo[irq]->schib.pmcw.isc = 3; /* could be smth. else */ - ioinfo[irq]->schib.pmcw.csense = 1; /* concurrent sense */ - ioinfo[irq]->schib.pmcw.ena = 0; /* force disable it */ - ioinfo[irq]->schib.pmcw.intparm = - ioinfo[irq]->schib.pmcw.dev; +int s390_SetPGID( int irq, __u8 lpm, pgid_t *pgid ) + { + ccw1_t spid_ccw[2]; /* ccw area for SPID command */ + devstat_t devstat; /* required by request_irq() */ + devstat_t *pdevstat = &devstat; + + int irq_ret = 0; /* return code */ + int retry = 5; /* retry count */ + int inlreq = 0; /* inline request_irq() */ + int mpath = 1; /* try multi-path first */ + + if ( (irq > highest_subchannel) || (irq < 0 ) ) + { + return( -ENODEV ); - if ( ( ioinfo[irq]->schib.pmcw.pim != 0 ) - && ( ioinfo[irq]->schib.pmcw.pim != 0x80 ) ) + } + else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) { - ioinfo[irq]->schib.pmcw.mp = 1; /* multipath mode */ + return( -ENODEV); - } /* endif */ + } /* endif */ - /* - * initialize ioinfo structure - */ - ioinfo[irq]->irq = irq; - ioinfo[irq]->ui.flags.busy = 0; - ioinfo[irq]->ui.flags.ready = 0; - ioinfo[irq]->ui.flags.oper = 1; - ioinfo[irq]->devstat.intparm = 0; - ioinfo[irq]->devstat.devno = ioinfo[irq]->schib.pmcw.dev; + if ( ioinfo[irq]->ui.flags.oper == 0 ) + { + return( -ENODEV ); - retry = 5; + } /* endif */ - do - { - ccode2 = msch_err( irq, &ioinfo[irq]->schib); + if ( !ioinfo[irq]->ui.flags.ready ) + { + /* + * Perform SENSE ID command processing. We have to request device + * ownership and provide a dummy I/O handler. We issue sync. I/O + * requests and evaluate the devstat area on return therefore + * we don't need a real I/O handler in place. + */ + irq_ret = request_irq( irq, + init_IRQ_handler, + 0, + "SPID", + pdevstat); - switch (ccode2) { - case 0: // successful completion - // - // concurrent sense facility available ... - // - ioinfo[irq]->ui.flags.consns = 1; - break; + if ( irq_ret == 0 ) + inlreq = 1; + } + else + { + pdevstat = ioinfo[irq]->irq_desc.action->dev_id; - case 1: // status pending - // - // How can we have a pending status as device is - // disabled for interrupts ? Anyway, clear it ... - // - tsch( irq, &(ioinfo[irq]->devstat.ii.irb) ); - retry--; - break; + } /* endif */ - case 2: // busy - retry--; - break; + if ( irq_ret == 0 ) + { + s390irq_spin_lock( irq); - case 3: // not operational - ioinfo[irq]->ui.flags.oper = 0; - retry = 0; - break; + spid_ccw[0].cmd_code = 0x5B; /* suspend multipath reconnect */ + spid_ccw[0].cda = 0; + spid_ccw[0].count = 0; + spid_ccw[0].flags = CCW_FLAG_SLI | CCW_FLAG_CC; + + spid_ccw[1].cmd_code = CCW_CMD_SET_PGID; + spid_ccw[1].cda = (char *)virt_to_phys( pgid ); + spid_ccw[1].count = sizeof( pgid_t); + spid_ccw[1].flags = CCW_FLAG_SLI; - default: -#define PGMCHK_OPERAND_EXC 0x15 + pgid->inf.fc = SPID_FUNC_MULTI_PATH | SPID_FUNC_ESTABLISH; - if ( (ccode2 & PGMCHK_OPERAND_EXC) == PGMCHK_OPERAND_EXC ) - { /* - * re-issue the modify subchannel without trying to - * enable the concurrent sense facility + * We now issue a SenseID request. In case of BUSY + * or STATUS PENDING conditions we retry 5 times. */ - ioinfo[irq]->schib.pmcw.csense = 0; + do + { + memset( pdevstat, '\0', sizeof( devstat_t) ); + + irq_ret = s390_start_IO( irq, + spid_ccw, + 0xE2D7C9C4, // == SPID + lpm, // n/a + DOIO_WAIT_FOR_INTERRUPT + | DOIO_VALID_LPM + | DOIO_DONT_CALL_INTHDLR ); - ccode2 = msch_err( irq, &ioinfo[irq]->schib); + if ( !irq_ret ) + { + if ( pdevstat->flag & DEVSTAT_STATUS_PENDING ) + { +#ifdef CONFIG_DEBUG_IO + printk( "SPID - Device %04X " + "on Subchannel %04X " + "reports pending status, " + "retry : %d\n", + ioinfo[irq]->schib.pmcw.dev, + irq, + retry); +#endif + } /* endif */ - if ( ccode2 != 0 ) + if ( pdevstat->flag == ( DEVSTAT_START_FUNCTION + | DEVSTAT_FINAL_STATUS ) ) { - printk( " ... modify subchannel (2) failed with CC = %X\n", - ccode2 ); - ioinfo[irq]->ui.flags.oper = 0; + retry = 0; // successfully set ... + } + else if ( pdevstat->flag & DEVSTAT_FLAG_SENSE_AVAIL ) + { + /* + * If the device doesn't support the + * Sense Path Group ID command + * further retries wouldn't help ... + */ + if ( pdevstat->ii.sense.data[0] & SNS0_CMD_REJECT ) + { + if ( mpath ) + { + pgid->inf.fc = SPID_FUNC_SINGLE_PATH + | SPID_FUNC_ESTABLISH; + mpath = 0; + retry--; } else { - ioinfo[irq]->ui.flags.consns = 0; + irq_ret = -EOPNOTSUPP; + retry = 0; } /* endif */ } +#ifdef CONFIG_DEBUG_IO else { - printk( " ... modify subchannel (1) failed with CC = %X\n", - ccode2); - ioinfo[irq]->ui.flags.oper = 0; + printk( "SPID - device %04X," + " unit check," + " retry %d, cnt %02d," + " sns :" + " %02X%02X%02X%02X %02X%02X%02X%02X ...\n", + ioinfo[irq]->schib.pmcw.dev, + retry, + pdevstat->scnt, + pdevstat->ii.sense.data[0], + pdevstat->ii.sense.data[1], + pdevstat->ii.sense.data[2], + pdevstat->ii.sense.data[3], + pdevstat->ii.sense.data[4], + pdevstat->ii.sense.data[5], + pdevstat->ii.sense.data[6], + pdevstat->ii.sense.data[7]); } /* endif */ +#endif + } + else if ( pdevstat->flag & DEVSTAT_NOT_OPER ) + { + printk( "SPID - Device %04X " + "on Subchannel %04X " + "became 'not operational'\n", + ioinfo[irq]->schib.pmcw.dev, + irq); retry = 0; - break; - - } /* endswitch */ - } while ( ccode2 && retry ); - - if ( (ccode2 < 3) && (!retry) ) + } /* endif */ + } + else if ( irq_ret != -ENODEV ) { - printk( " ... msch() retry count for " - "subchannel %04X exceeded, CC = %d\n", - irq, - ccode2); + retry--; + } + else + { + retry = 0; } /* endif */ - } /* endif */ + } while ( retry > 0 ); - } /* endif */ + s390irq_spin_unlock( irq); /* - * indicate whether the subchannel is valid + * If we installed the irq action handler we have to + * release it too. */ - if ( ccode == 3) - return(0); - else - return(1); + if ( inlreq ) + free_irq( irq, pdevstat); + + } /* endif */ + + return( irq_ret ); } + /* - * s390_SenseID + * s390_SensePGID * - * Try to obtain the 'control unit'/'device type' information - * associated with the subchannel. + * Sense Path Group ID * - * The function is primarily meant to be called without irq - * action handler in place. However, it also allows for - * use with an action handler in place. If there is already - * an action handler registered assure it can handle the - * s390_SenseID() related device interrupts - interruption - * parameter used is 0x00E2C9C4 ( SID ). */ -int s390_SenseID( int irq, senseid_t *sid ) +int s390_SensePGID( int irq, __u8 lpm, pgid_t *pgid ) { - ccw1_t sense_ccw; /* ccw area for SenseID command */ + ccw1_t snid_ccw; /* ccw area for SNID command */ devstat_t devstat; /* required by request_irq() */ + devstat_t *pdevstat = &devstat; int irq_ret = 0; /* return code */ int retry = 5; /* retry count */ @@ -3504,6 +5170,7 @@ else if ( ioinfo[irq] == INVALID_STORAGE_AREA ) { return( -ENODEV); + } /* endif */ if ( ioinfo[irq]->ui.flags.oper == 0 ) @@ -3520,26 +5187,30 @@ * requests and evaluate the devstat area on return therefore * we don't need a real I/O handler in place. */ - irq_ret = request_irq( irq, init_IRQ_handler, 0, "SID", &devstat); + irq_ret = request_irq( irq, + init_IRQ_handler, + 0, + "SNID", + pdevstat); if ( irq_ret == 0 ) inlreq = 1; + } + else + { + pdevstat = ioinfo[irq]->irq_desc.action->dev_id; + } /* endif */ if ( irq_ret == 0 ) { s390irq_spin_lock( irq); - sense_ccw.cmd_code = CCW_CMD_SENSE_ID; - sense_ccw.cda = (char *)virt_to_phys( sid ); - sense_ccw.count = sizeof( senseid_t); - sense_ccw.flags = CCW_FLAG_SLI; - - ioinfo[irq]->senseid.cu_type = 0xFFFF; /* initialize fields ... */ - ioinfo[irq]->senseid.cu_model = 0; - ioinfo[irq]->senseid.dev_type = 0; - ioinfo[irq]->senseid.dev_model = 0; + snid_ccw.cmd_code = CCW_CMD_SENSE_PGID; + snid_ccw.cda = (char *)virt_to_phys( pgid ); + snid_ccw.count = sizeof( pgid_t); + snid_ccw.flags = CCW_FLAG_SLI; /* * We now issue a SenseID request. In case of BUSY @@ -3547,78 +5218,100 @@ */ do { - memset( &devstat, '\0', sizeof( devstat_t) ); + memset( pdevstat, '\0', sizeof( devstat_t) ); irq_ret = s390_start_IO( irq, - &sense_ccw, - 0x00E2C9C4, // == SID - 0, // n/a - DOIO_WAIT_FOR_INTERRUPT ); - - if ( sid->cu_type == 0xFFFF ) - { - if ( devstat.flag & DEVSTAT_STATUS_PENDING ) - { -#if CONFIG_DEBUG_IO - printk( "Device %04X on Subchannel %04X " - "reports pending status, retry : %d\n", - ioinfo[irq]->schib.pmcw.dev, - irq, - retry); -#endif - } /* endif */ + &snid_ccw, + 0xE2D5C9C4, // == SNID + lpm, // n/a + DOIO_WAIT_FOR_INTERRUPT + | DOIO_VALID_LPM + | DOIO_DONT_CALL_INTHDLR ); - if ( devstat.flag & DEVSTAT_FLAG_SENSE_AVAIL ) + if ( irq_ret == 0 ) + { + if ( pdevstat->flag & DEVSTAT_FLAG_SENSE_AVAIL ) { /* - * if the device doesn't support the SenseID - * command further retries wouldn't help ... + * If the device doesn't support the + * Sense Path Group ID command + * further retries wouldn't help ... */ - if ( devstat.ii.sense.data[0] == SNS0_CMD_REJECT ) + if ( pdevstat->ii.sense.data[0] & SNS0_CMD_REJECT ) { retry = 0; + irq_ret = -EOPNOTSUPP; } -#if CONFIG_DEBUG_IO else { - printk( "Device %04X," - " UC/SenseID," +#ifdef CONFIG_DEBUG_IO + printk( "SNID - device %04X," + " unit check," + " flag %04X, " " retry %d, cnt %02d," " sns :" " %02X%02X%02X%02X %02X%02X%02X%02X ...\n", ioinfo[irq]->schib.pmcw.dev, + pdevstat->flag, retry, - devstat.scnt, - devstat.ii.sense.data[0], - devstat.ii.sense.data[1], - devstat.ii.sense.data[2], - devstat.ii.sense.data[3], - devstat.ii.sense.data[4], - devstat.ii.sense.data[5], - devstat.ii.sense.data[6], - devstat.ii.sense.data[7]); + pdevstat->scnt, + pdevstat->ii.sense.data[0], + pdevstat->ii.sense.data[1], + pdevstat->ii.sense.data[2], + pdevstat->ii.sense.data[3], + pdevstat->ii.sense.data[4], + pdevstat->ii.sense.data[5], + pdevstat->ii.sense.data[6], + pdevstat->ii.sense.data[7]); - } /* endif */ #endif + retry--; + + } /* endif */ } - else if ( devstat.flag & DEVSTAT_NOT_OPER ) + else if ( pdevstat->flag & DEVSTAT_NOT_OPER ) { - printk( "Device %04X on Subchannel %04X " + printk( "SNID - Device %04X " + "on Subchannel %04X " "became 'not operational'\n", ioinfo[irq]->schib.pmcw.dev, irq); retry = 0; - } /* endif */ } - else // we got it ... + else { - retry = 0; + retry = 0; // success ... } /* endif */ + } + else if ( irq_ret != -ENODEV ) // -EIO, or -EBUSY + { +#ifdef CONFIG_DEBUG_IO + if ( pdevstat->flag & DEVSTAT_STATUS_PENDING ) + { + printk( "SNID - Device %04X " + "on Subchannel %04X " + "reports pending status, " + "retry : %d\n", + ioinfo[irq]->schib.pmcw.dev, + irq, + retry); + } /* endif */ +#endif + printk( "SNID - device %04X," + " start_io() reports rc : %d, retrying ...\n", + ioinfo[irq]->schib.pmcw.dev, + irq_ret); retry--; + } + else // -ENODEV ... + { + retry = 0; + + } /* endif */ } while ( retry > 0 ); @@ -3629,75 +5322,206 @@ * release it too. */ if ( inlreq ) - free_irq( irq, &devstat); + free_irq( irq, pdevstat); + + } /* endif */ + + return( irq_ret ); +} /* - * if running under VM check there ... perhaps we should do - * only if we suffered a command reject, but it doesn't harm + * s390_do_crw_pending + * + * Called by the machine check handler to process CRW pending + * conditions. It may be a single CRW, or CRWs may be chained. + * + * Note : we currently process CRWs for subchannel source only */ - if ( ( sid->cu_type == 0xFFFF ) - && ( MACHINE_IS_VM ) ) +void s390_do_crw_pending( crwe_t *pcrwe ) { - VM_virtual_device_info( ioinfo[irq]->schib.pmcw.dev, - sid ); - } /* endif */ + int irq; + int dev_oper = 0; + int dev_no = -1; + int lock = 0; - if ( sid->cu_type == 0xFFFF ) +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : starting ...\n"); +#endif + + while ( pcrwe != NULL ) { + switch ( pcrwe->crw.rsc ) { + case CRW_RSC_SCH : + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : source is " + "subchannel\n"); +#endif + irq = pcrwe->crw.rsid; + /* - * SenseID CU-type of 0xffff indicates that no device - * information could be retrieved (pre-init value). - * - * If we can't couldn't identify the device type we - * consider the device "not operational". + * If the device isn't known yet + * we can't lock it ... */ - printk( "Unknown device %04X on subchannel %04X\n", - ioinfo[irq]->schib.pmcw.dev, - irq); - ioinfo[irq]->ui.flags.oper = 0; + if ( ioinfo[irq] != INVALID_STORAGE_AREA ) + { + s390irq_spin_lock( irq ); + lock = 1; + + dev_oper = ioinfo[irq]->ui.flags.oper; + + if ( ioinfo[irq]->ui.flags.dval ) + dev_no = ioinfo[irq]->devno; } /* endif */ +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : subchannel validation - start ...\n"); +#endif + s390_validate_subchannel( irq, 0 ); + + if ( irq > highest_subchannel ) + highest_subchannel = irq; + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : subchannel validation - done\n"); +#endif /* - * Issue device info message if unit was operational . + * After the validate processing + * the ioinfo control block + * should be allocated ... */ - if ( ioinfo[irq]->ui.flags.oper ) + if ( lock ) { - if ( sid->dev_type != 0 ) + s390irq_spin_unlock( irq ); + + } /* endif */ + +#ifdef CONFIG_DEBUG_CRW + if ( ioinfo[irq] != INVALID_STORAGE_AREA ) { - printk( "Device %04X reports: CU Type/Mod = %04X/%02X," - " Dev Type/Mod = %04X/%02X\n", - ioinfo[irq]->schib.pmcw.dev, - sid->cu_type, - sid->cu_model, - sid->dev_type, - sid->dev_model); + printk( "do_crw_pending : ioinfo at %08X\n", + (unsigned)ioinfo[irq]); + + } /* endif */ +#endif + + if ( ioinfo[irq] != INVALID_STORAGE_AREA ) + { + if ( ioinfo[irq]->ui.flags.oper == 0 ) + { + /* + * If the device has gone + * call not oper handler + */ + if ( ( dev_oper == 1 ) + && ( ioinfo[irq]->nopfunc != NULL ) ) + { + free_irq( irq, + ioinfo[irq]->irq_desc.action->dev_id ); + ioinfo[irq]->nopfunc( irq, + DEVSTAT_DEVICE_GONE ); + + } /* endif */ } else { - printk( "Device %04X reports:" - " Dev Type/Mod = %04X/%02X\n", - ioinfo[irq]->schib.pmcw.dev, - sid->cu_type, - sid->cu_model); +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : device " + "recognition - start ...\n"); +#endif + s390_device_recognition_irq( irq ); + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : device " + "recognition - done\n"); +#endif + + /* + * the device became operational + */ + if ( dev_oper == 0 ) + { + devreg_t *pdevreg; + + pdevreg = s390_search_devreg( ioinfo[irq] ); + + if ( pdevreg != NULL ) + { + if ( pdevreg->oper_func != NULL ) + pdevreg->oper_func( irq, pdevreg ); } /* endif */ + } + /* + * ... it is and was operational, but + * the devno may have changed + */ + else if ( ioinfo[irq]->devno != dev_no ) + { + ioinfo[irq]->nopfunc( irq, + DEVSTAT_REVALIDATE ); } /* endif */ - if ( ioinfo[irq]->ui.flags.oper ) - irq_ret = 0; - else - irq_ret = -ENODEV; + } /* endif */ } /* endif */ - return( irq_ret ); -} + break; -void do_crw_pending(void) -{ + case CRW_RSC_MONITOR : + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : source is " + "monitoring facility\n"); +#endif + break; + + case CRW_RSC_CPATH : + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : source is " + "channel path\n"); +#endif + break; + + case CRW_RSC_CONFIG : + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : source is " + "configuration-alert facility\n"); +#endif + break; + + case CRW_RSC_CSS : + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : source is " + "channel path\n"); +#endif + break; + + default : + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : unknown source\n"); +#endif + break; + + } /* endswitch */ + + pcrwe = pcrwe->crwe_next; + + } /* endwhile */ + +#ifdef CONFIG_DEBUG_CRW + printk( "do_crw_pending : done\n"); +#endif + + return; } + /* added by Holger Smolinski for reipl support in reipl.S */ void diff -urN v2.2.15/linux/arch/s390/kernel/s390mach.c linux/arch/s390/kernel/s390mach.c --- v2.2.15/linux/arch/s390/kernel/s390mach.c Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/kernel/s390mach.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,544 @@ +/* + * arch/s390/kernel/s390mach.c + * S/390 machine check handler, + * currently only channel-reports are supported + * + * S390 version + * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Author(s): Ingo Adlung (adlung@de.ibm.com) + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#define S390_MACHCHK_DEBUG + +static int __init s390_machine_check_handler( void * parm ); +static void s390_enqueue_mchchk( mache_t *mchchk ); +static mache_t *s390_dequeue_mchchk( void ); +static void s390_enqueue_free_mchchk( mache_t *mchchk ); +static mache_t *s390_dequeue_free_mchchk( void ); +static int s390_collect_crw_info( void ); + +static struct semaphore s_sem[2]; + +static mache_t *mchchk_queue_head = NULL; +static mache_t *mchchk_queue_tail = NULL; +static mache_t *mchchk_queue_free = NULL; +static crwe_t *crw_buffer_anchor = NULL; +static spinlock_t mchchk_queue_lock = SPIN_LOCK_UNLOCKED; +static spinlock_t crw_queue_lock = SPIN_LOCK_UNLOCKED; + +static inline void init_MUTEX (struct semaphore *sem) +{ + sema_init(sem, 1); +} + +static inline void init_MUTEX_LOCKED (struct semaphore *sem) +{ + sema_init(sem, 0); +} + +/* + * s390_init_machine_check + * + * initialize machine check handling + */ +void s390_init_machine_check( void ) +{ + crwe_t *pcrwe; /* CRW buffer element pointer */ + mache_t *pmache; /* machine check element pointer */ + + init_MUTEX_LOCKED( &s_sem[0] ); + init_MUTEX_LOCKED( &s_sem[1] ); + + pcrwe = kmalloc( MAX_CRW_PENDING * sizeof( crwe_t), GFP_KERNEL); + + if ( pcrwe ) + { + int i; + + crw_buffer_anchor = pcrwe; + + for ( i=0; i < MAX_CRW_PENDING; i++) + { + pcrwe->crwe_next = (crwe_t *)((unsigned long)pcrwe + sizeof(crwe_t)); + pcrwe = pcrwe->crwe_next; + + } /* endfor */ + + pcrwe->crwe_next = NULL; + + } + else + { + panic( "s390_init_machine_check : unable to obtain memory\n"); + + } /* endif */ + + pmache = kmalloc( MAX_MACH_PENDING * sizeof( mache_t), GFP_KERNEL); + + if ( pmache ) + { + int i; + + for ( i=0; i < MAX_MACH_PENDING; i++) + { + s390_enqueue_free_mchchk( pmache ); + pmache = (mache_t *)((unsigned long)pmache + sizeof(mache_t)); + + } /* endfor */ + } + else + { + panic( "s390_init_machine_check : unable to obtain memory\n"); + + } /* endif */ + +#ifdef S390_MACHCHK_DEBUG + printk( "init_mach : starting machine check handler\n"); +#endif + + kernel_thread( s390_machine_check_handler, s_sem, 0); + + /* + * wait for the machine check handler to be ready + */ +#ifdef S390_MACHCHK_DEBUG + printk( "init_mach : waiting for machine check handler coming up ... \n"); +#endif + + down( &s_sem[0]); + + smp_ctl_clear_bit( 14, 25 ); // disable damage MCH +#if 1 + smp_ctl_set_bit( 14, 28 ); // enable channel report MCH +#endif + +#ifdef S390_MACHCHK_DEBUG + printk( "init_mach : machine check buffer : head = %08X\n", + (unsigned)&mchchk_queue_head); + printk( "init_mach : machine check buffer : tail = %08X\n", + (unsigned)&mchchk_queue_tail); + printk( "init_mach : machine check buffer : free = %08X\n", + (unsigned)&mchchk_queue_free); + printk( "init_mach : CRW entry buffer anchor = %08X\n", + (unsigned)&crw_buffer_anchor); + printk( "init_mach : machine check handler ready\n"); +#endif + + return; +} + +/* + * s390_do_machine_check + * + * mchine check pre-processor, collecting the machine check info, + * queueing it and posting the machine check handler for processing. + */ +void __init s390_do_machine_check( void ) +{ + int crw_count; + mcic_t mcic; + +#ifdef S390_MACHCHK_DEBUG + printk( "s390_do_machine_check : starting ...\n"); +#endif + + memcpy( &mcic, + &S390_lowcore.mcck_interuption_code, + sizeof(__u64)); + + if ( mcic.mcc.mcd.cp ) // CRW pending ? + { + crw_count = s390_collect_crw_info(); + + if ( crw_count ) + { + up( &s_sem[1] ); + + } /* endif */ + + } /* endif */ + +#ifdef S390_MACHCHK_DEBUG + printk( "s390_do_machine_check : done \n"); +#endif + + return; +} + +/* + * s390_machine_check_handler + * + * machine check handler, dequeueing machine check entries + * and processing them + */ +static int __init s390_machine_check_handler( void *parm) +{ + struct semaphore *sem = parm; + int flags; + mache_t *pmache; + + int found = 0; + +#ifdef S390_MACHCHK_DEBUG + printk( "mach_handler : up\n"); +#endif + + up( &sem[0] ); + +#ifdef S390_MACHCHK_DEBUG + printk( "mach_handler : ready\n"); +#endif + + do { + +#ifdef S390_MACHCHK_DEBUG + printk( "mach_handler : waiting for wakeup\n"); +#endif + + down_interruptible( &sem[1] ); + +#ifdef S390_MACHCHK_DEBUG + printk( "\nmach_handler : wakeup ... \n"); +#endif + + __save_flags( flags ); + __cli(); + + pmache = s390_dequeue_mchchk(); + + if ( pmache ) + { + found = 1; + + if ( pmache->mcic.mcc.mcd.cp ) + { + crwe_t *pcrwe_n; + crwe_t *pcrwe_h; + + s390_do_crw_pending( pmache->mc.crwe ); + + pcrwe_h = pmache->mc.crwe; + pcrwe_n = pmache->mc.crwe->crwe_next; + + pmache->mcic.mcc.mcd.cp = 0; + pmache->mc.crwe = NULL; + + spin_lock( &crw_queue_lock); + + while ( pcrwe_h ) + { + pcrwe_h->crwe_next = crw_buffer_anchor; + crw_buffer_anchor = pcrwe_h; + pcrwe_h = pcrwe_n; + + if ( pcrwe_h != NULL ) + pcrwe_n = pcrwe_h->crwe_next; + + } /* endwhile */ + + spin_unlock( &crw_queue_lock); + + } /* endif */ + + s390_enqueue_free_mchchk( pmache ); + } + else + { + found = 0; + + // unconditional surrender ... +#ifdef S390_MACHCHK_DEBUG + printk( "mach_handler : terminated \n"); +#endif + + } /* endif */ + + __restore_flags( flags ); + + } while ( found ); + + return( 0); +} + +/* + * s390_dequeue_mchchk + * + * Dequeue an entry from the machine check queue + * + * Note : The queue elements provide for a double linked list. + * We dequeue entries from the tail, and enqueue entries to + * the head. + * + */ +static mache_t *s390_dequeue_mchchk( void ) +{ + mache_t *qe; + + spin_lock( &mchchk_queue_lock ); + + qe = mchchk_queue_tail; + + if ( qe != NULL ) + { + mchchk_queue_tail = qe->prev; + + if ( mchchk_queue_tail != NULL ) + { + mchchk_queue_tail->next = NULL; + } + else + { + mchchk_queue_head = NULL; + + } /* endif */ + + } /* endif */ + + spin_unlock( &mchchk_queue_lock ); + + return qe; +} + +/* + * s390_enqueue_mchchk + * + * Enqueue an entry to the machine check queue. + * + * Note : The queue elements provide for a double linked list. + * We enqueue entries to the head, and dequeue entries from + * the tail. + * + */ +static void s390_enqueue_mchchk( mache_t *pmache ) +{ + spin_lock( &mchchk_queue_lock ); + + if ( pmache != NULL ) + { + + if ( mchchk_queue_head == NULL ) /* first element */ + { + pmache->next = NULL; + pmache->prev = NULL; + + mchchk_queue_head = pmache; + mchchk_queue_tail = pmache; + } + else /* new head */ + { + pmache->prev = NULL; + pmache->next = mchchk_queue_head; + + mchchk_queue_head->prev = pmache; + mchchk_queue_head = pmache; + + } /* endif */ + + } /* endif */ + + spin_unlock( &mchchk_queue_lock ); + + return; +} + + +/* + * s390_enqueue_free_mchchk + * + * Enqueue a free entry to the free queue. + * + * Note : While the queue elements provide for a double linked list, + * the free queue entries are only concatenated by means of a + * single linked list (forward concatenation). + * + */ +static void s390_enqueue_free_mchchk( mache_t *pmache ) +{ + if ( pmache != NULL) + { + memset( pmache, '\0', sizeof( mache_t )); + + spin_lock( &mchchk_queue_lock ); + + pmache->next = mchchk_queue_free; + + mchchk_queue_free = pmache; + + spin_unlock( &mchchk_queue_lock ); + + } /* endif */ + + return; +} + +/* + * s390_dequeue_free_mchchk + * + * Dequeue an entry from the free queue. + * + * Note : While the queue elements provide for a double linked list, + * the free queue entries are only concatenated by means of a + * single linked list (forward concatenation). + * + */ +static mache_t *s390_dequeue_free_mchchk( void ) +{ + mache_t *qe; + + spin_lock( &mchchk_queue_lock ); + + qe = mchchk_queue_free; + + if ( qe != NULL ) + { + mchchk_queue_free = qe->next; + + } /* endif */ + + spin_unlock( &mchchk_queue_lock ); + + return qe; +} + +/* + * s390_collect_crw_info + * + * Retrieve CRWs. If a CRW was found a machine check element + * is dequeued from the free chain, filled and enqueued to + * be processed. + * + * The function returns the number of CRWs found. + * + * Note : We must always be called disabled ... + */ +static int s390_collect_crw_info( void ) +{ + crw_t tcrw; /* temporarily holds a CRW */ + int ccode; /* condition code from stcrw() */ + crwe_t *pcrwe; /* pointer to CRW buffer entry */ + + mache_t *pmache = NULL; /* ptr to mchchk entry */ + int chain = 0; /* indicate chaining */ + crwe_t *pccrw = NULL; /* ptr to current CRW buffer entry */ + int count = 0; /* CRW count */ + +#ifdef S390_MACHCHK_DEBUG + printk( "crw_info : looking for CRWs ...\n"); +#endif + + do + { + ccode = stcrw( (__u32 *)&tcrw); + + if ( ccode == 0 ) + { + count++; + +#ifdef S390_MACHCHK_DEBUG + printk( "crw_info : CRW reports " + "slct=%d, oflw=%d, chn=%d, " + "rsc=%X, anc=%d, erc=%X, " + "rsid=%X\n", + tcrw.slct, + tcrw.oflw, + tcrw.chn, + tcrw.rsc, + tcrw.anc, + tcrw.erc, + tcrw.rsid ); +#endif + + /* + * Dequeue a CRW entry from the free chain + * and process it ... + */ + spin_lock( &crw_queue_lock ); + + pcrwe = crw_buffer_anchor; + + if ( pcrwe == NULL ) + { + printk( KERN_CRIT"crw_info : " + "no CRW buffer entries available\n"); + break; + + } /* endif */ + + crw_buffer_anchor = pcrwe->crwe_next; + pcrwe->crwe_next = NULL; + + spin_unlock( &crw_queue_lock ); + + memcpy( &(pcrwe->crw), &tcrw, sizeof(crw_t)); + + /* + * If it is the first CRW, chain it to the mchchk + * buffer entry, otherwise to the last CRW entry. + */ + if ( chain == 0 ) + { + pmache = s390_dequeue_free_mchchk(); + + if ( pmache != NULL ) + { + memset( pmache, '\0', sizeof(mache_t)); + + pmache->mcic.mcc.mcd.cp = 1; + pmache->mc.crwe = pcrwe; + pccrw = pcrwe; + + } + else + { + panic( "crw_info : " + "unable to dequeue " + "free mchchk buffer"); + + } /* endif */ + } + else + { + pccrw->crwe_next = pcrwe; + pccrw = pcrwe; + + } /* endif */ + + if ( pccrw->crw.chn ) + { +#ifdef S390_MACHCHK_DEBUG + printk( "crw_info : " + "chained CRWs pending ...\n\n"); +#endif + chain = 1; + } + else + { + chain = 0; + + /* + * We can enqueue the mchchk buffer if + * there aren't more CRWs chained. + */ + s390_enqueue_mchchk( pmache); + + } /* endif */ + + } /* endif */ + + } while ( ccode == 0 ); + + return( count ); +} + diff -urN v2.2.15/linux/arch/s390/kernel/setup.c linux/arch/s390/kernel/setup.c --- v2.2.15/linux/arch/s390/kernel/setup.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/setup.c Wed Jun 7 14:26:42 2000 @@ -97,39 +97,60 @@ } /* + * VM halt and poweroff setup routines + */ +char vmhalt_cmd[128] = ""; +char vmpoff_cmd[128] = ""; + +static inline void strncpy_skip_quote(char *dst, char *src, int n) +{ + int sx, dx; + + dx = 0; + for (sx = 0; src[sx] != 0; sx++) { + if (src[sx] == '"') continue; + dst[dx++] = src[sx]; + if (dx >= n) break; + } +} + +__initfunc(void vmhalt_setup(char *str, char *ints)) +{ + strncpy_skip_quote(vmhalt_cmd, str, 127); + vmhalt_cmd[127] = 0; + return; +} + +__initfunc(void vmpoff_setup(char *str, char *ints)) +{ + strncpy_skip_quote(vmpoff_cmd, str, 127); + vmpoff_cmd[127] = 0; + return; +} + +/* * Reboot, halt and power_off routines for non SMP. */ + #ifndef __SMP__ void machine_restart(char * __unused) { reipl(S390_lowcore.ipl_device); -#if 0 - if (MACHINE_IS_VM) { - cpcmd("IPL", NULL, 0); - } else { - /* FIXME: how to reipl ? */ - disabled_wait(2); - } -#endif } void machine_halt(void) { - if (MACHINE_IS_VM) { - cpcmd("IPL 200 STOP", NULL, 0); - } else { + if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0) + cpcmd(vmhalt_cmd, NULL, 0); disabled_wait(0); } -} void machine_power_off(void) { - if (MACHINE_IS_VM) { - cpcmd("IPL CMS", NULL, 0); - } else { + if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0) + cpcmd(vmpoff_cmd, NULL, 0); disabled_wait(0); } -} #endif /* @@ -190,6 +211,13 @@ #endif memory_start = (unsigned long) &_end; /* fixit if use $CODELO etc*/ memory_end = MEMORY_SIZE; + /* + * We need some free virtual space to be able to do vmalloc. + * On a machine with 2GB memory we make sure that we have at + * least 128 MB free space for vmalloc. + */ + if (memory_end > 1920*1024*1024) + memory_end = 1920*1024*1024; init_task.mm->start_code = PAGE_OFFSET; init_task.mm->end_code = (unsigned long) &_etext; init_task.mm->end_data = (unsigned long) &_edata; @@ -208,7 +236,6 @@ * memory size */ if (c == ' ' && strncmp(from, "mem=", 4) == 0) { - if (to != command_line) to--; memory_end = simple_strtoul(from+4, &from, 0); if ( *from == 'K' || *from == 'k' ) { memory_end = memory_end << 10; @@ -218,10 +245,12 @@ from++; } } + /* + * "ipldelay=XXX[sSmM]" waits for the specified time + */ if (c == ' ' && strncmp(from, "ipldelay=", 9) == 0) { unsigned long delay; - if (to != command_line) to--; delay = simple_strtoul(from+9, &from, 0); if (*from == 's' || *from == 'S') { delay = delay*1000000; diff -urN v2.2.15/linux/arch/s390/kernel/signal.c linux/arch/s390/kernel/signal.c --- v2.2.15/linux/arch/s390/kernel/signal.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/signal.c Wed Jun 7 14:26:42 2000 @@ -61,7 +61,8 @@ /* * Atomically swap in the new signal mask, and wait for a signal. */ -asmlinkage int sys_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask) +asmlinkage int +sys_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask) { sigset_t saveset; @@ -73,8 +74,7 @@ spin_unlock_irq(¤t->sigmask_lock); regs->gprs[2] = -EINTR; - while (1) - { + while (1) { current->state = TASK_INTERRUPTIBLE; schedule(); if (do_signal(regs, &saveset)) @@ -82,7 +82,8 @@ } } -asmlinkage int sys_rt_sigsuspend(struct pt_regs * regs,sigset_t *unewset, size_t sigsetsize) +asmlinkage int +sys_rt_sigsuspend(struct pt_regs * regs,sigset_t *unewset, size_t sigsetsize) { sigset_t saveset, newset; @@ -319,14 +320,17 @@ static void setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs * regs) { + sigframe *frame; - if(!setup_frame_common(sig,ka,set,regs,sizeof(sigframe), - (S390_SYSCALL_OPCODE|__NR_sigreturn))) + if((frame=setup_frame_common(sig,ka,set,regs,sizeof(sigframe), + (S390_SYSCALL_OPCODE|__NR_sigreturn)))==0) goto give_sigsegv; #if DEBUG_SIG printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n", current->comm, current->pid, frame, regs->eip, frame->pretcode); #endif + /* Martin wants this for pthreads */ + regs->gprs[3] = (addr_t)&frame->sc; return; give_sigsegv: @@ -355,8 +359,8 @@ err |= __put_user(sas_ss_flags(orig_sp), &frame->uc.uc_stack.ss_flags); err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); - regs->gprs[3] = (u32)&frame->info; - regs->gprs[4] = (u32)&frame->uc; + regs->gprs[3] = (addr_t)&frame->info; + regs->gprs[4] = (addr_t)&frame->uc; if (err) goto give_sigsegv; diff -urN v2.2.15/linux/arch/s390/kernel/smp.c linux/arch/s390/kernel/smp.c --- v2.2.15/linux/arch/s390/kernel/smp.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/smp.c Wed Jun 7 14:26:42 2000 @@ -31,6 +31,7 @@ #include #include #include +#include #include "cpcmd.h" #include @@ -82,18 +83,14 @@ /* * Reboot, halt and power_off routines for SMP. */ +extern char vmhalt_cmd[]; +extern char vmpoff_cmd[]; +extern void reipl(int ipl_device); + void do_machine_restart(void) { smp_send_stop(); reipl(S390_lowcore.ipl_device); -#if 0 - if (MACHINE_IS_VM) { - cpcmd("IPL", NULL, 0); - } else { - /* FIXME: how to reipl ? */ - disabled_wait(2); - } -#endif } void machine_restart(char * __unused) @@ -108,12 +105,10 @@ void do_machine_halt(void) { smp_send_stop(); - if (MACHINE_IS_VM) { - cpcmd("IPL CMS", NULL, 0); - } else { + if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0) + cpcmd(vmhalt_cmd, NULL, 0); disabled_wait(0); } -} void machine_halt(void) { @@ -127,12 +122,10 @@ void do_machine_power_off(void) { smp_send_stop(); - if (MACHINE_IS_VM) { - cpcmd("IPL CMS", NULL, 0); - } else { + if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0) + cpcmd(vmpoff_cmd, NULL, 0); disabled_wait(0); } -} void machine_power_off(void) { @@ -148,7 +141,7 @@ * cpus are handled. */ -void do_ext_call_interrupt(__u16 source_cpu_addr) +void do_ext_call_interrupt(struct pt_regs *regs, __u16 source_cpu_addr) { ec_ext_call *ec, *next; int bits; @@ -183,7 +176,7 @@ return; /* no command signals */ /* Make a fifo out of the lifo */ - next = ec; + next = ec->next; ec->next = NULL; while (next != NULL) { ec_ext_call *tmp = next->next; @@ -250,6 +243,11 @@ atomic_set(&ec->status,ec_done); return; } + case ec_ptlb: + atomic_set(&ec->status, ec_executing); + __flush_tlb(); + atomic_set(&ec->status, ec_done); + return; default: } ec = ec->next; @@ -496,6 +494,7 @@ * Activate a secondary processor. */ extern void init_100hz_timer(void); +extern void cpu_init (void); int __init start_secondary(void *cpuvoid) { @@ -571,6 +570,9 @@ int curr_cpu; int i; + /* request the 0x1202 external interrupt */ + if (register_external_interrupt(0x1202, do_ext_call_interrupt) != 0) + panic("Couldn't request external interrupt 0x1202"); smp_count_cpus(); memset(lowcore_ptr,0,sizeof(lowcore_ptr)); diff -urN v2.2.15/linux/arch/s390/kernel/sys_s390.c linux/arch/s390/kernel/sys_s390.c --- v2.2.15/linux/arch/s390/kernel/sys_s390.c Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/kernel/sys_s390.c Wed Jun 7 14:26:42 2000 @@ -115,8 +115,9 @@ * This is really horribly ugly. */ asmlinkage int sys_ipc (uint call, int first, int second, - int third, void *ptr, long fifth) + int third, void *ptr) { + struct ipc_kludge tmp; int ret; switch (call) { @@ -137,9 +138,13 @@ second, third); break; case MSGRCV: - return sys_msgrcv (first, - (struct msgbuf *) ptr, - second, fifth, third); + if (!ptr) + return -EINVAL; + if (copy_from_user (&tmp, (struct ipc_kludge *) ptr, + sizeof (struct ipc_kludge))) + return -EFAULT; + return sys_msgrcv (first, tmp.msgp, + second, tmp.msgtyp, third); case MSGGET: return sys_msgget ((key_t) first, second); case MSGCTL: diff -urN v2.2.15/linux/arch/s390/kernel/time.c linux/arch/s390/kernel/time.c --- v2.2.15/linux/arch/s390/kernel/time.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/time.c Wed Jun 7 14:26:42 2000 @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include @@ -147,7 +149,7 @@ extern __u16 boot_cpu_addr; #endif -void do_timer_interrupt(struct pt_regs *regs,int error_code) +void do_timer_interrupt(struct pt_regs *regs, __u16 error_code) { unsigned long flags; @@ -240,6 +242,9 @@ printk("time_init: TOD clock stopped/non-operational\n"); break; } + /* request the 0x1004 external interrupt */ + if (register_external_interrupt(0x1004, do_timer_interrupt) != 0) + panic("Couldn't request external interrupts 0x1004"); init_100hz_timer(); init_timer_cc = S390_lowcore.jiffy_timer_cc; init_timer_cc -= 0x8126d60e46000000LL - diff -urN v2.2.15/linux/arch/s390/kernel/traps.c linux/arch/s390/kernel/traps.c --- v2.2.15/linux/arch/s390/kernel/traps.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/kernel/traps.c Wed Jun 7 14:26:42 2000 @@ -219,6 +219,15 @@ return(FALSE); } +asmlinkage void default_trap_handler(struct pt_regs * regs, long error_code) +{ + if (check_for_fixup(regs) == 0) { + current->tss.error_code = error_code; + current->tss.trap_no = error_code; + force_sig(SIGSEGV, current); + die("Unknown program exception",regs,error_code); + } +} DO_ERROR(2, SIGILL, "privileged operation", privileged_op, current) DO_ERROR(3, SIGILL, "execute exception", execute_exception, current) @@ -350,8 +359,23 @@ int do_sig = 0; lock_kernel(); - if (regs->psw.mask & 0x00010000L) { location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc); + if(MACHINE_HAS_IEEE) + { + __asm__ volatile ("stfpc %0\n\t" + : "=m" (current->tss.fp_regs.fpc)); + + } + /* Same code should work when we implement fpu emulation */ + /* provided we call data exception from the fpu emulator */ + if(current->tss.fp_regs.fpc&FPC_DXC_MASK) + { + current->tss.ieee_instruction_pointer= + (addr_t)ADDR_BITS_REMOVE((addr_t)location); + force_sig(SIGFPE, current); + } + else if ((regs->psw.mask & 0x00010000L)) + { get_user(*((__u16 *) opcode), location); switch (opcode[0]) { case 0x28: /* LDR Rx,Ry */ @@ -402,7 +426,8 @@ do_sig = 1; break; } - } else + } + else do_sig = 1; if (do_sig) { if (check_for_fixup(regs) == 0) { diff -urN v2.2.15/linux/arch/s390/lib/strncpy.S linux/arch/s390/lib/strncpy.S --- v2.2.15/linux/arch/s390/lib/strncpy.S Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/lib/strncpy.S Wed Jun 7 14:26:42 2000 @@ -17,16 +17,14 @@ LR 1,2 # don't touch address in R2 LTR 4,4 JZ strncpy_exit # 0 bytes -> nothing to do - AHI 4,-1 SR 0,0 - BASR 5,0 strncpy_loop: ICM 0,1,0(3) # ICM sets the cc, IC does not LA 3,1(0,3) STC 0,0(0,1) LA 1,1(0,1) JZ strncpy_exit # ICM inserted a 0x00 - BCTR 4,5 # R4 -= 1, jump to strncpy_loop if >= 0 + BRCT 4,strncpy_loop # R4 -= 1, jump to strncpy_loop if > 0 strncpy_exit: BR 14 diff -urN v2.2.15/linux/arch/s390/mm/fault.c linux/arch/s390/mm/fault.c --- v2.2.15/linux/arch/s390/mm/fault.c Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/mm/fault.c Wed Jun 7 14:26:42 2000 @@ -65,12 +65,12 @@ address = S390_lowcore.trans_exc_code&0x7ffff000; - if (atomic_read(&S390_lowcore.local_irq_count)) - die("page fault from irq handler",regs,error_code); - tsk = current; mm = tsk->mm; + if (atomic_read(&S390_lowcore.local_irq_count)) + die("page fault from irq handler",regs,error_code); + down(&mm->mmap_sem); vma = find_vma(mm, address); @@ -116,7 +116,20 @@ printk("code should be 4, 10 or 11 (%lX) \n",error_code&0xFF); goto bad_area; } - handle_mm_fault(tsk, vma, address, write); + + /* + * If for any reason at all we couldn't handle the fault, + * make sure we exit gracefully rather than endlessly redo + * the fault. + */ +survive: + { + int fault = handle_mm_fault(tsk, vma, address, write); + if (!fault) + goto do_sigbus; + if (fault < 0) + goto out_of_memory; + } up(&mm->mmap_sem); return; @@ -141,8 +154,8 @@ return; } + no_context: /* Are we prepared to handle this kernel fault? */ - if ((fixup = search_exception_table(regs->psw.addr)) != 0) { regs->psw.addr = fixup; return; @@ -163,41 +176,43 @@ * need to define, which information is useful here */ - lock_kernel(); die("Oops", regs, error_code); do_exit(SIGKILL); - unlock_kernel(); -} + /* + * We ran out of memory, or some other thing happened to us that made + * us unable to handle the page fault gracefully. + */ +out_of_memory: + if (tsk->pid == 1) { - char c; - int i,j; - char *addr; - addr = ((char*) psw_addr)-0x20; - for (i=0;i<16;i++) { - if (i == 2) - printk("\n"); - printk ("%08X: ",(unsigned long) addr); - for (j=0;j<4;j++) { - printk("%08X ",*(unsigned long*)addr); - addr += 4; - } - addr -=0x10; - printk(" | "); - for (j=0;j<16;j++) { - printk("%c",(c=*addr++) < 0x20 ? '.' : c ); + tsk->policy |= SCHED_YIELD; + schedule(); + goto survive; } - - printk("\n"); - } - printk("\n"); + up(&mm->mmap_sem); + if (psw_mask & PSW_PROBLEM_STATE) + { + printk("VM: killing process %s\n", tsk->comm); + do_exit(SIGKILL); } + goto no_context; -*/ - - - - +do_sigbus: + up(&mm->mmap_sem); + /* + * Send a sigbus, regardless of whether we were in kernel + * or user mode. + */ + tsk->tss.prot_addr = address; + tsk->tss.error_code = error_code; + tsk->tss.trap_no = 14; + force_sig(SIGBUS, tsk); + + /* Kernel mode? Handle exceptions or die */ + if (!(psw_mask & PSW_PROBLEM_STATE)) + goto no_context; +} diff -urN v2.2.15/linux/arch/s390/mm/init.c linux/arch/s390/mm/init.c --- v2.2.15/linux/arch/s390/mm/init.c Tue Jan 4 10:12:12 2000 +++ linux/arch/s390/mm/init.c Wed Jun 7 14:26:42 2000 @@ -337,7 +337,8 @@ tmp = start_mem; while (tmp < end_mem) { - if ((tmp & 0x3ff000) == 0 && test_access(tmp) == 0) { + if (tmp && (tmp & 0x3ff000) == 0 && + test_access(tmp) == 0) { int i; printk("4M Segment %lX not available\n",tmp); for (i = 0;i<0x400;i++) { @@ -404,7 +405,7 @@ atomic_set(&mem_map[MAP_NR(addr)].count, 1); free_page(addr); } - printk ("Freeing unused kernel memory: %ldk freed\n", (&__init_end - &__init_begin) >> 10); + printk ("Freeing unused kernel memory: %dk freed\n", (&__init_end - &__init_begin) >> 10); } void si_meminfo(struct sysinfo *val) diff -urN v2.2.15/linux/arch/s390/tools/dasdfmt/Makefile linux/arch/s390/tools/dasdfmt/Makefile --- v2.2.15/linux/arch/s390/tools/dasdfmt/Makefile Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/tools/dasdfmt/Makefile Wed Jun 7 14:26:42 2000 @@ -0,0 +1,9 @@ +all: dasdfmt + +dasdfmt: dasdfmt.c + $(CROSS_COMPILE)gcc -o $@ $^ + $(STRIP) $@ + +clean: + rm -f dasdfmt + diff -urN v2.2.15/linux/arch/s390/tools/dasdfmt/dasdfmt.c linux/arch/s390/tools/dasdfmt/dasdfmt.c --- v2.2.15/linux/arch/s390/tools/dasdfmt/dasdfmt.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/tools/dasdfmt/dasdfmt.c Wed Jun 7 14:26:42 2000 @@ -26,18 +26,21 @@ #include #include #include -#include "../../../drivers/s390/block/dasd.h" /* uses DASD_PARTN_BITS */ #define __KERNEL__ /* we want to use kdev_t and not have to define it */ #include #undef __KERNEL__ +#include +#include + #define EXIT_MISUSE 1 #define EXIT_BUSY 2 #define TEMPFILENAME "/tmp/ddfXXXXXX" #define TEMPFILENAMECHARS 8 /* 8 characters are fixed in all temp filenames */ -#define IOCTL_COMMAND 'D' << 8 #define SLASHDEV "/dev/" #define PROC_DASD_DEVICES "/proc/dasd/devices" +#define PROC_MOUNTS "/proc/mounts" /* _PATH_MOUNTED is /etc/mtab - maybe bad */ +#define PROC_SWAPS "/proc/swaps" #define DASD_DRIVER_NAME "dasd" #define PROC_LINE_LENGTH 80 #define ERR_LENGTH 80 @@ -67,26 +70,24 @@ ERRMSG_EXIT(EXIT_MISUSE,"%s: " str " " \ "is in invalid format\n",prog_name);} -typedef struct { - int start_unit; - int stop_unit; - int blksize; -} format_data_t; - -char prog_name[]="dasd_format"; +char *prog_name;/*="dasdfmt";*/ char tempfilename[]=TEMPFILENAME; void exit_usage(int exitcode) { - printf("Usage: %s [-htvyV] [-b blocksize] \n\n", + printf("Usage: %s [-htvyV] [-b ] [] \n\n", prog_name); - printf(" where is either\n"); - printf(" -s start_track -e end_track\n"); + printf(" -t means testmode\n"); + printf(" -v means verbose mode\n"); + printf(" -V means print version\n"); + printf(" has to be power of 2 and at least 512\n"); + printf(" is either\n"); + printf(" -s -e \n"); printf(" or\n"); - printf(" -r start_track-end_track\n"); + printf(" -r -\n"); printf(" and is either\n"); - printf(" -f /dev/ddX\n"); + printf(" -f /dev/dasdX\n"); printf(" or\n"); printf(" -n \n"); exit(exitcode); @@ -321,8 +322,8 @@ /* * first, check filesystems */ - if (!(f = fopen(_PATH_MOUNTED, "r"))) - ERRMSG_EXIT(EXIT_FAILURE, "%s: %s\n", _PATH_MOUNTED, + if (!(f = fopen(PROC_MOUNTS, "r"))) + ERRMSG_EXIT(EXIT_FAILURE, "%s: %s\n", PROC_MOUNTS, strerror(errno)); while ((ment = getmntent(f))) { if (stat(ment->mnt_fsname, &stbuf) == 0) @@ -338,8 +339,8 @@ /* * second, check active swap spaces */ - if (!(f = fopen("/proc/swaps", "r"))) - ERRMSG_EXIT(EXIT_FAILURE, "/proc/swaps: %s", strerror(errno)); + if (!(f = fopen(PROC_SWAPS, "r"))) + ERRMSG_EXIT(EXIT_FAILURE, PROC_SWAPS " %s", strerror(errno)); /* * skip header line */ @@ -417,8 +418,8 @@ if (!withoutprompt) { printf("\n--->> ATTENTION! <<---\n"); printf("All data in the specified range of that " \ - "device will be lost.\nType yes to continue" \ - ", no will leave the disk untouched: "); + "device will be lost.\nType \"yes\" to " \ + "continue, no will leave the disk untouched: "); fgets(inp_buffer,sizeof(inp_buffer),stdin); if (strcasecmp(inp_buffer,"yes") && strcasecmp(inp_buffer,"yes\n")) { @@ -431,13 +432,20 @@ if ( !( (withoutprompt)&&(verbosity<1) )) printf("Formatting the device. This may take a " \ "while (get yourself a coffee).\n"); - rc=ioctl(fd,IOCTL_COMMAND,format_params); + rc=ioctl(fd,BIODASDFORMAT,format_params); if (rc) ERRMSG_EXIT(EXIT_FAILURE,"%s: the dasd driver " \ "returned with the following error " \ "message:\n%s\n",prog_name,strerror(errno)); printf("Finished formatting the device.\n"); + printf("Rereading the partition table... "); + rc=ioctl(fd,BLKRRPART,NULL); + if (rc) { + ERRMSG("%s: error during rereading the partition " \ + "table: %s.\n",prog_name,strerror(errno)); + } else printf("done.\n"); + break; } @@ -473,6 +481,7 @@ int devfile_specified,devno_specified,range_specified; /******************* initialization ********************/ + prog_name=argv[0]; endptr=NULL; @@ -617,7 +626,7 @@ str=check_param(CHECK_ALL,format_params); if (str!=NULL) ERRMSG_EXIT(EXIT_MISUSE,"%s: %s\n",prog_name,str); - /*************** issue the real command *****************/ + /******* issue the real command and reread part table *******/ do_format_dasd(dev_name,format_params,testmode,verbosity, withoutprompt); diff -urN v2.2.15/linux/arch/s390/tools/hwc_cntl_key/Makefile linux/arch/s390/tools/hwc_cntl_key/Makefile --- v2.2.15/linux/arch/s390/tools/hwc_cntl_key/Makefile Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/tools/hwc_cntl_key/Makefile Wed Jun 7 14:26:42 2000 @@ -0,0 +1,11 @@ +CROSS_COMPILE = s390- + +all: hwc_cntl_key + +hwc_cntl_key: hwc_cntl_key.c + $(CROSS_COMPILE)gcc -o $@ $^ + $(STRIP) $@ + +clean: + rm -f hwc_cntl_key.c + diff -urN v2.2.15/linux/arch/s390/tools/hwc_cntl_key/hwc_cntl_key.c linux/arch/s390/tools/hwc_cntl_key/hwc_cntl_key.c --- v2.2.15/linux/arch/s390/tools/hwc_cntl_key/hwc_cntl_key.c Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/tools/hwc_cntl_key/hwc_cntl_key.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,69 @@ +/* + * small application to set string that will be used as CNTL-C + * employing a HWC terminal ioctl command + * + * returns: number of written or read characters + * + * Copyright (C) 2000 IBM Corporation + * Author(s): Martin Peschke + */ + +#include +#include + +/* everything about the HWC terminal driver ioctl-commands */ +#include "../../../../drivers/s390/char/sclp_tty.h" + +/* standard input, should be our HWC tty */ +#define DESCRIPTOR 0 + +int main(int argc, char *argv[], char *env[]) +{ + unsigned char buf[HWC_TTY_MAX_CNTL_SIZE]; + + if (argc >= 2) { + if (strcmp(argv[1], "c") == 0 || + strcmp(argv[1], "C") == 0 || + strcmp(argv[1], "INTR_CHAR") == 0) { + if (argc == 2) { + ioctl(DESCRIPTOR, TIOCHWCTTYGINTRC, buf); + printf("%s\n", buf); + return strlen(buf); + } else return ioctl(DESCRIPTOR, TIOCHWCTTYSINTRC, argv[2]); +// currently not yet implemented in HWC terminal driver +#if 0 + } else if (strcmp(argv[1], "d") == 0 || + strcmp(argv[1], "D") == 0 || + strcmp(argv[1], "EOF_CHAR") == 0) { + if (argc == 2) { + ioctl(DESCRIPTOR, TIOCHWCTTYGEOFC, buf); + printf("%s\n", buf); + return strlen(buf); + } else return ioctl(DESCRIPTOR, TIOCHWCTTYSEOFC, argv[2]); + } else if (strcmp(argv[1], "z") == 0 || + strcmp(argv[1], "Z") == 0 || + strcmp(argv[1], "SUSP_CHAR") == 0) { + if (argc == 2) { + ioctl(DESCRIPTOR, TIOCHWCTTYGSUSPC, buf); + printf("%s\n", buf); + return strlen(buf); + } else return ioctl(DESCRIPTOR, TIOCHWCTTYSSUSPC, argv[2]); + } else if (strcmp(argv[1], "n") == 0 || + strcmp(argv[1], "N") == 0 || + strcmp(argv[1], "NEW_LINE") == 0) { + if (argc == 2) { + ioctl(DESCRIPTOR, TIOCHWCTTYGNL, buf); + printf("%s\n", buf); + return strlen(buf); + } else return ioctl(DESCRIPTOR, TIOCHWCTTYSNL, argv[2]); +#endif + } + } + + printf("usage: hwc_cntl_key []\n"); + printf(" ::= \"c\" | \"C\" | \"INTR_CHAR\" |\n"); + printf(" \"d\" | \"D\" | \"EOF_CHAR\" |\n"); + printf(" \"z\" | \"Z\" | \"SUSP_CHAR\" |\n"); + printf(" \"n\" | \"N\" | \"NEW_LINE\"\n"); + return -1; +} diff -urN v2.2.15/linux/arch/s390/tools/silo/Makefile linux/arch/s390/tools/silo/Makefile --- v2.2.15/linux/arch/s390/tools/silo/Makefile Wed May 3 17:16:31 2000 +++ linux/arch/s390/tools/silo/Makefile Wed Jun 7 14:26:42 2000 @@ -1,7 +1,14 @@ all: silo +silo.o: silo.c + $(CROSS_COMPILE)gcc -c -o silo.o -O2 silo.c + +cfg.o: cfg.c + $(CROSS_COMPILE)gcc -c -o cfg.o -O2 cfg.c + silo: silo.o cfg.o $(CROSS_COMPILE)gcc -o $@ $^ + $(STRIP) $@ clean: rm -f *.o silo diff -urN v2.2.15/linux/arch/s390/tools/silo/silo.8 linux/arch/s390/tools/silo/silo.8 --- v2.2.15/linux/arch/s390/tools/silo/silo.8 Wed Dec 31 16:00:00 1969 +++ linux/arch/s390/tools/silo/silo.8 Wed Jun 7 14:26:42 2000 @@ -0,0 +1,117 @@ +.TH SILO 8 "Thu Feb 17 2000" +.UC 4 +.SH NAME +silo \- preparing a DASD to become an IPL device +.SH SYNOPSIS +\fBsilo\fR -d \fIipldevice\fR [-hV?] [-t[\fI#\fR]] [-v[\fI#\fR]] + [-F \fIconfig-file\fR] [-b \fIbootsector\fR] + [-f \fIimage\fR] [-p \fIparameterfile\fR] [-B \fIbootmap\fR] +.SH DESCRIPTION +\fBsilo\fR makes a DASD an IPLable volume. All files needed for IPL must +reside on that volume, namely the \fIimage\fR, the \FIparameterline\fR and +the bootmap. +Only one IPLable image per volume is supported. Currently we require an ECKD +type DASD with a blocksize of at least 2048 bytes to IPL. By default silo +does \fBnot\fR modify anything on your disk, but prints out its actions. + +\fBWARNING\fR: Incautious usage of \fBsilo\fR can leave your system in a +state that is not IPLable! + +There are some defaults for the most common parameters compiled into the +binary. You can overwrite these defaults by your own using /etc/silo.conf +or another config file specified by \fB-F\fR \fIconfig-file\fR. All values +set by defaults or the config file can be overwritten using the commandline +options of silo. + +The config file recognizes the following statements: +.TP +\fBipldevice\fR=\fIdevicenode\fR +sets the ipldevice to devicenode. The device node specified must be the node +of the 'full' device and not one of a partition. + +.TP +\fBappend\fR=\fIlist of parameters\fR +sets additional parameters to be added to the parmfile. These parameters are +added to any parmfile specified on the command line. The old parameter file +is preserved and a new one is created with a temporary name. + +.TP +\fBimage\fR=\fIimage\fR +sets the name of the image to be IPLed from that volume. The default name +is \fI./image\fR. + +.TP +\fBbootsect\fR=\fIbootsect\fR +sets the name of the bootsector to be used as IPL record for that volume. +The default name is \fI/boot/ipleckd.boot\fR. + +.TP +\fBmap\fR=\fIbootmap\fR +sets the name of the bootmap to hold the map information needen during IPL. +The default name is \fI./boot.map\fR. In testonly mode this name is replaced +by a temporary name. +.TP +\fBparmfile\fR=\fIparameter file\fR +sets the name of the parameter file holding the kernel parameters to be used +during setup of the kernel. The default name is \fI./parmfile\fR. + +.TP +\fBramdisk\fR=\fIramdisk image\fR +optionally sets the name of a ramdisk image to be used as an initial ramdisk. + +.TP +\fBroot\fR=\fIdevice node\fR +sets the device holding the root device of the IPLed system. + +.TP +\fBreadonly\fR +sets the flag to mount thedevice holding the root device of the IPLed system. +in readonly mode, before the final mount is done by /etc/fstab. + +.TP +\fBverbose\fR=\fIlevel\fR +sets the level of verbosity to \fIlevel\fR. + +.TP +\fBtestlevel\fR=\fIlevel\fR +decreases the testing level (from 2) by \fIlevel\fR. + +.SH OPTIONS +.TP +\fB-t\fR [\fI#\fR] +decreases the testing level by one, or \fi#\fR, rsp. By default the testing +level is set to 2, which means that no modifications are made to the disk. +A testing level of 1 means, that a bootmap is generated with a temporary +filename, but the IPL records of the disk are not modified. Only with a +testing level of 0 or below, the disk is really made IPLable. + +.TP +\fB-v\fR [\fI#\fR] +Increases verbosity, or sets verbosity to \fI#\fR, rsp. + +.TP +\fB-V\fR +Print version number and exit. + +.SH FILES +.TP +\fI/etc/silo.conf\fR the default configuration file. +\fI/boot/ipleckd.boot\fR the default bootsector for ECKD devices. +\fI/boot/iplfba.boot\fR the bootsector for FBA devices. +\fI./boot.map\fR the default name of the bootmap. +\fI./image\fR the default name of the kernel image. +\fI./parmfile\fR the default name of the parameter file. +\fI/tmp/silodev\fR a device node which is created temporarily. + +.SH BUGS +.TP +IPL from FBA disks is not yet supported. +.TP +When \fBsilo\fR aborts it does not at all clean up its temporary files. +.TP +\fBsilo\fR must be run in a directory residing on the device you want to IPL. + +.SH AUTHOR +.nf +This man-page was written by Holger Smolinski +.fi diff -urN v2.2.15/linux/arch/s390/tools/silo/silo.c linux/arch/s390/tools/silo/silo.c --- v2.2.15/linux/arch/s390/tools/silo/silo.c Wed May 3 17:16:31 2000 +++ linux/arch/s390/tools/silo/silo.c Wed Jun 7 14:26:42 2000 @@ -3,8 +3,10 @@ * * S390 version * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation - * Author(s): Holger Smolinski * + * Report bugs to: + * + * Author(s): Holger Smolinski * Fritz Elfert contributed support for * /etc/silo.conf based on Intel's lilo */ @@ -37,6 +39,7 @@ { cft_strg, "root", NULL, NULL,NULL }, { cft_flag, "readonly", NULL, NULL,NULL }, { cft_strg, "verbose", NULL, NULL,NULL }, + { cft_strg, "testlevel", NULL, NULL,NULL }, { cft_end, NULL, NULL, NULL,NULL } }; @@ -46,6 +49,10 @@ /* end */ #define SILO_CFG "/etc/silo.conf" +#define SILO_IMAGE "./image" +#define SILO_BOOTMAP "./boot.map" +#define SILO_PARMFILE "./parmfile" +#define SILO_BOOTSECT "/boot/ipleckd.boot" #define PRINT_LEVEL(x,y...) if ( silo_options.verbosity >= x ) printf(y) #define ERROR_LEVEL(x,y...) if ( silo_options.verbosity >= x ) fprintf(stderr,y) @@ -63,31 +70,26 @@ struct silo_options { short int verbosity; - struct - { - unsigned char testonly; - } - flags; + short int testlevel; char *image; char *ipldevice; char *parmfile; char *ramdisk; char *bootsect; char *conffile; + char *bootmap; } silo_options = { 1, /* verbosity */ - { - 0, /* testonly */ - } - , - "./image", /* image */ + 2, /* testlevel */ + SILO_IMAGE, /* image */ NULL, /* ipldevice */ - NULL, /* parmfile */ + SILO_PARMFILE, /* parmfile */ NULL, /* initrd */ - "ipleckd.boot", /* bootsector */ - SILO_CFG /* silo.conf file */ + SILO_BOOTSECT, /* bootsector */ + SILO_CFG, /* silo.conf file */ + SILO_BOOTMAP, /* boot.map */ }; struct blockdesc @@ -114,9 +116,10 @@ printf ("-p parmfile : set parameter file to parmfile\n"); printf ("-b bootsect : set bootsector to bootsect\n"); printf ("Additional options\n"); + printf ("-B bootmap:\n"); printf ("-v: increase verbosity level\n"); printf ("-v#: set verbosity level to #\n"); - printf ("-t: toggle testonly flag\n"); + printf ("-t: decrease testing level\n"); printf ("-h: print this message\n"); printf ("-?: print this message\n"); printf ("-V: print version\n"); @@ -125,45 +128,70 @@ int read_cfg(struct silo_options *o) { + char *tmp; if (access(o->conffile, R_OK) && (errno == ENOENT)) return 0; /* If errno != ENOENT, let cfg_open report an error */ cfg_open(o->conffile); cfg_parse(cf_options); - o->ipldevice = cfg_get_strg(cf_options, "ipldevice"); - o->image = cfg_get_strg(cf_options, "image"); - o->parmfile = cfg_get_strg(cf_options, "parmfile"); + tmp = cfg_get_strg(cf_options, "ipldevice"); + if ( ! o->ipldevice && tmp ) + o->ipldevice = tmp; + tmp = cfg_get_strg(cf_options, "image"); + if ( ! strncmp(o-> image,SILO_IMAGE,strlen(SILO_IMAGE)) && tmp ) + o->image = tmp; + tmp = cfg_get_strg(cf_options, "parmfile"); + if ( !strncmp(o->parmfile,SILO_PARMFILE,strlen(SILO_PARMFILE)) && tmp) + o->parmfile = tmp; + if ( ! o -> ramdisk ) o->ramdisk = cfg_get_strg(cf_options, "ramdisk"); - o->bootsect = cfg_get_strg(cf_options, "bootsect"); - if (cfg_get_strg(cf_options, "verbose")) { + tmp = cfg_get_strg(cf_options, "bootsect"); + if ( !strncmp(o -> bootsect,SILO_BOOTSECT,strlen(SILO_BOOTSECT))&&tmp) + o->bootsect = tmp; + tmp = cfg_get_strg(cf_options, "map") ; + if ( !strncmp(o -> bootmap,SILO_BOOTMAP,strlen(SILO_BOOTMAP)) && tmp) + o->bootmap = tmp; + tmp = cfg_get_strg(cf_options, "verbose"); + if ( tmp ) { unsigned short v; - sscanf (cfg_get_strg(cf_options, "verbose"), "%hu", &v); + sscanf (tmp, "%hu", &v); o->verbosity = v; } + tmp = cfg_get_strg(cf_options, "testlevel"); + if ( tmp ) { + unsigned short t; + sscanf (tmp, "%hu", &t); + o->testlevel += t; + } return 1; } char * -gen_tmpparm() +gen_tmpparm( char *pfile ) { char *append = cfg_get_strg(cf_options, "append"); char *root = cfg_get_strg(cf_options, "root"); int ro = cfg_get_flag(cf_options, "readonly"); - FILE *f; + FILE *f,*of; char *fn; + char c; char *tmpdir=NULL,*save=NULL; if (!append && !root && !ro) - return NULL; - - tmpdir=getenv("TMPDIR"); - if (tmpdir) { - NTRY( save=(char*)malloc(strlen(tmpdir))); - NTRY( strcpy(save,tmpdir)); - } - ITRY( setenv("TMPDIR",".",1)); + return pfile; + of = fopen(pfile, "r"); + if ( of ) { NTRY( fn = tempnam(NULL,"parm.")); - NTRY( f = fopen(fn, "w")); + } else { + fn = pfile; + } + NTRY( f = fopen(fn, "a+")); + if ( of ) { + while ( ! feof (of) ) { + c=fgetc(of); + fputc(c,f); + } + } if (root) fprintf(f, "root=%s ", root); if (ro) @@ -172,8 +200,8 @@ fprintf(f, "%s", append); fprintf(f, "\n"); fclose(f); - if ( save ) - ITRY( setenv("TMPDIR",save,1)); + fclose(of); + printf ("tempfile is %s\n",fn); return strdup(fn); } @@ -183,18 +211,13 @@ int rc = 0; int oc; - read_cfg(o); - while ((oc = getopt (argc, argv, "Vf:F:d:p:r:b:B:h?v::t")) != -1) + while ((oc = getopt (argc, argv, "Vf:F:d:p:r:b:B:h?v::t::")) != -1) { switch (oc) { case 'V': printf("silo version: %s\n",SILO_VERSION); exit(0); - case 't': - TOGGLE (o->flags.testonly); - PRINT_LEVEL (1, "Testonly flag is now %sactive\n", o->flags.testonly ? "" : "in"); - break; case 'v': { unsigned short v; @@ -205,6 +228,16 @@ PRINT_LEVEL (1, "Verbosity value is now %hu\n", o->verbosity); break; } + case 't': + { + unsigned short t; + if (optarg && sscanf (optarg, "%hu", &t)) + o->testlevel -= t; + else + o->testlevel--; + PRINT_LEVEL (1, "Testonly flag is now %d\n", o->testlevel); + break; + } case 'h': case '?': usage (); @@ -227,12 +260,14 @@ case 'b': GETARG (o->bootsect); break; + case 'B': + GETARG (o->bootmap); default: rc = EINVAL; break; } } - + read_cfg(o); return rc; } @@ -276,6 +311,7 @@ struct stat st; int bs = 1024; int l; + ITRY (stat (name, &dst)); if (S_ISREG (dst.st_mode)) { @@ -309,11 +345,19 @@ int crc = 0; if (!o->ipldevice || !o->image || !o->bootsect) { + if (!o->ipldevice) + fprintf(stderr,"ipldevice\n"); + if (!o->image) + fprintf(stderr,"image\n"); + if (!o->bootsect) + fprintf(stderr,"bootsect\n"); + usage (); exit (1); } - PRINT_LEVEL (1, "IPL device is: '%s'", o->ipldevice); + PRINT_LEVEL (1, "Testlevel is set to %d\n",o->testlevel); + PRINT_LEVEL (1, "IPL device is: '%s'", o->ipldevice); ITRY (dev = verify_device (o->ipldevice)); PRINT_LEVEL (2, "...ok...(%d/%d)", (unsigned short) MAJOR (dev), (unsigned short) MINOR (dev)); PRINT_LEVEL (1, "\n"); @@ -323,18 +367,36 @@ PRINT_LEVEL (1, "...ok..."); PRINT_LEVEL (0, "\n"); + if ( o -> testlevel > 0 && + ! strncmp( o->bootmap, SILO_BOOTMAP,strlen(SILO_BOOTMAP) )) { + NTRY( o -> bootmap = tempnam(NULL,"boot.")); + } + PRINT_LEVEL (0, "bootmap is set to: '%s'", o->bootmap); + if ( access ( o->bootmap, O_RDWR ) == -1 ) { + if ( errno == ENOENT ) { + ITRY (creat ( o-> bootmap, O_RDWR )); + } else { + PRINT_LEVEL(1,"Cannot acces bootmap file '%s': %s\n",o->bootmap, + strerror(errno)); + } + } + ITRY (verify_file (o->bootmap, dev)); + PRINT_LEVEL (1, "...ok..."); + PRINT_LEVEL (0, "\n"); + PRINT_LEVEL (0, "Kernel image is: '%s'", o->image); ITRY (verify_file (o->image, dev)); PRINT_LEVEL (1, "...ok..."); PRINT_LEVEL (0, "\n"); - if (o->parmfile) - { - PRINT_LEVEL (0, "parameterfile is: '%s'", o->parmfile); + PRINT_LEVEL (0, "original parameterfile is: '%s'", o->parmfile); + ITRY (verify_file (o->parmfile, dev)); + PRINT_LEVEL (1, "...ok..."); + o->parmfile = gen_tmpparm(o->parmfile); + PRINT_LEVEL (0, "final parameterfile is: '%s'", o->parmfile); ITRY (verify_file (o->parmfile, dev)); PRINT_LEVEL (1, "...ok..."); PRINT_LEVEL (0, "\n"); - } if (o->ramdisk) { @@ -411,35 +473,34 @@ } int -write_bootsect (char *ipldevice, char *bootsect, struct blocklist *blklst) +write_bootsect (struct silo_options *o, struct blocklist *blklst) { int i; int s_fd, d_fd, b_fd, bd_fd; struct stat s_st, d_st, b_st; int rc=0; int bs, boots; - char *mapname; char *tmpdev; char buffer[4096]={0,}; - ITRY (d_fd = open (ipldevice, O_RDWR | O_SYNC)); + ITRY (d_fd = open (o->ipldevice, O_RDWR | O_SYNC)); ITRY (fstat (d_fd, &d_st)); - if (!(mapname = cfg_get_strg(cf_options, "map"))) - mapname = "boot.map"; - ITRY (s_fd = open (mapname, O_RDWR | O_TRUNC | O_CREAT | O_SYNC)); - ITRY (verify_file (bootsect, d_st.st_rdev)); + ITRY (s_fd = open (o->bootmap, O_RDWR | O_TRUNC | O_CREAT | O_SYNC)); + ITRY (verify_file (o->bootsect, d_st.st_rdev)); for (i = 0; i < blklst->ix; i++) { int offset = blklst->blk[i].off; int addrct = blklst->blk[i].addr | (blklst->blk[i].ct & 0xff); PRINT_LEVEL (1, "ix %i: offset: %06x count: %02x address: 0x%08x\n", i, offset, blklst->blk[i].ct & 0xff, blklst->blk[i].addr); + if ( o->testlevel <= 1 ) { NTRY (write (s_fd, &offset, sizeof (int))); NTRY (write (s_fd, &addrct, sizeof (int))); } + } ITRY (ioctl (s_fd,FIGETBSZ, &bs)); - ITRY (stat (mapname, &s_st)); + ITRY (stat (o->bootmap, &s_st)); if (s_st.st_size > bs ) { - ERROR_LEVEL (0,"%s is larger than one block\n", mapname); + ERROR_LEVEL (0,"%s is larger than one block\n", o->bootmap); rc = -1; errno = EINVAL; } @@ -454,11 +515,11 @@ close(s_fd); ITRY (unlink(tmpdev)); /* Now patch the bootsector */ - ITRY (b_fd = open (bootsect, O_RDONLY)); + ITRY (b_fd = open (o->bootsect, O_RDONLY)); NTRY (read (b_fd, buffer, 4096)); memset (buffer + 0xe0, 0, 8); *(int *) (buffer + 0xe0) = boots; - if ( ! silo_options.flags.testonly ) { + if ( o -> testlevel <= 0 ) { NTRY (write (d_fd, buffer, 4096)); NTRY (write (d_fd, buffer, 4096)); } @@ -471,7 +532,6 @@ do_silo (struct silo_options *o) { int rc = 0; - char *tmp_parmfile = NULL; int device_fd; int image_fd; @@ -482,19 +542,11 @@ { ITRY (add_file_to_blocklist (o->parmfile, &blklist, 0x00008000)); } - else - { - if ((tmp_parmfile = gen_tmpparm())) - ITRY (add_file_to_blocklist (tmp_parmfile, &blklist, 0x00008000)); - } if (o->ramdisk) { ITRY (add_file_to_blocklist (o->ramdisk, &blklist, 0x00800000)); } - ITRY (write_bootsect (o->ipldevice, o->bootsect, &blklist)); - if (tmp_parmfile) - ITRY (remove (tmp_parmfile)); - + ITRY (write_bootsect (o, &blklist)); return rc; } @@ -502,8 +554,20 @@ main (int argct, char *argv[]) { int rc = 0; + char *save=NULL; + char *tmpdir=getenv("TMPDIR"); + if (tmpdir) { + NTRY( save=(char*)malloc(strlen(tmpdir)+1)); + NTRY( strncpy(save,tmpdir,strlen(tmpdir)+1)); + } + ITRY( setenv("TMPDIR",".",1)); ITRY (parse_options (&silo_options, argct, argv)); ITRY (verify_options (&silo_options)); + if ( silo_options.testlevel > 0 ) { + printf ("WARNING: silo does not modify your volume. Use -t2 to change IPL records\n"); + } ITRY (do_silo (&silo_options)); + if ( save ) + ITRY( setenv("TMPDIR",save,1)); return rc; } diff -urN v2.2.15/linux/arch/s390/tools/silo/silo.conf linux/arch/s390/tools/silo/silo.conf --- v2.2.15/linux/arch/s390/tools/silo/silo.conf Wed May 3 17:16:31 2000 +++ linux/arch/s390/tools/silo/silo.conf Wed Jun 7 14:26:42 2000 @@ -1,7 +1,7 @@ -ipldevice = /dev/dasd00 +ipldevice = /dev/dasda image = /boot/image bootsect = /boot/ipleckd.boot map = /boot/boot.map root = /dev/dasd01 readonly -append = "dasd=200-20f" +append = "dasd=200-20f noinitrd" diff -urN v2.2.15/linux/arch/sparc/config.in linux/arch/sparc/config.in --- v2.2.15/linux/arch/sparc/config.in Wed May 3 17:16:31 2000 +++ linux/arch/sparc/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ # $Id: config.in,v 1.68.2.1 1999/09/22 11:37:34 jj Exp $ # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Linux/SPARC Kernel Configuration" @@ -92,6 +92,9 @@ fi tristate 'RAM disk support' CONFIG_BLK_DEV_RAM +if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then + int ' Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096 +fi if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD fi diff -urN v2.2.15/linux/arch/sparc64/config.in linux/arch/sparc64/config.in --- v2.2.15/linux/arch/sparc64/config.in Wed May 3 17:16:32 2000 +++ linux/arch/sparc64/config.in Wed Jun 7 14:26:42 2000 @@ -1,6 +1,6 @@ # $Id: config.in,v 1.67.2.5 1999/10/19 16:49:37 davem Exp $ # For a description of the syntax of this configuration file, -# see the Configure script. +# see Documentation/kbuild/config-language.txt. # mainmenu_name "Linux/UltraSPARC Kernel Configuration" @@ -104,6 +104,9 @@ fi tristate 'RAM disk support' CONFIG_BLK_DEV_RAM +if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then + int ' Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096 +fi if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD fi diff -urN v2.2.15/linux/arch/sparc64/defconfig linux/arch/sparc64/defconfig --- v2.2.15/linux/arch/sparc64/defconfig Wed May 3 17:16:32 2000 +++ linux/arch/sparc64/defconfig Wed Jun 7 14:26:42 2000 @@ -336,6 +336,7 @@ # # Native Language Support # +CONFIG_NLS_DEFAULT="cp437" # CONFIG_NLS_CODEPAGE_437 is not set # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set @@ -352,6 +353,10 @@ # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set diff -urN v2.2.15/linux/arch/sparc64/kernel/ioctl32.c linux/arch/sparc64/kernel/ioctl32.c --- v2.2.15/linux/arch/sparc64/kernel/ioctl32.c Wed May 3 17:16:32 2000 +++ linux/arch/sparc64/kernel/ioctl32.c Wed Jun 7 14:26:42 2000 @@ -1,8 +1,10 @@ -/* $Id: ioctl32.c,v 1.62.2.9 2000/01/15 04:40:57 davem Exp $ +/* $Id: ioctl32.c,v 1.62.2.12 2000/05/27 04:46:26 davem Exp $ * ioctl32.c: Conversion between 32bit and 64bit native ioctls. * * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) + * Copyright (C) 2000 Vinh Truong (vinh.truong@eng.sun.com) + * --- VT: add commands for envctrl driver in sys32_ioctl() * * These routines maintain argument size conversion between 32bit and 64bit * ioctls. @@ -38,6 +40,7 @@ #include #include #include +#include #include /* Ugly hack. */ @@ -1437,11 +1440,21 @@ __kernel_caddr_t32 buf; }; +struct cdrom_generic_command32 { + unsigned char cmd[CDROM_PACKET_SIZE]; + __kernel_caddr_t32 buffer; + unsigned int buflen; + int stat; + __kernel_caddr_t32 sense; + __kernel_caddr_t32 reserved[3]; +}; + static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) { mm_segment_t old_fs = get_fs(); struct cdrom_read cdread; struct cdrom_read_audio cdreadaudio; + struct cdrom_generic_command cgc; __kernel_caddr_t32 addr; char *data = 0; void *karg; @@ -1476,6 +1489,17 @@ return -ENOMEM; cdreadaudio.buf = data; break; + case CDROM_SEND_PACKET: + karg = &cgc; + err = copy_from_user(cgc.cmd, &((struct cdrom_generic_command32 *)arg)->cmd, sizeof(cgc.cmd)); + err |= __get_user(addr, &((struct cdrom_generic_command32 *)arg)->buffer); + err |= __get_user(cgc.buflen, &((struct cdrom_generic_command32 *)arg)->buflen); + if (err) + return -EFAULT; + if ((data = kmalloc(cgc.buflen, GFP_KERNEL)) == NULL) + return -ENOMEM; + cgc.buffer = data; + break; default: do { static int count = 0; @@ -1501,11 +1525,14 @@ case CDROMREADAUDIO: err = copy_to_user((char *)A(addr), data, cdreadaudio.nframes * 2352); break; + case CDROM_SEND_PACKET: + err = copy_to_user((char *)A(addr), data, cgc.buflen); default: break; } -out: if (data) kfree(data); - return err; +out: if (data) + kfree(data); + return err ? -EFAULT : 0; } struct loop_info32 { @@ -1996,6 +2023,8 @@ case HDIO_SET_NICE: case BLKROSET: case BLKROGET: + case BLKELVGET: + case BLKELVSET: /* 0x02 -- Floppy ioctls */ case FDMSGON: @@ -2141,8 +2170,16 @@ /* Little p (/dev/rtc, /dev/envctrl, etc.) */ case RTCGET: case RTCSET: - case I2CIOCSADR: - case I2CIOCGADR: + case ENVCTRL_RD_WARNING_TEMPERATURE: + case ENVCTRL_RD_SHUTDOWN_TEMPERATURE: + case ENVCTRL_RD_CPU_TEMPERATURE: + case ENVCTRL_RD_FAN_STATUS: + case ENVCTRL_RD_VOLTAGE_STATUS: + case ENVCTRL_RD_SCSI_TEMPERATURE: + case ENVCTRL_RD_ETHERNET_TEMPERATURE: + case ENVCTRL_RD_MTHRBD_TEMPERATURE: + case ENVCTRL_RD_CPU_VOLTAGE: + /* Little m */ case MTIOCTOP: @@ -2197,6 +2234,25 @@ case SG_EMULATED_HOST: case SG_SET_TRANSFORM: case SG_GET_TRANSFORM: + case SG_SET_RESERVED_SIZE: + case SG_GET_RESERVED_SIZE: + case SG_GET_SCSI_ID: + case SG_SET_FORCE_LOW_DMA: + case SG_GET_LOW_DMA: + case SG_SET_FORCE_PACK_ID: + case SG_GET_PACK_ID: + case SG_GET_NUM_WAITING: + case SG_SET_DEBUG: + case SG_GET_SG_TABLESIZE: + case SG_GET_MERGE_FD: + case SG_SET_MERGE_FD: + case SG_GET_COMMAND_Q: + case SG_SET_COMMAND_Q: + case SG_GET_UNDERRUN_FLAG: + case SG_SET_UNDERRUN_FLAG: + case SG_GET_VERSION_NUM: + case SG_NEXT_CMD_LEN: + case SG_SCSI_RESET: /* PPP stuff */ case PPPIOCGFLAGS: @@ -2248,6 +2304,12 @@ case CDROM_LOCKDOOR: case CDROM_DEBUG: case CDROM_GET_CAPABILITY: + case DVD_READ_STRUCT: + case DVD_WRITE_STRUCT: + case DVD_AUTH: + case CDROM_SEND_PACKET: + case CDROM_NEXT_WRITABLE: + case CDROM_LAST_WRITTEN: /* Big L */ case LOOP_SET_FD: diff -urN v2.2.15/linux/arch/sparc64/kernel/psycho.c linux/arch/sparc64/kernel/psycho.c --- v2.2.15/linux/arch/sparc64/kernel/psycho.c Tue Jan 4 10:12:13 2000 +++ linux/arch/sparc64/kernel/psycho.c Wed Jun 7 14:26:42 2000 @@ -1,4 +1,4 @@ -/* $Id: psycho.c,v 1.85.2.5 1999/10/28 02:28:38 davem Exp $ +/* $Id: psycho.c,v 1.85.2.9 2000/05/01 06:33:49 davem Exp $ * psycho.c: Ultra/AX U2P PCI controller support. * * Copyright (C) 1997 David S. Miller (davem@caipfs.rutgers.edu) @@ -936,6 +936,28 @@ } } +/* Older versions of OBP on PCI systems encode 64-bit MEM + * space assignments incorrectly, this fixes them up. + */ +static void __init fixup_obp_assignments(struct linux_prom_pci_registers *aregs, int numa) +{ + int i; + + for (i = 0; i < numa; i++) { + struct linux_prom_pci_registers *ap; + int space; + + ap = &aregs[i]; + space = ap->phys_hi >> 24; + if ((space & 0x3) == 2 && + (space & 0x4) != 0) { + ap->phys_hi &= ~(0x7 << 24); + ap->phys_hi |= 0x3 << 24; + } + } +} + + /* Walk PROM device tree under PBM, looking for 'assigned-address' * properties, and recording them in pci_vma's linked in via * PBM->assignments. @@ -990,6 +1012,8 @@ numa = (err / sizeof(struct linux_prom_pci_registers)); } + fixup_obp_assignments(&aregs[0], numa); + for(iter = 0; iter < numa; iter++) { struct linux_prom_pci_registers *ap = &aregs[iter]; struct pci_vma *vp; @@ -1158,15 +1182,6 @@ pdev->bus->number, pdev->devfn, pdev->vendor, pdev->device); continue; - } else if(bustype == 3) { - /* XXX add support for this... */ - printk("%s %02x.%02x [%04x,%04x]: " - "Warning, ignoring 64-bit PCI memory space, " - "tell Eddie C. Dost (ecd@skynet.be).\n", - __FUNCTION__, - pdev->bus->number, pdev->devfn, - pdev->vendor, pdev->device); - continue; } bsreg = (pregs[preg].phys_hi & 0xff); @@ -1242,6 +1257,14 @@ pdev->base_address[brindex] |= 1; IO_seen = 1; } else { + /* Preserve type bits. */ + if (bustype == 0x3) { + /* 64-bit */ + pdev->base_address[brindex] |= 4; + } else if (bustype == 0x2) { + /* below 1M */ + pdev->base_address[brindex] |= 2; + } MEM_seen = 1; } } @@ -1260,8 +1283,13 @@ ridx = ((breg - PCI_BASE_ADDRESS_0) >> 2); base = (unsigned int)pdev->base_address[ridx]; - if(pdev->base_address[ridx] > PAGE_OFFSET) + if(pdev->base_address[ridx] > PAGE_OFFSET) { + if (((base & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) && + ((base & PCI_BASE_ADDRESS_MEM_TYPE_MASK) + == PCI_BASE_ADDRESS_MEM_TYPE_64)) + breg += 4; continue; + } io = (base & PCI_BASE_ADDRESS_SPACE)==PCI_BASE_ADDRESS_SPACE_IO; base &= ~((io ? @@ -1653,9 +1681,11 @@ return 0; } /* - * Underneath a bridge, use register of parent bridge. + * Underneath a bridge, use register of parent bridge + * closest to the PBM. */ if (pdev->bus->number != pbm->pci_first_busno) { + struct pci_dev *pwalk; struct pcidev_cookie *pcp; int node, offset; char prom_name[64]; @@ -1663,7 +1693,13 @@ #ifdef FIXUP_IRQ_DEBUG dprintf("UnderBridge, "); #endif - pcp = pdev->bus->self->sysdata; + + pwalk = pdev->bus->self; + while (pwalk->bus && + pwalk->bus->number != pbm->pci_first_busno) + pwalk = pwalk->bus->self; + + pcp = pwalk->sysdata; if (!pcp) { #ifdef FIXUP_IRQ_DEBUG dprintf("No bus PCP\n"); @@ -1873,6 +1909,8 @@ numaa = 0; else numaa = (err / sizeof(struct linux_prom_pci_registers)); + + fixup_obp_assignments(&assigned[0], numaa); /* First, scan and fixup base registers. */ fixup_regs(pdev, pbm, pregs, nregs, &assigned[0], numaa); diff -urN v2.2.15/linux/arch/sparc64/kernel/sparc64_ksyms.c linux/arch/sparc64/kernel/sparc64_ksyms.c --- v2.2.15/linux/arch/sparc64/kernel/sparc64_ksyms.c Wed May 3 17:16:32 2000 +++ linux/arch/sparc64/kernel/sparc64_ksyms.c Wed Jun 7 14:26:42 2000 @@ -1,4 +1,4 @@ -/* $Id: sparc64_ksyms.c,v 1.58.2.3 1999/09/22 17:07:00 jj Exp $ +/* $Id: sparc64_ksyms.c,v 1.58.2.7 2000/05/27 04:46:26 davem Exp $ * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -81,6 +81,7 @@ extern int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg); extern int sys32_ioctl(unsigned int fd, unsigned int cmd, u32 arg); extern int (*handle_mathemu)(struct pt_regs *, struct fpustate *); +extern void VISenter(void); extern void bcopy (const char *, char *, int); extern int __ashrdi3(int, int); @@ -109,10 +110,10 @@ */ #define EXPORT_SYMBOL_PRIVATE(sym) \ -extern int __sparc_priv_ ## sym (int) __asm__("__" ## #sym); \ +extern int __sparc_priv_ ## sym (int) __asm__("__" #sym); \ const struct module_symbol __export_priv_##sym \ __attribute__((section("__ksymtab"))) = \ -{ (unsigned long) &__sparc_priv_ ## sym, "__" ## #sym } +{ (unsigned long) &__sparc_priv_ ## sym, "__" #sym } /* used by various drivers */ #ifdef __SMP__ @@ -234,7 +235,7 @@ /* sparc library symbols */ EXPORT_SYMBOL(bcopy); EXPORT_SYMBOL(__strlen); -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) EXPORT_SYMBOL(strlen); #endif EXPORT_SYMBOL(strnlen); @@ -298,6 +299,9 @@ * and will always be 'void __ret_efault(void)'. */ EXPORT_SYMBOL_NOVERS(__ret_efault); +/* VISenter is defined in assembly as well. + */ +EXPORT_SYMBOL_NOVERS(VISenter); /* No version information on these, as gcc produces such symbols. */ EXPORT_SYMBOL_NOVERS(memcmp); diff -urN v2.2.15/linux/arch/sparc64/kernel/unaligned.c linux/arch/sparc64/kernel/unaligned.c --- v2.2.15/linux/arch/sparc64/kernel/unaligned.c Thu Apr 22 19:24:51 1999 +++ linux/arch/sparc64/kernel/unaligned.c Wed Jun 7 14:26:42 2000 @@ -1,4 +1,4 @@ -/* $Id: unaligned.c,v 1.15 1999/04/03 11:36:21 anton Exp $ +/* $Id: unaligned.c,v 1.15.2.2 2000/04/03 23:22:37 davem Exp $ * unaligned.c: Unaligned load/store trap handling with special * cases for the kernel to do them more quickly. * @@ -587,9 +587,19 @@ maybe_flush_windows(0, 0, rd, from_kernel); reg = fetch_reg_addr(rd, regs); - if ((insn & 0x780000) == 0x180000) - reg[1] = 0; - reg[0] = 0; + if (from_kernel || rd < 16) { + reg[0] = 0; + if ((insn & 0x780000) == 0x180000) + reg[1] = 0; + } else if (current->tss.flags & SPARC_FLAG_32BIT) { + put_user(0, (int *)reg); + if ((insn & 0x780000) == 0x180000) + put_user(0, ((int *)reg) + 1); + } else { + put_user(0, reg); + if ((insn & 0x780000) == 0x180000) + put_user(0, reg + 1); + } advance(regs); } diff -urN v2.2.15/linux/arch/sparc64/mm/ultra.S linux/arch/sparc64/mm/ultra.S --- v2.2.15/linux/arch/sparc64/mm/ultra.S Wed May 3 17:16:32 2000 +++ linux/arch/sparc64/mm/ultra.S Wed Jun 7 14:26:42 2000 @@ -1,4 +1,4 @@ -/* $Id: ultra.S,v 1.32.2.3 2000/03/03 23:50:46 davem Exp $ +/* $Id: ultra.S,v 1.32.2.4 2000/05/05 18:50:48 davem Exp $ * ultra.S: Don't expand these all over the place... * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) @@ -37,7 +37,7 @@ */ #define TLB_MAGIC 207 /* Students, do you know how I calculated this? -DaveM */ /*IC3*/ cmp %o5, %o4 - be,pt %xcc, __flush_tlb_page + bleu,pt %xcc, __flush_tlb_page srlx %o5, 13, %g5 cmp %g5, TLB_MAGIC bgeu,pn %icc, __flush_tlb_range_constant_time diff -urN v2.2.15/linux/drivers/block/Config.in linux/drivers/block/Config.in --- v2.2.15/linux/drivers/block/Config.in Wed May 3 17:16:32 2000 +++ linux/drivers/block/Config.in Wed Jun 7 14:26:42 2000 @@ -111,6 +111,9 @@ bool ' Boot support (linear, striped)' CONFIG_MD_BOOT fi tristate 'RAM disk support' CONFIG_BLK_DEV_RAM +if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then + int ' Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096 +fi if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD fi diff -urN v2.2.15/linux/drivers/block/genhd.c linux/drivers/block/genhd.c --- v2.2.15/linux/drivers/block/genhd.c Wed May 3 17:16:33 2000 +++ linux/drivers/block/genhd.c Wed Jun 7 14:26:42 2000 @@ -165,14 +165,6 @@ SYS_IND(p) == LINUX_EXTENDED_PARTITION); } -static int sector_partition_scale(kdev_t dev) -{ - if (hardsect_size[MAJOR(dev)] != NULL) - return (hardsect_size[MAJOR(dev)][MINOR(dev)]/512); - else - return (1); -} - static unsigned int get_ptable_blocksize(kdev_t dev) { int ret = 1024; @@ -234,20 +226,23 @@ #define MSDOS_LABEL_MAGIC 0xAA55 -static void extended_partition(struct gendisk *hd, kdev_t dev) +static void extended_partition(struct gendisk *hd, kdev_t dev, int sector_size) { struct buffer_head *bh; struct partition *p; unsigned long first_sector, first_size, this_sector, this_size; int mask = (1 << hd->minor_shift) - 1; - int sector_size = sector_partition_scale(dev); int i; + int loopct = 0; /* number of links followed + without finding a data partition */ first_sector = hd->part[MINOR(dev)].start_sect; first_size = hd->part[MINOR(dev)].nr_sects; this_sector = first_sector; while (1) { + if (++loopct > 100) + return; if ((current_minor & mask) == 0) return; if (!(bh = bread(dev,0,get_ptable_blocksize(dev)))) @@ -295,6 +290,7 @@ current_minor++; if ((current_minor & mask) == 0) goto done; + loopct = 0; } /* * Next, process the (first) extended partition, if present. @@ -330,6 +326,7 @@ struct buffer_head *bh; struct solaris_x86_vtoc *v; struct solaris_x86_slice *s; + int mask = (1 << hd->minor_shift) - 1; int i; if(!(bh = bread(dev, 0, get_ptable_blocksize(dev)))) @@ -346,10 +343,14 @@ return; } for(i=0; iv_slice[i]; if (s->s_size == 0) continue; + printk(" [s%d]", i); /* solaris partitions are relative to current MS-DOS * one but add_partition starts relative to sector @@ -486,7 +487,8 @@ struct partition *p; unsigned char *data; int mask = (1 << hd->minor_shift) - 1; - int sector_size = sector_partition_scale(dev); + int sector_size; + int disk_number_of_sects; #ifdef CONFIG_BSD_DISKLABEL /* no bsd disklabel as a default */ kdev_t bsd_kdev = 0; @@ -501,6 +503,15 @@ printk(" unable to read partition table\n"); return -1; } + + /* in some cases (backwards compatibility) we'll adjust the + * sector_size below + */ + if (hardsect_size[MAJOR(dev)] != NULL) + sector_size=hardsect_size[MAJOR(dev)][MINOR(dev)]/512; + else + sector_size=1; + data = bh->b_data; /* In some cases we modify the geometry */ /* of the drive (below), so ensure that */ @@ -585,6 +596,35 @@ } #endif /* CONFIG_BLK_DEV_IDE */ + /* + * The Linux code now honours the rules the MO people set and + * is 'DOS compatible' - sizes are scaled by the media block + * size not 512 bytes. The following is a backwards + * compatibility check. If a 1k or greater sectorsize disk + * (1024, 2048, etc) was created under a pre 2.2 kernel, + * the partition table wrongly used units of 512 instead of + * units of sectorsize (1024, 2048, etc.) The below check attempts + * to detect a partition table created under the older kernel, and + * if so detected, it will reset the a sector scale factor to 1 (i.e. + * no scaling). + */ + disk_number_of_sects = NR_SECTS((&hd->part[MINOR(dev)])); + for (i = 0; i < 4; i++) { + struct partition *q = &p[i]; + if (NR_SECTS(q)) { + if (((first_sector+(START_SECT(q)+NR_SECTS(q))*sector_size) > + (disk_number_of_sects+1)) && + ((first_sector+(START_SECT(q)+NR_SECTS(q)) <= + disk_number_of_sects))) { + char buf[MAX_DISKNAME_LEN]; + printk(" %s: RESETTINGING SECTOR SCALE from %d to 1", + disk_name(hd, MINOR(dev), buf), sector_size); + sector_size=1; + break; + } + } + } + current_minor += 4; /* first "extra" minor (for extended partitions) */ for (i=1 ; i<=4 ; minor++,i++,p++) { if (!NR_SECTS(p)) @@ -601,7 +641,7 @@ */ hd->sizes[minor] = hd->part[minor].nr_sects >> (BLOCK_SIZE_BITS - 9); - extended_partition(hd, MKDEV(hd->major, minor)); + extended_partition(hd, MKDEV(hd->major, minor), sector_size); printk(" >"); /* prevent someone doing mkfs or mkswap on an extended partition, but leave room for LILO */ @@ -1335,6 +1375,114 @@ #endif /* CONFIG_ULTRIX_PARTITION */ +#ifdef CONFIG_ARCH_S390 +#include +#include "../s390/block/dasd_types.h" + +dasd_information_t **dasd_information = NULL; + +typedef enum { + ibm_partition_none = 0, + ibm_partition_lnx1 = 1, + ibm_partition_vol1 = 3, + ibm_partition_cms1 = 4 +} ibm_partition_t; + +static ibm_partition_t +get_partition_type ( char * type ) +{ + static char lnx[5]="LNX1"; + static char vol[5]="VOL1"; + static char cms[5]="CMS1"; + if ( ! strncmp ( lnx, "LNX1",4 ) ) { + ASCEBC(lnx,4); + ASCEBC(vol,4); + ASCEBC(cms,4); + } + if ( ! strncmp (type,lnx,4) || + ! strncmp (type,"LNX1",4) ) + return ibm_partition_lnx1; + if ( ! strncmp (type,vol,4) ) + return ibm_partition_vol1; + if ( ! strncmp (type,cms,4) ) + return ibm_partition_cms1; + return ibm_partition_none; +} + +int +ibm_partition (struct gendisk *hd, kdev_t dev, int first_sector) +{ + struct buffer_head *bh; + ibm_partition_t partition_type; + char type[5] = {0,}; + char name[7] = {0,}; + int di = MINOR(dev) >> hd->minor_shift; + if ( ! get_ptable_blocksize(dev) ) + return 0; + if ( ! dasd_information ) + return 0; + if ( ( bh = bread( dev, + dasd_information[di]->sizes.label_block, + dasd_information[di]->sizes.bp_sector ) ) != NULL ) { + strncpy ( type,bh -> b_data, 4); + strncpy ( name,bh -> b_data + 4, 6); + } else { + return 0; + } + if ( (*(char *)bh -> b_data) & 0x80 ) { + EBCASC(name,6); + } + switch ( partition_type = get_partition_type(type) ) { + case ibm_partition_lnx1: + printk ( "(LNX1)/%6s:",name); + add_partition( hd, MINOR(dev) + 1, + (dasd_information[di]->sizes.label_block + 1) << + dasd_information[di]->sizes.s2b_shift, + (dasd_information [di]->sizes.blocks - + dasd_information[di]->sizes.label_block - 1) << + dasd_information[di]->sizes.s2b_shift,0 ); + break; + case ibm_partition_vol1: + printk ( "(VOL1)/%6s:",name); + break; + case ibm_partition_cms1: + printk ( "(CMS1)/%6s:",name); + if (* (((long *)bh->b_data) + 13) == 0) { + /* disk holds a CMS filesystem */ + add_partition( hd, MINOR(dev) + 1, + (dasd_information [di]->sizes.label_block + 1) << + dasd_information [di]->sizes.s2b_shift, + (dasd_information [di]->sizes.blocks - + dasd_information [di]->sizes.label_block) << + dasd_information [di]->sizes.s2b_shift,0 ); + printk ("(CMS)"); + } else { + /* disk is reserved minidisk */ + long *label=(long*)bh->b_data; + int offset = label[13]; + int size = (label[7]-1-label[13])*(label[3]>>9); + add_partition( hd, MINOR(dev) + 1, + offset << dasd_information [di]->sizes.s2b_shift, + size<sizes.s2b_shift,0 ); + printk ("(MDSK)"); + } + break; + case ibm_partition_none: + printk ( "(nonl)/ :"); + add_partition( hd, MINOR(dev) + 1, + (dasd_information [di]->sizes.label_block + 1) << + dasd_information [di]->sizes.s2b_shift, + (dasd_information [di]->sizes.blocks - + dasd_information [di]->sizes.label_block - 1) << + dasd_information [di]->sizes.s2b_shift,0 ); + break; + } + printk ( "\n" ); + bforget(bh); + return 1; +} +#endif + static void check_partition(struct gendisk *hd, kdev_t dev) { static int first_time = 1; @@ -1386,6 +1534,10 @@ #endif #ifdef CONFIG_ULTRIX_PARTITION if(ultrix_partition(hd, dev, first_sector)) + return; +#endif +#ifdef CONFIG_ARCH_S390 + if (ibm_partition (hd, dev, first_sector)) return; #endif printk(" unknown partition table\n"); diff -urN v2.2.15/linux/drivers/block/ide-cd.c linux/drivers/block/ide-cd.c --- v2.2.15/linux/drivers/block/ide-cd.c Wed May 3 17:16:33 2000 +++ linux/drivers/block/ide-cd.c Wed Jun 7 14:26:42 2000 @@ -2,7 +2,7 @@ * linux/drivers/block/ide-cd.c * Copyright (C) 1994, 1995, 1996 scott snyder * Copyright (C) 1996-1998 Erik Andersen - * Copyright (C) 1998, 1999 Jens Axboe + * Copyright (C) 1998-2000 Jens Axboe * * May be copied or modified under the terms of the GNU General Public * License. See linux/COPYING for more information. @@ -12,29 +12,20 @@ * * Suggestions are welcome. Patches that work are more welcome though. ;-) * For those wishing to work on this driver, please be sure you download - * and comply with the latest ATAPI standard. This document can be - * obtained by anonymous ftp from: + * and comply with the latest Mt. Fuji (SFF8090 version 4) and ATAPI + * (SFF-8020i rev 2.6) standards. These documents can be obtained by + * anonymous ftp from: * ftp://fission.dt.wdc.com/pub/standards/SFF_atapi/spec/SFF8020-r2.6/PS/8020r26.ps + * ftp://ftp.avc-pioneer.com/Mtfuji4/Spec/Fuji4r10.pdf * - * Drives that deviate from the ATAPI standard will be accomodated as much + * Drives that deviate from these standards will be accomodated as much * as possible via compile time or command-line options. Since I only have * a few drives, you generally need to send me patches... * * ---------------------------------- * TO DO LIST: - * -Implement Microsoft Media Status Notification per the spec at - * http://www.microsoft.com/hwdev/respec/storspec.htm - * This will allow us to get automagically notified when the media changes - * on ATAPI drives (something the stock ATAPI spec is lacking). Looks - * very cool. I discovered its existance the other day at work... - * -Query the drive to find what features are available before trying to - * use them (like trying to close the tray in drives that can't). * -Make it so that Pioneer CD DR-A24X and friends don't get screwed up on * boot - * -Integrate DVD-ROM support in driver. Thanks to Merete Gotsćd-Petersen - * of Pioneer Denmark for providing me with a drive for testing. - * -Implement Features and Profiles. - * * * ---------------------------------- * 1.00 Oct 31, 1994 -- Initial version. @@ -243,20 +234,58 @@ * Useful when using ide-cd in conjunction with * ide-scsi. TODO: non-modular way of doing the * same. - * - * 4.54 Sep 09, 1999 - Fixed start/stop error on some drives if the - * drive was locked. - * - Fixed read_toc header, size given was too large. - * - Fixed possible leaks in ioctl. - * - CDROMREADTOCENTRY now honors the cdte_format - * field, instead of forcing CDROM_LBA. - * - Mask out things the drive can't do instead of - * just telling people what the driver can do. + * + * 4.54 Aug 5, 1999 - Support for MMC2 class commands through the generic + * packet interface to cdrom.c. + * - Unified audio ioctl support, most of it. + * - cleaned up various deprecated verify_area(). + * - Added ide_cdrom_packet() as the interface for + * the Uniform generic_packet(). + * - bunch of other stuff, will fill in logs later. + * - report 1 slot for non-changers, like the other + * cd-rom drivers. don't report select disc for + * non-changers as well. + * - mask out audio playing, if the device can't do it. + * + * 4.55 Sep 1, 1999 - Eliminated the rest of the audio ioctls, except + * for CDROMREADTOC[ENTRY|HEADER]. Some of the drivers + * use this independently of the actual audio handling. + * They will disappear later when I get the time to + * do it cleanly. + * - Minimize the TOC reading - only do it when we + * know a media change has occured. + * - Moved all the CDROMREADx ioctls to the Uniform layer. + * - Heiko Eissfeldt supplied + * some fixes for CDI. + * - CD-ROM leaving door locked fix from Andries + * Brouwer + * - Erik Andersen unified + * commands across the various drivers and how + * sense errors are handled. + * + * 4.56 Sep 12, 1999 - Removed changer support - it is now in the + * Uniform layer. + * - Added partition based multisession handling. + * - Mode sense and mode select moved to the + * Uniform layer. + * - Fixed a problem with WPI CDS-32X drive - it + * failed the capabilities + * + * 4.57 never happened + * + * 4.58 May 1, 2000 - Fixed possible oops in ide_cdrom_get_last_session() + * - Fix locking mania and make ide_cdrom_reset relock + * - Stop spewing errors to log when magicdev polls with + * TEST_UNIT_READY on some drives. + * - Cleanup ACER50 stuff. + * - Integrate the ide_cdrom_packet from 2.3 to + * support DVD CSS ioctls. * *************************************************************************/ + +#define IDECD_VERSION "4.58" -#define IDECD_VERSION "4.54" - +#include #include #include #include @@ -266,6 +295,7 @@ #include #include #include + #include #include #include @@ -293,12 +323,11 @@ static -void cdrom_analyze_sense_data (ide_drive_t *drive, - struct atapi_request_sense *reqbuf, - struct packet_command *failed_command) +void cdrom_analyze_sense_data (ide_drive_t *drive, struct packet_command *pc, + struct request_sense *sense) { - if (reqbuf->sense_key == NOT_READY || - reqbuf->sense_key == UNIT_ATTENTION) { + if (sense->sense_key == NOT_READY || + sense->sense_key == UNIT_ATTENTION) { /* Make good and sure we've seen this potential media change. Some drives (i.e. Creative) fail to present the correct sense key in the error register. */ @@ -309,22 +338,21 @@ READ_SUBCHANNEL. Workman (and probably other programs) uses this command to poll the drive, and we don't want to fill the syslog with useless errors. */ - if (failed_command && - failed_command->c[0] == SCMD_READ_SUBCHANNEL) + if (pc && (pc->c[0] == GPCMD_READ_SUBCHANNEL)) return; } - if (failed_command && (failed_command->c[0] == TEST_UNIT_READY)) + if (pc && (pc->c[0] == GPCMD_TEST_UNIT_READY)) return; - if (reqbuf->error_code == 0x70 && reqbuf->sense_key == 0x02 - && ((reqbuf->asc == 0x3a && reqbuf->ascq == 0x00) || - (reqbuf->asc == 0x04 && reqbuf->ascq == 0x01))) + if (sense->error_code == 0x70 && sense->sense_key == 0x02 + && ((sense->asc == 0x3a && sense->ascq == 0x00) || + (sense->asc == 0x04 && sense->ascq == 0x01))) { /* * Suppress the following errors: - * "Medium not present", and "in progress of becoming ready", - * to keep the noise level down to a dull roar. + * "Medium not present", "in progress of becoming ready", + * and "writing" to keep the noise level down to a dull roar. */ return; } @@ -336,35 +364,38 @@ char buf[80]; printk ("ATAPI device %s:\n", drive->name); - if (reqbuf->error_code==0x70) + if (sense->error_code == 0x70) printk(" Error: "); - else if (reqbuf->error_code==0x71) + else if (sense->error_code == 0x71) printk(" Deferred Error: "); + else if (sense->error_code == 0x7f) + printk(" Vendor-specific Error: "); else printk(" Unknown Error Type: "); - if ( reqbuf->sense_key < ARY_LEN (sense_key_texts)) - s = sense_key_texts[reqbuf->sense_key]; + if (sense->sense_key < ARY_LEN(sense_key_texts)) + s = sense_key_texts[sense->sense_key]; else s = "bad sense key!"; - printk ("%s -- (Sense key=0x%02x)\n", s, reqbuf->sense_key); + printk ("%s -- (Sense key=0x%02x)\n", s, sense->sense_key); - if (reqbuf->asc == 0x40) { + if (sense->asc == 0x40) { sprintf (buf, "Diagnostic failure on component 0x%02x", - reqbuf->ascq); + sense->ascq); s = buf; } else { int lo=0, mid, hi=ARY_LEN (sense_data_texts); - unsigned short key = (reqbuf->asc << 8); - if ( ! (reqbuf->ascq >= 0x80 && reqbuf->ascq <= 0xdd) ) - key |= reqbuf->ascq; - + unsigned long key = (sense->sense_key << 16); + key |= (sense->asc << 8); + if ( ! (sense->ascq >= 0x80 && sense->ascq <= 0xdd) ) + key |= sense->ascq; s = NULL; while (hi > lo) { mid = (lo + hi) / 2; - if (sense_data_texts[mid].asc_ascq == key) { + if (sense_data_texts[mid].asc_ascq == key || + sense_data_texts[mid].asc_ascq == (0xff0000|key)) { s = sense_data_texts[mid].text; break; } @@ -376,53 +407,60 @@ } if (s == NULL) { - if (reqbuf->asc > 0x80) + if (sense->asc > 0x80) s = "(vendor-specific error)"; else s = "(reserved error code)"; } printk (" %s -- (asc=0x%02x, ascq=0x%02x)\n", - s, reqbuf->asc, reqbuf->ascq); + s, sense->asc, sense->ascq); - if (failed_command != NULL) { + if (pc != NULL) { int lo=0, mid, hi= ARY_LEN (packet_command_texts); s = NULL; while (hi > lo) { mid = (lo + hi) / 2; - if (packet_command_texts[mid].packet_command == failed_command->c[0]) { + if (packet_command_texts[mid].packet_command == pc->c[0]) { s = packet_command_texts[mid].text; break; } - else if (packet_command_texts[mid].packet_command > failed_command->c[0]) + else if (packet_command_texts[mid].packet_command > pc->c[0]) hi = mid; else lo = mid+1; } printk (" The failed \"%s\" packet command was: \n \"", s); - for (i=0; ic); i++) - printk ("%02x ", failed_command->c[i]); - printk ("\"\n"); + for (i = 0; i < sizeof(pc->c); i++) + printk("%02x ", pc->c[i]); + printk("\"\n"); + } + + /* The SKSV bit specifies validity of the sense_key_specific + * in the next two commands. It is bit 7 of the first byte. + * In the case of NOT_READY, if SKSV is set the drive can + * give us nice ETA readings. + */ + if (sense->sense_key == NOT_READY && (sense->sks[0] & 0x80)) { + int progress = (sense->sks[1] << 8 | sense->sks[2]) * 100; + printk(" Command is %02d%% complete\n", progress / 0xffff); + } - if (reqbuf->sense_key == ILLEGAL_REQUEST && - (reqbuf->sense_key_specific[0] & 0x80) != 0) { + if (sense->sense_key == ILLEGAL_REQUEST && + (sense->sks[0] & 0x80) != 0) { printk (" Error in %s byte %d", - (reqbuf->sense_key_specific[0] & 0x40) != 0 - ? "command packet" - : "command data", - (reqbuf->sense_key_specific[1] << 8) + - reqbuf->sense_key_specific[2]); - - if ((reqbuf->sense_key_specific[0] & 0x40) != 0) { - printk (" bit %d", - reqbuf->sense_key_specific[0] & 0x07); - } + (sense->sks[0] & 0x40) != 0 ? + "command packet" : "command data", + (sense->sks[1] << 8) + sense->sks[2]); + + if ((sense->sks[0] & 0x40) != 0) + printk (" bit %d", sense->sks[0] & 0x07); - printk ("\n"); + printk("\n"); } } @@ -431,92 +469,57 @@ /* Suppress printing unit attention and `in progress of becoming ready' errors when we're not being verbose. */ - if (reqbuf->sense_key == UNIT_ATTENTION || - (reqbuf->sense_key == NOT_READY && (reqbuf->asc == 4 || - reqbuf->asc == 0x3a))) + if (sense->sense_key == UNIT_ATTENTION || + (sense->sense_key == NOT_READY && (sense->asc == 4 || + sense->asc == 0x3a))) return; - printk ("%s: error code: 0x%02x sense_key: 0x%02x asc: 0x%02x ascq: 0x%02x\n", - drive->name, - reqbuf->error_code, reqbuf->sense_key, - reqbuf->asc, reqbuf->ascq); + printk("%s: error code: 0x%02x sense_key: 0x%02x asc: 0x%02x ascq: 0x%02x\n", + drive->name, sense->error_code, sense->sense_key, + sense->asc, sense->ascq); #endif /* not VERBOSE_IDE_CD_ERRORS */ } - -/* Fix up a possibly partially-processed request so that we can - start it over entirely, or even put it back on the request queue. */ -static void restore_request (struct request *rq) -{ - if (rq->buffer != rq->bh->b_data) { - int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE; - rq->buffer = rq->bh->b_data; - rq->nr_sectors += n; - rq->sector -= n; - } - rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS; -} - - -static void cdrom_queue_request_sense (ide_drive_t *drive, - struct semaphore *sem, - struct atapi_request_sense *reqbuf, - struct packet_command *failed_command) +static void cdrom_queue_request_sense(ide_drive_t *drive, + struct semaphore *sem, + struct request_sense *sense, + struct packet_command *failed_cmd) { struct cdrom_info *info = drive->driver_data; struct request *rq; - struct packet_command *pc; - int len; + struct packet_command *pc = &info->request_sense_pc; - /* If the request didn't explicitly specify where - to put the sense data, use the statically allocated structure. */ - if (reqbuf == NULL) - reqbuf = &info->sense_data; - - /* Make up a new request to retrieve sense information. */ - - pc = &info->request_sense_pc; - memset (pc, 0, sizeof (*pc)); - - /* The request_sense structure has an odd number of (16-bit) words, - which won't work well with 32-bit transfers. However, we don't care - about the last two bytes, so just truncate the structure down - to an even length. */ - len = sizeof (*reqbuf) / 4; - len *= 4; - - pc->c[0] = REQUEST_SENSE; - pc->c[4] = (unsigned char) len; - pc->buffer = (char *)reqbuf; - pc->buflen = len; - pc->sense_data = (struct atapi_request_sense *)failed_command; + if (sense == NULL) + sense = &info->sense_data; - /* stuff the sense request in front of our current request */ + memset(pc, 0, sizeof(struct packet_command)); + pc->c[0] = GPCMD_REQUEST_SENSE; + pc->c[4] = pc->buflen = 18; + pc->buffer = (char *) sense; + pc->sense = (struct request_sense *) failed_cmd; + /* stuff the sense request in front of our current request */ rq = &info->request_sense_request; - ide_init_drive_cmd (rq); + ide_init_drive_cmd(rq); rq->cmd = REQUEST_SENSE_COMMAND; - rq->buffer = (char *)pc; + rq->buffer = (char *) pc; rq->sem = sem; - (void) ide_do_drive_cmd (drive, rq, ide_preempt); + (void) ide_do_drive_cmd(drive, rq, ide_preempt); } - static void cdrom_end_request (int uptodate, ide_drive_t *drive) { struct request *rq = HWGROUP(drive)->rq; if (rq->cmd == REQUEST_SENSE_COMMAND && uptodate) { - struct packet_command *pc = (struct packet_command *) - rq->buffer; + struct packet_command *pc = (struct packet_command *)rq->buffer; cdrom_analyze_sense_data (drive, - (struct atapi_request_sense *) - (pc->buffer - pc->c[4]), - (struct packet_command *) - pc->sense_data); + (struct packet_command *) pc->sense, + (struct request_sense *) pc->buffer - pc->c[4]); } if (rq->cmd == READ && !rq->current_nr_sectors) uptodate = 1; + ide_end_request (uptodate, HWGROUP(drive)); } @@ -527,8 +530,9 @@ int *stat_ret) { struct request *rq = HWGROUP(drive)->rq; - int stat, err, sense_key, cmd; - + int stat, cmd, err, sense_key; + struct packet_command *pc; + /* Check for errors. */ stat = GET_STAT(); *stat_ret = stat; @@ -536,8 +540,8 @@ if (OK_STAT (stat, good_stat, BAD_R_STAT)) return 0; - /* Got an error. */ - err = IN_BYTE (IDE_ERROR_REG); + /* Get the IDE error register. */ + err = GET_ERR(); sense_key = err >> 4; if (rq == NULL) @@ -551,8 +555,7 @@ from the drive (probably while trying to recover from a former error). Just give up. */ - struct packet_command *pc = (struct packet_command *) - rq->buffer; + pc = (struct packet_command *) rq->buffer; pc->stat = 1; cdrom_end_request (1, drive); *startstop = ide_error (drive, "request sense failure", stat); @@ -561,23 +564,12 @@ } else if (cmd == PACKET_COMMAND) { /* All other functions, except for READ. */ - struct packet_command *pc = (struct packet_command *) - rq->buffer; struct semaphore *sem = NULL; + pc = (struct packet_command *) rq->buffer; /* Check for tray open. */ if (sense_key == NOT_READY) { cdrom_saw_media_change (drive); -#if 0 /* let the upper layers do the complaining */ - /* Print an error message to the syslog. - Exception: don't print anything if this - is a read subchannel command. This is - because workman constantly polls the drive - with this command, and we don't want - to uselessly fill up the syslog. */ - if (pc->c[0] != SCMD_READ_SUBCHANNEL) - printk ("%s: tray open or drive not ready\n", drive->name); -#endif } else if (sense_key == UNIT_ATTENTION) { /* Check for media change. */ cdrom_saw_media_change (drive); @@ -607,8 +599,8 @@ cdrom_end_request (1, drive); if ((stat & ERR_STAT) != 0) - cdrom_queue_request_sense (drive, sem, - pc->sense_data, pc); + cdrom_queue_request_sense(drive, sem, pc->sense, + pc); } else { /* Handle errors from READ requests. */ @@ -647,8 +639,7 @@ /* If we got a CHECK_CONDITION status, queue a request sense command. */ if ((stat & ERR_STAT) != 0) - cdrom_queue_request_sense (drive, - NULL, NULL, NULL); + cdrom_queue_request_sense(drive, NULL, NULL, NULL); } } @@ -657,6 +648,17 @@ return 1; } +static int cdrom_timer_expiry(ide_drive_t *drive) +{ + struct request *rq = HWGROUP(drive)->rq; + struct packet_command *pc = (struct packet_command *) rq->buffer; + unsigned long wait = 0; + + if (pc->c[0] == GPCMD_BLANK || pc->c[0] == GPCMD_FORMAT_UNIT) + wait = 60*60*HZ; + + return wait; +} /* Set up the device registers for transferring a packet command on DEV, expecting to later transfer XFERLEN bytes. HANDLER is the routine @@ -672,7 +674,7 @@ struct cdrom_info *info = drive->driver_data; /* Wait for the controller to be idle. */ - if (ide_wait_stat (&startstop, drive, 0, BUSY_STAT, WAIT_READY)) + if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY)) return startstop; if (info->dma) @@ -685,13 +687,14 @@ OUT_BYTE (xferlen & 0xff, IDE_LCYL_REG); OUT_BYTE (xferlen >> 8 , IDE_HCYL_REG); - OUT_BYTE (drive->ctl, IDE_CONTROL_REG); + if (IDE_CONTROL_REG) + OUT_BYTE (drive->ctl, IDE_CONTROL_REG); if (info->dma) (void) (HWIF(drive)->dmaproc(ide_dma_begin, drive)); if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) { - ide_set_handler (drive, handler, WAIT_CMD); + ide_set_handler (drive, handler, WAIT_CMD, cdrom_timer_expiry); OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* packet command */ return ide_started; } else { @@ -700,14 +703,13 @@ } } - /* Send a packet command to DRIVE described by CMD_BUF and CMD_LEN. The device registers must have already been prepared by cdrom_start_packet_command. HANDLER is the interrupt handler to call when the command completes or there's data ready. */ static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive, - char *cmd_buf, int cmd_len, + unsigned char *cmd_buf, int cmd_len, ide_handler_t *handler) { if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) { @@ -727,7 +729,7 @@ } /* Arm the interrupt handler. */ - ide_set_handler (drive, handler, WAIT_CMD); + ide_set_handler (drive, handler, WAIT_CMD, cdrom_timer_expiry); /* Send the command to the device. */ atapi_output_bytes (drive, cmd_buf, cmd_len); @@ -760,25 +762,16 @@ char *dest; - /* If we don't yet have a sector buffer, try to allocate one. - If we can't get one atomically, it's not fatal -- we'll just throw - the data away rather than caching it. */ - if (info->sector_buffer == NULL) { - info->sector_buffer = (char *) kmalloc (SECTOR_BUFFER_SIZE, - GFP_ATOMIC); - - /* If we couldn't get a buffer, - don't try to buffer anything... */ - if (info->sector_buffer == NULL) + /* If we couldn't get a buffer, don't try to buffer anything... */ + if (info->buffer == NULL) sectors_to_buffer = 0; - } /* If this is the first sector in the buffer, remember its number. */ if (info->nsectors_buffered == 0) info->sector_buffered = sector; /* Read the data into the buffer. */ - dest = info->sector_buffer + info->nsectors_buffered * SECTOR_SIZE; + dest = info->buffer + info->nsectors_buffered * SECTOR_SIZE; while (sectors_to_buffer > 0) { atapi_input_bytes (drive, dest, SECTOR_SIZE); --sectors_to_buffer; @@ -795,7 +788,6 @@ } } - /* * Check the contents of the interrupt reason register from the cdrom * and attempt to recover if there are problems. Returns 0 if everything's @@ -820,6 +812,12 @@ atapi_output_bytes (drive, &dum, sizeof (dum)); len -= sizeof (dum); } + } else if (ireason == 1) { + /* Some drives (ASUS) seem to tell us that status + * info is available. just get it and ignore. + */ + GET_STAT(); + return 0; } else { /* Drive wants a command packet, or invalid ireason... */ printk ("%s: cdrom_read_intr: bad interrupt reason %d\n", @@ -830,7 +828,6 @@ return -1; } - /* * Interrupt routine. Called when a read request has completed. */ @@ -907,8 +904,7 @@ /* First, figure out if we need to bit-bucket any of the leading sectors. */ - nskip = MIN ((int)(rq->current_nr_sectors - - (rq->bh->b_size >> SECTOR_BITS)), + nskip = MIN ((int)(rq->current_nr_sectors - (rq->bh->b_size >> SECTOR_BITS)), sectors_to_transfer); while (nskip > 0) { @@ -934,8 +930,7 @@ /* If the buffers are full, cache the rest of the data in our internal buffer. */ if (rq->current_nr_sectors == 0) { - cdrom_buffer_sectors (drive, - rq->sector, sectors_to_transfer); + cdrom_buffer_sectors(drive, rq->sector, sectors_to_transfer); sectors_to_transfer = 0; } else { /* Transfer data to the buffers. @@ -947,8 +942,7 @@ /* Read this_transfer sectors into the current buffer. */ while (this_transfer > 0) { - atapi_input_bytes (drive, - rq->buffer, SECTOR_SIZE); + atapi_input_bytes(drive, rq->buffer, SECTOR_SIZE); rq->buffer += SECTOR_SIZE; --rq->nr_sectors; --rq->current_nr_sectors; @@ -961,11 +955,10 @@ /* Done moving data! Wait for another interrupt. */ - ide_set_handler (drive, &cdrom_read_intr, WAIT_CMD); + ide_set_handler(drive, &cdrom_read_intr, WAIT_CMD, NULL); return ide_started; } - /* * Try to satisfy some of the current read request from our cached data. * Returns nonzero if the request has been completed, zero otherwise. @@ -976,7 +969,7 @@ struct request *rq = HWGROUP(drive)->rq; /* Can't do anything if there's no buffer. */ - if (info->sector_buffer == NULL) return 0; + if (info->buffer == NULL) return 0; /* Loop while this request needs data and the next block is present in our cache. */ @@ -987,7 +980,7 @@ cdrom_end_request (1, drive); memcpy (rq->buffer, - info->sector_buffer + + info->buffer + (rq->sector - info->sector_buffered) * SECTOR_SIZE, SECTOR_SIZE); rq->buffer += SECTOR_SIZE; @@ -1022,8 +1015,6 @@ return 0; } - - /* * Routine to send a read packet command to the drive. * This is usually called directly from cdrom_start_read. @@ -1052,14 +1043,13 @@ nskip = (sector % SECTORS_PER_FRAME); if (nskip > 0) { /* Sanity check... */ - if (rq->current_nr_sectors != - (rq->bh->b_size >> SECTOR_BITS)) { - printk ("%s: cdrom_start_read_continuation: buffer botch (%ld)\n", + if (rq->current_nr_sectors != (rq->bh->b_size >> SECTOR_BITS) && + (rq->sector % CD_FRAMESIZE != 0)) { + printk ("%s: cdrom_start_read_continuation: buffer botch (%lu)\n", drive->name, rq->current_nr_sectors); cdrom_end_request (0, drive); return ide_stopped; } - sector -= nskip; nsect += nskip; rq->current_nr_sectors += nskip; @@ -1076,19 +1066,21 @@ (65534 / CD_FRAMESIZE) : 65535); /* Set up the command */ - memset (&pc.c, 0, sizeof (pc.c)); - pc.c[0] = READ_10; + memset(&pc.c, 0, sizeof(pc.c)); + pc.c[0] = GPCMD_READ_10; pc.c[7] = (nframes >> 8); pc.c[8] = (nframes & 0xff); - put_unaligned(htonl (frame), (unsigned int *) &pc.c[2]); + put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]); /* Send the command to the drive and return. */ - return cdrom_transfer_packet_command (drive, pc.c, sizeof (pc.c), &cdrom_read_intr); + return cdrom_transfer_packet_command(drive, pc.c, sizeof (pc.c), + &cdrom_read_intr); } + #define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */ -#define IDECD_SEEK_TIMER (2 * WAIT_MIN_SLEEP) /* 40 ms */ -#define IDECD_SEEK_TIMEOUT WAIT_CMD /* 10 sec */ +#define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */ +#define IDECD_SEEK_TIMEOUT WAIT_CMD /* 10 sec */ static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive) { @@ -1103,7 +1095,7 @@ if (retry && jiffies - info->start_seek > IDECD_SEEK_TIMER) { if (--retry == 0) { - printk ("%s: disabled DSC seek overlap\n", drive->name); + printk("%s: disabled DSC seek overlap\n", drive->name); drive->dsc_overlap = 0; } } @@ -1123,8 +1115,8 @@ frame = sector / SECTORS_PER_FRAME; memset (&pc.c, 0, sizeof (pc.c)); - pc.c[0] = SEEK; - put_unaligned(htonl (frame), (unsigned int *) &pc.c[2]); + pc.c[0] = GPCMD_SEEK; + put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]); return cdrom_transfer_packet_command (drive, pc.c, sizeof (pc.c), &cdrom_seek_intr); } @@ -1137,6 +1129,19 @@ return cdrom_start_packet_command (drive, 0, cdrom_start_seek_continuation); } +/* Fix up a possibly partially-processed request so that we can + start it over entirely, or even put it back on the request queue. */ +static void restore_request (struct request *rq) +{ + if (rq->buffer != rq->bh->b_data) { + int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE; + rq->buffer = rq->bh->b_data; + rq->nr_sectors += n; + rq->sector -= n; + } + rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS; +} + /* * Start a read request from the CD-ROM. */ @@ -1159,57 +1164,53 @@ restore_request (rq); /* Satisfy whatever we can of this request from our cached sector. */ - if (cdrom_read_from_buffer (drive)) + if (cdrom_read_from_buffer(drive)) return ide_stopped; /* Clear the local sector buffer. */ info->nsectors_buffered = 0; - if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) && (rq->nr_sectors % SECTORS_PER_FRAME == 0)) + /* use dma, if possible. */ + if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) && + (rq->nr_sectors % SECTORS_PER_FRAME == 0)) info->dma = 1; else info->dma = 0; /* Start sending the read request to the drive. */ - return cdrom_start_packet_command (drive, 32768, cdrom_start_read_continuation); + return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation); } - - - /**************************************************************************** * Execute all other packet commands. */ /* Forward declarations. */ -static int -cdrom_lockdoor (ide_drive_t *drive, int lockflag, - struct atapi_request_sense *reqbuf); - - +static int cdrom_lockdoor(ide_drive_t *drive, int lockflag, + struct request_sense *sense); /* Interrupt routine for packet command completion. */ -static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive) +static ide_startstop_t cdrom_pc_intr(ide_drive_t *drive) { int ireason, len, stat, thislen; struct request *rq = HWGROUP(drive)->rq; - struct packet_command *pc = (struct packet_command *)rq->buffer; + struct packet_command *pc = (struct packet_command *) rq->buffer; ide_startstop_t startstop; /* Check for errors. */ - if (cdrom_decode_status (&startstop, drive, 0, &stat)) + if (cdrom_decode_status(&startstop, drive, 0, &stat)) return startstop; /* Read the interrupt reason and the transfer length. */ - ireason = IN_BYTE (IDE_NSECTOR_REG); - len = IN_BYTE (IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG); + ireason = IN_BYTE(IDE_NSECTOR_REG); + len = IN_BYTE(IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG); /* If DRQ is clear, the command has completed. Complain if we still have data left to transfer. */ if ((stat & DRQ_STAT) == 0) { /* Some of the trailing request sense fields are optional, and some drives don't send them. Sigh. */ - if (pc->c[0] == REQUEST_SENSE && + if (pc->c[0] == GPCMD_REQUEST_SENSE && pc->buflen > 0 && pc->buflen <= 5) { while (pc->buflen > 0) { @@ -1236,70 +1237,52 @@ /* Figure out how much data to transfer. */ thislen = pc->buflen; - if (thislen < 0) thislen = -thislen; if (thislen > len) thislen = len; /* The drive wants to be written to. */ if ((ireason & 3) == 0) { - /* Check that we want to write. */ - if (pc->buflen > 0) { - printk ("%s: cdrom_pc_intr: Drive wants " - "to transfer data the wrong way!\n", - drive->name); - pc->stat = 1; - thislen = 0; - } - /* Transfer the data. */ - atapi_output_bytes (drive, pc->buffer, thislen); + atapi_output_bytes(drive, pc->buffer, thislen); /* If we haven't moved enough data to satisfy the drive, add some padding. */ while (len > thislen) { int dum = 0; - atapi_output_bytes (drive, &dum, sizeof (dum)); - len -= sizeof (dum); + atapi_output_bytes(drive, &dum, sizeof (dum)); + len -= sizeof(dum); } /* Keep count of how much data we've moved. */ pc->buffer += thislen; - pc->buflen += thislen; + pc->buflen -= thislen; } /* Same drill for reading. */ else if ((ireason & 3) == 2) { - /* Check that we want to read. */ - if (pc->buflen < 0) { - printk ("%s: cdrom_pc_intr: Drive wants to " - "transfer data the wrong way!\n", - drive->name); - pc->stat = 1; - thislen = 0; - } /* Transfer the data. */ - atapi_input_bytes (drive, pc->buffer, thislen); + atapi_input_bytes(drive, pc->buffer, thislen); /* If we haven't moved enough data to satisfy the drive, add some padding. */ while (len > thislen) { int dum = 0; - atapi_input_bytes (drive, &dum, sizeof (dum)); - len -= sizeof (dum); + atapi_input_bytes(drive, &dum, sizeof (dum)); + len -= sizeof(dum); } /* Keep count of how much data we've moved. */ pc->buffer += thislen; pc->buflen -= thislen; } else { - printk ("%s: cdrom_pc_intr: The drive " + printk("%s: cdrom_pc_intr: The drive " "appears confused (ireason = 0x%2x)\n", drive->name, ireason); pc->stat = 1; } /* Now we wait for another interrupt. */ - ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD); + ide_set_handler(drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry); return ide_started; } @@ -1310,7 +1293,8 @@ struct packet_command *pc = (struct packet_command *)rq->buffer; /* Send the command to the drive and return. */ - return cdrom_transfer_packet_command (drive, pc->c, sizeof (pc->c), &cdrom_pc_intr); + return cdrom_transfer_packet_command (drive, pc->c, + sizeof (pc->c), &cdrom_pc_intr); } @@ -1322,11 +1306,8 @@ struct cdrom_info *info = drive->driver_data; info->dma = 0; - - len = pc->buflen; - if (len < 0) len = -len; - pc->stat = 0; + len = pc->buflen; /* Start sending the command to the drive. */ return cdrom_start_packet_command (drive, len, cdrom_do_pc_continuation); @@ -1343,17 +1324,14 @@ } static -int cdrom_queue_packet_command (ide_drive_t *drive, struct packet_command *pc) +int cdrom_queue_packet_command(ide_drive_t *drive, struct packet_command *pc) { - struct atapi_request_sense my_reqbuf; int retries = 10; + struct request_sense sense; struct request req; - /* If our caller has not provided a place to stick any sense data, - use our own area. */ - if (pc->sense_data == NULL) - pc->sense_data = &my_reqbuf; - pc->sense_data->sense_key = 0; + if (pc->sense == NULL) + pc->sense = &sense; /* Start of retry loop. */ do { @@ -1369,85 +1347,77 @@ /* The request failed. Retry if it was due to a unit attention status (usually means media was changed). */ - struct atapi_request_sense *reqbuf = pc->sense_data; + struct request_sense *reqbuf = pc->sense; if (reqbuf->sense_key == UNIT_ATTENTION) cdrom_saw_media_change (drive); else if (reqbuf->sense_key == NOT_READY && - reqbuf->asc == 4) { + reqbuf->asc == 4 && reqbuf->ascq != 4) { /* The drive is in the process of loading a disk. Retry, but wait a little to give the drive time to complete the load. */ cdrom_sleep (HZ); - } else + } else { /* Otherwise, don't retry. */ retries = 0; - + } --retries; } /* End of retry loop. */ } while (pc->stat != 0 && retries >= 0); - /* Return an error if the command failed. */ - if (pc->stat != 0) - return -EIO; - else { - /* The command succeeded. If it was anything other than - a request sense, eject, or door lock command, - and we think that the door is presently, lock it again. - (The door was probably unlocked via an explicit - CDROMEJECT ioctl.) */ - if (CDROM_STATE_FLAGS (drive)->door_locked == 0 && drive->usage && - (pc->c[0] != REQUEST_SENSE && - pc->c[0] != ALLOW_MEDIUM_REMOVAL && - pc->c[0] != START_STOP)) { - (void) cdrom_lockdoor (drive, 1, NULL); - } - return 0; - } + return pc->stat ? -EIO : 0; } - /**************************************************************************** * cdrom driver request routine. */ static ide_startstop_t ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, unsigned long block) { - if (rq -> cmd == PACKET_COMMAND || rq -> cmd == REQUEST_SENSE_COMMAND) - return cdrom_do_packet_command (drive); - else if (rq -> cmd == RESET_DRIVE_COMMAND) { - cdrom_end_request (1, drive); - return ide_do_reset (drive); - } else if (rq -> cmd != READ) { - printk ("ide-cd: bad cmd %d\n", rq -> cmd); - cdrom_end_request (0, drive); - return ide_stopped; - } else { - ide_startstop_t action; - struct cdrom_info *info = drive->driver_data; + ide_startstop_t action; + struct cdrom_info *info = drive->driver_data; - if (CDROM_CONFIG_FLAGS(drive)->seeking) { - unsigned long elpased = jiffies - info->start_seek; - int stat = GET_STAT(); - - if ((stat & SEEK_STAT) != SEEK_STAT) { - if (elpased < IDECD_SEEK_TIMEOUT) { - ide_stall_queue (drive, IDECD_SEEK_TIMER); - return ide_stopped; + switch (rq->cmd) { + case READ: { + if (CDROM_CONFIG_FLAGS(drive)->seeking) { + unsigned long elpased = jiffies - info->start_seek; + int stat = GET_STAT(); + + if ((stat & SEEK_STAT) != SEEK_STAT) { + if (elpased < IDECD_SEEK_TIMEOUT) { + ide_stall_queue(drive, IDECD_SEEK_TIMER); + return ide_stopped; + } + printk ("%s: DSC timeout\n", drive->name); } - printk ("%s: DSC timeout\n", drive->name); + CDROM_CONFIG_FLAGS(drive)->seeking = 0; } - CDROM_CONFIG_FLAGS(drive)->seeking = 0; + if (IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap) + action = cdrom_start_seek (drive, block); + else + action = cdrom_start_read (drive, block); + info->last_block = block; + return action; + } + + case PACKET_COMMAND: + case REQUEST_SENSE_COMMAND: { + return cdrom_do_packet_command(drive); + } + + case RESET_DRIVE_COMMAND: { + cdrom_end_request(1, drive); + return ide_do_reset(drive); + } + + default: { + printk("ide-cd: bad cmd %d\n", rq -> cmd); + cdrom_end_request(0, drive); + return ide_stopped; } - if (IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap) - action = cdrom_start_seek (drive, block); - else - action = cdrom_start_read (drive, block); - info->last_block = block; - return action; } } @@ -1457,7 +1427,7 @@ * Ioctl handling. * * Routines which queue packet commands take as a final argument a pointer - * to an atapi_request_sense struct. If execution of the command results + * to a request_sense struct. If execution of the command results * in an error with a CHECK CONDITION status, this structure will be filled * with the results of the subsequent request sense command. The pointer * can also be NULL, in which case no sense information is returned. @@ -1506,58 +1476,54 @@ return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET; } - -static int -cdrom_check_status (ide_drive_t *drive, - struct atapi_request_sense *reqbuf) +static int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense) { struct packet_command pc; + struct cdrom_info *info = drive->driver_data; + struct cdrom_device_info *cdi = &info->devinfo; - memset (&pc, 0, sizeof (pc)); - - pc.sense_data = reqbuf; - pc.c[0] = TEST_UNIT_READY; + memset(&pc, 0, sizeof(pc)); + pc.c[0] = GPCMD_TEST_UNIT_READY; + pc.sense = sense; #if ! STANDARD_ATAPI /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to switch CDs instead of supporting the LOAD_UNLOAD opcode */ - pc.c[7] = CDROM_STATE_FLAGS (drive)->sanyo_slot % 3; + pc.c[7] = cdi->sanyo_slot % 3; #endif /* not STANDARD_ATAPI */ - return cdrom_queue_packet_command (drive, &pc); + return cdrom_queue_packet_command(drive, &pc); } /* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */ static int -cdrom_lockdoor (ide_drive_t *drive, int lockflag, - struct atapi_request_sense *reqbuf) +cdrom_lockdoor(ide_drive_t *drive, int lockflag, struct request_sense *sense) { - struct atapi_request_sense my_reqbuf; - int stat; + struct request_sense my_sense; struct packet_command pc; + int stat; - if (reqbuf == NULL) - reqbuf = &my_reqbuf; + if (sense == NULL) + sense = &my_sense; /* If the drive cannot lock the door, just pretend. */ if (CDROM_CONFIG_FLAGS (drive)->no_doorlock) stat = 0; else { - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.c[0] = ALLOW_MEDIUM_REMOVAL; + memset(&pc, 0, sizeof(pc)); + pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL; pc.c[4] = (lockflag != 0); + pc.sense = sense; stat = cdrom_queue_packet_command (drive, &pc); } /* If we got an illegal field error, the drive probably cannot lock the door. */ if (stat != 0 && - reqbuf->sense_key == ILLEGAL_REQUEST && - (reqbuf->asc == 0x24 || reqbuf->asc == 0x20)) { + sense->sense_key == ILLEGAL_REQUEST && + (sense->asc == 0x24 || sense->asc == 0x20)) { printk ("%s: door locking not supported\n", drive->name); CDROM_CONFIG_FLAGS (drive)->no_doorlock = 1; @@ -1565,7 +1531,7 @@ } /* no medium, that's alright. */ - if (stat != 0 && reqbuf->sense_key == NOT_READY && reqbuf->asc == 0x3a) + if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a) stat = 0; if (stat == 0) @@ -1577,115 +1543,81 @@ /* Eject the disk if EJECTFLAG is 0. If EJECTFLAG is 1, try to reload the disk. */ -static int -cdrom_eject (ide_drive_t *drive, int ejectflag, - struct atapi_request_sense *reqbuf) +static int cdrom_eject(ide_drive_t *drive, int ejectflag, + struct request_sense *sense) { struct packet_command pc; - if (CDROM_CONFIG_FLAGS (drive)->no_eject==1 && ejectflag==0) + if (CDROM_CONFIG_FLAGS(drive)->no_eject && !ejectflag) return -EDRIVE_CANT_DO_THIS; - + /* reload fails on some drives, if the tray is locked */ - if (CDROM_STATE_FLAGS (drive)->door_locked && ejectflag) + if (CDROM_STATE_FLAGS(drive)->door_locked && ejectflag) return 0; - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.c[0] = START_STOP; - pc.c[4] = 2 + (ejectflag != 0); - return cdrom_queue_packet_command (drive, &pc); -} - - -static int -cdrom_pause (ide_drive_t *drive, int pauseflag, - struct atapi_request_sense *reqbuf) -{ - struct packet_command pc; - - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.c[0] = SCMD_PAUSE_RESUME; - pc.c[8] = !pauseflag; - return cdrom_queue_packet_command (drive, &pc); -} - - -static int -cdrom_startstop (ide_drive_t *drive, int startflag, - struct atapi_request_sense *reqbuf) -{ - struct packet_command pc; - - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.c[0] = START_STOP; - pc.c[1] = 1; - pc.c[4] = startflag; + memset(&pc, 0, sizeof (pc)); + pc.c[0] = GPCMD_START_STOP_UNIT; + pc.c[4] = 0x02 + (ejectflag != 0); + pc.sense = sense; return cdrom_queue_packet_command (drive, &pc); } -static int -cdrom_read_capacity (ide_drive_t *drive, unsigned *capacity, - struct atapi_request_sense *reqbuf) +static int cdrom_read_capacity(ide_drive_t *drive, unsigned *capacity, + struct request_sense *sense) { struct { - unsigned lba; - unsigned blocklen; + __u32 lba; + __u32 blocklen; } capbuf; int stat; struct packet_command pc; - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; + memset(&pc, 0, sizeof (pc)); - pc.c[0] = READ_CAPACITY; + pc.c[0] = GPCMD_READ_CDVD_CAPACITY; pc.buffer = (char *)&capbuf; - pc.buflen = sizeof (capbuf); + pc.buflen = sizeof(capbuf); + pc.sense = sense; - stat = cdrom_queue_packet_command (drive, &pc); + stat = cdrom_queue_packet_command(drive, &pc); if (stat == 0) - *capacity = ntohl (capbuf.lba); + *capacity = be32_to_cpu(capbuf.lba) + 1; return stat; } - -static int -cdrom_read_tocentry (ide_drive_t *drive, int trackno, int msf_flag, - int format, char *buf, int buflen, - struct atapi_request_sense *reqbuf) +static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag, + int format, char *buf, int buflen, + struct request_sense *sense) { struct packet_command pc; - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; + memset(&pc, 0, sizeof(pc)); + pc.sense = sense; pc.buffer = buf; pc.buflen = buflen; - pc.c[0] = SCMD_READ_TOC; + pc.c[0] = GPCMD_READ_TOC_PMA_ATIP; pc.c[6] = trackno; pc.c[7] = (buflen >> 8); pc.c[8] = (buflen & 0xff); pc.c[9] = (format << 6); - if (msf_flag) pc.c[1] = 2; + + if (msf_flag) + pc.c[1] = 2; + return cdrom_queue_packet_command (drive, &pc); } /* Try to read the entire TOC for the disk into our internal buffer. */ -static int -cdrom_read_toc (ide_drive_t *drive, - struct atapi_request_sense *reqbuf) +static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense) { int stat, ntracks, i; struct cdrom_info *info = drive->driver_data; struct atapi_toc *toc = info->toc; + int minor = drive->select.b.unit << PARTN_BITS; struct { struct atapi_toc_header hdr; struct atapi_toc_entry ent; @@ -1693,26 +1625,25 @@ if (toc == NULL) { /* Try to allocate space. */ - toc = (struct atapi_toc *) kmalloc (sizeof (struct atapi_toc), + toc = (struct atapi_toc *) kmalloc(sizeof(struct atapi_toc), GFP_KERNEL); + info->toc = toc; if (toc == NULL) { printk ("%s: No cdrom TOC buffer!\n", drive->name); return -ENOMEM; } - info->toc = toc; } /* Check to see if the existing data is still valid. If it is, just return. */ if (CDROM_STATE_FLAGS (drive)->toc_valid) - (void) cdrom_check_status (drive, NULL); + (void) cdrom_check_status(drive, sense); if (CDROM_STATE_FLAGS (drive)->toc_valid) return 0; /* First read just the header, so we know how long the TOC is. */ stat = cdrom_read_tocentry (drive, 0, 1, 0, (char *)&toc->hdr, - sizeof (struct atapi_toc_header), - reqbuf); + sizeof(struct atapi_toc_header), sense); if (stat) return stat; #if ! STANDARD_ATAPI @@ -1727,12 +1658,46 @@ if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS; /* Now read the whole schmeer. */ - stat = cdrom_read_tocentry (drive, 0, 1, 0, (char *)&toc->hdr, + stat = cdrom_read_tocentry (drive, toc->hdr.first_track, 1, 0, (char *)&toc->hdr, sizeof (struct atapi_toc_header) + - (ntracks+1) * - sizeof (struct atapi_toc_entry), - reqbuf); + (ntracks + 1) * + sizeof (struct atapi_toc_entry), sense); + + if (stat && toc->hdr.first_track > 1) { + /* Cds with CDI tracks only don't have any TOC entries, + despite of this the returned values are + first_track == last_track = number of CDI tracks + 1, + so that this case is indistinguishable from the same + layout plus an additional audio track. + If we get an error for the regular case, we assume + a CDI without additional audio tracks. In this case + the readable TOC is empty (CDI tracks are not included) + and only holds the Leadout entry. Heiko Eißfeldt */ + ntracks = 0; + stat = cdrom_read_tocentry (drive, CDROM_LEADOUT, 1, + 0, (char *)&toc->hdr, + sizeof (struct atapi_toc_header) + + (ntracks+1) * + sizeof (struct atapi_toc_entry), + sense); + if (stat) { + return stat; + } +#if ! STANDARD_ATAPI + if (CDROM_CONFIG_FLAGS (drive)->toctracks_as_bcd) { + toc->hdr.first_track = bin2bcd(CDROM_LEADOUT); + toc->hdr.last_track = bin2bcd(CDROM_LEADOUT); + } else +#endif /* not STANDARD_ATAPI */ + { + toc->hdr.first_track = CDROM_LEADOUT; + toc->hdr.last_track = CDROM_LEADOUT; + } + } else if (stat) { + return stat; + } if (stat) return stat; + toc->hdr.toc_length = ntohs (toc->hdr.toc_length); #if ! STANDARD_ATAPI @@ -1756,10 +1721,17 @@ } /* Read the multisession information. */ - stat = cdrom_read_tocentry (drive, 0, 1, 1, - (char *)&ms_tmp, sizeof (ms_tmp), - reqbuf); - if (stat) return stat; + if (toc->hdr.first_track != CDROM_LEADOUT) { + /* Read the multisession information. */ + stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp, + sizeof (ms_tmp), sense); + if (stat) return stat; + } else { + ms_tmp.ent.addr.msf.minute = 0; + ms_tmp.ent.addr.msf.second = 2; + ms_tmp.ent.addr.msf.frame = 0; + ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT; + } #if ! STANDARD_ATAPI if (CDROM_CONFIG_FLAGS (drive)->tocaddr_as_bcd) @@ -1773,191 +1745,105 @@ toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track); /* Now try to get the total cdrom capacity. */ - stat = cdrom_read_capacity (drive, &toc->capacity, reqbuf); +#if 0 + stat = cdrom_get_last_written(MKDEV(HWIF(drive)->major, minor), + (long *)&toc->capacity); + if (stat) +#endif + stat = cdrom_read_capacity(drive, &toc->capacity, sense); if (stat) toc->capacity = 0x1fffff; - HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS] - = (toc->capacity * SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9); + /* for general /dev/cdrom like mounting, one big disc */ drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME; + HWIF(drive)->gd->sizes[minor] = (toc->capacity * SECTORS_PER_FRAME) >> + (BLOCK_SIZE_BITS - 9); /* Remember that we've read this stuff. */ CDROM_STATE_FLAGS (drive)->toc_valid = 1; + /* should be "if multisession", but it does no harm. */ + if (ntracks == 1) + return 0; + + /* setup each minor to respond to a session */ + minor++; + i = toc->hdr.first_track; + while ((i <= ntracks) && ((minor & CD_PART_MASK) < CD_PART_MAX)) { + drive->part[minor & PARTN_MASK].start_sect = 0; + drive->part[minor & PARTN_MASK].nr_sects = + (toc->ent[i].addr.lba * + SECTORS_PER_FRAME) << (BLOCK_SIZE_BITS - 9); + HWIF(drive)->gd->sizes[minor] = (toc->ent[i].addr.lba * + SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9); + i++; + minor++; + } + return 0; } -static int -cdrom_read_subchannel (ide_drive_t *drive, int format, - char *buf, int buflen, - struct atapi_request_sense *reqbuf) +static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf, + int buflen, struct request_sense *sense) { struct packet_command pc; - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; + memset(&pc, 0, sizeof(pc)); + pc.sense = sense; - pc.buffer = buf; + pc.buffer = buf; pc.buflen = buflen; - pc.c[0] = SCMD_READ_SUBCHANNEL; + pc.c[0] = GPCMD_READ_SUBCHANNEL; pc.c[1] = 2; /* MSF addressing */ pc.c[2] = 0x40; /* request subQ data */ pc.c[3] = format; pc.c[7] = (buflen >> 8); pc.c[8] = (buflen & 0xff); - return cdrom_queue_packet_command (drive, &pc); -} - - -/* modeflag: 0 = current, 1 = changeable mask, 2 = default, 3 = saved */ -static int -cdrom_mode_sense (ide_drive_t *drive, int pageno, int modeflag, - char *buf, int buflen, - struct atapi_request_sense *reqbuf) -{ - struct packet_command pc; - - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.buffer = buf; - pc.buflen = buflen; - pc.c[0] = MODE_SENSE_10; - pc.c[2] = pageno | (modeflag << 6); - pc.c[7] = (buflen >> 8); - pc.c[8] = (buflen & 0xff); - return cdrom_queue_packet_command (drive, &pc); -} - -static int -cdrom_mode_select (ide_drive_t *drive, int pageno, char *buf, int buflen, - struct atapi_request_sense *reqbuf) -{ - struct packet_command pc; - - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.buffer = buf; - pc.buflen = - buflen; - pc.c[0] = MODE_SELECT_10; - pc.c[1] = 0x10; - pc.c[2] = pageno; - pc.c[7] = (buflen >> 8); - pc.c[8] = (buflen & 0xff); - return cdrom_queue_packet_command (drive, &pc); + return cdrom_queue_packet_command(drive, &pc); } /* ATAPI cdrom drives are free to select the speed you request or any slower rate :-( Requesting too fast a speed will _not_ produce an error. */ -static int -cdrom_select_speed (ide_drive_t *drive, int speed, - struct atapi_request_sense *reqbuf) +static int cdrom_select_speed(ide_drive_t *drive, int speed, + struct request_sense *sense) { struct packet_command pc; - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; + memset(&pc, 0, sizeof(pc)); + pc.sense = sense; if (speed == 0) - speed = 0xffff; /* set to max */ + speed = 0xffff; /* set to max */ else - speed *= 177; /* Nx to kbytes/s */ + speed *= 177; /* Nx to kbytes/s */ - pc.c[0] = SET_CD_SPEED; + pc.c[0] = GPCMD_SET_SPEED; /* Read Drive speed in kbytes/second MSB */ pc.c[2] = (speed >> 8) & 0xff; /* Read Drive speed in kbytes/second LSB */ pc.c[3] = speed & 0xff; - if ( CDROM_CONFIG_FLAGS(drive)->cd_r || - CDROM_CONFIG_FLAGS(drive)->cd_rw ) { + if (CDROM_CONFIG_FLAGS(drive)->cd_r || + CDROM_CONFIG_FLAGS(drive)->cd_rw || + CDROM_CONFIG_FLAGS(drive)->dvd_r) { /* Write Drive speed in kbytes/second MSB */ pc.c[4] = (speed >> 8) & 0xff; /* Write Drive speed in kbytes/second LSB */ pc.c[5] = speed & 0xff; } - return cdrom_queue_packet_command (drive, &pc); -} - -static int -cdrom_play_lba_range_1 (ide_drive_t *drive, int lba_start, int lba_end, - struct atapi_request_sense *reqbuf) -{ - struct packet_command pc; - - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.c[0] = SCMD_PLAYAUDIO_MSF; - lba_to_msf (lba_start, &pc.c[3], &pc.c[4], &pc.c[5]); - lba_to_msf (lba_end-1, &pc.c[6], &pc.c[7], &pc.c[8]); - -#if ! STANDARD_ATAPI - if (CDROM_CONFIG_FLAGS (drive)->playmsf_as_bcd) { - pc.c[3] = bin2bcd (pc.c[3]); - pc.c[4] = bin2bcd (pc.c[4]); - pc.c[5] = bin2bcd (pc.c[5]); - pc.c[6] = bin2bcd (pc.c[6]); - pc.c[7] = bin2bcd (pc.c[7]); - pc.c[8] = bin2bcd (pc.c[8]); - } -#endif /* not STANDARD_ATAPI */ - - return cdrom_queue_packet_command (drive, &pc); -} - - -/* Play audio starting at LBA LBA_START and finishing with the - LBA before LBA_END. */ -static int -cdrom_play_lba_range (ide_drive_t *drive, int lba_start, int lba_end, - struct atapi_request_sense *reqbuf) -{ - int i, stat = 0; - struct atapi_request_sense my_reqbuf; - - if (reqbuf == NULL) - reqbuf = &my_reqbuf; - - /* Some drives, will, for certain audio cds, - give an error if you ask them to play the entire cd using the - values which are returned in the TOC. The play will succeed, - however, if the ending address is adjusted downwards - by a few frames. */ - for (i=0; i<75; i++) { - stat = cdrom_play_lba_range_1 (drive, lba_start, lba_end, - reqbuf); - - if (stat == 0 || - !(reqbuf->sense_key == ILLEGAL_REQUEST && - reqbuf->asc == 0x24)) - return stat; - - --lba_end; - if (lba_end <= lba_start) break; - } - - return stat; + return cdrom_queue_packet_command(drive, &pc); } -static -int cdrom_get_toc_entry (ide_drive_t *drive, int track, - struct atapi_toc_entry **ent, - struct atapi_request_sense *reqbuf) +static int cdrom_get_toc_entry(ide_drive_t *drive, int track, + struct atapi_toc_entry **ent) { struct cdrom_info *info = drive->driver_data; - int stat, ntracks; - struct atapi_toc *toc; - - /* Make sure our saved TOC is valid. */ - stat = cdrom_read_toc (drive, reqbuf); - if (stat) return stat; - - toc = info->toc; + struct atapi_toc *toc = info->toc; + int ntracks; /* Check validity of requested track number. */ ntracks = toc->hdr.last_track - toc->hdr.first_track + 1; + if (toc->hdr.first_track == CDROM_LEADOUT) ntracks = 0; if (track == CDROM_LEADOUT) *ent = &toc->ent[ntracks]; else if (track < toc->hdr.first_track || @@ -1970,377 +1856,75 @@ } -static int -cdrom_read_block (ide_drive_t *drive, int format, int lba, int nblocks, - char *buf, int buflen, - struct atapi_request_sense *reqbuf) -{ - struct packet_command pc; - struct atapi_request_sense my_reqbuf; - - if (reqbuf == NULL) - reqbuf = &my_reqbuf; - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - pc.buffer = buf; - pc.buflen = buflen; -#if ! STANDARD_ATAPI - if (CDROM_CONFIG_FLAGS (drive)->nec260) - pc.c[0] = 0xd4; - else -#endif /* not STANDARD_ATAPI */ - pc.c[0] = READ_CD; +/* the generic packet interface to cdrom.c */ +static int ide_cdrom_packet(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc) +{ + struct packet_command pc; + ide_drive_t *drive = (ide_drive_t*) cdi->handle; - pc.c[1] = (format << 2); - put_unaligned(htonl(lba), (unsigned int *) &pc.c[2]); - pc.c[8] = (nblocks & 0xff); - pc.c[7] = ((nblocks>>8) & 0xff); - pc.c[6] = ((nblocks>>16) & 0xff); - if (format <= 1) - pc.c[9] = 0xf8; /* returns 2352 for any format */ - else - pc.c[9] = 0x10; + /* here we queue the commands from the uniform CD-ROM + layer. the packet must be complete, as we do not + touch it at all. */ + memset(&pc, 0, sizeof(pc)); + memcpy(pc.c, cgc->cmd, CDROM_PACKET_SIZE); + pc.buffer = cgc->buffer; + pc.buflen = cgc->buflen; + cgc->stat = cdrom_queue_packet_command(drive, &pc); + cgc->sense = pc.sense; - return cdrom_queue_packet_command (drive, &pc); + return cgc->stat; } - -/* If SLOT<0, unload the current slot. Otherwise, try to load SLOT. */ -static int -cdrom_load_unload (ide_drive_t *drive, int slot, - struct atapi_request_sense *reqbuf) +static +int ide_cdrom_dev_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, + unsigned long arg) { -#if ! STANDARD_ATAPI - /* if the drive is a Sanyo 3 CD changer then TEST_UNIT_READY - (used in the cdrom_check_status function) is used to - switch CDs instead of LOAD_UNLOAD */ - - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) { - - if ((slot == 1) || (slot == 2)) - CDROM_STATE_FLAGS (drive)->sanyo_slot = slot; - else if (slot >= 0) - CDROM_STATE_FLAGS (drive)->sanyo_slot = 3; - else - return 0; - - return cdrom_check_status (drive, reqbuf); - - } - else -#endif /*not STANDARD_ATAPI */ - { - - /* ATAPI Rev. 2.2+ standard for requesting switching of - CDs in a multiplatter device */ - - struct packet_command pc; - - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.c[0] = LOAD_UNLOAD; - pc.c[4] = 2 + (slot >= 0); - pc.c[8] = slot; - return cdrom_queue_packet_command (drive, &pc); - - } -} - - -/* This gets the mechanism status per ATAPI draft spec 2.6 */ -static int -cdrom_read_mech_status (ide_drive_t *drive, char *buf, int buflen, - struct atapi_request_sense *reqbuf) -{ - struct packet_command pc; - - memset (&pc, 0, sizeof (pc)); - pc.sense_data = reqbuf; - - pc.buffer = buf; - pc.buflen = buflen; - pc.c[0] = MECHANISM_STATUS; - pc.c[8] = (buflen >> 8); - pc.c[9] = (buflen & 0xff); - return cdrom_queue_packet_command (drive, &pc); -} - - -/* Read the drive mechanism status and slot table into our internal buffer. - If the buffer does not yet exist, allocate it. */ -static int -cdrom_read_changer_info (ide_drive_t *drive) -{ - int nslots; - struct cdrom_info *info = drive->driver_data; - - if (info->changer_info) - nslots = info->changer_info->hdr.nslots; - - else { - struct atapi_mechstat_header mechbuf; - int stat; - - stat = cdrom_read_mech_status (drive, - (char *)&mechbuf, - sizeof (mechbuf), - NULL); - if (stat) - return stat; - - nslots = mechbuf.nslots; - info->changer_info = - (struct atapi_changer_info *) - kmalloc (sizeof (struct atapi_changer_info) + - nslots * sizeof (struct atapi_slot), - GFP_KERNEL); - - if (info->changer_info == NULL) - return -ENOMEM; - } - - return cdrom_read_mech_status - (drive, - (char *)&info->changer_info->hdr, - sizeof (struct atapi_mechstat_header) + - nslots * sizeof (struct atapi_slot), - NULL); -} - - -static -int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi, - unsigned int cmd, unsigned long arg) - -{ - ide_drive_t *drive = (ide_drive_t*) cdi->handle; - struct cdrom_info *info = drive->driver_data; + struct cdrom_generic_command cgc; + char buffer[16]; + int stat; + init_cdrom_command(&cgc, buffer, sizeof(buffer)); + /* These will be moved into the Uniform layer shortly... */ switch (cmd) { - case CDROMREADRAW: - case CDROMREADMODE1: - case CDROMREADMODE2: { - struct cdrom_msf msf; - int blocksize, format, stat, lba; - struct atapi_toc *toc; - char *buf; - - if (cmd == CDROMREADMODE1) { - blocksize = CD_FRAMESIZE; - format = 2; - } else { /* for RAW and MODE2. */ - blocksize = CD_FRAMESIZE_RAW; - format = 0; - } - - copy_from_user_ret(&msf, (void *)arg, sizeof (msf), -EFAULT); - - lba = msf_to_lba(msf.cdmsf_min0, - msf.cdmsf_sec0, - msf.cdmsf_frame0); - - /* Make sure the TOC is up to date. */ - if (cmd != CDROMREADRAW) { - stat = cdrom_read_toc (drive, NULL); - if (stat) - return stat; - - toc = info->toc; - - if (lba < 0 || lba >= toc->capacity) - return -EINVAL; - } - - buf = (char *) kmalloc (blocksize, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - stat = cdrom_read_block (drive, format, lba, 1, buf, - blocksize, NULL); - - if (stat == 0) { - if (cmd == CDROMREADMODE2) { - /* For Mode2, skip the Sync, Header, and Subheader */ - if (copy_to_user((char *)arg, buf+16, CD_FRAMESIZE_RAW0)) - stat = -EFAULT; - } else { - if (copy_to_user((char *)arg, buf, blocksize)) - stat = -EFAULT; - } - } - - kfree (buf); - return stat; - } - - /* Read 2352 byte blocks from audio tracks. */ - case CDROMREADAUDIO: { - int stat, lba; - struct atapi_toc *toc; - struct cdrom_read_audio ra; - char *buf; - - /* Make sure the TOC is up to date. */ - stat = cdrom_read_toc (drive, NULL); - if (stat) return stat; - - toc = info->toc; - - stat = verify_area (VERIFY_READ, (char *)arg, sizeof (ra)); - if (stat) return stat; - - copy_from_user (&ra, (void *)arg, sizeof (ra)); - - if (ra.nframes < 0 || ra.nframes > toc->capacity) - return -EINVAL; - else if (ra.nframes == 0) - return 0; - - stat = verify_area (VERIFY_WRITE, (char *)ra.buf, - ra.nframes * CD_FRAMESIZE_RAW); - if (stat) return stat; - - if (ra.addr_format == CDROM_MSF) - lba = msf_to_lba (ra.addr.msf.minute, - ra.addr.msf.second, - ra.addr.msf.frame); - else if (ra.addr_format == CDROM_LBA) - lba = ra.addr.lba; - else - return -EINVAL; - - if (lba < 0 || lba >= toc->capacity) - return -EINVAL; - - buf = (char *) kmalloc (CDROM_NBLOCKS_BUFFER*CD_FRAMESIZE_RAW, - GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - while (ra.nframes > 0) { - int this_nblocks = ra.nframes; - if (this_nblocks > CDROM_NBLOCKS_BUFFER) - this_nblocks = CDROM_NBLOCKS_BUFFER; - stat = cdrom_read_block - (drive, 1, lba, this_nblocks, - buf, this_nblocks * CD_FRAMESIZE_RAW, NULL); - if (stat) break; - - copy_to_user (ra.buf, buf, - this_nblocks * CD_FRAMESIZE_RAW); - ra.buf += this_nblocks * CD_FRAMESIZE_RAW; - ra.nframes -= this_nblocks; - lba += this_nblocks; - } - - kfree (buf); - return stat; - } - case CDROMSETSPINDOWN: { char spindown; - char buffer[16]; - int stat; - - stat = verify_area (VERIFY_READ, (void *) arg, - sizeof (char)); - if (stat) return stat; - copy_from_user (&spindown, (void *) arg, sizeof(char)); + if (copy_from_user(&spindown, (void *) arg, sizeof(char))) + return -EFAULT; - stat = cdrom_mode_sense (drive, PAGE_CDROM, 0, buffer, - sizeof (buffer), NULL); - if (stat) return stat; + if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0))) + return stat; buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f); - return cdrom_mode_select (drive, PAGE_CDROM, buffer, - sizeof (buffer), NULL); + return cdrom_mode_select(cdi, &cgc); } case CDROMGETSPINDOWN: { char spindown; - char buffer[16]; - int stat; - - stat = verify_area (VERIFY_WRITE, (void *) arg, - sizeof (char)); - if (stat) return stat; - stat = cdrom_mode_sense (drive, PAGE_CDROM, 0, buffer, - sizeof (buffer), NULL); - if (stat) return stat; + if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0))) + return stat; spindown = buffer[11] & 0x0f; - copy_to_user ((void *) arg, &spindown, sizeof (char)); + if (copy_to_user((void *) arg, &spindown, sizeof (char))) + return -EFAULT; return 0; } -#ifdef ALLOW_TEST_PACKETS - case 0x1234: { - int stat; - struct packet_command pc; - int len, lena; - - memset (&pc, 0, sizeof (pc)); - - stat = verify_area (VERIFY_READ, (void *) arg, sizeof (pc.c)); - if (stat) return stat; - copy_from_user (&pc.c, (void *) arg, sizeof (pc.c)); - arg += sizeof (pc.c); - - stat = verify_area (VERIFY_READ, (void *) arg, sizeof (len)); - if (stat) return stat; - copy_from_user (&len, (void *) arg , sizeof (len)); - arg += sizeof (len); - - lena = len; - if (lena < 0) lena = -lena; - - { - char buf[lena]; - if (len > 0) { - stat = verify_area (VERIFY_WRITE, - (void *) arg, len); - if (stat) return stat; - } - else if (len < 0) { - stat = verify_area (VERIFY_READ, - (void *) arg, -len); - if (stat) return stat; - copy_from_user (buf, (void*)arg, -len); - } - - if (len != 0) { - pc.buflen = len; - pc.buffer = buf; - } - - stat = cdrom_queue_packet_command (drive, &pc); - - if (len > 0) - copy_to_user ((void *)arg, buf, len); - } - - return stat; - } -#endif - default: return -EINVAL; } } - - static int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi, unsigned int cmd, void *arg) @@ -2350,54 +1934,13 @@ struct cdrom_info *info = drive->driver_data; switch (cmd) { - case CDROMSUBCHNL: { - struct atapi_cdrom_subchnl scbuf; - int stat; - struct cdrom_subchnl *subchnl = (struct cdrom_subchnl *)arg; - - stat = cdrom_read_subchannel (drive, 1, /* current position */ - (char *)&scbuf, sizeof (scbuf), - NULL); - if (stat) return stat; - -#if ! STANDARD_ATAPI - if (CDROM_CONFIG_FLAGS (drive)->subchan_as_bcd) { - msf_from_bcd (&scbuf.acdsc_absaddr.msf); - msf_from_bcd (&scbuf.acdsc_reladdr.msf); - } - if (CDROM_CONFIG_FLAGS (drive)->tocaddr_as_bcd) - scbuf.acdsc_trk = bcd2bin (scbuf.acdsc_trk); -#endif /* not STANDARD_ATAPI */ - - subchnl->cdsc_absaddr.msf.minute = - scbuf.acdsc_absaddr.msf.minute; - subchnl->cdsc_absaddr.msf.second = - scbuf.acdsc_absaddr.msf.second; - subchnl->cdsc_absaddr.msf.frame = - scbuf.acdsc_absaddr.msf.frame; - - subchnl->cdsc_reladdr.msf.minute = - scbuf.acdsc_reladdr.msf.minute; - subchnl->cdsc_reladdr.msf.second = - scbuf.acdsc_reladdr.msf.second; - subchnl->cdsc_reladdr.msf.frame = - scbuf.acdsc_reladdr.msf.frame; - - subchnl->cdsc_audiostatus = scbuf.acdsc_audiostatus; - subchnl->cdsc_ctrl = scbuf.acdsc_ctrl; - subchnl->cdsc_trk = scbuf.acdsc_trk; - subchnl->cdsc_ind = scbuf.acdsc_ind; - - return 0; - } - case CDROMREADTOCHDR: { int stat; struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg; struct atapi_toc *toc; /* Make sure our saved TOC is valid. */ - stat = cdrom_read_toc (drive, NULL); + stat = cdrom_read_toc(drive, NULL); if (stat) return stat; toc = info->toc; @@ -2412,8 +1955,7 @@ struct cdrom_tocentry *tocentry = (struct cdrom_tocentry*) arg; struct atapi_toc_entry *toce; - stat = cdrom_get_toc_entry (drive, tocentry->cdte_track, &toce, - NULL); + stat = cdrom_get_toc_entry (drive, tocentry->cdte_track, &toce); if (stat) return stat; tocentry->cdte_ctrl = toce->control; @@ -2423,314 +1965,92 @@ &tocentry->cdte_addr.msf.minute, &tocentry->cdte_addr.msf.second, &tocentry->cdte_addr.msf.frame); - } else { + } else tocentry->cdte_addr.lba = toce->addr.lba; - } return 0; } - case CDROMPLAYMSF: { - struct cdrom_msf *msf = (struct cdrom_msf *) arg; - int lba_start, lba_end; - - lba_start = msf_to_lba (msf->cdmsf_min0, msf->cdmsf_sec0, - msf->cdmsf_frame0); - lba_end = msf_to_lba (msf->cdmsf_min1, msf->cdmsf_sec1, - msf->cdmsf_frame1) + 1; - - if (lba_end <= lba_start) return -EINVAL; - - return cdrom_play_lba_range (drive, lba_start, lba_end, NULL); - } - - /* Like just about every other Linux cdrom driver, we ignore the - index part of the request here. */ - case CDROMPLAYTRKIND: { - int stat, lba_start, lba_end; - struct cdrom_ti *ti = (struct cdrom_ti *)arg; - struct atapi_toc_entry *first_toc, *last_toc; - - stat = cdrom_get_toc_entry (drive, ti->cdti_trk0, &first_toc, - NULL); - if (stat) return stat; - stat = cdrom_get_toc_entry (drive, ti->cdti_trk1, &last_toc, - NULL); - if (stat) return stat; - - if (ti->cdti_trk1 != CDROM_LEADOUT) ++last_toc; - lba_start = first_toc->addr.lba; - lba_end = last_toc->addr.lba; - - if (lba_end <= lba_start) return -EINVAL; - - return cdrom_play_lba_range (drive, lba_start, lba_end, NULL); - } - - case CDROMVOLCTRL: { - struct cdrom_volctrl *volctrl = (struct cdrom_volctrl *) arg; - char buffer[24], mask[24]; - int stat; - - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 0, buffer, - sizeof (buffer), NULL); - if (stat) return stat; - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 1, mask, - sizeof (buffer), NULL); - if (stat) return stat; - - buffer[1] = buffer[2] = 0; - - buffer[17] = volctrl->channel0 & mask[17]; - buffer[19] = volctrl->channel1 & mask[19]; - buffer[21] = volctrl->channel2 & mask[21]; - buffer[23] = volctrl->channel3 & mask[23]; - - return cdrom_mode_select (drive, PAGE_AUDIO, buffer, - sizeof (buffer), NULL); - } - - case CDROMVOLREAD: { - struct cdrom_volctrl *volctrl = (struct cdrom_volctrl *) arg; - char buffer[24]; - int stat; - - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 0, buffer, - sizeof (buffer), NULL); - if (stat) return stat; - - volctrl->channel0 = buffer[17]; - volctrl->channel1 = buffer[19]; - volctrl->channel2 = buffer[21]; - volctrl->channel3 = buffer[23]; - - return 0; - } - - case CDROMSTART: - return cdrom_startstop (drive, 1, NULL); - - case CDROMSTOP: { -#ifdef IHAVEADOLPHIN - /* Certain Drives require this. Most don't - and will produce errors upon CDROMSTOP - pit says the Dolphin needs this. If you - own a dolphin, just define IHAVEADOLPHIN somewhere */ - int stat; - stat = cdrom_startstop (drive, 0, NULL); - if (stat) return stat; - return cdrom_eject (drive, 1, NULL); -#endif /* end of IHAVEADOLPHIN */ - return cdrom_startstop (drive, 0, NULL); - } - - case CDROMPAUSE: - return cdrom_pause (drive, 1, NULL); - - case CDROMRESUME: - return cdrom_pause (drive, 0, NULL); - - default: return -EINVAL; } } - static -int ide_cdrom_reset (struct cdrom_device_info *cdi) +int ide_cdrom_reset(struct cdrom_device_info *cdi) { ide_drive_t *drive = (ide_drive_t*) cdi->handle; + struct request_sense sense; struct request req; + int ret; - ide_init_drive_cmd (&req); + ide_init_drive_cmd(&req); req.cmd = RESET_DRIVE_COMMAND; - return ide_do_drive_cmd (drive, &req, ide_wait); + ret = ide_do_drive_cmd(drive, &req, ide_wait); + + /* A reset will unlock the door. If it was previously locked, + * lock it again. + */ + if (CDROM_STATE_FLAGS(drive)->door_locked) + (void) cdrom_lockdoor(drive, 1, &sense); + + return ret; } static -int ide_cdrom_tray_move (struct cdrom_device_info *cdi, int position) +int ide_cdrom_tray_move(struct cdrom_device_info *cdi, int position) { ide_drive_t *drive = (ide_drive_t*) cdi->handle; - struct atapi_request_sense rq; + struct request_sense sense; if (position) { - int stat = cdrom_lockdoor (drive, 0, &rq); + int stat = cdrom_lockdoor(drive, 0, &sense); if (stat) return stat; } - return cdrom_eject (drive, !position, NULL); + return cdrom_eject(drive, !position, &sense); } - static int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock) { ide_drive_t *drive = (ide_drive_t*) cdi->handle; - return cdrom_lockdoor (drive, lock, NULL); -} - -/* - * the buffer struct used by ide_cdrom_get_capabilities() - */ -struct get_capabilities_buf { - char pad[8]; - struct atapi_capabilities_page cap; /* this is 4 bytes short of ATAPI standard */ - char extra_cap[4]; /* Acer 50X needs the regulation size buffer */ -}; - -static -int ide_cdrom_get_capabilities (ide_drive_t *drive, struct get_capabilities_buf *buf) -{ - int stat, attempts = 3, buflen = sizeof(*buf); - - /* - * Most drives don't care about the buffer size; they return as much info as there's room for. - * But some older drives (?) had trouble with the standard size, preferring 4 bytes less. - * And the modern Acer 50X rejects anything smaller than the standard size. - */ - if (!(drive->id && !strcmp(drive->id->model,"ATAPI CD ROM DRIVE 50X MAX"))) - buflen -= sizeof(buf->extra_cap); /* for all drives except Acer 50X */ - - do { /* we seem to get stat=0x01,err=0x00 the first time (??) */ - stat = cdrom_mode_sense (drive, PAGE_CAPABILITIES, 0, (char *)buf, buflen, NULL); - if (stat == 0) { - /* - * The ACER/AOpen 24X cdrom has the speed fields byte-swapped from the standard. - */ - if (!(drive->id && !drive->id->model[0] && !strncmp(drive->id->fw_rev, "241N", 4))) { - buf->cap.curspeed = ntohs(buf->cap.curspeed); - buf->cap.maxspeed = ntohs(buf->cap.maxspeed); - } - CDROM_STATE_FLAGS (drive)->current_speed = (((unsigned int)buf->cap.curspeed) + (176/2)) / 176; - CDROM_CONFIG_FLAGS(drive)->max_speed = (((unsigned int)buf->cap.maxspeed) + (176/2)) / 176; - return 0; - } - } while (--attempts); - return stat; + return cdrom_lockdoor(drive, lock, NULL); } -static -int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed) -{ - int stat; - struct get_capabilities_buf buf; - ide_drive_t *drive = (ide_drive_t*) cdi->handle; - struct atapi_request_sense reqbuf; - stat=cdrom_select_speed (drive, speed, &reqbuf); - if (stat<0) - return stat; - - /* Now with that done, update the speed fields */ - if (ide_cdrom_get_capabilities(drive,&buf)) - return 0; - - cdi->speed = CDROM_STATE_FLAGS (drive)->current_speed; - return 0; -} static -int ide_cdrom_select_disc (struct cdrom_device_info *cdi, int slot) +int ide_cdrom_select_speed(struct cdrom_device_info *cdi, int speed) { ide_drive_t *drive = (ide_drive_t*) cdi->handle; - struct cdrom_info *info = drive->driver_data; - - struct atapi_request_sense my_reqbuf; + struct request_sense sense; int stat; - int nslots, curslot; - - if ( ! CDROM_CONFIG_FLAGS (drive)->is_changer) - return -EDRIVE_CANT_DO_THIS; - -#if ! STANDARD_ATAPI - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) { - nslots = 3; - curslot = CDROM_STATE_FLAGS (drive)->sanyo_slot; - if (curslot == 3) - curslot = 0; - } else -#endif /* not STANDARD_ATAPI */ - { - stat = cdrom_read_changer_info (drive); - if (stat) - return stat; - - nslots = info->changer_info->hdr.nslots; - curslot = info->changer_info->hdr.curslot; - } - - if (slot == curslot) - return curslot; - - if (slot == CDSL_CURRENT) - return curslot; - - if (slot != CDSL_NONE && (slot < 0 || slot >= nslots)) - return -EINVAL; - - if (drive->usage > 1) - return -EBUSY; - if (slot == CDSL_NONE) { - (void) cdrom_load_unload (drive, -1, NULL); - cdrom_saw_media_change (drive); - (void) cdrom_lockdoor (drive, 0, NULL); - return 0; - } - else { - int was_locked; - - if ( -#if ! STANDARD_ATAPI - CDROM_STATE_FLAGS (drive)->sanyo_slot == 0 && -#endif - info->changer_info->slots[slot].disc_present == 0) { - return -ENOMEDIUM; - } - - was_locked = CDROM_STATE_FLAGS (drive)->door_locked; - if (was_locked) - (void) cdrom_lockdoor (drive, 0, NULL); - - stat = cdrom_load_unload (drive, slot, NULL); - cdrom_saw_media_change (drive); - if (stat) - return stat; - - stat = cdrom_check_status (drive, &my_reqbuf); - if (stat && my_reqbuf.sense_key == NOT_READY) - return -ENOENT; - - if (stat == 0 || my_reqbuf.sense_key == UNIT_ATTENTION) { - stat = cdrom_read_toc (drive, &my_reqbuf); - if (stat) - return stat; - } - - if (was_locked) - (void) cdrom_lockdoor (drive, 1, NULL); + if ((stat = cdrom_select_speed(drive, speed, &sense)) < 0) + return stat; - return slot; - } + cdi->speed = CDROM_STATE_FLAGS(drive)->current_speed; + return 0; } - static int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr) { ide_drive_t *drive = (ide_drive_t*) cdi->handle; - struct cdrom_info *info = drive->driver_data; if (slot_nr == CDSL_CURRENT) { + struct request_sense sense; + int stat = cdrom_check_status(drive, &sense); + if (stat == 0 || sense.sense_key == UNIT_ATTENTION) + return CDS_DISC_OK; - struct atapi_request_sense my_reqbuf; - int stat = cdrom_check_status (drive, &my_reqbuf); - if (stat == 0 || my_reqbuf.sense_key == UNIT_ATTENTION) + if (sense.sense_key == NOT_READY && sense.asc == 0x04 && + sense.ascq == 0x04) return CDS_DISC_OK; - if (my_reqbuf.sense_key == NOT_READY) { + if (sense.sense_key == NOT_READY) { /* ATAPI doesn't have anything that can help us decide whether the drive is really emtpy or the tray is just open. irk. */ @@ -2739,47 +2059,29 @@ return CDS_DRIVE_NOT_READY; } - -#if ! STANDARD_ATAPI - else if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) - return CDS_NO_INFO; -#endif /* not STANDARD_ATAPI */ - - else { - struct atapi_changer_info *ci; - int stat = cdrom_read_changer_info (drive); - if (stat < 0) - return stat; - ci = info->changer_info; - - if (ci->slots[slot_nr].disc_present) - return CDS_DISC_OK; - else - return CDS_NO_DISC; - } + return -EINVAL; } static int ide_cdrom_get_last_session (struct cdrom_device_info *cdi, struct cdrom_multisession *ms_info) { - int stat; struct atapi_toc *toc; ide_drive_t *drive = (ide_drive_t*) cdi->handle; struct cdrom_info *info = drive->driver_data; - - /* Make sure the TOC information is valid. */ - stat = cdrom_read_toc (drive, NULL); - if (stat) return stat; + struct request_sense sense; + int ret; toc = info->toc; + if (!CDROM_STATE_FLAGS(drive)->toc_valid || toc == NULL) + if ((ret = cdrom_read_toc(drive, &sense))) + return ret; ms_info->addr.lba = toc->last_session_lba; ms_info->xa_flag = toc->xa_flag; return 0; } - static int ide_cdrom_get_mcn (struct cdrom_device_info *cdi, struct cdrom_mcn *mcn_info) @@ -2788,10 +2090,9 @@ char mcnbuf[24]; ide_drive_t *drive = (ide_drive_t*) cdi->handle; - stat = cdrom_read_subchannel (drive, 2, /* get MCN */ - mcnbuf, sizeof (mcnbuf), - NULL); - if (stat) return stat; +/* get MCN */ + if ((stat = cdrom_read_subchannel(drive, 2, mcnbuf, sizeof (mcnbuf), NULL))) + return stat; memcpy (mcn_info->medium_catalog_number, mcnbuf+9, sizeof (mcn_info->medium_catalog_number)-1); @@ -2812,37 +2113,15 @@ int slot_nr) { ide_drive_t *drive = (ide_drive_t*) cdi->handle; - struct cdrom_info *info = drive->driver_data; - int retval; - + if (slot_nr == CDSL_CURRENT) { - (void) cdrom_check_status (drive, NULL); + (void) cdrom_check_status(drive, NULL); retval = CDROM_STATE_FLAGS (drive)->media_changed; CDROM_STATE_FLAGS (drive)->media_changed = 0; + return retval; } - -#if ! STANDARD_ATAPI - else if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) { - retval = 0; - } -#endif /* not STANDARD_ATAPI */ - - else { - struct atapi_changer_info *ci; - int stat = cdrom_read_changer_info (drive); - if (stat < 0) - return stat; - ci = info->changer_info; - - /* This test may be redundant with cdrom.c. */ - if (slot_nr < 0 || slot_nr >= ci->hdr.nslots) - return -EINVAL; - - retval = ci->slots[slot_nr].change; - } - - return retval; + return -EINVAL; } @@ -2877,7 +2156,7 @@ ide_cdrom_tray_move, /* tray_move */ ide_cdrom_lock_door, /* lock_door */ ide_cdrom_select_speed, /* select_speed */ - ide_cdrom_select_disc, /* select_disc */ + NULL, /* select_disc */ ide_cdrom_get_last_session, /* get_last_session */ ide_cdrom_get_mcn, /* get_mcn */ ide_cdrom_reset, /* reset */ @@ -2885,9 +2164,11 @@ ide_cdrom_dev_ioctl, /* dev_ioctl */ CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN - | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET - | CDC_IOCTLS | CDC_DRIVE_STATUS, /* capability */ - 0 /* n_minors */ + | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_IOCTLS + | CDC_DRIVE_STATUS | CDC_CD_R | CDC_CD_RW | CDC_DVD + | CDC_DVD_R| CDC_DVD_RAM | CDC_GENERIC_PACKET, /* capability */ + 0, /* n_minors */ + ide_cdrom_packet }; static int ide_cdrom_register (ide_drive_t *drive, int nslots) @@ -2896,90 +2177,148 @@ struct cdrom_device_info *devinfo = &info->devinfo; int minor = (drive->select.b.unit)<dev = MKDEV (HWIF(drive)->major, minor); + devinfo->dev = MKDEV (HWIF(drive)->major, minor | CD_PART_MASK); devinfo->ops = &ide_cdrom_dops; devinfo->mask = 0; *(int *)&devinfo->speed = CDROM_STATE_FLAGS (drive)->current_speed; *(int *)&devinfo->capacity = nslots; devinfo->handle = (void *) drive; strcpy(devinfo->name, drive->name); - + /* set capability mask to match the probe. */ + if (!CDROM_CONFIG_FLAGS (drive)->cd_r) + devinfo->mask |= CDC_CD_R; + if (!CDROM_CONFIG_FLAGS (drive)->cd_rw) + devinfo->mask |= CDC_CD_RW; + if (!CDROM_CONFIG_FLAGS (drive)->dvd) + devinfo->mask |= CDC_DVD; + if (!CDROM_CONFIG_FLAGS (drive)->dvd_r) + devinfo->mask |= CDC_DVD_R; + if (!CDROM_CONFIG_FLAGS (drive)->dvd_ram) + devinfo->mask |= CDC_DVD_RAM; if (!CDROM_CONFIG_FLAGS (drive)->is_changer) devinfo->mask |= CDC_SELECT_DISC; if (!CDROM_CONFIG_FLAGS (drive)->audio_play) devinfo->mask |= CDC_PLAY_AUDIO; if (!CDROM_CONFIG_FLAGS (drive)->close_tray) devinfo->mask |= CDC_CLOSE_TRAY; - + return register_cdrom (devinfo); } +static +int ide_cdrom_get_capabilities(ide_drive_t *drive, struct atapi_capabilities_page *cap) +{ + struct cdrom_info *info = drive->driver_data; + struct cdrom_device_info *cdi = &info->devinfo; + struct cdrom_generic_command cgc; + int stat, attempts = 3, size = sizeof(*cap); + + /* + * ACER50 (and others?) require the full spec length mode sense + * page capabilities size, but older drives break. + */ + if (drive->id) { + if (!(!strcmp(drive->id->model, "ATAPI CD ROM DRIVE 50X MAX") || + !strcmp(drive->id->model, "WPI CDS-32X"))) + size -= sizeof(cap->pad); + } + + /* we have to cheat a little here. the packet will eventually + * be queued with ide_cdrom_packet(), which extracts the + * drive from cdi->handle. Since this device hasn't been + * registered with the Uniform layer yet, it can't do this. + * Same goes for cdi->ops. + */ + cdi->handle = (ide_drive_t *) drive; + cdi->ops = &ide_cdrom_dops; + init_cdrom_command(&cgc, cap, size); + do { /* we seem to get stat=0x01,err=0x00 the first time (??) */ + stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0); + if (!stat) + break; + } while (--attempts); + return stat; +} static int ide_cdrom_probe_capabilities (ide_drive_t *drive) { - int stat, nslots = 0; - struct get_capabilities_buf buf; + struct cdrom_info *info = drive->driver_data; + struct cdrom_device_info *cdi = &info->devinfo; + struct atapi_capabilities_page cap; + int nslots = 1; if (CDROM_CONFIG_FLAGS (drive)->nec260) { - CDROM_CONFIG_FLAGS (drive)->no_eject = 0; - CDROM_CONFIG_FLAGS (drive)->audio_play = 1; + CDROM_CONFIG_FLAGS (drive)->no_eject = 0; + CDROM_CONFIG_FLAGS (drive)->audio_play = 1; return nslots; } - if (ide_cdrom_get_capabilities(drive,&buf)) + if (ide_cdrom_get_capabilities(drive, &cap)) return 0; - if (buf.cap.lock == 0) + + if (cap.lock == 0) CDROM_CONFIG_FLAGS (drive)->no_doorlock = 1; - if (buf.cap.eject) + if (cap.eject) CDROM_CONFIG_FLAGS (drive)->no_eject = 0; - if (buf.cap.cd_r_write) + if (cap.cd_r_write) CDROM_CONFIG_FLAGS (drive)->cd_r = 1; - if (buf.cap.cd_rw_write) + if (cap.cd_rw_write) CDROM_CONFIG_FLAGS (drive)->cd_rw = 1; - if (buf.cap.test_write) + if (cap.test_write) CDROM_CONFIG_FLAGS (drive)->test_write = 1; - if (buf.cap.dvd_ram_read || buf.cap.dvd_r_read || buf.cap.dvd_rom) + if (cap.dvd_ram_read || cap.dvd_r_read || cap.dvd_rom) CDROM_CONFIG_FLAGS (drive)->dvd = 1; - if (buf.cap.dvd_ram_write) + if (cap.dvd_ram_write) CDROM_CONFIG_FLAGS (drive)->dvd_r = 1; - if (buf.cap.dvd_r_write) - CDROM_CONFIG_FLAGS (drive)->dvd_rw = 1; - if (buf.cap.audio_play) + if (cap.dvd_r_write) + CDROM_CONFIG_FLAGS (drive)->dvd_ram = 1; + if (cap.audio_play) CDROM_CONFIG_FLAGS (drive)->audio_play = 1; - if (buf.cap.mechtype == 0) + if (cap.mechtype == 0) CDROM_CONFIG_FLAGS (drive)->close_tray = 0; #if ! STANDARD_ATAPI - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) { + if (cdi->sanyo_slot > 0) { CDROM_CONFIG_FLAGS (drive)->is_changer = 1; nslots = 3; } else #endif /* not STANDARD_ATAPI */ - if (buf.cap.mechtype == mechtype_individual_changer || - buf.cap.mechtype == mechtype_cartridge_changer) { - struct atapi_mechstat_header mechbuf; - - stat = cdrom_read_mech_status (drive, (char*)&mechbuf, - sizeof (mechbuf), NULL); - if (!stat) { + if (cap.mechtype == mechtype_individual_changer || + cap.mechtype == mechtype_cartridge_changer) { + if ((nslots = cdrom_number_of_slots(cdi)) > 1) { CDROM_CONFIG_FLAGS (drive)->is_changer = 1; CDROM_CONFIG_FLAGS (drive)->supp_disc_present = 1; - nslots = mechbuf.nslots; } } - printk ("%s: ATAPI %dX %s", - drive->name, CDROM_CONFIG_FLAGS (drive)->max_speed, - (CDROM_CONFIG_FLAGS (drive)->dvd) ? "DVD-ROM" : "CD-ROM"); + /* The ACER/AOpen 24X cdrom has the speed fields byte-swapped */ + if (drive->id && !drive->id->model[0] && !strncmp(drive->id->fw_rev, "241N", 4)) { + CDROM_STATE_FLAGS (drive)->current_speed = + (((unsigned int)cap.curspeed) + (176/2)) / 176; + CDROM_CONFIG_FLAGS (drive)->max_speed = + (((unsigned int)cap.maxspeed) + (176/2)) / 176; + } else { + CDROM_STATE_FLAGS (drive)->current_speed = + (ntohs(cap.curspeed) + (176/2)) / 176; + CDROM_CONFIG_FLAGS (drive)->max_speed = + (ntohs(cap.maxspeed) + (176/2)) / 176; + } + + /* don't print speed if the drive reported 0. + */ + printk("%s: ATAPI", drive->name); + if (CDROM_CONFIG_FLAGS(drive)->max_speed) + printk(" %dX", CDROM_CONFIG_FLAGS(drive)->max_speed); + printk(" %s", CDROM_CONFIG_FLAGS(drive)->dvd ? "DVD-ROM" : "CD-ROM"); - if (CDROM_CONFIG_FLAGS (drive)->dvd_r|CDROM_CONFIG_FLAGS (drive)->dvd_rw) + if (CDROM_CONFIG_FLAGS (drive)->dvd_r|CDROM_CONFIG_FLAGS (drive)->dvd_ram) printk (" DVD%s%s", - (CDROM_CONFIG_FLAGS (drive)->dvd_r)? "-RAM" : "", - (CDROM_CONFIG_FLAGS (drive)->dvd_rw)? "/RW" : ""); + (CDROM_CONFIG_FLAGS (drive)->dvd_r)? "-R" : "", + (CDROM_CONFIG_FLAGS (drive)->dvd_ram)? "AM" : ""); if (CDROM_CONFIG_FLAGS (drive)->cd_r|CDROM_CONFIG_FLAGS (drive)->cd_rw) printk (" CD%s%s", @@ -2991,7 +2330,7 @@ else printk (" drive"); - printk (", %dkB Cache\n", ntohs(buf.cap.buffer_size)); + printk (", %dkB Cache\n", be16_to_cpu(cap.buffer_size)); return nslots; } @@ -3011,19 +2350,17 @@ int ide_cdrom_setup (ide_drive_t *drive) { struct cdrom_info *info = drive->driver_data; + struct cdrom_device_info *cdi = &info->devinfo; + int minor = drive->select.b.unit << PARTN_BITS; int nslots; - kdev_t dev = MKDEV (HWIF (drive)->major, - drive->select.b.unit << PARTN_BITS); - - set_device_ro (dev, 1); - blksize_size[HWIF(drive)->major][drive->select.b.unit << PARTN_BITS] = - CD_FRAMESIZE; + set_device_ro(MKDEV(HWIF(drive)->major, minor), 1); + set_blocksize(MKDEV(HWIF(drive)->major, minor), CD_FRAMESIZE); - drive->special.all = 0; - drive->ready_stat = 0; + drive->special.all = 0; + drive->ready_stat = 0; - CDROM_STATE_FLAGS (drive)->media_changed = 0; + CDROM_STATE_FLAGS (drive)->media_changed = 1; CDROM_STATE_FLAGS (drive)->toc_valid = 0; CDROM_STATE_FLAGS (drive)->door_locked = 0; @@ -3045,25 +2382,29 @@ CDROM_CONFIG_FLAGS (drive)->test_write = 0; CDROM_CONFIG_FLAGS (drive)->dvd = 0; CDROM_CONFIG_FLAGS (drive)->dvd_r = 0; - CDROM_CONFIG_FLAGS (drive)->dvd_rw = 0; + CDROM_CONFIG_FLAGS (drive)->dvd_ram = 0; CDROM_CONFIG_FLAGS (drive)->no_eject = 1; CDROM_CONFIG_FLAGS (drive)->supp_disc_present = 0; CDROM_CONFIG_FLAGS (drive)->audio_play = 0; CDROM_CONFIG_FLAGS (drive)->close_tray = 1; - + /* limit transfer size per interrupt. */ CDROM_CONFIG_FLAGS (drive)->limit_nframes = 0; if (drive->id != NULL) { + /* a testament to the nice quality of Samsung drives... */ if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430")) CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1; else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432")) CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1; + /* the 3231 model does not support the SET_CD_SPEED command */ + else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231")) + cdi->mask |= CDC_SELECT_SPEED; } #if ! STANDARD_ATAPI /* by default Sanyo 3 CD changer support is turned off and ATAPI Rev 2.2+ standard support for CD changers is used */ - CDROM_STATE_FLAGS (drive)->sanyo_slot = 0; + cdi->sanyo_slot = 0; CDROM_CONFIG_FLAGS (drive)->nec260 = 0; CDROM_CONFIG_FLAGS (drive)->toctracks_as_bcd = 0; @@ -3115,18 +2456,20 @@ (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) || (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) { /* uses CD in slot 0 when value is set to 3 */ - CDROM_STATE_FLAGS (drive)->sanyo_slot = 3; + cdi->sanyo_slot = 3; } } #endif /* not STANDARD_ATAPI */ - info->toc = NULL; - info->sector_buffer = NULL; - info->sector_buffered = 0; - info->nsectors_buffered = 0; + info->toc = NULL; + info->buffer = NULL; + info->sector_buffered = 0; + info->nsectors_buffered = 0; info->changer_info = NULL; + info->last_block = 0; + info->start_seek = 0; nslots = ide_cdrom_probe_capabilities (drive); @@ -3151,9 +2494,12 @@ static int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive) { + struct cdrom_info *info = drive->driver_data; int rc; MOD_INC_USE_COUNT; + if (info->buffer == NULL) + info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL); rc = cdrom_fops.open (ip, fp); if (rc) { drive->usage--; @@ -3178,7 +2524,6 @@ (drive->select.b.unit)<sector_buffer != NULL) - kfree (info->sector_buffer); + if (info->buffer != NULL) + kfree(info->buffer); if (info->toc != NULL) - kfree (info->toc); + kfree(info->toc); if (info->changer_info != NULL) - kfree (info->changer_info); + kfree(info->changer_info); if (devinfo->handle == drive && unregister_cdrom (devinfo)) printk ("%s: ide_cdrom_cleanup failed to unregister device from the cdrom driver.\n", drive->name); - kfree (info); + kfree(info); drive->driver_data = NULL; return 0; } @@ -3235,11 +2580,6 @@ MODULE_PARM(ignore, "s"); MODULE_DESCRIPTION("ATAPI CD-ROM Driver"); -int init_module (void) -{ - return ide_cdrom_init(); -} - void cleanup_module(void) { ide_drive_t *drive; @@ -3252,6 +2592,11 @@ } ide_unregister_module (&ide_cdrom_module); } + +int init_module(void) +{ + return ide_cdrom_init(); +} #endif /* MODULE */ int ide_cdrom_init (void) @@ -3263,11 +2608,12 @@ MOD_INC_USE_COUNT; while ((drive = ide_scan_devices (ide_cdrom, ide_cdrom_driver.name, NULL, failed++)) != NULL) { /* skip drives that we were told to ignore */ - if (ignore != NULL) + if (ignore != NULL) { if (strstr(ignore, drive->name)) { printk("ide-cd: ignoring drive %s\n", drive->name); continue; } + } info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL); if (info == NULL) { printk ("%s: Can't allocate a cdrom structure\n", drive->name); @@ -3294,11 +2640,3 @@ MOD_DEC_USE_COUNT; return 0; } - - -/*==========================================================================*/ -/* - * Local variables: - * c-basic-offset: 8 - * End: - */ diff -urN v2.2.15/linux/drivers/block/ide-cd.h linux/drivers/block/ide-cd.h --- v2.2.15/linux/drivers/block/ide-cd.h Tue Oct 26 17:53:39 1999 +++ linux/drivers/block/ide-cd.h Wed Jun 7 14:26:42 2000 @@ -1,12 +1,13 @@ #ifndef _IDE_CD_H #define _IDE_CD_H /* - * linux/drivers/block/ide_modes.h + * linux/drivers/block/ide_cd.h * - * Copyright (C) 1996 Erik Andersen - * Copyright (C) 1998, 1999 Jens Axboe + * Copyright (C) 1996, 1997, 1998 Erik Andersen + * Copyright (C) 1998, 1999, 2000 Jens Axboe */ +#include #include /* Turn this on to have the driver print out the meanings of the @@ -34,19 +35,13 @@ #define NO_DOOR_LOCKING 0 #endif - -/* Size of buffer to allocate, in blocks, for audio reads. */ - -#ifndef CDROM_NBLOCKS_BUFFER -#define CDROM_NBLOCKS_BUFFER 8 -#endif - - /************************************************************************/ -#define SECTOR_SIZE 512 -#define SECTOR_BITS 9 -#define SECTORS_PER_FRAME (CD_FRAMESIZE / SECTOR_SIZE) +#define SECTOR_SIZE 512 +#define SECTOR_BITS 9 +#define SECTORS_PER_FRAME (CD_FRAMESIZE / SECTOR_SIZE) +#define SECTOR_BUFFER_SIZE (CD_FRAMESIZE * 32) +#define SECTORS_BUFFER (SECTOR_BUFFER_SIZE / SECTOR_SIZE) #define MIN(a,b) ((a) < (b) ? (a) : (b)) @@ -55,96 +50,37 @@ #define REQUEST_SENSE_COMMAND 4316 #define RESET_DRIVE_COMMAND 4317 -/* - * For controlling drive spindown time. - */ -#define CDROMGETSPINDOWN 0x531d -#define CDROMSETSPINDOWN 0x531e - - -/* Some ATAPI command opcodes (just like SCSI). - (Some other cdrom-specific codes are in cdrom.h.) */ -#define TEST_UNIT_READY 0x00 -#define REQUEST_SENSE 0x03 -#define INQUIRY 0x12 -#define START_STOP 0x1b -#define ALLOW_MEDIUM_REMOVAL 0x1e -#define READ_CAPACITY 0x25 -#define READ_10 0x28 -#define SEEK 0x2b -#define READ_HEADER 0x44 -#define STOP_PLAY_SCAN 0x4e -#define MODE_SELECT_10 0x55 -#define MODE_SENSE_10 0x5a -#define LOAD_UNLOAD 0xa6 -#define READ_12 0xa8 -#define READ_CD_MSF 0xb9 -#define SCAN 0xba -#define SET_CD_SPEED 0xbb -#define PLAY_CD 0xbc -#define MECHANISM_STATUS 0xbd -#define READ_CD 0xbe - -/* DVD Opcodes */ -#define DVD_GET_PERFORMANCE 0xac - - -/* Page codes for mode sense/set */ - -#define PAGE_READERR 0x01 -#define PAGE_CDROM 0x0d -#define PAGE_AUDIO 0x0e -#define PAGE_CAPABILITIES 0x2a -#define PAGE_ALL 0x3f - - -/* ATAPI sense keys (from table 140 of ATAPI 2.6) */ - -#define NO_SENSE 0x00 -#define RECOVERED_ERROR 0x01 -#define NOT_READY 0x02 -#define MEDIUM_ERROR 0x03 -#define HARDWARE_ERROR 0x04 -#define ILLEGAL_REQUEST 0x05 -#define UNIT_ATTENTION 0x06 -#define DATA_PROTECT 0x07 -#define ABORTED_COMMAND 0x0b -#define MISCOMPARE 0x0e - -/* We want some additional flags for CDROM drives. - To save space in the ide_drive_t struct, use some fields which - doesn't make sense for CDROMs -- `bios_cyl' and `bios_head'. */ /* Configuration flags. These describe the capabilities of the drive. They generally do not change after initialization, unless we learn more about the drive from stuff failing. */ struct ide_cd_config_flags { - __u8 drq_interrupt : 1; /* Device sends an interrupt when ready - for a packet command. */ - __u8 no_doorlock : 1; /* Drive cannot lock the door. */ - __u8 no_eject : 1; /* Drive cannot eject the disc. */ - __u8 nec260 : 1; /* Drive is a pre-1.2 NEC 260 drive. */ - __u8 playmsf_as_bcd : 1; /* PLAYMSF command takes BCD args. */ - __u8 tocaddr_as_bcd : 1; /* TOC addresses are in BCD. */ - __u8 toctracks_as_bcd : 1; /* TOC track numbers are in BCD. */ - __u8 subchan_as_bcd : 1; /* Subchannel info is in BCD. */ - __u8 is_changer : 1; /* Drive is a changer. */ - __u8 cd_r : 1; /* Drive can write to CD-R media . */ - __u8 cd_rw : 1; /* Drive can write to CD-R/W media . */ - __u8 dvd : 1; /* Drive is a DVD-ROM */ - __u8 dvd_r : 1; /* Drive can write DVD-RAM */ - __u8 dvd_rw : 1; /* Drive can write DVD-R/W */ - __u8 test_write : 1; /* Drive can fake writes */ - __u8 supp_disc_present: 1; /* Changer can report exact contents - of slots. */ - __u8 limit_nframes : 1; /* Drive does not provide data in - multiples of SECTOR_SIZE when more - than one interrupt is needed. */ - __u8 seeking : 1; /* Seeking in progress */ - __u8 audio_play : 1; /* can do audio related commands */ - __u8 close_tray : 1; /* can close the tray */ - __u8 reserved : 4; - byte max_speed; /* Max speed of the drive */ + __u8 drq_interrupt : 1; /* Device sends an interrupt when ready + for a packet command. */ + __u8 no_doorlock : 1; /* Drive cannot lock the door. */ + __u8 no_eject : 1; /* Drive cannot eject the disc. */ + __u8 nec260 : 1; /* Drive is a pre-1.2 NEC 260 drive. */ + __u8 playmsf_as_bcd : 1; /* PLAYMSF command takes BCD args. */ + __u8 tocaddr_as_bcd : 1; /* TOC addresses are in BCD. */ + __u8 toctracks_as_bcd : 1; /* TOC track numbers are in BCD. */ + __u8 subchan_as_bcd : 1; /* Subchannel info is in BCD. */ + __u8 is_changer : 1; /* Drive is a changer. */ + __u8 cd_r : 1; /* Drive can write to CD-R media . */ + __u8 cd_rw : 1; /* Drive can write to CD-R/W media . */ + __u8 dvd : 1; /* Drive is a DVD-ROM */ + __u8 dvd_r : 1; /* Drive can write DVD-R */ + __u8 dvd_ram : 1; /* Drive can write DVD-RAM */ + __u8 test_write : 1; /* Drive can fake writes */ + __u8 supp_disc_present : 1; /* Changer can report exact contents + of slots. */ + __u8 limit_nframes : 1; /* Drive does not provide data in + multiples of SECTOR_SIZE when more + than one interrupt is needed. */ + __u8 seeking : 1; /* Seeking in progress */ + __u8 audio_play : 1; /* can do audio related commands */ + __u8 close_tray : 1; /* can close the tray */ + __u8 reserved : 4; + byte max_speed; /* Max speed of the drive */ }; #define CDROM_CONFIG_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->config_flags)) @@ -155,51 +91,17 @@ __u8 media_changed : 1; /* Driver has noticed a media change. */ __u8 toc_valid : 1; /* Saved TOC information is current. */ __u8 door_locked : 1; /* We think that the drive door is locked. */ - __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */ - __u8 reserved : 3; + __u8 reserved : 5; byte current_speed; /* Current speed of the drive */ }; -#define CDROM_STATE_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->state_flags)) - -struct atapi_request_sense { -#if defined(__BIG_ENDIAN_BITFIELD) - unsigned char valid : 1; - unsigned char error_code : 7; -#elif defined(__LITTLE_ENDIAN_BITFIELD) - unsigned char error_code : 7; - unsigned char valid : 1; -#else -#error "Please fix " -#endif - byte reserved1; -#if defined(__BIG_ENDIAN_BITFIELD) - unsigned char reserved3 : 2; - unsigned char ili : 1; - unsigned char reserved2 : 1; - unsigned char sense_key : 4; -#elif defined(__LITTLE_ENDIAN_BITFIELD) - unsigned char sense_key : 4; - unsigned char reserved2 : 1; - unsigned char ili : 1; - unsigned char reserved3 : 2; -#else -#error "Please fix " -#endif - byte info[4]; - byte sense_len; - byte command_info[4]; - byte asc; - byte ascq; - byte fru; - byte sense_key_specific[3]; -}; +#define CDROM_STATE_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->state_flags)) struct packet_command { char *buffer; int buflen; int stat; - struct atapi_request_sense *sense_data; + struct request_sense *sense; unsigned char c[12]; }; @@ -278,16 +180,12 @@ }; -typedef enum { - mechtype_caddy = 0, - mechtype_tray = 1, - mechtype_popup = 2, - mechtype_individual_changer = 4, - mechtype_cartridge_changer = 5 -} mechtype_t; - +/* This should probably go into cdrom.h along with the other + * generic stuff now in the Mt. Fuji spec. + */ struct atapi_capabilities_page { + struct mode_page_header header; #if defined(__BIG_ENDIAN_BITFIELD) __u8 parameters_saveable : 1; __u8 reserved1 : 1; @@ -500,8 +398,7 @@ /* Current speed (in kB/s). */ unsigned short curspeed; - /* Truncate the structure here, so we don't have headaches reading - from older drives. */ + char pad[4]; }; @@ -552,13 +449,11 @@ byte reserved2[3]; }; - struct atapi_changer_info { struct atapi_mechstat_header hdr; struct atapi_slot slots[0]; }; - /* Extra per-device info for cdrom drives. */ struct cdrom_info { @@ -567,21 +462,13 @@ struct atapi_toc *toc; - /* Sector buffer. If a read request wants only the first part - of a cdrom block, we cache the rest of the block here, - in the expectation that the data is going to be wanted soon. - SECTOR_BUFFERED is the number of the first buffered sector, - and NSECTORS_BUFFERED is the number of sectors in the buffer. - Before the buffer is allocated, we should have - SECTOR_BUFFER == NULL and NSECTORS_BUFFERED == 0. */ - - unsigned long sector_buffered; - unsigned long nsectors_buffered; - char *sector_buffer; + unsigned long sector_buffered; + unsigned long nsectors_buffered; + unsigned char *buffer; /* The result of the last successful request sense command on this device. */ - struct atapi_request_sense sense_data; + struct request_sense sense_data; struct request request_sense_request; struct packet_command request_sense_pc; @@ -598,21 +485,91 @@ struct cdrom_device_info devinfo; }; - -#define SECTOR_BUFFER_SIZE CD_FRAMESIZE - - /**************************************************************************** * Descriptions of ATAPI error codes. */ #define ARY_LEN(a) ((sizeof(a) / sizeof(a[0]))) +/* This stuff should be in cdrom.h, since it is now generic... */ + +/* ATAPI sense keys (from table 140 of ATAPI 2.6) */ +#define NO_SENSE 0x00 +#define RECOVERED_ERROR 0x01 +#define NOT_READY 0x02 +#define MEDIUM_ERROR 0x03 +#define HARDWARE_ERROR 0x04 +#define ILLEGAL_REQUEST 0x05 +#define UNIT_ATTENTION 0x06 +#define DATA_PROTECT 0x07 +#define ABORTED_COMMAND 0x0b +#define MISCOMPARE 0x0e + + + +/* This stuff should be in cdrom.h, since it is now generic... */ #if VERBOSE_IDE_CD_ERRORS -/* From Table 124 of the ATAPI 1.2 spec. - Unchanged in Table 140 of the ATAPI 2.6 draft standard. */ + /* The generic packet command opcodes for CD/DVD Logical Units, + * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */ +const struct { + unsigned short packet_command; + const char * const text; +} packet_command_texts[] = { + { GPCMD_TEST_UNIT_READY, "Test Unit Ready" }, + { GPCMD_REQUEST_SENSE, "Request Sense" }, + { GPCMD_FORMAT_UNIT, "Format Unit" }, + { GPCMD_INQUIRY, "Inquiry" }, + { GPCMD_START_STOP_UNIT, "Start/Stop Unit" }, + { GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL, "Prevent/Allow Medium Removal" }, + { GPCMD_READ_FORMAT_CAPACITIES, "Read Format Capacities" }, + { GPCMD_READ_CDVD_CAPACITY, "Read Cd/Dvd Capacity" }, + { GPCMD_READ_10, "Read 10" }, + { GPCMD_WRITE_10, "Write 10" }, + { GPCMD_SEEK, "Seek" }, + { GPCMD_WRITE_AND_VERIFY_10, "Write and Verify 10" }, + { GPCMD_VERIFY_10, "Verify 10" }, + { GPCMD_FLUSH_CACHE, "Flush Cache" }, + { GPCMD_READ_SUBCHANNEL, "Read Subchannel" }, + { GPCMD_READ_TOC_PMA_ATIP, "Read Table of Contents" }, + { GPCMD_READ_HEADER, "Read Header" }, + { GPCMD_PLAY_AUDIO_10, "Play Audio 10" }, + { GPCMD_GET_CONFIGURATION, "Get Configuration" }, + { GPCMD_PLAY_AUDIO_MSF, "Play Audio MSF" }, + { GPCMD_PLAYAUDIO_TI, "Play Audio TrackIndex" }, + { GPCMD_GET_EVENT_STATUS_NOTIFICATION, "Get Event Status Notification" }, + { GPCMD_PAUSE_RESUME, "Pause/Resume" }, + { GPCMD_STOP_PLAY_SCAN, "Stop Play/Scan" }, + { GPCMD_READ_DISC_INFO, "Read Disc Info" }, + { GPCMD_READ_TRACK_RZONE_INFO, "Read Track Rzone Info" }, + { GPCMD_RESERVE_RZONE_TRACK, "Reserve Rzone Track" }, + { GPCMD_SEND_OPC, "Send OPC" }, + { GPCMD_MODE_SELECT_10, "Mode Select 10" }, + { GPCMD_REPAIR_RZONE_TRACK, "Repair Rzone Track" }, + { GPCMD_MODE_SENSE_10, "Mode Sense 10" }, + { GPCMD_CLOSE_TRACK, "Close Track" }, + { GPCMD_BLANK, "Blank" }, + { GPCMD_SEND_EVENT, "Send Event" }, + { GPCMD_SEND_KEY, "Send Key" }, + { GPCMD_REPORT_KEY, "Report Key" }, + { GPCMD_LOAD_UNLOAD, "Load/Unload" }, + { GPCMD_SET_READ_AHEAD, "Set Read-ahead" }, + { GPCMD_READ_12, "Read 12" }, + { GPCMD_GET_PERFORMANCE, "Get Performance" }, + { GPCMD_SEND_DVD_STRUCTURE, "Send DVD Structure" }, + { GPCMD_READ_DVD_STRUCTURE, "Read DVD Structure" }, + { GPCMD_SET_STREAMING, "Set Streaming" }, + { GPCMD_READ_CD_MSF, "Read CD MSF" }, + { GPCMD_SCAN, "Scan" }, + { GPCMD_SET_SPEED, "Set Speed" }, + { GPCMD_PLAY_CD, "Play CD" }, + { GPCMD_MECHANISM_STATUS, "Mechanism Status" }, + { GPCMD_READ_CD, "Read CD" }, +}; + + +/* From Table 303 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */ const char * const sense_key_texts[16] = { "No sense data", "Recovered error", @@ -632,162 +589,145 @@ "(reserved)", }; - -/* From Table 37 of the ATAPI 2.6 draft standard. */ -const struct { - unsigned short packet_command; - const char * const text; -} packet_command_texts[] = { - { TEST_UNIT_READY, "Test Unit Ready" }, - { REQUEST_SENSE, "Request Sense" }, - { INQUIRY, "Inquiry" }, - { START_STOP, "Start Stop Unit" }, - { ALLOW_MEDIUM_REMOVAL, "Prevent/Allow Medium Removal" }, - { READ_CAPACITY, "Read CD-ROM Capacity" }, - { READ_10, "Read(10)" }, - { SEEK, "Seek" }, - { SCMD_READ_TOC, "Read TOC" }, - { SCMD_READ_SUBCHANNEL, "Read Sub-Channel" }, - { READ_HEADER, "Read Header" }, - { STOP_PLAY_SCAN, "Stop Play/Scan" }, - { SCMD_PLAYAUDIO10, "Play Audio" }, - { SCMD_PLAYAUDIO_MSF, "Play Audio MSF" }, - { SCMD_PAUSE_RESUME, "Pause/Resume" }, - { MODE_SELECT_10, "Mode Select" }, - { MODE_SENSE_10, "Mode Sense" }, - { LOAD_UNLOAD, "Load/Unload CD" }, - { READ_12, "Read(12)" }, - { READ_CD_MSF, "Read CD MSF" }, - { SCAN, "Scan" }, - { SET_CD_SPEED, "Set CD Speed" }, - { PLAY_CD, "Play CD" }, - { MECHANISM_STATUS, "Mechanism Status" }, - { READ_CD, "Read CD" }, - { DVD_GET_PERFORMANCE, "Get Performance" }, -}; - - -/* From Table 125 of the ATAPI 1.2 spec., - with additions from Tables 141 and 142 of the ATAPI 2.6 draft standard. */ - +/* From Table 304 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */ const struct { - unsigned short asc_ascq; + unsigned long asc_ascq; const char * const text; } sense_data_texts[] = { - { 0x0000, "No additional sense information" }, - - { 0x0011, "Audio play operation in progress" }, - { 0x0012, "Audio play operation paused" }, - { 0x0013, "Audio play operation successfully completed" }, - { 0x0014, "Audio play operation stopped due to error" }, - { 0x0015, "No current audio status to return" }, - - { 0x0100, "Mechanical positioning or changer error" }, - - { 0x0200, "No seek complete" }, - - { 0x0400, "Logical unit not ready - cause not reportable" }, - { 0x0401, - "Logical unit not ready - in progress (sic) of becoming ready" }, - { 0x0402, "Logical unit not ready - initializing command required" }, - { 0x0403, "Logical unit not ready - manual intervention required" }, - - { 0x0501, "Media load - eject failed" }, - - { 0x0600, "No reference position found" }, - - { 0x0900, "Track following error" }, - { 0x0901, "Tracking servo failure" }, - { 0x0902, "Focus servo failure" }, - { 0x0903, "Spindle servo failure" }, - - { 0x1100, "Unrecovered read error" }, - { 0x1106, "CIRC unrecovered error" }, - - { 0x1500, "Random positioning error" }, - { 0x1501, "Mechanical positioning or changer error" }, - { 0x1502, "Positioning error detected by read of medium" }, - - { 0x1700, "Recovered data with no error correction applied" }, - { 0x1701, "Recovered data with retries" }, - { 0x1702, "Recovered data with positive head offset" }, - { 0x1703, "Recovered data with negative head offset" }, - { 0x1704, "Recovered data with retries and/or CIRC applied" }, - { 0x1705, "Recovered data using previous sector ID" }, - - { 0x1800, "Recovered data with error correction applied" }, - { 0x1801, "Recovered data with error correction and retries applied" }, - { 0x1802, "Recovered data - the data was auto-reallocated" }, - { 0x1803, "Recovered data with CIRC" }, - { 0x1804, "Recovered data with L-EC" }, - /* Following two not in 2.6. */ - { 0x1805, "Recovered data - recommend reassignment" }, - { 0x1806, "Recovered data - recommend rewrite" }, - - { 0x1a00, "Parameter list length error" }, - - { 0x2000, "Invalid command operation code" }, - - { 0x2100, "Logical block address out of range" }, - - { 0x2400, "Invalid field in command packet" }, - - { 0x2600, "Invalid field in parameter list" }, - { 0x2601, "Parameter not supported" }, - { 0x2602, "Parameter value invalid" }, - /* Following code not in 2.6. */ - { 0x2603, "Threshold parameters not supported" }, - - { 0x2800, "Not ready to ready transition, medium may have changed" }, - - { 0x2900, "Power on, reset or bus device reset occurred" }, - - { 0x2a00, "Parameters changed" }, - { 0x2a01, "Mode parameters changed" }, - - { 0x3000, "Incompatible medium installed" }, - { 0x3001, "Cannot read medium - unknown format" }, - { 0x3002, "Cannot read medium - incompatible format" }, - - /* Following code not in 2.6. */ - { 0x3700, "Rounded parameter" }, - - { 0x3900, "Saving parameters not supported" }, - - { 0x3a00, "Medium not present" }, - - { 0x3f00, "ATAPI CD-ROM drive operating conditions have changed" }, - { 0x3f01, "Microcode has been changed" }, - /* Following two not in 2.6. */ - { 0x3f02, "Changed operating definition" }, - { 0x3f03, "Inquiry data has changed" }, - - { 0x4000, "Diagnostic failure on component (ASCQ)" }, - - { 0x4400, "Internal ATAPI CD-ROM drive failure" }, - - { 0x4e00, "Overlapped commands attempted" }, - - { 0x5300, "Media load or eject failed" }, - { 0x5302, "Medium removal prevented" }, - - { 0x5700, "Unable to recover table of contents" }, - - { 0x5a00, "Operator request or state change input (unspecified)" }, - { 0x5a01, "Operator medium removal request" }, - - /* Following two not in 2.6. */ - { 0x5b00, "Threshold condition met" }, - { 0x5c00, "Status change" }, - - { 0x6300, "End of user area encountered on this track" }, - - { 0x6400, "Illegal mode for this track or incompatible medium" }, - - /* Following error is misspelled in ATAPI 2.6 */ - { 0xb900, "Play operation oborted [sic]" }, - - { 0xbf00, "Loss of streaming" }, + { 0x000000, "No additional sense information" }, + { 0x000011, "Play operation in progress" }, + { 0x000012, "Play operation paused" }, + { 0x000013, "Play operation successfully completed" }, + { 0x000014, "Play operation stopped due to error" }, + { 0x000015, "No current audio status to return" }, + { 0x010c0a, "Write error - padding blocks added" }, + { 0x011700, "Recovered data with no error correction applied" }, + { 0x011701, "Recovered data with retries" }, + { 0x011702, "Recovered data with positive head offset" }, + { 0x011703, "Recovered data with negative head offset" }, + { 0x011704, "Recovered data with retries and/or CIRC applied" }, + { 0x011705, "Recovered data using previous sector ID" }, + { 0x011800, "Recovered data with error correction applied" }, + { 0x011801, "Recovered data with error correction and retries applied"}, + { 0x011802, "Recovered data - the data was auto-reallocated" }, + { 0x011803, "Recovered data with CIRC" }, + { 0x011804, "Recovered data with L-EC" }, + { 0x015d00, + "Failure prediction threshold exceeded - Predicted logical unit failure" }, + { 0x015d01, + "Failure prediction threshold exceeded - Predicted media failure" }, + { 0x015dff, "Failure prediction threshold exceeded - False" }, + { 0x017301, "Power calibration area almost full" }, + { 0x020400, "Logical unit not ready - cause not reportable" }, + /* Following is misspelled in ATAPI 2.6, _and_ in Mt. Fuji */ + { 0x020401, + "Logical unit not ready - in progress [sic] of becoming ready" }, + { 0x020402, "Logical unit not ready - initializing command required" }, + { 0x020403, "Logical unit not ready - manual intervention required" }, + { 0x020404, "Logical unit not ready - format in progress" }, + { 0x020407, "Logical unit not ready - operation in progress" }, + { 0x020408, "Logical unit not ready - long write in progress" }, + { 0x020600, "No reference position found (media may be upside down)" }, + { 0x023000, "Incompatible medium installed" }, + { 0x023a00, "Medium not present" }, + { 0x025300, "Media load or eject failed" }, + { 0x025700, "Unable to recover table of contents" }, + { 0x030300, "Peripheral device write fault" }, + { 0x030301, "No write current" }, + { 0x030302, "Excessive write errors" }, + { 0x030c00, "Write error" }, + { 0x030c01, "Write error - Recovered with auto reallocation" }, + { 0x030c02, "Write error - auto reallocation failed" }, + { 0x030c03, "Write error - recommend reassignment" }, + { 0x030c04, "Compression check miscompare error" }, + { 0x030c05, "Data expansion occurred during compress" }, + { 0x030c06, "Block not compressible" }, + { 0x030c07, "Write error - recovery needed" }, + { 0x030c08, "Write error - recovery failed" }, + { 0x030c09, "Write error - loss of streaming" }, + { 0x031100, "Unrecovered read error" }, + { 0x031106, "CIRC unrecovered error" }, + { 0x033101, "Format command failed" }, + { 0x033200, "No defect spare location available" }, + { 0x033201, "Defect list update failure" }, + { 0x035100, "Erase failure" }, + { 0x037200, "Session fixation error" }, + { 0x037201, "Session fixation error writin lead-in" }, + { 0x037202, "Session fixation error writin lead-out" }, + { 0x037300, "CD control error" }, + { 0x037302, "Power calibration area is full" }, + { 0x037303, "Power calibration area error" }, + { 0x037304, "Program memory area / RMA update failure" }, + { 0x037305, "Program memory area / RMA is full" }, + { 0x037306, "Program memory area / RMA is (almost) full" }, + + { 0x040200, "No seek complete" }, + { 0x040300, "Write fault" }, + { 0x040900, "Track following error" }, + { 0x040901, "Tracking servo failure" }, + { 0x040902, "Focus servo failure" }, + { 0x040903, "Spindle servo failure" }, + { 0x041500, "Random positioning error" }, + { 0x041501, "Mechanical positioning or changer error" }, + { 0x041502, "Positioning error detected by read of medium" }, + { 0x043c00, "Mechanical positioning or changer error" }, + { 0x044000, "Diagnostic failure on component (ASCQ)" }, + { 0x044400, "Internal CD/DVD logical unit failure" }, + { 0x04b600, "Media load mechanism failed" }, + { 0x051a00, "Parameter list length error" }, + { 0x052000, "Invalid command operation code" }, + { 0x052100, "Logical block address out of range" }, + { 0x052102, "Invalid address for write" }, + { 0x052400, "Invalid field in command packet" }, + { 0x052600, "Invalid field in parameter list" }, + { 0x052601, "Parameter not supported" }, + { 0x052602, "Parameter value invalid" }, + { 0x052700, "Write protected media" }, + { 0x052c00, "Command sequence error" }, + { 0x052c03, "Current program area is not empty" }, + { 0x052c04, "Current program area is empty" }, + { 0x053001, "Cannot read medium - unknown format" }, + { 0x053002, "Cannot read medium - incompatible format" }, + { 0x053900, "Saving parameters not supported" }, + { 0x054e00, "Overlapped commands attempted" }, + { 0x055302, "Medium removal prevented" }, + { 0x055500, "System resource failure" }, + { 0x056300, "End of user area encountered on this track" }, + { 0x056400, "Illegal mode for this track or incompatible medium" }, + { 0x056f00, "Copy protection key exchange failure - Authentication failure" }, + { 0x056f01, "Copy protection key exchange failure - Key not present" }, + { 0x056f02, "Copy protection key exchange failure - Key not established" }, + { 0x056f03, "Read of scrambled sector without authentication" }, + { 0x056f04, "Media region code is mismatched to logical unit" }, + { 0x056f05, "Drive region must be permanent / region reset count error" }, + { 0x057203, "Session fixation error - incomplete track in session" }, + { 0x057204, "Empty or partially written reserved track" }, + { 0x057205, "No more RZONE reservations are allowed" }, + { 0x05bf00, "Loss of streaming" }, + { 0x062800, "Not ready to ready transition, medium may have changed" }, + { 0x062900, "Power on, reset or hardware reset occurred" }, + { 0x062a00, "Parameters changed" }, + { 0x062a01, "Mode parameters changed" }, + { 0x062e00, "Insufficient time for operation" }, + { 0x063f00, "Logical unit operating conditions have changed" }, + { 0x063f01, "Microcode has been changed" }, + { 0x065a00, "Operator request or state change input (unspecified)" }, + { 0x065a01, "Operator medium removal request" }, + { 0x0bb900, "Play operation aborted" }, + + /* Here we use 0xff for the key (not a valid key) to signify + * that these can have _any_ key value associated with them... */ + { 0xff0401, "Logical unit is in process of becoming ready" }, + { 0xff0400, "Logical unit not ready, cause not reportable" }, + { 0xff0402, "Logical unit not ready, initializing command required" }, + { 0xff0403, "Logical unit not ready, manual intervention required" }, + { 0xff0500, "Logical unit does not respond to selection" }, + { 0xff0800, "Logical unit communication failure" }, + { 0xff0802, "Logical unit communication parity error" }, + { 0xff0801, "Logical unit communication time-out" }, + { 0xff2500, "Logical unit not supported" }, + { 0xff4c00, "Logical unit failed self-configuration" }, + { 0xff3e00, "Logical unit has not self-configured yet" }, }; #endif diff -urN v2.2.15/linux/drivers/block/ide-disk.c linux/drivers/block/ide-disk.c --- v2.2.15/linux/drivers/block/ide-disk.c Wed May 3 17:16:33 2000 +++ linux/drivers/block/ide-disk.c Wed Jun 7 14:26:42 2000 @@ -94,8 +94,11 @@ * The ATA spec tells large drives to return * C/H/S = 16383/16/63 independent of their size. * Some drives can be jumpered to use 15 heads instead of 16. + * Some drives can be jumpered to use 4092 cyls instead of 16383. */ - if (id->cyls == 16383 && id->sectors == 63 && + if ((id->cyls == 16383 + || (id->cyls == 4092 && id->cur_cyls == 16383)) && + id->sectors == 63 && (id->heads == 15 || id->heads == 16) && id->lba_capacity >= 16383*63*id->heads) return 1; @@ -138,7 +141,7 @@ return ide_error(drive, "read_intr", stat); } /* no data yet, so wait for another interrupt */ - ide_set_handler(drive, &read_intr, WAIT_CMD); + ide_set_handler(drive, &read_intr, WAIT_CMD, NULL); return ide_started; } #endif @@ -167,7 +170,7 @@ if (i > 0) { if (msect) goto read_next; - ide_set_handler (drive, &read_intr, WAIT_CMD); + ide_set_handler (drive, &read_intr, WAIT_CMD, NULL); return ide_started; } return ide_stopped; @@ -201,7 +204,7 @@ ide_end_request(1, hwgroup); if (i > 0) { idedisk_output_data (drive, rq->buffer, SECTOR_WORDS); - ide_set_handler (drive, &write_intr, WAIT_CMD); + ide_set_handler (drive, &write_intr, WAIT_CMD, NULL); return ide_started; } return ide_stopped; @@ -309,7 +312,7 @@ if (rq->nr_sectors) { if (ide_multwrite(drive, drive->mult_count)) return ide_stopped; - ide_set_handler (drive, &multwrite_intr, WAIT_CMD); + ide_set_handler (drive, &multwrite_intr, WAIT_CMD, NULL); return ide_started; } } else { @@ -432,7 +435,7 @@ if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_read, drive))) return ide_started; #endif /* CONFIG_BLK_DEV_IDEDMA */ - ide_set_handler(drive, &read_intr, WAIT_CMD); + ide_set_handler(drive, &read_intr, WAIT_CMD, NULL); OUT_BYTE(drive->mult_count ? WIN_MULTREAD : WIN_READ, IDE_COMMAND_REG); return ide_started; } @@ -462,7 +465,7 @@ * Except when you get an error it seems... */ hwgroup->wrq = *rq; /* scratchpad */ - ide_set_handler (drive, &multwrite_intr, WAIT_CMD); + ide_set_handler (drive, &multwrite_intr, WAIT_CMD, NULL); if (ide_multwrite(drive, drive->mult_count)) { unsigned long flags; spin_lock_irqsave(&io_request_lock, flags); @@ -472,7 +475,7 @@ return ide_stopped; } } else { - ide_set_handler (drive, &write_intr, WAIT_CMD); + ide_set_handler (drive, &write_intr, WAIT_CMD, NULL); idedisk_output_data(drive, rq->buffer, SECTOR_WORDS); } return ide_started; diff -urN v2.2.15/linux/drivers/block/ide-dma.c linux/drivers/block/ide-dma.c --- v2.2.15/linux/drivers/block/ide-dma.c Tue Jan 4 10:12:14 2000 +++ linux/drivers/block/ide-dma.c Wed Jun 7 14:26:42 2000 @@ -328,7 +328,7 @@ drive->waiting_for_dma = 1; if (drive->media != ide_disk) return 0; - ide_set_handler(drive, &ide_dma_intr, WAIT_CMD);/* issue cmd to drive */ + ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL);/* issue cmd to drive */ OUT_BYTE(reading ? WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG); case ide_dma_begin: /* Note that this is done *after* the cmd has diff -urN v2.2.15/linux/drivers/block/ide-floppy.c linux/drivers/block/ide-floppy.c --- v2.2.15/linux/drivers/block/ide-floppy.c Tue Jan 4 10:12:14 2000 +++ linux/drivers/block/ide-floppy.c Wed Jun 7 14:26:42 2000 @@ -916,7 +916,7 @@ if (temp > pc->buffer_size) { printk (KERN_ERR "ide-floppy: The floppy wants to send us more data than expected - discarding data\n"); idefloppy_discard_data (drive,bcount.all); - ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD); + ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD,NULL); return ide_started; } #if IDEFLOPPY_DEBUG_LOG @@ -938,7 +938,7 @@ pc->actually_transferred+=bcount.all; /* Update the current position */ pc->current_position+=bcount.all; - ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD); /* And set the interrupt handler again */ + ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD,NULL); /* And set the interrupt handler again */ return ide_started; } @@ -957,7 +957,7 @@ printk (KERN_ERR "ide-floppy: (IO,CoD) != (0,1) while issuing a packet command\n"); return ide_do_reset (drive); } - ide_set_handler (drive, &idefloppy_pc_intr, IDEFLOPPY_WAIT_CMD); /* Set the interrupt routine */ + ide_set_handler (drive, &idefloppy_pc_intr, IDEFLOPPY_WAIT_CMD, NULL); /* Set the interrupt routine */ atapi_output_bytes (drive, floppy->pc->c, 12); /* Send the actual packet */ return ide_started; } @@ -1026,7 +1026,7 @@ #endif /* CONFIG_BLK_DEV_IDEDMA */ if (test_bit (IDEFLOPPY_DRQ_INTERRUPT, &floppy->flags)) { - ide_set_handler (drive, &idefloppy_transfer_pc, IDEFLOPPY_WAIT_CMD); + ide_set_handler (drive, &idefloppy_transfer_pc, IDEFLOPPY_WAIT_CMD, NULL); OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* Issue the packet command */ return ide_started; } else { diff -urN v2.2.15/linux/drivers/block/ide-pci.c linux/drivers/block/ide-pci.c --- v2.2.15/linux/drivers/block/ide-pci.c Wed May 3 17:16:33 2000 +++ linux/drivers/block/ide-pci.c Wed Jun 7 14:26:42 2000 @@ -24,6 +24,7 @@ #include "ide.h" +#define DEVID_450NX ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX}) #define DEVID_PIIXa ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0}) #define DEVID_PIIXb ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_1}) #define DEVID_PIIX3 ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_1}) @@ -111,6 +112,8 @@ #define INIT_CS5530 NULL #endif +static int autodma_default = 0; + typedef struct ide_pci_enablebit_s { byte reg; /* byte pci reg holding the enable-bit */ byte mask; /* mask to isolate the enable-bit */ @@ -296,14 +299,12 @@ */ __initfunc(static void ide_setup_pci_device (struct pci_dev *dev, ide_pci_device_t *d)) { - unsigned int port, at_least_one_hwif_enabled = 0, autodma = 0, pciirq = 0; + unsigned int port, at_least_one_hwif_enabled = 0, pciirq = 0; unsigned short pcicmd = 0, tried_config = 0; byte tmp = 0; ide_hwif_t *hwif, *mate = NULL; + int autodma = autodma_default; -#ifdef CONFIG_IDEDMA_AUTO - autodma = 1; -#endif check_if_enabled: if (pci_read_config_word(dev, PCI_COMMAND, &pcicmd)) { printk("%s: error accessing PCI regs\n", d->name); @@ -443,6 +444,19 @@ if (!pci_present()) return; + +#ifdef CONFIG_IDEDMA_AUTO + autodma_default = 1; + for(dev = pci_devices; dev; dev=dev->next) { + devid.vid = dev->vendor; + devid.did = dev->device; + if (IDE_PCI_DEVID_EQ(devid, DEVID_450NX)) { + autodma_default = 0; + break; + } + } +#endif + for(dev = pci_devices; dev; dev=dev->next) { devid.vid = dev->vendor; devid.did = dev->device; diff -urN v2.2.15/linux/drivers/block/ide-pmac.c linux/drivers/block/ide-pmac.c --- v2.2.15/linux/drivers/block/ide-pmac.c Tue Oct 26 17:53:39 1999 +++ linux/drivers/block/ide-pmac.c Wed Jun 7 14:26:42 2000 @@ -359,7 +359,7 @@ drive->waiting_for_dma = 1; if (drive->media != ide_disk) return 0; - ide_set_handler(drive, &ide_dma_intr, WAIT_CMD); + ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL); OUT_BYTE(func==ide_dma_write? WIN_WRITEDMA: WIN_READDMA, IDE_COMMAND_REG); case ide_dma_begin: diff -urN v2.2.15/linux/drivers/block/ide-probe.c linux/drivers/block/ide-probe.c --- v2.2.15/linux/drivers/block/ide-probe.c Wed May 3 17:16:33 2000 +++ linux/drivers/block/ide-probe.c Wed Jun 7 14:26:42 2000 @@ -191,6 +191,10 @@ } else hd_status = IDE_ALTSTATUS_REG; /* use non-intrusive polling */ + /* set features register for atapi identify command */ + if((cmd == WIN_PIDENTIFY)) + OUT_BYTE(0,IDE_FEATURE_REG); /* disable dma & overlap mode */ + #if CONFIG_BLK_DEV_PDC4030 if (IS_PDC4030_DRIVE) { extern int pdc4030_cmd(ide_drive_t *, byte); diff -urN v2.2.15/linux/drivers/block/ide-tape.c linux/drivers/block/ide-tape.c --- v2.2.15/linux/drivers/block/ide-tape.c Tue Jan 4 10:12:14 2000 +++ linux/drivers/block/ide-tape.c Wed Jun 7 14:26:42 2000 @@ -2013,7 +2013,7 @@ if (temp > pc->buffer_size) { printk (KERN_ERR "ide-tape: The tape wants to send us more data than expected - discarding data\n"); idetape_discard_data (drive,bcount.all); - ide_set_handler (drive,&idetape_pc_intr,IDETAPE_WAIT_CMD); + ide_set_handler (drive,&idetape_pc_intr,IDETAPE_WAIT_CMD,NULL); return ide_started; } #if IDETAPE_DEBUG_LOG @@ -2035,7 +2035,7 @@ pc->actually_transferred+=bcount.all; /* Update the current position */ pc->current_position+=bcount.all; - ide_set_handler (drive,&idetape_pc_intr,IDETAPE_WAIT_CMD); /* And set the interrupt handler again */ + ide_set_handler (drive,&idetape_pc_intr,IDETAPE_WAIT_CMD,NULL); /* And set the interrupt handler again */ return ide_started; } @@ -2109,7 +2109,7 @@ printk (KERN_ERR "ide-tape: (IO,CoD) != (0,1) while issuing a packet command\n"); return ide_do_reset (drive); } - ide_set_handler(drive, &idetape_pc_intr, IDETAPE_WAIT_CMD); /* Set the interrupt routine */ + ide_set_handler(drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL); /* Set the interrupt routine */ atapi_output_bytes (drive,pc->c,12); /* Send the actual packet */ return ide_started; } @@ -2175,7 +2175,7 @@ } #endif /* CONFIG_BLK_DEV_IDEDMA */ if (test_bit(IDETAPE_DRQ_INTERRUPT, &tape->flags)) { - ide_set_handler(drive, &idetape_transfer_pc, IDETAPE_WAIT_CMD); + ide_set_handler(drive, &idetape_transfer_pc, IDETAPE_WAIT_CMD, NULL); OUT_BYTE(WIN_PACKETCMD, IDE_COMMAND_REG); return ide_started; } else { diff -urN v2.2.15/linux/drivers/block/ide.c linux/drivers/block/ide.c --- v2.2.15/linux/drivers/block/ide.c Wed May 3 17:16:33 2000 +++ linux/drivers/block/ide.c Wed Jun 7 14:26:42 2000 @@ -274,6 +274,7 @@ if (!strncmp(id->model, "KODAK ATA_FLASH", 15) /* Kodak */ || !strncmp(id->model, "Hitachi CV", 10) /* Hitachi */ || !strncmp(id->model, "SunDisk SDCFB", 13) /* SunDisk */ + || !strncmp(id->model, "ATA_FLASH", 9) /* Simple Tech */ || !strncmp(id->model, "HAGIWARA HPC", 12)) /* Hagiwara */ { return 1; /* yes, it is a flash memory card */ @@ -467,7 +468,8 @@ * timer is started to prevent us from waiting forever in case * something goes wrong (see the ide_timer_expiry() handler later on). */ -void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, unsigned int timeout) +void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, + unsigned int timeout, ide_expiry_t *expiry) { unsigned long flags; ide_hwgroup_t *hwgroup = HWGROUP(drive); @@ -477,8 +479,9 @@ printk("%s: ide_set_handler: handler not null; old=%p, new=%p\n", drive->name, hwgroup->handler, handler); } - hwgroup->handler = handler; - hwgroup->timer.expires = jiffies + timeout; + hwgroup->handler = handler; + hwgroup->expiry = expiry; + hwgroup->timer.expires = jiffies + timeout; add_timer(&hwgroup->timer); spin_unlock_irqrestore(&io_request_lock, flags); } @@ -535,7 +538,7 @@ printk("%s: ATAPI reset complete\n", drive->name); } else { if (0 < (signed long)(hwgroup->poll_timeout - jiffies)) { - ide_set_handler (drive, &atapi_reset_pollfunc, HZ/20); + ide_set_handler (drive, &atapi_reset_pollfunc, HZ/20, NULL); return ide_started; /* continue polling */ } hwgroup->poll_timeout = 0; /* end of polling */ @@ -560,7 +563,7 @@ if (!OK_STAT(tmp=GET_STAT(), 0, BUSY_STAT)) { if (0 < (signed long)(hwgroup->poll_timeout - jiffies)) { - ide_set_handler (drive, &reset_pollfunc, HZ/20); + ide_set_handler (drive, &reset_pollfunc, HZ/20, NULL); return ide_started; /* continue polling */ } printk("%s: reset timed-out, status=0x%02x\n", hwif->name, tmp); @@ -642,7 +645,7 @@ udelay (20); OUT_BYTE (WIN_SRST, IDE_COMMAND_REG); hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE; - ide_set_handler (drive, &atapi_reset_pollfunc, HZ/20); + ide_set_handler (drive, &atapi_reset_pollfunc, HZ/20, NULL); __restore_flags (flags); /* local CPU only */ return ide_started; } @@ -668,7 +671,7 @@ OUT_BYTE(drive->ctl|2,IDE_CONTROL_REG); /* clear SRST, leave nIEN */ udelay(10); /* more than enough time */ hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE; - ide_set_handler (drive, &reset_pollfunc, HZ/20); + ide_set_handler (drive, &reset_pollfunc, HZ/20, NULL); #endif /* OK_TO_RESET_CONTROLLER */ __restore_flags (flags); /* local CPU only */ @@ -858,7 +861,7 @@ */ void ide_cmd(ide_drive_t *drive, byte cmd, byte nsect, ide_handler_t *handler) { - ide_set_handler (drive, handler, WAIT_CMD); + ide_set_handler (drive, handler, WAIT_CMD, NULL); OUT_BYTE(drive->ctl,IDE_CONTROL_REG); /* clear nIEN */ OUT_BYTE(nsect,IDE_NSECTOR_REG); OUT_BYTE(cmd,IDE_COMMAND_REG); @@ -1287,7 +1290,9 @@ { ide_hwgroup_t *hwgroup = (ide_hwgroup_t *) data; ide_handler_t *handler; + ide_expiry_t *expiry; unsigned long flags; + unsigned long wait; spin_lock_irqsave(&io_request_lock, flags); del_timer(&hwgroup->timer); @@ -1306,6 +1311,7 @@ hwgroup->handler = NULL; if (!drive) { printk("ide_timer_expiry: hwgroup->drive was NULL\n"); + hwgroup->handler = NULL; } else { ide_hwif_t *hwif; ide_startstop_t startstop; @@ -1313,6 +1319,17 @@ hwgroup->busy = 1; /* paranoia */ printk("%s: ide_timer_expiry: hwgroup->busy was 0 ??\n", drive->name); } + if ((expiry = hwgroup->expiry) != NULL) { + /* continue */ + if ((wait = expiry(drive)) != 0) { + /* reset timer */ + hwgroup->timer.expires = jiffies + wait; + add_timer(&hwgroup->timer); + spin_unlock_irqrestore(&io_request_lock, flags); + return; + } + } + hwgroup->handler = NULL; /* * We need to simulate a real interrupt when invoking the handler() * function, which means we need to globally mask the specific IRQ: @@ -2286,6 +2303,10 @@ } drive->nice1 = (arg >> IDE_NICE_1) & 1; return 0; + + case BLKELVGET: + case BLKELVSET: + return blkelv_ioctl(inode->i_rdev, cmd, arg); RO_IOCTLS(inode->i_rdev, arg); diff -urN v2.2.15/linux/drivers/block/ide.h linux/drivers/block/ide.h --- v2.2.15/linux/drivers/block/ide.h Tue Jan 4 10:12:14 2000 +++ linux/drivers/block/ide.h Wed Jun 7 14:26:42 2000 @@ -365,6 +365,12 @@ */ typedef ide_startstop_t (ide_handler_t)(ide_drive_t *); +/* + * when ide_timer_expiry fires, invoke a handler of this type + * to decide what to do. + */ +typedef int (ide_expiry_t)(ide_drive_t *); + typedef struct hwgroup_s { ide_handler_t *handler;/* irq handler, if active */ volatile int busy; /* BOOL: protects all fields below */ @@ -375,6 +381,7 @@ struct timer_list timer; /* failsafe timer */ struct request wrq; /* local copy of current write rq */ unsigned long poll_timeout; /* timeout value during long polls */ + ide_expiry_t *expiry; /* queried upon timeouts */ } ide_hwgroup_t; /* @@ -545,7 +552,7 @@ * This is used on exit from the driver, to designate the next irq handler * and also to start the safety timer. */ -void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, unsigned int timeout); +void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry); /* * Error reporting, in human readable form (luxurious, but a memory hog). diff -urN v2.2.15/linux/drivers/block/ll_rw_blk.c linux/drivers/block/ll_rw_blk.c --- v2.2.15/linux/drivers/block/ll_rw_blk.c Wed May 3 17:16:33 2000 +++ linux/drivers/block/ll_rw_blk.c Wed Jun 7 14:26:42 2000 @@ -3,6 +3,7 @@ * * Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1994, Karl Keyte: Added support for disk statistics + * Elevator latency, (C) 2000 Andrea Arcangeli SuSE */ /* @@ -20,6 +21,7 @@ #include #include +#include #include #include @@ -53,11 +55,11 @@ /* * used to wait on when there are no free requests */ -struct wait_queue * wait_for_request = NULL; +struct wait_queue * wait_for_request; /* This specifies how many sectors to read ahead on the disk. */ -int read_ahead[MAX_BLKDEV] = {0, }; +int read_ahead[MAX_BLKDEV]; /* blk_dev_struct is: * *request_fn @@ -73,7 +75,7 @@ * * if (!blk_size[MAJOR]) then no minor size checking is done. */ -int * blk_size[MAX_BLKDEV] = { NULL, NULL, }; +int * blk_size[MAX_BLKDEV]; /* * blksize_size contains the size of all block-devices: @@ -82,7 +84,7 @@ * * if (!blksize_size[MAJOR]) then 1024 bytes is assumed. */ -int * blksize_size[MAX_BLKDEV] = { NULL, NULL, }; +int * blksize_size[MAX_BLKDEV]; /* * hardsect_size contains the size of the hardware sector of a device. @@ -96,22 +98,22 @@ * This is currently set by some scsi devices and read by the msdos fs driver. * Other uses may appear later. */ -int * hardsect_size[MAX_BLKDEV] = { NULL, NULL, }; +int * hardsect_size[MAX_BLKDEV]; /* * The following tunes the read-ahead algorithm in mm/filemap.c */ -int * max_readahead[MAX_BLKDEV] = { NULL, NULL, }; +int * max_readahead[MAX_BLKDEV]; /* * Max number of sectors per request */ -int * max_sectors[MAX_BLKDEV] = { NULL, NULL, }; +int * max_sectors[MAX_BLKDEV]; /* * Max number of segments per request */ -int * max_segments[MAX_BLKDEV] = { NULL, NULL, }; +int * max_segments[MAX_BLKDEV]; static inline int get_max_sectors(kdev_t dev) { @@ -142,6 +144,17 @@ return &blk_dev[major].current_request; } +static inline int get_request_latency(elevator_t * elevator, int rw) +{ + int latency; + + latency = elevator->read_latency; + if (rw != READ) + latency = elevator->write_latency; + + return latency; +} + /* * remove the plug and let it rip.. */ @@ -291,6 +304,197 @@ printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n"); } +static int blkelvget_ioctl(elevator_t * elevator, blkelv_ioctl_arg_t * arg) +{ + int ret; + blkelv_ioctl_arg_t output; + + output.queue_ID = elevator->queue_ID; + output.read_latency = elevator->read_latency; + output.write_latency = elevator->write_latency; + output.max_bomb_segments = elevator->max_bomb_segments; + + ret = -EFAULT; + if (copy_to_user(arg, &output, sizeof(blkelv_ioctl_arg_t))) + goto out; + ret = 0; + out: + return ret; +} + +static int blkelvset_ioctl(elevator_t * elevator, const blkelv_ioctl_arg_t * arg) +{ + blkelv_ioctl_arg_t input; + int ret; + + ret = -EFAULT; + if (copy_from_user(&input, arg, sizeof(blkelv_ioctl_arg_t))) + goto out; + + ret = -EINVAL; + if (input.read_latency < 0) + goto out; + if (input.write_latency < 0) + goto out; + if (input.max_bomb_segments <= 0) + goto out; + + elevator->read_latency = input.read_latency; + elevator->write_latency = input.write_latency; + elevator->max_bomb_segments = input.max_bomb_segments; + + ret = 0; + out: + return ret; +} + +int blkelv_ioctl(kdev_t dev, unsigned long cmd, unsigned long arg) +{ + elevator_t * elevator = &blk_dev[MAJOR(dev)].elevator; + blkelv_ioctl_arg_t * __arg = (blkelv_ioctl_arg_t *) arg; + + switch (cmd) { + case BLKELVGET: + return blkelvget_ioctl(elevator, __arg); + case BLKELVSET: + return blkelvset_ioctl(elevator, __arg); + } + return -EINVAL; +} + +static inline int seek_to_not_starving_chunk(struct request ** req, int * lat) +{ + struct request * tmp = *req; + int found = 0, pos = 0; + int last_pos = 0, __lat = *lat; + + do { + if (tmp->elevator_latency <= 0) + { + *req = tmp; + found = 1; + last_pos = pos; + if (last_pos >= __lat) + break; + } + pos += tmp->nr_segments; + } while ((tmp = tmp->next)); + *lat -= last_pos; + + return found; +} + +#define CASE_COALESCE_BUT_FIRST_REQUEST_MAYBE_BUSY \ + case IDE0_MAJOR: /* same as HD_MAJOR */ \ + case IDE1_MAJOR: \ + case FLOPPY_MAJOR: \ + case IDE2_MAJOR: \ + case IDE3_MAJOR: \ + case IDE4_MAJOR: \ + case IDE5_MAJOR: \ + case ACSI_MAJOR: \ + case MFM_ACORN_MAJOR: \ + case MDISK_MAJOR: \ + case DASD_MAJOR: +#define CASE_COALESCE_ALSO_FIRST_REQUEST \ + case SCSI_DISK0_MAJOR: \ + case SCSI_DISK1_MAJOR: \ + case SCSI_DISK2_MAJOR: \ + case SCSI_DISK3_MAJOR: \ + case SCSI_DISK4_MAJOR: \ + case SCSI_DISK5_MAJOR: \ + case SCSI_DISK6_MAJOR: \ + case SCSI_DISK7_MAJOR: \ + case SCSI_CDROM_MAJOR: \ + case DAC960_MAJOR+0: \ + case DAC960_MAJOR+1: \ + case DAC960_MAJOR+2: \ + case DAC960_MAJOR+3: \ + case DAC960_MAJOR+4: \ + case DAC960_MAJOR+5: \ + case DAC960_MAJOR+6: \ + case DAC960_MAJOR+7: \ + case COMPAQ_SMART2_MAJOR+0: \ + case COMPAQ_SMART2_MAJOR+1: \ + case COMPAQ_SMART2_MAJOR+2: \ + case COMPAQ_SMART2_MAJOR+3: \ + case COMPAQ_SMART2_MAJOR+4: \ + case COMPAQ_SMART2_MAJOR+5: \ + case COMPAQ_SMART2_MAJOR+6: \ + case COMPAQ_SMART2_MAJOR+7: + +#define elevator_starve_rest_of_queue(req) \ +do { \ + struct request * tmp = (req); \ + for ((tmp) = (tmp)->next; (tmp); (tmp) = (tmp)->next) \ + (tmp)->elevator_latency--; \ +} while (0) + +static inline void elevator_queue(struct request * req, + struct request * tmp, + int latency, + struct blk_dev_struct * dev, + struct request ** queue_head) +{ + struct request * __tmp; + int starving, __latency; + + starving = seek_to_not_starving_chunk(&tmp, &latency); + __tmp = tmp; + __latency = latency; + + for (;; tmp = tmp->next) + { + if ((latency -= tmp->nr_segments) <= 0) + { + tmp = __tmp; + latency = __latency - tmp->nr_segments; + + if (starving) + break; + + switch (MAJOR(req->rq_dev)) + { + CASE_COALESCE_BUT_FIRST_REQUEST_MAYBE_BUSY + if (tmp == dev->current_request) + default: + goto link; + CASE_COALESCE_ALSO_FIRST_REQUEST + } + + latency += tmp->nr_segments; + req->next = tmp; + *queue_head = req; + goto after_link; + } + + if (!tmp->next) + break; + + { + const int after_current = IN_ORDER(tmp,req); + const int before_next = IN_ORDER(req,tmp->next); + + if (!IN_ORDER(tmp,tmp->next)) { + if (after_current || before_next) + break; + } else { + if (after_current && before_next) + break; + } + } + } + + link: + req->next = tmp->next; + tmp->next = req; + + after_link: + req->elevator_latency = latency; + + elevator_starve_rest_of_queue(req); +} + /* * add-request adds a request to the linked list. * It disables interrupts (aquires the request spinlock) so that it can muck @@ -309,31 +513,38 @@ short disk_index; unsigned long flags; int queue_new_request = 0; + int latency; switch (major) { case DAC960_MAJOR+0: disk_index = (minor & 0x00f8) >> 3; - if (disk_index < 4) - drive_stat_acct(req->cmd, req->nr_sectors, disk_index); break; case SCSI_DISK0_MAJOR: + case COMPAQ_SMART2_MAJOR+0: + case COMPAQ_SMART2_MAJOR+1: + case COMPAQ_SMART2_MAJOR+2: + case COMPAQ_SMART2_MAJOR+3: + case COMPAQ_SMART2_MAJOR+4: + case COMPAQ_SMART2_MAJOR+5: + case COMPAQ_SMART2_MAJOR+6: + case COMPAQ_SMART2_MAJOR+7: disk_index = (minor & 0x00f0) >> 4; - if (disk_index < 4) - drive_stat_acct(req->cmd, req->nr_sectors, disk_index); break; case IDE0_MAJOR: /* same as HD_MAJOR */ case XT_DISK_MAJOR: disk_index = (minor & 0x0040) >> 6; - drive_stat_acct(req->cmd, req->nr_sectors, disk_index); break; case IDE1_MAJOR: disk_index = ((minor & 0x0040) >> 6) + 2; - drive_stat_acct(req->cmd, req->nr_sectors, disk_index); + break; default: + disk_index = -1; break; } + if (disk_index >= 0 && disk_index < 4) + drive_stat_acct(req->cmd, req->nr_sectors, disk_index); - req->next = NULL; + latency = get_request_latency(&dev->elevator, req->cmd); /* * We use the goto to reduce locking complexity @@ -344,25 +555,14 @@ if (req->bh) mark_buffer_clean(req->bh); if (!(tmp = *current_request)) { + req->next = NULL; + req->elevator_latency = latency; *current_request = req; if (dev->current_request != &dev->plug) queue_new_request = 1; goto out; } - for ( ; tmp->next ; tmp = tmp->next) { - const int after_current = IN_ORDER(tmp,req); - const int before_next = IN_ORDER(req,tmp->next); - - if (!IN_ORDER(tmp,tmp->next)) { - if (after_current || before_next) - break; - } else { - if (after_current && before_next) - break; - } - } - req->next = tmp->next; - tmp->next = req; + elevator_queue(req, tmp, latency, dev, current_request); /* for SCSI devices, call request_fn unconditionally */ if (scsi_blk_major(major) || @@ -399,6 +599,8 @@ total_segments--; if (total_segments > max_segments) return; + if (next->elevator_latency < req->elevator_latency) + req->elevator_latency = next->elevator_latency; req->bhtail->b_reqnext = next->bh; req->bhtail = next->bhtail; req->nr_sectors += next->nr_sectors; @@ -408,12 +610,28 @@ wake_up (&wait_for_request); } +#define read_pendings(req) \ +({ \ + int __ret = 0; \ + struct request * tmp = (req); \ + do { \ + if (tmp->cmd == READ) \ + { \ + __ret = 1; \ + break; \ + } \ + tmp = tmp->next; \ + } while (tmp); \ + __ret; \ +}) + void make_request(int major, int rw, struct buffer_head * bh) { unsigned int sector, count; - struct request * req; + struct request * req, * prev; int rw_ahead, max_req, max_sectors, max_segments; unsigned long flags; + int latency, starving; count = bh->b_size >> 9; sector = bh->b_rsector; @@ -490,6 +708,8 @@ max_sectors = get_max_sectors(bh->b_rdev); max_segments = get_max_segments(bh->b_rdev); + latency = get_request_latency(&blk_dev[major].elevator, rw); + /* * Now we acquire the request spinlock, we have to be mega careful * not to schedule or do something nonatomic @@ -502,17 +722,7 @@ major != DDV_MAJOR && major != NBD_MAJOR) plug_device(blk_dev + major); /* is atomic */ } else switch (major) { - case IDE0_MAJOR: /* same as HD_MAJOR */ - case IDE1_MAJOR: - case FLOPPY_MAJOR: - case IDE2_MAJOR: - case IDE3_MAJOR: - case IDE4_MAJOR: - case IDE5_MAJOR: - case ACSI_MAJOR: - case MFM_ACORN_MAJOR: - case MDISK_MAJOR: - case DASD_MAJOR: + CASE_COALESCE_BUT_FIRST_REQUEST_MAYBE_BUSY /* * The scsi disk and cdrom drivers completely remove the request * from the queue when they start processing an entry. For this @@ -523,37 +733,20 @@ * entry may be busy being processed and we thus can't change it. */ if (req == blk_dev[major].current_request) - req = req->next; - if (!req) - break; + { + if (!(req = req->next)) + break; + latency -= req->nr_segments; + } /* fall through */ + CASE_COALESCE_ALSO_FIRST_REQUEST - case SCSI_DISK0_MAJOR: - case SCSI_DISK1_MAJOR: - case SCSI_DISK2_MAJOR: - case SCSI_DISK3_MAJOR: - case SCSI_DISK4_MAJOR: - case SCSI_DISK5_MAJOR: - case SCSI_DISK6_MAJOR: - case SCSI_DISK7_MAJOR: - case SCSI_CDROM_MAJOR: - case DAC960_MAJOR+0: - case DAC960_MAJOR+1: - case DAC960_MAJOR+2: - case DAC960_MAJOR+3: - case DAC960_MAJOR+4: - case DAC960_MAJOR+5: - case DAC960_MAJOR+6: - case DAC960_MAJOR+7: - case COMPAQ_SMART2_MAJOR+0: - case COMPAQ_SMART2_MAJOR+1: - case COMPAQ_SMART2_MAJOR+2: - case COMPAQ_SMART2_MAJOR+3: - case COMPAQ_SMART2_MAJOR+4: - case COMPAQ_SMART2_MAJOR+5: - case COMPAQ_SMART2_MAJOR+6: - case COMPAQ_SMART2_MAJOR+7: + /* avoid write-bombs to not hurt iteractiveness of reads */ + if (rw != READ && read_pendings(req)) + max_segments = blk_dev[major].elevator.max_bomb_segments; + starving = seek_to_not_starving_chunk(&req, &latency); + prev = NULL; do { if (req->sem) continue; @@ -565,24 +758,34 @@ continue; /* Can we add it to the end of this request? */ if (req->sector + req->nr_sectors == sector) { + if (latency - req->nr_segments < 0) + break; if (req->bhtail->b_data + req->bhtail->b_size != bh->b_data) { if (req->nr_segments < max_segments) req->nr_segments++; - else continue; + else break; } req->bhtail->b_reqnext = bh; req->bhtail = bh; req->nr_sectors += count; + + /* latency stuff */ + if ((latency -= req->nr_segments) < req->elevator_latency) + req->elevator_latency = latency; + elevator_starve_rest_of_queue(req); + /* Can we now merge this req with the next? */ attempt_merge(req, max_sectors, max_segments); /* or to the beginning? */ } else if (req->sector - count == sector) { + if (!prev && starving) + break; if (bh->b_data + bh->b_size != req->bh->b_data) { if (req->nr_segments < max_segments) req->nr_segments++; - else continue; + else break; } bh->b_reqnext = req->bh; req->bh = bh; @@ -590,6 +793,14 @@ req->current_nr_sectors = count; req->sector = sector; req->nr_sectors += count; + + /* latency stuff */ + if (latency < --req->elevator_latency) + req->elevator_latency = latency; + elevator_starve_rest_of_queue(req); + + if (prev) + attempt_merge(prev, max_sectors, max_segments); } else continue; @@ -597,7 +808,8 @@ spin_unlock_irqrestore(&io_request_lock,flags); return; - } while ((req = req->next) != NULL); + } while (prev = req, + (latency -= req->nr_segments) >= 0 && (req = req->next) != NULL); } /* find an unused request. */ @@ -623,7 +835,6 @@ req->sem = NULL; req->bh = bh; req->bhtail = bh; - req->next = NULL; add_request(major+blk_dev,req); return; @@ -781,6 +992,7 @@ { struct request * req; struct blk_dev_struct *dev; + static unsigned int queue_ID; for (dev = blk_dev + MAX_BLKDEV; dev-- != blk_dev;) { dev->request_fn = NULL; @@ -792,12 +1004,13 @@ dev->plug_tq.sync = 0; dev->plug_tq.routine = &unplug_device; dev->plug_tq.data = dev; + dev->elevator = ELEVATOR_DEFAULTS; + dev->elevator.queue_ID = queue_ID++; } req = all_requests + NR_REQUEST; while (--req >= all_requests) { req->rq_status = RQ_INACTIVE; - req->next = NULL; } memset(ro_bits,0,sizeof(ro_bits)); memset(max_readahead, 0, sizeof(max_readahead)); @@ -902,9 +1115,13 @@ #ifdef CONFIG_DASD dasd_init(); #endif +#ifdef CONFIG_BLK_DEV_XPRAM + xpram_init(); +#endif return 0; }; EXPORT_SYMBOL(io_request_lock); EXPORT_SYMBOL(end_that_request_first); EXPORT_SYMBOL(end_that_request_last); +EXPORT_SYMBOL(blkelv_ioctl); diff -urN v2.2.15/linux/drivers/block/md.c linux/drivers/block/md.c --- v2.2.15/linux/drivers/block/md.c Sat Oct 31 10:37:14 1998 +++ linux/drivers/block/md.c Wed Jun 7 14:26:42 2000 @@ -446,6 +446,8 @@ factor = min = 1 << FACTOR_SHIFT(FACTOR((md_dev+minor))); + md_blocksizes[minor] <<= FACTOR_SHIFT(FACTOR((md_dev+minor))); + for (i=0; i #include +#include #include #include #include @@ -334,6 +335,9 @@ int lpts[7] = {0x3bc,0x378,0x278,0x268,0x27c,0x26c,0}; s = protocol; e = s+1; + + if (!protocols[0]) + request_module ("paride_protocol"); if (autoprobe) { s = 0; diff -urN v2.2.15/linux/drivers/block/paride/pcd.c linux/drivers/block/paride/pcd.c --- v2.2.15/linux/drivers/block/paride/pcd.c Wed Nov 4 10:03:01 1998 +++ linux/drivers/block/paride/pcd.c Wed Jun 7 14:26:42 2000 @@ -143,8 +143,8 @@ #include #include -#include #include +#include #ifndef MODULE @@ -214,8 +214,11 @@ static int pcd_get_mcn (struct cdrom_device_info *cdi, struct cdrom_mcn *mcn); static int pcd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg); +static int pcd_packet(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc); static int pcd_detect(void); +static void pcd_probe_capabilities(void); static void do_pcd_read_drq(void); static void do_pcd_request(void); static void do_pcd_read(void); @@ -276,14 +279,18 @@ pcd_drive_reset, pcd_audio_ioctl, 0, /* dev_ioctl */ - CDC_CLOSE_TRAY | - CDC_OPEN_TRAY | - CDC_LOCK | - CDC_MCN | - CDC_MEDIA_CHANGED | - CDC_RESET | - CDC_PLAY_AUDIO, - 0 + CDC_CLOSE_TRAY | + CDC_OPEN_TRAY | + CDC_LOCK | + CDC_MCN | + CDC_MEDIA_CHANGED | + CDC_RESET | + CDC_PLAY_AUDIO | + CDC_GENERIC_PACKET | + CDC_CD_R | + CDC_CD_RW, + 0, + pcd_packet, }; static void pcd_init_units( void ) @@ -325,6 +332,9 @@ if (pcd_detect()) return -1; + /* get the atapi capabilities page */ + pcd_probe_capabilities(); + if (register_blkdev(MAJOR_NR,name,&cdrom_fops)) { printk("pcd: unable to get major number %d\n",MAJOR_NR); return -1; @@ -525,6 +535,16 @@ return r; } +static int pcd_packet(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc) +{ + char *un_cmd; + int unit = DEVICE_NR(cdi->dev); + + un_cmd = cgc->cmd; + return pcd_atapi(unit,un_cmd,cgc->buflen,cgc->buffer, "generic packet"); +} + #define DBMSG(msg) ((verbose>1)?(msg):NULL) static int pcd_media_changed(struct cdrom_device_info *cdi, int slot_nr) @@ -667,6 +687,32 @@ return -1; } +static void pcd_probe_capabilities( void ) + +{ int unit, r; + char buffer[32]; + char cmd[12]={0x5a,1<<3,0x2a,0,0,0,0,18,0,0,0,0}; + + for (unit=0;unit> 6) == 0) + PCD.info.mask |= CDC_CLOSE_TRAY; + } +} + static int pcd_detect( void ) { char id[18]; @@ -836,66 +882,9 @@ switch (cmd) { - case CDROMPAUSE: - - { char cmd[12]={SCMD_PAUSE_RESUME,0,0,0,0,0,0,0,0,0,0,0}; - - return (pcd_atapi(unit,cmd,0,NULL,"pause")) * EIO; - } - - case CDROMRESUME: - - { char cmd[12]={SCMD_PAUSE_RESUME,0,0,0,0,0,0,0,1,0,0,0}; - - return (pcd_atapi(unit,cmd,0,NULL,"resume")) * EIO; - } - - case CDROMPLAYMSF: - - { char cmd[12]={SCMD_PLAYAUDIO_MSF,0,0,0,0,0,0,0,0,0,0,0}; - struct cdrom_msf* msf = (struct cdrom_msf*)arg; - - cmd[3] = msf->cdmsf_min0; - cmd[4] = msf->cdmsf_sec0; - cmd[5] = msf->cdmsf_frame0; - cmd[6] = msf->cdmsf_min1; - cmd[7] = msf->cdmsf_sec1; - cmd[8] = msf->cdmsf_frame1; - - return (pcd_atapi(unit,cmd,0,NULL,"play msf")) * EIO; - } - - case CDROMPLAYBLK: - - { char cmd[12]={SCMD_PLAYAUDIO10,0,0,0,0,0,0,0,0,0,0,0}; - struct cdrom_blk* blk = (struct cdrom_blk*)arg; - - cmd[2] = blk->from >> 24; - cmd[3] = blk->from >> 16; - cmd[4] = blk->from >> 8; - cmd[5] = blk->from; - cmd[7] = blk->len >> 8; - cmd[8] = blk->len; - - return (pcd_atapi(unit,cmd,0,NULL,"play block")) * EIO; - } - - case CDROMPLAYTRKIND: - - { char cmd[12]={SCMD_PLAYAUDIO_TI,0,0,0,0,0,0,0,0,0,0,0}; - struct cdrom_ti* ti = (struct cdrom_ti*)arg; - - cmd[4] = ti->cdti_trk0; - cmd[5] = ti->cdti_ind0; - cmd[7] = ti->cdti_trk1; - cmd[8] = ti->cdti_ind1; - - return (pcd_atapi(unit,cmd,0,NULL,"play track")) * EIO; - } - case CDROMREADTOCHDR: - { char cmd[12]={SCMD_READ_TOC,0,0,0,0,0,0,0,12,0,0,0}; + { char cmd[12]={GPCMD_READ_TOC_PMA_ATIP,0,0,0,0,0,0,0,12,0,0,0}; struct cdrom_tochdr* tochdr = (struct cdrom_tochdr*)arg; char buffer[32]; int r; @@ -910,7 +899,7 @@ case CDROMREADTOCENTRY: - { char cmd[12]={SCMD_READ_TOC,0,0,0,0,0,0,0,12,0,0,0}; + { char cmd[12]={GPCMD_READ_TOC_PMA_ATIP,0,0,0,0,0,0,0,12,0,0,0}; struct cdrom_tocentry* tocentry = (struct cdrom_tocentry*)arg; unsigned char buffer[32]; @@ -936,97 +925,6 @@ return r * EIO; } - case CDROMSTOP: - - { char cmd[12]={0x1b,1,0,0,0,0,0,0,0,0,0,0}; - - return (pcd_atapi(unit,cmd,0,NULL,"stop")) * EIO; - } - - case CDROMSTART: - - { char cmd[12]={0x1b,1,0,0,1,0,0,0,0,0,0,0}; - - return (pcd_atapi(unit,cmd,0,NULL,"start")) * EIO; - } - - case CDROMVOLCTRL: - - { char cmd[12]={0x5a,0,0,0,0,0,0,0,0,0,0,0}; - char buffer[32]; - char mask[32]; - struct cdrom_volctrl* volctrl = (struct cdrom_volctrl*)arg; - - cmd[2] = 0xe; - cmd[4] = 28; - - if (pcd_atapi(unit,cmd,28,buffer,"mode sense vol")) - return -EIO; - - cmd[2] = 0x4e; - - if (pcd_atapi(unit,cmd,28,buffer,"mode sense vol mask")) - return -EIO; - - buffer[0] = 0; - - buffer[21] = volctrl->channel0 & mask[21]; - buffer[23] = volctrl->channel1 & mask[23]; - buffer[25] = volctrl->channel2 & mask[25]; - buffer[27] = volctrl->channel3 & mask[27]; - - cmd[0] = 0x55; - cmd[1] = 0x10; - - return pcd_atapi(unit,cmd,28,buffer,"mode select vol") * EIO; - } - - case CDROMVOLREAD: - - { char cmd[12]={0x5a,0,0,0,0,0,0,0,0,0,0,0}; - char buffer[32]; - struct cdrom_volctrl* volctrl = (struct cdrom_volctrl*)arg; - int r; - - cmd[2] = 0xe; - cmd[4] = 28; - - r = pcd_atapi(unit,cmd,28,buffer,"mode sense vol read"); - - volctrl->channel0 = buffer[21]; - volctrl->channel1 = buffer[23]; - volctrl->channel2 = buffer[25]; - volctrl->channel3 = buffer[27]; - - return r * EIO; - } - - - case CDROMSUBCHNL: - - { char cmd[12]={SCMD_READ_SUBCHANNEL,2,0x40,1,0,0,0,0,16,0,0,0}; - struct cdrom_subchnl* subchnl = (struct cdrom_subchnl*)arg; - char buffer[32]; - - if (pcd_atapi(unit,cmd,16,buffer,"read subchannel")) - return -EIO; - - subchnl->cdsc_audiostatus = buffer[1]; - subchnl->cdsc_format = CDROM_MSF; - subchnl->cdsc_ctrl = buffer[5] & 0xf; - subchnl->cdsc_trk = buffer[6]; - subchnl->cdsc_ind = buffer[7]; - - subchnl->cdsc_reladdr.msf.minute = buffer[13]; - subchnl->cdsc_reladdr.msf.second = buffer[14]; - subchnl->cdsc_reladdr.msf.frame = buffer[15]; - subchnl->cdsc_absaddr.msf.minute = buffer[9]; - subchnl->cdsc_absaddr.msf.second = buffer[10]; - subchnl->cdsc_absaddr.msf.frame = buffer[11]; - - return 0; - } - default: return -ENOSYS; @@ -1035,7 +933,7 @@ static int pcd_get_mcn (struct cdrom_device_info *cdi, struct cdrom_mcn *mcn) -{ char cmd[12]={SCMD_READ_SUBCHANNEL,0,0x40,2,0,0,0,0,24,0,0,0}; +{ char cmd[12]={GPCMD_READ_SUBCHANNEL,0,0x40,2,0,0,0,0,24,0,0,0}; char buffer[32]; int k; int unit = DEVICE_NR(cdi->dev); diff -urN v2.2.15/linux/drivers/block/pdc4030.c linux/drivers/block/pdc4030.c --- v2.2.15/linux/drivers/block/pdc4030.c Tue Jan 4 10:12:14 2000 +++ linux/drivers/block/pdc4030.c Wed Jun 7 14:26:42 2000 @@ -239,8 +239,8 @@ if(stat & DRQ_STAT) goto read_again; if(stat & BUSY_STAT) { - ide_set_handler (drive, &promise_read_intr, WAIT_CMD); - return ide_started;; + ide_set_handler (drive, &promise_read_intr, WAIT_CMD, NULL); + return ide_started; } printk("Ah! promise read intr: sectors left !DRQ !BUSY\n"); return ide_error(drive, "promise read intr", stat); @@ -259,7 +259,7 @@ if (IN_BYTE(IDE_NSECTOR_REG) != 0) { if (time_before(jiffies, hwgroup->poll_timeout)) { - ide_set_handler (drive, &promise_write_pollfunc, 1); + ide_set_handler (drive, &promise_write_pollfunc, 1, NULL); return ide_started; /* continue polling... */ } printk("%s: write timed-out!\n",drive->name); @@ -294,7 +294,7 @@ if (ide_multwrite(drive, rq->nr_sectors - 4)) return ide_stopped; hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE; - ide_set_handler (drive, &promise_write_pollfunc, 1); + ide_set_handler (drive, &promise_write_pollfunc, 1, NULL); return ide_started; } else { if (ide_multwrite(drive, rq->nr_sectors)) @@ -304,8 +304,8 @@ i -= rq->current_nr_sectors; ide_end_request(1, hwgroup); } - return ide_stopped; } + return ide_stopped; } /* @@ -319,7 +319,7 @@ byte stat; if (rq->cmd == READ) { - ide_set_handler(drive, &promise_read_intr, WAIT_CMD); + ide_set_handler(drive, &promise_read_intr, WAIT_CMD, NULL); OUT_BYTE(PROMISE_READ, IDE_COMMAND_REG); /* The card's behaviour is odd at this point. If the data is available, DRQ will be true, and no interrupt will be diff -urN v2.2.15/linux/drivers/block/rd.c linux/drivers/block/rd.c --- v2.2.15/linux/drivers/block/rd.c Tue Jan 4 10:12:14 2000 +++ linux/drivers/block/rd.c Wed Jun 7 14:26:42 2000 @@ -112,11 +112,7 @@ * architecture-specific setup routine (from the stored boot sector * information). */ -#ifdef CONFIG_ARCH_S390 -int rd_size = 8192; /* Size of the RAM disks */ -#else -int rd_size = 4096; /* Size of the RAM disks */ -#endif +int rd_size = CONFIG_BLK_DEV_RAM_SIZE; /* Size of the RAM disks */ #ifndef MODULE int rd_doload = 0; /* 1 = load RAM disk, 0 = don't load */ diff -urN v2.2.15/linux/drivers/block/trm290.c linux/drivers/block/trm290.c --- v2.2.15/linux/drivers/block/trm290.c Fri Aug 7 17:56:09 1998 +++ linux/drivers/block/trm290.c Wed Jun 7 14:26:42 2000 @@ -193,7 +193,7 @@ outw((count * 2) - 1, hwif->dma_base+2); /* start DMA */ if (drive->media != ide_disk) return 0; - ide_set_handler(drive, &ide_dma_intr, WAIT_CMD); + ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL); OUT_BYTE(reading ? WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG); return 0; case ide_dma_begin: diff -urN v2.2.15/linux/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c --- v2.2.15/linux/drivers/cdrom/cdrom.c Tue Jan 4 10:12:14 2000 +++ linux/drivers/cdrom/cdrom.c Wed Jun 7 14:26:42 2000 @@ -1,7 +1,7 @@ /* linux/drivers/cdrom/cdrom.c. Copyright (c) 1996, 1997 David A. van Leeuwen. Copyright (c) 1997, 1998 Erik Andersen - Copyright (c) 1998, 1999 Jens Axboe + Copyright (c) 1998, 1999, 2000 Jens Axboe May be copied or modified under the terms of the GNU General Public License. See linux/COPYING for more information. @@ -22,12 +22,6 @@ based tunable parameters such as whether the tray should auto-close for that drive. Suggestions (or patches) for this welcome! - -- Change the CDROMREADMODE1, CDROMREADMODE2, CDROMREADAUDIO, and - CDROMREADRAW ioctls so they go through the Uniform CD-ROM driver. - - -- Sync options and capability flags. - - Revision History ---------------------------------- @@ -126,14 +120,104 @@ CDC_CLOSE_TRAY. -- proc info didn't mask against capabilities mask. - 2.56 Sep 9, 1999 - Jens Axboe - -- Define CDROM_CAN() for checking capabilities. - -- Fix up capability reporting, for proc and ioctl. - + 3.00 Aug 5, 1999 - Jens Axboe + -- Unified audio ioctl handling across CD-ROM drivers. A lot of the + code was duplicated before. Drives that support the generic packet + interface are now being fed packets from here instead. + -- First attempt at adding support for MMC2 commands - for DVD and + CD-R(W) drives. Only the DVD parts are in now - the interface used is + the same as for the audio ioctls. + -- ioctl cleanups. if a drive couldn't play audio, it didn't get + a change to perform device specific ioctls as well. + -- Defined CDROM_CAN(CDC_XXX) for checking the capabilities. + -- Put in sysctl files for autoclose, autoeject, check_media, debug, + and lock. + -- /proc/sys/dev/cdrom/info has been updated to also contain info about + CD-Rx and DVD capabilities. + -- Now default to checking media type. + -- CDROM_SEND_PACKET ioctl added. The infrastructure was in place for + doing this anyway, with the generic_packet addition. + + 3.01 Aug 6, 1999 - Jens Axboe + -- Fix up the sysctl handling so that the option flags get set + correctly. + -- Fix up ioctl handling so the device specific ones actually get + called :). + + 3.02 Aug 8, 1999 - Jens Axboe + -- Fixed volume control on SCSI drives (or others with longer audio + page). + -- Fixed a couple of DVD minors. Thanks to Andrew T. Veliath + for telling me and for having defined the various + DVD structures and ioctls in the first place! He designed the original + DVD patches for ide-cd and while I rearranged and unified them, the + interface is still the same. + + 3.03 Sep 1, 1999 - Jens Axboe + -- Moved the rest of the audio ioctls from the CD-ROM drivers here. Only + CDROMREADTOCENTRY and CDROMREADTOCHDR are left. + -- Moved the CDROMREADxxx ioctls in here. + -- Defined the cdrom_get_last_written and cdrom_get_next_block as ioctls + and exported functions. + -- Erik Andersen modified all SCMD_ commands + to now read GPCMD_ for the new generic packet interface. All low level + drivers are updated as well. + -- Various other cleanups. + + 3.04 Sep 12, 1999 - Jens Axboe + -- Fixed a couple of possible memory leaks (if an operation failed and + we didn't free the buffer before returning the error). + -- Integrated Uniform CD Changer handling from Richard Sharman + . + -- Defined CD_DVD and CD_CHANGER log levels. + -- Fixed the CDROMREADxxx ioctls. + -- CDROMPLAYTRKIND uses the GPCMD_PLAY_AUDIO_MSF command - too few + drives supported it. We loose the index part, however. + -- Small modifications to accomodate opens of /dev/hdc1, required + for ide-cd to handle multisession discs. + -- Export cdrom_mode_sense and cdrom_mode_select. + -- init_cdrom_command() for setting up a cgc command. + + 3.05 Oct 24, 1999 - Jens Axboe + -- Changed the interface for CDROM_SEND_PACKET. Before it was virtually + impossible to send the drive data in a sensible way. + -- Lowered stack usage in mmc_ioctl(), dvd_read_disckey(), and + dvd_read_manufact. + -- Added setup of write mode for packet writing. + -- Fixed CDDA ripping with cdda2wav - accept much larger requests of + number of frames and split the reads in blocks of 8. + + 3.06 Dec 13, 1999 - Jens Axboe + -- Added support for changing the region of DVD drives. + -- Added sense data to generic command. + + 3.07 Feb 2, 2000 - Jens Axboe + -- Do same "read header length" trick in cdrom_get_disc_info() as + we do in cdrom_get_track_info() -- some drive don't obbey specs and + fail if they can't supply the full Mt Fuji size table. + -- Deleted stuff related to setting up write modes. It has a different + home now. + -- Clear header length in mode_select unconditionally. + -- Removed the register_disk() that was added, not needed here. + + 3.08 May 1, 2000 - Jens Axboe + -- Always return -EROFS for write opens + -- Convert to module_init/module_exit style init and remove some + of the #ifdef MODULE stuff + -- Fix several dvd errors - DVD_LU_SEND_ASF should pass agid, + DVD_HOST_SEND_RPC_STATE did not set buffer size in cdb, and + dvd_do_auth passed uninitialized data to drive because init_cdrom_command + did not clear a 0 sized buffer. + + 3.09 May 12, 2000 - Jens Axboe + -- Fix Video-CD on SCSI drives that don't support READ_CD command. In + that case switch block size and issue plain READ_10 again, then switch + back. + -------------------------------------------------------------------------*/ -#define REVISION "Revision: 2.56" -#define VERSION "Id: cdrom.c 2.56 1999/09/09" +#define REVISION "Revision: 3.09" +#define VERSION "Id: cdrom.c 3.09 2000/05/12" /* I use an error-log mask to give fine grain control over the type of messages dumped to the system logs. The available masks include: */ @@ -144,6 +228,8 @@ #define CD_OPEN 0x8 #define CD_CLOSE 0x10 #define CD_COUNT_TRACKS 0x20 +#define CD_CHANGER 0x40 +#define CD_DVD 0x80 /* Define this to remove _all_ the debugging messages */ /* #define ERRLOGMASK CD_NOTHING */ @@ -151,7 +237,6 @@ /* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) */ /* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE|CD_COUNT_TRACKS) */ - #include #include #include @@ -164,6 +249,7 @@ #include #include #include +#include #include #include #include @@ -176,6 +262,7 @@ static int autoclose=1; static int autoeject=0; static int lockdoor = 1; +/* will we ever get to use this... sigh. */ static int check_media_type = 0; MODULE_PARM(debug, "i"); MODULE_PARM(autoclose, "i"); @@ -202,7 +289,8 @@ a lot of places. This macro makes the code more clear. */ #define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & type) -#define FM_WRITE 0x2 /* file mode write bit */ +/* used in the audio ioctls */ +#define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret /* Not-exported routines. */ static int cdrom_open(struct inode *ip, struct file *fp); @@ -215,6 +303,12 @@ struct cdrom_device_ops * cdo); static void sanitize_format(union cdrom_addr *addr, u_char * curr, u_char requested); +static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, + unsigned long arg); + +int cdrom_get_last_written(kdev_t dev, long *last_written); +int cdrom_get_next_writable(kdev_t dev, long *next_writable); + #ifdef CONFIG_SYSCTL static void cdrom_sysctl_register(void); #endif /* CONFIG_SYSCTL */ @@ -248,7 +342,7 @@ int register_cdrom(struct cdrom_device_info *cdi) { static char banner_printed = 0; - int major = MAJOR (cdi->dev); + int major = MAJOR(cdi->dev); struct cdrom_device_ops *cdo = cdi->ops; int *change_capability = (int *)&cdo->capability; /* hack */ @@ -259,7 +353,7 @@ if (cdo->open == NULL || cdo->release == NULL) return -2; if ( !banner_printed ) { - printk(KERN_INFO "Uniform CDROM driver " REVISION "\n"); + printk(KERN_INFO "Uniform CD-ROM driver " REVISION "\n"); banner_printed = 1; #ifdef CONFIG_SYSCTL cdrom_sysctl_register(); @@ -270,12 +364,12 @@ ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY); ENSURE(lock_door, CDC_LOCK); ENSURE(select_speed, CDC_SELECT_SPEED); - ENSURE(select_disc, CDC_SELECT_DISC); ENSURE(get_last_session, CDC_MULTI_SESSION); ENSURE(get_mcn, CDC_MCN); ENSURE(reset, CDC_RESET); ENSURE(audio_ioctl, CDC_PLAY_AUDIO); ENSURE(dev_ioctl, CDC_IOCTLS); + ENSURE(generic_packet, CDC_GENERIC_PACKET); cdi->mc_flags = 0; cdo->n_minors = 0; cdi->options = CDO_USE_FFLAGS; @@ -299,7 +393,7 @@ int unregister_cdrom(struct cdrom_device_info *unreg) { struct cdrom_device_info *cdi, *prev; - int major = MAJOR (unreg->dev); + int major = MAJOR(unreg->dev); cdinfo(CD_OPEN, "entering unregister_cdrom\n"); @@ -325,13 +419,25 @@ } static -struct cdrom_device_info *cdrom_find_device (kdev_t dev) +struct cdrom_device_info *cdrom_find_device(kdev_t dev) { struct cdrom_device_info *cdi; cdi = topCdromPtr; while (cdi != NULL && cdi->dev != dev) cdi = cdi->next; + + /* we need to find the device this way when IDE devices such + * as /dev/hdc2 are opened. SCSI drives will be found above and + * so will /dev/hdc, for instance. + */ + if (cdi == NULL) { + kdev_t cd_dev = MKDEV(MAJOR(dev), MINOR(dev) | CD_PART_MASK); + cdi = topCdromPtr; + while (cdi != NULL && cdi->dev != cd_dev) + cdi = cdi->next; + } + return cdi; } @@ -346,22 +452,26 @@ static int cdrom_open(struct inode *ip, struct file *fp) { + struct cdrom_device_info *cdi; kdev_t dev = ip->i_rdev; - struct cdrom_device_info *cdi = cdrom_find_device(dev); - int purpose = !!(fp->f_flags & O_NONBLOCK); - int ret=0; + int ret; cdinfo(CD_OPEN, "entering cdrom_open\n"); - if (cdi == NULL) + if ((cdi = cdrom_find_device(dev)) == NULL) return -ENODEV; - if (fp->f_mode & FM_WRITE) + + if ((fp->f_mode & FMODE_WRITE) && !CDROM_CAN(CDC_DVD_RAM)) return -EROFS; - purpose = purpose || !(cdi->options & CDO_USE_FFLAGS); - if (purpose) - ret = cdi->ops->open(cdi, purpose); + + /* if this was a O_NONBLOCK open and we should honor the flags, + * do a quick open without drive/disc integrity checks. */ + if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) + ret = cdi->ops->open(cdi, 1); else ret = open_for_data(cdi); + if (!ret) cdi->use_count++; + cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n", cdi->name, cdi->use_count); /* Do this on open. Don't wait for mount, because they might not be mounting, but opening with O_NONBLOCK */ @@ -428,7 +538,11 @@ * for example, need bit CDO_CHECK_TYPE cleared! */ if (tracks.data==0) { if (cdi->options & CDO_CHECK_TYPE) { + /* give people a warning shot, now that CDO_CHECK_TYPE + is the default case! */ cdinfo(CD_OPEN, "bummer. wrong media type.\n"); + cdinfo(CD_WARNING, "pid %d must open device O_NONBLOCK!\n", + (unsigned int)current->pid); ret=-EMEDIUMTYPE; goto clean_up_and_return; } @@ -452,7 +566,7 @@ if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) { cdo->lock_door(cdi, 1); cdinfo(CD_OPEN, "door locked.\n"); - } + } cdinfo(CD_OPEN, "device opened successfully.\n"); return ret; @@ -533,17 +647,17 @@ int cdrom_release(struct inode *ip, struct file *fp) { kdev_t dev = ip->i_rdev; - struct cdrom_device_info *cdi = cdrom_find_device (dev); + struct cdrom_device_info *cdi = cdrom_find_device(dev); struct cdrom_device_ops *cdo = cdi->ops; int opened_for_data; cdinfo(CD_CLOSE, "entering cdrom_release\n"); - if (cdi == NULL) - return 0; - if (cdi->use_count > 0) cdi->use_count--; + + if (cdi->use_count > 0) + cdi->use_count--; if (cdi->use_count == 0) cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name); - if (cdi->use_count == 0 && /* last process that closes dev*/ + if (cdi->use_count == 0 && cdo->capability & CDC_LOCK && !keeplocked) { cdinfo(CD_CLOSE, "Unlocking door!\n"); cdo->lock_door(cdi, 0); @@ -557,13 +671,140 @@ sb = get_super(dev); if (sb) invalidate_inodes(sb); invalidate_buffers(dev); - if (opened_for_data && (cdi->options & CDO_AUTO_EJECT) && - CDROM_CAN(CDC_OPEN_TRAY)) + if (opened_for_data && + cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY)) cdo->tray_move(cdi, 1); } return 0; } +static int cdrom_read_mech_status(struct cdrom_device_info *cdi, + struct cdrom_changer_info *buf) +{ + struct cdrom_generic_command cgc; + struct cdrom_device_ops *cdo = cdi->ops; + int length; + + length = sizeof(struct cdrom_mechstat_header) + + cdi->capacity * sizeof(struct cdrom_slot); + + init_cdrom_command(&cgc, buf, length); + cgc.cmd[0] = GPCMD_MECHANISM_STATUS; + cgc.cmd[8] = (length >> 8) & 0xff; + cgc.cmd[9] = length & 0xff; + return cdo->generic_packet(cdi, &cgc); +} + +static int cdrom_slot_status(struct cdrom_device_info *cdi, int slot) +{ + struct cdrom_changer_info info; + int ret; + + cdinfo(CD_CHANGER, "entering cdrom_slot_status()\n"); + if (cdi->sanyo_slot) + return CDS_NO_INFO; + + if ((ret = cdrom_read_mech_status(cdi, &info))) + return ret; + + if (info.slots[slot].disc_present) + return CDS_DISC_OK; + else + return CDS_NO_DISC; + +} + +/* Return the number of slots for an ATAPI/SCSI cdrom, + * return 1 if not a changer. + */ +int cdrom_number_of_slots(struct cdrom_device_info *cdi) +{ + int status; + int nslots = 1; + struct cdrom_changer_info info; + + cdinfo(CD_CHANGER, "entering cdrom_number_of_slots()\n"); + /* cdrom_read_mech_status requires a valid value for capacity: */ + cdi->capacity = 0; + + if ((status = cdrom_read_mech_status(cdi, &info)) == 0) + nslots = info.hdr.nslots; + + return nslots; +} + + +/* If SLOT < 0, unload the current slot. Otherwise, try to load SLOT. */ +static int cdrom_load_unload(struct cdrom_device_info *cdi, int slot) +{ + struct cdrom_generic_command cgc; + + cdinfo(CD_CHANGER, "entering cdrom_load_unload()\n"); + if (cdi->sanyo_slot && slot < 0) + return 0; + + init_cdrom_command(&cgc, NULL, 0); + cgc.cmd[0] = GPCMD_LOAD_UNLOAD; + cgc.cmd[4] = 2 + (slot >= 0); + cgc.cmd[8] = slot; + + /* The Sanyo 3 CD changer uses byte 7 of the + GPCMD_TEST_UNIT_READY to command to switch CDs instead of + using the GPCMD_LOAD_UNLOAD opcode. */ + if (cdi->sanyo_slot && slot) { + cgc.cmd[0] = GPCMD_TEST_UNIT_READY; + cgc.cmd[7] = slot; + cdi->sanyo_slot = slot ? slot : 3; + } + + return cdi->ops->generic_packet(cdi, &cgc); +} + +int cdrom_select_disc(struct cdrom_device_info *cdi, int slot) +{ + struct cdrom_changer_info info; + int curslot; + int ret; + + cdinfo(CD_CHANGER, "entering cdrom_select_disc()\n"); + if (!CDROM_CAN(CDC_SELECT_DISC)) + return -EDRIVE_CANT_DO_THIS; + + if (slot == CDSL_NONE) { + /* set media changed bits, on both queues */ + cdi->mc_flags = 0x3; + return cdrom_load_unload(cdi, -1); + } + + if ((ret = cdrom_read_mech_status(cdi, &info))) + return ret; + + curslot = info.hdr.curslot; + + if (cdi->use_count > 1 || keeplocked) { + if (slot == CDSL_CURRENT) { + return curslot; + } else { + return -EBUSY; + } + } + + /* Specifying CDSL_CURRENT will attempt to load the currnet slot, + which is useful if it had been previously unloaded. + Whether it can or not, it returns the current slot. + Similarly, if slot happens to be the current one, we still + try and load it. */ + if (slot == CDSL_CURRENT) + slot = curslot; + + /* set media changed bits on both queues */ + cdi->mc_flags = 0x3; + if ((ret = cdrom_load_unload(cdi, slot))) + return ret; + + return slot; +} + /* We want to make media_changed accessible to the user through an * ioctl. The main problem now is that we must double-buffer the * low-level implementation, to assure that the VFS and the user both @@ -587,15 +828,12 @@ return ret; } -static -int cdrom_media_changed(kdev_t dev) +static int cdrom_media_changed(kdev_t dev) { - struct cdrom_device_info *cdi = cdrom_find_device (dev); + struct cdrom_device_info *cdi = cdrom_find_device(dev); /* This talks to the VFS, which doesn't like errors - just 1 or 0. * Returning "0" is always safe (media hasn't been changed). Do that * if the low-level cdrom driver dosn't support media changed. */ - if (cdi == NULL) - return 0; if (cdi->ops->media_changed == NULL) return 0; if (!CDROM_CAN(CDC_MEDIA_CHANGED)) @@ -603,6 +841,7 @@ return (media_changed(cdi, 0)); } +/* badly broken, I know. Is due for a fixup anytime. */ void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype* tracks) { struct cdrom_tochdr header; @@ -614,7 +853,7 @@ tracks->xa=0; tracks->error=0; cdinfo(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n"); - if (!(cdi->ops->capability & ~cdi->mask & CDC_PLAY_AUDIO)) { + if (!CDROM_CAN(CDC_PLAY_AUDIO)) { tracks->error=CDS_NO_INFO; return; } @@ -688,38 +927,518 @@ *curr = requested; } -/* Some of the cdrom ioctls are not implemented here, because these - * appear to be either too device-specific, or it is not clear to me - * what use they are. These are (number of drivers that support them - * in parenthesis): CDROMREADMODE1 (2+ide), CDROMREADMODE2 (2+ide), - * CDROMREADAUDIO (2+ide), CDROMREADRAW (2), CDROMREADCOOKED (2), - * CDROMSEEK (2), CDROMPLAYBLK (scsi), CDROMREADALL (1). Read-audio, - * OK (although i guess the record companies aren't too happy with - * this, most drives therefore refuse to transport audio data). But - * why are there 5 different READs defined? For now, these functions - * are left over to the device-specific ioctl routine, - * cdo->dev_ioctl. Note that as a result of this, no - * memory-verification is performed for these ioctls. +void init_cdrom_command(struct cdrom_generic_command *cgc, void *buf, int len) +{ + memset(cgc, 0, sizeof(struct cdrom_generic_command)); + if (buf) + memset(buf, 0, len); + cgc->buffer = (char *) buf; + cgc->buflen = len; +} + +/* DVD handling */ + +#define copy_key(dest,src) memcpy((dest), (src), sizeof(dvd_key)) +#define copy_chal(dest,src) memcpy((dest), (src), sizeof(dvd_challenge)) + +static void setup_report_key(struct cdrom_generic_command *cgc, unsigned agid, unsigned type) +{ + cgc->cmd[0] = GPCMD_REPORT_KEY; + cgc->cmd[10] = type | (agid << 6); + switch (type) { + case 0: case 8: case 5: { + cgc->buflen = 8; + break; + } + case 1: { + cgc->buflen = 16; + break; + } + case 2: case 4: { + cgc->buflen = 12; + break; + } + } + cgc->cmd[9] = cgc->buflen; +} + +static void setup_send_key(struct cdrom_generic_command *cgc, unsigned agid, unsigned type) +{ + cgc->cmd[0] = GPCMD_SEND_KEY; + cgc->cmd[10] = type | (agid << 6); + switch (type) { + case 1: { + cgc->buflen = 16; + break; + } + case 3: { + cgc->buflen = 12; + break; + } + case 6: { + cgc->buflen = 8; + break; + } + } + cgc->cmd[9] = cgc->buflen; +} + +static int dvd_do_auth(struct cdrom_device_info *cdi, dvd_authinfo *ai) +{ + int ret; + u_char buf[20]; + struct cdrom_generic_command cgc; + struct cdrom_device_ops *cdo = cdi->ops; + rpc_state_t rpc_state; + + memset(buf, 0, sizeof(buf)); + init_cdrom_command(&cgc, buf, 0); + + switch (ai->type) { + /* LU data send */ + case DVD_LU_SEND_AGID: + cdinfo(CD_DVD, "entering DVD_LU_SEND_AGID\n"); + setup_report_key(&cgc, ai->lsa.agid, 0); + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + ai->lsa.agid = buf[7] >> 6; + /* Returning data, let host change state */ + break; + + case DVD_LU_SEND_KEY1: + cdinfo(CD_DVD, "entering DVD_LU_SEND_KEY1\n"); + setup_report_key(&cgc, ai->lsk.agid, 2); + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + copy_key(ai->lsk.key, &buf[4]); + /* Returning data, let host change state */ + break; + + case DVD_LU_SEND_CHALLENGE: + cdinfo(CD_DVD, "entering DVD_LU_SEND_CHALLENGE\n"); + setup_report_key(&cgc, ai->lsc.agid, 1); + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + copy_chal(ai->lsc.chal, &buf[4]); + /* Returning data, let host change state */ + break; + + /* Post-auth key */ + case DVD_LU_SEND_TITLE_KEY: + cdinfo(CD_DVD, "entering DVD_LU_SEND_TITLE_KEY\n"); + setup_report_key(&cgc, ai->lstk.agid, 4); + cgc.cmd[5] = ai->lstk.lba; + cgc.cmd[4] = ai->lstk.lba >> 8; + cgc.cmd[3] = ai->lstk.lba >> 16; + cgc.cmd[2] = ai->lstk.lba >> 24; + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + ai->lstk.cpm = (buf[4] >> 7) & 1; + ai->lstk.cp_sec = (buf[4] >> 6) & 1; + ai->lstk.cgms = (buf[4] >> 4) & 3; + copy_key(ai->lstk.title_key, &buf[5]); + /* Returning data, let host change state */ + break; + + case DVD_LU_SEND_ASF: + cdinfo(CD_DVD, "entering DVD_LU_SEND_ASF\n"); + setup_report_key(&cgc, ai->lsasf.agid, 5); + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + ai->lsasf.asf = buf[7] & 1; + break; + + /* LU data receive (LU changes state) */ + case DVD_HOST_SEND_CHALLENGE: + cdinfo(CD_DVD, "entering DVD_HOST_SEND_CHALLENGE\n"); + setup_send_key(&cgc, ai->hsc.agid, 1); + buf[1] = 0xe; + copy_chal(&buf[4], ai->hsc.chal); + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + ai->type = DVD_LU_SEND_KEY1; + break; + + case DVD_HOST_SEND_KEY2: + cdinfo(CD_DVD, "entering DVD_HOST_SEND_KEY2\n"); + setup_send_key(&cgc, ai->hsk.agid, 3); + buf[1] = 0xa; + copy_key(&buf[4], ai->hsk.key); + + if ((ret = cdo->generic_packet(cdi, &cgc))) { + ai->type = DVD_AUTH_FAILURE; + return ret; + } + ai->type = DVD_AUTH_ESTABLISHED; + break; + + /* Misc */ + case DVD_INVALIDATE_AGID: + cdinfo(CD_DVD, "entering DVD_INVALIDATE_AGID\n"); + setup_report_key(&cgc, ai->lsa.agid, 0x3f); + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + break; + + /* Get region settings */ + case DVD_LU_SEND_RPC_STATE: + cdinfo(CD_DVD, "entering DVD_LU_SEND_RPC_STATE\n"); + setup_report_key(&cgc, 0, 8); + + init_cdrom_command(&cgc, &rpc_state, 0); + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + ai->lrpcs.type = rpc_state.type_code; + ai->lrpcs.vra = rpc_state.vra; + ai->lrpcs.ucca = rpc_state.ucca; + ai->lrpcs.region_mask = rpc_state.region_mask; + ai->lrpcs.rpc_scheme = rpc_state.rpc_scheme; + break; + + /* Set region settings */ + case DVD_HOST_SEND_RPC_STATE: + cdinfo(CD_DVD, "entering DVD_HOST_SEND_RPC_STATE\n"); + setup_send_key(&cgc, 0, 6); + buf[1] = 6; + buf[4] = ai->hrpcs.pdrc; + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + break; + + default: + cdinfo(CD_WARNING, "Invalid DVD key ioctl (%d)\n", ai->type); + return -ENOTTY; + } + + return 0; +} + +static int dvd_read_physical(struct cdrom_device_info *cdi, dvd_struct *s) +{ + int ret, i; + u_char buf[4 + 4 * 20], *base; + struct dvd_layer *layer; + struct cdrom_generic_command cgc; + struct cdrom_device_ops *cdo = cdi->ops; + + init_cdrom_command(&cgc, buf, sizeof(buf)); + cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE; + cgc.cmd[6] = s->physical.layer_num; + cgc.cmd[7] = s->type; + cgc.cmd[9] = cgc.buflen & 0xff; + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + base = &buf[4]; + layer = &s->physical.layer[0]; + + /* place the data... really ugly, but at least we won't have to + worry about endianess in userspace or here. */ + for (i = 0; i < 4; ++i, base += 20, ++layer) { + memset(layer, 0, sizeof(*layer)); + layer->book_version = base[0] & 0xf; + layer->book_type = base[0] >> 4; + layer->min_rate = base[1] & 0xf; + layer->disc_size = base[1] >> 4; + layer->layer_type = base[2] & 0xf; + layer->track_path = (base[2] >> 4) & 1; + layer->nlayers = (base[2] >> 5) & 3; + layer->track_density = base[3] & 0xf; + layer->linear_density = base[3] >> 4; + layer->start_sector = base[5] << 16 | base[6] << 8 | base[7]; + layer->end_sector = base[9] << 16 | base[10] << 8 | base[11]; + layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15]; + layer->bca = base[16] >> 7; + } + + return 0; +} + +static int dvd_read_copyright(struct cdrom_device_info *cdi, dvd_struct *s) +{ + int ret; + u_char buf[8]; + struct cdrom_generic_command cgc; + struct cdrom_device_ops *cdo = cdi->ops; + + init_cdrom_command(&cgc, buf, sizeof(buf)); + cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE; + cgc.cmd[6] = s->copyright.layer_num; + cgc.cmd[7] = s->type; + cgc.cmd[8] = cgc.buflen >> 8; + cgc.cmd[9] = cgc.buflen & 0xff; + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + s->copyright.cpst = buf[4]; + s->copyright.rmi = buf[5]; + + return 0; +} + +static int dvd_read_disckey(struct cdrom_device_info *cdi, dvd_struct *s) +{ + int ret, size; + u_char *buf; + struct cdrom_generic_command cgc; + struct cdrom_device_ops *cdo = cdi->ops; + + size = sizeof(s->disckey.value) + 4; + + if ((buf = (u_char *) kmalloc(size, GFP_KERNEL)) == NULL) + return -ENOMEM; + + init_cdrom_command(&cgc, buf, size); + cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE; + cgc.cmd[7] = s->type; + cgc.cmd[8] = size >> 8; + cgc.cmd[9] = size & 0xff; + cgc.cmd[10] = s->disckey.agid << 6; + + if (!(ret = cdo->generic_packet(cdi, &cgc))) + memcpy(s->disckey.value, &buf[4], sizeof(s->disckey.value)); + + kfree(buf); + return ret; +} + +static int dvd_read_bca(struct cdrom_device_info *cdi, dvd_struct *s) +{ + int ret; + u_char buf[4 + 188]; + struct cdrom_generic_command cgc; + struct cdrom_device_ops *cdo = cdi->ops; + + init_cdrom_command(&cgc, buf, sizeof(buf)); + cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE; + cgc.cmd[7] = s->type; + cgc.cmd[9] = cgc.buflen = 0xff; + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + s->bca.len = buf[0] << 8 | buf[1]; + if (s->bca.len < 12 || s->bca.len > 188) { + cdinfo(CD_WARNING, "Received invalid BCA length (%d)\n", s->bca.len); + return -EIO; + } + memcpy(s->bca.value, &buf[4], s->bca.len); + + return 0; +} + +static int dvd_read_manufact(struct cdrom_device_info *cdi, dvd_struct *s) +{ + int ret = 0, size; + u_char *buf; + struct cdrom_generic_command cgc; + struct cdrom_device_ops *cdo = cdi->ops; + + size = sizeof(s->manufact.value) + 4; + + if ((buf = (u_char *) kmalloc(size, GFP_KERNEL)) == NULL) + return -ENOMEM; + + init_cdrom_command(&cgc, buf, size); + cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE; + cgc.cmd[7] = s->type; + cgc.cmd[8] = size >> 8; + cgc.cmd[9] = size & 0xff; + + if ((ret = cdo->generic_packet(cdi, &cgc))) { + kfree(buf); + return ret; + } + + s->manufact.len = buf[0] << 8 | buf[1]; + if (s->manufact.len < 0 || s->manufact.len > 2048) { + cdinfo(CD_WARNING, "Received invalid manufacture info length" + " (%d)\n", s->bca.len); + ret = -EIO; + } else { + memcpy(s->manufact.value, &buf[4], s->manufact.len); + } + + kfree(buf); + return ret; +} + +static int dvd_read_struct(struct cdrom_device_info *cdi, dvd_struct *s) +{ + switch (s->type) { + case DVD_STRUCT_PHYSICAL: + return dvd_read_physical(cdi, s); + + case DVD_STRUCT_COPYRIGHT: + return dvd_read_copyright(cdi, s); + + case DVD_STRUCT_DISCKEY: + return dvd_read_disckey(cdi, s); + + case DVD_STRUCT_BCA: + return dvd_read_bca(cdi, s); + + case DVD_STRUCT_MANUFACT: + return dvd_read_manufact(cdi, s); + + default: + cdinfo(CD_WARNING, ": Invalid DVD structure read requested (%d)\n", + s->type); + return -EINVAL; + } +} + +int cdrom_mode_sense(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc, + int page_code, int page_control) +{ + struct cdrom_device_ops *cdo = cdi->ops; + + memset(cgc->cmd, 0, sizeof(cgc->cmd)); + + cgc->cmd[0] = GPCMD_MODE_SENSE_10; + cgc->cmd[2] = page_code | (page_control << 6); + cgc->cmd[7] = cgc->buflen >> 8; + cgc->cmd[8] = cgc->buflen & 0xff; + return cdo->generic_packet(cdi, cgc); +} + +int cdrom_mode_select(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc) +{ + struct cdrom_device_ops *cdo = cdi->ops; + + memset(cgc->cmd, 0, sizeof(cgc->cmd)); + memset(cgc->buffer, 0, 3); + + cgc->cmd[0] = GPCMD_MODE_SELECT_10; + cgc->cmd[1] = 0x10; /* PF */ + cgc->cmd[7] = cgc->buflen >> 8; + cgc->cmd[8] = cgc->buflen & 0xff; + return cdo->generic_packet(cdi, cgc); +} + +static int cdrom_read_subchannel(struct cdrom_device_info *cdi, + struct cdrom_subchnl *subchnl, int mcn) +{ + struct cdrom_device_ops *cdo = cdi->ops; + struct cdrom_generic_command cgc; + char buffer[32]; + int ret; + + init_cdrom_command(&cgc, buffer, 16); + cgc.cmd[0] = GPCMD_READ_SUBCHANNEL; + cgc.cmd[1] = 2; /* MSF addressing */ + cgc.cmd[2] = 0x40; /* request subQ data */ + cgc.cmd[3] = mcn ? 2 : 1; + cgc.cmd[8] = 16; + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + subchnl->cdsc_audiostatus = cgc.buffer[1]; + subchnl->cdsc_format = CDROM_MSF; + subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf; + subchnl->cdsc_trk = cgc.buffer[6]; + subchnl->cdsc_ind = cgc.buffer[7]; + + subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13]; + subchnl->cdsc_reladdr.msf.second = cgc.buffer[14]; + subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15]; + subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9]; + subchnl->cdsc_absaddr.msf.second = cgc.buffer[10]; + subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11]; + + return 0; +} + +/* + * Specific READ_10 interface */ -static -int cdrom_ioctl(struct inode *ip, struct file *fp, - unsigned int cmd, unsigned long arg) +static int cdrom_read_cd(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc, int lba, + int blocksize, int nblocks) { - kdev_t dev = ip->i_rdev; - struct cdrom_device_info *cdi = cdrom_find_device (dev); - struct cdrom_device_ops *cdo; + struct cdrom_device_ops *cdo = cdi->ops; - if (cdi == NULL) - return -ENODEV; - cdo = cdi->ops; + memset(&cgc->cmd, 0, sizeof(cgc->cmd)); + cgc->cmd[0] = GPCMD_READ_10; + cgc->cmd[2] = (lba >> 24) & 0xff; + cgc->cmd[3] = (lba >> 16) & 0xff; + cgc->cmd[4] = (lba >> 8) & 0xff; + cgc->cmd[5] = lba & 0xff; + cgc->cmd[6] = (nblocks >> 16) & 0xff; + cgc->cmd[7] = (nblocks >> 8) & 0xff; + cgc->cmd[8] = nblocks & 0xff; + cgc->buflen = blocksize * nblocks; + return cdo->generic_packet(cdi, cgc); +} + +/* very generic interface for reading the various types of blocks */ +static int cdrom_read_block(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc, + int lba, int nblocks, int format, int blksize) +{ + struct cdrom_device_ops *cdo = cdi->ops; + + memset(&cgc->cmd, 0, sizeof(cgc->cmd)); + cgc->cmd[0] = GPCMD_READ_CD; + /* expected sector size - cdda,mode1,etc. */ + cgc->cmd[1] = format << 2; + /* starting address */ + cgc->cmd[2] = (lba >> 24) & 0xff; + cgc->cmd[3] = (lba >> 16) & 0xff; + cgc->cmd[4] = (lba >> 8) & 0xff; + cgc->cmd[5] = lba & 0xff; + /* number of blocks */ + cgc->cmd[6] = (nblocks >> 16) & 0xff; + cgc->cmd[7] = (nblocks >> 8) & 0xff; + cgc->cmd[8] = nblocks & 0xff; + cgc->buflen = blksize * nblocks; + + /* set the header info returned */ + switch (blksize) { + case CD_FRAMESIZE_RAW0 : cgc->cmd[9] = 0x58; break; + case CD_FRAMESIZE_RAW1 : cgc->cmd[9] = 0x78; break; + case CD_FRAMESIZE_RAW : cgc->cmd[9] = 0xf8; break; + default : cgc->cmd[9] = 0x10; + } + + return cdo->generic_packet(cdi, cgc); +} + +/* Just about every imaginable ioctl is supported in the Uniform layer + * these days. ATAPI / SCSI specific code now mainly resides in + * mmc_ioct(). + */ +static int cdrom_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, + unsigned long arg) +{ + kdev_t dev = ip->i_rdev; + struct cdrom_device_info *cdi = cdrom_find_device(dev); + struct cdrom_device_ops *cdo = cdi->ops; + int ret; /* the first few commands do not deal with audio drive_info, but only with routines in cdrom device operations. */ switch (cmd) { - /* maybe we should order cases after statistics of use? */ - case CDROMMULTISESSION: { - int ret; struct cdrom_multisession ms_info; u_char requested_format; cdinfo(CD_DO_IOCTL, "entering CDROMMULTISESSION\n"); @@ -741,7 +1460,6 @@ } case CDROMEJECT: { - int ret; cdinfo(CD_DO_IOCTL, "entering CDROMEJECT\n"); if (!CDROM_CAN(CDC_OPEN_TRAY)) return -ENOSYS; @@ -774,16 +1492,22 @@ } case CDROM_MEDIA_CHANGED: { + struct cdrom_changer_info info; + cdinfo(CD_DO_IOCTL, "entering CDROM_MEDIA_CHANGED\n"); if (!CDROM_CAN(CDC_MEDIA_CHANGED)) return -ENOSYS; - if (!CDROM_CAN(CDC_SELECT_DISC) - || arg == CDSL_CURRENT) + if (!CDROM_CAN(CDC_SELECT_DISC) || arg == CDSL_CURRENT) /* cannot select disc or select current disc */ return media_changed(cdi, 1); - if ((unsigned int)arg >= cdi->capacity) + if ((unsigned int)arg >= cdi->capacity) { return -EINVAL; - return cdo->media_changed (cdi, arg); + } + + if ((ret = cdrom_read_mech_status(cdi, &info))) + return ret; + + return info.slots[arg].change; } case CDROM_SET_OPTIONS: { @@ -824,16 +1548,29 @@ case CDROM_SELECT_DISC: { cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_DISC\n"); - if (!(cdo->capability & ~cdi->mask & CDC_SELECT_DISC)) + if (!CDROM_CAN(CDC_SELECT_DISC)) return -ENOSYS; - if ((arg == CDSL_CURRENT) || (arg == CDSL_NONE)) + + if ((arg != CDSL_CURRENT) && (arg != CDSL_NONE)) { + if ((int)arg >= cdi->capacity) + return -EINVAL; + } + /* cdo->select_disc is a hook to allow a driver-specific + * way of seleting disc. However, since there is no + * equiv hook for cdrom_slot_status this may not + * actually be useful... + */ + if (cdo->select_disc != NULL) return cdo->select_disc(cdi, arg); - if ((int)arg >= cdi->capacity) - return -EDRIVE_CANT_DO_THIS; - return cdo->select_disc(cdi, arg); + + /* no driver specific select_disc(), call our own */ + cdinfo(CD_CHANGER, "Using generic cdrom_select_disc()\n"); + return cdrom_select_disc(cdi, arg); } case CDROMRESET: { + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n"); if (!CDROM_CAN(CDC_RESET)) return -ENOSYS; @@ -841,7 +1578,7 @@ } case CDROM_LOCKDOOR: { - cdinfo(CD_DO_IOCTL, "%socking door.\n",arg?"L":"Unl"); + cdinfo(CD_DO_IOCTL, "%socking door.\n", arg ? "L" : "Unl"); if (!CDROM_CAN(CDC_LOCK)) return -EDRIVE_CANT_DO_THIS; keeplocked = arg ? 1 : 0; @@ -854,7 +1591,7 @@ case CDROM_DEBUG: { if (!capable(CAP_SYS_ADMIN)) return -EACCES; - cdinfo(CD_DO_IOCTL, "%sabling debug.\n",arg?"En":"Dis"); + cdinfo(CD_DO_IOCTL, "%sabling debug.\n", arg ? "En" : "Dis"); debug = arg ? 1 : 0; return debug; } @@ -870,10 +1607,9 @@ * is written on the CD is /not/ uniform across all discs! */ case CDROM_GET_MCN: { - int ret; struct cdrom_mcn mcn; cdinfo(CD_DO_IOCTL, "entering CDROM_GET_MCN\n"); - if (!CDROM_CAN(CDC_MCN)) + if (!(cdo->capability & CDC_MCN)) return -ENOSYS; if ((ret=cdo->get_mcn(cdi, &mcn))) return ret; @@ -884,13 +1620,15 @@ case CDROM_DRIVE_STATUS: { cdinfo(CD_DO_IOCTL, "entering CDROM_DRIVE_STATUS\n"); - if (!CDROM_CAN(CDC_DRIVE_STATUS)) + if (!(cdo->capability & CDC_DRIVE_STATUS)) return -ENOSYS; + if (!CDROM_CAN(CDC_SELECT_DISC)) + return cdo->drive_status(cdi, CDSL_CURRENT); if ((arg == CDSL_CURRENT) || (arg == CDSL_NONE)) - return cdo->drive_status(cdi, arg); - if (((int)arg > cdi->capacity)) + return cdo->drive_status(cdi, CDSL_CURRENT); + if (((int)arg >= cdi->capacity)) return -EINVAL; - return cdo->drive_status(cdi, arg); + return cdrom_slot_status(cdi, arg); } /* Ok, this is where problems start. The current interface for the @@ -921,242 +1659,891 @@ if (tracks.audio > 0) { if (tracks.data==0 && tracks.cdi==0 && tracks.xa==0) return CDS_AUDIO; - else return CDS_MIXED; + else + return CDS_MIXED; } if (tracks.cdi > 0) return CDS_XA_2_2; if (tracks.xa > 0) return CDS_XA_2_1; if (tracks.data > 0) return CDS_DATA_1; /* Policy mode off */ - cdinfo(CD_WARNING,"This disc doesn't have any tracks I recognise!\n"); + cdinfo(CD_WARNING,"This disc doesn't have any tracks I recognize!\n"); return CDS_NO_INFO; } - case CDROM_CHANGER_NSLOTS: + case CDROM_CHANGER_NSLOTS: { cdinfo(CD_DO_IOCTL, "entering CDROM_CHANGER_NSLOTS\n"); - return cdi->capacity; + return cdi->capacity; + } + } -/* The following is not implemented, because there are too many - * different data types. We could support /1/ raw mode, that is large - * enough to hold everything. - */ + /* use the ioctls that are implemented through the generic_packet() + interface. this may look at bit funny, but if -ENOTTY is + returned that particular ioctl is not implemented and we + let it go through the device specific ones. */ + if (CDROM_CAN(CDC_GENERIC_PACKET)) { + ret = mmc_ioctl(cdi, cmd, arg); + if (ret != -ENOTTY) { + return ret; + } + } -#if 0 - case CDROMREADMODE1: { - int ret; + /* note: most of the cdinfo() calls are commented out here, + because they fill up the sys log when CD players poll + the drive. */ + switch (cmd) { + case CDROMSUBCHNL: { + struct cdrom_subchnl q; + u_char requested, back; + if (!CDROM_CAN(CDC_PLAY_AUDIO)) + return -ENOSYS; + /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/ + IOCTL_IN(arg, struct cdrom_subchnl, q); + requested = q.cdsc_format; + if (!((requested == CDROM_MSF) || + (requested == CDROM_LBA))) + return -EINVAL; + q.cdsc_format = CDROM_MSF; + if ((ret=cdo->audio_ioctl(cdi, cmd, &q))) + return ret; + back = q.cdsc_format; /* local copy */ + sanitize_format(&q.cdsc_absaddr, &back, requested); + sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested); + IOCTL_OUT(arg, struct cdrom_subchnl, q); + /* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */ + return 0; + } + case CDROMREADTOCHDR: { + struct cdrom_tochdr header; + if (!CDROM_CAN(CDC_PLAY_AUDIO)) + return -ENOSYS; + /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */ + IOCTL_IN(arg, struct cdrom_tochdr, header); + if ((ret=cdo->audio_ioctl(cdi, cmd, &header))) + return ret; + IOCTL_OUT(arg, struct cdrom_tochdr, header); + /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCHDR successful\n"); */ + return 0; + } + case CDROMREADTOCENTRY: { + struct cdrom_tocentry entry; + u_char requested_format; + if (!CDROM_CAN(CDC_PLAY_AUDIO)) + return -ENOSYS; + /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */ + IOCTL_IN(arg, struct cdrom_tocentry, entry); + requested_format = entry.cdte_format; + if (!((requested_format == CDROM_MSF) || + (requested_format == CDROM_LBA))) + return -EINVAL; + /* make interface to low-level uniform */ + entry.cdte_format = CDROM_MSF; + if ((ret=cdo->audio_ioctl(cdi, cmd, &entry))) + return ret; + sanitize_format(&entry.cdte_addr, + &entry.cdte_format, requested_format); + IOCTL_OUT(arg, struct cdrom_tocentry, entry); + /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCENTRY successful\n"); */ + return 0; + } + case CDROMPLAYMSF: { struct cdrom_msf msf; - char buf[CD_FRAMESIZE]; - cdinfo(CD_DO_IOCTL, "entering CDROMREADMODE1\n"); + if (!CDROM_CAN(CDC_PLAY_AUDIO)) + return -ENOSYS; + cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n"); IOCTL_IN(arg, struct cdrom_msf, msf); - if (ret=cdo->read_audio(dev, cmd, &msf, &buf, cdi)) + return cdo->audio_ioctl(cdi, cmd, &msf); + } + case CDROMPLAYTRKIND: { + struct cdrom_ti ti; + if (!CDROM_CAN(CDC_PLAY_AUDIO)) + return -ENOSYS; + cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n"); + IOCTL_IN(arg, struct cdrom_ti, ti); + CHECKAUDIO; + return cdo->audio_ioctl(cdi, cmd, &ti); + } + case CDROMVOLCTRL: { + struct cdrom_volctrl volume; + if (!CDROM_CAN(CDC_PLAY_AUDIO)) + return -ENOSYS; + cdinfo(CD_DO_IOCTL, "entering CDROMVOLCTRL\n"); + IOCTL_IN(arg, struct cdrom_volctrl, volume); + return cdo->audio_ioctl(cdi, cmd, &volume); + } + case CDROMVOLREAD: { + struct cdrom_volctrl volume; + if (!CDROM_CAN(CDC_PLAY_AUDIO)) + return -ENOSYS; + cdinfo(CD_DO_IOCTL, "entering CDROMVOLREAD\n"); + if ((ret=cdo->audio_ioctl(cdi, cmd, &volume))) return ret; - IOCTL_OUT(arg, __typeof__(buf), buf); + IOCTL_OUT(arg, struct cdrom_volctrl, volume); return 0; } -#endif + case CDROMSTART: + case CDROMSTOP: + case CDROMPAUSE: + case CDROMRESUME: { + if (!CDROM_CAN(CDC_PLAY_AUDIO)) + return -ENOSYS; + cdinfo(CD_DO_IOCTL, "doing audio ioctl (start/stop/pause/resume)\n"); + CHECKAUDIO; + return cdo->audio_ioctl(cdi, cmd, NULL); + } } /* switch */ -/* Now all the audio-ioctls follow, they are all routed through the - same call audio_ioctl(). */ + /* do the device specific ioctls */ + if (CDROM_CAN(CDC_IOCTLS)) + return cdo->dev_ioctl(cdi, cmd, arg); + + return -ENOSYS; +} -#define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret +static inline +int msf_to_lba(char m, char s, char f) +{ + return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET; +} + +/* + * Required when we need to use READ_10 to issue other than 2048 block + * reads + */ +static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size) +{ + struct cdrom_device_ops *cdo = cdi->ops; + struct cdrom_generic_command cgc; + struct modesel_head mh; - if (!CDROM_CAN(CDC_PLAY_AUDIO)) - return -ENOSYS; - else { + memset(&mh, 0, sizeof(mh)); + mh.block_desc_length = 0x08; + mh.block_length_med = (size >> 8) & 0xff; + mh.block_length_lo = size & 0xff; + + memset(&cgc, 0, sizeof(cgc)); + cgc.cmd[0] = 0x15; + cgc.cmd[1] = 1 << 4; + cgc.cmd[4] = 12; + cgc.buflen = sizeof(mh); + cgc.buffer = (char *) &mh; + mh.block_desc_length = 0x08; + mh.block_length_med = (size >> 8) & 0xff; + mh.block_length_lo = size & 0xff; + + return cdo->generic_packet(cdi, &cgc); +} + +static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, + unsigned long arg) +{ + struct cdrom_device_ops *cdo = cdi->ops; + struct cdrom_generic_command cgc; + kdev_t dev = cdi->dev; + char buffer[32]; + int ret = 0; + + memset(&cgc, 0, sizeof(cgc)); + + /* build a unified command and queue it through + cdo->generic_packet() */ + switch (cmd) { + case CDROMREADRAW: + case CDROMREADMODE1: + case CDROMREADMODE2: { + struct cdrom_msf msf; + int blocksize = 0, format = 0, lba; + switch (cmd) { - case CDROMSUBCHNL: { - int ret; - struct cdrom_subchnl q; - u_char requested, back; - /* comment out the cdinfo calls here because they - fill up the sys logs when CD players poll the drive*/ - /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/ - IOCTL_IN(arg, struct cdrom_subchnl, q); - requested = q.cdsc_format; - if (!((requested == CDROM_MSF) || - (requested == CDROM_LBA))) - return -EINVAL; - q.cdsc_format = CDROM_MSF; - if ((ret=cdo->audio_ioctl(cdi, cmd, &q))) - return ret; - back = q.cdsc_format; /* local copy */ - sanitize_format(&q.cdsc_absaddr, &back, requested); - sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested); - IOCTL_OUT(arg, struct cdrom_subchnl, q); - /* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */ - return 0; - } - case CDROMREADTOCHDR: { - int ret; - struct cdrom_tochdr header; - /* comment out the cdinfo calls here because they - fill up the sys logs when CD players poll the drive*/ - /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */ - IOCTL_IN(arg, struct cdrom_tochdr, header); - if ((ret=cdo->audio_ioctl(cdi, cmd, &header))) - return ret; - IOCTL_OUT(arg, struct cdrom_tochdr, header); - /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCHDR successful\n"); */ - return 0; - } - case CDROMREADTOCENTRY: { - int ret; - struct cdrom_tocentry entry; - u_char requested_format; - /* comment out the cdinfo calls here because they - fill up the sys logs when CD players poll the drive*/ - /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */ - IOCTL_IN(arg, struct cdrom_tocentry, entry); - requested_format = entry.cdte_format; - if (!((requested_format == CDROM_MSF) || - (requested_format == CDROM_LBA))) - return -EINVAL; - /* make interface to low-level uniform */ - entry.cdte_format = CDROM_MSF; - if ((ret=cdo->audio_ioctl(cdi, cmd, &entry))) + case CDROMREADRAW: + blocksize = CD_FRAMESIZE_RAW; + break; + case CDROMREADMODE1: + blocksize = CD_FRAMESIZE; + format = 2; + break; + case CDROMREADMODE2: + blocksize = CD_FRAMESIZE_RAW0; + break; + } + IOCTL_IN(arg, struct cdrom_msf, msf); + lba = msf_to_lba(msf.cdmsf_min0,msf.cdmsf_sec0,msf.cdmsf_frame0); + /* FIXME: we need upper bound checking, too!! */ + if (lba < 0) + return -EINVAL; + cgc.buffer = (char *) kmalloc(blocksize, GFP_KERNEL); + if (cgc.buffer == NULL) + return -ENOMEM; + ret = cdrom_read_block(cdi, &cgc, lba, 1, format, blocksize); + if (ret) { + /* + * SCSI-II devices are not required to support + * READ_CD, so let's try switching block size + */ + /* FIXME: switch back again... */ + if ((ret = cdrom_switch_blocksize(cdi, blocksize))) { + kfree(cgc.buffer); return ret; - sanitize_format(&entry.cdte_addr, - &entry.cdte_format, requested_format); - IOCTL_OUT(arg, struct cdrom_tocentry, entry); - /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCENTRY successful\n"); */ - return 0; - } - case CDROMPLAYMSF: { - int ret; - struct cdrom_msf msf; - cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n"); - IOCTL_IN(arg, struct cdrom_msf, msf); - CHECKAUDIO; - return cdo->audio_ioctl(cdi, cmd, &msf); - } - case CDROMPLAYTRKIND: { - int ret; - struct cdrom_ti ti; - cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n"); - IOCTL_IN(arg, struct cdrom_ti, ti); - CHECKAUDIO; - return cdo->audio_ioctl(cdi, cmd, &ti); } - case CDROMVOLCTRL: { - struct cdrom_volctrl volume; - cdinfo(CD_DO_IOCTL, "entering CDROMVOLCTRL\n"); - IOCTL_IN(arg, struct cdrom_volctrl, volume); - return cdo->audio_ioctl(cdi, cmd, &volume); - } - case CDROMVOLREAD: { - int ret; - struct cdrom_volctrl volume; - cdinfo(CD_DO_IOCTL, "entering CDROMVOLREAD\n"); - if ((ret=cdo->audio_ioctl(cdi, cmd, &volume))) - return ret; - IOCTL_OUT(arg, struct cdrom_volctrl, volume); + ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1); + ret |= cdrom_switch_blocksize(cdi, blocksize); + } + if (!ret && copy_to_user((char *)arg, cgc.buffer, blocksize)) + ret = -EFAULT; + kfree(cgc.buffer); + return ret; + } + case CDROMREADAUDIO: { + struct cdrom_read_audio ra; + int lba, frames; + + IOCTL_IN(arg, struct cdrom_read_audio, ra); + + if (ra.addr_format == CDROM_MSF) + lba = msf_to_lba(ra.addr.msf.minute, + ra.addr.msf.second, + ra.addr.msf.frame); + else if (ra.addr_format == CDROM_LBA) + lba = ra.addr.lba; + else + return -EINVAL; + + /* FIXME: we need upper bound checking, too!! */ + if (lba < 0) + return -EINVAL; + + /* do max 8 frames at the time */ + frames = ra.nframes > 8 ? 8 : ra.nframes; + + if ((cgc.buffer = (char *) kmalloc(CD_FRAMESIZE_RAW * frames, + GFP_KERNEL)) == NULL) + return -ENOMEM; + + if (!access_ok(VERIFY_WRITE, ra.buf, ra.nframes*CD_FRAMESIZE_RAW)) { + kfree(cgc.buffer); + return -EFAULT; + } + + while (ra.nframes > 0) { + ret = cdrom_read_block(cdi, &cgc, lba, frames, 1, CD_FRAMESIZE_RAW); + if (ret) break; + __copy_to_user(ra.buf, cgc.buffer, + CD_FRAMESIZE_RAW * frames); + ra.buf += (CD_FRAMESIZE_RAW * frames); + ra.nframes -= frames; + lba += frames; + } + kfree(cgc.buffer); + return ret; + } + case CDROMSUBCHNL: { + struct cdrom_subchnl q; + u_char requested, back; + IOCTL_IN(arg, struct cdrom_subchnl, q); + requested = q.cdsc_format; + if (!((requested == CDROM_MSF) || + (requested == CDROM_LBA))) + return -EINVAL; + q.cdsc_format = CDROM_MSF; + if ((ret = cdrom_read_subchannel(cdi, &q, 0))) + return ret; + back = q.cdsc_format; /* local copy */ + sanitize_format(&q.cdsc_absaddr, &back, requested); + sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested); + IOCTL_OUT(arg, struct cdrom_subchnl, q); + /* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */ + return 0; + } + case CDROMPLAYTRKIND: { + struct cdrom_ti ti; + struct cdrom_tocentry entry; + struct cdrom_tochdr tochdr; + + cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n"); + IOCTL_IN(arg, struct cdrom_ti, ti); + entry.cdte_format = CDROM_MSF; + + /* get toc entry for start and end track */ + if (cdo->audio_ioctl(cdi, CDROMREADTOCHDR, &tochdr)) + return -EINVAL; + if ((entry.cdte_track = ti.cdti_trk0) > tochdr.cdth_trk1) + return -EINVAL; + if (cdo->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) + return -EINVAL; + + cgc.cmd[3] = entry.cdte_addr.msf.minute; + cgc.cmd[4] = entry.cdte_addr.msf.second; + cgc.cmd[5] = entry.cdte_addr.msf.frame; + + entry.cdte_track = ti.cdti_trk1 + 1; + if (entry.cdte_track > tochdr.cdth_trk1) + entry.cdte_track = CDROM_LEADOUT; + + if (cdo->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) + return -EINVAL; + + cgc.cmd[6] = entry.cdte_addr.msf.minute; + cgc.cmd[7] = entry.cdte_addr.msf.second; + cgc.cmd[8] = entry.cdte_addr.msf.frame; + cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF; + return cdo->generic_packet(cdi, &cgc); + } + case CDROMPLAYMSF: { + struct cdrom_msf msf; + cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n"); + IOCTL_IN(arg, struct cdrom_msf, msf); + cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF; + cgc.cmd[3] = msf.cdmsf_min0; + cgc.cmd[4] = msf.cdmsf_sec0; + cgc.cmd[5] = msf.cdmsf_frame0; + cgc.cmd[6] = msf.cdmsf_min1; + cgc.cmd[7] = msf.cdmsf_sec1; + cgc.cmd[8] = msf.cdmsf_frame1; + return cdo->generic_packet(cdi, &cgc); + } + case CDROMPLAYBLK: { + struct cdrom_blk blk; + cdinfo(CD_DO_IOCTL, "entering CDROMPLAYBLK\n"); + IOCTL_IN(arg, struct cdrom_blk, blk); + cgc.cmd[0] = GPCMD_PLAY_AUDIO_10; + cgc.cmd[2] = (blk.from >> 24) & 0xff; + cgc.cmd[3] = (blk.from >> 16) & 0xff; + cgc.cmd[4] = (blk.from >> 8) & 0xff; + cgc.cmd[5] = blk.from & 0xff; + cgc.cmd[7] = (blk.len >> 8) & 0xff; + cgc.cmd[8] = blk.len & 0xff; + return cdo->generic_packet(cdi, &cgc); + } + case CDROMVOLCTRL: + case CDROMVOLREAD: { + struct cdrom_volctrl volctrl; + char mask[32]; + unsigned short offset; + cdinfo(CD_DO_IOCTL, "entering CDROMVOLUME\n"); + + IOCTL_IN(arg, struct cdrom_volctrl, volctrl); + + cgc.buffer = buffer; + cgc.buflen = 24; + if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 0))) + return ret; + + /* some drives have longer pages, adjust and reread. */ + if (buffer[1] > cgc.buflen) { + cgc.buflen = buffer[1] + 2; + if ((ret = cdrom_mode_sense(cdi, &cgc, + GPMODE_AUDIO_CTL_PAGE, 0))) + return ret; + } + + /* get the offset from the length of the page. length + is measure from byte 2 an on, thus the 14. */ + offset = buffer[1] - 14; + + /* now we have the current volume settings. if it was only + a CDROMVOLREAD, return these values */ + if (cmd == CDROMVOLREAD) { + volctrl.channel0 = buffer[offset+9]; + volctrl.channel1 = buffer[offset+11]; + volctrl.channel2 = buffer[offset+13]; + volctrl.channel3 = buffer[offset+15]; + IOCTL_OUT(arg, struct cdrom_volctrl, volctrl); return 0; + } + + /* get the volume mask */ + cgc.buffer = mask; + if ((ret = cdrom_mode_sense(cdi, &cgc, + GPMODE_AUDIO_CTL_PAGE, 1))) + return ret; + + buffer[offset+9] = volctrl.channel0 & mask[offset+9]; + buffer[offset+11] = volctrl.channel1 & mask[offset+11]; + buffer[offset+13] = volctrl.channel2 & mask[offset+13]; + buffer[offset+15] = volctrl.channel3 & mask[offset+15]; + + /* set volume */ + cgc.buffer = buffer; + return cdrom_mode_select(cdi, &cgc); + } + + case CDROMSTART: + case CDROMSTOP: { + cdinfo(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n"); + cgc.cmd[0] = GPCMD_START_STOP_UNIT; + cgc.cmd[1] = 1; + cgc.cmd[4] = (cmd == CDROMSTART) ? 1 : 0; + return cdo->generic_packet(cdi, &cgc); + } + + case CDROMPAUSE: + case CDROMRESUME: { + cdinfo(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n"); + cgc.cmd[0] = GPCMD_PAUSE_RESUME; + cgc.cmd[8] = (cmd == CDROMRESUME) ? 1 : 0; + return cdo->generic_packet(cdi, &cgc); + } + + case DVD_READ_STRUCT: { + dvd_struct *s; + int size = sizeof(dvd_struct); + if (!CDROM_CAN(CDC_DVD)) + return -ENOSYS; + if ((s = (dvd_struct *) kmalloc(size, GFP_KERNEL)) == NULL) + return -ENOMEM; + cdinfo(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n"); + if (copy_from_user(s, (dvd_struct *)arg, size)) { + kfree(s); + return -EFAULT; + } + if ((ret = dvd_read_struct(cdi, s))) { + kfree(s); + return ret; + } + if (copy_to_user((dvd_struct *)arg, s, size)) + ret = -EFAULT; + kfree(s); + return ret; + } + + case DVD_AUTH: { + dvd_authinfo ai; + if (!CDROM_CAN(CDC_DVD)) + return -ENOSYS; + cdinfo(CD_DO_IOCTL, "entering DVD_AUTH\n"); + IOCTL_IN(arg, dvd_authinfo, ai); + if ((ret = dvd_do_auth (cdi, &ai))) + return ret; + IOCTL_OUT(arg, dvd_authinfo, ai); + return 0; + } + + case CDROM_SEND_PACKET: { + __u8 *userbuf, copy = 0; + struct request_sense *sense; + if (!CDROM_CAN(CDC_GENERIC_PACKET)) + return -ENOSYS; + cdinfo(CD_DO_IOCTL, "entering CDROM_SEND_PACKET\n"); + IOCTL_IN(arg, struct cdrom_generic_command, cgc); + copy = !!cgc.buflen; + userbuf = cgc.buffer; + cgc.buffer = NULL; + sense = cgc.sense; + if (userbuf != NULL && copy) { + /* usually commands just copy data one way, i.e. + * we send a buffer to the drive and the command + * specifies whether the drive will read or + * write to that buffer. usually the buffers + * are very small, so we don't loose that much + * by doing a redundant copy each time. */ + if (!access_ok(VERIFY_WRITE, userbuf, cgc.buflen)) { + printk("can't get write perms\n"); + return -EFAULT; } - case CDROMSTART: - case CDROMSTOP: - case CDROMPAUSE: - case CDROMRESUME: { - int ret; - cdinfo(CD_DO_IOCTL, "doing audio ioctl (start/stop/pause/resume)\n"); - CHECKAUDIO; - return cdo->audio_ioctl(cdi, cmd, NULL); + if (!access_ok(VERIFY_READ, userbuf, cgc.buflen)) { + printk("can't get read perms\n"); + return -EFAULT; } - } /* switch */ + } + /* reasonable limits */ + if (cgc.buflen < 0 || cgc.buflen > 131072) { + printk("invalid size given\n"); + return -EINVAL; + } + if (copy) { + cgc.buffer = kmalloc(cgc.buflen, GFP_KERNEL); + if (cgc.buffer == NULL) + return -ENOMEM; + __copy_from_user(cgc.buffer, userbuf, cgc.buflen); + } + ret = cdo->generic_packet(cdi, &cgc); + if (copy && !ret) + __copy_to_user(userbuf, cgc.buffer, cgc.buflen); + /* copy back sense data */ + if (sense != NULL) + if (copy_to_user(sense, cgc.sense, sizeof(struct request_sense))) + ret = -EFAULT; + kfree(cgc.buffer); + return ret; + } + case CDROM_NEXT_WRITABLE: { + long next = 0; + cdinfo(CD_DO_IOCTL, "entering CDROM_NEXT_WRITABLE\n"); + if ((ret = cdrom_get_next_writable(dev, &next))) + return ret; + IOCTL_OUT(arg, long, next); + return 0; + } + case CDROM_LAST_WRITTEN: { + long last = 0; + cdinfo(CD_DO_IOCTL, "entering CDROM_LAST_WRITTEN\n"); + if ((ret = cdrom_get_last_written(dev, &last))) + return ret; + IOCTL_OUT(arg, long, last); + return 0; + } + } /* switch */ + + return -ENOTTY; +} + +static int cdrom_get_track_info(kdev_t dev, __u16 track, __u8 type, + track_information *ti) +{ + struct cdrom_device_info *cdi = cdrom_find_device(dev); + struct cdrom_device_ops *cdo = cdi->ops; + struct cdrom_generic_command cgc; + int ret; + + init_cdrom_command(&cgc, ti, 8); + cgc.cmd[0] = GPCMD_READ_TRACK_RZONE_INFO; + cgc.cmd[1] = type & 3; + cgc.cmd[4] = (track & 0xff00) >> 8; + cgc.cmd[5] = track & 0xff; + cgc.cmd[8] = 8; + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + cgc.cmd[8] = cgc.buflen = be16_to_cpu(ti->track_information_length) + + sizeof(ti->track_information_length); + return cdo->generic_packet(cdi, &cgc); +} + +static int cdrom_get_disc_info(kdev_t dev, disc_information *di) +{ + struct cdrom_device_info *cdi = cdrom_find_device(dev); + struct cdrom_device_ops *cdo = cdi->ops; + struct cdrom_generic_command cgc; + int ret; + + /* set up command and get the disc info */ + init_cdrom_command(&cgc, di, sizeof(*di)); + cgc.cmd[0] = GPCMD_READ_DISC_INFO; + cgc.cmd[8] = cgc.buflen = 2; + + if ((ret = cdo->generic_packet(cdi, &cgc))) + return ret; + + /* not all drives have the same disc_info length, so requeue + * packet with the length the drive tells us it can supply + */ + cgc.buflen = be16_to_cpu(di->disc_information_length) + + sizeof(di->disc_information_length); + + if (cgc.buflen > sizeof(disc_information)) + cgc.buflen = sizeof(disc_information); + + cgc.cmd[8] = cgc.buflen; + + return cdo->generic_packet(cdi, &cgc); +} + + +/* return the last written block on the CD-R media. this is for the udf + file system. */ +int cdrom_get_last_written(kdev_t dev, long *last_written) +{ + struct cdrom_device_info *cdi = cdrom_find_device(dev); + struct cdrom_tocentry toc; + disc_information di; + track_information ti; + __u32 last_track; + int ret = -1; + + if (!CDROM_CAN(CDC_GENERIC_PACKET)) + goto use_toc; + + if ((ret = cdrom_get_disc_info(dev, &di))) + goto use_toc; + + last_track = (di.last_track_msb << 8) | di.last_track_lsb; + if ((ret = cdrom_get_track_info(dev, last_track, 1, &ti))) + goto use_toc; + + /* if this track is blank, try the previous. */ + if (ti.blank) { + last_track--; + if ((ret = cdrom_get_track_info(dev, last_track, 1, &ti))) + goto use_toc; } - /* device specific ioctls? */ - if (!(cdo->capability & CDC_IOCTLS)) - return -ENOSYS; - else - return cdo->dev_ioctl(cdi, cmd, arg); + /* if last recorded field is valid, return it. */ + if (ti.lra_v) { + *last_written = be32_to_cpu(ti.last_rec_address); + } else { + /* make it up instead */ + *last_written = be32_to_cpu(ti.track_start) + + be32_to_cpu(ti.track_size); + if (ti.free_blocks) + *last_written -= (be32_to_cpu(ti.free_blocks) + 7); + } + return 0; + + /* this is where we end up if the drive either can't do a + GPCMD_READ_DISC_INFO or GPCMD_READ_TRACK_RZONE_INFO or if + it fails. then we return the toc contents. */ +use_toc: + toc.cdte_format = CDROM_MSF; + toc.cdte_track = CDROM_LEADOUT; + if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)) + return ret; + sanitize_format(&toc.cdte_addr, &toc.cdte_format, CDROM_LBA); + *last_written = toc.cdte_addr.lba; + return 0; } +/* return the next writable block. also for udf file system. */ +int cdrom_get_next_writable(kdev_t dev, long *next_writable) +{ + struct cdrom_device_info *cdi = cdrom_find_device(dev); + disc_information di; + track_information ti; + __u16 last_track; + int ret = -1; + + if (!CDROM_CAN(CDC_GENERIC_PACKET)) + goto use_last_written; + + if ((ret = cdrom_get_disc_info(dev, &di))) + goto use_last_written; + + last_track = (di.last_track_msb << 8) | di.last_track_lsb; + if ((ret = cdrom_get_track_info(dev, last_track, 1, &ti))) + goto use_last_written; + + /* if this track is blank, try the previous. */ + if (ti.blank) { + last_track--; + if ((ret = cdrom_get_track_info(dev, last_track, 1, &ti))) + goto use_last_written; + } + + /* if next recordable address field is valid, use it. */ + if (ti.nwa_v) + *next_writable = be32_to_cpu(ti.next_writable); + else + goto use_last_written; + + return 0; + +use_last_written: + if ((ret = cdrom_get_last_written(dev, next_writable))) { + *next_writable = 0; + return ret; + } else { + *next_writable += 7; + return 0; + } +} + +EXPORT_SYMBOL(cdrom_get_next_writable); +EXPORT_SYMBOL(cdrom_get_last_written); EXPORT_SYMBOL(cdrom_count_tracks); EXPORT_SYMBOL(register_cdrom); EXPORT_SYMBOL(unregister_cdrom); EXPORT_SYMBOL(cdrom_fops); +EXPORT_SYMBOL(cdrom_number_of_slots); +EXPORT_SYMBOL(cdrom_select_disc); +EXPORT_SYMBOL(cdrom_mode_select); +EXPORT_SYMBOL(cdrom_mode_sense); +EXPORT_SYMBOL(init_cdrom_command); #ifdef CONFIG_SYSCTL #define CDROM_STR_SIZE 1000 -static char cdrom_drive_info[CDROM_STR_SIZE]="info\n"; +struct cdrom_sysctl_settings { + char info[CDROM_STR_SIZE]; /* general info */ + int autoclose; /* close tray upon mount, etc */ + int autoeject; /* eject on umount */ + int debug; /* turn on debugging messages */ + int lock; /* lock the door on device open */ + int check; /* check media type */ +} cdrom_sysctl_settings; int cdrom_sysctl_info(ctl_table *ctl, int write, struct file * filp, void *buffer, size_t *lenp) { int pos; struct cdrom_device_info *cdi; - char *info = cdrom_drive_info; + char *info = cdrom_sysctl_settings.info; if (!*lenp || (filp->f_pos && !write)) { *lenp = 0; return 0; } - pos = sprintf(cdrom_drive_info, "CD-ROM information, " VERSION "\n"); + pos = sprintf(info, "CD-ROM information, " VERSION "\n"); - pos += sprintf(cdrom_drive_info+pos, "\ndrive name:\t"); + pos += sprintf(info+pos, "\ndrive name:\t"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) pos += sprintf(info+pos, "\t%s", cdi->name); - pos += sprintf(cdrom_drive_info+pos, "\ndrive speed:\t"); + pos += sprintf(info+pos, "\ndrive speed:\t"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) pos += sprintf(info+pos, "\t%d", cdi->speed); - pos += sprintf(cdrom_drive_info+pos, "\ndrive # of slots:"); + pos += sprintf(info+pos, "\ndrive # of slots:"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) pos += sprintf(info+pos, "\t%d", cdi->capacity); - pos += sprintf(cdrom_drive_info+pos, "\nCan close tray:\t"); + pos += sprintf(info+pos, "\nCan close tray:\t"); + for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CLOSE_TRAY) != 0); + + pos += sprintf(info+pos, "\nCan open tray:\t"); + for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_OPEN_TRAY) != 0); + + pos += sprintf(info+pos, "\nCan lock tray:\t"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CLOSE_TRAY)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_LOCK) != 0); - pos += sprintf(cdrom_drive_info+pos, "\nCan open tray:\t"); + pos += sprintf(info+pos, "\nCan change speed:"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_OPEN_TRAY)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_SPEED) != 0); - pos += sprintf(cdrom_drive_info+pos, "\nCan lock tray:\t"); + pos += sprintf(info+pos, "\nCan select disk:"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_LOCK)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_DISC) != 0); - pos += sprintf(cdrom_drive_info+pos, "\nCan change speed:"); + pos += sprintf(info+pos, "\nCan read multisession:"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_SPEED)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MULTI_SESSION) != 0); - pos += sprintf(cdrom_drive_info+pos, "\nCan select disk:"); + pos += sprintf(info+pos, "\nCan read MCN:\t"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_DISC)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MCN) != 0); - pos += sprintf(cdrom_drive_info+pos, "\nCan read multisession:"); + pos += sprintf(info+pos, "\nReports media changed:"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MULTI_SESSION)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MEDIA_CHANGED) != 0); - pos += sprintf(cdrom_drive_info+pos, "\nCan read MCN:\t"); + pos += sprintf(info+pos, "\nCan play audio:\t"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MCN)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_PLAY_AUDIO) != 0); - pos += sprintf(cdrom_drive_info+pos, "\nReports media changed:"); + pos += sprintf(info+pos, "\nCan write CD-R:\t"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MEDIA_CHANGED)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CD_R) != 0); - pos += sprintf(cdrom_drive_info+pos, "\nCan play audio:\t"); + pos += sprintf(info+pos, "\nCan write CD-RW:"); for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) - pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_PLAY_AUDIO)!=0); + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CD_RW) != 0); - strcpy(info+pos,"\n\n"); - pos += 3; - if (*lenp > pos) - *lenp = pos; + pos += sprintf(info+pos, "\nCan read DVD:\t"); + for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD) != 0); + + pos += sprintf(info+pos, "\nCan write DVD-R:"); + for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_R) != 0); + + pos += sprintf(info+pos, "\nCan write DVD-RAM:"); + for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next) + pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_RAM) != 0); + + strcpy(info+pos,"\n\n"); return proc_dostring(ctl, write, filp, buffer, lenp); } +/* Unfortunately, per device settings are not implemented through + procfs/sysctl yet. When they are, this will naturally disappear. For now + just update all drives. Later this will become the template on which + new registered drives will be based. */ +void cdrom_update_settings(void) +{ + struct cdrom_device_info *cdi; + + for (cdi = topCdromPtr; cdi != NULL; cdi = cdi->next) { + if (autoclose && CDROM_CAN(CDC_CLOSE_TRAY)) + cdi->options |= CDO_AUTO_CLOSE; + else if (!autoclose) + cdi->options &= ~CDO_AUTO_CLOSE; + if (autoeject && CDROM_CAN(CDC_OPEN_TRAY)) + cdi->options |= CDO_AUTO_EJECT; + else if (!autoeject) + cdi->options &= ~CDO_AUTO_EJECT; + if (lockdoor && CDROM_CAN(CDC_LOCK)) + cdi->options |= CDO_LOCK; + else if (!lockdoor) + cdi->options &= ~CDO_LOCK; + if (check_media_type) + cdi->options |= CDO_CHECK_TYPE; + else + cdi->options &= ~CDO_CHECK_TYPE; + } +} + +static int cdrom_sysctl_handler(ctl_table *ctl, int write, struct file * filp, + void *buffer, size_t *lenp) +{ + int *valp = ctl->data; + int val = *valp; + int ret; + + ret = proc_dointvec(ctl, write, filp, buffer, lenp); + + if (write && *valp != val) { + + /* we only care for 1 or 0. */ + if (*valp) + *valp = 1; + else + *valp = 0; + + switch (ctl->ctl_name) { + case DEV_CDROM_AUTOCLOSE: { + if (valp == &cdrom_sysctl_settings.autoclose) + autoclose = cdrom_sysctl_settings.autoclose; + break; + } + case DEV_CDROM_AUTOEJECT: { + if (valp == &cdrom_sysctl_settings.autoeject) + autoeject = cdrom_sysctl_settings.autoeject; + break; + } + case DEV_CDROM_DEBUG: { + if (valp == &cdrom_sysctl_settings.debug) + debug = cdrom_sysctl_settings.debug; + break; + } + case DEV_CDROM_LOCK: { + if (valp == &cdrom_sysctl_settings.lock) + lockdoor = cdrom_sysctl_settings.lock; + break; + } + case DEV_CDROM_CHECK_MEDIA: { + if (valp == &cdrom_sysctl_settings.check) + check_media_type = cdrom_sysctl_settings.check; + break; + } + } + /* update the option flags according to the changes. we + don't have per device options through sysctl yet, + but we will have and then this will disappear. */ + cdrom_update_settings(); + } + + return ret; +} + /* Place files in /proc/sys/dev/cdrom */ ctl_table cdrom_table[] = { - {DEV_CDROM_INFO, "info", &cdrom_drive_info, + {DEV_CDROM_INFO, "info", &cdrom_sysctl_settings.info, CDROM_STR_SIZE, 0444, NULL, &cdrom_sysctl_info}, + {DEV_CDROM_AUTOCLOSE, "autoclose", &cdrom_sysctl_settings.autoclose, + sizeof(int), 0644, NULL, &cdrom_sysctl_handler }, + {DEV_CDROM_AUTOEJECT, "autoeject", &cdrom_sysctl_settings.autoeject, + sizeof(int), 0644, NULL, &cdrom_sysctl_handler }, + {DEV_CDROM_DEBUG, "debug", &cdrom_sysctl_settings.debug, + sizeof(int), 0644, NULL, &cdrom_sysctl_handler }, + {DEV_CDROM_LOCK, "lock", &cdrom_sysctl_settings.lock, + sizeof(int), 0644, NULL, &cdrom_sysctl_handler }, + {DEV_CDROM_CHECK_MEDIA, "check_media", &cdrom_sysctl_settings.check, + sizeof(int), 0644, NULL, &cdrom_sysctl_handler }, {0} }; @@ -1200,24 +2587,31 @@ cdrom_sysctl_header = register_sysctl_table(cdrom_root_table, 1); cdrom_root_table->child->de->fill_inode = &cdrom_procfs_modcount; + /* set the defaults */ + cdrom_sysctl_settings.autoclose = autoclose; + cdrom_sysctl_settings.autoeject = autoeject; + cdrom_sysctl_settings.debug = debug; + cdrom_sysctl_settings.lock = lockdoor; + cdrom_sysctl_settings.check = check_media_type; + initialized = 1; } +#endif /* endif CONFIG_SYSCTL */ + #ifdef MODULE static void cdrom_sysctl_unregister(void) { +#ifdef CONFIG_SYSCTL unregister_sysctl_table(cdrom_sysctl_header); +#endif } -#endif /* endif MODULE */ -#endif /* endif CONFIG_SYSCTL */ - -#ifdef MODULE int init_module(void) { #ifdef CONFIG_SYSCTL cdrom_sysctl_register(); -#endif /* CONFIG_SYSCTL */ +#endif return 0; } @@ -1228,14 +2622,5 @@ cdrom_sysctl_unregister(); #endif /* CONFIG_SYSCTL */ } - #endif /* endif MODULE */ - - -/* - * Local variables: - * comment-column: 40 - * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -fno-strength-reduce -m486 -DCPU=486 -DMODULE -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -c -o cdrom.o cdrom.c" - * End: - */ diff -urN v2.2.15/linux/drivers/char/Config.in linux/drivers/char/Config.in --- v2.2.15/linux/drivers/char/Config.in Wed May 3 17:16:33 2000 +++ linux/drivers/char/Config.in Wed Jun 7 14:26:42 2000 @@ -109,6 +109,7 @@ tristate ' Software Watchdog' CONFIG_SOFT_WATCHDOG tristate ' Berkshire Products PC Watchdog' CONFIG_PCWATCHDOG tristate ' Acquire SBC Watchdog Timer' CONFIG_ACQUIRE_WDT + tristate ' SBC-60XX Watchdog Timer' CONFIG_60XX_WDT tristate ' Mixcom Watchdog' CONFIG_MIXCOMWD endmenu fi diff -urN v2.2.15/linux/drivers/char/Makefile linux/drivers/char/Makefile --- v2.2.15/linux/drivers/char/Makefile Wed May 3 17:16:33 2000 +++ linux/drivers/char/Makefile Wed Jun 7 14:26:42 2000 @@ -299,6 +299,14 @@ endif endif +ifeq ($(CONFIG_60XX_WDT),y) +L_OBJS += sbc60xxwdt.o +else + ifeq ($(CONFIG_60XX_WDT),m) + M_OBJS += sbc60xxwdt.o + endif +endif + ifeq ($(CONFIG_MIXCOMWD),y) L_OBJS += mixcomwd.o else diff -urN v2.2.15/linux/drivers/char/README.computone linux/drivers/char/README.computone --- v2.2.15/linux/drivers/char/README.computone Wed Aug 25 17:29:46 1999 +++ linux/drivers/char/README.computone Wed Jun 7 14:26:42 2000 @@ -5,24 +5,30 @@ Release Notes For Linux Kernel 2.2 These notes have been tested on Linux kernels 2.0 and 2.2. +Please refer to Documentation/computone.txt for information on the driver +that is included with the kernel sources. -Version: 1.2.4 -Date: 08/04/99 + +Version: 1.2.9 +Date: 04/12/2000 Fixes and Updates: Doug McNash Historical Author: Andrew Manison +Kernel Integration: Mike Warfield 1. INTRODUCTION This driver supports the entire family of Intelliport II/Plus controllers -with the exception of the MicroChannel controllers. +with the exception of the MicroChannel controllers. This driver was developed on the v2.0.x Linux source tree and has been -tested up to v2.2.10; it will probably not work with earlier v1.X kernels, +tested up to v2.2.14; it will probably not work with earlier v1.X kernels, and has not yet been tested on the v2.1.x tree. The most likely problems will be in patching the kernel sources to support the driver. For this reason there are 2 different patch files for 2.0.XX and 2.2.XX kernels. Make sure you use the right one! -Someday soon it should be included in the 2.3.XX tree. +Note that a version (1.2.5) is included in the 2.2.12+ kernels so this +will not be a new install but and upgrade. + 2. QUICK INSTALLATION @@ -31,10 +37,11 @@ `cat /proc/ioports`. Set the card dip switches to that free address. You may need to configure your BIOS to reserve the irq for the ISA card. PCI and EISA parameters are set - automagically and need no attention. Insert card into - computer with the power off before or after driver installation. + automagically and need only be set to nonzero values. + Insert card into computer with the power off before or after + driver installation. -Software - +Software - New Installation Module installation: @@ -74,6 +81,11 @@ j) reboot using this kernel k) make and run ip2/mkip2dev +Software - Upgrades + +a) Install new sources in proper location, usually /usr/src/linux/drivers/char +b) Follow steps above to create new kernel or modules + 3. INSTALLATION Previously, the driver sources were packaged with a set of patch files @@ -82,7 +94,8 @@ the patches if needed, and build any utilities needed. What you recieve may be a single patch file in conventional kernel patch format build script. That form can also be applied by -running patch -p1 < ThePatchFile. Otherwise run ip2build. +running patch -p1 < ThePatchFile. Otherwise the drivers source may be +a tar file, then untar and run ip2build if a new installation. The driver can be installed as a module (recommended) or built into the kernel. This is selected as for other drivers through the `make config` @@ -97,20 +110,28 @@ where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11, 12,15) and addr1-4 are the base addresses for up to four controllers. If the irqs are not specified the driver uses the default in ip2/ip2.h (which -selects polled mode). If no base addresses are specified the defaults in -ip2.h are used. If you are autoloading the driver module with kerneld or -kmod the base addresses and interrupt number must also be set in ip2/ip2.h -and recompile or just insert and options line in /etc/modules.conf or both. -The options line is equivalent to the command line and takes precidence over -what is in ip2.h. +selects polled mode). The io addresses are set to io=1 for PCI cards,i +io=2 for EISA cards or io=[some valid ISA address] for ISA cards. If no +base addresses are specified the defaults in ip2.h are used. If you are +autoloading the driver module with kerneld or kmod the base addresses and +interrupt number must also be set in ip2/ip2.h and recompile or just insert +an options line in /etc/modules.conf or both. The command line takes +precidence over the options line which takes precidence over the defaults +in ip2.h. + +command line sample: + + modprobe ip2 io=1,0x328 irq=1,10 /etc/modules.conf sample: + options ip2 io=1,0x328 irq=1,10 alias char-major-71 ip2 alias char-major-72 ip2 alias char-major-73 ip2 -equivelant ip2.h: +the equivelant ip2.h: + static ip2config_t ip2config = { {1,10,0,0}, @@ -122,15 +143,17 @@ } }; -Specifying an invalid or in-use irq will default the driver into +Specifying an invalid or in-use ISA irq will default the driver into running in polled mode for that card. If all irq entries are 0 then -all cards will operate in polled mode. +all cards will operate in polled mode. Note that the PCI will be +assigned it's irq by the BIOS and may not match what you specify. +It must be non-zero otherwise it will be polled. Tarball Install: The whole tarfile should be untarred in the /usr/src/linux/drivers/char/ directory. Most files required for the driver are placed in the ip2 -subdirectory. Then execute the script +subdirectory. Then execute the script (for a new install only) ip2build @@ -149,7 +172,7 @@ If you select the driver as part of the kernel run : make depend - make zlilo (or whatever you do to create a bootable kernel) + make bzImage(,zlilo or whatever you do to create a bootable kernel) If you selected a module run : @@ -161,7 +184,8 @@ ports are created. With multiple boards and expansion boxes this will leave gaps in the sequence of device names. ip2mkdev uses Linux tty naming conventions: ttyF0 - ttyF255 for normal devices, and cuf0 - cuf255 for -callout devices. +callout devices. Note that the callout devices are going away in the +future and that is what the warning messages are trying to tell you. 4. USING THE DRIVERS @@ -181,7 +205,7 @@ corresponds to the maximum bit rates those chips are capable. For example if the baud base is 921600 and the baud divisor is 18 then the custom rate is 921600/18 = 51200 bps. See the setserial man page for -complete details. Of course if stty accepts the higher rates now you can +complete details. Of course, if stty accepts the higher rates now you can use that as well as the standard ioctls(). 5. NOTES @@ -190,6 +214,14 @@ in all configurations of Linux. If there is any anomalous behaviour that does not match the standard serial port's behaviour please let us know. -Author: dmcnash@computine.com +Some installations report that characters fail to echo immediatly at a +terminal if the kernel/modules are compiled with the CONFIG_M386 and +the card is run in polling mode on a pentium class machine. Compiling +with a more appropriate processor flag or running on interrupt would be +the fix as well as the wise thing to do. + + + +Author: dougm@computone.com Testing: larryg@computone.com -Spport: support@computone.com +Support: support@computone.com diff -urN v2.2.15/linux/drivers/char/console.c linux/drivers/char/console.c --- v2.2.15/linux/drivers/char/console.c Wed May 3 17:16:33 2000 +++ linux/drivers/char/console.c Wed Jun 7 14:26:42 2000 @@ -684,7 +684,7 @@ else { unsigned short *p = (unsigned short *) kmalloc(ss, GFP_USER); if (!p) { - for (i = 0; i< currcons; i++) + for (i = first; i< currcons; i++) if (newscreens[i]) kfree_s(newscreens[i], ss); return -ENOMEM; diff -urN v2.2.15/linux/drivers/char/cpia.c linux/drivers/char/cpia.c --- v2.2.15/linux/drivers/char/cpia.c Wed May 3 17:16:33 2000 +++ linux/drivers/char/cpia.c Wed Jun 7 14:26:42 2000 @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -435,6 +436,8 @@ * or we need to get more sophisticated. */ out += sprintf(out, "read-only\n-----------------------\n"); + out += sprintf(out, "V4L Driver version: %d.%d.%d\n", + CPIA_MAJ_VER, CPIA_MIN_VER, CPIA_PATCH_VER); out += sprintf(out, "CPIA Version: %d.%02d (%d.%d)\n", cam->params.version.firmwareVersion, cam->params.version.firmwareRevision, @@ -537,13 +540,13 @@ /* 1-02 firmware limits gain to 2 */ sprintf(tmpstr, "%8d %8d", 1, 2); } else { - sprintf(tmpstr, "1,2,4,8"); + sprintf(tmpstr, "%8d %8d", 1, 8); } if(cam->params.exposure.gainMode == 0) { out += sprintf(out, "max_gain: unknown %18s" - " %8d\n", tmpstr, 2); + " %8d powers of 2\n", tmpstr, 2); } else { - out += sprintf(out, "max_gain: %8d %18s %8d\n", + out += sprintf(out, "max_gain: %8d %18s %8d powers of 2\n", 1<<(cam->params.exposure.gainMode-1), tmpstr, 2); } switch(cam->params.exposure.expMode) { @@ -1423,10 +1426,11 @@ { char name[7]; - if(cam->proc_entry == NULL) return; + if(cam == NULL || cam->proc_entry == NULL) return; sprintf(name, "video%d", cam->vdev.minor); remove_proc_entry(name, cpia_proc_root); + cam->proc_entry = NULL; } static void proc_cpia_create(void) @@ -1706,6 +1710,10 @@ retval = cam->ops->transferCmd(cam->lowlevel_data, cmd, data); if(retval) { LOG("%x - failed\n", command); + if (command == CPIA_COMMAND_GetColourParams || + command == CPIA_COMMAND_GetColourBalance || + command == CPIA_COMMAND_GetExposure) + up(&cam->param_lock); } else { switch(command) { case CPIA_COMMAND_GetCPIAVersion: @@ -1895,6 +1903,7 @@ static int skipcount(int count, int fmt) { switch(fmt) { case VIDEO_PALETTE_GREY: + return count; case VIDEO_PALETTE_RGB555: case VIDEO_PALETTE_RGB565: case VIDEO_PALETTE_YUV422: @@ -2313,6 +2322,7 @@ return 0; } printstatus(cam); + mdelay(100); /* windows driver does it too */ return -1; } @@ -2530,7 +2540,8 @@ } /* Set ownership of /proc/cpia/videoX to current user */ - cam->proc_entry->uid = current->uid; + if(cam->proc_entry != NULL) + cam->proc_entry->uid = current->uid; /* set mark for loading first frame uncompressed */ cam->first_frame = 1; @@ -2585,7 +2596,8 @@ } /* Return ownership of /proc/cpia/videoX to root */ - cam->proc_entry->uid = 0; + if(cam->proc_entry != NULL) + cam->proc_entry->uid = 0; /* save camera state for later open (developers guide ch 3.5.3) */ save_camera_state(cam); @@ -3251,7 +3263,7 @@ unlock_kernel(); /* FIXME */ -#if 1 +#if 0 cam = camera[i]; /* open cpia */ if (cam->ops->open(cam->index, &cam->lowlevel_data)) { diff -urN v2.2.15/linux/drivers/char/cyclades.c linux/drivers/char/cyclades.c --- v2.2.15/linux/drivers/char/cyclades.c Wed May 3 17:16:33 2000 +++ linux/drivers/char/cyclades.c Wed Jun 7 14:26:42 2000 @@ -1,12 +1,12 @@ #undef BLOCKMOVE #define Z_WAKE static char rcsid[] = -"$Revision: 2.3.2.5 $$Date: 2000/01/19 14:35:33 $"; +"$Revision: 2.3.2.6 $$Date: 2000/05/05 13:56:05 $"; /* * linux/drivers/char/cyclades.c * - * This file contains the driver for the Cyclades Cyclom-Y multiport + * This file contains the driver for the Cyclades async multiport * serial boards. * * Initially written by Randolph Bentson . @@ -23,14 +23,17 @@ * * This version supports shared IRQ's (only for PCI boards). * - * This module exports the following rs232 io functions: - * int cy_init(void); - * int cy_open(struct tty_struct *tty, struct file *filp); - * and the following functions for modularization. - * int init_module(void); - * void cleanup_module(void); - * * $Log: cyclades.c,v $ + * Revision 2.3.2.6 2000/05/05 13:56:05 ivan + * Driver now reports physical instead of virtual memory addresses. + * Masks were added to some Cyclades-Z read accesses. + * Implemented workaround for PLX9050 bug that would cause a system lockup + * in certain systems, depending on the MMIO addresses allocated to the + * board. + * Changed the Tx interrupt programming in the CD1400 chips to boost up + * performance (Cyclom-Y only). + * Did some code "housekeeping". + * * Revision 2.3.2.5 2000/01/19 14:35:33 ivan * Fixed bug in cy_set_termios on CRTSCTS flag turnoff. * @@ -699,7 +702,7 @@ #ifndef SERIAL_XMIT_SIZE #define SERIAL_XMIT_SIZE (MIN(PAGE_SIZE, 4096)) #endif -#define WAKEUP_CHARS (SERIAL_XMIT_SIZE-256) +#define WAKEUP_CHARS 256 #define STD_COM_FLAGS (0) @@ -710,7 +713,7 @@ static struct tty_driver cy_serial_driver, cy_callout_driver; static int serial_refcount; -#ifndef CONFIG_COBALT_27 +#if defined(__i386__) || defined(__alpha__) /* This is the address lookup table. The driver will probe for Cyclom-Y/ISA boards at all addresses in here. If you want the driver to probe addresses at a different address, add it to @@ -741,7 +744,7 @@ MODULE_PARM(irq, "1-" __MODULE_STRING(NR_CARDS) "i"); #endif -#endif /* CONFIG_COBALT_27 */ +#endif /* (__i386__) || (__alpha__) */ /* This is the per-card data structure containing address, irq, number of channels, etc. This driver supports a maximum of NR_CARDS cards. @@ -865,12 +868,9 @@ static void cy_start(struct tty_struct *); static void set_line_char(struct cyclades_port *); static int cyz_issue_cmd(struct cyclades_card *, uclong, ucchar, uclong); -#ifndef CONFIG_COBALT_27 +#if defined(__i386__) || defined(__alpha__) static unsigned detect_isa_irq (volatile ucchar *); -#endif /* CONFIG_COBALT_27 */ -#ifdef CYCLOM_SHOW_STATUS -static void show_status(int); -#endif +#endif /* (__i386__) || (__alpha__) */ static int cyclades_get_proc_info(char *, char **, off_t , int , int *, void *); @@ -1011,7 +1011,7 @@ (tty->ldisc.write_wakeup)(tty); } wake_up_interruptible(&tty->write_wait); - wake_up_interruptible(&tty->poll_wait); + wake_up_interruptible(&tty->poll_wait); } #ifdef Z_WAKE if (test_and_clear_bit(Cy_EVENT_SHUTDOWN_WAKEUP, &info->event)) { @@ -1053,7 +1053,8 @@ return(0); } /* cyy_issue_cmd */ -#ifndef CONFIG_COBALT_27 /* ISA interrupt detection code */ +#if defined(__i386__) || defined(__alpha__) +/* ISA interrupt detection code */ static unsigned detect_isa_irq (volatile ucchar *address) { @@ -1080,7 +1081,7 @@ cy_writeb((u_long)address + (CyCAR< 0)? irq : 0; } -#endif /* CONFIG_COBALT_27 */ +#endif /* (__i386__) || (__alpha__) */ /* The real interrupt service routine is called whenever the card wants its hand held--chars @@ -1325,14 +1326,14 @@ /* validate the port# (as configured and open) */ if( (i < 0) || (NR_PORTS <= i) ){ cy_writeb((u_long)base_addr+(CySRER<last_active = jiffies; if(info->tty == 0){ cy_writeb((u_long)base_addr+(CySRER<xmit_cnt){ cy_writeb((u_long)base_addr+(CySRER<xmit_buf == 0){ cy_writeb((u_long)base_addr+(CySRER<tty->stopped || info->tty->hw_stopped){ cy_writeb((u_long)base_addr+(CySRER<tty->hw_stopped = 0; cy_writeb((u_long)base_addr+(CySRER<tty->hw_stopped = 1; cy_writeb((u_long)base_addr+(CySRER<base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; loc_doorbell = cy_readl(&((struct RUNTIME_9060 *) @@ -1563,7 +1565,8 @@ return (-1); } zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; index = 0; @@ -1780,7 +1783,8 @@ firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &(zfw_ctrl->board_ctrl); fw_ver = cy_readl(&board_ctrl->fw_version); hw_ver = cy_readl(&((struct RUNTIME_9060 *)(cinfo->ctl_addr))->mail_box_0); @@ -1957,7 +1961,8 @@ firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &(zfw_ctrl->board_ctrl); /* Skip first polling cycle to avoid racing conditions with the FW */ @@ -2097,9 +2102,9 @@ return -ENODEV; } - zfw_ctrl = - (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = zfw_ctrl->ch_ctrl; @@ -2207,7 +2212,7 @@ CY_LOCK(info, flags); cy_writeb((u_long)base_addr+(CyCAR<zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &(zfw_ctrl->board_ctrl); ch_ctrl = zfw_ctrl->ch_ctrl; @@ -2505,9 +2510,8 @@ return -EINVAL; } - zfw_ctrl = - (struct ZFW_CTRL *) - (base_addr + cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (base_addr + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = zfw_ctrl->ch_ctrl; @@ -2764,7 +2768,7 @@ index = cy_card[card].bus_index; base_addr = (unsigned char *) (cy_card[card].base_addr + (cy_chip_offset[chip]<card].base_addr; struct FIRM_ID *firm_id = (struct FIRM_ID *) (base_addr + ID_ADDRESS); - struct ZFW_CTRL *zfw_ctrl = - (struct ZFW_CTRL *) (base_addr + cy_readl(&firm_id->zfwctrl_addr)); + struct ZFW_CTRL *zfw_ctrl = (struct ZFW_CTRL *) + (base_addr + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); struct CH_CTRL *ch_ctrl = zfw_ctrl->ch_ctrl; int channel = info->line - cy_card[info->card].first_line; int retval; @@ -3144,8 +3148,9 @@ volatile uclong tx_put, tx_get, tx_bufsize; firm_id = (struct FIRM_ID *)(cy_card[card].base_addr + ID_ADDRESS); - zfw_ctrl = (struct ZFW_CTRL *) (cy_card[card].base_addr + - cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]); buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]); @@ -3434,8 +3439,9 @@ return; } - zfw_ctrl = (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]); buf_ctrl = &zfw_ctrl->buf_ctrl[channel]; @@ -3667,8 +3673,9 @@ firm_id = (struct FIRM_ID *) (cy_card[card].base_addr + ID_ADDRESS); if (ISZLOADED(cy_card[card])) { - zfw_ctrl = (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = zfw_ctrl->ch_ctrl; lstatus = cy_readl(&ch_ctrl[channel].rs_status); @@ -3832,8 +3839,9 @@ firm_id = (struct FIRM_ID *) (cy_card[card].base_addr + ID_ADDRESS); if (ISZLOADED(cy_card[card])) { - zfw_ctrl = (struct ZFW_CTRL *) - (cy_card[card].base_addr + cy_readl(&firm_id->zfwctrl_addr)); + zfw_ctrl = (struct ZFW_CTRL *) + (cy_card[card].base_addr + + (cy_readl(&firm_id->zfwctrl_addr) & 0xfffff)); board_ctrl = &zfw_ctrl->board_ctrl; ch_ctrl = zfw_ctrl->ch_ctrl; @@ -4510,7 +4518,7 @@ cy_writeb((u_long)base_addr+(CyCAR<irq; - cy_pci_addr0 = pdev->base_address[0]; - cy_pci_addr1 = pdev->base_address[1]; - cy_pci_addr2 = pdev->base_address[2]; - pci_read_config_byte(pdev, PCI_REVISION_ID, &cyy_rev_id); + cy_pci_phys0 = pdev->base_address[0]; + cy_pci_phys2 = pdev->base_address[2]; + pci_read_config_byte(pdev, PCI_REVISION_ID, &cyy_rev_id); device_id &= ~PCI_DEVICE_ID_MASK; @@ -4901,15 +4910,15 @@ printk("rev_id=%d) IRQ%d\n", cyy_rev_id, (int)cy_pci_irq); printk("Cyclom-Y/PCI:found winaddr=0x%lx ctladdr=0x%lx\n", - (ulong)cy_pci_addr2, (ulong)cy_pci_addr0); + (ulong)cy_pci_phys2, (ulong)cy_pci_phys0); #endif - cy_pci_addr0 &= PCI_BASE_ADDRESS_MEM_MASK; - cy_pci_addr2 &= PCI_BASE_ADDRESS_MEM_MASK; + cy_pci_phys0 &= PCI_BASE_ADDRESS_MEM_MASK; + cy_pci_phys2 &= PCI_BASE_ADDRESS_MEM_MASK; - if (cy_pci_addr2 & ~PCI_BASE_ADDRESS_IO_MASK) { + if (cy_pci_phys2 & ~PCI_BASE_ADDRESS_IO_MASK) { printk(" Warning: PCI I/O bit incorrectly set. " "Ignoring it...\n"); - cy_pci_addr2 &= PCI_BASE_ADDRESS_IO_MASK; + cy_pci_phys2 &= PCI_BASE_ADDRESS_IO_MASK; } #if defined(__alpha__) @@ -4919,15 +4928,15 @@ printk("rev_id=%d) IRQ%d\n", cyy_rev_id, (int)cy_pci_irq); printk("Cyclom-Y/PCI:found winaddr=0x%lx ctladdr=0x%lx\n", - (ulong)cy_pci_addr2, (ulong)cy_pci_addr0); + (ulong)cy_pci_phys2, (ulong)cy_pci_phys0); printk("Cyclom-Y/PCI not supported for low addresses in " "Alpha systems.\n"); i--; continue; } #else - cy_pci_addr0 = (ulong)ioremap(cy_pci_addr0, CyPCI_Yctl); - cy_pci_addr2 = (ulong)ioremap(cy_pci_addr2, CyPCI_Ywin); + cy_pci_addr0 = (ulong)ioremap(cy_pci_phys0, CyPCI_Yctl); + cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Ywin); #endif #ifdef CY_PCI_DEBUG @@ -4939,13 +4948,13 @@ if(cy_pci_nchan == 0) { printk("Cyclom-Y PCI host card with "); printk("no Serial-Modules at 0x%lx.\n", - (ulong) cy_pci_addr2); + (ulong) cy_pci_phys2); i--; continue; } if((cy_next_channel+cy_pci_nchan) > NR_PORTS) { printk("Cyclom-Y/PCI found at 0x%lx ", - (ulong) cy_pci_addr2); + (ulong) cy_pci_phys2); printk("but no channels are available.\n"); printk("Change NR_PORTS in cyclades.c and recompile kernel.\n"); return(i); @@ -4956,7 +4965,7 @@ } if (j == NR_CARDS) { /* no more cy_cards available */ printk("Cyclom-Y/PCI found at 0x%lx ", - (ulong) cy_pci_addr2); + (ulong) cy_pci_phys2); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); return(i); @@ -4967,13 +4976,15 @@ SA_SHIRQ, "Cyclom-Y", &cy_card[j])) { printk("Cyclom-Y/PCI found at 0x%lx ", - (ulong) cy_pci_addr2); + (ulong) cy_pci_phys2); printk("but could not allocate IRQ%d.\n", cy_pci_irq); return(i); } /* set cy_card */ + cy_card[j].base_phys = (ulong)cy_pci_phys2; + cy_card[j].ctl_phys = (ulong)cy_pci_phys0; cy_card[j].base_addr = (ulong)cy_pci_addr2; cy_card[j].ctl_addr = (ulong)cy_pci_addr0; cy_card[j].irq = (int) cy_pci_irq; @@ -4986,10 +4997,7 @@ switch (plx_ver) { case PLX_9050: - plx_init(cy_pci_addr0, 0x50); - - cy_writew(cy_pci_addr0+0x4c, - cy_readw(cy_pci_addr0+0x4c)|0x0040); + cy_writeb(cy_pci_addr0+0x4c, 0x43); break; case PLX_9060: @@ -5011,8 +5019,8 @@ /* print message */ printk("Cyclom-Y/PCI #%d: 0x%lx-0x%lx, IRQ%d, ", j+1, - (ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Ywin - 1), + (ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Ywin - 1), (int)cy_pci_irq); printk("%d channels starting from port %d.\n", cy_pci_nchan, cy_next_channel); @@ -5025,7 +5033,7 @@ printk("rev_id=%d) IRQ%d\n", cyy_rev_id, (int)cy_pci_irq); printk("Cyclades-Z/PCI: found winaddr=0x%lx ctladdr=0x%lx\n", - (ulong)cy_pci_addr2, (ulong)cy_pci_addr0); + (ulong)cy_pci_phys2, (ulong)cy_pci_phys0); printk("Cyclades-Z/PCI not supported for low addresses\n"); break; }else if (device_id == PCI_DEVICE_ID_CYCLOM_Z_Hi){ @@ -5035,11 +5043,18 @@ printk("rev_id=%d) IRQ%d\n", cyy_rev_id, (int)cy_pci_irq); printk("Cyclades-Z/PCI: found winaddr=0x%lx ctladdr=0x%lx\n", - (ulong)cy_pci_addr2, (ulong)cy_pci_addr0); + (ulong)cy_pci_phys2, (ulong)cy_pci_phys0); #endif - cy_pci_addr0 &= PCI_BASE_ADDRESS_MEM_MASK; + cy_pci_phys0 &= PCI_BASE_ADDRESS_MEM_MASK; + cy_pci_phys2 &= PCI_BASE_ADDRESS_MEM_MASK; + + if (cy_pci_phys2 & ~PCI_BASE_ADDRESS_IO_MASK) { + printk(" Warning: PCI I/O bit incorrectly set. " + "Ignoring it...\n"); + cy_pci_phys2 &= PCI_BASE_ADDRESS_IO_MASK; + } #if !defined(__alpha__) - cy_pci_addr0 = (ulong)ioremap(cy_pci_addr0, CyPCI_Zctl); + cy_pci_addr0 = (ulong)ioremap(cy_pci_phys0, CyPCI_Zctl); #endif /* Disable interrupts on the PLX before resetting it */ @@ -5055,23 +5070,18 @@ mailbox = (uclong)cy_readl(&((struct RUNTIME_9060 *) cy_pci_addr0)->mail_box_0); - cy_pci_addr2 &= PCI_BASE_ADDRESS_MEM_MASK; - - if (cy_pci_addr2 & ~PCI_BASE_ADDRESS_IO_MASK) { - printk(" Warning: PCI I/O bit incorrectly set. " - "Ignoring it...\n"); - cy_pci_addr2 &= PCI_BASE_ADDRESS_IO_MASK; - } if (mailbox == ZE_V1) { #if !defined(__alpha__) - cy_pci_addr2 = (ulong)ioremap(cy_pci_addr2, CyPCI_Ze_win); + cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Ze_win); #endif if (ZeIndex == NR_CARDS) { printk("Cyclades-Ze/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); } else { + Ze_phys0[ZeIndex] = cy_pci_phys0; + Ze_phys2[ZeIndex] = cy_pci_phys2; Ze_addr0[ZeIndex] = cy_pci_addr0; Ze_addr2[ZeIndex] = cy_pci_addr2; Ze_irq[ZeIndex] = cy_pci_irq; @@ -5081,7 +5091,7 @@ continue; } else { #if !defined(__alpha__) - cy_pci_addr2 = (ulong)ioremap(cy_pci_addr2, CyPCI_Zwin); + cy_pci_addr2 = (ulong)ioremap(cy_pci_phys2, CyPCI_Zwin); #endif } @@ -5118,7 +5128,7 @@ if((cy_next_channel+cy_pci_nchan) > NR_PORTS) { printk("Cyclades-8Zo/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no channels are available.\n"); printk("Change NR_PORTS in cyclades.c and recompile kernel.\n"); return(i); @@ -5130,7 +5140,7 @@ } if (j == NR_CARDS) { /* no more cy_cards available */ printk("Cyclades-8Zo/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); return(i); @@ -5142,10 +5152,10 @@ if(request_irq(cy_pci_irq, cyz_interrupt, SA_SHIRQ, "Cyclades-Z", &cy_card[j])) { - printk("Could not allocate IRQ%d ", + printk("Cyclades-8Zo/PCI found at 0x%lx ", + (ulong) cy_pci_phys2); + printk("but could not allocate IRQ%d.\n", cy_pci_irq); - printk("for Cyclades-8Zo/PCI at 0x%lx.\n", - (ulong)cy_pci_addr2); return(i); } } @@ -5153,6 +5163,8 @@ /* set cy_card */ + cy_card[j].base_phys = cy_pci_phys2; + cy_card[j].ctl_phys = cy_pci_phys0; cy_card[j].base_addr = cy_pci_addr2; cy_card[j].ctl_addr = cy_pci_addr0; cy_card[j].irq = (int) cy_pci_irq; @@ -5165,14 +5177,14 @@ /* don't report IRQ if board is no IRQ */ if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) printk("Cyclades-8Zo/PCI #%d: 0x%lx-0x%lx, IRQ%d, ", - j+1,(ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Zwin - 1), + j+1,(ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Zwin - 1), (int)cy_pci_irq); else #endif /* CONFIG_CYZ_INTR */ printk("Cyclades-8Zo/PCI #%d: 0x%lx-0x%lx, ", - j+1,(ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Zwin - 1)); + j+1,(ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Zwin - 1)); printk("%d channels starting from port %d.\n", cy_pci_nchan,cy_next_channel); @@ -5181,10 +5193,14 @@ } for (; ZeIndex != 0 && i < NR_CARDS; i++) { + cy_pci_phys0 = Ze_phys0[0]; + cy_pci_phys2 = Ze_phys2[0]; cy_pci_addr0 = Ze_addr0[0]; cy_pci_addr2 = Ze_addr2[0]; cy_pci_irq = Ze_irq[0]; for (j = 0 ; j < ZeIndex-1 ; j++) { + Ze_phys0[j] = Ze_phys0[j+1]; + Ze_phys2[j] = Ze_phys2[j+1]; Ze_addr0[j] = Ze_addr0[j+1]; Ze_addr2[j] = Ze_addr2[j+1]; Ze_irq[j] = Ze_irq[j+1]; @@ -5203,7 +5219,7 @@ if((cy_next_channel+cy_pci_nchan) > NR_PORTS) { printk("Cyclades-Ze/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no channels are available.\n"); printk("Change NR_PORTS in cyclades.c and recompile kernel.\n"); return(i); @@ -5215,7 +5231,7 @@ } if (j == NR_CARDS) { /* no more cy_cards available */ printk("Cyclades-Ze/PCI found at 0x%lx ", - (ulong)cy_pci_addr2); + (ulong)cy_pci_phys2); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); return(i); @@ -5227,16 +5243,18 @@ if(request_irq(cy_pci_irq, cyz_interrupt, SA_SHIRQ, "Cyclades-Z", &cy_card[j])) { - printk("Could not allocate IRQ%d ", + printk("Cyclades-Ze/PCI found at 0x%lx ", + (ulong) cy_pci_phys2); + printk("but could not allocate IRQ%d.\n", cy_pci_irq); - printk("for Cyclades-Ze/PCI at 0x%lx.\n", - (ulong) cy_pci_addr2); return(i); } } #endif /* CONFIG_CYZ_INTR */ /* set cy_card */ + cy_card[j].base_phys = cy_pci_phys2; + cy_card[j].ctl_phys = cy_pci_phys0; cy_card[j].base_addr = cy_pci_addr2; cy_card[j].ctl_addr = cy_pci_addr0; cy_card[j].irq = (int) cy_pci_irq; @@ -5249,14 +5267,14 @@ /* don't report IRQ if board is no IRQ */ if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) printk("Cyclades-Ze/PCI #%d: 0x%lx-0x%lx, IRQ%d, ", - j+1,(ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Ze_win - 1), + j+1,(ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Ze_win - 1), (int)cy_pci_irq); else #endif /* CONFIG_CYZ_INTR */ printk("Cyclades-Ze/PCI #%d: 0x%lx-0x%lx, ", - j+1,(ulong)cy_pci_addr2, - (ulong)(cy_pci_addr2 + CyPCI_Ze_win - 1)); + j+1,(ulong)cy_pci_phys2, + (ulong)(cy_pci_phys2 + CyPCI_Ze_win - 1)); printk("%d channels starting from port %d.\n", cy_pci_nchan,cy_next_channel); @@ -5264,7 +5282,7 @@ } if (ZeIndex != 0) { printk("Cyclades-Ze/PCI found at 0x%x ", - (unsigned int) Ze_addr2[0]); + (unsigned int) Ze_phys2[0]); printk("but no more cards can be used.\n"); printk("Change NR_CARDS in cyclades.c and recompile kernel.\n"); } @@ -5451,10 +5469,8 @@ availability of cy_card and cy_port data structures and updating the cy_next_channel. */ -#ifndef CONFIG_COBALT_27 /* look for isa boards */ cy_isa_nboard = cy_detect_isa(); -#endif /* CONFIG_COBALT_27 */ /* look for pci boards */ cy_pci_nboard = cy_detect_pci(); @@ -5581,9 +5597,10 @@ info->icount.frame = info->icount.parity = 0; info->icount.overrun = info->icount.brk = 0; chip_number = (port - cinfo->first_line) / 4; - if ((info->chip_rev = cy_readb(cinfo->base_addr + - (cy_chip_offset[chip_number]<= CD1400_REV_J) { + if ((info->chip_rev = + cy_readb(cinfo->base_addr + + (cy_chip_offset[chip_number]<= CD1400_REV_J) { /* It is a CD1400 rev. J or later */ info->tbpr = baud_bpr_60[13]; /* Tx BPR */ info->tco = baud_co_60[13]; /* Tx CO */ @@ -5693,12 +5710,12 @@ tmp_buf = NULL; } } /* cleanup_module */ -#else +#else /* MODULE */ /* called by linux/init/main.c to parse command line options */ void cy_setup(char *str, int *ints) { -#ifndef CONFIG_COBALT_27 +#if defined(__i386__) || defined(__alpha__) int i, j; for (i = 0 ; i < NR_ISA_ADDRS ; i++) { @@ -5709,110 +5726,7 @@ cy_isa_addresses[i++] = (unsigned char *)(ints[j]); } } -#endif /* CONFIG_COBALT_27 */ - +#endif /* (__i386__) || (__alpha__) */ } /* cy_setup */ -#endif - - -#ifdef CYCLOM_SHOW_STATUS -static void -show_status(int line_num) -{ - unsigned char *base_addr; - int card,chip,channel,index; - struct cyclades_port * info; - unsigned long flags; - - info = &cy_port[line_num]; - card = info->card; - index = cy_card[card].bus_index; - channel = (info->line) - (cy_card[card].first_line); - chip = channel>>2; - channel &= 0x03; - printk(" card %d, chip %d, channel %d\n", card, chip, channel);/**/ - - printk(" cy_card\n"); - printk(" irq base_addr num_chips first_line = %d %lx %d %d\n", - cy_card[card].irq, (long)cy_card[card].base_addr, - cy_card[card].num_chips, cy_card[card].first_line); - - printk(" cy_port\n"); - printk(" card line flags = %d %d %x\n", - info->card, info->line, info->flags); - printk(" *tty read_status_mask timeout xmit_fifo_size ", - printk("= %lx %x %x %x\n", - (long)info->tty, info->read_status_mask, - info->timeout, info->xmit_fifo_size); - printk(" cor1,cor2,cor3,cor4,cor5 = %x %x %x %x %x\n", - info->cor1, info->cor2, info->cor3, info->cor4, info->cor5); - printk(" tbpr,tco,rbpr,rco = %d %d %d %d\n", - info->tbpr, info->tco, info->rbpr, info->rco); - printk(" close_delay event count = %d %d %d\n", - info->close_delay, info->event, info->count); - printk(" x_char blocked_open = %x %x\n", - info->x_char, info->blocked_open); - printk(" session pgrp open_wait = %lx %lx %lx\n", - info->session, info->pgrp, (long)info->open_wait); - - CY_LOCK(info, flags); - - base_addr = (unsigned char*) - (cy_card[card].base_addr - + (cy_chip_offset[chip]<= pB->i2eChannelCnt || - (pCh = (((i2ChanStrPtr*)pB->i2eChannelPtr)[channel])) == NULL) + if ((channel >= pB->i2eChannelCnt) || + (NULL==(pCh = ((i2ChanStrPtr*)pB->i2eChannelPtr)[channel]))) { iiReadBuf(pB, junkBuffer, count); WRITE_UNLOCK_IRQRESTORE(&pB->read_fifo_spinlock,bflags); @@ -1544,7 +1544,8 @@ // Normal data! We crudely assume there is room for the data in our // buffer because the board wouldn't have exceeded his credit limit. - WRITE_LOCK_IRQSAVE(&pCh->Ibuf_spinlock,cflags);// We have 2 locks now + WRITE_LOCK_IRQSAVE(&pCh->Ibuf_spinlock,cflags); + // We have 2 locks now stuffIndex = pCh->Ibuf_stuff; amountToRead = IBUF_SIZE - stuffIndex; if (amountToRead > count) @@ -1555,6 +1556,7 @@ // one. iiReadBuf(pB, &(pCh->Ibuf[stuffIndex]), amountToRead); + pCh->icount.rx += amountToRead; // Update the stuffIndex by the amount of data moved. Note we could // never ask for more data than would just fit. However, we might @@ -1579,6 +1581,7 @@ if (count > amountToRead) { amountToRead = count - amountToRead; iiReadBuf(pB, &(pCh->Ibuf[stuffIndex]), amountToRead); + pCh->icount.rx += amountToRead; stuffIndex += amountToRead; } @@ -1635,7 +1638,7 @@ if ( !(pCh->dataSetIn & I2_CTS) ) { pCh->dataSetIn |= I2_DCTS; - ++pCh->icount.cts; + pCh->icount.cts++; dss_change = 1; } pCh->dataSetIn |= I2_CTS; @@ -1645,7 +1648,7 @@ if ( pCh->dataSetIn & I2_CTS ) { pCh->dataSetIn |= I2_DCTS; - ++pCh->icount.cts; + pCh->icount.cts++; dss_change = 1; } pCh->dataSetIn &= ~I2_CTS; @@ -1661,7 +1664,7 @@ ip2trace (CHANN, ITRC_MODEM, 2, 0 ); #endif pCh->dataSetIn |= I2_DDCD; - ++pCh->icount.dcd; + pCh->icount.dcd++; dss_change = 1; } pCh->dataSetIn |= I2_DCD; @@ -1680,7 +1683,7 @@ ip2trace (channel, ITRC_MODEM, 5, 0 ); #endif pCh->dataSetIn |= I2_DDCD; - ++pCh->icount.dcd; + pCh->icount.dcd++; dss_change = 1; } pCh->dataSetIn &= ~I2_DCD; @@ -1693,7 +1696,7 @@ if ( !(pCh->dataSetIn & I2_DSR) ) { pCh->dataSetIn |= I2_DDSR; - ++pCh->icount.dsr; + pCh->icount.dsr++; dss_change = 1; } pCh->dataSetIn |= I2_DSR; @@ -1703,7 +1706,7 @@ if ( pCh->dataSetIn & I2_DSR ) { pCh->dataSetIn |= I2_DDSR; - ++pCh->icount.dsr; + pCh->icount.dsr++; dss_change = 1; } pCh->dataSetIn &= ~I2_DSR; @@ -1713,23 +1716,26 @@ if ( !(pCh->dataSetIn & I2_RI) ) { pCh->dataSetIn |= I2_DRI; - ++pCh->icount.rng; + pCh->icount.rng++; dss_change = 1; } pCh->dataSetIn |= I2_RI ; break; case STAT_RI_DN: - if ( pCh->dataSetIn & I2_RI ) - { - pCh->dataSetIn |= I2_DRI; - dss_change = 1; - } + // to be compat with serial.c + //if ( pCh->dataSetIn & I2_RI ) + //{ + // pCh->dataSetIn |= I2_DRI; + // pCh->icount.rng++; + // dss_change = 1; + //} pCh->dataSetIn &= ~I2_RI ; break; case STAT_BRK_DET: pCh->dataSetIn |= I2_BRK; + pCh->icount.brk++; dss_change = 1; break; @@ -1794,9 +1800,6 @@ case STAT_BOXIDS: pB->channelBtypes = *((bidStatPtr)pc); pc += sizeof(bidStat); -//printk("boxids: %x %x %x %x\n", -// pB->channelBtypes.bid_value[0],pB->channelBtypes.bid_value[1], -// pB->channelBtypes.bid_value[2],pB->channelBtypes.bid_value[3]); set_baud_params(pB); break; @@ -1813,18 +1816,26 @@ switch (uc & STAT_MOD_ERROR) { case STAT_ERROR: - if (uc & STAT_E_PARITY) + if (uc & STAT_E_PARITY) { pCh->dataSetIn |= I2_PAR; - if (uc & STAT_E_FRAMING) + pCh->icount.parity++; + } + if (uc & STAT_E_FRAMING){ pCh->dataSetIn |= I2_FRA; - if (uc & STAT_E_OVERRUN) + pCh->icount.frame++; + } + if (uc & STAT_E_OVERRUN){ pCh->dataSetIn |= I2_OVR; + pCh->icount.overrun++; + } break; case STAT_MODEM: + // the answer to DSS_NOW request (not change) pCh->dataSetIn = (pCh->dataSetIn & ~(I2_RI | I2_CTS | I2_DCD | I2_DSR) ) | xlatDss[uc & 0xf]; + wake_up_interruptible ( &pCh->dss_now_wait ); default: break; } @@ -1849,16 +1860,6 @@ pc += 4; /* Skip the data */ break; - case STAT_CTS_UP: - case STAT_CTS_DN: - case STAT_DCD_UP: - case STAT_DCD_DN: - case STAT_DSR_UP: - case STAT_DSR_DN: - case STAT_RI_UP: - case STAT_RI_DN: - case STAT_BRK_DET: - case STAT_BMARK: default: break; } @@ -2105,6 +2106,7 @@ #endif /* DEBUG_FIFO */ pB->debugInlineCount++; + pCh->icount.tx += flowsize; // Update current credits pCh->outfl.room -= flowsize; pCh->outfl.asof += flowsize; diff -urN v2.2.15/linux/drivers/char/ip2/i2lib.h linux/drivers/char/ip2/i2lib.h --- v2.2.15/linux/drivers/char/ip2/i2lib.h Wed Aug 25 17:29:47 1999 +++ linux/drivers/char/ip2/i2lib.h Wed Jun 7 14:26:42 2000 @@ -67,8 +67,8 @@ // #define MAX_CBUF_BLOCK 6 // Maximum total length of a bypass command block -#define IBUF_SIZE 500 // character capacity of input buffer per channel -#define OBUF_SIZE 2048// character capacity of output buffer per channel +#define IBUF_SIZE 512 // character capacity of input buffer per channel +#define OBUF_SIZE 1024// character capacity of output buffer per channel #define CBUF_SIZE 10 // character capacity of output bypass buffer typedef struct _i2ChanStr @@ -97,6 +97,7 @@ PWAITQ open_wait; // Pointer for OS sleep function. PWAITQ close_wait; // Pointer for OS sleep function. PWAITQ delta_msr_wait;// Pointer for OS sleep function. + PWAITQ dss_now_wait; // Pointer for OS sleep function. struct timer_list BookmarkTimer; // Used by i2DrainOutput struct wait_queue *pBookmarkWait; // Used by i2DrainOutput @@ -215,7 +216,6 @@ void (*trace)(unsigned short,unsigned char,unsigned char,unsigned long,...); -#ifdef __KERNEL__ /* * Kernel counters for the 4 input interrupts */ @@ -227,7 +227,6 @@ struct tq_struct tqueue_input; struct tq_struct tqueue_status; struct tq_struct tqueue_hangup; -#endif spinlock_t Ibuf_spinlock; spinlock_t Obuf_spinlock; diff -urN v2.2.15/linux/drivers/char/ip2/ip2mkdev.c linux/drivers/char/ip2/ip2mkdev.c --- v2.2.15/linux/drivers/char/ip2/ip2mkdev.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/char/ip2/ip2mkdev.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include +#include + +#include "ip2.h" +#include "i2ellis.h" + +char nm[256]; +i2eBordStr Board[2]; + +static void ex_details(i2eBordStrPtr); + +int main (int argc, char *argv[]) +{ + int board, box, port; + int fd; + int dev; + i2eBordStrPtr pB = Board; + + // Remove all IP2 devices + + for ( board = 0; board < 4; ++board ) + { + sprintf ( nm, "/dev/ip2ipl%d", board ); + unlink ( nm ); + sprintf ( nm, "/dev/ip2stat%d", board ); + unlink ( nm ); + } + + for ( port = 0; port < 256; ++port ) + { + sprintf ( nm, "/dev/ttyF%d", port ); + unlink ( nm ); + sprintf ( nm, "/dev/cuf%d", port ); + unlink ( nm ); + } + + // Now create management devices, and use the status device to determine how + // port devices need to exist, and then create them. + + for ( board = 0; board < 4; ++board ) + { + printf("Board %d: ", board ); + + sprintf ( nm, "/dev/ip2ipl%d", board ); + mknod ( nm, S_IFCHR|0666, (IP2_IPL_MAJOR << 8) | board * 4 ); + sprintf ( nm, "/dev/ip2stat%d", board ); + mknod ( nm, S_IFCHR|0666, (IP2_IPL_MAJOR << 8) | board * 4 + 1 ); + + fd = open ( nm, O_RDONLY ); + if ( !fd ) + { + printf ( "Unable to open status device %s\n", nm ); + exit ( 1 ); + } + if ( ioctl ( fd, 65, Board ) < 0 ) + { + printf ( "not present\n" ); + close ( fd ); + unlink ( nm ); + sprintf ( nm, "/dev/ip2ipl%d", board ); + unlink ( nm ); + } + else + { + switch( pB->i2ePom.e.porID & ~POR_ID_RESERVED ) + { + case POR_ID_FIIEX: ex_details ( pB ); break; + case POR_ID_II_4: printf ( "ISA-4" ); break; + case POR_ID_II_8: printf ( "ISA-8 std" ); break; + case POR_ID_II_8R: printf ( "ISA-8 RJ11" ); break; + + default: + printf ( "Unknown board type, ID = %x", pB->i2ePom.e.porID ); + } + + for ( box = 0; box < ABS_MAX_BOXES; ++box ) + { + for ( port = 0; port < ABS_BIGGEST_BOX; ++port ) + { + if ( pB->i2eChannelMap[box] & ( 1 << port ) ) + { + dev = port + + box * ABS_BIGGEST_BOX + + board * ABS_BIGGEST_BOX * ABS_MAX_BOXES; + + sprintf ( nm, "/dev/ttyF%d", dev ); + mknod ( nm, S_IFCHR|0666, (IP2_TTY_MAJOR << 8) | dev ); + sprintf ( nm, "/dev/cuf%d", dev ); + mknod ( nm, S_IFCHR|0666, (IP2_CALLOUT_MAJOR << 8) | dev ); + + printf("."); + } + } + } + printf("\n"); + } + } +} + +static void ex_details ( i2eBordStrPtr pB ) +{ + int box; + int i; + int ports = 0; + int boxes = 0; + + for( box = 0; box < ABS_MAX_BOXES; ++box ) + { + if( pB->i2eChannelMap[box] != 0 ) ++boxes; + for( i = 0; i < ABS_BIGGEST_BOX; ++i ) + { + if( pB->i2eChannelMap[box] & 1<< i ) ++ports; + } + } + + printf("EX bx=%d pt=%d %d bit", boxes, ports, pB->i2eDataWidth16 ? 16 : 8 ); +} + + diff -urN v2.2.15/linux/drivers/char/ip2/ip2stat.c linux/drivers/char/ip2/ip2stat.c --- v2.2.15/linux/drivers/char/ip2/ip2stat.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/char/ip2/ip2stat.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,115 @@ +/******************************************************************************* +* +* (c) 1998 by Computone Corporation +* +******************************************************************************** +* +* +* PACKAGE: Linux tty Device Driver for IntelliPort family of multiport +* serial I/O controllers. +* +* DESCRIPTION: Status display utility +* +*******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "i2ellis.h" +#include "i2lib.h" + +i2eBordStr Board[2]; +i2ChanStr Port[2]; + +struct driver_stats +{ + ULONG ref_count; + ULONG irq_counter; + ULONG bh_counter; +} Driver; + +char devname[20]; + +int main (int argc, char *argv[]) +{ + int fd; + int dev, i; + i2eBordStrPtr pB = Board; + i2ChanStrPtr pCh = Port; + + if ( argc != 2 ) + { + printf ( "Usage: %s \n", argv[0] ); + exit(1); + } + i = sscanf ( argv[1], "/dev/ttyF%d", &dev ); + + if ( i != 1 ) exit(1); + + //printf("%s: board %d, port %d\n", argv[1], dev / 64, dev % 64 ); + + sprintf ( devname, "/dev/ip2stat%d", dev / 64 ); + if( 0 > ( fd = open ( devname, O_RDONLY ) ) ) { + // Conventional name failed - try devfs name + sprintf ( devname, "/dev/ip2/stat%d", dev / 64 ); + if( 0 > ( fd = open ( devname, O_RDONLY ) ) ) { + // Where is our board??? + printf( "Unable to open board %d to retrieve stats\n", + dev / 64 ); + exit( 255 ); + } + } + + ioctl ( fd, 64, &Driver ); + ioctl ( fd, 65, Board ); + ioctl ( fd, dev % 64, Port ); + + printf ( "Driver statistics:-\n" ); + printf ( " Reference Count: %d\n", Driver.ref_count ); + printf ( " Interrupts to date: %ld\n", Driver.irq_counter ); + printf ( " Bottom half to date: %ld\n", Driver.bh_counter ); + + printf ( "Board statistics(%d):-\n",dev/64 ); + printf ( "FIFO: remains = %d%s\n", pB->i2eFifoRemains, + pB->i2eWaitingForEmptyFifo ? ", busy" : "" ); + printf ( "Mail: out mail = %02x\n", pB->i2eOutMailWaiting ); + printf ( " Input interrupts : %d\n", pB->i2eFifoInInts ); + printf ( " Output interrupts: %d\n", pB->i2eFifoOutInts ); + printf ( " Flow queued : %ld\n", pB->debugFlowQueued ); + printf ( " Bypass queued : %ld\n", pB->debugBypassQueued ); + printf ( " Inline queued : %ld\n", pB->debugInlineQueued ); + printf ( " Data queued : %ld\n", pB->debugDataQueued ); + printf ( " Flow packets : %ld\n", pB->debugFlowCount ); + printf ( " Bypass packets : %ld\n", pB->debugBypassCount ); + printf ( " Inline packets : %ld\n", pB->debugInlineCount ); + printf ( " Mail status : %x\n", pB->i2eStatus ); + printf ( " Output mail : %x\n", pB->i2eOutMailWaiting ); + printf ( " Fatal flag : %d\n", pB->i2eFatal ); + + printf ( "Channel statistics(%s:%d):-\n",argv[1],dev%64 ); + printf ( "ibuf: stuff = %d strip = %d\n", pCh->Ibuf_stuff, pCh->Ibuf_strip ); + printf ( "obuf: stuff = %d strip = %d\n", pCh->Obuf_stuff, pCh->Obuf_strip ); + printf ( "pbuf: stuff = %d\n", pCh->Pbuf_stuff ); + printf ( "cbuf: stuff = %d strip = %d\n", pCh->Cbuf_stuff, pCh->Cbuf_strip ); + printf ( "infl: count = %d room = %d\n", pCh->infl.asof, pCh->infl.room ); + printf ( "outfl: count = %d room = %d\n", pCh->outfl.asof, pCh->outfl.room ); + printf ( "throttled = %d ",pCh->throttled); + printf ( "bookmarks = %d ",pCh->bookMarks); + printf ( "flush_flags = %x\n",pCh->flush_flags); + printf ( "needs: "); + if (pCh->channelNeeds & NEED_FLOW) printf("FLOW "); + if (pCh->channelNeeds & NEED_INLINE) printf("INLINE "); + if (pCh->channelNeeds & NEED_BYPASS) printf("BYPASS "); + if (pCh->channelNeeds & NEED_CREDIT) printf("CREDIT "); + printf ( "\n"); + printf ( "dss: in = %x, out = %x\n",pCh->dataSetIn,pCh->dataSetOut); + +} diff -urN v2.2.15/linux/drivers/char/ip2/ip2trace.c linux/drivers/char/ip2/ip2trace.c --- v2.2.15/linux/drivers/char/ip2/ip2trace.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/char/ip2/ip2trace.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,279 @@ +/******************************************************************************* +* +* (c) 1998 by Computone Corporation +* +******************************************************************************** +* +* +* PACKAGE: Linux tty Device Driver for IntelliPort family of multiport +* serial I/O controllers. +* +* DESCRIPTION: Interpretive trace dump utility +* +*******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ip2trace.h" + +unsigned long namebuf[100]; + +struct { + int wrap, + size, + o_strip, + o_stuff, + strip, + stuff; + unsigned long buf[1000]; +} tbuf; + +struct sigaction act; + +typedef enum { kChar, kInt, kAddr, kHex } eFormat; + +int active = 1; +void quit() { active = 0; } + +int main (int argc, char *argv[]) +{ + int fd = open ( "/dev/ip2trace", O_RDONLY ); + int cnt, i; + unsigned long ts, td; + struct timeval timeout; + union ip2breadcrumb bc; + eFormat fmt = kHex; + + if ( fd < 0 ) + { + printf ( "Can't open device /dev/ip2trace\n" ); + exit ( 1 ); + } + + act.sa_handler = quit; + /*act.sa_mask = 0;*/ + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + act.sa_restorer = NULL; + + sigaction ( SIGTERM, &act, NULL ); + + ioctl ( fd, 1, namebuf ); + + printf ( "iiSendPendingMail %p\n", namebuf[0] ); + printf ( "i2InitChannels %p\n", namebuf[1] ); + printf ( "i2QueueNeeds %p\n", namebuf[2] ); + printf ( "i2QueueCommands %p\n", namebuf[3] ); + printf ( "i2GetStatus %p\n", namebuf[4] ); + printf ( "i2Input %p\n", namebuf[5] ); + printf ( "i2InputFlush %p\n", namebuf[6] ); + printf ( "i2Output %p\n", namebuf[7] ); + printf ( "i2FlushOutput %p\n", namebuf[8] ); + printf ( "i2DrainWakeup %p\n", namebuf[9] ); + printf ( "i2DrainOutput %p\n", namebuf[10] ); + printf ( "i2OutputFree %p\n", namebuf[11] ); + printf ( "i2StripFifo %p\n", namebuf[12] ); + printf ( "i2StuffFifoBypass %p\n", namebuf[13] ); + printf ( "i2StuffFifoFlow %p\n", namebuf[14] ); + printf ( "i2StuffFifoInline %p\n", namebuf[15] ); + printf ( "i2ServiceBoard %p\n", namebuf[16] ); + printf ( "serviceOutgoingFifo %p\n", namebuf[17] ); + printf ( "ip2_init %p\n", namebuf[18] ); + printf ( "ip2_init_board %p\n", namebuf[19] ); + printf ( "find_eisa_board %p\n", namebuf[20] ); + printf ( "set_irq %p\n", namebuf[21] ); + printf ( "ex_details %p\n", namebuf[22] ); + printf ( "ip2_interrupt %p\n", namebuf[23] ); + printf ( "ip2_poll %p\n", namebuf[24] ); + printf ( "service_all_boards %p\n", namebuf[25] ); + printf ( "do_input %p\n", namebuf[27] ); + printf ( "do_status %p\n", namebuf[26] ); + printf ( "open_sanity_check %p\n", namebuf[27] ); + printf ( "open_block_til_ready %p\n", namebuf[28] ); + printf ( "ip2_open %p\n", namebuf[29] ); + printf ( "ip2_close %p\n", namebuf[30] ); + printf ( "ip2_hangup %p\n", namebuf[31] ); + printf ( "ip2_write %p\n", namebuf[32] ); + printf ( "ip2_putchar %p\n", namebuf[33] ); + printf ( "ip2_flush_chars %p\n", namebuf[34] ); + printf ( "ip2_write_room %p\n", namebuf[35] ); + printf ( "ip2_chars_in_buf %p\n", namebuf[36] ); + printf ( "ip2_flush_buffer %p\n", namebuf[37] ); + //printf ( "ip2_wait_until_sent %p\n", namebuf[38] ); + printf ( "ip2_throttle %p\n", namebuf[39] ); + printf ( "ip2_unthrottle %p\n", namebuf[40] ); + printf ( "ip2_ioctl %p\n", namebuf[41] ); + printf ( "get_modem_info %p\n", namebuf[42] ); + printf ( "set_modem_info %p\n", namebuf[43] ); + printf ( "get_serial_info %p\n", namebuf[44] ); + printf ( "set_serial_info %p\n", namebuf[45] ); + printf ( "ip2_set_termios %p\n", namebuf[46] ); + printf ( "ip2_set_line_discipline %p\n", namebuf[47] ); + printf ( "set_line_characteristics %p\n", namebuf[48] ); + + printf("\n-------------------------\n"); + printf("Start of trace\n"); + + while ( active ) { + cnt = read ( fd, &tbuf, sizeof tbuf ); + + if ( cnt ) { + if ( tbuf.wrap ) { + printf ( "\nTrace buffer: wrap=%d, strip=%d, stuff=%d\n", + tbuf.wrap, tbuf.strip, tbuf.stuff ); + } + for ( i = 0, bc.value = 0; i < cnt; ++i ) { + if ( !bc.hdr.codes ) { + td = tbuf.buf[i] - ts; + ts = tbuf.buf[i++]; + bc.value = tbuf.buf[i]; + + printf ( "\n(%d) Port %3d ", ts, bc.hdr.port ); + + fmt = kHex; + + switch ( bc.hdr.cat ) + { + case ITRC_INIT: + printf ( "Init %d: ", bc.hdr.label ); + break; + + case ITRC_OPEN: + printf ( "Open %d: ", bc.hdr.label ); + break; + + case ITRC_CLOSE: + printf ( "Close %d: ", bc.hdr.label ); + break; + + case ITRC_DRAIN: + printf ( "Drain %d: ", bc.hdr.label ); + fmt = kInt; + break; + + case ITRC_IOCTL: + printf ( "Ioctl %d: ", bc.hdr.label ); + break; + + case ITRC_FLUSH: + printf ( "Flush %d: ", bc.hdr.label ); + break; + + case ITRC_STATUS: + printf ( "GetS %d: ", bc.hdr.label ); + break; + + case ITRC_HANGUP: + printf ( "Hangup %d: ", bc.hdr.label ); + break; + + case ITRC_INTR: + printf ( "*Intr %d: ", bc.hdr.label ); + break; + + case ITRC_SFLOW: + printf ( "SFlow %d: ", bc.hdr.label ); + fmt = kInt; + break; + + case ITRC_SBCMD: + printf ( "Bypass CMD %d: ", bc.hdr.label ); + fmt = kInt; + break; + + case ITRC_SICMD: + printf ( "Inline CMD %d: ", bc.hdr.label ); + fmt = kInt; + break; + + case ITRC_MODEM: + printf ( "Modem %d: ", bc.hdr.label ); + break; + + case ITRC_INPUT: + printf ( "Input %d: ", bc.hdr.label ); + break; + + case ITRC_OUTPUT: + printf ( "Output %d: ", bc.hdr.label ); + fmt = kInt; + break; + + case ITRC_PUTC: + printf ( "Put char %d: ", bc.hdr.label ); + fmt = kChar; + break; + + case ITRC_QUEUE: + printf ( "Queue CMD %d: ", bc.hdr.label ); + fmt = kInt; + break; + + case ITRC_STFLW: + printf ( "Stat Flow %d: ", bc.hdr.label ); + fmt = kInt; + break; + + case ITRC_SFIFO: + printf ( "SFifo %d: ", bc.hdr.label ); + break; + + case ITRC_VERIFY: + printf ( "Verfy %d: ", bc.hdr.label ); + fmt = kHex; + break; + + case ITRC_WRITE: + printf ( "Write %d: ", bc.hdr.label ); + fmt = kChar; + break; + + case ITRC_ERROR: + printf ( "ERROR %d: ", bc.hdr.label ); + fmt = kInt; + break; + + default: + printf ( "%08x ", tbuf.buf[i] ); + break; + } + } + else + { + --bc.hdr.codes; + switch ( fmt ) + { + case kChar: + printf ( "%c (0x%02x) ", + isprint ( tbuf.buf[i] ) ? tbuf.buf[i] : '.', tbuf.buf[i] ); + break; + case kInt: + printf ( "%d ", tbuf.buf[i] ); + break; + + case kAddr: + case kHex: + printf ( "0x%x ", tbuf.buf[i] ); + break; + } + } + } + } + fflush ( stdout ); + timeout.tv_sec = 0; + timeout.tv_usec = 250; + select ( 0, NULL, NULL, NULL, &timeout ); + + } + printf("\n-------------------------\n"); + printf("End of trace\n"); + + close ( fd ); +} + diff -urN v2.2.15/linux/drivers/char/ip2/ip2trace.h linux/drivers/char/ip2/ip2trace.h --- v2.2.15/linux/drivers/char/ip2/ip2trace.h Wed Aug 25 17:29:47 1999 +++ linux/drivers/char/ip2/ip2trace.h Wed Jun 7 14:26:42 2000 @@ -9,7 +9,6 @@ }; #define ITRC_NO_PORT 0xFF -#define PORTN (port->port_index) #define CHANN (pCh->port_index) #define ITRC_ERROR '!' diff -urN v2.2.15/linux/drivers/char/ip2.c linux/drivers/char/ip2.c --- v2.2.15/linux/drivers/char/ip2.c Wed Aug 25 17:29:47 1999 +++ linux/drivers/char/ip2.c Wed Jun 7 14:26:42 2000 @@ -12,6 +12,16 @@ #include #include +#ifndef __init +#define __init +#endif +#ifndef __initfunc +#define __initfunc(a) a +#endif +#ifndef __initdata +#define __initdata +#endif + #include "./ip2/ip2types.h" #include "./ip2/fip_firm.h" // the meat @@ -19,15 +29,26 @@ ip2_loadmain(int *, int *, unsigned char *, int ); // ref into ip2main.c #ifdef MODULE + +#include +#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS) +# define MODVERSIONS +#endif +#ifdef MODVERSIONS +# include +#endif + static int io[IP2_MAX_BOARDS]= { 0,}; static int irq[IP2_MAX_BOARDS] = { 0,}; -MODULE_AUTHOR("Doug McNash"); -MODULE_DESCRIPTION("Computone IntelliPort Plus Driver"); -MODULE_PARM(irq,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i"); -MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards"); -MODULE_PARM(io,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i"); -MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards"); +# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) + MODULE_AUTHOR("Doug McNash"); + MODULE_DESCRIPTION("Computone IntelliPort Plus Driver"); + MODULE_PARM(irq,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i"); + MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards"); + MODULE_PARM(io,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i"); + MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards"); +# endif /* LINUX_VERSION */ //====================================================================== diff -urN v2.2.15/linux/drivers/char/ip2main.c linux/drivers/char/ip2main.c --- v2.2.15/linux/drivers/char/ip2main.c Wed May 3 17:16:34 2000 +++ linux/drivers/char/ip2main.c Wed Jun 7 14:26:42 2000 @@ -10,12 +10,55 @@ * DESCRIPTION: Mainline code for the device driver * *******************************************************************************/ +// ToDo: +// +// Done: +// +// 1.2.9 +// Four box EX was barfing on >128k kmalloc, made structure smaller by +// reducing output buffer size +// +// 1.2.8 +// Device file system support (MHW) +// +// 1.2.7 +// Fixed +// Reload of ip2 without unloading ip2main hangs system on cat of /proc/modules +// +// 1.2.6 +//Fixes DCD problems +// DCD was not reported when CLOCAL was set on call to TIOCMGET +// +//Enhancements: +// TIOCMGET requests and waits for status return +// No DSS interrupts enabled except for DCD when needed +// +// For internal use only +// +//#define IP2DEBUG_INIT +//#define IP2DEBUG_OPEN +//#define IP2DEBUG_WRITE +//#define IP2DEBUG_READ +//#define IP2DEBUG_IOCTL +//#define IP2DEBUG_IPL + +//#define IP2DEBUG_TRACE +//#define DEBUG_FIFO + /************/ /* Includes */ /************/ +// Uncomment the following if you want it compiled with modversions +#ifdef MODULE +# include +# if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS) +# define MODVERSIONS +# endif +# ifdef MODVERSIONS +# include +# endif +#endif -#include -#include #include #include @@ -23,8 +66,13 @@ #include #include +#include +#include #include #include +#ifdef CONFIG_DEVFS_FS +#include +#endif #include #include #include @@ -51,13 +99,84 @@ #include #include -#include -#include -#include - -#include -#define pcibios_strerror(status) \ - printk( KERN_ERR "IP2: PCI error 0x%x \n", status ); +#ifndef KERNEL_VERSION +#define KERNEL_VERSION(ver,rel,seq) (((ver)<<16) | ((rel)<<8) | (seq)) +#endif + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) +# include +# include +# include +#else +# include +#endif + +// These VERSION switches maybe inexact because I simply don't know +// when the various features appeared in the 2.1.XX kernels. +// They are good enough for 2.0 vs 2.2 and if you are fooling with +// the 2.1.XX stuff then it would be trivial for you to fix. +// Most of these macros were stolen from some other drivers +// so blame them. + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,4) +# include +# define GET_USER(error,value,addr) error = get_user(value,addr) +# define COPY_FROM_USER(error,dest,src,size) error = copy_from_user(dest,src,size) ? -EFAULT : 0 +# define PUT_USER(error,value,addr) error = put_user(value,addr) +# define COPY_TO_USER(error,dest,src,size) error = copy_to_user(dest,src,size) ? -EFAULT : 0 + +# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,5) +# include +# define pcibios_strerror(status) \ + printk( KERN_ERR "IP2: PCI error 0x%x \n", status ); +# endif + +#else /* 2.0.x and 2.1.x before 2.1.4 */ + +# define proc_register_dynamic(a,b) proc_register(a,b) + +# define GET_USER(error,value,addr) \ + do { \ + error = verify_area (VERIFY_READ, (void *) addr, sizeof (value)); \ + if (error == 0) \ + value = get_user(addr); \ + } while (0) + +# define COPY_FROM_USER(error,dest,src,size) \ + do { \ + error = verify_area (VERIFY_READ, (void *) src, size); \ + if (error == 0) \ + memcpy_fromfs (dest, src, size); \ + } while (0) + +# define PUT_USER(error,value,addr) \ + do { \ + error = verify_area (VERIFY_WRITE, (void *) addr, sizeof (value)); \ + if (error == 0) \ + put_user (value, addr); \ + } while (0) + +# define COPY_TO_USER(error,dest,src,size) \ + do { \ + error = verify_area (VERIFY_WRITE, (void *) dest, size); \ + if (error == 0) \ + memcpy_tofs (dest, src, size); \ + } while (0) + +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) +#define __init +#define __initfunc(a) a +#define __initdata +#define ioremap(a,b) vremap((a),(b)) +#define iounmap(a) vfree((a)) +#define SERIAL_TYPE_NORMAL 1 +#define SERIAL_TYPE_CALLOUT 2 +#define schedule_timeout(a){current->timeout = jiffies + (a); schedule();} +#define signal_pending(a) ((a)->signal & ~(a)->blocked) +#define in_interrupt() intr_count +#endif #include "./ip2/ip2trace.h" #include "./ip2/ip2ioctl.h" @@ -94,12 +213,17 @@ /* String constants to identify ourselves */ static char *pcName = "Computone IntelliPort Plus multiport driver"; -static char *pcVersion = "1.2.4"; +static char *pcVersion = "1.2.9"; /* String constants for port names */ static char *pcDriver_name = "ip2"; -static char *pcTty = "ttyf"; +#ifdef CONFIG_DEVFS_FS +static char *pcTty = "ttf/%d"; +static char *pcCallout = "cuf/%d"; +#else +static char *pcTty = "ttyF"; static char *pcCallout = "cuf"; +#endif static char *pcIpl = "ip2ipl"; /* Serial subtype definitions */ @@ -151,12 +275,15 @@ static void ip2_wait_until_sent(PTTY,int); static void set_params (i2ChanStrPtr, struct termios *); -static int get_modem_info(i2ChanStrPtr, unsigned int *); static int set_modem_info(i2ChanStrPtr, unsigned int, unsigned int *); static int get_serial_info(i2ChanStrPtr, struct serial_struct *); static int set_serial_info(i2ChanStrPtr, struct serial_struct *); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) +static int ip2_ipl_read(struct inode *, char *, size_t , loff_t *); +#else static ssize_t ip2_ipl_read(struct file *, char *, size_t, loff_t *) ; +#endif static ssize_t ip2_ipl_write(struct file *, const char *, size_t, loff_t *); static int ip2_ipl_ioctl(struct inode *, struct file *, UINT, ULONG); static int ip2_ipl_open(struct inode *, struct file *); @@ -262,13 +389,14 @@ /* Configuration area for modprobe */ #ifdef MODULE -MODULE_AUTHOR("Doug McNash"); -MODULE_DESCRIPTION("Computone IntelliPort Plus Driver"); +# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) + MODULE_AUTHOR("Doug McNash"); + MODULE_DESCRIPTION("Computone IntelliPort Plus Driver"); +# endif /* LINUX_VERSION */ #endif /* MODULE */ static int poll_only = 0; -static int Pci_index = 0; static int Eisa_irq = 0; static int Eisa_slot = 0; @@ -392,8 +520,6 @@ #ifdef IP2DEBUG_INIT printk (KERN_DEBUG "Unloading %s: version %s\n", pcName, pcVersion ); #endif - - /* Stop poll timer if we had one. */ if ( TimerOn ) { del_timer ( &PollTimer ); @@ -403,7 +529,7 @@ /* Reset the boards we have. */ for( i = 0; i < IP2_MAX_BOARDS; ++i ) { if ( i2BoardPtrTable[i] ) { - iiReset ( i2BoardPtrTable[i] ); + iiReset( i2BoardPtrTable[i] ); } } @@ -413,6 +539,10 @@ iiResetDelay( i2BoardPtrTable[i] ); /* free io addresses and Tibet */ release_region( ip2config.addr[i], 8 ); +#ifdef CONFIG_DEVFS_FS + devfs_unregister (i2BoardPtrTable[i]->devfs_ipl_handle); + devfs_unregister (i2BoardPtrTable[i]->devfs_stat_handle); +#endif } /* Disable and remove interrupt handler. */ if ( (ip2config.irq[i] > 0) && have_requested_irq(ip2config.irq[i]) ) { @@ -426,7 +556,12 @@ if ( ( err = tty_unregister_driver ( &ip2_callout_driver ) ) ) { printk(KERN_ERR "IP2: failed to unregister callout driver (%d)\n", err); } - if ( ( err = unregister_chrdev ( IP2_IPL_MAJOR, pcIpl ) ) ) { +#ifdef CONFIG_DEVFS_FS + if ( ( err = devfs_unregister_chrdev ( IP2_IPL_MAJOR, pcIpl ) ) ) +#else + if ( ( err = unregister_chrdev ( IP2_IPL_MAJOR, pcIpl ) ) ) +#endif + { printk(KERN_ERR "IP2: failed to unregister IPL driver (%d)\n", err); } if ( ( err = proc_unregister( &proc_root, ip2_proc_entry.low_ino ) ) ) { @@ -473,9 +608,14 @@ __initfunc( int old_ip2_init(void)) { +#ifdef CONFIG_DEVFS_FS + static devfs_handle_t devfs_handle = NULL; + int j, box; +#endif int i; int err; int status = 0; + static int loaded = 0; i2eBordStrPtr pB = NULL; int rc = -1; @@ -486,6 +626,15 @@ /* Announce our presence */ printk( KERN_INFO "%s version %s\n", pcName, pcVersion ); + // ip2 can be unloaded and reloaded for no good reason + // we can't let that happen here or bad things happen + // second load hoses board but not system - fixme later + if (loaded) { + printk( KERN_INFO "Still loaded\n" ); + return 0; + } + loaded++; + /* if all irq config is zero we shall poll_only */ for ( i = 0; i < IP2_MAX_BOARDS; ++i ) { poll_only |= ip2config.irq[i]; @@ -525,11 +674,14 @@ break; case PCI: #ifdef CONFIG_PCI - if (pci_present()) { - struct pci_dev *pci_dev_i = NULL; - pci_dev_i = pci_find_device(PCI_VENDOR_ID_COMPUTONE, - PCI_DEVICE_ID_COMPUTONE_IP2EX, pci_dev_i); - if (pci_dev_i != NULL) { +#if (LINUX_VERSION_CODE < 0x020163) /* 2.1.99 */ + if (pcibios_present()) { + unsigned char pci_bus, pci_devfn; + int Pci_index = 0; + status = pcibios_find_device(PCI_VENDOR_ID_COMPUTONE, + PCI_DEVICE_ID_COMPUTONE_IP2EX, Pci_index, + &pci_bus, &pci_devfn); + if (status == 0) { unsigned int addr; unsigned char pci_irq; @@ -540,6 +692,41 @@ * one. */ ++Pci_index; + + pcibios_read_config_dword(pci_bus, pci_devfn, + PCI_BASE_ADDRESS_1, &addr); + if ( addr & 1 ) { + ip2config.addr[i]=(USHORT)(addr&0xfffe); + } else { + printk( KERN_ERR "IP2: PCI I/O address error\n"); + } + pcibios_read_config_byte(pci_bus, pci_devfn, + PCI_INTERRUPT_LINE, &pci_irq); + + if (!is_valid_irq(pci_irq)) { + printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); + pci_irq = 0; + } + ip2config.irq[i] = pci_irq; + } else { // ann error + ip2config.addr[i] = 0; + if (status == PCIBIOS_DEVICE_NOT_FOUND) { + printk( KERN_ERR "IP2: PCI board %d not found\n", i ); + } else { + pcibios_strerror(status); + } + } + } +#else /* LINUX_VERSION_CODE > 2.1.99 */ + if (pci_present()) { + struct pci_dev *pci_dev_i = NULL; + pci_dev_i = pci_find_device(PCI_VENDOR_ID_COMPUTONE, + PCI_DEVICE_ID_COMPUTONE_IP2EX, pci_dev_i); + if (pci_dev_i != NULL) { + unsigned int addr; + unsigned char pci_irq; + + ip2config.type[i] = PCI; status = pci_read_config_dword(pci_dev_i, PCI_BASE_ADDRESS_1, &addr); if ( addr & 1 ) { @@ -564,6 +751,7 @@ } } } +#endif /* ! 2_0_X */ #else printk( KERN_ERR "IP2: PCI card specified but PCI support not\n"); printk( KERN_ERR "IP2: configured in this kernel.\n"); @@ -614,8 +802,10 @@ /* Initialise the relevant fields. */ ip2_tty_driver.magic = TTY_DRIVER_MAGIC; ip2_tty_driver.name = pcTty; +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,0) ip2_tty_driver.driver_name = pcDriver_name; ip2_tty_driver.read_proc = ip2_read_proc; +#endif ip2_tty_driver.major = IP2_TTY_MAJOR; ip2_tty_driver.minor_start = 0; ip2_tty_driver.num = IP2_MAX_PORTS; @@ -623,7 +813,11 @@ ip2_tty_driver.subtype = SERIAL_TYPE_NORMAL; ip2_tty_driver.init_termios = tty_std_termios; ip2_tty_driver.init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL; +#ifdef CONFIG_DEVFS_FS + ip2_tty_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; +#else ip2_tty_driver.flags = TTY_DRIVER_REAL_RAW; +#endif ip2_tty_driver.refcount = &ref_count; ip2_tty_driver.table = TtyTable; ip2_tty_driver.termios = Termios; @@ -652,8 +846,10 @@ */ ip2_callout_driver = ip2_tty_driver; ip2_callout_driver.name = pcCallout; +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,0) ip2_callout_driver.driver_name = pcDriver_name; ip2_callout_driver.read_proc = NULL; +#endif ip2_callout_driver.major = IP2_CALLOUT_MAJOR; ip2_callout_driver.subtype = SERIAL_TYPE_CALLOUT; @@ -669,7 +865,12 @@ printk(KERN_ERR "IP2: failed to register callout driver (%d)\n", err); } else /* Register the IPL driver. */ - if ( ( err = register_chrdev ( IP2_IPL_MAJOR, pcIpl, &ip2_ipl ) ) ) { +#ifdef CONFIG_DEVFS_FS + if (( err = devfs_register_chrdev ( IP2_IPL_MAJOR, pcIpl, &ip2_ipl ))) +#else + if ( ( err = register_chrdev ( IP2_IPL_MAJOR, pcIpl, &ip2_ipl ) ) ) +#endif + { printk(KERN_ERR "IP2: failed to register IPL device (%d)\n", err ); } else /* Register the read_procmem thing */ @@ -683,10 +884,53 @@ /* Register the interrupt handler or poll handler, depending upon the * specified interrupt. */ +#ifdef CONFIG_DEVFS_FS + if (!devfs_handle) + devfs_handle = devfs_mk_dir (NULL, "ip2", 3, NULL); +#endif + for( i = 0; i < IP2_MAX_BOARDS; ++i ) { +#ifdef CONFIG_DEVFS_FS + char name[16]; +#endif if ( 0 == ip2config.addr[i] ) { continue; } + +#ifdef CONFIG_DEVFS_FS + sprintf( name, "ipl%d", i ); + i2BoardPtrTable[i]->devfs_ipl_handle = + devfs_register (devfs_handle, name, 0, + DEVFS_FL_NONE, + IP2_IPL_MAJOR, 4 * i, + S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, + 0, 0, &ip2_ipl, NULL); + + sprintf( name, "stat%d", i ); + i2BoardPtrTable[i]->devfs_stat_handle = + devfs_register (devfs_handle, name, 0, + DEVFS_FL_NONE, + IP2_IPL_MAJOR, 4 * i + 1, + S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, + 0, 0, &ip2_ipl, NULL); + + for ( box = 0; box < ABS_MAX_BOXES; ++box ) + { + for ( j = 0; j < ABS_BIGGEST_BOX; ++j ) + { + if ( pB->i2eChannelMap[box] & (1 << j) ) + { + tty_register_devfs(&ip2_tty_driver, + 0, j + ABS_BIGGEST_BOX * + (box+i*ABS_MAX_BOXES)); + tty_register_devfs(&ip2_callout_driver, + 0, j + ABS_BIGGEST_BOX * + (box+i*ABS_MAX_BOXES)); + } + } + } +#endif + if (poll_only) { ip2config.irq[i] = CIR_POLL; } @@ -955,7 +1199,6 @@ static void set_irq( int boardnum, int boardIrq ) { - i2ChanStrPtr pCh; unsigned char tempCommand[16]; i2eBordStrPtr pB = i2BoardPtrTable[boardnum]; unsigned long flags; @@ -969,8 +1212,6 @@ * is done. If polling we must send 0 as the interrupt parameter. */ - pCh = (i2ChanStrPtr) pB->i2eChannelPtr; - // We will get an interrupt here at the end of this function iiDisableMailIrq(pB); @@ -1152,7 +1393,7 @@ unsigned long flags; #ifdef IP2DEBUG_TRACE - ip2trace(PORTN, ITRC_INPUT, 21, 0 ); + ip2trace(CHANN, ITRC_INPUT, 21, 0 ); #endif // Data input if ( pCh->pTTY != NULL ) { @@ -1164,7 +1405,7 @@ READ_UNLOCK_IRQRESTORE(&pCh->Ibuf_spinlock,flags) } else { #ifdef IP2DEBUG_TRACE - ip2trace(PORTN, ITRC_INPUT, 22, 0 ); + ip2trace(CHANN, ITRC_INPUT, 22, 0 ); #endif i2InputFlush( pCh ); } @@ -1191,7 +1432,7 @@ status = i2GetStatus( pCh, (I2_BRK|I2_PAR|I2_FRA|I2_OVR) ); #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_STATUS, 21, 1, status ); + ip2trace (CHANN, ITRC_STATUS, 21, 1, status ); #endif if (pCh->pTTY && (status & (I2_BRK|I2_PAR|I2_FRA|I2_OVR)) ) { @@ -1254,7 +1495,7 @@ } #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_STATUS, 26, 0 ); + ip2trace (CHANN, ITRC_STATUS, 26, 0 ); #endif } @@ -1329,11 +1570,8 @@ open_sanity_check ( pCh, pCh->pMyBord ); #endif - i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP); + i2QueueCommands(PTYPE_INLINE, pCh, 100, 3, CMD_DTRUP,CMD_RTSUP,CMD_DCD_REP); pCh->dataSetOut |= (I2_DTR | I2_RTS); - i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DCD_REP); - i2QueueCommands(PTYPE_INLINE, pCh, 100, 3, - CMD_CTS_REP, CMD_DSR_REP, CMD_RI_REP); serviceOutgoingFifo( pCh->pMyBord ); /* Block here until the port is ready (per serial and istallion) */ @@ -1425,7 +1663,7 @@ printk(KERN_DEBUG "OpenBlock: waiting for CD or signal\n"); #endif #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_OPEN, 3, 2, (pCh->flags & ASYNC_CALLOUT_ACTIVE), + ip2trace (CHANN, ITRC_OPEN, 3, 2, (pCh->flags & ASYNC_CALLOUT_ACTIVE), (pCh->flags & ASYNC_CLOSING) ); #endif /* check for signal */ @@ -1437,7 +1675,7 @@ } --pCh->wopen; //why count? #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_OPEN, 4, 0 ); + ip2trace (CHANN, ITRC_OPEN, 4, 0 ); #endif if (rc != 0 ) { return rc; @@ -1476,7 +1714,7 @@ serviceOutgoingFifo( pCh->pMyBord ); #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_OPEN, ITRC_RETURN, 0 ); + ip2trace (CHANN, ITRC_OPEN, ITRC_RETURN, 0 ); #endif return 0; } @@ -1501,7 +1739,7 @@ } #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_CLOSE, ITRC_ENTER, 0 ); + ip2trace (CHANN, ITRC_CLOSE, ITRC_ENTER, 0 ); #endif #ifdef IP2DEBUG_OPEN @@ -1512,14 +1750,14 @@ MOD_DEC_USE_COUNT; #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_CLOSE, 2, 1, 2 ); + ip2trace (CHANN, ITRC_CLOSE, 2, 1, 2 ); #endif return; } if ( tty->count > 1 ) { /* not the last close */ MOD_DEC_USE_COUNT; #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_CLOSE, 2, 1, 3 ); + ip2trace (CHANN, ITRC_CLOSE, 2, 1, 3 ); #endif return; } @@ -1552,14 +1790,13 @@ i2InputFlush( pCh ); /* disable DSS reporting */ - i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DCD_NREP); + i2QueueCommands(PTYPE_INLINE, pCh, 100, 4, + CMD_DCD_NREP, CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP); if ( !tty || (tty->termios->c_cflag & HUPCL) ) { i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_RTSDN, CMD_DTRDN); pCh->dataSetOut &= ~(I2_DTR | I2_RTS); i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25)); } - i2QueueCommands(PTYPE_INLINE, pCh, 100, 3, - CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP); serviceOutgoingFifo ( pCh->pMyBord ); @@ -1590,7 +1827,7 @@ MOD_DEC_USE_COUNT; #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_CLOSE, ITRC_RETURN, 1, 1 ); + ip2trace (CHANN, ITRC_CLOSE, ITRC_RETURN, 1, 1 ); #endif return; } @@ -1610,7 +1847,7 @@ i2ChanStrPtr pCh = tty->driver_data; #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_HANGUP, ITRC_ENTER, 0 ); + ip2trace (CHANN, ITRC_HANGUP, ITRC_ENTER, 0 ); #endif ip2_flush_buffer(tty); @@ -1635,7 +1872,7 @@ wake_up_interruptible ( &pCh->open_wait ); #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_HANGUP, ITRC_RETURN, 0 ); + ip2trace (CHANN, ITRC_HANGUP, ITRC_RETURN, 0 ); #endif } @@ -1665,7 +1902,7 @@ unsigned long flags; #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_WRITE, ITRC_ENTER, 2, count, -1 ); + ip2trace (CHANN, ITRC_WRITE, ITRC_ENTER, 2, count, -1 ); #endif /* Flush out any buffered data left over from ip2_putchar() calls. */ @@ -1677,7 +1914,7 @@ WRITE_UNLOCK_IRQRESTORE(&pCh->Pbuf_spinlock,flags); #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_WRITE, ITRC_RETURN, 1, bytesSent ); + ip2trace (CHANN, ITRC_WRITE, ITRC_RETURN, 1, bytesSent ); #endif return bytesSent > 0 ? bytesSent : 0; } @@ -1699,7 +1936,7 @@ unsigned long flags; #ifdef IP2DEBUG_TRACE -// ip2trace (PORTN, ITRC_PUTC, ITRC_ENTER, 1, ch ); +// ip2trace (CHANN, ITRC_PUTC, ITRC_ENTER, 1, ch ); #endif WRITE_LOCK_IRQSAVE(&pCh->Pbuf_spinlock,flags); @@ -1711,7 +1948,7 @@ WRITE_UNLOCK_IRQRESTORE(&pCh->Pbuf_spinlock,flags); #ifdef IP2DEBUG_TRACE -// ip2trace (PORTN, ITRC_PUTC, ITRC_RETURN, 1, ch ); +// ip2trace (CHANN, ITRC_PUTC, ITRC_RETURN, 1, ch ); #endif } @@ -1733,7 +1970,7 @@ WRITE_LOCK_IRQSAVE(&pCh->Pbuf_spinlock,flags); if ( pCh->Pbuf_stuff ) { #ifdef IP2DEBUG_TRACE -// ip2trace (PORTN, ITRC_PUTC, 10, 1, strip ); +// ip2trace (CHANN, ITRC_PUTC, 10, 1, strip ); #endif // // We may need to restart i2Output if it does not fullfill this request @@ -1767,7 +2004,7 @@ READ_UNLOCK_IRQRESTORE(&pCh->Pbuf_spinlock,flags); #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_WRITE, 11, 1, bytesFree ); + ip2trace (CHANN, ITRC_WRITE, 11, 1, bytesFree ); #endif return ((bytesFree > 0) ? bytesFree : 0); @@ -1789,7 +2026,7 @@ int rc; unsigned long flags; #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_WRITE, 12, 1, pCh->Obuf_char_count + pCh->Pbuf_stuff ); + ip2trace (CHANN, ITRC_WRITE, 12, 1, pCh->Obuf_char_count + pCh->Pbuf_stuff ); #endif #ifdef IP2DEBUG_WRITE printk (KERN_DEBUG "IP2: chars in buffer = %d (%d,%d)\n", @@ -1821,7 +2058,7 @@ unsigned long flags; #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_FLUSH, ITRC_ENTER, 0 ); + ip2trace (CHANN, ITRC_FLUSH, ITRC_ENTER, 0 ); #endif #ifdef IP2DEBUG_WRITE printk (KERN_DEBUG "IP2: flush buffer\n" ); @@ -1832,7 +2069,7 @@ i2FlushOutput( pCh ); ip2_owake(tty); #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_FLUSH, ITRC_RETURN, 0 ); + ip2trace (CHANN, ITRC_FLUSH, ITRC_RETURN, 0 ); #endif } @@ -1968,17 +2205,18 @@ static int ip2_ioctl ( PTTY tty, struct file *pFile, UINT cmd, ULONG arg ) { - i2ChanStrPtr pCh = DevTable[MINOR(tty->device)]; + i2ChanStrPtr pCh = DevTable[MINOR(tty->device)]; struct async_icount cprev, cnow; /* kernel counter temps */ struct serial_icounter_struct *p_cuser; /* user space */ int rc = 0; + unsigned long flags; if ( pCh == NULL ) { return -ENODEV; } #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, ITRC_ENTER, 2, cmd, arg ); + ip2trace (CHANN, ITRC_IOCTL, ITRC_ENTER, 2, cmd, arg ); #endif #ifdef IP2DEBUG_IOCTL @@ -1988,7 +2226,7 @@ switch(cmd) { case TIOCGSERIAL: #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 2, 1, rc ); + ip2trace (CHANN, ITRC_IOCTL, 2, 1, rc ); #endif rc = get_serial_info(pCh, (struct serial_struct *) arg); if (rc) @@ -1997,7 +2235,7 @@ case TIOCSSERIAL: #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 3, 1, rc ); + ip2trace (CHANN, ITRC_IOCTL, 3, 1, rc ); #endif rc = set_serial_info(pCh, (struct serial_struct *) arg); if (rc) @@ -2035,7 +2273,7 @@ case TCSBRK: /* SVID version: non-zero arg --> no break */ rc = tty_check_change(tty); #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 4, 1, rc ); + ip2trace (CHANN, ITRC_IOCTL, 4, 1, rc ); #endif if (!rc) { ip2_wait_until_sent(tty,0); @@ -2049,7 +2287,7 @@ case TCSBRKP: /* support for POSIX tcsendbreak() */ rc = tty_check_change(tty); #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 5, 1, rc ); + ip2trace (CHANN, ITRC_IOCTL, 5, 1, rc ); #endif if (!rc) { ip2_wait_until_sent(tty,0); @@ -2061,18 +2299,18 @@ case TIOCGSOFTCAR: #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 6, 1, rc ); + ip2trace (CHANN, ITRC_IOCTL, 6, 1, rc ); #endif - rc=put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *) arg); + PUT_USER(rc,C_CLOCAL(tty) ? 1 : 0, (unsigned long *) arg); if (rc) return rc; break; case TIOCSSOFTCAR: #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 7, 1, rc ); + ip2trace (CHANN, ITRC_IOCTL, 7, 1, rc ); #endif - rc=get_user(arg,(unsigned long *) arg); + GET_USER(rc,arg,(unsigned long *) arg); if (rc) return rc; tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) @@ -2082,18 +2320,29 @@ case TIOCMGET: #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 8, 1, rc ); + ip2trace (CHANN, ITRC_IOCTL, 8, 1, rc ); #endif - rc = get_modem_info(pCh, (unsigned int *) arg); - if (rc) - return rc; + i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DSS_NOW); + serviceOutgoingFifo( pCh->pMyBord ); + interruptible_sleep_on(&pCh->dss_now_wait); + if (signal_pending(current)) { + return -EINTR; + } + PUT_USER(rc, + ((pCh->dataSetOut & I2_RTS) ? TIOCM_RTS : 0) + | ((pCh->dataSetOut & I2_DTR) ? TIOCM_DTR : 0) + | ((pCh->dataSetIn & I2_DCD) ? TIOCM_CAR : 0) + | ((pCh->dataSetIn & I2_RI) ? TIOCM_RNG : 0) + | ((pCh->dataSetIn & I2_DSR) ? TIOCM_DSR : 0) + | ((pCh->dataSetIn & I2_CTS) ? TIOCM_CTS : 0), + (unsigned int *) arg); break; case TIOCMBIS: case TIOCMBIC: case TIOCMSET: #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 9, 0 ); + ip2trace (CHANN, ITRC_IOCTL, 9, 0 ); #endif rc = set_modem_info(pCh, cmd, (unsigned int *) arg); break; @@ -2104,24 +2353,34 @@ * for masking). Caller should use TIOCGICOUNT to see which one it was */ case TIOCMIWAIT: + save_flags(flags);cli(); cprev = pCh->icount; /* note the counters on entry */ + restore_flags(flags); + i2QueueCommands(PTYPE_BYPASS, pCh, 100, 4, + CMD_DCD_REP, CMD_CTS_REP, CMD_DSR_REP, CMD_RI_REP); + serviceOutgoingFifo( pCh->pMyBord ); for(;;) { #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 10, 0 ); + ip2trace (CHANN, ITRC_IOCTL, 10, 0 ); #endif interruptible_sleep_on(&pCh->delta_msr_wait); +#ifdef IP2DEBUG_TRACE + ip2trace (CHANN, ITRC_IOCTL, 11, 0 ); +#endif /* see if a signal did it */ if (signal_pending(current)) { rc = -ERESTARTSYS; break; } + save_flags(flags);cli(); cnow = pCh->icount; /* atomic copy */ + restore_flags(flags); if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && - cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) { + cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) { rc = -EIO; /* no change => rc */ break; } - if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || + if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) { @@ -2130,7 +2389,13 @@ } cprev = cnow; } - /* NOTREACHED */ + i2QueueCommands(PTYPE_BYPASS, pCh, 100, 3, + CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP); + if ( ! (pCh->flags & ASYNC_CHECK_CD)) { + i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DCD_NREP); + } + serviceOutgoingFifo( pCh->pMyBord ); + return rc; break; /* @@ -2143,14 +2408,23 @@ */ case TIOCGICOUNT: #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 11, 1, rc ); + ip2trace (CHANN, ITRC_IOCTL, 11, 1, rc ); #endif + save_flags(flags);cli(); cnow = pCh->icount; + restore_flags(flags); p_cuser = (struct serial_icounter_struct *) arg; - put_user(cnow.cts, &p_cuser->cts); - put_user(cnow.dsr, &p_cuser->dsr); - put_user(cnow.rng, &p_cuser->rng); - put_user(cnow.dcd, &p_cuser->dcd); + PUT_USER(rc,cnow.cts, &p_cuser->cts); + PUT_USER(rc,cnow.dsr, &p_cuser->dsr); + PUT_USER(rc,cnow.rng, &p_cuser->rng); + PUT_USER(rc,cnow.dcd, &p_cuser->dcd); + PUT_USER(rc,cnow.rx, &p_cuser->rx); + PUT_USER(rc,cnow.tx, &p_cuser->tx); + PUT_USER(rc,cnow.frame, &p_cuser->frame); + PUT_USER(rc,cnow.overrun, &p_cuser->overrun); + PUT_USER(rc,cnow.parity, &p_cuser->parity); + PUT_USER(rc,cnow.brk, &p_cuser->brk); + PUT_USER(rc,cnow.buf_overrun, &p_cuser->buf_overrun); break; /* @@ -2167,43 +2441,16 @@ default: #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, 12, 0 ); + ip2trace (CHANN, ITRC_IOCTL, 12, 0 ); #endif rc = -ENOIOCTLCMD; break; } #ifdef IP2DEBUG_TRACE - ip2trace (PORTN, ITRC_IOCTL, ITRC_RETURN, 0 ); + ip2trace (CHANN, ITRC_IOCTL, ITRC_RETURN, 0 ); #endif return rc; } -/******************************************************************************/ -/* Function: get_modem_info() */ -/* Parameters: Pointer to channel structure */ -/* Pointer to destination for data */ -/* Returns: Nothing */ -/* */ -/* Description: */ -/* This returns the current settings of the dataset signal inputs to the user */ -/* program. */ -/******************************************************************************/ -static int -get_modem_info(i2ChanStrPtr pCh, unsigned int *value) -{ - unsigned short status; - unsigned int result; - int rc; - - status = pCh->dataSetIn; // snapshot settings - result = ((pCh->dataSetOut & I2_RTS) ? TIOCM_RTS : 0) - | ((pCh->dataSetOut & I2_DTR) ? TIOCM_DTR : 0) - | ((status & I2_DCD) ? TIOCM_CAR : 0) - | ((status & I2_RI) ? TIOCM_RNG : 0) - | ((status & I2_DSR) ? TIOCM_DSR : 0) - | ((status & I2_CTS) ? TIOCM_CTS : 0); - rc=put_user(result,value); - return rc; -} /******************************************************************************/ /* Function: set_modem_info() */ @@ -2222,7 +2469,7 @@ int rc; unsigned int arg; - rc=get_user(arg,value); + GET_USER(rc,arg,value); if (rc) return rc; switch(cmd) { @@ -2283,7 +2530,7 @@ get_serial_info ( i2ChanStrPtr pCh, struct serial_struct *retinfo ) { struct serial_struct tmp; - int rc=0; + int rc; if ( !retinfo ) { return -EFAULT; @@ -2304,9 +2551,8 @@ tmp.close_delay = pCh->ClosingDelay; tmp.closing_wait = pCh->ClosingWaitTime; tmp.custom_divisor = pCh->BaudDivisor; - if(copy_to_user(retinfo,&tmp,sizeof(*retinfo))) - rc= -EFAULT; - return rc; + COPY_TO_USER(rc,retinfo,&tmp,sizeof(*retinfo)); + return rc; } /******************************************************************************/ @@ -2330,7 +2576,7 @@ if ( !new_info ) { return -EFAULT; } - rc=copy_from_user(&ns, new_info, sizeof (ns) ); + COPY_FROM_USER(rc, &ns, new_info, sizeof (ns) ); if (rc) { return rc; } @@ -2656,6 +2902,7 @@ i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_SET_ERROR(parrpt)); } if (cflag & CLOCAL) { + // Status reporting fails for DCD if this is off i2QueueCommands(PTYPE_INLINE, pCh, 100, 1, CMD_DCD_NREP); pCh->flags &= ~ASYNC_CHECK_CD; } else { @@ -2695,10 +2942,16 @@ /******************************************************************************/ static +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) +int +ip2_ipl_read(struct inode *pInode, char *pData, size_t count, loff_t *off ) + unsigned int minor = MINOR( pInode->i_rdev ); +#else ssize_t ip2_ipl_read(struct file *pFile, char *pData, size_t count, loff_t *off ) { unsigned int minor = MINOR( pFile->f_dentry->d_inode->i_rdev ); +#endif int rc = 0; #ifdef IP2DEBUG_IPL @@ -2732,9 +2985,8 @@ DumpFifoBuffer ( char *pData, int count ) { #ifdef DEBUG_FIFO - int rc=0; - if(copy_to_user(pData, DBGBuf, count)) - rc=-EFAULT; + int rc; + COPY_TO_USER(rc, pData, DBGBuf, count); printk(KERN_DEBUG "Last index %d\n", I ); @@ -2755,10 +3007,10 @@ if ( count < (sizeof(int) * 6) ) { return -EIO; } - put_user(tracewrap, pIndex ); - put_user(TRACEMAX, ++pIndex ); - put_user(tracestrip, ++pIndex ); - put_user(tracestuff, ++pIndex ); + PUT_USER(rc, tracewrap, pIndex ); + PUT_USER(rc, TRACEMAX, ++pIndex ); + PUT_USER(rc, tracestrip, ++pIndex ); + PUT_USER(rc, tracestuff, ++pIndex ); pData += sizeof(int) * 6; count -= sizeof(int) * 6; @@ -2771,21 +3023,21 @@ } chunk = TRACEMAX - tracestrip; if ( dumpcount > chunk ) { - rc=copy_to_user(pData, &tracebuf[tracestrip], - chunk * sizeof(tracebuf[0]) )?-EFAULT:0; + COPY_TO_USER(rc, pData, &tracebuf[tracestrip], + chunk * sizeof(tracebuf[0]) ); pData += chunk * sizeof(tracebuf[0]); tracestrip = 0; chunk = dumpcount - chunk; } else { chunk = dumpcount; } - rc=copy_to_user(pData, &tracebuf[tracestrip], - chunk * sizeof(tracebuf[0]) )?-EFAULT:0 + COPY_TO_USER(rc, pData, &tracebuf[tracestrip], + chunk * sizeof(tracebuf[0]) ); tracestrip += chunk; tracewrap = 0; - put_user(tracestrip, ++pIndex ); - put_user(tracestuff, ++pIndex ); + PUT_USER(rc, tracestrip, ++pIndex ); + PUT_USER(rc, tracestuff, ++pIndex ); return dumpcount; #else @@ -2849,16 +3101,15 @@ case 13: switch ( cmd ) { case 64: /* Driver - ip2stat */ - put_user(ref_count, pIndex++ ); - put_user(irq_counter, pIndex++ ); - put_user(bh_counter, pIndex++ ); + PUT_USER(rc, ref_count, pIndex++ ); + PUT_USER(rc, irq_counter, pIndex++ ); + PUT_USER(rc, bh_counter, pIndex++ ); break; case 65: /* Board - ip2stat */ if ( pB ) { - if(copy_to_user((char*)arg, (char*)pB, sizeof(i2eBordStr) )) - rc=-EFAULT; - put_user(INB(pB->i2eStatus), + COPY_TO_USER(rc, (char*)arg, (char*)pB, sizeof(i2eBordStr) ); + PUT_USER(rc, INB(pB->i2eStatus), (ULONG*)(arg + (ULONG)(&pB->i2eStatus) - (ULONG)pB ) ); } else { rc = -ENODEV; @@ -2869,8 +3120,7 @@ pCh = DevTable[cmd]; if ( pCh ) { - if(copy_to_user((char*)arg, (char*)pCh, sizeof(i2ChanStr) )) - rc = -EFAULT; + COPY_TO_USER(rc, (char*)arg, (char*)pCh, sizeof(i2ChanStr) ); } else { rc = cmd < 64 ? -ENODEV : -EINVAL; } @@ -2882,61 +3132,60 @@ break; case 3: // Trace device if ( cmd == 1 ) { - put_user(iiSendPendingMail, pIndex++ ); - put_user(i2InitChannels, pIndex++ ); - put_user(i2QueueNeeds, pIndex++ ); - put_user(i2QueueCommands, pIndex++ ); - put_user(i2GetStatus, pIndex++ ); - put_user(i2Input, pIndex++ ); - put_user(i2InputFlush, pIndex++ ); - put_user(i2Output, pIndex++ ); - put_user(i2FlushOutput, pIndex++ ); - put_user(i2DrainWakeup, pIndex++ ); - put_user(i2DrainOutput, pIndex++ ); - put_user(i2OutputFree, pIndex++ ); - put_user(i2StripFifo, pIndex++ ); - put_user(i2StuffFifoBypass, pIndex++ ); - put_user(i2StuffFifoFlow, pIndex++ ); - put_user(i2StuffFifoInline, pIndex++ ); - put_user(i2ServiceBoard, pIndex++ ); - put_user(serviceOutgoingFifo, pIndex++ ); - // put_user(ip2_init, pIndex++ ); - put_user(ip2_init_board, pIndex++ ); - put_user(find_eisa_board, pIndex++ ); - put_user(set_irq, pIndex++ ); - put_user(ip2_interrupt, pIndex++ ); - put_user(ip2_poll, pIndex++ ); - put_user(service_all_boards, pIndex++ ); - put_user(do_input, pIndex++ ); - put_user(do_status, pIndex++ ); + PUT_USER(rc, iiSendPendingMail, pIndex++ ); + PUT_USER(rc, i2InitChannels, pIndex++ ); + PUT_USER(rc, i2QueueNeeds, pIndex++ ); + PUT_USER(rc, i2QueueCommands, pIndex++ ); + PUT_USER(rc, i2GetStatus, pIndex++ ); + PUT_USER(rc, i2Input, pIndex++ ); + PUT_USER(rc, i2InputFlush, pIndex++ ); + PUT_USER(rc, i2Output, pIndex++ ); + PUT_USER(rc, i2FlushOutput, pIndex++ ); + PUT_USER(rc, i2DrainWakeup, pIndex++ ); + PUT_USER(rc, i2DrainOutput, pIndex++ ); + PUT_USER(rc, i2OutputFree, pIndex++ ); + PUT_USER(rc, i2StripFifo, pIndex++ ); + PUT_USER(rc, i2StuffFifoBypass, pIndex++ ); + PUT_USER(rc, i2StuffFifoFlow, pIndex++ ); + PUT_USER(rc, i2StuffFifoInline, pIndex++ ); + PUT_USER(rc, i2ServiceBoard, pIndex++ ); + PUT_USER(rc, serviceOutgoingFifo, pIndex++ ); + // PUT_USER(rc, ip2_init, pIndex++ ); + PUT_USER(rc, ip2_init_board, pIndex++ ); + PUT_USER(rc, find_eisa_board, pIndex++ ); + PUT_USER(rc, set_irq, pIndex++ ); + PUT_USER(rc, ip2_interrupt, pIndex++ ); + PUT_USER(rc, ip2_poll, pIndex++ ); + PUT_USER(rc, service_all_boards, pIndex++ ); + PUT_USER(rc, do_input, pIndex++ ); + PUT_USER(rc, do_status, pIndex++ ); #ifndef IP2DEBUG_OPEN - put_user(0, pIndex++ ); + PUT_USER(rc, 0, pIndex++ ); #else - put_user(open_sanity_check, pIndex++ ); + PUT_USER(rc, open_sanity_check, pIndex++ ); #endif - put_user(ip2_open, pIndex++ ); - put_user(ip2_close, pIndex++ ); - put_user(ip2_hangup, pIndex++ ); - put_user(ip2_write, pIndex++ ); - put_user(ip2_putchar, pIndex++ ); - put_user(ip2_flush_chars, pIndex++ ); - put_user(ip2_write_room, pIndex++ ); - put_user(ip2_chars_in_buf, pIndex++ ); - put_user(ip2_flush_buffer, pIndex++ ); - - //put_user(ip2_wait_until_sent, pIndex++ ); - put_user(0, pIndex++ ); - - put_user(ip2_throttle, pIndex++ ); - put_user(ip2_unthrottle, pIndex++ ); - put_user(ip2_ioctl, pIndex++ ); - put_user(get_modem_info, pIndex++ ); - put_user(set_modem_info, pIndex++ ); - put_user(get_serial_info, pIndex++ ); - put_user(set_serial_info, pIndex++ ); - put_user(ip2_set_termios, pIndex++ ); - put_user(ip2_set_line_discipline, pIndex++ ); - put_user(set_params, pIndex++ ); + PUT_USER(rc, ip2_open, pIndex++ ); + PUT_USER(rc, ip2_close, pIndex++ ); + PUT_USER(rc, ip2_hangup, pIndex++ ); + PUT_USER(rc, ip2_write, pIndex++ ); + PUT_USER(rc, ip2_putchar, pIndex++ ); + PUT_USER(rc, ip2_flush_chars, pIndex++ ); + PUT_USER(rc, ip2_write_room, pIndex++ ); + PUT_USER(rc, ip2_chars_in_buf, pIndex++ ); + PUT_USER(rc, ip2_flush_buffer, pIndex++ ); + + //PUT_USER(rc, ip2_wait_until_sent, pIndex++ ); + PUT_USER(rc, 0, pIndex++ ); + + PUT_USER(rc, ip2_throttle, pIndex++ ); + PUT_USER(rc, ip2_unthrottle, pIndex++ ); + PUT_USER(rc, ip2_ioctl, pIndex++ ); + PUT_USER(rc, set_modem_info, pIndex++ ); + PUT_USER(rc, get_serial_info, pIndex++ ); + PUT_USER(rc, set_serial_info, pIndex++ ); + PUT_USER(rc, ip2_set_termios, pIndex++ ); + PUT_USER(rc, ip2_set_line_discipline, pIndex++ ); + PUT_USER(rc, set_params, pIndex++ ); } else { rc = -EINVAL; } @@ -3175,7 +3424,7 @@ if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } diff -urN v2.2.15/linux/drivers/char/lp.c linux/drivers/char/lp.c --- v2.2.15/linux/drivers/char/lp.c Tue Jan 4 10:12:14 2000 +++ linux/drivers/char/lp.c Wed Jun 7 14:26:42 2000 @@ -202,7 +202,7 @@ /* Test if the printer is not acking the strobe */ #define LP_NO_ACKING(status) ((status) & LP_PACK) /* Test if the printer has error conditions */ -#define LP_NO_ERROR(status) ((status) & LP_PERRORP) +#define LP_NO_ERROR(minor, status) ((!(LP_F(minor) & LP_CAREFUL)) ? ((status) & LP_PERRORP) : (((status) & (LP_PERRORP|LP_POUTPA|LP_PSELECD)) == (LP_PERRORP|LP_PSELECD))) #undef LP_DEBUG #undef LP_READ_DEBUG @@ -289,7 +289,7 @@ lp_yield(minor); status = r_str(minor); - if (LP_NO_ERROR(status)) + if (LP_NO_ERROR(minor, status)) { if (LP_READY(status)) break; diff -urN v2.2.15/linux/drivers/char/misc.c linux/drivers/char/misc.c --- v2.2.15/linux/drivers/char/misc.c Wed May 3 17:16:38 2000 +++ linux/drivers/char/misc.c Wed Jun 7 14:26:42 2000 @@ -73,6 +73,7 @@ extern void watchdog_init(void); extern void wdt_init(void); extern void acq_init(void); +extern void wdt60xx_init(void); extern void dtlk_init(void); extern void pcwatchdog_init(void); extern int rtc_init(void); @@ -228,6 +229,9 @@ #endif #ifdef CONFIG_ACQUIRE_WDT acq_init(); +#endif +#ifdef CONFIG_60XX_WDT + sbc60xxwdt_init(); #endif #ifdef CONFIG_SOFT_WATCHDOG watchdog_init(); diff -urN v2.2.15/linux/drivers/char/n_hdlc.c linux/drivers/char/n_hdlc.c --- v2.2.15/linux/drivers/char/n_hdlc.c Wed May 3 17:16:38 2000 +++ linux/drivers/char/n_hdlc.c Wed Jun 7 14:26:42 2000 @@ -9,7 +9,7 @@ * Al Longyear , Paul Mackerras * * Original release 01/11/99 - * ==FILEDATE 19990901== + * ==FILEDATE 20000515== * * This code is released under the GNU General Public License (GPL) * @@ -78,7 +78,7 @@ */ #define HDLC_MAGIC 0x239e -#define HDLC_VERSION "1.11" +#define HDLC_VERSION "1.15" #include #include @@ -105,7 +105,6 @@ #include #include #include -#include /* to get the struct task_struct */ #include /* used in new tty drivers */ #include /* used in new tty drivers */ #include @@ -172,6 +171,7 @@ #if LINUX_VERSION_CODE < VERSION(2,1,0) #define __init typedef int spinlock_t; +#define spin_lock_init(a) #define spin_lock_irqsave(a,b) {save_flags((b));cli();} #define spin_unlock_irqrestore(a,b) {restore_flags((b));} #define spin_lock(a) @@ -465,9 +465,10 @@ register int actual; unsigned long flags; N_HDLC_BUF *tbuf; - + if (debuglevel >= DEBUG_LEVEL_INFO) printk("%s(%d)n_hdlc_send_frames() called\n",__FILE__,__LINE__); + check_again: save_flags(flags); cli (); @@ -477,6 +478,7 @@ return; } n_hdlc->tbusy = 1; + n_hdlc->woke_up = 0; restore_flags(flags); /* get current transmit buffer or get new transmit */ @@ -492,7 +494,6 @@ __FILE__,__LINE__,tbuf,tbuf->count); /* Send the next block of data to device */ - n_hdlc->woke_up = 0; tty->flags |= (1 << TTY_DO_WRITE_WAKEUP); actual = tty->driver.write(tty, 0, tbuf->buf, tbuf->count); @@ -514,6 +515,7 @@ /* wait up sleeping writers */ wake_up_interruptible(&n_hdlc->write_wait); + wake_up_interruptible(&n_hdlc->poll_wait); /* get next pending transmit buffer */ tbuf = n_hdlc_buf_get(&n_hdlc->tx_buf_list); @@ -523,11 +525,6 @@ __FILE__,__LINE__,tbuf); /* buffer not accepted by driver */ - - /* check if wake up code called since last write call */ - if (n_hdlc->woke_up) - continue; - /* set this buffer as pending buffer */ n_hdlc->tbuf = tbuf; break; @@ -543,6 +540,9 @@ n_hdlc->tbusy = 0; restore_flags(flags); + if (n_hdlc->woke_up) + goto check_again; + if (debuglevel >= DEBUG_LEVEL_INFO) printk("%s(%d)n_hdlc_send_frames() exit\n",__FILE__,__LINE__); @@ -570,11 +570,8 @@ tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP); return; } - - if (!n_hdlc->tbuf) - tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP); - else - n_hdlc_send_frames (n_hdlc, tty); + + n_hdlc_send_frames (n_hdlc, tty); } /* end of n_hdlc_tty_wakeup() */ @@ -663,8 +660,11 @@ wake_up_interruptible (&n_hdlc->read_wait); wake_up_interruptible (&n_hdlc->poll_wait); if (n_hdlc->tty->fasync != NULL) +#if LINUX_VERSION_CODE < VERSION(2,3,0) kill_fasync (n_hdlc->tty->fasync, SIGIO); - +#else + kill_fasync (n_hdlc->tty->fasync, SIGIO, POLL_IN); +#endif } /* end of n_hdlc_tty_receive() */ /* n_hdlc_tty_read() @@ -788,34 +788,31 @@ count = maxframe; } + add_wait_queue(&n_hdlc->write_wait, &wait); + set_current_state(TASK_INTERRUPTIBLE); + /* Allocate transmit buffer */ - tbuf = n_hdlc_buf_get(&n_hdlc->tx_free_buf_list); - if (!tbuf) { - /* sleep until transmit buffer available */ - add_wait_queue(&n_hdlc->write_wait, &wait); - while (!tbuf) { - set_current_state(TASK_INTERRUPTIBLE); - schedule(); - - n_hdlc = tty2n_hdlc (tty); - if (!n_hdlc || n_hdlc->magic != HDLC_MAGIC || - tty != n_hdlc->tty) { - printk("n_hdlc_tty_write: %p invalid after wait!\n", n_hdlc); - error = -EIO; - break; - } + /* sleep until transmit buffer available */ + while (!(tbuf = n_hdlc_buf_get(&n_hdlc->tx_free_buf_list))) { + schedule(); - if (signal_pending(current)) { - error = -EINTR; - break; - } + n_hdlc = tty2n_hdlc (tty); + if (!n_hdlc || n_hdlc->magic != HDLC_MAGIC || + tty != n_hdlc->tty) { + printk("n_hdlc_tty_write: %p invalid after wait!\n", n_hdlc); + error = -EIO; + break; + } - tbuf = n_hdlc_buf_get(&n_hdlc->tx_free_buf_list); + if (signal_pending(current)) { + error = -EINTR; + break; } - set_current_state(TASK_RUNNING); - remove_wait_queue(&n_hdlc->write_wait, &wait); } + set_current_state(TASK_RUNNING); + remove_wait_queue(&n_hdlc->write_wait, &wait); + if (!error) { /* Retrieve the user's buffer */ COPY_FROM_USER (error, tbuf->buf, data, count); @@ -991,7 +988,11 @@ if (n_hdlc && n_hdlc->magic == HDLC_MAGIC && tty == n_hdlc->tty) { /* queue current process into any wait queue that */ /* may awaken in the future (read and write) */ +#if LINUX_VERSION_CODE < VERSION(2,1,89) + poll_wait(&n_hdlc->poll_wait, wait); +#else poll_wait(filp, &n_hdlc->poll_wait, wait); +#endif /* set bits for operations that wont block */ if(n_hdlc->rx_buf_list.head) mask |= POLLIN | POLLRDNORM; /* readable */ @@ -1071,7 +1072,7 @@ void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list) { memset(list,0,sizeof(N_HDLC_BUF_LIST)); - + spin_lock_init(&list->spinlock); } /* end of n_hdlc_buf_list_init() */ /* n_hdlc_buf_put() diff -urN v2.2.15/linux/drivers/char/n_tty.c linux/drivers/char/n_tty.c --- v2.2.15/linux/drivers/char/n_tty.c Wed May 3 17:16:38 2000 +++ linux/drivers/char/n_tty.c Wed Jun 7 14:26:42 2000 @@ -228,9 +228,9 @@ nr = space; if (nr > sizeof(buf)) nr = sizeof(buf); - nr -= copy_from_user(buf, inbuf, nr); - if (!nr) - return 0; + + if (copy_from_user(buf, inbuf, nr)) + return -EFAULT; for (i = 0, cp = buf; i < nr; i++, cp++) { switch (*cp) { diff -urN v2.2.15/linux/drivers/char/nvram.c linux/drivers/char/nvram.c --- v2.2.15/linux/drivers/char/nvram.c Wed Aug 25 17:29:47 1999 +++ linux/drivers/char/nvram.c Wed Jun 7 14:26:42 2000 @@ -373,7 +373,7 @@ if (offset >= begin + len) return( 0 ); - *start = buffer + (begin - offset); + *start = buffer + (offset - begin); return( size < begin + len - offset ? size : begin + len - offset ); } diff -urN v2.2.15/linux/drivers/char/pc_keyb.c linux/drivers/char/pc_keyb.c --- v2.2.15/linux/drivers/char/pc_keyb.c Mon Aug 9 12:04:39 1999 +++ linux/drivers/char/pc_keyb.c Wed Jun 7 14:26:42 2000 @@ -56,6 +56,9 @@ static void kbd_write_command_w(int data); static void kbd_write_output_w(int data); +#ifdef CONFIG_PSMOUSE +static void aux_write_ack(int val); +#endif spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED; static unsigned char handle_kbd_event(void); @@ -73,6 +76,9 @@ static int __init psaux_init(void); +#define AUX_RECONNECT 170 +/* #define CHECK_RECONNECT_SCANCODE 1 */ + static struct aux_queue *queue; /* Mouse data buffer. */ static int aux_count = 0; /* used when we send commands to the mouse that expect an ACK. */ @@ -393,6 +399,19 @@ } mouse_reply_expected = 0; } + else if(scancode == AUX_RECONNECT){ + queue->head = queue->tail = 0; /* Flush input queue */ + /* + * need this stuff? seems to work fine w/o it for me + aux_write_ack(AUX_SET_SAMPLE); + aux_write_ack(100); + aux_write_ack(AUX_SET_RES); + aux_write_ack(3); + aux_write_ack(AUX_SET_SCALE21); + */ + aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ + return; + } add_mouse_randomness(scancode); if (aux_count) { @@ -426,6 +445,9 @@ unsigned char scancode; scancode = kbd_read_input(); +# ifdef CHECK_RECONNECT_SCANCODE + printk(KERN_INFO "-=db=-: kbd_read_input() : scancode == %d\n",scancode); +# endif if (status & KBD_STAT_MOUSE_OBF) { handle_mouse_event(scancode); } else { diff -urN v2.2.15/linux/drivers/char/random.c linux/drivers/char/random.c --- v2.2.15/linux/drivers/char/random.c Wed May 3 17:16:38 2000 +++ linux/drivers/char/random.c Wed Jun 7 14:26:42 2000 @@ -138,7 +138,7 @@ * add_interrupt_randomness() uses the inter-interrupt timing as random * inputs to the entropy pool. Note that not all interrupts are good * sources of randomness! For example, the timer interrupts is not a - * good choice, because the periodicity of the interrupts is to + * good choice, because the periodicity of the interrupts is too * regular, and hence predictable to an attacker. Disk interrupts are * a better measure, since the timing of the disk interrupts are more * unpredictable. @@ -778,7 +778,12 @@ void add_keyboard_randomness(unsigned char scancode) { - add_timer_randomness(&random_state, &keyboard_timer_state, scancode); + static unsigned char last_scancode = 0; + /* ignore autorepeat (multiple key down w/o key up) */ + if (scancode != last_scancode) { + last_scancode = scancode; + add_timer_randomness(&random_state, &keyboard_timer_state, scancode); + } } void add_mouse_randomness(__u32 mouse_data) diff -urN v2.2.15/linux/drivers/char/sbc60xxwdt.c linux/drivers/char/sbc60xxwdt.c --- v2.2.15/linux/drivers/char/sbc60xxwdt.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/char/sbc60xxwdt.c Wed Jun 7 14:26:42 2000 @@ -0,0 +1,304 @@ +/* + * 60xx Single Board Computer Watchdog Timer driver for Linux 2.2.x + * + * Based on acquirewdt.c by Alan Cox. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * The author does NOT admit liability nor provide warranty for + * any of this software. This material is provided "AS-IS" in + * the hope that it may be useful for others. + * + * (c) Copyright 2000 Jakob Oestergaard + * + * 12/4 - 2000 [Initial revision] + * 25/4 - 2000 Added /dev/watchdog support + * + * + * Theory of operation: + * A Watchdog Timer (WDT) is a hardware circuit that can + * reset the computer system in case of a software fault. + * You probably knew that already. + * + * Usually a userspace daemon will notify the kernel WDT driver + * via the /proc/watchdog special device file that userspace is + * still alive, at regular intervals. When such a notification + * occurs, the driver will usually tell the hardware watchdog + * that everything is in order, and that the watchdog should wait + * for yet another little while to reset the system. + * If userspace fails (RAM error, kernel bug, whatever), the + * notifications cease to occur, and the hardware watchdog will + * reset the system (causing a reboot) after the timeout occurs. + * + * This WDT driver is different from the other Linux WDT + * drivers in several ways: + * *) The driver will ping the watchdog by itself, because this + * particular WDT has a very short timeout (one second) and it + * would be insane to count on any userspace daemon always + * getting scheduled within that time frame. + * *) This driver expects the userspace daemon to send a specific + * character code ('V') to /dev/watchdog before closing the + * /dev/watchdog file. If the userspace daemon closes the file + * without sending this special character, the driver will assume + * that the daemon (and userspace in general) died, and will + * stop pinging the WDT without disabling it first. This will + * cause a reboot. + * + * Why `V' ? Well, `V' is the character in ASCII for the value 86, + * and we all know that 86 is _the_ most random number in the universe. + * Therefore it is the letter that has the slightest chance of occuring + * by chance, when the system becomes corrupted. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define OUR_NAME "sbc60xxwdt" + +/* + * You must set these - The driver cannot probe for the settings + */ + +#define WDT_STOP 0x45 +#define WDT_START 0x443 + +/* + * The 60xx board can use watchdog timeout values from one second + * to several minutes. The default is one second, so if we reset + * the watchdog every ~250ms we should be safe. + */ + +#define WDT_INTERVAL (HZ/4+1) + +/* + * We must not require too good response from the userspace daemon. + * Here we require the userspace daemon to send us a heartbeat + * char to /dev/watchdog every 10 seconds. + * If the daemon pulses us every 5 seconds, we can still afford + * a 5 second scheduling delay on the (high priority) daemon. That + * should be sufficient for a box under any load. + */ +#define WDT_HEARTBEAT (HZ * 10) + +static void wdt_timer_ping(unsigned long); +static struct timer_list timer = { 0, 0, WDT_INTERVAL, 0, wdt_timer_ping }; +static unsigned long next_heartbeat = 0; +static int wdt_is_open = 0; +static int wdt_expect_close = 0; + +/* + * Whack the dog + */ + +static void wdt_timer_ping(unsigned long data) +{ + /* If we got a heartbeat pulse within the WDT_US_INTERVAL + * we agree to ping the WDT + */ + if(time_before(jiffies, next_heartbeat)) { + /* Ping the WDT by reading from WDT_START */ + inb_p(WDT_START); + /* Re-set the timer interval */ + timer.expires = jiffies + WDT_INTERVAL; + add_timer(&timer); + } else { + printk(OUR_NAME ": Heartbeat lost! Will not ping the watchdog\n"); + } +} + +/* + * Utility routines + */ + +static void wdt_startup(void) +{ + next_heartbeat = jiffies + WDT_HEARTBEAT; + + /* Start the timer */ + timer.expires = jiffies + WDT_INTERVAL; + add_timer(&timer); + printk(OUR_NAME ": Watchdog timer is now enabled.\n"); +} + +static void wdt_turnoff(void) +{ + /* Stop the timer */ + del_timer(&timer); + inb_p(WDT_STOP); + printk(OUR_NAME ": Watchdog timer is now disabled...\n"); +} + + +/* + * /dev/watchdog handling + */ + +static ssize_t fop_write(struct file * file, const char * buf, size_t count, loff_t * ppos) +{ + /* We can't seek */ + if(ppos != &file->f_pos) + return -ESPIPE; + + /* See if we got the magic character */ + if(count) { + size_t ofs; + + /* note: just in case someone wrote the magic character + * five months ago... */ + wdt_expect_close = 0; + + /* now scan */ + for(ofs = 0; ofs != count; ofs++) + if(buf[ofs] == 'V') + wdt_expect_close = 1; + + /* Well, anyhow someone wrote to us, we should return that favour */ + next_heartbeat = jiffies + WDT_HEARTBEAT; + } + return 0; +} + +static ssize_t fop_read(struct file * file, char * buf, size_t count, loff_t * ppos) +{ + /* No can do */ + return -EINVAL; +} + +static int fop_open(struct inode * inode, struct file * file) +{ + switch(MINOR(inode->i_rdev)) { + case WATCHDOG_MINOR: + + /* Just in case we're already talking to someone... */ + if(wdt_is_open) + return -EBUSY; + + /* Good, fire up the show */ + + MOD_INC_USE_COUNT; + + wdt_is_open = 1; + wdt_startup(); + return 0; + + default: + return -ENODEV; + } +} + +static int fop_close(struct inode * inode, struct file * file) +{ + if(MINOR(inode->i_rdev) == WATCHDOG_MINOR) { + if(wdt_expect_close) + wdt_turnoff(); + else { + del_timer(&timer); + printk(OUR_NAME ": device file closed unexpectedly. Will not stop the WDT!\n"); + } + } + + wdt_is_open = 0; + + MOD_DEC_USE_COUNT; + return 0; +} + + +static struct file_operations wdt_fops = { + 0, + fop_read, + fop_write, + 0, /* readdir */ + 0, /* select */ + 0, /* ioctl */ + 0, /* mmap */ + fop_open, + 0, /* flush */ + fop_close +}; + +static struct miscdevice wdt_miscdev = { + WATCHDOG_MINOR, + "watchdog", + &wdt_fops +}; + +/* + * Notifier for system down + */ + +static int wdt_notify_sys(struct notifier_block *this, unsigned long code, + void *unused) +{ + if(code==SYS_DOWN || code==SYS_HALT) { + wdt_turnoff(); + } + return NOTIFY_DONE; +} + +/* + * The WDT needs to learn about soft shutdowns in order to + * turn the timebomb registers off. + */ + +static struct notifier_block wdt_notifier= +{ + wdt_notify_sys, + 0, + 0 +}; + +#ifdef MODULE + +#define sbc60xxwdt_init init_module + +void cleanup_module(void) +{ + wdt_turnoff(); + + /* Deregister */ + + misc_deregister(&wdt_miscdev); + + unregister_reboot_notifier(&wdt_notifier); + + release_region(WDT_STOP,1); + release_region(WDT_START,1); +} + +#endif + +__initfunc(int sbc60xxwdt_init(void)) +{ + printk(OUR_NAME ": WDT driver for 60XX single board computer initialising.\n"); + + misc_register(&wdt_miscdev); + + request_region(WDT_STOP, 1, "SBC 60XX WDT"); + request_region(WDT_START, 1, "SBC 60XX WDT"); + register_reboot_notifier(&wdt_notifier); + + return 0; +} + diff -urN v2.2.15/linux/drivers/char/serial.c linux/drivers/char/serial.c --- v2.2.15/linux/drivers/char/serial.c Wed May 3 17:16:38 2000 +++ linux/drivers/char/serial.c Wed Jun 7 14:26:42 2000 @@ -2782,29 +2782,31 @@ return ret; } -int rs_read_proc(char *page, char **start, off_t off, int count, +int rs_read_proc(char *page, char **start, off_t idx, ssize_t count, int *eof, void *data) { - int i, len = 0, l; - off_t begin = 0; + int n; - len += sprintf(page, "serinfo:1.0 driver:%s\n", serial_version); - for (i = 0; i < NR_PORTS && len < 3900; i++) { - l = line_info(page + len, &rs_table[i]); - len += l; - if (len+begin > off+count) - goto done; - if (len+begin < off) { - begin += len; - len = 0; - } + *start = (char *) 1L; + + if (!idx) { + n = sprintf(page, "serinfo:1.0 driver:%s\n", serial_version); + goto out; } - *eof = 1; -done: - if (off >= len+begin) - return 0; - *start = page + (begin-off); - return ((count < begin+len-off) ? count : begin+len-off); + idx--; + + n = 0; + if (idx >= NR_PORTS || idx < 0) + goto out; + + n = line_info(page, &rs_table[idx]); + if (idx + 1 == NR_PORTS) + *eof = 1; + + out: + if (n > count) + n = 0; + return n; } /* diff -urN v2.2.15/linux/drivers/char/synclink.c linux/drivers/char/synclink.c --- v2.2.15/linux/drivers/char/synclink.c Wed May 3 17:16:39 2000 +++ linux/drivers/char/synclink.c Wed Jun 7 14:26:42 2000 @@ -1,7 +1,7 @@ /* * linux/drivers/char/synclink.c * - * ==FILEDATE 19991207== + * ==FILEDATE 20000220== * * Device driver for Microgate SyncLink ISA and PCI * high speed multiprotocol serial adapters. @@ -33,6 +33,13 @@ * This driver has been tested with a slightly modified ppp.c driver * for synchronous PPP. * + * 2000/02/16 + * Added interface for syncppp.c driver (an alternate synchronous PPP + * implementation that also supports Cisco HDLC). Each device instance + * registers as a tty device AND a network device (if dosyncppp option + * is set for the device). The functionality is determined by which + * device interface is opened. + * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -73,6 +80,8 @@ #include #include +#include + #if LINUX_VERSION_CODE >= VERSION(2,1,0) #include #include @@ -101,6 +110,24 @@ #define set_current_state(a) current->state = (a) #endif +#ifdef CONFIG_SYNCLINK_SYNCPPP_MODULE +#define CONFIG_SYNCLINK_SYNCPPP 1 +#endif + +#ifdef CONFIG_SYNCLINK_SYNCPPP +#if LINUX_VERSION_CODE < VERSION(2,3,43) +#include "../net/syncppp.h" +#define net_device device +#define netif_stop_queue(a) (a)->tbusy = 1 +#define netif_start_queue(a) (a)->tbusy = 0 +#define netif_wake_queue(a) (a)->tbusy = 0; mark_bh(NET_BH) +#define netif_queue_stopped(a) ((a)->tbusy) +#else +#include "../net/wan/syncppp.h" +#define netif_queue_stopped(a) test_bit(LINK_STATE_XOFF,&(a)->state) +#endif +#endif + #if LINUX_VERSION_CODE >= VERSION(2,1,4) #include #define GET_USER(error,value,addr) error = get_user(value,addr) @@ -158,6 +185,7 @@ #define SERIAL_TYPE_NORMAL 1 #define SERIAL_TYPE_CALLOUT 2 typedef int spinlock_t; +#define spin_lock_init(a) #define spin_lock_irqsave(a,b) {save_flags((b));cli();} #define spin_unlock_irqrestore(a,b) {restore_flags((b));} #define spin_lock(a) @@ -207,22 +235,11 @@ /* The queue of BH actions to be performed */ -#define BH_TYPE_RECEIVE_DATA 1 -#define BH_TYPE_RECEIVE_STATUS 2 -#define BH_TYPE_RECEIVE_DMA 3 -#define BH_TYPE_TRANSMIT_DATA 4 -#define BH_TYPE_TRANSMIT_STATUS 5 -#define BH_TYPE_STATUS 6 - -typedef struct _BH_EVENT { - unsigned char type; /* Set by interrupt routines to reqst */ - u16 status; - struct _BH_EVENT *link; - -} BH_EVENT, *BH_QUEUE; /* Queue of BH actions to be done. */ +#define BH_RECEIVE 1 +#define BH_TRANSMIT 2 +#define BH_STATUS 4 -#define MAX_BH_QUEUE_ENTRIES 200 -#define IO_PIN_SHUTDOWN_LIMIT (MAX_BH_QUEUE_ENTRIES/4) +#define IO_PIN_SHUTDOWN_LIMIT 100 #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) @@ -242,6 +259,7 @@ */ struct mgsl_struct { + void *if_ptr; /* General purpose pointer (used by SPPP) */ int magic; int flags; int count; /* count of opens */ @@ -283,12 +301,8 @@ u32 max_frame_size; /* as set by device config */ - BH_EVENT bh_queue[MAX_BH_QUEUE_ENTRIES]; /* Pointer to alloc'ed block */ - BH_QUEUE bh_queue_head; /* Queue of BH actions */ - BH_QUEUE bh_queue_tail; /* Tail of above for perf. */ - BH_QUEUE free_bh_queue_head; /* Queue of Free BH */ - BH_QUEUE free_bh_queue_tail; /* Tail of above for perf. */ - BH_QUEUE bh_action; /* Action for BH */ + u32 pending_bh; + int bh_running; /* Protection from multiple */ int isr_overflow; int bh_requested; @@ -366,6 +380,20 @@ BOOLEAN loopmode_send_done_requested; struct _input_signal_events input_signal_events; + + /* SPPP/Cisco HDLC device parts */ + int netcount; + int dosyncppp; + spinlock_t netlock; +#ifdef CONFIG_SYNCLINK_SYNCPPP + struct ppp_device pppdev; + char netname[10]; + struct net_device *netdev; + struct net_device_stats netstats; +#if LINUX_VERSION_CODE >= VERSION(2,3,43) + struct net_device netdevice; +#endif +#endif }; #define MGSL_MAGIC 0x5401 @@ -767,6 +795,22 @@ void usc_loopmode_send_done( struct mgsl_struct * info ); int usc_loopmode_send_active( struct mgsl_struct * info ); +int mgsl_ioctl_common(struct mgsl_struct *info, unsigned int cmd, unsigned long arg); + +#ifdef CONFIG_SYNCLINK_SYNCPPP +/* SPPP/HDLC stuff */ +void mgsl_sppp_init(struct mgsl_struct *info); +void mgsl_sppp_delete(struct mgsl_struct *info); +int mgsl_sppp_open(struct net_device *d); +int mgsl_sppp_close(struct net_device *d); +void mgsl_sppp_tx_timeout(struct net_device *d); +int mgsl_sppp_tx(struct sk_buff *skb, struct net_device *d); +void mgsl_sppp_rx_done(struct mgsl_struct *info, char *buf, int size); +void mgsl_sppp_tx_done(struct mgsl_struct *info); +int mgsl_sppp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); +struct net_device_stats *mgsl_net_stats(struct net_device *dev); +#endif + /* * Defines a BUS descriptor value for the PCI adapter * local bus address ranges. @@ -828,14 +872,9 @@ * Bottom half interrupt handlers */ void mgsl_bh_handler(void* Context); -void mgsl_bh_receive_dma( struct mgsl_struct *info, unsigned short status ); -void mgsl_bh_transmit_data( struct mgsl_struct *info, unsigned short Datacount ); -void mgsl_bh_status_handler( struct mgsl_struct *info, unsigned short status ); - -void mgsl_format_bh_queue( struct mgsl_struct *info ); -void mgsl_bh_queue_put( struct mgsl_struct *info, unsigned char type, unsigned short status ); -int mgsl_bh_queue_get( struct mgsl_struct *info ); - +void mgsl_bh_receive(struct mgsl_struct *info); +void mgsl_bh_transmit(struct mgsl_struct *info); +void mgsl_bh_status(struct mgsl_struct *info); /* * Interrupt handler routines and dispatch table. @@ -911,7 +950,7 @@ static int dma[MAX_ISA_DEVICES] = {0,}; static int debug_level = 0; static int maxframe[MAX_TOTAL_DEVICES] = {0,}; - +static int dosyncppp[MAX_TOTAL_DEVICES] = {0,}; #if LINUX_VERSION_CODE >= VERSION(2,1,0) MODULE_PARM(break_on_load,"i"); @@ -922,10 +961,11 @@ MODULE_PARM(dma,"1-" __MODULE_STRING(MAX_ISA_DEVICES) "i"); MODULE_PARM(debug_level,"i"); MODULE_PARM(maxframe,"1-" __MODULE_STRING(MAX_TOTAL_DEVICES) "i"); +MODULE_PARM(dosyncppp,"1-" __MODULE_STRING(MAX_TOTAL_DEVICES) "i"); #endif static char *driver_name = "SyncLink serial driver"; -static char *driver_version = "1.15"; +static char *driver_version = "1.18"; static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -1037,152 +1077,46 @@ * Bottom half work queue access functions */ -/* mgsl_format_bh_queue() - * - * Initialize the bottom half processing queue - * - * Arguments: info pointer to device instance data - * Return Value: None - */ -void mgsl_format_bh_queue( struct mgsl_struct *info ) -{ - BH_QUEUE bh_queue = info->bh_queue; - int i; - - /* go through sequentially tacking the little bits together */ - - for ( i=0; i < MAX_BH_QUEUE_ENTRIES; i++ ) { - if ( info->free_bh_queue_tail == NULL ) - info->free_bh_queue_head = bh_queue; - else - info->free_bh_queue_tail->link = bh_queue; - info->free_bh_queue_tail = bh_queue++; - } - - /* As a safety measure, mark the end of the chain with a NULL */ - info->free_bh_queue_tail->link = NULL; - info->isr_overflow=0; - -} /* end of mgsl_format_bh_queue() */ - -/* mgsl_bh_queue_put() - * - * Add a BH event to the BH queue - * - * Arguments: info pointer to device instance data - * type BH event type - * status BH event status - * - * Return Value: None +/* mgsl_bh_action() Return next bottom half action to perform. + * Return Value: BH action code or 0 if nothing to do. */ -void mgsl_bh_queue_put( struct mgsl_struct *info, unsigned char type, unsigned short status ) -{ - BH_EVENT *event = info->free_bh_queue_head; - - if ( event != NULL ) { - /* remove free element from head of free list */ - info->free_bh_queue_head = event->link; - event->link = NULL; - - /* file out new BH event */ - event->type = type; - event->status = status; - - /* add element to tail of pending list */ - if ( info->bh_queue_head != NULL ){ - /* BH queue is not empty, add current element to tail */ - info->bh_queue_tail->link = event; - } else { - /* the BH queue is empty so this element becomes the head of queue */ - info->bh_queue_head = event; - } - - /* the new element becomes tail of queue */ - info->bh_queue_tail = event; - } else { - /* No more free BH action elements in queue. */ - /* This happens when too many interrupts are occuring */ - /* for the mgsl_bh_handler to process so set a flag. */ - - info->isr_overflow = 1; - } - -} /* end of mgsl_bh_queue_put() */ - -/* mgsl_bh_queue_get() - * - * Free the current work item (if any) and get the - * next work item from the head of the pending work item queue. - * - * Effects: - * - * If a BH action element is available on the BH action queue - * then the head of the queue is removed and bh_action - * is set to point to the removed element. - * - * Arguments: info pointer to device instance data - * Return Value: 1 if BH action removed from queue - */ -int mgsl_bh_queue_get( struct mgsl_struct *info ) +int mgsl_bh_action(struct mgsl_struct *info) { unsigned long flags; + int rc = 0; spin_lock_irqsave(&info->irq_spinlock,flags); - if ( info->bh_action ) { - /* free the current work item */ - if ( info->free_bh_queue_head != NULL ){ - /* free queue is not empty, add current element to tail */ - info->free_bh_queue_tail->link = info->bh_action; - } else { - /* free queue is empty so this element becomes the head of queue */ - info->free_bh_queue_head = info->bh_action; - } - - /* add element to tail of free queue */ - info->free_bh_queue_tail = info->bh_action; - info->free_bh_queue_tail->link = NULL; + if (info->pending_bh & BH_RECEIVE) { + info->pending_bh &= ~BH_RECEIVE; + rc = BH_RECEIVE; + } else if (info->pending_bh & BH_TRANSMIT) { + info->pending_bh &= ~BH_TRANSMIT; + rc = BH_TRANSMIT; + } else if (info->pending_bh & BH_STATUS) { + info->pending_bh &= ~BH_STATUS; + rc = BH_STATUS; } - - /* attempt to remove element from head of queue */ - info->bh_action = info->bh_queue_head; - if ( info->bh_action != NULL ){ - /* BH queue is not empty, remove element from queue head */ - info->bh_queue_head = info->bh_action->link; - spin_unlock_irqrestore(&info->irq_spinlock,flags); - return 1; + if (!rc) { + /* Mark BH routine as complete */ + info->bh_running = 0; + info->bh_requested = 0; } - if ( info->isr_overflow ) { - if (debug_level >= DEBUG_LEVEL_BH) - printk("ISR overflow cleared.\n"); - info->isr_overflow=0; - usc_EnableMasterIrqBit(info); - usc_EnableDmaInterrupts(info,DICR_MASTER); - } - - /* Mark BH routine as complete */ - info->bh_running = 0; - info->bh_requested = 0; - spin_unlock_irqrestore(&info->irq_spinlock,flags); - return 0; - -} /* end of mgsl_bh_queue_get() */ + return rc; +} -/* mgsl_bh_handler() - * +/* * Perform bottom half processing of work items queued by ISR. - * - * Arguments: Context pointer to device instance data - * Return Value: None */ void mgsl_bh_handler(void* Context) { struct mgsl_struct *info = (struct mgsl_struct*)Context; - + int action; + if (!info) return; @@ -1192,34 +1126,27 @@ info->bh_running = 1; - /* Attempt to clear out the BH queue */ - - while( mgsl_bh_queue_get(info) ) { + while((action = mgsl_bh_action(info)) != 0) { /* Process work item */ if ( debug_level >= DEBUG_LEVEL_BH ) printk( "%s(%d):mgsl_bh_handler() work item action=%d\n", - __FILE__,__LINE__,info->bh_action->type); + __FILE__,__LINE__,action); - switch ( info->bh_action->type ) { + switch (action) { - case BH_TYPE_RECEIVE_DMA: - mgsl_bh_receive_dma( info, info->bh_action->status ); + case BH_RECEIVE: + mgsl_bh_receive(info); break; - - case BH_TYPE_TRANSMIT_STATUS: - case BH_TYPE_TRANSMIT_DATA: - mgsl_bh_transmit_data( info, info->bh_action->status ); + case BH_TRANSMIT: + mgsl_bh_transmit(info); break; - - case BH_TYPE_STATUS: - mgsl_bh_status_handler( info, info->bh_action->status ); + case BH_STATUS: + mgsl_bh_status(info); break; - default: /* unknown work item ID */ - printk("Unknown work item ID=%08X!\n", - info->bh_action->type ); + printk("Unknown work item ID=%08X!\n", action); break; } } @@ -1227,51 +1154,27 @@ if ( debug_level >= DEBUG_LEVEL_BH ) printk( "%s(%d):mgsl_bh_handler(%s) exit\n", __FILE__,__LINE__,info->device_name); - -} /* end of mgsl_bh_handler() */ +} -/* mgsl_bh_receive_dma() - * - * Perform bottom half processing for a receive DMA interrupt - * This occurs in HDLC mode after a DMA buffer has terminated - * or the DMA buffers have been exhausted. - * - * Arguments: - * - * info pointer to device instance data - * status status word - * - * Return Value: None - */ -void mgsl_bh_receive_dma( struct mgsl_struct *info, unsigned short status ) +void mgsl_bh_receive(struct mgsl_struct *info) { if ( debug_level >= DEBUG_LEVEL_BH ) - printk( "%s(%d):mgsl_bh_receive_dma(%s)\n", + printk( "%s(%d):mgsl_bh_receive(%s)\n", __FILE__,__LINE__,info->device_name); while( mgsl_get_rx_frame(info) ); +} -} /* end of mgsl_bh_receive_dma() */ - -/* mgsl_bh_transmit_data() - * - * Process a transmit data interrupt event - * This occurs in asynchronous communications mode. - * - * Arguments: info pointer to device instance data - * Return Value: None - */ -void mgsl_bh_transmit_data( struct mgsl_struct *info, unsigned short Datacount ) +void mgsl_bh_transmit(struct mgsl_struct *info) { struct tty_struct *tty = info->tty; unsigned long flags; if ( debug_level >= DEBUG_LEVEL_BH ) - printk( "%s(%d):mgsl_bh_transmit_data() entry on %s\n", + printk( "%s(%d):mgsl_bh_transmit() entry on %s\n", __FILE__,__LINE__,info->device_name); - - /* wakeup any waiting write requests */ - if (tty) { + + if (tty) { if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) { if ( debug_level >= DEBUG_LEVEL_BH ) @@ -1280,7 +1183,6 @@ (tty->ldisc.write_wakeup)(tty); } wake_up_interruptible(&tty->write_wait); - wake_up_interruptible(&tty->poll_wait); } /* if transmitter idle and loopmode_send_done_requested @@ -1290,49 +1192,19 @@ if ( !info->tx_active && info->loopmode_send_done_requested ) usc_loopmode_send_done( info ); spin_unlock_irqrestore(&info->irq_spinlock,flags); +} -} /* End Of mgsl_bh_transmit_data() */ - -/* mgsl_bh_status_handler() - * - * Peform bottom half processing for a status interrupt - * - * This event is generated when a I/O pin (serial signal) - * has a transition. If there is a pending WaitEvent call - * and the status transition is identified in the EventMast - * of the pending call then complete the pending call. - * - * Arguments: - * - * info pointer to device instance data - * status status word - * - * Return Value: None - */ -void mgsl_bh_status_handler( struct mgsl_struct *info, unsigned short status ) +void mgsl_bh_status(struct mgsl_struct *info) { if ( debug_level >= DEBUG_LEVEL_BH ) - printk( "%s(%d):mgsl_bh_status_handler() entry on %s\n", + printk( "%s(%d):mgsl_bh_status() entry on %s\n", __FILE__,__LINE__,info->device_name); - if (status & MISCSTATUS_RI_LATCHED) { - if (info->ri_chkcount) - (info->ri_chkcount)--; - } - if (status & MISCSTATUS_DSR_LATCHED) { - if (info->dsr_chkcount) - (info->dsr_chkcount)--; - } - if (status & MISCSTATUS_DCD_LATCHED) { - if (info->dcd_chkcount) - (info->dcd_chkcount)--; - } - if (status & MISCSTATUS_CTS_LATCHED) { - if (info->cts_chkcount) - (info->cts_chkcount)--; - } - -} /* End Of mgsl_bh_status_handler() */ + info->ri_chkcount = 0; + info->dsr_chkcount = 0; + info->dcd_chkcount = 0; + info->cts_chkcount = 0; +} /* mgsl_isr_receive_status() * @@ -1376,12 +1248,6 @@ } if (status & RXSTATUS_OVERRUN){ -// /* Purge receive FIFO to allow DMA buffer completion -// * with overrun status stored in the receive status block. -// */ -// usc_RCmd( info, RCmd_EnterHuntmode ); -// usc_RTCmd( info, RTCmd_PurgeRxFifo ); - info->icount.rxover++; usc_process_rxoverrun_sync( info ); } @@ -1444,13 +1310,19 @@ } info->drop_rts_on_tx_done = 0; } - - if (info->tty->stopped || info->tty->hw_stopped) { - usc_stop_transmitter(info); - return; + +#ifdef CONFIG_SYNCLINK_SYNCPPP + if (info->netcount) + mgsl_sppp_tx_done(info); + else +#endif + { + if (info->tty->stopped || info->tty->hw_stopped) { + usc_stop_transmitter(info); + return; + } + info->pending_bh |= BH_TRANSMIT; } - - mgsl_bh_queue_put(info, BH_TYPE_TRANSMIT_STATUS, status); } /* end of mgsl_isr_transmit_status() */ @@ -1500,9 +1372,13 @@ if ((info->dcd_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) usc_DisablestatusIrqs(info,SICR_DCD); icount->dcd++; - if ( status & MISCSTATUS_DCD ) + if (status & MISCSTATUS_DCD) { info->input_signal_events.dcd_up++; - else +#ifdef CONFIG_SYNCLINK_SYNCPPP + if (info->netcount) + sppp_reopen(info->netdev); +#endif + } else info->input_signal_events.dcd_down++; #ifdef CONFIG_HARD_PPS if ((info->flags & ASYNC_HARDPPS_CD) && @@ -1545,23 +1421,25 @@ if (status & MISCSTATUS_CTS) { if ( debug_level >= DEBUG_LEVEL_ISR ) printk("CTS tx start..."); - info->tty->hw_stopped = 0; + if (info->tty) + info->tty->hw_stopped = 0; usc_start_transmitter(info); - mgsl_bh_queue_put( info, BH_TYPE_TRANSMIT_DATA, status ); + info->pending_bh |= BH_TRANSMIT; return; } } else { if (!(status & MISCSTATUS_CTS)) { if ( debug_level >= DEBUG_LEVEL_ISR ) printk("CTS tx stop..."); - info->tty->hw_stopped = 1; + if (info->tty) + info->tty->hw_stopped = 1; usc_stop_transmitter(info); } } } } - mgsl_bh_queue_put(info, BH_TYPE_STATUS, status); + info->pending_bh |= BH_STATUS; /* for diagnostics set IRQ flag */ if ( status & MISCSTATUS_TXC_LATCHED ){ @@ -1599,7 +1477,7 @@ info->tx_active = 0; if (info->xmit_cnt < WAKEUP_CHARS) - mgsl_bh_queue_put(info, BH_TYPE_TRANSMIT_DATA, (unsigned short)(info->xmit_cnt)); + info->pending_bh |= BH_TRANSMIT; } /* end of mgsl_isr_transmit_data() */ @@ -1791,8 +1669,7 @@ printk("%s(%d):mgsl_isr_receive_dma(%s) status=%04X\n", __FILE__,__LINE__,info->device_name,status); - /* Post a receive event for BH processing. */ - mgsl_bh_queue_put( info, BH_TYPE_RECEIVE_DMA, status ); + info->pending_bh |= BH_RECEIVE; if ( status & BIT3 ) { info->rx_overflow = 1; @@ -1860,7 +1737,7 @@ * for it to do and the bh is not already running */ - if ( info->bh_queue_head && !info->bh_running && !info->bh_requested ) { + if ( info->pending_bh && !info->bh_running && !info->bh_requested ) { if ( debug_level >= DEBUG_LEVEL_ISR ) printk("%s(%d):%s queueing bh task.\n", __FILE__,__LINE__,info->device_name); @@ -1904,7 +1781,7 @@ } } - mgsl_format_bh_queue(info); + info->pending_bh = 0; init_timer(&info->tx_timer); info->tx_timer.data = (unsigned long)info; @@ -1963,6 +1840,8 @@ wake_up_interruptible(&info->status_event_wait_q); wake_up_interruptible(&info->event_wait_q); + del_timer(&info->tx_timer); + if (info->xmit_buf) { free_page((unsigned long) info->xmit_buf); info->xmit_buf = 0; @@ -2002,17 +1881,43 @@ } /* end of shutdown() */ -/* mgsl_change_params() - * - * Reconfigure adapter based on new parameters - * - * Arguments: info pointer to device instance data - * Return Value: None +static void mgsl_program_hw(struct mgsl_struct *info) +{ + unsigned long flags; + + spin_lock_irqsave(&info->irq_spinlock,flags); + + usc_stop_receiver(info); + usc_stop_transmitter(info); + info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; + + if (info->params.mode == MGSL_MODE_HDLC || info->netcount) + usc_set_sync_mode(info); + else + usc_set_async_mode(info); + + usc_set_serial_signals(info); + + info->dcd_chkcount = 0; + info->cts_chkcount = 0; + info->ri_chkcount = 0; + info->dsr_chkcount = 0; + + usc_EnableStatusIrqs(info,SICR_CTS+SICR_DSR+SICR_DCD+SICR_RI); + usc_EnableInterrupts(info, IO_PIN); + usc_get_serial_signals(info); + + if (info->netcount || info->tty->termios->c_cflag & CREAD) + usc_start_receiver(info); + + spin_unlock_irqrestore(&info->irq_spinlock,flags); +} + +/* Reconfigure adapter based on new parameters */ static void mgsl_change_params(struct mgsl_struct *info) { unsigned cflag; - unsigned long flags; int bits_per_char; if (!info->tty || !info->tty->termios) @@ -2120,35 +2025,7 @@ info->ignore_status_mask |= RXSTATUS_OVERRUN; } - /* reprogram the hardware */ - - spin_lock_irqsave(&info->irq_spinlock,flags); - - usc_stop_receiver(info); - usc_stop_transmitter(info); - info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; - - if ( info->params.mode == MGSL_MODE_HDLC ) - usc_set_sync_mode(info); - else - usc_set_async_mode(info); - - usc_set_serial_signals(info); - - info->dcd_chkcount = 0; - info->cts_chkcount = 0; - info->ri_chkcount = 0; - info->dsr_chkcount = 0; - - /* enable modem signal IRQs and read initial signal states */ - usc_EnableStatusIrqs(info,SICR_CTS+SICR_DSR+SICR_DCD+SICR_RI); - usc_EnableInterrupts(info, IO_PIN); - usc_get_serial_signals(info); - - if ( cflag & CREAD ) - usc_start_receiver(info); - - spin_unlock_irqrestore(&info->irq_spinlock,flags); + mgsl_program_hw(info); } /* end of mgsl_change_params() */ @@ -2479,7 +2356,6 @@ spin_unlock_irqrestore(&info->irq_spinlock,flags); wake_up_interruptible(&tty->write_wait); - wake_up_interruptible(&tty->poll_wait); if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) (tty->ldisc.write_wakeup)(tty); @@ -3117,11 +2993,7 @@ static int mgsl_ioctl(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) { - int error; struct mgsl_struct * info = (struct mgsl_struct *)tty->driver_data; - struct mgsl_icount cprev, cnow; /* kernel counter temps */ - struct serial_icounter_struct *p_cuser; /* user space */ - unsigned long flags; if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgsl_ioctl %s cmd=%08X\n", __FILE__,__LINE__, @@ -3135,6 +3007,16 @@ if (tty->flags & (1 << TTY_IO_ERROR)) return -EIO; } + + return mgsl_ioctl_common(info, cmd, arg); +} + +int mgsl_ioctl_common(struct mgsl_struct *info, unsigned int cmd, unsigned long arg) +{ + int error; + struct mgsl_icount cprev, cnow; /* kernel counter temps */ + struct serial_icounter_struct *p_cuser; /* user space */ + unsigned long flags; switch (cmd) { case TIOCMGET: @@ -3235,10 +3117,9 @@ if (error) return error; #endif return 0; - default: return -ENOIOCTLCMD; - } + } return 0; } @@ -3664,6 +3545,7 @@ struct mgsl_struct *info; int retval, line; unsigned long page; + unsigned long flags; /* verify range of specified line number */ line = MINOR(tty->device) - tty->driver.minor_start; @@ -3719,7 +3601,15 @@ info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; #endif + spin_lock_irqsave(&info->netlock, flags); + if (info->netcount) { + retval = -EBUSY; + spin_unlock_irqrestore(&info->netlock, flags); + goto cleanup; + } info->count++; + spin_unlock_irqrestore(&info->netlock, flags); + if (info->count == 1) { /* 1st open on this device, init hardware */ retval = startup(info); @@ -3835,9 +3725,9 @@ /* Append serial signal status to end */ ret += sprintf(buf+ret, " %s\n", stat_buf+1); - ret += sprintf(buf+ret, "txactive=%d bh_req=%d bh_run=%d bh_q=%p\n", + ret += sprintf(buf+ret, "txactive=%d bh_req=%d bh_run=%d pending_bh=%x\n", info->tx_active,info->bh_requested,info->bh_running, - info->bh_queue_head); + info->pending_bh); spin_lock_irqsave(&info->irq_spinlock,flags); { @@ -3902,7 +3792,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } /* end of mgsl_read_proc() */ @@ -4400,6 +4290,12 @@ info->line = mgsl_device_count; sprintf(info->device_name,"ttySL%d",info->line); + if (info->line < MAX_TOTAL_DEVICES) { + if (maxframe[info->line]) + info->max_frame_size = maxframe[info->line]; + info->dosyncppp = dosyncppp[info->line]; + } + mgsl_device_count++; if ( !mgsl_device_list ) @@ -4426,7 +4322,11 @@ info->device_name, info->io_base, info->irq_level, info->dma_level, info->max_frame_size ); } - + +#ifdef CONFIG_SYNCLINK_SYNCPPP + if (info->dosyncppp) + mgsl_sppp_init(info); +#endif } /* end of mgsl_add_device() */ /* mgsl_allocate_device() @@ -4458,7 +4358,8 @@ init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->status_event_wait_q); init_waitqueue_head(&info->event_wait_q); - + spin_lock_init(&info->irq_spinlock); + spin_lock_init(&info->netlock); memcpy(&info->params,&default_params,sizeof(MGSL_PARAMS)); info->idle_mode = HDLC_TXIDLE_FLAGS; } @@ -4479,7 +4380,6 @@ { struct mgsl_struct *info; int i; - int num_devices = 0; /* Check for user specified ISA devices */ @@ -4510,15 +4410,7 @@ info->io_addr_size = 16; info->irq_flags = 0; - /* override default max frame size if arg available */ - if ( num_devices < MAX_TOTAL_DEVICES && - maxframe[num_devices] ) - info->max_frame_size = maxframe[num_devices]; - - /* add new device to device list */ mgsl_add_device( info ); - - ++num_devices; } @@ -4604,11 +4496,6 @@ info->bus = bus; info->function = func; - /* override default max frame size if arg available */ - if ( num_devices < MAX_TOTAL_DEVICES && - maxframe[num_devices] ) - info->max_frame_size = maxframe[num_devices]; - /* Store the PCI9050 misc control register value because a flaw * in the PCI9050 prevents LCR registers from being read if * BIOS assigns an LCR base address with bit 7 set. @@ -4794,6 +4681,10 @@ info = mgsl_device_list; while(info) { +#ifdef CONFIG_SYNCLINK_SYNCPPP + if (info->dosyncppp) + mgsl_sppp_delete(info); +#endif mgsl_release_resources(info); info = info->next_device; } @@ -6806,6 +6697,10 @@ else info->icount.rxcrc++; framesize = 0; +#ifdef CONFIG_SYNCLINK_SYNCPPP + info->netstats.rx_errors++; + info->netstats.rx_frame_errors++; +#endif } else { /* receive frame has no errors, get frame size. * The frame size is the starting value of the RCC (which was @@ -6834,19 +6729,14 @@ if (framesize > info->max_frame_size) info->icount.rxlong++; else { -#if 1 - /* - * copy contents of dma frame buffer(s) to intermediate - * rxbuffer for presentation to line discipline - */ + /* copy dma buffer(s) to contiguous intermediate buffer */ int copy_count = framesize; int index = StartIndex; unsigned char *ptmp = info->intermediate_rxbuffer; info->icount.rxok++; - while( copy_count ) - { + while(copy_count) { int partial_count; if ( copy_count > DMABUFFERSIZE ) partial_count = DMABUFFERSIZE; @@ -6860,17 +6750,19 @@ if ( ++index == info->rx_buffer_count ) index = 0; - } - - /* Call the line discipline receive callback directly. */ - tty->ldisc.receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize); -#else - info->icount.rxok++; - pBufEntry = &(info->rx_buffer_list[StartIndex]); - /* Call the line discipline receive callback directly. */ - tty->ldisc.receive_buf(tty, pBufEntry->virt_addr, info->flag_buf, framesize); + +#ifdef CONFIG_SYNCLINK_SYNCPPP + if (info->netcount) { + /* pass frame to syncppp device */ + mgsl_sppp_rx_done(info,info->intermediate_rxbuffer,framesize); + } + else #endif + { + /* Call the line discipline receive callback directly. */ + tty->ldisc.receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize); + } } } /* Free the buffers used by this frame. */ @@ -7590,7 +7482,12 @@ spin_unlock_irqrestore(&info->irq_spinlock,flags); - mgsl_bh_transmit_data(info,0); +#ifdef CONFIG_SYNCLINK_SYNCPPP + if (info->netcount) + mgsl_sppp_tx_done(info); + else +#endif + mgsl_bh_transmit(info); } /* end of mgsl_tx_timeout() */ @@ -7668,3 +7565,223 @@ return usc_InReg( info, CCSR ) & BIT6 ? 1 : 0 ; } +#ifdef CONFIG_SYNCLINK_SYNCPPP +/* syncppp net device routines + */ + +void mgsl_sppp_init(struct mgsl_struct *info) +{ + struct net_device *d; + + sprintf(info->netname,"mgsl%d",info->line); + +#if LINUX_VERSION_CODE < VERSION(2,3,43) + info->netdev = &info->pppdev.dev; +#else + info->if_ptr = &info->pppdev; + info->netdev = info->pppdev.dev = &info->netdevice; +#endif + sppp_attach(&info->pppdev); + + d = info->netdev; + d->name = info->netname; + d->base_addr = info->io_base; + d->irq = info->irq_level; + d->dma = info->dma_level; + d->priv = info; + d->init = NULL; + d->open = mgsl_sppp_open; + d->stop = mgsl_sppp_close; + d->hard_start_xmit = mgsl_sppp_tx; + d->do_ioctl = mgsl_sppp_ioctl; + d->get_stats = mgsl_net_stats; +#if LINUX_VERSION_CODE >= VERSION(2,3,43) + d->tx_timeout = mgsl_sppp_tx_timeout; + d->watchdog_timeo = 10*HZ; +#endif + dev_init_buffers(d); + + if (register_netdev(d) == -1) { + printk(KERN_WARNING "%s: register_netdev failed.\n", d->name); + sppp_detach(info->netdev); + return; + } + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("mgsl_sppp_init()\n"); +} + +void mgsl_sppp_delete(struct mgsl_struct *info) +{ + if (debug_level >= DEBUG_LEVEL_INFO) + printk("mgsl_sppp_delete(%s)\n",info->netname); + sppp_detach(info->netdev); + unregister_netdev(info->netdev); +} + +int mgsl_sppp_open(struct net_device *d) +{ + struct mgsl_struct *info = d->priv; + int err, flags; + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("mgsl_sppp_open(%s)\n",info->netname); + + spin_lock_irqsave(&info->netlock, flags); + if (info->count != 0 || info->netcount != 0) { + printk(KERN_WARNING "%s: sppp_open returning busy\n", info->netname); + spin_unlock_irqrestore(&info->netlock, flags); + return -EBUSY; + } + info->netcount=1; + MOD_INC_USE_COUNT; + spin_unlock_irqrestore(&info->netlock, flags); + + /* claim resources and init adapter */ + if ((err = startup(info)) != 0) + goto open_fail; + + /* allow syncppp module to do open processing */ + if ((err = sppp_open(d)) != 0) { + shutdown(info); + goto open_fail; + } + + info->serial_signals |= SerialSignal_RTS + SerialSignal_DTR; + mgsl_program_hw(info); + + d->trans_start = jiffies; + netif_start_queue(d); + return 0; + +open_fail: + spin_lock_irqsave(&info->netlock, flags); + info->netcount=0; + MOD_DEC_USE_COUNT; + spin_unlock_irqrestore(&info->netlock, flags); + return err; +} + +void mgsl_sppp_tx_timeout(struct net_device *dev) +{ + struct mgsl_struct *info = dev->priv; + int flags; + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("mgsl_sppp_tx_timeout(%s)\n",info->netname); + + info->netstats.tx_errors++; + info->netstats.tx_aborted_errors++; + + spin_lock_irqsave(&info->irq_spinlock,flags); + usc_stop_transmitter(info); + spin_unlock_irqrestore(&info->irq_spinlock,flags); + + netif_wake_queue(dev); +} + +int mgsl_sppp_tx(struct sk_buff *skb, struct net_device *dev) +{ + struct mgsl_struct *info = dev->priv; + unsigned long flags; + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("mgsl_sppp_tx(%s)\n",info->netname); + +#if LINUX_VERSION_CODE < VERSION(2,3,43) + if (dev->tbusy) { + if (time_before(jiffies, dev->trans_start+10*HZ)) + return -EBUSY; /* 10 seconds timeout */ + mgsl_sppp_tx_timeout(dev); + } + if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) + return -EBUSY; +#else + netif_stop_queue(dev); +#endif + + info->xmit_cnt = skb->len; + mgsl_load_tx_dma_buffer(info, skb->data, skb->len); + info->netstats.tx_packets++; + info->netstats.tx_bytes += skb->len; + dev_kfree_skb(skb); + + dev->trans_start = jiffies; + + spin_lock_irqsave(&info->irq_spinlock,flags); + if (!info->tx_active) + usc_start_transmitter(info); + spin_unlock_irqrestore(&info->irq_spinlock,flags); + + return 0; +} + +int mgsl_sppp_close(struct net_device *d) +{ + struct mgsl_struct *info = d->priv; + unsigned long flags; + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("mgsl_sppp_close(%s)\n",info->netname); + + /* shutdown adapter and release resources */ + shutdown(info); + + /* allow syncppp to do close processing */ + sppp_close(d); + netif_stop_queue(d); + + spin_lock_irqsave(&info->netlock, flags); + info->netcount=0; + MOD_DEC_USE_COUNT; + spin_unlock_irqrestore(&info->netlock, flags); + return 0; +} + +void mgsl_sppp_rx_done(struct mgsl_struct *info, char *buf, int size) +{ + struct sk_buff *skb = dev_alloc_skb(size); + if (debug_level >= DEBUG_LEVEL_INFO) + printk("mgsl_sppp_rx_done(%s)\n",info->netname); + if (skb == NULL) { + printk(KERN_NOTICE "%s: cant alloc skb, dropping packet\n", + info->netname); + info->netstats.rx_dropped++; + return; + } + + memcpy(skb_put(skb, size),buf,size); + + skb->protocol = htons(ETH_P_WAN_PPP); + skb->dev = info->netdev; + skb->mac.raw = skb->data; + info->netstats.rx_packets++; + info->netstats.rx_bytes += size; + netif_rx(skb); + info->netdev->trans_start = jiffies; +} + +void mgsl_sppp_tx_done(struct mgsl_struct *info) +{ + if (netif_queue_stopped(info->netdev)) + netif_wake_queue(info->netdev); +} + +struct net_device_stats *mgsl_net_stats(struct net_device *dev) +{ + struct mgsl_struct *info = dev->priv; + if (debug_level >= DEBUG_LEVEL_INFO) + printk("mgsl_net_stats(%s)\n",info->netname); + return &info->netstats; +} + +int mgsl_sppp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ + struct mgsl_struct *info = (struct mgsl_struct *)dev->priv; + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):mgsl_ioctl %s cmd=%08X\n", __FILE__,__LINE__, + info->netname, cmd ); + return sppp_do_ioctl(dev, ifr, cmd); +} + +#endif /* ifdef CONFIG_SYNCLINK_SYNCPPP */ diff -urN v2.2.15/linux/drivers/char/tty_io.c linux/drivers/char/tty_io.c --- v2.2.15/linux/drivers/char/tty_io.c Wed May 3 17:16:39 2000 +++ linux/drivers/char/tty_io.c Wed Jun 7 14:26:42 2000 @@ -132,6 +132,9 @@ #ifdef CONFIG_3215 extern long con3215_init(long, long); #endif /* CONFIG_3215 */ +#ifdef CONFIG_HWC_CONSOLE +extern long hwc_console_init(long); +#endif #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) diff -urN v2.2.15/linux/drivers/i2o/README.ioctl linux/drivers/i2o/README.ioctl --- v2.2.15/linux/drivers/i2o/README.ioctl Wed May 3 17:16:39 2000 +++ linux/drivers/i2o/README.ioctl Wed Jun 7 14:26:42 2000 @@ -25,10 +25,10 @@ II. IOP Access Access to the I2O subsystem is provided through the device file named -/dev/i2octl. This file is a character file with major number 10 and minor +/dev/i2o/ctl. This file is a character file with major number 10 and minor number 166. It can be created through the following command: - mknod /dev/i2octl c 10 166 + mknod /dev/i2o/ctl c 10 166 III. Determining the IOP Count @@ -373,7 +373,7 @@ In the process of determining this. Current idea is to have use the select() interface to allow user apps to periodically poll - the /dev/i2octl device for events. When select() notifies the user + the /dev/i2o/ctl device for events. When select() notifies the user that an event is available, the user would call read() to retrieve a list of all the events that are pending for the specific device. diff -urN v2.2.15/linux/drivers/i2o/i2o_block.c linux/drivers/i2o/i2o_block.c --- v2.2.15/linux/drivers/i2o/i2o_block.c Wed May 3 17:16:39 2000 +++ linux/drivers/i2o/i2o_block.c Wed Jun 7 14:26:42 2000 @@ -20,6 +20,8 @@ * Alan Cox: FC920 has an rmw bug. Dont or in the * end marker. * Removed queue walk, fixed for 64bitness. + * Boji T Kannanthanam: + * Support for dynamic device creation/deletion * To do: * Multiple majors * Serial number scanning to find duplicates for FC multipathing @@ -46,8 +48,12 @@ #include #include +#include #include #include +#include +#include + #define MAJOR_NR I2O_MAJOR @@ -55,9 +61,39 @@ #define MAX_I2OB 16 -#define MAX_I2OB_DEPTH 32 +#define MAX_I2OB_DEPTH 128 #define MAX_I2OB_RETRIES 4 + +/* + * Events that this OSM is interested in + */ +#define I2OB_EVENT_MASK (I2O_EVT_IND_BSA_VOLUME_LOAD | \ + I2O_EVT_IND_BSA_VOLUME_UNLOAD | \ + I2O_EVT_IND_BSA_VOLUME_UNLOAD_REQ | \ + I2O_EVT_IND_BSA_CAPACITY_CHANGE) + + +/* + * I2O Block Error Codes - should be in a header file really... + */ +#define I2O_BSA_DSC_SUCCESS 0x0000 +#define I2O_BSA_DSC_MEDIA_ERROR 0x0001 +#define I2O_BSA_DSC_ACCESS_ERROR 0x0002 +#define I2O_BSA_DSC_DEVICE_FAILURE 0x0003 +#define I2O_BSA_DSC_DEVICE_NOT_READY 0x0004 +#define I2O_BSA_DSC_MEDIA_NOT_PRESENT 0x0005 +#define I2O_BSA_DSC_MEDIA_LOCKED 0x0006 +#define I2O_BSA_DSC_MEDIA_FAILURE 0x0007 +#define I2O_BSA_DSC_PROTOCOL_FAILURE 0x0008 +#define I2O_BSA_DSC_BUS_FAILURE 0x0009 +#define I2O_BSA_DSC_ACCESS_VIOLATION 0x000A +#define I2O_BSA_DSC_WRITE_PROTECTED 0x000B +#define I2O_BSA_DSC_DEVICE_RESET 0x000C +#define I2O_BSA_DSC_VOLUME_CHANGED 0x000D +#define I2O_BSA_DSC_TIMEOUT 0x000E + + /* * Some of these can be made smaller later */ @@ -74,10 +110,12 @@ { struct i2o_controller *controller; struct i2o_device *i2odev; + int unit; int tid; int flags; int refcnt; struct request *head, *tail; + int max_segments; int done_flag; }; @@ -101,9 +139,20 @@ static struct i2ob_device i2ob_dev[MAX_I2OB<<4]; static int i2ob_devices = 0; +static int i2ob_dev_count = 0; static struct hd_struct i2ob[MAX_I2OB<<4]; static struct gendisk i2ob_gendisk; /* Declared later */ +/* + * Mutex and spin lock for event handling synchronization + * evt_msg contains the last event. + */ +DECLARE_MUTEX(i2ob_evt_sem); +static spinlock_t i2ob_evt_lock = SPIN_LOCK_UNLOCKED; +static unsigned int evt_msg[MSG_FRAME_SIZE>>2]; +DECLARE_WAIT_QUEUE_HEAD(i2ob_evt_wait); + + static atomic_t queue_depth; /* For flow control later on */ static struct i2ob_request i2ob_queue[MAX_I2OB_DEPTH+1]; static struct i2ob_request *i2ob_qhead; @@ -118,20 +167,31 @@ static int i2ob_install_device(struct i2o_controller *, struct i2o_device *, int); static void i2ob_end_request(struct request *); static void i2ob_request(struct request * q); +static int do_i2ob_revalidate(kdev_t, int); +static int i2ob_query_device(struct i2ob_device *, int, int, void*, int); +static int i2ob_evt(void *); + +static int evt_pid = 0; +static int evt_running = 0; + +static void i2ob_new_device(struct i2o_controller *, struct i2o_device *); +static void i2ob_del_device(struct i2o_controller *, struct i2o_device *); +static void i2ob_reboot_event(void); + /* * Dump messages. */ static void i2ob_dump_msg(struct i2ob_device *dev,u32 *msg,int size) { - int cnt; + int cnt; - printk(KERN_INFO "\n\ni2o message:\n"); - for (cnt = 0; cntmem_offset + m; /* - * Build the message based on the request. + * Build the message based on the request. */ writel(i2ob_context|(unit<<8), msg+8); writel(ireq->num, msg+12); @@ -283,6 +343,7 @@ u8 st; u32 *m = (u32 *)msg; u8 unit = (m[2]>>8)&0xF0; /* low 4 bits are partition */ + struct i2ob_device *dev = &i2ob_dev[(unit&0xF0)]; if(m[0] & (1<<13)) { @@ -313,43 +374,83 @@ i2o_post_message(c,virt_to_bus(m)); } - else + + if(msg->function == I2O_CMD_UTIL_EVT_REGISTER) + { + spin_lock(&i2ob_evt_lock); + memcpy(&evt_msg, m, msg->size); + spin_unlock(&i2ob_evt_lock); + wake_up_interruptible(&i2ob_evt_wait); + return; + } + if(!dev->i2odev) { - if(m[2]&0x40000000) - { - int * ptr = (int *)m[3]; - if(m[4]>>24) - *ptr = -1; - else - *ptr = 1; - return; - } /* - * Lets see what is cooking. We stuffed the - * request in the context. + * This is HACK, but Intel Integrated RAID allows user + * to delete a volume that is claimed, locked, and in use + * by the OS. We have to check for a reply from a + * non-existent device and flag it as an error or the system + * goes kaput... */ + printk(KERN_INFO "I2O Block: Data transfer to deleted device!\n"); + + ireq=&i2ob_queue[m[3]]; + ireq->req->errors++; + printk(KERN_WARNING "I2O Block: Data transfer to deleted device!\n"); + spin_lock_irqsave(&io_request_lock, flags); + i2ob_unhook_request(ireq); + i2ob_end_request(ireq->req); + spin_unlock_irqrestore(&io_request_lock, flags); + return; + } + /* + * Lets see what is cooking. We stuffed the + * request in the context. + */ + ireq=&i2ob_queue[m[3]]; st=m[4]>>24; if(st!=0) { - printk(KERN_ERR "i2ob: error %08X\n", m[4]); + char *bsa_errors[] = + { + "Success", + "Media Error", + "Failure communicating to device", + "Device Failure", + "Device is not ready", + "Media not present", + "Media is locked by another user", + "Media has failed", + "Failure communicating to device", + "Device bus failure", + "Device is locked by another user", + "Device is write protected", + "Device has reset", + "Volume has changed, waiting for acknowledgement" + }; + printk(KERN_ERR "\n/dev/%s error: %s", dev->i2odev->dev_name, bsa_errors[m[4]&0XFFFF]); + + if(m[4]&0x00FF0000) + printk(" - DDM attempted %d retries", (m[4]>>16)&0x00FF); + printk("\n"); + ireq->req->errors++; + if (ireq->req->errors < MAX_I2OB_RETRIES) { u32 retry_msg; - struct i2ob_device *dev; printk(KERN_ERR "i2ob: attempting retry %d for request %p\n",ireq->req->errors+1,ireq->req); - /* + /* * Get a message for this retry. */ - dev = &i2ob_dev[(unit&0xF0)]; - retry_msg = i2ob_get(dev); + retry_msg = i2ob_get(dev); - /* + /* * If we cannot get a message then * forget the retry and fail the * request. Note that since this is @@ -359,20 +460,20 @@ * be space on the inbound message * fifo so this won't happen often. */ - if(retry_msg!=0xFFFFFFFF) + if(retry_msg!=0xFFFFFFFF) { - /* - * Decrement the queue depth since - * this request has completed and - * it will be incremented again when - * i2ob_send is called below. - */ - atomic_dec(&queue_depth); - - /* - * Send the request again. - */ - i2ob_send(retry_msg, dev,ireq,i2ob[unit].start_sect, (unit&0xF0)); + /* + * Decrement the queue depth since + * this request has completed and + * it will be incremented again when + * i2ob_send is called below. + */ + atomic_dec(&queue_depth); + + /* + * Send the request again. + */ + i2ob_send(retry_msg, dev,ireq,i2ob[unit].start_sect, (unit&0xF0)); /* * Don't fall through. */ @@ -382,7 +483,6 @@ } else ireq->req->errors = 0; - } /* * Dequeue the request. We use irqsave locks as one day we @@ -402,9 +502,148 @@ spin_unlock_irqrestore(&io_request_lock, flags); } + +/* + * Event handler. Needs to be a separate thread b/c we may have + * to do things like scan a partition table, or query parameters + * which cannot be done from an interrupt or from a bottom half. + */ +static int i2ob_evt(void *dummy) +{ + unsigned int evt; + unsigned int flags; + int unit; + int i; + struct fs_struct *fs; + + lock_kernel(); + + exit_files(current); + exit_mm(current); + current->session = 1; + current->pgrp = 1; + /* Become as one with the init task */ + exit_fs(current); + fs = init_task.fs; + current->fs = fs; + atomic_inc(&fs->count); + + unlock_kernel(); + + strcpy(current->comm, "i2oblock"); + evt_running = 1; + + while(1) + { + interruptible_sleep_on(&i2ob_evt_wait); + if(signal_pending(current)) { + evt_running = 0; + return 0; + } + + /* + * Keep another CPU/interrupt from overwriting the + * message while we're reading it + * + * We stuffed the unit in the TxContext and grab the event mask + * None of the BSA we care about events have EventData + */ + spin_lock_irqsave(&i2ob_evt_lock, flags); + unit = evt_msg[3]; + evt = evt_msg[4]; + spin_unlock_irqrestore(&i2ob_evt_lock, flags); + + switch(evt) + { + /* + * New volume loaded on same TID, so we just re-install. + * The TID/controller don't change as it is the same + * I2O device. It's just new media that we have to + * rescan. + */ + case I2O_EVT_IND_BSA_VOLUME_LOAD: + { + i2ob_install_device(i2ob_dev[unit].i2odev->controller, + i2ob_dev[unit].i2odev, unit); + break; + } + + /* + * No media, so set all parameters to 0 and set the media + * change flag. The I2O device is still valid, just doesn't + * have media, so we don't want to clear the controller or + * device pointer. + */ + case I2O_EVT_IND_BSA_VOLUME_UNLOAD: + { + for(i = unit; i <= unit+15; i++) + { + i2ob_sizes[i] = 0; + i2ob_hardsizes[i] = 0; + i2ob_max_sectors[i] = 0; + i2ob[i].nr_sects = 0; + i2ob_gendisk.part[i].nr_sects = 0; + } + i2ob_media_change_flag[unit] = 1; + break; + } + + case I2O_EVT_IND_BSA_VOLUME_UNLOAD_REQ: + printk(KERN_WARNING "%s: Attempt to eject locked media\n", + i2ob_dev[unit].i2odev->dev_name); + break; + + /* + * The capacity has changed and we are going to be + * updating the max_sectors and other information + * about this disk. We try a revalidate first. If + * the block device is in use, we don't want to + * do that as there may be I/Os bound for the disk + * at the moment. In that case we read the size + * from the device and update the information ourselves + * and the user can later force a partition table + * update through an ioctl. + */ + case I2O_EVT_IND_BSA_CAPACITY_CHANGE: + { + u64 size; + + if(do_i2ob_revalidate(MKDEV(MAJOR_NR, unit),0) != -EBUSY) + continue; + + if(i2ob_query_device(&i2ob_dev[unit], 0x0004, 0, &size, 8) !=0 ) + i2ob_query_device(&i2ob_dev[unit], 0x0000, 4, &size, 8); + + spin_lock_irqsave(&io_request_lock, flags); + i2ob_sizes[unit] = (int)(size>>10); + i2ob_gendisk.part[unit].nr_sects = size>>9; + i2ob[unit].nr_sects = (int)(size>>9); + spin_unlock_irqrestore(&io_request_lock, flags); + break; + } + + /* + * An event we didn't ask for. Call the card manufacturer + * and tell them to fix their firmware :) + */ + default: + printk(KERN_INFO "%s: Received event we didn't register for\n" + KERN_INFO " Call I2O card manufacturer\n", + i2ob_dev[unit].i2odev->dev_name); + break; + } + }; + + return 0; +} + + static struct i2o_handler i2o_block_handler = { i2o_block_reply, + i2ob_new_device, + i2ob_del_device, + i2ob_reboot_event, "I2O Block OSM", 0, I2O_CLASS_RANDOM_BLOCK_STORAGE @@ -423,7 +662,7 @@ /* * We cannot touch the request queue or the timer - * flag without holding the io_request_lock. + * flag without holding the io_request_lock. */ spin_lock_irqsave(&io_request_lock,flags); @@ -454,6 +693,7 @@ static void i2ob_request(struct request * q) { + unsigned long flags; struct request *req; struct i2ob_request *ireq; int unit; @@ -480,6 +720,22 @@ req = CURRENT; unit = MINOR(req->rq_dev); dev = &i2ob_dev[(unit&0xF0)]; + + /* + * Check to see if the request is for a deleted/non-existent + * device. If so return. + */ + if (dev->i2odev == NULL) + { + printk("I2O: ERROR I/O Request to a non existent device !\n"); + req->errors = 1; + CURRENT = CURRENT->next; + req->sem = NULL; + i2ob_end_request(req); + } + + else + { /* Get a message */ m = i2ob_get(dev); @@ -522,6 +778,7 @@ ireq->req = req; i2ob_send(m, dev, ireq, i2ob[unit].start_sect, (unit&0xF0)); + } } } @@ -545,12 +802,12 @@ temp = cylinders * sectors; /* Compute divisor for heads */ heads = capacity / temp; /* Compute value for number of heads */ if (capacity % temp) { /* If no remainder, done! */ - heads++; /* Else, increment number of heads */ + heads++; /* Else, increment number of heads */ temp = cylinders * heads; /* Compute divisor for sectors */ sectors = capacity / temp; /* Compute value for sectors per - track */ + track */ if (capacity % temp) { /* If no remainder, done! */ - sectors++; /* Else, increment number of sectors */ + sectors++; /* Else, increment number of sectors */ temp = heads * sectors; /* Compute divisor for cylinders */ cylinders = capacity / temp;/* Compute number of cylinders */ } @@ -695,6 +952,24 @@ if (minor >= (MAX_I2OB<<4)) return -ENODEV; dev = &i2ob_dev[(minor&0xF0)]; + + /* + * This is to deal with the case of an application + * opening a device and then the device dissapears while + * it's in use, and then the application tries to release + * it. ex: Unmounting a deleted RAID volume at reboot. + * If we send messages, it will just cause FAILs since + * the TID no longer exists. + */ + if(!dev->i2odev) + { + printk(KERN_INFO "I2O : ERROR No such Device\n"); + return 0; + } + + /* Sync the device so we don't get errors */ + fsync_dev(inode->i_rdev); + if (dev->refcnt <= 0) printk(KERN_ALERT "i2ob_release: refcount(%d) <= 0\n", dev->refcnt); dev->refcnt--; @@ -727,7 +1002,7 @@ /* * Now unclaim the device. */ - if (i2o_release_device(dev->i2odev, &i2o_block_handler, I2O_CLAIM_PRIMARY)<0) + if (i2o_release_device(dev->i2odev, &i2o_block_handler)<0) printk(KERN_ERR "i2ob_release: controller rejected unclaim.\n"); } @@ -759,7 +1034,7 @@ int *query_done; - if(i2o_claim_device(dev->i2odev, &i2o_block_handler, I2O_CLAIM_PRIMARY)<0) + if(i2o_claim_device(dev->i2odev, &i2o_block_handler)<0) { dev->refcnt--; return -EBUSY; @@ -819,11 +1094,16 @@ struct i2ob_device *dev=&i2ob_dev[unit]; int i; + /* + * For logging purposes... + */ + printk(KERN_INFO "i2ob: Installing tid %d device at unit %d\n", + d->lct_data.tid, unit); + /* * Ask for the current media data. If that isn't supported * then we ask for the device capacity data */ - if(i2ob_query_device(dev, 0x0004, 1, &blocksize, 4) != 0 || i2ob_query_device(dev, 0x0004, 0, &size, 8) !=0 ) { @@ -835,23 +1115,38 @@ i2ob_query_device(dev, 0x0000, 6, &status, 4); i2ob_sizes[unit] = (int)(size>>10); i2ob_hardsizes[unit] = blocksize; + i2ob_gendisk.part[unit].nr_sects = size>>9; + i2ob[unit].nr_sects = (int)(size>>9); - limit=4096; /* 8 deep scatter gather */ + /* Set limit based on inbound frame size */ + limit = (d->controller->status_block->inbound_frame_size - 8)/2; + limit = limit<<9; + + /* + * Max number of Scatter-Gather Elements + */ + i2ob_dev[unit].max_segments = + (d->controller->status_block->inbound_frame_size - 8)/2; + + printk(KERN_INFO "Max Segments set to %d\n", + i2ob_dev[unit].max_segments); + printk(KERN_INFO "Byte limit is %d.\n", limit); + + for(i=unit;i<=unit+15;i++) + { + i2ob_max_sectors[i]=MAX_SECTORS; + i2ob_dev[i].max_segments = + (d->controller->status_block->inbound_frame_size - 8)/2; } - printk("Byte limit is %d.\n", limit); - - for(i=unit;i<=unit+15;i++) - i2ob_max_sectors[i]=(limit>>9); - - i2ob[unit].nr_sects = (int)(size>>9); i2ob_query_device(dev, 0x0000, 0, &type, 1); sprintf(d->dev_name, "%s%c", i2ob_gendisk.major_name, 'a' + (unit>>4)); - printk("%s: ", d->dev_name); + printk(KERN_INFO "%s: ", d->dev_name); + if(status&(1<<10)) - printk("RAID "); + printk("(RAID) "); switch(type) { case 0: printk("Disk Storage");break; @@ -864,10 +1159,10 @@ if(((flags & (1<<3)) && !(status & (1<<3))) || ((flags & (1<<4)) && !(status & (1<<4)))) { - printk(" Not loaded.\n"); - return 0; + printk(KERN_INFO " Not loaded.\n"); + return 1; } - printk(" %dMb, %d byte sectors", + printk("- %dMb, %d byte sectors", (int)(size>>20), blocksize); if(status&(1<<0)) { @@ -880,9 +1175,18 @@ printk(", %dKb cache", cachesize); } printk(".\n"); - printk("%s: Maximum sectors/read set to %d.\n", + printk(KERN_INFO "%s: Maximum sectors/read set to %d.\n", d->dev_name, i2ob_max_sectors[unit]); + resetup_one_dev(&i2ob_gendisk, unit>>4); + + /* + * Register for the events we're interested in and that the + * device actually supports. + */ + i2o_event_register(c, d->lct_data.tid, i2ob_context, unit, + (I2OB_EVENT_MASK & d->lct_data.event_capabilities)); + return 0; } @@ -902,12 +1206,20 @@ for(d=c->devices;d!=NULL;d=d->next) { - if(d->lct_data->class_id!=I2O_CLASS_RANDOM_BLOCK_STORAGE) + if(d->lct_data.class_id!=I2O_CLASS_RANDOM_BLOCK_STORAGE) continue; - if(d->lct_data->user_tid != 0xFFF) + if(d->lct_data.user_tid != 0xFFF) continue; + if(i2o_claim_device(d, &i2o_block_handler)) + { + printk(KERN_WARNING "i2o_block: Controller %d, TID %d\n", c->unit, + d->lct_data.tid); + printk(KERN_WARNING "\tDevice refused claim! Skipping installation\n"); + continue; + } + if(uniti2odev = d; dev->controller = c; - dev->tid = d->lct_data->tid; + dev->unit = c->unit; + dev->tid = d->lct_data.tid; - /* - * Insure the device can be claimed - * before installing it. - */ - if(i2o_claim_device(dev->i2odev, &i2o_block_handler, I2O_CLAIM_PRIMARY )==0) - { - printk(KERN_INFO "Claimed Dev %p Tid %d Unit %d\n",dev,dev->tid,unit); - i2ob_install_device(c,d,unit); - unit+=16; - - /* - * Now that the device has been - * installed, unclaim it so that - * it can be claimed by either - * the block or scsi driver. - */ - if(i2o_release_device(dev->i2odev, &i2o_block_handler, I2O_CLAIM_PRIMARY)) - printk(KERN_INFO "Could not unclaim Dev %p Tid %d\n",dev,dev->tid); - } - else - printk(KERN_INFO "TID %d not claimed\n",dev->tid); + if(i2ob_install_device(c,d,unit)) + printk(KERN_WARNING "Could not install I2O block device\n"); + else + { + unit+=16; + i2ob_dev_count++; + + /* We want to know when device goes away */ + i2o_device_notify_on(d, &i2o_block_handler); + } } else { - if(!warned++) - printk("i2o_block: too many device, registering only %d.\n", unit>>4); + if(!warned++) + printk(KERN_WARNING "i2o_block: too many device, registering only %d.\n", unit>>4); } + i2o_release_device(d, &i2o_block_handler); } i2o_unlock_controller(c); } - i2ob_devices = unit; } /* + * New device notification handler. Called whenever a new + * I2O block storage device is added to the system. + * + * Should we spin lock around this to keep multiple devs from + * getting updated at the same time? + * + */ + +void i2ob_new_device(struct i2o_controller *c, struct i2o_device *d) +{ + struct i2ob_device *dev; + int unit = 0; + + printk(KERN_INFO "i2o_block: New device detected\n"); + printk(KERN_INFO " Controller %d Tid %d\n",c->unit, d->lct_data.tid); + + /* Check for available space */ + if(i2ob_dev_count>=MAX_I2OB<<4) + { + printk(KERN_ERR "i2o_block: No more devices allowed!\n"); + return; + } + for(unit = 0; unit < (MAX_I2OB<<4); unit += 16) + { + if(!i2ob_dev[unit].i2odev) + break; + } + + /* + * Creating a RAID 5 volume takes a little while and the UTIL_CLAIM + * will fail if we don't give the card enough time to do it's magic, + * so we just sleep for a little while and let it do it's thing + */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(5*HZ); + + if(i2o_claim_device(d, &i2o_block_handler)) + { + printk(KERN_INFO + "i2o_block: Unable to claim device. Installation aborted\n"); + return; + } + + dev = &i2ob_dev[unit]; + dev->i2odev = d; + dev->controller = c; + dev->tid = d->lct_data.tid; + + if(i2ob_install_device(c,d,unit)) + printk(KERN_ERR "i2o_block: Could not install new device\n"); + else + { + i2ob_dev_count++; + i2o_device_notify_on(d, &i2o_block_handler); + } + + i2o_release_device(d, &i2o_block_handler); + + return; +} + +/* + * Deleted device notification handler. Called when a device we + * are talking to has been deleted by the user or some other + * mysterious fource outside the kernel. + */ +void i2ob_del_device(struct i2o_controller *c, struct i2o_device *d) +{ + int unit = 0; + int i = 0; + int flags; + + spin_lock_irqsave(&io_request_lock, flags); + + /* + * Need to do this...we somtimes get two events from the IRTOS + * in a row and that causes lots of problems. + */ + + i2o_device_notify_off(d, &i2o_block_handler); + + printk(KERN_INFO "I2O Block Device Deleted\n"); + + for(unit = 0; unit < MAX_I2OB<<4; unit += 16) + { + if(i2ob_dev[unit].i2odev == d) + { + printk(KERN_INFO " /dev/%s: Controller %d Tid %d\n", + d->dev_name, c->unit, d->lct_data.tid); + break; + } + } + if(unit >= MAX_I2OB<<4) + { + printk(KERN_ERR "i2ob_del_device called, but not in dev table!\n"); + return; + } + + for(i = unit; i <= unit+15; i++) + { + i2ob_dev[i].i2odev = NULL; + i2ob_sizes[i] = 0; + i2ob_hardsizes[i] = 0; + i2ob_max_sectors[i] = 0; + i2ob[i].nr_sects = 0; + i2ob_gendisk.part[i].nr_sects = 0; + } + spin_unlock_irqrestore(&io_request_lock, flags); + + /* + * Sync the device...this will force all outstanding I/Os + * to attempt to complete, thus causing error messages. + * We have to do this as the user could immediatelly create + * a new volume that gets assigned the same minor number. + * If there are still outstanding writes to the device, + * that could cause data corruption on the new volume! + * + * The truth is that deleting a volume that you are currently + * accessing will do _bad things_ to your system. This + * handler will keep it from crashing, but must probably + * you'll have to do a 'reboot' to get the system running + * properly. Deleting disks you are using is dumb. + * Umount them first and all will be good! + * + * It's not this driver's job to protect the system from + * dumb user mistakes :) + */ + if(i2ob_dev[unit].refcnt) + fsync_dev(MKDEV(MAJOR_NR,unit)); + + /* + * Decrease usage count for module + */ + while(i2ob_dev[unit].refcnt--) + MOD_DEC_USE_COUNT; + + i2ob_dev[unit].refcnt = 0; + + i2ob_dev[i].tid = 0; + + /* + * Do we need this? + * The media didn't really change...the device is just gone + */ + i2ob_media_change_flag[unit] = 1; + + i2ob_dev_count--; + + return; +} + + + +/* * Have we seen a media change ? */ @@ -973,12 +1429,10 @@ return do_i2ob_revalidate(dev, 0); } -static int i2ob_reboot_event(struct notifier_block *n, unsigned long code, void *p) +static void i2ob_reboot_event(void) { int i; - if(code != SYS_RESTART && code != SYS_HALT && code != SYS_POWER_OFF) - return NOTIFY_DONE; for(i=0;icontroller, msg, 20, 2); } } - return NOTIFY_DONE; } -struct notifier_block i2ob_reboot_notifier = -{ - i2ob_reboot_event, - NULL, - 0 -}; - static struct file_operations i2ob_fops = { NULL, /* lseek - default */ @@ -1070,19 +1516,19 @@ { int i; - printk(KERN_INFO "I2O Block Storage OSM v0.07. (C) 1999 Red Hat Software.\n"); + printk(KERN_INFO "I2O Block Storage OSM v0.9. (C) 1999 Red Hat Software.\n"); /* * Register the block device interfaces */ if (register_blkdev(MAJOR_NR, "i2o_block", &i2ob_fops)) { - printk("Unable to get major number %d for i2o_block\n", - MAJOR_NR); + printk(KERN_ERR "Unable to get major number %d for i2o_block\n", + MAJOR_NR); return -EIO; } #ifdef MODULE - printk("i2o_block: registered device at major %d\n", MAJOR_NR); + printk(KERN_INFO "i2o_block: registered device at major %d\n", MAJOR_NR); #endif /* @@ -1142,13 +1588,25 @@ } i2ob_context = i2o_block_handler.context; + /* + * Initialize event handling thread + */ + sema_init(&i2ob_evt_sem, 0); + evt_pid = kernel_thread(i2ob_evt, NULL, CLONE_SIGHAND); + if(evt_pid < 0) + { + printk(KERN_ERR + "i2o_block: Could not initialize event thread. Aborting\n"); + i2o_remove_handler(&i2o_block_handler); + return 0; + } + + /* * Finally see what is actually plugged in to our controllers */ - i2ob_probe(); - register_reboot_notifier(&i2ob_reboot_notifier); return 0; } @@ -1161,9 +1619,22 @@ void cleanup_module(void) { struct gendisk **gdp; + int i; - unregister_reboot_notifier(&i2ob_reboot_notifier); - + /* + * Unregister for updates from any devices..otherwise we still + * get them and the core jumps to random memory :O + */ + if(i2ob_dev_count) { + struct i2o_device *d; + for(i = 0; i < MAX_I2OB; i++) + if((d=i2ob_dev[i<<4].i2odev)) { + i2o_device_notify_off(d, &i2o_block_handler); + i2o_event_register(d->controller, d->lct_data.tid, + i2ob_context, i<<4, 0); + } + } + /* * Flush the OSM */ @@ -1175,6 +1646,21 @@ */ if (unregister_blkdev(MAJOR_NR, "i2o_block") != 0) printk("i2o_block: cleanup_module failed\n"); + + if(evt_running) { + i = kill_proc(evt_pid, SIGTERM, 1); + if(!i) { + int count = 5 * 100; + while(evt_running && --count) { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(1); + } + + if(!count) + printk(KERN_ERR "Giving up on i2oblock thread...\n"); + } + +} /* * Why isnt register/unregister gendisk in the kernel ??? diff -urN v2.2.15/linux/drivers/i2o/i2o_config.c linux/drivers/i2o/i2o_config.c --- v2.2.15/linux/drivers/i2o/i2o_config.c Wed May 3 17:16:39 2000 +++ linux/drivers/i2o/i2o_config.c Wed Jun 7 14:26:42 2000 @@ -42,7 +42,8 @@ static int i2o_cfg_context = -1; static void *page_buf; static void *i2o_buffer; -static spinlock_t i2o_config_lock = SPIN_LOCK_UNLOCKED; +static spinlock_t i2o_queue_lock = SPIN_LOCK_UNLOCKED; + struct wait_queue *i2o_wait_queue; #define MODINC(x,y) (x = x++ % y) @@ -85,8 +86,19 @@ { u32 *msg = (u32 *)m; - if (msg[0] & (1<<13)) +// if (msg[0] & (1<<13)) + if (msg[0] & MSG_FAIL) { + u32 *preserved_msg = (u32*)(c->mem_offset + msg[7]); + printk(KERN_ERR "i2o_config: IOP failed to process the msg.\n"); + /* Release the preserved msg frame by resubmitting it as a NOP */ + + preserved_msg[0] = THREE_WORD_MSG_SIZE | SGL_OFFSET_0; + preserved_msg[1] = I2O_CMD_UTIL_NOP << 24 | HOST_TID << 12 | 0; + preserved_msg[2] = 0; + i2o_post_message(c, msg[7]); + } + if (msg[4] >> 24) // RegStatus != SUCCESS i2o_report_status(KERN_INFO,"i2o_config",msg); @@ -133,7 +145,7 @@ (unsigned char *)(msg + 5), inf->event_q[inf->q_in].data_size); - spin_lock(&i2o_config_lock); + spin_lock(&i2o_queue_lock); MODINC(inf->q_in, I2O_EVT_Q_LEN); if(inf->q_len == I2O_EVT_Q_LEN) { @@ -145,7 +157,7 @@ // Keep I2OEVTGET on another CPU from touching this inf->q_len++; } - spin_unlock(&i2o_config_lock); + spin_unlock(&i2o_queue_lock); // printk(KERN_INFO "File %p w/id %d has %d events\n", @@ -166,6 +178,9 @@ struct i2o_handler cfg_handler= { i2o_cfg_reply, + NULL, + NULL, + NULL, "Configuration", 0, 0xffffffff // All classes @@ -416,7 +431,8 @@ if (len < 0) { kfree(res); - return len; /* -DetailedStatus */ + //return len; /* -DetailedStatus */ + return -EAGAIN; } put_user(len, kcmd.reslen); @@ -749,7 +765,7 @@ /* Device exists? */ for(d = iop->devices; d; d = d->next) - if(d->lct_data->tid == kdesc.tid) + if(d->lct_data.tid == kdesc.tid) break; if(!d) @@ -793,11 +809,12 @@ memcpy(&kget.info, &p->event_q[p->q_out], sizeof(struct i2o_evt_info)); MODINC(p->q_out, I2O_EVT_Q_LEN); - spin_lock_irqsave(&i2o_config_lock, flags); + spin_lock_irqsave(&i2o_queue_lock, flags); + /* FIXME - ought to lock the q_ values here!! */ p->q_len--; kget.pending = p->q_len; kget.lost = p->q_lost; - spin_unlock_irqrestore(&i2o_config_lock, flags); + spin_unlock_irqrestore(&i2o_queue_lock, flags); __copy_to_user(uget, &kget, sizeof(struct i2o_evt_get)); @@ -823,9 +840,9 @@ tmp->q_lost = 0; tmp->next = open_files; - spin_lock_irqsave(&i2o_config_lock, flags); + spin_lock_irqsave(&i2o_queue_lock, flags); open_files = tmp; - spin_unlock_irqrestore(&i2o_config_lock, flags); + spin_unlock_irqrestore(&i2o_queue_lock, flags); MOD_INC_USE_COUNT; return 0; @@ -839,7 +856,7 @@ p1 = p2 = NULL; - spin_lock_irqsave(&i2o_config_lock, flags); + spin_lock_irqsave(&i2o_queue_lock, flags); for(p1 = open_files; p1; ) { if(p1->q_id == id) @@ -858,7 +875,7 @@ p2 = p1; p1 = p1->next; } - spin_unlock_irqrestore(&i2o_config_lock, flags); + spin_unlock_irqrestore(&i2o_queue_lock, flags); MOD_DEC_USE_COUNT; return 0; diff -urN v2.2.15/linux/drivers/i2o/i2o_core.c linux/drivers/i2o/i2o_core.c --- v2.2.15/linux/drivers/i2o/i2o_core.c Wed May 3 17:16:39 2000 +++ linux/drivers/i2o/i2o_core.c Wed Jun 7 14:26:43 2000 @@ -18,6 +18,7 @@ * Juha Sievänen * Auvo Häkkinen * Deepak Saxena + * Boji Tony Kannanthanam */ #include @@ -26,17 +27,25 @@ #include #include +#include #include #include #include #include +#include #include #include +#include #include +#include +#include +#include +#include #include +#include // #define DRIVERDEBUG // #define DEBUG_IRQ @@ -47,10 +56,11 @@ * Size of the I2O module table */ -static struct i2o_handler *i2o_handlers[MAX_I2O_MODULES]; -static struct i2o_controller *i2o_controllers[MAX_I2O_CONTROLLERS]; -struct i2o_controller *i2o_controller_chain; +static struct i2o_handler *i2o_handlers[MAX_I2O_MODULES]= {NULL}; +static struct i2o_controller *i2o_controllers[MAX_I2O_CONTROLLERS] = {NULL}; +struct i2o_controller *i2o_controller_chain = NULL; int i2o_num_controllers = 0; +/* Initiator Context for Core Message */ static int core_context = 0; static int i2o_activate_controller(struct i2o_controller *iop); @@ -58,18 +68,27 @@ static int i2o_init_outbound_q(struct i2o_controller *c); static void i2o_core_reply(struct i2o_handler *, struct i2o_controller *, struct i2o_message *); -static int i2o_add_management_user(struct i2o_device *, struct i2o_handler *); -static int i2o_remove_management_user(struct i2o_device *, struct i2o_handler *); void i2o_dump_message(u32 *msg); static int i2o_issue_claim(struct i2o_controller *, int, int, int, u32); static int i2o_reset_controller(struct i2o_controller *); static int i2o_lct_get(struct i2o_controller *); +static int i2o_lct_notify(struct i2o_controller *); static int i2o_hrt_get(struct i2o_controller *); +/* Dynamic LCT update handler */ +static int i2o_dyn_lct(void *); + +/* I2O core event handler */ +static int i2o_core_evt(void *); +static int evt_pid; +static int evt_running; + static void i2o_sys_init(void); static void i2o_sys_shutdown(void); +static int i2o_clear_controller(struct i2o_controller *); +static int i2o_reboot_event(struct notifier_block *, unsigned long, void *); static int i2o_build_sys_table(void); static int i2o_systab_send(struct i2o_controller *c); @@ -86,6 +105,14 @@ static int sys_tbl_ind = 0; static int sys_tbl_len = 0; +/* + * This spin lock is used to keep a device from being + * added and deleted concurrently across CPUs or interrupts. + * This can occur when a user creates a device and immediatelly + * deletes it before the new_dev_notify() handler is called. + */ +static spinlock_t i2o_dev_lock = SPIN_LOCK_UNLOCKED; + #ifdef MODULE /* * Function table to send to bus specific layers @@ -128,17 +155,58 @@ static struct i2o_handler i2o_core_handler = { (void *)i2o_core_reply, - "I2O core layer", - 0 + NULL, + NULL, + NULL, + "I2O core layer", + 0, + I2O_CLASS_EXECUTIVE }; +/* + * Used when queing a reply to be handled later + */ +struct reply_info +{ + struct i2o_controller *iop; + u32 msg[MSG_FRAME_SIZE]; +}; +static struct reply_info evt_reply; +static struct reply_info events[I2O_EVT_Q_LEN]; +static int evt_in = 0; +static int evt_out = 0; +static int evt_q_len = 0; + +#define MODINC(x,y) (x = x++ % y) /* - * I2O configuration spinlock. This isnt a big deal for contention + * I2O configuration semaphore. This isnt a big deal for contention * so we have one only */ -static spinlock_t i2o_configuration_lock = SPIN_LOCK_UNLOCKED; +static struct semaphore i2o_configuration_lock = MUTEX; + + +/* + * Event spinlock. Used to keep event queue sane and from + * handling multiple events simultaneously. + */ +static spinlock_t i2o_evt_lock = SPIN_LOCK_UNLOCKED; + +/* + * Semaphore used to syncrhonize event handling thread with + * interrupt handler. + */ +DECLARE_MUTEX(evt_sem); +DECLARE_WAIT_QUEUE_HEAD(evt_wait); + +static struct notifier_block i2o_reboot_notifier = +{ + i2o_reboot_event, + NULL, + 0 +}; + /* * I2O Core reply handler @@ -157,19 +225,36 @@ #endif if (msg[0] & (1<<13)) // Fail bit is set - { - printk(KERN_ERR "%s: Failed to process the msg:\n",c->name); - printk(KERN_ERR " Cmd = 0x%02X, InitiatorTid = %d, TargetTid =%d\n", - (msg[1] >> 24) & 0xFF, (msg[1] >> 12) & 0xFFF, msg[1] & - 0xFFF); - printk(KERN_ERR " FailureCode = 0x%02X\n Severity = 0x%02X\n" - "LowestVersion = 0x%02X\n HighestVersion = 0x%02X\n", - msg[4] >> 24, (msg[4] >> 16) & 0xFF, - (msg[4] >> 8) & 0xFF, msg[4] & 0xFF); - printk(KERN_ERR " FailingHostUnit = 0x%04X\n FailingIOP = 0x%03X\n", - msg[5] >> 16, msg[5] & 0xFFF); - return; - } + { + u32 *preserved_msg = (u32*)(c->mem_offset + msg[7]); + + printk(KERN_ERR "%s: Failed to process the msg:\n",c->name); + printk(KERN_ERR " Cmd = 0x%02X, InitiatorTid = %d, TargetTid =%d\n", + (msg[1] >> 24) & 0xFF, (msg[1] >> 12) & 0xFFF, msg[1] & + 0xFFF); + printk(KERN_ERR " FailureCode = 0x%02X\n Severity = 0x%02X\n" + "LowestVersion = 0x%02X\n HighestVersion = 0x%02X\n", + msg[4] >> 24, (msg[4] >> 16) & 0xFF, + (msg[4] >> 8) & 0xFF, msg[4] & 0xFF); + printk(KERN_ERR " FailingHostUnit = 0x%04X\n FailingIOP = 0x%03X\n", + msg[5] >> 16, msg[5] & 0xFFF); + + /* If the failed request needs special treatment, + * it should be done here. */ + + /* Release the preserved msg by resubmitting it as a NOP */ + + preserved_msg[0] = THREE_WORD_MSG_SIZE | SGL_OFFSET_0; + preserved_msg[1] = I2O_CMD_UTIL_NOP << 24 | HOST_TID << 12 | 0; + preserved_msg[2] = 0; + + i2o_post_message(c, msg[7]); + + + /* If reply to i2o_post_wait failed, return causes a timeout */ + + return; + } if(msg[2]&0x80000000) // Post wait message { @@ -182,7 +267,46 @@ status = I2O_POST_WAIT_OK; i2o_post_wait_complete(context, status); + return; } + + if(m->function == I2O_CMD_UTIL_EVT_REGISTER) + { + memcpy(events[evt_in].msg, msg, MSG_FRAME_SIZE); + events[evt_in].iop = c; + + spin_lock(&i2o_evt_lock); + MODINC(evt_in, I2O_EVT_Q_LEN); + if(evt_q_len == I2O_EVT_Q_LEN) + MODINC(evt_out, I2O_EVT_Q_LEN); + else + evt_q_len++; + spin_unlock(&i2o_evt_lock); + + up(&evt_sem); + wake_up_interruptible(&evt_wait); + return; + } + + if(m->function == I2O_CMD_LCT_NOTIFY) + { + up(&c->lct_sem); + return; + } + + /* + * If this happens, we want to dump the message to the syslog so + * it can be sent back to the card manufacturer by the end user + * to aid in debugging. + * + */ + printk(KERN_WARNING "%s: Unsolicited message reply sent to core!" + "Message dumped to syslog\n", + c->name); + i2o_dump_message(msg); + + return; + } /* @@ -193,18 +317,18 @@ int i2o_install_handler(struct i2o_handler *h) { int i; - spin_lock(&i2o_configuration_lock); + down(&i2o_configuration_lock); for(i=0;icontext = i; i2o_handlers[i]=h; - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return 0; } } - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return -ENOSPC; } @@ -224,7 +348,7 @@ { int i; - spin_lock(&i2o_configuration_lock); + down(&i2o_configuration_lock); d->controller=c; d->owner=NULL; d->next=c->devices; @@ -234,7 +358,7 @@ for(i = 0; i < I2O_MAX_MANAGERS; i++) d->managers[i] = NULL; - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return 0; } @@ -243,15 +367,44 @@ int __i2o_delete_device(struct i2o_device *d) { struct i2o_device **p; + int i; p=&(d->controller->devices); /* * Hey we have a driver! + * Check to see if the driver wants us to notify it of + * device deletion. If it doesn't we assume that it + * is unsafe to delete a device with an owner and + * fail. */ if(d->owner) + { + if(d->owner->dev_del_notify) + { + dprintk((KERN_INFO "Device has owner, notifying\n")); + d->owner->dev_del_notify(d->controller, d); + if(d->owner) + { + printk(KERN_WARNING "Driver \"%s\" did not release device!\n", d->owner->name); + return -EBUSY; + } + } + else return -EBUSY; + } + + /* + * Tell any other users who are talking to this device + * that it's going away. We assume that everything works. + */ + for(i=0; i < I2O_MAX_MANAGERS; i++) + { + if(d->managers[i] && d->managers[i]->dev_del_notify) + d->managers[i]->dev_del_notify(d->controller, d); + } + /* * Seek, locate @@ -278,11 +431,11 @@ { int ret; - spin_lock(&i2o_configuration_lock); + down(&i2o_configuration_lock); ret = __i2o_delete_device(d); - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return ret; } @@ -294,24 +447,31 @@ int i2o_install_controller(struct i2o_controller *c) { int i; - spin_lock(&i2o_configuration_lock); + down(&i2o_configuration_lock); for(i=0;inext=i2o_controller_chain; - i2o_controller_chain=c; - c->unit = i; - - sprintf(c->name, "i2o/iop%d", i); - i2o_num_controllers++; - spin_unlock(&i2o_configuration_lock); - return 0; + i2o_controllers[i]=c; + c->devices = NULL; + c->next=i2o_controller_chain; + i2o_controller_chain=c; + c->unit = i; + c->page_frame = NULL; + c->hrt = NULL; + c->lct = NULL; + c->dlct = (i2o_lct*)kmalloc(8192, GFP_KERNEL); + c->status_block = NULL; + sprintf(c->name, "i2o/iop%d", i); + i2o_num_controllers++; + sema_init(&c->lct_sem, 0); + up(&i2o_configuration_lock); + return 0; + } } printk(KERN_ERR "No free i2o controller slots.\n"); - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return -EBUSY; } @@ -320,13 +480,20 @@ struct i2o_controller **p; int users; char name[16]; + int stat; + + /* + * Clear event registration as this can cause weird behavior + */ + if(c->status_block->iop_state == ADAPTER_STATE_OPERATIONAL) + i2o_event_register(c, core_context, 0, 0, 0); - spin_lock(&i2o_configuration_lock); + down(&i2o_configuration_lock); if((users=atomic_read(&c->users))) { printk(KERN_INFO "%s busy: %d users for controller.\n", c->name, users); c->bus_disable(c); - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return -EBUSY; } while(c->devices) @@ -335,25 +502,46 @@ { /* Shouldnt happen */ c->bus_disable(c); - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return -EBUSY; } } + + /* + * If this is shutdown time, the thread's already been killed + */ + if(c->lct_running) { + stat = kill_proc(c->lct_pid, SIGTERM, 1); + if(!stat) { + int count = 10 * 100; + while(c->lct_running && --count) { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(1); + } + + if(!count) + printk(KERN_ERR + "%s: LCT thread still running!\n", + c->name); + } + } + p=&i2o_controller_chain; while(*p) { if(*p==c) { - /* Ask the IOP to switch into RESET state */ - i2o_reset_controller(c); + /* Ask the IOP to switch to HOLD state */ + if (i2o_clear_controller(c) < 0) + printk(KERN_ERR "Unable to clear iop%d\n", c->unit); /* Release IRQ */ c->destructor(c); *p=c->next; - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); if(c->page_frame) kfree(c->page_frame); @@ -363,6 +551,8 @@ kfree(c->lct); if(c->status_block) kfree(c->status_block); + if(c->dlct) + kfree(c->dlct); i2o_controllers[c->unit]=NULL; memcpy(name, c->name, strlen(c->name)+1); @@ -375,7 +565,7 @@ } p=&((*p)->next); } - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); printk(KERN_ERR "i2o_delete_controller: bad pointer!\n"); return -ENOENT; } @@ -392,11 +582,11 @@ if(n<0 || n>=MAX_I2O_CONTROLLERS) return NULL; - spin_lock(&i2o_configuration_lock); + down(&i2o_configuration_lock); c=i2o_controllers[n]; if(c!=NULL) atomic_inc(&c->users); - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return c; } @@ -405,117 +595,99 @@ * Claim a device for use as either the primary user or just * as a management/secondary user */ -int i2o_claim_device(struct i2o_device *d, struct i2o_handler *h, u32 type) +int i2o_claim_device(struct i2o_device *d, struct i2o_handler *h) { - /* Device already has a primary user or too many managers */ - if((type == I2O_CLAIM_PRIMARY && d->owner) || - (d->num_managers == I2O_MAX_MANAGERS)) - { - return -EBUSY; - } + down(&i2o_configuration_lock); - if(i2o_issue_claim(d->controller,d->lct_data->tid, h->context, 1, type)) + if(d->owner) { + printk(KERN_INFO "issue claim called, but dev has owner!"); + up(&i2o_configuration_lock); return -EBUSY; } - spin_lock(&i2o_configuration_lock); - if(d->owner) + if(i2o_issue_claim(d->controller,d->lct_data.tid, h->context, 1, I2O_CLAIM_PRIMARY)) { - spin_unlock(&i2o_configuration_lock); + up(&i2o_configuration_lock); return -EBUSY; } - atomic_inc(&d->controller->users); - - if(type == I2O_CLAIM_PRIMARY) - d->owner=h; - else - if (i2o_add_management_user(d, h)) - printk(KERN_WARNING "i2o: Too many managers for TID %d\n", - d->lct_data->tid); - - spin_unlock(&i2o_configuration_lock); + d->owner=h; + up(&i2o_configuration_lock); return 0; } -int i2o_release_device(struct i2o_device *d, struct i2o_handler *h, u32 type) +int i2o_release_device(struct i2o_device *d, struct i2o_handler *h) { int err = 0; - spin_lock(&i2o_configuration_lock); - - /* Primary user */ - if(type == I2O_CLAIM_PRIMARY) + down(&i2o_configuration_lock); + if(d->owner != h) { - if(d->owner != h) - err = -ENOENT; - else - { - if(i2o_issue_claim(d->controller, d->lct_data->tid, h->context, 0, - type)) - { - err = -ENXIO; - } - else - { - d->owner = NULL; - atomic_dec(&d->controller->users); - } - } - - spin_unlock(&i2o_configuration_lock); - return err; + up(&i2o_configuration_lock); + return -ENOENT; } - /* Management or other user */ - if(i2o_remove_management_user(d, h)) - err = -ENOENT; - else + if(i2o_issue_claim(d->controller, d->lct_data.tid, h->context, 0, + I2O_CLAIM_PRIMARY)) { - atomic_dec(&d->controller->users); - - if(i2o_issue_claim(d->controller,d->lct_data->tid, h->context, 0, - type)) - err = -ENXIO; + err = -ENXIO; } - spin_unlock(&i2o_configuration_lock); + d->owner = NULL; + + up(&i2o_configuration_lock); return err; } -int i2o_add_management_user(struct i2o_device *d, struct i2o_handler *h) + +/* + * Called by OSMs to let the core know that they want to be + * notified if the given device is deleted from the system. + */ +int i2o_device_notify_on(struct i2o_device *d, struct i2o_handler *h) { - int i; + int i; - if(d->num_managers == I2O_MAX_MANAGERS) - return 1; + if(d->num_managers == I2O_MAX_MANAGERS) + return -ENOSPC; - for(i = 0; i < I2O_MAX_MANAGERS; i++) - if(!d->managers[i]) - d->managers[i] = h; - - d->num_managers++; - - return 0; + for(i = 0; i < I2O_MAX_MANAGERS; i++) + { + if(!d->managers[i]) + { + d->managers[i] = h; + break; + } + } + + d->num_managers++; + + return 0; } -int i2o_remove_management_user(struct i2o_device *d, struct i2o_handler *h) +/* + * Called by OSMs to let the core know that they no longer + * are interested in the fate of the given device. + */ +int i2o_device_notify_off(struct i2o_device *d, struct i2o_handler *h) { - int i; + int i; - for(i=0; i < I2O_MAX_MANAGERS; i++) - { - if(d->managers[i] == h) - { - d->managers[i] = NULL; - return 0; - } - } + for(i=0; i < I2O_MAX_MANAGERS; i++) + { + if(d->managers[i] == h) + { + d->managers[i] = NULL; + d->num_managers--; + return 0; + } + } - return -ENOENT; + return -ENOENT; } + /* * This is called by the bus specific driver layer when an interrupt * or poll of this card interface is desired. @@ -679,10 +851,14 @@ * Dump the information block associated with a given unit (TID) */ -void i2o_report_controller_unit(struct i2o_controller *c, int unit) +void i2o_report_controller_unit(struct i2o_controller *c, struct i2o_device *d) { char buf[64]; - + char str[22]; + int unit = d->lct_data.tid; + + printk(KERN_INFO "Target ID %d.\n", unit); + if(i2o_query_scalar(c, unit, 0xF100, 3, buf, 16)>=0) { buf[16]=0; @@ -691,20 +867,38 @@ if(i2o_query_scalar(c, unit, 0xF100, 4, buf, 16)>=0) { buf[16]=0; - printk(" Device: %s", buf); + printk(KERN_INFO " Device: %s", buf); } #if 0 if(i2o_query_scalar(c, unit, 0xF100, 5, buf, 16)>=0) { buf[16]=0; - printk("Description: %s", buf); + printk(KERN_INFO "Description: %s", buf); } #endif if(i2o_query_scalar(c, unit, 0xF100, 6, buf, 8)>=0) { buf[8]=0; - printk(" Rev: %s\n", buf); + printk(KERN_INFO " Rev: %s\n", buf); } + + printk(KERN_INFO " Class: "); + sprintf(str, "%-21s", i2o_get_class_name(d->lct_data.class_id)); + printk(KERN_INFO "%s\n", str); + + printk(KERN_INFO " Subclass: 0x%04X\n", d->lct_data.sub_class); + printk(KERN_INFO " Flags: "); + + if(d->lct_data.device_flags&(1<<0)) + printk("C"); // ConfigDialog requested + if(d->lct_data.device_flags&(1<<1)) + printk("U"); // Multi-user capable + if(!(d->lct_data.device_flags&(1<<4))) + printk("P"); // Peer service enabled! + if(!(d->lct_data.device_flags&(1<<5))) + printk("M"); // Mgmt service enabled! + printk("\n"); + } @@ -816,9 +1010,7 @@ int i; int max; int tid; - u32 *p; struct i2o_device *d; - char str[22]; i2o_lct *lct = c->lct; if (lct == NULL) { @@ -847,35 +1039,15 @@ d->controller = c; d->next = NULL; - d->lct_data = &lct->lct_entry[i]; + memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry)); d->flags = 0; - tid = d->lct_data->tid; + tid = d->lct_data.tid; - printk(KERN_INFO "Target ID %d.\n", tid); - - i2o_report_controller_unit(c, tid); + i2o_report_controller_unit(c, d); i2o_install_device(c, d); - printk(KERN_INFO " Class: "); - - sprintf(str, "%-21s", i2o_get_class_name(d->lct_data->class_id)); - printk("%s", str); - - printk(" Subclass: 0x%04X Flags: ", - d->lct_data->sub_class); - - if(d->lct_data->device_flags&(1<<0)) - printk("C"); // ConfigDialog requested - if(d->lct_data->device_flags&(1<<1)) - printk("M"); // Multi-user capable - if(!(d->lct_data->device_flags&(1<<4))) - printk("P"); // Peer service enabled! - if(!(d->lct_data->device_flags&(1<<5))) - printk("m"); // Mgmt service enabled! - printk("\n"); - p+=9; } return 0; } @@ -890,6 +1062,8 @@ u32 msg[4]; int ret; + i2o_status_get(c); + /* SysQuiesce discarded if IOP not in READY or OPERATIONAL state */ if ((c->status_block->iop_state != ADAPTER_STATE_READY) && @@ -924,6 +1098,15 @@ u32 msg[4]; int ret; + i2o_status_get(c); + + /* Enable only allowed on READY state */ + if(c->status_block->iop_state == ADAPTER_STATE_OPERATIONAL) + return 0; + + if(c->status_block->iop_state != ADAPTER_STATE_READY) + return -EINVAL; + msg[0]=FOUR_WORD_MSG_SIZE|SGL_OFFSET_0; msg[1]=I2O_CMD_SYS_ENABLE<<24|HOST_TID<<12|ADAPTER_TID; /* msg[2] filled in i2o_post_wait */ @@ -995,6 +1178,7 @@ u32 *msg; long time; + dprintk(("begin RESET\n")); /* Quiesce all IOPs first */ for (iop = i2o_controller_chain; iop; iop = iop->next) @@ -1126,6 +1310,9 @@ msg[6]=virt_to_phys(c->status_block); msg[7]=0; /* 64bit host FIXME */ msg[8]=sizeof(i2o_status_block); /* always 88 bytes */ + + if(msg[8]!=88) + printk(KERN_CRIT "i2o compiled wrongly\n"); i2o_post_message(c,m); @@ -1203,8 +1390,7 @@ msg[5]= virt_to_phys(c->hrt); /* Dump it here */ if ((ret = i2o_post_wait(c, msg, sizeof(msg), 20))) { - printk(KERN_ERR "%s: Unable to get HRT (status=%#10x)\n", - c->name, ret); + printk(KERN_ERR "%s: Unable to get HRT (status=%#10x)\n", c->name, ret); return ret; } @@ -1222,43 +1408,43 @@ static int i2o_systab_send(struct i2o_controller *iop) { - u32 msg[12]; - u32 privmem[2]; - u32 privio[2]; - int ret; + u32 msg[12]; + u32 privmem[2]; + u32 privio[2]; + int ret; /* See i2o_status_block */ #if 0 - iop->status->current_mem_base; - iop->status->current_mem_size; - iop->status->current_io_base; - iop->status->current_io_size; + iop->status->current_mem_base; + iop->status->current_mem_size; + iop->status->current_io_base; + iop->status->current_io_size; #endif /* FIXME */ - privmem[0]=iop->priv_mem; /* Private memory space base address */ - privmem[1]=iop->priv_mem_size; - privio[0]=iop->priv_io; /* Private I/O address */ - privio[1]=iop->priv_io_size; + privmem[0]=iop->priv_mem; /* Private memory space base address */ + privmem[1]=iop->priv_mem_size; + privio[0]=iop->priv_io; /* Private I/O address */ + privio[1]=iop->priv_io_size; msg[0] = I2O_MESSAGE_SIZE(12) | SGL_OFFSET_6; - msg[1] = I2O_CMD_SYS_TAB_SET<<24 | HOST_TID<<12 | ADAPTER_TID; + msg[1] = I2O_CMD_SYS_TAB_SET<<24 | HOST_TID<<12 | ADAPTER_TID; /* msg[2] filled in i2o_post_wait */ msg[3] = 0; - msg[4] = (0<<16) | ((iop->unit+2) << 12); /* Host 0 IOP ID (unit + 2) */ - msg[5] = 0; /* Segment 0 */ + msg[4] = (0<<16) | ((iop->unit+2) << 12); /* Host 0 IOP ID (unit + 2) */ + msg[5] = 0; /* Segment 0 */ - /* - * Provide three SGL-elements: - * System table (SysTab), Private memory space declaration and - * Private i/o space declaration + /* + * Provide three SGL-elements: + * System table (SysTab), Private memory space declaration and + * Private i/o space declaration */ - msg[6] = 0x54000000 | sys_tbl_len; - msg[7] = virt_to_phys(sys_tbl); - msg[8] = 0x54000000 | 0; - msg[9] = virt_to_phys(privmem); - msg[10] = 0xD4000000 | 0; - msg[11] = virt_to_phys(privio); + msg[6] = 0x54000000 | sys_tbl_len; + msg[7] = virt_to_phys(sys_tbl); + msg[8] = 0x54000000 | 0; + msg[9] = virt_to_phys(privmem); + msg[10] = 0xD4000000 | 0; + msg[11] = virt_to_phys(privio); if ((ret=i2o_post_wait(iop, msg, sizeof(msg), 120))) printk(KERN_INFO "%s: Unable to set SysTab (status=%#10x).\n", @@ -1297,19 +1483,46 @@ * If build_sys_table fails, we kill everything and bail * as we can't init the IOPs w/o a system table */ + + dprintk(("SYSTAB\n")); if (i2o_build_sys_table() < 0) { i2o_sys_shutdown(); return; } + dprintk(("ONLINE\n")); + /* If IOP don't get online, we need to rebuild the System table */ for (iop = i2o_controller_chain; iop; iop = niop) { niop = iop->next; if (i2o_online_controller(iop) < 0) goto rebuild_sys_tab; } + + dprintk(("ACTIVE\n")); - /* Active IOPs now in OPERATIONAL state */ + /* Active IOPs now in OPERATIONAL state + * + * Register for status updates from all IOPs + */ + for(iop = i2o_controller_chain; iop; iop=iop->next) { + + /* Create a kernel thread to deal with dynamic LCT updates */ + iop->lct_pid = kernel_thread(i2o_dyn_lct, iop, CLONE_SIGHAND); + + printk(KERN_INFO "event thread created as pid %d \n", iop->lct_pid); + + /* Update change ind on DLCT */ + iop->dlct->change_ind = iop->lct->change_ind; + + /* Start dynamic LCT updates */ + i2o_lct_notify(iop); + + /* Register for all events from IRTOS */ + i2o_event_register(iop, core_context, 0, 0, 0xFFFFFFFF); + } + + dprintk(("DONE\n")); } /* @@ -1336,11 +1549,13 @@ /* In INIT state, Wait Inbound Q to initilaize (in i2o_status_get) */ /* In READY state, Get status */ + dprintk(("ACTIVATE\n")); + if (i2o_status_get(iop) < 0) { - printk("Unable to obtain status of IOP, attempting a reset.\n"); + printk(KERN_INFO "Unable to obtain status of IOP, attempting a reset.\n"); i2o_reset_controller(iop); if (i2o_status_get(iop) < 0) { - printk("IOP not responding.\n"); + printk(KERN_INFO "IOP not responding.\n"); i2o_delete_controller(iop); return -1; } @@ -1352,17 +1567,17 @@ return -1; } -// if (iop->status_block->iop_state == ADAPTER_STATE_HOLD || if (iop->status_block->iop_state == ADAPTER_STATE_READY || iop->status_block->iop_state == ADAPTER_STATE_OPERATIONAL || + iop->status_block->iop_state == ADAPTER_STATE_HOLD || iop->status_block->iop_state == ADAPTER_STATE_FAILED) { dprintk((KERN_INFO "%s: already running...trying to reset\n", - iop->name)); - i2o_reset_controller(iop); + iop->name)); + dprintk(("Outbound q2\n")); - if (i2o_status_get(iop) < 0 || - iop->status_block->iop_state != ADAPTER_STATE_RESET) + i2o_reset_controller(iop); + if (i2o_status_get(iop) < 0 || iop->status_block->iop_state != ADAPTER_STATE_RESET) { printk(KERN_CRIT "%s: Failed to initialize.\n", iop->name); i2o_delete_controller(iop); @@ -1376,11 +1591,13 @@ } /* In HOLD state */ + dprintk("HRT\n"); if (i2o_hrt_get(iop) < 0) { i2o_delete_controller(iop); return -1; } + dprintk("DONE\n"); return 0; } @@ -1463,7 +1680,7 @@ for(i=0; i< NMBR_MSG_FRAMES; i++) { I2O_REPLY_WRITE32(c,m); - mb(); + mb(); m += MSG_FRAME_SIZE; } @@ -1512,14 +1729,38 @@ } } while (c->lct == NULL); - if ((ret=i2o_parse_lct(c)) < 0) - return ret; + if ((ret=i2o_parse_lct(c)) < 0) + return ret; return 0; } /* + * Like above, but used for async notification. The main + * difference is that we keep track of the CurrentChangeIndiicator + * so that we only get updates when it actually changes. + * + */ +int i2o_lct_notify(struct i2o_controller *c) +{ + u32 msg[8]; + + msg[0] = EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6; + msg[1] = I2O_CMD_LCT_NOTIFY<<24 | HOST_TID<<12 | ADAPTER_TID; + msg[2] = core_context; + msg[3] = 0xDEADBEEF; + msg[4] = 0xFFFFFFFF; /* All devices */ + msg[5] = c->dlct->change_ind+1; /* Next change */ + msg[6] = 0xD0000000|8192; + msg[7] = virt_to_bus(c->dlct); + + return i2o_post_this(c, msg, sizeof(msg)); +} + + + +/* * Bring a controller online into OPERATIONAL state. */ @@ -1661,6 +1902,7 @@ struct i2o_post_wait_data *wait_data = kmalloc(sizeof(struct i2o_post_wait_data), GFP_KERNEL); + if(!wait_data) return -ENOMEM; @@ -1675,7 +1917,7 @@ spin_unlock_irqrestore(&post_wait_lock, flags); wait_data->wq = &wq_i2o_post; - wait_data->status = -EAGAIN; + wait_data->status = -ETIMEDOUT; msg[2]=0x80000000|(u32)core_context|((u32)wait_data->id<<16); @@ -1684,6 +1926,18 @@ status = wait_data->status; } + if(status == -ETIMEDOUT) + printk(KERN_INFO "POST WAIT TIMEOUT\n"); + + /* + * Remove the entry from the queue. + * Since i2o_post_wait() may have been called again by + * a different thread while we were waiting for this + * instance to complete, we're not guaranteed that + * this entry is at the head of the queue anymore, so + * we need to search for it, find it, and delete it. + */ + p2 = NULL; spin_lock_irqsave(&post_wait_lock, flags); for(p1 = post_wait_queue; p1; p2 = p1, p1 = p1->next) { @@ -1733,47 +1987,329 @@ } spin_unlock(&post_wait_lock); - printk(KERN_DEBUG "i2o: i2o_post_wait reply after timeout!"); + printk(KERN_DEBUG "i2o: i2o_post_wait reply after timeout!\n"); } /* * Send UTIL_EVENT messages */ -int i2o_event_register(struct i2o_controller *c, int tid, int context, - u32 evt_mask) +int i2o_event_register(struct i2o_controller *c, u32 tid, u32 init_context, + u32 tr_context, u32 evt_mask) { - u32 msg[5]; + u32 msg[5]; - msg[0] = FIVE_WORD_MSG_SIZE | SGL_OFFSET_0; - msg[1] = I2O_CMD_UTIL_EVT_REGISTER << 24 | HOST_TID << 12 | tid; - msg[2] = context; - msg[3] = 0; - msg[4] = evt_mask; - - if (i2o_post_this(c, msg, sizeof(msg)) < 0) - return -ETIMEDOUT; - - return 0; -} - -int i2o_event_ack(struct i2o_controller *c, int tid, int context, - u32 evt_indicator, void *evt_data, int evt_data_len) + msg[0] = FIVE_WORD_MSG_SIZE | SGL_OFFSET_0; + msg[1] = I2O_CMD_UTIL_EVT_REGISTER << 24 | HOST_TID << 12 | tid; + msg[2] = (u32) init_context; + msg[3] = (u32)tr_context ; + msg[4] = evt_mask; + + if (i2o_post_this(c, msg, sizeof(msg)) < 0) + return -ETIMEDOUT; + + return 0; +} + +int i2o_event_ack(struct i2o_controller *c, u32 *msg) +{ + struct i2o_message *m = (struct i2o_message *)msg; + + m->function = I2O_CMD_UTIL_EVT_ACK; + return i2o_post_wait(c, msg, m->size * 4, 2); + +} + +/* + * Core event handler. Runs as a separate thread and is woken + * up whenever there is an Executive class event. + */ +static int i2o_core_evt(void *reply_data) +{ + struct reply_info *reply = (struct reply_info *) reply_data; + u32 *msg = reply->msg; + struct i2o_controller *c = NULL; + int flags; + struct fs_struct *fs; + + lock_kernel(); + + dprintk((KERN_INFO "i2o_core_evt: I2O CORE Event thread at %p\n", +&i2o_core_evt)); + exit_files(current); + exit_mm(current); + current->session = 1; + current->pgrp = 1; + /* Become as one with the init task */ + exit_fs(current); + fs = init_task.fs; + current->fs = fs; + atomic_inc(&fs->count); + + unlock_kernel(); + + strcpy(current->comm, "i2oevtd"); + evt_running = 1; + + while(1) + { + down_interruptible(&evt_sem); + if(signal_pending(current)) + { + dprintk((KERN_INFO "I2O event thread dead\n")); + evt_running = 0; + return 0; + } + + /* + * Copy the data out of the queue so that we don't have to lock + * around the whole function and just around the qlen update + */ + spin_lock_irqsave(&i2o_evt_lock, flags); + memcpy(reply, &events[evt_out], sizeof(struct reply_info)); + MODINC(evt_out, I2O_EVT_Q_LEN); + evt_q_len--; + spin_unlock_irqrestore(&i2o_evt_lock, flags); + + c = reply->iop; + dprintk((KERN_INFO "I2O IRTOS EVENT: iop%d, event %#10x\n", c->unit, msg[4])); + + /* + * We do not attempt to delete/quiesce/etc. the controller if + * some sort of error indidication occurs. We may want to do + * so in the future, but for now we just let the user deal with + * it. One reason for this is that what to do with an error + * or when to send what ćrror is not really agreed on, so + * we get errors that may not be fatal but just look like they + * are...so let the user deal with it. + */ + switch(msg[4]) + { + case I2O_EVT_IND_EXEC_RESOURCE_LIMITS: + printk(KERN_ERR "iop%d: Out of resources\n", c->unit); + break; + + case I2O_EVT_IND_EXEC_POWER_FAIL: + printk(KERN_ERR "iop%d: Power failure\n", c->unit); + break; + + case I2O_EVT_IND_EXEC_HW_FAIL: + { + char *fail[] = + { + "Unknown Error", + "Power Lost", + "Code Violation", + "Parity Error", + "Code Execution Exception", + "Watchdog Timer Expired" + }; + + if(msg[5] <= 6) + printk(KERN_ERR "%s: Hardware Failure: %s\n", c->name, fail[msg[5]]); + else + printk(KERN_ERR "%s: Unknown Hardware Failure\n", c->name); + + break; + } + + /* + * New device created + * - Create a new i2o_device entry + * - Inform all interested drivers about this device's existence + */ + case I2O_EVT_IND_EXEC_NEW_LCT_ENTRY: + { + struct i2o_device *d = (struct i2o_device *) + kmalloc(sizeof(struct i2o_device), GFP_KERNEL); + int i; + + memcpy(&d->lct_data, &msg[5], sizeof(i2o_lct_entry)); + + d->next = NULL; + d->controller = c; + d->flags = 0; + + i2o_report_controller_unit(c, d); + i2o_install_device(c,d); + + for(i = 0; i < MAX_I2O_MODULES; i++) + { + if(i2o_handlers[i] && i2o_handlers[i]->new_dev_notify && (i2o_handlers[i]->class&d->lct_data.class_id)) + { + spin_lock_irqsave(&i2o_dev_lock, flags); + i2o_handlers[i]->new_dev_notify(c,d); + spin_unlock_irqrestore(&i2o_dev_lock, flags); + } + } + + break; + } + + /* + * LCT entry for a device has been modified, so update it + * internally. + */ + case I2O_EVT_IND_EXEC_MODIFIED_LCT: + { + struct i2o_device *d; + i2o_lct_entry *new_lct = (i2o_lct_entry *)&msg[5]; + for(d = c->devices; d; d = d->next) + { + if(d->lct_data.tid == new_lct->tid) + { + memcpy(&d->lct_data, new_lct, sizeof(i2o_lct_entry)); + break; + } + } + break; + } + + case I2O_EVT_IND_CONFIGURATION_FLAG: + printk(KERN_WARNING "%s requires user configuration\n", c->name); + break; + + case I2O_EVT_IND_GENERAL_WARNING: + printk(KERN_WARNING "%s: Warning notification received! Check configuration for errors!\n", c->name); + break; + + default: + printk(KERN_WARNING "%s: Unknown event...check config\n", c->name); + break; + } + } + + return 0; +} + +/* + * Dynamic LCT update. This compares the LCT with the currently + * installed devices to check for device deletions..this needed b/c there + * is no DELETED_LCT_ENTRY EventIndicator for the Executive class so + * we can't just have the event handler do this...annoying + * + * This is a hole in the spec that will hopefully be fixed someday. + */ +static int i2o_dyn_lct(void *foo) { - u32 msg[c->inbound_size]; + struct i2o_controller *c = (struct i2o_controller *)foo; + struct i2o_device *d = NULL; + struct i2o_device *d1 = NULL; + int i = 0; + int found = 0; + int entries; + void *tmp; + char name[16]; + struct fs_struct *fs; + unsigned long flags; + + lock_kernel(); + + dprintk((KERN_INFO "i2o_dyn_lct: I2O CORE Event thread at %p\n", +&i2o_dyn_lct)); + exit_files(current); + exit_mm(current); + current->session = 1; + current->pgrp = 1; + /* Become as one with the init task */ + exit_fs(current); + fs = init_task.fs; + current->fs = fs; + atomic_inc(&fs->count); + + unlock_kernel(); + + sprintf(name, "iop%d_lctd", c->unit); + strcpy(current->comm, name); + + c->lct_running = 1; + + while(1) + { + down_interruptible(&c->lct_sem); + if(signal_pending(current)) + { + dprintk((KERN_ERR "%s: LCT thread dead\n", c->name)); + c->lct_running = 0; + return 0; + } + + entries = c->dlct->table_size; + entries -= 3; + entries /= 9; + + dprintk((KERN_INFO "I2O: Dynamic LCT Update\n")); + dprintk((KERN_INFO "I2O: Dynamic LCT contains %d entries\n", entries)); + + if(!entries) + { + printk(KERN_INFO "iop%d: Empty LCT???\n", c->unit); + continue; + } + + /* + * Loop through all the devices on the IOP looking for their + * LCT data in the LCT. We assume that TIDs are not repeated. + * as that is the only way to really tell. It's been confirmed + * by the IRTOS vendor(s?) that TIDs are not reused until they + * wrap arround(4096), and I doubt a system will up long enough + * to create/delete that many devices. + */ + for(d = c->devices; d; ) + { + found = 0; + d1 = d->next; + + for(i = 0; i < entries; i++) + { + if(d->lct_data.tid == c->dlct->lct_entry[i].tid) + { + found = 1; + break; + } + } + if(!found) + { + dprintk((KERN_INFO "Deleted device!\n")); + spin_lock_irqsave(&i2o_dev_lock,flags); + i2o_delete_device(d); + spin_unlock_irqrestore(&i2o_dev_lock,flags); + } + d = d1; + } + + /* + * Tell LCT to renotify us next time there is a change + */ + i2o_lct_notify(c); + + /* + * Copy new LCT into public LCT + * + * Possible race if someone is reading LCT while we are copying + * over it. If this happens, we'll fix it then. but I doubt that + * the LCT will get updated often enough or will get read by + * a user often enough to worry. + */ + if(c->lct->table_size < c->dlct->table_size) + { + tmp = c->lct; + c->lct = kmalloc(c->dlct->table_size<<2, GFP_KERNEL); + if(!c->lct) + { + printk(KERN_ERR "%s: No memory for LCT!\n", c->name); + c->lct = tmp; + continue; + } + kfree(tmp); + } + memcpy(c->lct, c->dlct, c->dlct->table_size<<2); + } - msg[0] = I2O_MESSAGE_SIZE(5 + evt_data_len / 4) | SGL_OFFSET_5; - msg[1] = I2O_CMD_UTIL_EVT_ACK << 24 | HOST_TID << 12 | tid; - msg[2] = context; - msg[3] = 0; - msg[4] = evt_indicator; - memcpy(msg+5, evt_data, evt_data_len); + return 0; +} - if (i2o_post_this(c, msg, sizeof(msg)) < 0) - return -ETIMEDOUT; - return 0; -} /* * Issue UTIL_CLAIM or UTIL_RELEASE messages @@ -1805,7 +2341,7 @@ * ResultCount, ErrorInfoSize, BlockStatus and BlockSize. */ int i2o_issue_params(int cmd, struct i2o_controller *iop, int tid, - void *opblk, int oplen, void *resblk, int reslen) + void *opblk, int oplen, void *resblk, int reslen) { u32 msg[9]; u32 *res = (u32 *)resblk; @@ -1835,21 +2371,21 @@ return -((res[1] >> 16) & 0xFF); /* -BlockStatus */ } - return 4 + ((res[1] & 0x0000FFFF) << 2); /* bytes used in resblk */ + return 4 + ((res[1] & 0x0000FFFF) << 2); /* bytes used in resblk */ } /* * Query one scalar group value or a whole scalar group. - */ + */ int i2o_query_scalar(struct i2o_controller *iop, int tid, - int group, int field, void *buf, int buflen) + int group, int field, void *buf, int buflen) { u16 opblk[] = { 1, 0, I2O_PARAMS_FIELD_GET, group, 1, field }; u8 resblk[8+buflen]; /* 8 bytes for header */ int size; if (field == -1) /* whole group */ - opblk[4] = -1; + opblk[4] = -1; size = i2o_issue_params(I2O_CMD_UTIL_PARAMS_GET, iop, tid, opblk, sizeof(opblk), resblk, sizeof(resblk)); @@ -1869,7 +2405,7 @@ { u16 *opblk; u8 resblk[8+buflen]; /* 8 bytes for header */ - int size; + int size; opblk = kmalloc(buflen+64, GFP_KERNEL); if (opblk == NULL) @@ -1878,16 +2414,16 @@ return -ENOMEM; } - opblk[0] = 1; /* operation count */ - opblk[1] = 0; /* pad */ + opblk[0] = 1; /* operation count */ + opblk[1] = 0; /* pad */ opblk[2] = I2O_PARAMS_FIELD_SET; opblk[3] = group; - if(field == -1) { /* whole group */ + if(field == -1) { /* whole group */ opblk[4] = -1; memcpy(opblk+5, buf, buflen); } - else /* single field */ + else /* single field */ { opblk[4] = 1; opblk[5] = field; @@ -2052,9 +2588,9 @@ }; if (req_status > I2O_REPLY_STATUS_PROGRESS_REPORT) - printk("%0#4x / ", req_status); + printk(KERN_INFO "%0#4x / ", req_status); else - printk("%s / ", REPLY_STATUS[req_status]); + printk(KERN_INFO "%s / ", REPLY_STATUS[req_status]); return; } @@ -2099,9 +2635,9 @@ }; if (detailed_status > I2O_DSC_DEVICE_NOT_AVAILABLE) - printk("%0#4x.\n", detailed_status); + printk(KERN_INFO "%0#4x.\n", detailed_status); else - printk("%s.\n", COMMON_DSC[detailed_status]); + printk(KERN_INFO "%s.\n", COMMON_DSC[detailed_status]); return; } @@ -2274,25 +2810,30 @@ u8 cmd = (msg[1]>>24)&0xFF; u8 req_status = (msg[4]>>24)&0xFF; u16 detailed_status = msg[4]&0xFFFF; + struct i2o_handler *h = i2o_handlers[msg[2] & (MAX_I2O_MODULES-1)]; printk("%s%s: ", severity, module); - if (cmd < 0x1F) { // Utility Class - i2o_report_util_cmd(cmd); - i2o_report_common_status(req_status); - i2o_report_common_dsc(detailed_status); - return; - } - if (cmd >= 0xA0 && cmd <= 0xEF) { // Executive class - i2o_report_exec_cmd(cmd); - i2o_report_common_status(req_status); - i2o_report_common_dsc(detailed_status); - return; - } - - printk("%02x, %02x / %04x.\n", cmd, req_status, detailed_status); - return; + switch (h->class) { + case I2O_CLASS_EXECUTIVE: + if (cmd < 0x1F) { // Utility cmd + i2o_report_util_cmd(cmd); + i2o_report_common_status(req_status); + i2o_report_common_dsc(detailed_status); + } + if (cmd >= 0xA0 && cmd <= 0xEF) { // Executive cmd + i2o_report_exec_cmd(cmd); + i2o_report_common_status(req_status); + i2o_report_common_dsc(detailed_status); + } + break; + + default: + printk(KERN_INFO "%02x, %02x / %04x.\n", + cmd, req_status, detailed_status); + } + } /* Used to dump a message to syslog during debugging */ @@ -2308,6 +2849,55 @@ #endif } + +/* + * I2O reboot/shutdown notification. + * + * - Call each OSM's reboot notifier (if one exists) + * - Quiesce each IOP in the system + * + * Each IOP has to be quiesced before we can ensure that the system + * can be properly shutdown as a transaction that has already been + * acknowledged still needs to be placed in permanent store on the IOP. + * The SysQuiesce causes the IOP to force all HDMs to complete their + * transactions before returning, so only at that point is it safe + * + */ + +static int i2o_reboot_event(struct notifier_block *n, unsigned long code, void +*p) +{ + int i = 0; + struct i2o_controller *c = NULL; + + if(code != SYS_RESTART && code != SYS_HALT && code != SYS_POWER_OFF) + return NOTIFY_DONE; + + printk(KERN_INFO "Shutting down I2O system.\n"); + printk(KERN_INFO + " This could take a few minutes if there are many devices attached\n"); + + for(i = 0; i < MAX_I2O_MODULES; i++) + { + if(i2o_handlers[i] && i2o_handlers[i]->reboot_notify) + i2o_handlers[i]->reboot_notify(); + } + + for(c = i2o_controller_chain; c; c = c->next) + { + if(i2o_quiesce_controller(c)) + { + printk(KERN_WARNING "i2o: Could not quiesce %s." " + Verify setup on next system power up.\n", c->name); + } + } + + printk(KERN_INFO "I2O system down.\n"); + return NOTIFY_DONE; +} + + + #ifdef MODULE EXPORT_SYMBOL(i2o_install_handler); @@ -2324,6 +2914,9 @@ EXPORT_SYMBOL(i2o_claim_device); EXPORT_SYMBOL(i2o_release_device); +EXPORT_SYMBOL(i2o_device_notify_on); +EXPORT_SYMBOL(i2o_device_notify_off); + EXPORT_SYMBOL(i2o_run_queue); EXPORT_SYMBOL(i2o_activate_controller); EXPORT_SYMBOL(i2o_get_class_name); @@ -2363,22 +2956,62 @@ printk(KERN_INFO "i2o: No PCI I2O controllers found\n"); #endif + + /* + * Initialize event handling thread + */ + sema_init(&evt_sem, 0); + evt_pid = kernel_thread(i2o_core_evt, &evt_reply, CLONE_SIGHAND); + if(evt_pid < 0) + { + printk(KERN_ERR "I2O: Could not create event handler kernel thread\n"); + i2o_remove_handler(&i2o_core_handler); + return 0; + } + else printk(KERN_INFO "event thread created as pid %d \n", evt_pid); + if(i2o_num_controllers) i2o_sys_init(); + register_reboot_notifier(&i2o_reboot_notifier); + return 0; } void cleanup_module(void) { + int stat; + + unregister_reboot_notifier(&i2o_reboot_notifier); + if(i2o_num_controllers) i2o_sys_shutdown(); + /* + * If this is shutdown time, the thread has already been killed + */ + if(evt_running) { + stat = kill_proc(evt_pid, SIGTERM, 1); + if(!stat) { + int count = 10 * 100; + while(evt_running && count) { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(1); + } + + if(!count) + printk(KERN_ERR "i2o: Event thread still running!\n"); + } + } + + #ifdef CONFIG_I2O_PCI_MODULE i2o_pci_core_detach(); #endif i2o_remove_handler(&i2o_core_handler); + unregister_reboot_notifier(&i2o_reboot_notifier); + } #else @@ -2402,6 +3035,21 @@ core_context = i2o_core_handler.context; + /* + * Initialize event handling thread + * We may not find any controllers, but still want this as + * down the road we may have hot pluggable controllers that + * need to be dealt with. + */ + sema_init(&evt_sem, 0); + if((evt_pid = kernel_thread(i2o_core_evt, &evt_reply, CLONE_SIGHAND)) < +0) + { + printk(KERN_ERR "I2O: Could not create event handler kernel thread\n"); + i2o_remove_handler(&i2o_core_handler); + return 0; + } + #ifdef CONFIG_I2O_PCI i2o_pci_init(); #endif @@ -2409,16 +3057,22 @@ if(i2o_num_controllers) i2o_sys_init(); + register_reboot_notifier(&i2o_reboot_notifier); + i2o_config_init(); + #ifdef CONFIG_I2O_BLOCK i2o_block_init(); #endif + #ifdef CONFIG_I2O_SCSI i2o_scsi_init(); #endif + #ifdef CONFIG_I2O_LAN i2o_lan_init(); #endif + #ifdef CONFIG_I2O_PROC i2o_proc_init(); #endif diff -urN v2.2.15/linux/drivers/i2o/i2o_pci.c linux/drivers/i2o/i2o_pci.c --- v2.2.15/linux/drivers/i2o/i2o_pci.c Wed May 3 17:16:39 2000 +++ linux/drivers/i2o/i2o_pci.c Wed Jun 7 14:26:43 2000 @@ -6,6 +6,8 @@ * * Written by Alan Cox, Building Number Three Ltd * Modified by Deepak Saxena + * Mar 23 ,2000: MTRR fix for Intel i960- + * Boji T Kannanthanam * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -195,11 +197,11 @@ c->bus.pci.mtrr_reg1 = -1; if(dev->vendor == PCI_VENDOR_ID_INTEL) - { - printk(KERN_INFO "i2o_pci: MTRR workaround for Intel i960 processor\n"); - c->bus.pci.mtrr_reg1 = mtrr_add(c->mem_phys, 65536, MTRR_TYPE_UNCACHABLE, 1); - if(c->bus.pci.mtrr_reg1< 0) - { + { + printk(KERN_INFO "I2O: MTRR workaround for Intel i960 processor\n"); + c->bus.pci.mtrr_reg1 = mtrr_add(c->mem_phys, 65536, MTRR_TYPE_UNCACHABLE, 1); + if(c->bus.pci.mtrr_reg1< 0) + { printk(KERN_INFO "i2o_pci: Error in setting MTRR_TYPE_UNCACHABLE\n"); if(c->bus.pci.mtrr_reg0>=0) { diff -urN v2.2.15/linux/drivers/i2o/i2o_scsi.c linux/drivers/i2o/i2o_scsi.c --- v2.2.15/linux/drivers/i2o/i2o_scsi.c Wed May 3 17:16:39 2000 +++ linux/drivers/i2o/i2o_scsi.c Wed Jun 7 14:26:43 2000 @@ -292,6 +292,9 @@ struct i2o_handler i2o_scsi_handler= { i2o_scsi_reply, + NULL, + NULL, + NULL, "I2O SCSI OSM", 0, I2O_CLASS_SCSI_PERIPHERAL @@ -301,12 +304,12 @@ { u8 reply[8]; - if(i2o_query_scalar(c, d->lct_data->tid, 0, 3, reply, 4)<0) + if(i2o_query_scalar(c, d->lct_data.tid, 0, 3, reply, 4)<0) return -1; *target=reply[0]; - if(i2o_query_scalar(c, d->lct_data->tid, 0, 4, reply, 8)<0) + if(i2o_query_scalar(c, d->lct_data.tid, 0, 4, reply, 8)<0) return -1; *lun=reply[1]; @@ -323,7 +326,7 @@ int target; h->controller=c; - h->bus_task=d->lct_data->tid; + h->bus_task=d->lct_data.tid; for(target=0;target<16;target++) for(lun=0;lun<8;lun++) @@ -332,33 +335,33 @@ for(unit=c->devices;unit!=NULL;unit=unit->next) { dprintk(("Class %03X, parent %d, want %d.\n", - unit->lct_data->class_id, unit->lct_data->parent_tid, d->lct_data->tid)); + unit->lct_data.class_id, unit->lct_data.parent_tid, d->lct_data.tid)); /* Only look at scsi and fc devices */ - if ( (unit->lct_data->class_id != I2O_CLASS_SCSI_PERIPHERAL) - && (unit->lct_data->class_id != I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL) + if ( (unit->lct_data.class_id != I2O_CLASS_SCSI_PERIPHERAL) + && (unit->lct_data.class_id != I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL) ) continue; /* On our bus ? */ - dprintk(("Found a disk (%d).\n", unit->lct_data->tid)); - if ((unit->lct_data->parent_tid == d->lct_data->tid) - || (unit->lct_data->parent_tid == d->lct_data->parent_tid) + dprintk(("Found a disk (%d).\n", unit->lct_data.tid)); + if ((unit->lct_data.parent_tid == d->lct_data.tid) + || (unit->lct_data.parent_tid == d->lct_data.parent_tid) ) { u16 limit; dprintk(("Its ours.\n")); if(i2o_find_lun(c, unit, &target, &lun)==-1) { - printk(KERN_ERR "i2o_scsi: Unable to get lun for tid %d.\n", unit->lct_data->tid); + printk(KERN_ERR "i2o_scsi: Unable to get lun for tid %d.\n", unit->lct_data.tid); continue; } dprintk(("Found disk %d %d.\n", target, lun)); - h->task[target][lun]=unit->lct_data->tid; + h->task[target][lun]=unit->lct_data.tid; h->tagclock[target][lun]=jiffies; /* Get the max fragments/request */ - i2o_query_scalar(c, d->lct_data->tid, 0xF103, 3, &limit, 2); + i2o_query_scalar(c, d->lct_data.tid, 0xF103, 3, &limit, 2); /* sanity */ if ( limit == 0 ) @@ -432,8 +435,8 @@ /* * bus_adapter, SCSI (obsolete), or FibreChannel busses only */ - if( (d->lct_data->class_id!=I2O_CLASS_BUS_ADAPTER_PORT) // bus_adapter -// && (d->lct_data->class_id!=I2O_CLASS_FIBRE_CHANNEL_PORT) // FC_PORT + if( (d->lct_data.class_id!=I2O_CLASS_BUS_ADAPTER_PORT) // bus_adapter +// && (d->lct_data.class_id!=I2O_CLASS_FIBRE_CHANNEL_PORT) // FC_PORT ) continue; diff -urN v2.2.15/linux/drivers/isdn/avmb1/capi.c linux/drivers/isdn/avmb1/capi.c --- v2.2.15/linux/drivers/isdn/avmb1/capi.c Wed May 3 17:16:39 2000 +++ linux/drivers/isdn/avmb1/capi.c Wed Jun 7 14:26:43 2000 @@ -564,7 +564,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } diff -urN v2.2.15/linux/drivers/isdn/avmb1/kcapi.c linux/drivers/isdn/avmb1/kcapi.c --- v2.2.15/linux/drivers/isdn/avmb1/kcapi.c Wed May 3 17:16:39 2000 +++ linux/drivers/isdn/avmb1/kcapi.c Wed Jun 7 14:26:43 2000 @@ -250,7 +250,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -289,7 +289,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -321,7 +321,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -350,7 +350,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -387,7 +387,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -424,7 +424,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -461,7 +461,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } diff -urN v2.2.15/linux/drivers/isdn/hisax/w6692.c linux/drivers/isdn/hisax/w6692.c --- v2.2.15/linux/drivers/isdn/hisax/w6692.c Tue Oct 26 17:53:40 1999 +++ linux/drivers/isdn/hisax/w6692.c Wed Jun 7 14:26:43 2000 @@ -1,4 +1,4 @@ -/* $Id: w6692.c,v 1.1 1999/09/04 06:28:58 keil Exp $ +/* $Id: w6692.c,v 1.4 2000/03/16 23:24:11 werner Exp $ * w6692.c Winbond W6692 specific routines * @@ -8,6 +8,17 @@ * This file is (c) under GNU PUBLIC LICENSE * * $Log: w6692.c,v $ + * Revision 1.4 2000/03/16 23:24:11 werner + * + * Fixed an additional location + * + * Revision 1.3 2000/03/16 22:41:36 werner + * + * Tried to fix second B-channel problem (still not tested) + * + * Revision 1.2 2000/02/26 00:35:13 keil + * Fix skb freeing in interrupt context + * * Revision 1.1 1999/09/04 06:28:58 keil * first revision * @@ -47,7 +58,7 @@ extern const char *CardType[]; -const char *w6692_revision = "$Revision: 1.1 $"; +const char *w6692_revision = "$Revision: 1.4 $"; #define DBUSY_TIMER_VALUE 80 @@ -314,10 +325,13 @@ { u_char val; u_char r; - struct BCState *bcs = cs->bcs + bchan; + struct BCState *bcs = cs->bcs; struct sk_buff *skb; int count; + if (bcs->channel != bchan) + bcs++; /* hardware bchan must match ! */ + val = cs->BC_Read_Reg(cs, bchan, W_B_EXIR); debugl1(cs, "W6692B chan %d B_EXIR 0x%02X", bchan, val); @@ -721,7 +735,9 @@ W6692Bmode(struct BCState *bcs, int mode, int bc) { struct IsdnCardState *cs = bcs->cs; - int bchan = bcs->hw.w6692.bchan; + int bchan = bc; + + bcs->hw.w6692.bchan = bc; if (cs->debug & L1_DEB_HSCX) debugl1(cs, "w6692 %c mode %d ichan %d", diff -urN v2.2.15/linux/drivers/isdn/isdn_common.c linux/drivers/isdn/isdn_common.c --- v2.2.15/linux/drivers/isdn/isdn_common.c Wed May 3 17:16:40 2000 +++ linux/drivers/isdn/isdn_common.c Wed Jun 7 14:26:43 2000 @@ -665,10 +665,6 @@ } if (tf & ISDN_TIMER_CARRIER) isdn_tty_carrier_timeout(); -#if (defined CONFIG_ISDN_PPP) && (defined CONFIG_ISDN_MPP) - if (tf & ISDN_TIMER_IPPP) - isdn_ppp_timer_timeout(); -#endif } } if (tf) diff -urN v2.2.15/linux/drivers/isdn/isdn_net.c linux/drivers/isdn/isdn_net.c --- v2.2.15/linux/drivers/isdn/isdn_net.c Wed May 3 17:16:40 2000 +++ linux/drivers/isdn/isdn_net.c Wed Jun 7 14:26:43 2000 @@ -2676,11 +2676,6 @@ } netdev->local->magic = ISDN_NET_MAGIC; -#ifdef CONFIG_ISDN_PPP - netdev->mp_last = NULL; /* mpqueue is empty */ - netdev->ib.next_num = 0; - netdev->ib.last = NULL; -#endif netdev->queue = netdev->local; netdev->local->last = netdev->local; netdev->local->netdev = netdev; diff -urN v2.2.15/linux/drivers/isdn/isdn_ppp.c linux/drivers/isdn/isdn_ppp.c --- v2.2.15/linux/drivers/isdn/isdn_ppp.c Wed May 3 17:16:40 2000 +++ linux/drivers/isdn/isdn_ppp.c Wed Jun 7 14:26:43 2000 @@ -324,16 +324,19 @@ #ifdef CONFIG_ISDN_MPP -static int isdn_ppp_bundle(struct ippp_struct *, int unit); -static void isdn_ppp_mask_queue(isdn_net_dev * dev, long mask); -static void isdn_ppp_cleanup_mpqueue(isdn_net_dev * dev, long min); -static void isdn_ppp_cleanup_sqqueue(isdn_net_dev * dev, isdn_net_local *, long min); -static void isdn_ppp_free_sqqueue(isdn_net_dev *); -static int isdn_ppp_fill_mpqueue(isdn_net_dev *, struct sk_buff **skb, - int BEbyte, long *sqno, int min_sqno); -static void isdn_ppp_free_mpqueue(isdn_net_dev *); -#endif +static ippp_bundle * isdn_ppp_bundle_arr = NULL; + +static int isdn_ppp_mp_bundle_array_init(void); +static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to ); +static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, + struct sk_buff *skb); +static void isdn_ppp_mp_cleanup( isdn_net_local * lp ); +static int isdn_ppp_bundle(struct ippp_struct *, int unit); + +#define MP_UNLOCK(b) up(&(b)->lock) +#endif /* CONFIG_ISDN_MPP */ + char *isdn_ppp_revision = "$Revision: 1.63 $"; static struct ippp_struct *ippp_table[ISDN_MAX_CHANNELS]; @@ -370,10 +373,11 @@ isdn_ppp_free(isdn_net_local * lp) { #ifdef CONFIG_ISDN_MPP - isdn_net_local *master_lp = lp; + isdn_net_local *master_lp = NULL; #endif unsigned long flags; struct ippp_struct *is; + isdn_net_local * nlp; if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) return 0; @@ -383,21 +387,39 @@ save_flags(flags); cli(); #ifdef CONFIG_ISDN_MPP + spin_lock(&lp->netdev->pb->lock); // irq_save not necessary + if (lp->master) master_lp = (isdn_net_local *) lp->master->priv; + + /* make sure none of the queue pointers will point to the + * interface being removed */ + for (nlp=lp->next; nlp != lp; nlp=nlp->next) + if (nlp->netdev->queue == lp ) + nlp->netdev->queue = lp->next; + lp->last->next = lp->next; lp->next->last = lp->last; - if (master_lp->netdev->queue == lp) { + + if (master_lp && master_lp->netdev->queue == lp) master_lp->netdev->queue = lp->next; - if (lp->next == lp) { /* last link in queue? */ - master_lp->netdev->ib.bundled = 0; - isdn_ppp_free_mpqueue(master_lp->netdev); - isdn_ppp_free_sqqueue(master_lp->netdev); - } - } +/* + if (lp->next->netdev->queue == lp) + lp->next->netdev->queue = lp->next; + if (lp->last->netdev->queue == lp) + lp->last->netdev->queue = lp->last; +*/ + if (lp->netdev->pb->ref_ct == 1) /* last link in queue? */ + isdn_ppp_mp_cleanup(lp); + lp->next = lp->last = lp; /* (re)set own pointers */ -#endif + lp->netdev->queue = lp; + + spin_unlock(&lp->netdev->pb->lock); + lp->netdev->pb->ref_ct--; + +#endif /* CONFIG_ISDN_MPP */ if ((is->state & IPPP_CONNECT)) isdn_ppp_closewait(lp->ppp_slot); /* force wakeup on ippp device */ @@ -467,20 +489,17 @@ printk(KERN_ERR "isdn_ppp_bind: illegal interface name %s.\n", lp->name); return -1; } + lp->ppp_slot = i; - /* reset some values */ - lp->netdev->ib.bundled = 0; - lp->netdev->ib.next_num = 0; - lp->netdev->ib.modify = 0; - lp->netdev->ib.last = NULL; - lp->netdev->ib.min = 0; - lp->netdev->ib.sq = NULL; - is = ippp_table[i]; is->lp = lp; is->unit = unit; is->state = IPPP_OPEN | IPPP_ASSIGNED; /* assigned to a netdevice but not connected */ +#ifdef CONFIG_ISDN_MPP + if (isdn_ppp_mp_init(lp, NULL) < 0) + return -ENOMEM; +#endif /* CONFIG_ISDN_MPP */ restore_flags(flags); @@ -499,7 +518,7 @@ return; ippp_table[lp->ppp_slot]->state = IPPP_OPEN | IPPP_CONNECT | IPPP_NOBLOCK; - + if (ippp_table[lp->ppp_slot]->wq) wake_up_interruptible(&ippp_table[lp->ppp_slot]->wq); } @@ -574,7 +593,6 @@ is->mp_seqno = 0; /* MP sequence number */ is->pppcfg = 0; /* ppp configuration */ is->mpppcfg = 0; /* mppp configuration */ - is->range = 0x1000000; /* MP: 24 bit range */ is->last_link_seqno = -1; /* MP: maybe set to Bundle-MIN, when joining a bundle ?? */ is->unit = -1; /* set, when we have our interface */ is->mru = 1524; /* MRU, default 1524 */ @@ -1084,6 +1102,11 @@ { int i, j; + +#ifdef CONFIG_ISDN_MPP + if( isdn_ppp_mp_bundle_array_init() < 0 ) + return -ENOMEM; +#endif /* CONFIG_ISDN_MPP */ for (i = 0; i < ISDN_MAX_CHANNELS; i++) { if (!(ippp_table[i] = (struct ippp_struct *) @@ -1115,6 +1138,12 @@ for (i = 0; i < ISDN_MAX_CHANNELS; i++) kfree(ippp_table[i]); + +#ifdef CONFIG_ISDN_MPP + if (isdn_ppp_bundle_arr) + kfree(isdn_ppp_bundle_arr); +#endif /* CONFIG_ISDN_MPP */ + } /* @@ -1140,9 +1169,16 @@ void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb) { struct ippp_struct *is; + int slot; int proto; - is = ippp_table[lp->ppp_slot]; + slot = lp->ppp_slot; + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { + printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot %d\n", lp->ppp_slot); + kfree_skb(skb); + return; + } + is = ippp_table[slot]; if (is->debug & 0x4) { printk(KERN_DEBUG "ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n", @@ -1164,7 +1200,6 @@ #ifdef CONFIG_ISDN_MPP if (!(is->mpppcfg & SC_REJ_MP_PROT)) { - int sqno_end; if(is->compflags & SC_LINK_DECOMP_ON) { if(proto == PPP_LINK_COMP) { @@ -1180,150 +1215,12 @@ } if (proto == PPP_MP) { - isdn_net_local *lpq; - long sqno, min_sqno, tseq; - - u_char BEbyte = skb->data[0]; - if (is->debug & 0x8) - printk(KERN_DEBUG "recv: %d/%04x/%d -> %02x %02x %02x %02x %02x %02x\n", lp->ppp_slot, proto, - (int) skb->len, (int) skb->data[0], (int) skb->data[1], (int) skb->data[2], - (int) skb->data[3], (int) skb->data[4], (int) skb->data[5]); - if (!(is->mpppcfg & SC_IN_SHORT_SEQ)) { - sqno = ((int) skb->data[1] << 16) + ((int) skb->data[2] << 8) + (int) skb->data[3]; - skb_pull(skb, 4); - } else { - sqno = (((int) skb->data[0] & 0xf) << 8) + (int) skb->data[1]; - skb_pull(skb, 2); - } - - /* - * new sequence number lower than last number? (this is only allowed - * for overflow case) - */ - if ((tseq = is->last_link_seqno) >= sqno) { - int range = is->range; - if (tseq + 1024 < range + sqno) /* redundancy check .. not MP conform */ - printk(KERN_WARNING "isdn_ppp_receive, MP, detected overflow with sqno: %ld, last: %ld !!!\n", sqno, tseq); - else { - sqno += range; - is->last_link_seqno = sqno; - } - } else { - /* here, we should also add an redundancy check */ - is->last_link_seqno = sqno; - } - - /* - * step over all links to find lowest link number - */ - for (min_sqno = LONG_MAX, lpq = net_dev->queue;;) { - long lls = ippp_table[lpq->ppp_slot]->last_link_seqno; - if (lls >= 0 && lls < min_sqno) - min_sqno = lls; - lpq = lpq->next; - if (lpq == net_dev->queue) - break; - } - - /* - * for the case, that the last frame numbers of all - * links are overflowed: mask/reduce the sequenece number to - * 'normal' numbering. - */ - if (min_sqno >= ippp_table[lpq->ppp_slot]->range) { - int mask = ippp_table[lpq->ppp_slot]->range-1; /* range is power of two, so a mask will do the job */ - isdn_ppp_mask_queue(net_dev, mask); - net_dev->ib.next_num &= mask; - { - struct sqqueue *q = net_dev->ib.sq; - while (q) { - q->sqno_start &= mask; - q->sqno_end &= mask; - } - } - min_sqno &= mask; - for (lpq = net_dev->queue;;) { - if(ippp_table[lpq->ppp_slot]->last_link_seqno >= 0) - ippp_table[lpq->ppp_slot]->last_link_seqno &= mask; - lpq = lpq->next; - if (lpq == net_dev->queue) - break; - } - } - if ((BEbyte & (MP_BEGIN_FRAG | MP_END_FRAG)) != (MP_BEGIN_FRAG | MP_END_FRAG)) { - static int dmes = 0; - if( !dmes ) { - printk(KERN_DEBUG "ippp: trying ;) to fill mp_queue %d .. UNTESTED!!\n", lp->ppp_slot); - dmes = 1; - } - if ((sqno_end = isdn_ppp_fill_mpqueue(net_dev, &skb, BEbyte, &sqno, min_sqno)) < 0) { - net_dev->ib.modify = 1; /* block timeout-timer */ - isdn_ppp_cleanup_sqqueue(net_dev, lp, min_sqno); - net_dev->ib.modify = 0; - return; /* no packet complete */ - } - } else - sqno_end = sqno; - - if (is->debug & 0x40) - printk(KERN_DEBUG "min_sqno: %ld sqno_end %d next: %ld\n", min_sqno, sqno_end, net_dev->ib.next_num); - - /* - * MP buffer management .. reorders incoming packets .. - * lotsa mem-copies and not heavily tested. - * - * first check whether there is more than one link in the bundle - * then check whether the number is in order - */ - net_dev->ib.modify = 1; /* block timeout-timer */ - if (net_dev->ib.bundled && net_dev->ib.next_num != sqno) { - /* - * packet is not 'in order' - */ - struct sqqueue *q; - - q = (struct sqqueue *) kmalloc(sizeof(struct sqqueue), GFP_ATOMIC); - if (!q) { - net_dev->ib.modify = 0; - printk(KERN_WARNING "ippp/MPPP: Bad! Can't alloc sq node!\n"); - dev_kfree_skb(skb); - return; /* discard */ - } - q->skb = skb; - q->sqno_end = sqno_end; - q->sqno_start = sqno; - q->timer = jiffies + (ISDN_TIMER_1SEC) * 5; /* timeout after 5 seconds */ - - if (!net_dev->ib.sq) { - net_dev->ib.sq = q; - q->next = NULL; - } else { - struct sqqueue *ql = net_dev->ib.sq; - if (ql->sqno_start > q->sqno_start) { - q->next = ql; - net_dev->ib.sq = q; - } else { - while (ql->next && ql->next->sqno_start < q->sqno_start) - ql = ql->next; - q->next = ql->next; - ql->next = q; - } - } - } else { - /* - * packet was 'in order' .. push it higher - */ - net_dev->ib.next_num = sqno_end + 1; - proto = isdn_ppp_strip_proto(skb); - isdn_ppp_push_higher(net_dev, lp, skb, proto); - } - isdn_ppp_cleanup_sqqueue(net_dev, lp, min_sqno); - net_dev->ib.modify = 0; - - } else + isdn_ppp_mp_receive(net_dev, lp, skb); + } + else isdn_ppp_push_higher(net_dev, lp, skb, proto); } else -#endif +#endif /* CONFIG_ISDN_MPP */ isdn_ppp_push_higher(net_dev, lp, skb, proto); } @@ -1335,7 +1232,16 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb, int proto) { struct device *dev = &net_dev->dev; - struct ippp_struct *is = ippp_table[lp->ppp_slot]; + struct ippp_struct *is; + int slot; + + slot = lp->ppp_slot; + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { + printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot %d\n", lp->ppp_slot); + kfree_skb(skb); + return; + } + is = ippp_table[slot]; if (is->debug & 0x10) { printk(KERN_DEBUG "push, skb %d %04x\n", (int) skb->len, proto); @@ -1495,6 +1401,7 @@ unsigned int proto = PPP_IP; /* 0x21 */ struct ippp_struct *ipt,*ipts; unsigned long flags; + int slot; if (mdev) mlp = (isdn_net_local *) (mdev->priv); @@ -1503,7 +1410,14 @@ mlp = (isdn_net_local *) (netdev->priv); } nd = mlp->netdev; /* get master lp */ - ipts = ippp_table[mlp->ppp_slot]; + + slot = mlp->ppp_slot; + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { + printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot %d\n", mlp->ppp_slot); + kfree_skb(skb); + return 0; + } + ipts = ippp_table[slot]; if (!(ipts->pppcfg & SC_ENABLE_IP)) { /* PPP connected ? */ if (ipts->debug & 0x1) @@ -1535,7 +1449,13 @@ } lp = nlp; } - ipt = ippp_table[lp->ppp_slot]; + slot = lp->ppp_slot; + if (slot < 0 || slot > ISDN_MAX_CHANNELS) { + printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot %d\n", lp->ppp_slot); + kfree_skb(skb); + return 0; + } + ipt = ippp_table[slot]; lp->huptimer = 0; /* @@ -1688,71 +1608,447 @@ #ifdef CONFIG_ISDN_MPP -/* - * free SQ queue - * ------------- - * Note: We need two queues for MPPP. The SQ queue holds fully (re)assembled frames, - * that can't be delivered, because there is an outstanding earlier frame - */ -static void -isdn_ppp_free_sqqueue(isdn_net_dev * p) +/* this is _not_ rfc1990 header, but something we convert both short and long + * headers to for convinience's sake: + * byte 0 is flags as in rfc1990 + * bytes 1...4 is 24-bit seqence number converted to host byte order + */ +#define MP_HEADER_LEN 5 + +#define MP_LONGSEQ_MASK 0x00ffffff +#define MP_SHORTSEQ_MASK 0x00000fff +#define MP_LONGSEQ_MAX MP_LONGSEQ_MASK +#define MP_SHORTSEQ_MAX MP_SHORTSEQ_MASK +#define MP_LONGSEQ_MAXBIT ((MP_LONGSEQ_MASK+1)>>1) +#define MP_SHORTSEQ_MAXBIT ((MP_SHORTSEQ_MASK+1)>>1) + +/* sequence-wrap safe comparisions (for long sequence)*/ +#define MP_LT(a,b) ((a-b)&MP_LONGSEQ_MAXBIT) +#define MP_LE(a,b) !((b-a)&MP_LONGSEQ_MAXBIT) +#define MP_GT(a,b) ((b-a)&MP_LONGSEQ_MAXBIT) +#define MP_GE(a,b) !((a-b)&MP_LONGSEQ_MAXBIT) + +#define MP_SEQ(f) ((*(u32*)(f->data+1))) +#define MP_FLAGS(f) (f->data[0]) + +static int isdn_ppp_mp_bundle_array_init(void) +{ + int i; + int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle); + if( (isdn_ppp_bundle_arr = (ippp_bundle*)kmalloc(sz, + GFP_KERNEL)) == NULL ) + return -ENOMEM; + memset(isdn_ppp_bundle_arr, 0, sz); + for( i = 0; i < ISDN_MAX_CHANNELS; i++ ) + spin_lock_init(&isdn_ppp_bundle_arr[i].lock); + return 0; +} + +static ippp_bundle * isdn_ppp_mp_bundle_alloc(void) { - struct sqqueue *q = p->ib.sq; + int i; + for( i = 0; i < ISDN_MAX_CHANNELS; i++ ) + if (isdn_ppp_bundle_arr[i].ref_ct <= 0) + return (isdn_ppp_bundle_arr + i); + return NULL; +} + +static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to ) +{ + struct ippp_struct * is = ippp_table[lp->ppp_slot]; + + if (add_to) { + if( lp->netdev->pb ) + lp->netdev->pb->ref_ct--; + lp->netdev->pb = add_to; + } else { /* first link in a bundle */ + is->mp_seqno = 0; + if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL) + return -ENOMEM; + lp->next = lp->last = lp; /* nobody else in a queue */ + lp->netdev->pb->frags = NULL; + lp->netdev->pb->frames = 0; + lp->netdev->pb->seq = LONG_MAX; + } + lp->netdev->pb->ref_ct++; + + is->last_link_seqno = 0; + return 0; +} + +static u32 isdn_ppp_mp_get_seq( int short_seq, + struct sk_buff * skb, u32 last_seq ); +struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp, + struct sk_buff * from, struct sk_buff * to ); +void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp, + struct sk_buff * from, struct sk_buff * to ); +static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb ); +static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb ); - p->ib.sq = NULL; - while (q) { - struct sqqueue *qn = q->next; - if (q->skb) - dev_kfree_skb(q->skb); - kfree(q); - q = qn; +static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, + struct sk_buff *skb) +{ + struct ippp_struct *is = ippp_table[lp->ppp_slot]; + isdn_net_local * lpq; + ippp_bundle * mp; + isdn_mppp_stats * stats; + struct sk_buff * newfrag, * frag, * start, *nextf; + u32 newseq, minseq, thisseq; + unsigned long flags; + + spin_lock_irqsave(&net_dev->pb->lock, flags); + mp = net_dev->pb; + stats = &mp->stats; + + if( ++mp->frames > stats->max_queue_len ) + stats->max_queue_len = mp->frames; + + if (is->debug & 0x8) + isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb); + + newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ, + skb, is->last_link_seqno); + + + /* if this packet seq # is less than last already processed one, + * toss it right away, but check for sequence start case first + */ + if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) { + mp->seq = newseq; /* the first packet: required for + * rfc1990 non-compliant clients -- + * prevents constant packet toss */ + } else if( MP_LT(newseq, mp->seq) ) { + stats->frame_drops++; + isdn_ppp_mp_free_skb(mp, skb); + spin_unlock_irqrestore(&mp->lock, flags); + return; } + + /* find the minimum received sequence number over all links */ + is->last_link_seqno = minseq = newseq; + for (lpq = net_dev->queue;;) { + u32 lls = ippp_table[lpq->ppp_slot]->last_link_seqno; + if (MP_LT(lls, minseq)) + minseq = lls; + if ((lpq = lpq->next) == net_dev->queue) + break; + } + if (MP_LT(minseq, mp->seq)) + minseq = mp->seq; /* can't go beyond already processed + * packets */ + newfrag = skb; + + /* if this new fragment is before the first one, then enqueue it now. */ + if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) { + newfrag->next = frag; + mp->frags = frag = newfrag; + newfrag = NULL; + } + + start = MP_FLAGS(frag) & MP_BEGIN_FRAG && + MP_SEQ(frag) == mp->seq ? frag : NULL; + + /* + * main fragment traversing loop + * + * try to accomplish several tasks: + * - insert new fragment into the proper sequence slot (once that's done + * newfrag will be set to NULL) + * - reassemble any complete fragment sequence (non-null 'start' + * indicates there is a continguous sequence present) + * - discard any incomplete sequences that are below minseq -- due + * to the fact that sender always increment sequence number, if there + * is an incomplete sequence below minseq, no new fragments would + * come to complete such sequence and it should be discarded + * + * loop completes when we accomplished the following tasks: + * - new fragment is inserted in the proper sequence ('newfrag' is + * set to NULL) + * - we hit a gap in the sequence, so no reassembly/processing is + * possible ('start' would be set to NULL) + * + * algorightm for this code is derived from code in the book + * 'PPP Design And Debugging' by James Carlson (Addison-Wesley) + */ + while (start != NULL || newfrag != NULL) { -} + thisseq = MP_SEQ(frag); + nextf = frag->next; -/* - * free MP queue - * ------------- - * Note: The MP queue holds all frame fragments of frames, that can't be - * reassembled, because there is at least one missing fragment. - */ -static void -isdn_ppp_free_mpqueue(isdn_net_dev * p) -{ - struct mpqueue *q = p->mp_last; - p->mp_last = NULL; - - while (q) { - struct mpqueue *ql = q->next; - dev_kfree_skb(q->skb); - kfree(q); - q = ql; + /* drop any duplicate fragments */ + if (newfrag != NULL && thisseq == newseq) { + isdn_ppp_mp_free_skb(mp, newfrag); + newfrag = NULL; + } + + /* insert new fragment before next element if possible. */ + if (newfrag != NULL && (nextf == NULL || + MP_LT(newseq, MP_SEQ(nextf)))) { + newfrag->next = nextf; + frag->next = nextf = newfrag; + newfrag = NULL; + } + + if (start != NULL) { + /* check for misplaced start */ + if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) { + printk(KERN_WARNING"isdn_mppp(seq %d): new " + "BEGIN flag with no prior END", thisseq); + stats->seqerrs++; + stats->frame_drops++; + start = isdn_ppp_mp_discard(mp, start,frag); + nextf = frag->next; + } + } else if (MP_LE(thisseq, minseq)) { + if (MP_FLAGS(frag) & MP_BEGIN_FRAG) + start = frag; + else { + if (MP_FLAGS(frag) & MP_END_FRAG) + stats->frame_drops++; + if( mp->frags == frag ) + mp->frags = nextf; + isdn_ppp_mp_free_skb(mp, frag); + frag = nextf; + continue; + } + } + + /* if start is non-null and we have end fragment, then + * we have full reassembly sequence -- reassemble + * and process packet now + */ + if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) { + minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK; + /* Reassemble the packet then dispatch it */ + isdn_ppp_mp_reassembly(net_dev, lp, start, nextf); + + start = NULL; + frag = NULL; + + mp->frags = nextf; + } + + /* check if need to update start pointer: if we just + * reassembled the packet and sequence is contiguous + * then next fragment should be the start of new reassembly + * if sequence is contiguous, but we haven't reassembled yet, + * keep going. + * if sequence is not contiguous, either clear everyting + * below low watermark and set start to the next frag or + * clear start ptr. + */ + if (nextf != NULL && + ((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) { + /* if we just reassembled and the next one is here, + * then start another reassembly. */ + + if (frag == NULL) { + if (MP_FLAGS(nextf) & MP_BEGIN_FRAG) + start = nextf; + else + { + printk(KERN_WARNING"isdn_mppp(seq %d):" + " END flag with no following " + "BEGIN", thisseq); + stats->seqerrs++; + } + } + + } else { + if ( nextf != NULL && frag != NULL && + MP_LT(thisseq, minseq)) { + /* we've got a break in the sequence + * and we not at the end yet + * and we did not just reassembled + *(if we did, there wouldn't be anything before) + * and we below the low watermark + * discard all the frames below low watermark + * and start over */ + stats->frame_drops++; + mp->frags = isdn_ppp_mp_discard(mp,start,nextf); + } + /* break in the sequence, no reassembly */ + start = NULL; + } + + frag = nextf; + } /* while -- main loop */ + + if (mp->frags == NULL) + mp->frags = frag; + + /* rather straighforward way to deal with (not very) possible + * queue overflow */ + if (mp->frames > MP_MAX_QUEUE_LEN) { + stats->overflows++; + while (mp->frames < MP_MAX_QUEUE_LEN) { + frag = mp->frags->next; + isdn_ppp_mp_free_skb(mp, mp->frags); + mp->frags = frag; + } + } + + spin_unlock_irqrestore(&mp->lock, flags); +} + +static void isdn_ppp_mp_cleanup( isdn_net_local * lp ) +{ + struct sk_buff * frag = lp->netdev->pb->frags; + struct sk_buff * nextfrag; + while( frag ) { + nextfrag = frag->next; + isdn_ppp_mp_free_skb(lp->netdev->pb, frag); + frag = nextfrag; + } + lp->netdev->pb->frags = NULL; +} + +static u32 isdn_ppp_mp_get_seq( int short_seq, + struct sk_buff * skb, u32 last_seq ) +{ + u32 seq; + int flags = skb->data[0] & (MP_BEGIN_FRAG | MP_END_FRAG); + + if( !short_seq ) + { + seq = ntohl(*(u32*)skb->data) & MP_LONGSEQ_MASK; + skb_push(skb,1); + } + else + { + /* convert 12-bit short seq number to 24-bit long one + */ + seq = ntohs(*(u16*)skb->data) & MP_SHORTSEQ_MASK; + + /* check for seqence wrap */ + if( !(seq & MP_SHORTSEQ_MAXBIT) && + (last_seq & MP_SHORTSEQ_MAXBIT) && + (unsigned long)last_seq <= MP_LONGSEQ_MAX ) + seq |= (last_seq + MP_SHORTSEQ_MAX+1) & + (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK); + else + seq |= last_seq & (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK); + + skb_push(skb, 3); /* put converted seqence back in skb */ + } + *(u32*)(skb->data+1) = seq; /* put seqence back in _host_ byte + * order */ + skb->data[0] = flags; /* restore flags */ + return seq; +} + +struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp, + struct sk_buff * from, struct sk_buff * to ) +{ + if( from ) + while (from != to) { + struct sk_buff * next = from->next; + isdn_ppp_mp_free_skb(mp, from); + from = next; + } + return from; +} + +void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp, + struct sk_buff * from, struct sk_buff * to ) +{ + ippp_bundle * mp = net_dev->pb; + int proto; + struct sk_buff * skb; + unsigned int tot_len; + + if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) + { + if( ippp_table[lp->ppp_slot]->debug & 0x40 ) + printk(KERN_DEBUG"isdn_mppp: reassembly: frame %d, " + "len %d\n", MP_SEQ(from), from->len ); + skb = from; + skb_pull(skb, MP_HEADER_LEN); + mp->frames--; } + else + { + struct sk_buff * frag; + int n; + + for( tot_len=0, frag=from, n = 0; frag != to; + frag=frag->next, n++ ) + tot_len += frag->len - MP_HEADER_LEN; + + if( ippp_table[lp->ppp_slot]->debug & 0x40 ) + printk(KERN_DEBUG"isdn_mppp: reassembling frames %d " + "to %d, len %d\n", MP_SEQ(from), + (MP_SEQ(from)+n-1) & MP_LONGSEQ_MASK, tot_len ); + + if( (skb = dev_alloc_skb(tot_len)) == NULL ) + { + printk(KERN_ERR"isdn_mppp: cannot allocate sk buff " + "of size %d\n", tot_len); + isdn_ppp_mp_discard(mp, from, to); + return; + } + + while( from != to ) + { + unsigned int len = from->len - MP_HEADER_LEN; + memcpy(skb_put(skb,len), from->data+MP_HEADER_LEN, len); + frag = from->next; + isdn_ppp_mp_free_skb(mp, from); + from = frag; + } + } + proto = isdn_ppp_strip_proto(skb); + isdn_ppp_push_higher(net_dev, lp, skb, proto); +} + +static void isdn_ppp_mp_free_skb(ippp_bundle * mp, struct sk_buff * skb) +{ + dev_kfree_skb(skb); + mp->frames--; +} + +static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb ) +{ + printk(KERN_DEBUG "mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n", + slot, (int) skb->len, + (int) skb->data[0], (int) skb->data[1], (int) skb->data[2], + (int) skb->data[3], (int) skb->data[4], (int) skb->data[5]); } static int isdn_ppp_bundle(struct ippp_struct *is, int unit) { char ifn[IFNAMSIZ + 1]; - long flags; isdn_net_dev *p; isdn_net_local *lp, *nlp; + int rc; + unsigned long flags; sprintf(ifn, "ippp%d", unit); p = isdn_net_findif(ifn); if (!p) - return -1; - - isdn_timer_ctrl(ISDN_TIMER_IPPP, 1); /* enable timer for ippp/MP */ + { + printk(KERN_ERR "ippp_bundle: cannot find %s\n", ifn); + return -EINVAL; + } - save_flags(flags); - cli(); + spin_lock_irqsave(&p->pb->lock, flags); nlp = is->lp; lp = p->queue; - p->ib.bundled = 1; + + if( nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS || + lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS ) + { + spin_unlock_irqrestore(&p->pb->lock, flags); + printk(KERN_ERR "ippp_bundle: binding to invalid slot %d\n", + nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ? + nlp->ppp_slot : lp->ppp_slot ); + return -EINVAL; + } + nlp->last = lp->last; lp->last->next = nlp; lp->last = nlp; @@ -1767,280 +2063,15 @@ ippp_table[nlp->ppp_slot]->mpppcfg |= ippp_table[lp->ppp_slot]->mpppcfg & (SC_MP_PROT | SC_REJ_MP_PROT | SC_OUT_SHORT_SEQ | SC_IN_SHORT_SEQ); - restore_flags(flags); - return 0; -} - -/* - * Mask sequence numbers in MP queue - */ -static void -isdn_ppp_mask_queue(isdn_net_dev * dev, long mask) -{ - struct mpqueue *q = dev->mp_last; - while (q) { - q->sqno &= mask; - q = q->next; - } -} - -/* - * put a fragment at the right place into the MP queue - * Also checks, whether this fragment completes a frame. In this case - * the fragments are copied together into one SKB - */ -static int -isdn_ppp_fill_mpqueue(isdn_net_dev * dev, struct sk_buff **skb, int BEbyte, long *sqnop, int min_sqno) -{ - struct mpqueue *qe, - *q1, - *q; - long cnt, - flags; - int pktlen, - sqno_end; - int sqno = *sqnop; - - q1 = (struct mpqueue *) kmalloc(sizeof(struct mpqueue), GFP_ATOMIC); - if (!q1) { - printk(KERN_WARNING "isdn_ppp_fill_mpqueue: Can't alloc struct memory.\n"); - save_flags(flags); - cli(); - isdn_ppp_cleanup_mpqueue(dev, min_sqno); - restore_flags(flags); - return -1; - } - q1->skb = *skb; - q1->sqno = sqno; - q1->BEbyte = BEbyte; - q1->time = jiffies; - - save_flags(flags); - cli(); - - if (!(q = dev->mp_last)) { - dev->mp_last = q1; - q1->next = NULL; - q1->last = NULL; - isdn_ppp_cleanup_mpqueue(dev, min_sqno); /* not necessary */ - restore_flags(flags); - return -1; /* -1 is not an error. Just says, that this fragment hasn't complete a full frame */ - } - for (;;) { /* the faster way would be to step from the queue-end to the start */ - if (sqno > q->sqno) { - if (q->next) { - q = q->next; - continue; - } - q->next = q1; - q1->next = NULL; - q1->last = q; - break; - } - if (sqno == q->sqno) - printk(KERN_WARNING "isdn_fill_mpqueue: illegal sqno received!!\n"); - q1->last = q->last; - q1->next = q; - if (q->last) { - q->last->next = q1; - } else - dev->mp_last = q1; - q->last = q1; - break; - } - -/* now we check whether we completed a packet with this fragment */ - pktlen = -q1->skb->len; - q = q1; - cnt = q1->sqno; - while (!(q->BEbyte & MP_END_FRAG)) { - cnt++; - if (!(q->next) || q->next->sqno != cnt) { - isdn_ppp_cleanup_mpqueue(dev, min_sqno); - restore_flags(flags); - return -1; - } - pktlen += q->skb->len; - q = q->next; - } - pktlen += q->skb->len; - qe = q; - - q = q1; - cnt = q1->sqno; - while (!(q->BEbyte & MP_BEGIN_FRAG)) { - cnt--; - if (!(q->last) || q->last->sqno != cnt) { - isdn_ppp_cleanup_mpqueue(dev, min_sqno); - restore_flags(flags); - return -1; - } - pktlen += q->skb->len; - q = q->last; - } - pktlen += q->skb->len; - - if (q->last) - q->last->next = qe->next; - else - dev->mp_last = qe->next; - - if (qe->next) - qe->next->last = q->last; - qe->next = NULL; - sqno_end = qe->sqno; - *sqnop = q->sqno; - - isdn_ppp_cleanup_mpqueue(dev, min_sqno); - restore_flags(flags); - - *skb = dev_alloc_skb(pktlen + 40); /* not needed: +40 for VJ compression .. */ - - if (!(*skb)) { - while (q) { - struct mpqueue *ql = q->next; - dev_kfree_skb(q->skb); - kfree(q); - q = ql; - } - return -2; - } - cnt = 0; - skb_put(*skb, pktlen); - while (q) { - struct mpqueue *ql = q->next; - memcpy((*skb)->data + cnt, q->skb->data, q->skb->len); - cnt += q->skb->len; - dev_kfree_skb(q->skb); - kfree(q); - q = ql; - } - - return sqno_end; -} - -/* - * check sq-queue, whether we have still buffered the next packet(s) - * or packets with a sqno less or equal to min_sqno - * net_dev: master netdevice , lp: 'real' local connection - */ -static void -isdn_ppp_cleanup_sqqueue(isdn_net_dev * net_dev, isdn_net_local * lp, long min_sqno) -{ - struct sqqueue *q; - - while ((q = net_dev->ib.sq) && (q->sqno_start == net_dev->ib.next_num || q->sqno_end <= min_sqno)) { - int proto; - if (q->sqno_start != net_dev->ib.next_num) { - printk(KERN_DEBUG "ippp: MP, stepping over missing frame: %ld\n", net_dev->ib.next_num); -#ifdef CONFIG_ISDN_PPP_VJ - slhc_toss(ippp_table[net_dev->local->ppp_slot]->slcomp); -#endif - } - proto = isdn_ppp_strip_proto(q->skb); - isdn_ppp_push_higher(net_dev, lp, q->skb, proto); - net_dev->ib.sq = q->next; - net_dev->ib.next_num = q->sqno_end + 1; - kfree(q); - } -} - -/* - * remove stale packets from list - */ -static void -isdn_ppp_cleanup_mpqueue(isdn_net_dev * dev, long min_sqno) -{ -#ifdef CONFIG_ISDN_PPP_VJ - int toss = 0; -#endif - /* currently we just discard ancient packets. - To do: - Maybe, as long as there's no B-packet in front and sqno <= min_sqno: discard. - If sqno < min_sqno and there are gaps: discard (the gaps won't be filled anyway). - Packets with sqno > min_sqno: Larger than mp_mrru: If sum of all pktlen of pending - packets large than mrru: discard - packets need to be consecutive, though, if not - there could be an B and an E-packet in between. - */ - - struct mpqueue *ql, - *q = dev->mp_last; - while(q && (q->sqno < min_sqno) ) { - if ( (q->BEbyte & MP_END_FRAG) || - (q->next && (q->next->sqno <= min_sqno) && (q->next->BEbyte & MP_BEGIN_FRAG)) ) { - printk(KERN_DEBUG "ippp: freeing stale packet(s), min_sq: %ld!\n",min_sqno); - if ((dev->mp_last = q->next)) - q->next->last = NULL; - while (q) { - ql = q->last; - printk(KERN_DEBUG "ippp, freeing packet with sqno: %ld\n",q->sqno); - dev_kfree_skb(q->skb); - kfree(q); -#ifdef CONFIG_ISDN_PPP_VJ - toss = 1; -#endif - q = ql; - } - q = dev->mp_last; - } else - q = q->next; - } -#ifdef CONFIG_ISDN_PPP_VJ - /* did we free a stale frame ? */ - if (toss) - slhc_toss(ippp_table[dev->local->ppp_slot]->slcomp); -#endif -} -#endif - -/* - * a buffered packet timed-out? - */ -void -isdn_ppp_timer_timeout(void) -{ -#ifdef CONFIG_ISDN_MPP - isdn_net_dev *net_dev = dev->netdev; - struct sqqueue *q, - *ql = NULL, - *qn; - - while (net_dev) { - isdn_net_local *lp = net_dev->local; - if (net_dev->ib.modify || lp->master) { /* interface locked or slave? */ - net_dev = net_dev->next; - continue; - } - q = net_dev->ib.sq; - while (q) { - if (q->sqno_start == net_dev->ib.next_num || q->timer < jiffies) { - -#ifdef CONFIG_ISDN_PPP_VJ - /* did we step over a missing frame ? */ - if (q->sqno_start != net_dev->ib.next_num) - slhc_toss(ippp_table[lp->ppp_slot]->slcomp); -#endif - - ql = net_dev->ib.sq; - net_dev->ib.sq = q->next; - net_dev->ib.next_num = q->sqno_end + 1; - q->next = NULL; - for (; ql;) { - int proto = isdn_ppp_strip_proto(ql->skb); - isdn_ppp_push_higher(net_dev, lp, ql->skb, proto); - qn = ql->next; - kfree(ql); - ql = qn; - } - q = net_dev->ib.sq; - } else - q = q->next; - } - net_dev = net_dev->next; - } -#endif -} - + rc = isdn_ppp_mp_init(nlp, p->pb); + + spin_unlock_irqrestore(&p->pb->lock, flags); + + return rc; +} + +#endif /* CONFIG_ISDN_MPP */ + /* * network device ioctl handlers */ diff -urN v2.2.15/linux/drivers/isdn/isdn_ppp.h linux/drivers/isdn/isdn_ppp.h --- v2.2.15/linux/drivers/isdn/isdn_ppp.h Tue Oct 26 17:53:40 1999 +++ linux/drivers/isdn/isdn_ppp.h Wed Jun 7 14:26:43 2000 @@ -76,7 +76,6 @@ */ #include /* for PPP_PROTOCOL */ -extern void isdn_ppp_timer_timeout(void); extern int isdn_ppp_read(int, struct file *, char *, int); extern int isdn_ppp_write(int, struct file *, const char *, int); extern int isdn_ppp_open(int, struct file *); diff -urN v2.2.15/linux/drivers/misc/parport_pc.c linux/drivers/misc/parport_pc.c --- v2.2.15/linux/drivers/misc/parport_pc.c Wed May 3 17:16:40 2000 +++ linux/drivers/misc/parport_pc.c Wed Jun 7 14:26:43 2000 @@ -904,6 +904,10 @@ { { 0, -1 }, } }, { PCI_VENDOR_ID_AFAVLAB, PCI_DEVICE_ID_AFAVLAB_TK9902, 1, { { 0, 1 }, } }, + { PCI_VENDOR_ID_TIMEDIA, PCI_DEVICE_ID_TIMEDIA_1889, 1, + { { 2, -1 }, } }, + { PCI_VENDOR_ID_TIMEDIA, PCI_DEVICE_ID_TIMEDIA_4008A, 1, + { { 0, 1 }, } }, { 0, } }; diff -urN v2.2.15/linux/drivers/net/3c515.c linux/drivers/net/3c515.c --- v2.2.15/linux/drivers/net/3c515.c Mon Jun 7 16:19:58 1999 +++ linux/drivers/net/3c515.c Wed Jun 7 14:26:43 2000 @@ -1300,7 +1300,7 @@ entry = (++vp->cur_rx) % RX_RING_SIZE; } /* Refill the Rx ring buffers. */ - for (; vp->dirty_rx < vp->cur_rx; vp->dirty_rx++) { + for (; vp->cur_rx - vp->dirty_rx > 0; vp->dirty_rx++) { struct sk_buff *skb; entry = vp->dirty_rx % RX_RING_SIZE; if (vp->rx_skbuff[entry] == NULL) { diff -urN v2.2.15/linux/drivers/net/3c59x.c linux/drivers/net/3c59x.c --- v2.2.15/linux/drivers/net/3c59x.c Tue Oct 26 17:53:40 1999 +++ linux/drivers/net/3c59x.c Wed Jun 7 14:26:43 2000 @@ -14,8 +14,39 @@ Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771 */ +/* + 15Apr00, Andrew Morton + - Don't set RxComplete in boomerang interrupt enable reg + - Added standard spinlocking. + - Removed setting/clearing of dev->interrupt + - Removed vp->in_interrupt + - spinlock in vortex_timer to protect mdio functions + - disable local interrupts around call to vortex_interrupt in + vortex_tx_timeout() (So vortex_interrupt can use spin_lock()) + - Removed global save/restore_flags() and cli() from get_stats + and vortex_start_xmit() + - Select window 3 in vortex_timer()'s write to Wn3_MAC_Ctrl + - In vortex_start_xmit(), move the lock to _after_ we've altered + vp->cur_tx and vp->tx_full. This defeats the race between + vortex_start_xmit() and vortex_interrupt which was identified + by Bogdan Costescu. + - Merged back support for six new cards from various sources + - Tell it that 3c905C has NWAY + - Fix handling of SetStatusEnd in 'Too much work..' code, as + per 2.3.99's 3c575_cb (Dave Hinds). Added vp->deferred for this. + + 24May00 <2.2.16-pre4> andrewm + - Replace union wn3_config with BFINS/BFEXT manipulation for + sparc64 (Pete Zaitcev, Peter Jones) + - Use insl_ns/outsl_ns for __powerpc__ (Andreas Tobler) + - In vortex_error, do_tx_reset and vortex_tx_timeout(Vortex): clear + tbusy and force a BH rerun to better recover from errors. + + - See http://www.uow.edu.au/~andrewm/linux/#3c59x-2.2 for more details. +*/ + static char *version = -"3c59x.c:v0.99H 11/17/98 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html\n"; +"3c59x.c:v0.99H 27May00 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html\n"; /* "Knobs" that adjust features and parameters. */ /* Set the copy breakpoint for the copy-only-tiny-frames scheme. @@ -233,7 +264,7 @@ long ioaddr, int irq, int chip_idx, int fnd_cnt); }; -enum { IS_VORTEX=1, IS_BOOMERANG=2, IS_CYCLONE=4, +enum { IS_VORTEX=1, IS_BOOMERANG=2, IS_CYCLONE=4, IS_TORNADO=8, HAS_PWR_CTRL=0x10, HAS_MII=0x20, HAS_NWAY=0x40, HAS_CB_FNS=0x80, }; static struct device *vortex_probe1(int pci_bus, int pci_devfn, struct device *dev, long ioaddr, @@ -241,12 +272,18 @@ static struct pci_id_info pci_tbl[] = { {"3c590 Vortex 10Mbps", 0x10B7, 0x5900, 0xffff, PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1}, + {"3c592 EISA 10mbps Demon/Vortex", 0x10B7, 0x5920, 0xffff, /* AKPM: from Don's 3c59x_cb.c 0.49H */ + PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1}, + {"3c597 EISA Fast Demon/Vortex", 0x10B7, 0x5970, 0xffff, /* AKPM: from Don's 3c59x_cb.c 0.49H */ + PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1}, {"3c595 Vortex 100baseTx", 0x10B7, 0x5950, 0xffff, PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1}, {"3c595 Vortex 100baseT4", 0x10B7, 0x5951, 0xffff, PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1}, {"3c595 Vortex 100base-MII", 0x10B7, 0x5952, 0xffff, PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1}, + +#define EISA_TBL_OFFSET 6 /* AKPM: the offset of this entry */ {"3Com Vortex", 0x10B7, 0x5900, 0xff00, PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, vortex_probe1}, {"3c900 Boomerang 10baseT", 0x10B7, 0x9000, 0xffff, @@ -257,6 +294,10 @@ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1}, {"3c900B-FL Cyclone 10base-FL", 0x10B7, 0x900A, 0xffff, PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1}, + {"3c900 Cyclone 10Mbps TPO", 0x10B7, 0x9004, 0xffff, /* AKPM: from Don's 0.99M */ + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1}, + {"3c900 Cyclone 10Mbps TPC", 0x10B7, 0x9006, 0xffff, /* AKPM: from Don's 0.99M */ + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1}, {"3c905 Boomerang 100baseTx", 0x10B7, 0x9050, 0xffff, PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, vortex_probe1}, {"3c905 Boomerang 100baseT4", 0x10B7, 0x9051, 0xffff, @@ -268,7 +309,7 @@ {"3c905B-FX Cyclone 100baseFx", 0x10B7, 0x905A, 0xffff, PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1}, {"3c905C Tornado", 0x10B7, 0x9200, 0xffff, - PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1}, + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY, 128, vortex_probe1}, {"3c980 Cyclone", 0x10B7, 0x9800, 0xfff0, PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1}, {"3cSOHO100-TX Hurricane", 0x10B7, 0x7646, 0xffff, @@ -283,8 +324,13 @@ {"3CCFE656 Cyclone CardBus", 0x10B7, 0x6560, 0xffff, PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS, 128, vortex_probe1}, + {"3CCFEM656 Cyclone CardBus", 0x10B7, 0x6562, 0xffff, /* AKPM: From the 2.3 driver ? */ + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS, + 128, vortex_probe1}, {"3c575 series CardBus (unknown version)", 0x10B7, 0x5057, 0xf0ff, PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, vortex_probe1}, + {"3c450 HomePNA Tornado", 0x10B7, 0x4500, 0xffff, /* AKPM: from Don's 0.99P */ + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY, 128, vortex_probe1}, {"3Com Boomerang (unknown version)", 0x10B7, 0x9000, 0xff00, PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, vortex_probe1}, {0,}, /* 0 terminated list. */ @@ -363,15 +409,21 @@ enum Window3 { /* Window 3: MAC/config bits. */ Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8, }; -union wn3_config { - int i; - struct w3_config_fields { - unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2; - int pad8:8; - unsigned int ram_split:2, pad18:2, xcvr:4, autoselect:1; - int pad24:7; - } u; -}; + +#define BFEXT(value, offset, bitcount) \ + ((((unsigned long)(value)) >> (offset)) & ((1 << (bitcount)) - 1)) + +#define BFINS(lhs, rhs, offset, bitcount) \ + (((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) | \ + (((rhs) & ((1 << (bitcount)) - 1)) << (offset))) + +#define RAM_SIZE(v) BFEXT(v, 0, 3) +#define RAM_WIDTH(v) BFEXT(v, 3, 1) +#define RAM_SPEED(v) BFEXT(v, 4, 2) +#define ROM_SIZE(v) BFEXT(v, 6, 2) +#define RAM_SPLIT(v) BFEXT(v, 16, 2) +#define XCVR(v) BFEXT(v, 20, 4) +#define AUTOSELECT(v) BFEXT(v, 24, 1) enum Window4 { /* Window 4: Xcvr/media bits. */ Wn4_FIFODiag = 4, Wn4_NetDiag = 6, Wn4_PhysicalMgmt=8, Wn4_Media = 10, @@ -446,7 +498,6 @@ int chip_id; /* The remainder are related to chip state, mostly media selection. */ - unsigned long in_interrupt; struct timer_list timer; /* Media selection timer. */ int options; /* User-settable misc. driver options. */ unsigned int media_override:3, /* Passed-in media type. */ @@ -462,6 +513,9 @@ u16 capabilities, info1, info2; /* Various, from EEPROM. */ u16 advertising; /* NWay media advertisement */ unsigned char phys[2]; /* MII device addresses. */ + u16 deferred; /* Resend these interrupts when we + * bale from the ISR */ + spinlock_t lock; }; /* The action to take with a media selection timer tick. @@ -765,7 +819,7 @@ if ((device_id & 0xFF00) != 0x5900) continue; vortex_probe1(0, 0, dev, ioaddr, inw(ioaddr + 0xC88) >> 12, - 4, cards_found); + EISA_TBL_OFFSET, cards_found); dev = 0; cards_found++; } @@ -814,6 +868,7 @@ vp->next_module = root_vortex_dev; root_vortex_dev = dev; + spin_lock_init(&vp->lock); vp->chip_id = chip_idx; vp->pci_bus = pci_bus; vp->pci_devfn = pci_devfn; @@ -866,7 +921,7 @@ checksum ^= eeprom[i++]; checksum = (checksum ^ (checksum >> 8)) & 0xff; } - if (checksum != 0x00) + if (checksum != 0x00 && !(pci_tbl[chip_idx].drv_flags & IS_TORNADO)) printk(" ***INVALID CHECKSUM %4.4x*** ", checksum); for (i = 0; i < 3; i++) @@ -905,24 +960,24 @@ { char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; - union wn3_config config; + unsigned int config; EL3WINDOW(3); vp->available_media = inw(ioaddr + Wn3_Options); if ((vp->available_media & 0xff) == 0) /* Broken 3c916 */ vp->available_media = 0x40; - config.i = inl(ioaddr + Wn3_Config); + config = inl(ioaddr + Wn3_Config); if (vortex_debug > 1) printk(KERN_DEBUG " Internal config register is %4.4x, " - "transceivers %#x.\n", config.i, inw(ioaddr + Wn3_Options)); + "transceivers %#x.\n", config, inw(ioaddr + Wn3_Options)); printk(KERN_INFO " %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n", - 8 << config.u.ram_size, - config.u.ram_width ? "word" : "byte", - ram_split[config.u.ram_split], - config.u.autoselect ? "autoselect/" : "", - config.u.xcvr > XCVR_ExtMII ? "" : - media_tbl[config.u.xcvr].name); - vp->default_media = config.u.xcvr; - vp->autoselect = config.u.autoselect; + 8 << RAM_SIZE(config), + RAM_WIDTH(config) ? "word" : "byte", + ram_split[RAM_SPLIT(config)], + AUTOSELECT(config) ? "autoselect/" : "", + XCVR(config) > XCVR_ExtMII ? "" : + media_tbl[XCVR(config)].name); + vp->default_media = XCVR(config); + vp->autoselect = AUTOSELECT(config); } if (vp->media_override != 7) { @@ -990,12 +1045,12 @@ { long ioaddr = dev->base_addr; struct vortex_private *vp = (struct vortex_private *)dev->priv; - union wn3_config config; + unsigned int config; int i; /* Before initializing select the active media port. */ EL3WINDOW(3); - config.i = inl(ioaddr + Wn3_Config); + config = inl(ioaddr + Wn3_Config); if (vp->media_override != 7) { if (vortex_debug > 1) @@ -1024,8 +1079,8 @@ dev->name, media_tbl[dev->if_port].name); vp->full_duplex = vp->force_fd; - config.u.xcvr = dev->if_port; - outl(config.i, ioaddr + Wn3_Config); + config = BFINS(config, dev->if_port, 20, 4); + outl(config, ioaddr + Wn3_Config); if (dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) { int mii_reg1, mii_reg5; @@ -1051,7 +1106,7 @@ if (vortex_debug > 1) { printk(KERN_DEBUG "%s: vortex_open() InternalConfig %8.8x.\n", - dev->name, config.i); + dev->name, config); } outw(TxReset, ioaddr + EL3_CMD); @@ -1151,9 +1206,7 @@ set_rx_mode(dev); outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */ - vp->in_interrupt = 0; dev->tbusy = 0; - dev->interrupt = 0; dev->start = 1; outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */ @@ -1163,7 +1216,8 @@ (vp->full_bus_master_tx ? DownComplete : TxAvailable) | (vp->full_bus_master_rx ? UpComplete : RxComplete) | (vp->bus_master ? DMADone : 0); - vp->intr_enable = SetIntrEnb | IntLatch | TxAvailable | RxComplete | + vp->intr_enable = SetIntrEnb | IntLatch | TxAvailable | + (vp->full_bus_master_rx ? 0 : RxComplete) | StatsFull | HostError | TxComplete | IntReq | (vp->bus_master ? DMADone : 0) | UpComplete | DownComplete; outw(vp->status_enable, ioaddr + EL3_CMD); @@ -1184,7 +1238,7 @@ struct device *dev = (struct device *)data; struct vortex_private *vp = (struct vortex_private *)dev->priv; long ioaddr = dev->base_addr; - int next_tick = 0; + int next_tick = 60 * HZ; int ok = 0; int media_status, mii_status, old_window; @@ -1197,7 +1251,7 @@ EL3WINDOW(4); media_status = inw(ioaddr + Wn4_Media); switch (dev->if_port) { - case XCVR_10baseT: case XCVR_100baseTx: case XCVR_100baseFx: + case XCVR_10baseT: case XCVR_100baseTx: case XCVR_100baseFx: if (media_status & Media_LnkBeat) { ok = 1; if (vortex_debug > 1) @@ -1208,6 +1262,9 @@ dev->name, media_tbl[dev->if_port].name, media_status); break; case XCVR_MII: case XCVR_NWAY: + { + unsigned long flags; + spin_lock_irqsave(&vp->lock, flags); mii_status = mdio_read(ioaddr, vp->phys[0], 1); ok = 1; if (debug > 1) @@ -1225,6 +1282,7 @@ dev->name, vp->full_duplex ? "full" : "half", vp->phys[0], mii_reg5); /* Set the full-duplex bit. */ + EL3WINDOW(3); /* AKPM */ outb((vp->full_duplex ? 0x20 : 0) | (dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl); @@ -1232,15 +1290,17 @@ next_tick = 60*HZ; } } - break; + spin_unlock_irqrestore(&vp->lock, flags); + } + break; default: /* Other media types handled by Tx timeouts. */ if (vortex_debug > 1) - printk(KERN_DEBUG "%s: Media %s is has no indication, %x.\n", + printk(KERN_DEBUG "%s: Media %s has no indication, %x.\n", dev->name, media_tbl[dev->if_port].name, media_status); ok = 1; } if ( ! ok) { - union wn3_config config; + unsigned int config; do { dev->if_port = media_tbl[dev->if_port].next; @@ -1262,9 +1322,9 @@ media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media); EL3WINDOW(3); - config.i = inl(ioaddr + Wn3_Config); - config.u.xcvr = dev->if_port; - outl(config.i, ioaddr + Wn3_Config); + config = inl(ioaddr + Wn3_Config); + config = BFINS(config, dev->if_port, 20, 4); + outl(config, ioaddr + Wn3_Config); outw(dev->if_port == XCVR_10base2 ? StartCoax : StopCoax, ioaddr + EL3_CMD); @@ -1276,10 +1336,10 @@ printk(KERN_DEBUG "%s: Media selection timer finished, %s.\n", dev->name, media_tbl[dev->if_port].name); - if (next_tick) { - vp->timer.expires = RUN_AT(next_tick); - add_timer(&vp->timer); - } + vp->timer.expires = RUN_AT(next_tick); + add_timer(&vp->timer); + if (vp->deferred) + outw(FakeIntr, ioaddr + EL3_CMD); return; } @@ -1300,7 +1360,17 @@ printk(KERN_ERR "%s: Interrupt posted but not delivered --" " IRQ blocked by another device?\n", dev->name); /* Bad idea here.. but we might as well handle a few events. */ - vortex_interrupt(dev->irq, dev, 0); + { + /* + * AKPM: block interrupts because vortex_interrupt + * does a bare spin_lock() + */ + unsigned long flags; + __save_flags(flags); + __cli(); + vortex_interrupt(dev->irq, dev, 0); + __restore_flags(flags); + } } outw(TxReset, ioaddr + EL3_CMD); for (j = 200; j >= 0 ; j--) @@ -1338,13 +1408,15 @@ } outb(PKT_BUF_SZ>>8, ioaddr + TxFreeThreshold); outw(DownUnstall, ioaddr + EL3_CMD); - } else + } else { vp->stats.tx_dropped++; - + clear_bit(0, (void*)&dev->tbusy); + } + /* Issue Tx Enable */ outw(TxEnable, ioaddr + EL3_CMD); dev->trans_start = jiffies; - + /* Switch to register set 7 for normal use. */ EL3WINDOW(7); } @@ -1437,6 +1509,9 @@ if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress)) break; outw(TxEnable, ioaddr + EL3_CMD); + clear_bit(0, (void*)&dev->tbusy); + if (!vp->full_bus_master_tx) + mark_bh(NET_BH); } } @@ -1465,7 +1540,11 @@ /* dev->tbusy will be cleared at the DMADone interrupt. */ } else { /* ... and the packet rounded to a doubleword. */ +#ifdef __powerpc__ + outsl_ns(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2); +#else outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2); +#endif DEV_FREE_SKB(skb); if (inw(ioaddr + TxFree) > 1536) { clear_bit(0, (void*)&dev->tbusy); @@ -1537,11 +1616,10 @@ vp->tx_ring[entry].length = cpu_to_le32(skb->len | LAST_FRAG); vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded); - save_flags(flags); - cli(); + spin_lock_irqsave(&vp->lock, flags); outw(DownStall, ioaddr + EL3_CMD); /* Wait for the stall to complete. */ - for (i = 600; i >= 0 ; i--) + for (i = 4000; i >= 0 ; i--) if ( (inw(ioaddr + EL3_STATUS) & CmdInProgress) == 0) break; prev_entry->next = cpu_to_le32(virt_to_bus(&vp->tx_ring[entry])); @@ -1549,16 +1627,16 @@ outl(virt_to_bus(&vp->tx_ring[entry]), ioaddr + DownListPtr); queued_packet++; } - outw(DownUnstall, ioaddr + EL3_CMD); - restore_flags(flags); vp->cur_tx++; if (vp->cur_tx - vp->dirty_tx > TX_RING_SIZE - 1) vp->tx_full = 1; - else { /* Clear previous interrupt enable. */ + else { /* Clear previous interrupt enable. */ prev_entry->status &= cpu_to_le32(~TxIntrUploaded); clear_bit(0, (void*)&dev->tbusy); } + outw(DownUnstall, ioaddr + EL3_CMD); + spin_unlock_irqrestore(&vp->lock, flags); dev->trans_start = jiffies; vp->stats.tx_bytes += skb->len; return 0; @@ -1575,27 +1653,17 @@ int latency, status; int work_done = max_interrupt_work; -#if defined(__i386__) - /* A lock to prevent simultaneous entry bug on Intel SMP machines. */ - if (test_and_set_bit(0, (void*)&dev->interrupt)) { - printk(KERN_ERR"%s: SMP simultaneous entry of an interrupt handler.\n", - dev->name); - dev->interrupt = 0; /* Avoid halting machine. */ - return; - } -#else - if (dev->interrupt) { - printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name); - return; - } - dev->interrupt = 1; -#endif + spin_lock(&vp->lock); - dev->interrupt = 1; ioaddr = dev->base_addr; latency = inb(ioaddr + Timer); status = inw(ioaddr + EL3_STATUS); + if (status & IntReq) { + status |= vp->deferred; + vp->deferred = 0; + } + if (vortex_debug > 4) printk(KERN_DEBUG "%s: interrupt, status %4.4x, latency %d ticks.\n", dev->name, status, latency); @@ -1666,15 +1734,22 @@ outw(AckIntr | UpComplete | DownComplete, ioaddr + EL3_CMD); } else { printk(KERN_WARNING "%s: Too much work in interrupt, status " - "%4.4x. Temporarily disabling functions (%4.4x).\n", - dev->name, status, SetStatusEnb | ((~status) & 0x7FE)); + "%4.4x.\n", dev->name, status); /* Disable all pending interrupts. */ - outw(SetStatusEnb | ((~status) & 0x7FE), ioaddr + EL3_CMD); - outw(AckIntr | 0x7FF, ioaddr + EL3_CMD); + do { + vp->deferred |= status; + outw(SetStatusEnb | (~vp->deferred & vp->status_enable), + ioaddr + EL3_CMD); + outw(AckIntr | (vp->deferred & 0x7ff), ioaddr + EL3_CMD); + } while ((status = inw(ioaddr + EL3_CMD)) & IntLatch); /* The timer will reenable interrupts. */ + del_timer(&vp->timer); + vp->timer.expires = RUN_AT(1); + add_timer(&vp->timer); break; } } + /* Acknowledge the IRQ. */ outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); if (vp->cb_fn_base) /* The PCMCIA people are idiots. */ @@ -1686,11 +1761,7 @@ printk(KERN_DEBUG "%s: exiting interrupt, status %4.4x.\n", dev->name, status); -#if defined(__i386__) - clear_bit(0, (void*)&dev->interrupt); -#else - dev->interrupt = 0; -#endif + spin_unlock(&vp->lock); return; } @@ -1702,7 +1773,7 @@ short rx_status; if (vortex_debug > 5) - printk(KERN_DEBUG" In rx_packet(), status %4.4x, rx_status %4.4x.\n", + printk(KERN_DEBUG" In vortex_rx(), status %4.4x, rx_status %4.4x.\n", inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus)); while ((rx_status = inw(ioaddr + RxStatus)) > 0) { if (rx_status & 0x4000) { /* Error, update stats. */ @@ -1737,8 +1808,13 @@ while (inw(ioaddr + Wn7_MasterStatus) & 0x8000) ; } else { +#ifdef __powerpc__ + insl_ns(ioaddr + RX_FIFO, skb_put(skb, pkt_len), + (pkt_len + 3) >> 2); +#else insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len), (pkt_len + 3) >> 2); +#endif } outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */ skb->protocol = eth_type_trans(skb, dev); @@ -1844,7 +1920,7 @@ entry = (++vp->cur_rx) % RX_RING_SIZE; } /* Refill the Rx ring buffers. */ - for (; vp->dirty_rx < vp->cur_rx; vp->dirty_rx++) { + for (; vp->cur_rx - vp->dirty_rx > 0; vp->dirty_rx++) { struct sk_buff *skb; entry = vp->dirty_rx % RX_RING_SIZE; if (vp->rx_skbuff[entry] == NULL) { @@ -1929,10 +2005,9 @@ unsigned long flags; if (dev->start) { - save_flags(flags); - cli(); + spin_lock_irqsave(&vp->lock, flags); update_stats(dev->base_addr, dev); - restore_flags(flags); + spin_unlock_irqrestore(&vp->lock, flags); } return &vp->stats; } @@ -1981,6 +2056,10 @@ long ioaddr = dev->base_addr; u16 *data = (u16 *)&rq->ifr_data; int phy = vp->phys[0] & 0x1f; + int retval; + unsigned long flags; + + spin_lock_irqsave(&vp->lock, flags); switch(cmd) { case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ @@ -1988,16 +2067,23 @@ case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ EL3WINDOW(4); data[3] = mdio_read(ioaddr, data[0] & 0x1f, data[1] & 0x1f); - return 0; + retval = 0; + break; case SIOCDEVPRIVATE+2: /* Write the specified MII register */ - if (!suser()) - return -EPERM; - EL3WINDOW(4); - mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]); - return 0; + if (!suser()) { + retval = -EPERM; + } else { + EL3WINDOW(4); + mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]); + retval = 0; + } + break; default: - return -EOPNOTSUPP; + retval = -EOPNOTSUPP; } + + spin_unlock_irqrestore(&vp->lock, flags); + return retval; } /* Pre-Cyclone chips have no documented multicast filter, so the only diff -urN v2.2.15/linux/drivers/net/82596.c linux/drivers/net/82596.c --- v2.2.15/linux/drivers/net/82596.c Wed May 3 17:16:40 2000 +++ linux/drivers/net/82596.c Wed Jun 7 14:26:43 2000 @@ -11,10 +11,15 @@ by Richard Hirst Renamed to be 82596.c - *** Untested on Apricot hardware, and may require some hacking - *** to make it work. The old 82596.c reported hasn't worked - *** since 1.3.xx anyway. I have been unable to find any users - *** of Apricot hardware to test this on. + 980825: Changed to receive directly in to sk_buffs which are + allocated at open() time. Eliminates copy on incoming frames + (small ones are still copied). Shared data now held in a + non-cached page, so we can run on 68060 in copyback mode. + + TBD: + * look at deferring rx frames rather than discarding (as per tulip) + * handle tx ring full as per tulip + * performance test to tune rx_copybreak Most of my modifications relate to the braindead big-endian implementation by Intel. When the i596 is operating in @@ -35,7 +40,7 @@ */ -static const char *version = "82596.c:v1.0 15/07/98\n"; +static const char *version = "82596.c $Revision: 1.2 $\n"; #include #include @@ -57,12 +62,47 @@ #include #include #include -#include /*?? */ +#include -#ifdef CONFIG_MVME16x_NET +/* DEBUG flags + */ + +#define DEB_INIT 0x0001 +#define DEB_PROBE 0x0002 +#define DEB_SERIOUS 0x0004 +#define DEB_ERRORS 0x0008 +#define DEB_MULTI 0x0010 +#define DEB_TDR 0x0020 +#define DEB_OPEN 0x0040 +#define DEB_RESET 0x0080 +#define DEB_ADDCMD 0x0100 +#define DEB_STATUS 0x0200 +#define DEB_STARTTX 0x0400 +#define DEB_RXADDR 0x0800 +#define DEB_TXADDR 0x1000 +#define DEB_RXFRAME 0x2000 +#define DEB_INTS 0x4000 +#define DEB_STRUCT 0x8000 +#define DEB_ANY 0xffff + + +#define DEB(x,y) if (i596_debug & (x)) y + + +#if defined(CONFIG_MVME16x_NET) || defined(CONFIG_MVME16x_NET_MODULE) +#define ENABLE_MVME16x_NET +#endif +#if defined(CONFIG_BVME6000_NET) || defined(CONFIG_BVME6000_NET_MODULE) +#define ENABLE_BVME6000_NET +#endif +#if defined(CONFIG_APRICOT) || defined(CONFIG_APRICOT_MODULE) +#define ENABLE_APRICOT +#endif + +#ifdef ENABLE_MVME16x_NET #include #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET #include #endif @@ -82,12 +122,13 @@ #define ISCP_BUSY 0x00010000 #define MACH_IS_APRICOT 0 #else -#define WSWAPrfd(x) x -#define WSWAPiscp(x) ((struct i596_iscp *)(x)) -#define WSWAPscb(x) ((struct i596_scb *)(x)) -#define WSWAPcmd(x) x -#define WSWAPtbd(x) x -#define WSWAPchar(x) x +#define WSWAPrfd(x) ((struct i596_rfd *)(x)) +#define WSWAPrbd(x) ((struct i596_rbd *)(x)) +#define WSWAPiscp(x) ((struct i596_iscp *)(x)) +#define WSWAPscb(x) ((struct i596_scb *)(x)) +#define WSWAPcmd(x) ((struct i596_cmd *)(x)) +#define WSWAPtbd(x) ((struct i596_tbd *)(x)) +#define WSWAPchar(x) ((char *)(x)) #define ISCP_BUSY 0x0001 #define MACH_IS_APRICOT 1 #endif @@ -103,27 +144,24 @@ #define PORT_ALTSCP 0x02 /* alternate SCB address */ #define PORT_ALTDUMP 0x03 /* Alternate DUMP address */ -#ifndef HAVE_PORTRESERVE -#define check_region(addr, size) 0 -#define request_region(addr, size,name) do ; while(0) -#endif +static int i596_debug = (DEB_SERIOUS|DEB_PROBE); -#ifndef HAVE_ALLOC_SKB -#define alloc_skb(size, priority) (struct sk_buff *) kmalloc(size,priority) -#define kfree_skbmem(buff, size) kfree_s(buff,size) -#endif +MODULE_AUTHOR("Richard Hirst"); +MODULE_DESCRIPTION("i82596 driver"); +MODULE_PARM(i596_debug, "i"); -#define APRICOT_DEBUG 2 -#ifdef APRICOT_DEBUG -int i596_debug = APRICOT_DEBUG; -#else -int i596_debug = 1; -#endif +/* Copy frames shorter than rx_copybreak, otherwise pass on up in + * a full sized sk_buff. Value of 100 stolen from tulip.c (!alpha). + */ +static int rx_copybreak = 100; + +#define PKT_BUF_SZ 1536 +#define MAX_MC_CNT 64 #define I596_TOTAL_SIZE 17 -#define I596_NULL -1 +#define I596_NULL ((void *)0xffffffff) #define CMD_EOL 0x8000 /* The last command of the list, stop. */ #define CMD_SUSP 0x4000 /* Suspend after doing cmd. */ @@ -156,12 +194,6 @@ unsigned long ca; }; -struct i596_cmd { - unsigned short status; - unsigned short command; - struct i596_cmd *next; -}; - #define EOF 0x8000 #define SIZE_MASK 0x3fff @@ -172,6 +204,23 @@ char *data; }; +/* The command structure has two 'next' pointers; v_next is the address of + * the next command as seen by the CPU, b_next is the address of the next + * command as seen by the 82596. The b_next pointer, as used by the 82596 + * always references the status field of the next command, rather than the + * v_next field, because the 82596 is unaware of v_next. It may seem more + * logical to put v_next at the end of the structure, but we cannot do that + * because the 82596 expects other fields to be there, depending on command + * type. + */ + +struct i596_cmd { + struct i596_cmd *v_next; /* Address from CPUs viewpoint */ + unsigned short status; + unsigned short command; + struct i596_cmd *b_next; /* Address from i596 viewpoint */ +}; + struct tx_cmd { struct i596_cmd cmd; struct i596_tbd *tbd; @@ -180,16 +229,53 @@ struct sk_buff *skb; /* So we can free it after tx */ }; +struct tdr_cmd { + struct i596_cmd cmd; + unsigned short status; + unsigned short pad; +}; + +struct mc_cmd { + struct i596_cmd cmd; + short mc_cnt; + char mc_addrs[MAX_MC_CNT*6]; +}; + +struct sa_cmd { + struct i596_cmd cmd; + char eth_addr[8]; +}; + +struct cf_cmd { + struct i596_cmd cmd; + char i596_config[16]; +}; + struct i596_rfd { unsigned short stat; unsigned short cmd; - struct i596_rfd *next; - long rbd; + struct i596_rfd *b_next; /* Address from i596 viewpoint */ + struct i596_rbd *rbd; unsigned short count; unsigned short size; - char data[1532]; + struct i596_rfd *v_next; /* Address from CPUs viewpoint */ + struct i596_rfd *v_prev; +}; + +struct i596_rbd { + unsigned short count; + unsigned short zero1; + struct i596_rbd *b_next; + unsigned char *b_data; /* Address from i596 viewpoint */ + unsigned short size; + unsigned short zero2; + struct sk_buff *skb; + struct i596_rbd *v_next; + struct i596_rbd *b_addr; /* This rbd addr from i596 view */ + unsigned char *v_data; /* Address from CPUs viewpoint */ }; +#define TX_RING_SIZE 64 #define RX_RING_SIZE 16 struct i596_scb { @@ -222,19 +308,24 @@ volatile struct i596_scp scp; volatile struct i596_iscp iscp; volatile struct i596_scb scb; - struct i596_cmd set_add; - char eth_addr[8]; - struct i596_cmd set_conf; - char i596_config[16]; - struct i596_cmd tdr; + struct sa_cmd sa_cmd; + struct cf_cmd cf_cmd; + struct tdr_cmd tdr_cmd; + struct mc_cmd mc_cmd; unsigned long stat; int last_restart __attribute__((aligned(4))); - struct i596_rfd *rx_tail; + struct i596_rfd *rfd_head; + struct i596_rbd *rbd_head; struct i596_cmd *cmd_tail; struct i596_cmd *cmd_head; int cmd_backlog; unsigned long last_cmd; struct net_device_stats stats; + struct i596_rfd rfds[RX_RING_SIZE]; + struct i596_rbd rbds[RX_RING_SIZE]; + struct tx_cmd tx_cmds[TX_RING_SIZE]; + struct i596_tbd tbds[TX_RING_SIZE]; + int next_tx_cmd; }; char init_setup[] = @@ -264,26 +355,29 @@ static int i596_close(struct device *dev); static struct net_device_stats *i596_get_stats(struct device *dev); static void i596_add_cmd(struct device *dev, struct i596_cmd *cmd); -static void print_eth(char *); +static void print_eth(unsigned char *buf, char *str); static void set_multicast_list(struct device *dev); +static int rx_ring_size = RX_RING_SIZE; static int ticks_limit = 25; -static int max_cmd_backlog = 16; +static int max_cmd_backlog = TX_RING_SIZE-1; static inline void CA(struct device *dev) { -#ifdef CONFIG_MVME16x_NET +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { ((struct i596_reg *) dev->base_addr)->ca = 1; } #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { - volatile u32 i = *(volatile u32 *) (dev->base_addr); + volatile u32 i; + + i = *(volatile u32 *) (dev->base_addr); } #endif -#ifdef CONFIG_APRICOT +#ifdef ENABLE_APRICOT if (MACH_IS_APRICOT) { outw(0, (short) (dev->base_addr) + 4); } @@ -293,14 +387,14 @@ static inline void MPU_PORT(struct device *dev, int c, volatile void *x) { -#ifdef CONFIG_MVME16x_NET +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { struct i596_reg *p = (struct i596_reg *) (dev->base_addr); p->porthi = ((c) | (u32) (x)) & 0xffff; p->portlo = ((c) | (u32) (x)) >> 16; } #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { u32 v = (u32) (c) | (u32) (x); v = ((u32) (v) << 16) | ((u32) (v) >> 16); @@ -312,103 +406,203 @@ } -#if defined(CONFIG_MVME16x_NET) || defined(CONFIG_BVME6000_NET) -static void i596_error(int irq, void *dev_id, struct pt_regs *regs) +static inline int wait_istat(struct device *dev, struct i596_private *lp, int delcnt, char *str) { - struct device *dev = dev_id; - struct i596_cmd *cmd; + while (--delcnt && lp->iscp.stat) + udelay(10); + if (!delcnt) { + printk("%s: %s, status %4.4x, cmd %4.4x.\n", + dev->name, str, lp->scb.status, lp->scb.command); + return -1; + } + else + return 0; +} - struct i596_private *lp = (struct i596_private *) dev->priv; - printk("i596_error: lp = 0x%08x\n", (u32) lp); - printk("scp at %08x, .sysbus = %08x, .iscp = %08x\n", - (u32) & lp->scp, (u32) lp->scp.sysbus, (u32) lp->scp.iscp); - printk("iscp at %08x, .stat = %08x, .scb = %08x\n", - (u32) & lp->iscp, (u32) lp->iscp.stat, (u32) lp->iscp.scb); - printk("scb at %08x, .status = %04x, .command = %04x\n", - (u32) & lp->scb, lp->scb.status, lp->scb.command); - printk(" .cmd = %08x, .rfd = %08x\n", (u32) lp->scb.cmd, - (u32) lp->scb.rfd); - cmd = WSWAPcmd(lp->scb.cmd); - while (cmd && (u32) cmd < 0x1000000) { - printk("cmd at %08x, .status = %04x, .command = %04x, .next = %08x\n", - (u32) cmd, cmd->status, cmd->command, (u32) cmd->next); - cmd = WSWAPcmd(cmd->next); + +static inline int wait_cmd(struct device *dev, struct i596_private *lp, int delcnt, char *str) +{ + while (--delcnt && lp->scb.command) + udelay(10); + if (!delcnt) { + printk("%s: %s, status %4.4x, cmd %4.4x.\n", + dev->name, str, lp->scb.status, lp->scb.command); + return -1; } - while (1); + else + return 0; } -#endif -static inline int init_rx_bufs(struct device *dev, int num) + +static void i596_display_data(struct device *dev) { struct i596_private *lp = (struct i596_private *) dev->priv; - int i; + struct i596_cmd *cmd; struct i596_rfd *rfd; + struct i596_rbd *rbd; + + printk("lp and scp at %p, .sysbus = %08lx, .iscp = %p\n", + &lp->scp, lp->scp.sysbus, lp->scp.iscp); + printk("iscp at %p, iscp.stat = %08lx, .scb = %p\n", + &lp->iscp, lp->iscp.stat, lp->iscp.scb); + printk("scb at %p, scb.status = %04x, .command = %04x," + " .cmd = %p, .rfd = %p\n", + &lp->scb, lp->scb.status, lp->scb.command, + lp->scb.cmd, lp->scb.rfd); + printk(" errors: crc %lx, align %lx, resource %lx," + " over %lx, rcvdt %lx, short %lx\n", + lp->scb.crc_err, lp->scb.align_err, lp->scb.resource_err, + lp->scb.over_err, lp->scb.rcvdt_err, lp->scb.short_err); + cmd = lp->cmd_head; + while (cmd != I596_NULL) { + printk("cmd at %p, .status = %04x, .command = %04x, .b_next = %p\n", + cmd, cmd->status, cmd->command, cmd->b_next); + cmd = cmd->v_next; + } + rfd = lp->rfd_head; + printk("rfd_head = %p\n", rfd); + do { + printk (" %p .stat %04x, .cmd %04x, b_next %p, rbd %p," + " count %04x\n", + rfd, rfd->stat, rfd->cmd, rfd->b_next, rfd->rbd, + rfd->count); + rfd = rfd->v_next; + } while (rfd != lp->rfd_head); + rbd = lp->rbd_head; + printk("rbd_head = %p\n", rbd); + do { + printk(" %p .count %04x, b_next %p, b_data %p, size %04x\n", + rbd, rbd->count, rbd->b_next, rbd->b_data, rbd->size); + rbd = rbd->v_next; + } while (rbd != lp->rbd_head); +} - lp->scb.rfd = (struct i596_rfd *) I596_NULL; - if (i596_debug > 1) - printk("%s: init_rx_bufs %d.\n", dev->name, num); +#if defined(ENABLE_MVME16x_NET) || defined(ENABLE_BVME6000_NET) +static void i596_error(int irq, void *dev_id, struct pt_regs *regs) +{ + struct device *dev = dev_id; + volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000; - for (i = 0; i < num; i++) { - if (!(rfd = (struct i596_rfd *) kmalloc(sizeof(struct i596_rfd), GFP_KERNEL))) - break; + pcc2[0x28] = 1; + pcc2[0x2b] = 0x1d; + printk("%s: Error interrupt\n", dev->name); + i596_display_data(dev); +} +#endif - rfd->stat = 0x0000; - rfd->rbd = I596_NULL; - rfd->count = 0; - rfd->size = 1532; - if (i == 0) { - rfd->cmd = CMD_EOL; - lp->rx_tail = rfd; - } else - rfd->cmd = 0x0000; +static inline void init_rx_bufs(struct device *dev) +{ + struct i596_private *lp = (struct i596_private *)dev->priv; + int i; + struct i596_rfd *rfd; + struct i596_rbd *rbd; + + /* First build the Receive Buffer Descriptor List */ + + for (i = 0, rbd = lp->rbds; i < rx_ring_size; i++, rbd++) { + struct sk_buff *skb = dev_alloc_skb(PKT_BUF_SZ); - rfd->next = lp->scb.rfd; - lp->scb.rfd = WSWAPrfd(rfd); + if (skb == NULL) + panic("82596: alloc_skb() failed"); + skb->dev = dev; + rbd->v_next = rbd+1; + rbd->b_next = WSWAPrbd(virt_to_bus(rbd+1)); + rbd->b_addr = WSWAPrbd(virt_to_bus(rbd)); + rbd->skb = skb; + rbd->v_data = skb->tail; + rbd->b_data = WSWAPchar(virt_to_bus(skb->tail)); + rbd->size = PKT_BUF_SZ; +#ifdef __mc68000__ + cache_clear(virt_to_phys(skb->tail), PKT_BUF_SZ); +#endif } + lp->rbd_head = lp->rbds; + rbd = lp->rbds + rx_ring_size - 1; + rbd->v_next = lp->rbds; + rbd->b_next = WSWAPrbd(virt_to_bus(lp->rbds)); - if (i != 0) - lp->rx_tail->next = lp->scb.rfd; + /* Now build the Receive Frame Descriptor List */ - return (i); + for (i = 0, rfd = lp->rfds; i < rx_ring_size; i++, rfd++) { + rfd->rbd = I596_NULL; + rfd->v_next = rfd+1; + rfd->v_prev = rfd-1; + rfd->b_next = WSWAPrfd(virt_to_bus(rfd+1)); + rfd->cmd = CMD_FLEX; + } + lp->rfd_head = lp->rfds; + lp->scb.rfd = WSWAPrfd(virt_to_bus(lp->rfds)); + rfd = lp->rfds; + rfd->rbd = lp->rbd_head; + rfd->v_prev = lp->rfds + rx_ring_size - 1; + rfd = lp->rfds + rx_ring_size - 1; + rfd->v_next = lp->rfds; + rfd->b_next = WSWAPrfd(virt_to_bus(lp->rfds)); + rfd->cmd = CMD_EOL|CMD_FLEX; } static inline void remove_rx_bufs(struct device *dev) { + struct i596_private *lp = (struct i596_private *)dev->priv; + struct i596_rbd *rbd; + int i; + + for (i = 0, rbd = lp->rbds; i < rx_ring_size; i++, rbd++) { + if (rbd->skb == NULL) + break; + dev_kfree_skb(rbd->skb); + } +} + + +static void rebuild_rx_bufs(struct device *dev) +{ struct i596_private *lp = (struct i596_private *) dev->priv; - struct i596_rfd *rfd = WSWAPrfd(lp->scb.rfd); + int i; - lp->rx_tail->next = (struct i596_rfd *) I596_NULL; + /* Ensure rx frame/buffer descriptors are tidy */ - do { - lp->scb.rfd = rfd->next; - kfree(rfd); - rfd = WSWAPrfd(lp->scb.rfd); - } - while (rfd != lp->rx_tail); + for (i = 0; i < rx_ring_size; i++) { + lp->rfds[i].rbd = I596_NULL; + lp->rfds[i].cmd = CMD_FLEX; + } + lp->rfds[rx_ring_size-1].cmd = CMD_EOL|CMD_FLEX; + lp->rfd_head = lp->rfds; + lp->scb.rfd = WSWAPrfd(virt_to_bus(lp->rfds)); + lp->rbd_head = lp->rbds; + lp->rfds[0].rbd = WSWAPrbd(virt_to_bus(lp->rbds)); } -static inline void init_i596_mem(struct device *dev) + +static int init_i596_mem(struct device *dev) { struct i596_private *lp = (struct i596_private *) dev->priv; -#if !defined(CONFIG_MVME16x_NET) && !defined(CONFIG_BVME6000_NET) +#if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) short ioaddr = dev->base_addr; #endif - int boguscnt = 100000; unsigned long flags; -#if defined(CONFIG_MVME16x_NET) || defined(CONFIG_BVME6000_NET) -#ifdef CONFIG_MVME16x_NET + MPU_PORT(dev, PORT_RESET, 0); + + udelay(100); /* Wait 100us - seems to help */ + +#if defined(ENABLE_MVME16x_NET) || defined(ENABLE_BVME6000_NET) +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000; /* Disable all ints for now */ pcc2[0x28] = 1; - pcc2[0x2a] = 0x40; - pcc2[0x2b] = 0x40; /* Set snooping bits now! */ + pcc2[0x2a] = 0x48; + /* Following disables snooping. Snooping is not required + * as we make appropriate use of non-cached pages for + * shared data, and cache_push/cache_clear. + */ + pcc2[0x2b] = 0x08; } #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG; @@ -416,74 +610,72 @@ } #endif - MPU_PORT(dev, PORT_RESET, 0); - - udelay(100); /* Wait 100us - seems to help */ - /* change the scp address */ - MPU_PORT(dev, PORT_ALTSCP, &lp->scp); + MPU_PORT(dev, PORT_ALTSCP, (void *)virt_to_bus(&lp->scp)); -#else +#elif defined(ENABLE_APRICOT) - /* change the scp address */ - outw(0, ioaddr); - outw(0, ioaddr); - outb(4, ioaddr + 0xf); - outw(((((int) &lp->scp) & 0xffff) | 2), ioaddr); - outw((((int) &lp->scp) >> 16) & 0xffff, ioaddr); + { + u32 scp = virt_to_bus(&lp->scp); + + /* change the scp address */ + outw(0, ioaddr); + outw(0, ioaddr); + outb(4, ioaddr + 0xf); + outw(scp | 2, ioaddr); + outw(scp >> 16, ioaddr); + } #endif lp->last_cmd = jiffies; -#ifdef CONFIG_MVME16x_NET +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) lp->scp.sysbus = 0x00000054; #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) lp->scp.sysbus = 0x0000004c; #endif -#ifdef CONFIG_APRICOT +#ifdef ENABLE_APRICOT if (MACH_IS_APRICOT) lp->scp.sysbus = 0x00440000; #endif - lp->scp.iscp = WSWAPiscp(&(lp->iscp)); - lp->iscp.scb = WSWAPscb(&(lp->scb)); + lp->scp.iscp = WSWAPiscp(virt_to_bus(&(lp->iscp))); + lp->iscp.scb = WSWAPscb(virt_to_bus(&(lp->scb))); lp->iscp.stat = ISCP_BUSY; lp->cmd_backlog = 0; - lp->cmd_head = lp->scb.cmd = (struct i596_cmd *) I596_NULL; + lp->cmd_head = lp->scb.cmd = I596_NULL; - if (i596_debug > 1) - printk("%s: starting i82596.\n", dev->name); + DEB(DEB_INIT,printk("%s: starting i82596.\n", dev->name)); -#if !defined(CONFIG_MVME16x_NET) && !defined(CONFIG_BVME6000_NET) +#if defined(ENABLE_APRICOT) (void) inb(ioaddr + 0x10); outb(4, ioaddr + 0xf); #endif CA(dev); - while (lp->iscp.stat) - if (--boguscnt == 0) { - printk("%s: i82596 initialization timed out with status %4.4x, cmd %4.4x.\n", - dev->name, lp->scb.status, lp->scb.command); - break; - } + if (wait_istat(dev,lp,1000,"initialization timed out")) + goto failed; + DEB(DEB_INIT,printk("%s: i82596 initialization successful\n", dev->name)); + + /* Ensure rx frame/buffer descriptors are tidy */ + rebuild_rx_bufs(dev); lp->scb.command = 0; -#ifdef CONFIG_MVME16x_NET +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000; /* Enable ints, etc. now */ - pcc2[0x2a] = 0x08; pcc2[0x2a] = 0x55; /* Edge sensitive */ - pcc2[0x2b] = 0x55; + pcc2[0x2b] = 0x15; } #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG; @@ -491,77 +683,131 @@ } #endif - memcpy(lp->i596_config, init_setup, 14); - lp->set_conf.command = CmdConfigure; - i596_add_cmd(dev, &lp->set_conf); - - memcpy(lp->eth_addr, dev->dev_addr, 6); - lp->set_add.command = CmdSASetup; - i596_add_cmd(dev, &lp->set_add); - lp->tdr.command = CmdTDR; - i596_add_cmd(dev, &lp->tdr); + DEB(DEB_INIT,printk("%s: queuing CmdConfigure\n", dev->name)); + memcpy(lp->cf_cmd.i596_config, init_setup, 14); + lp->cf_cmd.cmd.command = CmdConfigure; + i596_add_cmd(dev, &lp->cf_cmd.cmd); + + DEB(DEB_INIT,printk("%s: queuing CmdSASetup\n", dev->name)); + memcpy(lp->sa_cmd.eth_addr, dev->dev_addr, 6); + lp->sa_cmd.cmd.command = CmdSASetup; + i596_add_cmd(dev, &lp->sa_cmd.cmd); + + DEB(DEB_INIT,printk("%s: queuing CmdTDR\n", dev->name)); + lp->tdr_cmd.cmd.command = CmdTDR; + i596_add_cmd(dev, &lp->tdr_cmd.cmd); - boguscnt = 200000; save_flags(flags); cli(); - while (lp->scb.command) - if (--boguscnt == 0) { - printk("%s: receive unit start timed out with status %4.4x, cmd %4.4x.\n", - dev->name, lp->scb.status, lp->scb.command); - break; - } + if (wait_cmd(dev,lp,1000,"timed out waiting to issue RX_START")) + goto failed; + DEB(DEB_INIT,printk("%s: Issuing RX_START\n", dev->name)); lp->scb.command = RX_START; CA(dev); restore_flags(flags); - boguscnt = 2000; - while (lp->scb.command) - if (--boguscnt == 0) { - printk("i82596 init timed out with status %4.4x, cmd %4.4x.\n", - lp->scb.status, lp->scb.command); - break; - } - return; + if (wait_cmd(dev,lp,1000,"RX_START not processed")) + goto failed; + DEB(DEB_INIT,printk("%s: Receive unit started OK\n", dev->name)); + return 0; + +failed: + printk("%s: Failed to initialise 82596\n", dev->name); + MPU_PORT(dev, PORT_RESET, 0); + return -1; } static inline int i596_rx(struct device *dev) { - struct i596_private *lp = (struct i596_private *) dev->priv; + struct i596_private *lp = (struct i596_private *)dev->priv; struct i596_rfd *rfd; + struct i596_rbd *rbd; int frames = 0; - if (i596_debug > 3) - printk("i596_rx()\n"); - - rfd = WSWAPrfd(lp->scb.rfd); /* Reference next frame descriptor to check */ + DEB(DEB_RXFRAME,printk ("i596_rx(), rfd_head %p, rbd_head %p\n", + lp->rfd_head, lp->rbd_head)); - while ((rfd->stat) & STAT_C) { /* Loop while we have complete frames */ - if (i596_debug > 2) - print_eth(rfd->data); + rfd = lp->rfd_head; /* Ref next frame to check */ - if ((rfd->stat) & STAT_OK) { + while ((rfd->stat) & STAT_C) { /* Loop while complete frames */ + if (rfd->rbd == I596_NULL) + rbd = I596_NULL; + else if (rfd->rbd == lp->rbd_head->b_addr) + rbd = lp->rbd_head; + else { + printk("%s: rbd chain broken!\n", dev->name); + /* XXX Now what? */ + rbd = I596_NULL; + } + DEB(DEB_RXFRAME, printk(" rfd %p, rfd.rbd %p, rfd.stat %04x\n", + rfd, rfd->rbd, rfd->stat)); + + if (rbd != I596_NULL && ((rfd->stat) & STAT_OK)) { /* a good frame */ - int pkt_len = rfd->count & 0x3fff; - struct sk_buff *skb = dev_alloc_skb(pkt_len); + int pkt_len = rbd->count & 0x3fff; + struct sk_buff *skb = rbd->skb; + int rx_in_place = 0; + DEB(DEB_RXADDR,print_eth(rbd->v_data, "received")); frames++; + /* Check if the packet is long enough to just accept + * without copying to a properly sized skbuff. + */ + + if (pkt_len > rx_copybreak) { + struct sk_buff *newskb; + + /* Get fresh skbuff to replace filled one. */ + newskb = dev_alloc_skb(PKT_BUF_SZ); + if (newskb == NULL) { + skb = NULL; /* drop pkt */ + goto memory_squeeze; + } + /* Pass up the skb already on the Rx ring. */ + skb_put(skb, pkt_len); + rx_in_place = 1; + rbd->skb = newskb; + newskb->dev = dev; + rbd->v_data = newskb->tail; + rbd->b_data = WSWAPchar(virt_to_bus(newskb->tail)); +#ifdef __mc68000__ + cache_clear(virt_to_phys(newskb->tail), PKT_BUF_SZ); +#endif + } + else + skb = dev_alloc_skb(pkt_len + 2); +memory_squeeze: if (skb == NULL) { - printk("%s: i596_rx Memory squeeze, dropping packet.\n", dev->name); + /* XXX tulip.c can defer packets here!! */ + printk ("%s: i596_rx Memory squeeze, dropping packet.\n", dev->name); lp->stats.rx_dropped++; - } else { + } + else { skb->dev = dev; - memcpy(skb_put(skb, pkt_len), rfd->data, pkt_len); - skb->protocol = eth_type_trans(skb, dev); + if (!rx_in_place) { + /* 16 byte align the data fields */ + skb_reserve(skb, 2); + memcpy(skb_put(skb,pkt_len), rbd->v_data, pkt_len); + } + skb->protocol=eth_type_trans(skb,dev); + skb->len = pkt_len; +#ifdef __mc68000__ + cache_clear(virt_to_phys(rbd->skb->tail), + pkt_len); +#endif netif_rx(skb); lp->stats.rx_packets++; - lp->stats.rx_bytes += pkt_len; + lp->stats.rx_bytes+=pkt_len; } - } else { + } + else { + DEB(DEB_ERRORS, printk("%s: Error, rfd.stat = 0x%04x\n", + dev->name, rfd->stat)); lp->stats.rx_errors++; if ((rfd->stat) & 0x0001) lp->stats.collisions++; @@ -581,33 +827,42 @@ /* Clear the buffer descriptor count and EOF + F flags */ + if (rbd != I596_NULL && (rbd->count & 0x4000)) { + rbd->count = 0; + lp->rbd_head = rbd->v_next; + } + + /* Tidy the frame descriptor, marking it as end of list */ + + rfd->rbd = I596_NULL; rfd->stat = 0; + rfd->cmd = CMD_EOL|CMD_FLEX; rfd->count = 0; - rfd->cmd = CMD_EOL; - lp->rx_tail->cmd = 0; - lp->rx_tail = rfd; - lp->scb.rfd = rfd->next; - rfd = WSWAPrfd(lp->scb.rfd); /* Next frame descriptor to check */ + + /* Remove end-of-list from old end descriptor */ + + rfd->v_prev->cmd = CMD_FLEX; + + /* Update record of next frame descriptor to process */ + + lp->scb.rfd = rfd->b_next; + lp->rfd_head = rfd->v_next; + rfd = lp->rfd_head; } - if (i596_debug > 3) - printk("frames %d\n", frames); + DEB(DEB_RXFRAME,printk ("frames %d\n", frames)); return 0; } -static inline void i596_cleanup_cmd(struct i596_private *lp) + +static inline void i596_cleanup_cmd(struct device *dev, struct i596_private *lp) { struct i596_cmd *ptr; - int boguscnt = 1000; - - if (i596_debug > 4) - printk("i596_cleanup_cmd\n"); - while (lp->cmd_head != (struct i596_cmd *) I596_NULL) { + while (lp->cmd_head != I596_NULL) { ptr = lp->cmd_head; - - lp->cmd_head = WSWAPcmd(lp->cmd_head->next); + lp->cmd_head = ptr->v_next; lp->cmd_backlog--; switch ((ptr->command) & 0x7) { @@ -621,47 +876,29 @@ lp->stats.tx_errors++; lp->stats.tx_aborted_errors++; - ptr->next = (struct i596_cmd *) I596_NULL; - kfree(tx_cmd); - break; - } - case CmdMulticastList: - { - ptr->next = (struct i596_cmd *) I596_NULL; - kfree(ptr); + ptr->v_next = ptr->b_next = I596_NULL; + tx_cmd->cmd.command = 0; /* Mark as free */ break; } default: - ptr->next = (struct i596_cmd *) I596_NULL; + ptr->v_next = ptr->b_next = I596_NULL; } } - while (lp->scb.command) - if (--boguscnt == 0) { - printk("i596_cleanup_cmd timed out with status %4.4x, cmd %4.4x.\n", - lp->scb.status, lp->scb.command); - break; - } - lp->scb.cmd = WSWAPcmd(lp->cmd_head); + wait_cmd(dev,lp,100,"i596_cleanup_cmd timed out"); + lp->scb.cmd = I596_NULL; } static inline void i596_reset(struct device *dev, struct i596_private *lp, int ioaddr) { - int boguscnt = 1000; unsigned long flags; - if (i596_debug > 1) - printk("i596_reset\n"); + DEB(DEB_RESET,printk("i596_reset\n")); save_flags(flags); cli(); - while (lp->scb.command) - if (--boguscnt == 0) { - printk("i596_reset timed out with status %4.4x, cmd %4.4x.\n", - lp->scb.status, lp->scb.command); - break; - } + wait_cmd(dev,lp,100,"i596_reset timed out"); dev->start = 0; dev->tbusy = 1; @@ -669,17 +906,10 @@ CA(dev); /* wait for shutdown */ - boguscnt = 4000; - - while (lp->scb.command) - if (--boguscnt == 0) { - printk("i596_reset 2 timed out with status %4.4x, cmd %4.4x.\n", - lp->scb.status, lp->scb.command); - break; - } + wait_cmd(dev,lp,1000,"i596_reset 2 timed out"); restore_flags(flags); - i596_cleanup_cmd(lp); + i596_cleanup_cmd(dev,lp); i596_rx(dev); dev->start = 1; @@ -693,14 +923,12 @@ struct i596_private *lp = (struct i596_private *) dev->priv; int ioaddr = dev->base_addr; unsigned long flags; - int boguscnt = 1000; - if (i596_debug > 4) - printk("i596_add_cmd\n"); + DEB(DEB_ADDCMD,printk("i596_add_cmd\n")); cmd->status = 0; cmd->command |= (CMD_EOL | CMD_INTR); - cmd->next = (struct i596_cmd *) I596_NULL; + cmd->v_next = cmd->b_next = I596_NULL; save_flags(flags); cli(); @@ -714,24 +942,19 @@ * the CU. */ - if (lp->cmd_head != (struct i596_cmd *) I596_NULL) { - lp->cmd_tail->next = WSWAPcmd(cmd); + if (lp->cmd_head != I596_NULL) { + lp->cmd_tail->v_next = cmd; + lp->cmd_tail->b_next = WSWAPcmd(virt_to_bus(&cmd->status)); } else { lp->cmd_head = cmd; - while (lp->scb.command) - if (--boguscnt == 0) { - printk("i596_add_cmd timed out with status %4.4x, cmd %4.4x.\n", - lp->scb.status, lp->scb.command); - break; - } - lp->scb.cmd = WSWAPcmd(cmd); + wait_cmd(dev,lp,100,"i596_add_cmd timed out"); + lp->scb.cmd = WSWAPcmd(virt_to_bus(&cmd->status)); lp->scb.command = CUC_START; CA(dev); } lp->cmd_tail = cmd; lp->cmd_backlog++; - lp->cmd_head = WSWAPcmd(lp->scb.cmd); /* Is this redundant? RGH 300597 */ restore_flags(flags); if (lp->cmd_backlog > max_cmd_backlog) { @@ -748,35 +971,34 @@ static int i596_open(struct device *dev) { - int i; + int res = 0; - if (i596_debug > 1) - printk("%s: i596_open() irq %d.\n", dev->name, dev->irq); + DEB(DEB_OPEN,printk("%s: i596_open() irq %d.\n", dev->name, dev->irq)); - if (request_irq(dev->irq, &i596_interrupt, 0, "apricot", dev)) + if (request_irq(dev->irq, &i596_interrupt, 0, "i82596", dev)) { + printk("%s: IRQ %d not free\n", dev->name, dev->irq); return -EAGAIN; -#ifdef CONFIG_MVME16x_NET + } +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { - if (request_irq(0x56, &i596_error, 0, "apricot_error", dev)) + if (request_irq(0x56, &i596_error, 0, "i82596_error", dev)) return -EAGAIN; } #endif - if ((i = init_rx_bufs(dev, RX_RING_SIZE)) < RX_RING_SIZE) - printk("%s: only able to allocate %d receive buffers\n", dev->name, i); + init_rx_bufs(dev); - if (i < 4) { - free_irq(dev->irq, dev); - return -EAGAIN; - } dev->tbusy = 0; dev->interrupt = 0; dev->start = 1; MOD_INC_USE_COUNT; /* Initialize the 82596 memory */ - init_i596_mem(dev); + if (init_i596_mem(dev)) { + res = -EAGAIN; + free_irq(dev->irq, dev); + } - return 0; /* Always succeed */ + return res; } static int i596_start_xmit(struct sk_buff *skb, struct device *dev) @@ -784,29 +1006,27 @@ struct i596_private *lp = (struct i596_private *) dev->priv; int ioaddr = dev->base_addr; struct tx_cmd *tx_cmd; - - if (i596_debug > 2) - printk("%s: 82596 start xmit\n", dev->name); + struct i596_tbd *tbd; /* Transmitter timeout, serious problems. */ if (dev->tbusy) { int tickssofar = jiffies - dev->trans_start; if (tickssofar < 5) return 1; - printk("%s: transmit timed out, status resetting.\n", - dev->name); + DEB(DEB_SERIOUS,printk("%s: transmit timed out, status resetting.\n", + dev->name)); lp->stats.tx_errors++; /* Try to restart the adaptor */ if (lp->last_restart == lp->stats.tx_packets) { - if (i596_debug > 1) - printk("Resetting board.\n"); + DEB(DEB_SERIOUS,printk("%s: Resetting board.\n", + dev->name)); /* Shutdown and restart */ i596_reset(dev, lp, ioaddr); } else { /* Issue a channel attention signal */ - if (i596_debug > 1) - printk("Kicking board.\n"); + DEB(DEB_SERIOUS,printk("%s: Kicking board.\n", + dev->name)); lp->scb.command = CUC_START | RX_START; CA(dev); lp->last_restart = lp->stats.tx_packets; @@ -814,8 +1034,8 @@ dev->tbusy = 0; dev->trans_start = jiffies; } - if (i596_debug > 3) - printk("%s: i596_start_xmit() called\n", dev->name); + DEB(DEB_STARTTX,printk("%s: i596_start_xmit(%x,%x) called\n", dev->name, + skb->len, (unsigned int)skb->data)); /* Block a timer-based transmit from overlapping. This could better be done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */ @@ -825,16 +1045,20 @@ short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; dev->trans_start = jiffies; - tx_cmd = (struct tx_cmd *) kmalloc((sizeof(struct tx_cmd) + sizeof(struct i596_tbd)), GFP_ATOMIC); - if (tx_cmd == NULL) { - printk("%s: i596_xmit Memory squeeze, dropping packet.\n", dev->name); + tx_cmd = lp->tx_cmds + lp->next_tx_cmd; + tbd = lp->tbds + lp->next_tx_cmd; + + if (tx_cmd->cmd.command) { + DEB(DEB_ERRORS,printk ("%s: xmit ring full, dropping packet.\n", + dev->name)); lp->stats.tx_dropped++; dev_kfree_skb(skb); } else { - struct i596_tbd *tbd = (struct i596_tbd *) (tx_cmd + 1); - tx_cmd->tbd = WSWAPtbd(tbd); - tbd->next = (struct i596_tbd *) I596_NULL; + if (++lp->next_tx_cmd == TX_RING_SIZE) + lp->next_tx_cmd = 0; + tx_cmd->tbd = WSWAPtbd(virt_to_bus(tbd)); + tbd->next = I596_NULL; tx_cmd->cmd.command = CMD_FLEX | CmdTx; tx_cmd->skb = skb; @@ -844,11 +1068,13 @@ tbd->pad = 0; tbd->size = EOF | length; - tbd->data = WSWAPchar(skb->data); + tbd->data = WSWAPchar(virt_to_bus(skb->data)); - if (i596_debug > 3) - print_eth(skb->data); - i596_add_cmd(dev, (struct i596_cmd *) tx_cmd); +#ifdef __mc68000__ + cache_push(virt_to_phys(skb->data), length); +#endif + DEB(DEB_TXADDR,print_eth(skb->data, "tx-queued")); + i596_add_cmd(dev, &tx_cmd->cmd); lp->stats.tx_packets++; lp->stats.tx_bytes += length; @@ -859,23 +1085,18 @@ return 0; } - -static void print_eth(char *add) +static void print_eth(unsigned char *add, char *str) { int i; - printk("print_eth(%08x)\n", (unsigned int) add); - printk("Dest "); + printk("i596 0x%p, ", add); for (i = 0; i < 6; i++) - printk(" %2.2X", (unsigned char) add[i]); - printk("\n"); - - printk("Source"); + printk(" %02X", add[i + 6]); + printk(" -->"); for (i = 0; i < 6; i++) - printk(" %2.2X", (unsigned char) add[i + 6]); - printk("\n"); - printk("type %2.2X%2.2X\n", (unsigned char) add[12], (unsigned char) add[13]); + printk(" %02X", add[i]); + printk(" %02X%02X, %s\n", add[12], add[13], str); } __initfunc(int i82596_probe(struct device *dev)) @@ -883,24 +1104,25 @@ int i; struct i596_private *lp; char eth_addr[6]; + static int probed = 0; -#ifdef CONFIG_MVME16x_NET + if (probed) + return -ENODEV; + probed++; +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { - static int probed = 0; - +#ifdef XXX_FIXME if (mvme16x_config & MVME16x_CONFIG_NO_ETHERNET) { printk("Ethernet probe disabled - chip not present\n"); - return ENODEV; + return -ENODEV; } - if (probed) - return ENODEV; - probed++; +#endif memcpy(eth_addr, (void *) 0xfffc1f2c, 6); /* YUCK! Get addr from NOVRAM */ dev->base_addr = MVME_I596_BASE; dev->irq = (unsigned) MVME16x_IRQ_I596; } #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { volatile unsigned char *rtc = (unsigned char *) BVME_RTC_BASE; unsigned char msr = rtc[3]; @@ -914,69 +1136,84 @@ dev->irq = (unsigned) BVME_IRQ_I596; } #endif -#ifdef CONFIG_APRICOT - int checksum = 0; - int ioaddr = 0x300; +#ifdef ENABLE_APRICOT + { + int checksum = 0; + int ioaddr = 0x300; - /* this is easy the ethernet interface can only be at 0x300 */ - /* first check nothing is already registered here */ + /* this is easy the ethernet interface can only be at 0x300 */ + /* first check nothing is already registered here */ - if (check_region(ioaddr, I596_TOTAL_SIZE)) - return ENODEV; + if (check_region(ioaddr, I596_TOTAL_SIZE)) { + printk("82596: IO address 0x%04x in use\n", ioaddr); + return -ENODEV; + } - for (i = 0; i < 8; i++) { - eth_addr[i] = inb(ioaddr + 8 + i); - checksum += eth_addr[i]; - } + for (i = 0; i < 8; i++) { + eth_addr[i] = inb(ioaddr + 8 + i); + checksum += eth_addr[i]; + } - /* checksum is a multiple of 0x100, got this wrong first time - some machines have 0x100, some 0x200. The DOS driver doesn't - even bother with the checksum */ + /* checksum is a multiple of 0x100, got this wrong first time + some machines have 0x100, some 0x200. The DOS driver doesn't + even bother with the checksum */ - if (checksum % 0x100) - return ENODEV; + if (checksum % 0x100) + return -ENODEV; - /* Some other boards trip the checksum.. but then appear as ether - address 0. Trap these - AC */ + /* Some other boards trip the checksum.. but then appear as + * ether address 0. Trap these - AC */ - if (memcmp(eth_addr, "\x00\x00\x49", 3) != 0) - return ENODEV; + if (memcmp(eth_addr, "\x00\x00\x49", 3) != 0) + return -ENODEV; - request_region(ioaddr, I596_TOTAL_SIZE, "i596"); + request_region(ioaddr, I596_TOTAL_SIZE, "i596"); - dev->base_addr = ioaddr; - dev->irq = 10; + dev->base_addr = ioaddr; + dev->irq = 10; + } +#endif + dev->mem_start = (int)__get_free_pages(GFP_ATOMIC, 0); + if (!dev->mem_start) { +#ifdef ENABLE_APRICOT + release_region(dev->base_addr, I596_TOTAL_SIZE); #endif + return -ENOMEM; + } + ether_setup(dev); - printk("%s: 82596 at %#3lx,", dev->name, dev->base_addr); + DEB(DEB_PROBE,printk("%s: 82596 at %#3lx,", dev->name, dev->base_addr)); for (i = 0; i < 6; i++) - printk(" %2.2X", dev->dev_addr[i] = eth_addr[i]); + DEB(DEB_PROBE,printk(" %2.2X", dev->dev_addr[i] = eth_addr[i])); - printk(" IRQ %d.\n", dev->irq); + DEB(DEB_PROBE,printk(" IRQ %d.\n", dev->irq)); - if (i596_debug > 0) - printk(version); + DEB(DEB_PROBE,printk(version)); - /* The APRICOT-specific entries in the device structure. */ + /* The 82596-specific entries in the device structure. */ dev->open = &i596_open; dev->stop = &i596_close; dev->hard_start_xmit = &i596_start_xmit; dev->get_stats = &i596_get_stats; dev->set_multicast_list = &set_multicast_list; - dev->mem_start = (int) kmalloc(sizeof(struct i596_private) + 0x0f, GFP_KERNEL); - /* align for scp */ - dev->priv = (void *) ((dev->mem_start + 0xf) & 0xfffffff0); + dev->priv = (void *)(dev->mem_start); lp = (struct i596_private *) dev->priv; - if (i596_debug) - printk("%s: lp at 0x%08lx, lp->scb at 0x%08lx\n" - ,dev->name, (unsigned long) lp, (unsigned long) &lp->scb); + DEB(DEB_INIT,printk ("%s: lp at 0x%08lx (%d bytes), lp->scb at 0x%08lx\n", + dev->name, (unsigned long)lp, + sizeof(struct i596_private), (unsigned long)&lp->scb)); memset((void *) lp, 0, sizeof(struct i596_private)); + +#ifdef __mc68000__ + cache_push(virt_to_phys((void *)(dev->mem_start)), 4096); + cache_clear(virt_to_phys((void *)(dev->mem_start)), 4096); + kernel_set_cachemode((void *)(dev->mem_start), 4096, IOMAP_NOCACHE_SER); +#endif lp->scb.command = 0; - lp->scb.cmd = (struct i596_cmd *) I596_NULL; - lp->scb.rfd = (struct i596_rfd *) I596_NULL; + lp->scb.cmd = I596_NULL; + lp->scb.rfd = I596_NULL; return 0; } @@ -986,10 +1223,9 @@ struct device *dev = dev_id; struct i596_private *lp; short ioaddr; - int boguscnt = 2000; unsigned short status, ack_cmd = 0; -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { if (*(char *) BVME_LOCAL_IRQ_STAT & BVME_ETHERR) { i596_error(BVME_IRQ_I596, NULL, NULL); @@ -1001,8 +1237,6 @@ printk("i596_interrupt(): irq %d for unknown device.\n", irq); return; } - if (i596_debug > 3) - printk("%s: i596_interrupt(): irq %d\n", dev->name, irq); if (dev->interrupt) printk("%s: Re-entering the interrupt handler.\n", dev->name); @@ -1013,140 +1247,113 @@ lp = (struct i596_private *) dev->priv; - while (lp->scb.command) - if (--boguscnt == 0) { - printk("%s: i596 interrupt, timeout status %4.4x command %4.4x.\n", dev->name, lp->scb.status, lp->scb.command); - break; - } + wait_cmd(dev,lp,100,"i596 interrupt, timeout"); status = lp->scb.status; - if (i596_debug > 4) - printk("%s: i596 interrupt, status %4.4x.\n", dev->name, status); + DEB(DEB_INTS,printk("%s: i596 interrupt, IRQ %d, status %4.4x.\n", + dev->name, irq, status)); ack_cmd = status & 0xf000; if ((status & 0x8000) || (status & 0x2000)) { struct i596_cmd *ptr; - if ((i596_debug > 4) && (status & 0x8000)) - printk("%s: i596 interrupt completed command.\n", dev->name); - if ((i596_debug > 4) && (status & 0x2000)) - printk("%s: i596 interrupt command unit inactive %x.\n", dev->name, status & 0x0700); + if ((status & 0x8000)) + DEB(DEB_INTS,printk("%s: i596 interrupt completed command.\n", dev->name)); + if ((status & 0x2000)) + DEB(DEB_INTS,printk("%s: i596 interrupt command unit inactive %x.\n", dev->name, status & 0x0700)); - while ((lp->cmd_head != (struct i596_cmd *) I596_NULL) && (lp->cmd_head->status & STAT_C)) { + while ((lp->cmd_head != I596_NULL) && (lp->cmd_head->status & STAT_C)) { ptr = lp->cmd_head; - if (i596_debug > 2) - printk("cmd_head->status = %04x, ->command = %04x\n", - lp->cmd_head->status, lp->cmd_head->command); - lp->cmd_head = WSWAPcmd(lp->cmd_head->next); + DEB(DEB_STATUS,printk("cmd_head->status = %04x, ->command = %04x\n", + lp->cmd_head->status, lp->cmd_head->command)); + lp->cmd_head = ptr->v_next; lp->cmd_backlog--; switch ((ptr->command) & 0x7) { case CmdTx: - { - struct tx_cmd *tx_cmd = (struct tx_cmd *) ptr; - struct sk_buff *skb = tx_cmd->skb; - - if ((ptr->status) & STAT_OK) { - if (i596_debug > 2) - print_eth(skb->data); - } else { - lp->stats.tx_errors++; - if ((ptr->status) & 0x0020) - lp->stats.collisions++; - if (!((ptr->status) & 0x0040)) - lp->stats.tx_heartbeat_errors++; - if ((ptr->status) & 0x0400) - lp->stats.tx_carrier_errors++; - if ((ptr->status) & 0x0800) - lp->stats.collisions++; - if ((ptr->status) & 0x1000) - lp->stats.tx_aborted_errors++; - } - - dev_kfree_skb(skb); - - ptr->next = (struct i596_cmd *) I596_NULL; - kfree(tx_cmd); - break; - } - case CmdMulticastList: - { - ptr->next = (struct i596_cmd *) I596_NULL; - kfree(ptr); - break; + { + struct tx_cmd *tx_cmd = (struct tx_cmd *) ptr; + struct sk_buff *skb = tx_cmd->skb; + + if ((ptr->status) & STAT_OK) { + DEB(DEB_TXADDR,print_eth(skb->data, "tx-done")); + } else { + lp->stats.tx_errors++; + if ((ptr->status) & 0x0020) + lp->stats.collisions++; + if (!((ptr->status) & 0x0040)) + lp->stats.tx_heartbeat_errors++; + if ((ptr->status) & 0x0400) + lp->stats.tx_carrier_errors++; + if ((ptr->status) & 0x0800) + lp->stats.collisions++; + if ((ptr->status) & 0x1000) + lp->stats.tx_aborted_errors++; } + + dev_kfree_skb(skb); + + tx_cmd->cmd.command = 0; /* Mark free */ + break; + } case CmdTDR: - { - unsigned long status = *((unsigned long *) (ptr + 1)); + { + unsigned short status = ((struct tdr_cmd *)ptr)->status; + + if (status & 0x8000) { + DEB(DEB_ANY,printk("%s: link ok.\n", dev->name)); + } else { + if (status & 0x4000) + printk("%s: Transceiver problem.\n", dev->name); + if (status & 0x2000) + printk("%s: Termination problem.\n", dev->name); + if (status & 0x1000) + printk("%s: Short circuit.\n", dev->name); - if (status & 0x8000) { - if (i596_debug > 3) - printk("%s: link ok.\n", dev->name); - } else { - if (status & 0x4000) - printk("%s: Transceiver problem.\n", dev->name); - if (status & 0x2000) - printk("%s: Termination problem.\n", dev->name); - if (status & 0x1000) - printk("%s: Short circuit.\n", dev->name); - - if (i596_debug > 1) - printk("%s: Time %ld.\n", dev->name, status & 0x07ff); - } - break; + DEB(DEB_TDR,printk("%s: Time %d.\n", dev->name, status & 0x07ff)); } + break; + } case CmdConfigure: - { - ptr->next = (struct i596_cmd *) I596_NULL; - /* Zap command so set_multicast_list() knows it is free */ - ptr->command = 0; - break; - } - default: - ptr->next = (struct i596_cmd *) I596_NULL; + /* Zap command so set_multicast_list() knows it is free */ + ptr->command = 0; + break; } + ptr->v_next = ptr->b_next = I596_NULL; lp->last_cmd = jiffies; } ptr = lp->cmd_head; - while ((ptr != (struct i596_cmd *) I596_NULL) && (ptr != lp->cmd_tail)) { + while ((ptr != I596_NULL) && (ptr != lp->cmd_tail)) { ptr->command &= 0x1fff; - ptr = WSWAPcmd(ptr->next); + ptr = ptr->v_next; } - if ((lp->cmd_head != (struct i596_cmd *) I596_NULL) && (dev->start)) + if ((lp->cmd_head != I596_NULL) && (dev->start)) ack_cmd |= CUC_START; - lp->scb.cmd = WSWAPcmd(lp->cmd_head); + lp->scb.cmd = WSWAPcmd(virt_to_bus(&lp->cmd_head->status)); } if ((status & 0x1000) || (status & 0x4000)) { - if ((i596_debug > 4) && (status & 0x4000)) - printk("%s: i596 interrupt received a frame.\n", dev->name); + if ((status & 0x4000)) + DEB(DEB_INTS,printk("%s: i596 interrupt received a frame.\n", dev->name)); + i596_rx(dev); /* Only RX_START if stopped - RGH 07-07-96 */ if (status & 0x1000) { - if (dev->start) + if (dev->start) { + DEB(DEB_ERRORS,printk("%s: i596 interrupt receive unit inactive, status 0x%x\n", dev->name, status)); ack_cmd |= RX_START; - if (i596_debug > 1) - printk("%s: i596 interrupt receive unit inactive %x.\n", dev->name, status & 0x00f0); + lp->stats.rx_errors++; + lp->stats.rx_fifo_errors++; + rebuild_rx_bufs(dev); + } } - i596_rx(dev); } - /* acknowledge the interrupt */ - -/* COMMENTED OUT <<<<< - if ((lp->scb.cmd != (struct i596_cmd *) I596_NULL) && (dev->start)) - ack_cmd |= CUC_START; - */ - boguscnt = 1000; - while (lp->scb.command) - if (--boguscnt == 0) { - printk("%s: i596 interrupt, timeout status %4.4x command %4.4x.\n", dev->name, lp->scb.status, lp->scb.command); - break; - } + wait_cmd(dev,lp,100,"i596 interrupt, timeout"); lp->scb.command = ack_cmd; -#ifdef CONFIG_MVME16x_NET +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { /* Ack the interrupt */ @@ -1155,7 +1362,7 @@ pcc2[0x2a] |= 0x08; } #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG; @@ -1163,14 +1370,13 @@ *ethirq = 3; } #endif -#ifdef CONFIG_APRICOT +#ifdef ENABLE_APRICOT (void) inb(ioaddr + 0x10); outb(4, ioaddr + 0xf); #endif CA(dev); - if (i596_debug > 4) - printk("%s: exiting interrupt.\n", dev->name); + DEB(DEB_INTS,printk("%s: exiting interrupt.\n", dev->name)); dev->interrupt = 0; return; @@ -1179,41 +1385,27 @@ static int i596_close(struct device *dev) { struct i596_private *lp = (struct i596_private *) dev->priv; - int boguscnt = 2000; unsigned long flags; dev->start = 0; dev->tbusy = 1; - if (i596_debug > 1) - printk("%s: Shutting down ethercard, status was %4.4x.\n", - dev->name, lp->scb.status); + DEB(DEB_INIT,printk("%s: Shutting down ethercard, status was %4.4x.\n", + dev->name, lp->scb.status)); save_flags(flags); cli(); - while (lp->scb.command) - if (--boguscnt == 0) { - printk("%s: close1 timed out with status %4.4x, cmd %4.4x.\n", - dev->name, lp->scb.status, lp->scb.command); - break; - } + wait_cmd(dev,lp,100,"close1 timed out"); lp->scb.command = CUC_ABORT | RX_ABORT; CA(dev); - boguscnt = 2000; - - while (lp->scb.command) - if (--boguscnt == 0) { - printk("%s: close2 timed out with status %4.4x, cmd %4.4x.\n", - dev->name, lp->scb.status, lp->scb.command); - break; - } + wait_cmd(dev,lp,100,"close2 timed out"); restore_flags(flags); + DEB(DEB_STRUCT,i596_display_data(dev)); + i596_cleanup_cmd(dev,lp); - i596_cleanup_cmd(lp); - -#ifdef CONFIG_MVME16x_NET +#ifdef ENABLE_MVME16x_NET if (MACH_IS_MVME16x) { volatile unsigned char *pcc2 = (unsigned char *) 0xfff42000; @@ -1223,7 +1415,7 @@ pcc2[0x2b] = 0x40; /* Set snooping bits now! */ } #endif -#ifdef CONFIG_BVME6000_NET +#ifdef ENABLE_BVME6000_NET if (MACH_IS_BVME6000) { volatile unsigned char *ethirq = (unsigned char *) BVME_ETHIRQ_REG; @@ -1253,57 +1445,60 @@ static void set_multicast_list(struct device *dev) { struct i596_private *lp = (struct i596_private *) dev->priv; - struct i596_cmd *cmd; - int config = 0; + int config = 0, cnt; - if (i596_debug > 1) - printk("%s: set multicast list, %d entries, promisc %s, allmulti %s\n", dev->name, dev->mc_count, dev->flags & IFF_PROMISC ? "ON" : "OFF", dev->flags & IFF_ALLMULTI ? "ON" : "OFF"); + DEB(DEB_MULTI,printk("%s: set multicast list, %d entries, promisc %s, allmulti %s\n", dev->name, dev->mc_count, dev->flags & IFF_PROMISC ? "ON" : "OFF", dev->flags & IFF_ALLMULTI ? "ON" : "OFF")); - if ((dev->flags & IFF_PROMISC) && !(lp->i596_config[8] & 0x01)) { - lp->i596_config[8] |= 0x01; + if ((dev->flags & IFF_PROMISC) && !(lp->cf_cmd.i596_config[8] & 0x01)) { + lp->cf_cmd.i596_config[8] |= 0x01; config = 1; } - if (!(dev->flags & IFF_PROMISC) && (lp->i596_config[8] & 0x01)) { - lp->i596_config[8] &= ~0x01; + if (!(dev->flags & IFF_PROMISC) && (lp->cf_cmd.i596_config[8] & 0x01)) { + lp->cf_cmd.i596_config[8] &= ~0x01; config = 1; } - if ((dev->flags & IFF_ALLMULTI) && (lp->i596_config[11] & 0x20)) { - lp->i596_config[11] &= ~0x20; + if ((dev->flags & IFF_ALLMULTI) && (lp->cf_cmd.i596_config[11] & 0x20)) { + lp->cf_cmd.i596_config[11] &= ~0x20; config = 1; } - if (!(dev->flags & IFF_ALLMULTI) && !(lp->i596_config[11] & 0x20)) { - lp->i596_config[11] |= 0x20; + if (!(dev->flags & IFF_ALLMULTI) && !(lp->cf_cmd.i596_config[11] & 0x20)) { + lp->cf_cmd.i596_config[11] |= 0x20; config = 1; } if (config) { - if (lp->set_conf.command) + if (lp->cf_cmd.cmd.command) printk("%s: config change request already queued\n", dev->name); else { - lp->set_conf.command = CmdConfigure; - i596_add_cmd(dev, &lp->set_conf); + lp->cf_cmd.cmd.command = CmdConfigure; + i596_add_cmd(dev, &lp->cf_cmd.cmd); } } + + cnt = dev->mc_count; + if (cnt > MAX_MC_CNT) + { + cnt = MAX_MC_CNT; + printk("%s: Only %d multicast addresses supported", + dev->name, cnt); + } + if (dev->mc_count > 0) { struct dev_mc_list *dmi; unsigned char *cp; - cmd = (struct i596_cmd *) kmalloc(sizeof(struct i596_cmd) + 2 + dev->mc_count * 6, GFP_ATOMIC); - if (cmd == NULL) { - printk("%s: set_multicast Memory squeeze.\n", dev->name); - return; - } - cmd->command = CmdMulticastList; - *((unsigned short *) (cmd + 1)) = dev->mc_count * 6; - cp = ((unsigned char *) (cmd + 1)) + 2; - for (dmi = dev->mc_list; dmi != NULL; dmi = dmi->next) { + struct mc_cmd *cmd; + + cmd = &lp->mc_cmd; + cmd->cmd.command = CmdMulticastList; + cmd->mc_cnt = dev->mc_count * 6; + cp = cmd->mc_addrs; + for (dmi = dev->mc_list; cnt && dmi != NULL; dmi = dmi->next, cnt--, cp += 6) { memcpy(cp, dmi->dmi_addr, 6); if (i596_debug > 1) - printk("%s: Adding address %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, *(cp + 0), *(cp + 1), *(cp + 2), *(cp + 3), *(cp + 4), *(cp + 5)); - cp += 6; + DEB(DEB_MULTI,printk("%s: Adding address %02x:%02x:%02x:%02x:%02x:%02x\n", + dev->name, cp[0],cp[1],cp[2],cp[3],cp[4],cp[5])); } - if (i596_debug > 2) - print_eth(((char *) (cmd + 1)) + 2); - i596_add_cmd(dev, cmd); + i596_add_cmd(dev, &cmd->cmd); } } @@ -1311,40 +1506,58 @@ static unsigned int i596_portlist[] __initdata = {0x300, 0}; struct netdev_entry i596_drv = -{"apricot", i82596_probe, I596_TOTAL_SIZE, apricot_portlist}; +{"i82596", i82596_probe, I596_TOTAL_SIZE, i596_portlist}; #endif #ifdef MODULE static char devicename[9] = {0,}; -static struct device dev_apricot = +static struct device dev_82596 = { - devicename, /* device name inserted by /linux/drivers/net/net_init.c */ + devicename, /* device name inserted by drivers/net/net_init.c */ 0, 0, 0, 0, - 0x300, 10, + 0, 0, /* base, irq */ 0, 0, 0, NULL, i82596_probe}; +#ifdef ENABLE_APRICOT static int io = 0x300; static int irq = 10; MODULE_PARM(irq, "i"); +#endif + +MODULE_PARM(debug, "i"); +static int debug = -1; int init_module(void) { - dev_apricot.base_addr = io; - dev_apricot.irq = irq; - if (register_netdev(&dev_apricot) != 0) +#ifdef ENABLE_APRICOT + dev_82596.base_addr = io; + dev_82596.irq = irq; +#endif + if (debug >= 0) + i596_debug = debug; + if (register_netdev(&dev_82596) != 0) return -EIO; return 0; } void cleanup_module(void) { - unregister_netdev(&dev_apricot); - kfree((void *) dev_apricot.mem_start); - dev_apricot.priv = NULL; + unregister_netdev(&dev_82596); +#ifdef __mc68000__ + /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING, + * XXX which may be invalid (CONFIG_060_WRITETHROUGH) + */ + kernel_set_cachemode((void *)(dev_82596.mem_start), 4096, + IOMAP_FULL_CACHING); +#endif + free_page ((u32)(dev_82596.mem_start)); + dev_82596.priv = NULL; +#ifdef ENABLE_APRICOT /* If we don't do this, we can't re-insmod it later. */ - release_region(dev_apricot.base_addr, I596_TOTAL_SIZE); + release_region(dev_82596.base_addr, I596_TOTAL_SIZE); +#endif } #endif /* MODULE */ diff -urN v2.2.15/linux/drivers/net/Config.in linux/drivers/net/Config.in --- v2.2.15/linux/drivers/net/Config.in Wed May 3 17:16:40 2000 +++ linux/drivers/net/Config.in Wed Jun 7 14:26:43 2000 @@ -103,7 +103,7 @@ tristate 'DEPCA, DE10x, DE200, DE201, DE202, DE422 support' CONFIG_DEPCA tristate 'EtherWORKS 3 (DE203, DE204, DE205) support' CONFIG_EWRK3 tristate 'EtherExpress 16 support' CONFIG_EEXPRESS - tristate 'EtherExpressPro support' CONFIG_EEXPRESS_PRO + tristate 'EtherExpressPro/EtherExpress 10 (i82595) support' CONFIG_EEXPRESS_PRO tristate 'FMV-181/182/183/184 support' CONFIG_FMV18X tristate 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS tristate 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN @@ -172,6 +172,7 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then tristate 'Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support' CONFIG_ACENIC + tristate 'Packet Engines GNIC-II (Hamachi) support' CONFIG_HAMACHI tristate 'Packet Engines Yellowfin Gigabit-NIC support' CONFIG_YELLOWFIN fi tristate 'SysKonnect SK-98xx support' CONFIG_SK98LIN @@ -281,6 +282,10 @@ # There is no way to detect a Sealevel board. Force it modular # dep_tristate 'Sealevel Systems 4021 support' CONFIG_SEALEVEL_4021 m +# +# Microgate Synclink HDLC/SYNCPPP support +# +dep_tristate 'SyncLink HDLC/SYNCPPP support' CONFIG_SYNCLINK_SYNCPPP m # # Lan Media's board. Currently 1000, 1200, 5200, 5245 @@ -304,6 +309,18 @@ dep_tristate ' Support for LAPB protocol on MultiGate boards' CONFIG_COMX_PROTO_LAPB $CONFIG_LAPB fi dep_tristate ' Support for Frame Relay on MultiGate boards' CONFIG_COMX_PROTO_FR $CONFIG_COMX +fi + +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + tristate 'Generic HDLC driver (EXPERIMENTAL)' CONFIG_HDLC + if [ "$CONFIG_HDLC" != "n" ]; then + dep_tristate ' SDL RISCom/N2 support' CONFIG_N2 $CONFIG_HDLC + dep_tristate ' Moxa C101 support' CONFIG_C101 $CONFIG_HDLC + + if [ "$CONFIG_PCI" != "n" ]; then + dep_tristate ' SBE wanXL support' CONFIG_WANXL $CONFIG_HDLC + fi + fi fi tristate 'Frame relay DLCI support' CONFIG_DLCI diff -urN v2.2.15/linux/drivers/net/Makefile linux/drivers/net/Makefile --- v2.2.15/linux/drivers/net/Makefile Wed May 3 17:16:40 2000 +++ linux/drivers/net/Makefile Wed Jun 7 14:26:43 2000 @@ -831,6 +831,14 @@ endif endif +ifeq ($(CONFIG_HAMACHI),y) +L_OBJS += hamachi.o +else + ifeq ($(CONFIG_HAMACHI),m) + M_OBJS += hamachi.o + endif +endif + ifeq ($(CONFIG_HOSTESS_SV11),y) L_OBJS += hostess_sv11.o CONFIG_85230_BUILTIN = y @@ -877,6 +885,14 @@ endif endif +ifeq ($(CONFIG_SYNCLINK_SYNCPPP),y) +CONFIG_SYNCPPP_BUILTIN = y +else + ifeq ($(CONFIG_SYNCLINK_SYNCPPP),m) + CONFIG_SYNCPPP_MODULE = y + endif +endif + # # COMX drivers # @@ -950,6 +966,40 @@ ifdef CONFIG_85230_MODULE MX_OBJS += z85230.o CONFIG_SYNCPPP_MODULE=y + endif +endif + +ifeq ($(CONFIG_HDLC),y) +L_OBJS += hdlc.o +CONFIG_SYNCPPP_BUILTIN = y +else + ifeq ($(CONFIG_HDLC),m) + M_OBJS += hdlc.o + CONFIG_SYNCPPP_MODULE = y + endif +endif + +ifeq ($(CONFIG_N2),y) +L_OBJS += n2.o +else + ifeq ($(CONFIG_N2),m) + M_OBJS += n2.o + endif +endif + +ifeq ($(CONFIG_C101),y) +L_OBJS += c101.o +else + ifeq ($(CONFIG_C101),m) + M_OBJS += c101.o + endif +endif + +ifeq ($(CONFIG_WANXL),y) +L_OBJS += wanxl.o +else + ifeq ($(CONFIG_WANXL),m) + M_OBJS += wanxl.o endif endif diff -urN v2.2.15/linux/drivers/net/Space.c linux/drivers/net/Space.c --- v2.2.15/linux/drivers/net/Space.c Wed May 3 17:16:40 2000 +++ linux/drivers/net/Space.c Wed Jun 7 14:26:43 2000 @@ -124,6 +124,7 @@ /* Gigabit Ethernet adapters */ extern int yellowfin_probe(struct device *dev); +extern int hamachi_probe(struct device *dev); extern int acenic_probe(struct device *dev); extern int skge_probe(struct device *dev); @@ -232,6 +233,9 @@ #ifdef CONFIG_YELLOWFIN {yellowfin_probe, 0}, +#endif +#ifdef CONFIG_HAMACHI + {hamachi_probe, 0}, #endif #ifdef CONFIG_ACENIC {acenic_probe, 0}, diff -urN v2.2.15/linux/drivers/net/acenic.c linux/drivers/net/acenic.c --- v2.2.15/linux/drivers/net/acenic.c Wed May 3 17:16:40 2000 +++ linux/drivers/net/acenic.c Wed Jun 7 14:26:43 2000 @@ -2,7 +2,7 @@ * acenic.c: Linux driver for the Alteon AceNIC Gigabit Ethernet card * and other Tigon based cards. * - * Copyright 1998, 1999 by Jes Sorensen, . + * Copyright 1998-2000 by Jes Sorensen, . * * Thanks to Alteon and 3Com for providing hardware and documentation * enabling me to write this driver. @@ -17,14 +17,24 @@ * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * - * Additional work by Pete Wyckoff for initial - * Alpha and trace dump support. + * Additional credits: + * Pete Wyckoff : Initial Linux/Alpha and trace + * dump support. The trace dump support has not been + * integrated yet however. + * Troy Benjegerdes: Big Endian (PPC) patches. + * Nate Stahl: Better out of memory handling and stats support. + * Aman Singla: Nasty race between interrupt handler and tx code dealing + * with 'testing the tx_ret_csm and setting tx_full' + * David S. Miller : conversion to new PCI dma mapping + * infrastructure and Sparc support + * Pierrick Pinasseau (CERN): For lending me an Ultra 5 to test the + * driver under Linux/Sparc64 + * Matt Domsch : Detect 1000baseT cards */ -#define PKT_COPY_THRESHOLD 300 - +#include #include - +#include #include #include #include @@ -36,6 +46,13 @@ #include #include #include + +#undef ETHTOOL +#undef INDEX_DEBUG + +#ifdef ETHTOOL +#include +#endif #include #include @@ -45,20 +62,19 @@ #include #include -#include "acenic.h" - -/* - * These must be defined before the firmware is included. - */ -#define MAX_TEXT_LEN 96*1024 -#define MAX_RODATA_LEN 8*1024 -#define MAX_DATA_LEN 2*1024 -#include "acenic_firmware.h" +#ifdef CONFIG_ACENIC_OMIT_TIGON_I +#define ACE_IS_TIGON_I(ap) 0 +#else +#define ACE_IS_TIGON_I(ap) (ap->version == 1) +#endif #ifndef PCI_VENDOR_ID_ALTEON #define PCI_VENDOR_ID_ALTEON 0x12ae -#define PCI_DEVICE_ID_ALTEON_ACENIC 0x0001 +#endif +#ifndef PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE +#define PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE 0x0001 +#define PCI_DEVICE_ID_ALTEON_ACENIC_COPPER 0x0002 #endif #ifndef PCI_DEVICE_ID_3COM_3C985 #define PCI_DEVICE_ID_3COM_3C985 0x0001 @@ -71,18 +87,107 @@ * They used the DEC vendor ID by mistake */ #ifndef PCI_DEVICE_ID_FARALLON_PN9000SX -#define PCI_DEVICE_ID_FARALLON_PN9000SX 0x1a +#define PCI_DEVICE_ID_FARALLON_PN9000SX 0x1a #endif #ifndef PCI_VENDOR_ID_SGI -#define PCI_VENDOR_ID_SGI 0x10a9 -#define PCI_DEVICE_ID_SGI_ACENIC 0x0009 +#define PCI_VENDOR_ID_SGI 0x10a9 +#endif +#ifndef PCI_DEVICE_ID_SGI_ACENIC +#define PCI_DEVICE_ID_SGI_ACENIC 0x0009 +#endif + +#ifndef wmb +#define wmb() mb() +#endif + +#ifndef __exit +#define __exit +#endif + +#ifndef SMP_CACHE_BYTES +#define SMP_CACHE_BYTES L1_CACHE_BYTES +#endif + + +#if (LINUX_VERSION_CODE < 0x02030d) +#define pci_resource_start(dev, bar) dev->base_address[bar] +#elif (LINUX_VERSION_CODE < 0x02032c) +#define pci_resource_start(dev, bar) dev->resource[bar].start +#endif + +#if (LINUX_VERSION_CODE < 0x02030e) +#define net_device device +#endif + +#if (LINUX_VERSION_CODE >= 0x02031b) +#define NEW_NETINIT +#endif + +#if (LINUX_VERSION_CODE < 0x02032a) +typedef u32 dma_addr_t; + +static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, + dma_addr_t *dma_handle) +{ + void *virt_ptr; + + virt_ptr = kmalloc(size, GFP_KERNEL); + *dma_handle = virt_to_bus(virt_ptr); + return virt_ptr; +} +#define pci_free_consistent(cookie, size, ptr, dma_ptr) kfree(ptr) +#define pci_map_single(cookie, address, size, dir) virt_to_bus(address) +#define pci_unmap_single(cookie, address, size, dir) +#endif + +#if (LINUX_VERSION_CODE < 0x02032b) +/* + * SoftNet + */ +#define dev_kfree_skb_irq(a) dev_kfree_skb(a) +#define netif_wake_queue(dev) clear_bit(0, &dev->tbusy) +#define netif_stop_queue(dev) set_bit(0, &dev->tbusy) + +static inline void netif_start_queue(struct net_device *dev) +{ + dev->tbusy = 0; + dev->interrupt = 0; + dev->start = 1; +} + +#define ace_mark_net_bh(foo) mark_bh(foo) +#define netif_queue_stopped(dev) dev->tbusy +#define netif_running(dev) dev->start +#define ace_if_down(dev) {do{dev->start = 0;}while (0);} +#else +#define NET_BH 0 +#define ace_mark_net_bh(foo) {do{} while(0);} +#define ace_if_down(dev) {do{} while(0);} #endif + +#define ACE_MAX_MOD_PARMS 8 +#define BOARD_IDX_STATIC 0 +#define BOARD_IDX_OVERFLOW -1 + + +#include "acenic.h" + +/* + * These must be defined before the firmware is included. + */ +#define MAX_TEXT_LEN 96*1024 +#define MAX_RODATA_LEN 8*1024 +#define MAX_DATA_LEN 2*1024 + +#include "acenic_firmware.h" + /* * This driver currently supports Tigon I and Tigon II based cards - * including the Alteon AceNIC and the 3Com 3C985. The driver should - * also work on the NetGear GA620, however I have not been able to - * test that myself. + * including the Alteon AceNIC, the 3Com 3C985[B] and NetGear + * GA620. The driver should also work on the SGI, DEC and Farallon + * versions of the card, however I have not been able to test that + * myself. * * This card is really neat, it supports receive hardware checksumming * and jumbo frames (up to 9000 bytes) and does a lot of work in the @@ -147,6 +252,12 @@ * is available, on the 1/2MB NIC app. 300KB is available. * 68KB will always be available as a minimum for both * directions. The default value is a 50/50 split. + * dis_pci_mem_inval= - disable PCI memory write and invalidate + * operations, default (1) is to always disable this as + * that is what Alteon does on NT. I have not been able + * to measure any real performance differences with + * this on my systems. Set =0 if you want to + * enable these operations. * * If you use more than one NIC, specify the parameters for the * individual NICs with a comma, ie. trace=0,0x00001fff,0 you want to @@ -160,46 +271,146 @@ * * The mini ring is not used under Linux and I am not sure it makes sense * to actually use it. + * + * New interrupt handler strategy: + * + * The old interrupt handler worked using the traditional method of + * replacing an skbuff with a new one when a packet arrives. However + * the rx rings do not need to contain a static number of buffer + * descriptors, thus it makes sense to move the memory allocation out + * of the main interrupt handler and do it in a bottom half handler + * and only allocate new buffers when the number of buffers in the + * ring is below a certain threshold. In order to avoid starving the + * NIC under heavy load it is however necessary to force allocation + * when hitting a minimum threshold. The strategy for alloction is as + * follows: + * + * RX_LOW_BUF_THRES - allocate buffers in the bottom half + * RX_PANIC_LOW_THRES - we are very low on buffers, allocate + * the buffers in the interrupt handler + * RX_RING_THRES - maximum number of buffers in the rx ring + * RX_MINI_THRES - maximum number of buffers in the mini ring + * RX_JUMBO_THRES - maximum number of buffers in the jumbo ring + * + * One advantagous side effect of this allocation approach is that the + * entire rx processing can be done without holding any spin lock + * since the rx rings and registers are totally independant of the tx + * ring and its registers. This of course includes the kmalloc's of + * new skb's. Thus start_xmit can run in parallel with rx processing + * and the memory allocation on SMP systems. + * + * Note that running the skb reallocation in a bottom half opens up + * another can of races which needs to be handled properly. In + * particular it can happen that the interrupt handler tries to run + * the reallocation while the bottom half is either running on another + * CPU or was interrupted on the same CPU. To get around this the + * driver uses bitops to prevent the reallocation routines from being + * reentered. + * + * TX handling can also be done without holding any spin lock, wheee + * this is fun! since tx_ret_csm is only written to by the interrupt + * handler. The case to be aware of is when shutting down the device + * and cleaning up where it is necessary to make sure that + * start_xmit() is not running while this is happening. Well DaveM + * informs me that this case is already protected against ... bye bye + * Mr. Spin Lock, it was nice to know you. + * + * TX interrupts are now partly disabled so the NIC will only generate + * TX interrupts for the number of coal ticks, not for the number of + * TX packets in the queue. This should reduce the number of TX only, + * ie. when no RX processing is done, interrupts seen. */ /* - * Default values for tuning parameters + * Threshold values for RX buffer allocation - the low water marks for + * when to start refilling the rings are set to 75% of the ring + * sizes. It seems to make sense to refill the rings entirely from the + * intrrupt handler once it gets below the panic threshold, that way + * we don't risk that the refilling is moved to another CPU when the + * one running the interrupt handler just got the slab code hot in its + * cache. */ -#define DEF_TX_RATIO 31 -#define DEF_TX_COAL 1000 -#define DEF_TX_MAX_DESC 40 -#define DEF_RX_COAL 1000 -#define DEF_RX_MAX_DESC 20 -#define DEF_TRACE 0 -#define DEF_STAT 2 * TICKS_PER_SEC - -static int link[8] = {0, }; -static int trace[8] = {0, }; -static int tx_coal_tick[8] = {0, }; -static int rx_coal_tick[8] = {0, }; -static int max_tx_desc[8] = {0, }; -static int max_rx_desc[8] = {0, }; -static int tx_ratio[8] = {0, }; +#define RX_RING_SIZE 72 +#define RX_MINI_SIZE 64 +#define RX_JUMBO_SIZE 48 + +#define RX_PANIC_STD_THRES 16 +#define RX_PANIC_STD_REFILL (3*RX_PANIC_STD_THRES)/2 +#define RX_LOW_STD_THRES (3*RX_RING_SIZE)/4 +#define RX_PANIC_MINI_THRES 12 +#define RX_PANIC_MINI_REFILL (3*RX_PANIC_MINI_THRES)/2 +#define RX_LOW_MINI_THRES (3*RX_MINI_SIZE)/4 +#define RX_PANIC_JUMBO_THRES 6 +#define RX_PANIC_JUMBO_REFILL (3*RX_PANIC_JUMBO_THRES)/2 +#define RX_LOW_JUMBO_THRES (3*RX_JUMBO_SIZE)/4 -static const char __initdata *version = "acenic.c: v0.33a 08/16/99 Jes Sorensen (Jes.Sorensen@cern.ch)\n"; -static struct device *root_dev = NULL; +/* + * Size of the mini ring entries, basically these just should be big + * enough to take TCP ACKs + */ +#define ACE_MINI_SIZE 100 + +#define ACE_MINI_BUFSIZE (ACE_MINI_SIZE + 2 + 16) +#define ACE_STD_BUFSIZE (ACE_STD_MTU + ETH_HLEN + 2+4+16) +#define ACE_JUMBO_BUFSIZE (ACE_JUMBO_MTU + ETH_HLEN + 2+4+16) + +/* + * There seems to be a magic difference in the effect between 995 and 996 + * but little difference between 900 and 995 ... no idea why. + * + * There is now a default set of tuning parameters which is set, depending + * on whether or not the user enables Jumbo frames. It's assumed that if + * Jumbo frames are enabled, the user wants optimal tuning for that case. + */ +#define DEF_TX_COAL 400 /* 996 */ +#define DEF_TX_MAX_DESC 40 +#define DEF_RX_COAL 120 /* 1000 */ +#define DEF_RX_MAX_DESC 25 +#define DEF_TX_RATIO 21 /* 24 */ + +#define DEF_JUMBO_TX_COAL 20 +#define DEF_JUMBO_TX_MAX_DESC 60 +#define DEF_JUMBO_RX_COAL 30 +#define DEF_JUMBO_RX_MAX_DESC 6 +#define DEF_JUMBO_TX_RATIO 21 + +#define TX_COAL_INTS_ONLY 0 /* seems not worth it */ +#define DEF_TRACE 0 +#define DEF_STAT (2 * TICKS_PER_SEC) + +static int link[ACE_MAX_MOD_PARMS] = {0, }; +static int trace[ACE_MAX_MOD_PARMS] = {0, }; +static int tx_coal_tick[ACE_MAX_MOD_PARMS] = {0, }; +static int rx_coal_tick[ACE_MAX_MOD_PARMS] = {0, }; +static int max_tx_desc[ACE_MAX_MOD_PARMS] = {0, }; +static int max_rx_desc[ACE_MAX_MOD_PARMS] = {0, }; +static int tx_ratio[ACE_MAX_MOD_PARMS] = {0, }; +static int dis_pci_mem_inval[ACE_MAX_MOD_PARMS] = {1, 1, 1, 1, 1, 1, 1, 1}; + +static const char __initdata *version = + "acenic.c: v0.44 05/11/2000 Jes Sorensen, linux-acenic@SunSITE.auc.dk\n" + " http://home.cern.ch/~jes/gige/acenic.html\n"; + +static struct net_device *root_dev = NULL; static int probed __initdata = 0; -__initfunc(int acenic_probe (struct device *dev)) + +#ifdef NEW_NETINIT +int __init acenic_probe (void) +#else +int __init acenic_probe (struct net_device *dev) +#endif { - int boards_found = 0; - int version_disp; - struct ace_private *ap; - u8 pci_latency; -#if 0 - u16 vendor, device; - u8 pci_bus; - u8 pci_dev_fun; - u8 irq; +#ifdef NEW_NETINIT + struct net_device *dev; #endif + + struct ace_private *ap; struct pci_dev *pdev = NULL; + int boards_found = 0; + int version_disp; if (probed) return -ENODEV; @@ -210,11 +421,11 @@ version_disp = 0; - while ((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET<<8, pdev))){ - dev = NULL; + while ((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET<<8, pdev))) { if (!((pdev->vendor == PCI_VENDOR_ID_ALTEON) && - (pdev->device == PCI_DEVICE_ID_ALTEON_ACENIC)) && + ((pdev->device == PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE) || + (pdev->device == PCI_DEVICE_ID_ALTEON_ACENIC_COPPER)) ) && !((pdev->vendor == PCI_VENDOR_ID_3COM) && (pdev->device == PCI_DEVICE_ID_3COM_3C985)) && !((pdev->vendor == PCI_VENDOR_ID_NETGEAR) && @@ -229,44 +440,34 @@ (pdev->device == PCI_DEVICE_ID_SGI_ACENIC))) continue; - dev = init_etherdev(dev, sizeof(struct ace_private)); + dev = init_etherdev(NULL, sizeof(struct ace_private)); - if (dev == NULL){ - printk(KERN_ERR "Unable to allocate etherdev " - "structure!\n"); + if (dev == NULL) { + printk(KERN_ERR "acenic: Unable to allocate " + "net_device structure!\n"); break; } if (!dev->priv) dev->priv = kmalloc(sizeof(*ap), GFP_KERNEL); - if (!dev->priv) + if (!dev->priv) { + printk(KERN_ERR "acenic: Unable to allocate memory\n"); return -ENOMEM; + } ap = dev->priv; ap->pdev = pdev; - ap->vendor = pdev->vendor; dev->irq = pdev->irq; -#ifdef __SMP__ - spin_lock_init(&ap->lock); -#endif - dev->open = &ace_open; dev->hard_start_xmit = &ace_start_xmit; dev->stop = &ace_close; dev->get_stats = &ace_get_stats; dev->set_multicast_list = &ace_set_multicast_list; -#if 0 dev->do_ioctl = &ace_ioctl; -#endif dev->set_mac_address = &ace_set_mac_addr; dev->change_mtu = &ace_change_mtu; - /* - * Dummy value. - */ - dev->base_addr = 42; - /* display version info if adapter is found */ if (!version_disp) { @@ -278,76 +479,109 @@ pci_read_config_word(pdev, PCI_COMMAND, &ap->pci_command); - pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &pci_latency); - if (pci_latency <= 0x40){ - pci_latency = 0x40; + /* OpenFirmware on Mac's does not set this - DOH.. */ + if (!ap->pci_command & PCI_COMMAND_MEMORY) { + printk(KERN_INFO "%s: Enabling PCI Memory Mapped " + "access - was not enabled by BIOS/Firmware\n", + dev->name); + ap->pci_command = ap->pci_command | PCI_COMMAND_MEMORY; + pci_write_config_word(ap->pdev, PCI_COMMAND, + ap->pci_command); + wmb(); + } + + pci_read_config_byte(pdev, PCI_LATENCY_TIMER, + &ap->pci_latency); + if (ap->pci_latency <= 0x40) { + ap->pci_latency = 0x40; pci_write_config_byte(pdev, PCI_LATENCY_TIMER, - pci_latency); + ap->pci_latency); } pci_set_master(pdev); - switch(ap->vendor){ + /* + * Remap the regs into kernel space - this is abuse of + * dev->base_addr since it was means for I/O port + * addresses but who gives a damn. + */ + dev->base_addr = pci_resource_start(pdev, 0); + ap->regs = (struct ace_regs *)ioremap(dev->base_addr, 0x4000); + if (!ap->regs) { + printk(KERN_ERR "%s: Unable to map I/O register, " + "AceNIC %i will be disabled.\n", + dev->name, boards_found); + break; + } + + switch(pdev->vendor) { case PCI_VENDOR_ID_ALTEON: - sprintf(ap->name, "AceNIC Gigabit Ethernet"); + strncpy(ap->name, "AceNIC Gigabit Ethernet", + sizeof (ap->name)); printk(KERN_INFO "%s: Alteon AceNIC ", dev->name); break; case PCI_VENDOR_ID_3COM: - sprintf(ap->name, "3Com 3C985 Gigabit Ethernet"); + strncpy(ap->name, "3Com 3C985 Gigabit Ethernet", + sizeof (ap->name)); printk(KERN_INFO "%s: 3Com 3C985 ", dev->name); break; case PCI_VENDOR_ID_NETGEAR: - sprintf(ap->name, "NetGear GA620 Gigabit Ethernet"); + strncpy(ap->name, "NetGear GA620 Gigabit Ethernet", + sizeof (ap->name)); printk(KERN_INFO "%s: NetGear GA620 ", dev->name); break; case PCI_VENDOR_ID_DEC: if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9000SX) { - sprintf(ap->name, "Farallon PN9000-SX " - "Gigabit Ethernet"); + strncpy(ap->name, "Farallon PN9000-SX " + "Gigabit Ethernet", sizeof (ap->name)); printk(KERN_INFO "%s: Farallon PN9000-SX ", dev->name); break; } case PCI_VENDOR_ID_SGI: - sprintf(ap->name, "SGI AceNIC Gigabit Ethernet"); + strncpy(ap->name, "SGI AceNIC Gigabit Ethernet", + sizeof (ap->name)); printk(KERN_INFO "%s: SGI AceNIC ", dev->name); break; default: - sprintf(ap->name, "Unknown AceNIC based Gigabit Ethernet"); + strncpy(ap->name, "Unknown AceNIC based Gigabit " + "Ethernet", sizeof (ap->name)); printk(KERN_INFO "%s: Unknown AceNIC ", dev->name); break; } - printk("Gigabit Ethernet at 0x%08lx, irq %i, PCI latency %i " - "clks\n", pdev->base_address[0], dev->irq, pci_latency); - - /* - * Remap the regs into kernel space. - */ + ap->name [sizeof (ap->name) - 1] = '\0'; + printk("Gigabit Ethernet at 0x%08lx, ", dev->base_addr); +#ifdef __sparc__ + printk("irq %s\n", __irq_itoa(dev->irq)); +#else + printk("irq %i\n", dev->irq); +#endif - ap->regs = (struct ace_regs *)ioremap(pdev->base_address[0], - 0x4000); - if (!ap->regs){ - printk(KERN_ERR "%s: Unable to map I/O register, " - "AceNIC %i will be disabled.\n", - dev->name, boards_found); - break; +#ifdef CONFIG_ACENIC_OMIT_TIGON_I + if ((readl(&ap->regs->HostCtrl) >> 28) == 4) { + printk(KERN_ERR "%s: Driver compiled without Tigon I" + " support - NIC disabled\n", dev->name); + ace_init_cleanup(dev); + continue; } +#endif -#ifdef MODULE - if (ace_init(dev, boards_found)) + if (ace_allocate_descriptors(dev)) continue; + +#ifdef MODULE + if (boards_found >= ACE_MAX_MOD_PARMS) + ap->board_idx = BOARD_IDX_OVERFLOW; + else + ap->board_idx = boards_found; #else - if (ace_init(dev, -1)) - continue; + ap->board_idx = BOARD_IDX_STATIC; #endif - boards_found++; + if (ace_init(dev)) + continue; - /* - * This is bollocks, but we need to tell the net-init - * code that it shall go for the next device. - */ - dev->base_addr = 0; + boards_found++; } /* @@ -356,21 +590,16 @@ * or more boards. Otherwise, return failure (-ENODEV). */ -#ifdef MODULE - return boards_found; -#else if (boards_found > 0) return 0; else return -ENODEV; -#endif } #ifdef MODULE -#if LINUX_VERSION_CODE > 0x20118 MODULE_AUTHOR("Jes Sorensen "); -MODULE_DESCRIPTION("AceNIC/3C985 Gigabit Ethernet driver"); +MODULE_DESCRIPTION("AceNIC/3C985/GA620 Gigabit Ethernet driver"); MODULE_PARM(link, "1-" __MODULE_STRING(8) "i"); MODULE_PARM(trace, "1-" __MODULE_STRING(8) "i"); MODULE_PARM(tx_coal_tick, "1-" __MODULE_STRING(8) "i"); @@ -379,64 +608,252 @@ MODULE_PARM(max_rx_desc, "1-" __MODULE_STRING(8) "i"); #endif -int init_module(void) -{ - int cards; - - root_dev = NULL; - - cards = acenic_probe(NULL); - return cards ? 0 : -ENODEV; -} -void cleanup_module(void) +void __exit ace_module_cleanup(void) { struct ace_private *ap; struct ace_regs *regs; - struct device *next; + struct net_device *next; short i; - unsigned long flags; - while (root_dev){ + while (root_dev) { next = ((struct ace_private *)root_dev->priv)->next; - ap = (struct ace_private *)root_dev->priv; + ap = root_dev->priv; regs = ap->regs; - spin_lock_irqsave(&ap->lock, flags); writel(readl(®s->CpuCtrl) | CPU_HALT, ®s->CpuCtrl); - if (ap->version == 2) + if (ap->version >= 2) writel(readl(®s->CpuBCtrl) | CPU_HALT, ®s->CpuBCtrl); - writel(0, ®s->Mb0Lo); - - spin_unlock_irqrestore(&ap->lock, flags); + /* + * This clears any pending interrupts + */ + writel(1, ®s->Mb0Lo); /* - * Release the RX buffers. + * Make sure no other CPUs are processing interrupts + * on the card before the buffers are being released. + * Otherwise one might experience some `interesting' + * effects. + * + * Then release the RX buffers - jumbo buffers were + * already released in ace_close(). */ + synchronize_irq(); + for (i = 0; i < RX_STD_RING_ENTRIES; i++) { - if (ap->rx_std_skbuff[i]) { + struct sk_buff *skb = ap->skb->rx_std_skbuff[i].skb; + + if (skb) { + dma_addr_t mapping; + + mapping = ap->skb->rx_std_skbuff[i].mapping; + ap->rx_std_ring[i].size = 0; - set_aceaddr_bus(&ap->rx_std_ring[i].addr, 0); - dev_kfree_skb(ap->rx_std_skbuff[i]); + ap->skb->rx_std_skbuff[i].skb = NULL; + pci_unmap_single(ap->pdev, mapping, + ACE_STD_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); + dev_kfree_skb(skb); + } + } + if (ap->version >= 2) { + for (i = 0; i < RX_MINI_RING_ENTRIES; i++) { + struct sk_buff *skb = ap->skb->rx_mini_skbuff[i].skb; + + if (skb) { + dma_addr_t mapping; + + mapping = ap->skb->rx_mini_skbuff[i].mapping; + ap->rx_mini_ring[i].size = 0; + ap->skb->rx_mini_skbuff[i].skb = NULL; + pci_unmap_single(ap->pdev, mapping, + ACE_MINI_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); + dev_kfree_skb(skb); + } } } + for (i = 0; i < RX_JUMBO_RING_ENTRIES; i++) { + struct sk_buff *skb = ap->skb->rx_jumbo_skbuff[i].skb; + if (skb) { + dma_addr_t mapping; - iounmap(regs); - if(ap->trace_buf) - kfree(ap->trace_buf); - kfree(ap->info); - free_irq(root_dev->irq, root_dev); - unregister_netdev(root_dev); - kfree(root_dev); + mapping = ap->skb->rx_jumbo_skbuff[i].mapping; + ap->rx_jumbo_ring[i].size = 0; + ap->skb->rx_jumbo_skbuff[i].skb = NULL; + pci_unmap_single(ap->pdev, mapping, + ACE_JUMBO_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); + dev_kfree_skb(skb); + } + } + + ace_init_cleanup(root_dev); + kfree(root_dev); root_dev = next; } } + + +int __init ace_module_init(void) +{ + int status; + + root_dev = NULL; + +#ifdef NEW_NETINIT + status = acenic_probe(); +#else + status = acenic_probe(NULL); +#endif + return status; +} + + +#if (LINUX_VERSION_CODE < 0x02032a) +int init_module(void) +{ + return ace_module_init(); +} + + +void cleanup_module(void) +{ + ace_module_cleanup(); +} +#else +module_init(ace_module_init); +module_exit(ace_module_cleanup); #endif +static void ace_free_descriptors(struct net_device *dev) +{ + struct ace_private *ap = dev->priv; + int size; + + if (ap->rx_std_ring != NULL) { + size = (sizeof(struct rx_desc) * + (RX_STD_RING_ENTRIES + + RX_JUMBO_RING_ENTRIES + + RX_MINI_RING_ENTRIES + + RX_RETURN_RING_ENTRIES)); + pci_free_consistent(ap->pdev, size, + ap->rx_std_ring, + ap->rx_ring_base_dma); + ap->rx_std_ring = NULL; + ap->rx_jumbo_ring = NULL; + ap->rx_mini_ring = NULL; + ap->rx_return_ring = NULL; + } + if (ap->evt_ring != NULL) { + size = (sizeof(struct event) * EVT_RING_ENTRIES); + pci_free_consistent(ap->pdev, size, + ap->evt_ring, + ap->evt_ring_dma); + ap->evt_ring = NULL; + } + if (ap->evt_prd != NULL) { + pci_free_consistent(ap->pdev, sizeof(u32), + (void *)ap->evt_prd, ap->evt_prd_dma); + ap->evt_prd = NULL; + } + if (ap->rx_ret_prd != NULL) { + pci_free_consistent(ap->pdev, sizeof(u32), + (void *)ap->rx_ret_prd, ap->rx_ret_prd_dma); + ap->rx_ret_prd = NULL; + } + if (ap->tx_csm != NULL) { + pci_free_consistent(ap->pdev, sizeof(u32), + (void *)ap->tx_csm, ap->tx_csm_dma); + ap->tx_csm = NULL; + } +} + + +static int ace_allocate_descriptors(struct net_device *dev) +{ + struct ace_private *ap = dev->priv; + int size; + + size = (sizeof(struct rx_desc) * + (RX_STD_RING_ENTRIES + + RX_JUMBO_RING_ENTRIES + + RX_MINI_RING_ENTRIES + + RX_RETURN_RING_ENTRIES)); + + ap->rx_std_ring = pci_alloc_consistent(ap->pdev, size, + &ap->rx_ring_base_dma); + if (ap->rx_std_ring == NULL) + goto fail; + + ap->rx_jumbo_ring = ap->rx_std_ring + RX_STD_RING_ENTRIES; + ap->rx_mini_ring = ap->rx_jumbo_ring + RX_JUMBO_RING_ENTRIES; + ap->rx_return_ring = ap->rx_mini_ring + RX_MINI_RING_ENTRIES; + + size = (sizeof(struct event) * EVT_RING_ENTRIES); + + ap->evt_ring = pci_alloc_consistent(ap->pdev, size, + &ap->evt_ring_dma); + + if (ap->evt_ring == NULL) + goto fail; + + ap->evt_prd = pci_alloc_consistent(ap->pdev, sizeof(u32), + &ap->evt_prd_dma); + if (ap->evt_prd == NULL) + goto fail; + + ap->rx_ret_prd = pci_alloc_consistent(ap->pdev, sizeof(u32), + &ap->rx_ret_prd_dma); + if (ap->rx_ret_prd == NULL) + goto fail; + + ap->tx_csm = pci_alloc_consistent(ap->pdev, sizeof(u32), + &ap->tx_csm_dma); + if (ap->tx_csm == NULL) + goto fail; + + return 0; + +fail: + /* Clean up. */ + ace_init_cleanup(dev); + return 1; +} + + +/* + * Generic cleanup handling data allocated during init. Used when the + * module is unloaded or if an error occurs during initialization + */ +static void ace_init_cleanup(struct net_device *dev) +{ + struct ace_private *ap; + + ap = dev->priv; + + ace_free_descriptors(dev); + + if (ap->info) + pci_free_consistent(ap->pdev, sizeof(struct ace_info), + ap->info, ap->info_dma); + if (ap->skb) + kfree(ap->skb); + if (ap->trace_buf) + kfree(ap->trace_buf); + + if (dev->irq) + free_irq(dev->irq, dev); + + unregister_netdev(dev); + iounmap(ap->regs); +} + + /* * Commands are considered to be slow. */ @@ -453,24 +870,40 @@ } -__initfunc(static int ace_init(struct device *dev, int board_idx)) +static int __init ace_init(struct net_device *dev) { struct ace_private *ap; struct ace_regs *regs; - struct ace_info *info; - u32 tig_ver, mac1, mac2, tmp; + struct ace_info *info = NULL; unsigned long tmp_ptr, myjif; + u32 tig_ver, mac1, mac2, tmp, pci_state; + int board_idx, ecode = 0; short i; + unsigned char cache; ap = dev->priv; regs = ap->regs; + board_idx = ap->board_idx; + + /* + * aman@sgi.com - its useful to do a NIC reset here to + * address the `Firmware not running' problem subsequent + * to any crashes involving the NIC + */ + writel(HW_RESET | (HW_RESET << 24), ®s->HostCtrl); + wmb(); + /* * Don't access any other registes before this point! */ #ifdef __BIG_ENDIAN - writel(((BYTE_SWAP | WORD_SWAP | CLR_INT) | - ((BYTE_SWAP | WORD_SWAP | CLR_INT) << 24)), + /* + * This will most likely need BYTE_SWAP once we switch + * to using __raw_writel() + */ + writel((WORD_SWAP | CLR_INT | + ((WORD_SWAP | CLR_INT) << 24)), ®s->HostCtrl); #else writel((CLR_INT | WORD_SWAP | ((CLR_INT | WORD_SWAP) << 24)), @@ -487,18 +920,25 @@ tig_ver = readl(®s->HostCtrl) >> 28; switch(tig_ver){ +#ifndef CONFIG_ACENIC_OMIT_TIGON_I case 4: - printk(KERN_INFO" Tigon I (Rev. 4), Firmware: %i.%i.%i, ", + printk(KERN_INFO" Tigon I (Rev. 4), Firmware: %i.%i.%i, ", tigonFwReleaseMajor, tigonFwReleaseMinor, tigonFwReleaseFix); writel(0, ®s->LocalCtrl); ap->version = 1; break; +#endif case 6: printk(KERN_INFO" Tigon II (Rev. %i), Firmware: %i.%i.%i, ", tig_ver, tigon2FwReleaseMajor, tigon2FwReleaseMinor, tigon2FwReleaseFix); writel(readl(®s->CpuBCtrl) | CPU_HALT, ®s->CpuBCtrl); + /* + * The SRAM bank size does _not_ indicate the amount + * of memory on the card, it controls the _bank_ size! + * Ie. a 1MB AceNIC will have two banks of 512KB. + */ writel(SRAM_BANK_512K, ®s->LocalCtrl); writel(SYNC_SRAM_TIMING, ®s->MiscCfg); ap->version = 2; @@ -506,7 +946,8 @@ default: printk(KERN_INFO" Unsupported Tigon version detected (%i), ", tig_ver); - return -ENODEV; + ecode = -ENODEV; + goto init_error; } /* @@ -516,22 +957,34 @@ * value a second time works as well. This is what caused the * `Firmware not running' problem on the Tigon II. */ -#ifdef __LITTLE_ENDIAN - writel(ACE_BYTE_SWAP_DATA | ACE_WARN | ACE_FATAL | - ACE_WORD_SWAP | ACE_NO_JUMBO_FRAG, ®s->ModeStat); +#ifdef __BIG_ENDIAN + writel(ACE_BYTE_SWAP_DMA | ACE_WARN | ACE_FATAL | ACE_BYTE_SWAP_BD | + ACE_WORD_SWAP_BD | ACE_NO_JUMBO_FRAG, ®s->ModeStat); #else -#error "this driver doesn't run on big-endian machines yet!" + writel(ACE_BYTE_SWAP_DMA | ACE_WARN | ACE_FATAL | + ACE_WORD_SWAP_BD | ACE_NO_JUMBO_FRAG, ®s->ModeStat); #endif + mb(); mac1 = 0; - for(i = 0; i < 4; i++){ + for(i = 0; i < 4; i++) { mac1 = mac1 << 8; - mac1 |= read_eeprom_byte(regs, 0x8c+i); + tmp = read_eeprom_byte(dev, 0x8c+i); + if (tmp < 0) { + ecode = -EIO; + goto init_error; + } else + mac1 |= (tmp & 0xff); } mac2 = 0; - for(i = 4; i < 8; i++){ + for(i = 4; i < 8; i++) { mac2 = mac2 << 8; - mac2 |= read_eeprom_byte(regs, 0x8c+i); + tmp = read_eeprom_byte(dev, 0x8c+i); + if (tmp < 0) { + ecode = -EIO; + goto init_error; + } else + mac2 |= (tmp & 0xff); } writel(mac1, ®s->MacAddrHi); @@ -549,24 +1002,57 @@ dev->dev_addr[5] = mac2 & 0xff; /* + * Looks like this is necessary to deal with on all architectures, + * even this %$#%$# N440BX Intel based thing doesn't get it right. + * Ie. having two NICs in the machine, one will have the cache + * line set at boot time, the other will not. + */ + pci_read_config_byte(ap->pdev, PCI_CACHE_LINE_SIZE, &cache); + if ((cache << 2) != SMP_CACHE_BYTES) { + printk(KERN_INFO " PCI cache line size set incorrectly " + "(%i bytes) by BIOS/FW, corring to %i\n", + (cache << 2), SMP_CACHE_BYTES); + pci_write_config_byte(ap->pdev, PCI_CACHE_LINE_SIZE, + SMP_CACHE_BYTES >> 2); + } + + pci_state = readl(®s->PciState); + printk(KERN_INFO " PCI bus width: %i bits, speed: %iMHz, " + "latency: %i clks\n", + (pci_state & PCI_32BIT) ? 32 : 64, + (pci_state & PCI_66MHZ) ? 66 : 33, + ap->pci_latency); + + /* * Set the max DMA transfer size. Seems that for most systems * the performance is better when no MAX parameter is * set. However for systems enabling PCI write and invalidate, * DMA writes must be set to the L1 cache line size to get * optimal performance. + * + * The default is now to turn the PCI write and invalidate off + * - that is what Alteon does for NT. */ tmp = READ_CMD_MEM | WRITE_CMD_MEM; - if (ap->version == 2){ -#if 0 + if (ap->version >= 2) { + tmp |= (MEM_READ_MULTIPLE | (pci_state & PCI_66MHZ)); /* - * According to the documentation this enables writes - * to all PCI regs - NOT good. + * Tuning parameters only supported for 8 cards */ - tmp |= DMA_WRITE_ALL_ALIGN; -#endif - tmp |= MEM_READ_MULTIPLE; - if (ap->pci_command & PCI_COMMAND_INVALIDATE){ - switch(L1_CACHE_BYTES){ + if (board_idx == BOARD_IDX_OVERFLOW || + dis_pci_mem_inval[board_idx]) { + if (ap->pci_command & PCI_COMMAND_INVALIDATE) { + ap->pci_command &= ~PCI_COMMAND_INVALIDATE; + pci_write_config_word(ap->pdev, PCI_COMMAND, + ap->pci_command); + printk(KERN_INFO " Disabling PCI memory " + "write and invalidate\n"); + } + } else if (ap->pci_command & PCI_COMMAND_INVALIDATE) { + printk(KERN_INFO " PCI memory write & invalidate " + "enabled by BIOS, enabling counter measures\n"); + + switch(SMP_CACHE_BYTES) { case 16: tmp |= DMA_WRITE_MAX_16; break; @@ -586,22 +1072,62 @@ } } } + +#ifdef __sparc__ + /* + * On this platform, we know what the best dma settings + * are. We use 64-byte maximum bursts, because if we + * burst larger than the cache line size (or even cross + * a 64byte boundry in a single burst) the UltraSparc + * PCI controller will disconnect at 64-byte multiples. + * + * Read-multiple will be properly enabled above, and when + * set will give the PCI controller proper hints about + * prefetching. + */ + tmp = tmp & ~DMA_READ_WRITE_MASK; + tmp |= DMA_READ_MAX_64; + tmp |= DMA_WRITE_MAX_64; +#endif writel(tmp, ®s->PciState); - if (request_irq(dev->irq, ace_interrupt, SA_SHIRQ, ap->name, dev)) { - printk(KERN_WARNING "%s: Requested IRQ %d is busy\n", - dev->name, dev->irq); - return -EAGAIN; +#if 0 + /* + * I have received reports from people having problems when this + * bit is enabled. + */ + if (!(ap->pci_command & PCI_COMMAND_FAST_BACK)) { + printk(KERN_INFO " Enabling PCI Fast Back to Back\n"); + ap->pci_command |= PCI_COMMAND_FAST_BACK; + pci_write_config_word(ap->pdev, PCI_COMMAND, ap->pci_command); } - +#endif + /* * Initialize the generic info block and the command+event rings * and the control blocks for the transmit and receive rings * as they need to be setup once and for all. */ - if (!(info = kmalloc(sizeof(struct ace_info), GFP_KERNEL))){ - free_irq(dev->irq, dev); - return -EAGAIN; + if (!(info = pci_alloc_consistent(ap->pdev, sizeof(struct ace_info), + &ap->info_dma))) { + ecode = -EAGAIN; + goto init_error; + } + ap->info = info; + + /* + * Get the memory for the skb rings. + */ + if (!(ap->skb = kmalloc(sizeof(struct ace_skb), GFP_KERNEL))) { + ecode = -EAGAIN; + goto init_error; + } + + if (request_irq(dev->irq, ace_interrupt, SA_SHIRQ, ap->name, dev)) { + printk(KERN_WARNING "%s: Requested IRQ %d is busy\n", + dev->name, dev->irq); + ecode = -EAGAIN; + goto init_error; } /* @@ -611,13 +1137,20 @@ ap->next = root_dev; root_dev = dev; - ap->info = info; - memset(info, 0, sizeof(struct ace_info)); +#ifdef INDEX_DEBUG + spin_lock_init(&ap->debug_lock); + ap->last_tx = TX_RING_ENTRIES - 1; + ap->last_std_rx = 0; + ap->last_mini_rx = 0; +#endif + + memset(ap->info, 0, sizeof(struct ace_info)); + memset(ap->skb, 0, sizeof(struct ace_skb)); ace_load_firmware(dev); ap->fw_running = 0; - tmp_ptr = virt_to_bus((void *)info); + tmp_ptr = (unsigned long) ap->info_dma; #if (BITS_PER_LONG == 64) writel(tmp_ptr >> 32, ®s->InfoPtrHi); #else @@ -627,15 +1160,16 @@ memset(ap->evt_ring, 0, EVT_RING_ENTRIES * sizeof(struct event)); - set_aceaddr(&info->evt_ctrl.rngptr, ap->evt_ring); + set_aceaddr(&info->evt_ctrl.rngptr, ap->evt_ring_dma); info->evt_ctrl.flags = 0; - set_aceaddr(&info->evt_prd_ptr, &ap->evt_prd); - ap->evt_prd = 0; + set_aceaddr(&info->evt_prd_ptr, ap->evt_prd_dma); + *(ap->evt_prd) = 0; + wmb(); writel(0, ®s->EvtCsm); + set_aceaddr(&info->cmd_ctrl.rngptr, 0x100); info->cmd_ctrl.flags = 0; - set_aceaddr_bus(&info->cmd_ctrl.rngptr, (void *)0x100); info->cmd_ctrl.max_len = 0; for (i = 0; i < CMD_RING_ENTRIES; i++) @@ -644,55 +1178,92 @@ writel(0, ®s->CmdPrd); writel(0, ®s->CmdCsm); - set_aceaddr(&info->stats2_ptr, &info->s.stats); + tmp_ptr = ap->info_dma; + tmp_ptr += (unsigned long) &(((struct ace_info *)0)->s.stats); + set_aceaddr(&info->stats2_ptr, (dma_addr_t) tmp_ptr); + set_aceaddr(&info->rx_std_ctrl.rngptr, ap->rx_ring_base_dma); info->rx_std_ctrl.max_len = ACE_STD_MTU + ETH_HLEN + 4; - set_aceaddr(&info->rx_std_ctrl.rngptr, ap->rx_std_ring); - info->rx_std_ctrl.flags = FLG_RX_TCP_UDP_SUM; + info->rx_std_ctrl.flags = RCB_FLG_TCP_UDP_SUM; memset(ap->rx_std_ring, 0, RX_STD_RING_ENTRIES * sizeof(struct rx_desc)); + for (i = 0; i < RX_STD_RING_ENTRIES; i++) + ap->rx_std_ring[i].flags = BD_FLG_TCP_UDP_SUM; + + ap->rx_std_skbprd = 0; + atomic_set(&ap->cur_rx_bufs, 0); + + set_aceaddr(&info->rx_jumbo_ctrl.rngptr, + (ap->rx_ring_base_dma + + (sizeof(struct rx_desc) * RX_STD_RING_ENTRIES))); info->rx_jumbo_ctrl.max_len = 0; - set_aceaddr(&info->rx_jumbo_ctrl.rngptr, ap->rx_jumbo_ring); - info->rx_jumbo_ctrl.flags = FLG_RX_TCP_UDP_SUM; + info->rx_jumbo_ctrl.flags = RCB_FLG_TCP_UDP_SUM; memset(ap->rx_jumbo_ring, 0, RX_JUMBO_RING_ENTRIES * sizeof(struct rx_desc)); - info->rx_mini_ctrl.max_len = 0; -#if 0 - set_aceaddr(&info->rx_mini_ctrl.rngptr, ap->rx_mini_ring); -#else - set_aceaddr_bus(&info->rx_mini_ctrl.rngptr, 0); -#endif - info->rx_mini_ctrl.flags = FLG_RNG_DISABLED; + for (i = 0; i < RX_JUMBO_RING_ENTRIES; i++) + ap->rx_jumbo_ring[i].flags = BD_FLG_TCP_UDP_SUM | BD_FLG_JUMBO; + + ap->rx_jumbo_skbprd = 0; + atomic_set(&ap->cur_jumbo_bufs, 0); -#if 0 memset(ap->rx_mini_ring, 0, RX_MINI_RING_ENTRIES * sizeof(struct rx_desc)); -#endif - set_aceaddr(&info->rx_return_ctrl.rngptr, ap->rx_return_ring); + if (ap->version >= 2) { + set_aceaddr(&info->rx_mini_ctrl.rngptr, + (ap->rx_ring_base_dma + + (sizeof(struct rx_desc) * + (RX_STD_RING_ENTRIES + + RX_JUMBO_RING_ENTRIES)))); + info->rx_mini_ctrl.max_len = ACE_MINI_SIZE; + info->rx_mini_ctrl.flags = RCB_FLG_TCP_UDP_SUM; + + for (i = 0; i < RX_MINI_RING_ENTRIES; i++) + ap->rx_mini_ring[i].flags = + BD_FLG_TCP_UDP_SUM | BD_FLG_MINI; + } else { + set_aceaddr(&info->rx_mini_ctrl.rngptr, 0); + info->rx_mini_ctrl.flags = RCB_FLG_RNG_DISABLE; + info->rx_mini_ctrl.max_len = 0; + } + + ap->rx_mini_skbprd = 0; + atomic_set(&ap->cur_mini_bufs, 0); + + set_aceaddr(&info->rx_return_ctrl.rngptr, + (ap->rx_ring_base_dma + + (sizeof(struct rx_desc) * + (RX_STD_RING_ENTRIES + + RX_JUMBO_RING_ENTRIES + + RX_MINI_RING_ENTRIES)))); info->rx_return_ctrl.flags = 0; info->rx_return_ctrl.max_len = RX_RETURN_RING_ENTRIES; memset(ap->rx_return_ring, 0, RX_RETURN_RING_ENTRIES * sizeof(struct rx_desc)); - set_aceaddr(&info->rx_ret_prd_ptr, &ap->rx_ret_prd); + set_aceaddr(&info->rx_ret_prd_ptr, ap->rx_ret_prd_dma); + *(ap->rx_ret_prd) = 0; writel(TX_RING_BASE, ®s->WinBase); ap->tx_ring = (struct tx_desc *)regs->Window; - for (i = 0; i < (TX_RING_ENTRIES * sizeof(struct tx_desc) / 4); i++){ + for (i = 0; i < (TX_RING_ENTRIES * sizeof(struct tx_desc) / 4); i++) { writel(0, (unsigned long)ap->tx_ring + i * 4); } + set_aceaddr(&info->tx_ctrl.rngptr, TX_RING_BASE); info->tx_ctrl.max_len = TX_RING_ENTRIES; +#if TX_COAL_INTS_ONLY + info->tx_ctrl.flags = RCB_FLG_COAL_INT_ONLY; +#else info->tx_ctrl.flags = 0; - set_aceaddr_bus(&info->tx_ctrl.rngptr, (void *)TX_RING_BASE); +#endif - set_aceaddr(&info->tx_csm_ptr, &ap->tx_csm); + set_aceaddr(&info->tx_csm_ptr, ap->tx_csm_dma); /* * Potential item for tuning parameter @@ -705,21 +1276,15 @@ writel(1, ®s->AssistState); writel(DEF_STAT, ®s->TuneStatTicks); - - writel(DEF_TX_COAL, ®s->TuneTxCoalTicks); - writel(DEF_TX_MAX_DESC, ®s->TuneMaxTxDesc); - writel(DEF_RX_COAL, ®s->TuneRxCoalTicks); - writel(DEF_RX_MAX_DESC, ®s->TuneMaxRxDesc); writel(DEF_TRACE, ®s->TuneTrace); - writel(DEF_TX_RATIO, ®s->TxBufRat); - if (board_idx >= 8) { - printk(KERN_WARNING "%s: more then 8 NICs detected, " - "ignoring module parameters!\n", dev->name); - board_idx = -1; - } + ace_set_rxtx_parms(dev, 0); - if (board_idx >= 0) { + if (board_idx == BOARD_IDX_OVERFLOW) { + printk(KERN_WARNING "%s: more then %i NICs detected, " + "ignoring module parameters!\n", + dev->name, ACE_MAX_MOD_PARMS); + } else if (board_idx >= 0) { if (tx_coal_tick[board_idx]) writel(tx_coal_tick[board_idx], ®s->TuneTxCoalTicks); @@ -744,7 +1309,7 @@ */ tmp = LNK_ENABLE | LNK_FULL_DUPLEX | LNK_1000MB | LNK_100MB | LNK_10MB | LNK_RX_FLOW_CTL_Y | LNK_NEG_FCTL | LNK_NEGOTIATE; - if(ap->version == 2) + if(ap->version >= 2) tmp |= LNK_TX_FLOW_CTL_Y; /* @@ -755,7 +1320,7 @@ tmp = LNK_ENABLE; - if (option & 0x01){ + if (option & 0x01) { printk(KERN_INFO "%s: Setting half duplex link\n", dev->name); tmp &= ~LNK_FULL_DUPLEX; @@ -768,7 +1333,7 @@ tmp |= LNK_100MB; if (option & 0x40) tmp |= LNK_1000MB; - if ((option & 0x70) == 0){ + if ((option & 0x70) == 0) { printk(KERN_WARNING "%s: No media speed specified, " "forcing auto negotiation\n", dev->name); tmp |= LNK_NEGOTIATE | LNK_1000MB | @@ -781,28 +1346,42 @@ "negotiation\n", dev->name); if (option & 0x200) tmp |= LNK_RX_FLOW_CTL_Y; - if ((option & 0x400) && (ap->version == 2)){ + if ((option & 0x400) && (ap->version >= 2)) { printk(KERN_INFO "%s: Enabling TX flow control\n", dev->name); tmp |= LNK_TX_FLOW_CTL_Y; } } + ap->link = tmp; writel(tmp, ®s->TuneLink); - if (ap->version == 2) + if (ap->version >= 2) writel(tmp, ®s->TuneFastLink); - if (ap->version == 1) + if (ACE_IS_TIGON_I(ap)) writel(tigonFwStartAddr, ®s->Pc); - else if (ap->version == 2) + if (ap->version == 2) writel(tigon2FwStartAddr, ®s->Pc); writel(0, ®s->Mb0Lo); /* - * Start the NIC CPU + * Set tx_csm before we start receiving interrupts, otherwise + * the interrupt handler might think it is supposed to process + * tx ints before we are up and running, which may cause a null + * pointer access in the int handler. */ + ap->tx_full = 0; + ap->cur_rx = 0; + ap->tx_prd = *(ap->tx_csm) = ap->tx_ret_csm = 0; + wmb(); + ace_set_txprd(regs, ap, 0); + writel(0, ®s->RxRetCsm); + + /* + * Start the NIC CPU + */ writel(readl(®s->CpuCtrl) & ~(CPU_HALT|CPU_TRACE), ®s->CpuCtrl); /* @@ -810,20 +1389,95 @@ */ myjif = jiffies + 3 * HZ; while (time_before(jiffies, myjif) && !ap->fw_running); - if (!ap->fw_running){ + + if (!ap->fw_running) { printk(KERN_ERR "%s: Firmware NOT running!\n", dev->name); + ace_dump_trace(ap); writel(readl(®s->CpuCtrl) | CPU_HALT, ®s->CpuCtrl); - return -EBUSY; + + /* aman@sgi.com - account for badly behaving firmware/NIC: + * - have observed that the NIC may continue to generate + * interrupts for some reason; attempt to stop it - halt + * second CPU for Tigon II cards, and also clear Mb0 + * - if we're a module, we'll fail to load if this was + * the only GbE card in the system => if the kernel does + * see an interrupt from the NIC, code to handle it is + * gone and OOps! - so free_irq also + */ + if (ap->version >= 2) + writel(readl(®s->CpuBCtrl) | CPU_HALT, + ®s->CpuBCtrl); + writel(0, ®s->Mb0Lo); + + ecode = -EBUSY; + goto init_error; } /* * We load the ring here as there seem to be no way to tell the * firmware to wipe the ring without re-initializing it. */ - ace_load_std_rx_ring(dev); - + if (!test_and_set_bit(0, &ap->std_refill_busy)) + ace_load_std_rx_ring(ap, RX_RING_SIZE); + else + printk(KERN_ERR "%s: Someone is busy refilling the RX ring\n", + dev->name); + if (ap->version >= 2) { + if (!test_and_set_bit(0, &ap->mini_refill_busy)) + ace_load_mini_rx_ring(ap, RX_MINI_SIZE); + else + printk(KERN_ERR "%s: Someone is busy refilling " + "the RX mini ring\n", dev->name); + } return 0; + + init_error: + ace_init_cleanup(dev); + return ecode; +} + + +static void ace_set_rxtx_parms(struct net_device *dev, int jumbo) +{ + struct ace_private *ap; + struct ace_regs *regs; + int board_idx; + + ap = dev->priv; + regs = ap->regs; + + board_idx = ap->board_idx; + + if (board_idx >= 0) { + if (!jumbo) { + if (!tx_coal_tick[board_idx]) + writel(DEF_TX_COAL, ®s->TuneTxCoalTicks); + if (!max_tx_desc[board_idx]) + writel(DEF_TX_MAX_DESC, ®s->TuneMaxTxDesc); + if (!rx_coal_tick[board_idx]) + writel(DEF_RX_COAL, ®s->TuneRxCoalTicks); + if (!max_rx_desc[board_idx]) + writel(DEF_RX_MAX_DESC, ®s->TuneMaxRxDesc); + if (!tx_ratio[board_idx]) + writel(DEF_TX_RATIO, ®s->TxBufRat); + } else { + if (!tx_coal_tick[board_idx]) + writel(DEF_JUMBO_TX_COAL, + ®s->TuneTxCoalTicks); + if (!max_tx_desc[board_idx]) + writel(DEF_JUMBO_TX_MAX_DESC, + ®s->TuneMaxTxDesc); + if (!rx_coal_tick[board_idx]) + writel(DEF_JUMBO_RX_COAL, + ®s->TuneRxCoalTicks); + if (!max_rx_desc[board_idx]) + writel(DEF_JUMBO_RX_MAX_DESC, + ®s->TuneMaxRxDesc); + if (!tx_ratio[board_idx]) + writel(DEF_JUMBO_TX_RATIO, ®s->TxBufRat); + } + } } @@ -832,8 +1486,8 @@ */ static void ace_timer(unsigned long data) { - struct device *dev = (struct device *)data; - struct ace_private *ap = (struct ace_private *)dev->priv; + struct net_device *dev = (struct net_device *)data; + struct ace_private *ap = dev->priv; struct ace_regs *regs = ap->regs; /* @@ -841,7 +1495,7 @@ * seconds and there is data in the transmit queue, thus we * asume the card is stuck. */ - if (ap->tx_csm != ap->tx_ret_csm){ + if (*ap->tx_csm != ap->tx_ret_csm) { printk(KERN_WARNING "%s: Transmitter is stuck, %08x\n", dev->name, (unsigned int)readl(®s->HostCtrl)); } @@ -851,6 +1505,44 @@ } +static void ace_bh(struct net_device *dev) +{ + struct ace_private *ap = dev->priv; + int cur_size; + + cur_size = atomic_read(&ap->cur_rx_bufs); + if ((cur_size < RX_LOW_STD_THRES) && + !test_and_set_bit(0, &ap->std_refill_busy)) { +#if DEBUG + printk("refilling buffers (current %i)\n", cur_size); +#endif + ace_load_std_rx_ring(ap, RX_RING_SIZE - cur_size); + } + + if (ap->version >= 2) { + cur_size = atomic_read(&ap->cur_mini_bufs); + if ((cur_size < RX_LOW_MINI_THRES) && + !test_and_set_bit(0, &ap->mini_refill_busy)) { +#if DEBUG + printk("refilling mini buffers (current %i)\n", + cur_size); +#endif + ace_load_mini_rx_ring(ap, RX_MINI_SIZE - cur_size); + } + } + + cur_size = atomic_read(&ap->cur_jumbo_bufs); + if (ap->jumbo && (cur_size < RX_LOW_JUMBO_THRES) && + !test_and_set_bit(0, &ap->jumbo_refill_busy)) { +#if DEBUG + printk("refilling jumbo buffers (current %i)\n", >cur_size); +#endif + ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE - cur_size); + } + ap->bh_pending = 0; +} + + /* * Copy the contents of the NIC's trace buffer to kernel memory. */ @@ -866,160 +1558,191 @@ /* * Load the standard rx ring. + * + * Loading rings is safe without holding the spin lock since this is + * done only before the device is enabled, thus no interrupts are + * generated and by the interrupt handler/bh handler. */ -static int ace_load_std_rx_ring(struct device *dev) +static void ace_load_std_rx_ring(struct ace_private *ap, int nr_bufs) { - struct ace_private *ap; struct ace_regs *regs; - struct ace_info *info; - unsigned long flags; - struct cmd cmd; - short i; + short i, idx; - ap = (struct ace_private *)dev->priv; regs = ap->regs; - info = ap->info; - spin_lock_irqsave(&ap->lock, flags); + idx = ap->rx_std_skbprd; - /* - * Set tx_csm before we start receiving interrupts, otherwise - * the interrupt handler might think it is supposed to process - * tx ints before we are up and running, which may cause a null - * pointer access in the int handler. - */ - ap->tx_full = 0; - ap->cur_rx = ap->dirty_rx = 0; - ap->tx_prd = ap->tx_csm = ap->tx_ret_csm = 0; - writel(0, ®s->RxRetCsm); - - for (i = 0; i < RX_RING_THRESH; i++) { + for (i = 0; i < nr_bufs; i++) { struct sk_buff *skb; + struct rx_desc *rd; + dma_addr_t mapping; - ap->rx_std_ring[i].flags = 0; - skb = alloc_skb(ACE_STD_MTU + ETH_HLEN + 6, GFP_ATOMIC); - ap->rx_std_skbuff[i] = skb; + skb = alloc_skb(ACE_STD_BUFSIZE, GFP_ATOMIC); + if (!skb) + break; /* - * Make sure the data contents end up on an aligned address + * Make sure IP header starts on a fresh cache line. */ - skb_reserve(skb, 2); - - set_aceaddr(&ap->rx_std_ring[i].addr, skb->data); - ap->rx_std_ring[i].size = ACE_STD_MTU + ETH_HLEN + 4; - - ap->rx_std_ring[i].flags = 0; - ap->rx_std_ring[i].type = DESC_RX; - - ap->rx_std_ring[i].idx = i; - } - - ap->rx_std_skbprd = i; - - /* - * The last descriptor needs to be marked as being special. - */ - ap->rx_std_ring[i-1].type = DESC_END; - - cmd.evt = C_SET_RX_PRD_IDX; - cmd.code = 0; - cmd.idx = ap->rx_std_skbprd; - ace_issue_cmd(regs, &cmd); + skb_reserve(skb, 2 + 16); + mapping = pci_map_single(ap->pdev, skb->data, + ACE_STD_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); + ap->skb->rx_std_skbuff[idx].skb = skb; + ap->skb->rx_std_skbuff[idx].mapping = mapping; + + rd = &ap->rx_std_ring[idx]; + set_aceaddr(&rd->addr, mapping); + rd->size = ACE_STD_MTU + ETH_HLEN + 4; + rd->idx = idx; + idx = (idx + 1) % RX_STD_RING_ENTRIES; + } + + if (!i) + goto error_out; + + atomic_add(i, &ap->cur_rx_bufs); + ap->rx_std_skbprd = idx; + + if (ACE_IS_TIGON_I(ap)) { + struct cmd cmd; + cmd.evt = C_SET_RX_PRD_IDX; + cmd.code = 0; + cmd.idx = ap->rx_std_skbprd; + ace_issue_cmd(regs, &cmd); + } else { + writel(idx, ®s->RxStdPrd); + wmb(); + } - spin_unlock_irqrestore(&ap->lock, flags); + out: + clear_bit(0, &ap->std_refill_busy); + return; - return 0; + error_out: + printk(KERN_INFO "Out of memory when allocating " + "standard receive buffers\n"); + goto out; } -/* - * Load the jumbo rx ring, this may happen at any time if the MTU - * is changed to a value > 1500. - */ -static int ace_load_jumbo_rx_ring(struct device *dev) +static void ace_load_mini_rx_ring(struct ace_private *ap, int nr_bufs) { - struct ace_private *ap; struct ace_regs *regs; - struct cmd cmd; - unsigned long flags; - short i; + short i, idx; - ap = (struct ace_private *)dev->priv; regs = ap->regs; - spin_lock_irqsave(&ap->lock, flags); - - for (i = 0; i < RX_RING_JUMBO_THRESH; i++) { + idx = ap->rx_mini_skbprd; + for (i = 0; i < nr_bufs; i++) { struct sk_buff *skb; + struct rx_desc *rd; + dma_addr_t mapping; - ap->rx_jumbo_ring[i].flags = 0; - skb = alloc_skb(ACE_JUMBO_MTU + ETH_HLEN + 6, GFP_ATOMIC); - ap->rx_jumbo_skbuff[i] = skb; + skb = alloc_skb(ACE_MINI_BUFSIZE, GFP_ATOMIC); + if (!skb) + break; /* - * Make sure the data contents end up on an aligned address + * Make sure the IP header ends up on a fresh cache line */ - skb_reserve(skb, 2); - - set_aceaddr(&ap->rx_jumbo_ring[i].addr, skb->data); - ap->rx_jumbo_ring[i].size = ACE_JUMBO_MTU + ETH_HLEN + 4; + skb_reserve(skb, 2 + 16); + mapping = pci_map_single(ap->pdev, skb->data, + ACE_MINI_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); + ap->skb->rx_mini_skbuff[idx].skb = skb; + ap->skb->rx_mini_skbuff[idx].mapping = mapping; - ap->rx_jumbo_ring[i].flags = DFLG_RX_JUMBO; - ap->rx_jumbo_ring[i].type = DESC_RX; - - ap->rx_jumbo_ring[i].idx = i; + rd = &ap->rx_mini_ring[idx]; + set_aceaddr(&rd->addr, mapping); + rd->size = ACE_MINI_SIZE; + rd->idx = idx; + idx = (idx + 1) % RX_MINI_RING_ENTRIES; } - ap->rx_jumbo_skbprd = i; + if (!i) + goto error_out; - /* - * The last descriptor needs to be marked as being special. - */ - ap->rx_jumbo_ring[i-1].type = DESC_END; + atomic_add(i, &ap->cur_mini_bufs); - cmd.evt = C_SET_RX_JUMBO_PRD_IDX; - cmd.code = 0; - cmd.idx = ap->rx_jumbo_skbprd; - ace_issue_cmd(regs, &cmd); + ap->rx_mini_skbprd = idx; - spin_unlock_irqrestore(&ap->lock, flags); + writel(idx, ®s->RxMiniPrd); + wmb(); - return 0; + out: + clear_bit(0, &ap->mini_refill_busy); + return; + error_out: + printk(KERN_INFO "Out of memory when allocating " + "mini receive buffers\n"); + goto out; } /* - * Tell the firmware not to accept jumbos and flush the jumbo ring. - * This function must be called with the spinlock held. + * Load the jumbo rx ring, this may happen at any time if the MTU + * is changed to a value > 1500. */ -static int ace_flush_jumbo_rx_ring(struct device *dev) +static void ace_load_jumbo_rx_ring(struct ace_private *ap, int nr_bufs) { - struct ace_private *ap; struct ace_regs *regs; - struct cmd cmd; - short i; + short i, idx; - ap = (struct ace_private *)dev->priv; regs = ap->regs; - if (ap->jumbo){ - cmd.evt = C_RESET_JUMBO_RNG; + idx = ap->rx_jumbo_skbprd; + + for (i = 0; i < nr_bufs; i++) { + struct sk_buff *skb; + struct rx_desc *rd; + dma_addr_t mapping; + + skb = alloc_skb(ACE_JUMBO_BUFSIZE, GFP_ATOMIC); + if (!skb) + break; + + /* + * Make sure the IP header ends up on a fresh cache line + */ + skb_reserve(skb, 2 + 16); + mapping = pci_map_single(ap->pdev, skb->data, + ACE_JUMBO_BUFSIZE - (2 + 16), + PCI_DMA_FROMDEVICE); + ap->skb->rx_jumbo_skbuff[idx].skb = skb; + ap->skb->rx_jumbo_skbuff[idx].mapping = mapping; + + rd = &ap->rx_jumbo_ring[idx]; + set_aceaddr(&rd->addr, mapping); + rd->size = ACE_JUMBO_MTU + ETH_HLEN + 4; + rd->idx = idx; + idx = (idx + 1) % RX_JUMBO_RING_ENTRIES; + } + + if (!i) + goto error_out; + + atomic_add(i, &ap->cur_jumbo_bufs); + ap->rx_jumbo_skbprd = idx; + + if (ACE_IS_TIGON_I(ap)) { + struct cmd cmd; + cmd.evt = C_SET_RX_JUMBO_PRD_IDX; cmd.code = 0; - cmd.idx = 0; + cmd.idx = ap->rx_jumbo_skbprd; ace_issue_cmd(regs, &cmd); + } else { + writel(idx, ®s->RxJumboPrd); + wmb(); + } - for (i = 0; i < RX_JUMBO_RING_ENTRIES; i++) { - if (ap->rx_jumbo_skbuff[i]) { - ap->rx_jumbo_ring[i].size = 0; - set_aceaddr_bus(&ap->rx_jumbo_ring[i].addr, 0); - dev_kfree_skb(ap->rx_jumbo_skbuff[i]); - } - } - }else - printk(KERN_ERR "%s: Trying to flush Jumbo ring without " - "Jumbo support enabled\n", dev->name); - - return 0; + out: + clear_bit(0, &ap->jumbo_refill_busy); + return; + error_out: + printk(KERN_INFO "Out of memory when allocating " + "jumbo receive buffers\n"); + goto out; } @@ -1028,37 +1751,46 @@ * events) and are handled here, outside the main interrupt handler, * to reduce the size of the handler. */ -static u32 ace_handle_event(struct device *dev, u32 evtcsm, u32 evtprd) +static u32 ace_handle_event(struct net_device *dev, u32 evtcsm, u32 evtprd) { struct ace_private *ap; - ap = (struct ace_private *)dev->priv; + ap = dev->priv; - while (evtcsm != evtprd){ - switch (ap->evt_ring[evtcsm].evt){ + while (evtcsm != evtprd) { + switch (ap->evt_ring[evtcsm].evt) { case E_FW_RUNNING: printk(KERN_INFO "%s: Firmware up and running\n", dev->name); ap->fw_running = 1; + wmb(); break; case E_STATS_UPDATED: break; case E_LNK_STATE: { u16 code = ap->evt_ring[evtcsm].code; - if (code == E_C_LINK_UP){ - printk("%s: Optical link UP\n", dev->name); - } - else if (code == E_C_LINK_DOWN) - printk(KERN_INFO "%s: Optical link DOWN\n", + switch (code) { + case E_C_LINK_UP: + printk(KERN_WARNING "%s: Optical link UP\n", dev->name); - else - printk(KERN_INFO "%s: Unknown optical link " + break; + case E_C_LINK_DOWN: + printk(KERN_WARNING "%s: Optical link DOWN\n", + dev->name); + break; + case E_C_LINK_10_100: + printk(KERN_WARNING "%s: 10/100BaseT link " + "UP\n", dev->name); + break; + default: + printk(KERN_ERR "%s: Unknown optical link " "state %02x\n", dev->name, code); + } break; } case E_ERROR: - switch(ap->evt_ring[evtcsm].code){ + switch(ap->evt_ring[evtcsm].code) { case E_C_ERR_INVAL_CMD: printk(KERN_ERR "%s: invalid command error\n", dev->name); @@ -1077,7 +1809,24 @@ } break; case E_RESET_JUMBO_RNG: + { + int i; + for (i = 0; i < RX_JUMBO_RING_ENTRIES; i++) { + if (ap->skb->rx_jumbo_skbuff[i].skb) { + ap->rx_jumbo_ring[i].size = 0; + set_aceaddr(&ap->rx_jumbo_ring[i].addr, 0); + dev_kfree_skb(ap->skb->rx_jumbo_skbuff[i].skb); + ap->skb->rx_jumbo_skbuff[i].skb = NULL; + } + } + ap->jumbo = 0; + printk(KERN_INFO "%s: Jumbo ring flushed\n", + dev->name); + if (!ap->tx_full) + netif_wake_queue(dev); + clear_bit(0, &ap->jumbo_refill_busy); break; + } default: printk(KERN_ERR "%s: Unhandled event 0x%02x\n", dev->name, ap->evt_ring[evtcsm].evt); @@ -1089,115 +1838,77 @@ } -static int ace_rx_int(struct device *dev, u32 rxretprd, u32 rxretcsm) +static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm) { - struct ace_private *ap = (struct ace_private *)dev->priv; - struct ace_regs *regs = ap->regs; - u32 idx, oldidx; + struct ace_private *ap = dev->priv; + u32 idx; + int mini_count = 0, std_count = 0; idx = rxretcsm; - while (idx != rxretprd){ - struct sk_buff *skb, *newskb, *oldskb; - struct rx_desc *newrxdesc, *oldrxdesc; - u32 prdidx, size; - void *addr; + while (idx != rxretprd) { + struct ring_info *rip; + struct sk_buff *skb; + struct rx_desc *rxdesc, *retdesc; + u32 skbidx; + int desc_type, mapsize; u16 csum; - int jumbo; - - oldidx = ap->rx_return_ring[idx].idx; - jumbo = ap->rx_return_ring[idx].flags & DFLG_RX_JUMBO; - - if (jumbo){ - oldskb = ap->rx_jumbo_skbuff[oldidx]; - prdidx = ap->rx_jumbo_skbprd; - newrxdesc = &ap->rx_jumbo_ring[prdidx]; - oldrxdesc = &ap->rx_jumbo_ring[oldidx]; - }else{ - oldskb = ap->rx_std_skbuff[oldidx]; - prdidx = ap->rx_std_skbprd; - newrxdesc = &ap->rx_std_ring[prdidx]; - oldrxdesc = &ap->rx_std_ring[oldidx]; - } - - size = oldrxdesc->size; - - if (size < PKT_COPY_THRESHOLD) { - skb = alloc_skb(size + 2, GFP_ATOMIC); - if (skb == NULL){ - printk(KERN_ERR "%s: Out of memory\n", - dev->name); - goto error; - } - /* - * Make sure the real data is aligned - */ - skb_reserve(skb, 2); - memcpy(skb_put(skb, size), oldskb->data, size); - addr = get_aceaddr_bus(&oldrxdesc->addr); - newskb = oldskb; - }else{ - skb = oldskb; - - skb_put(skb, size); - - newskb = alloc_skb(size + 2, GFP_ATOMIC); - if (newskb == NULL){ - printk(KERN_ERR "%s: Out of memory\n", - dev->name); - goto error; - } + retdesc = &ap->rx_return_ring[idx]; + skbidx = retdesc->idx; + desc_type = retdesc->flags & (BD_FLG_JUMBO | BD_FLG_MINI); + switch(desc_type) { /* - * Make sure we DMA directly into nicely - * aligned receive buffers + * Normal frames do not have any flags set + * + * Mini and normal frames arrive frequently, + * so use a local counter to avoid doing + * atomic operations for each packet arriving. */ - skb_reserve(newskb, 2); - addr = (void *)virt_to_bus(newskb->data); + case 0: + rip = &ap->skb->rx_std_skbuff[skbidx]; + mapsize = ACE_STD_BUFSIZE - (2 + 16); + rxdesc = &ap->rx_std_ring[skbidx]; + std_count++; + break; + case BD_FLG_JUMBO: + rip = &ap->skb->rx_jumbo_skbuff[skbidx]; + mapsize = ACE_JUMBO_BUFSIZE - (2 + 16); + rxdesc = &ap->rx_jumbo_ring[skbidx]; + atomic_dec(&ap->cur_jumbo_bufs); + break; + case BD_FLG_MINI: + rip = &ap->skb->rx_mini_skbuff[skbidx]; + mapsize = ACE_MINI_BUFSIZE - (2 + 16); + rxdesc = &ap->rx_mini_ring[skbidx]; + mini_count++; + break; + default: + printk(KERN_INFO "%s: unknown frame type (0x%02x) " + "returned by NIC\n", dev->name, + retdesc->flags); + goto error; } - set_aceaddr_bus(&newrxdesc->addr, addr); - newrxdesc->size = size; - - newrxdesc->flags = oldrxdesc->flags; - newrxdesc->idx = prdidx; - newrxdesc->type = DESC_RX; -#if (BITS_PER_LONG == 32) - newrxdesc->addr.addrhi = 0; + skb = rip->skb; + rip->skb = NULL; + pci_unmap_single(ap->pdev, rip->mapping, mapsize, + PCI_DMA_FROMDEVICE); + skb_put(skb, retdesc->size); +#if 0 + /* unncessary */ + rxdesc->size = 0; #endif - oldrxdesc->size = 0; - set_aceaddr_bus(&oldrxdesc->addr, 0); - - if (jumbo){ - ap->rx_jumbo_skbuff[oldidx] = NULL; - ap->rx_jumbo_skbuff[prdidx] = newskb; - - prdidx = (prdidx + 1) % RX_JUMBO_RING_ENTRIES; - ap->rx_jumbo_skbprd = prdidx; - }else{ - ap->rx_std_skbuff[oldidx] = NULL; - ap->rx_std_skbuff[prdidx] = newskb; - - prdidx = (prdidx + 1) % RX_STD_RING_ENTRIES; - ap->rx_std_skbprd = prdidx; - } - /* * Fly baby, fly! */ - csum = ap->rx_return_ring[idx].tcp_udp_csum; + csum = retdesc->tcp_udp_csum; skb->dev = dev; skb->protocol = eth_type_trans(skb, dev); -#if 0 - /* - * This was never actually enabled in the RX descriptors - * anyway - it requires a bit more testing before enabling - * it again. - */ /* * If the checksum is correct and this is not a * fragment, tell the stack that the data is correct. @@ -1208,34 +1919,31 @@ skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; -#endif + netif_rx(skb); /* send it up */ ap->stats.rx_packets++; - ap->stats.rx_bytes += skb->len; - - if ((prdidx & 0x7) == 0){ - struct cmd cmd; - if (jumbo) - cmd.evt = C_SET_RX_JUMBO_PRD_IDX; - else - cmd.evt = C_SET_RX_PRD_IDX; - cmd.code = 0; - cmd.idx = prdidx; - ace_issue_cmd(regs, &cmd); - } + ap->stats.rx_bytes += retdesc->size; idx = (idx + 1) % RX_RETURN_RING_ENTRIES; } + + atomic_sub(std_count, &ap->cur_rx_bufs); + if (!ACE_IS_TIGON_I(ap)) + atomic_sub(mini_count, &ap->cur_mini_bufs); + out: /* * According to the documentation RxRetCsm is obsolete with - * the 12.3.x Firmware - my Tigon I NIC's seem to disagree! + * the 12.3.x Firmware - my Tigon I NICs seem to disagree! */ - writel(idx, ®s->RxRetCsm); + if (ACE_IS_TIGON_I(ap)) { + struct ace_regs *regs = ap->regs; + writel(idx, ®s->RxRetCsm); + } ap->cur_rx = idx; - return idx; + return; error: idx = rxretprd; goto out; @@ -1246,24 +1954,21 @@ { struct ace_private *ap; struct ace_regs *regs; - struct device *dev = (struct device *)dev_id; + struct net_device *dev = (struct net_device *)dev_id; + u32 idx; u32 txcsm, rxretcsm, rxretprd; u32 evtcsm, evtprd; - ap = (struct ace_private *)dev->priv; + ap = dev->priv; regs = ap->regs; - spin_lock(&ap->lock); - /* * In case of PCI shared interrupts or spurious interrupts, * we want to make sure it is actually our interrupt before * spending any time in here. */ - if (!(readl(®s->HostCtrl) & IN_INT)){ - spin_unlock(&ap->lock); + if (!(readl(®s->HostCtrl) & IN_INT)) return; - } /* * Tell the card not to generate interrupts while we are in here. @@ -1271,25 +1976,46 @@ writel(1, ®s->Mb0Lo); /* - * Service RX ints before TX + * There is no conflict between transmit handling in + * start_xmit and receive processing, thus there is no reason + * to take a spin lock for RX handling. Wait until we start + * working on the other stuff - hey we don't need a spin lock + * anymore. */ - rxretprd = ap->rx_ret_prd; + rxretprd = *ap->rx_ret_prd; rxretcsm = ap->cur_rx; if (rxretprd != rxretcsm) - rxretprd = ace_rx_int(dev, rxretprd, rxretcsm); + ace_rx_int(dev, rxretprd, rxretcsm); - txcsm = ap->tx_csm; - if (txcsm != ap->tx_ret_csm) { - u32 idx = ap->tx_ret_csm; + txcsm = *ap->tx_csm; + idx = ap->tx_ret_csm; + if (txcsm != idx) { do { - ap->stats.tx_packets++; - ap->stats.tx_bytes += ap->tx_skbuff[idx]->len; - dev_kfree_skb(ap->tx_skbuff[idx]); + struct sk_buff *skb; + + skb = ap->skb->tx_skbuff[idx].skb; + if (skb) { + dma_addr_t mapping; - ap->tx_skbuff[idx] = NULL; + mapping = ap->skb->tx_skbuff[idx].mapping; + ap->stats.tx_packets++; + ap->stats.tx_bytes += skb->len; + pci_unmap_single(ap->pdev, mapping, skb->len, + PCI_DMA_TODEVICE); + dev_kfree_skb_irq(skb); + + ap->skb->tx_skbuff[idx].skb = NULL; + } + + /* + * Question here is whether one should not skip + * these writes - I have never seen any errors + * caused by the NIC actually trying to access + * these incorrectly. + */ #if (BITS_PER_LONG == 64) writel(0, &ap->tx_ring[idx].addr.addrhi); #endif @@ -1299,11 +2025,19 @@ idx = (idx + 1) % TX_RING_ENTRIES; } while (idx != txcsm); - if (ap->tx_full && dev->tbusy && - (((ap->tx_prd + 1) % TX_RING_ENTRIES) != txcsm)){ - ap->tx_full = 0; - dev->tbusy = 0; - mark_bh(NET_BH); + /* + * Once we actually get to this point the tx ring has + * already been trimmed thus it cannot be full! + * Ie. skip the comparison of the tx producer vs. the + * consumer. + */ + if (netif_queue_stopped(dev) && xchg(&ap->tx_full, 0)) { + /* + * This does not need to be atomic (and expensive), + * I've seen cases where it would fail otherwise ;-( + */ + netif_wake_queue(dev); + ace_mark_net_bh(NET_BH); /* * TX ring is no longer full, aka the @@ -1313,23 +2047,84 @@ } ap->tx_ret_csm = txcsm; + wmb(); } evtcsm = readl(®s->EvtCsm); - evtprd = ap->evt_prd; + evtprd = *ap->evt_prd; - if (evtcsm != evtprd){ + if (evtcsm != evtprd) { evtcsm = ace_handle_event(dev, evtcsm, evtprd); + writel(evtcsm, ®s->EvtCsm); } - writel(evtcsm, ®s->EvtCsm); - writel(0, ®s->Mb0Lo); + /* + * This has to go last in the interrupt handler and run with + * the spin lock released ... what lock? + */ + if (netif_running(dev)) { + int cur_size; + int run_bh = 0; + + cur_size = atomic_read(&ap->cur_rx_bufs); + if (cur_size < RX_LOW_STD_THRES) { + if ((cur_size < RX_PANIC_STD_THRES) && + !test_and_set_bit(0, &ap->std_refill_busy)) { +#if DEBUG + printk("low on std buffers %i\n", cur_size); +#endif + ace_load_std_rx_ring(ap, + RX_RING_SIZE - cur_size); + } else + run_bh = 1; + } + + if (!ACE_IS_TIGON_I(ap)) { + cur_size = atomic_read(&ap->cur_mini_bufs); + if (cur_size < RX_LOW_MINI_THRES) { + if ((cur_size < RX_PANIC_MINI_THRES) && + !test_and_set_bit(0, + &ap->mini_refill_busy)) { +#if DEBUG + printk("low on mini buffers %i\n", + cur_size); +#endif + ace_load_mini_rx_ring(ap, RX_MINI_SIZE - cur_size); + } else + run_bh = 1; + } + } + + if (ap->jumbo) { + cur_size = atomic_read(&ap->cur_jumbo_bufs); + if (cur_size < RX_LOW_JUMBO_THRES) { + if ((cur_size < RX_PANIC_JUMBO_THRES) && + !test_and_set_bit(0, + &ap->jumbo_refill_busy)){ +#if DEBUG + printk("low on jumbo buffers %i\n", + cur_size); +#endif + ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE - cur_size); + } else + run_bh = 1; + } + } + if (run_bh && !ap->bh_pending) { + ap->bh_pending = 1; + queue_task(&ap->immediate, &tq_immediate); + mark_bh(IMMEDIATE_BH); + } + } - spin_unlock(&ap->lock); + /* + * Allow the card to generate interrupts again + */ + writel(0, ®s->Mb0Lo); } -static int ace_open(struct device *dev) +static int ace_open(struct net_device *dev) { struct ace_private *ap; struct ace_regs *regs; @@ -1338,22 +2133,33 @@ ap = dev->priv; regs = ap->regs; - if (!(ap->fw_running)){ - printk(KERN_WARNING "%s: firmware not running!\n", dev->name); + if (!(ap->fw_running)) { + printk(KERN_WARNING "%s: Firmware not running!\n", dev->name); return -EBUSY; } writel(dev->mtu + ETH_HLEN + 4, ®s->IfMtu); + /* + * Zero the stats when restarting the interface... + */ + memset(&ap->stats, 0, sizeof(ap->stats)); + + cmd.evt = C_CLEAR_STATS; + cmd.code = 0; + cmd.idx = 0; + ace_issue_cmd(regs, &cmd); + cmd.evt = C_HOST_STATE; cmd.code = C_C_STACK_UP; cmd.idx = 0; ace_issue_cmd(regs, &cmd); - if (ap->jumbo) - ace_load_jumbo_rx_ring(dev); + if (ap->jumbo && + !test_and_set_bit(0, &ap->jumbo_refill_busy)) + ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE); - if (dev->flags & IFF_PROMISC){ + if (dev->flags & IFF_PROMISC) { cmd.evt = C_SET_PROMISC_MODE; cmd.code = C_C_PROMISC_ENABLE; cmd.idx = 0; @@ -1365,19 +2171,13 @@ ap->mcast_all = 0; #if 0 - { long myjif = jiffies + HZ; - while (time_before(jiffies, myjif)); - } - cmd.evt = C_LNK_NEGOTIATION; cmd.code = 0; cmd.idx = 0; ace_issue_cmd(regs, &cmd); #endif - dev->tbusy = 0; - dev->interrupt = 0; - dev->start = 1; + netif_start_queue(dev); MOD_INC_USE_COUNT; @@ -1387,11 +2187,20 @@ init_timer(&ap->timer); ap->timer.data = (unsigned long)dev; ap->timer.function = ace_timer; + + /* + * Setup the bottom half rx ring refill handler + */ + ap->immediate.next = NULL; + ap->immediate.sync = 0; + ap->immediate.routine = (void *)(void *)ace_bh; + ap->immediate.data = dev; + return 0; } -static int ace_close(struct device *dev) +static int ace_close(struct net_device *dev) { struct ace_private *ap; struct ace_regs *regs; @@ -1399,15 +2208,15 @@ unsigned long flags; short i; - dev->start = 0; - set_bit(0, (void*)&dev->tbusy); + ace_if_down(dev); + netif_stop_queue(dev); - ap = (struct ace_private *)dev->priv; + ap = dev->priv; regs = ap->regs; del_timer(&ap->timer); - if (ap->promisc){ + if (ap->promisc) { cmd.evt = C_SET_PROMISC_MODE; cmd.code = C_C_PROMISC_DISABLE; cmd.idx = 0; @@ -1420,56 +2229,95 @@ cmd.idx = 0; ace_issue_cmd(regs, &cmd); - spin_lock_irqsave(&ap->lock, flags); + /* + * Make sure one CPU is not processing packets while + * buffers are being released by another. + */ + save_flags(flags); + cli(); for (i = 0; i < TX_RING_ENTRIES; i++) { - if (ap->tx_skbuff[i]) { + struct sk_buff *skb; + dma_addr_t mapping; + + skb = ap->skb->tx_skbuff[i].skb; + mapping = ap->skb->tx_skbuff[i].mapping; + if (skb) { writel(0, &ap->tx_ring[i].addr.addrhi); writel(0, &ap->tx_ring[i].addr.addrlo); writel(0, &ap->tx_ring[i].flagsize); - dev_kfree_skb(ap->tx_skbuff[i]); + pci_unmap_single(ap->pdev, mapping, skb->len, + PCI_DMA_TODEVICE); + dev_kfree_skb(skb); + ap->skb->tx_skbuff[i].skb = NULL; } } - if (ap->jumbo) - ace_flush_jumbo_rx_ring(dev); + if (ap->jumbo) { + cmd.evt = C_RESET_JUMBO_RNG; + cmd.code = 0; + cmd.idx = 0; + ace_issue_cmd(regs, &cmd); + } - spin_unlock_irqrestore(&ap->lock, flags); + restore_flags(flags); MOD_DEC_USE_COUNT; return 0; } -static int ace_start_xmit(struct sk_buff *skb, struct device *dev) +static int ace_start_xmit(struct sk_buff *skb, struct net_device *dev) { - struct ace_private *ap = (struct ace_private *)dev->priv; + struct ace_private *ap = dev->priv; struct ace_regs *regs = ap->regs; - unsigned long flags; unsigned long addr; u32 idx, flagsize; - spin_lock_irqsave(&ap->lock, flags); + /* + * ARGH, there is just no pretty way to do this + */ +#if (LINUX_VERSION_CODE < 0x02032b) + if (test_and_set_bit(0, &dev->tbusy)) + return 1; +#else + netif_stop_queue(dev); +#endif idx = ap->tx_prd; - ap->tx_skbuff[idx] = skb; - addr = virt_to_bus(skb->data); + if ((idx + 1) % TX_RING_ENTRIES == ap->tx_ret_csm) { + ap->tx_full = 1; +#if DEBUG + printk("%s: trying to transmit while the tx ring is full " + "- this should not happen!\n", dev->name); +#endif + return 1; + } + + ap->skb->tx_skbuff[idx].skb = skb; + ap->skb->tx_skbuff[idx].mapping = + pci_map_single(ap->pdev, skb->data, skb->len, + PCI_DMA_TODEVICE); + addr = (unsigned long) ap->skb->tx_skbuff[idx].mapping; #if (BITS_PER_LONG == 64) writel(addr >> 32, &ap->tx_ring[idx].addr.addrhi); #endif writel(addr & 0xffffffff, &ap->tx_ring[idx].addr.addrlo); - flagsize = (skb->len << 16) | (DESC_END) ; + flagsize = (skb->len << 16) | (BD_FLG_END) ; writel(flagsize, &ap->tx_ring[idx].flagsize); - mb(); + wmb(); idx = (idx + 1) % TX_RING_ENTRIES; ap->tx_prd = idx; - writel(idx, ®s->TxPrd); + ace_set_txprd(regs, ap, idx); - if ((idx + 1) % TX_RING_ENTRIES == ap->tx_ret_csm){ + /* + * tx_csm is set by the NIC whereas we set tx_ret_csm which + * is always trying to catch tx_csm + */ + if ((idx + 2) % TX_RING_ENTRIES == ap->tx_ret_csm) { ap->tx_full = 1; - set_bit(0, (void*)&dev->tbusy); /* * Queue is full, add timer to detect whether the * transmitter is stuck. Use mod_timer as we can get @@ -1477,16 +2325,33 @@ * timers. */ mod_timer(&ap->timer, jiffies + (3 * HZ)); - } - spin_unlock_irqrestore(&ap->lock, flags); + /* The following check will fix a race between the interrupt + * handler increasing the tx_ret_csm and testing for tx_full + * and this tx routine's testing the tx_ret_csm and setting + * the tx_full; note that this fix makes assumptions on the + * ordering of writes (sequential consistency will fly; TSO + * processor order would work too) but that's what lock-less + * programming is all about + */ + if (((idx + 2) % TX_RING_ENTRIES != ap->tx_ret_csm) + && xchg(&ap->tx_full, 0)) { + del_timer(&ap->timer); + netif_wake_queue(dev); + } + } else { + /* + * No need for it to be atomic - seems it needs to be + */ + netif_wake_queue(dev); + } dev->trans_start = jiffies; return 0; } -static int ace_change_mtu(struct device *dev, int new_mtu) +static int ace_change_mtu(struct net_device *dev, int new_mtu) { struct ace_private *ap = dev->priv; struct ace_regs *regs = ap->regs; @@ -1497,40 +2362,182 @@ writel(new_mtu + ETH_HLEN + 4, ®s->IfMtu); dev->mtu = new_mtu; - if (new_mtu > ACE_STD_MTU){ - if (!(ap->jumbo)){ + if (new_mtu > ACE_STD_MTU) { + if (!(ap->jumbo)) { printk(KERN_INFO "%s: Enabling Jumbo frame " "support\n", dev->name); ap->jumbo = 1; - ace_load_jumbo_rx_ring(dev); - } - ap->jumbo = 1; - }else{ + if (!test_and_set_bit(0, &ap->jumbo_refill_busy)) + ace_load_jumbo_rx_ring(ap, RX_JUMBO_SIZE); + ace_set_rxtx_parms(dev, 1); + } + } else { + netif_stop_queue(dev); + while (test_and_set_bit(0, &ap->jumbo_refill_busy)); + synchronize_irq(); + ace_set_rxtx_parms(dev, 0); if (ap->jumbo){ - ace_flush_jumbo_rx_ring(dev); + struct cmd cmd; - printk(KERN_INFO "%s: Disabling Jumbo frame support\n", - dev->name); + cmd.evt = C_RESET_JUMBO_RNG; + cmd.code = 0; + cmd.idx = 0; + ace_issue_cmd(regs, &cmd); } - ap->jumbo = 0; } return 0; } +static int ace_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ +#ifdef ETHTOOL + struct ace_private *ap = dev->priv; + struct ace_regs *regs = ap->regs; + struct ethtool_cmd ecmd; + u32 link, speed; + +#ifdef SPIN_DEBUG + if (cmd == (SIOCDEVPRIVATE+0x0e)) { + printk(KERN_NOTICE "%s: dumping debug info\n", dev->name); + printk(KERN_NOTICE "%s: tbusy %li, tx_ret_csm %i, " + "tx_prd %i\n", dev->name, dev->tbusy, + ap->tx_ret_csm, ap->tx_prd); + printk(KERN_NOTICE "%s: cur_rx %i, std_refill %li, " + "mini_rx %i, mini_refill %li\n", dev->name, + atomic_read(&ap->cur_rx_bufs), ap->std_refill_busy, + atomic_read(&ap->cur_mini_bufs), ap->mini_refill_busy); + printk(KERN_NOTICE "%s: CpuCtrl %08x\n", + dev->name, readl(®s->CpuCtrl)); + return 0; + } +#endif + if (cmd != SIOCETHTOOL) + return -EOPNOTSUPP; + if (copy_from_user(&ecmd, ifr->ifr_data, sizeof(ecmd))) + return -EFAULT; + + if (ecmd.cmd == ETH_GSET) { + ecmd.supported = + (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | + SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full | + SUPPORTED_Autoneg | SUPPORTED_FIBRE); + + ecmd.port = PORT_FIBRE; + ecmd.transceiver = XCVR_INTERNAL; + ecmd.phy_address = 0; + + link = readl(®s->GigLnkState); + if (link & LNK_1000MB) + ecmd.speed = SPEED_1000; + else { + link = readl(®s->FastLnkState); + if (link & LNK_100MB) + ecmd.speed = SPEED_100; + else if (link & LNK_100MB) + ecmd.speed = SPEED_10; + else + ecmd.speed = 0; + } + if (link & LNK_FULL_DUPLEX) + ecmd.duplex = DUPLEX_FULL; + else + ecmd.duplex = DUPLEX_HALF; + + if (link & LNK_NEGOTIATE) + ecmd.autoneg = AUTONEG_ENABLE; + else + ecmd.autoneg = AUTONEG_DISABLE; + + ecmd.trace = readl(®s->TuneTrace); + + ecmd.txcoal = readl(®s->TuneTxCoalTicks); + ecmd.rxcoal = readl(®s->TuneRxCoalTicks); + ecmd.maxtxpkt = readl(®s->TuneMaxTxDesc); + ecmd.maxrxpkt = readl(®s->TuneMaxRxDesc); + + if(copy_to_user(ifr->ifr_data, &ecmd, sizeof(ecmd))) + return -EFAULT; + return 0; + } else if (ecmd.cmd == ETH_SSET) { + if(!capable(CAP_NET_ADMIN)) + return -EPERM; + + link = readl(®s->GigLnkState); + if (link & LNK_1000MB) + speed = SPEED_1000; + else { + link = readl(®s->FastLnkState); + if (link & LNK_100MB) + speed = SPEED_100; + else if (link & LNK_100MB) + speed = SPEED_10; + else + speed = SPEED_100; + } + + link = LNK_ENABLE | LNK_1000MB | LNK_100MB | LNK_10MB | + LNK_RX_FLOW_CTL_Y | LNK_NEG_FCTL; + if (!ACE_IS_TIGON_I(ap)) + link |= LNK_TX_FLOW_CTL_Y; + if (ecmd.autoneg == AUTONEG_ENABLE) + link |= LNK_NEGOTIATE; + if (ecmd.speed != speed) { + link &= ~(LNK_1000MB | LNK_100MB | LNK_10MB); + switch (speed) { + case SPEED_1000: + link |= LNK_1000MB; + break; + case SPEED_100: + link |= LNK_100MB; + break; + case SPEED_10: + link |= LNK_10MB; + break; + } + } + if (ecmd.duplex == DUPLEX_FULL) + link |= LNK_FULL_DUPLEX; + + if (link != ap->link) { + struct cmd cmd; + printk(KERN_INFO "%s: Renegotiating link state\n", + dev->name); + + ap->link = link; + writel(link, ®s->TuneLink); + if (!ACE_IS_TIGON_I(ap)) + writel(link, ®s->TuneFastLink); + wmb(); + + cmd.evt = C_LNK_NEGOTIATION; + cmd.code = 0; + cmd.idx = 0; + ace_issue_cmd(regs, &cmd); + } + return 0; + } +#endif + + return -EOPNOTSUPP; +} + + /* * Set the hardware MAC address. */ -static int ace_set_mac_addr(struct device *dev, void *p) +static int ace_set_mac_addr(struct net_device *dev, void *p) { struct sockaddr *addr=p; struct ace_regs *regs; u16 *da; struct cmd cmd; - if(dev->start) + if(netif_running(dev)) return -EBUSY; + memcpy(dev->dev_addr, addr->sa_data,dev->addr_len); da = (u16 *)dev->dev_addr; @@ -1548,7 +2555,7 @@ } -static void ace_set_multicast_list(struct device *dev) +static void ace_set_multicast_list(struct net_device *dev) { struct ace_private *ap = dev->priv; struct ace_regs *regs = ap->regs; @@ -1560,9 +2567,9 @@ cmd.idx = 0; ace_issue_cmd(regs, &cmd); ap->mcast_all = 1; - } else if (ap->mcast_all){ + } else if (ap->mcast_all) { cmd.evt = C_SET_MULTICAST_MODE; - cmd.code = C_C_MCAST_ENABLE; + cmd.code = C_C_MCAST_DISABLE; cmd.idx = 0; ace_issue_cmd(regs, &cmd); ap->mcast_all = 0; @@ -1574,7 +2581,7 @@ cmd.idx = 0; ace_issue_cmd(regs, &cmd); ap->promisc = 1; - }else if (!(dev->flags & IFF_PROMISC) && (ap->promisc)){ + }else if (!(dev->flags & IFF_PROMISC) && (ap->promisc)) { cmd.evt = C_SET_PROMISC_MODE; cmd.code = C_C_PROMISC_DISABLE; cmd.idx = 0; @@ -1602,15 +2609,21 @@ } -static struct net_device_stats *ace_get_stats(struct device *dev) +static struct net_device_stats *ace_get_stats(struct net_device *dev) { struct ace_private *ap = dev->priv; + struct ace_mac_stats *mac_stats = + (struct ace_mac_stats *)ap->regs->Stats; + + ap->stats.rx_missed_errors = readl(&mac_stats->drop_space); + ap->stats.multicast = readl(&mac_stats->kept_mc); + ap->stats.collisions = readl(&mac_stats->coll); return(&ap->stats); } -__initfunc(void ace_copy(struct ace_regs *regs, void *src, u32 dest, int size)) +void __init ace_copy(struct ace_regs *regs, void *src, u32 dest, int size) { unsigned long tdest; u32 *wsrc; @@ -1619,23 +2632,20 @@ if (size <= 0) return; - while (size > 0){ + while (size > 0) { tsize = min(((~dest & (ACE_WINDOW_SIZE - 1)) + 1), min(size, ACE_WINDOW_SIZE)); tdest = (unsigned long)®s->Window + (dest & (ACE_WINDOW_SIZE - 1)); writel(dest & ~(ACE_WINDOW_SIZE - 1), ®s->WinBase); -#ifdef __BIG_ENDIAN -#error "data must be swapped here" -#else -/* - * XXX - special memcpy needed here!!! - */ + /* + * This requires byte swapping on big endian, however + * writel does that for us + */ wsrc = src; - for (i = 0; i < (tsize / 4); i++){ + for (i = 0; i < (tsize / 4); i++) { writel(wsrc[i], tdest + i*4); } -#endif dest += tsize; src += tsize; size -= tsize; @@ -1645,7 +2655,7 @@ } -__initfunc(void ace_clear(struct ace_regs *regs, u32 dest, int size)) +void __init ace_clear(struct ace_regs *regs, u32 dest, int size) { unsigned long tdest; short tsize = 0, i; @@ -1653,14 +2663,14 @@ if (size <= 0) return; - while (size > 0){ + while (size > 0) { tsize = min(((~dest & (ACE_WINDOW_SIZE - 1)) + 1), min(size, ACE_WINDOW_SIZE)); tdest = (unsigned long)®s->Window + (dest & (ACE_WINDOW_SIZE - 1)); writel(dest & ~(ACE_WINDOW_SIZE - 1), ®s->WinBase); - for (i = 0; i < (tsize / 4); i++){ + for (i = 0; i < (tsize / 4); i++) { writel(0, tdest + i*4); } @@ -1678,15 +2688,15 @@ * This operation requires the NIC to be halted and is performed with * interrupts disabled and with the spinlock hold. */ -__initfunc(int ace_load_firmware(struct device *dev)) +int __init ace_load_firmware(struct net_device *dev) { struct ace_private *ap; struct ace_regs *regs; - ap = (struct ace_private *)dev->priv; + ap = dev->priv; regs = ap->regs; - if (!(readl(®s->CpuCtrl) & CPU_HALTED)){ + if (!(readl(®s->CpuCtrl) & CPU_HALTED)) { printk(KERN_ERR "%s: trying to download firmware while the " "CPU is running!\n", dev->name); return -EFAULT; @@ -1697,14 +2707,14 @@ * funny things on NICs with only 512KB SRAM */ ace_clear(regs, 0x2000, 0x80000-0x2000); - if (ap->version == 1){ + if (ACE_IS_TIGON_I(ap)) { ace_copy(regs, tigonFwText, tigonFwTextAddr, tigonFwTextLen); ace_copy(regs, tigonFwData, tigonFwDataAddr, tigonFwDataLen); ace_copy(regs, tigonFwRodata, tigonFwRodataAddr, tigonFwRodataLen); ace_clear(regs, tigonFwBssAddr, tigonFwBssLen); ace_clear(regs, tigonFwSbssAddr, tigonFwSbssLen); - }else if (ap->version == 2){ + }else if (ap->version == 2) { ace_clear(regs, tigon2FwBssAddr, tigon2FwBssLen); ace_clear(regs, tigon2FwSbssAddr, tigon2FwSbssLen); ace_copy(regs, tigon2FwText, tigon2FwTextAddr,tigon2FwTextLen); @@ -1728,36 +2738,40 @@ * specs. * * Oh yes, this is only the beginning! + * + * Thanks to Stevarino Webinski for helping tracking down the bugs in the + * code i2c readout code by beta testing all my hacks. */ -static void eeprom_start(struct ace_regs *regs) +static void __init eeprom_start(struct ace_regs *regs) { - u32 local = readl(®s->LocalCtrl); + u32 local; - udelay(1); + udelay(ACE_SHORT_DELAY); + local = readl(®s->LocalCtrl); local |= EEPROM_DATA_OUT | EEPROM_WRITE_ENABLE; writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); local |= EEPROM_CLK_OUT; writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); local &= ~EEPROM_DATA_OUT; writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); local &= ~EEPROM_CLK_OUT; writel(local, ®s->LocalCtrl); mb(); } -static void eeprom_prep(struct ace_regs *regs, u8 magic) +static void __init eeprom_prep(struct ace_regs *regs, u8 magic) { short i; u32 local; - udelay(2); + udelay(ACE_SHORT_DELAY); local = readl(®s->LocalCtrl); local &= ~EEPROM_DATA_OUT; local |= EEPROM_WRITE_ENABLE; @@ -1765,7 +2779,7 @@ mb(); for (i = 0; i < 8; i++, magic <<= 1) { - udelay(2); + udelay(ACE_SHORT_DELAY); if (magic & 0x80) local |= EEPROM_DATA_OUT; else @@ -1773,11 +2787,11 @@ writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); local |= EEPROM_CLK_OUT; writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); local &= ~(EEPROM_CLK_OUT | EEPROM_DATA_OUT); writel(local, ®s->LocalCtrl); mb(); @@ -1785,7 +2799,7 @@ } -static int eeprom_check_ack(struct ace_regs *regs) +static int __init eeprom_check_ack(struct ace_regs *regs) { int state; u32 local; @@ -1794,14 +2808,14 @@ local &= ~EEPROM_WRITE_ENABLE; writel(local, ®s->LocalCtrl); mb(); - udelay(2); + udelay(ACE_LONG_DELAY); local |= EEPROM_CLK_OUT; writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); /* sample data in middle of high clk */ state = (readl(®s->LocalCtrl) & EEPROM_DATA_IN) != 0; - udelay(1); + udelay(ACE_SHORT_DELAY); mb(); writel(readl(®s->LocalCtrl) & ~EEPROM_CLK_OUT, ®s->LocalCtrl); mb(); @@ -1810,27 +2824,28 @@ } -static void eeprom_stop(struct ace_regs *regs) +static void __init eeprom_stop(struct ace_regs *regs) { u32 local; + udelay(ACE_SHORT_DELAY); local = readl(®s->LocalCtrl); local |= EEPROM_WRITE_ENABLE; writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); local &= ~EEPROM_DATA_OUT; writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); local |= EEPROM_CLK_OUT; writel(local, ®s->LocalCtrl); mb(); - udelay(1); + udelay(ACE_SHORT_DELAY); local |= EEPROM_DATA_OUT; writel(local, ®s->LocalCtrl); mb(); - udelay(2); + udelay(ACE_LONG_DELAY); local &= ~EEPROM_CLK_OUT; writel(local, ®s->LocalCtrl); mb(); @@ -1840,78 +2855,120 @@ /* * Read a whole byte from the EEPROM. */ -static u8 read_eeprom_byte(struct ace_regs *regs, unsigned long offset) +static int __init read_eeprom_byte(struct net_device *dev, + unsigned long offset) { + struct ace_regs *regs; + unsigned long flags; u32 local; + int result = 0; short i; - u8 result = 0; - if (!regs){ - printk(KERN_ERR "No regs!\n"); - return 0; + if (!dev) { + printk(KERN_ERR "No device!\n"); + result = -ENODEV; + goto eeprom_read_error; } + regs = ((struct ace_private *)dev->priv)->regs; + + /* + * Don't take interrupts on this CPU will bit banging + * the %#%#@$ I2C device + */ + __save_flags(flags); + __cli(); + eeprom_start(regs); eeprom_prep(regs, EEPROM_WRITE_SELECT); - if (eeprom_check_ack(regs)){ - printk("Unable to sync eeprom\n"); - return 0; + if (eeprom_check_ack(regs)) { + __restore_flags(flags); + printk(KERN_ERR "%s: Unable to sync eeprom\n", dev->name); + result = -EIO; + goto eeprom_read_error; } eeprom_prep(regs, (offset >> 8) & 0xff); - if (eeprom_check_ack(regs)) - return 0; + if (eeprom_check_ack(regs)) { + __restore_flags(flags); + printk(KERN_ERR "%s: Unable to set address byte 0\n", + dev->name); + result = -EIO; + goto eeprom_read_error; + } eeprom_prep(regs, offset & 0xff); - if (eeprom_check_ack(regs)) - return 0; + if (eeprom_check_ack(regs)) { + __restore_flags(flags); + printk(KERN_ERR "%s: Unable to set address byte 1\n", + dev->name); + result = -EIO; + goto eeprom_read_error; + } eeprom_start(regs); eeprom_prep(regs, EEPROM_READ_SELECT); - if (eeprom_check_ack(regs)) - return 0; + if (eeprom_check_ack(regs)) { + __restore_flags(flags); + printk(KERN_ERR "%s: Unable to set READ_SELECT\n", + dev->name); + result = -EIO; + goto eeprom_read_error; + } for (i = 0; i < 8; i++) { local = readl(®s->LocalCtrl); local &= ~EEPROM_WRITE_ENABLE; writel(local, ®s->LocalCtrl); - udelay(2); + udelay(ACE_LONG_DELAY); mb(); local |= EEPROM_CLK_OUT; writel(local, ®s->LocalCtrl); - udelay(1); mb(); + udelay(ACE_SHORT_DELAY); /* sample data mid high clk */ result = (result << 1) | ((readl(®s->LocalCtrl) & EEPROM_DATA_IN) != 0); - udelay(1); + udelay(ACE_SHORT_DELAY); mb(); local = readl(®s->LocalCtrl); local &= ~EEPROM_CLK_OUT; writel(local, ®s->LocalCtrl); + udelay(ACE_SHORT_DELAY); mb(); - if (i == 7){ + if (i == 7) { local |= EEPROM_WRITE_ENABLE; writel(local, ®s->LocalCtrl); mb(); + udelay(ACE_SHORT_DELAY); } } local |= EEPROM_DATA_OUT; writel(local, ®s->LocalCtrl); - udelay(1); + mb(); + udelay(ACE_SHORT_DELAY); writel(readl(®s->LocalCtrl) | EEPROM_CLK_OUT, ®s->LocalCtrl); - udelay(2); + udelay(ACE_LONG_DELAY); writel(readl(®s->LocalCtrl) & ~EEPROM_CLK_OUT, ®s->LocalCtrl); + mb(); + udelay(ACE_SHORT_DELAY); eeprom_stop(regs); + __restore_flags(flags); + out: return result; + + eeprom_read_error: + printk(KERN_ERR "%s: Unable to read eeprom byte 0x%02lx\n", + dev->name, offset); + goto out; } /* * Local variables: - * compile-command: "gcc -D__KERNEL__ -D__SMP__ -DMODULE -I/data/home/jes/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -fno-strength-reduce -DMODVERSIONS -include /data/home/jes/linux/include/linux/modversions.h -c -o acenic.o acenic.c" + * compile-command: "gcc -D__SMP__ -D__KERNEL__ -DMODULE -I../../include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -fno-strength-reduce -DMODVERSIONS -include ../../include/linux/modversions.h -c -o acenic.o acenic.c" * End: */ diff -urN v2.2.15/linux/drivers/net/acenic.h linux/drivers/net/acenic.h --- v2.2.15/linux/drivers/net/acenic.h Mon Mar 22 08:08:12 1999 +++ linux/drivers/net/acenic.h Wed Jun 7 14:26:43 2000 @@ -14,70 +14,10 @@ * as some of them are in PCI shared memory and it is necessary to use * readl/writel to access them. * - * The addressing code is derived from Pete Beckman's work, but + * The addressing code is derived from Pete Wyckoff's work, but * modified to deal properly with readl/writel usage. */ -typedef struct { - u32 addrhi; - u32 addrlo; -} aceaddr; - - -static inline void set_aceaddr(aceaddr *aa, volatile void *addr) -{ - unsigned long baddr = virt_to_bus((void *)addr); -#if (BITS_PER_LONG == 64) - aa->addrlo = baddr & 0xffffffff; - aa->addrhi = baddr >> 32; -#else - /* Don't bother setting zero every time */ - aa->addrlo = baddr; -#endif - mb(); -} - - -static inline void set_aceaddr_bus(aceaddr *aa, volatile void *addr) -{ - unsigned long baddr = (unsigned long)addr; -#if (BITS_PER_LONG == 64) - aa->addrlo = baddr & 0xffffffff; - aa->addrhi = baddr >> 32; -#else - /* Don't bother setting zero every time */ - aa->addrlo = baddr; -#endif - mb(); -} - - -static inline void *get_aceaddr(aceaddr *aa) -{ - unsigned long addr; - mb(); -#if (BITS_PER_LONG == 64) - addr = (u64)aa->addrhi << 32 | aa->addrlo; -#else - addr = aa->addrlo; -#endif - return bus_to_virt(addr); -} - - -static inline void *get_aceaddr_bus(aceaddr *aa) -{ - unsigned long addr; - mb(); -#if (BITS_PER_LONG == 64) - addr = (u64)aa->addrhi << 32 | aa->addrlo; -#else - addr = aa->addrlo; -#endif - return (void *)addr; -} - - struct ace_regs { u32 pad0[16]; /* PCI control registers */ @@ -143,11 +83,11 @@ u32 Mb2Hi; u32 TxPrd; u32 Mb3Hi; - u32 Mb3Lo; + u32 RxStdPrd; /* RxStdPrd */ u32 Mb4Hi; - u32 Mb4Lo; + u32 RxJumboPrd; /* RxJumboPrd */ u32 Mb5Hi; - u32 Mb5Lo; + u32 RxMiniPrd; u32 Mb6Hi; u32 Mb6Lo; u32 Mb7Hi; @@ -197,7 +137,7 @@ u32 IfIdx; u32 IfMtu; /* 0x660 */ u32 MaskInt; - u32 LnkState; + u32 GigLnkState; u32 FastLnkState; u32 pad16[4]; /* 0x670 */ u32 RxRetCsm; /* 0x680 */ @@ -208,6 +148,13 @@ u32 Window[0x200]; }; + +typedef struct { + u32 addrhi; + u32 addrlo; +} aceaddr; + + #define ACE_WINDOW_SIZE 0x800 #define ACE_JUMBO_MTU 9000 @@ -221,6 +168,7 @@ #define IN_INT 0x01 #define CLR_INT 0x02 +#define HW_RESET 0x08 #define BYTE_SWAP 0x10 #define WORD_SWAP 0x20 #define MASK_INTS 0x40 @@ -243,6 +191,13 @@ /* + * udelay() values for when clocking the eeprom + */ +#define ACE_SHORT_DELAY 1 +#define ACE_LONG_DELAY 2 + + +/* * Misc Config bits */ @@ -278,7 +233,10 @@ #define DMA_WRITE_MAX_128 0xa0 #define DMA_WRITE_MAX_256 0xc0 #define DMA_WRITE_MAX_1K 0xe0 +#define DMA_READ_WRITE_MASK 0xfc #define MEM_READ_MULTIPLE 0x00020000 +#define PCI_66MHZ 0x00080000 +#define PCI_32BIT 0x00100000 #define DMA_WRITE_ALL_ALIGN 0x00800000 #define READ_CMD_MEM 0x06000000 #define WRITE_CMD_MEM 0x70000000 @@ -288,9 +246,10 @@ * Mode status */ -#define ACE_BYTE_SWAP_DATA 0x10 +#define ACE_BYTE_SWAP_BD 0x02 +#define ACE_WORD_SWAP_BD 0x04 /* not actually used */ #define ACE_WARN 0x08 -#define ACE_WORD_SWAP 0x04 +#define ACE_BYTE_SWAP_DMA 0x10 #define ACE_NO_JUMBO_FRAG 0x200 #define ACE_FATAL 0x40000000 @@ -340,7 +299,7 @@ #define EVT_RING_SIZE (EVT_RING_ENTRIES * sizeof(struct event)) struct event { -#ifdef __LITTLE_ENDIAN +#ifdef __LITTLE_ENDIAN_BITFIELD u32 idx:12; u32 code:12; u32 evt:8; @@ -365,6 +324,7 @@ #define E_LNK_STATE 0x06 #define E_C_LINK_UP 0x01 #define E_C_LINK_DOWN 0x02 +#define E_C_LINK_10_100 0x03 #define E_ERROR 0x07 #define E_C_ERR_INVAL_CMD 0x01 @@ -385,7 +345,7 @@ #define CMD_RING_ENTRIES 64 struct cmd { -#ifdef __LITTLE_ENDIAN +#ifdef __LITTLE_ENDIAN_BITFIELD u32 idx:12; u32 code:12; u32 evt:8; @@ -416,6 +376,10 @@ #define C_C_PROMISC_DISABLE 0x02 #define C_LNK_NEGOTIATION 0x0b +#define C_C_NEGOTIATE_BOTH 0x00 +#define C_C_NEGOTIATE_GIG 0x01 +#define C_C_NEGOTIATE_10_100 0x02 + #define C_SET_MAC_ADDR 0x0c #define C_CLEAR_PROFILE 0x0d @@ -429,33 +393,30 @@ /* - * Descriptor types. + * Descriptor flags */ +#define BD_FLG_TCP_UDP_SUM 0x01 +#define BD_FLG_IP_SUM 0x02 +#define BD_FLG_END 0x04 +#define BD_FLG_JUMBO 0x10 +#define BD_FLG_MINI 0x1000 -#define DESC_TX 0x01 -#define DESC_RX 0x02 -#define DESC_END 0x04 -#define DESC_MORE 0x08 /* - * Control block flags - */ - -#define FLG_RX_TCP_UDP_SUM 0x01 -#define FLG_RX_IP_SUM 0x02 -#define FLG_RX_SPLIT_HDRS 0x04 -#define FLG_RX_NO_PSDO_HDR_SUM 0x08 -#define FLG_RNG_DISABLED 0x200 + * Ring Control block flags + */ +#define RCB_FLG_TCP_UDP_SUM 0x01 +#define RCB_FLG_IP_SUM 0x02 +#define RCB_FLG_VLAN_ASSIST 0x10 +#define RCB_FLG_COAL_INT_ONLY 0x20 +#define RCB_FLG_IEEE_SNAP_SUM 0x80 +#define RCB_FLG_EXT_RX_BD 0x100 +#define RCB_FLG_RNG_DISABLE 0x200 -/* - * Descriptor flags - */ -#define DFLG_RX_JUMBO 0x10 /* * TX ring */ - #define TX_RING_ENTRIES 128 #define TX_RING_SIZE (TX_RING_ENTRIES * sizeof(struct tx_desc)) #define TX_RING_BASE 0x3800 @@ -471,12 +432,16 @@ #if __LITTLE_ENDIAN u16 flags; u16 size; + u16 vlan; + u16 reserved; #else u16 size; u16 flags; + u16 reserved; + u16 vlan; #endif #endif - u32 nic_addr; + u32 vlanres; }; @@ -493,9 +458,6 @@ #define RX_RETURN_RING_SIZE (RX_MAX_RETURN_RING_ENTRIES * \ sizeof(struct rx_desc)) -#define RX_RING_THRESH 64 -#define RX_RING_JUMBO_THRESH 48 - struct rx_desc{ aceaddr addr; #ifdef __LITTLE_ENDIAN @@ -520,14 +482,14 @@ u16 tcp_udp_csum; #endif #ifdef __LITTLE_ENDIAN - u16 reserved; + u16 vlan; u16 err_flags; #else u16 err_flags; - u16 reserved; + u16 vlan; #endif - u32 nic_addr; - u32 pad[1]; + u32 reserved; + u32 opague; }; @@ -598,77 +560,170 @@ aceaddr stats2_ptr; }; + +struct ring_info { + struct sk_buff *skb; + dma_addr_t mapping; +}; + + /* - * Struct private for the AceNIC. + * struct ace_skb holding the rings of skb's. This is an awful lot of + * pointers, but I don't see any other smart mode to do this in an + * efficient manner ;-( */ +struct ace_skb +{ + struct ring_info tx_skbuff[TX_RING_ENTRIES]; + struct ring_info rx_std_skbuff[RX_STD_RING_ENTRIES]; + struct ring_info rx_mini_skbuff[RX_MINI_RING_ENTRIES]; + struct ring_info rx_jumbo_skbuff[RX_JUMBO_RING_ENTRIES]; +}; + +/* + * Struct private for the AceNIC. + * + * Elements are grouped so variables used by the tx handling goes + * together, and will go into the same cache lines etc. in order to + * avoid cache line contention between the rx and tx handling on SMP. + * + * Frequently accessed variables are put at the beginning of the + * struct to help the compiler generate better/shorter code. + */ struct ace_private { + struct ace_skb *skb; struct ace_regs *regs; /* register base */ - volatile __u32 *sgt; - struct sk_buff *pkt_buf; /* Receive buffer */ -/* - * The send ring is located in the shared memory window - */ - struct tx_desc *tx_ring; - struct rx_desc rx_std_ring[RX_STD_RING_ENTRIES]; - struct rx_desc rx_jumbo_ring[RX_JUMBO_RING_ENTRIES]; -#if 0 - struct rx_desc rx_mini_ring[RX_MINI_RING_ENTRIES]; -#endif - struct rx_desc rx_return_ring[RX_RETURN_RING_ENTRIES]; - struct event evt_ring[EVT_RING_ENTRIES]; + volatile int fw_running; + int version, fw_up, link; + int promisc, mcast_all; + /* + * The send ring is located in the shared memory window + */ struct ace_info *info; - struct sk_buff *tx_skbuff[TX_RING_ENTRIES]; - struct sk_buff *rx_std_skbuff[RX_STD_RING_ENTRIES]; - struct sk_buff *rx_jumbo_skbuff[RX_JUMBO_RING_ENTRIES]; - spinlock_t lock; + struct tx_desc *tx_ring; + dma_addr_t info_dma; + u32 tx_prd; + volatile u32 tx_full, tx_ret_csm; struct timer_list timer; - u32 cur_rx, tx_prd; - u32 dirty_rx, tx_ret_csm, dirty_event; - u32 rx_std_skbprd, rx_jumbo_skbprd; - u32 tx_full; - volatile u32 evt_prd - __attribute__ ((aligned (L1_CACHE_BYTES))); - volatile u32 rx_ret_prd - __attribute__ ((aligned (L1_CACHE_BYTES))); - volatile u32 tx_csm - __attribute__ ((aligned (L1_CACHE_BYTES))); - struct device *next + + unsigned long std_refill_busy __attribute__ ((aligned (L1_CACHE_BYTES))); + unsigned long mini_refill_busy, jumbo_refill_busy; + atomic_t cur_rx_bufs, + cur_mini_bufs, + cur_jumbo_bufs; + u32 rx_std_skbprd, rx_mini_skbprd, rx_jumbo_skbprd; + u32 cur_rx; + struct tq_struct immediate; + int bh_pending, jumbo; + /* + * These elements are allocated using consistent PCI dma memory. + */ + struct rx_desc *rx_std_ring; + struct rx_desc *rx_jumbo_ring; + struct rx_desc *rx_mini_ring; + struct rx_desc *rx_return_ring; + dma_addr_t rx_ring_base_dma; + + struct event *evt_ring; + dma_addr_t evt_ring_dma; + + volatile u32 *evt_prd, *rx_ret_prd, *tx_csm; + dma_addr_t evt_prd_dma, rx_ret_prd_dma, tx_csm_dma; + unsigned char *trace_buf; - int fw_running, fw_up, jumbo, promisc, mcast_all; - int version; - int flags; - u16 vendor; - u16 pci_command; struct pci_dev *pdev; -#if 0 - u8 pci_bus; - u8 pci_dev_fun; + struct net_device *next; + int board_idx; + u16 pci_command; + u8 pci_latency; + char name[48]; +#ifdef INDEX_DEBUG + spinlock_t debug_lock + __attribute__ ((aligned (L1_CACHE_BYTES)));; + u32 last_tx, last_std_rx, last_mini_rx; #endif - char name[24]; struct net_device_stats stats; }; + +static inline void set_aceaddr(aceaddr *aa, dma_addr_t addr) +{ + unsigned long baddr = (unsigned long) addr; +#if (BITS_PER_LONG == 64) + aa->addrlo = baddr & 0xffffffff; + aa->addrhi = baddr >> 32; +#else + /* Don't bother setting zero every time */ + aa->addrlo = baddr; +#endif + mb(); +} + + +#if 0 +static inline void *get_aceaddr(aceaddr *aa) +{ + unsigned long addr; + mb(); +#if (BITS_PER_LONG == 64) + addr = (u64)aa->addrhi << 32 | aa->addrlo; +#else + addr = aa->addrlo; +#endif + return (void *)addr; +} +#endif + + +static inline void ace_set_txprd(struct ace_regs *regs, + struct ace_private *ap, u32 value) +{ +#ifdef INDEX_DEBUG + unsigned long flags; + spin_lock_irqsave(&ap->debug_lock, flags); + writel(value, ®s->TxPrd); + if (value == ap->last_tx) + printk(KERN_ERR "AceNIC RACE ALERT! writing identical value " + "to tx producer (%i)\n", value); + ap->last_tx = value; + spin_unlock_irqrestore(&ap->debug_lock, flags); +#else + writel(value, ®s->TxPrd); +#endif + wmb(); +} + + /* * Prototypes */ -static int ace_init(struct device *dev, int board_idx); -static int ace_load_std_rx_ring(struct device *dev); -static int ace_load_jumbo_rx_ring(struct device *dev); -static int ace_flush_jumbo_rx_ring(struct device *dev); +static int ace_init(struct net_device *dev); +static void ace_load_std_rx_ring(struct ace_private *ap, int nr_bufs); +static void ace_load_mini_rx_ring(struct ace_private *ap, int nr_bufs); +static void ace_load_jumbo_rx_ring(struct ace_private *ap, int nr_bufs); static void ace_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static int ace_load_firmware(struct device *dev); -static int ace_open(struct device *dev); -static int ace_start_xmit(struct sk_buff *skb, struct device *dev); -static int ace_close(struct device *dev); +static int ace_load_firmware(struct net_device *dev); +static int ace_open(struct net_device *dev); +static int ace_start_xmit(struct sk_buff *skb, struct net_device *dev); +static int ace_close(struct net_device *dev); static void ace_timer(unsigned long data); +static void ace_bh(struct net_device *dev); static void ace_dump_trace(struct ace_private *ap); -static void ace_set_multicast_list(struct device *dev); -static int ace_change_mtu(struct device *dev, int new_mtu); -static int ace_set_mac_addr(struct device *dev, void *p); -static struct net_device_stats *ace_get_stats(struct device *dev); -static u8 read_eeprom_byte(struct ace_regs *regs, unsigned long offset); +static void ace_set_multicast_list(struct net_device *dev); +static int ace_change_mtu(struct net_device *dev, int new_mtu); +#ifdef SKB_RECYCLE +extern int ace_recycle(struct sk_buff *skb); +#endif +static int ace_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); +static int ace_set_mac_addr(struct net_device *dev, void *p); +static void ace_set_rxtx_parms(struct net_device *dev, int jumbo); +static int ace_allocate_descriptors(struct net_device *dev); +static void ace_free_descriptors(struct net_device *dev); +static void ace_init_cleanup(struct net_device *dev); +static struct net_device_stats *ace_get_stats(struct net_device *dev); +static int read_eeprom_byte(struct net_device *dev, unsigned long offset); #endif /* _ACENIC_H_ */ diff -urN v2.2.15/linux/drivers/net/acenic_firmware.h linux/drivers/net/acenic_firmware.h --- v2.2.15/linux/drivers/net/acenic_firmware.h Mon Aug 9 12:04:57 1999 +++ linux/drivers/net/acenic_firmware.h Wed Jun 7 14:26:43 2000 @@ -1,32 +1,41 @@ +#include +/* + * Declare these here even if Tigon I support is disabled to avoid + * the compiler complaining about undefined symbols. + */ +#define tigonFwReleaseMajor 0xc +#define tigonFwReleaseMinor 0x4 +#define tigonFwReleaseFix 0xb +#define tigonFwStartAddr 0x00004000 +#define tigonFwTextAddr 0x00004000 +#define tigonFwTextLen 0x11140 +#define tigonFwRodataAddr 0x00015140 +#define tigonFwRodataLen 0xac0 +#define tigonFwDataAddr 0x00015c20 +#define tigonFwDataLen 0x170 +#define tigonFwSbssAddr 0x00015d90 +#define tigonFwSbssLen 0x38 +#define tigonFwBssAddr 0x00015dd0 +#define tigonFwBssLen 0x2080 +u32 tigonFwText[]; +u32 tigonFwData[]; +u32 tigonFwRodata[]; +#ifndef CONFIG_ACENIC_OMIT_TIGON_I /* Generated by genfw.c */ -int tigonFwReleaseMajor = 0xc; -int tigonFwReleaseMinor = 0x3; -int tigonFwReleaseFix = 0xa; -u32 tigonFwStartAddr = 0x00004000; -u32 tigonFwTextAddr = 0x00004000; -int tigonFwTextLen = 0x10920; -u32 tigonFwRodataAddr = 0x00014920; -int tigonFwRodataLen = 0xaa0; -u32 tigonFwDataAddr = 0x000153e0; -int tigonFwDataLen = 0x150; -u32 tigonFwSbssAddr = 0x00015530; -int tigonFwSbssLen = 0x2c; -u32 tigonFwBssAddr = 0x00015560; -int tigonFwBssLen = 0x2080; u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] __initdata = { 0x10000003, 0x0, 0xd, 0xd, 0x3c1d0001, -0x8fbd5414, 0x3a0f021, 0x3c100000, 0x26104000, +0x8fbd5c54, 0x3a0f021, 0x3c100000, 0x26104000, 0xc00100c, 0x0, 0xd, 0x27bdffd8, 0x3c1cc000, 0x3c1b0013, 0x377bd800, 0xd021, 0x3c170013, 0x36f75418, 0x2e02021, 0x340583e8, -0xafbf0024, 0xc00248c, 0xafb00020, 0xc0023ec, -0x0, 0x3c040001, 0x24844984, 0x24050001, -0x2e03021, 0x3821, 0x3c100001, 0x261075e0, -0xafb00010, 0xc002407, 0xafbb0014, 0x3c02000f, +0xafbf0024, 0xc002488, 0xafb00020, 0xc0023e8, +0x0, 0x3c040001, 0x248451a4, 0x24050001, +0x2e03021, 0x3821, 0x3c100001, 0x26107e50, +0xafb00010, 0xc002403, 0xafbb0014, 0x3c02000f, 0x3442ffff, 0x2021024, 0x362102b, 0x10400009, -0x24050003, 0x3c040001, 0x24844990, 0x2003021, -0x3603821, 0x3c020010, 0xafa20010, 0xc002407, +0x24050003, 0x3c040001, 0x248451b0, 0x2003021, +0x3603821, 0x3c020010, 0xafa20010, 0xc002403, 0xafa00014, 0x2021, 0x3405c000, 0x3c010001, 0x370821, 0xa02083b0, 0x3c010001, 0x370821, 0xa02083b2, 0x3c010001, 0x370821, 0xa02083b3, @@ -63,17 +72,17 @@ 0x0, 0x8ee20450, 0x8ee30454, 0xaee304fc, 0x8ee204fc, 0x2442e000, 0x2c422001, 0x1440000d, 0x26e40030, 0x8ee20450, 0x8ee30454, 0x3c040001, -0x2484499c, 0x3c050001, 0xafa00010, 0xafa00014, -0x8ee704fc, 0x34a5f000, 0xc002407, 0x603021, -0x26e40030, 0xc00248c, 0x24050400, 0x27440080, -0xc00248c, 0x24050080, 0x26e4777c, 0xc00248c, +0x248451bc, 0x3c050001, 0xafa00010, 0xafa00014, +0x8ee704fc, 0x34a5f000, 0xc002403, 0x603021, +0x26e40030, 0xc002488, 0x24050400, 0x27440080, +0xc002488, 0x24050080, 0x26e4777c, 0xc002488, 0x24050400, 0x8f42025c, 0x26e40094, 0xaee20060, 0x8f420260, 0x27450200, 0x24060008, 0xaee20068, -0x24020006, 0xc00249e, 0xaee20064, 0x3c023b9a, +0x24020006, 0xc00249a, 0xaee20064, 0x3c023b9a, 0x3442ca00, 0x2021, 0x24030002, 0xaee30074, 0xaee30070, 0xaee2006c, 0x240203e8, 0xaee20104, 0x24020001, 0xaee30100, 0xaee2010c, 0x3c030001, -0x641821, 0x906353e0, 0x2e41021, 0x24840001, +0x641821, 0x90635c20, 0x2e41021, 0x24840001, 0xa043009c, 0x2c82000f, 0x1440fff8, 0x0, 0x8f820040, 0x2e41821, 0x24840001, 0x21702, 0x24420030, 0xa062009c, 0x2e41021, 0xa040009c, @@ -84,10 +93,10 @@ 0x96e3047a, 0x96e2046a, 0x14620022, 0x3c020700, 0x8ee204c0, 0x24030001, 0xa2e34e20, 0x34420e00, 0xaee204c0, 0x8f420218, 0x30420100, 0x10400005, -0x0, 0x3c020001, 0x2442e178, 0x800111d, -0x21100, 0x3c020001, 0x2442d36c, 0x21100, +0x0, 0x3c020001, 0x2442e168, 0x800111d, +0x21100, 0x3c020001, 0x2442d35c, 0x21100, 0x21182, 0x3c030800, 0x431025, 0x3c010001, -0xac221238, 0x3c020001, 0x2442f690, 0x21100, +0xac221238, 0x3c020001, 0x2442f680, 0x21100, 0x21182, 0x3c030800, 0x431025, 0x3c010001, 0xac221278, 0x8ee20000, 0x34424000, 0x8001238, 0xaee20000, 0x34423000, 0xafa20018, 0x8ee20608, @@ -119,9 +128,9 @@ 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c, -0xaee90608, 0x3c040001, 0x248449a8, 0xafa00010, +0xaee90608, 0x3c040001, 0x248451c8, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, -0xc002407, 0x34a5f000, 0x8001223, 0x0, +0xc002403, 0x34a5f000, 0x8001223, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, @@ -145,29 +154,29 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x14c0001b, 0x0, -0x3c040001, 0x248449b0, 0xafa00010, 0xafa00014, -0x8ee60608, 0x8f470228, 0x3c050009, 0xc002407, +0x3c040001, 0x248451d0, 0xafa00010, 0xafa00014, +0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, -0x8001223, 0x8ee201b0, 0x3c040001, 0x248449bc, +0x8001223, 0x8ee201b0, 0x3c040001, 0x248451dc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, -0xc002407, 0x34a5f005, 0x8ee201ac, 0x24420001, +0xc002403, 0x34a5f005, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20160, 0x3c040001, -0x248449c8, 0x3405f001, 0x24420001, 0xaee20160, +0x248451e8, 0x3405f001, 0x24420001, 0xaee20160, 0x8ee20160, 0x3021, 0x3821, 0xafa00010, -0xc002407, 0xafa00014, 0x8001238, 0x0, -0x3c020001, 0x2442f5b8, 0x21100, 0x21182, +0xc002403, 0xafa00014, 0x8001238, 0x0, +0x3c020001, 0x2442f5a8, 0x21100, 0x21182, 0x431025, 0x3c010001, 0xac221278, 0x96e2045a, 0x30420003, 0x10400025, 0x3c050fff, 0x8ee204c8, 0x34a5ffff, 0x34420a00, 0xaee204c8, 0x8ee304c8, -0x3c040001, 0x248449d4, 0x24020001, 0xa2e204ec, +0x3c040001, 0x248451f4, 0x24020001, 0xa2e204ec, 0xa2e204ed, 0x3c020002, 0x621825, 0x3c020001, -0x2442a3a0, 0x451024, 0x21082, 0xaee304c8, +0x2442a390, 0x451024, 0x21082, 0xaee304c8, 0x3c030800, 0x431025, 0x3c010001, 0xac221220, -0x3c020001, 0x2442ade4, 0x451024, 0x21082, +0x3c020001, 0x2442add4, 0x451024, 0x21082, 0x431025, 0x3c010001, 0xac221280, 0x96e6045a, -0x3821, 0x24050011, 0xafa00010, 0xc002407, +0x3821, 0x24050011, 0xafa00010, 0xc002403, 0xafa00014, 0x8001268, 0x0, 0x3c020001, -0x2442a9e4, 0x21100, 0x21182, 0x3c030800, +0x2442a9d4, 0x21100, 0x21182, 0x3c030800, 0x431025, 0x3c010001, 0xac221280, 0x96e2046a, 0x30420010, 0x14400009, 0x0, 0x96e2047a, 0x30420010, 0x10400112, 0x0, 0x96e2046a, @@ -202,8 +211,8 @@ 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c, 0xaee90608, 0x3c040001, -0x248449a8, 0xafa00010, 0xafa00014, 0x8ee60608, -0x8f470228, 0x3c050009, 0xc002407, 0x34a5f000, +0x248451c8, 0xafa00010, 0xafa00014, 0x8ee60608, +0x8f470228, 0x3c050009, 0xc002403, 0x34a5f000, 0x800136d, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, @@ -227,18 +236,18 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, -0x14c0001b, 0x0, 0x3c040001, 0x248449b0, +0x14c0001b, 0x0, 0x3c040001, 0x248451d0, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, -0x3c050009, 0xc002407, 0x34a5f001, 0x8ee201b0, +0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 0x800136d, 0x8ee201b0, -0x3c040001, 0x248449bc, 0xafa00014, 0x8ee60608, -0x8f470228, 0x3c050009, 0xc002407, 0x34a5f005, +0x3c040001, 0x248451dc, 0xafa00014, 0x8ee60608, +0x8f470228, 0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, -0x8ee20160, 0x3c040001, 0x248449c8, 0x3405f002, +0x8ee20160, 0x3c040001, 0x248451e8, 0x3405f002, 0x24420001, 0xaee20160, 0x8ee20160, 0x3021, -0x3821, 0xafa00010, 0xc002407, 0xafa00014, -0x96e6047a, 0x96e7046a, 0x3c040001, 0x248449e0, -0x24050012, 0xafa00010, 0xc002407, 0xafa00014, +0x3821, 0xafa00010, 0xc002403, 0xafa00014, +0x96e6047a, 0x96e7046a, 0x3c040001, 0x24845200, +0x24050012, 0xafa00010, 0xc002403, 0xafa00014, 0xc004500, 0x0, 0xc002318, 0x0, 0x3c060001, 0x34c63800, 0xaee00608, 0xaf400228, 0xaf40022c, 0x96e30458, 0x8ee40000, 0x3c0512d8, @@ -280,8 +289,8 @@ 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c, 0xaee90608, 0x3c040001, -0x248449a8, 0xafa00010, 0xafa00014, 0x8ee60608, -0x8f470228, 0x3c050009, 0xc002407, 0x34a5f000, +0x248451c8, 0xafa00010, 0xafa00014, 0x8ee60608, +0x8f470228, 0x3c050009, 0xc002403, 0x34a5f000, 0x80014a5, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, @@ -305,12 +314,12 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, -0x14c0001b, 0x0, 0x3c040001, 0x248449b0, +0x14c0001b, 0x0, 0x3c040001, 0x248451d0, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, -0x3c050009, 0xc002407, 0x34a5f001, 0x8ee201b0, +0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 0x80014a5, 0x8ee201b0, -0x3c040001, 0x248449bc, 0xafa00014, 0x8ee60608, -0x8f470228, 0x3c050009, 0xc002407, 0x34a5f005, +0x3c040001, 0x248451dc, 0xafa00014, 0x8ee60608, +0x8f470228, 0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20154, 0x24420001, 0xaee20154, 0xc0014dc, 0x8ee20154, 0x8f8200a0, 0x30420004, 0x1440fffd, @@ -322,7 +331,7 @@ 0x8ee20178, 0x24420001, 0xaee20178, 0x8ee20178, 0x8f8200d8, 0x8f8300d4, 0x431023, 0xaee2726c, 0x8ee2726c, 0x1c400003, 0x3c030001, 0x431021, -0xaee2726c, 0xc004068, 0x0, 0xc004440, +0xaee2726c, 0xc004064, 0x0, 0xc004440, 0xaf800228, 0x8fbf0024, 0x8fb00020, 0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 0x3e00008, 0x0, 0x0, 0x0, 0x2402002c, @@ -331,7 +340,7 @@ 0xaee07b8c, 0xaee07b84, 0x3c010001, 0x370821, 0xac2083bc, 0x3c010001, 0x370821, 0x3e00008, 0xa02083b9, 0x27bdffd8, 0xafbf0024, 0xafb00020, -0x8f820054, 0x3c030001, 0x8c635498, 0x24420067, +0x8f820054, 0x3c030001, 0x8c635cd8, 0x24420067, 0x1060000d, 0xaf820058, 0x3c020001, 0x571021, 0x904283b8, 0x10400005, 0x3c030200, 0x3c010001, 0x370821, 0x8001503, 0xa02083b8, 0x8ee20000, @@ -349,8 +358,8 @@ 0x0, 0x3c030001, 0x771821, 0x8c6383d4, 0x8f8200b4, 0x1462007c, 0x0, 0x3c070001, 0xf73821, 0x8ce783d0, 0x8f8200b0, 0x3c040001, -0x24844a50, 0xafa00014, 0xafa20010, 0x8f8600b0, -0x3c050005, 0xc002407, 0x34a50900, 0x8f82011c, +0x24845270, 0xafa00014, 0xafa20010, 0x8f8600b0, +0x3c050005, 0xc002403, 0x34a50900, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001, 0xaf8200b0, 0xaf830104, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, @@ -377,12 +386,12 @@ 0xac820000, 0x24020001, 0xac820004, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201e4, 0x3c070001, 0xf73821, 0x8ce783d0, 0x24420001, -0xaee201e4, 0x8ee201e4, 0x3c040001, 0x24844a5c, +0xaee201e4, 0x8ee201e4, 0x3c040001, 0x2484527c, 0x80015bd, 0xafa00010, 0x8f820104, 0x3c010001, 0x370821, 0xac2283d0, 0x8f8200b4, 0x3c070001, -0xf73821, 0x8ce783d0, 0x3c040001, 0x24844a64, +0xf73821, 0x8ce783d0, 0x3c040001, 0x24845284, 0x3c010001, 0x370821, 0xac2283d4, 0xafa00010, -0xafa00014, 0x8f8600b0, 0x3c050005, 0xc002407, +0xafa00014, 0x8f8600b0, 0x3c050005, 0xc002403, 0x34a50900, 0x80015cc, 0x0, 0x8f820104, 0x3c010001, 0x370821, 0xac2283d0, 0x8f8200b4, 0x3c010001, 0x370821, 0xac2283d4, 0x8ee27274, @@ -413,9 +422,9 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600000b, 0x24100001, -0x8ee204e4, 0x3c040001, 0x24844a6c, 0xafa00014, +0x8ee204e4, 0x3c040001, 0x2484528c, 0xafa00014, 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, -0xc002407, 0x34a5f006, 0x16000003, 0x24020001, +0xc002403, 0x34a5f006, 0x16000003, 0x24020001, 0x8001650, 0xa2e204f4, 0x8ee20170, 0x24420001, 0xaee20170, 0x8ee20170, 0x8ee204e4, 0xa2e004f4, 0xaee004f0, 0xaee07274, 0xaee204f8, 0x8ee20e1c, @@ -443,8 +452,8 @@ 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600000b, 0x24100001, 0x8ee2724c, 0x3c040001, -0x24844a78, 0xafa00014, 0xafa20010, 0x8ee6724c, -0x8f470280, 0x3c050009, 0xc002407, 0x34a5f008, +0x24845298, 0xafa00014, 0xafa20010, 0x8ee6724c, +0x8f470280, 0x3c050009, 0xc002403, 0x34a5f008, 0x56000001, 0xaee00e1c, 0x8ee20174, 0x24420001, 0xaee20174, 0x8ee20174, 0x8ee24e24, 0x10400019, 0x0, 0xaee04e24, 0x8f820040, 0x30420001, @@ -554,11 +563,11 @@ 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x14620003, 0x3c050009, 0x800197c, 0x24100001, 0x3c040001, -0x24844a84, 0xafa00010, 0xafa00014, 0x8f860120, +0x248452a4, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x800187b, 0x34a5f011, 0x3c040001, -0x24844a90, 0xafa00010, 0xafa00014, 0x8f860120, -0x8f870124, 0x34a5f010, 0xc002407, 0x8021, -0x800197c, 0x0, 0x3c040001, 0x24844a9c, +0x248452b0, 0xafa00010, 0xafa00014, 0x8f860120, +0x8f870124, 0x34a5f010, 0xc002403, 0x8021, +0x800197c, 0x0, 0x3c040001, 0x248452bc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0x8001975, 0x34a5f00f, 0x8ee20608, 0x8f430228, 0x24420001, 0x304900ff, 0x512300e2, 0xafa00010, @@ -589,8 +598,8 @@ 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x5600000c, 0xaee90608, -0x3c040001, 0x24844aa8, 0xafa00010, 0xafa00014, -0x8ee60608, 0x8f470228, 0x3c050009, 0xc002407, +0x3c040001, 0x248452c8, 0xafa00010, 0xafa00014, +0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f000, 0x800197c, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, @@ -615,18 +624,18 @@ 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600001d, 0x24100001, 0x3c040001, -0x24844ab0, 0xafa00010, 0xafa00014, 0x8ee60608, -0x8f470228, 0x3c050009, 0xc002407, 0x34a5f001, +0x248452d0, 0xafa00010, 0xafa00014, 0x8ee60608, +0x8f470228, 0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 0x800197c, -0x8ee201b0, 0x3c040001, 0x24844abc, 0xafa00014, +0x8ee201b0, 0x3c040001, 0x248452dc, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, 0x34a5f005, -0xc002407, 0x0, 0x8ee201ac, 0x8021, +0xc002403, 0x0, 0x8ee201ac, 0x8021, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x1200000c, 0x24020001, 0x3c010001, 0x370821, 0xa02083b0, 0x8f420238, 0x8ee30158, 0x24630001, 0xaee30158, 0x8ee30158, 0x800198c, 0xaee27278, 0x24020001, 0x3c010001, 0x370821, 0xa02283b0, 0x3c020001, -0x8c425498, 0x10400187, 0x0, 0x8ee27b84, +0x8c425cd8, 0x10400187, 0x0, 0x8ee27b84, 0x24430001, 0x284200c9, 0x144001a4, 0xaee37b84, 0x8ee204d4, 0x30420002, 0x14400119, 0xaee07b84, 0x8ee204d4, 0x3c030600, 0x34631000, 0x34420002, @@ -690,13 +699,13 @@ 0x56000006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x10620022, 0x0, 0x3c040001, -0x24844a84, 0xafa00010, 0xafa00014, 0x8f860120, -0x8f870124, 0x3c050009, 0xc002407, 0x34a5f011, -0x8001aad, 0x0, 0x3c040001, 0x24844a90, +0x248452a4, 0xafa00010, 0xafa00014, 0x8f860120, +0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, +0x8001aad, 0x0, 0x3c040001, 0x248452b0, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, -0xc002407, 0x34a5f010, 0x8001aad, 0x0, -0x3c040001, 0x24844a9c, 0xafa00014, 0x8ee60608, -0x8f470228, 0x3c050009, 0xc002407, 0x34a5f00f, +0xc002403, 0x34a5f010, 0x8001aad, 0x0, +0x3c040001, 0x248452bc, 0xafa00014, 0x8ee60608, +0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee2015c, 0x24420001, 0xaee2015c, 0x8ee2015c, 0x8ee204d4, 0x30420001, 0x10400055, 0x0, @@ -732,7 +741,7 @@ 0xaf820044, 0x8f820044, 0x34420040, 0xaf820044, 0x8ee27b88, 0x24430001, 0x28421389, 0x14400005, 0xaee37b88, 0x8f820044, 0x38420020, 0xaf820044, -0xaee07b88, 0xc0045c1, 0x0, 0x8fbf0024, +0xaee07b88, 0xc004603, 0x0, 0x8fbf0024, 0x8fb00020, 0x3e00008, 0x27bd0028, 0x27bdffb8, 0xafbf0044, 0xafb60040, 0xafb5003c, 0xafb40038, 0xafb30034, 0xafb20030, 0xafb1002c, 0xafb00028, @@ -742,18 +751,18 @@ 0xaee2016c, 0x80022f4, 0x8ee2016c, 0x32c20001, 0x10400004, 0x24020001, 0xaf820064, 0x80022f4, 0x0, 0x32c20002, 0x1440000c, 0x3c050003, -0x3c040001, 0x24844b34, 0x34a50001, 0x2c03021, -0x3821, 0xafa00010, 0xc002407, 0xafa00014, +0x3c040001, 0x24845354, 0x34a50001, 0x2c03021, +0x3821, 0xafa00010, 0xc002403, 0xafa00014, 0x2402fff8, 0x80022f4, 0xaf820064, 0x8f43022c, 0x8f42010c, 0x5062000c, 0xafa00010, 0x8f42022c, 0x21080, 0x5a1021, 0x8c420300, 0xafa20020, 0x8f42022c, 0x24070001, 0x24420001, 0x3042003f, -0x8001b80, 0xaf42022c, 0x3c040001, 0x24844b40, +0x8001b80, 0xaf42022c, 0x3c040001, 0x24845360, 0xafa00014, 0x8f46022c, 0x8f47010c, 0x3c050003, -0xc002407, 0x34a5f01f, 0x3821, 0x14e00003, +0xc002403, 0x34a5f01f, 0x3821, 0x14e00003, 0x0, 0x80022ed, 0xaf960064, 0x93a20020, 0x2443ffff, 0x2c620011, 0x10400658, 0x31080, -0x3c010001, 0x220821, 0x8c224bf8, 0x400008, +0x3c010001, 0x220821, 0x8c225418, 0x400008, 0x0, 0x8fa20020, 0x30420fff, 0xaee20e0c, 0x8f820060, 0x34420200, 0xaf820060, 0x8ee20118, 0x24420001, 0xaee20118, 0x80022e8, 0x8ee20118, @@ -769,8 +778,8 @@ 0x8f840054, 0x41442, 0x41c82, 0x431021, 0x41cc2, 0x431023, 0x41d02, 0x431021, 0x41d42, 0x431023, 0x8001bd0, 0xaee20078, -0x3c040001, 0x24844b4c, 0xafa00014, 0x8fa60020, -0x3c050003, 0xc002407, 0x34a50004, 0x8ee20110, +0x3c040001, 0x2484536c, 0xafa00014, 0x8fa60020, +0x3c050003, 0xc002403, 0x34a50004, 0x8ee20110, 0x24420001, 0xaee20110, 0x80022e8, 0x8ee20110, 0x27440212, 0xc0022fe, 0x24050006, 0x3049001f, 0x920c0, 0x2e41021, 0x9442727c, 0x30424000, @@ -785,8 +794,8 @@ 0x2c820080, 0x1440fff8, 0x410c0, 0x4c10010, 0x618c0, 0x610c0, 0x571821, 0x8c63737c, 0x571021, 0xafa30010, 0x8c427380, 0x3c040001, -0x24844b58, 0xafa20014, 0x8f470214, 0x3c050003, -0xc002407, 0x34a50013, 0x8001c90, 0x3c020800, +0x24845378, 0xafa20014, 0x8f470214, 0x3c050003, +0xc002403, 0x34a50013, 0x8001c90, 0x3c020800, 0x97440212, 0x771021, 0xa444737e, 0x8f440214, 0x771021, 0x2e31821, 0xac447380, 0x34028000, 0xa462737c, 0x910c0, 0x2e21021, 0x8001c79, @@ -803,8 +812,8 @@ 0x24840001, 0x2c820080, 0x1440fff8, 0x410c0, 0x4c10023, 0x618c0, 0x910c0, 0x571821, 0x8c63727c, 0x571021, 0xafa30010, 0x8c427280, -0x3c040001, 0x24844b64, 0xafa20014, 0x8f470214, -0x3c050003, 0xc002407, 0x34a5f017, 0x8001c90, +0x3c040001, 0x24845384, 0xafa20014, 0x8f470214, +0x3c050003, 0xc002403, 0x34a5f017, 0x8001c90, 0x3c020800, 0x8f430210, 0xb71021, 0xac43777c, 0x8f430214, 0xb71021, 0xac437780, 0x3c020001, 0x571021, 0x8c4283b4, 0x24420001, 0x3c010001, @@ -878,14 +887,14 @@ 0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, -0x10620022, 0x0, 0x3c040001, 0x24844b70, +0x10620022, 0x0, 0x3c040001, 0x24845390, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, -0x3c050009, 0xc002407, 0x34a5f011, 0x8001da0, -0x0, 0x3c040001, 0x24844b7c, 0xafa00014, -0x8f860120, 0x8f870124, 0x3c050009, 0xc002407, +0x3c050009, 0xc002403, 0x34a5f011, 0x8001da0, +0x0, 0x3c040001, 0x2484539c, 0xafa00014, +0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, 0x8001da0, 0x0, 0x3c040001, -0x24844b88, 0xafa00014, 0x8ee60608, 0x8f470228, -0x3c050009, 0xc002407, 0x34a5f00f, 0x8ee201ac, +0x248453a8, 0xafa00014, 0x8ee60608, 0x8f470228, +0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20124, 0x24420001, 0xaee20124, 0x8001f97, 0x8ee20124, 0x27440212, 0xc0022fe, 0x24050006, 0x3049001f, @@ -899,9 +908,9 @@ 0x1221004, 0x21027, 0x621824, 0xaf830228, 0x910c0, 0x2e21821, 0x3402c000, 0x8001e4e, 0xa462727c, 0x8f420214, 0xafa20010, 0x910c0, -0x571021, 0x8c42727c, 0x3c040001, 0x24844b94, +0x571021, 0x8c42727c, 0x3c040001, 0x248453b4, 0x3c050003, 0xafa20014, 0x8f470210, 0x34a5f01c, -0xc002407, 0x1203021, 0x8001e83, 0x3c020800, +0xc002403, 0x1203021, 0x8001e83, 0x3c020800, 0xb71021, 0x9443727e, 0x97420212, 0x14620019, 0x918c0, 0xb71021, 0x8c437280, 0x8f420214, 0x14620014, 0x918c0, 0x2e51021, 0x9447727c, @@ -927,9 +936,9 @@ 0x910c0, 0x2e41821, 0x3402c000, 0x15000015, 0xa462737c, 0x910c0, 0x2e21821, 0x34028000, 0x8001e4e, 0xa462727c, 0x571021, 0x8c42727c, -0x3c040001, 0x24844ba0, 0x3c050003, 0xafa20010, +0x3c040001, 0x248453c0, 0x3c050003, 0xafa20010, 0x710c0, 0x571021, 0x8c42737c, 0x34a5001e, -0x1203021, 0xc002407, 0xafa20014, 0x8001e83, +0x1203021, 0xc002403, 0xafa20014, 0x8001e83, 0x3c020800, 0x2021, 0x428c0, 0xb71021, 0x9443777e, 0x97420212, 0x5462002b, 0x24840001, 0xb71021, 0x8c437780, 0x8f420214, 0x54620026, @@ -937,11 +946,11 @@ 0x2442ffff, 0x3c010001, 0x370821, 0xac2283b4, 0x3c020001, 0x571021, 0x8c4283b4, 0x809021, 0x242102b, 0x1040000e, 0x24b1777c, 0x24b07784, -0x2f02021, 0x2f12821, 0xc002494, 0x24060008, +0x2f02021, 0x2f12821, 0xc002490, 0x24060008, 0x26310008, 0x3c020001, 0x571021, 0x8c4283b4, 0x26520001, 0x242102b, 0x1440fff5, 0x26100008, 0x3c040001, 0x972021, 0x8c8483b4, 0x24050008, -0x420c0, 0x2484777c, 0xc00248c, 0x2e42021, +0x420c0, 0x2484777c, 0xc002488, 0x2e42021, 0x8001e83, 0x3c020800, 0x2c820080, 0x1440ffcf, 0x428c0, 0x3c020800, 0x34422000, 0xafa20018, 0x8ee20608, 0x8f430228, 0x24420001, 0x304a00ff, @@ -1003,14 +1012,14 @@ 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x10620022, -0x0, 0x3c040001, 0x24844b70, 0xafa00010, +0x0, 0x3c040001, 0x24845390, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, -0xc002407, 0x34a5f011, 0x8001f93, 0x0, -0x3c040001, 0x24844b7c, 0xafa00014, 0x8f860120, -0x8f870124, 0x3c050009, 0xc002407, 0x34a5f010, -0x8001f93, 0x0, 0x3c040001, 0x24844b88, +0xc002403, 0x34a5f011, 0x8001f93, 0x0, +0x3c040001, 0x2484539c, 0xafa00014, 0x8f860120, +0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, +0x8001f93, 0x0, 0x3c040001, 0x248453a8, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, -0xc002407, 0x34a5f00f, 0x8ee201ac, 0x24420001, +0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20128, 0x24420001, 0xaee20128, 0x8ee20128, 0x8ee20164, 0x24420001, 0xaee20164, 0x80022e8, 0x8ee20164, 0x8fa20020, @@ -1020,8 +1029,8 @@ 0x8f820228, 0xaee204dc, 0x2402ffff, 0xaf820228, 0x24020001, 0x8001fbe, 0xa2e204d8, 0x92e204d8, 0x5040000c, 0xa2e004d8, 0x8ee204dc, 0xaf820228, -0x8001fbe, 0xa2e004d8, 0x3c040001, 0x24844ba8, -0xafa00014, 0x8fa60020, 0x3c050003, 0xc002407, +0x8001fbe, 0xa2e004d8, 0x3c040001, 0x248453c8, +0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f009, 0x8ee2013c, 0x24420001, 0xaee2013c, 0x80022e8, 0x8ee2013c, 0x8fa20020, 0x21200, 0x22502, 0x24020001, 0x10820005, 0x24020002, @@ -1031,8 +1040,8 @@ 0x370821, 0xa02283b2, 0x8001fea, 0xaee40108, 0x8f820220, 0x3c0308ff, 0x3463fff7, 0x431024, 0xaf820220, 0x3c010001, 0x370821, 0xa02083b2, -0x8001fea, 0xaee40108, 0x3c040001, 0x24844bb4, -0xafa00014, 0x8fa60020, 0x3c050003, 0xc002407, +0x8001fea, 0xaee40108, 0x3c040001, 0x248453d4, +0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f00a, 0x8ee2012c, 0x24420001, 0xaee2012c, 0x80022e8, 0x8ee2012c, 0x8fa20020, 0x21200, 0x21d02, 0x24020001, 0x10620005, 0x24020002, @@ -1043,27 +1052,27 @@ 0x571021, 0x904283b2, 0x3c010001, 0x370821, 0x1440000e, 0xa02083b3, 0x8f820220, 0x3c0308ff, 0x3463fff7, 0x431024, 0x8002018, 0xaf820220, -0x3c040001, 0x24844bc0, 0xafa00014, 0x8fa60020, -0x3c050003, 0xc002407, 0x34a5f00b, 0x8ee20114, +0x3c040001, 0x248453e0, 0xafa00014, 0x8fa60020, +0x3c050003, 0xc002403, 0x34a5f00b, 0x8ee20114, 0x24420001, 0xaee20114, 0x80022e8, 0x8ee20114, -0x27840208, 0x27450200, 0xc00249e, 0x24060008, -0x26e40094, 0x27450200, 0xc00249e, 0x24060008, +0x27840208, 0x27450200, 0xc00249a, 0x24060008, +0x26e40094, 0x27450200, 0xc00249a, 0x24060008, 0x8ee20134, 0x24420001, 0xaee20134, 0x80022e8, -0x8ee20134, 0x8f460248, 0x2021, 0xc004fa8, +0x8ee20134, 0x8f460248, 0x2021, 0xc005108, 0x24050004, 0x8ee20130, 0x24420001, 0xaee20130, 0x80022e8, 0x8ee20130, 0x8ef301cc, 0x8ef401d0, 0x8ef501d8, 0x8ee20140, 0x26e40030, 0x24420001, 0xaee20140, 0x8ef00140, 0x8ef10074, 0x8ef20070, -0xc00248c, 0x24050400, 0xaef301cc, 0xaef401d0, +0xc002488, 0x24050400, 0xaef301cc, 0xaef401d0, 0xaef501d8, 0xaef00140, 0xaef10074, 0xaef20070, 0x8f42025c, 0x26e40094, 0xaee20060, 0x8f420260, 0x27450200, 0x24060008, 0xaee20068, 0x24020006, -0xc00249e, 0xaee20064, 0x3c023b9a, 0x3442ca00, +0xc00249a, 0xaee20064, 0x3c023b9a, 0x3442ca00, 0xaee2006c, 0x240203e8, 0x24040002, 0x24030001, 0xaee20104, 0xaee40100, 0xaee3010c, 0x8f820220, 0x30420008, 0x10400004, 0x0, 0xaee30108, 0x8002061, 0x2021, 0xaee40108, 0x2021, -0x3c030001, 0x641821, 0x906353f0, 0x2e41021, +0x3c030001, 0x641821, 0x90635c30, 0x2e41021, 0x24840001, 0xa043009c, 0x2c82000f, 0x1440fff8, 0x0, 0x8f820040, 0x2e41821, 0x24840001, 0x21702, 0x24420030, 0xa062009c, 0x2e41021, @@ -1143,24 +1152,24 @@ 0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, -0x10620022, 0x0, 0x3c040001, 0x24844b70, +0x10620022, 0x0, 0x3c040001, 0x24845390, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, -0x3c050009, 0xc002407, 0x34a5f011, 0x80021c4, -0x0, 0x3c040001, 0x24844b7c, 0xafa00014, -0x8f860120, 0x8f870124, 0x3c050009, 0xc002407, +0x3c050009, 0xc002403, 0x34a5f011, 0x80021c4, +0x0, 0x3c040001, 0x2484539c, 0xafa00014, +0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, 0x80021c4, 0x0, 0x3c040001, -0x24844b88, 0xafa00014, 0x8ee60608, 0x8f470228, -0x3c050009, 0xc002407, 0x34a5f00f, 0x8ee201ac, +0x248453a8, 0xafa00014, 0x8ee60608, 0x8f470228, +0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20120, 0x24420001, 0xaee20120, 0x8ee20120, 0x8ee20168, 0x24420001, 0xaee20168, 0x80022e8, 0x8ee20168, 0x8f42025c, 0x26e40094, 0xaee20060, 0x8f420260, -0x27450200, 0x24060008, 0xc00249e, 0xaee20068, +0x27450200, 0x24060008, 0xc00249a, 0xaee20068, 0x8f820220, 0x30420008, 0x14400002, 0x24020001, 0x24020002, 0xaee20108, 0x8ee2011c, 0x24420001, 0xaee2011c, 0x80022e8, 0x8ee2011c, 0x3c040001, -0x24844bcc, 0xafa00010, 0xafa00014, 0x8fa60020, -0x3c050003, 0xc002407, 0x34a5f00f, 0x93a20020, +0x248453ec, 0xafa00010, 0xafa00014, 0x8fa60020, +0x3c050003, 0xc002403, 0x34a5f00f, 0x93a20020, 0x3c030700, 0x34631000, 0x431025, 0xafa20018, 0x8ee20608, 0x8f430228, 0x24420001, 0x304900ff, 0x512300e2, 0xafa00010, 0x8ee20608, 0x210c0, @@ -1190,9 +1199,9 @@ 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, -0x54e0000c, 0xaee90608, 0x3c040001, 0x24844bd4, +0x54e0000c, 0xaee90608, 0x3c040001, 0x248453f4, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, -0x3c050009, 0xc002407, 0x34a5f000, 0x80022e0, +0x3c050009, 0xc002403, 0x34a5f000, 0x80022e0, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, @@ -1216,12 +1225,12 @@ 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x14e0001b, -0x0, 0x3c040001, 0x24844bdc, 0xafa00010, +0x0, 0x3c040001, 0x248453fc, 0xafa00010, 0xafa00014, 0x8ee60608, 0x8f470228, 0x3c050009, -0xc002407, 0x34a5f001, 0x8ee201b0, 0x24420001, +0xc002403, 0x34a5f001, 0x8ee201b0, 0x24420001, 0xaee201b0, 0x80022e0, 0x8ee201b0, 0x3c040001, -0x24844be8, 0xafa00014, 0x8ee60608, 0x8f470228, -0x3c050009, 0xc002407, 0x34a5f005, 0x8ee201ac, +0x24845408, 0xafa00014, 0x8ee60608, 0x8f470228, +0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee20150, 0x24420001, 0xaee20150, 0x8ee20150, 0x8ee20160, 0x24420001, 0xaee20160, 0x8ee20160, 0x8f43022c, @@ -1237,7 +1246,7 @@ 0x24c60001, 0x2cc20008, 0x1440fff7, 0x73842, 0x25290001, 0x125102b, 0x1440fff0, 0x0, 0x1001021, 0x3e00008, 0x27bd0008, 0x27bdffe8, -0x27642800, 0xafbf0010, 0xc00248c, 0x24051000, +0x27642800, 0xafbf0010, 0xc002488, 0x24051000, 0x24020021, 0xaf800100, 0xaf800104, 0xaf800108, 0xaf800110, 0xaf800114, 0xaf800118, 0xaf800120, 0xaf800124, 0xaf800128, 0xaf800130, 0xaf800134, @@ -1247,32 +1256,31 @@ 0xaf82011c, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x27bdffe0, 0xafbf0018, 0x8f820104, 0xafa20010, 0x8f820100, 0x3c050002, 0xafa20014, 0x8f8600b0, -0x8f87011c, 0x3c040001, 0x24844ca0, 0xc002407, +0x8f87011c, 0x3c040001, 0x248454c0, 0xc002403, 0x34a5f000, 0x8f8300b0, 0x3c027f00, 0x621824, -0x3c020400, 0x1062002b, 0x43102b, 0x14400008, -0x3c022000, 0x3c020100, 0x10620026, 0x3c020200, -0x10620013, 0x0, 0x8002376, 0x0, -0x1062000a, 0x43102b, 0x1040001e, 0x3c024000, -0x1462001c, 0x0, 0x8ee20190, 0x24420001, -0xaee20190, 0x8002376, 0x8ee20190, 0x8ee2018c, -0x24420001, 0xaee2018c, 0x8002376, 0x8ee2018c, -0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830104, -0x8f8200b0, 0x34420001, 0xaf8200b0, 0xaf830104, -0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, -0x8ee201a0, 0x24420001, 0xaee201a0, 0x8002379, -0x8ee201a0, 0x8f8200b0, 0x34420001, 0xaf8200b0, -0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffe0, -0xafbf001c, 0xafb00018, 0x8f820120, 0xafa20010, -0x8f820124, 0x3c050001, 0xafa20014, 0x8f8600a0, -0x8f87011c, 0x3c040001, 0x24844cac, 0xc002407, -0x34a5f000, 0x8f8300a0, 0x3c027f00, 0x621824, -0x3c020400, 0x10620055, 0x8021, 0x43102b, -0x14400008, 0x3c042000, 0x3c020100, 0x1062004f, -0x3c020200, 0x1062003c, 0x0, 0x80023e4, -0x0, 0x10640005, 0x83102b, 0x10400047, +0x3c020400, 0x10620029, 0x43102b, 0x14400008, +0x3c022000, 0x3c020100, 0x10620024, 0x3c020200, +0x10620011, 0x0, 0x8002374, 0x0, +0x10620008, 0x3c024000, 0x1462001c, 0x0, +0x8ee20190, 0x24420001, 0xaee20190, 0x8002374, +0x8ee20190, 0x8ee2018c, 0x24420001, 0xaee2018c, +0x8002374, 0x8ee2018c, 0x8f82011c, 0x34420002, +0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001, +0xaf8200b0, 0xaf830104, 0x8f82011c, 0x2403fffd, +0x431024, 0xaf82011c, 0x8ee201a0, 0x24420001, +0xaee201a0, 0x8002377, 0x8ee201a0, 0x8f8200b0, +0x34420001, 0xaf8200b0, 0x8fbf0018, 0x3e00008, +0x27bd0020, 0x27bdffe0, 0xafbf001c, 0xafb00018, +0x8f820120, 0xafa20010, 0x8f820124, 0x3c050001, +0xafa20014, 0x8f8600a0, 0x8f87011c, 0x3c040001, +0x248454cc, 0xc002403, 0x34a5f000, 0x8f8300a0, +0x3c027f00, 0x621824, 0x3c020400, 0x10620053, +0x8021, 0x43102b, 0x14400008, 0x3c042000, +0x3c020100, 0x1062004d, 0x3c020200, 0x1062003a, +0x0, 0x80023e0, 0x0, 0x10640003, 0x3c024000, 0x14620045, 0x0, 0x8f8200a0, 0x441024, 0x10400006, 0x0, 0x8ee20194, -0x24420001, 0xaee20194, 0x80023ad, 0x8ee20194, +0x24420001, 0xaee20194, 0x80023a9, 0x8ee20194, 0x8ee20198, 0x24420001, 0xaee20198, 0x8ee20198, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f82011c, 0x30420200, 0x1040001b, 0x0, 0x8f8300a0, @@ -1281,52 +1289,52 @@ 0x24100001, 0x24020001, 0x1200000d, 0xaf8200a0, 0x8f820124, 0x2442ffe0, 0xaf820124, 0x8f820124, 0x8f820124, 0x27633000, 0x43102b, 0x10400005, -0x276237e0, 0xaf820124, 0x80023ce, 0x0, +0x276237e0, 0xaf820124, 0x80023ca, 0x0, 0xaf840124, 0x8f82011c, 0x2403fffd, 0x431024, -0x80023e7, 0xaf82011c, 0x8f82011c, 0x34420002, +0x80023e3, 0xaf82011c, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830124, 0x8f8200a0, 0x34420001, 0xaf8200a0, 0xaf830124, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee2019c, 0x24420001, -0xaee2019c, 0x80023e7, 0x8ee2019c, 0x8f8200a0, +0xaee2019c, 0x80023e3, 0x8ee2019c, 0x8f8200a0, 0x34420001, 0xaf8200a0, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 0x0, 0x3c020001, -0x8c425418, 0x27bdffe8, 0xafbf0014, 0x14400012, -0xafb00010, 0x3c100001, 0x26105560, 0x2002021, -0xc00248c, 0x24052000, 0x26021fe0, 0x3c010001, -0xac225534, 0x3c010001, 0xac225530, 0xaf420250, +0x8c425c58, 0x27bdffe8, 0xafbf0014, 0x14400012, +0xafb00010, 0x3c100001, 0x26105dd0, 0x2002021, +0xc002488, 0x24052000, 0x26021fe0, 0x3c010001, +0xac225d94, 0x3c010001, 0xac225d90, 0xaf420250, 0x24022000, 0xaf500254, 0xaf420258, 0x24020001, -0x3c010001, 0xac225418, 0x8fbf0014, 0x8fb00010, -0x3e00008, 0x27bd0018, 0x3c030001, 0x8c635534, +0x3c010001, 0xac225c58, 0x8fbf0014, 0x8fb00010, +0x3e00008, 0x27bd0018, 0x3c030001, 0x8c635d94, 0x8c820000, 0x8fa80010, 0x8fa90014, 0xac620000, -0x3c020001, 0x8c425534, 0x8c830004, 0xac430004, +0x3c020001, 0x8c425d94, 0x8c830004, 0xac430004, 0xac450008, 0x8f840054, 0x2443ffe0, 0xac460010, 0xac470014, 0xac480018, 0xac49001c, 0x3c010001, -0xac235534, 0xac44000c, 0x3c020001, 0x24425560, +0xac235d94, 0xac44000c, 0x3c020001, 0x24425dd0, 0x62182b, 0x10600005, 0x0, 0x3c020001, -0x8c425530, 0x3c010001, 0xac225534, 0x3c030001, -0x8c635534, 0x3c020001, 0x8c425400, 0xac620000, -0x3c030001, 0x8c635534, 0x3c020001, 0x8c425400, +0x8c425d90, 0x3c010001, 0xac225d94, 0x3c030001, +0x8c635d94, 0x3c020001, 0x8c425c40, 0xac620000, +0x3c030001, 0x8c635d94, 0x3c020001, 0x8c425c40, 0xac620004, 0x3e00008, 0xaf430250, 0x3c030001, -0x8c635534, 0x3c020001, 0x8c425400, 0x27bdffd0, +0x8c635d94, 0x3c020001, 0x8c425c40, 0x27bdffd0, 0xafb40020, 0x8fb40040, 0xafb00010, 0x808021, 0xafb50024, 0x8fb50044, 0x8fa40048, 0xafb10014, 0xa08821, 0xafbf0028, 0xafb3001c, 0xafb20018, -0xac620000, 0x3c050001, 0x8ca55534, 0x3c020001, -0x8c425400, 0xc09021, 0xe09821, 0x10800006, -0xaca20004, 0x24a50008, 0xc002494, 0x24060018, -0x8002452, 0x0, 0x24a40008, 0xc00248c, -0x24050018, 0x3c020001, 0x8c425534, 0x3c050001, -0x24a55560, 0x2442ffe0, 0x3c010001, 0xac225534, +0xac620000, 0x3c050001, 0x8ca55d94, 0x3c020001, +0x8c425c40, 0xc09021, 0xe09821, 0x10800006, +0xaca20004, 0x24a50008, 0xc002490, 0x24060018, +0x800244e, 0x0, 0x24a40008, 0xc002488, +0x24050018, 0x3c020001, 0x8c425d94, 0x3c050001, +0x24a55dd0, 0x2442ffe0, 0x3c010001, 0xac225d94, 0x45102b, 0x10400005, 0x0, 0x3c020001, -0x8c425530, 0x3c010001, 0xac225534, 0x3c030001, -0x8c635534, 0x8e020000, 0xac620000, 0x3c030001, -0x8c635534, 0x8e020004, 0xac620004, 0xac710008, -0x8f840054, 0x2462ffe0, 0x3c010001, 0xac225534, +0x8c425d90, 0x3c010001, 0xac225d94, 0x3c030001, +0x8c635d94, 0x8e020000, 0xac620000, 0x3c030001, +0x8c635d94, 0x8e020004, 0xac620004, 0xac710008, +0x8f840054, 0x2462ffe0, 0x3c010001, 0xac225d94, 0x45102b, 0xac720010, 0xac730014, 0xac740018, 0xac75001c, 0x10400005, 0xac64000c, 0x3c020001, -0x8c425530, 0x3c010001, 0xac225534, 0x3c030001, -0x8c635534, 0x3c020001, 0x8c425400, 0xac620000, -0x3c030001, 0x8c635534, 0x3c020001, 0x8c425400, +0x8c425d90, 0x3c010001, 0xac225d94, 0x3c030001, +0x8c635d94, 0x3c020001, 0x8c425c40, 0xac620000, +0x3c030001, 0x8c635d94, 0x3c020001, 0x8c425c40, 0xac620004, 0xaf430250, 0x8fbf0028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0030, 0x10a00005, @@ -1347,13 +1355,13 @@ 0x3c030001, 0x431021, 0xaee2726c, 0x8ee2725c, 0x8ee3726c, 0x441021, 0x62182b, 0x10600006, 0x31a20004, 0x8ee201b8, 0x24420001, 0xaee201b8, -0x80028e5, 0x8ee201b8, 0x10400240, 0x31a20200, +0x80028e1, 0x8ee201b8, 0x10400240, 0x31a20200, 0x1040014d, 0x4821, 0x96e2045a, 0x30420010, 0x10400149, 0x0, 0x8f840100, 0x27623000, 0x24850020, 0xa2102b, 0x50400001, 0x27652800, 0x8f820108, 0x10a20004, 0x0, 0x8f820104, 0x14a20006, 0x2402000c, 0x8ee201a8, 0x24420001, -0xaee201a8, 0x8002530, 0x8ee201a8, 0xac8a0000, +0xaee201a8, 0x800252c, 0x8ee201a8, 0xac8a0000, 0xac8b0004, 0x8ee37264, 0x24060005, 0xa482000e, 0xac860018, 0xac830008, 0x8ee204e4, 0xac82001c, 0x8ee204c8, 0xac820010, 0xaf850100, 0x92e204ec, @@ -1363,17 +1371,17 @@ 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, 0x24420001, 0x10a20005, -0x0, 0x800251a, 0x0, 0x14a00005, +0x0, 0x8002516, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, -0xac800000, 0x8002530, 0x0, 0x8ee24e28, +0xac800000, 0x800252c, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x3c040001, 0xafab0010, 0x8ee27264, 0x3c040001, -0x24844f10, 0x3c050004, 0xafa20014, 0x8ee604e4, -0x80028c2, 0x34a5f114, 0x8ee27264, 0x34843800, +0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, +0x80028be, 0x34a5f114, 0x8ee27264, 0x34843800, 0x3641821, 0x24420010, 0x43102b, 0x14400073, 0x0, 0x8ee27264, 0x24480010, 0x3641021, 0x102102b, 0x14400002, 0x3c02ffff, 0x1024021, @@ -1381,7 +1389,7 @@ 0x50400001, 0x27662800, 0x8f820108, 0x10c20004, 0x0, 0x8f820104, 0x14c20007, 0x2563000c, 0x8ee201a8, 0x4821, 0x24420001, 0xaee201a8, -0x80025a4, 0x8ee201a8, 0x2c64000c, 0x1441021, +0x80025a0, 0x8ee201a8, 0x2c64000c, 0x1441021, 0xaca20000, 0xaca30004, 0x24e2fff4, 0xa4a2000e, 0x24020006, 0xaca80008, 0xaca20018, 0x8ee204e4, 0xaca2001c, 0x8ee204c8, 0x3c030002, 0x431025, @@ -1392,22 +1400,22 @@ 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, 0x24420001, 0x10a20005, -0x0, 0x800258e, 0x0, 0x14a00005, +0x0, 0x800258a, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, -0xac800000, 0x80025a4, 0x0, 0x8ee24e28, +0xac800000, 0x80025a0, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x2508fffc, 0xafab0010, 0x8ee27264, 0x3c040001, -0x24844f10, 0x3c050004, 0xafa20014, 0x8ee604e4, -0x80028c2, 0x34a5f125, 0x34028100, 0xa5020000, -0x9582000e, 0x8002621, 0xa5020002, 0x8f850100, +0x24845730, 0x3c050004, 0xafa20014, 0x8ee604e4, +0x80028be, 0x34a5f125, 0x34028100, 0xa5020000, +0x9582000e, 0x800261d, 0xa5020002, 0x8f850100, 0x27623000, 0x24a60020, 0xc2102b, 0x50400001, 0x27662800, 0x8f820108, 0x10c20004, 0x0, 0x8f820104, 0x14c20007, 0x2563000c, 0x8ee201a8, -0x4821, 0x24420001, 0xaee201a8, 0x8002611, +0x4821, 0x24420001, 0xaee201a8, 0x800260d, 0x8ee201a8, 0x2c64000c, 0x1441021, 0xaca20000, 0xaca30004, 0x8ee37264, 0x24e2fff4, 0xa4a2000e, 0x24020006, 0xaca20018, 0x24630010, 0xaca30008, @@ -1419,23 +1427,23 @@ 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, 0x24420001, -0x10a20005, 0x0, 0x80025fb, 0x0, +0x10a20005, 0x0, 0x80025f7, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, -0x50400013, 0xac800000, 0x8002611, 0x0, +0x50400013, 0xac800000, 0x800260d, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x34028100, 0xafab0010, 0x8ee27264, -0x3c040001, 0x24844f10, 0x3c050004, 0xafa20014, -0x8ee604e4, 0x80028c2, 0x34a5f015, 0x8ee37264, +0x3c040001, 0x24845730, 0x3c050004, 0xafa20014, +0x8ee604e4, 0x80028be, 0x34a5f015, 0x8ee37264, 0xa462000c, 0x8ee37264, 0x9582000e, 0xa462000e, -0x8002685, 0x24e70004, 0x8f840100, 0x27623000, +0x8002681, 0x24e70004, 0x8f840100, 0x27623000, 0x24850020, 0xa2102b, 0x50400001, 0x27652800, 0x8f820108, 0x10a20004, 0x0, 0x8f820104, 0x14a20007, 0x24020006, 0x8ee201a8, 0x4821, -0x24420001, 0xaee201a8, 0x800267b, 0x8ee201a8, +0x24420001, 0xaee201a8, 0x8002677, 0x8ee201a8, 0xac8a0000, 0xac8b0004, 0x8ee37264, 0xa487000e, 0xac820018, 0xac830008, 0x8ee204e4, 0xac82001c, 0x8ee204c8, 0x3c030002, 0x431025, 0xac820010, @@ -1446,16 +1454,16 @@ 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, 0x24420001, 0x10a20005, 0x0, -0x8002665, 0x0, 0x14a00005, 0x0, +0x8002661, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, -0x800267b, 0x0, 0x8ee24e28, 0x24030040, +0x8002677, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x15200009, 0x3c050004, -0xafab0010, 0x8ee27264, 0x3c040001, 0x24844f10, -0xafa20014, 0x8ee604e4, 0x80028c2, 0x34a5f004, +0xafab0010, 0x8ee27264, 0x3c040001, 0x24845730, +0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f004, 0x8ee2725c, 0x30e7ffff, 0x471021, 0xaee2725c, 0x8ee204e4, 0x8ee304fc, 0x8ee47258, 0x21100, 0x431021, 0xac44000c, 0x8ee27258, 0xafa20018, @@ -1470,34 +1478,34 @@ 0xaee27264, 0x8f8200f0, 0x24470008, 0x27621800, 0xe2102b, 0x50400001, 0x27671000, 0x8f8200f4, 0x14e20007, 0x0, 0x8ee201b4, 0x4821, -0x24420001, 0xaee201b4, 0x80026c8, 0x8ee201b4, +0x24420001, 0xaee201b4, 0x80026c4, 0x8ee201b4, 0x8f8200f0, 0x24090001, 0x8fa30018, 0x8fa4001c, 0xac430000, 0xac440004, 0xaf8700f0, 0x15200012, 0xd1142, 0x8f8200f0, 0xafa20010, 0x8f8200f4, -0x3c040001, 0x24844f1c, 0xafa20014, 0x8fa60018, -0x8fa7001c, 0x3c050004, 0xc002407, 0x34a5f005, +0x3c040001, 0x2484573c, 0xafa20014, 0x8fa60018, +0x8fa7001c, 0x3c050004, 0xc002403, 0x34a5f005, 0x8ee20088, 0x24420001, 0xaee20088, 0x8ee20088, -0x80028d7, 0xaee0725c, 0x30430003, 0x24020002, +0x80028d3, 0xaee0725c, 0x30430003, 0x24020002, 0x10620016, 0x28620003, 0x10400005, 0x24020001, -0x10620008, 0x0, 0x8002707, 0x0, -0x24020003, 0x10620017, 0x0, 0x8002707, +0x10620008, 0x0, 0x8002703, 0x0, +0x24020003, 0x10620017, 0x0, 0x8002703, 0x0, 0x8ee200e8, 0x8ee300ec, 0x24630001, 0x2c640001, 0x441021, 0xaee200e8, 0xaee300ec, -0x8ee200e8, 0x8002707, 0x8ee300ec, 0x8ee200f0, +0x8ee200e8, 0x8002703, 0x8ee300ec, 0x8ee200f0, 0x8ee300f4, 0x24630001, 0x2c640001, 0x441021, -0xaee200f0, 0xaee300f4, 0x8ee200f0, 0x8002707, +0xaee200f0, 0xaee300f4, 0x8ee200f0, 0x8002703, 0x8ee300f4, 0x8ee200f8, 0x8ee300fc, 0x24630001, 0x2c640001, 0x441021, 0xaee200f8, 0xaee300fc, 0x8ee200f8, 0x8ee300fc, 0x8ee2725c, 0x8ee400e0, 0x8ee500e4, 0x401821, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400e0, -0xaee500e4, 0x80028d7, 0xaee0725c, 0x30e2ffff, +0xaee500e4, 0x80028d3, 0xaee0725c, 0x30e2ffff, 0x104001c1, 0x31a20200, 0x1040014d, 0x4821, 0x96e2045a, 0x30420010, 0x10400149, 0x0, 0x8f840100, 0x27623000, 0x24850020, 0xa2102b, 0x50400001, 0x27652800, 0x8f820108, 0x10a20004, 0x0, 0x8f820104, 0x14a20006, 0x2402000c, -0x8ee201a8, 0x24420001, 0xaee201a8, 0x8002772, +0x8ee201a8, 0x24420001, 0xaee201a8, 0x800276e, 0x8ee201a8, 0xac8a0000, 0xac8b0004, 0x8ee37264, 0x24060005, 0xa482000e, 0xac860018, 0xac830008, 0x8ee204e4, 0xac82001c, 0x8ee204c8, 0xac820010, @@ -1507,17 +1515,17 @@ 0x8ee24e2c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, -0x24420001, 0x10a20005, 0x0, 0x800275c, +0x24420001, 0x10a20005, 0x0, 0x8002758, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, -0x2c420011, 0x50400013, 0xac800000, 0x8002772, +0x2c420011, 0x50400013, 0xac800000, 0x800276e, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x3c040001, 0xafab0010, -0x8ee27264, 0x3c040001, 0x24844f10, 0x3c050004, -0xafa20014, 0x8ee604e4, 0x80028c2, 0x34a5f014, +0x8ee27264, 0x3c040001, 0x24845730, 0x3c050004, +0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f014, 0x8ee27264, 0x34843800, 0x3641821, 0x24420010, 0x43102b, 0x14400073, 0x0, 0x8ee27264, 0x24480010, 0x3641021, 0x102102b, 0x14400002, @@ -1525,7 +1533,7 @@ 0x24a60020, 0xc2102b, 0x50400001, 0x27662800, 0x8f820108, 0x10c20004, 0x0, 0x8f820104, 0x14c20007, 0x2563000c, 0x8ee201a8, 0x4821, -0x24420001, 0xaee201a8, 0x80027e6, 0x8ee201a8, +0x24420001, 0xaee201a8, 0x80027e2, 0x8ee201a8, 0x2c64000c, 0x1441021, 0xaca20000, 0xaca30004, 0x24e2fff4, 0xa4a2000e, 0x24020006, 0xaca80008, 0xaca20018, 0x8ee204e4, 0xaca2001c, 0x8ee204c8, @@ -1536,23 +1544,23 @@ 0x8ee24e2c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, -0x24420001, 0x10a20005, 0x0, 0x80027d0, +0x24420001, 0x10a20005, 0x0, 0x80027cc, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, -0x2c420011, 0x50400013, 0xac800000, 0x80027e6, +0x2c420011, 0x50400013, 0xac800000, 0x80027e2, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x2508fffc, 0xafab0010, -0x8ee27264, 0x3c040001, 0x24844f10, 0x3c050004, -0xafa20014, 0x8ee604e4, 0x80028c2, 0x34a5f015, -0x34028100, 0xa5020000, 0x9582000e, 0x8002863, +0x8ee27264, 0x3c040001, 0x24845730, 0x3c050004, +0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f015, +0x34028100, 0xa5020000, 0x9582000e, 0x800285f, 0xa5020002, 0x8f850100, 0x27623000, 0x24a60020, 0xc2102b, 0x50400001, 0x27662800, 0x8f820108, 0x10c20004, 0x0, 0x8f820104, 0x14c20007, 0x2563000c, 0x8ee201a8, 0x4821, 0x24420001, -0xaee201a8, 0x8002853, 0x8ee201a8, 0x2c64000c, +0xaee201a8, 0x800284f, 0x8ee201a8, 0x2c64000c, 0x1441021, 0xaca20000, 0xaca30004, 0x8ee37264, 0x24e2fff4, 0xa4a2000e, 0x24020006, 0xaca20018, 0x24630010, 0xaca30008, 0x8ee204e4, 0xaca2001c, @@ -1564,23 +1572,23 @@ 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, 0x24420001, 0x10a20005, 0x0, -0x800283d, 0x0, 0x14a00005, 0x0, +0x8002839, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, -0x8002853, 0x0, 0x8ee24e28, 0x24030040, +0x800284f, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x34028100, -0xafab0010, 0x8ee27264, 0x3c040001, 0x24844f10, -0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028c2, +0xafab0010, 0x8ee27264, 0x3c040001, 0x24845730, +0x3c050004, 0xafa20014, 0x8ee604e4, 0x80028be, 0x34a5f016, 0x8ee37264, 0xa462000c, 0x8ee37264, -0x9582000e, 0xa462000e, 0x80028c6, 0x24e70004, +0x9582000e, 0xa462000e, 0x80028c2, 0x24e70004, 0x8f830100, 0x27623000, 0x24640020, 0x82102b, 0x50400001, 0x27642800, 0x8f820108, 0x10820004, 0x0, 0x8f820104, 0x14820007, 0x24050005, 0x8ee201a8, 0x4821, 0x24420001, 0xaee201a8, -0x80028ba, 0x8ee201a8, 0xac6a0000, 0xac6b0004, +0x80028b6, 0x8ee201a8, 0xac6a0000, 0xac6b0004, 0x8ee27264, 0xa467000e, 0xac650018, 0xac620008, 0x8ee204e4, 0xac62001c, 0x8ee204c8, 0xac620010, 0xaf840100, 0x92e204ec, 0x14400036, 0x24090001, @@ -1589,17 +1597,17 @@ 0x8ee24e2c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, -0x24420001, 0x10a20005, 0x0, 0x80028a4, +0x24420001, 0x10a20005, 0x0, 0x80028a0, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, -0x2c420011, 0x50400013, 0xac800000, 0x80028ba, +0x2c420011, 0x50400013, 0xac800000, 0x80028b6, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000b, 0x3c050004, 0x3c040001, -0x24844f28, 0xafab0010, 0xafa00014, 0x8ee604e4, -0x34a5f017, 0xc002407, 0x30e7ffff, 0x80028e5, +0x24845748, 0xafab0010, 0xafa00014, 0x8ee604e4, +0x34a5f017, 0xc002403, 0x30e7ffff, 0x80028e1, 0x0, 0x8ee27264, 0x3c050001, 0x30e4ffff, 0x441021, 0xaee27264, 0x8ee2725c, 0x8ee37264, 0x34a53800, 0x441021, 0xaee2725c, 0x3651021, @@ -1620,14 +1628,14 @@ 0xaee27264, 0x8ee37264, 0x42400, 0x3651021, 0x3c010001, 0x370821, 0xac2483dc, 0x62182b, 0x14600005, 0x24e70004, 0x8ee27264, 0x3c03ffff, -0x431021, 0xaee27264, 0x8ee27264, 0x800291b, +0x431021, 0xaee27264, 0x8ee27264, 0x8002917, 0xaee27258, 0x8ee604c8, 0x8ee2726c, 0x30e4ffff, 0x44102a, 0x10400015, 0x0, 0x8f8200d8, 0x8ee37258, 0x431023, 0xaee2726c, 0x8ee2726c, 0x1c400007, 0x44102a, 0x8ee2726c, 0x3c030001, 0x431021, 0xaee2726c, 0x8ee2726c, 0x44102a, 0x10400006, 0x0, 0x8ee201b8, 0x24420001, -0xaee201b8, 0x8002a76, 0x8ee201b8, 0x3c020001, +0xaee201b8, 0x8002a72, 0x8ee201b8, 0x3c020001, 0x571021, 0x8c4283d8, 0x54400001, 0x24e7fffc, 0x31420004, 0x104000b9, 0x30e2ffff, 0x3c020001, 0x571021, 0x8c4283d8, 0x1040002f, 0x5021, @@ -1642,11 +1650,11 @@ 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e21821, 0x24020015, 0xac620000, 0x24020001, -0x80029c3, 0xac620004, 0x8f840100, 0x27623000, +0x80029bf, 0xac620004, 0x8f840100, 0x27623000, 0x24850020, 0xa2102b, 0x50400001, 0x27652800, 0x8f820108, 0x10a20004, 0x0, 0x8f820104, 0x14a20006, 0x24020006, 0x8ee201a8, 0x24420001, -0xaee201a8, 0x80029c3, 0x8ee201a8, 0xac880000, +0xaee201a8, 0x80029bf, 0x8ee201a8, 0xac880000, 0xac890004, 0x8ee37264, 0xa487000e, 0xac820018, 0xac830008, 0x8ee204e8, 0xac860010, 0xac82001c, 0xaf850100, 0x92e204ec, 0x14400037, 0x240a0001, @@ -1656,16 +1664,16 @@ 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, 0x24420001, 0x10a20005, 0x0, -0x80029ad, 0x0, 0x14a00005, 0x0, +0x80029a9, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, -0x80029c3, 0x0, 0x8ee24e28, 0x24030040, +0x80029bf, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1540000a, 0x24020001, -0xafa90010, 0x8ee27264, 0x3c040001, 0x24844f10, -0x3c050004, 0xafa20014, 0x8ee604e4, 0x8002a53, +0xafa90010, 0x8ee27264, 0x3c040001, 0x24845730, +0x3c050004, 0xafa20014, 0x8ee604e4, 0x8002a4f, 0x34a5f204, 0xa2e204ed, 0x8ee204e8, 0x8ee304fc, 0x8ee47258, 0x3c060001, 0x34c63800, 0x3c010001, 0x370821, 0xac2083d8, 0x3c010001, 0x370821, @@ -1675,12 +1683,12 @@ 0x8ee2726c, 0x8ee47258, 0x651824, 0x431023, 0xaee2726c, 0x3661021, 0x82202b, 0x14800004, 0x3c03ffff, 0x8ee27258, 0x431021, 0xaee27258, -0x8ee27258, 0x8002a68, 0xaee27264, 0x10400073, +0x8ee27258, 0x8002a64, 0xaee27264, 0x10400073, 0x0, 0x8f830100, 0x27623000, 0x24640020, 0x82102b, 0x14400002, 0x5021, 0x27642800, 0x8f820108, 0x10820004, 0x0, 0x8f820104, 0x14820006, 0x24050005, 0x8ee201a8, 0x24420001, -0xaee201a8, 0x8002a4a, 0x8ee201a8, 0xac680000, +0xaee201a8, 0x8002a46, 0x8ee201a8, 0xac680000, 0xac690004, 0x8ee27264, 0xa467000e, 0xac650018, 0xac620008, 0x8ee204e8, 0xac660010, 0xac62001c, 0xaf840100, 0x92e204ec, 0x14400036, 0x240a0001, @@ -1689,18 +1697,18 @@ 0x8ee24e2c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e2c, 0x8ee54e28, 0x24420001, 0x10430007, 0x0, 0x8ee24e2c, -0x24420001, 0x10a20005, 0x0, 0x8002a34, +0x24420001, 0x10a20005, 0x0, 0x8002a30, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, -0x2c420011, 0x50400013, 0xac800000, 0x8002a4a, +0x2c420011, 0x50400013, 0xac800000, 0x8002a46, 0x0, 0x8ee24e28, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e28, 0x24420001, 0xaee24e28, 0x8ee24e28, 0x210c0, 0x24424e38, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1540000c, 0x30e5ffff, 0x3c040001, -0x24844f28, 0x3c050004, 0xafa90010, 0xafa00014, -0x8ee604e4, 0x34a5f237, 0xc002407, 0x30e7ffff, -0x8002a76, 0x0, 0x8ee27264, 0x451021, +0x24845748, 0x3c050004, 0xafa90010, 0xafa00014, +0x8ee604e4, 0x34a5f237, 0xc002403, 0x30e7ffff, +0x8002a72, 0x0, 0x8ee27264, 0x451021, 0xaee27264, 0x8ee2726c, 0x8ee37264, 0x3c040001, 0x34843800, 0xa2e004ed, 0x451023, 0xaee2726c, 0x3641021, 0x62182b, 0x14600004, 0x3c03ffff, @@ -1715,21 +1723,21 @@ 0x24420001, 0xaee24e2c, 0x8ee24e2c, 0x8ee34e2c, 0x210c0, 0x24424e38, 0x2e22021, 0x8ee24e28, 0x8c870004, 0x14620007, 0xa03021, 0x8f820108, -0x24420020, 0xaf820108, 0x8f820108, 0x8002aa6, +0x24420020, 0xaf820108, 0x8f820108, 0x8002aa2, 0xac800000, 0x8ee24e2c, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e2c, 0x24420001, 0x210c0, 0x24424e38, 0x2e22021, 0x8c820004, 0x8f830108, 0x21140, 0x621821, 0xaf830108, 0xac800000, 0x8cc20018, 0x2443fffe, 0x2c620013, 0x104000c1, 0x31080, 0x3c010001, 0x220821, -0x8c224f50, 0x400008, 0x0, 0x8ee204f0, +0x8c225770, 0x400008, 0x0, 0x8ee204f0, 0x471021, 0xaee204f0, 0x8ee204f0, 0x8f43023c, 0x43102b, 0x144000be, 0x0, 0x8ee304e4, 0x8ee204f8, 0x506200ba, 0xa2e004f4, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a4, -0x8021, 0x24420001, 0xaee201a4, 0x8002b16, +0x8021, 0x24420001, 0xaee201a4, 0x8002b12, 0x8ee201a4, 0x8ee204e4, 0xac62001c, 0x8ee404b0, 0x8ee504b4, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, @@ -1740,38 +1748,38 @@ 0x8ee24e34, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee54e30, 0x24420001, 0x10430007, 0x0, 0x8ee24e34, -0x24420001, 0x10a20005, 0x0, 0x8002b00, +0x24420001, 0x10a20005, 0x0, 0x8002afc, 0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, -0x2c420011, 0x50400013, 0xac800000, 0x8002b16, +0x2c420011, 0x50400013, 0xac800000, 0x8002b12, 0x0, 0x8ee24e30, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600000b, 0x24100001, 0x8ee204e4, -0x3c040001, 0x24844f34, 0xafa00014, 0xafa20010, -0x8ee60608, 0x8f470228, 0x3c050009, 0xc002407, -0x34a5f006, 0x16000003, 0x24020001, 0x8002b75, +0x3c040001, 0x24845754, 0xafa00014, 0xafa20010, +0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, +0x34a5f006, 0x16000003, 0x24020001, 0x8002b71, 0xa2e204f4, 0x8ee20170, 0x24420001, 0xaee20170, 0x8ee20170, 0x8ee204e4, 0xa2e004f4, 0xaee004f0, 0xaee204f8, 0x8f42023c, 0x50400045, 0xaee07274, 0x8ee20184, 0x24420001, 0xaee20184, 0x8ee20184, -0x8002b75, 0xaee07274, 0x8ee20504, 0x24030040, +0x8002b71, 0xaee07274, 0x8ee20504, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee20504, 0x24420001, 0xaee20504, 0x8ee20504, 0x8cc30018, 0x21080, 0x571021, 0x8c440508, 0x24020003, 0x1462000f, 0x0, 0x3c020001, 0x571021, 0x904283b1, 0x10400014, 0x0, 0x8ee201d0, 0x8ee35240, 0x441021, 0xaee201d0, 0x8ee201d8, -0x641821, 0x306300ff, 0x8002b5d, 0xaee35240, +0x641821, 0x306300ff, 0x8002b59, 0xaee35240, 0x8ee201cc, 0x8ee30e10, 0x441021, 0xaee201cc, 0x8ee201d8, 0x641821, 0x306301ff, 0xaee30e10, 0x441021, 0xaee201d8, 0x8ee20000, 0x34420040, -0x8002b75, 0xaee20000, 0x8ee2014c, 0x3c010001, +0x8002b71, 0xaee20000, 0x8ee2014c, 0x3c010001, 0x370821, 0xa02083e0, 0x24420001, 0xaee2014c, -0x8002b75, 0x8ee2014c, 0x94c7000e, 0x8cc2001c, -0x3c040001, 0x24844f40, 0xafa60014, 0xafa20010, -0x8cc60018, 0x3c050008, 0xc002407, 0x34a50910, +0x8002b71, 0x8ee2014c, 0x94c7000e, 0x8cc2001c, +0x3c040001, 0x24845760, 0xafa60014, 0xafa20010, +0x8cc60018, 0x3c050008, 0xc002403, 0x34a50910, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 0x27bdff98, 0xafbf0060, 0xafbe005c, 0xafb60058, 0xafb50054, 0xafb40050, 0xafb3004c, 0xafb20048, @@ -1779,7 +1787,7 @@ 0xafa00024, 0x106203e7, 0xafa0002c, 0x3c1e0001, 0x37de3800, 0x3c0bffff, 0x8f930108, 0x8e620018, 0x8f830104, 0x2443fffe, 0x2c620014, 0x104003cf, -0x31080, 0x3c010001, 0x220821, 0x8c224fa0, +0x31080, 0x3c010001, 0x220821, 0x8c2257c0, 0x400008, 0x0, 0x9663000e, 0x8ee2725c, 0x8ee404f0, 0x431021, 0xaee2725c, 0x8e63001c, 0x96e20458, 0x24840001, 0xaee404f0, 0x24630001, @@ -1788,7 +1796,7 @@ 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a4, -0x8021, 0x24420001, 0xaee201a4, 0x8002c02, +0x8021, 0x24420001, 0xaee201a4, 0x8002bfe, 0x8ee201a4, 0x8ee204e4, 0xac62001c, 0x8ee404b0, 0x8ee504b4, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, @@ -1799,19 +1807,19 @@ 0x8ee24e34, 0x1062001b, 0x240c0040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x104c0007, 0x0, 0x8ee24e34, -0x24420001, 0x10620005, 0x0, 0x8002bec, +0x24420001, 0x10620005, 0x0, 0x8002be8, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, -0x2c420011, 0x50400013, 0xac800000, 0x8002c02, +0x2c420011, 0x50400013, 0xac800000, 0x8002bfe, 0x0, 0x8ee24e30, 0x240c0040, 0x24420001, 0x504c0003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0x240c0001, 0xac820000, 0xac8c0004, 0x5600000d, 0x24100001, 0x8ee204e4, -0x3c040001, 0x24844f34, 0xafa00014, 0xafa20010, +0x3c040001, 0x24845754, 0xafa00014, 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, 0x34a5f006, -0xc002407, 0xafab0038, 0x8fab0038, 0x1200030a, -0x240c0001, 0x8002f1d, 0x0, 0x966c001c, +0xc002403, 0xafab0038, 0x8fab0038, 0x1200030a, +0x240c0001, 0x8002f19, 0x0, 0x966c001c, 0xafac002c, 0x9662001e, 0x3c0c8000, 0xafac0024, 0xae62001c, 0x8e75001c, 0x8ee204fc, 0x8ee404fc, 0x151900, 0x621021, 0x8c52000c, 0x92e27b98, @@ -1821,8 +1829,8 @@ 0x8e63001c, 0x8ee204fc, 0x32100, 0x821021, 0x8c42000c, 0x37e1821, 0x24420022, 0x43102b, 0x1440000a, 0x24050014, 0x8ee204fc, 0x821021, -0x8c44000c, 0xafab0038, 0xc002f79, 0x2484000e, -0x8fab0038, 0x8002c56, 0x3050ffff, 0x8ee204fc, +0x8c44000c, 0xafab0038, 0xc002f75, 0x2484000e, +0x8fab0038, 0x8002c52, 0x3050ffff, 0x8ee204fc, 0x821021, 0x8c42000c, 0x9450000e, 0x94430010, 0x94440012, 0x94450014, 0x2038021, 0x2048021, 0x2058021, 0x94430016, 0x94440018, 0x9445001a, @@ -1833,7 +1841,7 @@ 0xa21021, 0x8c43000c, 0x3202ffff, 0x828021, 0x37e1021, 0x24630018, 0x62182b, 0x14600009, 0x0, 0x8ee204fc, 0xa21021, 0x8c43000c, -0x101027, 0x3c01ffff, 0x230821, 0x8002c73, +0x101027, 0x3c01ffff, 0x230821, 0x8002c6f, 0xa4220018, 0x8ee204fc, 0xa21021, 0x8c43000c, 0x101027, 0xa4620018, 0x96e2045a, 0x8821, 0x30420008, 0x14400063, 0xa021, 0x8e63001c, @@ -1851,7 +1859,7 @@ 0x94e20000, 0x24e70002, 0x2228821, 0x37e1021, 0xe2102b, 0x50400001, 0xeb3821, 0x94e20000, 0x24e70002, 0x2228821, 0x37e1021, 0xe2102b, -0x50400001, 0xeb3821, 0x94e20000, 0x8002cd4, +0x50400001, 0xeb3821, 0x94e20000, 0x8002cd0, 0x2228821, 0x8ee204fc, 0xc21021, 0x8c43000c, 0x8ee204fc, 0x94710010, 0x8ee304fc, 0xc21021, 0x8c44000c, 0xc31821, 0x8c62000c, 0x2634ffec, @@ -1867,8 +1875,8 @@ 0x0, 0x240c0001, 0xa2ec7b98, 0xaef57b9c, 0xaef27ba4, 0x8ee304fc, 0x151100, 0x431021, 0x8c47000c, 0x37e1821, 0x24e2000e, 0x43102b, -0x14400008, 0xe02021, 0x2405000e, 0xc002f79, -0xafab0038, 0x3042ffff, 0x8fab0038, 0x8002d0d, +0x14400008, 0xe02021, 0x2405000e, 0xc002f75, +0xafab0038, 0x3042ffff, 0x8fab0038, 0x8002d09, 0x2028021, 0x94e60000, 0x24e70002, 0x94e50000, 0x24e70002, 0x94e30000, 0x24e70002, 0x94e20000, 0x24e70002, 0x94e40000, 0x24e70002, 0x2068021, @@ -1876,7 +1884,7 @@ 0x94e30002, 0x2048021, 0x2028021, 0x2038021, 0x101c02, 0x3202ffff, 0x628021, 0x101c02, 0x3202ffff, 0x8ee47b9c, 0x628021, 0x14950004, -0x3205ffff, 0x96620016, 0x8002d1b, 0x512021, +0x3205ffff, 0x96620016, 0x8002d17, 0x512021, 0x96620016, 0x542021, 0x41402, 0x3083ffff, 0x432021, 0x852023, 0x41402, 0x822021, 0x3084ffff, 0x50800001, 0x3404ffff, 0x8ee27ba4, @@ -1889,11 +1897,11 @@ 0x3082ffff, 0x622021, 0x32c20100, 0x14400004, 0x41027, 0x92e27b98, 0x14400002, 0x41027, 0x3044ffff, 0x8ee27ba4, 0x3c01ffff, 0x220821, -0x8002d8e, 0xa4240028, 0x8ee27b9c, 0x12a20008, +0x8002d8a, 0xa4240028, 0x8ee27b9c, 0x12a20008, 0x32c20100, 0x8ee27ba4, 0x94420028, 0x822021, 0x41c02, 0x3082ffff, 0x622021, 0x32c20100, 0x14400004, 0x41027, 0x92e27b98, 0x14400002, -0x41027, 0x3044ffff, 0x8ee27ba4, 0x8002d8e, +0x41027, 0x3044ffff, 0x8ee27ba4, 0x8002d8a, 0xa4440028, 0x1462002f, 0x37e1821, 0x8ee27ba4, 0x24420032, 0x43102b, 0x14400018, 0x0, 0x8ee27b9c, 0x12a2000a, 0x32c20100, 0x8ee27ba4, @@ -1901,7 +1909,7 @@ 0x41c02, 0x3082ffff, 0x622021, 0x32c20100, 0x14400004, 0x41027, 0x92e27b98, 0x14400002, 0x41027, 0x3044ffff, 0x8ee27ba4, 0x3c01ffff, -0x220821, 0x8002d8e, 0xa4240032, 0x8ee27b9c, +0x220821, 0x8002d8a, 0xa4240032, 0x8ee27b9c, 0x12a20008, 0x32c20100, 0x8ee27ba4, 0x94420032, 0x822021, 0x41c02, 0x3082ffff, 0x622021, 0x32c20100, 0x14400004, 0x41027, 0x92e27b98, @@ -1914,7 +1922,7 @@ 0x37e1021, 0x62102b, 0x50400001, 0x6b1821, 0x8c620000, 0xac820000, 0x34028100, 0xa4620000, 0x24630002, 0x37e1021, 0x62102b, 0x50400001, -0x6b1821, 0x97ac002e, 0x8002db8, 0xa46c0000, +0x6b1821, 0x97ac002e, 0x8002db4, 0xa46c0000, 0x8e420004, 0x8e440008, 0xa6430008, 0x97ac002e, 0xa64c000a, 0xae420000, 0xae440004, 0x9662000e, 0x2652fffc, 0x24420004, 0xa662000e, 0x9662000e, @@ -1924,55 +1932,55 @@ 0xafa2001c, 0x32c20080, 0x1040000c, 0x32c20100, 0x8ee27ba8, 0x24430001, 0x210c0, 0x571021, 0xaee37ba8, 0x8fa30018, 0x8fa4001c, 0xac437bac, -0xac447bb0, 0x8002ea4, 0xaee0725c, 0x10400072, +0xac447bb0, 0x8002ea0, 0xaee0725c, 0x10400072, 0x0, 0x8ee27ba8, 0x24430001, 0x210c0, 0x571021, 0xaee37ba8, 0x8fa30018, 0x8fa4001c, 0xac437bac, 0xac447bb0, 0x8ee27ba8, 0x10400063, 0x4821, 0x5021, 0x8f8200f0, 0x24480008, 0x27621800, 0x102102b, 0x50400001, 0x27681000, 0x8f8200f4, 0x15020007, 0x0, 0x8ee201b4, -0x8021, 0x24420001, 0xaee201b4, 0x8002dfe, +0x8021, 0x24420001, 0xaee201b4, 0x8002dfa, 0x8ee201b4, 0x8f8300f0, 0x24100001, 0x1571021, 0x8c447bac, 0x8c457bb0, 0xac640000, 0xac650004, 0xaf8800f0, 0x16000006, 0x2ea1021, 0x8ee20088, -0x24420001, 0xaee20088, 0x8002e43, 0x8ee20088, +0x24420001, 0xaee20088, 0x8002e3f, 0x8ee20088, 0x8c427bb0, 0x8ee400e0, 0x8ee500e4, 0x8ee67b9c, 0x401821, 0x1021, 0xa32821, 0xa3382b, 0x822021, 0x872021, 0x8ee204fc, 0xc93021, 0x63100, 0xaee400e0, 0xaee500e4, 0xc23021, 0x94c2000a, 0x240c0002, 0x21142, 0x30430003, 0x106c0016, 0x28620003, 0x10400005, 0x240c0001, -0x106c0008, 0x0, 0x8002e43, 0x0, -0x240c0003, 0x106c0017, 0x0, 0x8002e43, +0x106c0008, 0x0, 0x8002e3f, 0x0, +0x240c0003, 0x106c0017, 0x0, 0x8002e3f, 0x0, 0x8ee200e8, 0x8ee300ec, 0x24630001, 0x2c640001, 0x441021, 0xaee200e8, 0xaee300ec, -0x8ee200e8, 0x8002e43, 0x8ee300ec, 0x8ee200f0, +0x8ee200e8, 0x8002e3f, 0x8ee300ec, 0x8ee200f0, 0x8ee300f4, 0x24630001, 0x2c640001, 0x441021, -0xaee200f0, 0xaee300f4, 0x8ee200f0, 0x8002e43, +0xaee200f0, 0xaee300f4, 0x8ee200f0, 0x8002e3f, 0x8ee300f4, 0x8ee200f8, 0x8ee300fc, 0x24630001, 0x2c640001, 0x441021, 0xaee200f8, 0xaee300fc, 0x8ee200f8, 0x8ee300fc, 0x8ee27ba8, 0x25290001, 0x122102b, 0x1440ffa0, 0x254a0008, 0xa2e07b98, -0x8002ea3, 0xaee07ba8, 0x8f8200f0, 0x24470008, +0x8002e9f, 0xaee07ba8, 0x8f8200f0, 0x24470008, 0x27621800, 0xe2102b, 0x50400001, 0x27671000, 0x8f8200f4, 0x14e20007, 0x0, 0x8ee201b4, -0x8021, 0x24420001, 0xaee201b4, 0x8002e61, +0x8021, 0x24420001, 0xaee201b4, 0x8002e5d, 0x8ee201b4, 0x8f8200f0, 0x24100001, 0x8fa30018, 0x8fa4001c, 0xac430000, 0xac440004, 0xaf8700f0, 0x16000007, 0x0, 0x8ee20088, 0x24420001, -0xaee20088, 0x8ee20088, 0x8002ea4, 0xaee0725c, +0xaee20088, 0x8ee20088, 0x8002ea0, 0xaee0725c, 0x8ee2725c, 0x8ee400e0, 0x8ee500e4, 0x240c0002, 0x401821, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0x161142, 0x30430003, 0xaee400e0, 0xaee500e4, 0x106c0017, 0x2c620003, 0x10400005, 0x240c0001, 0x106c0008, 0x0, -0x8002ea4, 0xaee0725c, 0x240c0003, 0x106c0019, -0x0, 0x8002ea4, 0xaee0725c, 0x8ee200e8, +0x8002ea0, 0xaee0725c, 0x240c0003, 0x106c0019, +0x0, 0x8002ea0, 0xaee0725c, 0x8ee200e8, 0x8ee300ec, 0x24630001, 0x2c640001, 0x441021, 0xaee200e8, 0xaee300ec, 0x8ee200e8, 0x8ee300ec, -0x8002ea4, 0xaee0725c, 0x8ee200f0, 0x8ee300f4, +0x8002ea0, 0xaee0725c, 0x8ee200f0, 0x8ee300f4, 0x24630001, 0x2c640001, 0x441021, 0xaee200f0, -0xaee300f4, 0x8ee200f0, 0x8ee300f4, 0x8002ea4, +0xaee300f4, 0x8ee200f0, 0x8ee300f4, 0x8002ea0, 0xaee0725c, 0x8ee200f8, 0x8ee300fc, 0x24630001, 0x2c640001, 0x441021, 0xaee200f8, 0xaee300fc, 0x8ee200f8, 0x8ee300fc, 0xaee0725c, 0x8e62001c, @@ -1983,7 +1991,7 @@ 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a4, 0x8021, 0x24420001, 0xaee201a4, -0x8002f0b, 0x8ee201a4, 0x8ee204e4, 0xac62001c, +0x8002f07, 0x8ee201a4, 0x8ee204e4, 0xac62001c, 0x8ee404b0, 0x8ee504b4, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004, 0x8ee204c4, 0xac620010, @@ -1994,22 +2002,22 @@ 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x104c0007, 0x0, 0x8ee24e34, 0x24420001, 0x10620005, 0x0, -0x8002ef5, 0x0, 0x14600005, 0x0, +0x8002ef1, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, -0x8002f0b, 0x0, 0x8ee24e30, 0x240c0040, +0x8002f07, 0x0, 0x8ee24e30, 0x240c0040, 0x24420001, 0x504c0003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020012, 0x240c0001, 0xac820000, 0xac8c0004, 0x5600000d, 0x24100001, -0x8ee204e4, 0x3c040001, 0x24844f34, 0xafa00014, +0x8ee204e4, 0x3c040001, 0x24845754, 0xafa00014, 0xafa20010, 0x8ee60608, 0x8f470228, 0x3c050009, -0x34a5f006, 0xc002407, 0xafab0038, 0x8fab0038, -0x16000003, 0x240c0001, 0x8002f60, 0xa2ec04f4, +0x34a5f006, 0xc002403, 0xafab0038, 0x8fab0038, +0x16000003, 0x240c0001, 0x8002f5c, 0xa2ec04f4, 0x8ee20170, 0x24420001, 0xaee20170, 0x8ee20170, 0x8ee204e4, 0xa2e004f4, 0xaee004f0, 0xaee07274, 0xaee204f8, 0x8f42023c, 0x10400038, 0x0, -0x8ee20184, 0x24420001, 0xaee20184, 0x8002f60, +0x8ee20184, 0x24420001, 0xaee20184, 0x8002f5c, 0x8ee20184, 0x8ee20504, 0x240c0040, 0x24420001, 0x504c0003, 0x1021, 0x8ee20504, 0x24420001, 0xaee20504, 0x8ee20504, 0x8e630018, 0x240c0003, @@ -2017,10 +2025,10 @@ 0x3c020001, 0x571021, 0x904283b1, 0x10400014, 0x0, 0x8ee201d0, 0x8ee35240, 0x441021, 0xaee201d0, 0x8ee201d8, 0x641821, 0x306300ff, -0x8002f53, 0xaee35240, 0x8ee201cc, 0x8ee30e10, +0x8002f4f, 0xaee35240, 0x8ee201cc, 0x8ee30e10, 0x441021, 0xaee201cc, 0x8ee201d8, 0x641821, 0x306301ff, 0xaee30e10, 0x441021, 0xaee201d8, -0x8ee20000, 0x34420040, 0x8002f60, 0xaee20000, +0x8ee20000, 0x34420040, 0x8002f5c, 0xaee20000, 0x8ee2014c, 0x3c010001, 0x370821, 0xa02083e0, 0x24420001, 0xaee2014c, 0x8ee2014c, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8f820108, @@ -2049,40 +2057,40 @@ 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400c0, 0xaee500c4, 0xaf8800c8, 0xaf8700e4, -0x80034d0, 0xaf8700e8, 0x3c020001, 0x571021, +0x80034cc, 0xaf8700e8, 0x3c020001, 0x571021, 0x904283c0, 0x1040000b, 0x0, 0x3c140001, 0x297a021, 0x8e9483c4, 0x3c130001, 0x2779821, -0x8e7383c8, 0x3c120001, 0x2579021, 0x8003197, +0x8e7383c8, 0x3c120001, 0x2579021, 0x8003193, 0x8e5283cc, 0x8f8300e0, 0x8f8200e4, 0x10430007, 0x8821, 0x8f8200e4, 0x24110001, 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 0x1620000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010, 0x8f8200c8, -0x3c040001, 0x24845050, 0xafa20014, 0x8f8600e0, -0x8f8700e4, 0x3c050006, 0xc002407, 0x34a5f000, -0x80034d0, 0x0, 0x8fa3001c, 0x8fb20018, +0x3c040001, 0x24845870, 0xafa20014, 0x8f8600e0, +0x8f8700e4, 0x3c050006, 0xc002403, 0x34a5f000, +0x80034cc, 0x0, 0x8fa3001c, 0x8fb20018, 0x3074ffff, 0x2694fffc, 0x621024, 0x10400058, 0x2409821, 0x3c020080, 0x621024, 0x1040000a, 0x3c040040, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8ee201fc, 0x24420001, 0xaee201fc, -0x80034ca, 0x8ee201fc, 0x3c060004, 0x3c0b0001, +0x80034c6, 0x8ee201fc, 0x3c060004, 0x3c0b0001, 0x3c0a0002, 0x3c050010, 0x3c090008, 0x8ee20080, 0x3c080020, 0x34078000, 0x24420001, 0xaee20080, 0x8ee20080, 0x8fa2001c, 0x441824, 0x10660021, 0xc3102b, 0x14400007, 0x0, 0x106b0011, -0x0, 0x106a0015, 0x0, 0x800304d, +0x0, 0x106a0015, 0x0, 0x8003049, 0x42042, 0x10650023, 0xa3102b, 0x14400005, -0x0, 0x10690019, 0x0, 0x800304d, -0x42042, 0x10680021, 0x0, 0x800304d, +0x0, 0x10690019, 0x0, 0x8003049, +0x42042, 0x10680021, 0x0, 0x8003049, 0x42042, 0x8ee20034, 0x24420001, 0xaee20034, -0x8ee20034, 0x800304d, 0x42042, 0x8ee201ec, -0x24420001, 0xaee201ec, 0x8ee201ec, 0x800304d, +0x8ee20034, 0x8003049, 0x42042, 0x8ee201ec, +0x24420001, 0xaee201ec, 0x8ee201ec, 0x8003049, 0x42042, 0x8ee201f0, 0x24420001, 0xaee201f0, -0x8ee201f0, 0x800304d, 0x42042, 0x8ee201f4, -0x24420001, 0xaee201f4, 0x8ee201f4, 0x800304d, +0x8ee201f0, 0x8003049, 0x42042, 0x8ee201f4, +0x24420001, 0xaee201f4, 0x8ee201f4, 0x8003049, 0x42042, 0x8ee20030, 0x24420001, 0xaee20030, -0x8ee20030, 0x800304d, 0x42042, 0x8ee201f8, +0x8ee20030, 0x8003049, 0x42042, 0x8ee201f8, 0x24420001, 0xaee201f8, 0x8ee201f8, 0x42042, -0x1087047c, 0x0, 0x8003012, 0x0, +0x1087047c, 0x0, 0x800300e, 0x0, 0x3c020001, 0x571021, 0x904283b2, 0x14400084, 0x24020001, 0x3c030001, 0x771821, 0x906383b3, 0x1462007f, 0x3c020100, 0x8e430000, 0x621024, @@ -2097,7 +2105,7 @@ 0x94437782, 0x96620004, 0x50620008, 0x24070001, 0x3c020001, 0x571021, 0x8c4283b4, 0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, 0x30e200ff, -0x10400440, 0x0, 0x80030d9, 0x0, +0x10400440, 0x0, 0x80030d5, 0x0, 0x2402021, 0xc0022fe, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021, 0x9442727c, 0x30424000, 0x14400434, 0xb71021, 0x9443727e, 0x96620000, @@ -2106,14 +2114,14 @@ 0x94437282, 0x96620004, 0x10620035, 0x418c0, 0x2e31021, 0x9442727c, 0x30428000, 0x14400421, 0x2e31021, 0x944b727c, 0x96670000, 0xb28c0, -0xb71021, 0x9442737e, 0x80030bb, 0x3021, +0xb71021, 0x9442737e, 0x80030b7, 0x3021, 0x420c0, 0x2e41021, 0x9443737c, 0x2e41021, 0x944b737c, 0x30638000, 0x14600010, 0xb28c0, 0xb71021, 0x9442737e, 0x1447fff5, 0x1602021, 0xb71021, 0x94437380, 0x96620002, 0x5462fff1, 0x420c0, 0xb71021, 0x94437382, 0x96620004, 0x5462ffec, 0x420c0, 0x24060001, 0x30c200ff, -0x10400400, 0x0, 0x80030d9, 0x0, +0x10400400, 0x0, 0x80030d5, 0x0, 0x97430202, 0x96420000, 0x146203fa, 0x0, 0x97430204, 0x96420002, 0x146203f6, 0x0, 0x97430206, 0x96420004, 0x146203f2, 0x0, @@ -2130,7 +2138,7 @@ 0x971021, 0x94437782, 0x96620004, 0x50620008, 0x24070001, 0x3c020001, 0x571021, 0x8c4283b4, 0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, -0x30e200ff, 0x14400044, 0x240f0003, 0x80034ca, +0x30e200ff, 0x14400044, 0x240f0003, 0x80034c6, 0x0, 0x2402021, 0xc0022fe, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021, 0x9442727c, 0x30424000, 0x144003af, 0xb71021, 0x9443727e, @@ -2139,14 +2147,14 @@ 0xb71021, 0x94437282, 0x96620004, 0x10620027, 0x418c0, 0x2e31021, 0x9442727c, 0x30428000, 0x1440039c, 0x2e31021, 0x944b727c, 0x96670000, -0xb28c0, 0xb71021, 0x9442737e, 0x8003140, +0xb28c0, 0xb71021, 0x9442737e, 0x800313c, 0x3021, 0x420c0, 0x2e41021, 0x9443737c, 0x2e41021, 0x944b737c, 0x30638000, 0x14600010, 0xb28c0, 0xb71021, 0x9442737e, 0x1447fff5, 0x1602021, 0xb71021, 0x94437380, 0x96620002, 0x5462fff1, 0x420c0, 0xb71021, 0x94437382, 0x96620004, 0x5462ffec, 0x420c0, 0x24060001, -0x30c200ff, 0x1040037b, 0x0, 0x8003153, +0x30c200ff, 0x1040037b, 0x0, 0x800314f, 0x240f0003, 0x240f0001, 0xafaf002c, 0x8f420260, 0x54102b, 0x1040003a, 0x0, 0x8f8300e4, 0x8f8200e0, 0x10620003, 0x24630008, 0xaf8300e4, @@ -2155,14 +2163,14 @@ 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, -0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845058, +0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845878, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, -0xc002407, 0x34a5f003, 0x80034d0, 0x0, +0xc002403, 0x34a5f003, 0x80034cc, 0x0, 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, -0x24845064, 0xafa20014, 0x8ee60e10, 0x8ee70e18, -0x3c050006, 0xc002407, 0x34a5f002, 0x8ee201c0, +0x24845884, 0xafa20014, 0x8ee60e10, 0x8ee70e18, +0x3c050006, 0xc002403, 0x34a5f002, 0x8ee201c0, 0x24420001, 0xaee201c0, 0x8ee20000, 0x8ee301c0, -0x2403ffbf, 0x431024, 0x8003474, 0xaee20000, +0x2403ffbf, 0x431024, 0x8003470, 0xaee20000, 0x96e20468, 0x54102b, 0x10400003, 0x0, 0x240f0001, 0xa3af0027, 0x12800301, 0x24160007, 0x24150040, 0x241e0001, 0x240e0012, 0x8ee2724c, @@ -2170,7 +2178,7 @@ 0x0, 0x93a20027, 0x10400014, 0x0, 0x8ee35240, 0x8ee25244, 0x10620009, 0x26ed5244, 0x8ee65244, 0x8ee35244, 0x21140, 0x24425248, -0x2e28021, 0x24630001, 0x80031c3, 0x306b00ff, +0x2e28021, 0x24630001, 0x80031bf, 0x306b00ff, 0x92e27248, 0x1440ffca, 0x0, 0x8ee201e0, 0x24420001, 0xaee201e0, 0x8ee201e0, 0x8ee30e10, 0x8ee20e18, 0x1062ffc2, 0x26ed0e18, 0x8ee60e18, @@ -2193,7 +2201,7 @@ 0x50400001, 0x27693000, 0x8f820128, 0x11220004, 0x0, 0x8f820124, 0x15220007, 0x1401821, 0x8ee201a4, 0x8821, 0x24420001, 0xaee201a4, -0x8003250, 0x8ee201a4, 0x8e040000, 0x8e050004, +0x800324c, 0x8ee201a4, 0x8e040000, 0x8e050004, 0x1021, 0xad130008, 0xa507000e, 0xad160018, 0xad06001c, 0xa3302b, 0xa32823, 0x822023, 0x862023, 0xad040000, 0xad050004, 0x8ee204c0, @@ -2204,26 +2212,26 @@ 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10550007, 0x0, 0x8ee24e34, 0x24420001, 0x10620005, 0x0, -0x800323d, 0x0, 0x14600005, 0x0, +0x8003239, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, -0x8003250, 0x0, 0x8ee24e30, 0x24420001, +0x800324c, 0x0, 0x8ee24e30, 0x24420001, 0x50550003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac960000, 0xac9e0004, 0x16200018, -0x3c050006, 0x8e020018, 0x3c040001, 0x24845070, +0x3c050006, 0x8e020018, 0x3c040001, 0x24845890, 0xafa20010, 0x8e020000, 0x8e030004, 0x34a5f009, -0x2003021, 0xc002407, 0xafa30014, 0x93a20037, +0x2003021, 0xc002403, 0xafa30014, 0x93a20037, 0x10400216, 0x340f8100, 0x8e420004, 0x8e430008, 0x8e44000c, 0xa64f000c, 0xae420000, 0xae430004, -0xae440008, 0x96020016, 0x8003474, 0xa642000e, +0xae440008, 0x96020016, 0x8003470, 0xa642000e, 0x14ec0168, 0x28a1823, 0x960c000a, 0x9603000e, 0x28a1023, 0xa602000a, 0x34620004, 0xa602000e, 0x8f880120, 0x27623800, 0x25090020, 0x122102b, 0x14400002, 0x306affff, 0x27693000, 0x8f820128, 0x11220004, 0x0, 0x8f820124, 0x15220007, 0x24040020, 0x8ee201a4, 0x8821, 0x24420001, -0xaee201a4, 0x80032ce, 0x8ee201a4, 0x8ee5724c, +0xaee201a4, 0x80032ca, 0x8ee201a4, 0x8ee5724c, 0x8ee60490, 0x8ee70494, 0xa504000e, 0x24040004, 0xad100008, 0xad040018, 0x52940, 0xa01821, 0x1021, 0xe33821, 0xe3202b, 0xc23021, @@ -2235,22 +2243,22 @@ 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10550007, 0x0, 0x8ee24e34, 0x24420001, -0x10620005, 0x0, 0x80032bb, 0x0, +0x10620005, 0x0, 0x80032b7, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, -0x50400010, 0xac800000, 0x80032ce, 0x0, +0x50400010, 0xac800000, 0x80032ca, 0x0, 0x8ee24e30, 0x24420001, 0x50550003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac960000, 0xac9e0004, 0x1620000d, 0x0, 0xa60c000a, 0xa60a000e, 0x8f820100, 0xafa20010, 0x8f820104, -0x3c040001, 0x2484507c, 0x3c050006, 0xafa20014, -0x8ee6724c, 0x800343f, 0x34a5f00b, 0x3c010001, +0x3c040001, 0x2484589c, 0x3c050006, 0xafa20014, +0x8ee6724c, 0x800343b, 0x34a5f00b, 0x3c010001, 0x370821, 0xa02083c0, 0xadab0000, 0x8ee201d8, 0x8ee3724c, 0x2442ffff, 0xaee201d8, 0x8ee201d8, 0x24630001, 0x306307ff, 0x26e25244, 0x15a20006, 0xaee3724c, 0x8ee201d0, 0x2442ffff, 0xaee201d0, -0x80032f3, 0x8ee201d0, 0x8ee201cc, 0x2442ffff, +0x80032ef, 0x8ee201d0, 0x8ee201cc, 0x2442ffff, 0xaee201cc, 0x8ee201cc, 0x8f420240, 0x10400073, 0x0, 0x8ee20e1c, 0x24420001, 0xaee20e1c, 0x8f430240, 0x43102b, 0x14400176, 0xa021, @@ -2258,7 +2266,7 @@ 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a4, 0x8821, 0x24420001, 0xaee201a4, -0x8003353, 0x8ee201a4, 0x8ee2724c, 0xac62001c, +0x800334f, 0x8ee201a4, 0x8ee2724c, 0xac62001c, 0x8ee404a8, 0x8ee504ac, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004, 0x8ee204c4, 0xac620010, @@ -2268,23 +2276,23 @@ 0x8ee24e34, 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10550007, 0x0, 0x8ee24e34, -0x24420001, 0x10620005, 0x0, 0x8003340, +0x24420001, 0x10620005, 0x0, 0x800333c, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, -0x2c420011, 0x50400010, 0xac800000, 0x8003353, +0x2c420011, 0x50400010, 0xac800000, 0x800334f, 0x0, 0x8ee24e30, 0x24420001, 0x50550003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac8e0000, 0xac9e0004, 0x5620000d, 0x24110001, -0x8ee2724c, 0x3c040001, 0x24845088, 0xafa00014, +0x8ee2724c, 0x3c040001, 0x248458a8, 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, 0x3c050009, -0x34a5f008, 0xc002407, 0xafae0048, 0x8fae0048, +0x34a5f008, 0xc002403, 0xafae0048, 0x8fae0048, 0x56200001, 0xaee00e1c, 0x8ee20188, 0x24420001, -0xaee20188, 0x80033cc, 0x8ee20188, 0x8f830120, +0xaee20188, 0x80033c8, 0x8ee20188, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a4, -0x8821, 0x24420001, 0xaee201a4, 0x80033be, +0x8821, 0x24420001, 0xaee201a4, 0x80033ba, 0x8ee201a4, 0x8ee2724c, 0xac62001c, 0x8ee404a8, 0x8ee504ac, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, @@ -2295,24 +2303,24 @@ 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10550007, 0x0, 0x8ee24e34, 0x24420001, -0x10620005, 0x0, 0x80033ab, 0x0, +0x10620005, 0x0, 0x80033a7, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, -0x50400010, 0xac800000, 0x80033be, 0x0, +0x50400010, 0xac800000, 0x80033ba, 0x0, 0x8ee24e30, 0x24420001, 0x50550003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac8e0000, 0xac9e0004, 0x1620000d, 0x0, 0x8ee2724c, -0x3c040001, 0x24845088, 0xafa00014, 0xafa20010, +0x3c040001, 0x248458a8, 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, 0x3c050009, 0x34a5f008, -0xc002407, 0xafae0048, 0x8fae0048, 0x8ee20174, -0x24420001, 0xaee20174, 0x8ee20174, 0x8003472, +0xc002403, 0xafae0048, 0x8fae0048, 0x8ee20174, +0x24420001, 0xaee20174, 0x8ee20174, 0x800346e, 0xa021, 0x960c000a, 0x183102b, 0x54400001, 0x1801821, 0xa603000a, 0x8f880120, 0x27623800, 0x25090020, 0x122102b, 0x50400001, 0x27693000, 0x8f820128, 0x11220004, 0x0, 0x8f820124, 0x15220007, 0x24040020, 0x8ee201a4, 0x8821, -0x24420001, 0xaee201a4, 0x8003433, 0x8ee201a4, +0x24420001, 0xaee201a4, 0x800342f, 0x8ee201a4, 0x8ee5724c, 0x8ee60490, 0x8ee70494, 0xa504000e, 0x24040004, 0xad100008, 0xad040018, 0x52940, 0xa01821, 0x1021, 0xe33821, 0xe3202b, @@ -2324,21 +2332,21 @@ 0x8ee24e34, 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10550007, 0x0, 0x8ee24e34, -0x24420001, 0x10620005, 0x0, 0x8003420, +0x24420001, 0x10620005, 0x0, 0x800341c, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, -0x2c420011, 0x50400010, 0xac800000, 0x8003433, +0x2c420011, 0x50400010, 0xac800000, 0x800342f, 0x0, 0x8ee24e30, 0x24420001, 0x50550003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac960000, 0xac9e0004, 0x1620001d, 0x0, 0xa60c000a, 0x8f820100, 0xafa20010, 0x8f820104, -0x3c040001, 0x2484507c, 0x3c050006, 0xafa20014, -0x8ee6724c, 0x34a5f00d, 0xc002407, 0x2003821, +0x3c040001, 0x2484589c, 0x3c050006, 0xafa20014, +0x8ee6724c, 0x34a5f00d, 0xc002403, 0x2003821, 0x93a20037, 0x10400031, 0x340f8100, 0x8e420004, 0x8e430008, 0x8e44000c, 0xa64f000c, 0xae420000, 0xae430004, 0xae440008, 0x96020016, 0xa642000e, -0x9602000e, 0x3042fdff, 0x8003474, 0xa602000e, +0x9602000e, 0x3042fdff, 0x8003470, 0xa602000e, 0x8ee201d8, 0x2442ffff, 0xaee201d8, 0x8ee201d8, 0x8ee201cc, 0x3c04001f, 0x3c010001, 0x370821, 0xa03e83c0, 0x2442ffff, 0xaee201cc, 0x9603000a, @@ -2355,8 +2363,8 @@ 0x24420004, 0x3c010001, 0x370821, 0xac2283cc, 0x8ee2724c, 0x8f430280, 0x24420001, 0x304207ff, 0x14620006, 0x0, 0x8ee201c4, 0x24420001, -0xaee201c4, 0x80034d0, 0x8ee201c4, 0x8ee201bc, -0x24420001, 0xaee201bc, 0x80034d0, 0x8ee201bc, +0xaee201c4, 0x80034cc, 0x8ee201c4, 0x8ee201bc, +0x24420001, 0xaee201bc, 0x80034cc, 0x8ee201bc, 0x97a4001e, 0x2484fffc, 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400c0, 0xaee500c4, @@ -2364,9 +2372,9 @@ 0x14400017, 0x24020003, 0x15e20015, 0x0, 0x8ee200d0, 0x8ee300d4, 0x24630001, 0x2c640001, 0x441021, 0xaee200d0, 0xaee300d4, 0x8ee200d0, -0x80034ca, 0x8ee300d4, 0x8ee200d8, 0x8ee300dc, +0x80034c6, 0x8ee300d4, 0x8ee200d8, 0x8ee300dc, 0x24630001, 0x2c640001, 0x441021, 0xaee200d8, -0xaee300dc, 0x8ee200d8, 0x80034ca, 0x8ee300dc, +0xaee300dc, 0x8ee200d8, 0x80034c6, 0x8ee300dc, 0x8ee200c8, 0x8ee300cc, 0x24630001, 0x2c640001, 0x441021, 0xaee200c8, 0xaee300cc, 0x8ee200c8, 0x8ee300cc, 0x8f8300e4, 0x8f8200e0, 0x10620003, @@ -2387,40 +2395,40 @@ 0x822021, 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400c0, 0xaee500c4, 0xaf8800c8, -0xaf8700e4, 0x8003854, 0xaf8700e8, 0x3c020001, +0xaf8700e4, 0x8003850, 0xaf8700e8, 0x3c020001, 0x571021, 0x904283c0, 0x1040000b, 0x0, 0x3c130001, 0x2779821, 0x8e7383c4, 0x3c110001, 0x2378821, 0x8e3183c8, 0x3c120001, 0x2579021, -0x80036ec, 0x8e5283cc, 0x8f8300e0, 0x8f8200e4, +0x80036e8, 0x8e5283cc, 0x8f8300e0, 0x8f8200e4, 0x10430007, 0x4821, 0x8f8200e4, 0x24090001, 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 0x1520000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010, -0x8f8200c8, 0x3c040001, 0x24845050, 0xafa20014, -0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002407, -0x34a5f000, 0x8003854, 0x0, 0x8fa3001c, +0x8f8200c8, 0x3c040001, 0x24845870, 0xafa20014, +0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002403, +0x34a5f000, 0x8003850, 0x0, 0x8fa3001c, 0x8fb20018, 0x3073ffff, 0x2673fffc, 0x621024, 0x10400058, 0x2408821, 0x3c020080, 0x621024, 0x1040000a, 0x3c040040, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8ee201fc, 0x24420001, -0xaee201fc, 0x800384e, 0x8ee201fc, 0x3c060004, +0xaee201fc, 0x800384a, 0x8ee201fc, 0x3c060004, 0x3c0b0001, 0x3c0a0002, 0x3c050010, 0x3c090008, 0x8ee20080, 0x3c080020, 0x34078000, 0x24420001, 0xaee20080, 0x8ee20080, 0x8fa2001c, 0x441824, 0x10660021, 0xc3102b, 0x14400007, 0x0, 0x106b0011, 0x0, 0x106a0015, 0x0, -0x8003596, 0x42042, 0x10650023, 0xa3102b, +0x8003592, 0x42042, 0x10650023, 0xa3102b, 0x14400005, 0x0, 0x10690019, 0x0, -0x8003596, 0x42042, 0x10680021, 0x0, -0x8003596, 0x42042, 0x8ee20034, 0x24420001, -0xaee20034, 0x8ee20034, 0x8003596, 0x42042, +0x8003592, 0x42042, 0x10680021, 0x0, +0x8003592, 0x42042, 0x8ee20034, 0x24420001, +0xaee20034, 0x8ee20034, 0x8003592, 0x42042, 0x8ee201ec, 0x24420001, 0xaee201ec, 0x8ee201ec, -0x8003596, 0x42042, 0x8ee201f0, 0x24420001, -0xaee201f0, 0x8ee201f0, 0x8003596, 0x42042, +0x8003592, 0x42042, 0x8ee201f0, 0x24420001, +0xaee201f0, 0x8ee201f0, 0x8003592, 0x42042, 0x8ee201f4, 0x24420001, 0xaee201f4, 0x8ee201f4, -0x8003596, 0x42042, 0x8ee20030, 0x24420001, -0xaee20030, 0x8ee20030, 0x8003596, 0x42042, +0x8003592, 0x42042, 0x8ee20030, 0x24420001, +0xaee20030, 0x8ee20030, 0x8003592, 0x42042, 0x8ee201f8, 0x24420001, 0xaee201f8, 0x8ee201f8, -0x42042, 0x108702b7, 0x0, 0x800355b, +0x42042, 0x108702b7, 0x0, 0x8003557, 0x0, 0x3c020001, 0x571021, 0x904283b2, 0x14400084, 0x24020001, 0x3c030001, 0x771821, 0x906383b3, 0x1462007f, 0x3c020100, 0x8e430000, @@ -2435,7 +2443,7 @@ 0x971021, 0x94437782, 0x96220004, 0x50620008, 0x24070001, 0x3c020001, 0x571021, 0x8c4283b4, 0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, -0x30e200ff, 0x1040027b, 0x0, 0x8003622, +0x30e200ff, 0x1040027b, 0x0, 0x800361e, 0x0, 0x2402021, 0xc0022fe, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021, 0x9442727c, 0x30424000, 0x1440026f, 0xb71021, 0x9443727e, @@ -2444,14 +2452,14 @@ 0xb71021, 0x94437282, 0x96220004, 0x10620035, 0x418c0, 0x2e31021, 0x9442727c, 0x30428000, 0x1440025c, 0x2e31021, 0x9448727c, 0x96270000, -0x828c0, 0xb71021, 0x9442737e, 0x8003604, +0x828c0, 0xb71021, 0x9442737e, 0x8003600, 0x3021, 0x420c0, 0x2e41021, 0x9443737c, 0x2e41021, 0x9448737c, 0x30638000, 0x14600010, 0x828c0, 0xb71021, 0x9442737e, 0x1447fff5, 0x1002021, 0xb71021, 0x94437380, 0x96220002, 0x5462fff1, 0x420c0, 0xb71021, 0x94437382, 0x96220004, 0x5462ffec, 0x420c0, 0x24060001, -0x30c200ff, 0x1040023b, 0x0, 0x8003622, +0x30c200ff, 0x1040023b, 0x0, 0x800361e, 0x0, 0x97430202, 0x96420000, 0x14620235, 0x0, 0x97430204, 0x96420002, 0x14620231, 0x0, 0x97430206, 0x96420004, 0x1462022d, @@ -2469,7 +2477,7 @@ 0x50620008, 0x24070001, 0x3c020001, 0x571021, 0x8c4283b4, 0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, 0x30e200ff, 0x14400044, 0x24140003, -0x800384e, 0x0, 0x2402021, 0xc0022fe, +0x800384a, 0x0, 0x2402021, 0xc0022fe, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021, 0x9442727c, 0x30424000, 0x144001ea, 0xb71021, 0x9443727e, 0x96220000, 0x1462000b, 0x418c0, @@ -2478,14 +2486,14 @@ 0x10620027, 0x418c0, 0x2e31021, 0x9442727c, 0x30428000, 0x144001d7, 0x2e31021, 0x9448727c, 0x96270000, 0x828c0, 0xb71021, 0x9442737e, -0x8003689, 0x3021, 0x420c0, 0x2e41021, +0x8003685, 0x3021, 0x420c0, 0x2e41021, 0x9443737c, 0x2e41021, 0x9448737c, 0x30638000, 0x14600010, 0x828c0, 0xb71021, 0x9442737e, 0x1447fff5, 0x1002021, 0xb71021, 0x94437380, 0x96220002, 0x5462fff1, 0x420c0, 0xb71021, 0x94437382, 0x96220004, 0x5462ffec, 0x420c0, 0x24060001, 0x30c200ff, 0x104001b6, 0x0, -0x800369c, 0x24140003, 0x24140001, 0x8f420260, +0x8003698, 0x24140003, 0x24140001, 0x8f420260, 0x53102b, 0x10400049, 0x0, 0x8f8300e4, 0x8f8200e0, 0x10620003, 0x24630008, 0xaf8300e4, 0xaf8300e8, 0x8ee400c0, 0x8ee500c4, 0x2601821, @@ -2493,25 +2501,25 @@ 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, -0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845058, +0xafa20010, 0x8f8200e4, 0x3c040001, 0x24845878, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, -0xc002407, 0x34a5f003, 0x8003854, 0x0, +0xc002403, 0x34a5f003, 0x8003850, 0x0, 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, -0x24845064, 0xafa20014, 0x8ee60e10, 0x8ee70e18, -0xc002407, 0x34a5f002, 0x8ee201c0, 0x24420001, +0x24845884, 0xafa20014, 0x8ee60e10, 0x8ee70e18, +0xc002403, 0x34a5f002, 0x8ee201c0, 0x24420001, 0xaee201c0, 0x8ee20000, 0x8ee301c0, 0x2403ffbf, -0x431024, 0x80037fc, 0xaee20000, 0x8ee25240, -0xafa20010, 0x8ee25244, 0x3c040001, 0x24845064, +0x431024, 0x80037f8, 0xaee20000, 0x8ee25240, +0xafa20010, 0x8ee25244, 0x3c040001, 0x24845884, 0xafa20014, 0x8ee60e10, 0x8ee70e18, 0x3c050006, -0xc002407, 0x34a5f002, 0x8ee201c0, 0x24420001, -0xaee201c0, 0x80037fc, 0x8ee201c0, 0x96e20468, +0xc002403, 0x34a5f002, 0x8ee201c0, 0x24420001, +0xaee201c0, 0x80037f8, 0x8ee201c0, 0x96e20468, 0x53102b, 0x54400001, 0x3c158000, 0x12600131, 0x3c0c001f, 0x358cffff, 0x8ee2724c, 0x8f430280, 0x24420001, 0x304207ff, 0x10620108, 0x0, 0x12a00014, 0x0, 0x8ee35240, 0x8ee25244, 0x10620009, 0x26ee5244, 0x8eeb5244, 0x8ee35244, 0x21140, 0x24425248, 0x2e28021, 0x24630001, -0x8003716, 0x306800ff, 0x92e27248, 0x1440ffc0, +0x8003712, 0x306800ff, 0x92e27248, 0x1440ffc0, 0x3c050006, 0x8ee201e0, 0x24420001, 0xaee201e0, 0x8ee201e0, 0x8ee30e10, 0x8ee20e18, 0x1062ffcb, 0x26ee0e18, 0x8eeb0e18, 0xa821, 0x8ee30e18, @@ -2532,7 +2540,7 @@ 0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x10600013, 0x26220010, 0x182102b, 0x1040000e, 0x0, 0x3c07fff5, 0xf13821, -0x94e71010, 0x8003762, 0x24e7000e, 0x92220017, +0x94e71010, 0x800375e, 0x24e7000e, 0x92220017, 0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x50600004, 0xae110018, 0x96270010, 0x24e7000e, 0xae110018, 0x3c020001, 0x571021, @@ -2541,7 +2549,7 @@ 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x2402000b, 0x8ee201a4, 0x4821, 0x24420001, -0xaee201a4, 0x80037c3, 0x8ee201a4, 0x8e040000, +0xaee201a4, 0x80037bf, 0x8ee201a4, 0x8e040000, 0x8e050004, 0xac620018, 0x1751025, 0x491025, 0xac710008, 0xa467000e, 0xac62001c, 0xac640000, 0xac650004, 0x8ee204c0, 0xac620010, 0xaf860120, @@ -2552,23 +2560,23 @@ 0x24420001, 0xac820004, 0x8ee34e34, 0x8ee54e30, 0x24020040, 0x24630001, 0x10620007, 0x0, 0x8ee24e34, 0x24420001, 0x10a20005, 0x0, -0x80037ad, 0x0, 0x14a00005, 0x0, +0x80037a9, 0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, -0x80037c3, 0x0, 0x8ee24e30, 0x24030040, +0x80037bf, 0x0, 0x8ee24e30, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x15200018, 0x3c050006, -0x8e020018, 0x3c040001, 0x24845070, 0xafa20010, +0x8e020018, 0x3c040001, 0x24845890, 0xafa20010, 0x8e020000, 0x8e030004, 0x34a5f009, 0x2003021, -0xc002407, 0xafa30014, 0x32c200ff, 0x1040002b, +0xc002403, 0xafa30014, 0x32c200ff, 0x1040002b, 0x34028100, 0x8e430004, 0x8e440008, 0x8e45000c, 0xa642000c, 0xae430000, 0xae440004, 0xae450008, -0x96020016, 0x80037fc, 0xa642000e, 0x154d000a, +0x96020016, 0x80037f8, 0xa642000e, 0x154d000a, 0x0, 0x9602000e, 0xa613000a, 0x34420004, 0xa602000e, 0x3c010001, 0x370821, 0xa02083c0, -0x80037fa, 0x9821, 0x9604000a, 0x93102b, +0x80037f6, 0x9821, 0x9604000a, 0x93102b, 0x10400002, 0x2601821, 0x801821, 0x24020001, 0xa603000a, 0x3c010001, 0x370821, 0xa02283c0, 0x9604000a, 0x2248821, 0x191102b, 0x10400003, @@ -2580,8 +2588,8 @@ 0x571021, 0x8c4283cc, 0x24420004, 0x3c010001, 0x370821, 0xac2283cc, 0x8ee2724c, 0x8f430280, 0x24420001, 0x14620006, 0x0, 0x8ee201c4, -0x24420001, 0xaee201c4, 0x8003854, 0x8ee201c4, -0x8ee201bc, 0x24420001, 0xaee201bc, 0x8003854, +0x24420001, 0xaee201c4, 0x8003850, 0x8ee201c4, +0x8ee201bc, 0x24420001, 0xaee201bc, 0x8003850, 0x8ee201bc, 0x97a4001e, 0x2484fffc, 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0x24020002, @@ -2589,9 +2597,9 @@ 0x14400017, 0x24020003, 0x16820015, 0x0, 0x8ee200d0, 0x8ee300d4, 0x24630001, 0x2c640001, 0x441021, 0xaee200d0, 0xaee300d4, 0x8ee200d0, -0x800384e, 0x8ee300d4, 0x8ee200d8, 0x8ee300dc, +0x800384a, 0x8ee300d4, 0x8ee200d8, 0x8ee300dc, 0x24630001, 0x2c640001, 0x441021, 0xaee200d8, -0xaee300dc, 0x8ee200d8, 0x800384e, 0x8ee300dc, +0xaee300dc, 0x8ee200d8, 0x800384a, 0x8ee300dc, 0x8ee200c8, 0x8ee300cc, 0x24630001, 0x2c640001, 0x441021, 0xaee200c8, 0xaee300cc, 0x8ee200c8, 0x8ee300cc, 0x8f8300e4, 0x8f8200e0, 0x10620003, @@ -2612,40 +2620,40 @@ 0x822021, 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400c0, 0xaee500c4, 0xaf8800c8, -0xaf8700e4, 0x8003c5f, 0xaf8700e8, 0x3c020001, +0xaf8700e4, 0x8003c5b, 0xaf8700e8, 0x3c020001, 0x571021, 0x904283c0, 0x1040000b, 0x0, 0x3c130001, 0x2779821, 0x8e7383c4, 0x3c100001, 0x2178021, 0x8e1083c8, 0x3c120001, 0x2579021, -0x8003a5d, 0x8e5283cc, 0x8f8300e0, 0x8f8200e4, +0x8003a59, 0x8e5283cc, 0x8f8300e0, 0x8f8200e4, 0x10430007, 0x3821, 0x8f8200e4, 0x24070001, 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 0x14e0000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010, -0x8f8200c8, 0x3c040001, 0x24845094, 0xafa20014, -0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002407, -0x34a5f200, 0x8003c5f, 0x0, 0x8fa3001c, +0x8f8200c8, 0x3c040001, 0x248458b4, 0xafa20014, +0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002403, +0x34a5f200, 0x8003c5b, 0x0, 0x8fa3001c, 0x8fb20018, 0x3073ffff, 0x2673fffc, 0x621024, 0x10400058, 0x2408021, 0x3c020080, 0x621024, 0x1040000a, 0x3c040040, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8ee201fc, 0x24420001, -0xaee201fc, 0x8003c59, 0x8ee201fc, 0x3c060004, +0xaee201fc, 0x8003c55, 0x8ee201fc, 0x3c060004, 0x3c0b0001, 0x3c0a0002, 0x3c050010, 0x3c090008, 0x8ee20080, 0x3c080020, 0x34078000, 0x24420001, 0xaee20080, 0x8ee20080, 0x8fa2001c, 0x441824, 0x10660021, 0xc3102b, 0x14400007, 0x0, 0x106b0011, 0x0, 0x106a0015, 0x0, -0x800391a, 0x42042, 0x10650023, 0xa3102b, +0x8003916, 0x42042, 0x10650023, 0xa3102b, 0x14400005, 0x0, 0x10690019, 0x0, -0x800391a, 0x42042, 0x10680021, 0x0, -0x800391a, 0x42042, 0x8ee20034, 0x24420001, -0xaee20034, 0x8ee20034, 0x800391a, 0x42042, +0x8003916, 0x42042, 0x10680021, 0x0, +0x8003916, 0x42042, 0x8ee20034, 0x24420001, +0xaee20034, 0x8ee20034, 0x8003916, 0x42042, 0x8ee201ec, 0x24420001, 0xaee201ec, 0x8ee201ec, -0x800391a, 0x42042, 0x8ee201f0, 0x24420001, -0xaee201f0, 0x8ee201f0, 0x800391a, 0x42042, +0x8003916, 0x42042, 0x8ee201f0, 0x24420001, +0xaee201f0, 0x8ee201f0, 0x8003916, 0x42042, 0x8ee201f4, 0x24420001, 0xaee201f4, 0x8ee201f4, -0x800391a, 0x42042, 0x8ee20030, 0x24420001, -0xaee20030, 0x8ee20030, 0x800391a, 0x42042, +0x8003916, 0x42042, 0x8ee20030, 0x24420001, +0xaee20030, 0x8ee20030, 0x8003916, 0x42042, 0x8ee201f8, 0x24420001, 0xaee201f8, 0x8ee201f8, -0x42042, 0x1087033e, 0x0, 0x80038df, +0x42042, 0x1087033e, 0x0, 0x80038db, 0x0, 0x3c020001, 0x571021, 0x904283b2, 0x14400084, 0x24020001, 0x3c030001, 0x771821, 0x906383b3, 0x1462007f, 0x3c020100, 0x8e430000, @@ -2660,7 +2668,7 @@ 0x971021, 0x94437782, 0x96020004, 0x50620008, 0x24070001, 0x3c020001, 0x571021, 0x8c4283b4, 0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, -0x30e200ff, 0x10400302, 0x0, 0x80039a6, +0x30e200ff, 0x10400302, 0x0, 0x80039a2, 0x0, 0x2402021, 0xc0022fe, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021, 0x9442727c, 0x30424000, 0x144002f6, 0xb71021, 0x9443727e, @@ -2669,14 +2677,14 @@ 0xb71021, 0x94437282, 0x96020004, 0x10620035, 0x418c0, 0x2e31021, 0x9442727c, 0x30428000, 0x144002e3, 0x2e31021, 0x944d727c, 0x96070000, -0xd28c0, 0xb71021, 0x9442737e, 0x8003988, +0xd28c0, 0xb71021, 0x9442737e, 0x8003984, 0x3021, 0x420c0, 0x2e41021, 0x9443737c, 0x2e41021, 0x944d737c, 0x30638000, 0x14600010, 0xd28c0, 0xb71021, 0x9442737e, 0x1447fff5, 0x1a02021, 0xb71021, 0x94437380, 0x96020002, 0x5462fff1, 0x420c0, 0xb71021, 0x94437382, 0x96020004, 0x5462ffec, 0x420c0, 0x24060001, -0x30c200ff, 0x104002c2, 0x0, 0x80039a6, +0x30c200ff, 0x104002c2, 0x0, 0x80039a2, 0x0, 0x97430202, 0x96420000, 0x146202bc, 0x0, 0x97430204, 0x96420002, 0x146202b8, 0x0, 0x97430206, 0x96420004, 0x146202b4, @@ -2694,7 +2702,7 @@ 0x50620008, 0x24070001, 0x3c020001, 0x571021, 0x8c4283b4, 0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, 0x30e200ff, 0x14400044, 0x24150003, -0x8003c59, 0x0, 0x2402021, 0xc0022fe, +0x8003c55, 0x0, 0x2402021, 0xc0022fe, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021, 0x9442727c, 0x30424000, 0x14400271, 0xb71021, 0x9443727e, 0x96020000, 0x1462000b, 0x418c0, @@ -2703,14 +2711,14 @@ 0x10620027, 0x418c0, 0x2e31021, 0x9442727c, 0x30428000, 0x1440025e, 0x2e31021, 0x944d727c, 0x96070000, 0xd28c0, 0xb71021, 0x9442737e, -0x8003a0d, 0x3021, 0x420c0, 0x2e41021, +0x8003a09, 0x3021, 0x420c0, 0x2e41021, 0x9443737c, 0x2e41021, 0x944d737c, 0x30638000, 0x14600010, 0xd28c0, 0xb71021, 0x9442737e, 0x1447fff5, 0x1a02021, 0xb71021, 0x94437380, 0x96020002, 0x5462fff1, 0x420c0, 0xb71021, 0x94437382, 0x96020004, 0x5462ffec, 0x420c0, 0x24060001, 0x30c200ff, 0x1040023d, 0x0, -0x8003a20, 0x24150003, 0x24150001, 0x8f420260, +0x8003a1c, 0x24150003, 0x24150001, 0x8f420260, 0x53102b, 0x10400036, 0x0, 0x8f8300e4, 0x8f8200e0, 0x10620003, 0x24630008, 0xaf8300e4, 0xaf8300e8, 0x8ee400c0, 0x8ee500c4, 0x2601821, @@ -2718,13 +2726,13 @@ 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, -0xafa20010, 0x8f8200e4, 0x3c040001, 0x248450a0, +0xafa20010, 0x8f8200e4, 0x3c040001, 0x248458c0, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, -0xc002407, 0x34a5f203, 0x8003c5f, 0x0, +0xc002403, 0x34a5f203, 0x8003c5b, 0x0, 0x8ee25240, 0xafa20010, 0x8ee25244, 0x3c040001, -0x248450ac, 0xafa20014, 0x8ee60e10, 0x8ee70e18, -0x3c050006, 0xc002407, 0x34a5f202, 0x8ee201c0, -0x24420001, 0xaee201c0, 0x8003c06, 0x8ee201c0, +0x248458cc, 0xafa20014, 0x8ee60e10, 0x8ee70e18, +0x3c050006, 0xc002403, 0x34a5f202, 0x8ee201c0, +0x24420001, 0xaee201c0, 0x8003c02, 0x8ee201c0, 0x96e20468, 0x53102b, 0x54400001, 0x3c168000, 0x126001cb, 0x3c0e001f, 0x35ceffff, 0x3c0ffff5, 0x35ef1000, 0x241e0040, 0x8ee2724c, 0x8f430280, @@ -2732,7 +2740,7 @@ 0x12c00012, 0x0, 0x8ee35240, 0x8ee25244, 0x1062000a, 0x26f85244, 0x8ef45244, 0xafb80024, 0x8ee35244, 0x21140, 0x24425248, 0x2e28821, -0x24630001, 0x8003a89, 0x306d00ff, 0x8ee201e0, +0x24630001, 0x8003a85, 0x306d00ff, 0x8ee201e0, 0x24420001, 0xaee201e0, 0x8ee201e0, 0x8ee30e10, 0x8ee20e18, 0x1062ffca, 0x26f80e18, 0x8ef40e18, 0xb021, 0xafb80024, 0x8ee30e18, 0x21140, @@ -2751,7 +2759,7 @@ 0x2418fff8, 0x58c824, 0x6a1821, 0x79102b, 0x10400002, 0x3206021, 0x606021, 0x1801821, 0x24620007, 0x2418fff8, 0x586024, 0x26c102b, -0x14400004, 0x1932823, 0x1832823, 0x8003ac7, +0x14400004, 0x1932823, 0x1832823, 0x8003ac3, 0xc31021, 0xd31021, 0x4a2023, 0x1c4102b, 0x54400001, 0x8f2021, 0x25420040, 0x4c102b, 0x14400035, 0x5821, 0x94c3000c, 0x24020800, @@ -2761,7 +2769,7 @@ 0x461021, 0x90421017, 0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x10600014, 0x24c20010, 0x1c2102b, 0x1040000e, 0x0, -0x3c0bfff5, 0x1665821, 0x956b1010, 0x8003af8, +0x3c0bfff5, 0x1665821, 0x956b1010, 0x8003af4, 0x2562000e, 0x90c20017, 0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x10600005, 0x1601821, 0x94cb0010, 0x2562000e, 0x4a5821, @@ -2774,13 +2782,13 @@ 0x1c4102b, 0x10400002, 0x24a5ffff, 0x8f2021, 0x50a00012, 0x81c02, 0x2ca20002, 0x54400009, 0x24a5ffff, 0x94820000, 0x24840002, 0x1024021, -0x1c4102b, 0x10400006, 0x24a5fffe, 0x8003b25, +0x1c4102b, 0x10400006, 0x24a5fffe, 0x8003b21, 0x8f2021, 0x90820000, 0x21200, 0x1024021, 0x14a0fff2, 0x2ca20002, 0x81c02, 0x3102ffff, 0x624021, 0x3108ffff, 0x1402821, 0x11400011, 0x2002021, 0x2ca20002, 0x54400009, 0x24a5ffff, 0x94820000, 0x24840002, 0x1024021, 0x1c4102b, -0x10400006, 0x24a5fffe, 0x8003b3c, 0x8f2021, +0x10400006, 0x24a5fffe, 0x8003b38, 0x8f2021, 0x90820000, 0x21200, 0x1024021, 0x14a0fff2, 0x2ca20002, 0x81c02, 0x3102ffff, 0x624021, 0x81c02, 0x3102ffff, 0x8f890120, 0x624021, @@ -2788,7 +2796,7 @@ 0x3108ffff, 0x27633000, 0x8f820128, 0x10620004, 0x0, 0x8f820124, 0x14620007, 0x1402821, 0x8ee201a4, 0x3821, 0x24420001, 0xaee201a4, -0x8003bcd, 0x8ee201a4, 0x8e260000, 0x8e270004, +0x8003bc9, 0x8ee201a4, 0x8e260000, 0x8e270004, 0x81400, 0x3448000b, 0xad300008, 0xa52b000e, 0xad280018, 0x8fb80044, 0x2021, 0x2961025, 0x581025, 0xad22001c, 0xe5102b, 0xe53823, @@ -2801,32 +2809,32 @@ 0x8ee34e30, 0x8ee24e34, 0x1062000b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x105e002a, 0x0, -0x8003bac, 0x0, 0x8ee24e30, 0x24420001, +0x8003ba8, 0x0, 0x8ee24e30, 0x24420001, 0x505e0003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, -0x2e22021, 0x8003bca, 0x24020012, 0x8ee24e30, +0x2e22021, 0x8003bc6, 0x24020012, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f, 0x0, 0x8ee34e30, 0x8ee24e34, 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x105e0007, 0x0, 0x8ee24e34, -0x24420001, 0x10620005, 0x0, 0x8003bb8, +0x24420001, 0x10620005, 0x0, 0x8003bb4, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, -0x2c420011, 0x50400012, 0xac800000, 0x8003bcd, +0x2c420011, 0x50400012, 0xac800000, 0x8003bc9, 0x0, 0x8ee24e30, 0x24420001, 0x505e0003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, -0x14e00019, 0x3c050006, 0x3c040001, 0x24845070, +0x14e00019, 0x3c050006, 0x3c040001, 0x24845890, 0x8e220018, 0x34a5f209, 0xafa20010, 0x8e220000, -0x8e230004, 0x2203021, 0x1603821, 0xc002407, +0x8e230004, 0x2203021, 0x1603821, 0xc002403, 0xafa30014, 0x93a2002f, 0x1040002a, 0x34028100, 0x8e430004, 0x8e440008, 0x8e45000c, 0xa642000c, 0xae430000, 0xae440004, 0xae450008, 0x96220016, -0x8003c06, 0xa642000e, 0x1599000a, 0x26a1823, +0x8003c02, 0xa642000e, 0x1599000a, 0x26a1823, 0x9622000e, 0xa623000a, 0x34420004, 0xa622000e, -0x3c010001, 0x370821, 0xa02083c0, 0x8003c03, +0x3c010001, 0x370821, 0xa02083c0, 0x8003bff, 0x9821, 0x9624000a, 0x83102b, 0x54400001, 0x801821, 0x24020001, 0xa623000a, 0x3c010001, 0x370821, 0xa02283c0, 0x9622000a, 0x4a1821, @@ -2839,18 +2847,18 @@ 0x571021, 0x8c4283cc, 0x24420004, 0x3c010001, 0x370821, 0xac2283cc, 0x8f430280, 0x8ee2724c, 0x14620006, 0x0, 0x8ee201c4, 0x24420001, -0xaee201c4, 0x8003c5f, 0x8ee201c4, 0x8ee201bc, -0x24420001, 0xaee201bc, 0x8003c5f, 0x8ee201bc, +0xaee201c4, 0x8003c5b, 0x8ee201c4, 0x8ee201bc, +0x24420001, 0xaee201bc, 0x8003c5b, 0x8ee201bc, 0x97a4001e, 0x2484fffc, 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0x24020002, 0xaee400c0, 0xaee500c4, 0x12a2000f, 0x2aa20003, 0x14400017, 0x24020003, 0x16a20015, 0x0, 0x8ee200d0, 0x8ee300d4, 0x24630001, 0x2c640001, 0x441021, -0xaee200d0, 0xaee300d4, 0x8ee200d0, 0x8003c59, +0xaee200d0, 0xaee300d4, 0x8ee200d0, 0x8003c55, 0x8ee300d4, 0x8ee200d8, 0x8ee300dc, 0x24630001, 0x2c640001, 0x441021, 0xaee200d8, 0xaee300dc, -0x8ee200d8, 0x8003c59, 0x8ee300dc, 0x8ee200c8, +0x8ee200d8, 0x8003c55, 0x8ee300dc, 0x8ee200c8, 0x8ee300cc, 0x24630001, 0x2c640001, 0x441021, 0xaee200c8, 0xaee300cc, 0x8ee200c8, 0x8ee300cc, 0x8f8300e4, 0x8f8200e0, 0x10620003, 0x24630008, @@ -2861,14 +2869,14 @@ 0x8ee20e0c, 0x10620074, 0x0, 0x8ee30e0c, 0x8ee20e14, 0x622023, 0x4820001, 0x24840200, 0x8ee30e18, 0x8ee20e14, 0x43102b, 0x14400004, -0x24020200, 0x8ee30e14, 0x8003c81, 0x431823, +0x24020200, 0x8ee30e14, 0x8003c7d, 0x431823, 0x8ee20e18, 0x8ee30e14, 0x431023, 0x2443ffff, 0x804821, 0x69102a, 0x54400001, 0x604821, 0x8f870100, 0x27623000, 0x24e80020, 0x102102b, 0x50400001, 0x27682800, 0x8f820108, 0x11020004, 0x0, 0x8f820104, 0x15020007, 0x1021, 0x8ee201a8, 0x2021, 0x24420001, 0xaee201a8, -0x8003cc3, 0x8ee201a8, 0x8ee40e14, 0x42140, +0x8003cbf, 0x8ee201a8, 0x8ee40e14, 0x42140, 0x801821, 0x8ee40460, 0x8ee50464, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee30e14, 0x91140, 0xa4e2000e, @@ -2882,7 +2890,7 @@ 0x24020001, 0xac620004, 0x1480000e, 0x24030040, 0x8ee20e14, 0xafa20010, 0x8ee20e18, 0x3c050007, 0xafa20014, 0x8ee60e0c, 0x8ee70e10, 0x3c040001, -0x248450b4, 0xc002407, 0x34a5f001, 0x8003ce1, +0x248458d4, 0xc002403, 0x34a5f001, 0x8003cdd, 0x0, 0x8ee20500, 0x24420001, 0x50430003, 0x1021, 0x8ee20500, 0x24420001, 0xaee20500, 0x8ee20500, 0x21080, 0x571021, 0xac490508, @@ -2894,13 +2902,13 @@ 0x0, 0x8ee35238, 0x8ee2523c, 0x622023, 0x4820001, 0x24840100, 0x8ee35244, 0x8ee2523c, 0x43102b, 0x14400004, 0x24020100, 0x8ee3523c, -0x8003d03, 0x431823, 0x8ee25244, 0x8ee3523c, +0x8003cff, 0x431823, 0x8ee25244, 0x8ee3523c, 0x431023, 0x2443ffff, 0x804821, 0x69102a, 0x54400001, 0x604821, 0x8f870100, 0x27623000, 0x24e80020, 0x102102b, 0x50400001, 0x27682800, 0x8f820108, 0x11020004, 0x0, 0x8f820104, 0x15020007, 0x1021, 0x8ee201a8, 0x2021, -0x24420001, 0xaee201a8, 0x8003d45, 0x8ee201a8, +0x24420001, 0xaee201a8, 0x8003d41, 0x8ee201a8, 0x8ee4523c, 0x42140, 0x801821, 0x8ee40470, 0x8ee50474, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee3523c, @@ -2914,8 +2922,8 @@ 0x24020003, 0xac620000, 0x24020001, 0xac620004, 0x1480000e, 0x24030040, 0x8ee2523c, 0xafa20010, 0x8ee25244, 0x3c050007, 0xafa20014, 0x8ee65238, -0x8ee75240, 0x3c040001, 0x248450c0, 0xc002407, -0x34a5f010, 0x8003d63, 0x0, 0x8ee20500, +0x8ee75240, 0x3c040001, 0x248458e0, 0xc002403, +0x34a5f010, 0x8003d5f, 0x0, 0x8ee20500, 0x24420001, 0x50430003, 0x1021, 0x8ee20500, 0x24420001, 0xaee20500, 0x8ee20500, 0x21080, 0x571021, 0xac490508, 0x8ee2523c, 0x491021, @@ -2927,14 +2935,14 @@ 0x1021, 0x8ee24e34, 0x24420001, 0xaee24e34, 0x8ee24e34, 0x8ee44e34, 0x8ee34e30, 0x210c0, 0x24425038, 0x14830007, 0x2e22821, 0x8f820128, -0x24420020, 0xaf820128, 0x8f820128, 0x8003d96, +0x24420020, 0xaf820128, 0x8f820128, 0x8003d92, 0xaca00000, 0x8ee24e34, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e34, 0x24420001, 0x210c0, 0x24425038, 0x2e22821, 0x8ca20004, 0x8f830128, 0x21140, 0x621821, 0xaf830128, 0xaca00000, 0x8cc20018, 0x2443fffe, 0x2c620012, 0x10400008, 0x31080, 0x3c010001, 0x220821, -0x8c2250d0, 0x400008, 0x0, 0x24020001, +0x8c2258f0, 0x400008, 0x0, 0x24020001, 0xaee24e24, 0x3e00008, 0x0, 0x27bdffc8, 0xafbf0030, 0xafb5002c, 0xafb40028, 0xafb30024, 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f830128, @@ -2943,15 +2951,15 @@ 0x24140040, 0x8f8c0128, 0x8f820128, 0x24420020, 0xaf820128, 0x9182001b, 0x8f830128, 0x2443fffe, 0x2c620012, 0x1040029c, 0x31080, 0x3c010001, -0x220821, 0x8c225128, 0x400008, 0x0, +0x220821, 0x8c225948, 0x400008, 0x0, 0x8f420218, 0x30420100, 0x10400007, 0x0, 0x95830016, 0x95820018, 0x621823, 0x31402, 0x431021, 0xa5820016, 0x8d82001c, 0x3c038000, 0x3044ffff, 0x436824, 0x3c030800, 0x431824, -0x11a00004, 0xad84001c, 0x41140, 0x8003ddc, +0x11a00004, 0xad84001c, 0x41140, 0x8003dd8, 0x24425248, 0x41140, 0x24420e20, 0x2e25821, 0x9562000e, 0x3042fffc, 0x10600004, 0xa562000e, -0x95840016, 0x8003ec4, 0x0, 0x8d690018, +0x95840016, 0x8003ec0, 0x0, 0x8d690018, 0x4021, 0x952a0000, 0x25290002, 0x95270000, 0x25290002, 0x95260000, 0x25290002, 0x95250000, 0x25290002, 0x95240000, 0x25290002, 0x95230000, @@ -2965,7 +2973,7 @@ 0x721821, 0x94620000, 0x24630002, 0x24a5ffff, 0x14a0fff9, 0x822021, 0x41c02, 0x3082ffff, 0x622021, 0x41402, 0x3083ffff, 0x431021, -0x3042ffff, 0x8003e37, 0x1425021, 0x952a0000, +0x3042ffff, 0x8003e33, 0x1425021, 0x952a0000, 0x25290002, 0x95280000, 0x25290002, 0x95270000, 0x25290002, 0x95260000, 0x25290002, 0x95250000, 0x25290002, 0x95230000, 0x25290002, 0x95220000, @@ -2982,7 +2990,7 @@ 0x10400034, 0x24690010, 0x229102b, 0x54400001, 0x1324821, 0x95250000, 0x24690014, 0x229102b, 0x10400002, 0x24a5ffec, 0x1324821, 0x95220000, -0x30420fff, 0x14400003, 0x25290002, 0x8003e64, +0x30420fff, 0x14400003, 0x25290002, 0x8003e60, 0x24130001, 0x9821, 0xa03021, 0x229102b, 0x54400001, 0x1324821, 0x91220001, 0x25290002, 0xa22821, 0x229102b, 0x54400001, 0x1324821, @@ -2991,9 +2999,9 @@ 0x54400001, 0x1324821, 0x95220000, 0x25290002, 0xa22821, 0x229102b, 0x54400001, 0x1324821, 0x95220000, 0x25290002, 0xa22821, 0x229102b, -0x54400001, 0x1324821, 0x95220000, 0x8003e9d, +0x54400001, 0x1324821, 0x95220000, 0x8003e99, 0xa22821, 0x94650010, 0x94620014, 0x24690016, -0x30420fff, 0x14400003, 0x24a5ffec, 0x8003e90, +0x30420fff, 0x14400003, 0x24a5ffec, 0x8003e8c, 0x24130001, 0x9821, 0xa03021, 0x91230001, 0x25290004, 0x95220000, 0x25290002, 0x95240000, 0x25290002, 0xa32821, 0xa22821, 0x95220000, @@ -3013,7 +3021,7 @@ 0x122102b, 0x50400001, 0x27693000, 0x8f820128, 0x11220004, 0x0, 0x8f820124, 0x15220007, 0x24040020, 0x8ee201a4, 0x8021, 0x24420001, -0xaee201a4, 0x8003f53, 0x8ee201a4, 0x8ee5724c, +0xaee201a4, 0x8003f4f, 0x8ee201a4, 0x8ee5724c, 0x8ee60490, 0x8ee70494, 0xad0b0008, 0xa504000e, 0xad0a0018, 0x52940, 0xa01821, 0x1021, 0xe33821, 0xe3202b, 0xc23021, 0xc43021, @@ -3026,41 +3034,41 @@ 0x0, 0x8ee34e30, 0x8ee24e34, 0x1062000b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x1054002b, -0x0, 0x8003f32, 0x0, 0x8ee24e30, +0x0, 0x8003f2e, 0x0, 0x8ee24e30, 0x24420001, 0x50540003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, -0x24425038, 0x2e22021, 0x24020001, 0x8003f52, +0x24425038, 0x2e22021, 0x24020001, 0x8003f4e, 0xac950000, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f, 0x0, 0x8ee34e30, 0x8ee24e34, 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10540007, 0x0, 0x8ee24e34, 0x24420001, 0x10620005, -0x0, 0x8003f3e, 0x0, 0x14600005, +0x0, 0x8003f3a, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400012, -0xac800000, 0x8003f53, 0x0, 0x8ee24e30, +0xac800000, 0x8003f4f, 0x0, 0x8ee24e30, 0x24420001, 0x50540003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x1600000d, 0x0, -0x8f820120, 0x3c040001, 0x24845118, 0xafa00014, +0x8f820120, 0x3c040001, 0x24845938, 0xafa00014, 0xafa20010, 0x8d86001c, 0x8f870124, 0x3c050008, -0xc002407, 0x34a50001, 0x800405b, 0x0, +0xc002403, 0x34a50001, 0x8004057, 0x0, 0x8ee2724c, 0x24420001, 0x304207ff, 0x11a00006, 0xaee2724c, 0x8ee201d0, 0x2442ffff, 0xaee201d0, -0x8003f6f, 0x8ee201d0, 0x8ee201cc, 0x2442ffff, +0x8003f6b, 0x8ee201d0, 0x8ee201cc, 0x2442ffff, 0xaee201cc, 0x8ee201cc, 0x8ee201d8, 0x2442ffff, -0xaee201d8, 0x800405b, 0x8ee201d8, 0x8f420240, +0xaee201d8, 0x8004057, 0x8ee201d8, 0x8f420240, 0x104000e5, 0x0, 0x8ee20e1c, 0x24420001, -0x800405b, 0xaee20e1c, 0x9582001e, 0xad82001c, +0x8004057, 0xaee20e1c, 0x9582001e, 0xad82001c, 0x8f420240, 0x10400072, 0x0, 0x8ee20e1c, 0x24420001, 0xaee20e1c, 0x8f430240, 0x43102b, 0x144000d5, 0x0, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a4, 0x8021, -0x24420001, 0xaee201a4, 0x8003fde, 0x8ee201a4, +0x24420001, 0xaee201a4, 0x8003fda, 0x8ee201a4, 0x8ee2724c, 0xac62001c, 0x8ee404a8, 0x8ee504ac, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004, @@ -3071,23 +3079,23 @@ 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10540007, 0x0, 0x8ee24e34, 0x24420001, 0x10620005, -0x0, 0x8003fca, 0x0, 0x14600005, +0x0, 0x8003fc6, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400011, -0xac800000, 0x8003fde, 0x0, 0x8ee24e30, +0xac800000, 0x8003fda, 0x0, 0x8ee24e30, 0x24420001, 0x50540003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020001, 0xac950000, 0xac820004, 0x5600000b, 0x24100001, 0x8ee2724c, -0x3c040001, 0x24845088, 0xafa00014, 0xafa20010, -0x8ee6724c, 0x8f470280, 0x3c050009, 0xc002407, +0x3c040001, 0x248458a8, 0xafa00014, 0xafa20010, +0x8ee6724c, 0x8f470280, 0x3c050009, 0xc002403, 0x34a5f008, 0x56000001, 0xaee00e1c, 0x8ee20188, -0x24420001, 0xaee20188, 0x8004054, 0x8ee20188, +0x24420001, 0xaee20188, 0x8004050, 0x8ee20188, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a4, 0x8021, 0x24420001, 0xaee201a4, -0x8004048, 0x8ee201a4, 0x8ee2724c, 0xac62001c, +0x8004044, 0x8ee201a4, 0x8ee2724c, 0xac62001c, 0x8ee404a8, 0x8ee504ac, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004, 0x8ee204c4, 0xac620010, @@ -3097,64 +3105,64 @@ 0x8ee24e34, 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10540007, 0x0, 0x8ee24e34, -0x24420001, 0x10620005, 0x0, 0x8004034, +0x24420001, 0x10620005, 0x0, 0x8004030, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, -0x2c420011, 0x50400011, 0xac800000, 0x8004048, +0x2c420011, 0x50400011, 0xac800000, 0x8004044, 0x0, 0x8ee24e30, 0x24420001, 0x50540003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0x24020001, 0xac950000, 0xac820004, 0x1600000b, -0x0, 0x8ee2724c, 0x3c040001, 0x24845088, +0x0, 0x8ee2724c, 0x3c040001, 0x248458a8, 0xafa00014, 0xafa20010, 0x8ee6724c, 0x8f470280, -0x3c050009, 0xc002407, 0x34a5f008, 0x8ee20174, -0x24420001, 0xaee20174, 0x800405b, 0x8ee20174, +0x3c050009, 0xc002403, 0x34a5f008, 0x8ee20174, +0x24420001, 0xaee20174, 0x8004057, 0x8ee20174, 0x24020001, 0xaee24e24, 0x8f830128, 0x8f820124, 0x1462fd58, 0x0, 0x8fbf0030, 0x8fb5002c, 0x8fb40028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0038, 0x27bdffe8, 0x27840208, 0x27450200, 0x24060008, 0xafbf0014, -0xc00249e, 0xafb00010, 0x2021, 0x24100001, +0xc00249a, 0xafb00010, 0x2021, 0x24100001, 0x2402241f, 0xaf900210, 0xaf900200, 0xaf800204, 0xaf820214, 0x8f460248, 0x24030004, 0x3c020040, -0x3c010001, 0xac235484, 0x3c010001, 0xac235488, -0x3c010001, 0xac20553c, 0x3c010001, 0xac225480, -0x3c010001, 0xac235488, 0xc004fa8, 0x24050004, -0xc004784, 0x0, 0x8ee20000, 0x3c03feff, +0x3c010001, 0xac235cc4, 0x3c010001, 0xac235cc8, +0x3c010001, 0xac205d9c, 0x3c010001, 0xac225cc0, +0x3c010001, 0xac235cc8, 0xc005108, 0x24050004, +0xc004822, 0x0, 0x8ee20000, 0x3c03feff, 0x3463fffd, 0x431024, 0xaee20000, 0x3c023c00, 0xaf82021c, 0x3c010001, 0x370821, 0xac3083ac, 0x8fbf0014, 0x8fb00010, 0x3e00008, 0x27bd0018, 0x27bdffe0, 0x3c050008, 0x34a50400, 0xafbf0018, 0xafa00010, 0xafa00014, 0x8f860200, 0x3c040001, -0x248451d0, 0xc002407, 0x3821, 0x8ee20280, +0x248459f0, 0xc002403, 0x3821, 0x8ee20280, 0x24420001, 0xaee20280, 0x8ee20280, 0x8f830200, 0x3c023f00, 0x621824, 0x8fbf0018, 0x3c020400, 0x3e00008, 0x27bd0020, 0x27bdffd8, 0xafbf0020, 0xafb1001c, 0xafb00018, 0x8f900220, 0x8ee20214, 0x3821, 0x24420001, 0xaee20214, 0x8ee20214, 0x3c020300, 0x2021024, 0x10400027, 0x3c110400, -0xc00429f, 0x0, 0x3c020100, 0x2021024, +0xc00429b, 0x0, 0x3c020100, 0x2021024, 0x10400007, 0x0, 0x8ee20218, 0x24420001, -0xaee20218, 0x8ee20218, 0x80040ca, 0x3c03fdff, +0xaee20218, 0x8ee20218, 0x80040c6, 0x3c03fdff, 0x8ee2021c, 0x24420001, 0xaee2021c, 0x8ee2021c, 0x3c03fdff, 0x3463ffff, 0x3c0808ff, 0x3508ffff, -0x8ee20000, 0x3c040001, 0x248451dc, 0x3c050008, +0x8ee20000, 0x3c040001, 0x248459fc, 0x3c050008, 0x2003021, 0x431024, 0xaee20000, 0x8f820220, 0x3821, 0x3c030300, 0x481024, 0x431025, -0xaf820220, 0xafa00010, 0xc002407, 0xafa00014, -0x800429a, 0x0, 0x2111024, 0x1040001f, +0xaf820220, 0xafa00010, 0xc002403, 0xafa00014, +0x8004296, 0x0, 0x2111024, 0x1040001f, 0x3c024000, 0x8f830224, 0x24021402, 0x1462000b, -0x3c03fdff, 0x3c040001, 0x248451e8, 0x3c050008, +0x3c03fdff, 0x3c040001, 0x24845a08, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860224, 0x34a5ffff, -0xc002407, 0x3821, 0x3c03fdff, 0x8ee20000, -0x3463ffff, 0x2002021, 0x431024, 0xc004cf4, +0xc002403, 0x3821, 0x3c03fdff, 0x8ee20000, +0x3463ffff, 0x2002021, 0x431024, 0xc004e54, 0xaee20000, 0x8ee20220, 0x24420001, 0xaee20220, 0x8ee20220, 0x8f820220, 0x3c0308ff, 0x3463ffff, -0x431024, 0x8004299, 0x511025, 0x2021024, +0x431024, 0x8004295, 0x511025, 0x2021024, 0x10400142, 0x0, 0x8ee2022c, 0x24420001, 0xaee2022c, 0x8ee2022c, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420004, 0xaf820220, -0x8f830054, 0x8f820054, 0x8004112, 0x24630002, +0x8f830054, 0x8f820054, 0x800410e, 0x24630002, 0x8f820054, 0x621023, 0x2c420003, 0x1440fffc, 0x0, 0x8f8600e0, 0x8f8400e4, 0x30c20007, 0x10400012, 0x0, 0x8f8300e4, 0x2402fff8, @@ -3167,7 +3175,7 @@ 0xc23024, 0xaf8600e0, 0x8f8300c4, 0x3c02001f, 0x3442ffff, 0x24680008, 0x48102b, 0x10400003, 0x3c02fff5, 0x34421000, 0x1024021, 0x8f8b00c8, -0x8f850120, 0x8f840124, 0x8004149, 0x6021, +0x8f850120, 0x8f840124, 0x8004145, 0x6021, 0x27623800, 0x82102b, 0x50400001, 0x27643000, 0x10a40010, 0x318200ff, 0x8c820018, 0x38430007, 0x2c630001, 0x3842000b, 0x2c420001, 0x621825, @@ -3177,19 +3185,19 @@ 0x571021, 0x904283c0, 0x14400060, 0x0, 0x8f8400e4, 0xc41023, 0x218c3, 0x4620001, 0x24630200, 0x8f8900c4, 0x10600005, 0x24020001, -0x10620009, 0x0, 0x800418b, 0x0, +0x10620009, 0x0, 0x8004187, 0x0, 0x8ee20230, 0x1205821, 0x24420001, 0xaee20230, -0x80041c0, 0x8ee20230, 0x8ee20234, 0x3c05000a, +0x80041bc, 0x8ee20230, 0x8ee20234, 0x3c05000a, 0x24420001, 0xaee20234, 0x8c8b0000, 0x34a5f000, 0x8ee20234, 0x12b1823, 0xa3102b, 0x54400001, 0x651821, 0x2c62233f, 0x14400040, 0x0, 0x8f8200e8, 0x24420008, 0xaf8200e8, 0x8f8200e8, 0x8f8200e4, 0x1205821, 0x24420008, 0xaf8200e4, -0x80041c0, 0x8f8200e4, 0x8ee20238, 0x3c03000a, +0x80041bc, 0x8f8200e4, 0x8ee20238, 0x3c03000a, 0x24420001, 0xaee20238, 0x8c840000, 0x3463f000, 0x8ee20238, 0x883823, 0x67102b, 0x54400001, 0xe33821, 0x3c020003, 0x34420d40, 0x47102b, -0x10400003, 0x0, 0x80041c0, 0x805821, +0x10400003, 0x0, 0x80041bc, 0x805821, 0x8f8200e4, 0x24440008, 0xaf8400e4, 0x8f8400e4, 0x10860018, 0x3c05000a, 0x34a5f000, 0x3c0a0003, 0x354a0d40, 0x8ee2007c, 0x24420001, 0xaee2007c, @@ -3197,19 +3205,19 @@ 0x54400001, 0xe53821, 0x147102b, 0x54400007, 0x605821, 0x8f8200e4, 0x24440008, 0xaf8400e4, 0x8f8400e4, 0x1486ffef, 0x0, 0x14860005, -0x0, 0x1205821, 0xaf8600e4, 0x80041c0, +0x0, 0x1205821, 0xaf8600e4, 0x80041bc, 0xaf8600e8, 0xaf8400e4, 0xaf8400e8, 0x8f8200c8, 0x3c03000a, 0x3463f000, 0x483823, 0x67102b, 0x54400001, 0xe33821, 0x3c020003, 0x34420d3f, 0x47102b, 0x54400007, 0x6021, 0x1683823, -0x67102b, 0x54400003, 0xe33821, 0x80041d3, +0x67102b, 0x54400003, 0xe33821, 0x80041cf, 0x3c020003, 0x3c020003, 0x34420d3f, 0x47102b, 0x14400016, 0x318200ff, 0x14400006, 0x0, 0x3c020001, 0x571021, 0x904283c0, 0x1040000f, 0x0, 0x8ee2023c, 0x3c04fdff, 0x8ee30000, 0x3484ffff, 0x24420001, 0xaee2023c, 0x8ee2023c, 0x24020001, 0x641824, 0x3c010001, 0x370821, -0xa02283b8, 0x8004230, 0xaee30000, 0xaf8b00c8, +0xa02283b8, 0x800422c, 0xaee30000, 0xaf8b00c8, 0x8f8300c8, 0x8f8200c4, 0x3c04000a, 0x3484f000, 0x623823, 0x87102b, 0x54400001, 0xe43821, 0x3c020003, 0x34420d40, 0x47102b, 0x2ce30001, @@ -3218,7 +3226,7 @@ 0x431025, 0xaf820220, 0x8f8600e0, 0x8f8400e4, 0x10c4002a, 0x0, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x24c2fff8, 0xaf8200e0, -0x3c020001, 0x8c4275c0, 0x3c030008, 0x8f8600e0, +0x3c020001, 0x8c427e30, 0x3c030008, 0x8f8600e0, 0x431024, 0x1040001d, 0x0, 0x10c4001b, 0x240dfff8, 0x3c0a000a, 0x354af000, 0x3c0c0080, 0x24850008, 0x27622800, 0x50a20001, 0x27651800, @@ -3228,14 +3236,14 @@ 0x12a4821, 0x10690002, 0x10c1025, 0xac820004, 0xa02021, 0x14c4ffeb, 0x24850008, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420002, -0xaf820220, 0x8f830054, 0x8f820054, 0x800423b, +0xaf820220, 0x8f830054, 0x8f820054, 0x8004237, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, 0xaf820220, 0x6010055, 0x0, 0x8ee20228, 0x24420001, 0xaee20228, 0x8ee20228, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420004, 0xaf820220, 0x8f830054, -0x8f820054, 0x8004255, 0x24630002, 0x8f820054, +0x8f820054, 0x8004251, 0x24630002, 0x8f820054, 0x621023, 0x2c420003, 0x1440fffc, 0x0, 0x8f8600e0, 0x30c20007, 0x10400012, 0x0, 0x8f8300e4, 0x2402fff8, 0xc21024, 0x1043000d, @@ -3250,16 +3258,16 @@ 0x8ee2007c, 0x3c0408ff, 0x3484ffff, 0x471021, 0xaee2007c, 0x8f820220, 0x3c038000, 0x34630002, 0x441024, 0x431025, 0xaf820220, 0x8f830054, -0x8f820054, 0x8004291, 0x24630001, 0x8f820054, +0x8f820054, 0x800428d, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, 0xaf820220, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, -0x3e00008, 0x27bd0028, 0x3c020001, 0x8c425498, +0x3e00008, 0x27bd0028, 0x3c020001, 0x8c425cd8, 0x27bdffd8, 0x10400012, 0xafbf0020, 0x3c040001, -0x248451f4, 0x3c050008, 0x24020001, 0x3c010001, +0x24845a14, 0x3c050008, 0x24020001, 0x3c010001, 0x370821, 0xac2283ac, 0xafa00010, 0xafa00014, -0x8f860220, 0x34a50498, 0x3c010001, 0xac205498, -0x3c010001, 0xac22548c, 0xc002407, 0x3821, +0x8f860220, 0x34a50498, 0x3c010001, 0xac205cd8, +0x3c010001, 0xac225ccc, 0xc002403, 0x3821, 0x8f420268, 0x3c037fff, 0x3463ffff, 0x431024, 0xaf420268, 0x8ee204d0, 0x8ee404d4, 0x2403fffe, 0x431024, 0x30840002, 0x1080011e, 0xaee204d0, @@ -3275,7 +3283,7 @@ 0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128, 0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021, 0x8ee201a4, -0x2821, 0x24420001, 0xaee201a4, 0x8004341, +0x2821, 0x24420001, 0xaee201a4, 0x800433d, 0x8ee201a4, 0x8ee40608, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004, @@ -3288,10 +3296,10 @@ 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x104c0007, 0x0, 0x8ee24e34, 0x24420001, 0x10620005, -0x0, 0x800432e, 0x0, 0x14600005, +0x0, 0x800432a, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, -0xac800000, 0x8004341, 0x0, 0x8ee24e30, +0xac800000, 0x800433d, 0x0, 0x8ee24e30, 0x24420001, 0x504c0003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac8d0000, 0xac8e0004, @@ -3305,7 +3313,7 @@ 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a4, 0x2821, 0x24420001, 0xaee201a4, -0x80043ad, 0x8ee201a4, 0x8ee20608, 0xac62001c, +0x80043a9, 0x8ee201a4, 0x8ee20608, 0xac62001c, 0x8ee404a0, 0x8ee504a4, 0x2462001c, 0xac620008, 0xa46d000e, 0xac6c0018, 0xac640000, 0xac650004, 0x8ee204c4, 0xac620010, 0xaf860120, 0x92e24e20, @@ -3315,34 +3323,34 @@ 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e34, 0x8ee34e30, 0x24420001, 0x10470007, 0x0, 0x8ee24e34, 0x24420001, 0x10620005, -0x0, 0x800439a, 0x0, 0x14600005, +0x0, 0x8004396, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, -0xac800000, 0x80043ad, 0x0, 0x8ee24e30, +0xac800000, 0x80043a9, 0x0, 0x8ee24e30, 0x24420001, 0x50470003, 0x1021, 0x8ee24e30, 0x24420001, 0xaee24e30, 0x8ee24e30, 0x210c0, 0x24425038, 0x2e22021, 0xac880000, 0xac8a0004, 0x54a00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, -0x24020001, 0x54620003, 0xafa00010, 0x80043da, -0x0, 0x3c040001, 0x24845200, 0xafa00014, -0x8f860120, 0x8f870124, 0x3c050009, 0xc002407, -0x34a5f011, 0x80043da, 0x0, 0x3c040001, -0x2484520c, 0xafa00014, 0x8f860120, 0x8f870124, -0x3c050009, 0xc002407, 0x34a5f010, 0x80043da, -0x0, 0x3c040001, 0x24845218, 0xafa00014, -0x8ee60608, 0x8f470228, 0x3c050009, 0xc002407, +0x24020001, 0x54620003, 0xafa00010, 0x80043d6, +0x0, 0x3c040001, 0x24845a20, 0xafa00014, +0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, +0x34a5f011, 0x80043d6, 0x0, 0x3c040001, +0x24845a2c, 0xafa00014, 0x8f860120, 0x8f870124, +0x3c050009, 0xc002403, 0x34a5f010, 0x80043d6, +0x0, 0x3c040001, 0x24845a38, 0xafa00014, +0x8ee60608, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8ee201ac, 0x8ee2015c, 0x24420001, 0xaee2015c, 0x8ee2015c, 0x8fbf0020, 0x3e00008, 0x27bd0028, -0x3c020001, 0x8c425498, 0x27bdffe0, 0x1440000d, -0xafbf0018, 0x3c040001, 0x24845224, 0x3c050008, +0x3c020001, 0x8c425cd8, 0x27bdffe0, 0x1440000d, +0xafbf0018, 0x3c040001, 0x24845a44, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, 0x34a50499, -0x24020001, 0x3c010001, 0xac225498, 0xc002407, +0x24020001, 0x3c010001, 0xac225cd8, 0xc002403, 0x3821, 0x8ee204d0, 0x3c030001, 0x771821, 0x946383b2, 0x34420001, 0x10600007, 0xaee204d0, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, -0x34420008, 0xaf820220, 0x2021, 0xc0050b3, +0x34420008, 0xaf820220, 0x2021, 0xc0052a2, 0x24050004, 0xaf420268, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -3358,8 +3366,9 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c120001, -0x26521200, 0x3c140001, 0x8e945410, 0x3c100001, +0x26521200, 0x3c140001, 0x8e945c50, 0x3c100001, 0x26101120, 0x3c15c000, 0x36b50060, 0x8e8a0000, 0x8eb30000, 0x26a400b, 0x248000a, 0x200f821, 0x0, 0xd, 0x0, 0x0, @@ -3376,19 +3385,19 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80014d6, 0x0, 0x80014d8, 0x3c0a0001, 0x80014d8, -0x3c0a0002, 0x80014d8, 0x0, 0x80024aa, +0x3c0a0002, 0x80014d8, 0x0, 0x80024a6, 0x0, 0x80014d8, 0x3c0a0003, 0x80014d8, -0x3c0a0004, 0x8002f90, 0x0, 0x80014d8, -0x3c0a0005, 0x8003cec, 0x0, 0x8003c6a, +0x3c0a0004, 0x8002f8c, 0x0, 0x80014d8, +0x3c0a0005, 0x8003ce8, 0x0, 0x8003c66, 0x0, 0x80014d8, 0x3c0a0006, 0x80014d8, 0x3c0a0007, 0x80014d8, 0x0, 0x80014d8, -0x0, 0x80014d8, 0x0, 0x8002a79, +0x0, 0x80014d8, 0x0, 0x8002a75, 0x0, 0x80014d8, 0x3c0a000b, 0x80014d8, -0x3c0a000c, 0x80014d8, 0x3c0a000d, 0x800237c, +0x3c0a000c, 0x80014d8, 0x3c0a000d, 0x800237a, 0x0, 0x8002339, 0x0, 0x80014d8, -0x3c0a000e, 0x8001b3c, 0x0, 0x80024a8, -0x0, 0x80014d8, 0x3c0a000f, 0x80040ab, -0x0, 0x8004095, 0x0, 0x80014d8, +0x3c0a000e, 0x8001b3c, 0x0, 0x80024a4, +0x0, 0x80014d8, 0x3c0a000f, 0x80040a7, +0x0, 0x8004091, 0x0, 0x80014d8, 0x3c0a0010, 0x80014ee, 0x0, 0x80014d8, 0x3c0a0011, 0x80014d8, 0x3c0a0012, 0x80014d8, 0x3c0a0013, 0x0, 0x0, 0x0, @@ -3420,841 +3429,971 @@ 0x1062000c, 0x43102b, 0x14400006, 0x3c026000, 0x3c024000, 0x10620008, 0x24020800, 0x8004539, 0x0, 0x10620004, 0x24020800, 0x8004539, -0x0, 0x24020700, 0x3c010001, 0xac22549c, -0x3e00008, 0x0, 0x27bdffd0, 0xafbf0028, -0x3c010001, 0xc004cd1, 0xac205484, 0x24040001, -0x2821, 0x27a60020, 0x34028000, 0xc0048ee, -0xa7a20020, 0x8f830054, 0x8f820054, 0x800454b, -0x24630064, 0x8f820054, 0x621023, 0x2c420065, -0x1440fffc, 0x24040001, 0x24050001, 0xc0048ac, -0x27a60020, 0x8f830054, 0x8f820054, 0x8004557, -0x24630064, 0x8f820054, 0x621023, 0x2c420065, -0x1440fffc, 0x24040001, 0x24050001, 0xc0048ac, -0x27a60020, 0x8f830054, 0x8f820054, 0x8004563, -0x24630064, 0x8f820054, 0x621023, 0x2c420065, -0x1440fffc, 0x24040001, 0x24050002, 0xc0048ac, -0x27a60018, 0x8f830054, 0x8f820054, 0x800456f, +0x0, 0x24020700, 0x3c010001, 0xac225cdc, +0x3e00008, 0x0, 0x27bdffd8, 0xafbf0024, +0xafb00020, 0x8f830054, 0x8f820054, 0x3c010001, +0xac205cc4, 0x8004545, 0x24630064, 0x8f820054, +0x621023, 0x2c420065, 0x1440fffc, 0x0, +0xc004d71, 0x0, 0x24040001, 0x2821, +0x27a60018, 0x34028000, 0xc00498e, 0xa7a20018, +0x8f830054, 0x8f820054, 0x8004556, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x24050001, 0xc00494c, 0x27a60018, +0x8f830054, 0x8f820054, 0x8004562, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x24050001, 0xc00494c, 0x27a60018, +0x8f830054, 0x8f820054, 0x800456e, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x3c060001, 0x24c65da0, 0xc00494c, +0x24050002, 0x8f830054, 0x8f820054, 0x800457b, 0x24630064, 0x8f820054, 0x621023, 0x2c420065, -0x1440fffc, 0x24040001, 0x24050003, 0xc0048ac, -0x27a6001a, 0x97a20020, 0x10400027, 0x24030001, -0x3c020001, 0x8c425484, 0x97a30018, 0x34420001, -0x3c010001, 0xac225484, 0x24020015, 0x1462000d, -0x0, 0x97a2001a, 0x3843f423, 0x2c630001, +0x1440fffc, 0x24040001, 0x24050003, 0x3c100001, +0x26105da2, 0xc00494c, 0x2003021, 0x97a60018, +0x3c070001, 0x94e75da0, 0x3c040001, 0x24845ab0, +0xafa00014, 0x96020000, 0x3c05000d, 0x34a50100, +0xc002403, 0xafa20010, 0x97a20018, 0x1040004c, +0x24036040, 0x96020000, 0x3042fff0, 0x1443000a, +0x24020020, 0x3c030001, 0x94635da0, 0x54620009, +0x24027830, 0x24020003, 0x3c010001, 0xac225cc4, +0x80045ac, 0x24020005, 0x3c030001, 0x94635da0, +0x24027830, 0x1462000f, 0x24030010, 0x3c020001, +0x94425da2, 0x3042fff0, 0x1443000a, 0x24020003, +0x3c010001, 0xac225cc4, 0x24020006, 0x3c010001, +0xac225db0, 0x3c010001, 0xac225dbc, 0x80045e6, +0x3c09fff0, 0x3c020001, 0x8c425cc4, 0x3c030001, +0x94635da0, 0x34420001, 0x3c010001, 0xac225cc4, +0x24020015, 0x1462000f, 0x0, 0x3c020001, +0x94425da2, 0x3042fff0, 0x3843f420, 0x2c630001, 0x3842f430, 0x2c420001, 0x621825, 0x10600005, -0x24020003, 0x3c010001, 0xac225550, 0x80045a7, -0x3c08fff0, 0x97a30018, 0x24027810, 0x1462000a, -0x24020002, 0x97a3001a, 0x24020001, 0x14620006, -0x24020002, 0x24020004, 0x3c010001, 0xac225550, -0x80045a7, 0x3c08fff0, 0x3c010001, 0xac225550, -0x80045a7, 0x3c08fff0, 0x3c020001, 0x8c425484, -0x3c010001, 0xac235550, 0x34420004, 0x3c010001, -0xac225484, 0x3c08fff0, 0x3508bdc0, 0x8f830054, -0x97a60018, 0x3c070001, 0x8ce75550, 0x3c040001, -0x24845290, 0x24020001, 0x3c010001, 0xac22548c, -0xafa60010, 0x3c060001, 0x8cc65484, 0x97a2001a, -0x3c05000d, 0x34a50100, 0x3c010001, 0xac205488, -0x681821, 0x3c010001, 0xac235548, 0xc002407, -0xafa20014, 0x8fbf0028, 0x3e00008, 0x27bd0030, -0x27bdffe8, 0x24070004, 0x3c040001, 0x8c845488, -0x3021, 0x24020001, 0x1482000a, 0xafbf0010, -0x3c020001, 0x8c4275cc, 0x3c050004, 0x30428000, -0x1040000c, 0x34a593e0, 0x3c05000f, 0x80045da, -0x34a54240, 0x3c020001, 0x8c4275cc, 0x3c05000f, -0x30428000, 0x10400003, 0x34a54240, 0x3c05001e, -0x34a58480, 0x3c020001, 0x8c425548, 0x8f830054, -0x451021, 0x431023, 0x45102b, 0x1440002e, -0x0, 0x3c020001, 0x8c425490, 0x1440002a, -0x2cc20001, 0x7182b, 0x431024, 0x1040001d, -0x0, 0x3c090001, 0x8d295484, 0x240b0001, -0x3c054000, 0x3c080001, 0x250875cc, 0x250afffc, -0x42042, 0x14800002, 0x24e7ffff, 0x24040008, -0x891024, 0x5040000b, 0x2cc20001, 0x148b0004, -0x0, 0x8d020000, 0x80045ff, 0x451024, -0x8d420000, 0x451024, 0x54400001, 0x24060001, -0x2cc20001, 0x7182b, 0x431024, 0x5440ffed, -0x42042, 0x3c010001, 0x10c00024, 0xac245488, -0x8f830054, 0x24020001, 0x3c010001, 0xac22548c, -0x3c010001, 0xac235548, 0x3c020001, 0x8c42548c, -0x10400006, 0x24020001, 0x3c010001, 0xac20548c, -0x3c010001, 0x370821, 0xac2283ac, 0x3c030001, -0x771821, 0x8c6383ac, 0x24020008, 0x10620005, -0x24020001, 0xc00462f, 0x0, 0x800462c, -0x0, 0x3c030001, 0x8c635488, 0x10620007, -0x2402000e, 0x3c030001, 0x8c637560, 0x10620003, -0x0, 0xc004cf4, 0x8f840220, 0x8fbf0010, -0x3e00008, 0x27bd0018, 0x27bdffe0, 0x3c02fdff, -0xafbf0018, 0x8ee30000, 0x3c050001, 0x8ca55488, -0x3c040001, 0x8c8454a8, 0x3442ffff, 0x621824, -0x14a40008, 0xaee30000, 0x3c030001, 0x771821, -0x8c6383ac, 0x3c020001, 0x8c4254ac, 0x10620008, -0x0, 0x3c020001, 0x571021, 0x8c4283ac, -0x3c010001, 0xac2554a8, 0x3c010001, 0xac2254ac, -0x3c030001, 0x8c635488, 0x24020002, 0x10620131, -0x2c620003, 0x10400005, 0x24020001, 0x10620008, -0x0, 0x800477e, 0x0, 0x24020004, -0x10620079, 0x24020001, 0x800477f, 0x0, +0x24020003, 0x3c010001, 0xac225dbc, 0x80045e6, +0x3c09fff0, 0x3c030001, 0x94635da0, 0x24027810, +0x1462000b, 0x24020002, 0x3c020001, 0x94425da2, +0x3042fff0, 0x14400006, 0x24020002, 0x24020004, +0x3c010001, 0xac225dbc, 0x80045e6, 0x3c09fff0, +0x3c010001, 0xac225dbc, 0x80045e6, 0x3c09fff0, +0x3c020001, 0x8c425cc4, 0x24030001, 0x3c010001, +0xac235dbc, 0x34420004, 0x3c010001, 0xac225cc4, +0x3c09fff0, 0x3529bdc0, 0x3c060001, 0x8cc65cc4, +0x3c040001, 0x24845ab0, 0x24020001, 0x3c010001, +0xac225ccc, 0x8f820054, 0x3c070001, 0x8ce75dbc, +0x3c030001, 0x94635da0, 0x3c080001, 0x95085da2, +0x3c05000d, 0x34a50100, 0x3c010001, 0xac205cc8, +0x491021, 0x3c010001, 0xac225dac, 0xafa30010, +0xc002403, 0xafa80014, 0x8fbf0024, 0x8fb00020, +0x3e00008, 0x27bd0028, 0x27bdffe8, 0x3c050001, +0x8ca55cc8, 0x24060004, 0x24020001, 0x14a20014, +0xafbf0010, 0x3c020001, 0x8c427e3c, 0x30428000, +0x10400005, 0x3c04000f, 0x3c030001, 0x8c635dbc, +0x8004617, 0x34844240, 0x3c040004, 0x3c030001, +0x8c635dbc, 0x348493e0, 0x24020005, 0x14620016, +0x0, 0x3c04003d, 0x800462f, 0x34840900, +0x3c020001, 0x8c427e38, 0x30428000, 0x10400005, +0x3c04001e, 0x3c030001, 0x8c635dbc, 0x800462a, +0x34848480, 0x3c04000f, 0x3c030001, 0x8c635dbc, +0x34844240, 0x24020005, 0x14620003, 0x0, +0x3c04007a, 0x34841200, 0x3c020001, 0x8c425dac, +0x8f830054, 0x441021, 0x431023, 0x44102b, +0x14400037, 0x0, 0x3c020001, 0x8c425cd0, +0x14400033, 0x0, 0x3c010001, 0x10c00025, +0xac205ce0, 0x3c090001, 0x8d295cc4, 0x24070001, +0x3c044000, 0x3c080001, 0x25087e3c, 0x250afffc, +0x52842, 0x14a00002, 0x24c6ffff, 0x24050008, +0xa91024, 0x10400010, 0x0, 0x14a70008, +0x0, 0x8d020000, 0x441024, 0x1040000a, +0x0, 0x3c010001, 0x800465b, 0xac255ce0, +0x8d420000, 0x441024, 0x10400003, 0x0, +0x3c010001, 0xac275ce0, 0x3c020001, 0x8c425ce0, +0x6182b, 0x2c420001, 0x431024, 0x5440ffe5, +0x52842, 0x8f820054, 0x3c030001, 0x8c635ce0, +0x3c010001, 0xac225dac, 0x1060002a, 0x24020001, +0x3c010001, 0xac255cc8, 0x3c010001, 0xac225ccc, +0x3c020001, 0x8c425ce0, 0x10400022, 0x0, +0x3c020001, 0x8c425ccc, 0x1040000a, 0x24020001, +0x3c010001, 0xac205ccc, 0x3c010001, 0x370821, +0xac2283ac, 0x3c010001, 0xac205d4c, 0x3c010001, +0xac225d04, 0x3c030001, 0x771821, 0x8c6383ac, +0x24020008, 0x10620005, 0x24020001, 0xc004695, +0x0, 0x8004692, 0x0, 0x3c030001, +0x8c635cc8, 0x10620007, 0x2402000e, 0x3c030001, +0x8c637dd0, 0x10620003, 0x0, 0xc004e54, +0x8f840220, 0x8fbf0010, 0x3e00008, 0x27bd0018, +0x27bdffe0, 0x3c02fdff, 0xafbf0018, 0x8ee30000, +0x3c050001, 0x8ca55cc8, 0x3c040001, 0x8c845cf0, +0x3442ffff, 0x621824, 0x14a40008, 0xaee30000, +0x3c030001, 0x771821, 0x8c6383ac, 0x3c020001, +0x8c425cf4, 0x10620008, 0x0, 0x3c020001, +0x571021, 0x8c4283ac, 0x3c010001, 0xac255cf0, +0x3c010001, 0xac225cf4, 0x3c030001, 0x8c635cc8, +0x24020002, 0x10620169, 0x2c620003, 0x10400005, +0x24020001, 0x10620008, 0x0, 0x800481c, +0x0, 0x24020004, 0x106200b1, 0x24020001, +0x800481d, 0x0, 0x3c020001, 0x571021, +0x8c4283ac, 0x2443ffff, 0x2c620008, 0x1040015a, +0x31080, 0x3c010001, 0x220821, 0x8c225ac8, +0x400008, 0x0, 0x3c030001, 0x8c635dbc, +0x24020005, 0x14620014, 0x0, 0x3c020001, +0x8c425cd4, 0x1040000a, 0x24020003, 0xc004822, +0x0, 0x24020002, 0x3c010001, 0x370821, +0xac2283ac, 0x3c010001, 0x80046e0, 0xac205cd4, +0x3c010001, 0x370821, 0xac2283ac, 0x3c010001, +0x800481f, 0xac205c60, 0xc004822, 0x0, +0x3c020001, 0x8c425cd4, 0x3c010001, 0xac205c60, +0x104000dd, 0x24020002, 0x3c010001, 0x370821, +0xac2283ac, 0x3c010001, 0x800481f, 0xac205cd4, +0x3c030001, 0x8c635dbc, 0x24020005, 0x14620003, +0x24020001, 0x3c010001, 0xac225d00, 0xc0049cf, +0x0, 0x3c030001, 0x8c635d00, 0x800478e, +0x24020011, 0x3c050001, 0x8ca55cc8, 0x3c060001, +0x8cc67e3c, 0xc005108, 0x2021, 0x24020005, +0x3c010001, 0xac205cd4, 0x3c010001, 0x370821, +0x800481f, 0xac2283ac, 0x3c040001, 0x24845abc, +0x3c05000f, 0x34a50100, 0x3021, 0x3821, +0xafa00010, 0xc002403, 0xafa00014, 0x800481f, +0x0, 0x8f820220, 0x3c03f700, 0x431025, +0x80047b7, 0xaf820220, 0x8f820220, 0x3c030004, +0x431024, 0x144000a9, 0x24020007, 0x8f830054, +0x3c020001, 0x8c425da4, 0x2463d8f0, 0x431023, +0x2c422710, 0x144000f8, 0x24020001, 0x800481d, +0x0, 0x3c050001, 0x8ca55cc8, 0xc0052a2, +0x2021, 0xc005386, 0x2021, 0x3c030001, +0x8c637e34, 0x46100ea, 0x24020001, 0x3c020008, +0x621024, 0x10400006, 0x0, 0x8f820214, +0x3c03ffff, 0x431024, 0x8004741, 0x3442251f, +0x8f820214, 0x3c03ffff, 0x431024, 0x3442241f, +0xaf820214, 0x8ee20000, 0x3c030200, 0x431025, +0xaee20000, 0x8f820220, 0x2403fffb, 0x431024, +0xaf820220, 0x8f820220, 0x34420002, 0xaf820220, +0x24020008, 0x3c010001, 0x370821, 0xac2283ac, +0x8f820220, 0x3c030004, 0x431024, 0x14400005, +0x0, 0x8f820220, 0x3c03f700, 0x431025, +0xaf820220, 0x3c030001, 0x8c635dbc, 0x24020005, +0x1462000a, 0x0, 0x3c020001, 0x94425da2, +0x24429fbc, 0x2c420004, 0x10400004, 0x24040018, +0x24050002, 0xc004d93, 0x24060020, 0xc0043dd, +0x0, 0x3c010001, 0x800481f, 0xac205d50, 0x3c020001, 0x571021, 0x8c4283ac, 0x2443ffff, -0x2c620008, 0x10400122, 0x31080, 0x3c010001, -0x220821, 0x8c2252a8, 0x400008, 0x0, -0xc004784, 0x0, 0x3c020001, 0x8c425494, -0x3c010001, 0xac205420, 0x104000bd, 0x24020002, +0x2c620008, 0x104000ac, 0x31080, 0x3c010001, +0x220821, 0x8c225ae8, 0x400008, 0x0, +0xc00429b, 0x0, 0x3c010001, 0xac205ccc, +0xaf800204, 0x3c010001, 0xc004822, 0xac207e20, +0x24020001, 0x3c010001, 0xac225ce4, 0x24020002, +0x3c010001, 0x370821, 0x800481f, 0xac2283ac, +0xc00489f, 0x0, 0x3c030001, 0x8c635ce4, +0x24020009, 0x14620090, 0x24020003, 0x3c010001, +0x370821, 0x800481f, 0xac2283ac, 0x3c020001, +0x8c427e38, 0x30424000, 0x10400005, 0x0, +0x8f820044, 0x3c03ffff, 0x800479f, 0x34637fff, +0x8f820044, 0x2403ff7f, 0x431024, 0xaf820044, +0x8f830054, 0x80047b9, 0x24020004, 0x8f830054, +0x3c020001, 0x8c425da4, 0x2463d8f0, 0x431023, +0x2c422710, 0x14400074, 0x24020005, 0x3c010001, +0x370821, 0x800481f, 0xac2283ac, 0x8f820220, +0x3c03f700, 0x431025, 0xaf820220, 0xaf800204, +0x3c010001, 0xac207e20, 0x8f830054, 0x24020006, 0x3c010001, 0x370821, 0xac2283ac, 0x3c010001, -0x8004781, 0xac205494, 0xc00492f, 0x0, -0x3c030001, 0x8c6354b0, 0x80046f0, 0x24020011, -0x3c050001, 0x8ca55488, 0x3c060001, 0x8cc675cc, -0xc004fa8, 0x2021, 0x24020005, 0x3c010001, -0xac205494, 0x3c010001, 0x370821, 0x8004781, -0xac2283ac, 0x3c040001, 0x2484529c, 0x3c05000f, -0x34a50100, 0x3021, 0x3821, 0xafa00010, -0xc002407, 0xafa00014, 0x8004781, 0x0, -0x8f820220, 0x3c03f700, 0x431025, 0x8004719, -0xaf820220, 0x8f820220, 0x3c030004, 0x431024, -0x14400090, 0x24020007, 0x8f830054, 0x3c020001, -0x8c425540, 0x2463d8f0, 0x431023, 0x2c422710, -0x144000df, 0x24020001, 0x800477f, 0x0, -0x3c050001, 0x8ca55488, 0xc0050b3, 0x2021, -0xc00517e, 0x2021, 0x3c030001, 0x8c6375c4, -0x46100d1, 0x24020001, 0x3c020008, 0x621024, -0x10400006, 0x0, 0x8f820214, 0x3c03ffff, -0x431024, 0x80046bc, 0x3442251f, 0x8f820214, -0x3c03ffff, 0x431024, 0x3442241f, 0xaf820214, -0x8ee20000, 0x3c030200, 0x431025, 0xaee20000, -0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, -0x8f820220, 0x34420002, 0xaf820220, 0x24020008, -0x3c010001, 0x370821, 0xc0043e1, 0xac2283ac, -0x8004781, 0x0, 0x3c020001, 0x571021, -0x8c4283ac, 0x2443ffff, 0x2c620008, 0x104000ac, -0x31080, 0x3c010001, 0x220821, 0x8c2252c8, -0x400008, 0x0, 0xc00429f, 0x0, -0x3c010001, 0xac20548c, 0xaf800204, 0x3c010001, -0xc004784, 0xac2075b0, 0x24020001, 0x3c010001, -0xac2254a0, 0x24020002, 0x3c010001, 0x370821, -0x8004781, 0xac2283ac, 0xc004801, 0x0, -0x3c030001, 0x8c6354a0, 0x24020009, 0x14620090, -0x24020003, 0x3c010001, 0x370821, 0x8004781, -0xac2283ac, 0x3c020001, 0x8c4275c8, 0x30424000, -0x10400005, 0x0, 0x8f820044, 0x3c03ffff, -0x8004701, 0x34637fff, 0x8f820044, 0x2403ff7f, -0x431024, 0xaf820044, 0x8f830054, 0x800471b, -0x24020004, 0x8f830054, 0x3c020001, 0x8c425540, -0x2463d8f0, 0x431023, 0x2c422710, 0x14400074, -0x24020005, 0x3c010001, 0x370821, 0x8004781, -0xac2283ac, 0x8f820220, 0x3c03f700, 0x431025, -0xaf820220, 0xaf800204, 0x3c010001, 0xac2075b0, -0x8f830054, 0x24020006, 0x3c010001, 0x370821, -0xac2283ac, 0x3c010001, 0x8004781, 0xac235540, -0x8f830054, 0x3c020001, 0x8c425540, 0x2463fff6, -0x431023, 0x2c42000a, 0x14400059, 0x0, -0x24020007, 0x3c010001, 0x370821, 0x8004781, -0xac2283ac, 0x8f820220, 0x3c04f700, 0x441025, -0xaf820220, 0x8f820220, 0x3c030300, 0x431024, -0x14400005, 0x1821, 0x8f820220, 0x24030001, -0x441025, 0xaf820220, 0x10600043, 0x24020001, -0x8f820214, 0x3c03ffff, 0x3c040001, 0x8c845538, -0x431024, 0x3442251f, 0xaf820214, 0x24020008, -0x3c010001, 0x370821, 0x1080000b, 0xac2283ac, -0x3c020001, 0x8c425514, 0x14400007, 0x24020001, -0x3c010001, 0xac227560, 0xc004cf4, 0x8f840220, -0x800476e, 0x0, 0x8f820220, 0x3c030008, -0x431024, 0x14400017, 0x2402000e, 0x3c010001, -0xac227560, 0x8ee20000, 0x2021, 0x3c030200, -0x431025, 0xc00517e, 0xaee20000, 0x8f820220, -0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, -0x34420002, 0xc0043e1, 0xaf820220, 0x3c050001, -0x8ca55488, 0xc0050b3, 0x2021, 0x8004781, -0x0, 0x3c020001, 0x8c425514, 0x10400010, -0x0, 0x3c020001, 0x8c425510, 0x2442ffff, -0x3c010001, 0xac225510, 0x14400009, 0x24020002, -0x3c010001, 0xac205514, 0x3c010001, 0x8004781, -0xac225510, 0x24020001, 0x3c010001, 0xac22548c, -0x8fbf0018, 0x3e00008, 0x27bd0020, 0x8f820200, -0x8f820220, 0x8f820220, 0x34420004, 0xaf820220, -0x8f820200, 0x3c060001, 0x8cc65488, 0x34420004, -0xaf820200, 0x24020002, 0x10c2003a, 0x2cc20003, -0x10400005, 0x24020001, 0x10c20008, 0x0, -0x80047ca, 0x0, 0x24020004, 0x10c20013, -0x24020001, 0x80047ca, 0x0, 0x3c030001, -0x8c635478, 0x3c020001, 0x8c425480, 0x3c040001, -0x8c84549c, 0x3c050001, 0x8ca5547c, 0xaf860200, -0xaf860220, 0x34630022, 0x441025, 0x451025, -0x34420002, 0x80047c9, 0xaf830200, 0x3c030001, -0x8c635538, 0xaf820200, 0x10600009, 0xaf820220, -0x3c020001, 0x8c425514, 0x14400005, 0x3c033f00, -0x3c020001, 0x8c425470, 0x80047bd, 0x346300e0, -0x3c020001, 0x8c425470, 0x3c033f00, 0x346300e2, -0x431025, 0xaf820200, 0x3c030001, 0x8c635474, -0x3c04f700, 0x3c020001, 0x8c425480, 0x3c050001, -0x8ca5549c, 0x641825, 0x431025, 0x451025, -0xaf820220, 0x3e00008, 0x0, 0x8f820220, -0x3c030001, 0x8c635488, 0x34420004, 0xaf820220, -0x24020001, 0x1062000f, 0x0, 0x8f830054, -0x8f820054, 0x24630002, 0x621023, 0x2c420003, -0x10400011, 0x0, 0x8f820054, 0x621023, -0x2c420003, 0x1040000c, 0x0, 0x80047db, -0x0, 0x8f830054, 0x8f820054, 0x80047e7, -0x24630007, 0x8f820054, 0x621023, 0x2c420008, -0x1440fffc, 0x0, 0x8f8400e0, 0x30820007, -0x1040000d, 0x0, 0x8f820054, 0x8f8300e0, -0x14830009, 0x24450032, 0x8f820054, 0xa21023, -0x2c420033, 0x10400004, 0x0, 0x8f8200e0, -0x1082fff9, 0x0, 0x8f820220, 0x2403fffd, -0x431024, 0xaf820220, 0x3e00008, 0x0, -0x3c030001, 0x8c6354a0, 0x3c020001, 0x8c4254a4, -0x50620004, 0x2463ffff, 0x3c010001, 0xac2354a4, -0x2463ffff, 0x2c620009, 0x1040009d, 0x31080, -0x3c010001, 0x220821, 0x8c2252e8, 0x400008, -0x0, 0x8f820044, 0x34428080, 0xaf820044, -0x8f830054, 0x800489a, 0x24020002, 0x8f830054, -0x3c020001, 0x8c425544, 0x2463d8f0, 0x431023, -0x2c422710, 0x1440008a, 0x24020003, 0x80048a7, -0x0, 0x8f820044, 0x3c03ffff, 0x34637fff, -0x431024, 0xaf820044, 0x8f830054, 0x800489a, -0x24020004, 0x8f830054, 0x3c020001, 0x8c425544, -0x2463fff6, 0x431023, 0x2c42000a, 0x14400078, -0x24020005, 0x80048a7, 0x0, 0x8f820220, -0x3c03f700, 0x431025, 0xaf820220, 0x8f820220, -0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, -0x34420002, 0xaf820220, 0x3c023f00, 0x344200e0, -0xaf820200, 0x8f820200, 0x2403fffd, 0x431024, -0xaf820200, 0x24040001, 0x3405ffff, 0xaf840204, -0x8f830054, 0x8f820054, 0x800484e, 0x24630001, -0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, -0x0, 0x8f820224, 0x42040, 0xa4102b, -0x1040fff2, 0x0, 0x8f820220, 0x3c03f700, -0x431025, 0xaf820220, 0x8f820214, 0x3c03ffff, -0x431024, 0x3442251f, 0xaf820214, 0x8f820220, -0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, -0x3c04f700, 0x34840008, 0x34420002, 0xaf820220, -0x8f820220, 0x3c033f00, 0x346300e2, 0x441025, -0xaf820220, 0xaf830200, 0x8f8400f0, 0x276217f8, -0x14820002, 0x24850008, 0x27651000, 0x8f8200f4, -0x10a20007, 0x3c038000, 0x34630040, 0x3c020001, -0x24425430, 0xac820000, 0xac830004, 0xaf8500f0, -0x8f830054, 0x800489a, 0x24020006, 0x8f830054, -0x3c020001, 0x8c425544, 0x2463fff6, 0x431023, -0x2c42000a, 0x14400022, 0x24020007, 0x80048a7, -0x0, 0x8f8200e0, 0xaf8200e4, 0x8f8200e0, -0xaf8200e8, 0x8f820220, 0x34420004, 0xaf820220, -0x8f820220, 0x2403fff7, 0x431024, 0xaf820220, -0x8f820044, 0x34428080, 0xaf820044, 0x8f830054, -0x24020008, 0x3c010001, 0xac2254a0, 0x3c010001, -0x80048a9, 0xac235544, 0x8f830054, 0x3c020001, -0x8c425544, 0x2463d8f0, 0x431023, 0x2c422710, -0x14400003, 0x24020009, 0x3c010001, 0xac2254a0, -0x3e00008, 0x0, 0x0, 0x27bdffd8, +0x800481f, 0xac235da4, 0x8f830054, 0x3c020001, +0x8c425da4, 0x2463fff6, 0x431023, 0x2c42000a, +0x14400059, 0x0, 0x24020007, 0x3c010001, +0x370821, 0x800481f, 0xac2283ac, 0x8f820220, +0x3c04f700, 0x441025, 0xaf820220, 0x8f820220, +0x3c030300, 0x431024, 0x14400005, 0x1821, +0x8f820220, 0x24030001, 0x441025, 0xaf820220, +0x10600043, 0x24020001, 0x8f820214, 0x3c03ffff, +0x3c040001, 0x8c845d98, 0x431024, 0x3442251f, +0xaf820214, 0x24020008, 0x3c010001, 0x370821, +0x1080000b, 0xac2283ac, 0x3c020001, 0x8c425d74, +0x14400007, 0x24020001, 0x3c010001, 0xac227dd0, +0xc004e54, 0x8f840220, 0x800480c, 0x0, +0x8f820220, 0x3c030008, 0x431024, 0x14400017, +0x2402000e, 0x3c010001, 0xac227dd0, 0x8ee20000, +0x2021, 0x3c030200, 0x431025, 0xc005386, +0xaee20000, 0x8f820220, 0x2403fffb, 0x431024, +0xaf820220, 0x8f820220, 0x34420002, 0xc0043dd, +0xaf820220, 0x3c050001, 0x8ca55cc8, 0xc0052a2, +0x2021, 0x800481f, 0x0, 0x3c020001, +0x8c425d74, 0x10400010, 0x0, 0x3c020001, +0x8c425d70, 0x2442ffff, 0x3c010001, 0xac225d70, +0x14400009, 0x24020002, 0x3c010001, 0xac205d74, +0x3c010001, 0x800481f, 0xac225d70, 0x24020001, +0x3c010001, 0xac225ccc, 0x8fbf0018, 0x3e00008, +0x27bd0020, 0x8f820200, 0x8f820220, 0x8f820220, +0x34420004, 0xaf820220, 0x8f820200, 0x3c060001, +0x8cc65cc8, 0x34420004, 0xaf820200, 0x24020002, +0x10c2003a, 0x2cc20003, 0x10400005, 0x24020001, +0x10c20008, 0x0, 0x8004868, 0x0, +0x24020004, 0x10c20013, 0x24020001, 0x8004868, +0x0, 0x3c030001, 0x8c635cb8, 0x3c020001, +0x8c425cc0, 0x3c040001, 0x8c845cdc, 0x3c050001, +0x8ca55cbc, 0xaf860200, 0xaf860220, 0x34630022, +0x441025, 0x451025, 0x34420002, 0x8004867, +0xaf830200, 0x3c030001, 0x8c635d98, 0xaf820200, +0x10600009, 0xaf820220, 0x3c020001, 0x8c425d74, +0x14400005, 0x3c033f00, 0x3c020001, 0x8c425cb0, +0x800485b, 0x346300e0, 0x3c020001, 0x8c425cb0, +0x3c033f00, 0x346300e2, 0x431025, 0xaf820200, +0x3c030001, 0x8c635cb4, 0x3c04f700, 0x3c020001, +0x8c425cc0, 0x3c050001, 0x8ca55cdc, 0x641825, +0x431025, 0x451025, 0xaf820220, 0x3e00008, +0x0, 0x8f820220, 0x3c030001, 0x8c635cc8, +0x34420004, 0xaf820220, 0x24020001, 0x1062000f, +0x0, 0x8f830054, 0x8f820054, 0x24630002, +0x621023, 0x2c420003, 0x10400011, 0x0, +0x8f820054, 0x621023, 0x2c420003, 0x1040000c, +0x0, 0x8004879, 0x0, 0x8f830054, +0x8f820054, 0x8004885, 0x24630007, 0x8f820054, +0x621023, 0x2c420008, 0x1440fffc, 0x0, +0x8f8400e0, 0x30820007, 0x1040000d, 0x0, +0x8f820054, 0x8f8300e0, 0x14830009, 0x24450032, +0x8f820054, 0xa21023, 0x2c420033, 0x10400004, +0x0, 0x8f8200e0, 0x1082fff9, 0x0, +0x8f820220, 0x2403fffd, 0x431024, 0xaf820220, +0x3e00008, 0x0, 0x3c030001, 0x8c635ce4, +0x3c020001, 0x8c425ce8, 0x50620004, 0x2463ffff, +0x3c010001, 0xac235ce8, 0x2463ffff, 0x2c620009, +0x1040009d, 0x31080, 0x3c010001, 0x220821, +0x8c225b08, 0x400008, 0x0, 0x8f820044, +0x34428080, 0xaf820044, 0x8f830054, 0x8004938, +0x24020002, 0x8f830054, 0x3c020001, 0x8c425da8, +0x2463d8f0, 0x431023, 0x2c422710, 0x1440008a, +0x24020003, 0x8004945, 0x0, 0x8f820044, +0x3c03ffff, 0x34637fff, 0x431024, 0xaf820044, +0x8f830054, 0x8004938, 0x24020004, 0x8f830054, +0x3c020001, 0x8c425da8, 0x2463fff6, 0x431023, +0x2c42000a, 0x14400078, 0x24020005, 0x8004945, +0x0, 0x8f820220, 0x3c03f700, 0x431025, +0xaf820220, 0x8f820220, 0x2403fffb, 0x431024, +0xaf820220, 0x8f820220, 0x34420002, 0xaf820220, +0x3c023f00, 0x344200e0, 0xaf820200, 0x8f820200, +0x2403fffd, 0x431024, 0xaf820200, 0x24040001, +0x3405ffff, 0xaf840204, 0x8f830054, 0x8f820054, +0x80048ec, 0x24630001, 0x8f820054, 0x621023, +0x2c420002, 0x1440fffc, 0x0, 0x8f820224, +0x42040, 0xa4102b, 0x1040fff2, 0x0, +0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, +0x8f820214, 0x3c03ffff, 0x431024, 0x3442251f, +0xaf820214, 0x8f820220, 0x2403fffb, 0x431024, +0xaf820220, 0x8f820220, 0x3c04f700, 0x34840008, +0x34420002, 0xaf820220, 0x8f820220, 0x3c033f00, +0x346300e2, 0x441025, 0xaf820220, 0xaf830200, +0x8f8400f0, 0x276217f8, 0x14820002, 0x24850008, +0x27651000, 0x8f8200f4, 0x10a20007, 0x3c038000, +0x34630040, 0x3c020001, 0x24425c70, 0xac820000, +0xac830004, 0xaf8500f0, 0x8f830054, 0x8004938, +0x24020006, 0x8f830054, 0x3c020001, 0x8c425da8, +0x2463fff6, 0x431023, 0x2c42000a, 0x14400022, +0x24020007, 0x8004945, 0x0, 0x8f8200e0, +0xaf8200e4, 0x8f8200e0, 0xaf8200e8, 0x8f820220, +0x34420004, 0xaf820220, 0x8f820220, 0x2403fff7, +0x431024, 0xaf820220, 0x8f820044, 0x34428080, +0xaf820044, 0x8f830054, 0x24020008, 0x3c010001, +0xac225ce4, 0x3c010001, 0x8004947, 0xac235da8, +0x8f830054, 0x3c020001, 0x8c425da8, 0x2463d8f0, +0x431023, 0x2c422710, 0x14400003, 0x24020009, +0x3c010001, 0xac225ce4, 0x3e00008, 0x0, +0x0, 0x0, 0x0, 0x27bdffd8, 0xafb20018, 0x809021, 0xafb3001c, 0xa09821, 0xafb10014, 0xc08821, 0xafb00010, 0x8021, -0xafbf0020, 0xa6200000, 0xc004cab, 0x24040001, +0xafbf0020, 0xa6200000, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc004cab, 0x2021, 0xc004cab, 0x24040001, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, +0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x24100010, 0x2501024, 0x10400002, 0x2021, -0x24040001, 0xc004cab, 0x108042, 0x1600fffa, +0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x2501024, 0x24100010, 0x2701024, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, -0x1600fffa, 0x2701024, 0xc004cd1, 0x34108000, -0xc004cd1, 0x0, 0xc004c8b, 0x0, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fffa, 0x2701024, 0xc004d71, 0x34108000, +0xc004d71, 0x0, 0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc004cd1, 0x0, 0x8fbf0020, 0x8fb3001c, +0xc004d71, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, 0x27bdffd8, 0xafb10014, 0x808821, 0xafb20018, 0xa09021, 0xafb3001c, 0xc09821, -0xafb00010, 0x8021, 0xafbf0020, 0xc004cab, +0xafb00010, 0x8021, 0xafbf0020, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004cab, 0x2021, 0xc004cab, -0x24040001, 0xc004cab, 0x2021, 0xc004cab, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x2301024, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x2301024, 0x24100010, 0x2501024, -0x10400002, 0x2021, 0x24040001, 0xc004cab, -0x108042, 0x1600fffa, 0x2501024, 0xc004cab, -0x24040001, 0xc004cab, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x2501024, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96620000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004cab, 0x108042, 0x1600fff8, -0x0, 0xc004cd1, 0x0, 0x8fbf0020, +0x24040001, 0xc004d4b, 0x108042, 0x1600fff8, +0x0, 0xc004d71, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, -0x3e00008, 0x27bd0028, 0x3c030001, 0x8c6354b0, -0x3c020001, 0x8c4254f4, 0x27bdffd8, 0xafbf0020, +0x3e00008, 0x27bd0028, 0x3c030001, 0x8c635d00, +0x3c020001, 0x8c425d48, 0x27bdffd8, 0xafbf0020, 0xafb1001c, 0x10620003, 0xafb00018, 0x3c010001, -0xac2354f4, 0x2463ffff, 0x2c620013, 0x10400349, -0x31080, 0x3c010001, 0x220821, 0x8c225310, -0x400008, 0x0, 0xc004cd1, 0x8021, -0x34028000, 0xa7a20010, 0x27b10010, 0xc004cab, +0xac235d48, 0x2463ffff, 0x2c620013, 0x10400349, +0x31080, 0x3c010001, 0x220821, 0x8c225b30, +0x400008, 0x0, 0xc004d71, 0x8021, +0x34028000, 0xa7a20010, 0x27b10010, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004cab, 0x2021, 0xc004cab, -0x24040001, 0xc004cab, 0x2021, 0xc004cab, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, -0x1600fffa, 0x32020001, 0x24100010, 0xc004cab, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0xc004d4b, 0x2021, 0x108042, 0x1600fffc, 0x0, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, -0x1600fff8, 0x0, 0xc004cd1, 0x0, -0x8004c84, 0x24020002, 0x27b10010, 0xa7a00010, -0x8021, 0xc004cab, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc004cab, -0x2021, 0xc004cab, 0x24040001, 0xc004cab, -0x24040001, 0xc004cab, 0x2021, 0x24100010, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8004d24, 0x24020002, 0x27b10010, 0xa7a00010, +0x8021, 0xc004d4b, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d4b, +0x2021, 0xc004d4b, 0x24040001, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020001, -0x24100010, 0xc004cab, 0x2021, 0x108042, -0x1600fffc, 0x0, 0xc004cd1, 0x34108000, -0xc004cd1, 0x0, 0xc004c8b, 0x0, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, +0x24100010, 0xc004d4b, 0x2021, 0x108042, +0x1600fffc, 0x0, 0xc004d71, 0x34108000, +0xc004d71, 0x0, 0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc004cd1, 0x0, 0x97a20010, 0x30428000, -0x144002dc, 0x24020003, 0x8004c84, 0x0, +0xc004d71, 0x0, 0x97a20010, 0x30428000, +0x144002dc, 0x24020003, 0x8004d24, 0x0, 0x24021200, 0xa7a20010, 0x27b10010, 0x8021, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, -0xc004cab, 0x2021, 0x108042, 0x1600fffc, -0x0, 0xc004cab, 0x24040001, 0xc004cab, +0xc004d4b, 0x2021, 0x108042, 0x1600fffc, +0x0, 0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, -0x10400002, 0x2021, 0x24040001, 0xc004cab, -0x108042, 0x1600fff8, 0x0, 0xc004cd1, -0x0, 0x8f830054, 0x8004c76, 0x24020004, -0x8f830054, 0x3c020001, 0x8c42554c, 0x2463ff9c, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fff8, 0x0, 0xc004d71, +0x0, 0x8f830054, 0x8004d16, 0x24020004, +0x8f830054, 0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440029e, 0x24020002, -0x3c030001, 0x8c635550, 0x10620297, 0x2c620003, +0x3c030001, 0x8c635dbc, 0x10620297, 0x2c620003, 0x14400296, 0x24020011, 0x24020003, 0x10620005, -0x24020004, 0x10620291, 0x2402000f, 0x8004c84, -0x24020011, 0x8004c84, 0x24020005, 0x24020014, -0xa7a20010, 0x27b10010, 0x8021, 0xc004cab, +0x24020004, 0x10620291, 0x2402000f, 0x8004d24, +0x24020011, 0x8004d24, 0x24020005, 0x24020014, +0xa7a20010, 0x27b10010, 0x8021, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004cab, 0x2021, 0xc004cab, -0x24040001, 0xc004cab, 0x2021, 0xc004cab, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020012, -0x10400002, 0x2021, 0x24040001, 0xc004cab, -0x108042, 0x1600fffa, 0x32020012, 0xc004cab, -0x24040001, 0xc004cab, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x32020012, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004cab, 0x108042, 0x1600fff8, -0x0, 0xc004cd1, 0x0, 0x8f830054, -0x8004c76, 0x24020006, 0x8f830054, 0x3c020001, -0x8c42554c, 0x2463ff9c, 0x431023, 0x2c420064, -0x14400250, 0x24020007, 0x8004c84, 0x0, +0x24040001, 0xc004d4b, 0x108042, 0x1600fff8, +0x0, 0xc004d71, 0x0, 0x8f830054, +0x8004d16, 0x24020006, 0x8f830054, 0x3c020001, +0x8c425db8, 0x2463ff9c, 0x431023, 0x2c420064, +0x14400250, 0x24020007, 0x8004d24, 0x0, 0x24020006, 0xa7a20010, 0x27b10010, 0x8021, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020013, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020013, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, -0x1600fff8, 0x0, 0xc004cd1, 0x0, -0x8f830054, 0x8004c76, 0x24020008, 0x8f830054, -0x3c020001, 0x8c42554c, 0x2463ff9c, 0x431023, -0x2c420064, 0x1440020f, 0x24020009, 0x8004c84, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x24020008, 0x8f830054, +0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, +0x2c420064, 0x1440020f, 0x24020009, 0x8004d24, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x24040001, -0xc004cab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x24040001, +0xc004d4b, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020018, -0xc004cd1, 0x34108000, 0xc004cd1, 0x0, -0xc004c8b, 0x0, 0x50400005, 0x108042, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020018, +0xc004d71, 0x34108000, 0xc004d71, 0x0, +0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004cd1, 0x8021, +0x1600fff7, 0x0, 0xc004d71, 0x8021, 0x97a20010, 0x27b10010, 0x34420001, 0xa7a20010, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020018, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020018, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, -0x1600fff8, 0x0, 0xc004cd1, 0x0, -0x8f830054, 0x8004c76, 0x2402000a, 0x8f830054, -0x3c020001, 0x8c42554c, 0x2463ff9c, 0x431023, -0x2c420064, 0x1440019b, 0x2402000b, 0x8004c84, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x2402000a, 0x8f830054, +0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, +0x2c420064, 0x1440019b, 0x2402000b, 0x8004d24, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x24040001, -0xc004cab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x24040001, +0xc004d4b, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020017, -0xc004cd1, 0x34108000, 0xc004cd1, 0x0, -0xc004c8b, 0x0, 0x50400005, 0x108042, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020017, +0xc004d71, 0x34108000, 0xc004d71, 0x0, +0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004cd1, 0x8021, +0x1600fff7, 0x0, 0xc004d71, 0x8021, 0x97a20010, 0x27b10010, 0x34420700, 0xa7a20010, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020017, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020017, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, -0x1600fff8, 0x0, 0xc004cd1, 0x0, -0x8f830054, 0x8004c76, 0x2402000c, 0x8f830054, -0x3c020001, 0x8c42554c, 0x2463ff9c, 0x431023, -0x2c420064, 0x14400127, 0x24020012, 0x8004c84, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x2402000c, 0x8f830054, +0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, +0x2c420064, 0x14400127, 0x24020012, 0x8004d24, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x24040001, -0xc004cab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x24040001, +0xc004d4b, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020014, -0xc004cd1, 0x34108000, 0xc004cd1, 0x0, -0xc004c8b, 0x0, 0x50400005, 0x108042, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020014, +0xc004d71, 0x34108000, 0xc004d71, 0x0, +0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004cd1, 0x8021, +0x1600fff7, 0x0, 0xc004d71, 0x8021, 0x97a20010, 0x27b10010, 0x34420010, 0xa7a20010, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020014, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020014, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, -0x1600fff8, 0x0, 0xc004cd1, 0x0, -0x8f830054, 0x8004c76, 0x24020013, 0x8f830054, -0x3c020001, 0x8c42554c, 0x2463ff9c, 0x431023, -0x2c420064, 0x144000b3, 0x2402000d, 0x8004c84, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x24020013, 0x8f830054, +0x3c020001, 0x8c425db8, 0x2463ff9c, 0x431023, +0x2c420064, 0x144000b3, 0x2402000d, 0x8004d24, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x24040001, -0xc004cab, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x24040001, +0xc004d4b, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020018, -0xc004cd1, 0x34108000, 0xc004cd1, 0x0, -0xc004c8b, 0x0, 0x50400005, 0x108042, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020018, +0xc004d71, 0x34108000, 0xc004d71, 0x0, +0xc004d2b, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc004cd1, 0x8021, +0x1600fff7, 0x0, 0xc004d71, 0x8021, 0x97a20010, 0x27b10010, 0x3042fffe, 0xa7a20010, -0xc004cab, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, -0xc004cab, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc004cab, +0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, +0xc004d4b, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc004cab, 0x108042, 0x1600fffa, 0x32020018, -0xc004cab, 0x24040001, 0xc004cab, 0x2021, +0xc004d4b, 0x108042, 0x1600fffa, 0x32020018, +0xc004d4b, 0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, -0x1600fff8, 0x0, 0xc004cd1, 0x0, -0x8f830054, 0x8004c76, 0x2402000e, 0x24020840, -0xa7a20010, 0x27b10010, 0x8021, 0xc004cab, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fff8, 0x0, 0xc004d71, 0x0, +0x8f830054, 0x8004d16, 0x2402000e, 0x24020840, +0xa7a20010, 0x27b10010, 0x8021, 0xc004d4b, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc004cab, 0x2021, 0xc004cab, -0x24040001, 0xc004cab, 0x2021, 0xc004cab, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc004cab, 0x108042, +0x2021, 0x24040001, 0xc004d4b, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, -0x10400002, 0x2021, 0x24040001, 0xc004cab, -0x108042, 0x1600fffa, 0x32020013, 0xc004cab, -0x24040001, 0xc004cab, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x32020013, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc004cab, 0x108042, 0x1600fff8, -0x0, 0xc004cd1, 0x0, 0x8f830054, -0x24020010, 0x3c010001, 0xac2254b0, 0x3c010001, -0x8004c86, 0xac23554c, 0x8f830054, 0x3c020001, -0x8c42554c, 0x2463ff9c, 0x431023, 0x2c420064, +0x24040001, 0xc004d4b, 0x108042, 0x1600fff8, +0x0, 0xc004d71, 0x0, 0x8f830054, +0x24020010, 0x3c010001, 0xac225d00, 0x3c010001, +0x8004d26, 0xac235db8, 0x8f830054, 0x3c020001, +0x8c425db8, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400004, 0x0, 0x24020011, 0x3c010001, -0xac2254b0, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, +0xac225d00, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0028, 0x8f850044, 0x8f820044, 0x3c030001, 0x431025, 0x3c030008, 0xaf820044, -0x8f840054, 0x8f820054, 0xa32824, 0x8004c97, +0x8f840054, 0x8f820054, 0xa32824, 0x8004d37, 0x24840001, 0x8f820054, 0x821023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, -0x8f820054, 0x8004ca5, 0x24630001, 0x8f820054, +0x8f820054, 0x8004d45, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0xa01021, 0x8f830044, 0x3c02fff0, 0x3442ffff, 0x42480, 0x621824, 0x3c020002, 0x822025, 0x641825, 0xaf830044, 0x8f820044, -0x3c030001, 0x431025, 0xaf820044, 0x8f830054, -0x8f820054, 0x8004cbd, 0x24630001, 0x8f820054, -0x621023, 0x2c420002, 0x1440fffc, 0x0, -0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, -0xaf820044, 0x8f830054, 0x8f820054, 0x8004ccb, +0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, +0x8f830054, 0x8f820054, 0x8004d5e, 0x24630001, +0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, +0x0, 0x8f820044, 0x3c030001, 0x431025, +0xaf820044, 0x8f830054, 0x8f820054, 0x8004d6b, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0x0, 0x8f820044, 0x3c03fff0, 0x3463ffff, 0x431024, 0xaf820044, 0x8f820044, 0x3c030001, 0x431025, -0xaf820044, 0x8f830054, 0x8f820054, 0x8004cdf, +0xaf820044, 0x8f830054, 0x8f820054, 0x8004d7f, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, -0x8f820054, 0x8004ced, 0x24630001, 0x8f820054, +0x8f820054, 0x8004d8d, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, -0x3e00008, 0x0, 0x0, 0x27bdffe8, +0x3e00008, 0x0, 0x27bdffc8, 0xafb30024, +0x809821, 0xafb5002c, 0xa0a821, 0xafb20020, +0xc09021, 0x32a2ffff, 0xafbf0030, 0xafb40028, +0xafb1001c, 0xafb00018, 0x14400034, 0xa7b20010, +0x3271ffff, 0x27b20010, 0x8021, 0xc004d4b, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2301024, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x2301024, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, +0x96420000, 0x501024, 0x10400002, 0x2021, +0x24040001, 0xc004d4b, 0x108042, 0x12000075, +0x0, 0x8004dc9, 0x0, 0x3274ffff, +0x27b10010, 0xa7a00010, 0x8021, 0xc004d4b, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x24040001, 0xc004d4b, +0x2021, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2901024, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x2901024, 0xc004d71, +0x34108000, 0xc004d71, 0x0, 0xc004d2b, +0x0, 0x50400005, 0x108042, 0x96220000, +0x501025, 0xa6220000, 0x108042, 0x1600fff7, +0x0, 0xc004d71, 0x0, 0x32a5ffff, +0x24020001, 0x54a20004, 0x24020002, 0x97a20010, +0x8004e14, 0x521025, 0x14a20006, 0x3271ffff, +0x97a20010, 0x121827, 0x431024, 0xa7a20010, +0x3271ffff, 0x27b20010, 0x8021, 0xc004d4b, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0xc004d4b, +0x24040001, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d4b, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2301024, +0x10400002, 0x2021, 0x24040001, 0xc004d4b, +0x108042, 0x1600fffa, 0x2301024, 0xc004d4b, +0x24040001, 0xc004d4b, 0x2021, 0x34108000, +0x96420000, 0x501024, 0x10400002, 0x2021, +0x24040001, 0xc004d4b, 0x108042, 0x1600fff8, +0x0, 0xc004d71, 0x0, 0x8fbf0030, +0x8fb5002c, 0x8fb40028, 0x8fb30024, 0x8fb20020, +0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0038, +0x0, 0x0, 0x0, 0x27bdffe8, 0xafbf0010, 0x3c030001, 0x771821, 0x8c6383ac, 0x24020008, 0x1462022c, 0x803021, 0x3c020001, -0x8c425538, 0x14400033, 0x0, 0x8f850224, +0x8c425d98, 0x14400033, 0x0, 0x8f850224, 0x38a30020, 0x2c630001, 0x38a20010, 0x2c420001, 0x621825, 0x1460000d, 0x38a30030, 0x2c630001, 0x38a20400, 0x2c420001, 0x621825, 0x14600007, 0x38a30402, 0x2c630001, 0x38a20404, 0x2c420001, -0x621825, 0x10600005, 0x0, 0xc00429f, -0x0, 0x8004d2d, 0x2402000e, 0xc0043e1, -0x0, 0x3c050001, 0x8ca55488, 0xc0050b3, -0x2021, 0x3c030001, 0x8c635488, 0x24020004, -0x14620005, 0x2403fffb, 0x3c020001, 0x8c425484, -0x8004d29, 0x2403fff7, 0x3c020001, 0x8c425484, -0x431024, 0x3c010001, 0xac225484, 0x2402000e, -0x3c010001, 0xc00429f, 0xac227560, 0x8004f27, +0x621825, 0x10600005, 0x0, 0xc00429b, +0x0, 0x8004e8d, 0x2402000e, 0xc0043dd, +0x0, 0x3c050001, 0x8ca55cc8, 0xc0052a2, +0x2021, 0x3c030001, 0x8c635cc8, 0x24020004, +0x14620005, 0x2403fffb, 0x3c020001, 0x8c425cc4, +0x8004e89, 0x2403fff7, 0x3c020001, 0x8c425cc4, +0x431024, 0x3c010001, 0xac225cc4, 0x2402000e, +0x3c010001, 0xc00429b, 0xac227dd0, 0x8005087, 0x0, 0x8f820220, 0x3c030400, 0x431024, 0x10400027, 0x2403ffbf, 0x8f850224, 0x3c020001, -0x8c42756c, 0xa32024, 0x431024, 0x1482000c, -0x0, 0x3c020001, 0x8c427570, 0x24420001, -0x3c010001, 0xac227570, 0x2c420002, 0x14400008, -0x24020001, 0x3c010001, 0x8004d4d, 0xac227590, -0x3c010001, 0xac207570, 0x3c010001, 0xac207590, -0x3c020001, 0x8c427590, 0x10400006, 0x30a20040, -0x10400004, 0x24020001, 0x3c010001, 0x8004d58, -0xac227594, 0x3c010001, 0xac207594, 0x3c010001, -0xac25756c, 0x3c010001, 0x8004d68, 0xac2075a0, -0x24020001, 0x3c010001, 0xac2275a0, 0x3c010001, -0xac207590, 0x3c010001, 0xac207570, 0x3c010001, -0xac207594, 0x3c010001, 0xac20756c, 0x3c030001, -0x8c637560, 0x3c020001, 0x8c427564, 0x10620003, -0x3c020200, 0x3c010001, 0xac237564, 0xc21024, +0x8c427ddc, 0xa32024, 0x431024, 0x1482000c, +0x0, 0x3c020001, 0x8c427de0, 0x24420001, +0x3c010001, 0xac227de0, 0x2c420002, 0x14400008, +0x24020001, 0x3c010001, 0x8004ead, 0xac227e00, +0x3c010001, 0xac207de0, 0x3c010001, 0xac207e00, +0x3c020001, 0x8c427e00, 0x10400006, 0x30a20040, +0x10400004, 0x24020001, 0x3c010001, 0x8004eb8, +0xac227e04, 0x3c010001, 0xac207e04, 0x3c010001, +0xac257ddc, 0x3c010001, 0x8004ec8, 0xac207e10, +0x24020001, 0x3c010001, 0xac227e10, 0x3c010001, +0xac207e00, 0x3c010001, 0xac207de0, 0x3c010001, +0xac207e04, 0x3c010001, 0xac207ddc, 0x3c030001, +0x8c637dd0, 0x3c020001, 0x8c427dd4, 0x10620003, +0x3c020200, 0x3c010001, 0xac237dd4, 0xc21024, 0x10400007, 0x2463ffff, 0x8f820220, 0x24030001, -0x3c010001, 0xac23548c, 0x8004f25, 0x3c03f700, +0x3c010001, 0xac235ccc, 0x8005085, 0x3c03f700, 0x2c62000e, 0x104001a8, 0x31080, 0x3c010001, -0x220821, 0x8c225360, 0x400008, 0x0, -0x3c010001, 0xac207590, 0x3c010001, 0xac207570, -0x3c010001, 0xac20756c, 0x3c010001, 0xac207594, -0x3c010001, 0xac207588, 0x3c010001, 0xac207580, -0xc0047cc, 0xaf800224, 0x24020002, 0x3c010001, -0xac227560, 0x3c020001, 0x8c4275a0, 0x14400056, +0x220821, 0x8c225b80, 0x400008, 0x0, +0x3c010001, 0xac207e00, 0x3c010001, 0xac207de0, +0x3c010001, 0xac207ddc, 0x3c010001, 0xac207e04, +0x3c010001, 0xac207df8, 0x3c010001, 0xac207df0, +0xc00486a, 0xaf800224, 0x24020002, 0x3c010001, +0xac227dd0, 0x3c020001, 0x8c427e10, 0x14400056, 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x431024, -0xc00429f, 0xaee20000, 0xaf800204, 0x8f820200, +0xc00429b, 0xaee20000, 0xaf800204, 0x8f820200, 0x2403fffd, 0x431024, 0xaf820200, 0x3c010001, -0xac2075b0, 0x8f830054, 0x3c020001, 0x8c427588, -0x24040001, 0x3c010001, 0xac24759c, 0x24420001, -0x3c010001, 0xac227588, 0x2c420004, 0x3c010001, -0xac237584, 0x14400006, 0x24020003, 0x3c010001, -0xac24548c, 0x3c010001, 0x8004f23, 0xac207588, -0x3c010001, 0x8004f23, 0xac227560, 0x8f830054, -0x3c020001, 0x8c427584, 0x2463d8f0, 0x431023, +0xac207e20, 0x8f830054, 0x3c020001, 0x8c427df8, +0x24040001, 0x3c010001, 0xac247e0c, 0x24420001, +0x3c010001, 0xac227df8, 0x2c420004, 0x3c010001, +0xac237df4, 0x14400006, 0x24020003, 0x3c010001, +0xac245ccc, 0x3c010001, 0x8005083, 0xac207df8, +0x3c010001, 0x8005083, 0xac227dd0, 0x8f830054, +0x3c020001, 0x8c427df4, 0x2463d8f0, 0x431023, 0x2c422710, 0x14400003, 0x24020004, 0x3c010001, -0xac227560, 0x3c020001, 0x8c4275a0, 0x14400026, +0xac227dd0, 0x3c020001, 0x8c427e10, 0x14400026, 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x431024, -0x8004f23, 0xaee20000, 0x3c040001, 0x8c84553c, -0x3c010001, 0xc004f2a, 0xac207578, 0x3c020001, -0x8c4275ac, 0xaf820204, 0x3c020001, 0x8c4275a0, +0x8005083, 0xaee20000, 0x3c040001, 0x8c845d9c, +0x3c010001, 0xc00508a, 0xac207de8, 0x3c020001, +0x8c427e1c, 0xaf820204, 0x3c020001, 0x8c427e10, 0x14400015, 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x431024, 0xaee20000, 0x8f820204, 0x30420030, -0x1440013c, 0x24020002, 0x3c030001, 0x8c6375ac, -0x24020005, 0x3c010001, 0xac227560, 0x3c010001, -0x8004f23, 0xac2375b0, 0x3c020001, 0x8c4275a0, -0x10400010, 0x3c03fdff, 0x3c020001, 0x8c42550c, -0x24420001, 0x3c010001, 0xac22550c, 0x2c420002, -0x14400131, 0x24020001, 0x3c010001, 0xac225514, -0x3c010001, 0xac20550c, 0x3c010001, 0x8004f23, -0xac22548c, 0x8ee20000, 0x3463ffff, 0x431024, -0xaee20000, 0x3c020001, 0x8c427590, 0x10400122, -0x0, 0x3c020001, 0x8c42756c, 0x1040011e, -0x0, 0x3c010001, 0xac227598, 0x24020003, -0x3c010001, 0xac227570, 0x8004ec4, 0x24020006, -0x3c010001, 0xac207578, 0x8f820204, 0x34420040, -0xaf820204, 0x3c020001, 0x8c4275b0, 0x24030007, -0x3c010001, 0xac237560, 0x34420040, 0x3c010001, -0xac2275b0, 0x3c020001, 0x8c427590, 0x10400005, -0x0, 0x3c020001, 0x8c42756c, 0x104000f9, -0x24020002, 0x3c050001, 0x24a57570, 0x8ca20000, +0x1440013c, 0x24020002, 0x3c030001, 0x8c637e1c, +0x24020005, 0x3c010001, 0xac227dd0, 0x3c010001, +0x8005083, 0xac237e20, 0x3c020001, 0x8c427e10, +0x10400010, 0x3c03fdff, 0x3c020001, 0x8c425d6c, +0x24420001, 0x3c010001, 0xac225d6c, 0x2c420002, +0x14400131, 0x24020001, 0x3c010001, 0xac225d74, +0x3c010001, 0xac205d6c, 0x3c010001, 0x8005083, +0xac225ccc, 0x8ee20000, 0x3463ffff, 0x431024, +0xaee20000, 0x3c020001, 0x8c427e00, 0x10400122, +0x0, 0x3c020001, 0x8c427ddc, 0x1040011e, +0x0, 0x3c010001, 0xac227e08, 0x24020003, +0x3c010001, 0xac227de0, 0x8005024, 0x24020006, +0x3c010001, 0xac207de8, 0x8f820204, 0x34420040, +0xaf820204, 0x3c020001, 0x8c427e20, 0x24030007, +0x3c010001, 0xac237dd0, 0x34420040, 0x3c010001, +0xac227e20, 0x3c020001, 0x8c427e00, 0x10400005, +0x0, 0x3c020001, 0x8c427ddc, 0x104000f9, +0x24020002, 0x3c050001, 0x24a57de0, 0x8ca20000, 0x2c424e21, 0x104000f3, 0x24020002, 0x3c020001, -0x8c427594, 0x104000f8, 0x2404ffbf, 0x3c020001, -0x8c42756c, 0x3c030001, 0x8c637598, 0x441024, +0x8c427e04, 0x104000f8, 0x2404ffbf, 0x3c020001, +0x8c427ddc, 0x3c030001, 0x8c637e08, 0x441024, 0x641824, 0x10430004, 0x24020001, 0x3c010001, -0x8004f23, 0xac227560, 0x24020003, 0xaca20000, -0x24020008, 0x3c010001, 0xac227560, 0x3c020001, -0x8c42759c, 0x1040000c, 0x24020001, 0x3c040001, -0xc004f37, 0x8c84756c, 0x3c020001, 0x8c4275b8, -0x14400005, 0x24020001, 0x3c020001, 0x8c4275b4, -0x10400006, 0x24020001, 0x3c010001, 0xac22548c, -0x3c010001, 0x8004f23, 0xac207588, 0x3c020001, -0x8c427580, 0x3c030001, 0x8c63756c, 0x2c420001, -0x210c0, 0x30630008, 0x3c010001, 0xac227580, -0x3c010001, 0xac23757c, 0x8f830054, 0x24020009, -0x3c010001, 0xac227560, 0x3c010001, 0x8004f23, -0xac237584, 0x8f830054, 0x3c020001, 0x8c427584, +0x8005083, 0xac227dd0, 0x24020003, 0xaca20000, +0x24020008, 0x3c010001, 0xac227dd0, 0x3c020001, +0x8c427e0c, 0x1040000c, 0x24020001, 0x3c040001, +0xc005097, 0x8c847ddc, 0x3c020001, 0x8c427e28, +0x14400005, 0x24020001, 0x3c020001, 0x8c427e24, +0x10400006, 0x24020001, 0x3c010001, 0xac225ccc, +0x3c010001, 0x8005083, 0xac207df8, 0x3c020001, +0x8c427df0, 0x3c030001, 0x8c637ddc, 0x2c420001, +0x210c0, 0x30630008, 0x3c010001, 0xac227df0, +0x3c010001, 0xac237dec, 0x8f830054, 0x24020009, +0x3c010001, 0xac227dd0, 0x3c010001, 0x8005083, +0xac237df4, 0x8f830054, 0x3c020001, 0x8c427df4, 0x2463d8f0, 0x431023, 0x2c422710, 0x144000a8, -0x0, 0x3c020001, 0x8c427590, 0x10400005, -0x0, 0x3c020001, 0x8c42756c, 0x104000a9, -0x24020002, 0x3c030001, 0x24637570, 0x8c620000, +0x0, 0x3c020001, 0x8c427e00, 0x10400005, +0x0, 0x3c020001, 0x8c427ddc, 0x104000a9, +0x24020002, 0x3c030001, 0x24637de0, 0x8c620000, 0x2c424e21, 0x104000a3, 0x24020002, 0x3c020001, -0x8c42759c, 0x1040000e, 0x0, 0x3c020001, -0x8c42756c, 0x3c010001, 0xac20759c, 0x30420080, +0x8c427e0c, 0x1040000e, 0x0, 0x3c020001, +0x8c427ddc, 0x3c010001, 0xac207e0c, 0x30420080, 0x1040002f, 0x2402000c, 0x8f820204, 0x30420080, -0x1440000c, 0x24020003, 0x8004eb1, 0x2402000c, -0x3c020001, 0x8c42756c, 0x30420080, 0x14400005, +0x1440000c, 0x24020003, 0x8005011, 0x2402000c, +0x3c020001, 0x8c427ddc, 0x30420080, 0x14400005, 0x24020003, 0x8f820204, 0x30420080, 0x1040001f, 0x24020003, 0xac620000, 0x2402000a, 0x3c010001, -0xac227560, 0x3c040001, 0x248475a8, 0x8c820000, -0x3c030001, 0x8c637580, 0x431025, 0xaf820204, -0x8c830000, 0x3c040001, 0x8c847580, 0x2402000b, -0x3c010001, 0xac227560, 0x641825, 0x3c010001, -0xac2375b0, 0x3c050001, 0x24a57570, 0x8ca20000, +0xac227dd0, 0x3c040001, 0x24847e18, 0x8c820000, +0x3c030001, 0x8c637df0, 0x431025, 0xaf820204, +0x8c830000, 0x3c040001, 0x8c847df0, 0x2402000b, +0x3c010001, 0xac227dd0, 0x641825, 0x3c010001, +0xac237e20, 0x3c050001, 0x24a57de0, 0x8ca20000, 0x2c424e21, 0x1040006f, 0x24020002, 0x3c020001, -0x8c4275a0, 0x10400005, 0x0, 0x2402000c, -0x3c010001, 0x8004f23, 0xac227560, 0x3c020001, -0x8c427590, 0x1040006c, 0x0, 0x3c040001, -0x8c84756c, 0x1080005e, 0x30820008, 0x3c030001, -0x8c63757c, 0x10620064, 0x24020003, 0x3c010001, -0xac247598, 0xaca20000, 0x24020006, 0x3c010001, -0x8004f23, 0xac227560, 0x8f820200, 0x34420002, +0x8c427e10, 0x10400005, 0x0, 0x2402000c, +0x3c010001, 0x8005083, 0xac227dd0, 0x3c020001, +0x8c427e00, 0x1040006c, 0x0, 0x3c040001, +0x8c847ddc, 0x1080005e, 0x30820008, 0x3c030001, +0x8c637dec, 0x10620064, 0x24020003, 0x3c010001, +0xac247e08, 0xaca20000, 0x24020006, 0x3c010001, +0x8005083, 0xac227dd0, 0x8f820200, 0x34420002, 0xaf820200, 0x8f830054, 0x2402000d, 0x3c010001, -0xac227560, 0x3c010001, 0xac237584, 0x8f830054, -0x3c020001, 0x8c427584, 0x2463d8f0, 0x431023, +0xac227dd0, 0x3c010001, 0xac237df4, 0x8f830054, +0x3c020001, 0x8c427df4, 0x2463d8f0, 0x431023, 0x2c422710, 0x1440003a, 0x0, 0x3c020001, -0x8c4275a0, 0x10400029, 0x2402000e, 0x3c030001, -0x8c6375b4, 0x3c010001, 0x14600015, 0xac227560, -0xc0043e1, 0x0, 0x3c050001, 0x8ca55488, -0xc0050b3, 0x2021, 0x3c030001, 0x8c635488, +0x8c427e10, 0x10400029, 0x2402000e, 0x3c030001, +0x8c637e24, 0x3c010001, 0x14600015, 0xac227dd0, +0xc0043dd, 0x0, 0x3c050001, 0x8ca55cc8, +0xc0052a2, 0x2021, 0x3c030001, 0x8c635cc8, 0x24020004, 0x14620005, 0x2403fffb, 0x3c020001, -0x8c425484, 0x8004ef2, 0x2403fff7, 0x3c020001, -0x8c425484, 0x431024, 0x3c010001, 0xac225484, +0x8c425cc4, 0x8005052, 0x2403fff7, 0x3c020001, +0x8c425cc4, 0x431024, 0x3c010001, 0xac225cc4, 0x8ee20000, 0x3c030200, 0x431025, 0xaee20000, -0x8f820224, 0x3c010001, 0xac2275bc, 0x8f820220, +0x8f820224, 0x3c010001, 0xac227e2c, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, -0x34420002, 0x8004f23, 0xaf820220, 0x3c020001, -0x8c427590, 0x10400005, 0x0, 0x3c020001, -0x8c42756c, 0x1040000f, 0x24020002, 0x3c020001, -0x8c427570, 0x2c424e21, 0x1040000a, 0x24020002, -0x3c020001, 0x8c427590, 0x1040000f, 0x0, -0x3c020001, 0x8c42756c, 0x1440000b, 0x0, -0x24020002, 0x3c010001, 0x8004f23, 0xac227560, -0x3c020001, 0x8c427590, 0x10400003, 0x0, -0xc00429f, 0x0, 0x8f820220, 0x3c03f700, +0x34420002, 0x8005083, 0xaf820220, 0x3c020001, +0x8c427e00, 0x10400005, 0x0, 0x3c020001, +0x8c427ddc, 0x1040000f, 0x24020002, 0x3c020001, +0x8c427de0, 0x2c424e21, 0x1040000a, 0x24020002, +0x3c020001, 0x8c427e00, 0x1040000f, 0x0, +0x3c020001, 0x8c427ddc, 0x1440000b, 0x0, +0x24020002, 0x3c010001, 0x8005083, 0xac227dd0, +0x3c020001, 0x8c427e00, 0x10400003, 0x0, +0xc00429b, 0x0, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, 0x8fbf0010, 0x3e00008, -0x27bd0018, 0x3c030001, 0x246375b8, 0x8c620000, -0x10400005, 0x34422000, 0x3c010001, 0xac2275ac, -0x8004f35, 0xac600000, 0x3c010001, 0xac2475ac, +0x27bd0018, 0x3c030001, 0x24637e28, 0x8c620000, +0x10400005, 0x34422000, 0x3c010001, 0xac227e1c, +0x8005095, 0xac600000, 0x3c010001, 0xac247e1c, 0x3e00008, 0x0, 0x27bdffe0, 0x30820030, -0xafbf0018, 0x3c010001, 0xac2275b4, 0x14400067, +0xafbf0018, 0x3c010001, 0xac227e24, 0x14400067, 0x3c02ffff, 0x34421f0e, 0x821024, 0x14400061, 0x24020030, 0x30822000, 0x1040005d, 0x30838000, 0x31a02, 0x30820001, 0x21200, 0x3c040001, -0x8c84553c, 0x621825, 0x331c2, 0x3c030001, -0x24635518, 0x30828000, 0x21202, 0x30840001, +0x8c845d9c, 0x621825, 0x331c2, 0x3c030001, +0x24635d78, 0x30828000, 0x21202, 0x30840001, 0x42200, 0x441025, 0x239c2, 0x61080, 0x431021, 0x471021, 0x90430000, 0x24020001, 0x10620025, 0x0, 0x10600007, 0x24020002, 0x10620013, 0x24020003, 0x1062002c, 0x3c05000f, -0x8004f99, 0x0, 0x8f820200, 0x2403feff, +0x80050f9, 0x0, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, 0x3c010001, -0xac2075d4, 0x3c010001, 0x8004fa4, 0xac2075dc, +0xac207e44, 0x3c010001, 0x8005104, 0xac207e4c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, -0x24020100, 0x3c010001, 0xac2275d4, 0x3c010001, -0x8004fa4, 0xac2075dc, 0x8f820200, 0x2403feff, +0x24020100, 0x3c010001, 0xac227e44, 0x3c010001, +0x8005104, 0xac207e4c, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c030001, -0x431025, 0xaf820220, 0x3c010001, 0xac2075d4, -0x3c010001, 0x8004fa4, 0xac2375dc, 0x8f820200, +0x431025, 0xaf820220, 0x3c010001, 0xac207e44, +0x3c010001, 0x8005104, 0xac237e4c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, 0x24020100, 0x3c010001, -0xac2275d4, 0x3c010001, 0x8004fa4, 0xac2375dc, -0x34a5ffff, 0x3c040001, 0x24845398, 0xafa30010, -0xc002407, 0xafa00014, 0x8004fa4, 0x0, -0x24020030, 0x3c010001, 0xac2275b8, 0x8fbf0018, +0xac227e44, 0x3c010001, 0x8005104, 0xac237e4c, +0x34a5ffff, 0x3c040001, 0x24845bb8, 0xafa30010, +0xc002403, 0xafa00014, 0x8005104, 0x0, +0x24020030, 0x3c010001, 0xac227e28, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0, 0x27bdffc8, -0xafb10024, 0x808821, 0xafb3002c, 0xa09821, -0xafb00020, 0xc08021, 0x3c040001, 0x248453b0, -0x3c050009, 0x3c020001, 0x8c425488, 0x34a59001, -0x2203021, 0x2603821, 0xafbf0030, 0xafb20028, -0xa7a0001a, 0xafb00014, 0xc002407, 0xafa20010, -0x24020002, 0x126200ed, 0x2e620003, 0x10400005, -0x24020001, 0x1262000a, 0x3c02fffb, 0x80050ac, -0x0, 0x24020004, 0x1262006d, 0x24020008, -0x1262006c, 0x3c02ffec, 0x80050ac, 0x0, -0x3442ffff, 0x2028024, 0x119140, 0x3c010001, -0x320821, 0xac3075cc, 0x3c024000, 0x2021024, -0x10400046, 0x1023c2, 0x30840030, 0x101382, -0x3042000c, 0x3c030001, 0x246354b4, 0x431021, -0x823821, 0x3c020020, 0x2021024, 0x10400006, -0x24020100, 0x3c010001, 0x320821, 0xac2275d0, -0x8004feb, 0x3c020080, 0x3c010001, 0x320821, -0xac2075d0, 0x3c020080, 0x2021024, 0x10400006, -0x111940, 0x3c020001, 0x3c010001, 0x230821, -0x8004ff7, 0xac2275d8, 0x111140, 0x3c010001, -0x220821, 0xac2075d8, 0x94e30000, 0x32024000, -0x10400003, 0xa7a30018, 0x34624000, 0xa7a20018, -0x24040001, 0x94e20002, 0x24050004, 0x24e60002, -0x34420001, 0xc0048ee, 0xa4e20002, 0x24040001, -0x2821, 0xc0048ee, 0x27a60018, 0x3c020001, -0x8c425488, 0x24110001, 0x3c010001, 0xac315494, -0x14530004, 0x32028000, 0xc00429f, 0x0, -0x32028000, 0x10400099, 0x0, 0xc00429f, -0x0, 0x24020002, 0x3c010001, 0xac31548c, -0x3c010001, 0x80050ac, 0xac225488, 0x24040001, -0x24050004, 0x27b0001a, 0xc0048ee, 0x2003021, -0x24040001, 0x2821, 0xc0048ee, 0x2003021, -0x3c020001, 0x521021, 0x8c4275c4, 0x3c040001, -0x8c845488, 0x3c03bfff, 0x3463ffff, 0x3c010001, -0xac335494, 0x431024, 0x3c010001, 0x320821, -0x10930078, 0xac2275c4, 0x80050ac, 0x0, -0x3c02ffec, 0x3442ffff, 0x2028024, 0x3c020008, -0x2028025, 0x111140, 0x3c010001, 0x220821, -0xac3075c8, 0x3c022000, 0x2021024, 0x10400009, -0x0, 0x3c020001, 0x8c425514, 0x14400005, -0x24020001, 0x3c010001, 0xac225538, 0x800504d, -0x3c024000, 0x3c010001, 0xac205538, 0x3c024000, -0x2021024, 0x1440001c, 0x0, 0x3c020001, -0x8c425538, 0x10400007, 0x24022020, 0x3c010001, -0xac22553c, 0x24020001, 0x3c010001, 0x370821, -0xac2283ac, 0x3c04bfff, 0x111940, 0x3c020001, -0x431021, 0x8c4275c0, 0x3c050001, 0x8ca55488, -0x3484ffff, 0x441024, 0x3c010001, 0x230821, -0xac2275c0, 0x24020001, 0x10a20044, 0x0, -0x80050aa, 0x0, 0x3c020001, 0x8c425538, -0x1040001c, 0x24022000, 0x3c010001, 0xac22553c, -0x3c0300a0, 0x2031024, 0x14430005, 0x111140, -0x3402a000, 0x3c010001, 0x80050a5, 0xac22553c, -0x3c030001, 0x621821, 0x8c6375c8, 0x3c020020, -0x621024, 0x10400004, 0x24022001, 0x3c010001, -0x80050a5, 0xac22553c, 0x3c020080, 0x621024, -0x1040001f, 0x3402a001, 0x3c010001, 0x80050a5, -0xac22553c, 0x3c020020, 0x2021024, 0x10400007, -0x111940, 0x24020100, 0x3c010001, 0x230821, -0xac2275d4, 0x8005099, 0x3c020080, 0x111140, -0x3c010001, 0x220821, 0xac2075d4, 0x3c020080, -0x2021024, 0x10400006, 0x111940, 0x3c020001, -0x3c010001, 0x230821, 0x80050a5, 0xac2275dc, -0x111140, 0x3c010001, 0x220821, 0xac2075dc, -0x3c030001, 0x8c635488, 0x24020001, 0x10620003, -0x0, 0xc00429f, 0x0, 0x8fbf0030, -0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, -0x3e00008, 0x27bd0038, 0x27bdffd0, 0xafb40028, -0x80a021, 0xafb20020, 0x9021, 0xafb30024, -0x9821, 0xafb1001c, 0x8821, 0x24020002, -0xafbf002c, 0xafb00018, 0xa7a00012, 0x10a20068, -0xa7a00010, 0x2ca20003, 0x10400005, 0x24020001, -0x10a2000a, 0x148140, 0x8005176, 0x2201021, -0x24020004, 0x10a2005e, 0x24020008, 0x10a2005d, -0x142940, 0x8005176, 0x2201021, 0x3c030001, -0x701821, 0x8c6375cc, 0x3c024000, 0x621024, -0x14400009, 0x24040001, 0x3c027fff, 0x3442ffff, -0x628824, 0x3c010001, 0x300821, 0xac3175c4, -0x8005176, 0x2201021, 0x24050001, 0xc0048ac, -0x27a60010, 0x24040001, 0x24050001, 0xc0048ac, -0x27a60010, 0x97a20010, 0x30420004, 0x10400034, -0x3c114000, 0x3c030001, 0x8c635550, 0x24020003, -0x10620008, 0x2c620004, 0x14400029, 0x3c028000, -0x24020004, 0x10620014, 0x24040001, 0x8005119, -0x3c028000, 0x24040001, 0x24050011, 0x27b00012, -0xc0048ac, 0x2003021, 0x24040001, 0x24050011, -0xc0048ac, 0x2003021, 0x97a30012, 0x30624000, -0x10400002, 0x3c130010, 0x3c130008, 0x3c120001, -0x8005116, 0x30628000, 0x24050014, 0x27b00012, -0xc0048ac, 0x2003021, 0x24040001, 0x24050014, -0xc0048ac, 0x2003021, 0x97a30012, 0x30621000, -0x10400002, 0x3c130010, 0x3c130008, 0x3c120001, -0x30620800, 0x54400001, 0x3c120002, 0x3c028000, -0x2221025, 0x2531825, 0x8005123, 0x438825, -0x3c110001, 0x2308821, 0x8e3175cc, 0x3c027fff, -0x3442ffff, 0x2228824, 0x141140, 0x3c010001, -0x220821, 0xac3175c4, 0x8005176, 0x2201021, -0x142940, 0x3c030001, 0x651821, 0x8c6375c8, -0x3c024000, 0x621024, 0x14400008, 0x3c027fff, -0x3442ffff, 0x628824, 0x3c010001, 0x250821, -0xac3175c0, 0x8005176, 0x2201021, 0x3c020001, -0x8c425498, 0x10400033, 0x3c11c00c, 0x3c020001, -0x8c425514, 0x3c04c00c, 0x34842000, 0x3c030001, -0x8c635538, 0x2102b, 0x21023, 0x441024, -0x10600003, 0x518825, 0x3c022000, 0x2228825, -0x3c020001, 0x451021, 0x8c4275d4, 0x10400003, -0x3c020020, 0x8005153, 0x2228825, 0x3c02ffdf, -0x3442ffff, 0x2228824, 0x141140, 0x3c010001, -0x220821, 0x8c2275dc, 0x10400003, 0x3c020080, -0x800515e, 0x2228825, 0x3c02ff7f, 0x3442ffff, -0x2228824, 0x3c020001, 0x8c425500, 0x10400002, -0x3c020800, 0x2228825, 0x3c020001, 0x8c425504, -0x10400002, 0x3c020400, 0x2228825, 0x3c020001, -0x8c425508, 0x10400006, 0x3c020100, 0x8005171, -0x2228825, 0x3c027fff, 0x3442ffff, 0x628824, -0x141140, 0x3c010001, 0x220821, 0xac3175c0, -0x2201021, 0x8fbf002c, 0x8fb40028, 0x8fb30024, +0xafb20028, 0x809021, 0xafb3002c, 0xa09821, +0xafb00020, 0xc08021, 0x3c040001, 0x24845bd0, +0x3c050009, 0x3c020001, 0x8c425cc8, 0x34a59001, +0x2403021, 0x2603821, 0xafbf0030, 0xafb10024, +0xa7a0001a, 0xafb00014, 0xc002403, 0xafa20010, +0x24020002, 0x12620083, 0x2e620003, 0x10400005, +0x24020001, 0x1262000a, 0x0, 0x800529b, +0x0, 0x24020004, 0x126200fa, 0x24020008, +0x126200f9, 0x3c02ffec, 0x800529b, 0x0, +0x3c020001, 0x8c425cc4, 0x30420002, 0x14400004, +0x128940, 0x3c02fffb, 0x3442ffff, 0x2028024, +0x3c010001, 0x310821, 0xac307e3c, 0x3c024000, +0x2021024, 0x1040004e, 0x1023c2, 0x30840030, +0x101382, 0x3042001c, 0x3c030001, 0x24635d08, +0x431021, 0x823821, 0x3c020020, 0x2021024, +0x10400006, 0x24020100, 0x3c010001, 0x310821, +0xac227e40, 0x8005150, 0x3c020080, 0x3c010001, +0x310821, 0xac207e40, 0x3c020080, 0x2021024, +0x10400006, 0x121940, 0x3c020001, 0x3c010001, +0x230821, 0x800515c, 0xac227e48, 0x121140, +0x3c010001, 0x220821, 0xac207e48, 0x94e40000, +0x3c030001, 0x8c635dbc, 0x24020005, 0x10620010, +0xa7a40018, 0x32024000, 0x10400002, 0x34824000, +0xa7a20018, 0x24040001, 0x94e20002, 0x24050004, +0x24e60002, 0x34420001, 0xc00498e, 0xa4e20002, +0x24040001, 0x2821, 0xc00498e, 0x27a60018, +0x3c020001, 0x8c425cc8, 0x24110001, 0x3c010001, +0xac315cd4, 0x14530004, 0x32028000, 0xc00429b, +0x0, 0x32028000, 0x1040011f, 0x0, +0xc00429b, 0x0, 0x3c030001, 0x8c635dbc, +0x24020005, 0x10620118, 0x24020002, 0x3c010001, +0xac315ccc, 0x3c010001, 0x800529b, 0xac225cc8, +0x24040001, 0x24050004, 0x27b0001a, 0xc00498e, +0x2003021, 0x24040001, 0x2821, 0xc00498e, +0x2003021, 0x3c020001, 0x511021, 0x8c427e34, +0x3c040001, 0x8c845cc8, 0x3c03bfff, 0x3463ffff, +0x3c010001, 0xac335cd4, 0x431024, 0x3c010001, +0x310821, 0x109300fa, 0xac227e34, 0x800529b, +0x0, 0x3c022000, 0x2021024, 0x10400005, +0x24020001, 0x3c010001, 0xac225d98, 0x80051ad, +0x128940, 0x3c010001, 0xac205d98, 0x128940, +0x3c010001, 0x310821, 0xac307e38, 0x3c024000, +0x2021024, 0x14400016, 0x0, 0x3c020001, +0x8c425d98, 0x10400008, 0x24040004, 0x24050001, +0xc004d93, 0x24062000, 0x24020001, 0x3c010001, +0x370821, 0xac2283ac, 0x3c020001, 0x511021, +0x8c427e30, 0x3c03bfff, 0x3463ffff, 0x431024, +0x3c010001, 0x310821, 0x8005299, 0xac227e30, +0x3c020001, 0x8c425d98, 0x10400028, 0x3c0300a0, +0x2031024, 0x5443000d, 0x3c020020, 0x3c020001, +0x8c425d9c, 0x24030100, 0x3c010001, 0x310821, +0xac237e44, 0x3c030001, 0x3c010001, 0x310821, +0xac237e4c, 0x80051f0, 0x34420400, 0x2021024, +0x10400008, 0x24030100, 0x3c020001, 0x8c425d9c, +0x3c010001, 0x310821, 0xac237e44, 0x80051f0, +0x34420800, 0x3c020080, 0x2021024, 0x1040002e, +0x3c030001, 0x3c020001, 0x8c425d9c, 0x3c010001, +0x310821, 0xac237e4c, 0x34420c00, 0x3c010001, +0xac225d9c, 0x8005218, 0x24040001, 0x3c020020, +0x2021024, 0x10400006, 0x24020100, 0x3c010001, +0x310821, 0xac227e44, 0x8005201, 0x3c020080, +0x3c010001, 0x310821, 0xac207e44, 0x3c020080, +0x2021024, 0x10400007, 0x121940, 0x3c020001, +0x3c010001, 0x230821, 0xac227e4c, 0x800520f, +0x24040001, 0x121140, 0x3c010001, 0x220821, +0xac207e4c, 0x24040001, 0x2821, 0x27b0001e, +0xc00494c, 0x2003021, 0x24040001, 0x2821, +0xc00494c, 0x2003021, 0x24040001, 0x24050001, +0x27b0001c, 0xc00494c, 0x2003021, 0x24040001, +0x24050001, 0xc00494c, 0x2003021, 0x8005299, +0x0, 0x3c02ffec, 0x3442ffff, 0x2028024, +0x3c020008, 0x2028025, 0x121140, 0x3c010001, +0x220821, 0xac307e38, 0x3c022000, 0x2021024, +0x10400009, 0x0, 0x3c020001, 0x8c425d74, +0x14400005, 0x24020001, 0x3c010001, 0xac225d98, +0x800523a, 0x3c024000, 0x3c010001, 0xac205d98, +0x3c024000, 0x2021024, 0x1440001e, 0x0, +0x3c020001, 0x8c425d98, 0x3c010001, 0xac205ce0, +0x10400007, 0x24022020, 0x3c010001, 0xac225d9c, +0x24020001, 0x3c010001, 0x370821, 0xac2283ac, +0x3c04bfff, 0x121940, 0x3c020001, 0x431021, +0x8c427e30, 0x3c050001, 0x8ca55cc8, 0x3484ffff, +0x441024, 0x3c010001, 0x230821, 0xac227e30, +0x24020001, 0x10a20044, 0x0, 0x8005299, +0x0, 0x3c020001, 0x8c425d98, 0x1040001c, +0x24022000, 0x3c010001, 0xac225d9c, 0x3c0300a0, +0x2031024, 0x14430005, 0x121140, 0x3402a000, +0x3c010001, 0x8005294, 0xac225d9c, 0x3c030001, +0x621821, 0x8c637e38, 0x3c020020, 0x621024, +0x10400004, 0x24022001, 0x3c010001, 0x8005294, +0xac225d9c, 0x3c020080, 0x621024, 0x1040001f, +0x3402a001, 0x3c010001, 0x8005294, 0xac225d9c, +0x3c020020, 0x2021024, 0x10400007, 0x121940, +0x24020100, 0x3c010001, 0x230821, 0xac227e44, +0x8005288, 0x3c020080, 0x121140, 0x3c010001, +0x220821, 0xac207e44, 0x3c020080, 0x2021024, +0x10400006, 0x121940, 0x3c020001, 0x3c010001, +0x230821, 0x8005294, 0xac227e4c, 0x121140, +0x3c010001, 0x220821, 0xac207e4c, 0x3c030001, +0x8c635cc8, 0x24020001, 0x10620003, 0x0, +0xc00429b, 0x0, 0x8fbf0030, 0x8fb3002c, +0x8fb20028, 0x8fb10024, 0x8fb00020, 0x3e00008, +0x27bd0038, 0x27bdffd8, 0xafb20020, 0x809021, +0xafb1001c, 0x8821, 0x24020002, 0xafbf0024, +0xafb00018, 0xa7a00012, 0x10a200d3, 0xa7a00010, +0x2ca20003, 0x10400005, 0x24020001, 0x10a2000a, +0x128140, 0x8005380, 0x2201021, 0x24020004, +0x10a2007d, 0x24020008, 0x10a2007c, 0x122940, +0x8005380, 0x2201021, 0x3c030001, 0x701821, +0x8c637e3c, 0x3c024000, 0x621024, 0x14400009, +0x24040001, 0x3c027fff, 0x3442ffff, 0x628824, +0x3c010001, 0x300821, 0xac317e34, 0x8005380, +0x2201021, 0x24050001, 0xc00494c, 0x27a60010, +0x24040001, 0x24050001, 0xc00494c, 0x27a60010, +0x97a20010, 0x30420004, 0x10400034, 0x3c114000, +0x3c020001, 0x8c425dbc, 0x2443ffff, 0x2c620006, +0x10400034, 0x31080, 0x3c010001, 0x220821, +0x8c225be0, 0x400008, 0x0, 0x24040001, +0x24050011, 0x27b00012, 0xc00494c, 0x2003021, +0x24040001, 0x24050011, 0xc00494c, 0x2003021, +0x97a50012, 0x30a24000, 0x10400002, 0x3c040010, +0x3c040008, 0x3c030001, 0x8005301, 0x30a28000, +0x24040001, 0x24050014, 0x27b00012, 0xc00494c, +0x2003021, 0x24040001, 0x24050014, 0xc00494c, +0x2003021, 0x97a50012, 0x30a21000, 0x10400002, +0x3c040010, 0x3c040008, 0x3c030001, 0x30a20800, +0x54400001, 0x3c030002, 0x3c028000, 0x2221025, +0x641825, 0x800530e, 0x438825, 0x3c110001, +0x2308821, 0x8e317e3c, 0x3c027fff, 0x3442ffff, +0x2228824, 0x3c020001, 0x8c425cd8, 0x1040001d, +0x121140, 0x3c020001, 0x8c425d98, 0x10400002, +0x3c022000, 0x2228825, 0x121140, 0x3c010001, +0x220821, 0x8c227e40, 0x10400003, 0x3c020020, +0x8005322, 0x2228825, 0x3c02ffdf, 0x3442ffff, +0x2228824, 0x121140, 0x3c010001, 0x220821, +0x8c227e48, 0x10400003, 0x3c020080, 0x800532d, +0x2228825, 0x3c02ff7f, 0x3442ffff, 0x2228824, +0x121140, 0x3c010001, 0x220821, 0xac317e34, +0x8005380, 0x2201021, 0x122940, 0x3c030001, +0x651821, 0x8c637e38, 0x3c024000, 0x621024, +0x14400008, 0x3c027fff, 0x3442ffff, 0x628824, +0x3c010001, 0x250821, 0xac317e30, 0x8005380, +0x2201021, 0x3c020001, 0x8c425cd8, 0x10400033, +0x3c11c00c, 0x3c020001, 0x8c425d74, 0x3c04c00c, +0x34842000, 0x3c030001, 0x8c635d98, 0x2102b, +0x21023, 0x441024, 0x10600003, 0x518825, +0x3c022000, 0x2228825, 0x3c020001, 0x451021, +0x8c427e44, 0x10400003, 0x3c020020, 0x800535d, +0x2228825, 0x3c02ffdf, 0x3442ffff, 0x2228824, +0x121140, 0x3c010001, 0x220821, 0x8c227e4c, +0x10400003, 0x3c020080, 0x8005368, 0x2228825, +0x3c02ff7f, 0x3442ffff, 0x2228824, 0x3c020001, +0x8c425d60, 0x10400002, 0x3c020800, 0x2228825, +0x3c020001, 0x8c425d64, 0x10400002, 0x3c020400, +0x2228825, 0x3c020001, 0x8c425d68, 0x10400006, +0x3c020100, 0x800537b, 0x2228825, 0x3c027fff, +0x3442ffff, 0x628824, 0x121140, 0x3c010001, +0x220821, 0xac317e30, 0x2201021, 0x8fbf0024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, -0x27bd0030, 0x27bdffd8, 0xafb40020, 0x80a021, +0x27bd0028, 0x27bdffd8, 0xafb40020, 0x80a021, 0xafbf0024, 0xafb3001c, 0xafb20018, 0xafb10014, -0xafb00010, 0x8f900200, 0x3c030001, 0x8c635488, -0x8f930220, 0x24020002, 0x106200b4, 0x2c620003, +0xafb00010, 0x8f900200, 0x3c030001, 0x8c635cc8, +0x8f930220, 0x24020002, 0x10620063, 0x2c620003, 0x10400005, 0x24020001, 0x1062000a, 0x141940, -0x8005240, 0x0, 0x24020004, 0x1062005a, -0x24020008, 0x10620059, 0x149140, 0x8005240, -0x0, 0x3c040001, 0x832021, 0x8c8475cc, -0x3c110001, 0x2238821, 0x8e3175c4, 0x3c024000, +0x8005448, 0x0, 0x24020004, 0x1062005a, +0x24020008, 0x10620059, 0x149140, 0x8005448, +0x0, 0x3c040001, 0x832021, 0x8c847e3c, +0x3c110001, 0x2238821, 0x8e317e34, 0x3c024000, 0x821024, 0x1040003e, 0x3c020008, 0x2221024, 0x10400020, 0x36100002, 0x3c020001, 0x431021, -0x8c4275d0, 0x10400005, 0x36100020, 0x36100100, -0x3c020020, 0x80051b5, 0x2228825, 0x2402feff, +0x8c427e40, 0x10400005, 0x36100020, 0x36100100, +0x3c020020, 0x80053bd, 0x2228825, 0x2402feff, 0x2028024, 0x3c02ffdf, 0x3442ffff, 0x2228824, -0x141140, 0x3c010001, 0x220821, 0x8c2275d8, +0x141140, 0x3c010001, 0x220821, 0x8c227e48, 0x10400005, 0x3c020001, 0x2629825, 0x3c020080, -0x80051d4, 0x2228825, 0x3c02fffe, 0x3442ffff, -0x2629824, 0x3c02ff7f, 0x3442ffff, 0x80051d4, +0x80053dc, 0x2228825, 0x3c02fffe, 0x3442ffff, +0x2629824, 0x3c02ff7f, 0x3442ffff, 0x80053dc, 0x2228824, 0x2402fedf, 0x2028024, 0x3c02fffe, 0x3442ffff, 0x2629824, 0x3c02ff5f, 0x3442ffff, -0x2228824, 0x3c010001, 0x230821, 0xac2075d0, -0x3c010001, 0x230821, 0xac2075d8, 0xc0047cc, +0x2228824, 0x3c010001, 0x230821, 0xac207e40, +0x3c010001, 0x230821, 0xac207e48, 0xc00486a, 0x0, 0xaf900200, 0xaf930220, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, -0x34420002, 0xaf820220, 0x80051eb, 0x141140, -0x8f820200, 0x2403fffd, 0x431024, 0xc0047cc, -0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc00429f, +0x34420002, 0xaf820220, 0x80053f3, 0x141140, +0x8f820200, 0x2403fffd, 0x431024, 0xc00486a, +0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc00429b, 0x2228824, 0x141140, 0x3c010001, 0x220821, -0x8005240, 0xac3175c4, 0x149140, 0x3c040001, -0x922021, 0x8c8475c8, 0x3c110001, 0x2328821, -0x8e3175c0, 0x3c024000, 0x821024, 0x14400011, -0x0, 0x3c020001, 0x8c425538, 0x14400006, -0x3c02bfff, 0x8f820200, 0x34420002, 0xc0047cc, -0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc00429f, -0x2228824, 0x3c010001, 0x320821, 0x8005240, -0xac3175c0, 0x3c020001, 0x8c425538, 0x10400005, -0x3c020020, 0x3c020001, 0x8c425514, 0x1040002b, +0x8005448, 0xac317e34, 0x149140, 0x3c040001, +0x922021, 0x8c847e38, 0x3c110001, 0x2328821, +0x8e317e30, 0x3c024000, 0x821024, 0x14400011, +0x0, 0x3c020001, 0x8c425d98, 0x14400006, +0x3c02bfff, 0x8f820200, 0x34420002, 0xc00486a, +0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc00429b, +0x2228824, 0x3c010001, 0x320821, 0x8005448, +0xac317e30, 0x3c020001, 0x8c425d98, 0x10400005, +0x3c020020, 0x3c020001, 0x8c425d74, 0x1040002b, 0x3c020020, 0x821024, 0x10400007, 0x36100020, -0x24020100, 0x3c010001, 0x320821, 0xac2275d4, -0x8005220, 0x36100100, 0x3c010001, 0x320821, -0xac2075d4, 0x2402feff, 0x2028024, 0x3c020080, +0x24020100, 0x3c010001, 0x320821, 0xac227e44, +0x8005428, 0x36100100, 0x3c010001, 0x320821, +0xac207e44, 0x2402feff, 0x2028024, 0x3c020080, 0x821024, 0x10400007, 0x141940, 0x3c020001, -0x3c010001, 0x230821, 0xac2275dc, 0x8005231, +0x3c010001, 0x230821, 0xac227e4c, 0x8005439, 0x2629825, 0x141140, 0x3c010001, 0x220821, -0xac2075dc, 0x3c02fffe, 0x3442ffff, 0x2629824, -0xc0047cc, 0x0, 0xaf900200, 0xaf930220, +0xac207e4c, 0x3c02fffe, 0x3442ffff, 0x2629824, +0xc00486a, 0x0, 0xaf900200, 0xaf930220, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, 0x34420002, 0xaf820220, 0x141140, -0x3c010001, 0x220821, 0xac3175c0, 0x8fbf0024, +0x3c010001, 0x220821, 0xac317e30, 0x8fbf0024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, 0x0 }; u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = { @@ -4329,10 +4468,10 @@ 0x32203139, 0x39382f30, 0x342f3237, 0x2032323a, 0x31333a34, 0x30207368, 0x75616e67, 0x20457870, 0x20240000, 0x46575f56, 0x45525349, 0x4f4e3a20, -0x23312054, 0x75652041, 0x70722032, 0x30203137, -0x3a32313a, 0x30382050, 0x44542031, 0x39393900, +0x23312046, 0x72692041, 0x70722037, 0x2031373a, +0x35353a34, 0x38205044, 0x54203230, 0x30300000, 0x46575f43, 0x4f4d5049, 0x4c455f54, 0x494d453a, -0x2031373a, 0x32313a30, 0x38000000, 0x46575f43, +0x2031373a, 0x35353a34, 0x38000000, 0x46575f43, 0x4f4d5049, 0x4c455f42, 0x593a2064, 0x65767263, 0x73000000, 0x46575f43, 0x4f4d5049, 0x4c455f48, 0x4f53543a, 0x20636f6d, 0x70757465, 0x0, @@ -4357,17 +4496,17 @@ 0x6e6f454e, 0x515f5458, 0x0, 0x736e6464, 0x744e6f51, 0x20000000, 0x3f6e6f51, 0x64547845, 0x0, 0x756e6b72, 0x64747970, 0x65000000, -0x0, 0xacdc, 0xacdc, 0xadac, -0xaac0, 0xaac0, 0xadac, 0xadac, -0xadac, 0xadac, 0xadac, 0xadac, -0xadac, 0xadac, 0xadac, 0xadac, -0xadac, 0xadac, 0xadac, 0xad8c, -0x0, 0xbcb8, 0xbcb8, 0xbd80, -0xae5c, 0xb068, 0xbd80, 0xbd80, -0xbd80, 0xbd80, 0xbd80, 0xbd80, -0xbd80, 0xbd80, 0xbd80, 0xbd80, -0xbd80, 0xbd80, 0xbd80, 0xbd64, -0xb050, 0x24486561, 0x6465723a, 0x202f7072, +0x0, 0xaccc, 0xaccc, 0xad9c, +0xaab0, 0xaab0, 0xad9c, 0xad9c, +0xad9c, 0xad9c, 0xad9c, 0xad9c, +0xad9c, 0xad9c, 0xad9c, 0xad9c, +0xad9c, 0xad9c, 0xad9c, 0xad7c, +0x0, 0xbca8, 0xbca8, 0xbd70, +0xae4c, 0xb058, 0xbd70, 0xbd70, +0xbd70, 0xbd70, 0xbd70, 0xbd70, +0xbd70, 0xbd70, 0xbd70, 0xbd70, +0xbd70, 0xbd70, 0xbd70, 0xbd54, +0xb040, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 0x2f726563, 0x762e632c, 0x7620312e, 0x312e322e, @@ -4381,17 +4520,17 @@ 0x0, 0x66726d32, 0x4c726753, 0x0, 0x72784e6f, 0x42645300, 0x3f724264, 0x446d6146, 0x0, 0x3f724a42, 0x64446d46, 0x0, -0x0, 0xf688, 0xf688, 0xf688, -0xf688, 0xf688, 0xf688, 0xf688, -0xf688, 0xf688, 0xf688, 0xf688, -0xf688, 0xf688, 0xf688, 0xf688, -0xf680, 0xf680, 0xf680, 0x572d444d, -0x41456e46, 0x0, 0x0, 0xfdd0, -0x1016c, 0xfdec, 0x1016c, 0x1016c, -0x1016c, 0x1016c, 0x1016c, 0x1016c, -0xf714, 0x1016c, 0x1016c, 0x1016c, -0x1016c, 0x1016c, 0x10164, 0x10164, -0x10164, 0x24486561, 0x6465723a, 0x202f7072, +0x0, 0xf678, 0xf678, 0xf678, +0xf678, 0xf678, 0xf678, 0xf678, +0xf678, 0xf678, 0xf678, 0xf678, +0xf678, 0xf678, 0xf678, 0xf678, +0xf670, 0xf670, 0xf670, 0x572d444d, +0x41456e46, 0x0, 0x0, 0xfdc0, +0x1015c, 0xfddc, 0x1015c, 0x1015c, +0x1015c, 0x1015c, 0x1015c, 0x1015c, +0xf704, 0x1015c, 0x1015c, 0x1015c, +0x1015c, 0x1015c, 0x10154, 0x10154, +0x10154, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x772f636f, 0x6d6d6f6e, 0x2f6d6163, 0x2e632c76, 0x20312e31, 0x2e322e31, @@ -4410,24 +4549,26 @@ 0x2e322031, 0x3939382f, 0x30342f32, 0x37203232, 0x3a31333a, 0x33392073, 0x6875616e, 0x67204578, 0x70202400, 0x50726f62, 0x65506879, 0x0, -0x6c6e6b41, 0x53535254, 0x0, 0x11994, -0x119cc, 0x119e4, 0x11a18, 0x11a44, -0x11a58, 0x11a94, 0x11e04, 0x11b6c, -0x11bac, 0x11bd8, 0x11c18, 0x11c48, -0x11c84, 0x11cb8, 0x11e04, 0x12048, -0x12060, 0x12088, 0x120a8, 0x120d0, -0x12200, 0x12228, 0x1227c, 0x122a4, -0x0, 0x1250c, 0x125dc, 0x126b4, -0x12784, 0x127e0, 0x128bc, 0x128e4, -0x129c0, 0x129e8, 0x12b90, 0x12bb8, -0x12d60, 0x12f58, 0x131ec, 0x13100, -0x131ec, 0x13218, 0x12d88, 0x12f30, -0x0, 0x13604, 0x13648, 0x136e0, -0x1372c, 0x1379c, 0x13834, 0x13868, -0x138f0, 0x13988, 0x13a58, 0x13a98, -0x13b1c, 0x13b40, 0x13c74, 0x646f4261, +0x6c6e6b41, 0x53535254, 0x0, 0x11b2c, +0x11bc4, 0x11bf8, 0x11c2c, 0x11c58, +0x11c6c, 0x11ca8, 0x1207c, 0x11de4, +0x11e24, 0x11e50, 0x11e90, 0x11ec0, +0x11efc, 0x11f30, 0x1207c, 0x122c0, +0x122d8, 0x12300, 0x12320, 0x12348, +0x12478, 0x124a0, 0x124f4, 0x1251c, +0x0, 0x1278c, 0x1285c, 0x12934, +0x12a04, 0x12a60, 0x12b3c, 0x12b64, +0x12c40, 0x12c68, 0x12e10, 0x12e38, +0x12fe0, 0x131d8, 0x1346c, 0x13380, +0x1346c, 0x13498, 0x13008, 0x131b0, +0x0, 0x13b84, 0x13bc8, 0x13c60, +0x13cac, 0x13d1c, 0x13db4, 0x13de8, +0x13e70, 0x13f08, 0x13fd8, 0x14018, +0x1409c, 0x140c0, 0x141f4, 0x646f4261, 0x73655067, 0x0, 0x0, 0x0, 0x0, 0x73746d61, 0x634c4e4b, 0x0, +0x0, 0x14c38, 0x14c38, 0x14b80, +0x14bc4, 0x14c38, 0x14c38, 0x0, 0x0, 0x0 }; u32 tigonFwData[(MAX_DATA_LEN/4) + 1] __initdata = { 0x416c7465, @@ -4442,38 +4583,41 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, -0x1, 0x0, 0x0, 0x1, +0x1, 0x0, 0x0, 0x0, +0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, -0x0, 0x0, 0x0, 0x0, -0x0, 0x1000000, 0x21000000, 0x12000140, -0x0, 0x0, 0x20000000, 0x120000a0, -0x0, 0x12000060, 0x12000180, 0x120001e0, -0x0, 0x0, 0x0, 0x0, +0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1000000, 0x21000000, +0x12000140, 0x0, 0x0, 0x20000000, +0x120000a0, 0x0, 0x12000060, 0x12000180, +0x120001e0, 0x0, 0x0, 0x0, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x30001, 0x1, 0x30201, 0x0, 0x0, 0x0 }; +#endif /* Generated by genfw.c */ -int tigon2FwReleaseMajor = 0xc; -int tigon2FwReleaseMinor = 0x3; -int tigon2FwReleaseFix = 0xa; -u32 tigon2FwStartAddr = 0x00004000; -u32 tigon2FwTextAddr = 0x00004000; -int tigon2FwTextLen = 0xed40; -u32 tigon2FwRodataAddr = 0x00012d40; -int tigon2FwRodataLen = 0xff0; -u32 tigon2FwDataAddr = 0x00013d60; -int tigon2FwDataLen = 0x170; -u32 tigon2FwSbssAddr = 0x00013ed0; -int tigon2FwSbssLen = 0xbc; -u32 tigon2FwBssAddr = 0x00013f90; -int tigon2FwBssLen = 0x20c0; +#define tigon2FwReleaseMajor 0xc +#define tigon2FwReleaseMinor 0x4 +#define tigon2FwReleaseFix 0xb +#define tigon2FwStartAddr 0x00004000 +#define tigon2FwTextAddr 0x00004000 +#define tigon2FwTextLen 0x11bc0 +#define tigon2FwRodataAddr 0x00015bc0 +#define tigon2FwRodataLen 0x10d0 +#define tigon2FwDataAddr 0x00016cc0 +#define tigon2FwDataLen 0x1c0 +#define tigon2FwSbssAddr 0x00016e80 +#define tigon2FwSbssLen 0xcc +#define tigon2FwBssAddr 0x00016f50 +#define tigon2FwBssLen 0x20c0 u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] __initdata = { 0x0, 0x10000003, 0x0, 0xd, 0xd, -0x3c1d0001, 0x8fbd3db0, 0x3a0f021, 0x3c100000, +0x3c1d0001, 0x8fbd6d20, 0x3a0f021, 0x3c100000, 0x26104000, 0xc0010c0, 0x0, 0xd, -0x3c1d0001, 0x8fbd3db4, 0x3a0f021, 0x3c100000, -0x26104000, 0xc00178d, 0x0, 0xd, +0x3c1d0001, 0x8fbd6d24, 0x3a0f021, 0x3c100000, +0x26104000, 0xc0017e0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -4485,22 +4629,22 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2000008, -0x0, 0x80016de, 0x3c0a0001, 0x80016de, -0x3c0a0002, 0x80016de, 0x0, 0x8002afd, -0x0, 0x8002aa0, 0x0, 0x80016de, -0x3c0a0004, 0x80030d1, 0x0, 0x8001a0e, -0x0, 0x8003779, 0x0, 0x8003720, -0x0, 0x80016de, 0x3c0a0006, 0x80037e7, -0x3c0a0007, 0x80016de, 0x3c0a0008, 0x80016de, -0x3c0a0009, 0x800383f, 0x0, 0x8002cf7, -0x0, 0x80016de, 0x3c0a000b, 0x80016de, -0x3c0a000c, 0x80016de, 0x3c0a000d, 0x80027c5, -0x0, 0x800275a, 0x0, 0x80016de, -0x3c0a000e, 0x8001f28, 0x0, 0x8001920, -0x0, 0x80019c0, 0x0, 0x8003aa8, -0x0, 0x8003a96, 0x0, 0x80016de, -0x0, 0x80018c6, 0x0, 0x80016de, -0x0, 0x80016de, 0x3c0a0013, 0x80016de, +0x0, 0x800172f, 0x3c0a0001, 0x800172f, +0x3c0a0002, 0x800172f, 0x0, 0x8002cac, +0x0, 0x8002c4f, 0x0, 0x800172f, +0x3c0a0004, 0x800328a, 0x0, 0x8001a52, +0x0, 0x800394d, 0x0, 0x80038f4, +0x0, 0x800172f, 0x3c0a0006, 0x80039bb, +0x3c0a0007, 0x800172f, 0x3c0a0008, 0x800172f, +0x3c0a0009, 0x8003a13, 0x0, 0x8002ea6, +0x0, 0x800172f, 0x3c0a000b, 0x800172f, +0x3c0a000c, 0x800172f, 0x3c0a000d, 0x80028fb, +0x0, 0x8002890, 0x0, 0x800172f, +0x3c0a000e, 0x800208c, 0x0, 0x8001964, +0x0, 0x8001a04, 0x0, 0x8003ca6, +0x0, 0x8003c94, 0x0, 0x800172f, +0x0, 0x800191a, 0x0, 0x800172f, +0x0, 0x800172f, 0x3c0a0013, 0x800172f, 0x3c0a0014, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -4518,79 +4662,81 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27bdffe0, 0x3c1cc000, 0xafbf001c, 0xafb00018, 0x8f820140, -0x24030003, 0xaf8300ec, 0x34420004, 0xc0029e8, -0xaf820140, 0x3c0100c0, 0xc001712, 0xac203ffc, -0x403021, 0x3c020008, 0x3c010001, 0xac263ee8, -0x50c2000d, 0x3c020003, 0x3c100010, 0x10d00009, -0x24050100, 0x3c040001, 0x24842df4, 0x3821, -0xafa00010, 0xc002a03, 0xafa00014, 0x3c010001, -0xac303ee8, 0x3c020003, 0x34422000, 0x3c010001, -0xac223ef8, 0x24020008, 0x3c010001, 0xac223f00, -0x2402001f, 0x3c010001, 0xac223f10, 0x24020016, -0x3c010001, 0xac223ee4, 0x3c05fffe, 0x34a56f08, -0x3c020001, 0x8c423ee8, 0x3c030001, 0x24636050, -0x3c040001, 0x8c843d64, 0x431023, 0x14800002, -0x458021, 0x2610fa48, 0x2402f000, 0x2028024, -0xc001734, 0x2002021, 0x2022823, 0x3c040020, -0x821823, 0x651823, 0x247bb000, 0x3c03fffe, -0x3463bf08, 0x363b821, 0x3c0600bf, 0x34c6f000, -0x3c070001, 0x8ce73d60, 0x3c0300bf, 0x3463e000, -0x852023, 0x3c010001, 0xac243ef4, 0x822023, -0x3c010001, 0xac223ed0, 0x27620ffc, 0x3c010001, -0xac223db0, 0x27621ffc, 0xdb3023, 0x7b1823, -0x3c010001, 0xac253edc, 0x3c010001, 0xac243ed4, -0x3c010001, 0xac223db4, 0xaf860150, 0x10e00011, -0xaf830250, 0x3c1d0001, 0x8fbd3d6c, 0x3a0f021, -0xc0016f8, 0x0, 0x3c020001, 0x8c423d70, -0x3c030001, 0x8c633d74, 0x2442fe00, 0x24630200, -0x3c010001, 0xac223d70, 0x3c010001, 0x10000004, -0xac233d74, 0x3c1d0001, 0x8fbd3db0, 0x3a0f021, -0x3c020001, 0x8c423d64, 0x1040000d, 0x26fafa48, -0x3c020001, 0x8c423d70, 0x3c030001, 0x8c633d74, -0x3c1a0001, 0x8f5a3d74, 0x2442fa48, 0x246305b8, -0x3c010001, 0xac223d70, 0x3c010001, 0xac233d74, -0x3c020001, 0x8c423d68, 0x14400003, 0x0, -0x3c010001, 0xac203d70, 0xc00114d, 0x0, +0x24030003, 0xaf8300ec, 0x34420004, 0xc002b20, +0xaf820140, 0x3c0100c0, 0xc001763, 0xac203ffc, +0x401821, 0x3c020010, 0x3c010001, 0xac236e9c, +0x10620011, 0x43102b, 0x14400002, 0x3c020020, +0x3c020008, 0x1062000c, 0x24050100, 0x3c060001, +0x8cc66e9c, 0x3c040001, 0x24845c74, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x3c020020, +0x3c010001, 0xac226e9c, 0x24020008, 0x3c010001, +0xac226eb4, 0x2402001f, 0x3c010001, 0xac226ec4, +0x24020016, 0x3c010001, 0xac226e98, 0x3c05fffe, +0x34a56f08, 0x3c020001, 0x8c426e9c, 0x3c030002, +0x24639010, 0x3c040001, 0x8c846cc4, 0x431023, +0x14800002, 0x458021, 0x2610fa38, 0x2402f000, +0x2028024, 0xc001785, 0x2002021, 0x2022823, +0x3c040020, 0x821823, 0x651823, 0x247bb000, +0x3c03fffe, 0x3463bf08, 0x363b821, 0x3c0600bf, +0x34c6f000, 0x3c070001, 0x8ce76cc0, 0x3c0300bf, +0x3463e000, 0x852023, 0x3c010001, 0xac246ea8, +0x822023, 0x3c010001, 0xac256e90, 0x52842, +0x3c010001, 0xac226e84, 0x27620ffc, 0x3c010001, +0xac226d20, 0x27621ffc, 0xdb3023, 0x7b1823, +0x3c010001, 0xac246e88, 0x3c010001, 0xac256eac, +0x3c010001, 0xac226d24, 0xaf860150, 0x10e00011, +0xaf830250, 0x3c1d0001, 0x8fbd6ccc, 0x3a0f021, +0xc001749, 0x0, 0x3c020001, 0x8c426cd0, +0x3c030001, 0x8c636cd4, 0x2442fe00, 0x24630200, +0x3c010001, 0xac226cd0, 0x3c010001, 0x10000004, +0xac236cd4, 0x3c1d0001, 0x8fbd6d20, 0x3a0f021, +0x3c020001, 0x8c426cc4, 0x1040000d, 0x26fafa38, +0x3c020001, 0x8c426cd0, 0x3c030001, 0x8c636cd4, +0x3c1a0001, 0x8f5a6cd4, 0x2442fa38, 0x246305c8, +0x3c010001, 0xac226cd0, 0x3c010001, 0xac236cd4, +0x3c020001, 0x8c426cc8, 0x14400003, 0x0, +0x3c010001, 0xac206cd0, 0xc001151, 0x0, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, -0x3c020001, 0x8c423d70, 0x3c030001, 0x8c633d74, -0x27bdffa0, 0xafb00040, 0x3c100001, 0x8e1037d8, -0x3c040001, 0x24842e00, 0xafbf0058, 0xafbe0054, -0xafb50050, 0xafb3004c, 0xafb20048, 0xafb10044, +0x3c020001, 0x8c426cd0, 0x3c030001, 0x8c636cd4, +0x27bdff98, 0xafb00048, 0x3c100001, 0x8e1066b8, +0xafb20050, 0x3c120000, 0x26524100, 0xafbf0060, +0xafbe005c, 0xafb50058, 0xafb30054, 0xafb1004c, 0xafa20034, 0xafa30030, 0xafa00010, 0xafa00014, -0x8f860040, 0x24050200, 0xc002a03, 0x2003821, +0x8f860040, 0x3c040001, 0x24845c80, 0x24050200, +0x3c010001, 0xac326e80, 0xc002b3b, 0x2003821, 0x8f830040, 0x3c02f000, 0x621824, 0x3c026000, 0x1062000b, 0xa3a0003f, 0x240e0001, 0x3c040001, -0x24842e08, 0xa3ae003f, 0xafa00010, 0xafa00014, -0x8f860040, 0x24050300, 0xc002a03, 0x2003821, +0x24845c88, 0xa3ae003f, 0xafa00010, 0xafa00014, +0x8f860040, 0x24050300, 0xc002b3b, 0x2003821, 0x8f820240, 0x3c030001, 0x431025, 0xaf820240, 0xaf800048, 0x8f820048, 0x14400005, 0x0, 0xaf800048, 0x8f820048, 0x10400004, 0x0, 0xaf800048, 0x10000003, 0x2e02021, 0xaf80004c, -0x2e02021, 0x3c050001, 0xc002a70, 0x34a540f8, -0x3402021, 0xc002a70, 0x240505b8, 0x3c020001, -0x8c423ef4, 0x3c0d0001, 0x8dad3ed4, 0x3c030001, -0x8c633ed0, 0x3c080001, 0x8d083edc, 0x3c090001, -0x8d293ef8, 0x3c0a0001, 0x8d4a3f00, 0x3c0b0001, -0x8d6b3f10, 0x3c0c0001, 0x8d8c3ee4, 0x3c040001, -0x24842e14, 0x24050400, 0xaf420130, 0x8f420130, -0x24060001, 0x24070001, 0xaf400000, 0xaf4d012c, -0xaf430138, 0xaf48013c, 0xaf490140, 0xaf4a0144, -0xaf4b0148, 0xaf4c014c, 0x2442ff80, 0xaf420134, -0x24020001, 0xafa20010, 0xc002a03, 0xafa00014, -0x8f42012c, 0xafa20010, 0x8f420130, 0xafa20014, -0x8f460138, 0x8f47013c, 0x3c040001, 0x24842e20, -0xc002a03, 0x24050500, 0xafb70010, 0xafba0014, -0x8f460140, 0x8f470144, 0x3c040001, 0x24842e2c, -0xc002a03, 0x24050600, 0x3c020001, 0x8c423ee8, -0x3603821, 0x3c060001, 0x24c66050, 0x2448ffff, +0x2e02021, 0x3c050001, 0xc002ba8, 0x34a540f8, +0x3402021, 0xc002ba8, 0x240505c8, 0x3c020001, +0x8c426ea8, 0x3c0d0001, 0x8dad6e88, 0x3c030001, +0x8c636e84, 0x3c080001, 0x8d086e90, 0x3c090001, +0x8d296eac, 0x3c0a0001, 0x8d4a6eb4, 0x3c0b0001, +0x8d6b6ec4, 0x3c0c0001, 0x8d8c6e98, 0x3c040001, +0x24845c94, 0x24050400, 0xaf42013c, 0x8f42013c, +0x24060001, 0x24070001, 0xaf400000, 0xaf4d0138, +0xaf430144, 0xaf480148, 0xaf49014c, 0xaf4a0150, +0xaf4b0154, 0xaf4c0158, 0x2442ff80, 0xaf420140, +0x24020001, 0xafa20010, 0xc002b3b, 0xafa00014, +0x8f420138, 0xafa20010, 0x8f42013c, 0xafa20014, +0x8f460144, 0x8f470148, 0x3c040001, 0x24845ca0, +0xc002b3b, 0x24050500, 0xafb70010, 0xafba0014, +0x8f46014c, 0x8f470150, 0x3c040001, 0x24845cac, +0xc002b3b, 0x24050600, 0x3c020001, 0x8c426e9c, +0x3603821, 0x3c060002, 0x24c69010, 0x2448ffff, 0x1061824, 0xe81024, 0x43102b, 0x10400006, -0x24050900, 0x3c040001, 0x24842e38, 0xafa80010, -0xc002a03, 0xafa00014, 0x8f82000c, 0xafa20010, +0x24050900, 0x3c040001, 0x24845cb8, 0xafa80010, +0xc002b3b, 0xafa00014, 0x8f82000c, 0xafa20010, 0x8f82003c, 0xafa20014, 0x8f860000, 0x8f870004, -0x3c040001, 0x24842e44, 0xc002a03, 0x24051000, +0x3c040001, 0x24845cc4, 0xc002b3b, 0x24051000, 0x8c020220, 0x8c030224, 0x8c060218, 0x8c07021c, -0x3c040001, 0x24842e4c, 0x24051100, 0xafa20010, -0xc002a03, 0xafa30014, 0xaf800054, 0xaf80011c, +0x3c040001, 0x24845ccc, 0x24051100, 0xafa20010, +0xc002b3b, 0xafa30014, 0xaf800054, 0xaf80011c, 0x8c020218, 0x30420002, 0x10400009, 0x0, 0x8c020220, 0x3c030002, 0x34630004, 0x431025, 0xaf42000c, 0x8c02021c, 0x10000008, 0x34420004, @@ -4602,488 +4748,503 @@ 0xaf420008, 0x8c020220, 0x3c03000a, 0x34630006, 0x431025, 0xaf420008, 0x8c02021c, 0x34420006, 0xaf420010, 0x24020001, 0xaf8200a0, 0xaf8200b0, -0x8f830054, 0x8f820054, 0x10000002, 0x24630064, -0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, -0x0, 0x8c040208, 0x8c05020c, 0x26e20028, -0xaee20020, 0x24020490, 0xaee20010, 0xaee40008, -0xaee5000c, 0x26e40008, 0x8c820000, 0x8c830004, -0xaf820090, 0xaf830094, 0x8c820018, 0xaf8200b4, -0x9482000a, 0xaf82009c, 0x8f8200b0, 0x8f430014, -0x431025, 0xaf8200b0, 0x8f8200b0, 0x30420004, -0x1440fffd, 0x24051200, 0x96e20472, 0x96e60452, -0x96e70462, 0xafa20010, 0x96e20482, 0x3c040001, -0x24842e54, 0xc002a03, 0xafa20014, 0x96f00452, -0x32020001, 0x10400002, 0xb021, 0x24160001, -0x32020002, 0x54400001, 0x36d60002, 0x32020008, -0x54400001, 0x36d60004, 0x32020010, 0x54400001, -0x36d60008, 0x32020020, 0x54400001, 0x36d60010, -0x32020040, 0x54400001, 0x36d60020, 0x32020080, -0x54400001, 0x36d60040, 0x96e60482, 0x30c20200, -0x54400001, 0x36d64000, 0x96e30472, 0x30620200, -0x10400003, 0x30620100, 0x10000003, 0x36d62000, -0x54400001, 0x36d61000, 0x96f00462, 0x32c24000, -0x14400004, 0x3207009b, 0x30c2009b, 0x14e20007, -0x240e0001, 0x32c22000, 0x1440000d, 0x32020001, -0x3062009b, 0x10e20009, 0x240e0001, 0x3c040001, -0x24842e60, 0x24051300, 0x2003821, 0xa3ae003f, -0xafa30010, 0xc002a03, 0xafa00014, 0x32020001, -0x54400001, 0x36d60080, 0x32020002, 0x54400001, -0x36d60100, 0x32020008, 0x54400001, 0x36d60200, -0x32020010, 0x54400001, 0x36d60400, 0x32020080, -0x54400001, 0x36d60800, 0x8c020218, 0x30420200, -0x10400002, 0x3c020008, 0x2c2b025, 0x8c020218, -0x30420800, 0x10400002, 0x3c020080, 0x2c2b025, -0x8c020218, 0x30420400, 0x10400002, 0x3c020100, -0x2c2b025, 0x8c020218, 0x30420100, 0x10400002, -0x3c020200, 0x2c2b025, 0x8c020218, 0x30420080, -0x10400002, 0x3c020400, 0x2c2b025, 0x8c020218, -0x30422000, 0x10400002, 0x3c020010, 0x2c2b025, -0x8c020218, 0x30424000, 0x10400002, 0x3c020020, -0x2c2b025, 0x8c020218, 0x30421000, 0x10400002, -0x3c020040, 0x2c2b025, 0x8ee20498, 0x8ee3049c, -0xaf420150, 0xaf430154, 0x8ee204a0, 0x8ee304a4, -0xaf420158, 0xaf43015c, 0x8ee204a8, 0x8ee304ac, -0xaf420160, 0xaf430164, 0x8ee20428, 0x8ee3042c, -0xaf420168, 0xaf43016c, 0x8ee20448, 0x8ee3044c, -0xaf420170, 0xaf430174, 0x8ee20458, 0x8ee3045c, -0xaf420178, 0xaf43017c, 0x8ee20468, 0x8ee3046c, -0xaf420180, 0xaf430184, 0x8ee20478, 0x8ee3047c, -0xaf420188, 0xaf43018c, 0x8ee20488, 0x8ee3048c, -0xaf420190, 0xaf430194, 0x8ee204b0, 0x8ee304b4, -0x24040080, 0xaf420198, 0xaf43019c, 0xc002a70, -0x24050080, 0x8c02025c, 0x27440214, 0xaf4201e0, -0x8c020260, 0x24050200, 0x24060008, 0xc002a87, -0xaf4201e8, 0x3c043b9a, 0x3484ca00, 0x3821, -0x24020006, 0x24030002, 0xaf4201e4, 0x240203e8, -0xaf4301f4, 0xaf4301f0, 0xaf4401ec, 0xaf420284, -0x24020001, 0xaf430280, 0xaf42028c, 0x3c030001, -0x671821, 0x90633d78, 0x3471021, 0x24e70001, -0xa043021c, 0x2ce2000f, 0x1440fff8, 0x3471821, -0x24e70001, 0x3c080001, 0x350840f8, 0x8f820040, -0x3c040001, 0x24842e6c, 0x24051400, 0x21702, -0x24420030, 0xa062021c, 0x3471021, 0xa040021c, -0x8c070218, 0x2c03021, 0x240205b8, 0xafa20010, -0xc002a03, 0xafa80014, 0x3c040001, 0x24842e78, -0x3c050000, 0x24a55b3c, 0x24060010, 0x27b10030, -0x2203821, 0x27b30034, 0xc001750, 0xafb30010, -0x3c030001, 0x8c633d68, 0x1060000a, 0x408021, -0x8fa30030, 0x2405ff00, 0x8fa20034, 0x246400ff, -0x852024, 0x831823, 0x431023, 0xafa20034, -0xafa40030, 0xafb30010, 0x3c040001, 0x24842e84, -0x3c050000, 0x24a54100, 0x24060108, 0xc001750, -0x2203821, 0x409021, 0x32c20003, 0x50400045, +0x8f830054, 0x8f820054, 0xaf8000d0, 0xaf8000c0, +0x10000002, 0x24630064, 0x8f820054, 0x621023, +0x2c420065, 0x1440fffc, 0x0, 0x8c040208, +0x8c05020c, 0x26e20028, 0xaee20020, 0x24020490, +0xaee20010, 0xaee40008, 0xaee5000c, 0x26e40008, +0x8c820000, 0x8c830004, 0xaf820090, 0xaf830094, +0x8c820018, 0xaf8200b4, 0x9482000a, 0xaf82009c, +0x8f420014, 0xaf8200b0, 0x8f8200b0, 0x30420004, +0x1440fffd, 0x0, 0x8f8200b0, 0x3c03ef00, +0x431024, 0x10400021, 0x0, 0x8f8200b4, +0xafa20010, 0x8f820090, 0x8f830094, 0x3c040001, +0x24845cd4, 0xafa30014, 0x8f8600b0, 0x8f87009c, +0x3c050001, 0xc002b3b, 0x34a5200d, 0x3c040001, +0x24845ce0, 0x240203c0, 0xafa20010, 0xafa00014, +0x8f860144, 0x3c070001, 0x24e75ce8, 0xc002b3b, +0x3405dead, 0x8f82011c, 0x34420002, 0xaf82011c, +0x8f820220, 0x34420004, 0xaf820220, 0x8f820140, +0x3c030001, 0x431025, 0xaf820140, 0x96e20472, +0x96e60452, 0x96e70462, 0xafa20010, 0x96e20482, +0x3c040001, 0x24845d14, 0x24051200, 0xc002b3b, +0xafa20014, 0x96f00452, 0x32020001, 0x10400002, +0xb021, 0x24160001, 0x32020002, 0x54400001, +0x36d60002, 0x32020008, 0x54400001, 0x36d60004, +0x32020010, 0x54400001, 0x36d60008, 0x32020020, +0x54400001, 0x36d60010, 0x32020040, 0x54400001, +0x36d60020, 0x32020080, 0x54400001, 0x36d60040, +0x96e60482, 0x30c20200, 0x54400001, 0x36d64000, +0x96e30472, 0x30620200, 0x10400003, 0x30620100, +0x10000003, 0x36d62000, 0x54400001, 0x36d61000, +0x96f00462, 0x32c24000, 0x14400004, 0x3207009b, +0x30c2009b, 0x14e20007, 0x240e0001, 0x32c22000, +0x1440000d, 0x32020001, 0x3062009b, 0x10e20009, +0x240e0001, 0x3c040001, 0x24845d20, 0x24051300, +0x2003821, 0xa3ae003f, 0xafa30010, 0xc002b3b, +0xafa00014, 0x32020001, 0x54400001, 0x36d60080, +0x32020002, 0x54400001, 0x36d60100, 0x32020008, +0x54400001, 0x36d60200, 0x32020010, 0x54400001, +0x36d60400, 0x32020080, 0x54400001, 0x36d60800, +0x8c020218, 0x30420200, 0x10400002, 0x3c020008, +0x2c2b025, 0x8c020218, 0x30420800, 0x10400002, +0x3c020080, 0x2c2b025, 0x8c020218, 0x30420400, +0x10400002, 0x3c020100, 0x2c2b025, 0x8c020218, +0x30420100, 0x10400002, 0x3c020200, 0x2c2b025, +0x8c020218, 0x30420080, 0x10400002, 0x3c020400, +0x2c2b025, 0x8c020218, 0x30422000, 0x10400002, +0x3c020010, 0x2c2b025, 0x8c020218, 0x30424000, +0x10400002, 0x3c020020, 0x2c2b025, 0x8c020218, +0x30421000, 0x10400002, 0x3c020040, 0x2c2b025, +0x8ee20498, 0x8ee3049c, 0xaf420160, 0xaf430164, +0x8ee204a0, 0x8ee304a4, 0xaf420168, 0xaf43016c, +0x8ee204a8, 0x8ee304ac, 0xaf420170, 0xaf430174, +0x8ee20428, 0x8ee3042c, 0xaf420178, 0xaf43017c, +0x8ee20448, 0x8ee3044c, 0xaf420180, 0xaf430184, +0x8ee20458, 0x8ee3045c, 0xaf420188, 0xaf43018c, +0x8ee20468, 0x8ee3046c, 0xaf420190, 0xaf430194, +0x8ee20478, 0x8ee3047c, 0xaf420198, 0xaf43019c, +0x8ee20488, 0x8ee3048c, 0xaf4201a0, 0xaf4301a4, +0x8ee204b0, 0x8ee304b4, 0x24040080, 0xaf4201a8, +0xaf4301ac, 0xc002ba8, 0x24050080, 0x8c02025c, +0x27440224, 0xaf4201f0, 0x8c020260, 0x24050200, +0x24060008, 0xc002bbf, 0xaf4201f8, 0x3c043b9a, +0x3484ca00, 0x3821, 0x24020006, 0x24030002, +0xaf4201f4, 0x240203e8, 0xaf430204, 0xaf430200, +0xaf4401fc, 0xaf420294, 0x24020001, 0xaf430290, +0xaf42029c, 0x3c030001, 0x671821, 0x90636cd8, +0x3471021, 0x24e70001, 0xa043022c, 0x2ce2000f, +0x1440fff8, 0x3471821, 0x24e70001, 0x3c080001, +0x350840f8, 0x8f820040, 0x3c040001, 0x24845d2c, +0x24051400, 0x21702, 0x24420030, 0xa062022c, +0x3471021, 0xa040022c, 0x8c070218, 0x2c03021, +0x240205c8, 0xafa20010, 0xc002b3b, 0xafa80014, +0x3c040001, 0x24845d38, 0x3c050000, 0x24a55c80, +0x24060010, 0x27b10030, 0x2203821, 0x27b30034, +0xc0017a3, 0xafb30010, 0x3c030001, 0x8c636cc8, +0x1060000a, 0x408021, 0x8fa30030, 0x2405ff00, +0x8fa20034, 0x246400ff, 0x852024, 0x831823, +0x431023, 0xafa20034, 0xafa40030, 0x3c040001, +0x24845d44, 0x3c050000, 0x24a54100, 0x24060108, +0x2203821, 0xc0017a3, 0xafb30010, 0x409021, +0x32c20003, 0x3c010001, 0xac326e80, 0x10400045, 0x2203821, 0x8f820050, 0x3c030010, 0x431024, 0x10400016, 0x0, 0x8c020218, 0x30420040, 0x1040000f, 0x24020001, 0x8f820050, 0x8c030218, -0x240e0001, 0x3c040001, 0x24842e90, 0xa3ae003f, +0x240e0001, 0x3c040001, 0x24845d50, 0xa3ae003f, 0xafa20010, 0xafa30014, 0x8f870040, 0x24051500, -0xc002a03, 0x2c03021, 0x10000004, 0x0, +0xc002b3b, 0x2c03021, 0x10000004, 0x0, 0x3c010001, 0x370821, 0xa02240f4, 0x3c040001, -0x24842e9c, 0x3c050001, 0x24a59ce8, 0x3c060001, -0x24c69d60, 0xc53023, 0x8f420010, 0x27b30030, +0x24845d5c, 0x3c050001, 0x24a55b40, 0x3c060001, +0x24c65bac, 0xc53023, 0x8f420010, 0x27b30030, 0x2603821, 0x27b10034, 0x34420a00, 0xaf420010, -0xc001750, 0xafb10010, 0x3c040001, 0x24842eb0, -0x3c050001, 0x24a5b058, 0x3c060001, 0x24c6b3d4, -0xc53023, 0x2603821, 0xaf420108, 0xc001750, -0xafb10010, 0x3c040001, 0x24842ecc, 0x3c050001, -0x24a5b7e4, 0x3c060001, 0x24c6c2c8, 0xc53023, -0x2603821, 0x3c010001, 0xac223f40, 0xc001750, -0xafb10010, 0x3c040001, 0x24842ee4, 0x10000024, -0x24051600, 0x3c040001, 0x24842eec, 0x3c050001, -0x24a59bb4, 0x3c060001, 0x24c69ce0, 0xc53023, -0xc001750, 0xafb30010, 0x3c040001, 0x24842efc, -0x3c050001, 0x24a5abf4, 0x3c060001, 0x24c6b050, -0xc53023, 0x2203821, 0xaf420108, 0xc001750, -0xafb30010, 0x3c040001, 0x24842f10, 0x3c050001, -0x24a5b3dc, 0x3c060001, 0x24c6b7dc, 0xc53023, -0x2203821, 0x3c010001, 0xac223f40, 0xc001750, -0xafb30010, 0x3c040001, 0x24842f24, 0x24051650, -0x2c03021, 0x3821, 0x3c010001, 0xac223f44, -0xafa00010, 0xc002a03, 0xafa00014, 0x32c20020, -0x10400021, 0x27a70030, 0x3c040001, 0x24842f30, -0x3c050001, 0x24a5aa80, 0x3c060001, 0x24c6abec, +0xc0017a3, 0xafb10010, 0x3c040001, 0x24845d70, +0x3c050001, 0x24a5b714, 0x3c060001, 0x24c6ba90, +0xc53023, 0x2603821, 0xaf420108, 0xc0017a3, +0xafb10010, 0x3c040001, 0x24845d8c, 0x3c050001, +0x24a5be58, 0x3c060001, 0x24c6c900, 0xc53023, +0x2603821, 0x3c010001, 0xac226ef4, 0xc0017a3, +0xafb10010, 0x3c040001, 0x24845da4, 0x10000024, +0x24051600, 0x3c040001, 0x24845dac, 0x3c050001, +0x24a5a10c, 0x3c060001, 0x24c6a238, 0xc53023, +0xc0017a3, 0xafb30010, 0x3c040001, 0x24845dbc, +0x3c050001, 0x24a5b2b0, 0x3c060001, 0x24c6b70c, +0xc53023, 0x2203821, 0xaf420108, 0xc0017a3, +0xafb30010, 0x3c040001, 0x24845dd0, 0x3c050001, +0x24a5ba98, 0x3c060001, 0x24c6be50, 0xc53023, +0x2203821, 0x3c010001, 0xac226ef4, 0xc0017a3, +0xafb30010, 0x3c040001, 0x24845de4, 0x24051650, +0x2c03021, 0x3821, 0x3c010001, 0xac226ef8, +0xafa00010, 0xc002b3b, 0xafa00014, 0x32c20020, +0x10400021, 0x27a70030, 0x3c040001, 0x24845df0, +0x3c050001, 0x24a5b13c, 0x3c060001, 0x24c6b2a8, 0xc53023, 0x24022000, 0xaf42001c, 0x27a20034, -0xc001750, 0xafa20010, 0x21900, 0x31982, +0xc0017a3, 0xafa20010, 0x21900, 0x31982, 0x3c040800, 0x641825, 0xae430028, 0x24030010, 0xaf43003c, 0x96e30450, 0xaf430040, 0x8f430040, -0x3c040001, 0x24842f44, 0xafa00014, 0xafa30010, -0x8f47001c, 0x24051660, 0x3c010001, 0xac223f3c, +0x3c040001, 0x24845e04, 0xafa00014, 0xafa30010, +0x8f47001c, 0x24051660, 0x3c010001, 0xac226ef0, 0x10000025, 0x32c60020, 0x8ee20448, 0x8ee3044c, 0xaf43001c, 0x8f42001c, 0x2442e000, 0x2c422001, -0x1440000a, 0x240e0001, 0x3c040001, 0x24842f50, +0x1440000a, 0x240e0001, 0x3c040001, 0x24845e10, 0xa3ae003f, 0xafa00010, 0xafa00014, 0x8f46001c, -0x24051700, 0xc002a03, 0x3821, 0x3c020000, -0x24425b78, 0x21100, 0x21182, 0x3c030800, +0x24051700, 0xc002b3b, 0x3821, 0x3c020000, +0x24425cbc, 0x21100, 0x21182, 0x3c030800, 0x431025, 0xae420028, 0x24020008, 0xaf42003c, 0x96e20450, 0xaf420040, 0x8f420040, 0x3c040001, -0x24842f5c, 0xafa00014, 0xafa20010, 0x8f47001c, -0x24051800, 0x32c60020, 0xc002a03, 0x0, -0x3c030001, 0x8c633f40, 0x3c050fff, 0x34a5ffff, -0x3c020001, 0x8c423f44, 0x3c040800, 0x651824, -0x31882, 0x641825, 0x451024, 0x21082, -0x441025, 0xae420080, 0x32c20180, 0x10400056, -0xae430020, 0x8f82005c, 0x3c030080, 0x431024, -0x1040000d, 0x0, 0x8f820050, 0xafa20010, -0x8f82005c, 0x240e0001, 0x3c040001, 0x24842f68, -0xa3ae003f, 0xafa20014, 0x8f870040, 0x24051900, -0xc002a03, 0x2c03021, 0x8f820050, 0x3c030010, -0x431024, 0x10400016, 0x0, 0x8c020218, -0x30420040, 0x1040000f, 0x24020001, 0x8f820050, -0x8c030218, 0x240e0001, 0x3c040001, 0x24842e90, -0xa3ae003f, 0xafa20010, 0xafa30014, 0x8f870040, -0x24052000, 0xc002a03, 0x2c03021, 0x10000004, -0x0, 0x3c010001, 0x370821, 0xa02240f4, -0x3c040001, 0x24842f74, 0x3c050001, 0x24a59b2c, -0x3c060001, 0x24c69bac, 0xc53023, 0x8f420008, -0x27b30030, 0x2603821, 0x27b10034, 0x34420e00, -0xaf420008, 0xc001750, 0xafb10010, 0x3c040001, -0x24842f8c, 0x3c050001, 0x24a5d180, 0x3c060001, -0x24c6dc78, 0xc53023, 0x2603821, 0xaf42010c, -0xc001750, 0xafb10010, 0x3c040001, 0x24842fa4, -0x3c050001, 0x24a5e25c, 0x3c060001, 0x24c6e948, -0xc53023, 0x2603821, 0x3c010001, 0xac223f50, -0xc001750, 0xafb10010, 0x3c040001, 0x24842fbc, -0x10000027, 0x24052100, 0x3c040001, 0x24842fc4, -0x3c050001, 0x24a599e8, 0x3c060001, 0x24c69b24, +0x24845e1c, 0xafa00014, 0xafa20010, 0x8f47001c, +0x24051800, 0x32c60020, 0xc002b3b, 0x0, +0x3c050fff, 0x3c030001, 0x8c636ef4, 0x34a5ffff, +0x2403021, 0x3c020001, 0x8c426ef8, 0x3c040800, +0x651824, 0x31882, 0x641825, 0x451024, +0x21082, 0x441025, 0xacc20080, 0x32c20180, +0x10400056, 0xacc30020, 0x8f82005c, 0x3c030080, +0x431024, 0x1040000d, 0x0, 0x8f820050, +0xafa20010, 0x8f82005c, 0x240e0001, 0x3c040001, +0x24845e28, 0xa3ae003f, 0xafa20014, 0x8f870040, +0x24051900, 0xc002b3b, 0x2c03021, 0x8f820050, +0x3c030010, 0x431024, 0x10400016, 0x0, +0x8c020218, 0x30420040, 0x1040000f, 0x24020001, +0x8f820050, 0x8c030218, 0x240e0001, 0x3c040001, +0x24845d50, 0xa3ae003f, 0xafa20010, 0xafa30014, +0x8f870040, 0x24052000, 0xc002b3b, 0x2c03021, +0x10000004, 0x0, 0x3c010001, 0x370821, +0xa02240f4, 0x3c040001, 0x24845e34, 0x3c050001, +0x24a55ac0, 0x3c060001, 0x24c65b38, 0xc53023, +0x8f420008, 0x27b30030, 0x2603821, 0x27b10034, +0x34420e00, 0xaf420008, 0xc0017a3, 0xafb10010, +0x3c040001, 0x24845e4c, 0x3c050001, 0x24a5d8b4, +0x3c060001, 0x24c6e3c8, 0xc53023, 0x2603821, +0xaf42010c, 0xc0017a3, 0xafb10010, 0x3c040001, +0x24845e64, 0x3c050001, 0x24a5e9ac, 0x3c060001, +0x24c6f0f0, 0xc53023, 0x2603821, 0x3c010001, +0xac226f04, 0xc0017a3, 0xafb10010, 0x3c040001, +0x24845e7c, 0x10000027, 0x24052100, 0x3c040001, +0x24845e84, 0x3c050001, 0x24a59fc8, 0x3c060001, +0x24c6a104, 0xc53023, 0x27b10030, 0x2203821, +0x27b30034, 0xc0017a3, 0xafb30010, 0x3c040001, +0x24845e94, 0x3c050001, 0x24a5cad4, 0x3c060001, +0x24c6d8ac, 0xc53023, 0x2203821, 0xaf42010c, +0xc0017a3, 0xafb30010, 0x3c040001, 0x24845ea4, +0x3c050001, 0x24a5e84c, 0x3c060001, 0x24c6e9a4, +0xc53023, 0x2203821, 0x3c010001, 0xac226f04, +0xc0017a3, 0xafb30010, 0x3c040001, 0x24845eb8, +0x24052150, 0x2c03021, 0x3821, 0x3c010001, +0xac226f10, 0xafa00010, 0xc002b3b, 0xafa00014, +0x3c110fff, 0x3c030001, 0x8c636f04, 0x3631ffff, +0x2409821, 0x3c020001, 0x8c426f10, 0x3c0e0800, +0x711824, 0x31882, 0x6e1825, 0x511024, +0x21082, 0x4e1025, 0xae630038, 0xae620078, +0x8c020218, 0x30420040, 0x14400004, 0x24020001, +0x3c010001, 0x370821, 0xa02240f4, 0x3c040001, +0x24845ec4, 0x3c050001, 0x24a5e3d0, 0x3c060001, +0x24c6e52c, 0xc53023, 0x27be0030, 0x3c03821, +0x27b50034, 0xc0017a3, 0xafb50010, 0x3c010001, +0xac226efc, 0x511024, 0x21082, 0x3c0e0800, +0x4e1025, 0xae620050, 0x32c22000, 0x10400006, +0x3c03821, 0x3c020000, 0x24425cbc, 0x2221024, +0x1000000f, 0x21082, 0x3c040001, 0x24845ed8, +0x3c050001, 0x24a5e534, 0x3c060001, 0x24c6e6e4, +0xc53023, 0xc0017a3, 0xafb50010, 0x3c010001, +0xac226f14, 0x511024, 0x21082, 0x3c0e0800, +0x4e1025, 0xae620048, 0x32c24000, 0x10400005, +0x27a70030, 0x3c020000, 0x24425cbc, 0x1000000e, +0x21100, 0x3c040001, 0x24845ef0, 0x3c050001, +0x24a5e6ec, 0x3c060001, 0x24c6e844, 0xc53023, +0x27a20034, 0xc0017a3, 0xafa20010, 0x3c010001, +0xac226f08, 0x21100, 0x21182, 0x3c030800, +0x431025, 0xae420060, 0x3c040001, 0x24845f08, +0x3c050001, 0x24a58230, 0x3c060001, 0x24c68650, 0xc53023, 0x27b10030, 0x2203821, 0x27b30034, -0xc001750, 0xafb30010, 0x3c040001, 0x24842fd4, -0x3c050001, 0x24a5c3f0, 0x3c060001, 0x24c6d178, -0xc53023, 0x2203821, 0xaf42010c, 0xc001750, -0xafb30010, 0x3c040001, 0x24842fe4, 0x3c050001, -0x24a5e0fc, 0x3c060001, 0x24c6e254, 0xc53023, -0x2203821, 0x3c010001, 0xac223f50, 0xc001750, -0xafb30010, 0x3c040001, 0x24842ff8, 0x24052150, -0x2c03021, 0x3821, 0x3c010001, 0xac223f5c, -0xafa00010, 0xc002a03, 0xafa00014, 0x3c030001, -0x8c633f50, 0x3c110fff, 0x3631ffff, 0x3c020001, -0x8c423f5c, 0x3c1e0800, 0x711824, 0x31882, -0x7e1825, 0x511024, 0x21082, 0x5e1025, -0xae430038, 0xae420078, 0x8c020218, 0x30420040, -0x14400004, 0x24020001, 0x3c010001, 0x370821, -0xa02240f4, 0x3c040001, 0x24843004, 0x3c050001, -0x24a5dc80, 0x3c060001, 0x24c6dddc, 0xc53023, -0x27b50030, 0x2a03821, 0x27b30034, 0xc001750, -0xafb30010, 0x3c010001, 0xac223f48, 0x511024, -0x21082, 0x5e1025, 0xae420050, 0x32c22000, -0x10400005, 0x2a03821, 0x3c020000, 0x24425b78, -0x1000000d, 0x511024, 0x3c040001, 0x24843018, -0x3c050001, 0x24a5dde4, 0x3c060001, 0x24c6df94, -0xc53023, 0xc001750, 0xafb30010, 0x3c010001, -0xac223f60, 0x511024, 0x21082, 0x5e1025, -0xae420048, 0x32c24000, 0x10400005, 0x27a70030, -0x3c020000, 0x24425b78, 0x1000000e, 0x21100, -0x3c040001, 0x24843030, 0x3c050001, 0x24a5df9c, -0x3c060001, 0x24c6e0f4, 0xc53023, 0x27a20034, -0xc001750, 0xafa20010, 0x3c010001, 0xac223f54, -0x21100, 0x21182, 0x3c030800, 0x431025, -0xae420060, 0x3c040001, 0x24843048, 0x3c050000, -0x24a57ca0, 0x3c060001, 0x24c680c4, 0xc53023, -0x27b10030, 0x2203821, 0x27b30034, 0xc001750, -0xafb30010, 0x3c1e0fff, 0x37deffff, 0x3c040001, -0x24843054, 0x3c050000, 0x24a56318, 0x3c060000, -0x24c66478, 0xc53023, 0x2203821, 0x3c010001, -0xac223f28, 0x5e1024, 0x21082, 0x3c150800, -0x551025, 0xae4200b8, 0xc001750, 0xafb30010, -0x3c040001, 0x24843060, 0x3c050000, 0x24a56480, -0x3c060000, 0x24c666f8, 0xc53023, 0x2203821, -0x3c010001, 0xac223f1c, 0x5e1024, 0x21082, -0x551025, 0xae4200e8, 0xc001750, 0xafb30010, -0x3c040001, 0x24843078, 0x3c050000, 0x24a56700, -0x3c060000, 0x24c66830, 0xc53023, 0x2203821, -0x3c010001, 0xac223f14, 0x5e1024, 0x21082, -0x551025, 0xae4200c0, 0xc001750, 0xafb30010, -0x3c040001, 0x24843090, 0x3c050001, 0x24a5f300, -0x3c060001, 0x24c6f3d8, 0xc53023, 0x2203821, -0x3c010001, 0xac223f20, 0x5e1024, 0x21082, -0x551025, 0xae4200c8, 0xc001750, 0xafb30010, -0x3c040001, 0x2484309c, 0x3c050001, 0x24a5c2d0, -0x3c060001, 0x24c6c30c, 0xc53023, 0x2203821, -0xaf420110, 0xc001750, 0xafb30010, 0x3c040001, -0x248430ac, 0x3c050001, 0x24a5c314, 0x3c060001, -0x24c6c33c, 0xc53023, 0x2203821, 0xaf420114, -0xc001750, 0xafb30010, 0x3c040001, 0x248430b8, -0x3c050001, 0x24a5eaa0, 0x3c060001, 0x24c6ef78, -0xc53023, 0x2203821, 0xaf420118, 0xc001750, -0xafb30010, 0x3c010001, 0xac223f64, 0x5e1024, -0x21082, 0x551025, 0xc003dcf, 0xae4200d0, -0xc003a54, 0x0, 0xc002630, 0x0, -0xac000228, 0xac00022c, 0x96e20450, 0x2442ffff, -0xaf420038, 0x96e20460, 0xaf420080, 0x32c24000, -0x14400003, 0x0, 0x96e20480, 0xaf420084, -0x96e70490, 0x50e00001, 0x24070800, 0x24e2ffff, -0xaf420088, 0xaf42007c, 0x24020800, 0x10e2000f, -0x32c24000, 0x10400003, 0x24020400, 0x10e2000b, -0x0, 0x240e0001, 0x3c040001, 0x248430c8, -0xa3ae003f, 0x96e60490, 0x24052170, 0x2c03821, -0xafa00010, 0xc002a03, 0xafa00014, 0x8f43012c, -0x8f44012c, 0x24020001, 0xa34205b3, 0xaf430094, -0xaf440098, 0xafa00010, 0xafa00014, 0x8f460080, -0x8f470084, 0x3c040001, 0x248430d4, 0xc002a03, -0x24052200, 0xc00232c, 0x3c110800, 0x3c1433d8, -0x3694cb58, 0x3c020800, 0x34420080, 0x3c040001, -0x248430e0, 0x3c050000, 0x24a55bbc, 0x3c060000, -0x24c65bd8, 0xc53023, 0x27a70030, 0xaf820060, -0x2402ffff, 0xaf820064, 0x27a20034, 0xc001750, -0xafa20010, 0x3c010001, 0xac223f04, 0x21100, -0x21182, 0x511025, 0xc0018a8, 0xae420000, -0x8f820240, 0x3c030001, 0x431025, 0xaf820240, -0x3c020000, 0x24424034, 0xaf820244, 0xaf800240, -0x8f820060, 0x511024, 0x14400005, 0x3c030800, -0x8f820060, 0x431024, 0x1040fffd, 0x0, -0xc003a61, 0x8821, 0x3c020100, 0xafa20020, -0x8f530018, 0x240200ff, 0x56620001, 0x26710001, -0x8c020228, 0x1622000e, 0x1330c0, 0x8f42032c, -0x24420001, 0xaf42032c, 0x8f42032c, 0x8c020228, -0x3c040001, 0x24842da4, 0x3c050009, 0xafa00014, -0xafa20010, 0x8fa60020, 0x1000003f, 0x34a50100, -0xd71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, -0xac4404c4, 0xc01821, 0x8f440168, 0x8f45016c, -0x1021, 0x24070004, 0xafa70010, 0xafb10014, -0x8f48000c, 0x24c604c0, 0x2e63021, 0xafa80018, -0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, -0x822021, 0x100f809, 0x892021, 0x1440000b, -0x24070008, 0x8f820120, 0xafa20010, 0x8f820124, -0x3c040001, 0x24842dac, 0x3c050009, 0xafa20014, -0x8fa60020, 0x1000001c, 0x34a50200, 0x8f440150, -0x8f450154, 0x8f43000c, 0xaf510018, 0x8f860120, -0x24020010, 0xafa20010, 0xafb10014, 0xafa30018, -0x8f42010c, 0x40f809, 0x24c6001c, 0x14400010, -0x0, 0x8f420330, 0x24420001, 0xaf420330, -0x8f420330, 0x8f820120, 0xafa20010, 0x8f820124, -0x3c040001, 0x24842db4, 0x3c050009, 0xafa20014, -0x8fa60020, 0x34a50300, 0xc002a03, 0x2603821, -0x8f4202d4, 0x24420001, 0xaf4202d4, 0x8f4202d4, -0x93a2003f, 0x10400069, 0x3c020700, 0x34423000, -0xafa20028, 0x8f530018, 0x240200ff, 0x12620002, -0x8821, 0x26710001, 0x8c020228, 0x1622000e, -0x1330c0, 0x8f42032c, 0x24420001, 0xaf42032c, -0x8f42032c, 0x8c020228, 0x3c040001, 0x24842da4, -0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60028, -0x1000003f, 0x34a50100, 0xd71021, 0x8fa30028, -0x8fa4002c, 0xac4304c0, 0xac4404c4, 0xc01821, -0x8f440168, 0x8f45016c, 0x1021, 0x24070004, -0xafa70010, 0xafb10014, 0x8f48000c, 0x24c604c0, -0x2e63021, 0xafa80018, 0x8f48010c, 0x24070008, -0xa32821, 0xa3482b, 0x822021, 0x100f809, -0x892021, 0x1440000b, 0x24070008, 0x8f820120, -0xafa20010, 0x8f820124, 0x3c040001, 0x24842dac, -0x3c050009, 0xafa20014, 0x8fa60028, 0x1000001c, -0x34a50200, 0x8f440150, 0x8f450154, 0x8f43000c, -0xaf510018, 0x8f860120, 0x24020010, 0xafa20010, -0xafb10014, 0xafa30018, 0x8f42010c, 0x40f809, -0x24c6001c, 0x14400010, 0x0, 0x8f420330, -0x24420001, 0xaf420330, 0x8f420330, 0x8f820120, -0xafa20010, 0x8f820124, 0x3c040001, 0x24842db4, -0x3c050009, 0xafa20014, 0x8fa60028, 0x34a50300, -0xc002a03, 0x2603821, 0x8f4202e0, 0x24420001, -0xaf4202e0, 0x8f4202e0, 0x3c040001, 0x248430f0, -0xafa00010, 0xafa00014, 0x8fa60028, 0x24052300, -0xc002a03, 0x3821, 0x10000004, 0x0, -0x8c020264, 0x10400005, 0x0, 0x8f8200a0, -0x30420004, 0x1440fffa, 0x0, 0x8f820044, -0x34420004, 0xaf820044, 0x8f4202f8, 0x24420001, -0xaf4202f8, 0x8f4202f8, 0x8f8200d8, 0x8f8300d4, -0x431023, 0x2442ff80, 0xaf420090, 0x8f420090, -0x2842ff81, 0x10400006, 0x24020001, 0x8f420090, -0x8f430138, 0x431021, 0xaf420090, 0x24020001, -0xaf42008c, 0x32c20008, 0x10400006, 0x0, -0x8f820214, 0x3c038100, 0x3042ffff, 0x431025, -0xaf820214, 0x3c020001, 0x8c423e24, 0x30420001, -0x10400009, 0x0, 0x3c040001, 0x248430fc, -0x3c050000, 0x24a56c40, 0x3c060000, 0x24c670e8, -0x10000008, 0xc53023, 0x3c040001, 0x2484310c, -0x3c050000, 0x24a56838, 0x3c060000, 0x24c66c38, -0xc53023, 0x27a70030, 0x27a20034, 0xc001750, -0xafa20010, 0x3c010001, 0xac223f18, 0x3c020001, -0x8c423f18, 0x3c030800, 0x21100, 0x21182, -0x431025, 0xae420040, 0x8f8200a0, 0xafa20010, -0x8f8200b0, 0xafa20014, 0x8f86005c, 0x8f87011c, -0x3c040001, 0x2484311c, 0x3c010001, 0xac363ef0, -0x3c010001, 0xac203ee0, 0x3c010001, 0xac3c3ed8, -0x3c010001, 0xac3b3f08, 0x3c010001, 0xac373f0c, -0x3c010001, 0xac3a3eec, 0xc002a03, 0x24052400, -0x8f820200, 0xafa20010, 0x8f820220, 0xafa20014, -0x8f860044, 0x8f870050, 0x3c040001, 0x24843128, -0xc002a03, 0x24052500, 0x8f830060, 0x74100b, -0x242000a, 0x200f821, 0x0, 0xd, -0x8fbf0058, 0x8fbe0054, 0x8fb50050, 0x8fb3004c, -0x8fb20048, 0x8fb10044, 0x8fb00040, 0x3e00008, -0x27bd0060, 0x27bdffe0, 0x3c040001, 0x24843134, -0x24052600, 0x3021, 0x3821, 0xafbf0018, -0xafa00010, 0xc002a03, 0xafa00014, 0x8fbf0018, -0x3e00008, 0x27bd0020, 0x3e00008, 0x0, -0x3e00008, 0x0, 0x0, 0x0, -0x0, 0x0, 0x0, 0x3e00008, -0x0, 0x3e00008, 0x0, 0x27bdfde0, -0x27a50018, 0x3c04dead, 0x3484beef, 0xafbf0218, -0x8f820150, 0x3c03001f, 0x3463ffff, 0xafa40018, -0xa22823, 0xa32824, 0x8ca20000, 0x1044000a, -0x0, 0xafa50010, 0x8ca20000, 0xafa20014, -0x8f860150, 0x8f870250, 0x3c040001, 0x2484313c, -0xc002a03, 0x24052700, 0x8fbf0218, 0x3e00008, -0x27bd0220, 0x27bdffe0, 0x3c06abba, 0x34c6babe, -0xafb00018, 0x3c100004, 0x3c07007f, 0x34e7ffff, -0xafbf001c, 0x102840, 0x8e040000, 0x8ca30000, -0xaca00000, 0xae060000, 0x8ca20000, 0xaca30000, -0x10460005, 0xae040000, 0xa08021, 0xf0102b, -0x1040fff5, 0x102840, 0x3c040001, 0x24843148, -0x24052800, 0x2003021, 0x3821, 0xafa00010, -0xc002a03, 0xafa00014, 0x2001021, 0x8fbf001c, -0x8fb00018, 0x3e00008, 0x27bd0020, 0x8c020224, -0x3047003f, 0x10e00010, 0x803021, 0x2821, -0x24030020, 0xe31024, 0x10400002, 0x63042, -0xa62821, 0x31842, 0x1460fffb, 0xe31024, -0x2402f000, 0xa22824, 0x3403ffff, 0x65102b, -0x14400003, 0x851023, 0x10000006, 0x3c020001, -0x62102b, 0x14400003, 0xa01021, 0x3c02ffff, -0x821021, 0x3e00008, 0x0, 0x27bdffd0, -0xafb50028, 0x8fb50040, 0xafb20020, 0xa09021, -0xafb1001c, 0x24c60003, 0xafbf002c, 0xafb30024, -0xafb00018, 0x8ea20000, 0x2403fffc, 0xc38024, -0x50102b, 0x1440001b, 0xe08821, 0x8e330000, -0xafb00010, 0x8ea20000, 0xafa20014, 0x8e270000, -0x24053000, 0xc002a03, 0x2403021, 0x8e230000, -0x702021, 0x64102b, 0x10400007, 0x2402821, -0x8ca20000, 0xac620000, 0x24630004, 0x64102b, -0x1440fffb, 0x24a50004, 0x8ea20000, 0x501023, -0xaea20000, 0x8e220000, 0x501021, 0x1000000b, -0xae220000, 0x2402002d, 0xa0820000, 0xafb00010, -0x8ea20000, 0x2409821, 0xafa20014, 0x8e270000, -0x24053100, 0xc002a03, 0x2603021, 0x2601021, -0x8fbf002c, 0x8fb50028, 0x8fb30024, 0x8fb20020, -0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0030, -0x27bdffe8, 0x3c1cc000, 0x3c05fffe, 0x3c030001, -0x8c633ed0, 0x3c040001, 0x8c843edc, 0x34a5bf08, -0x24021ffc, 0x3c010001, 0xac223d70, 0x3c0200c0, -0x3c010001, 0xac223d74, 0x3c020020, 0xafbf0010, -0x3c0100c0, 0xac201ffc, 0x431023, 0x441023, -0x245bb000, 0x365b821, 0x3c1d0001, 0x8fbd3d6c, -0x3a0f021, 0x3c0400c0, 0x34840200, 0x3c1a00c0, -0x3c0300c0, 0x346307b8, 0x24021dfc, 0x3c010001, -0xac223d70, 0x24021844, 0x3c010001, 0xac243d74, -0x3c010001, 0xac223d70, 0x3c010001, 0xac233d74, -0xc0017ba, 0x375a0200, 0x8fbf0010, 0x3e00008, -0x27bd0018, 0x27bdffc8, 0x3c040001, 0x24843154, -0x24053200, 0x3c020001, 0x8c423d70, 0x3c030001, -0x8c633d74, 0x3021, 0x3603821, 0xafbf0030, -0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, -0xafa2001c, 0xafa30018, 0xafb70010, 0xc002a03, -0xafba0014, 0xc0018c2, 0x0, 0x8f820240, -0x34420004, 0xaf820240, 0x24020001, 0xaf420000, -0x3c020001, 0x571021, 0x904240f4, 0x10400092, -0x2403fffc, 0x3c100001, 0x2610a79b, 0x3c120001, -0x2652a374, 0x2121023, 0x438024, 0x8fa3001c, -0x3c040001, 0x24843160, 0x70102b, 0x1440001a, +0xc0017a3, 0xafb30010, 0x3c0e0fff, 0x35ceffff, +0x3c040001, 0x24845f14, 0x3c050000, 0x24a56468, +0x3c060000, 0x24c66588, 0xc53023, 0x2203821, +0x240f021, 0x3c010001, 0xac226edc, 0x4e1024, +0x21082, 0x3c150800, 0x551025, 0xafae0044, +0xafc200b8, 0xc0017a3, 0xafb30010, 0x3c040001, +0x24845f20, 0x3c050000, 0x24a56590, 0x3c060000, +0x24c66808, 0x8fae0044, 0xc53023, 0x2203821, +0x3c010001, 0xac226ed0, 0x4e1024, 0x21082, +0x551025, 0xafc200e8, 0xc0017a3, 0xafb30010, +0x3c040001, 0x24845f38, 0x3c050000, 0x24a56810, +0x3c060000, 0x24c66940, 0x8fae0044, 0xc53023, +0x2203821, 0x3c010001, 0xac226ec8, 0x4e1024, +0x21082, 0x551025, 0xafc200c0, 0xc0017a3, +0xafb30010, 0x3c040001, 0x24845f50, 0x3c050001, +0x24a5fad0, 0x3c060001, 0x24c6fba8, 0x8fae0044, +0xc53023, 0x2203821, 0x3c010001, 0xac226ed4, +0x4e1024, 0x21082, 0x551025, 0xafc200c8, +0xc0017a3, 0xafb30010, 0x3c040001, 0x24845f5c, +0x3c050001, 0x24a5c93c, 0x3c060001, 0x24c6ca20, +0xc53023, 0x2203821, 0xaf420110, 0xc0017a3, +0xafb30010, 0x3c040001, 0x24845f6c, 0x3c050001, +0x24a5c910, 0x3c060001, 0x24c6c934, 0xc53023, +0x2203821, 0xaf420124, 0xc0017a3, 0xafb30010, +0x3c040001, 0x24845f7c, 0x3c050001, 0x24a55a80, +0x3c060001, 0x24c65aac, 0xc53023, 0x2203821, +0xaf420120, 0xaf420114, 0xc0017a3, 0xafb30010, +0x3c040001, 0x24845f88, 0x3c050001, 0x24a5f298, +0x3c060001, 0x24c6f6b4, 0xc53023, 0x2203821, +0xaf420118, 0xc0017a3, 0xafb30010, 0x8fae0044, +0x3c010001, 0xac226f18, 0x4e1024, 0x21082, +0x551025, 0xc003fc3, 0xafc200d0, 0xc003c40, +0x0, 0xc0027a8, 0x0, 0xac000228, +0xac00022c, 0x96e20450, 0x2442ffff, 0xaf420038, +0x96e20460, 0xaf420080, 0x32c24000, 0x14400003, +0x0, 0x96e20480, 0xaf420084, 0x96e70490, +0x50e00001, 0x24070800, 0x24e2ffff, 0xaf420088, +0xaf42007c, 0x24020800, 0x10e2000f, 0x32c24000, +0x10400003, 0x24020400, 0x10e2000b, 0x0, +0x240e0001, 0x3c040001, 0x24845f98, 0xa3ae003f, +0x96e60490, 0x24052170, 0x2c03821, 0xafa00010, +0xc002b3b, 0xafa00014, 0x8f430138, 0x8f440138, +0x24020001, 0xa34205c2, 0xaf430094, 0xaf440098, +0xafa00010, 0xafa00014, 0x8f460080, 0x8f470084, +0x3c040001, 0x24845fa4, 0xc002b3b, 0x24052200, +0xc0024a4, 0x3c110800, 0x3c1433d8, 0x3694cb58, +0x3c020800, 0x34420080, 0x3c040001, 0x24845fb0, +0x3c050000, 0x24a55d00, 0x3c060000, 0x24c65d1c, +0xc53023, 0x27a70030, 0xaf820060, 0x2402ffff, +0xaf820064, 0x27a20034, 0xc0017a3, 0xafa20010, +0x3c010001, 0xac226eb8, 0x21100, 0x21182, +0x511025, 0xc0018fc, 0xae420000, 0x8f820240, +0x3c030001, 0x431025, 0xaf820240, 0x3c020000, +0x24424034, 0xaf820244, 0xaf800240, 0x8f820060, +0x511024, 0x14400005, 0x3c030800, 0x8f820060, +0x431024, 0x1040fffd, 0x0, 0xc003c4d, +0x8821, 0x3c020100, 0xafa20020, 0x8f530018, +0x240200ff, 0x56620001, 0x26710001, 0x8c020228, +0x1622000e, 0x1330c0, 0x8f42033c, 0x24420001, +0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, +0x24845c24, 0x3c050009, 0xafa00014, 0xafa20010, +0x8fa60020, 0x1000003f, 0x34a50100, 0xd71021, +0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, +0xc01821, 0x8f440178, 0x8f45017c, 0x1021, +0x24070004, 0xafa70010, 0xafb10014, 0x8f48000c, +0x24c604c0, 0x2e63021, 0xafa80018, 0x8f48010c, +0x24070008, 0xa32821, 0xa3482b, 0x822021, +0x100f809, 0x892021, 0x1440000b, 0x24070008, +0x8f820120, 0xafa20010, 0x8f820124, 0x3c040001, +0x24845c2c, 0x3c050009, 0xafa20014, 0x8fa60020, +0x1000001c, 0x34a50200, 0x8f440160, 0x8f450164, +0x8f43000c, 0xaf510018, 0x8f860120, 0x24020010, +0xafa20010, 0xafb10014, 0xafa30018, 0x8f42010c, +0x40f809, 0x24c6001c, 0x14400010, 0x0, +0x8f420340, 0x24420001, 0xaf420340, 0x8f420340, +0x8f820120, 0xafa20010, 0x8f820124, 0x3c040001, +0x24845c34, 0x3c050009, 0xafa20014, 0x8fa60020, +0x34a50300, 0xc002b3b, 0x2603821, 0x8f4202e4, +0x24420001, 0xaf4202e4, 0x8f4202e4, 0x93a2003f, +0x10400069, 0x3c020700, 0x34423000, 0xafa20028, +0x8f530018, 0x240200ff, 0x12620002, 0x8821, +0x26710001, 0x8c020228, 0x1622000e, 0x1330c0, +0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, +0x8c020228, 0x3c040001, 0x24845c24, 0x3c050009, +0xafa00014, 0xafa20010, 0x8fa60028, 0x1000003f, +0x34a50100, 0xd71021, 0x8fa30028, 0x8fa4002c, +0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440178, +0x8f45017c, 0x1021, 0x24070004, 0xafa70010, +0xafb10014, 0x8f48000c, 0x24c604c0, 0x2e63021, +0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, +0xa3482b, 0x822021, 0x100f809, 0x892021, +0x1440000b, 0x24070008, 0x8f820120, 0xafa20010, +0x8f820124, 0x3c040001, 0x24845c2c, 0x3c050009, +0xafa20014, 0x8fa60028, 0x1000001c, 0x34a50200, +0x8f440160, 0x8f450164, 0x8f43000c, 0xaf510018, +0x8f860120, 0x24020010, 0xafa20010, 0xafb10014, +0xafa30018, 0x8f42010c, 0x40f809, 0x24c6001c, +0x14400010, 0x0, 0x8f420340, 0x24420001, +0xaf420340, 0x8f420340, 0x8f820120, 0xafa20010, +0x8f820124, 0x3c040001, 0x24845c34, 0x3c050009, +0xafa20014, 0x8fa60028, 0x34a50300, 0xc002b3b, +0x2603821, 0x8f4202f0, 0x24420001, 0xaf4202f0, +0x8f4202f0, 0x3c040001, 0x24845fc0, 0xafa00010, +0xafa00014, 0x8fa60028, 0x24052300, 0xc002b3b, +0x3821, 0x10000004, 0x0, 0x8c020264, +0x10400005, 0x0, 0x8f8200a0, 0x30420004, +0x1440fffa, 0x0, 0x8f820044, 0x34420004, +0xaf820044, 0x8f420308, 0x24420001, 0xaf420308, +0x8f420308, 0x8f8200d8, 0x8f8300d4, 0x431023, +0x2442ff80, 0xaf420090, 0x8f420090, 0x2842ff81, +0x10400006, 0x24020001, 0x8f420090, 0x8f430144, +0x431021, 0xaf420090, 0x24020001, 0xaf42008c, +0x32c20008, 0x10400006, 0x0, 0x8f820214, +0x3c038100, 0x3042ffff, 0x431025, 0xaf820214, +0x3c030001, 0x8c636d94, 0x30620002, 0x10400009, +0x30620001, 0x3c040001, 0x24845fcc, 0x3c050000, +0x24a56d50, 0x3c060000, 0x24c671c8, 0x10000012, +0xc53023, 0x10400009, 0x0, 0x3c040001, +0x24845fdc, 0x3c050000, 0x24a571d0, 0x3c060000, +0x24c67678, 0x10000008, 0xc53023, 0x3c040001, +0x24845fec, 0x3c050000, 0x24a56948, 0x3c060000, +0x24c66d48, 0xc53023, 0x27a70030, 0x27a20034, +0xc0017a3, 0xafa20010, 0x3c010001, 0xac226ecc, +0x3c020001, 0x8c426ecc, 0x3c030800, 0x21100, +0x21182, 0x431025, 0xae420040, 0x8f8200a0, +0xafa20010, 0x8f8200b0, 0xafa20014, 0x8f86005c, +0x8f87011c, 0x3c040001, 0x24845ffc, 0x3c010001, +0xac366ea4, 0x3c010001, 0xac206e94, 0x3c010001, +0xac3c6e8c, 0x3c010001, 0xac3b6ebc, 0x3c010001, +0xac376ec0, 0x3c010001, 0xac3a6ea0, 0xc002b3b, +0x24052400, 0x8f820200, 0xafa20010, 0x8f820220, +0xafa20014, 0x8f860044, 0x8f870050, 0x3c040001, +0x24846008, 0xc002b3b, 0x24052500, 0x8f830060, +0x74100b, 0x242000a, 0x200f821, 0x0, +0xd, 0x8fbf0060, 0x8fbe005c, 0x8fb50058, +0x8fb30054, 0x8fb20050, 0x8fb1004c, 0x8fb00048, +0x3e00008, 0x27bd0068, 0x27bdffe0, 0x3c040001, +0x24846014, 0x24052600, 0x3021, 0x3821, +0xafbf0018, 0xafa00010, 0xc002b3b, 0xafa00014, +0x8fbf0018, 0x3e00008, 0x27bd0020, 0x3e00008, +0x0, 0x3e00008, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, +0x3e00008, 0x0, 0x3e00008, 0x0, +0x27bdfde0, 0x27a50018, 0x3c04dead, 0x3484beef, +0xafbf0218, 0x8f820150, 0x3c03001f, 0x3463ffff, +0xafa40018, 0xa22823, 0xa32824, 0x8ca20000, +0x1044000a, 0x0, 0xafa50010, 0x8ca20000, +0xafa20014, 0x8f860150, 0x8f870250, 0x3c040001, +0x2484601c, 0xc002b3b, 0x24052700, 0x8fbf0218, +0x3e00008, 0x27bd0220, 0x27bdffe0, 0x3c06abba, +0x34c6babe, 0xafb00018, 0x3c100004, 0x3c07007f, +0x34e7ffff, 0xafbf001c, 0x102840, 0x8e040000, +0x8ca30000, 0xaca00000, 0xae060000, 0x8ca20000, +0xaca30000, 0x10460005, 0xae040000, 0xa08021, +0xf0102b, 0x1040fff5, 0x102840, 0x3c040001, +0x24846028, 0x24052800, 0x2003021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x2001021, +0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, +0x8c020224, 0x3047003f, 0x10e00010, 0x803021, +0x2821, 0x24030020, 0xe31024, 0x10400002, +0x63042, 0xa62821, 0x31842, 0x1460fffb, +0xe31024, 0x2402f000, 0xa22824, 0x3402ffff, +0x45102b, 0x14400003, 0x3c020001, 0x10000008, +0x3c020001, 0x3442ffff, 0x851823, 0x43102b, +0x14400003, 0xa01021, 0x3c02fffe, 0x821021, +0x3e00008, 0x0, 0x27bdffd0, 0xafb50028, +0x8fb50040, 0xafb20020, 0xa09021, 0xafb1001c, +0x24c60003, 0xafbf002c, 0xafb30024, 0xafb00018, +0x8ea20000, 0x2403fffc, 0xc38024, 0x50102b, +0x1440001b, 0xe08821, 0x8e330000, 0xafb00010, +0x8ea20000, 0xafa20014, 0x8e270000, 0x24053000, +0xc002b3b, 0x2403021, 0x8e230000, 0x702021, +0x64102b, 0x10400007, 0x2402821, 0x8ca20000, +0xac620000, 0x24630004, 0x64102b, 0x1440fffb, +0x24a50004, 0x8ea20000, 0x501023, 0xaea20000, +0x8e220000, 0x501021, 0x1000000b, 0xae220000, +0x2402002d, 0xa0820000, 0xafb00010, 0x8ea20000, +0x2409821, 0xafa20014, 0x8e270000, 0x24053100, +0xc002b3b, 0x2603021, 0x2601021, 0x8fbf002c, +0x8fb50028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, +0x8fb00018, 0x3e00008, 0x27bd0030, 0x27bdffe8, +0x3c1cc000, 0x3c05fffe, 0x3c030001, 0x8c636e84, +0x3c040001, 0x8c846e90, 0x34a5bf08, 0x24021ffc, +0x3c010001, 0xac226cd0, 0x3c0200c0, 0x3c010001, +0xac226cd4, 0x3c020020, 0xafbf0010, 0x3c0100c0, +0xac201ffc, 0x431023, 0x441023, 0x245bb000, +0x365b821, 0x3c1d0001, 0x8fbd6ccc, 0x3a0f021, +0x3c0400c0, 0x34840200, 0x3c1a00c0, 0x3c0300c0, +0x346307c8, 0x24021dfc, 0x3c010001, 0xac226cd0, +0x24021834, 0x3c010001, 0xac246cd4, 0x3c010001, +0xac226cd0, 0x3c010001, 0xac236cd4, 0xc00180d, +0x375a0200, 0x8fbf0010, 0x3e00008, 0x27bd0018, +0x27bdffc8, 0x3c040001, 0x24846034, 0x24053200, +0x3c020001, 0x8c426cd0, 0x3c030001, 0x8c636cd4, +0x3021, 0x3603821, 0xafbf0030, 0xafb3002c, +0xafb20028, 0xafb10024, 0xafb00020, 0xafa2001c, +0xafa30018, 0xafb70010, 0xc002b3b, 0xafba0014, +0xc001916, 0x0, 0x8f820240, 0x34420004, +0xaf820240, 0x24020001, 0xaf420000, 0x3c020001, +0x571021, 0x904240f4, 0x10400092, 0x2403fffc, +0x3c100001, 0x2610ac73, 0x3c120001, 0x2652a84c, +0x2121023, 0x438024, 0x8fa3001c, 0x3c040001, +0x24846040, 0x70102b, 0x1440001a, 0x27b30018, +0x8fb10018, 0x24053000, 0x2403021, 0xafb00010, +0xafa30014, 0xc002b3b, 0x2203821, 0x8fa30018, +0x702021, 0x64102b, 0x10400007, 0x2403021, +0x8cc20000, 0xac620000, 0x24630004, 0x64102b, +0x1440fffb, 0x24c60004, 0x8fa2001c, 0x501023, +0xafa2001c, 0x8e620000, 0x501021, 0x1000000a, +0xae620000, 0x2408821, 0x24053100, 0xafb00010, +0xafa30014, 0x8fa70018, 0x2203021, 0x2402002d, +0xc002b3b, 0xa0820000, 0x24070020, 0x8fa3001c, +0x3c040001, 0x2484605c, 0x24120020, 0x3c010001, +0xac316eb0, 0x2c620020, 0x1440001d, 0x27b10018, +0x8fb00018, 0x24053000, 0x3c060001, 0x24c66f50, +0xafa70010, 0xafa30014, 0xc002b3b, 0x2003821, +0x8fa30018, 0x3c040001, 0x24846f50, 0x24650020, +0x65102b, 0x10400007, 0x0, 0x8c820000, +0xac620000, 0x24630004, 0x65102b, 0x1440fffb, +0x24840004, 0x8fa2001c, 0x521023, 0xafa2001c, +0x8e220000, 0x521021, 0x1000000b, 0xae220000, +0x3c100001, 0x26106f50, 0x24053100, 0xafa70010, +0xafa30014, 0x8fa70018, 0x2003021, 0x2402002d, +0xc002b3b, 0xa0820000, 0x24070020, 0x3c040001, +0x24846070, 0x8fa3001c, 0x24120020, 0x3c010001, +0xac306ee4, 0x2c620020, 0x1440001d, 0x27b10018, +0x8fb00018, 0x24053000, 0x3c060001, 0x24c66f70, +0xafa70010, 0xafa30014, 0xc002b3b, 0x2003821, +0x8fa30018, 0x3c040001, 0x24846f70, 0x24650020, +0x65102b, 0x10400007, 0x0, 0x8c820000, +0xac620000, 0x24630004, 0x65102b, 0x1440fffb, +0x24840004, 0x8fa2001c, 0x521023, 0xafa2001c, +0x8e220000, 0x521021, 0x1000000b, 0xae220000, +0x3c100001, 0x26106f70, 0x24053100, 0xafa70010, +0xafa30014, 0x8fa70018, 0x2003021, 0x2402002d, +0xc002b3b, 0xa0820000, 0x3c010001, 0x10000031, +0xac306ee0, 0x3c100001, 0x2610821f, 0x3c120001, +0x2652809c, 0x2121023, 0x438024, 0x8fa3001c, +0x3c040001, 0x24846084, 0x70102b, 0x1440001a, 0x27b30018, 0x8fb10018, 0x24053000, 0x2403021, -0xafb00010, 0xafa30014, 0xc002a03, 0x2203821, +0xafb00010, 0xafa30014, 0xc002b3b, 0x2203821, 0x8fa30018, 0x702021, 0x64102b, 0x10400007, 0x2403021, 0x8cc20000, 0xac620000, 0x24630004, 0x64102b, 0x1440fffb, 0x24c60004, 0x8fa2001c, 0x501023, 0xafa2001c, 0x8e620000, 0x501021, 0x1000000a, 0xae620000, 0x2408821, 0x24053100, 0xafb00010, 0xafa30014, 0x8fa70018, 0x2203021, -0x2402002d, 0xc002a03, 0xa0820000, 0x24070020, -0x8fa3001c, 0x3c040001, 0x2484317c, 0x24120020, -0x3c010001, 0xac313efc, 0x2c620020, 0x1440001d, -0x27b10018, 0x8fb00018, 0x24053000, 0x3c060001, -0x24c63f90, 0xafa70010, 0xafa30014, 0xc002a03, -0x2003821, 0x8fa30018, 0x3c040001, 0x24843f90, -0x24650020, 0x65102b, 0x10400007, 0x0, -0x8c820000, 0xac620000, 0x24630004, 0x65102b, -0x1440fffb, 0x24840004, 0x8fa2001c, 0x521023, -0xafa2001c, 0x8e220000, 0x521021, 0x1000000b, -0xae220000, 0x3c100001, 0x26103f90, 0x24053100, -0xafa70010, 0xafa30014, 0x8fa70018, 0x2003021, -0x2402002d, 0xc002a03, 0xa0820000, 0x24070020, -0x3c040001, 0x24843190, 0x8fa3001c, 0x24120020, -0x3c010001, 0xac303f30, 0x2c620020, 0x1440001d, -0x27b10018, 0x8fb00018, 0x24053000, 0x3c060001, -0x24c63fb0, 0xafa70010, 0xafa30014, 0xc002a03, -0x2003821, 0x8fa30018, 0x3c040001, 0x24843fb0, -0x24650020, 0x65102b, 0x10400007, 0x0, -0x8c820000, 0xac620000, 0x24630004, 0x65102b, -0x1440fffb, 0x24840004, 0x8fa2001c, 0x521023, -0xafa2001c, 0x8e220000, 0x521021, 0x1000000b, -0xae220000, 0x3c100001, 0x26103fb0, 0x24053100, -0xafa70010, 0xafa30014, 0x8fa70018, 0x2003021, -0x2402002d, 0xc002a03, 0xa0820000, 0x3c010001, -0x10000031, 0xac303f2c, 0x3c100000, 0x26107c8f, -0x3c120000, 0x26527b0c, 0x2121023, 0x438024, -0x8fa3001c, 0x3c040001, 0x248431a4, 0x70102b, -0x1440001a, 0x27b30018, 0x8fb10018, 0x24053000, -0x2403021, 0xafb00010, 0xafa30014, 0xc002a03, -0x2203821, 0x8fa30018, 0x702021, 0x64102b, -0x10400007, 0x2403021, 0x8cc20000, 0xac620000, -0x24630004, 0x64102b, 0x1440fffb, 0x24c60004, -0x8fa2001c, 0x501023, 0xafa2001c, 0x8e620000, -0x501021, 0x1000000a, 0xae620000, 0x2408821, -0x24053100, 0xafb00010, 0xafa30014, 0x8fa70018, -0x2203021, 0x2402002d, 0xc002a03, 0xa0820000, -0x3c010001, 0xac313efc, 0x3c030001, 0x8c633efc, -0x24020400, 0x60f809, 0xaf820070, 0x8fbf0030, -0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, -0x3e00008, 0x27bd0038, 0x0, 0x8f820040, +0x2402002d, 0xc002b3b, 0xa0820000, 0x3c010001, +0xac316eb0, 0x3c030001, 0x8c636eb0, 0x24020400, +0x60f809, 0xaf820070, 0x8fbf0030, 0x8fb3002c, +0x8fb20028, 0x8fb10024, 0x8fb00020, 0x3e00008, +0x27bd0038, 0x0, 0x0, 0x8f820040, 0x3c03f000, 0x431024, 0x3c036000, 0x14430006, 0x0, 0x8f820050, 0x2403ff80, 0x431024, 0x34420055, 0xaf820050, 0x8f820054, 0x244203e8, 0xaf820058, 0x240201f4, 0xaf4200e0, 0x24020004, -0xaf4200e8, 0x24020002, 0xaf4001a0, 0xaf4000e4, +0xaf4200e8, 0x24020002, 0xaf4001b0, 0xaf4000e4, 0xaf4200dc, 0xaf4000d8, 0xaf4000d4, 0x3e00008, 0xaf4000d0, 0x8f820054, 0x24420005, 0x3e00008, 0xaf820078, 0x27bdffe8, 0xafbf0010, 0x8f820054, 0x244203e8, 0xaf820058, 0x3c020800, 0x2c21024, 0x10400004, 0x3c02f7ff, 0x3442ffff, 0x2c2b024, -0x36940040, 0x3c020001, 0x8c423e38, 0x10400027, -0x0, 0x3c020001, 0x8c423e24, 0x30420001, -0x14400010, 0x0, 0x3c020001, 0x8c423f68, -0x1040000c, 0x0, 0x3c020001, 0x8c423eb4, -0x14400008, 0x0, 0x8f830224, 0x3c020001, -0x8c42602c, 0x10620003, 0x0, 0xc003be0, -0x0, 0x934205b1, 0x10400012, 0x24020001, -0x934305b1, 0x14620004, 0x3c0208ff, 0x24020002, -0x1000000c, 0xa34205b1, 0x3442fffb, 0xa34005b1, -0x8f830220, 0x3c040200, 0x284a025, 0x621824, -0xaf830220, 0x10000004, 0x3c020200, 0xc003f57, +0x36940040, 0x3c020001, 0x8c426da8, 0x10400017, +0x3c020200, 0x3c030001, 0x8c636f1c, 0x10600016, +0x282a025, 0x3c020001, 0x8c426e44, 0x14400012, +0x3c020200, 0x3c020001, 0x8c426d94, 0x30420003, +0x1440000d, 0x3c020200, 0x8f830224, 0x3c020002, +0x8c428fec, 0x10620008, 0x3c020200, 0xc003daf, +0x0, 0x10000004, 0x3c020200, 0xc004196, 0x0, 0x3c020200, 0x2c21024, 0x10400003, -0x0, 0xc001de7, 0x0, 0x8f4200d8, +0x0, 0xc001f4b, 0x0, 0x8f4200d8, 0x8f4300dc, 0x24420001, 0xaf4200d8, 0x43102b, 0x14400003, 0x0, 0xaf4000d8, 0x36940080, -0x8c030238, 0x1060000c, 0x0, 0x8f4201a0, -0x244203e8, 0xaf4201a0, 0x43102b, 0x14400006, -0x0, 0x934205b6, 0x14400003, 0x0, -0xc001c3c, 0x0, 0x8fbf0010, 0x3e00008, +0x8c030238, 0x1060000c, 0x0, 0x8f4201b0, +0x244203e8, 0xaf4201b0, 0x43102b, 0x14400006, +0x0, 0x934205c5, 0x14400003, 0x0, +0xc001da0, 0x0, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x3e00008, 0x0, 0x27bdffd8, 0xafbf0020, 0x8f43002c, 0x8f420038, 0x10620059, 0x0, 0x3c020001, 0x571021, 0x904240f0, -0x10400026, 0x24070008, 0x8f440160, 0x8f450164, +0x10400026, 0x24070008, 0x8f440170, 0x8f450174, 0x8f48000c, 0x8f860120, 0x24020020, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f0, 0x8f820124, 0xafa20010, -0x8f820128, 0x3c040001, 0x24843248, 0xafa20014, -0x8f46002c, 0x8f870120, 0x3c050009, 0xc002a03, -0x34a50900, 0x1000005c, 0x0, 0x8f4202f0, -0x24420001, 0xaf4202f0, 0x8f4202f0, 0x8f42002c, -0xa34005b2, 0x10000027, 0xaf420038, 0x8f440160, -0x8f450164, 0x8f43002c, 0x8f48000c, 0x8f860120, +0x8f820128, 0x3c040001, 0x24846128, 0xafa20014, +0x8f46002c, 0x8f870120, 0x3c050009, 0xc002b3b, +0x34a50900, 0x1000005c, 0x0, 0x8f420300, +0x24420001, 0xaf420300, 0x8f420300, 0x8f42002c, +0xa34005c1, 0x10000027, 0xaf420038, 0x8f440170, +0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f1, 0x8f820124, 0xafa20010, 0x8f820128, 0x3c040001, -0x24843254, 0xafa20014, 0x8f46002c, 0x8f870120, -0x3c050009, 0xc002a03, 0x34a51100, 0x10000036, -0x0, 0x8f4202f0, 0x8f43002c, 0x24420001, -0xaf4202f0, 0x8f4202f0, 0x24020001, 0xa34205b2, +0x24846134, 0xafa20014, 0x8f46002c, 0x8f870120, +0x3c050009, 0xc002b3b, 0x34a51100, 0x10000036, +0x0, 0x8f420300, 0x8f43002c, 0x24420001, +0xaf420300, 0x8f420300, 0x24020001, 0xa34205c1, 0xaf430038, 0x3c010001, 0x370821, 0xa02040f1, 0x3c010001, 0x370821, 0xa02040f0, 0x10000026, -0xaf400034, 0x934205b2, 0x1040001d, 0x0, -0xa34005b2, 0x8f820040, 0x30420001, 0x14400008, +0xaf400034, 0x934205c1, 0x1040001d, 0x0, +0xa34005c1, 0x8f820040, 0x30420001, 0x14400008, 0x2021, 0x8c030104, 0x24020001, 0x50620005, 0x24040001, 0x8c020264, 0x10400003, 0x801021, 0x24040001, 0x801021, 0x10400006, 0x0, -0x8f4202fc, 0x24420001, 0xaf4202fc, 0x10000008, -0x8f4202fc, 0x8f820044, 0x34420004, 0xaf820044, -0x8f4202f8, 0x24420001, 0xaf4202f8, 0x8f4202f8, +0x8f42030c, 0x24420001, 0xaf42030c, 0x10000008, +0x8f42030c, 0x8f820044, 0x34420004, 0xaf820044, +0x8f420308, 0x24420001, 0xaf420308, 0x8f420308, 0x3c010001, 0x370821, 0xa02040f0, 0x3c010001, 0x370821, 0xa02040f1, 0x8f420000, 0x10400007, 0x0, 0xaf80004c, 0x8f82004c, 0x1040fffd, @@ -5094,15 +5255,15 @@ 0xaf80004c, 0xaf800048, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 0x27bdffd8, 0xafbf0020, 0x8f430044, 0x8f42007c, 0x10620029, -0x24070008, 0x8f440158, 0x8f45015c, 0x8f48000c, +0x24070008, 0x8f440168, 0x8f45016c, 0x8f48000c, 0x8f860120, 0x24020040, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f2, 0x8f820124, 0xafa20010, 0x8f820128, -0x3c040001, 0x2484325c, 0xafa20014, 0x8f460044, -0x8f870120, 0x3c050009, 0xc002a03, 0x34a51300, -0x1000000f, 0x0, 0x8f4202f4, 0x24420001, -0xaf4202f4, 0x8f4202f4, 0x8f420044, 0xaf42007c, +0x3c040001, 0x2484613c, 0xafa20014, 0x8f460044, +0x8f870120, 0x3c050009, 0xc002b3b, 0x34a51300, +0x1000000f, 0x0, 0x8f420304, 0x24420001, +0xaf420304, 0x8f420304, 0x8f420044, 0xaf42007c, 0x3c010001, 0x370821, 0xa02040f2, 0x10000004, 0xaf400078, 0x3c010001, 0x370821, 0xa02040f2, 0x8f420000, 0x10400007, 0x0, 0xaf80004c, @@ -5112,62 +5273,62 @@ 0x431024, 0xaf820060, 0x8f420000, 0x10400003, 0x0, 0x10000002, 0xaf80004c, 0xaf800048, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3e00008, -0x0, 0x3c020001, 0x8c423e38, 0x27bdffa8, +0x0, 0x3c020001, 0x8c426da8, 0x27bdffa8, 0xafbf0050, 0xafbe004c, 0xafb50048, 0xafb30044, 0xafb20040, 0xafb1003c, 0xafb00038, 0x104000d5, 0x8f900044, 0x8f4200d0, 0x24430001, 0x2842000b, 0x144000e4, 0xaf4300d0, 0x8f420004, 0x30420002, 0x1440009c, 0xaf4000d0, 0x8f420004, 0x3c030001, -0x8c633e28, 0x34420002, 0xaf420004, 0x24020001, +0x8c636d98, 0x34420002, 0xaf420004, 0x24020001, 0x14620003, 0x3c020600, 0x10000002, 0x34423000, 0x34421000, 0xafa20020, 0x8f4a0018, 0xafaa0034, 0x27aa0020, 0xafaa002c, 0x8faa0034, 0x240200ff, 0x11420002, 0x1821, 0x25430001, 0x8c020228, -0x609821, 0x1662000e, 0x3c050009, 0x8f42032c, -0x24420001, 0xaf42032c, 0x8f42032c, 0x8c020228, -0x8fa70034, 0x3c040001, 0x2484322c, 0xafa00014, +0x609821, 0x1662000e, 0x3c050009, 0x8f42033c, +0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, +0x8fa70034, 0x3c040001, 0x2484610c, 0xafa00014, 0xafa20010, 0x8fa60020, 0x10000070, 0x34a50500, 0x8faa0034, 0xa38c0, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9, 0x1040001b, 0xa821, 0xe09021, 0x265e04c0, -0x8f440168, 0x8f45016c, 0x2401821, 0x240a0004, +0x8f440178, 0x8f45017c, 0x2401821, 0x240a0004, 0xafaa0010, 0xafb30014, 0x8f48000c, 0x1021, 0x2fe3021, 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x54400006, 0x24150001, 0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffe9, 0x0, -0x32a200ff, 0x54400018, 0xaf530018, 0x8f420368, -0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, +0x32a200ff, 0x54400018, 0xaf530018, 0x8f420378, +0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0x8fa70034, 0xafa20010, 0x8f820124, -0x3c040001, 0x24843238, 0xafa20014, 0x8d460000, -0x3c050009, 0x10000035, 0x34a50600, 0x8f4202f8, -0x24150001, 0x24420001, 0xaf4202f8, 0x8f4202f8, +0x3c040001, 0x24846118, 0xafa20014, 0x8d460000, +0x3c050009, 0x10000035, 0x34a50600, 0x8f420308, +0x24150001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001e, 0x32a200ff, 0x8f830054, 0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9, 0x10400016, 0xa821, 0x3c1e0020, 0x24120010, 0x8f42000c, -0x8f440150, 0x8f450154, 0x8f860120, 0xafb20010, +0x8f440160, 0x8f450164, 0x8f860120, 0xafb20010, 0xafb30014, 0x5e1025, 0xafa20018, 0x8f42010c, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe3, 0x0, 0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffee, 0x0, 0x32a200ff, 0x14400011, -0x3c050009, 0x8f420368, 0x24420001, 0xaf420368, -0x8f420368, 0x8f820120, 0x8faa002c, 0x8fa70034, -0xafa20010, 0x8f820124, 0x3c040001, 0x24843240, -0xafa20014, 0x8d460000, 0x34a50700, 0xc002a03, -0x0, 0x8f4202dc, 0x24420001, 0xaf4202dc, -0x8f4202dc, 0x8f420004, 0x30420001, 0x50400029, +0x3c050009, 0x8f420378, 0x24420001, 0xaf420378, +0x8f420378, 0x8f820120, 0x8faa002c, 0x8fa70034, +0xafa20010, 0x8f820124, 0x3c040001, 0x24846120, +0xafa20014, 0x8d460000, 0x34a50700, 0xc002b3b, +0x0, 0x8f4202ec, 0x24420001, 0xaf4202ec, +0x8f4202ec, 0x8f420004, 0x30420001, 0x50400029, 0x36100040, 0x3c020400, 0x2c21024, 0x10400013, -0x2404ffdf, 0x8f420240, 0x8f430244, 0x8f4401a4, -0x14640006, 0x36100040, 0x8f420260, 0x8f430264, -0x8f4401a8, 0x10640007, 0x2402ffdf, 0x8f420240, -0x8f430244, 0x8f440260, 0x8f450264, 0x10000012, -0x3a100020, 0x1000002b, 0x2028024, 0x8f420240, -0x8f430244, 0x8f4501a4, 0x14650006, 0x2048024, -0x8f420260, 0x8f430264, 0x8f4401a8, 0x50640021, -0x36100040, 0x8f420240, 0x8f430244, 0x8f440260, -0x8f450264, 0x3a100040, 0xaf4301a4, 0x10000019, -0xaf4501a8, 0x8f4200d4, 0x24430001, 0x10000011, +0x2404ffdf, 0x8f420250, 0x8f430254, 0x8f4401b4, +0x14640006, 0x36100040, 0x8f420270, 0x8f430274, +0x8f4401b8, 0x10640007, 0x2402ffdf, 0x8f420250, +0x8f430254, 0x8f440270, 0x8f450274, 0x10000012, +0x3a100020, 0x1000002b, 0x2028024, 0x8f420250, +0x8f430254, 0x8f4501b4, 0x14650006, 0x2048024, +0x8f420270, 0x8f430274, 0x8f4401b8, 0x50640021, +0x36100040, 0x8f420250, 0x8f430254, 0x8f440270, +0x8f450274, 0x3a100040, 0xaf4301b4, 0x10000019, +0xaf4501b8, 0x8f4200d4, 0x24430001, 0x10000011, 0x28420033, 0x8f420004, 0x30420001, 0x10400009, 0x3c020400, 0x2c21024, 0x10400004, 0x2402ffdf, 0x2028024, 0x1000000b, 0x36100040, 0x10000009, @@ -5177,82 +5338,154 @@ 0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044, 0x8fb20040, 0x8fb1003c, 0x8fb00038, 0x3e00008, 0x27bd0058, 0x3e00008, 0x0, 0x3c020001, -0x8c423e38, 0x27bdffb0, 0xafbf0048, 0xafbe0044, +0x8c426da8, 0x27bdffb0, 0xafbf0048, 0xafbe0044, +0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, +0x104000c7, 0xafb00030, 0x8f4200d0, 0x24430001, +0x2842000b, 0x144000da, 0xaf4300d0, 0x8f420004, +0x30420002, 0x14400097, 0xaf4000d0, 0x8f420004, +0x3c030001, 0x8c636d98, 0x34420002, 0xaf420004, +0x24020001, 0x14620003, 0x3c020600, 0x10000002, +0x34423000, 0x34421000, 0xafa20020, 0x1821, +0x8f5e0018, 0x27aa0020, 0x240200ff, 0x13c20002, +0xafaa002c, 0x27c30001, 0x8c020228, 0x609021, +0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, +0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, +0x2484610c, 0x3c050009, 0xafa00014, 0xafa20010, +0x8fa60020, 0x1000006d, 0x34a50500, 0xf71021, +0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, +0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, +0x2c4203e9, 0x1040001b, 0x9821, 0xe08821, +0x263504c0, 0x8f440178, 0x8f45017c, 0x2201821, +0x240a0004, 0xafaa0010, 0xafb20014, 0x8f48000c, +0x1021, 0x2f53021, 0xafa80018, 0x8f48010c, +0x24070008, 0xa32821, 0xa3482b, 0x822021, +0x100f809, 0x892021, 0x54400006, 0x24130001, +0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffe9, +0x0, 0x326200ff, 0x54400017, 0xaf520018, +0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, +0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, +0x3c040001, 0x24846118, 0x3c050009, 0xafa20014, +0x8d460000, 0x10000035, 0x34a50600, 0x8f420308, +0x24130001, 0x24420001, 0xaf420308, 0x8f420308, +0x1000001e, 0x326200ff, 0x8f830054, 0x8f820054, +0x247003e8, 0x2021023, 0x2c4203e9, 0x10400016, +0x9821, 0x3c150020, 0x24110010, 0x8f42000c, +0x8f440160, 0x8f450164, 0x8f860120, 0xafb10010, +0xafb20014, 0x551025, 0xafa20018, 0x8f42010c, +0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe3, +0x0, 0x8f820054, 0x2021023, 0x2c4203e9, +0x1440ffee, 0x0, 0x326200ff, 0x14400011, +0x0, 0x8f420378, 0x24420001, 0xaf420378, +0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, +0x8f820124, 0x3c040001, 0x24846120, 0x3c050009, +0xafa20014, 0x8d460000, 0x34a50700, 0xc002b3b, +0x3c03821, 0x8f4202ec, 0x24420001, 0xaf4202ec, +0x8f4202ec, 0x8f420004, 0x30420001, 0x10400018, +0x24040001, 0x8f420250, 0x8f430254, 0x8f4501b4, +0x3c010001, 0x14650006, 0xa0246cf1, 0x8f420270, +0x8f430274, 0x8f4401b8, 0x10640021, 0x0, +0x8f420250, 0x8f430254, 0x3c040001, 0x90846cf0, +0x8f460270, 0x8f470274, 0x38840001, 0xaf4301b4, +0xaf4701b8, 0x3c010001, 0x10000025, 0xa0246cf0, +0x8f4200d4, 0x3c010001, 0xa0206cf0, 0x24430001, +0x28420033, 0x1440001e, 0xaf4300d4, 0x3c020001, +0x90426cf1, 0xaf4000d4, 0x10000017, 0x38420001, +0x8f420004, 0x30420001, 0x10400008, 0x0, +0xc00565a, 0x2021, 0x3c010001, 0xa0206cf1, +0x3c010001, 0x1000000e, 0xa0206cf0, 0x8f4200d4, +0x3c010001, 0xa0206cf0, 0x24430001, 0x284201f5, +0x14400007, 0xaf4300d4, 0x3c020001, 0x90426cf1, +0xaf4000d4, 0x421026, 0x3c010001, 0xa0226cf1, +0x3c030001, 0x8c636d98, 0x24020002, 0x1462000c, +0x3c030002, 0x3c030001, 0x90636cf1, 0x24020001, +0x5462001f, 0x2021, 0x3c020001, 0x90426cf0, +0x1443001b, 0x24040005, 0x10000019, 0x24040006, +0x3c020002, 0x8c428ff4, 0x431024, 0x1040000b, +0x24020001, 0x3c030001, 0x90636cf1, 0x54620010, +0x2021, 0x3c020001, 0x90426cf0, 0x1443000c, +0x24040003, 0x1000000a, 0x24040004, 0x3c030001, +0x90636cf1, 0x14620006, 0x2021, 0x3c020001, +0x90426cf0, 0x24040001, 0x50440001, 0x24040002, +0xc00565a, 0x0, 0x2402ff7f, 0x282a024, +0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, +0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, +0x27bd0050, 0x3e00008, 0x0, 0x3c020001, +0x8c426da8, 0x27bdffb0, 0xafbf0048, 0xafbe0044, 0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, 0x104000de, 0xafb00030, 0x8f4200d0, 0x3c040001, -0x8c843e28, 0x24430001, 0x2842000b, 0xaf4400e8, +0x8c846d98, 0x24430001, 0x2842000b, 0xaf4400e8, 0x144000fe, 0xaf4300d0, 0x8f420004, 0x30420002, 0x14400095, 0xaf4000d0, 0x8f420004, 0x34420002, 0xaf420004, 0x24020001, 0x14820003, 0x3c020600, 0x10000002, 0x34423000, 0x34421000, 0xafa20020, 0x1821, 0x8f5e0018, 0x27aa0020, 0x240200ff, 0x13c20002, 0xafaa002c, 0x27c30001, 0x8c020228, -0x609021, 0x1642000e, 0x1e38c0, 0x8f42032c, -0x24420001, 0xaf42032c, 0x8f42032c, 0x8c020228, -0x3c040001, 0x2484322c, 0x3c050009, 0xafa00014, +0x609021, 0x1642000e, 0x1e38c0, 0x8f42033c, +0x24420001, 0xaf42033c, 0x8f42033c, 0x8c020228, +0x3c040001, 0x2484610c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006d, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 0x1040001b, 0x9821, -0xe08821, 0x263504c0, 0x8f440168, 0x8f45016c, +0xe08821, 0x263504c0, 0x8f440178, 0x8f45017c, 0x2201821, 0x240a0004, 0xafaa0010, 0xafb20014, 0x8f48000c, 0x1021, 0x2f53021, 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x54400006, 0x24130001, 0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffe9, 0x0, 0x326200ff, 0x54400017, -0xaf520018, 0x8f420368, 0x24420001, 0xaf420368, -0x8f420368, 0x8f820120, 0x8faa002c, 0xafa20010, -0x8f820124, 0x3c040001, 0x24843238, 0x3c050009, +0xaf520018, 0x8f420378, 0x24420001, 0xaf420378, +0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, +0x8f820124, 0x3c040001, 0x24846118, 0x3c050009, 0xafa20014, 0x8d460000, 0x10000035, 0x34a50600, -0x8f4202f8, 0x24130001, 0x24420001, 0xaf4202f8, -0x8f4202f8, 0x1000001e, 0x326200ff, 0x8f830054, +0x8f420308, 0x24130001, 0x24420001, 0xaf420308, +0x8f420308, 0x1000001e, 0x326200ff, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 0x10400016, 0x9821, 0x3c150020, 0x24110010, -0x8f42000c, 0x8f440150, 0x8f450154, 0x8f860120, +0x8f42000c, 0x8f440160, 0x8f450164, 0x8f860120, 0xafb10010, 0xafb20014, 0x551025, 0xafa20018, 0x8f42010c, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe3, 0x0, 0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffee, 0x0, 0x326200ff, -0x14400011, 0x0, 0x8f420368, 0x24420001, -0xaf420368, 0x8f420368, 0x8f820120, 0x8faa002c, -0xafa20010, 0x8f820124, 0x3c040001, 0x24843240, +0x14400011, 0x0, 0x8f420378, 0x24420001, +0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, +0xafa20010, 0x8f820124, 0x3c040001, 0x24846120, 0x3c050009, 0xafa20014, 0x8d460000, 0x34a50700, -0xc002a03, 0x3c03821, 0x8f4202dc, 0x24420001, -0xaf4202dc, 0x8f4202dc, 0x8f420004, 0x30420001, +0xc002b3b, 0x3c03821, 0x8f4202ec, 0x24420001, +0xaf4202ec, 0x8f4202ec, 0x8f420004, 0x30420001, 0x10400033, 0x3c020400, 0x2c21024, 0x10400017, -0x0, 0x934205b0, 0x8f440240, 0x8f450244, -0x8f4301a4, 0x34420020, 0x14a30006, 0xa34205b0, -0x8f420260, 0x8f430264, 0x8f4401a8, 0x10640008, -0x0, 0x8f420240, 0x8f430244, 0x934405b0, -0x8f460260, 0x8f470264, 0x10000016, 0x38840040, -0x934205b0, 0x10000048, 0x304200bf, 0x934205b0, -0x8f440240, 0x8f450244, 0x8f4301a4, 0x304200bf, -0x14a30006, 0xa34205b0, 0x8f420260, 0x8f430264, -0x8f4401a8, 0x1064000b, 0x0, 0x8f420240, -0x8f430244, 0x934405b0, 0x8f460260, 0x8f470264, -0x38840020, 0xaf4301a4, 0xaf4701a8, 0x10000033, -0xa34405b0, 0x934205b0, 0x1000002f, 0x34420020, -0x934205b0, 0x8f4300d4, 0x34420020, 0xa34205b0, +0x0, 0x934205c0, 0x8f440250, 0x8f450254, +0x8f4301b4, 0x34420020, 0x14a30006, 0xa34205c0, +0x8f420270, 0x8f430274, 0x8f4401b8, 0x10640008, +0x0, 0x8f420250, 0x8f430254, 0x934405c0, +0x8f460270, 0x8f470274, 0x10000016, 0x38840040, +0x934205c0, 0x10000048, 0x304200bf, 0x934205c0, +0x8f440250, 0x8f450254, 0x8f4301b4, 0x304200bf, +0x14a30006, 0xa34205c0, 0x8f420270, 0x8f430274, +0x8f4401b8, 0x1064000b, 0x0, 0x8f420250, +0x8f430254, 0x934405c0, 0x8f460270, 0x8f470274, +0x38840020, 0xaf4301b4, 0xaf4701b8, 0x10000033, +0xa34405c0, 0x934205c0, 0x1000002f, 0x34420020, +0x934205c0, 0x8f4300d4, 0x34420020, 0xa34205c0, 0x24620001, 0x10000023, 0x28630033, 0x8f4200e4, 0x8f4300e0, 0x24420001, 0xaf4200e4, 0x43102a, 0x14400006, 0x24030001, 0x8f4200e8, 0x14430002, 0xaf4000e4, 0x24030004, 0xaf4300e8, 0x8f420004, 0x30420001, 0x1040000d, 0x3c020400, 0x2c21024, -0x10400007, 0x0, 0x934205b0, 0x34420040, -0xa34205b0, 0x934205b0, 0x1000000f, 0x304200df, -0x934205b0, 0x1000000c, 0x34420060, 0x934205b0, -0x8f4300d4, 0x34420020, 0xa34205b0, 0x24620001, -0x286300fb, 0x14600005, 0xaf4200d4, 0x934205b0, -0xaf4000d4, 0x38420040, 0xa34205b0, 0x934205b0, -0x8f4300e8, 0x3042007f, 0xa34205b0, 0x24020001, -0x14620005, 0x0, 0x934405b0, 0x42102, -0x10000003, 0x348400f0, 0x934405b0, 0x3484000f, -0xc004b34, 0x0, 0x2402ff7f, 0x282a024, +0x10400007, 0x0, 0x934205c0, 0x34420040, +0xa34205c0, 0x934205c0, 0x1000000f, 0x304200df, +0x934205c0, 0x1000000c, 0x34420060, 0x934205c0, +0x8f4300d4, 0x34420020, 0xa34205c0, 0x24620001, +0x286300fb, 0x14600005, 0xaf4200d4, 0x934205c0, +0xaf4000d4, 0x38420040, 0xa34205c0, 0x934205c0, +0x8f4300e8, 0x3042007f, 0xa34205c0, 0x24020001, +0x14620005, 0x0, 0x934405c0, 0x42102, +0x10000003, 0x348400f0, 0x934405c0, 0x3484000f, +0xc005640, 0x0, 0x2402ff7f, 0x282a024, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 0x27bd0050, 0x3e00008, 0x0, 0x27bdffb0, -0x274401b0, 0x26e30028, 0x24650400, 0x65102b, +0x274401c0, 0x26e30028, 0x24650400, 0x65102b, 0xafbf0048, 0xafbe0044, 0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, 0x10400007, 0xafb00030, 0x8c820000, 0xac620000, 0x24630004, 0x65102b, @@ -5296,123 +5529,123 @@ 0xafa20010, 0xafa00014, 0x8f42000c, 0x8c040208, 0x8c05020c, 0xafa20018, 0x8f42010c, 0x26e60028, 0x40f809, 0x24070400, 0x104000f0, 0x3c020400, -0xafa20020, 0x934205b7, 0x10400089, 0x1821, +0xafa20020, 0x934205c6, 0x10400089, 0x1821, 0x8f5e0018, 0x27aa0020, 0x240200ff, 0x13c20002, 0xafaa002c, 0x27c30001, 0x8c020228, 0x609021, -0x1642000e, 0x1e38c0, 0x8f42032c, 0x24420001, -0xaf42032c, 0x8f42032c, 0x8c020228, 0x3c040001, -0x2484322c, 0x3c050009, 0xafa00014, 0xafa20010, +0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, +0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, +0x2484610c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 0x1040001b, 0x9821, 0xe08821, -0x263504c0, 0x8f440168, 0x8f45016c, 0x2201821, +0x263504c0, 0x8f440178, 0x8f45017c, 0x2201821, 0x240a0004, 0xafaa0010, 0xafb20014, 0x8f48000c, 0x1021, 0x2f53021, 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x54400006, 0x24130001, 0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffe9, 0x0, 0x326200ff, 0x54400017, 0xaf520018, -0x8f420368, 0x24420001, 0xaf420368, 0x8f420368, +0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, -0x3c040001, 0x24843238, 0x3c050009, 0xafa20014, -0x8d460000, 0x10000033, 0x34a50600, 0x8f4202f8, -0x24130001, 0x24420001, 0xaf4202f8, 0x8f4202f8, +0x3c040001, 0x24846118, 0x3c050009, 0xafa20014, +0x8d460000, 0x10000033, 0x34a50600, 0x8f420308, +0x24130001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 0x10400014, -0x9821, 0x24110010, 0x8f42000c, 0x8f440150, -0x8f450154, 0x8f860120, 0xafb10010, 0xafb20014, +0x9821, 0x24110010, 0x8f42000c, 0x8f440160, +0x8f450164, 0x8f860120, 0xafb10010, 0xafb20014, 0xafa20018, 0x8f42010c, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe5, 0x0, 0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffef, 0x0, -0x326200ff, 0x54400012, 0x24020001, 0x8f420368, -0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, +0x326200ff, 0x54400012, 0x24020001, 0x8f420378, +0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, 0x3c040001, -0x24843240, 0x3c050009, 0xafa20014, 0x8d460000, -0x34a50700, 0xc002a03, 0x3c03821, 0x1021, +0x24846120, 0x3c050009, 0xafa20014, 0x8d460000, +0x34a50700, 0xc002b3b, 0x3c03821, 0x1021, 0x1440005b, 0x24020001, 0x10000065, 0x0, 0x8f510018, 0x240200ff, 0x12220002, 0x8021, 0x26300001, 0x8c020228, 0x1602000e, 0x1130c0, -0x8f42032c, 0x24420001, 0xaf42032c, 0x8f42032c, -0x8c020228, 0x3c040001, 0x24843214, 0x3c050009, +0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, +0x8c020228, 0x3c040001, 0x248460f4, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000003f, 0x34a50100, 0xd71021, 0x8fa30020, 0x8fa40024, -0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440168, -0x8f45016c, 0x1021, 0x24070004, 0xafa70010, +0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440178, +0x8f45017c, 0x1021, 0x24070004, 0xafa70010, 0xafb00014, 0x8f48000c, 0x24c604c0, 0x2e63021, 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x1440000b, 0x24070008, 0x8f820120, 0xafa20010, -0x8f820124, 0x3c040001, 0x2484321c, 0x3c050009, +0x8f820124, 0x3c040001, 0x248460fc, 0x3c050009, 0xafa20014, 0x8fa60020, 0x1000001c, 0x34a50200, -0x8f440150, 0x8f450154, 0x8f43000c, 0xaf500018, +0x8f440160, 0x8f450164, 0x8f43000c, 0xaf500018, 0x8f860120, 0x24020010, 0xafa20010, 0xafb00014, 0xafa30018, 0x8f42010c, 0x40f809, 0x24c6001c, -0x54400011, 0x24020001, 0x8f420330, 0x24420001, -0xaf420330, 0x8f420330, 0x8f820120, 0xafa20010, -0x8f820124, 0x3c040001, 0x24843224, 0x3c050009, -0xafa20014, 0x8fa60020, 0x34a50300, 0xc002a03, +0x54400011, 0x24020001, 0x8f420340, 0x24420001, +0xaf420340, 0x8f420340, 0x8f820120, 0xafa20010, +0x8f820124, 0x3c040001, 0x24846104, 0x3c050009, +0xafa20014, 0x8fa60020, 0x34a50300, 0xc002b3b, 0x2203821, 0x1021, 0x1040000d, 0x24020001, -0x8f4202d8, 0xa34005b7, 0xaf4001a0, 0x24420001, -0xaf4202d8, 0x8f4202d8, 0x8ee20150, 0x24420001, +0x8f4202e8, 0xa34005c6, 0xaf4001b0, 0x24420001, +0xaf4202e8, 0x8f4202e8, 0x8ee20150, 0x24420001, 0xaee20150, 0x10000003, 0x8ee20150, 0x24020001, -0xa34205b7, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, +0xa34205c6, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 0x27bd0050, 0x27bdffd8, 0xafbf0020, 0x8f8200b0, 0x30420004, 0x10400068, 0x0, -0x8f43011c, 0x8f820104, 0x14620005, 0x0, -0x8f430124, 0x8f8200b4, 0x10620006, 0x0, -0x8f820104, 0xaf42011c, 0x8f8200b4, 0x1000005b, -0xaf420124, 0x8f8200b0, 0x3c030080, 0x431024, +0x8f430128, 0x8f820104, 0x14620005, 0x0, +0x8f430130, 0x8f8200b4, 0x10620006, 0x0, +0x8f820104, 0xaf420128, 0x8f8200b4, 0x1000005b, +0xaf420130, 0x8f8200b0, 0x3c030080, 0x431024, 0x1040000d, 0x0, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f8200b0, 0x2403fffb, 0x431024, 0xaf8200b0, 0x8f82011c, 0x2403fffd, 0x431024, -0x1000004a, 0xaf82011c, 0x8f43011c, 0x8f820104, -0x14620005, 0x0, 0x8f430124, 0x8f8200b4, -0x10620010, 0x0, 0x8f820104, 0xaf42011c, -0x8f8200b4, 0x8f43011c, 0xaf420124, 0xafa30010, -0x8f420124, 0x3c040001, 0x24843264, 0xafa20014, +0x1000004a, 0xaf82011c, 0x8f430128, 0x8f820104, +0x14620005, 0x0, 0x8f430130, 0x8f8200b4, +0x10620010, 0x0, 0x8f820104, 0xaf420128, +0x8f8200b4, 0x8f430128, 0xaf420130, 0xafa30010, +0x8f420130, 0x3c040001, 0x24846144, 0xafa20014, 0x8f86011c, 0x8f8700b0, 0x3c050005, 0x10000031, -0x34a50900, 0x8f42011c, 0xafa20010, 0x8f420124, -0x3c040001, 0x24843270, 0xafa20014, 0x8f86011c, -0x8f8700b0, 0x3c050005, 0xc002a03, 0x34a51000, +0x34a50900, 0x8f420128, 0xafa20010, 0x8f420130, +0x3c040001, 0x24846150, 0xafa20014, 0x8f86011c, +0x8f8700b0, 0x3c050005, 0xc002b3b, 0x34a51000, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001, 0xaf8200b0, 0x24020008, 0xaf830104, 0xafa20010, 0xafa00014, 0x8f42000c, 0x8c040208, 0x8c05020c, 0xafa20018, 0x8f42010c, 0x26e60028, 0x40f809, 0x24070400, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201dc, -0x24420001, 0xaee201dc, 0x8ee201dc, 0x8f42011c, -0xafa20010, 0x8f420124, 0x3c040001, 0x2484327c, +0x24420001, 0xaee201dc, 0x8ee201dc, 0x8f420128, +0xafa20010, 0x8f420130, 0x3c040001, 0x2484615c, 0xafa20014, 0x8f86011c, 0x8f8700b0, 0x3c050005, -0x34a51100, 0xc002a03, 0x0, 0x8f8200a0, -0x30420004, 0x10400069, 0x0, 0x8f430120, -0x8f820124, 0x14620005, 0x0, 0x8f430128, +0x34a51100, 0xc002b3b, 0x0, 0x8f8200a0, +0x30420004, 0x10400069, 0x0, 0x8f43012c, +0x8f820124, 0x14620005, 0x0, 0x8f430134, 0x8f8200a4, 0x10620006, 0x0, 0x8f820124, -0xaf420120, 0x8f8200a4, 0x1000005c, 0xaf420128, +0xaf42012c, 0x8f8200a4, 0x1000005c, 0xaf420134, 0x8f8200a0, 0x3c030080, 0x431024, 0x1040000d, 0x0, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f8200a0, 0x2403fffb, 0x431024, 0xaf8200a0, 0x8f82011c, 0x2403fffd, 0x431024, 0x1000004b, -0xaf82011c, 0x8f430120, 0x8f820124, 0x14620005, -0x0, 0x8f430128, 0x8f8200a4, 0x10620010, -0x0, 0x8f820124, 0xaf420120, 0x8f8200a4, -0x8f430120, 0xaf420128, 0xafa30010, 0x8f420128, -0x3c040001, 0x24843288, 0xafa20014, 0x8f86011c, +0xaf82011c, 0x8f43012c, 0x8f820124, 0x14620005, +0x0, 0x8f430134, 0x8f8200a4, 0x10620010, +0x0, 0x8f820124, 0xaf42012c, 0x8f8200a4, +0x8f43012c, 0xaf420134, 0xafa30010, 0x8f420134, +0x3c040001, 0x24846168, 0xafa20014, 0x8f86011c, 0x8f8700a0, 0x3c050005, 0x10000032, 0x34a51200, -0x8f420120, 0xafa20010, 0x8f420128, 0x3c040001, -0x24843294, 0xafa20014, 0x8f86011c, 0x8f8700a0, -0x3c050005, 0xc002a03, 0x34a51300, 0x8f82011c, +0x8f42012c, 0xafa20010, 0x8f420134, 0x3c040001, +0x24846174, 0xafa20014, 0x8f86011c, 0x8f8700a0, +0x3c050005, 0xc002b3b, 0x34a51300, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830124, 0x8f8200a0, 0x34420001, 0xaf8200a0, 0x24020080, 0xaf830124, 0xafa20010, 0xafa00014, 0x8f420014, 0x8c040208, 0x8c05020c, 0xafa20018, 0x8f420108, 0x3c060001, -0x24c63f24, 0x40f809, 0x24070004, 0x8f82011c, +0x24c66ed8, 0x40f809, 0x24070004, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201dc, -0x24420001, 0xaee201dc, 0x8ee201dc, 0x8f420120, -0xafa20010, 0x8f420128, 0x3c040001, 0x248432a0, +0x24420001, 0xaee201dc, 0x8ee201dc, 0x8f42012c, +0xafa20010, 0x8f420134, 0x3c040001, 0x24846180, 0xafa20014, 0x8f86011c, 0x8f8700a0, 0x3c050005, -0x34a51400, 0xc002a03, 0x0, 0x8fbf0020, +0x34a51400, 0xc002b3b, 0x0, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3c081000, 0x24070001, 0x3c060080, 0x3c050100, 0x8f820070, 0x481024, 0x1040fffd, 0x0, 0x8f820054, 0x24420005, @@ -5439,263 +5672,268 @@ 0x10400003, 0x0, 0x1000ffa7, 0xaf80004c, 0x1000ffa5, 0xaf800048, 0x3e00008, 0x0, 0x0, 0x0, 0x0, 0x27bdffe0, -0xafbf001c, 0xafb00018, 0x8f860064, 0x30c20004, -0x10400025, 0x24040004, 0x8c020114, 0xaf420020, -0xaf840064, 0x8f4202ec, 0x24420001, 0xaf4202ec, -0x8f4202ec, 0x8f820064, 0x30420004, 0x14400005, -0x0, 0x8c030114, 0x8f420020, 0x1462fff2, -0x0, 0x8f420000, 0x10400007, 0x8f43003c, -0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, -0x10000005, 0x0, 0xaf800048, 0x8f820048, -0x1040fffd, 0x0, 0x8f820060, 0x431025, -0xaf820060, 0x8f420000, 0x10400073, 0x0, -0x1000006f, 0x0, 0x30c20008, 0x10400020, -0x24040008, 0x8c02011c, 0xaf420048, 0xaf840064, -0x8f420298, 0x24420001, 0xaf420298, 0x8f420298, -0x8f820064, 0x30420008, 0x14400005, 0x0, -0x8c03011c, 0x8f420048, 0x1462fff2, 0x0, -0x8f420000, 0x10400007, 0x0, 0xaf80004c, +0xafbf0018, 0x8f860064, 0x30c20004, 0x10400025, +0x24040004, 0x8c020114, 0xaf420020, 0xaf840064, +0x8f4202fc, 0x24420001, 0xaf4202fc, 0x8f4202fc, +0x8f820064, 0x30420004, 0x14400005, 0x0, +0x8c030114, 0x8f420020, 0x1462fff2, 0x0, +0x8f420000, 0x10400007, 0x8f43003c, 0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 0x0, 0xaf800048, 0x8f820048, 0x1040fffd, -0x0, 0x8f820060, 0x1000ffd9, 0x34420200, -0x30c20020, 0x10400023, 0x24040020, 0x8c02012c, -0xaf420068, 0xaf840064, 0x8f4202c8, 0x24420001, -0xaf4202c8, 0x8f4202c8, 0x8f820064, 0x30420020, -0x14400005, 0x32c24000, 0x8c03012c, 0x8f420068, -0x1462fff2, 0x32c24000, 0x14400002, 0x3c020001, -0x2c2b025, 0x8f420000, 0x10400007, 0x0, -0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, -0x10000005, 0x0, 0xaf800048, 0x8f820048, -0x1040fffd, 0x0, 0x8f820060, 0x1000ffb4, -0x34420800, 0x30c20010, 0x10400029, 0x24040010, -0x8c020124, 0xaf420058, 0xaf840064, 0x8f4202c4, -0x24420001, 0xaf4202c4, 0x8f4202c4, 0x8f820064, -0x30420010, 0x14400005, 0x32c22000, 0x8c030124, -0x8f420058, 0x1462fff2, 0x32c22000, 0x50400001, -0x36d68000, 0x8f420000, 0x10400007, 0x0, -0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, -0x10000005, 0x0, 0xaf800048, 0x8f820048, -0x1040fffd, 0x0, 0x8f820060, 0x34420100, -0xaf820060, 0x8f420000, 0x10400003, 0x0, -0x1000006b, 0xaf80004c, 0x10000069, 0xaf800048, -0x30c20001, 0x10400004, 0x24020001, 0xaf820064, -0x10000063, 0x0, 0x30c20002, 0x1440000b, -0x3c050003, 0x3c040001, 0x24843364, 0x34a50500, -0x3821, 0xafa00010, 0xc002a03, 0xafa00014, -0x2402ffc0, 0x10000056, 0xaf820064, 0x8c10022c, -0x8c02010c, 0x12020047, 0x101080, 0x8c450300, -0x26020001, 0x3050003f, 0x24020003, 0xac10022c, -0x51e02, 0x10620005, 0x24020010, 0x1062001d, -0x30a20fff, 0x10000039, 0x0, 0x8f430298, -0x8f440000, 0x30a20fff, 0xaf420048, 0x24630001, -0xaf430298, 0x10800007, 0x8f420298, 0xaf80004c, +0x0, 0x8f820060, 0x431025, 0xaf820060, +0x8f420000, 0x10400073, 0x0, 0x1000006f, +0x0, 0x30c20008, 0x10400020, 0x24040008, +0x8c02011c, 0xaf420048, 0xaf840064, 0x8f4202a8, +0x24420001, 0xaf4202a8, 0x8f4202a8, 0x8f820064, +0x30420008, 0x14400005, 0x0, 0x8c03011c, +0x8f420048, 0x1462fff2, 0x0, 0x8f420000, +0x10400007, 0x0, 0xaf80004c, 0x8f82004c, +0x1040fffd, 0x0, 0x10000005, 0x0, +0xaf800048, 0x8f820048, 0x1040fffd, 0x0, +0x8f820060, 0x1000ffd9, 0x34420200, 0x30c20020, +0x10400023, 0x24040020, 0x8c02012c, 0xaf420068, +0xaf840064, 0x8f4202d8, 0x24420001, 0xaf4202d8, +0x8f4202d8, 0x8f820064, 0x30420020, 0x14400005, +0x32c24000, 0x8c03012c, 0x8f420068, 0x1462fff2, +0x32c24000, 0x14400002, 0x3c020001, 0x2c2b025, +0x8f420000, 0x10400007, 0x0, 0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 0x0, 0xaf800048, 0x8f820048, 0x1040fffd, -0x0, 0x8f820060, 0x34420200, 0xaf820060, -0x8f420000, 0x1040001f, 0x0, 0x1000001b, -0x0, 0xaf420058, 0x32c22000, 0x50400001, -0x36d68000, 0x8f4202c4, 0x8f430000, 0x24420001, -0xaf4202c4, 0x10600007, 0x8f4202c4, 0xaf80004c, +0x0, 0x8f820060, 0x1000ffb4, 0x34420800, +0x30c20010, 0x10400029, 0x24040010, 0x8c020124, +0xaf420058, 0xaf840064, 0x8f4202d4, 0x24420001, +0xaf4202d4, 0x8f4202d4, 0x8f820064, 0x30420010, +0x14400005, 0x32c22000, 0x8c030124, 0x8f420058, +0x1462fff2, 0x32c22000, 0x50400001, 0x36d68000, +0x8f420000, 0x10400007, 0x0, 0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 0x0, 0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 0x34420100, 0xaf820060, -0x8f420000, 0x10400003, 0x0, 0x10000005, -0xaf80004c, 0x10000003, 0xaf800048, 0xc002033, -0xa02021, 0x8c02010c, 0x16020002, 0x24020002, +0x8f420000, 0x10400003, 0x0, 0x1000006c, +0xaf80004c, 0x1000006a, 0xaf800048, 0x30c20001, +0x10400004, 0x24020001, 0xaf820064, 0x10000064, +0x0, 0x30c20002, 0x1440000b, 0x3c050003, +0x3c040001, 0x24846244, 0x34a50500, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x2402ffc0, +0x10000057, 0xaf820064, 0x8c05022c, 0x8c02010c, +0x10a20048, 0x51080, 0x8c460300, 0x24a20001, +0x3045003f, 0x24020003, 0xac05022c, 0x61e02, +0x10620005, 0x24020010, 0x1062001d, 0x30c20fff, +0x10000039, 0x0, 0x8f4302a8, 0x8f440000, +0x30c20fff, 0xaf420048, 0x24630001, 0xaf4302a8, +0x10800007, 0x8f4202a8, 0xaf80004c, 0x8f82004c, +0x1040fffd, 0x0, 0x10000005, 0x0, +0xaf800048, 0x8f820048, 0x1040fffd, 0x0, +0x8f820060, 0x34420200, 0xaf820060, 0x8f420000, +0x1040001f, 0x0, 0x1000001b, 0x0, +0xaf420058, 0x32c22000, 0x50400001, 0x36d68000, +0x8f4202d4, 0x8f430000, 0x24420001, 0xaf4202d4, +0x10600007, 0x8f4202d4, 0xaf80004c, 0x8f82004c, +0x1040fffd, 0x0, 0x10000005, 0x0, +0xaf800048, 0x8f820048, 0x1040fffd, 0x0, +0x8f820060, 0x34420100, 0xaf820060, 0x8f420000, +0x10400003, 0x0, 0x10000006, 0xaf80004c, +0x10000004, 0xaf800048, 0xc002196, 0xc02021, +0x402821, 0x8c02010c, 0x14a20002, 0x24020002, 0xaf820064, 0x8f820064, 0x30420002, 0x14400004, -0x0, 0x8c02010c, 0x1602ffad, 0x0, -0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, -0x3e00008, 0x0, 0x27bdffa8, 0xafb00038, -0x808021, 0x101602, 0x2442ffff, 0x304300ff, -0x2c620013, 0xafbf0050, 0xafbe004c, 0xafb50048, -0xafb30044, 0xafb20040, 0x104001e6, 0xafb1003c, -0x31080, 0x3c010001, 0x220821, 0x8c2233a8, +0x0, 0x8c02010c, 0x14a2ffac, 0x0, +0x8fbf0018, 0x3e00008, 0x27bd0020, 0x3e00008, +0x0, 0x27bdffa0, 0xafb00040, 0x808021, +0x101602, 0x2442ffff, 0x304300ff, 0x2c620013, +0xafbf0058, 0xafbe0054, 0xafb50050, 0xafb3004c, +0xafb20048, 0xafb10044, 0x104001f3, 0xafa50034, +0x31080, 0x3c010001, 0x220821, 0x8c226288, 0x400008, 0x0, 0x101302, 0x30440fff, -0x24020001, 0x10820005, 0x24020002, 0x1082000a, -0x2402fffe, 0x10000021, 0x3c050003, 0x8f430004, -0x3c020001, 0x8c423f50, 0xaf4401f0, 0xaf4401f4, -0x10000007, 0x34630001, 0x8f430004, 0xaf4401f0, -0xaf4401f4, 0x621824, 0x3c020001, 0x2442c344, +0x24020001, 0x10820005, 0x24020002, 0x1082000c, +0x2402fffe, 0x10000024, 0x3c050003, 0x8f430004, +0x3c020001, 0x8c426f04, 0xaf440200, 0xaf440204, +0x3c040001, 0x8c846e80, 0x10000009, 0x34630001, +0x8f430004, 0xaf440200, 0xaf440204, 0x3c040001, +0x8c846e80, 0x621824, 0x3c020001, 0x2442ca28, 0x21100, 0x21182, 0xaf430004, 0x3c030800, -0x431025, 0x3c010000, 0xac224138, 0x8f840054, -0x41442, 0x41c82, 0x431021, 0x41cc2, -0x431023, 0x41d02, 0x431021, 0x41d42, -0x431023, 0x10000009, 0xaf4201f8, 0x3c040001, -0x24843370, 0x34a51000, 0x2003021, 0x3821, -0xafa00010, 0xc002a03, 0xafa00014, 0x8f420290, -0x24420001, 0xaf420290, 0x10000215, 0x8f420290, -0x27b00028, 0x2002021, 0x24050210, 0xc002a87, -0x24060008, 0xc0023a0, 0x2002021, 0x1000020c, -0x0, 0x8c06022c, 0x27a40028, 0x61880, -0x24c20001, 0x3046003f, 0x8c650300, 0x61080, -0x8c430300, 0x24c20001, 0x3042003f, 0xac02022c, -0xafa50028, 0xc0023a0, 0xafa3002c, 0x100001fc, -0x0, 0x27b00028, 0x2002021, 0x24050210, -0xc002a87, 0x24060008, 0xc0024df, 0x2002021, -0x100001f3, 0x0, 0x8c06022c, 0x27a40028, -0x61880, 0x24c20001, 0x3046003f, 0x8c650300, -0x61080, 0x8c430300, 0x24c20001, 0x3042003f, -0xac02022c, 0xafa50028, 0xc0024df, 0xafa3002c, -0x100001e3, 0x0, 0x101302, 0x30430fff, -0x24020001, 0x10620005, 0x24020002, 0x1062001e, -0x3c020002, 0x10000033, 0x3c050003, 0x3c030002, -0x2c31024, 0x54400037, 0x2c3b025, 0x8f820228, -0x3c010001, 0x370821, 0xac2238d8, 0x8f82022c, -0x3c010001, 0x370821, 0xac2238dc, 0x8f820230, -0x3c010001, 0x370821, 0xac2238e0, 0x8f820234, -0x3c010001, 0x370821, 0xac2238e4, 0x2402ffff, -0xaf820228, 0xaf82022c, 0xaf820230, 0xaf820234, -0x10000020, 0x2c3b025, 0x2c21024, 0x10400012, -0x3c02fffd, 0x3c020001, 0x571021, 0x8c4238d8, -0xaf820228, 0x3c020001, 0x571021, 0x8c4238dc, -0xaf82022c, 0x3c020001, 0x571021, 0x8c4238e0, -0xaf820230, 0x3c020001, 0x571021, 0x8c4238e4, -0xaf820234, 0x3c02fffd, 0x3442ffff, 0x10000009, -0x2c2b024, 0x3c040001, 0x2484337c, 0x34a51100, -0x2003021, 0x3821, 0xafa00010, 0xc002a03, -0xafa00014, 0x8f4202bc, 0x24420001, 0xaf4202bc, -0x1000019b, 0x8f4202bc, 0x101302, 0x30450fff, -0x24020001, 0x10a20005, 0x24020002, 0x10a2000d, -0x3c0408ff, 0x10000014, 0x3c050003, 0x3c0208ff, -0x3442ffff, 0x8f830220, 0x3c040004, 0x2c4b025, -0x621824, 0x34630008, 0xaf830220, 0x10000012, -0xaf450288, 0x3484fff7, 0x3c03fffb, 0x8f820220, -0x3463ffff, 0x2c3b024, 0x441024, 0xaf820220, -0x10000009, 0xaf450288, 0x3c040001, 0x24843388, -0x34a51200, 0x2003021, 0x3821, 0xafa00010, -0xc002a03, 0xafa00014, 0x8f4202ac, 0x24420001, -0xaf4202ac, 0x10000172, 0x8f4202ac, 0x27840208, -0x24050200, 0xc002a87, 0x24060008, 0x27440214, -0x24050200, 0xc002a87, 0x24060008, 0x8f4202b4, -0x24420001, 0xaf4202b4, 0x10000165, 0x8f4202b4, -0x101302, 0x30430fff, 0x24020001, 0x10620011, -0x28620002, 0x50400005, 0x24020002, 0x10600007, -0x0, 0x10000017, 0x0, 0x1062000f, -0x0, 0x10000013, 0x0, 0x8c060248, -0x2021, 0xc0048a8, 0x24050004, 0x10000007, -0x0, 0x8c060248, 0x2021, 0xc0048a8, -0x24050004, 0x10000010, 0x0, 0x8c06024c, -0x2021, 0xc0048a8, 0x24050001, 0x1000000a, -0x0, 0x3c040001, 0x24843394, 0x3c050003, -0x34a51300, 0x2003021, 0x3821, 0xafa00010, -0xc002a03, 0xafa00014, 0x8f4202b0, 0x24420001, -0xaf4202b0, 0x10000136, 0x8f4202b0, 0xc0022b4, -0x0, 0x10000132, 0x0, 0x24020001, -0xa34205b6, 0x24100100, 0x8f440198, 0x8f45019c, -0xafb00010, 0xafa00014, 0x8f420014, 0xafa20018, -0x8f420108, 0x26e60028, 0x40f809, 0x24070400, -0x1040fff5, 0x0, 0x10000121, 0x0, -0x3c02ffff, 0x34427fff, 0x2c2b024, 0x1821, -0x3c020900, 0xaf400058, 0xaf40005c, 0xaf400060, -0xaf400064, 0xaf400350, 0xafa20020, 0x8f5e0018, -0x27aa0020, 0x240200ff, 0x13c20002, 0xafaa0034, -0x27c30001, 0x8c020228, 0x609021, 0x1642000e, -0x1e38c0, 0x8f42032c, 0x24420001, 0xaf42032c, -0x8f42032c, 0x8c020228, 0x3c040001, 0x2484332c, -0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, -0x1000006b, 0x34a50500, 0xf71021, 0x8fa30020, -0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, -0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, -0x1040001b, 0x9821, 0xe08821, 0x263504c0, -0x8f440168, 0x8f45016c, 0x2201821, 0x240a0004, -0xafaa0010, 0xafb20014, 0x8f48000c, 0x1021, -0x2f53021, 0xafa80018, 0x8f48010c, 0x24070008, -0xa32821, 0xa3482b, 0x822021, 0x100f809, -0x892021, 0x54400006, 0x24130001, 0x8f820054, -0x2021023, 0x2c4203e9, 0x1440ffe9, 0x0, -0x326200ff, 0x54400017, 0xaf520018, 0x8f420368, -0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, -0x8faa0034, 0xafa20010, 0x8f820124, 0x3c040001, -0x24843338, 0x3c050009, 0xafa20014, 0x8d460000, -0x10000033, 0x34a50600, 0x8f4202f8, 0x24130001, -0x24420001, 0xaf4202f8, 0x8f4202f8, 0x1000001c, -0x326200ff, 0x8f830054, 0x8f820054, 0x247003e8, -0x2021023, 0x2c4203e9, 0x10400014, 0x9821, -0x24110010, 0x8f42000c, 0x8f440150, 0x8f450154, -0x8f860120, 0xafb10010, 0xafb20014, 0xafa20018, -0x8f42010c, 0x24070008, 0x40f809, 0x24c6001c, -0x1440ffe5, 0x0, 0x8f820054, 0x2021023, -0x2c4203e9, 0x1440ffef, 0x0, 0x326200ff, -0x14400011, 0x0, 0x8f420368, 0x24420001, -0xaf420368, 0x8f420368, 0x8f820120, 0x8faa0034, -0xafa20010, 0x8f820124, 0x3c040001, 0x24843340, -0x3c050009, 0xafa20014, 0x8d460000, 0x34a50700, -0xc002a03, 0x3c03821, 0x8f4202a0, 0x24420001, -0xaf4202a0, 0x8f4202a0, 0x8f4202e8, 0x24420001, -0xaf4202e8, 0x1000008a, 0x8f4202e8, 0x8c02025c, -0x27440214, 0xaf4201e0, 0x8c020260, 0x24050200, -0x24060008, 0xc002a87, 0xaf4201e8, 0x8f820220, -0x30420008, 0x14400002, 0x24020001, 0x24020002, -0xaf420288, 0x8f42029c, 0x24420001, 0xaf42029c, -0x10000077, 0x8f42029c, 0x3c0200ff, 0x3442ffff, -0x2021824, 0x32c20180, 0x14400006, 0x3402fffb, -0x43102b, 0x14400003, 0x0, 0x1000006c, -0xaf4300bc, 0x3c040001, 0x248433a0, 0x3c050003, -0x34a51500, 0x2003021, 0x3821, 0xafa00010, -0xc002a03, 0xafa00014, 0x3c020700, 0x34421000, -0x101e02, 0x621825, 0xafa30020, 0x8f510018, -0x240200ff, 0x12220002, 0x8021, 0x26300001, -0x8c020228, 0x1602000e, 0x1130c0, 0x8f42032c, -0x24420001, 0xaf42032c, 0x8f42032c, 0x8c020228, -0x3c040001, 0x24843314, 0x3c050009, 0xafa00014, -0xafa20010, 0x8fa60020, 0x1000003f, 0x34a50100, -0xd71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, -0xac4404c4, 0xc01821, 0x8f440168, 0x8f45016c, -0x1021, 0x24070004, 0xafa70010, 0xafb00014, -0x8f48000c, 0x24c604c0, 0x2e63021, 0xafa80018, -0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, -0x822021, 0x100f809, 0x892021, 0x1440000b, -0x24070008, 0x8f820120, 0xafa20010, 0x8f820124, -0x3c040001, 0x2484331c, 0x3c050009, 0xafa20014, -0x8fa60020, 0x1000001c, 0x34a50200, 0x8f440150, -0x8f450154, 0x8f43000c, 0xaf500018, 0x8f860120, -0x24020010, 0xafa20010, 0xafb00014, 0xafa30018, -0x8f42010c, 0x40f809, 0x24c6001c, 0x14400010, -0x0, 0x8f420330, 0x24420001, 0xaf420330, -0x8f420330, 0x8f820120, 0xafa20010, 0x8f820124, -0x3c040001, 0x24843324, 0x3c050009, 0xafa20014, -0x8fa60020, 0x34a50300, 0xc002a03, 0x2203821, -0x8f4202d0, 0x24420001, 0xaf4202d0, 0x8f4202d0, -0x8f4202e0, 0x24420001, 0xaf4202e0, 0x8f4202e0, -0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044, -0x8fb20040, 0x8fb1003c, 0x8fb00038, 0x3e00008, -0x27bd0058, 0x27bdfff8, 0x2408ffff, 0x10a00014, -0x4821, 0x3c0aedb8, 0x354a8320, 0x90870000, -0x24840001, 0x3021, 0x1071026, 0x30420001, -0x10400002, 0x81842, 0x6a1826, 0x604021, -0x24c60001, 0x2cc20008, 0x1440fff7, 0x73842, -0x25290001, 0x125102b, 0x1440fff0, 0x0, -0x1001021, 0x3e00008, 0x27bd0008, 0x27bdffb8, -0xafbf0040, 0xafbe003c, 0xafb50038, 0xafb30034, -0xafb20030, 0xafb1002c, 0xafb00028, 0x8f870220, -0xafa7001c, 0x8f870200, 0xafa70024, 0x8f820220, -0x3c0308ff, 0x3463ffff, 0x431024, 0x34420004, -0xaf820220, 0x8f820200, 0x3c03c0ff, 0x3463ffff, -0x431024, 0x34420004, 0xaf820200, 0x8f53034c, -0x8f550350, 0x8f5e0354, 0x8f470358, 0xafa70014, -0x8f4202c0, 0x274401b0, 0x24420001, 0xaf4202c0, -0x8f5002c0, 0x8f5101f4, 0x8f5201f0, 0xc002a70, -0x24050400, 0xaf53034c, 0xaf550350, 0xaf5e0354, -0x8fa70014, 0xaf470358, 0xaf5002c0, 0xaf5101f4, -0xaf5201f0, 0x8c02025c, 0x27440214, 0xaf4201e0, -0x8c020260, 0x24050200, 0x24060008, 0xaf4201e8, -0x24020006, 0xc002a87, 0xaf4201e4, 0x3c023b9a, -0x3442ca00, 0xaf4201ec, 0x240203e8, 0x24040002, -0x24030001, 0xaf420284, 0xaf440280, 0xaf43028c, -0x8f820220, 0x30420008, 0x10400004, 0x0, -0xaf430288, 0x10000003, 0x3021, 0xaf440288, -0x3021, 0x3c030001, 0x661821, 0x90633d90, -0x3461021, 0x24c60001, 0xa043021c, 0x2cc2000f, -0x1440fff8, 0x3461821, 0x24c60001, 0x8f820040, -0x24040080, 0x24050080, 0x21702, 0x24420030, -0xa062021c, 0x3461021, 0xc002a70, 0xa040021c, -0x8fa7001c, 0x30e20004, 0x14400006, 0x0, -0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, -0xaf820220, 0x8fa70024, 0x30e20004, 0x14400006, -0x0, 0x8f820200, 0x3c03c0ff, 0x3463fffb, -0x431024, 0xaf820200, 0x8fbf0040, 0x8fbe003c, -0x8fb50038, 0x8fb30034, 0x8fb20030, 0x8fb1002c, -0x8fb00028, 0x3e00008, 0x27bd0048, 0xaf400104, +0x431025, 0xac820038, 0x8f840054, 0x41442, +0x41c82, 0x431021, 0x41cc2, 0x431023, +0x41d02, 0x431021, 0x41d42, 0x431023, +0x10000009, 0xaf420208, 0x3c040001, 0x24846250, +0x34a51000, 0x2003021, 0x3821, 0xafa00010, +0xc002b3b, 0xafa00014, 0x8f4202a0, 0x24420001, +0xaf4202a0, 0x1000021f, 0x8f4202a0, 0x27b00028, +0x2002021, 0x24050210, 0xc002bbf, 0x24060008, +0xc002518, 0x2002021, 0x10000216, 0x0, +0x8faa0034, 0x27a40028, 0xa1880, 0x25420001, +0x3042003f, 0xafa20034, 0x8c650300, 0x8faa0034, +0x21080, 0x8c430300, 0x25420001, 0x3042003f, +0xafa20034, 0xac02022c, 0xafa50028, 0xc002518, +0xafa3002c, 0x10000203, 0x0, 0x27b00028, +0x2002021, 0x24050210, 0xc002bbf, 0x24060008, +0xc002657, 0x2002021, 0x100001fa, 0x0, +0x8faa0034, 0x27a40028, 0xa1880, 0x25420001, +0x3042003f, 0xafa20034, 0x8c650300, 0x8faa0034, +0x21080, 0x8c430300, 0x25420001, 0x3042003f, +0xafa20034, 0xac02022c, 0xafa50028, 0xc002657, +0xafa3002c, 0x100001e7, 0x0, 0x101302, +0x30430fff, 0x24020001, 0x10620005, 0x24020002, +0x1062001e, 0x3c020002, 0x10000033, 0x3c050003, +0x3c030002, 0x2c31024, 0x54400037, 0x2c3b025, +0x8f820228, 0x3c010001, 0x370821, 0xac2238d8, +0x8f82022c, 0x3c010001, 0x370821, 0xac2238dc, +0x8f820230, 0x3c010001, 0x370821, 0xac2238e0, +0x8f820234, 0x3c010001, 0x370821, 0xac2238e4, +0x2402ffff, 0xaf820228, 0xaf82022c, 0xaf820230, +0xaf820234, 0x10000020, 0x2c3b025, 0x2c21024, +0x10400012, 0x3c02fffd, 0x3c020001, 0x571021, +0x8c4238d8, 0xaf820228, 0x3c020001, 0x571021, +0x8c4238dc, 0xaf82022c, 0x3c020001, 0x571021, +0x8c4238e0, 0xaf820230, 0x3c020001, 0x571021, +0x8c4238e4, 0xaf820234, 0x3c02fffd, 0x3442ffff, +0x10000009, 0x2c2b024, 0x3c040001, 0x2484625c, +0x34a51100, 0x2003021, 0x3821, 0xafa00010, +0xc002b3b, 0xafa00014, 0x8f4202cc, 0x24420001, +0xaf4202cc, 0x1000019f, 0x8f4202cc, 0x101302, +0x30450fff, 0x24020001, 0x10a20005, 0x24020002, +0x10a2000d, 0x3c0408ff, 0x10000014, 0x3c050003, +0x3c0208ff, 0x3442ffff, 0x8f830220, 0x3c040004, +0x2c4b025, 0x621824, 0x34630008, 0xaf830220, +0x10000012, 0xaf450298, 0x3484fff7, 0x3c03fffb, +0x8f820220, 0x3463ffff, 0x2c3b024, 0x441024, +0xaf820220, 0x10000009, 0xaf450298, 0x3c040001, +0x24846268, 0x34a51200, 0x2003021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x8f4202bc, +0x24420001, 0xaf4202bc, 0x10000176, 0x8f4202bc, +0x27840208, 0x24050200, 0xc002bbf, 0x24060008, +0x27440224, 0x24050200, 0xc002bbf, 0x24060008, +0x8f4202c4, 0x24420001, 0xaf4202c4, 0x10000169, +0x8f4202c4, 0x101302, 0x30430fff, 0x24020001, +0x10620011, 0x28620002, 0x50400005, 0x24020002, +0x10600007, 0x0, 0x10000017, 0x0, +0x1062000f, 0x0, 0x10000013, 0x0, +0x8c060248, 0x2021, 0xc005104, 0x24050004, +0x10000007, 0x0, 0x8c060248, 0x2021, +0xc005104, 0x24050004, 0x10000010, 0x0, +0x8c06024c, 0x2021, 0xc005104, 0x24050001, +0x1000000a, 0x0, 0x3c040001, 0x24846274, +0x3c050003, 0x34a51300, 0x2003021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x8f4202c0, +0x24420001, 0xaf4202c0, 0x1000013a, 0x8f4202c0, +0xc002426, 0x0, 0x10000136, 0x0, +0x24020001, 0xa34205c5, 0x24100100, 0x8f4401a8, +0x8f4501ac, 0xafb00010, 0xafa00014, 0x8f420014, +0xafa20018, 0x8f420108, 0x26e60028, 0x40f809, +0x24070400, 0x1040fff5, 0x0, 0x10000125, +0x0, 0x3c03ffff, 0x34637fff, 0x8f420368, +0x8f440360, 0x2c3b024, 0x1821, 0xaf400058, +0xaf40005c, 0xaf400060, 0xaf400064, 0x441023, +0xaf420368, 0x3c020900, 0xaf400360, 0xafa20020, +0x8f5e0018, 0x27aa0020, 0x240200ff, 0x13c20002, +0xafaa003c, 0x27c30001, 0x8c020228, 0x609021, +0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, +0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, +0x2484620c, 0x3c050009, 0xafa00014, 0xafa20010, +0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, +0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, +0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, +0x2c4203e9, 0x1040001b, 0x9821, 0xe08821, +0x263504c0, 0x8f440178, 0x8f45017c, 0x2201821, +0x240a0004, 0xafaa0010, 0xafb20014, 0x8f48000c, +0x1021, 0x2f53021, 0xafa80018, 0x8f48010c, +0x24070008, 0xa32821, 0xa3482b, 0x822021, +0x100f809, 0x892021, 0x54400006, 0x24130001, +0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffe9, +0x0, 0x326200ff, 0x54400017, 0xaf520018, +0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, +0x8f820120, 0x8faa003c, 0xafa20010, 0x8f820124, +0x3c040001, 0x24846218, 0x3c050009, 0xafa20014, +0x8d460000, 0x10000033, 0x34a50600, 0x8f420308, +0x24130001, 0x24420001, 0xaf420308, 0x8f420308, +0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, +0x247003e8, 0x2021023, 0x2c4203e9, 0x10400014, +0x9821, 0x24110010, 0x8f42000c, 0x8f440160, +0x8f450164, 0x8f860120, 0xafb10010, 0xafb20014, +0xafa20018, 0x8f42010c, 0x24070008, 0x40f809, +0x24c6001c, 0x1440ffe5, 0x0, 0x8f820054, +0x2021023, 0x2c4203e9, 0x1440ffef, 0x0, +0x326200ff, 0x14400011, 0x0, 0x8f420378, +0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, +0x8faa003c, 0xafa20010, 0x8f820124, 0x3c040001, +0x24846220, 0x3c050009, 0xafa20014, 0x8d460000, +0x34a50700, 0xc002b3b, 0x3c03821, 0x8f4202b0, +0x24420001, 0xaf4202b0, 0x8f4202b0, 0x8f4202f8, +0x24420001, 0xaf4202f8, 0x1000008a, 0x8f4202f8, +0x8c02025c, 0x27440224, 0xaf4201f0, 0x8c020260, +0x24050200, 0x24060008, 0xc002bbf, 0xaf4201f8, +0x8f820220, 0x30420008, 0x14400002, 0x24020001, +0x24020002, 0xaf420298, 0x8f4202ac, 0x24420001, +0xaf4202ac, 0x10000077, 0x8f4202ac, 0x3c0200ff, +0x3442ffff, 0x2021824, 0x32c20180, 0x14400006, +0x3402fffb, 0x43102b, 0x14400003, 0x0, +0x1000006c, 0xaf4300bc, 0x3c040001, 0x24846280, +0x3c050003, 0x34a51500, 0x2003021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x3c020700, +0x34421000, 0x101e02, 0x621825, 0xafa30020, +0x8f510018, 0x240200ff, 0x12220002, 0x8021, +0x26300001, 0x8c020228, 0x1602000e, 0x1130c0, +0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, +0x8c020228, 0x3c040001, 0x248461f4, 0x3c050009, +0xafa00014, 0xafa20010, 0x8fa60020, 0x1000003f, +0x34a50100, 0xd71021, 0x8fa30020, 0x8fa40024, +0xac4304c0, 0xac4404c4, 0xc01821, 0x8f440178, +0x8f45017c, 0x1021, 0x24070004, 0xafa70010, +0xafb00014, 0x8f48000c, 0x24c604c0, 0x2e63021, +0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, +0xa3482b, 0x822021, 0x100f809, 0x892021, +0x1440000b, 0x24070008, 0x8f820120, 0xafa20010, +0x8f820124, 0x3c040001, 0x248461fc, 0x3c050009, +0xafa20014, 0x8fa60020, 0x1000001c, 0x34a50200, +0x8f440160, 0x8f450164, 0x8f43000c, 0xaf500018, +0x8f860120, 0x24020010, 0xafa20010, 0xafb00014, +0xafa30018, 0x8f42010c, 0x40f809, 0x24c6001c, +0x14400010, 0x0, 0x8f420340, 0x24420001, +0xaf420340, 0x8f420340, 0x8f820120, 0xafa20010, +0x8f820124, 0x3c040001, 0x24846204, 0x3c050009, +0xafa20014, 0x8fa60020, 0x34a50300, 0xc002b3b, +0x2203821, 0x8f4202e0, 0x24420001, 0xaf4202e0, +0x8f4202e0, 0x8f4202f0, 0x24420001, 0xaf4202f0, +0x8f4202f0, 0x8fa20034, 0x8fbf0058, 0x8fbe0054, +0x8fb50050, 0x8fb3004c, 0x8fb20048, 0x8fb10044, +0x8fb00040, 0x3e00008, 0x27bd0060, 0x27bdfff8, +0x2408ffff, 0x10a00014, 0x4821, 0x3c0aedb8, +0x354a8320, 0x90870000, 0x24840001, 0x3021, +0x1071026, 0x30420001, 0x10400002, 0x81842, +0x6a1826, 0x604021, 0x24c60001, 0x2cc20008, +0x1440fff7, 0x73842, 0x25290001, 0x125102b, +0x1440fff0, 0x0, 0x1001021, 0x3e00008, +0x27bd0008, 0x27bdffb0, 0xafbf0048, 0xafbe0044, +0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, +0xafb00030, 0x8f870220, 0xafa70024, 0x8f870200, +0xafa7002c, 0x8f820220, 0x3c0308ff, 0x3463ffff, +0x431024, 0x34420004, 0xaf820220, 0x8f820200, +0x3c03c0ff, 0x3463ffff, 0x431024, 0x34420004, +0xaf820200, 0x8f530358, 0x8f55035c, 0x8f5e0360, +0x8f470364, 0xafa70014, 0x8f470368, 0xafa7001c, +0x8f4202d0, 0x274401c0, 0x24420001, 0xaf4202d0, +0x8f5002d0, 0x8f510204, 0x8f520200, 0xc002ba8, +0x24050400, 0xaf530358, 0xaf55035c, 0xaf5e0360, +0x8fa70014, 0xaf470364, 0x8fa7001c, 0xaf470368, +0xaf5002d0, 0xaf510204, 0xaf520200, 0x8c02025c, +0x27440224, 0xaf4201f0, 0x8c020260, 0x24050200, +0x24060008, 0xaf4201f8, 0x24020006, 0xc002bbf, +0xaf4201f4, 0x3c023b9a, 0x3442ca00, 0xaf4201fc, +0x240203e8, 0x24040002, 0x24030001, 0xaf420294, +0xaf440290, 0xaf43029c, 0x8f820220, 0x30420008, +0x10400004, 0x0, 0xaf430298, 0x10000003, +0x3021, 0xaf440298, 0x3021, 0x3c030001, +0x661821, 0x90636d00, 0x3461021, 0x24c60001, +0xa043022c, 0x2cc2000f, 0x1440fff8, 0x3461821, +0x24c60001, 0x8f820040, 0x24040080, 0x24050080, +0x21702, 0x24420030, 0xa062022c, 0x3461021, +0xc002ba8, 0xa040022c, 0x8fa70024, 0x30e20004, +0x14400006, 0x0, 0x8f820220, 0x3c0308ff, +0x3463fffb, 0x431024, 0xaf820220, 0x8fa7002c, +0x30e20004, 0x14400006, 0x0, 0x8f820200, +0x3c03c0ff, 0x3463fffb, 0x431024, 0xaf820200, +0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, +0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, +0x27bd0050, 0x0, 0x0, 0xaf400104, 0x24040001, 0x410c0, 0x2e21821, 0x24820001, 0x3c010001, 0x230821, 0xa42234d0, 0x402021, 0x2c820080, 0x1440fff8, 0x410c0, 0x24020001, @@ -5712,7 +5950,7 @@ 0x2c450001, 0xa01021, 0x14400009, 0x24840008, 0x86102b, 0x1440fff0, 0x1021, 0x304200ff, 0x14400030, 0x24020001, 0x1000002e, 0x1021, -0x1000fffa, 0x24020001, 0x2002021, 0xc00229a, +0x1000fffa, 0x24020001, 0x2002021, 0xc00240c, 0x24050006, 0x3042007f, 0x218c0, 0x2e31021, 0x3c010001, 0x220821, 0x942230d0, 0x1040fff2, 0x2e31021, 0x3c060001, 0xc23021, 0x94c630d0, @@ -5727,7 +5965,7 @@ 0x27bd0018, 0x3e00008, 0x0, 0x27bdffb0, 0x801021, 0xafb00030, 0x24500002, 0x2002021, 0x24050006, 0xafb10034, 0x408821, 0xafbf0048, -0xafbe0044, 0xafb50040, 0xafb3003c, 0xc00229a, +0xafbe0044, 0xafb50040, 0xafb3003c, 0xc00240c, 0xafb20038, 0x3047007f, 0x710c0, 0x2e21021, 0x3c050001, 0xa22821, 0x94a530d0, 0x50a0001c, 0xa03021, 0x3c090001, 0x352934d2, 0x96280002, @@ -5740,15 +5978,15 @@ 0x10c00014, 0x610c0, 0x571821, 0x3c010001, 0x230821, 0x8c2334d0, 0x571021, 0xafa30010, 0x3c010001, 0x220821, 0x8c2234d4, 0x3c040001, -0x248434b4, 0xafa20014, 0x8e260000, 0x8e270004, -0x3c050004, 0xc002a03, 0x34a50400, 0x10000063, +0x24846394, 0xafa20014, 0x8e260000, 0x8e270004, +0x3c050004, 0xc002b3b, 0x34a50400, 0x10000063, 0x3c020800, 0x8f450100, 0x10a00006, 0x510c0, 0x2e21021, 0x3c010001, 0x220821, 0x942234d0, 0xaf420100, 0xa03021, 0x14c00011, 0x628c0, 0x710c0, 0x2e21021, 0xafa70010, 0x3c010001, -0x220821, 0x942230d0, 0x3c040001, 0x248434c0, +0x220821, 0x942230d0, 0x3c040001, 0x248463a0, 0xafa20014, 0x8e260000, 0x8e270004, 0x3c050004, -0xc002a03, 0x34a50500, 0x10000048, 0x3c020800, +0xc002b3b, 0x34a50500, 0x10000048, 0x3c020800, 0xb71821, 0x3c020001, 0x96040000, 0x344234d2, 0x621821, 0xa4640000, 0x8e020002, 0x720c0, 0xac620002, 0x2e41021, 0x3c030001, 0x621821, @@ -5770,44 +6008,44 @@ 0x1821, 0xafa20020, 0x8f5e0018, 0x27aa0020, 0x240200ff, 0x13c20002, 0xafaa002c, 0x27c30001, 0x8c020228, 0x609021, 0x1642000e, 0x1e38c0, -0x8f42032c, 0x24420001, 0xaf42032c, 0x8f42032c, -0x8c020228, 0x3c040001, 0x2484347c, 0x3c050009, +0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, +0x8c020228, 0x3c040001, 0x2484635c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 0x1040001b, -0x9821, 0xe08821, 0x263504c0, 0x8f440168, -0x8f45016c, 0x2201821, 0x240a0004, 0xafaa0010, +0x9821, 0xe08821, 0x263504c0, 0x8f440178, +0x8f45017c, 0x2201821, 0x240a0004, 0xafaa0010, 0xafb20014, 0x8f48000c, 0x1021, 0x2f53021, 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x54400006, 0x24130001, 0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffe9, 0x0, 0x326200ff, -0x54400017, 0xaf520018, 0x8f420368, 0x24420001, -0xaf420368, 0x8f420368, 0x8f820120, 0x8faa002c, -0xafa20010, 0x8f820124, 0x3c040001, 0x24843488, +0x54400017, 0xaf520018, 0x8f420378, 0x24420001, +0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, +0xafa20010, 0x8f820124, 0x3c040001, 0x24846368, 0x3c050009, 0xafa20014, 0x8d460000, 0x10000033, -0x34a50600, 0x8f4202f8, 0x24130001, 0x24420001, -0xaf4202f8, 0x8f4202f8, 0x1000001c, 0x326200ff, +0x34a50600, 0x8f420308, 0x24130001, 0x24420001, +0xaf420308, 0x8f420308, 0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 0x10400014, 0x9821, 0x24110010, -0x8f42000c, 0x8f440150, 0x8f450154, 0x8f860120, +0x8f42000c, 0x8f440160, 0x8f450164, 0x8f860120, 0xafb10010, 0xafb20014, 0xafa20018, 0x8f42010c, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe5, 0x0, 0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffef, 0x0, 0x326200ff, 0x14400011, -0x0, 0x8f420368, 0x24420001, 0xaf420368, -0x8f420368, 0x8f820120, 0x8faa002c, 0xafa20010, -0x8f820124, 0x3c040001, 0x24843490, 0x3c050009, -0xafa20014, 0x8d460000, 0x34a50700, 0xc002a03, -0x3c03821, 0x8f4202a4, 0x24420001, 0xaf4202a4, -0x8f4202a4, 0x8f4202e4, 0x24420001, 0xaf4202e4, -0x8f4202e4, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, +0x0, 0x8f420378, 0x24420001, 0xaf420378, +0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, +0x8f820124, 0x3c040001, 0x24846370, 0x3c050009, +0xafa20014, 0x8d460000, 0x34a50700, 0xc002b3b, +0x3c03821, 0x8f4202b4, 0x24420001, 0xaf4202b4, +0x8f4202b4, 0x8f4202f4, 0x24420001, 0xaf4202f4, +0x8f4202f4, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 0x27bd0050, 0x27bdffa0, 0x801021, 0xafb00040, 0x24500002, 0x2002021, 0x24050006, 0xafb10044, 0x408821, 0xafbf0058, 0xafbe0054, -0xafb50050, 0xafb3004c, 0xc00229a, 0xafb20048, +0xafb50050, 0xafb3004c, 0xc00240c, 0xafb20048, 0x3048007f, 0x810c0, 0x2e21021, 0x3c060001, 0xc23021, 0x94c630d0, 0x10c0001c, 0x3821, 0x3c0a0001, 0x354a34d2, 0x96290002, 0x610c0, @@ -5819,8 +6057,8 @@ 0x94c634d0, 0x14c0ffea, 0x610c0, 0x14c00011, 0xafa70028, 0x810c0, 0x2e21021, 0xafa80010, 0x3c010001, 0x220821, 0x942230d0, 0x3c040001, -0x248434cc, 0xafa20014, 0x8e260000, 0x8e270004, -0x3c050004, 0xc002a03, 0x34a50900, 0x10000075, +0x248463ac, 0xafa20014, 0x8e260000, 0x8e270004, +0x3c050004, 0xc002b3b, 0x34a50900, 0x10000075, 0x3c020800, 0x10e0000c, 0x610c0, 0x2e21021, 0x3c030001, 0x621821, 0x946334d0, 0x710c0, 0x2e21021, 0x3c010001, 0x220821, 0xa42334d0, @@ -5853,43 +6091,43 @@ 0x3c020800, 0x34422000, 0x1821, 0xafa20020, 0x8f5e0018, 0x27ab0020, 0x240200ff, 0x13c20002, 0xafab0034, 0x27c30001, 0x8c020228, 0x609021, -0x1642000e, 0x1e38c0, 0x8f42032c, 0x24420001, -0xaf42032c, 0x8f42032c, 0x8c020228, 0x3c040001, -0x2484347c, 0x3c050009, 0xafa00014, 0xafa20010, +0x1642000e, 0x1e38c0, 0x8f42033c, 0x24420001, +0xaf42033c, 0x8f42033c, 0x8c020228, 0x3c040001, +0x2484635c, 0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006b, 0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 0x1040001b, 0x9821, 0xe08821, -0x263504c0, 0x8f440168, 0x8f45016c, 0x2201821, +0x263504c0, 0x8f440178, 0x8f45017c, 0x2201821, 0x240b0004, 0xafab0010, 0xafb20014, 0x8f48000c, 0x1021, 0x2f53021, 0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, 0xa3482b, 0x822021, 0x100f809, 0x892021, 0x54400006, 0x24130001, 0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffe9, 0x0, 0x326200ff, 0x54400017, 0xaf520018, -0x8f420368, 0x24420001, 0xaf420368, 0x8f420368, +0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8fab0034, 0xafa20010, 0x8f820124, -0x3c040001, 0x24843488, 0x3c050009, 0xafa20014, -0x8d660000, 0x10000033, 0x34a50600, 0x8f4202f8, -0x24130001, 0x24420001, 0xaf4202f8, 0x8f4202f8, +0x3c040001, 0x24846368, 0x3c050009, 0xafa20014, +0x8d660000, 0x10000033, 0x34a50600, 0x8f420308, +0x24130001, 0x24420001, 0xaf420308, 0x8f420308, 0x1000001c, 0x326200ff, 0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, 0x10400014, -0x9821, 0x24110010, 0x8f42000c, 0x8f440150, -0x8f450154, 0x8f860120, 0xafb10010, 0xafb20014, +0x9821, 0x24110010, 0x8f42000c, 0x8f440160, +0x8f450164, 0x8f860120, 0xafb10010, 0xafb20014, 0xafa20018, 0x8f42010c, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe5, 0x0, 0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffef, 0x0, -0x326200ff, 0x14400011, 0x0, 0x8f420368, -0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, +0x326200ff, 0x14400011, 0x0, 0x8f420378, +0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8fab0034, 0xafa20010, 0x8f820124, 0x3c040001, -0x24843490, 0x3c050009, 0xafa20014, 0x8d660000, -0x34a50700, 0xc002a03, 0x3c03821, 0x8f4202a8, -0x24420001, 0xaf4202a8, 0x8f4202a8, 0x8f4202e4, -0x24420001, 0xaf4202e4, 0x8f4202e4, 0x8fbf0058, +0x24846370, 0x3c050009, 0xafa20014, 0x8d660000, +0x34a50700, 0xc002b3b, 0x3c03821, 0x8f4202b8, +0x24420001, 0xaf4202b8, 0x8f4202b8, 0x8f4202f4, +0x24420001, 0xaf4202f4, 0x8f4202f4, 0x8fbf0058, 0x8fbe0054, 0x8fb50050, 0x8fb3004c, 0x8fb20048, 0x8fb10044, 0x8fb00040, 0x3e00008, 0x27bd0060, 0x0, 0x0, 0x0, 0x27bdffe0, -0x27644000, 0xafbf0018, 0xc002a70, 0x24051000, +0x27644000, 0xafbf0018, 0xc002ba8, 0x24051000, 0x3c030001, 0x34632cc0, 0x3c040001, 0x34842ec8, 0x24020020, 0xaf82011c, 0x2e31021, 0xaf800100, 0xaf800104, 0xaf800108, 0xaf800110, 0xaf800114, @@ -5898,21 +6136,21 @@ 0x2e31021, 0xaf4200f0, 0x2e41021, 0xaf4200f4, 0x2e41021, 0xaf4200f8, 0x3c020001, 0x571021, 0x904240f4, 0x1440001c, 0x3c050001, 0x8f82011c, -0x3c040001, 0x24843590, 0x3c050001, 0x34420001, +0x3c040001, 0x24846470, 0x3c050001, 0x34420001, 0xaf82011c, 0xafa00010, 0xafa00014, 0x8f86011c, -0x34a50100, 0xc002a03, 0x3821, 0x8c020218, +0x34a50100, 0xc002b3b, 0x3821, 0x8c020218, 0x30420040, 0x10400014, 0x0, 0x8f82011c, -0x3c040001, 0x2484359c, 0x3c050001, 0x34420004, +0x3c040001, 0x2484647c, 0x3c050001, 0x34420004, 0xaf82011c, 0xafa00010, 0xafa00014, 0x8f86011c, -0x10000007, 0x34a50200, 0x3c040001, 0x248435a4, +0x10000007, 0x34a50200, 0x3c040001, 0x24846484, 0xafa00010, 0xafa00014, 0x8f86011c, 0x34a50300, -0xc002a03, 0x3821, 0x8fbf0018, 0x3e00008, +0xc002b3b, 0x3821, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x8fa90010, 0x8f83012c, 0x8faa0014, 0x8fab0018, 0x1060000a, 0x27624fe0, 0x14620002, 0x24680020, 0x27684800, 0x8f820128, 0x11020004, 0x0, 0x8f820124, 0x15020007, 0x0, -0x8f430324, 0x1021, 0x24630001, 0xaf430324, -0x10000039, 0x8f430324, 0xac640000, 0xac650004, +0x8f430334, 0x1021, 0x24630001, 0xaf430334, +0x10000039, 0x8f430334, 0xac640000, 0xac650004, 0xac660008, 0xa467000e, 0xac690018, 0xac6a001c, 0xac6b0010, 0xac620014, 0xaf880120, 0x8f4200fc, 0x8f4400f4, 0x2442ffff, 0xaf4200fc, 0x8c820000, @@ -5927,237 +6165,221 @@ 0x24820008, 0x3c020001, 0x34422ec8, 0x2e21021, 0x402021, 0x24020001, 0xaf4400f4, 0xac890000, 0xac820004, 0x24020001, 0x3e00008, 0x0, -0x3e00008, 0x0, 0x8fa90010, 0x8faa0014, -0x8f830120, 0x8fab0018, 0x27624fe0, 0x14620002, -0x24680020, 0x27684800, 0x8f820128, 0x1102000f, -0x24620016, 0xac640000, 0xac650004, 0xac660008, -0xa467000e, 0xac690018, 0xac6a001c, 0xac620014, -0xac6b0010, 0xaf880120, 0x8f4300fc, 0x24020001, -0x2463ffff, 0x10000006, 0xaf4300fc, 0x8f430324, -0x1021, 0x24630001, 0xaf430324, 0x8f430324, -0x3e00008, 0x0, 0x3e00008, 0x0, -0x8fa90010, 0x8f83010c, 0x8faa0014, 0x8fab0018, -0x1060000a, 0x276247e0, 0x14620002, 0x24680020, -0x27684000, 0x8f820108, 0x11020004, 0x0, -0x8f820104, 0x15020007, 0x0, 0x8f430328, -0x1021, 0x24630001, 0xaf430328, 0x10000035, -0x8f430328, 0xac640000, 0xac650004, 0xac660008, -0xa467000e, 0xac690018, 0xac6a001c, 0xac6b0010, -0xac620014, 0xaf880100, 0x8f4400ec, 0x8c820000, -0x30420006, 0x10400019, 0x31220006, 0x10400018, -0x3c020001, 0x8c830004, 0x2c620010, 0x10400013, -0x3c020001, 0x24630001, 0xac830004, 0x8f4300f0, -0x34422ec0, 0x2e21021, 0x54620004, 0x24620008, -0x3c020001, 0x34422cc0, 0x2e21021, 0x14440015, -0x24020001, 0x8f820108, 0x24420020, 0xaf820108, -0x8f820108, 0x1000000f, 0x24020001, 0x3c020001, -0x34422ec0, 0x2e21021, 0x54820004, 0x24820008, -0x3c020001, 0x34422cc0, 0x2e21021, 0x402021, -0x24020001, 0xaf4400ec, 0xac890000, 0xac820004, -0x24020001, 0x3e00008, 0x0, 0x3e00008, -0x0, 0x8fa30010, 0x8faa0014, 0x8f880100, -0x8fab0018, 0x276247e0, 0x15020002, 0x25090020, -0x27694000, 0x8f820108, 0x1122000d, 0x0, -0xad030018, 0x25030016, 0xad040000, 0xad050004, -0xad060008, 0xa507000e, 0xad0a001c, 0xad030014, -0xad0b0010, 0xaf890100, 0x10000006, 0x24020001, -0x8f430328, 0x1021, 0x24630001, 0xaf430328, -0x8f430328, 0x3e00008, 0x0, 0x3e00008, -0x0, 0x27bdffd8, 0x3c040001, 0x248435ac, -0x3c050001, 0xafbf0024, 0xafb20020, 0xafb1001c, -0xafb00018, 0x8f900104, 0x8f9100b0, 0x8f92011c, -0x34a52500, 0x8f820100, 0x2403021, 0x2203821, -0xafa20010, 0xc002a03, 0xafb00014, 0x8e020008, -0xafa20010, 0x8e02000c, 0x3c040001, 0x248435b8, -0xafa20014, 0x8e060000, 0x8e070004, 0x3c050001, -0xc002a03, 0x34a52510, 0x8e020018, 0xafa20010, -0x8e02001c, 0x3c040001, 0x248435c4, 0xafa20014, -0x8e060010, 0x8e070014, 0x3c050001, 0xc002a03, -0x34a52520, 0x3c027f00, 0x2221024, 0x3c030800, -0x54430016, 0x3c030200, 0x8f82009c, 0x3042ffff, -0x14400012, 0x3c030200, 0x3c040001, 0x248435d0, -0x3c050002, 0x34a5f030, 0x3021, 0x3821, -0x36420002, 0xaf82011c, 0x36220001, 0xaf8200b0, -0xaf900104, 0xaf92011c, 0xafa00010, 0xc002a03, -0xafa00014, 0x10000024, 0x0, 0x2c31024, -0x1040000d, 0x2231024, 0x1040000b, 0x36420002, -0xaf82011c, 0x36220001, 0xaf8200b0, 0xaf900104, -0xaf92011c, 0x8f420320, 0x24420001, 0xaf420320, -0x10000015, 0x8f420320, 0x3c040001, 0x248435d8, -0x240202a2, 0xafa20010, 0xafa00014, 0x8f860144, -0x3c070001, 0x24e735e0, 0xc002a03, 0x3405dead, -0x8f82011c, 0x34420002, 0xaf82011c, 0x8f820220, -0x34420004, 0xaf820220, 0x8f820140, 0x3c030001, -0x431025, 0xaf820140, 0x8fbf0024, 0x8fb20020, -0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0028, -0x27bdffd8, 0x3c040001, 0x24843608, 0x3c050001, -0xafbf0024, 0xafb20020, 0xafb1001c, 0xafb00018, -0x8f900124, 0x8f9100a0, 0x8f92011c, 0x34a52600, -0x8f820120, 0x2403021, 0x2203821, 0xafa20010, -0xc002a03, 0xafb00014, 0x8e020008, 0xafa20010, -0x8e02000c, 0x3c040001, 0x24843614, 0xafa20014, -0x8e060000, 0x8e070004, 0x3c050001, 0xc002a03, -0x34a52610, 0x8e020018, 0xafa20010, 0x8e02001c, -0x3c040001, 0x24843620, 0xafa20014, 0x8e060010, -0x8e070014, 0x3c050001, 0xc002a03, 0x34a52620, -0x3c027f00, 0x2221024, 0x3c030800, 0x54430016, -0x3c030200, 0x8f8200ac, 0x3042ffff, 0x14400012, -0x3c030200, 0x3c040001, 0x2484362c, 0x3c050001, -0x34a5f030, 0x3021, 0x3821, 0x36420002, -0xaf82011c, 0x36220001, 0xaf8200a0, 0xaf900124, -0xaf92011c, 0xafa00010, 0xc002a03, 0xafa00014, -0x10000024, 0x0, 0x2c31024, 0x1040000d, -0x2231024, 0x1040000b, 0x36420002, 0xaf82011c, -0x36220001, 0xaf8200a0, 0xaf900124, 0xaf92011c, -0x8f42031c, 0x24420001, 0xaf42031c, 0x10000015, -0x8f42031c, 0x3c040001, 0x248435d8, 0x240202db, -0xafa20010, 0xafa00014, 0x8f860144, 0x3c070001, -0x24e735e0, 0xc002a03, 0x3405dead, 0x8f82011c, -0x34420002, 0xaf82011c, 0x8f820220, 0x34420004, -0xaf820220, 0x8f820140, 0x3c030001, 0x431025, -0xaf820140, 0x8fbf0024, 0x8fb20020, 0x8fb1001c, -0x8fb00018, 0x3e00008, 0x27bd0028, 0x6021, -0x5021, 0x3021, 0x2821, 0x6821, -0x4821, 0x7821, 0x7021, 0x8f880124, -0x8f870104, 0x1580002e, 0x8f8b011c, 0x11a00014, -0x31620800, 0x8f820120, 0x10460029, 0x0, -0x3c040001, 0x8c843f30, 0x8cc20000, 0x8cc30004, +0x3e00008, 0x0, 0x8fa90010, 0x8f83010c, +0x8faa0014, 0x8fab0018, 0x1060000a, 0x276247e0, +0x14620002, 0x24680020, 0x27684000, 0x8f820108, +0x11020004, 0x0, 0x8f820104, 0x15020007, +0x0, 0x8f430338, 0x1021, 0x24630001, +0xaf430338, 0x10000035, 0x8f430338, 0xac640000, +0xac650004, 0xac660008, 0xa467000e, 0xac690018, +0xac6a001c, 0xac6b0010, 0xac620014, 0xaf880100, +0x8f4400ec, 0x8c820000, 0x30420006, 0x10400019, +0x31220006, 0x10400018, 0x3c020001, 0x8c830004, +0x2c620010, 0x10400013, 0x3c020001, 0x24630001, +0xac830004, 0x8f4300f0, 0x34422ec0, 0x2e21021, +0x54620004, 0x24620008, 0x3c020001, 0x34422cc0, +0x2e21021, 0x14440015, 0x24020001, 0x8f820108, +0x24420020, 0xaf820108, 0x8f820108, 0x1000000f, +0x24020001, 0x3c020001, 0x34422ec0, 0x2e21021, +0x54820004, 0x24820008, 0x3c020001, 0x34422cc0, +0x2e21021, 0x402021, 0x24020001, 0xaf4400ec, +0xac890000, 0xac820004, 0x24020001, 0x3e00008, +0x0, 0x3e00008, 0x0, 0x27bdffd8, +0x3c040001, 0x2484648c, 0x3c050001, 0xafbf0024, +0xafb20020, 0xafb1001c, 0xafb00018, 0x8f900104, +0x8f9100b0, 0x8f92011c, 0x34a52500, 0x8f820100, +0x2403021, 0x2203821, 0xafa20010, 0xc002b3b, +0xafb00014, 0x8e020008, 0xafa20010, 0x8e02000c, +0x3c040001, 0x24846498, 0xafa20014, 0x8e060000, +0x8e070004, 0x3c050001, 0xc002b3b, 0x34a52510, +0x8e020018, 0xafa20010, 0x8e02001c, 0x3c040001, +0x248464a4, 0xafa20014, 0x8e060010, 0x8e070014, +0x3c050001, 0xc002b3b, 0x34a52520, 0x3c027f00, +0x2221024, 0x3c030800, 0x54430016, 0x3c030200, +0x8f82009c, 0x3042ffff, 0x14400012, 0x3c030200, +0x3c040001, 0x248464b0, 0x3c050002, 0x34a5f030, +0x3021, 0x3821, 0x36420002, 0xaf82011c, +0x36220001, 0xaf8200b0, 0xaf900104, 0xaf92011c, +0xafa00010, 0xc002b3b, 0xafa00014, 0x10000024, +0x0, 0x2c31024, 0x1040000d, 0x2231024, +0x1040000b, 0x36420002, 0xaf82011c, 0x36220001, +0xaf8200b0, 0xaf900104, 0xaf92011c, 0x8f420330, +0x24420001, 0xaf420330, 0x10000015, 0x8f420330, +0x3c040001, 0x248464b8, 0x240202a9, 0xafa20010, +0xafa00014, 0x8f860144, 0x3c070001, 0x24e764c0, +0xc002b3b, 0x3405dead, 0x8f82011c, 0x34420002, +0xaf82011c, 0x8f820220, 0x34420004, 0xaf820220, +0x8f820140, 0x3c030001, 0x431025, 0xaf820140, +0x8fbf0024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, +0x3e00008, 0x27bd0028, 0x27bdffd8, 0x3c040001, +0x248464e8, 0x3c050001, 0xafbf0024, 0xafb20020, +0xafb1001c, 0xafb00018, 0x8f900124, 0x8f9100a0, +0x8f92011c, 0x34a52600, 0x8f820120, 0x2403021, +0x2203821, 0xafa20010, 0xc002b3b, 0xafb00014, +0x8e020008, 0xafa20010, 0x8e02000c, 0x3c040001, +0x248464f4, 0xafa20014, 0x8e060000, 0x8e070004, +0x3c050001, 0xc002b3b, 0x34a52610, 0x8e020018, +0xafa20010, 0x8e02001c, 0x3c040001, 0x24846500, +0xafa20014, 0x8e060010, 0x8e070014, 0x3c050001, +0xc002b3b, 0x34a52620, 0x3c027f00, 0x2221024, +0x3c030800, 0x54430016, 0x3c030200, 0x8f8200ac, +0x3042ffff, 0x14400012, 0x3c030200, 0x3c040001, +0x2484650c, 0x3c050001, 0x34a5f030, 0x3021, +0x3821, 0x36420002, 0xaf82011c, 0x36220001, +0xaf8200a0, 0xaf900124, 0xaf92011c, 0xafa00010, +0xc002b3b, 0xafa00014, 0x10000024, 0x0, +0x2c31024, 0x1040000d, 0x2231024, 0x1040000b, +0x36420002, 0xaf82011c, 0x36220001, 0xaf8200a0, +0xaf900124, 0xaf92011c, 0x8f42032c, 0x24420001, +0xaf42032c, 0x10000015, 0x8f42032c, 0x3c040001, +0x248464b8, 0x240202e2, 0xafa20010, 0xafa00014, +0x8f860144, 0x3c070001, 0x24e764c0, 0xc002b3b, +0x3405dead, 0x8f82011c, 0x34420002, 0xaf82011c, +0x8f820220, 0x34420004, 0xaf820220, 0x8f820140, +0x3c030001, 0x431025, 0xaf820140, 0x8fbf0024, +0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, +0x27bd0028, 0x6021, 0x5021, 0x3021, +0x2821, 0x6821, 0x4821, 0x7821, +0x7021, 0x8f880124, 0x8f870104, 0x1580002e, +0x8f8b011c, 0x11a00014, 0x31620800, 0x8f820120, +0x10460029, 0x0, 0x3c040001, 0x8c846ee4, +0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004, +0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, +0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, +0x10000012, 0x24c60020, 0x10400017, 0x0, +0x3c040001, 0x8c846ee4, 0x8d020000, 0x8d030004, +0xac820000, 0xac830004, 0x8d020008, 0xac820008, +0x9502000e, 0xa482000e, 0x8d020010, 0x25060020, +0xac820010, 0x8d020014, 0x240c0001, 0xc01821, +0xac820014, 0x27624fe0, 0x43102b, 0x54400001, +0x27634800, 0x603021, 0x1540002f, 0x31620100, +0x11200014, 0x31628000, 0x8f820100, 0x1045002a, +0x31620100, 0x3c040001, 0x8c846ee0, 0x8ca20000, +0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008, +0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010, +0x240a0001, 0xac820010, 0x8ca20014, 0x10000012, +0x24a50020, 0x10400018, 0x31620100, 0x3c040001, +0x8c846ee0, 0x8ce20000, 0x8ce30004, 0xac820000, +0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, +0xa482000e, 0x8ce20010, 0x24e50020, 0xac820010, +0x8ce20014, 0x240a0001, 0xa01821, 0xac820014, +0x276247e0, 0x43102b, 0x54400001, 0x27634000, +0x602821, 0x31620100, 0x5440001d, 0x31621000, +0x11a00009, 0x31a20800, 0x10400004, 0x25020020, +0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, +0x8f880124, 0x6821, 0x11800011, 0x31621000, +0x3c040001, 0x8c846ee4, 0x8c820000, 0x8c830004, +0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, +0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021, +0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31621000, +0x1440ff82, 0x0, 0x1120000f, 0x31220800, +0x10400004, 0x3c020002, 0x8f8200b8, 0xa5c20000, +0x3c020002, 0x1221024, 0x10400004, 0x24e20020, +0x8f8200b4, 0xaf8200d4, 0x24e20020, 0xaf820104, +0x8f870104, 0x4821, 0x1140ff70, 0x0, +0x3c040001, 0x8c846ee0, 0x8c820000, 0x8c830004, +0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, +0x9482000e, 0xaf82009c, 0x8c820010, 0x5021, +0xaf8200b0, 0x8c890010, 0x1000ff60, 0x8c8e0014, +0x3e00008, 0x0, 0x6021, 0x5821, +0x3021, 0x2821, 0x6821, 0x5021, +0x7821, 0x7021, 0x8f880124, 0x8f870104, +0x3c180100, 0x1580002e, 0x8f89011c, 0x11a00014, +0x31220800, 0x8f820120, 0x10460029, 0x0, +0x3c040001, 0x8c846ee4, 0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004, 0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, 0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, 0x10000012, 0x24c60020, -0x10400017, 0x0, 0x3c040001, 0x8c843f30, +0x10400017, 0x0, 0x3c040001, 0x8c846ee4, 0x8d020000, 0x8d030004, 0xac820000, 0xac830004, 0x8d020008, 0xac820008, 0x9502000e, 0xa482000e, 0x8d020010, 0x25060020, 0xac820010, 0x8d020014, 0x240c0001, 0xc01821, 0xac820014, 0x27624fe0, 0x43102b, 0x54400001, 0x27634800, 0x603021, -0x1540002f, 0x31620100, 0x11200014, 0x31628000, -0x8f820100, 0x1045002a, 0x31620100, 0x3c040001, -0x8c843f2c, 0x8ca20000, 0x8ca30004, 0xac820000, +0x1560002f, 0x31220100, 0x11400014, 0x31228000, +0x8f820100, 0x1045002a, 0x31220100, 0x3c040001, +0x8c846ee0, 0x8ca20000, 0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008, 0xac820008, 0x94a2000e, -0xa482000e, 0x8ca20010, 0x240a0001, 0xac820010, +0xa482000e, 0x8ca20010, 0x240b0001, 0xac820010, 0x8ca20014, 0x10000012, 0x24a50020, 0x10400018, -0x31620100, 0x3c040001, 0x8c843f2c, 0x8ce20000, +0x31220100, 0x3c040001, 0x8c846ee0, 0x8ce20000, 0x8ce30004, 0xac820000, 0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, 0xa482000e, 0x8ce20010, -0x24e50020, 0xac820010, 0x8ce20014, 0x240a0001, +0x24e50020, 0xac820010, 0x8ce20014, 0x240b0001, 0xa01821, 0xac820014, 0x276247e0, 0x43102b, -0x54400001, 0x27634000, 0x602821, 0x31620100, -0x5440001d, 0x31621000, 0x11a00009, 0x31a20800, +0x54400001, 0x27634000, 0x602821, 0x31220100, +0x5440001d, 0x31221000, 0x11a00009, 0x31a20800, 0x10400004, 0x25020020, 0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, 0x8f880124, 0x6821, -0x11800011, 0x31621000, 0x3c040001, 0x8c843f30, +0x11800011, 0x31221000, 0x3c040001, 0x8c846ee4, 0x8c820000, 0x8c830004, 0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, 0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021, 0xaf8200a0, 0x8c8d0010, -0x8c8f0014, 0x31621000, 0x1440ff82, 0x0, -0x1120000f, 0x31220800, 0x10400004, 0x3c020002, -0x8f8200b8, 0xa5c20000, 0x3c020002, 0x1221024, +0x8c8f0014, 0x31221000, 0x14400022, 0x0, +0x1140000f, 0x31420800, 0x10400004, 0x3c020002, +0x8f8200b8, 0xa5c20000, 0x3c020002, 0x1421024, 0x10400004, 0x24e20020, 0x8f8200b4, 0xaf8200d4, -0x24e20020, 0xaf820104, 0x8f870104, 0x4821, -0x1140ff70, 0x0, 0x3c040001, 0x8c843f2c, +0x24e20020, 0xaf820104, 0x8f870104, 0x5021, +0x11600010, 0x0, 0x3c040001, 0x8c846ee0, 0x8c820000, 0x8c830004, 0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, 0x9482000e, 0xaf82009c, -0x8c820010, 0x5021, 0xaf8200b0, 0x8c890010, -0x1000ff60, 0x8c8e0014, 0x3e00008, 0x0, -0x6021, 0x5821, 0x3021, 0x2821, -0x6821, 0x5021, 0x7821, 0x7021, -0x8f880124, 0x8f870104, 0x3c180100, 0x1580002e, -0x8f89011c, 0x11a00014, 0x31220800, 0x8f820120, -0x10460029, 0x0, 0x3c040001, 0x8c843f30, -0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004, -0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, -0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, -0x10000012, 0x24c60020, 0x10400017, 0x0, -0x3c040001, 0x8c843f30, 0x8d020000, 0x8d030004, -0xac820000, 0xac830004, 0x8d020008, 0xac820008, -0x9502000e, 0xa482000e, 0x8d020010, 0x25060020, -0xac820010, 0x8d020014, 0x240c0001, 0xc01821, -0xac820014, 0x27624fe0, 0x43102b, 0x54400001, -0x27634800, 0x603021, 0x1560002f, 0x31220100, -0x11400014, 0x31228000, 0x8f820100, 0x1045002a, -0x31220100, 0x3c040001, 0x8c843f2c, 0x8ca20000, -0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008, -0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010, -0x240b0001, 0xac820010, 0x8ca20014, 0x10000012, -0x24a50020, 0x10400018, 0x31220100, 0x3c040001, -0x8c843f2c, 0x8ce20000, 0x8ce30004, 0xac820000, -0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, -0xa482000e, 0x8ce20010, 0x24e50020, 0xac820010, -0x8ce20014, 0x240b0001, 0xa01821, 0xac820014, -0x276247e0, 0x43102b, 0x54400001, 0x27634000, -0x602821, 0x31220100, 0x5440001d, 0x31221000, -0x11a00009, 0x31a20800, 0x10400004, 0x25020020, -0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, -0x8f880124, 0x6821, 0x11800011, 0x31221000, -0x3c040001, 0x8c843f30, 0x8c820000, 0x8c830004, -0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, -0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021, -0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31221000, -0x14400022, 0x0, 0x1140000f, 0x31420800, -0x10400004, 0x3c020002, 0x8f8200b8, 0xa5c20000, -0x3c020002, 0x1421024, 0x10400004, 0x24e20020, -0x8f8200b4, 0xaf8200d4, 0x24e20020, 0xaf820104, -0x8f870104, 0x5021, 0x11600010, 0x0, -0x3c040001, 0x8c843f2c, 0x8c820000, 0x8c830004, -0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, -0x9482000e, 0xaf82009c, 0x8c820010, 0x5821, -0xaf8200b0, 0x8c8a0010, 0x8c8e0014, 0x8f820070, -0x3c031000, 0x431024, 0x1040ff5c, 0x0, -0x8f820054, 0x24420005, 0xaf820078, 0x8c040234, -0x10800016, 0x1821, 0x3c020001, 0x571021, -0x8c4240e8, 0x24420005, 0x3c010001, 0x370821, -0xac2240e8, 0x3c020001, 0x571021, 0x8c4240e8, -0x44102b, 0x14400009, 0x24020001, 0x3c030080, -0x3c010001, 0x370821, 0xac2040e8, 0x3c010001, -0x370821, 0x1000000c, 0xa02240f0, 0x3c020001, -0x571021, 0x904240f0, 0x14400006, 0x3c020080, -0x3c020001, 0x571021, 0x904240f1, 0x10400002, -0x3c020080, 0x621825, 0x8c040230, 0x10800013, -0x0, 0x3c020001, 0x571021, 0x8c4240ec, -0x24420005, 0x3c010001, 0x370821, 0xac2240ec, -0x3c020001, 0x571021, 0x8c4240ec, 0x44102b, -0x14400006, 0x0, 0x3c010001, 0x370821, -0xac2040ec, 0x10000006, 0x781825, 0x3c020001, -0x571021, 0x904240f2, 0x54400001, 0x781825, -0x1060ff1a, 0x0, 0x8f420000, 0x10400007, -0x0, 0xaf80004c, 0x8f82004c, 0x1040fffd, -0x0, 0x10000005, 0x0, 0xaf800048, -0x8f820048, 0x1040fffd, 0x0, 0x8f820060, -0x431025, 0xaf820060, 0x8f420000, 0x10400003, -0x0, 0x1000ff05, 0xaf80004c, 0x1000ff03, -0xaf800048, 0x3e00008, 0x0, 0x3c020001, -0x8c423db8, 0x27bdffe8, 0xafbf0014, 0x14400012, -0xafb00010, 0x3c100001, 0x26103fd0, 0x2002021, -0xc002a70, 0x24052000, 0x26021fe0, 0x3c010001, -0xac223f38, 0x3c010001, 0xac223f34, 0xac020250, +0x8c820010, 0x5821, 0xaf8200b0, 0x8c8a0010, +0x8c8e0014, 0x8f820070, 0x3c031000, 0x431024, +0x1040ff5c, 0x0, 0x8f820054, 0x24420005, +0xaf820078, 0x8c040234, 0x10800016, 0x1821, +0x3c020001, 0x571021, 0x8c4240e8, 0x24420005, +0x3c010001, 0x370821, 0xac2240e8, 0x3c020001, +0x571021, 0x8c4240e8, 0x44102b, 0x14400009, +0x24020001, 0x3c030080, 0x3c010001, 0x370821, +0xac2040e8, 0x3c010001, 0x370821, 0x1000000c, +0xa02240f0, 0x3c020001, 0x571021, 0x904240f0, +0x14400006, 0x3c020080, 0x3c020001, 0x571021, +0x904240f1, 0x10400002, 0x3c020080, 0x621825, +0x8c040230, 0x10800013, 0x0, 0x3c020001, +0x571021, 0x8c4240ec, 0x24420005, 0x3c010001, +0x370821, 0xac2240ec, 0x3c020001, 0x571021, +0x8c4240ec, 0x44102b, 0x14400006, 0x0, +0x3c010001, 0x370821, 0xac2040ec, 0x10000006, +0x781825, 0x3c020001, 0x571021, 0x904240f2, +0x54400001, 0x781825, 0x1060ff1a, 0x0, +0x8f420000, 0x10400007, 0x0, 0xaf80004c, +0x8f82004c, 0x1040fffd, 0x0, 0x10000005, +0x0, 0xaf800048, 0x8f820048, 0x1040fffd, +0x0, 0x8f820060, 0x431025, 0xaf820060, +0x8f420000, 0x10400003, 0x0, 0x1000ff05, +0xaf80004c, 0x1000ff03, 0xaf800048, 0x3e00008, +0x0, 0x0, 0x0, 0x3c020001, +0x8c426d28, 0x27bdffe8, 0xafbf0014, 0x14400012, +0xafb00010, 0x3c100001, 0x26106f90, 0x2002021, +0xc002ba8, 0x24052000, 0x26021fe0, 0x3c010001, +0xac226eec, 0x3c010001, 0xac226ee8, 0xac020250, 0x24022000, 0xac100254, 0xac020258, 0x24020001, -0x3c010001, 0xac223db8, 0x8fbf0014, 0x8fb00010, -0x3e00008, 0x27bd0018, 0x3c090001, 0x8d293f38, +0x3c010001, 0xac226d28, 0x8fbf0014, 0x8fb00010, +0x3e00008, 0x27bd0018, 0x3c090001, 0x8d296eec, 0x8c820000, 0x8fa30010, 0x8fa80014, 0xad220000, 0x8c820004, 0xad250008, 0xad220004, 0x8f820054, 0xad260010, 0xad270014, 0xad230018, 0xad28001c, -0xad22000c, 0x2529ffe0, 0x3c020001, 0x24423fd0, +0xad22000c, 0x2529ffe0, 0x3c020001, 0x24426f90, 0x122102b, 0x10400003, 0x0, 0x3c090001, -0x8d293f34, 0x3c020001, 0x8c423da0, 0xad220000, -0x3c020001, 0x8c423da0, 0x3c010001, 0xac293f38, +0x8d296ee8, 0x3c020001, 0x8c426d10, 0xad220000, +0x3c020001, 0x8c426d10, 0x3c010001, 0xac296eec, 0xad220004, 0xac090250, 0x3e00008, 0x0, -0x27bdffd0, 0xafb00010, 0x3c100001, 0x8e103f38, -0x3c020001, 0x8c423da0, 0xafb10014, 0x808821, +0x27bdffd0, 0xafb00010, 0x3c100001, 0x8e106eec, +0x3c020001, 0x8c426d10, 0xafb10014, 0x808821, 0xafbe0024, 0x8fbe0040, 0x8fa40048, 0xafb20018, 0xa09021, 0xafbf0028, 0xafb50020, 0xafb3001c, -0xae020000, 0x3c020001, 0x8c423da0, 0xc09821, +0xae020000, 0x3c020001, 0x8c426d10, 0xc09821, 0xe0a821, 0x10800006, 0xae020004, 0x26050008, -0xc002a7b, 0x24060018, 0x10000005, 0x2610ffe0, -0x26040008, 0xc002a70, 0x24050018, 0x2610ffe0, -0x3c030001, 0x24633fd0, 0x203102b, 0x10400003, -0x0, 0x3c100001, 0x8e103f34, 0x8e220000, +0xc002bb3, 0x24060018, 0x10000005, 0x2610ffe0, +0x26040008, 0xc002ba8, 0x24050018, 0x2610ffe0, +0x3c030001, 0x24636f90, 0x203102b, 0x10400003, +0x0, 0x3c100001, 0x8e106ee8, 0x8e220000, 0xae020000, 0x8e220004, 0xae120008, 0xae020004, 0x8f820054, 0xae130010, 0xae150014, 0xae1e0018, 0x8fa80044, 0xae08001c, 0xae02000c, 0x2610ffe0, 0x203102b, 0x10400003, 0x0, 0x3c100001, -0x8e103f34, 0x3c020001, 0x8c423da0, 0xae020000, -0x3c020001, 0x8c423da0, 0x3c010001, 0xac303f38, +0x8e106ee8, 0x3c020001, 0x8c426d10, 0xae020000, +0x3c020001, 0x8c426d10, 0x3c010001, 0xac306eec, 0xae020004, 0xac100250, 0x8fbf0028, 0x8fbe0024, 0x8fb50020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0030, 0x851821, @@ -6172,236 +6394,262 @@ 0x3e00008, 0x0, 0x63080, 0x861821, 0x83102b, 0x10400006, 0x0, 0xac850000, 0x24840004, 0x83102b, 0x5440fffd, 0xac850000, -0x3e00008, 0x0, 0x0, 0x27bdffd8, -0xafbf0024, 0xafb00020, 0x8f430024, 0x8f420020, -0x10620038, 0x0, 0x8f430020, 0x8f420024, -0x622023, 0x4810003, 0x0, 0x8f420040, -0x822021, 0x8f430030, 0x8f420024, 0x43102b, -0x14400005, 0x0, 0x8f430040, 0x8f420024, -0x10000005, 0x621023, 0x8f420030, 0x8f430024, -0x431023, 0x2442ffff, 0x406021, 0x8c102a, -0x54400001, 0x806021, 0x8f4a0024, 0x8f490040, -0x8f480024, 0x8f440170, 0x8f450174, 0x8f460024, -0x8f4b001c, 0x24070001, 0xafa70010, 0x84100, -0x1001821, 0x14c5021, 0x2529ffff, 0x1498024, -0xafb00014, 0x8f470014, 0x1021, 0x63100, -0xafa70018, 0xa32821, 0xa3382b, 0x822021, -0x872021, 0x8f420108, 0x1663021, 0x40f809, -0xc3900, 0x54400001, 0xaf500024, 0x8f430024, -0x8f420020, 0x14620018, 0x0, 0x8f420000, -0x10400007, 0x0, 0xaf80004c, 0x8f82004c, -0x1040fffd, 0x0, 0x10000005, 0x0, -0xaf800048, 0x8f820048, 0x1040fffd, 0x0, -0x8f820060, 0x2403ffef, 0x431024, 0xaf820060, -0x8f420000, 0x10400003, 0x0, 0x10000002, -0xaf80004c, 0xaf800048, 0x8fbf0024, 0x8fb00020, -0x3e00008, 0x27bd0028, 0x3e00008, 0x0, -0x27bdffc0, 0x32c20020, 0xafbf0038, 0xafb30034, -0xafb20030, 0xafb1002c, 0x10400004, 0xafb00028, -0x8f530028, 0x10000002, 0x0, 0x8f530020, -0x8f420030, 0x105300eb, 0x21100, 0x8f43001c, -0x628021, 0x8e040000, 0x8e050004, 0x96120008, -0x8f420090, 0x9611000a, 0x3246ffff, 0x46102a, -0x10400017, 0x0, 0x8f8200d8, 0x8f430098, -0x431023, 0x2442fff8, 0xaf420090, 0x8f420090, -0x2842fff9, 0x10400005, 0x0, 0x8f420090, -0x8f430138, 0x431021, 0xaf420090, 0x8f420090, -0x46102a, 0x10400006, 0x0, 0x8f420338, -0x24420001, 0xaf420338, 0x100000e1, 0x8f420338, -0x8f8200fc, 0x14400006, 0x32c20008, 0x8f420334, -0x24420001, 0xaf420334, 0x100000d9, 0x8f420334, -0x5040000c, 0xaf4000ac, 0x934205b3, 0x10400008, -0x32220200, 0x10400006, 0x3c034000, 0x9602000e, -0xaf4300ac, 0x21400, 0x10000002, 0xaf4200b0, -0xaf4000ac, 0x32220004, 0x1040007f, 0x32220800, -0x10400003, 0x3247ffff, 0x10000002, 0x24020020, -0x24020004, 0xafa20010, 0x8f420030, 0xafa20014, -0x8f420010, 0x3c030002, 0x431025, 0xafa20018, +0x3e00008, 0x0, 0x0, 0x26e50028, +0xa03021, 0x274301c0, 0x8f4d0358, 0x8f47035c, +0x8f480360, 0x8f490364, 0x8f4a0368, 0x8f4b0204, +0x8f4c0200, 0x24640400, 0x64102b, 0x10400008, +0x3c0208ff, 0x8cc20000, 0xac620000, 0x24630004, +0x64102b, 0x1440fffb, 0x24c60004, 0x3c0208ff, +0x3442ffff, 0x3c03c0ff, 0xaf4d0358, 0xaf47035c, +0xaf480360, 0xaf490364, 0xaf4a0368, 0xaf4b0204, +0xaf4c0200, 0x8f840220, 0x3463ffff, 0x8f860200, +0x821024, 0x34420004, 0xc31824, 0x34630004, +0xaf820220, 0xaf830200, 0x8ca20214, 0xac020084, +0x8ca20218, 0xac020088, 0x8ca2021c, 0xac02008c, +0x8ca20220, 0xac020090, 0x8ca20224, 0xac020094, +0x8ca20228, 0xac020098, 0x8ca2022c, 0xac02009c, +0x8ca20230, 0xac0200a0, 0x8ca20234, 0xac0200a4, +0x8ca20238, 0xac0200a8, 0x8ca2023c, 0xac0200ac, +0x8ca20240, 0xac0200b0, 0x8ca20244, 0xac0200b4, +0x8ca20248, 0xac0200b8, 0x8ca2024c, 0xac0200bc, +0x8ca2001c, 0xac020080, 0x8ca20018, 0xac0200c0, +0x8ca20020, 0xac0200cc, 0x8ca20024, 0xac0200d0, +0x8ca201d0, 0xac0200e0, 0x8ca201d4, 0xac0200e4, +0x8ca201d8, 0xac0200e8, 0x8ca201dc, 0xac0200ec, +0x8ca201e0, 0xac0200f0, 0x8ca20098, 0x8ca3009c, +0xac0300fc, 0x8ca200a8, 0x8ca300ac, 0xac0300f4, +0x8ca200a0, 0x8ca300a4, 0x30840004, 0xac0300f8, +0x14800007, 0x30c20004, 0x8f820220, 0x3c0308ff, +0x3463fffb, 0x431024, 0xaf820220, 0x30c20004, +0x14400006, 0x0, 0x8f820200, 0x3c03c0ff, +0x3463fffb, 0x431024, 0xaf820200, 0x8f4202dc, +0xa34005c5, 0x24420001, 0xaf4202dc, 0x8f4202dc, +0x3e00008, 0x0, 0x27bdffd8, 0xafbf0024, +0xafb00020, 0x8f430024, 0x8f420020, 0x10620038, +0x0, 0x8f430020, 0x8f420024, 0x622023, +0x4810003, 0x0, 0x8f420040, 0x822021, +0x8f430030, 0x8f420024, 0x43102b, 0x14400005, +0x0, 0x8f430040, 0x8f420024, 0x10000005, +0x621023, 0x8f420030, 0x8f430024, 0x431023, +0x2442ffff, 0x406021, 0x8c102a, 0x54400001, +0x806021, 0x8f4a0024, 0x8f490040, 0x8f480024, +0x8f440180, 0x8f450184, 0x8f460024, 0x8f4b001c, +0x24070001, 0xafa70010, 0x84100, 0x1001821, +0x14c5021, 0x2529ffff, 0x1498024, 0xafb00014, +0x8f470014, 0x1021, 0x63100, 0xafa70018, +0xa32821, 0xa3382b, 0x822021, 0x872021, +0x8f420108, 0x1663021, 0x40f809, 0xc3900, +0x54400001, 0xaf500024, 0x8f430024, 0x8f420020, +0x14620018, 0x0, 0x8f420000, 0x10400007, +0x0, 0xaf80004c, 0x8f82004c, 0x1040fffd, +0x0, 0x10000005, 0x0, 0xaf800048, +0x8f820048, 0x1040fffd, 0x0, 0x8f820060, +0x2403ffef, 0x431024, 0xaf820060, 0x8f420000, +0x10400003, 0x0, 0x10000002, 0xaf80004c, +0xaf800048, 0x8fbf0024, 0x8fb00020, 0x3e00008, +0x27bd0028, 0x3e00008, 0x0, 0x27bdffc0, +0x32c20020, 0xafbf0038, 0xafb30034, 0xafb20030, +0xafb1002c, 0x10400004, 0xafb00028, 0x8f530028, +0x10000002, 0x0, 0x8f530020, 0x8f420030, +0x105300eb, 0x21100, 0x8f43001c, 0x628021, +0x8e040000, 0x8e050004, 0x96120008, 0x8f420090, +0x9611000a, 0x3246ffff, 0x46102a, 0x10400017, +0x0, 0x8f8200d8, 0x8f430098, 0x431023, +0x2442dcbe, 0xaf420090, 0x8f420090, 0x2842dcbf, +0x10400005, 0x0, 0x8f420090, 0x8f430144, +0x431021, 0xaf420090, 0x8f420090, 0x46102a, +0x10400006, 0x0, 0x8f420348, 0x24420001, +0xaf420348, 0x100000e1, 0x8f420348, 0x8f8200fc, +0x14400006, 0x0, 0x8f420344, 0x24420001, +0xaf420344, 0x100000d9, 0x8f420344, 0x934205c2, +0x1040000b, 0x32c20008, 0x10400008, 0x32220200, +0x10400006, 0x3c034000, 0x9602000e, 0xaf4300ac, +0x21400, 0x10000002, 0xaf4200b0, 0xaf4000ac, +0x32220004, 0x1040007f, 0x32220800, 0x10400003, +0x3247ffff, 0x10000002, 0x24020020, 0x24020004, +0xafa20010, 0x8f420030, 0xafa20014, 0x8f420010, +0x3c030002, 0x431025, 0xafa20018, 0x8f460098, +0x8f420108, 0x40f809, 0x0, 0x104000b7, +0x0, 0x8f42009c, 0x8f430094, 0x2421021, +0xaf42009c, 0xae03000c, 0x8f4200ac, 0x10400008, +0x3c034000, 0x8f420094, 0x431025, 0xafa20020, +0x8f42009c, 0x8f4300b0, 0x10000004, 0x431025, +0x8f420094, 0xafa20020, 0x8f42009c, 0xafa20024, +0x8f8200fc, 0x8fa30020, 0x8fa40024, 0xac430000, +0xac440004, 0x24420008, 0xaf8200f0, 0x8f42009c, +0x8f440270, 0x8f450274, 0x401821, 0x1021, +0xa32821, 0xa3302b, 0x822021, 0x862021, +0x32230060, 0x24020040, 0xaf440270, 0xaf450274, +0x10620017, 0x2c620041, 0x10400005, 0x24020020, +0x10620008, 0x24020001, 0x10000026, 0x0, +0x24020060, 0x10620019, 0x24020001, 0x10000021, +0x0, 0x8f420278, 0x8f43027c, 0x24630001, +0x2c640001, 0x441021, 0xaf420278, 0xaf43027c, +0x8f420278, 0x8f43027c, 0x10000016, 0x24020001, +0x8f420280, 0x8f430284, 0x24630001, 0x2c640001, +0x441021, 0xaf420280, 0xaf430284, 0x8f420280, +0x8f430284, 0x1000000b, 0x24020001, 0x8f420288, +0x8f43028c, 0x24630001, 0x2c640001, 0x441021, +0xaf420288, 0xaf43028c, 0x8f420288, 0x8f43028c, +0x24020001, 0xa34205c2, 0x8f420098, 0x3244ffff, +0x2406fff8, 0x8f45013c, 0x441021, 0x24420007, +0x461024, 0x24840007, 0xaf420094, 0x8f420090, +0x8f430094, 0x862024, 0x441023, 0x65182b, +0x14600005, 0xaf420090, 0x8f420094, 0x8f430144, +0x431023, 0xaf420094, 0x8f420094, 0x10000023, +0xaf40009c, 0x3247ffff, 0x50e00022, 0x32c20020, +0x14400002, 0x24020010, 0x24020002, 0xafa20010, +0x8f420030, 0xafa20014, 0x8f420010, 0xafa20018, 0x8f460098, 0x8f420108, 0x40f809, 0x0, -0x104000b7, 0x0, 0x8f42009c, 0x8f430094, -0x2421021, 0xaf42009c, 0xae03000c, 0x8f4200ac, -0x10400008, 0x3c034000, 0x8f420094, 0x431025, -0xafa20020, 0x8f42009c, 0x8f4300b0, 0x10000004, -0x431025, 0x8f420094, 0xafa20020, 0x8f42009c, -0xafa20024, 0x8f8200fc, 0x8fa30020, 0x8fa40024, -0xac430000, 0xac440004, 0x24420008, 0xaf8200f0, -0x8f42009c, 0x8f440260, 0x8f450264, 0x401821, -0x1021, 0xa32821, 0xa3302b, 0x822021, -0x862021, 0x32230060, 0x24020040, 0xaf440260, -0xaf450264, 0x10620017, 0x2c620041, 0x10400005, -0x24020020, 0x10620008, 0x24020001, 0x10000026, -0x0, 0x24020060, 0x10620019, 0x24020001, -0x10000021, 0x0, 0x8f420268, 0x8f43026c, -0x24630001, 0x2c640001, 0x441021, 0xaf420268, -0xaf43026c, 0x8f420268, 0x8f43026c, 0x10000016, -0x24020001, 0x8f420270, 0x8f430274, 0x24630001, -0x2c640001, 0x441021, 0xaf420270, 0xaf430274, -0x8f420270, 0x8f430274, 0x1000000b, 0x24020001, -0x8f420278, 0x8f43027c, 0x24630001, 0x2c640001, -0x441021, 0xaf420278, 0xaf43027c, 0x8f420278, -0x8f43027c, 0x24020001, 0xa34205b3, 0x8f420098, -0x3244ffff, 0x2406fff8, 0x8f450130, 0x441021, +0x1040003a, 0x3245ffff, 0x8f420098, 0x8f430090, +0x8f46013c, 0x451021, 0xaf420098, 0x8f42009c, +0x8f440098, 0xa34005c2, 0x651823, 0xaf430090, +0x451021, 0x86202b, 0x14800005, 0xaf42009c, +0x8f420098, 0x8f430144, 0x431023, 0xaf420098, +0x32c20020, 0x10400005, 0x0, 0x8f420358, +0x2442ffff, 0xaf420358, 0x8f420358, 0x8f420030, +0x8f430040, 0x24420001, 0x2463ffff, 0x431024, +0xaf420030, 0x8f420030, 0x14530018, 0x0, +0x8f420000, 0x10400007, 0x0, 0xaf80004c, +0x8f82004c, 0x1040fffd, 0x0, 0x10000005, +0x0, 0xaf800048, 0x8f820048, 0x1040fffd, +0x0, 0x8f820060, 0x2403fff7, 0x431024, +0xaf820060, 0x8f420000, 0x10400003, 0x0, +0x10000002, 0xaf80004c, 0xaf800048, 0x8fbf0038, +0x8fb30034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, +0x3e00008, 0x27bd0040, 0x3e00008, 0x0, +0x27bdffd0, 0x32c20020, 0xafbf002c, 0xafb20028, +0xafb10024, 0x10400004, 0xafb00020, 0x8f520028, +0x10000002, 0x0, 0x8f520020, 0x8f420030, +0x105200b5, 0x21100, 0x8f43001c, 0x628021, +0x8e040000, 0x8e050004, 0x96110008, 0x8f420090, +0x9607000a, 0x3226ffff, 0x46102a, 0x10400017, +0x0, 0x8f8200d8, 0x8f430098, 0x431023, +0x2442dc46, 0xaf420090, 0x8f420090, 0x2842dc47, +0x10400005, 0x0, 0x8f420090, 0x8f430144, +0x431021, 0xaf420090, 0x8f420090, 0x46102a, +0x10400006, 0x0, 0x8f420348, 0x24420001, +0xaf420348, 0x100000ab, 0x8f420348, 0x8f8600fc, +0x10c0000c, 0x0, 0x8f8200f4, 0x2403fff8, +0x431024, 0x461023, 0x218c3, 0x58600001, +0x24630100, 0x8f42008c, 0x43102b, 0x14400006, +0x712c2, 0x8f420344, 0x24420001, 0xaf420344, +0x10000098, 0x8f420344, 0x934305c2, 0x1060000f, +0x30460001, 0x8f420010, 0x34480400, 0x32c20008, +0x10400008, 0x30e20200, 0x10400006, 0x3c034000, +0x9602000e, 0xaf4300ac, 0x21400, 0x10000004, +0xaf4200b0, 0x10000002, 0xaf4000ac, 0x8f480010, +0x30e20004, 0x10400045, 0x3227ffff, 0x8f4900ac, +0x11200005, 0x30c200ff, 0x14400006, 0x24020040, +0x10000004, 0x24020008, 0x14400002, 0x24020020, +0x24020004, 0xafa20010, 0x8f430030, 0x11200004, +0xafa30014, 0x8f4200b0, 0x621025, 0xafa20014, +0x3c020002, 0x1021025, 0xafa20018, 0x8f460098, +0x8f420108, 0x40f809, 0x0, 0x10400069, +0x3224ffff, 0x8f42008c, 0x8f430094, 0x24420001, +0xaf42008c, 0x24020001, 0xae03000c, 0xa34205c2, +0x8f420098, 0x2406fff8, 0x8f45013c, 0x441021, 0x24420007, 0x461024, 0x24840007, 0xaf420094, 0x8f420090, 0x8f430094, 0x862024, 0x441023, 0x65182b, 0x14600005, 0xaf420090, 0x8f420094, -0x8f430138, 0x431023, 0xaf420094, 0x8f420094, -0x10000023, 0xaf40009c, 0x3247ffff, 0x50e00022, -0x32c20020, 0x14400002, 0x24020010, 0x24020002, -0xafa20010, 0x8f420030, 0xafa20014, 0x8f420010, -0xafa20018, 0x8f460098, 0x8f420108, 0x40f809, -0x0, 0x1040003a, 0x3245ffff, 0x8f420098, -0x8f430090, 0x8f460130, 0x451021, 0xaf420098, -0x8f42009c, 0x8f440098, 0xa34005b3, 0x651823, -0xaf430090, 0x451021, 0x86202b, 0x14800005, -0xaf42009c, 0x8f420098, 0x8f430138, 0x431023, -0xaf420098, 0x32c20020, 0x10400005, 0x0, -0x8f420348, 0x2442ffff, 0xaf420348, 0x8f420348, -0x8f420030, 0x8f430040, 0x24420001, 0x2463ffff, -0x431024, 0xaf420030, 0x8f420030, 0x14530018, -0x0, 0x8f420000, 0x10400007, 0x0, -0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, -0x10000005, 0x0, 0xaf800048, 0x8f820048, -0x1040fffd, 0x0, 0x8f820060, 0x2403fff7, -0x431024, 0xaf820060, 0x8f420000, 0x10400003, -0x0, 0x10000002, 0xaf80004c, 0xaf800048, -0x8fbf0038, 0x8fb30034, 0x8fb20030, 0x8fb1002c, -0x8fb00028, 0x3e00008, 0x27bd0040, 0x3e00008, -0x0, 0x27bdffd0, 0x32c20020, 0xafbf002c, -0xafb20028, 0xafb10024, 0x10400004, 0xafb00020, -0x8f520028, 0x10000002, 0x0, 0x8f520020, -0x8f420030, 0x105200b5, 0x21100, 0x8f43001c, -0x628021, 0x8e040000, 0x8e050004, 0x96110008, -0x8f420090, 0x9607000a, 0x3226ffff, 0x46102a, -0x10400017, 0x0, 0x8f8200d8, 0x8f430098, -0x431023, 0x2442ff80, 0xaf420090, 0x8f420090, -0x2842ff81, 0x10400005, 0x0, 0x8f420090, -0x8f430138, 0x431021, 0xaf420090, 0x8f420090, -0x46102a, 0x10400006, 0x0, 0x8f420338, -0x24420001, 0xaf420338, 0x100000ab, 0x8f420338, -0x8f8600fc, 0x10c0000c, 0x0, 0x8f8200f4, -0x2403fff8, 0x431024, 0x461023, 0x218c3, -0x50600001, 0x24030100, 0x8f42008c, 0x43102b, -0x14400006, 0x712c2, 0x8f420334, 0x24420001, -0xaf420334, 0x10000098, 0x8f420334, 0x934305b3, -0x1060000f, 0x30460001, 0x8f420010, 0x34480400, -0x32c20008, 0x10400008, 0x30e20200, 0x10400006, -0x3c034000, 0x9602000e, 0xaf4300ac, 0x21400, -0x10000004, 0xaf4200b0, 0x10000002, 0xaf4000ac, -0x8f480010, 0x30e20004, 0x10400045, 0x3227ffff, -0x8f4900ac, 0x11200005, 0x30c200ff, 0x14400006, -0x24020040, 0x10000004, 0x24020008, 0x14400002, -0x24020020, 0x24020004, 0xafa20010, 0x8f430030, -0x11200004, 0xafa30014, 0x8f4200b0, 0x621025, -0xafa20014, 0x3c020002, 0x1021025, 0xafa20018, +0x8f430144, 0x431023, 0xaf420094, 0x8f430094, +0x8f420140, 0x43102b, 0x10400009, 0x0, +0x8f43013c, 0x8f440094, 0x8f420090, 0x8f450138, +0x641823, 0x431023, 0xaf420090, 0xaf450094, +0x8f420094, 0x1000001f, 0xaf420098, 0x10e0001d, +0x30c200ff, 0x14400002, 0x24020010, 0x24020002, +0xafa20010, 0x8f420030, 0xafa80018, 0xafa20014, 0x8f460098, 0x8f420108, 0x40f809, 0x0, -0x10400069, 0x3224ffff, 0x8f42008c, 0x8f430094, -0x24420001, 0xaf42008c, 0x24020001, 0xae03000c, -0xa34205b3, 0x8f420098, 0x2406fff8, 0x8f450130, -0x441021, 0x24420007, 0x461024, 0x24840007, -0xaf420094, 0x8f420090, 0x8f430094, 0x862024, -0x441023, 0x65182b, 0x14600005, 0xaf420090, -0x8f420094, 0x8f430138, 0x431023, 0xaf420094, -0x8f430094, 0x8f420134, 0x43102b, 0x10400009, -0x0, 0x8f430130, 0x8f440094, 0x8f420090, -0x8f45012c, 0x641823, 0x431023, 0xaf420090, -0xaf450094, 0x8f420094, 0x1000001f, 0xaf420098, -0x10e0001d, 0x30c200ff, 0x14400002, 0x24020010, -0x24020002, 0xafa20010, 0x8f420030, 0xafa80018, -0xafa20014, 0x8f460098, 0x8f420108, 0x40f809, -0x0, 0x10400030, 0x3225ffff, 0x8f420098, -0x8f440130, 0x451021, 0xaf420098, 0x8f420090, -0x8f430098, 0xa34005b3, 0x451023, 0x64182b, -0x14600005, 0xaf420090, 0x8f420098, 0x8f430138, -0x431023, 0xaf420098, 0x8f420030, 0x8f430040, -0x24420001, 0x2463ffff, 0x431024, 0xaf420030, -0x8f420030, 0x14520018, 0x0, 0x8f420000, -0x10400007, 0x0, 0xaf80004c, 0x8f82004c, -0x1040fffd, 0x0, 0x10000005, 0x0, -0xaf800048, 0x8f820048, 0x1040fffd, 0x0, -0x8f820060, 0x2403fff7, 0x431024, 0xaf820060, -0x8f420000, 0x10400003, 0x0, 0x10000002, -0xaf80004c, 0xaf800048, 0x8fbf002c, 0x8fb20028, -0x8fb10024, 0x8fb00020, 0x3e00008, 0x27bd0030, -0x3e00008, 0x0, 0x27bdffd8, 0x3c020001, -0x34422ec0, 0xafbf0020, 0x8f4300f0, 0x8f840108, -0x2e21021, 0x54620004, 0x24620008, 0x3c020001, -0x34422cc0, 0x2e21021, 0x401821, 0xaf4300f0, -0xac600000, 0x8f4200ec, 0x8c660004, 0x14620004, -0x3c020001, 0x24820020, 0x1000000f, 0xaf820108, -0x8f4300f0, 0x34422ec0, 0x2e21021, 0x54620004, -0x24620008, 0x3c020001, 0x34422cc0, 0x2e21021, -0x401821, 0x8c620004, 0x21140, 0x821021, -0xaf820108, 0xac600000, 0x8c850018, 0x30a20036, -0x1040006c, 0x30a20001, 0x8c82001c, 0x8f430040, -0x8f440034, 0x24420001, 0x2463ffff, 0x431024, -0x862021, 0xaf42002c, 0x30a20030, 0x14400006, -0xaf440034, 0x8f420034, 0x8c03023c, 0x43102b, -0x144000c6, 0x0, 0x32c20010, 0x10400028, -0x24070008, 0x8f440160, 0x8f450164, 0x8f43002c, -0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, -0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, -0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, -0x370821, 0xa02240f1, 0x8f820124, 0xafa20010, -0x8f820128, 0x3c040001, 0x248438e4, 0xafa20014, -0x8f46002c, 0x8f870120, 0x3c050009, 0xc002a03, -0x34a51100, 0x10000036, 0x0, 0x8f4202f0, -0x8f43002c, 0x24420001, 0xaf4202f0, 0x8f4202f0, -0x24020001, 0xa34205b2, 0x10000026, 0xaf430038, -0x8f440160, 0x8f450164, 0x8f43002c, 0x8f48000c, -0x8f860120, 0x24020020, 0xafa20010, 0xafa30014, +0x10400030, 0x3225ffff, 0x8f420098, 0x8f44013c, +0x451021, 0xaf420098, 0x8f420090, 0x8f430098, +0xa34005c2, 0x451023, 0x64182b, 0x14600005, +0xaf420090, 0x8f420098, 0x8f430144, 0x431023, +0xaf420098, 0x8f420030, 0x8f430040, 0x24420001, +0x2463ffff, 0x431024, 0xaf420030, 0x8f420030, +0x14520018, 0x0, 0x8f420000, 0x10400007, +0x0, 0xaf80004c, 0x8f82004c, 0x1040fffd, +0x0, 0x10000005, 0x0, 0xaf800048, +0x8f820048, 0x1040fffd, 0x0, 0x8f820060, +0x2403fff7, 0x431024, 0xaf820060, 0x8f420000, +0x10400003, 0x0, 0x10000002, 0xaf80004c, +0xaf800048, 0x8fbf002c, 0x8fb20028, 0x8fb10024, +0x8fb00020, 0x3e00008, 0x27bd0030, 0x3e00008, +0x0, 0x27bdffd8, 0x3c020001, 0x34422ec0, +0xafbf0020, 0x8f4300f0, 0x8f840108, 0x2e21021, +0x54620004, 0x24620008, 0x3c020001, 0x34422cc0, +0x2e21021, 0x401821, 0xaf4300f0, 0xac600000, +0x8f4200ec, 0x8c660004, 0x14620004, 0x3c020001, +0x24820020, 0x1000000f, 0xaf820108, 0x8f4300f0, +0x34422ec0, 0x2e21021, 0x54620004, 0x24620008, +0x3c020001, 0x34422cc0, 0x2e21021, 0x401821, +0x8c620004, 0x21140, 0x821021, 0xaf820108, +0xac600000, 0x8c850018, 0x30a20036, 0x1040006c, +0x30a20001, 0x8c82001c, 0x8f430040, 0x8f440034, +0x24420001, 0x2463ffff, 0x431024, 0x862021, +0xaf42002c, 0x30a20030, 0x14400006, 0xaf440034, +0x8f420034, 0x8c03023c, 0x43102b, 0x144000b4, +0x0, 0x32c20010, 0x10400028, 0x24070008, +0x8f440170, 0x8f450174, 0x8f43002c, 0x8f48000c, +0x8f860120, 0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, -0xa02240f0, 0x8f820124, 0xafa20010, 0x8f820128, -0x3c040001, 0x248438d8, 0xafa20014, 0x8f46002c, -0x8f870120, 0x3c050009, 0xc002a03, 0x34a50900, -0x1000000f, 0x0, 0x8f4202f0, 0x24420001, -0xaf4202f0, 0x8f4202f0, 0x8f42002c, 0xa34005b2, -0xaf420038, 0x3c010001, 0x370821, 0xa02040f1, -0x3c010001, 0x370821, 0xa02040f0, 0xaf400034, -0x8f420304, 0x24420001, 0xaf420304, 0x1000006b, -0x8f420304, 0x10400022, 0x30a27000, 0x8c85001c, -0x8f420028, 0xa22023, 0x4810003, 0x0, -0x8f420040, 0x822021, 0x8f420348, 0x8f430000, -0xaf450028, 0x441021, 0x10600007, 0xaf420348, -0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, -0x10000005, 0x0, 0xaf800048, 0x8f820048, -0x1040fffd, 0x0, 0x8f820060, 0x34420008, -0xaf820060, 0x8f420000, 0x10400003, 0x0, -0x1000004a, 0xaf80004c, 0x10000048, 0xaf800048, -0x1040002f, 0x30a21000, 0x1040000c, 0x30a24000, -0x8c83001c, 0x8f420050, 0x622023, 0x4820001, -0x24840200, 0x8f42034c, 0x441021, 0xaf42034c, -0x8f420358, 0x1000001a, 0xaf430050, 0x1040000c, -0x32c28000, 0x8c83001c, 0x8f420070, 0x622023, -0x4820001, 0x24840400, 0x8f420354, 0x441021, -0xaf420354, 0x8f420358, 0x1000000d, 0xaf430070, -0x1040000e, 0x3c020800, 0x8c83001c, 0x8f420060, -0x622023, 0x4820001, 0x24840100, 0x8f420350, -0x441021, 0xaf420350, 0x8f420358, 0xaf430060, -0x441021, 0xaf420358, 0x3c020800, 0x2c21024, -0x5040001a, 0x36940040, 0x10000018, 0x0, -0x30a20100, 0x10400015, 0x0, 0x3c020001, -0x8c423d64, 0x1040000c, 0x0, 0x274301b0, -0x24650400, 0x65102b, 0x10400007, 0x26e40028, -0x8c820000, 0xac620000, 0x24630004, 0x65102b, -0x1440fffb, 0x24840004, 0x8f4202cc, 0xa34005b6, -0x24420001, 0xaf4202cc, 0x8f4202cc, 0x8fbf0020, -0x3e00008, 0x27bd0028, 0x3e00008, 0x0, -0x27bdffa8, 0xafbf0050, 0xafbe004c, 0xafb50048, -0xafb30044, 0xafb20040, 0xafb1003c, 0xafb00038, -0x8f910108, 0x26220020, 0xaf820108, 0x8e320018, -0xa821, 0x32420024, 0x104001b7, 0xf021, -0x8e26001c, 0x8f42001c, 0x61900, 0x431021, -0x8c50000c, 0x9603000c, 0x962d0016, 0x9453000a, -0x2c6205dd, 0x10400015, 0x2821, 0x32c20040, +0xa02240f1, 0x8f820124, 0xafa20010, 0x8f820128, +0x3c040001, 0x248467c4, 0xafa20014, 0x8f46002c, +0x8f870120, 0x3c050009, 0xc002b3b, 0x34a51100, +0x10000036, 0x0, 0x8f420300, 0x8f43002c, +0x24420001, 0xaf420300, 0x8f420300, 0x24020001, +0xa34205c1, 0x10000026, 0xaf430038, 0x8f440170, +0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, +0x24020020, 0xafa20010, 0xafa30014, 0xafa80018, +0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, +0x24020001, 0x3c010001, 0x370821, 0xa02240f0, +0x8f820124, 0xafa20010, 0x8f820128, 0x3c040001, +0x248467b8, 0xafa20014, 0x8f46002c, 0x8f870120, +0x3c050009, 0xc002b3b, 0x34a50900, 0x1000000f, +0x0, 0x8f420300, 0x24420001, 0xaf420300, +0x8f420300, 0x8f42002c, 0xa34005c1, 0xaf420038, +0x3c010001, 0x370821, 0xa02040f1, 0x3c010001, +0x370821, 0xa02040f0, 0xaf400034, 0x8f420314, +0x24420001, 0xaf420314, 0x10000059, 0x8f420314, +0x10400022, 0x30a27000, 0x8c85001c, 0x8f420028, +0xa22023, 0x4810003, 0x0, 0x8f420040, +0x822021, 0x8f420358, 0x8f430000, 0xaf450028, +0x441021, 0x10600007, 0xaf420358, 0xaf80004c, +0x8f82004c, 0x1040fffd, 0x0, 0x10000005, +0x0, 0xaf800048, 0x8f820048, 0x1040fffd, +0x0, 0x8f820060, 0x34420008, 0xaf820060, +0x8f420000, 0x10400003, 0x0, 0x10000038, +0xaf80004c, 0x10000036, 0xaf800048, 0x1040002f, +0x30a21000, 0x1040000c, 0x30a24000, 0x8c83001c, +0x8f420050, 0x622023, 0x4820001, 0x24840200, +0x8f42035c, 0x441021, 0xaf42035c, 0x8f420368, +0x1000001a, 0xaf430050, 0x1040000c, 0x32c28000, +0x8c83001c, 0x8f420070, 0x622023, 0x4820001, +0x24840400, 0x8f420364, 0x441021, 0xaf420364, +0x8f420368, 0x1000000d, 0xaf430070, 0x1040000e, +0x3c020800, 0x8c83001c, 0x8f420060, 0x622023, +0x4820001, 0x24840100, 0x8f420360, 0x441021, +0xaf420360, 0x8f420368, 0xaf430060, 0x441021, +0xaf420368, 0x3c020800, 0x2c21024, 0x50400008, +0x36940040, 0x10000006, 0x0, 0x30a20100, +0x10400003, 0x0, 0xc002bd8, 0x0, +0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3e00008, +0x0, 0x27bdffa8, 0xafbf0050, 0xafbe004c, +0xafb50048, 0xafb30044, 0xafb20040, 0xafb1003c, +0xafb00038, 0x8f910108, 0x26220020, 0xaf820108, +0x8e320018, 0xa821, 0x32420024, 0x104001ba, +0xf021, 0x8e26001c, 0x8f43001c, 0x61100, +0x621821, 0x8c70000c, 0x9604000c, 0x962d0016, +0x9473000a, 0x2c8305dd, 0x38828870, 0x2c420001, +0x621825, 0x10600015, 0x2821, 0x32c20040, 0x10400015, 0x24020800, 0x96030014, 0x14620012, 0x3402aaaa, 0x9603000e, 0x14620007, 0x2021, 0x96030010, 0x24020300, 0x14620004, 0x801021, 0x96020012, 0x2c440001, 0x801021, 0x54400006, 0x24050016, 0x10000004, 0x0, 0x24020800, -0x50620001, 0x2405000e, 0x934205b4, 0x14400008, +0x50820001, 0x2405000e, 0x934205c3, 0x14400008, 0x5821, 0x240b0001, 0x32620180, 0xaf4500a8, -0xaf5000a0, 0x10400002, 0xaf4600a4, 0xa34b05b4, +0xaf5000a0, 0x10400002, 0xaf4600a4, 0xa34b05c3, 0x10a00085, 0x2054021, 0x91020000, 0x3821, 0x3042000f, 0x25080, 0x32c20002, 0x10400012, 0x10a1821, 0x32620002, 0x10400010, 0x32c20001, @@ -6414,8 +6662,8 @@ 0x431021, 0x904c0009, 0x318900ff, 0x39230006, 0x3182b, 0x39220011, 0x2102b, 0x621824, 0x1060000c, 0x3c050006, 0x8f4200a4, 0x3c040001, -0x248438f4, 0xafa20010, 0x8f4200a0, 0x34a54600, -0x1203821, 0xc002a03, 0xafa20014, 0x1000004e, +0x248467d4, 0xafa20010, 0x8f4200a0, 0x34a54600, +0x1203821, 0xc002b3b, 0xafa20014, 0x1000004e, 0x0, 0x32c20004, 0x14400013, 0x2821, 0x316200ff, 0x14400004, 0x0, 0x95020002, 0x1000000d, 0x4a2823, 0x9505000c, 0x9502000e, @@ -6433,7 +6681,7 @@ 0x318300ff, 0x24020006, 0x14620003, 0x10a1021, 0x10000002, 0x24440010, 0x24440006, 0x316200ff, 0x14400006, 0x0, 0x94820000, 0xa22821, -0x51c02, 0x30a2ffff, 0x622821, 0x934205b4, +0x51c02, 0x30a2ffff, 0x622821, 0x934205c3, 0x10400003, 0x32620100, 0x50400003, 0xa4850000, 0x52827, 0xa4850000, 0x9622000e, 0x8f43009c, 0x621821, 0x32a200ff, 0x10400007, 0xaf43009c, @@ -6454,425 +6702,438 @@ 0xafa30028, 0xafa4002c, 0x8f8200fc, 0x8fa30028, 0x8fa4002c, 0xac430000, 0xac440004, 0x24420008, 0xaf8200f0, 0x8f42008c, 0x2442ffff, 0xaf42008c, -0x97a2002e, 0x8f440260, 0x8f450264, 0x401821, +0x97a2002e, 0x8f440270, 0x8f450274, 0x401821, 0x1021, 0xa32821, 0xa3302b, 0x822021, -0x862021, 0xaf440260, 0xaf450264, 0x8fa20028, +0x862021, 0xaf440270, 0xaf450274, 0x8fa20028, 0x481024, 0x90430000, 0x30630001, 0x1460000b, -0x402021, 0x8f420268, 0x8f43026c, 0x24630001, -0x2c640001, 0x441021, 0xaf420268, 0xaf43026c, -0x8f420268, 0x1000001a, 0x8f43026c, 0x8c820000, -0x144b000e, 0x0, 0x94820004, 0x144a000b, -0x0, 0x8f420278, 0x8f43027c, 0x24630001, +0x402021, 0x8f420278, 0x8f43027c, 0x24630001, 0x2c640001, 0x441021, 0xaf420278, 0xaf43027c, -0x8f420278, 0x1000000a, 0x8f43027c, 0x8f420270, -0x8f430274, 0x24630001, 0x2c640001, 0x441021, -0xaf420270, 0xaf430274, 0x8f420270, 0x8f430274, +0x8f420278, 0x1000001a, 0x8f43027c, 0x8c820000, +0x144b000e, 0x0, 0x94820004, 0x144a000b, +0x0, 0x8f420288, 0x8f43028c, 0x24630001, +0x2c640001, 0x441021, 0xaf420288, 0xaf43028c, +0x8f420288, 0x1000000a, 0x8f43028c, 0x8f420280, +0x8f430284, 0x24630001, 0x2c640001, 0x441021, +0xaf420280, 0xaf430284, 0x8f420280, 0x8f430284, 0x8f4200b4, 0x24e70001, 0xe2102b, 0x1440ffb8, -0x710c0, 0xa34005b4, 0x1000003f, 0xaf4000b4, +0x710c0, 0xa34005c3, 0x1000003f, 0xaf4000b4, 0x8f8200fc, 0x8fa30020, 0x8fa40024, 0xac430000, 0xac440004, 0x24420008, 0xaf8200f0, 0x8f42009c, -0x8f46008c, 0x8f440260, 0x8f450264, 0x401821, +0x8f46008c, 0x8f440270, 0x8f450274, 0x401821, 0x1021, 0x24c6ffff, 0xaf46008c, 0xa32821, -0xa3302b, 0x822021, 0x862021, 0xaf440260, -0xaf450264, 0x92020000, 0x30420001, 0x1440000c, -0x2402ffff, 0x8f420268, 0x8f43026c, 0x24630001, -0x2c640001, 0x441021, 0xaf420268, 0xaf43026c, -0x8f420268, 0x8f43026c, 0x1000001c, 0x32c20020, +0xa3302b, 0x822021, 0x862021, 0xaf440270, +0xaf450274, 0x92020000, 0x30420001, 0x1440000c, +0x2402ffff, 0x8f420278, 0x8f43027c, 0x24630001, +0x2c640001, 0x441021, 0xaf420278, 0xaf43027c, +0x8f420278, 0x8f43027c, 0x1000001c, 0x32c20020, 0x8e030000, 0x1462000f, 0x3402ffff, 0x96030004, -0x1462000c, 0x0, 0x8f420278, 0x8f43027c, -0x24630001, 0x2c640001, 0x441021, 0xaf420278, -0xaf43027c, 0x8f420278, 0x8f43027c, 0x1000000b, -0x32c20020, 0x8f420270, 0x8f430274, 0x24630001, -0x2c640001, 0x441021, 0xaf420270, 0xaf430274, -0x8f420270, 0x8f430274, 0x32c20020, 0x10400005, -0xaf40009c, 0x8f420348, 0x2442ffff, 0xaf420348, -0x8f420348, 0x8e22001c, 0x8f430040, 0x24420001, +0x1462000c, 0x0, 0x8f420288, 0x8f43028c, +0x24630001, 0x2c640001, 0x441021, 0xaf420288, +0xaf43028c, 0x8f420288, 0x8f43028c, 0x1000000b, +0x32c20020, 0x8f420280, 0x8f430284, 0x24630001, +0x2c640001, 0x441021, 0xaf420280, 0xaf430284, +0x8f420280, 0x8f430284, 0x32c20020, 0x10400005, +0xaf40009c, 0x8f420358, 0x2442ffff, 0xaf420358, +0x8f420358, 0x8e22001c, 0x8f430040, 0x24420001, 0x2463ffff, 0x431024, 0xaf42002c, 0x32420060, 0x14400008, 0x32c20010, 0x8f420034, 0x24420001, -0xaf420034, 0x8c03023c, 0x43102b, 0x14400114, -0x32c20010, 0x10400018, 0x24070008, 0x8f440160, -0x8f450164, 0x8f43002c, 0x8f48000c, 0x8f860120, +0xaf420034, 0x8c03023c, 0x43102b, 0x14400102, +0x32c20010, 0x10400018, 0x24070008, 0x8f440170, +0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x10400047, -0x24020001, 0x8f4202f0, 0x8f43002c, 0x24420001, -0xaf4202f0, 0x8f4202f0, 0x24020001, 0xa34205b2, -0x1000007c, 0xaf430038, 0x8f440160, 0x8f450164, +0x24020001, 0x8f420300, 0x8f43002c, 0x24420001, +0xaf420300, 0x8f420300, 0x24020001, 0xa34205c1, +0x1000007c, 0xaf430038, 0x8f440170, 0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020020, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x10400057, 0x24020001, 0x10000065, 0x0, 0x32420012, 0x10400075, 0x32420001, 0x9622000e, 0x8f43009c, 0x621821, -0x32c20020, 0x10400005, 0xaf43009c, 0x8f420348, -0x2442ffff, 0xaf420348, 0x8f420348, 0x8e22001c, +0x32c20020, 0x10400005, 0xaf43009c, 0x8f420358, +0x2442ffff, 0xaf420358, 0x8f420358, 0x8e22001c, 0x8f430040, 0x24420001, 0x2463ffff, 0x431024, 0xaf42002c, 0x32420010, 0x14400008, 0x32c20010, 0x8f420034, 0x24420001, 0xaf420034, 0x8c03023c, -0x43102b, 0x144000ce, 0x32c20010, 0x10400028, -0x24070008, 0x8f440160, 0x8f450164, 0x8f43002c, +0x43102b, 0x144000bc, 0x32c20010, 0x10400028, +0x24070008, 0x8f440170, 0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020080, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f1, 0x8f820124, 0xafa20010, -0x8f820128, 0x3c040001, 0x248438e4, 0xafa20014, -0x8f46002c, 0x8f870120, 0x3c050009, 0xc002a03, -0x34a51100, 0x10000036, 0x0, 0x8f4202f0, -0x8f43002c, 0x24420001, 0xaf4202f0, 0x8f4202f0, -0x24020001, 0xa34205b2, 0x10000026, 0xaf430038, -0x8f440160, 0x8f450164, 0x8f43002c, 0x8f48000c, +0x8f820128, 0x3c040001, 0x248467c4, 0xafa20014, +0x8f46002c, 0x8f870120, 0x3c050009, 0xc002b3b, +0x34a51100, 0x10000036, 0x0, 0x8f420300, +0x8f43002c, 0x24420001, 0xaf420300, 0x8f420300, +0x24020001, 0xa34205c1, 0x10000026, 0xaf430038, +0x8f440170, 0x8f450174, 0x8f43002c, 0x8f48000c, 0x8f860120, 0x24020020, 0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, 0x24020001, 0x3c010001, 0x370821, 0xa02240f0, 0x8f820124, 0xafa20010, 0x8f820128, -0x3c040001, 0x248438d8, 0xafa20014, 0x8f46002c, -0x8f870120, 0x3c050009, 0xc002a03, 0x34a50900, -0x1000000f, 0x0, 0x8f4202f0, 0x24420001, -0xaf4202f0, 0x8f4202f0, 0x8f42002c, 0xa34005b2, +0x3c040001, 0x248467b8, 0xafa20014, 0x8f46002c, +0x8f870120, 0x3c050009, 0xc002b3b, 0x34a50900, +0x1000000f, 0x0, 0x8f420300, 0x24420001, +0xaf420300, 0x8f420300, 0x8f42002c, 0xa34005c1, 0xaf420038, 0x3c010001, 0x370821, 0xa02040f1, 0x3c010001, 0x370821, 0xa02040f0, 0xaf400034, -0x8f420304, 0x24420001, 0xaf420304, 0x10000074, -0x8f420304, 0x10400022, 0x32427000, 0x8e25001c, +0x8f420314, 0x24420001, 0xaf420314, 0x10000062, +0x8f420314, 0x10400022, 0x32427000, 0x8e25001c, 0x8f420028, 0xa22023, 0x4810003, 0x0, -0x8f420040, 0x822021, 0x8f420348, 0x8f430000, -0xaf450028, 0x441021, 0x10600007, 0xaf420348, +0x8f420040, 0x822021, 0x8f420358, 0x8f430000, +0xaf450028, 0x441021, 0x10600007, 0xaf420358, 0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 0x0, 0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 0x34420008, 0xaf820060, 0x8f420000, 0x10400003, 0x0, -0x10000053, 0xaf80004c, 0x10000051, 0xaf800048, +0x10000041, 0xaf80004c, 0x1000003f, 0xaf800048, 0x1040002f, 0x32421000, 0x1040000c, 0x32424000, 0x8e23001c, 0x8f420050, 0x622023, 0x4820001, -0x24840200, 0x8f42034c, 0x441021, 0xaf42034c, -0x8f420358, 0x1000001a, 0xaf430050, 0x1040000c, +0x24840200, 0x8f42035c, 0x441021, 0xaf42035c, +0x8f420368, 0x1000001a, 0xaf430050, 0x1040000c, 0x32c28000, 0x8e23001c, 0x8f420070, 0x622023, -0x4820001, 0x24840400, 0x8f420354, 0x441021, -0xaf420354, 0x8f420358, 0x1000000d, 0xaf430070, +0x4820001, 0x24840400, 0x8f420364, 0x441021, +0xaf420364, 0x8f420368, 0x1000000d, 0xaf430070, 0x1040000e, 0x3c020800, 0x8e23001c, 0x8f420060, -0x622023, 0x4820001, 0x24840100, 0x8f420350, -0x441021, 0xaf420350, 0x8f420358, 0xaf430060, -0x441021, 0xaf420358, 0x3c020800, 0x2c21024, -0x50400023, 0x36940040, 0x10000021, 0x0, +0x622023, 0x4820001, 0x24840100, 0x8f420360, +0x441021, 0xaf420360, 0x8f420368, 0xaf430060, +0x441021, 0xaf420368, 0x3c020800, 0x2c21024, +0x50400011, 0x36940040, 0x1000000f, 0x0, 0x32420048, 0x10400007, 0x24150001, 0x8e22001c, -0x3c03ffff, 0x43f024, 0x3042ffff, 0x1000fd78, -0xae22001c, 0x32420100, 0x10400015, 0x0, -0x3c020001, 0x8c423d64, 0x1040000c, 0x0, -0x274301b0, 0x24650400, 0x65102b, 0x10400007, -0x26e40028, 0x8c820000, 0xac620000, 0x24630004, -0x65102b, 0x1440fffb, 0x24840004, 0x8f4202cc, -0xa34005b6, 0x24420001, 0xaf4202cc, 0x8f4202cc, -0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044, -0x8fb20040, 0x8fb1003c, 0x8fb00038, 0x3e00008, -0x27bd0058, 0x3e00008, 0x0, 0x8f8600e4, -0x8f8200e0, 0x2403fff8, 0x431024, 0x10c20007, -0x803821, 0x8cc20000, 0x8cc30004, 0xace20000, -0xace30004, 0x10000002, 0x24020001, 0x1021, -0x3e00008, 0x0, 0x3e00008, 0x0, -0x8f8300e4, 0x27623ff8, 0x14620002, 0x24620008, -0x27623000, 0x401821, 0xaf8300e8, 0xaf8300e4, -0x3e00008, 0x0, 0x3e00008, 0x0, -0x8f8400e0, 0x8f8800c4, 0x8f8300e8, 0x2402fff8, -0x823824, 0xe32023, 0x2c821000, 0x50400001, -0x24841000, 0x420c2, 0x801821, 0x8f440248, -0x8f45024c, 0x1021, 0xa32821, 0xa3302b, -0x822021, 0x862021, 0xaf440248, 0xaf45024c, -0x8f8300c8, 0x8f42013c, 0x1032023, 0x82102b, -0x14400004, 0x801821, 0x8f42013c, 0x822021, -0x801821, 0x8f440240, 0x8f450244, 0x1021, -0xa32821, 0xa3302b, 0x822021, 0x862021, -0xaf440240, 0xaf450244, 0xaf8800c8, 0xaf8700e4, -0xaf8700e8, 0x3e00008, 0x0, 0x27bdff30, -0x240a0001, 0xafbf00c8, 0xafbe00c4, 0xafb500c0, -0xafb300bc, 0xafb200b8, 0xafb100b4, 0xafb000b0, -0xa3a00097, 0xafa00044, 0xafaa005c, 0x934205b5, -0xa7a0008e, 0x1040000a, 0xa7a00086, 0x8f4b00c4, -0xafab0064, 0x8f4a00c0, 0xafaa006c, 0x8f4b00cc, -0xafab0074, 0x8f4a00c8, 0x10000125, 0xafaa007c, -0x8f420114, 0x40f809, 0x27a40020, 0x304200ff, -0x1040033b, 0x0, 0x8fab0024, 0x8faa0020, -0x3162ffff, 0x2442fffc, 0xafa2006c, 0x3c020006, -0x2c21024, 0xafab007c, 0x14400015, 0xafaa0064, -0x91420000, 0x30420001, 0x10400011, 0x2402ffff, -0x8d430000, 0x14620004, 0x3402ffff, 0x95430004, -0x1062000b, 0x0, 0xc002343, 0x8fa40064, -0x304200ff, 0x14400006, 0x0, 0x8f420118, -0x40f809, 0x0, 0x1000031d, 0x0, -0x8fa20024, 0x3c03ffbf, 0x3463ffff, 0x431024, -0x3c03ffff, 0x431824, 0x14600003, 0xafa20024, -0x10000040, 0x1821, 0x3c020080, 0x621024, -0x10400007, 0x0, 0x8f42037c, 0x24420001, -0xaf42037c, 0x8f42037c, 0x10000036, 0x24030001, -0x8f420200, 0x24420001, 0xaf420200, 0x8f420200, -0x3c020001, 0x621024, 0x10400006, 0x3c020002, -0x8f4201b4, 0x24420001, 0xaf4201b4, 0x8f4201b4, -0x3c020002, 0x621024, 0x10400006, 0x3c020004, -0x8f42036c, 0x24420001, 0xaf42036c, 0x8f42036c, -0x3c020004, 0x621024, 0x10400006, 0x3c020008, -0x8f420370, 0x24420001, 0xaf420370, 0x8f420370, -0x3c020008, 0x621024, 0x10400006, 0x3c020010, -0x8f420374, 0x24420001, 0xaf420374, 0x8f420374, -0x3c020010, 0x621024, 0x10400006, 0x3c020020, -0x8f4201b0, 0x24420001, 0xaf4201b0, 0x8f4201b0, -0x3c020020, 0x621024, 0x10400006, 0x24030001, -0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, -0x24030001, 0x8c020260, 0x8fab006c, 0x4b102b, -0x10400014, 0x307000ff, 0x8f4201d8, 0x24420001, -0xaf4201d8, 0x8f4201d8, 0x8faa007c, 0x8f8200e0, -0x354a0100, 0xafaa007c, 0xafa20010, 0x8f8200e4, -0x24100001, 0x3c040001, 0x248439b4, 0xafa20014, -0x8fa60020, 0x8fa70024, 0x3c050007, 0xc002a03, -0x34a50800, 0x12000010, 0x3c020080, 0x2c21024, -0x1440000e, 0x32c20400, 0x8fab007c, 0x3c020080, -0x34420100, 0x1621024, 0x10400005, 0x0, -0x8f4201fc, 0x24420001, 0xaf4201fc, 0x8f4201fc, -0x100002a0, 0x8fa3006c, 0x32c20400, 0x10400015, -0x34028100, 0x8faa0064, 0x9543000c, 0x14620012, -0x3c020100, 0x240b0200, 0xa7ab008e, 0x9542000e, -0x8d430008, 0x8d440004, 0x8d450000, 0x8faa006c, -0x8fab0064, 0x254afffc, 0xafaa006c, 0xa7a20086, -0xad63000c, 0xad640008, 0xad650004, 0x256b0004, -0xafab0064, 0x3c020100, 0x2c21024, 0x10400004, -0x0, 0x8faa006c, 0x254a0004, 0xafaa006c, -0x8f4200bc, 0x5040000a, 0xafa00074, 0x8fab006c, -0x4b102b, 0x50400006, 0xafa00074, 0x8f4200bc, -0x1621023, 0xafa20074, 0x8f4a00bc, 0xafaa006c, -0x8f420080, 0x8fab006c, 0x4b102b, 0x10400056, -0x32c28000, 0x1040005e, 0x240a0003, 0x32c21000, -0x1040005b, 0xafaa005c, 0x10000058, 0x240b0004, -0x8f420340, 0x2403ffbf, 0x283a024, 0x24420001, -0xaf420340, 0x1000023f, 0x8f420340, 0x2c2b025, -0x2402ffbf, 0x282a024, 0x8f830128, 0x3c040001, -0x248439e4, 0x26620001, 0xafa20014, 0xafa30010, -0x8f860120, 0x8f870124, 0x3c050007, 0xc002a03, -0x34a52250, 0x1000022f, 0x0, 0x2c2b025, -0x2402ffbf, 0x282a024, 0x8f830128, 0x3c040001, -0x248439e4, 0x24020002, 0xafa20014, 0xafa30010, -0x8f860120, 0x8f870124, 0x3c050007, 0xc002a03, -0x34a52450, 0x1000021f, 0x0, 0x8ea20000, -0x8ea30004, 0x3c040001, 0x248439fc, 0xafb00010, -0xafbe0014, 0x8ea70018, 0x34a52800, 0xc002a03, -0x603021, 0x10000213, 0x0, 0xa6b1000a, -0x8f820124, 0x3c040001, 0x24843a04, 0xafbe0014, -0xafa20010, 0x8f460044, 0x8f870120, 0x3c050007, -0xc002a03, 0x34a53000, 0x10000206, 0x0, -0xa6b1000a, 0xa6b2000e, 0x8f820124, 0x3c040001, -0x24843a10, 0xafbe0014, 0xafa20010, 0x8f460044, -0x8f870120, 0x3c050007, 0xc002a03, 0x34a53200, -0x100001f8, 0x0, 0x8f420084, 0x8faa006c, -0x4a102b, 0x14400007, 0x3c020001, 0x2c21024, -0x10400004, 0x0, 0x240b0002, 0xafab005c, -0x8faa006c, 0x1140020b, 0x27ab0020, 0xafab00a4, -0x3c0a001f, 0x354affff, 0xafaa009c, 0x8fab005c, -0x240a0001, 0x156a0021, 0x24020002, 0x8f430054, -0x8f420050, 0x1062000b, 0x274b0054, 0x8f5e0054, -0x3403ecc0, 0xafab004c, 0x27c20001, 0x304201ff, -0xafa20054, 0x1e1140, 0x431021, 0x1000006b, -0x2e2a821, 0x8f420044, 0x8faa006c, 0x3c040001, -0x248439c0, 0xafaa0014, 0xafa20010, 0x8f460054, -0x8f470050, 0x3c050007, 0xc002a03, 0x34a51300, -0x8f430340, 0x2402ffbf, 0x282a024, 0x24630001, -0xaf430340, 0x100001c3, 0x8f420340, 0x1562001d, -0x0, 0x8f430074, 0x8f420070, 0x1062000a, -0x274a0074, 0x8f5e0074, 0xafaa004c, 0x27c20001, -0x304203ff, 0xafa20054, 0x1e1140, 0x24426cc0, -0x1000004a, 0x2e2a821, 0x8f420044, 0x8fab006c, -0x3c040001, 0x248439cc, 0x3c050007, 0xafab0014, -0xafa20010, 0x8f460074, 0x8f470070, 0x34a51500, -0x240a0001, 0xc002a03, 0xafaa005c, 0x1000ffc3, -0x0, 0x8f430064, 0x8f420060, 0x1062001a, -0x274b0064, 0x8f5e0064, 0x8faa005c, 0xafab004c, -0x27c20001, 0x304200ff, 0xafa20054, 0x24020004, -0x1542000e, 0x1e1140, 0x1e1180, 0x24420cc0, -0x2e21021, 0xafa20044, 0x9442002a, 0x8fab0044, -0x8faa006c, 0x4a102b, 0x10400024, 0x25750020, -0x240b0001, 0x10000021, 0xa3ab0097, 0x24424cc0, -0x1000001e, 0x2e2a821, 0x8f420044, 0x8faa006c, -0x3c040001, 0x248439d8, 0xafaa0014, 0xafa20010, -0x8f460064, 0x8f470060, 0x3c050007, 0xc002a03, -0x34a51800, 0x3c020008, 0x2c21024, 0x1440ff34, -0x0, 0x8f420360, 0x240b0001, 0xafab005c, -0x24420001, 0xaf420360, 0x1000ff90, 0x8f420360, -0x27a30036, 0x131040, 0x621821, 0x94620000, -0x441021, 0x10000020, 0xa4620000, 0x8faa0064, -0xaeaa0018, 0x93a20097, 0x10400072, 0x9821, -0x8fab0044, 0x8fa4006c, 0x8fa300a4, 0x25620020, -0xafa20028, 0x25620008, 0xafa20030, 0x25620010, -0xafab002c, 0xafa20034, 0x9562002a, 0xa7a20038, -0x95620018, 0xa7a2003a, 0x9562001a, 0xa7a2003c, -0x9562001c, 0xa7a2003e, 0x94620018, 0x24630002, -0x822023, 0x1880ffde, 0x26730001, 0x2e620004, -0x1440fff9, 0x0, 0x8f4200fc, 0x26650001, -0xa2102a, 0x1440002b, 0x24030001, 0x8f83012c, -0x10600023, 0x0, 0x8f820124, 0x431023, +0x3c03ffff, 0x43f024, 0x3042ffff, 0x1000fd75, +0xae22001c, 0x32420100, 0x10400003, 0x0, +0xc002bd8, 0x0, 0x8fbf0050, 0x8fbe004c, +0x8fb50048, 0x8fb30044, 0x8fb20040, 0x8fb1003c, +0x8fb00038, 0x3e00008, 0x27bd0058, 0x3e00008, +0x0, 0x0, 0x0, 0x8f8300e4, +0x8f8200e0, 0x2404fff8, 0x441024, 0x621026, +0x2102b, 0x21023, 0x3e00008, 0x621024, +0x3e00008, 0x0, 0x27bdffe0, 0xafbf001c, +0xafb00018, 0x8f8600c4, 0x8f8400e0, 0x8f8500e4, +0x2402fff8, 0x821824, 0x10a30009, 0x27623ff8, +0x14a20002, 0x24a20008, 0x27623000, 0x408021, +0x16030005, 0x30820004, 0x10400004, 0xc02021, +0x10000022, 0x1021, 0x8e040000, 0x8f42011c, +0x14a20003, 0x0, 0x8f420120, 0xaf420114, +0x8ca30000, 0x8f420148, 0x831823, 0x43102b, +0x10400003, 0x0, 0x8f420148, 0x621821, +0x94a20006, 0x24420050, 0x62102b, 0x1440000f, +0xa01021, 0xafa40010, 0xafa30014, 0x8ca60000, +0x8ca70004, 0x3c040001, 0xc002b3b, 0x24846894, +0x8f42020c, 0x24420001, 0xaf42020c, 0x8f42020c, +0x1021, 0xaf9000e8, 0xaf9000e4, 0x8fbf001c, +0x8fb00018, 0x3e00008, 0x27bd0020, 0x3e00008, +0x0, 0x8f8400e0, 0x8f8800c4, 0x8f8300e8, +0x2402fff8, 0x823824, 0xe32023, 0x2c821000, +0x50400001, 0x24841000, 0x420c2, 0x801821, +0x8f440258, 0x8f45025c, 0x1021, 0xa32821, +0xa3302b, 0x822021, 0x862021, 0xaf440258, +0xaf45025c, 0x8f8300c8, 0x8f420148, 0x1032023, +0x82102b, 0x14400004, 0x801821, 0x8f420148, +0x822021, 0x801821, 0x8f440250, 0x8f450254, +0x1021, 0xa32821, 0xa3302b, 0x822021, +0x862021, 0xaf440250, 0xaf450254, 0xaf8800c8, +0xaf8700e4, 0xaf8700e8, 0x3e00008, 0x0, +0x27bdff30, 0x240a0001, 0xafbf00c8, 0xafbe00c4, +0xafb500c0, 0xafb300bc, 0xafb200b8, 0xafb100b4, +0xafb000b0, 0xa3a00097, 0xafa00044, 0xafaa005c, +0x934205c4, 0xa7a0008e, 0x1040000a, 0xa7a00086, +0x8f4b00c4, 0xafab0064, 0x8f4a00c0, 0xafaa006c, +0x8f4b00cc, 0xafab0074, 0x8f4a00c8, 0x10000129, +0xafaa007c, 0x8f420114, 0x40f809, 0x0, +0x403021, 0x10c0034f, 0x0, 0x8cc20000, +0x8cc30004, 0xafa20020, 0xafa30024, 0x8fab0024, +0x8faa0020, 0x3162ffff, 0x2442fffc, 0xafa2006c, +0x3c020006, 0x2c21024, 0xafab007c, 0x14400015, +0xafaa0064, 0x91420000, 0x30420001, 0x10400011, +0x2402ffff, 0x8d430000, 0x14620004, 0x3402ffff, +0x95430004, 0x1062000b, 0x0, 0xc0024bb, +0x8fa40064, 0x304200ff, 0x14400006, 0x0, +0x8f420118, 0x40f809, 0x0, 0x1000032d, +0x0, 0x8fa20024, 0x3c03ffbf, 0x3463ffff, +0x431024, 0x3c03ffff, 0x431824, 0x14600003, +0xafa20024, 0x10000040, 0x1821, 0x3c020080, +0x621024, 0x10400007, 0x0, 0x8f42038c, +0x24420001, 0xaf42038c, 0x8f42038c, 0x10000036, +0x24030001, 0x8f420210, 0x24420001, 0xaf420210, +0x8f420210, 0x3c020001, 0x621024, 0x10400006, +0x3c020002, 0x8f4201c4, 0x24420001, 0xaf4201c4, +0x8f4201c4, 0x3c020002, 0x621024, 0x10400006, +0x3c020004, 0x8f42037c, 0x24420001, 0xaf42037c, +0x8f42037c, 0x3c020004, 0x621024, 0x10400006, +0x3c020008, 0x8f420380, 0x24420001, 0xaf420380, +0x8f420380, 0x3c020008, 0x621024, 0x10400006, +0x3c020010, 0x8f420384, 0x24420001, 0xaf420384, +0x8f420384, 0x3c020010, 0x621024, 0x10400006, +0x3c020020, 0x8f4201c0, 0x24420001, 0xaf4201c0, +0x8f4201c0, 0x3c020020, 0x621024, 0x10400006, +0x24030001, 0x8f420388, 0x24420001, 0xaf420388, +0x8f420388, 0x24030001, 0x8c020260, 0x8fab006c, +0x4b102b, 0x10400014, 0x307000ff, 0x8f4201e8, +0x24420001, 0xaf4201e8, 0x8f4201e8, 0x8faa007c, +0x8f8200e0, 0x354a0100, 0xafaa007c, 0xafa20010, +0x8f8200e4, 0x24100001, 0x3c040001, 0x248468a0, +0xafa20014, 0x8fa60020, 0x8fa70024, 0x3c050007, +0xc002b3b, 0x34a50800, 0x12000010, 0x3c020080, +0x2c21024, 0x1440000e, 0x32c20400, 0x8fab007c, +0x3c020080, 0x34420100, 0x1621024, 0x10400005, +0x0, 0x8f42020c, 0x24420001, 0xaf42020c, +0x8f42020c, 0x100002b0, 0x8fa3006c, 0x32c20400, +0x10400015, 0x34028100, 0x8faa0064, 0x9543000c, +0x14620012, 0x3c020100, 0x240b0200, 0xa7ab008e, +0x9542000e, 0x8d430008, 0x8d440004, 0x8d450000, +0x8faa006c, 0x8fab0064, 0x254afffc, 0xafaa006c, +0xa7a20086, 0xad63000c, 0xad640008, 0xad650004, +0x256b0004, 0xafab0064, 0x3c020100, 0x2c21024, +0x10400004, 0x0, 0x8faa006c, 0x254a0004, +0xafaa006c, 0x8f4200bc, 0x5040000a, 0xafa00074, +0x8fab006c, 0x4b102b, 0x50400006, 0xafa00074, +0x8f4200bc, 0x1621023, 0xafa20074, 0x8f4a00bc, +0xafaa006c, 0x8f420080, 0x8fab006c, 0x4b102b, +0x10400056, 0x32c28000, 0x1040005e, 0x240a0003, +0x32c21000, 0x1040005b, 0xafaa005c, 0x10000058, +0x240b0004, 0x8f420350, 0x2403ffbf, 0x283a024, +0x24420001, 0xaf420350, 0x1000024f, 0x8f420350, +0x2c2b025, 0x2402ffbf, 0x282a024, 0x8f830128, +0x3c040001, 0x248468d0, 0x26620001, 0xafa20014, +0xafa30010, 0x8f860120, 0x8f870124, 0x3c050007, +0xc002b3b, 0x34a52250, 0x1000023f, 0x0, +0x2c2b025, 0x2402ffbf, 0x282a024, 0x8f830128, +0x3c040001, 0x248468d0, 0x24020002, 0xafa20014, +0xafa30010, 0x8f860120, 0x8f870124, 0x3c050007, +0xc002b3b, 0x34a52450, 0x1000022f, 0x0, +0x8ea20000, 0x8ea30004, 0x3c040001, 0x248468e8, +0xafb00010, 0xafbe0014, 0x8ea70018, 0x34a52800, +0xc002b3b, 0x603021, 0x10000223, 0x0, +0xa6b1000a, 0x8f820124, 0x3c040001, 0x248468f0, +0xafbe0014, 0xafa20010, 0x8f460044, 0x8f870120, +0x3c050007, 0xc002b3b, 0x34a53000, 0x10000216, +0x0, 0xa6b1000a, 0xa6b2000e, 0x8f820124, +0x3c040001, 0x248468fc, 0xafbe0014, 0xafa20010, +0x8f460044, 0x8f870120, 0x3c050007, 0xc002b3b, +0x34a53200, 0x10000208, 0x0, 0x8f420084, +0x8faa006c, 0x4a102b, 0x14400007, 0x3c020001, +0x2c21024, 0x10400004, 0x0, 0x240b0002, +0xafab005c, 0x8faa006c, 0x1140021b, 0x27ab0020, +0xafab00a4, 0x3c0a001f, 0x354affff, 0xafaa009c, +0x8fab005c, 0x240a0001, 0x556a0021, 0x240a0002, +0x8f430054, 0x8f420050, 0x1062000b, 0x274b0054, +0x8f5e0054, 0x3403ecc0, 0xafab004c, 0x27c20001, +0x304201ff, 0xafa20054, 0x1e1140, 0x431021, +0x1000006b, 0x2e2a821, 0x8f420044, 0x8faa006c, +0x3c040001, 0x248468ac, 0xafaa0014, 0xafa20010, +0x8f460054, 0x8f470050, 0x3c050007, 0xc002b3b, +0x34a51300, 0x8f430350, 0x2402ffbf, 0x282a024, +0x24630001, 0xaf430350, 0x100001d3, 0x8f420350, +0x156a001d, 0x0, 0x8f430074, 0x8f420070, +0x1062000a, 0x274b0074, 0x8f5e0074, 0xafab004c, +0x27c20001, 0x304203ff, 0xafa20054, 0x1e1140, +0x24426cc0, 0x1000004a, 0x2e2a821, 0x8f420044, +0x8faa006c, 0x3c040001, 0x248468b8, 0x3c050007, +0xafaa0014, 0xafa20010, 0x8f460074, 0x8f470070, +0x34a51500, 0x240b0001, 0xc002b3b, 0xafab005c, +0x1000ffc3, 0x0, 0x8f430064, 0x8f420060, +0x1062001a, 0x274a0064, 0x8f5e0064, 0x8fab005c, +0xafaa004c, 0x27c20001, 0x304200ff, 0xafa20054, +0x24020004, 0x1562000e, 0x1e1140, 0x1e1180, +0x24420cc0, 0x2e21021, 0xafa20044, 0x9442002a, +0x8faa0044, 0x8fab006c, 0x4b102b, 0x10400024, +0x25550020, 0x240a0001, 0x10000021, 0xa3aa0097, +0x24424cc0, 0x1000001e, 0x2e2a821, 0x8f420044, +0x8fab006c, 0x3c040001, 0x248468c4, 0xafab0014, +0xafa20010, 0x8f460064, 0x8f470060, 0x3c050007, +0xc002b3b, 0x34a51800, 0x3c020008, 0x2c21024, +0x1440ff34, 0x0, 0x8f420370, 0x240a0001, +0xafaa005c, 0x24420001, 0xaf420370, 0x1000ff90, +0x8f420370, 0x27a30036, 0x131040, 0x621821, +0x94620000, 0x441021, 0x10000020, 0xa4620000, +0x8fab0064, 0xaeab0018, 0x93a20097, 0x10400072, +0x9821, 0x8faa0044, 0x8fa4006c, 0x8fa300a4, +0x25420020, 0xafa20028, 0x25420008, 0xafa20030, +0x25420010, 0xafaa002c, 0xafa20034, 0x9542002a, +0xa7a20038, 0x95420018, 0xa7a2003a, 0x9542001a, +0xa7a2003c, 0x9542001c, 0xa7a2003e, 0x94620018, +0x24630002, 0x822023, 0x1880ffde, 0x26730001, +0x2e620004, 0x1440fff9, 0x0, 0x8f4200fc, +0x26650001, 0xa2102a, 0x1440002b, 0x24030001, +0x8f83012c, 0x10600023, 0x0, 0x8f820124, +0x431023, 0x22143, 0x58800001, 0x24840040, +0x8f820128, 0x431023, 0x21943, 0x58600001, +0x24630040, 0x64102a, 0x54400001, 0x602021, +0xaf4400fc, 0x8f4200fc, 0xa2102a, 0x10400011, +0x24030001, 0x10000015, 0x306200ff, 0x8fab0064, +0x96070018, 0xafab0010, 0x8e220008, 0x3c040001, +0x248468dc, 0x8c430004, 0x8c420000, 0x34a52400, +0x2403021, 0xc002b3b, 0xafa30014, 0x1000002b, +0x0, 0x8f420334, 0x1821, 0x24420001, +0xaf420334, 0x8f420334, 0x306200ff, 0x5040fedc, +0x3c020800, 0x12600021, 0x9021, 0x8fb100a4, +0x2208021, 0x8e220008, 0x96070018, 0x8fa60064, +0x8c440000, 0x8c450004, 0x240a0001, 0xafaa0010, +0xafbe0014, 0x8f420008, 0xafa20018, 0x8f42010c, +0x40f809, 0x0, 0x1040ffd8, 0x3c050007, +0x96020018, 0x8fab0064, 0x8faa009c, 0x1625821, +0x14b102b, 0x10400004, 0xafab0064, 0x8f420148, +0x1625823, 0xafab0064, 0x26100002, 0x26520001, +0x253102b, 0x1440ffe3, 0x26310004, 0x8fb0006c, +0x10000036, 0x97b10038, 0x8f4200fc, 0x24050002, +0xa2102a, 0x1440001b, 0x24030001, 0x8f83012c, +0x10600013, 0x0, 0x8f820124, 0x431023, 0x22143, 0x58800001, 0x24840040, 0x8f820128, 0x431023, 0x21943, 0x58600001, 0x24630040, 0x64102a, 0x54400001, 0x602021, 0xaf4400fc, -0x8f4200fc, 0xa2102a, 0x10400011, 0x24030001, -0x10000015, 0x306200ff, 0x8faa0064, 0x96070018, -0xafaa0010, 0x8e220008, 0x3c040001, 0x248439f0, -0x8c430004, 0x8c420000, 0x34a52400, 0x2403021, -0xc002a03, 0xafa30014, 0x1000002b, 0x0, -0x8f420324, 0x1821, 0x24420001, 0xaf420324, -0x8f420324, 0x306200ff, 0x5040fedc, 0x3c020800, -0x12600021, 0x9021, 0x8fb100a4, 0x2208021, -0x8e220008, 0x96070018, 0x8fa60064, 0x8c440000, -0x8c450004, 0x240b0001, 0xafab0010, 0xafbe0014, -0x8f420008, 0xafa20018, 0x8f42010c, 0x40f809, -0x0, 0x1040ffd8, 0x3c050007, 0x96020018, -0x8faa0064, 0x8fab009c, 0x1425021, 0x16a102b, -0x10400004, 0xafaa0064, 0x8f42013c, 0x1425023, -0xafaa0064, 0x26100002, 0x26520001, 0x253102b, -0x1440ffe3, 0x26310004, 0x8fb0006c, 0x10000036, -0x97b10038, 0x8f4200fc, 0x24050002, 0xa2102a, -0x1440001b, 0x24030001, 0x8f83012c, 0x10600013, -0x0, 0x8f820124, 0x431023, 0x22143, -0x58800001, 0x24840040, 0x8f820128, 0x431023, -0x21943, 0x58600001, 0x24630040, 0x64102a, -0x54400001, 0x602021, 0xaf4400fc, 0x8f4200fc, -0xa2102a, 0x14400006, 0x24030001, 0x8f420324, -0x1821, 0x24420001, 0xaf420324, 0x8f420324, -0x306200ff, 0x1040fea5, 0x3c020800, 0x96b1000a, -0x8fb0006c, 0x3223ffff, 0x70102b, 0x54400001, -0x608021, 0x8ea40000, 0x8ea50004, 0x240a0001, -0xafaa0010, 0xafbe0014, 0x8f420008, 0x8fa60064, -0xafa20018, 0x8f42010c, 0x40f809, 0x2003821, -0x1040fea2, 0x3c050007, 0x96a3000e, 0x97ab008e, -0x11600007, 0x609021, 0x934205b5, 0x14400004, -0x0, 0x97aa0086, 0x6b1825, 0xa6aa0016, -0x8fab007c, 0x3c02ffff, 0x1621024, 0x10400003, -0xb1402, 0x34630400, 0xa6a20014, 0x8faa006c, -0x560a0072, 0xa6a3000e, 0x34620004, 0xa6a2000e, -0x8fab0074, 0x14b1021, 0xa6a2000a, 0x8f430044, -0x8f440190, 0x8f450194, 0x34028000, 0xafa20010, -0x8f420044, 0x2a03021, 0x24070020, 0xafa20014, -0x8f42000c, 0x31940, 0x604821, 0xafa20018, -0x8f42010c, 0x4021, 0xa92821, 0xa9182b, -0x882021, 0x40f809, 0x832021, 0x5040fe7f, -0xa6b2000e, 0x8f420358, 0xafa0006c, 0xa34005b5, -0x2442ffff, 0xaf420358, 0x8faa005c, 0x240b0001, -0x8f420358, 0x154b0006, 0x24020002, 0x8f42034c, -0x2442ffff, 0xaf42034c, 0x1000000c, 0x8f42034c, -0x15420006, 0x0, 0x8f420354, 0x2442ffff, -0xaf420354, 0x10000005, 0x8f420354, 0x8f420350, -0x2442ffff, 0xaf420350, 0x8f420350, 0x8faa0054, -0x8fab004c, 0xad6a0000, 0x8f420044, 0x8f440088, -0x8f430078, 0x24420001, 0x441024, 0x24630001, -0xaf420044, 0xaf430078, 0x8c020240, 0x62182b, -0x14600065, 0x24070008, 0x8f440158, 0x8f45015c, -0x8f430044, 0x8f48000c, 0x8f860120, 0x24020040, -0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, -0x40f809, 0x24c6001c, 0x14400011, 0x240b0001, -0x3c010001, 0x370821, 0xa02b40f2, 0x8f820124, -0xafa20010, 0x8f820128, 0x3c040001, 0x248439ac, -0xafa20014, 0x8f460044, 0x8f870120, 0x3c050009, -0xc002a03, 0x34a51300, 0x1000000b, 0x0, -0x8f4202f4, 0x24420001, 0xaf4202f4, 0x8f4202f4, -0x8f420044, 0xaf42007c, 0x3c010001, 0x370821, -0xa02040f2, 0xaf400078, 0x8f420308, 0x24420001, -0xaf420308, 0x10000038, 0x8f420308, 0xa6b0000a, -0x8f430044, 0x8f440190, 0x8f450194, 0x34028000, +0x8f4200fc, 0xa2102a, 0x14400006, 0x24030001, +0x8f420334, 0x1821, 0x24420001, 0xaf420334, +0x8f420334, 0x306200ff, 0x1040fea5, 0x3c020800, +0x96b1000a, 0x8fb0006c, 0x3223ffff, 0x70102b, +0x54400001, 0x608021, 0x8ea40000, 0x8ea50004, +0x240b0001, 0xafab0010, 0xafbe0014, 0x8f420008, +0x8fa60064, 0xafa20018, 0x8f42010c, 0x40f809, +0x2003821, 0x1040fea2, 0x3c050007, 0x96a3000e, +0x97aa008e, 0x11400007, 0x609021, 0x934205c4, +0x14400004, 0x0, 0x97ab0086, 0x6a1825, +0xa6ab0016, 0x8faa007c, 0x3c02ffff, 0x1421024, +0x10400003, 0xa1402, 0x34630400, 0xa6a20014, +0x8fab006c, 0x560b0072, 0xa6a3000e, 0x34620004, +0xa6a2000e, 0x8faa0074, 0x16a1021, 0xa6a2000a, +0x8f430044, 0x8f4401a0, 0x8f4501a4, 0x34028000, 0xafa20010, 0x8f420044, 0x2a03021, 0x24070020, 0xafa20014, 0x8f42000c, 0x31940, 0x604821, 0xafa20018, 0x8f42010c, 0x4021, 0xa92821, 0xa9182b, 0x882021, 0x40f809, 0x832021, -0x1040fe1f, 0x240a0001, 0xa34a05b5, 0x8fab006c, -0x8faa0064, 0x1705823, 0xafab006c, 0x8fab009c, -0x1505021, 0x16a102b, 0x10400004, 0xafaa0064, -0x8f42013c, 0x1425023, 0xafaa0064, 0x8f420358, -0x2442ffff, 0xaf420358, 0x8f420358, 0x8f42034c, -0x2442ffff, 0xaf42034c, 0x8fab0054, 0x8faa004c, -0x8f42034c, 0xad4b0000, 0x8f420044, 0x8f440088, -0x8f430078, 0x24420001, 0x441024, 0x24630001, -0xaf420044, 0xaf430078, 0x8faa006c, 0x1540fe1b, -0x0, 0x8fab006c, 0x1160001e, 0x0, -0x934205b5, 0x10400009, 0x0, 0x8faa0064, -0xaf4a00c4, 0xaf4b00c0, 0x8fab007c, 0xaf4b00c8, -0x8faa0074, 0x1000000e, 0xaf4a00cc, 0x97ab008e, -0x1160000b, 0x34038100, 0x8fa20020, 0x8c46000c, -0xa443000c, 0x97aa0086, 0x8c440004, 0x8c450008, -0xa44a000e, 0xac440000, 0xac450004, 0xac460008, -0x8f42033c, 0x24420001, 0xaf42033c, 0x10000010, -0x8f42033c, 0x8fab007c, 0x3164ffff, 0x2484fffc, -0x801821, 0x8f440240, 0x8f450244, 0x8f460118, -0x1021, 0xa32821, 0xa3382b, 0x822021, -0x872021, 0xaf440240, 0xc0f809, 0xaf450244, -0x8fbf00c8, 0x8fbe00c4, 0x8fb500c0, 0x8fb300bc, -0x8fb200b8, 0x8fb100b4, 0x8fb000b0, 0x3e00008, -0x27bd00d0, 0x3e00008, 0x0, 0x27bdff38, -0x240b0001, 0xafbf00c0, 0xafbe00bc, 0xafb500b8, -0xafb300b4, 0xafb200b0, 0xafb100ac, 0xafb000a8, -0xa3a00087, 0xafa00044, 0xafab005c, 0x934205b5, -0xa7a00076, 0x10400007, 0xa7a0007e, 0x8f4c00c0, -0xafac0064, 0x8f4b00c8, 0x8f5e00c4, 0x10000129, -0xafab006c, 0x8f420114, 0x40f809, 0x27a40020, -0x304200ff, 0x1040029a, 0x0, 0x8fac0024, -0x8fbe0020, 0x3182ffff, 0x2442fffc, 0xafa20064, -0x3c020006, 0x2c21024, 0x14400015, 0xafac006c, -0x93c20000, 0x30420001, 0x10400011, 0x2402ffff, -0x8fc30000, 0x14620004, 0x3402ffff, 0x97c30004, -0x1062000b, 0x0, 0xc002343, 0x3c02021, -0x304200ff, 0x14400006, 0x0, 0x8f420118, -0x40f809, 0x0, 0x1000027d, 0x0, -0x8fa20024, 0x3c03ffbf, 0x3463ffff, 0x431024, -0x3c03ffff, 0x431824, 0x14600003, 0xafa20024, -0x10000040, 0x8021, 0x3c020080, 0x621024, -0x10400007, 0x0, 0x8f42037c, 0x24420001, -0xaf42037c, 0x8f42037c, 0x10000036, 0x24100001, -0x8f420200, 0x24420001, 0xaf420200, 0x8f420200, -0x3c020001, 0x621024, 0x10400006, 0x3c020002, -0x8f4201b4, 0x24420001, 0xaf4201b4, 0x8f4201b4, -0x3c020002, 0x621024, 0x10400006, 0x3c020004, -0x8f42036c, 0x24420001, 0xaf42036c, 0x8f42036c, -0x3c020004, 0x621024, 0x10400006, 0x3c020008, -0x8f420370, 0x24420001, 0xaf420370, 0x8f420370, -0x3c020008, 0x621024, 0x10400006, 0x3c020010, -0x8f420374, 0x24420001, 0xaf420374, 0x8f420374, -0x3c020010, 0x621024, 0x10400006, 0x3c020020, -0x8f4201b0, 0x24420001, 0xaf4201b0, 0x8f4201b0, -0x3c020020, 0x621024, 0x10400006, 0x24100001, -0x8f420378, 0x24420001, 0xaf420378, 0x8f420378, -0x24100001, 0x8c020260, 0x8fab0064, 0x4b102b, -0x10400015, 0x320200ff, 0x8f4201d8, 0x24420001, -0xaf4201d8, 0x8f4201d8, 0x8fac006c, 0x8f8200e0, -0x358c0100, 0xafac006c, 0xafa20010, 0x8f8200e4, -0x24100001, 0x3c040001, 0x248439b4, 0xafa20014, -0x8fa60020, 0x8fa70024, 0x3c050007, 0xc002a03, -0x34a53600, 0x320200ff, 0x10400010, 0x3c020080, -0x2c21024, 0x1440000e, 0x32c20400, 0x8fab006c, -0x3c020080, 0x34420100, 0x1621024, 0x10400005, -0x0, 0x8f4201fc, 0x24420001, 0xaf4201fc, -0x8f4201fc, 0x100001ff, 0x8fa30064, 0x32c20400, -0x10400012, 0x34028100, 0x97c3000c, 0x1462000f, -0x0, 0x240c0200, 0xa7ac0076, 0x97c2000e, -0x8fc30008, 0x8fc40004, 0x8fab0064, 0x8fc50000, -0x256bfffc, 0xafab0064, 0xa7a2007e, 0xafc3000c, -0xafc40008, 0xafc50004, 0x27de0004, 0x8fa70064, -0x320200ff, 0x14400031, 0x3c020100, 0x97c3000c, -0x2c6205dd, 0x10400015, 0x2821, 0x32c20800, +0x5040fe7f, 0xa6b2000e, 0x8f420368, 0xafa0006c, +0xa34005c4, 0x2442ffff, 0xaf420368, 0x8fab005c, +0x240a0001, 0x8f420368, 0x156a0006, 0x240a0002, +0x8f42035c, 0x2442ffff, 0xaf42035c, 0x1000000c, +0x8f42035c, 0x156a0006, 0x0, 0x8f420364, +0x2442ffff, 0xaf420364, 0x10000005, 0x8f420364, +0x8f420360, 0x2442ffff, 0xaf420360, 0x8f420360, +0x8faa0054, 0x8fab004c, 0xad6a0000, 0x8f420044, +0x8f440088, 0x8f430078, 0x24420001, 0x441024, +0x24630001, 0xaf420044, 0xaf430078, 0x8c020240, +0x62182b, 0x14600075, 0x24070008, 0x8f440168, +0x8f45016c, 0x8f430044, 0x8f48000c, 0x8f860120, +0x24020040, 0xafa20010, 0xafa30014, 0xafa80018, +0x8f42010c, 0x40f809, 0x24c6001c, 0x14400011, +0x240b0001, 0x3c010001, 0x370821, 0xa02b40f2, +0x8f820124, 0xafa20010, 0x8f820128, 0x3c040001, +0x2484688c, 0xafa20014, 0x8f460044, 0x8f870120, +0x3c050009, 0xc002b3b, 0x34a51300, 0x1000000b, +0x0, 0x8f420304, 0x24420001, 0xaf420304, +0x8f420304, 0x8f420044, 0xaf42007c, 0x3c010001, +0x370821, 0xa02040f2, 0xaf400078, 0x8f420318, +0x24420001, 0xaf420318, 0x10000048, 0x8f420318, +0xa6b0000a, 0x8f430044, 0x8f4401a0, 0x8f4501a4, +0x34028000, 0xafa20010, 0x8f420044, 0x2a03021, +0x24070020, 0xafa20014, 0x8f42000c, 0x31940, +0x604821, 0xafa20018, 0x8f42010c, 0x4021, +0xa92821, 0xa9182b, 0x882021, 0x40f809, +0x832021, 0x1040fe1f, 0x240a0001, 0xa34a05c4, +0x8fab006c, 0x8faa0064, 0x1705823, 0xafab006c, +0x8fab009c, 0x1505021, 0x16a102b, 0x10400004, +0xafaa0064, 0x8f420148, 0x1425023, 0xafaa0064, +0x8f420368, 0x2442ffff, 0xaf420368, 0x8faa005c, +0x240b0001, 0x8f420368, 0x154b0006, 0x240b0002, +0x8f42035c, 0x2442ffff, 0xaf42035c, 0x1000000c, +0x8f42035c, 0x114b0006, 0x0, 0x8f420360, +0x2442ffff, 0xaf420360, 0x10000005, 0x8f420360, +0x8f420364, 0x2442ffff, 0xaf420364, 0x8f420364, +0x8fab0054, 0x8faa004c, 0xad4b0000, 0x8f420044, +0x8f440088, 0x8f430078, 0x24420001, 0x441024, +0x24630001, 0xaf420044, 0xaf430078, 0x8faa006c, +0x1540fe0b, 0x0, 0x8fab006c, 0x1160001e, +0x0, 0x934205c4, 0x10400009, 0x0, +0x8faa0064, 0xaf4a00c4, 0xaf4b00c0, 0x8fab007c, +0xaf4b00c8, 0x8faa0074, 0x1000000e, 0xaf4a00cc, +0x97ab008e, 0x1160000b, 0x34038100, 0x8fa20020, +0x8c46000c, 0xa443000c, 0x97aa0086, 0x8c440004, +0x8c450008, 0xa44a000e, 0xac440000, 0xac450004, +0xac460008, 0x8f42034c, 0x24420001, 0xaf42034c, +0x10000010, 0x8f42034c, 0x8fab007c, 0x3164ffff, +0x2484fffc, 0x801821, 0x8f440250, 0x8f450254, +0x8f460118, 0x1021, 0xa32821, 0xa3382b, +0x822021, 0x872021, 0xaf440250, 0xc0f809, +0xaf450254, 0x8fbf00c8, 0x8fbe00c4, 0x8fb500c0, +0x8fb300bc, 0x8fb200b8, 0x8fb100b4, 0x8fb000b0, +0x3e00008, 0x27bd00d0, 0x3e00008, 0x0, +0x27bdff38, 0x240b0001, 0xafbf00c0, 0xafbe00bc, +0xafb500b8, 0xafb300b4, 0xafb200b0, 0xafb100ac, +0xafb000a8, 0xa3a00087, 0xafa00044, 0xafab005c, +0x934205c4, 0xa7a00076, 0x10400007, 0xa7a0007e, +0x8f4c00c0, 0xafac0064, 0x8f4b00c8, 0x8f5e00c4, +0x10000130, 0xafab006c, 0x8f420114, 0x40f809, +0x0, 0x403021, 0x10c002a1, 0x0, +0x8cc20000, 0x8cc30004, 0xafa20020, 0xafa30024, +0x8fac0024, 0x8fbe0020, 0x3182ffff, 0x2442fffc, +0xafa20064, 0x3c020006, 0x2c21024, 0x14400015, +0xafac006c, 0x93c20000, 0x30420001, 0x10400011, +0x2402ffff, 0x8fc30000, 0x14620004, 0x3402ffff, +0x97c30004, 0x1062000b, 0x0, 0xc0024bb, +0x3c02021, 0x304200ff, 0x14400006, 0x0, +0x8f420118, 0x40f809, 0x0, 0x10000280, +0x0, 0x8fa20024, 0x3c03ffbf, 0x3463ffff, +0x431024, 0x3c03ffff, 0x431824, 0x14600003, +0xafa20024, 0x10000040, 0x8021, 0x3c020080, +0x621024, 0x10400007, 0x0, 0x8f42038c, +0x24420001, 0xaf42038c, 0x8f42038c, 0x10000036, +0x24100001, 0x8f420210, 0x24420001, 0xaf420210, +0x8f420210, 0x3c020001, 0x621024, 0x10400006, +0x3c020002, 0x8f4201c4, 0x24420001, 0xaf4201c4, +0x8f4201c4, 0x3c020002, 0x621024, 0x10400006, +0x3c020004, 0x8f42037c, 0x24420001, 0xaf42037c, +0x8f42037c, 0x3c020004, 0x621024, 0x10400006, +0x3c020008, 0x8f420380, 0x24420001, 0xaf420380, +0x8f420380, 0x3c020008, 0x621024, 0x10400006, +0x3c020010, 0x8f420384, 0x24420001, 0xaf420384, +0x8f420384, 0x3c020010, 0x621024, 0x10400006, +0x3c020020, 0x8f4201c0, 0x24420001, 0xaf4201c0, +0x8f4201c0, 0x3c020020, 0x621024, 0x10400006, +0x24100001, 0x8f420388, 0x24420001, 0xaf420388, +0x8f420388, 0x24100001, 0x8c020260, 0x8fab0064, +0x4b102b, 0x10400015, 0x320200ff, 0x8f4201e8, +0x24420001, 0xaf4201e8, 0x8f4201e8, 0x8fac006c, +0x8f8200e0, 0x358c0100, 0xafac006c, 0xafa20010, +0x8f8200e4, 0x24100001, 0x3c040001, 0x248468a0, +0xafa20014, 0x8fa60020, 0x8fa70024, 0x3c050007, +0xc002b3b, 0x34a53600, 0x320200ff, 0x10400010, +0x3c020080, 0x2c21024, 0x1440000e, 0x32c20400, +0x8fab006c, 0x3c020080, 0x34420100, 0x1621024, +0x10400005, 0x0, 0x8f42020c, 0x24420001, +0xaf42020c, 0x8f42020c, 0x10000202, 0x8fa30064, +0x32c20400, 0x10400012, 0x34028100, 0x97c3000c, +0x1462000f, 0x0, 0x240c0200, 0xa7ac0076, +0x97c2000e, 0x8fc30008, 0x8fc40004, 0x8fab0064, +0x8fc50000, 0x256bfffc, 0xafab0064, 0xa7a2007e, +0xafc3000c, 0xafc40008, 0xafc50004, 0x27de0004, +0x8fa70064, 0x320200ff, 0x14400034, 0x3c020100, +0x97c4000c, 0x2c8305dd, 0x38828870, 0x2c420001, +0x621825, 0x10600015, 0x2821, 0x32c20800, 0x10400015, 0x24020800, 0x97c30014, 0x14620012, 0x3402aaaa, 0x97c3000e, 0x14620007, 0x2021, 0x97c30010, 0x24020300, 0x14620004, 0x801021, 0x97c20012, 0x2c440001, 0x801021, 0x54400006, 0x24050016, 0x10000004, 0x0, 0x24020800, -0x50620001, 0x2405000e, 0x10a00013, 0x3c52021, +0x50820001, 0x2405000e, 0x10a00013, 0x3c52021, 0x24830009, 0x3c02001f, 0x3442ffff, 0x43102b, -0x10400003, 0x0, 0x8f42013c, 0x621823, +0x10400003, 0x0, 0x8f420148, 0x621823, 0x90620000, 0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x10600004, 0x3c020100, 0x94820002, 0x453821, 0x3c020100, 0x2c21024, 0x5040000e, 0xafa70064, 0x8fac0064, 0x10ec0008, -0x3c050007, 0x3c040001, 0x24843a1c, 0x8fa60064, -0x34a54000, 0xafa00010, 0xc002a03, 0xafa00014, +0x3c050007, 0x3c040001, 0x24846908, 0x8fa60064, +0x34a54000, 0xafa00010, 0xc002b3b, 0xafa00014, 0x8fab0064, 0x256b0004, 0xafab0064, 0x8f420080, 0x8fac0064, 0x4c102b, 0x1040002c, 0x32c28000, 0x10400034, 0x240b0003, 0x32c21000, 0x10400031, -0xafab005c, 0x1000002e, 0x240c0004, 0x8f420340, -0x2403ffbf, 0x283a024, 0x24420001, 0xaf420340, -0x10000173, 0x8f420340, 0x3c020800, 0x2c2b025, +0xafab005c, 0x1000002e, 0x240c0004, 0x8f420350, +0x2403ffbf, 0x283a024, 0x24420001, 0xaf420350, +0x10000173, 0x8f420350, 0x3c020800, 0x2c2b025, 0x2402ffbf, 0x282a024, 0x8f830128, 0x3c040001, -0x248439e4, 0x26620001, 0xafa20014, 0xafa30010, -0x8f860120, 0x8f870124, 0x3c050007, 0xc002a03, +0x248468d0, 0x26620001, 0xafa20014, 0xafa30010, +0x8f860120, 0x8f870124, 0x3c050007, 0xc002b3b, 0x34a55300, 0x10000162, 0x0, 0x8ea20000, -0x8ea30004, 0x3c040001, 0x248439fc, 0xafb00010, -0xafb10014, 0x8ea70018, 0x34a55900, 0xc002a03, +0x8ea30004, 0x3c040001, 0x248468e8, 0xafb00010, +0xafb10014, 0x8ea70018, 0x34a55900, 0xc002b3b, 0x603021, 0x10000156, 0x0, 0x8f420084, 0x8fab0064, 0x4b102b, 0x14400007, 0x3c020001, 0x2c21024, 0x10400004, 0x0, 0x240c0002, @@ -6882,17 +7143,17 @@ 0x274b0054, 0x8f510054, 0x3403ecc0, 0xafab004c, 0x26220001, 0x304201ff, 0xafa20054, 0x111140, 0x431021, 0x1000006b, 0x2e2a821, 0x8f420044, -0x8fac0064, 0x3c040001, 0x248439c0, 0xafac0014, +0x8fac0064, 0x3c040001, 0x248468ac, 0xafac0014, 0xafa20010, 0x8f460054, 0x8f470050, 0x3c050007, -0xc002a03, 0x34a54300, 0x8f430340, 0x2402ffbf, -0x282a024, 0x24630001, 0xaf430340, 0x10000124, -0x8f420340, 0x156c001d, 0x0, 0x8f430074, +0xc002b3b, 0x34a54300, 0x8f430350, 0x2402ffbf, +0x282a024, 0x24630001, 0xaf430350, 0x10000124, +0x8f420350, 0x156c001d, 0x0, 0x8f430074, 0x8f420070, 0x1062000a, 0x274b0074, 0x8f510074, 0xafab004c, 0x26220001, 0x304203ff, 0xafa20054, 0x111140, 0x24426cc0, 0x1000004a, 0x2e2a821, -0x8f420044, 0x8fac0064, 0x3c040001, 0x248439cc, +0x8f420044, 0x8fac0064, 0x3c040001, 0x248468b8, 0x3c050007, 0xafac0014, 0xafa20010, 0x8f460074, -0x8f470070, 0x34a54500, 0x240b0001, 0xc002a03, +0x8f470070, 0x34a54500, 0x240b0001, 0xc002b3b, 0xafab005c, 0x1000ffc3, 0x0, 0x8f430064, 0x8f420060, 0x1062001a, 0x274c0064, 0x8f510064, 0x8fab005c, 0xafac004c, 0x26220001, 0x304200ff, @@ -6901,12 +7162,12 @@ 0x9442002a, 0x8fac0044, 0x8fab0064, 0x4b102b, 0x10400024, 0x25950020, 0x240c0001, 0x10000021, 0xa3ac0087, 0x24424cc0, 0x1000001e, 0x2e2a821, -0x8f420044, 0x8fab0064, 0x3c040001, 0x248439d8, +0x8f420044, 0x8fab0064, 0x3c040001, 0x248468c4, 0xafab0014, 0xafa20010, 0x8f460064, 0x8f470060, -0x3c050007, 0xc002a03, 0x34a54800, 0x3c020008, -0x2c21024, 0x1440ff61, 0x0, 0x8f420360, -0x240c0001, 0xafac005c, 0x24420001, 0xaf420360, -0x1000ff90, 0x8f420360, 0x27a30036, 0x131040, +0x3c050007, 0xc002b3b, 0x34a54800, 0x3c020008, +0x2c21024, 0x1440ff61, 0x0, 0x8f420370, +0x240c0001, 0xafac005c, 0x24420001, 0xaf420370, +0x1000ff90, 0x8f420370, 0x27a30036, 0x131040, 0x621821, 0x94620000, 0x441021, 0x1000001f, 0xa4620000, 0xaebe0018, 0x93a20087, 0x10400084, 0x9821, 0x8fab0044, 0x8fa40064, 0x8fa3008c, @@ -6924,11 +7185,11 @@ 0x8f4200fc, 0x262102a, 0x10400016, 0x24030001, 0x1000001a, 0x306200ff, 0x8fac008c, 0x101040, 0x4c1021, 0x94470018, 0x101080, 0x4c1021, -0xafbe0010, 0x8c420008, 0x3c040001, 0x248439f0, +0xafbe0010, 0x8c420008, 0x3c040001, 0x248468dc, 0x3c050007, 0x8c430004, 0x8c420000, 0x34a55500, -0x2003021, 0xc002a03, 0xafa30014, 0x10000039, -0x0, 0x8f420324, 0x1821, 0x24420001, -0xaf420324, 0x8f420324, 0x306200ff, 0x1040ff06, +0x2003021, 0xc002b3b, 0xafa30014, 0x10000039, +0x0, 0x8f420334, 0x1821, 0x24420001, +0xaf420334, 0x8f420334, 0x306200ff, 0x1040ff06, 0x8021, 0x8f430008, 0x2402fbff, 0x1260002d, 0x625024, 0x3c0b4000, 0x22b4025, 0x8fb1008c, 0x2669ffff, 0x2209021, 0x8e420008, 0x96270018, @@ -6939,37 +7200,37 @@ 0xafa80098, 0xafa9009c, 0x40f809, 0xafaa00a0, 0x8fa80098, 0x8fa9009c, 0x8faa00a0, 0x1040ffc2, 0x3c02001f, 0x96230018, 0x3442ffff, 0x3c3f021, -0x5e102b, 0x10400003, 0x26310002, 0x8f42013c, +0x5e102b, 0x10400003, 0x26310002, 0x8f420148, 0x3c2f023, 0x26100001, 0x213102b, 0x1440ffda, 0x26520004, 0x8fb00064, 0x1000001a, 0x0, 0x96a3000a, 0x8fb00064, 0x70102b, 0x54400001, 0x608021, 0x8ea40000, 0x8ea50004, 0x8fab005c, -0x240c0002, 0xafac0010, 0x934305b5, 0xb1700, +0x240c0002, 0xafac0010, 0x934305c4, 0xb1700, 0x10600003, 0x2223025, 0x3c020800, 0xc23025, 0xafa60014, 0x8f420008, 0xafa20018, 0x8f42010c, 0x3c03021, 0x40f809, 0x2003821, 0x1040fecb, 0x3c050007, 0x97ac0076, 0x11800007, 0x96a3000e, -0x934205b5, 0x14400004, 0x0, 0x97ab007e, +0x934205c4, 0x14400004, 0x0, 0x97ab007e, 0x6c1825, 0xa6ab0016, 0x8fac006c, 0x3c02ffff, 0x1821024, 0x10400003, 0xc1402, 0x34630400, 0xa6a20014, 0xa6b0000a, 0x8fab0064, 0x560b0006, 0x3d0f021, 0x34620004, 0xafa00064, 0xa6a2000e, -0x1000000d, 0xa34005b5, 0x8fac0064, 0x3c02001f, +0x1000000d, 0xa34005c4, 0x8fac0064, 0x3c02001f, 0x3442ffff, 0x5e102b, 0x1906023, 0xafac0064, -0xa6a3000e, 0x240b0001, 0x10400003, 0xa34b05b5, -0x8f42013c, 0x3c2f023, 0x8fab0054, 0x8fac004c, +0xa6a3000e, 0x240b0001, 0x10400003, 0xa34b05c4, +0x8f420148, 0x3c2f023, 0x8fab0054, 0x8fac004c, 0xad8b0000, 0x8fac0064, 0x1580feba, 0x0, -0x8fab0064, 0x1160001b, 0x0, 0x934205b5, +0x8fab0064, 0x1160001b, 0x0, 0x934205c4, 0x10400006, 0x0, 0xaf5e00c4, 0xaf4b00c0, 0x8fac006c, 0x1000000e, 0xaf4c00c8, 0x97ab0076, 0x1160000b, 0x34038100, 0x8fa20020, 0x8c46000c, 0xa443000c, 0x97ac007e, 0x8c440004, 0x8c450008, 0xa44c000e, 0xac440000, 0xac450004, 0xac460008, -0x8f42033c, 0x24420001, 0xaf42033c, 0x10000010, -0x8f42033c, 0x8fab006c, 0x3164ffff, 0x2484fffc, -0x801821, 0x8f440240, 0x8f450244, 0x8f460118, +0x8f42034c, 0x24420001, 0xaf42034c, 0x10000010, +0x8f42034c, 0x8fab006c, 0x3164ffff, 0x2484fffc, +0x801821, 0x8f440250, 0x8f450254, 0x8f460118, 0x1021, 0xa32821, 0xa3382b, 0x822021, -0x872021, 0xaf440240, 0xc0f809, 0xaf450244, +0x872021, 0xaf440250, 0xc0f809, 0xaf450254, 0x8fbf00c0, 0x8fbe00bc, 0x8fb500b8, 0x8fb300b4, 0x8fb200b0, 0x8fb100ac, 0x8fb000a8, 0x3e00008, 0x27bd00c8, 0x3e00008, 0x0, 0x27bdffd8, @@ -6980,7 +7241,7 @@ 0x8f43004c, 0x10000005, 0x431023, 0x8f420054, 0x8f43004c, 0x431023, 0x2442ffff, 0x405021, 0x8a102a, 0x54400001, 0x805021, 0x8f49004c, -0x8f48004c, 0x8f440178, 0x8f45017c, 0x8f46004c, +0x8f48004c, 0x8f440188, 0x8f45018c, 0x8f46004c, 0x24071000, 0xafa70010, 0x84140, 0x1001821, 0x12a4821, 0x313001ff, 0xafb00014, 0x8f470014, 0x1021, 0x63140, 0xafa70018, 0xa32821, @@ -7003,13 +7264,13 @@ 0x8f420064, 0x8f43005c, 0x431023, 0x2442ffff, 0x403821, 0x87102a, 0x54400001, 0x803821, 0x8f42005c, 0x471021, 0x305000ff, 0x32c21000, -0x10400015, 0x24082000, 0x8f49005c, 0x8f440180, -0x8f450184, 0x8f46005c, 0x73980, 0xafa80010, +0x10400015, 0x24082000, 0x8f49005c, 0x8f440190, +0x8f450194, 0x8f46005c, 0x73980, 0xafa80010, 0xafb00014, 0x8f480014, 0x94980, 0x1201821, 0x1021, 0xa32821, 0xa3482b, 0x822021, 0x892021, 0x63180, 0xafa80018, 0x8f420108, -0x10000014, 0x24c60cc0, 0x8f49005c, 0x8f440180, -0x8f450184, 0x8f46005c, 0x73940, 0xafa80010, +0x10000014, 0x24c60cc0, 0x8f49005c, 0x8f440190, +0x8f450194, 0x8f46005c, 0x73940, 0xafa80010, 0xafb00014, 0x8f480014, 0x94940, 0x1201821, 0x1021, 0xa32821, 0xa3482b, 0x822021, 0x892021, 0x63140, 0xafa80018, 0x8f420108, @@ -7030,7 +7291,7 @@ 0x10000005, 0x431023, 0x8f420074, 0x8f43006c, 0x431023, 0x2442ffff, 0x405021, 0x8a102a, 0x54400001, 0x805021, 0x8f49006c, 0x8f48006c, -0x8f440188, 0x8f45018c, 0x8f46006c, 0x24074000, +0x8f440198, 0x8f45019c, 0x8f46006c, 0x24074000, 0xafa70010, 0x84140, 0x1001821, 0x12a4821, 0x313003ff, 0xafb00014, 0x8f470014, 0x1021, 0x63140, 0x24c66cc0, 0xafa70018, 0xa32821, @@ -7062,277 +7323,285 @@ 0x30420001, 0x14400008, 0x2021, 0x8c030104, 0x24020001, 0x50620005, 0x24040001, 0x8c020264, 0x10400003, 0x801021, 0x24040001, 0x801021, -0x10400006, 0x0, 0x8f4202fc, 0x24420001, -0xaf4202fc, 0x10000008, 0x8f4202fc, 0x8f820044, -0x34420004, 0xaf820044, 0x8f4202f8, 0x24420001, -0xaf4202f8, 0x8f4202f8, 0x3e00008, 0x0, -0x3e00008, 0x0, 0x27bdffa0, 0xafbf0058, -0xafbe0054, 0xafb50050, 0xafb3004c, 0xafb20048, -0xafb10044, 0xafb00040, 0x8f4200fc, 0x24420001, +0x10400006, 0x0, 0x8f42030c, 0x24420001, +0xaf42030c, 0x10000008, 0x8f42030c, 0x8f820044, +0x34420004, 0xaf820044, 0x8f420308, 0x24420001, +0xaf420308, 0x8f420308, 0x3e00008, 0x0, +0x3e00008, 0x0, 0x27bdff98, 0xafbf0060, +0xafbe005c, 0xafb50058, 0xafb30054, 0xafb20050, +0xafb1004c, 0xafb00048, 0x8f4200fc, 0x24420001, 0xaf4200fc, 0x8f880128, 0x25020020, 0xaf820128, 0x8d030018, 0x30620070, 0x1040002e, 0x30620020, 0x10400004, 0x3c020010, 0x2c21024, 0x1040000d, 0x0, 0x30620040, 0x10400004, 0x3c020020, 0x2c21024, 0x10400007, 0x0, 0x30620010, -0x10400193, 0x3c020040, 0x2c21024, 0x14400190, +0x104001a9, 0x3c020040, 0x2c21024, 0x144001a6, 0x0, 0x8f820040, 0x30420001, 0x14400008, 0x2021, 0x8c030104, 0x24020001, 0x50620005, 0x24040001, 0x8c020264, 0x10400003, 0x801021, 0x24040001, 0x801021, 0x10400006, 0x0, -0x8f4202fc, 0x24420001, 0xaf4202fc, 0x1000017c, -0x8f4202fc, 0x8f820044, 0x34420004, 0xaf820044, -0x8f4202f8, 0x24420001, 0xaf4202f8, 0x10000174, -0x8f4202f8, 0x30620002, 0x10400135, 0x3c020800, -0x8d0a001c, 0x1422024, 0xafaa0024, 0xa5702, -0xafaa0034, 0x8faa0024, 0x314affff, 0xafaa0024, -0x950a0016, 0xafaa002c, 0x8faa0034, 0x24020001, -0x15420007, 0x24020002, 0x8faa0024, 0xa1140, -0x3403ecc0, 0x431021, 0x10000014, 0x2e2a821, -0x15420006, 0x24020003, 0x8faa0024, 0xa1140, -0x24426cc0, 0x1000000d, 0x2e2a821, 0x8faa0034, -0x15420006, 0x0, 0x8faa0024, 0xa1140, -0x24424cc0, 0x10000005, 0x2e2a821, 0x8faa0024, -0xa1180, 0x571021, 0x24550ce0, 0x96a2000e, -0x305efffc, 0x30420400, 0x144000c5, 0x8821, -0x10800004, 0x24091000, 0x97b1002e, 0x100000c1, -0x0, 0x8eb30018, 0x9663000c, 0x2c6205dd, -0x10400015, 0x2021, 0x32c20800, 0x10400015, -0x24020800, 0x96630014, 0x14620012, 0x3402aaaa, -0x9663000e, 0x14620007, 0x2821, 0x96630010, -0x24020300, 0x14620004, 0xa01021, 0x96620012, -0x2c450001, 0xa01021, 0x54400006, 0x24040016, -0x10000004, 0x0, 0x24020800, 0x50620001, -0x2404000e, 0x108000a2, 0x2649021, 0x92420000, -0x3042000f, 0x28080, 0x32c20100, 0x1040001e, -0x2501821, 0x3c020020, 0x43102b, 0x1440000e, -0x2402021, 0x2821, 0x94820000, 0x24840002, -0xa22821, 0x83102b, 0x1440fffb, 0x30a2ffff, -0x51c02, 0x622821, 0x51c02, 0x30a2ffff, -0x10000009, 0x622821, 0x8f47013c, 0x8f420110, -0x102842, 0x3c060020, 0x40f809, 0xafa80038, -0x3045ffff, 0x8fa80038, 0x50a00001, 0x3405ffff, -0x10000002, 0x37de0002, 0x2821, 0x32c20080, -0x1040007b, 0xa6a50010, 0x26430009, 0x3c02001f, +0x8f42030c, 0x24420001, 0xaf42030c, 0x10000192, +0x8f42030c, 0x8f820044, 0x34420004, 0xaf820044, +0x8f420308, 0x24420001, 0xaf420308, 0x1000018a, +0x8f420308, 0x30620002, 0x1040014b, 0x3c020800, +0x8d1e001c, 0x1e5702, 0xafaa0034, 0x950a0016, +0x3c22024, 0xafaa0024, 0x8faa0034, 0x24020001, +0x15420006, 0x33deffff, 0x1e1140, 0x3403ecc0, +0x431021, 0x10000010, 0x2e2a821, 0x24020002, +0x15420005, 0x24020003, 0x1e1140, 0x24426cc0, +0x10000009, 0x2e2a821, 0x15420005, 0x1e1180, +0x1e1140, 0x24424cc0, 0x10000003, 0x2e2a821, +0x571021, 0x24550ce0, 0x96a2000e, 0x304afffc, +0x30420400, 0x10400003, 0xafaa002c, 0x100000e1, +0x8821, 0x10800004, 0x8821, 0x97b10026, +0x100000dd, 0xa6b10012, 0x8eb30018, 0x966a000c, +0xa7aa003e, 0x97a5003e, 0x2ca305dd, 0x38a28870, +0x2c420001, 0x621825, 0x10600015, 0x2021, +0x32c20800, 0x10400015, 0x24020800, 0x96630014, +0x14620012, 0x3402aaaa, 0x9663000e, 0x14620007, +0x2821, 0x96630010, 0x24020300, 0x14620004, +0xa01021, 0x96620012, 0x2c450001, 0xa01021, +0x54400006, 0x24040016, 0x10000004, 0x0, +0x24020800, 0x50a20001, 0x2404000e, 0x108000b9, +0x2649021, 0x92420000, 0x3042000f, 0x28080, +0x32c20100, 0x10400020, 0x2501821, 0x3c020020, +0x43102b, 0x1440000e, 0x2402021, 0x2821, +0x94820000, 0x24840002, 0xa22821, 0x83102b, +0x1440fffb, 0x30a2ffff, 0x51c02, 0x622821, +0x51c02, 0x30a2ffff, 0x10000009, 0x622821, +0x8f470148, 0x8f420110, 0x102842, 0x3c060020, +0x40f809, 0xafa80040, 0x3045ffff, 0x8fa80040, +0x50a00001, 0x3405ffff, 0x8faa002c, 0x354a0002, +0x10000002, 0xafaa002c, 0x2821, 0x32c20080, +0x10400090, 0xa6a50010, 0x26430009, 0x3c02001f, 0x3442ffff, 0x43102b, 0x10400003, 0x0, -0x8f42013c, 0x621823, 0x90660000, 0x30c200ff, +0x8f420148, 0x621823, 0x90660000, 0x30c200ff, 0x38430006, 0x2c630001, 0x38420011, 0x2c420001, -0x621825, 0x1060006b, 0x24091000, 0x8821, -0x2602021, 0x94820000, 0x24840002, 0x2228821, -0x92102b, 0x1440fffb, 0x111c02, 0x3222ffff, -0x628821, 0x111c02, 0x3222ffff, 0x628821, -0x32c20200, 0x10400003, 0x26440006, 0x1000003e, -0x8021, 0x3c05001f, 0x34a5ffff, 0xa4102b, -0x10400003, 0x0, 0x8f42013c, 0x822023, -0x94820000, 0x30421fff, 0x10400004, 0x2644000c, -0x96420002, 0x10000030, 0x508023, 0x96420002, -0x26430014, 0x508023, 0x3c020020, 0x43102b, -0x1440000a, 0xd08021, 0x9642000c, 0x2028021, -0x9642000e, 0x96430010, 0x96440012, 0x2028021, -0x2038021, 0x10000020, 0x2048021, 0xa4102b, -0x10400003, 0x0, 0x8f42013c, 0x822023, -0x94820000, 0x24840002, 0x2028021, 0xa4102b, -0x10400003, 0x0, 0x8f42013c, 0x822023, -0x94820000, 0x24840002, 0x2028021, 0xa4102b, -0x10400003, 0x0, 0x8f42013c, 0x822023, -0x94820000, 0x24840002, 0x2028021, 0xa4102b, -0x10400003, 0x0, 0x8f42013c, 0x822023, -0x94820000, 0x2028021, 0x3c020100, 0x2c21024, -0x1040000c, 0x33c20004, 0x1040000a, 0x0, -0x9504000e, 0x2642021, 0xc003cf8, 0x2484fffc, -0x3042ffff, 0x2228821, 0x111c02, 0x3222ffff, -0x628821, 0x8faa002c, 0x1518823, 0x111402, -0x2228821, 0x2308821, 0x111402, 0x2228821, -0x3231ffff, 0x52200001, 0x3411ffff, 0x37de0001, -0x24091000, 0x33c20004, 0xa6b10012, 0x10400002, -0xa6be000e, 0x34098000, 0x8f480044, 0x8f440190, -0x8f450194, 0xafa90010, 0x8f490044, 0x84140, -0x1001821, 0xafa90014, 0x8f48000c, 0x2a03021, -0x24070020, 0xafa80018, 0x8f48010c, 0x1021, -0xa32821, 0xa3482b, 0x822021, 0x100f809, -0x892021, 0x1440000c, 0x0, 0x8f820128, -0x8faa0024, 0x3c040001, 0x24843a28, 0xafaa0014, -0xafa20010, 0x8f860124, 0x8f870120, 0x3c050007, -0xc002a03, 0x34a59920, 0x8f420358, 0x2442ffff, -0xaf420358, 0x8f420044, 0x8f430088, 0x24420001, -0x431024, 0xaf420044, 0x8faa0034, 0x8f440358, -0x24020001, 0x15420006, 0x24020002, 0x8f42034c, -0x2442ffff, 0xaf42034c, 0x10000049, 0x8f42034c, -0x15420006, 0x0, 0x8f420354, 0x2442ffff, -0xaf420354, 0x10000042, 0x8f420354, 0x8f420350, -0x2442ffff, 0xaf420350, 0x1000003d, 0x8f420350, -0x30621000, 0x10400005, 0x30628000, 0x8f420078, -0x24420001, 0x10000036, 0xaf420078, 0x10400034, -0x0, 0x8f420078, 0x24420001, 0xaf420078, -0x8c030240, 0x43102b, 0x1440002d, 0x24070008, -0x8f440158, 0x8f45015c, 0x8f430044, 0x8f48000c, -0x8f860120, 0x24020040, 0xafa20010, 0xafa30014, -0xafa80018, 0x8f42010c, 0x40f809, 0x24c6001c, -0x14400011, 0x24020001, 0x3c010001, 0x370821, -0xa02240f2, 0x8f820124, 0xafa20010, 0x8f820128, -0x3c040001, 0x248439ac, 0xafa20014, 0x8f460044, -0x8f870120, 0x3c050009, 0xc002a03, 0x34a51300, -0x1000000b, 0x0, 0x8f4202f4, 0x24420001, -0xaf4202f4, 0x8f4202f4, 0x8f420044, 0xaf42007c, -0x3c010001, 0x370821, 0xa02040f2, 0xaf400078, -0x8f420308, 0x24420001, 0xaf420308, 0x8f420308, -0x8fbf0058, 0x8fbe0054, 0x8fb50050, 0x8fb3004c, -0x8fb20048, 0x8fb10044, 0x8fb00040, 0x3e00008, -0x27bd0060, 0x3e00008, 0x0, 0x8f420130, -0xaf8200c0, 0x8f420130, 0xaf8200c4, 0x8f420130, -0xaf8200c8, 0x8f42012c, 0xaf8200d0, 0x8f42012c, -0xaf8200d4, 0x8f42012c, 0x3e00008, 0xaf8200d8, +0x621825, 0x1060007f, 0x24020800, 0x8821, +0x97a3003e, 0x1462000f, 0x2602021, 0x96710000, +0x96620002, 0x96630004, 0x96640006, 0x2228821, +0x2238821, 0x2248821, 0x96620008, 0x9663000a, +0x9664000c, 0x2228821, 0x2238821, 0x10000007, +0x2248821, 0x94820000, 0x24840002, 0x2228821, +0x92102b, 0x1440fffb, 0x0, 0x111c02, +0x3222ffff, 0x628821, 0x111c02, 0x3222ffff, +0x628821, 0x32c20200, 0x10400003, 0x26440006, +0x1000003e, 0x8021, 0x3c05001f, 0x34a5ffff, +0xa4102b, 0x10400003, 0x0, 0x8f420148, +0x822023, 0x94820000, 0x30421fff, 0x10400004, +0x2644000c, 0x96420002, 0x10000030, 0x508023, +0x96420002, 0x26430014, 0x508023, 0x3c020020, +0x43102b, 0x1440000a, 0xd08021, 0x9642000c, +0x2028021, 0x9642000e, 0x96430010, 0x96440012, +0x2028021, 0x2038021, 0x10000020, 0x2048021, +0xa4102b, 0x10400003, 0x0, 0x8f420148, +0x822023, 0x94820000, 0x24840002, 0x2028021, +0xa4102b, 0x10400003, 0x0, 0x8f420148, +0x822023, 0x94820000, 0x24840002, 0x2028021, +0xa4102b, 0x10400003, 0x0, 0x8f420148, +0x822023, 0x94820000, 0x24840002, 0x2028021, +0xa4102b, 0x10400003, 0x0, 0x8f420148, +0x822023, 0x94820000, 0x2028021, 0x3c020100, +0x2c21024, 0x1040000e, 0x0, 0x8faa002c, +0x31420004, 0x1040000a, 0x0, 0x9504000e, +0x2642021, 0xc003eec, 0x2484fffc, 0x3042ffff, +0x2228821, 0x111c02, 0x3222ffff, 0x628821, +0x8faa0024, 0x1518823, 0x111402, 0x2228821, +0x2308821, 0x111402, 0x2228821, 0x3231ffff, +0x52200001, 0x3411ffff, 0x8faa002c, 0x354a0001, +0xafaa002c, 0xa6b10012, 0x97aa002e, 0xa6aa000e, +0x8faa002c, 0x31420004, 0x10400002, 0x24091000, +0x34098000, 0x8f480044, 0x8f4401a0, 0x8f4501a4, +0xafa90010, 0x8f490044, 0x84140, 0x1001821, +0xafa90014, 0x8f48000c, 0x2a03021, 0x24070020, +0xafa80018, 0x8f48010c, 0x1021, 0xa32821, +0xa3482b, 0x822021, 0x100f809, 0x892021, +0x1440000b, 0x0, 0x8f820128, 0x3c040001, +0x24846914, 0xafbe0014, 0xafa20010, 0x8f860124, +0x8f870120, 0x3c050007, 0xc002b3b, 0x34a59920, +0x8f420368, 0x2442ffff, 0xaf420368, 0x8f420044, +0x8f430088, 0x24420001, 0x431024, 0xaf420044, +0x8faa0034, 0x8f440368, 0x24020001, 0x15420006, +0x24020002, 0x8f42035c, 0x2442ffff, 0xaf42035c, +0x10000049, 0x8f42035c, 0x15420006, 0x0, +0x8f420364, 0x2442ffff, 0xaf420364, 0x10000042, +0x8f420364, 0x8f420360, 0x2442ffff, 0xaf420360, +0x1000003d, 0x8f420360, 0x30621000, 0x10400005, +0x30628000, 0x8f420078, 0x24420001, 0x10000036, +0xaf420078, 0x10400034, 0x0, 0x8f420078, +0x24420001, 0xaf420078, 0x8c030240, 0x43102b, +0x1440002d, 0x24070008, 0x8f440168, 0x8f45016c, +0x8f430044, 0x8f48000c, 0x8f860120, 0x24020040, +0xafa20010, 0xafa30014, 0xafa80018, 0x8f42010c, +0x40f809, 0x24c6001c, 0x14400011, 0x24020001, +0x3c010001, 0x370821, 0xa02240f2, 0x8f820124, +0xafa20010, 0x8f820128, 0x3c040001, 0x2484688c, +0xafa20014, 0x8f460044, 0x8f870120, 0x3c050009, +0xc002b3b, 0x34a51300, 0x1000000b, 0x0, +0x8f420304, 0x24420001, 0xaf420304, 0x8f420304, +0x8f420044, 0xaf42007c, 0x3c010001, 0x370821, +0xa02040f2, 0xaf400078, 0x8f420318, 0x24420001, +0xaf420318, 0x8f420318, 0x8fbf0060, 0x8fbe005c, +0x8fb50058, 0x8fb30054, 0x8fb20050, 0x8fb1004c, +0x8fb00048, 0x3e00008, 0x27bd0068, 0x3e00008, +0x0, 0x0, 0x0, 0x8f42013c, +0xaf8200c0, 0x8f42013c, 0xaf8200c4, 0x8f42013c, +0xaf8200c8, 0x8f420138, 0xaf8200d0, 0x8f420138, +0xaf8200d4, 0x8f420138, 0x3e00008, 0xaf8200d8, 0x27bdffe0, 0x27840208, 0x24050200, 0xafbf0018, -0xc002a87, 0x24060008, 0x8c020204, 0xc003e1e, -0xaf820210, 0x2021, 0x8c060248, 0x24020004, -0x3c010001, 0xac223e28, 0xc0048a8, 0x24050004, -0x3c020001, 0x8c423e24, 0x30420001, 0x10400007, -0x24020001, 0x3c010001, 0xac223e28, 0x2021, -0x24050001, 0xc0048a8, 0x3c06601b, 0x3c040001, -0x24843af0, 0x8f420144, 0x8f430148, 0x3c050008, -0x8f46014c, 0x21640, 0x31940, 0x34630403, -0x431025, 0x633c0, 0x461025, 0xaf82021c, -0xafa00010, 0xafa00014, 0x8f86021c, 0x34a50200, -0xc002a03, 0x3821, 0x3c010001, 0xac203e20, -0x3c010001, 0xac203e38, 0x8fbf0018, 0x3e00008, -0x27bd0020, 0x27bdffe0, 0x3c050008, 0x34a50300, -0xafbf0018, 0xafa00010, 0xafa00014, 0x8f860200, -0x3c040001, 0x24843afc, 0xc002a03, 0x3821, -0x8f420400, 0x24420001, 0xaf420400, 0x8f420400, -0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffd8, -0xafbf0020, 0xafb1001c, 0xafb00018, 0x8f420394, -0x24420001, 0xaf420394, 0x8f420394, 0x8f900220, -0x8f4303a8, 0x3c020001, 0x8c423e38, 0x3c040001, -0x24843b08, 0x3c050008, 0xafa20014, 0xafa30010, -0x8f4703ac, 0x34a50400, 0xc002a03, 0x2003021, -0x3c024000, 0x2021024, 0x104000e1, 0x3c040100, -0x8f4203ac, 0x24420001, 0xaf4203ac, 0x8f4203ac, -0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, -0x34420004, 0xaf820220, 0x8f8200e0, 0x8f8300c4, -0x3c02001f, 0x3442ffff, 0x24690008, 0x49102b, -0x10400003, 0x0, 0x8f42013c, 0x1224823, -0x8f8700c8, 0x8f840120, 0x8f830124, 0x10000005, -0x5821, 0x8f42012c, 0x62102b, 0x50400001, -0x27634800, 0x1083000d, 0x316200ff, 0x8c620018, -0x2442ffff, 0x2c420002, 0x5040fff6, 0x24630020, -0x8f4203c0, 0x240b0001, 0x24420001, 0xaf4203c0, -0x8f4203c0, 0x8c670008, 0x316200ff, 0x14400078, -0x0, 0x934205b5, 0x14400075, 0x0, -0x8f8500e4, 0x8f8200e0, 0x2403fff8, 0x433024, -0xc51023, 0x218c3, 0x4620001, 0x24630100, -0x8f8a00c4, 0x10600005, 0x24020001, 0x10620009, -0x0, 0x10000021, 0x0, 0x8f4203b0, -0x1403821, 0x24420001, 0xaf4203b0, 0x10000060, -0x8f4203b0, 0x8f4203b4, 0x24420001, 0xaf4203b4, -0x8ca70000, 0x8f42013c, 0x8f4303b4, 0x1471823, -0x43102b, 0x10400004, 0x2c62233f, 0x8f42013c, -0x621821, 0x2c62233f, 0x14400051, 0x3c020100, -0xaca20004, 0x8f8200e8, 0x24420008, 0xaf8200e8, -0x8f8200e8, 0x8f8200e4, 0x1403821, 0x24420008, -0xaf8200e4, 0x10000046, 0x8f8200e4, 0x8f4203b8, -0x24420001, 0xaf4203b8, 0x8ca80000, 0x8f42013c, -0x8f4303b8, 0x1092023, 0x44102b, 0x10400003, -0x0, 0x8f42013c, 0x822021, 0x8f420140, -0x44102b, 0x10400003, 0x3c030100, 0x10000034, -0x1003821, 0x8ca20004, 0x431025, 0xaca20004, -0x8f8200e4, 0x24450008, 0xaf8500e4, 0x8f8500e4, -0x10a60025, 0x3c080100, 0x8f4201fc, 0x24420001, -0xaf4201fc, 0x8ca20004, 0x8f4301fc, 0x481024, -0x1440000e, 0x0, 0x8ca30000, 0x8f42013c, -0x692023, 0x44102b, 0x10400003, 0x0, -0x8f42013c, 0x822021, 0x8f420140, 0x44102b, -0x10400006, 0x0, 0x603821, 0x8f420140, -0x44102b, 0x1440000a, 0x0, 0x8ca20004, -0x481025, 0xaca20004, 0x8f8200e4, 0x24450008, -0xaf8500e4, 0x8f8500e4, 0x14a6ffdf, 0x0, -0x14a60005, 0x0, 0x1403821, 0xaf8600e4, -0x10000003, 0xaf8600e8, 0xaf8500e4, 0xaf8500e8, -0x8f8300c8, 0x8f42013c, 0x692023, 0x44102b, -0x10400003, 0x0, 0x8f42013c, 0x822021, -0x8f420140, 0x82102b, 0x50400008, 0x5821, -0x8f42013c, 0xe92023, 0x44102b, 0x10400003, -0x0, 0x8f42013c, 0x822021, 0x8f420140, -0x82102b, 0x10400006, 0x316200ff, 0x1440001b, -0x3c02fdff, 0x934205b5, 0x14400018, 0x3c02fdff, -0xaf8700c8, 0x8f8400c8, 0x8f8300c4, 0x8f42013c, -0x832023, 0x44102b, 0x10400003, 0x0, -0x8f42013c, 0x822021, 0x8f420140, 0x2c830001, -0x44102b, 0x431025, 0x50400008, 0x3c02fdff, -0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, -0x3c034000, 0x10000041, 0x431025, 0x3442ffff, -0x8f4303bc, 0x282a024, 0x24020001, 0xa34205b1, -0x24630001, 0xaf4303bc, 0x10000039, 0x8f4203bc, -0x2041024, 0x1040000e, 0x3c110200, 0x8f420398, -0x24420001, 0xaf420398, 0x8f420398, 0x8f820220, -0x3c0308ff, 0x3463ffff, 0x431024, 0x441025, -0xc003be0, 0xaf820220, 0x10000029, 0x0, -0x2111024, 0x50400008, 0x3c110400, 0x8f42039c, -0x24420001, 0xaf42039c, 0xc003be0, 0x8f42039c, -0x10000019, 0x0, 0x2111024, 0x1040001c, -0x0, 0x8f830224, 0x24021402, 0x14620009, -0x3c050008, 0x3c040001, 0x24843b14, 0xafa00010, -0xafa00014, 0x8f860224, 0x34a50500, 0xc002a03, -0x3821, 0x8f4203a0, 0x24420001, 0xaf4203a0, -0x8f4203a0, 0x8f820220, 0x2002021, 0x34420002, -0xc004640, 0xaf820220, 0x8f820220, 0x3c0308ff, -0x3463ffff, 0x431024, 0x511025, 0xaf820220, -0x8fbf0020, 0x8fb1001c, 0x8fb00018, 0x3e00008, -0x27bd0028, 0x3e00008, 0x0, 0x3c020001, -0x8c423e38, 0x27bdffb0, 0xafbf0048, 0xafbe0044, -0xafb50040, 0xafb3003c, 0xafb20038, 0xafb10034, -0x1040000f, 0xafb00030, 0x3c040001, 0x24843b20, -0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, -0x34a50600, 0x24020001, 0x3c010001, 0xac203e38, -0x3c010001, 0xac223e2c, 0xc002a03, 0x3821, -0x3c037fff, 0x8c020268, 0x3463ffff, 0x3c04fdff, -0x431024, 0xac020268, 0x8f420004, 0x3484ffff, -0x30420002, 0x10400092, 0x284a024, 0x3c040600, -0x34842000, 0x8f420004, 0x2821, 0x2403fffd, -0x431024, 0xaf420004, 0xafa40020, 0x8f5e0018, -0x27aa0020, 0x240200ff, 0x13c20002, 0xafaa002c, -0x27c50001, 0x8c020228, 0xa09021, 0x1642000e, -0x1e38c0, 0x8f42032c, 0x24420001, 0xaf42032c, -0x8f42032c, 0x8c020228, 0x3c040001, 0x24843ab8, -0x3c050009, 0xafa00014, 0xafa20010, 0x8fa60020, -0x1000006d, 0x34a50500, 0xf71021, 0x8fa30020, -0x8fa40024, 0xac4304c0, 0xac4404c4, 0x8f830054, -0x8f820054, 0x247003e8, 0x2021023, 0x2c4203e9, -0x1040001b, 0x9821, 0xe08821, 0x263504c0, -0x8f440168, 0x8f45016c, 0x2201821, 0x240a0004, -0xafaa0010, 0xafb20014, 0x8f48000c, 0x1021, -0x2f53021, 0xafa80018, 0x8f48010c, 0x24070008, -0xa32821, 0xa3482b, 0x822021, 0x100f809, -0x892021, 0x54400006, 0x24130001, 0x8f820054, -0x2021023, 0x2c4203e9, 0x1440ffe9, 0x0, -0x326200ff, 0x54400017, 0xaf520018, 0x8f420368, -0x24420001, 0xaf420368, 0x8f420368, 0x8f820120, +0xc002bbf, 0x24060008, 0x8c020204, 0xc004012, +0xaf820210, 0x3c020001, 0x8c426d94, 0x30420002, +0x1040000e, 0x2021, 0x8c060248, 0x24020002, +0x3c010001, 0xac226d98, 0xc005104, 0x24050002, +0x2021, 0x8c060248, 0x24020001, 0x3c010001, +0xac226d98, 0x10000011, 0x24050001, 0x8c060248, +0x24020004, 0x3c010001, 0xac226d98, 0xc005104, +0x24050004, 0x3c020001, 0x8c426d94, 0x30420001, +0x10400008, 0x24020001, 0x3c010001, 0xac226d98, +0x2021, 0x24050001, 0x3c06601b, 0xc005104, +0x0, 0x3c040001, 0x248469d0, 0x8f420150, +0x8f430154, 0x3c050008, 0x8f460158, 0x21640, +0x31940, 0x34630403, 0x431025, 0x633c0, +0x461025, 0xaf82021c, 0xafa00010, 0xafa00014, +0x8f86021c, 0x34a50200, 0xc002b3b, 0x3821, +0x3c010001, 0xac206d90, 0x3c010001, 0xac206da8, +0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffe0, +0x3c050008, 0x34a50300, 0xafbf0018, 0xafa00010, +0xafa00014, 0x8f860200, 0x3c040001, 0x248469dc, +0xc002b3b, 0x3821, 0x8f420410, 0x24420001, +0xaf420410, 0x8f420410, 0x8fbf0018, 0x3e00008, +0x27bd0020, 0x27bdffd8, 0xafbf0020, 0xafb1001c, +0xafb00018, 0x8f4203a4, 0x24420001, 0xaf4203a4, +0x8f4203a4, 0x8f900220, 0x8f8200e0, 0xafa20010, +0x8f8200e4, 0xafa20014, 0x8f8600c4, 0x8f8700c8, +0x3c040001, 0x248469e8, 0xc002b3b, 0x2002821, +0x3c044000, 0x2041024, 0x504000b4, 0x3c040100, +0x8f4203bc, 0x24420001, 0xaf4203bc, 0x8f4203bc, +0x8f8700c4, 0x8f8300c8, 0x8f420148, 0x671823, +0x43102b, 0x10400003, 0x0, 0x8f420148, +0x621821, 0x10600005, 0x0, 0x8f42014c, +0x43102b, 0x1040000b, 0x0, 0x8f8200e0, +0x8f430124, 0xaf42011c, 0xaf430114, 0x8f820220, +0x3c0308ff, 0x3463fffb, 0x431024, 0x100000ce, +0x441025, 0x8f820220, 0x3c0308ff, 0x3463ffff, +0x431024, 0x34420004, 0xaf820220, 0x8f8200e0, +0x8f430124, 0xaf42011c, 0xaf430114, 0x8f8600c8, +0x8f840120, 0x8f830124, 0x10000005, 0x2821, +0x14620002, 0x24620020, 0x27624800, 0x401821, +0x1064000c, 0x30a200ff, 0x8c620018, 0x30420003, +0x1040fff7, 0x27624fe0, 0x8f4203d0, 0x24050001, +0x24420001, 0xaf4203d0, 0x8f4203d0, 0x8c660008, +0x30a200ff, 0x14400058, 0x0, 0x934205c4, +0x14400055, 0x0, 0x8f8700c4, 0x8f8800e0, +0x8f8400e4, 0x2402fff8, 0x1024024, 0x1041023, +0x218c3, 0x4620001, 0x24630200, 0x10600005, +0x24020001, 0x10620009, 0x0, 0x1000001f, +0x0, 0x8f4203c0, 0xe03021, 0x24420001, +0xaf4203c0, 0x10000040, 0x8f4203c0, 0x8f4203c4, +0x24420001, 0xaf4203c4, 0x8c860000, 0x8f420148, +0x8f4303c4, 0xe61823, 0x43102b, 0x10400004, +0x2c62233f, 0x8f420148, 0x621821, 0x2c62233f, +0x14400031, 0x0, 0x8f42020c, 0x24420001, +0xaf42020c, 0x8f42020c, 0xe03021, 0x24820008, +0xaf8200e4, 0x10000028, 0xaf8200e8, 0x8f4203c8, +0x24420001, 0xaf4203c8, 0x8f4203c8, 0x8c850000, +0x8f420148, 0xa71823, 0x43102b, 0x10400003, +0x0, 0x8f420148, 0x621821, 0x8f42014c, +0x43102b, 0x5440000a, 0xa03021, 0x8f42020c, +0x24420001, 0xaf42020c, 0x8f42020c, 0x24820008, +0xaf8200e4, 0x8f8400e4, 0x1488ffec, 0xaf8400e8, +0x1488000d, 0x27623000, 0x14820002, 0x2482fff8, +0x27623ff8, 0x94430006, 0x3c02001f, 0x3442ffff, +0xc33021, 0x46102b, 0x10400003, 0x0, +0x8f420148, 0xc23023, 0xaf8600c8, 0x8f8300c4, +0x8f420148, 0xc31823, 0x43102b, 0x10400003, +0x0, 0x8f420148, 0x621821, 0x10600005, +0x0, 0x8f42014c, 0x43102b, 0x50400008, +0x3c02fdff, 0x8f820220, 0x3c0308ff, 0x3463fffb, +0x431024, 0x3c034000, 0x1000003f, 0x431025, +0x8f4303cc, 0x3442ffff, 0x282a024, 0x24630001, +0xaf4303cc, 0x10000039, 0x8f4203cc, 0x2041024, +0x1040000e, 0x3c110200, 0x8f4203a8, 0x24420001, +0xaf4203a8, 0x8f4203a8, 0x8f820220, 0x3c0308ff, +0x3463ffff, 0x431024, 0x441025, 0xc003daf, +0xaf820220, 0x10000029, 0x0, 0x2111024, +0x50400008, 0x3c110400, 0x8f4203ac, 0x24420001, +0xaf4203ac, 0xc003daf, 0x8f4203ac, 0x10000019, +0x0, 0x2111024, 0x1040001c, 0x0, +0x8f830224, 0x24021402, 0x14620009, 0x3c050008, +0x3c040001, 0x248469f4, 0xafa00010, 0xafa00014, +0x8f860224, 0x34a50500, 0xc002b3b, 0x3821, +0x8f4203b0, 0x24420001, 0xaf4203b0, 0x8f4203b0, +0x8f820220, 0x2002021, 0x34420002, 0xc004e9c, +0xaf820220, 0x8f820220, 0x3c0308ff, 0x3463ffff, +0x431024, 0x511025, 0xaf820220, 0x8fbf0020, +0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0028, +0x3e00008, 0x0, 0x3c020001, 0x8c426da8, +0x27bdffb0, 0xafbf0048, 0xafbe0044, 0xafb50040, +0xafb3003c, 0xafb20038, 0xafb10034, 0x1040000f, +0xafb00030, 0x3c040001, 0x24846a00, 0x3c050008, +0xafa00010, 0xafa00014, 0x8f860220, 0x34a50600, +0x24020001, 0x3c010001, 0xac206da8, 0x3c010001, +0xac226d9c, 0xc002b3b, 0x3821, 0x3c037fff, +0x8c020268, 0x3463ffff, 0x3c04fdff, 0x431024, +0xac020268, 0x8f420004, 0x3484ffff, 0x30420002, +0x10400092, 0x284a024, 0x3c040600, 0x34842000, +0x8f420004, 0x2821, 0x2403fffd, 0x431024, +0xaf420004, 0xafa40020, 0x8f5e0018, 0x27aa0020, +0x240200ff, 0x13c20002, 0xafaa002c, 0x27c50001, +0x8c020228, 0xa09021, 0x1642000e, 0x1e38c0, +0x8f42033c, 0x24420001, 0xaf42033c, 0x8f42033c, +0x8c020228, 0x3c040001, 0x24846998, 0x3c050009, +0xafa00014, 0xafa20010, 0x8fa60020, 0x1000006d, +0x34a50500, 0xf71021, 0x8fa30020, 0x8fa40024, +0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, +0x247003e8, 0x2021023, 0x2c4203e9, 0x1040001b, +0x9821, 0xe08821, 0x263504c0, 0x8f440178, +0x8f45017c, 0x2201821, 0x240a0004, 0xafaa0010, +0xafb20014, 0x8f48000c, 0x1021, 0x2f53021, +0xafa80018, 0x8f48010c, 0x24070008, 0xa32821, +0xa3482b, 0x822021, 0x100f809, 0x892021, +0x54400006, 0x24130001, 0x8f820054, 0x2021023, +0x2c4203e9, 0x1440ffe9, 0x0, 0x326200ff, +0x54400017, 0xaf520018, 0x8f420378, 0x24420001, +0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, +0xafa20010, 0x8f820124, 0x3c040001, 0x248469a4, +0x3c050009, 0xafa20014, 0x8d460000, 0x10000035, +0x34a50600, 0x8f420308, 0x24130001, 0x24420001, +0xaf420308, 0x8f420308, 0x1000001e, 0x326200ff, +0x8f830054, 0x8f820054, 0x247003e8, 0x2021023, +0x2c4203e9, 0x10400016, 0x9821, 0x3c150020, +0x24110010, 0x8f42000c, 0x8f440160, 0x8f450164, +0x8f860120, 0xafb10010, 0xafb20014, 0x551025, +0xafa20018, 0x8f42010c, 0x24070008, 0x40f809, +0x24c6001c, 0x1440ffe3, 0x0, 0x8f820054, +0x2021023, 0x2c4203e9, 0x1440ffee, 0x0, +0x326200ff, 0x14400011, 0x0, 0x8f420378, +0x24420001, 0xaf420378, 0x8f420378, 0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, 0x3c040001, -0x24843ac4, 0x3c050009, 0xafa20014, 0x8d460000, -0x10000035, 0x34a50600, 0x8f4202f8, 0x24130001, -0x24420001, 0xaf4202f8, 0x8f4202f8, 0x1000001e, -0x326200ff, 0x8f830054, 0x8f820054, 0x247003e8, -0x2021023, 0x2c4203e9, 0x10400016, 0x9821, -0x3c150020, 0x24110010, 0x8f42000c, 0x8f440150, -0x8f450154, 0x8f860120, 0xafb10010, 0xafb20014, -0x551025, 0xafa20018, 0x8f42010c, 0x24070008, -0x40f809, 0x24c6001c, 0x1440ffe3, 0x0, -0x8f820054, 0x2021023, 0x2c4203e9, 0x1440ffee, -0x0, 0x326200ff, 0x14400011, 0x0, -0x8f420368, 0x24420001, 0xaf420368, 0x8f420368, -0x8f820120, 0x8faa002c, 0xafa20010, 0x8f820124, -0x3c040001, 0x24843acc, 0x3c050009, 0xafa20014, -0x8d460000, 0x34a50700, 0xc002a03, 0x3c03821, -0x8f4202dc, 0x24420001, 0xaf4202dc, 0x8f4202dc, -0x8fbf0048, 0x8fbe0044, 0x8fb50040, 0x8fb3003c, -0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, -0x27bd0050, 0x3c020001, 0x8c423e38, 0x27bdffe0, -0x1440000d, 0xafbf0018, 0x3c040001, 0x24843b2c, -0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, -0x34a50700, 0x24020001, 0x3c010001, 0xac223e38, -0xc002a03, 0x3821, 0x3c020004, 0x2c21024, -0x10400008, 0x2021, 0x8f820220, 0x3c0308ff, -0x3463ffff, 0x431024, 0x34420008, 0xaf820220, -0x2021, 0xc0049b1, 0x24050004, 0xac020268, -0x8fbf0018, 0x3e00008, 0x27bd0020, 0x86102b, +0x248469ac, 0x3c050009, 0xafa20014, 0x8d460000, +0x34a50700, 0xc002b3b, 0x3c03821, 0x8f4202ec, +0x24420001, 0xaf4202ec, 0x8f4202ec, 0x8fbf0048, +0x8fbe0044, 0x8fb50040, 0x8fb3003c, 0x8fb20038, +0x8fb10034, 0x8fb00030, 0x3e00008, 0x27bd0050, +0x3c020001, 0x8c426da8, 0x27bdffe0, 0x1440000d, +0xafbf0018, 0x3c040001, 0x24846a0c, 0x3c050008, +0xafa00010, 0xafa00014, 0x8f860220, 0x34a50700, +0x24020001, 0x3c010001, 0xac226da8, 0xc002b3b, +0x3821, 0x3c020004, 0x2c21024, 0x10400007, +0x0, 0x8f820220, 0x3c0308ff, 0x3463ffff, +0x431024, 0x34420008, 0xaf820220, 0x3c050001, +0x8ca56d98, 0x24020001, 0x14a20007, 0x2021, +0xc00529b, 0x24050001, 0xac02026c, 0x8c03026c, +0x10000006, 0x3c020007, 0xc00529b, 0x2021, +0xac020268, 0x8c030268, 0x3c020007, 0x621824, +0x3c020002, 0x5062000d, 0x3c0205f5, 0x43102b, +0x14400006, 0x3c020004, 0x3c020001, 0x10620009, +0x3c020098, 0x1000000b, 0x0, 0x14620009, +0x3c023b9a, 0x10000004, 0x3442ca00, 0x10000002, +0x3442e100, 0x34429680, 0xaf4201fc, 0x8f4201fc, +0xaee20064, 0x8fbf0018, 0x3e00008, 0x27bd0020, +0x0, 0x0, 0x0, 0x86102b, 0x50400001, 0x872023, 0xc41023, 0x24843, 0x125102b, 0x1040001b, 0x91040, 0x824021, 0x88102b, 0x10400007, 0x1821, 0x94820000, @@ -7351,28 +7620,28 @@ 0x24a20004, 0x62102b, 0x54400007, 0x65102b, 0x90a20001, 0x90a40003, 0x90a30000, 0x90a50002, 0x1000002a, 0x441021, 0x10400003, 0x0, -0x8f42013c, 0xa22823, 0x90a40000, 0x24a50001, -0x65102b, 0x10400003, 0x0, 0x8f42013c, +0x8f420148, 0xa22823, 0x90a40000, 0x24a50001, +0x65102b, 0x10400003, 0x0, 0x8f420148, 0xa22823, 0x90a20000, 0x24a50001, 0x21200, 0x822021, 0x65102b, 0x10400003, 0x0, -0x8f42013c, 0xa22823, 0x90a20000, 0x24a50001, +0x8f420148, 0xa22823, 0x90a20000, 0x24a50001, 0x822021, 0x65102b, 0x10400003, 0x0, -0x8f42013c, 0xa22823, 0x90a20000, 0x1000002d, +0x8f420148, 0xa22823, 0x90a20000, 0x1000002d, 0x21200, 0x3463ffff, 0x24a20004, 0x62102b, 0x5440000a, 0x65102b, 0x90a20000, 0x90a40002, 0x90a30001, 0x90a50003, 0x441021, 0x21200, 0x651821, 0x10000020, 0x432021, 0x10400003, -0x0, 0x8f42013c, 0xa22823, 0x90a20000, +0x0, 0x8f420148, 0xa22823, 0x90a20000, 0x24a50001, 0x22200, 0x65102b, 0x10400003, -0x0, 0x8f42013c, 0xa22823, 0x90a20000, +0x0, 0x8f420148, 0xa22823, 0x90a20000, 0x24a50001, 0x822021, 0x65102b, 0x10400003, -0x0, 0x8f42013c, 0xa22823, 0x90a20000, +0x0, 0x8f420148, 0xa22823, 0x90a20000, 0x24a50001, 0x21200, 0x822021, 0x65102b, -0x10400003, 0x0, 0x8f42013c, 0xa22823, +0x10400003, 0x0, 0x8f420148, 0xa22823, 0x90a20000, 0x822021, 0x41c02, 0x3082ffff, 0x622021, 0x41c02, 0x3082ffff, 0x622021, 0x3e00008, 0x3082ffff, 0x0, 0x8f820220, -0x34420002, 0xaf820220, 0x3c020001, 0x8c426038, +0x34420002, 0xaf820220, 0x3c020002, 0x8c428ff8, 0x30424000, 0x10400054, 0x24040001, 0x8f820200, 0x24067fff, 0x8f830200, 0x30450002, 0x2402fffd, 0x621824, 0xaf830200, 0xaf840204, 0x8f830054, @@ -7419,518 +7688,880 @@ 0x43102b, 0x14400006, 0x3c026000, 0x3c024000, 0x10620008, 0x24020800, 0x10000008, 0x0, 0x10620004, 0x24020800, 0x10000004, 0x0, -0x24020700, 0x3c010001, 0xac223e3c, 0x3e00008, -0x0, 0x27bdffc8, 0xafbf0034, 0xafb20030, -0xafb1002c, 0xafb00028, 0x3c010001, 0xc00461d, -0xac203e24, 0x24040001, 0x2821, 0x27a60020, -0x34028000, 0xc00423a, 0xa7a20020, 0x8f830054, +0x24020700, 0x3c010001, 0xac226dac, 0x3e00008, +0x0, 0x3c020001, 0x8c426dbc, 0x27bdffd0, +0xafbf002c, 0xafb20028, 0xafb10024, 0xafb00020, +0x3c010001, 0x10400005, 0xac206d94, 0xc004d9e, +0x0, 0x3c010001, 0xac206dbc, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x24040001, -0x24050001, 0xc0041f8, 0x27a60020, 0x8f830054, -0x8f820054, 0x10000002, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x24040001, -0x24050001, 0xc0041f8, 0x27a60020, 0x8f830054, -0x8f820054, 0x10000002, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x24040001, -0x24050002, 0xc0041f8, 0x27a60018, 0x8f830054, +0x621023, 0x2c420065, 0x1440fffc, 0x0, +0xc004db9, 0x0, 0x24040001, 0x2821, +0x27a60018, 0x34028000, 0xc0045be, 0xa7a20018, +0x8f830054, 0x8f820054, 0x10000002, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x24050001, 0xc00457c, 0x27a60018, +0x8f830054, 0x8f820054, 0x10000002, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x24050001, 0xc00457c, 0x27a60018, +0x8f830054, 0x8f820054, 0x10000002, 0x24630064, +0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, +0x24040001, 0x3c060001, 0x24c66f24, 0xc00457c, +0x24050002, 0x8f830054, 0x8f820054, 0x10000002, +0x24630064, 0x8f820054, 0x621023, 0x2c420065, +0x1440fffc, 0x24040001, 0x24050003, 0x3c100001, +0x26106f26, 0xc00457c, 0x2003021, 0x97a60018, +0x3c070001, 0x94e76f24, 0x3c040001, 0x24846ae0, +0xafa00014, 0x96020000, 0x3c05000d, 0x34a50100, +0xc002b3b, 0xafa20010, 0x97a20018, 0x1040004d, +0x24036040, 0x96020000, 0x3042fff0, 0x1443000c, +0x24020020, 0x3c030001, 0x94636f24, 0x1462000b, +0x24027830, 0x24020003, 0x3c010001, 0xac226d94, +0x24020005, 0x3c010001, 0x1000003f, 0xac226f34, +0x3c030001, 0x94636f24, 0x24027830, 0x1462000c, +0x24030010, 0x3c020001, 0x94426f26, 0x3042fff0, +0x14430007, 0x24020003, 0x3c010001, 0xac226d94, +0x24020006, 0x3c010001, 0x1000002f, 0xac226f34, +0x3c020001, 0x8c426d94, 0x3c030001, 0x94636f24, +0x34420001, 0x3c010001, 0xac226d94, 0x24020015, +0x1462000b, 0x0, 0x3c020001, 0x94426f26, +0x3042fff0, 0x3843f420, 0x2c630001, 0x3842f430, +0x2c420001, 0x621825, 0x1460001b, 0x24020003, +0x3c030001, 0x94636f24, 0x24027810, 0x14620016, +0x24020002, 0x3c020001, 0x94426f26, 0x3042fff0, +0x14400011, 0x24020002, 0x1000000f, 0x24020004, +0x3c020001, 0x8c426d94, 0x34420008, 0x3c010001, +0xac226d94, 0x1000005e, 0x24020004, 0x3c020001, +0x8c426d94, 0x34420004, 0x3c010001, 0x100000af, +0xac226d94, 0x24020001, 0x3c010001, 0xac226f40, +0x3c020001, 0x8c426d94, 0x30420002, 0x144000b2, +0x3c09fff0, 0x24020e00, 0xaf820238, 0x8f840054, +0x8f820054, 0x24030008, 0x3c010001, 0xac236d98, +0x10000002, 0x248401f4, 0x8f820054, 0x821023, +0x2c4201f5, 0x1440fffc, 0x3c0200c8, 0x344201fb, +0xaf820238, 0x8f830054, 0x8f820054, 0x10000002, +0x246301f4, 0x8f820054, 0x621023, 0x2c4201f5, +0x1440fffc, 0x8021, 0x24120001, 0x24110009, +0xc004482, 0x0, 0x3c010001, 0xac326db4, +0xc004547, 0x0, 0x3c020001, 0x8c426db4, +0x1451fffb, 0x3c0200c8, 0x344201f6, 0xaf820238, +0x8f830054, 0x8f820054, 0x10000002, 0x2463000a, +0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc, +0x0, 0x8f820220, 0x24040001, 0x34420002, +0xaf820220, 0x8f830200, 0x24057fff, 0x2402fffd, +0x621824, 0xaf830200, 0xaf840204, 0x8f830054, +0x8f820054, 0x10000002, 0x24630001, 0x8f820054, +0x621023, 0x2c420002, 0x1440fffc, 0x0, +0x8f820224, 0x14440005, 0x34028000, 0x42040, +0xa4102b, 0x1040fff0, 0x34028000, 0x1082ffa0, +0x26100001, 0x2e020014, 0x1440ffcd, 0x24020004, +0x3c010001, 0xac226d98, 0x8021, 0x24120009, +0x3c11ffff, 0x36313f7f, 0xc004482, 0x0, +0x24020001, 0x3c010001, 0xac226db4, 0xc004547, +0x0, 0x3c020001, 0x8c426db4, 0x1452fffb, +0x0, 0x8f820044, 0x511024, 0x34425080, +0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, +0x2463000a, 0x8f820054, 0x621023, 0x2c42000b, +0x1440fffc, 0x0, 0x8f820044, 0x511024, +0x3442f080, 0xaf820044, 0x8f830054, 0x8f820054, +0x10000002, 0x2463000a, 0x8f820054, 0x621023, +0x2c42000b, 0x1440fffc, 0x0, 0x8f820220, +0x3c03f700, 0x431025, 0xaf820220, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, -0x621023, 0x2c420065, 0x1440fffc, 0x24040001, -0x24050003, 0xc0041f8, 0x27a6001a, 0x97a20020, -0x10400029, 0x24020001, 0x3c020001, 0x8c423e24, -0x97a30018, 0x34420001, 0x3c010001, 0xac223e24, -0x24020015, 0x14620009, 0x0, 0x97a2001a, -0x3843f423, 0x2c630001, 0x3842f430, 0x2c420001, -0x621825, 0x14600018, 0x24020003, 0x97a30018, -0x24027810, 0x14620014, 0x24020002, 0x97a3001a, -0x24020001, 0x14620010, 0x24020002, 0x1000000e, -0x24020004, 0x3c020001, 0x8c423e24, 0x34420008, -0x3c010001, 0xac223e24, 0x10000058, 0x24020004, -0x3c020001, 0x8c423e24, 0x34420004, 0x3c010001, -0x100000a9, 0xac223e24, 0x3c010001, 0xac223f80, -0x24020e00, 0xaf820238, 0x8f840054, 0x8f820054, -0x24030008, 0x3c010001, 0xac233e28, 0x10000002, -0x248401f4, 0x8f820054, 0x821023, 0x2c4201f5, -0x1440fffc, 0x3c0200c8, 0x344201fb, 0xaf820238, -0x8f830054, 0x8f820054, 0x10000002, 0x246301f4, -0x8f820054, 0x621023, 0x2c4201f5, 0x1440fffc, -0x8021, 0x24120001, 0x24110009, 0xc004118, -0x0, 0x3c010001, 0xac323e40, 0xc0041c4, -0x0, 0x3c020001, 0x8c423e40, 0x1451fffb, -0x3c0200c8, 0x344201f6, 0xaf820238, 0x8f830054, -0x8f820054, 0x10000002, 0x2463000a, 0x8f820054, -0x621023, 0x2c42000b, 0x1440fffc, 0x0, +0x621023, 0x2c420065, 0x1440fffc, 0x0, 0x8f820220, 0x24040001, 0x34420002, 0xaf820220, 0x8f830200, 0x24057fff, 0x2402fffd, 0x621824, 0xaf830200, 0xaf840204, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820224, 0x14440005, 0x34028000, 0x42040, 0xa4102b, -0x1040fff0, 0x34028000, 0x1082ffa6, 0x26100001, -0x2e020014, 0x1440ffcd, 0x24020004, 0x3c010001, -0xac223e28, 0x8021, 0x24120009, 0x3c11ffff, -0x36313f7f, 0xc004118, 0x0, 0x24020001, -0x3c010001, 0xac223e40, 0xc0041c4, 0x0, -0x3c020001, 0x8c423e40, 0x1452fffb, 0x0, -0x8f820044, 0x511024, 0x34425080, 0xaf820044, -0x8f830054, 0x8f820054, 0x10000002, 0x2463000a, -0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc, -0x0, 0x8f820044, 0x511024, 0x3442f080, -0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, -0x2463000a, 0x8f820054, 0x621023, 0x2c42000b, -0x1440fffc, 0x0, 0x8f820220, 0x3c03f700, -0x431025, 0xaf820220, 0x8f830054, 0x8f820054, -0x10000002, 0x24630064, 0x8f820054, 0x621023, -0x2c420065, 0x1440fffc, 0x0, 0x8f820220, -0x24040001, 0x34420002, 0xaf820220, 0x8f830200, -0x24057fff, 0x2402fffd, 0x621824, 0xaf830200, -0xaf840204, 0x8f830054, 0x8f820054, 0x10000002, -0x24630001, 0x8f820054, 0x621023, 0x2c420002, -0x1440fffc, 0x0, 0x8f820224, 0x14440005, -0x34028000, 0x42040, 0xa4102b, 0x1040fff0, -0x34028000, 0x1082ff56, 0x26100001, 0x2e020064, -0x1440ffb0, 0x0, 0x3c020001, 0x8c423e24, -0x30420004, 0x14400007, 0x3c08fff0, 0x8f820044, -0x3c03ffff, 0x34633f7f, 0x431024, 0xaf820044, -0x3c08fff0, 0x3508bdc0, 0x8f830054, 0x97a60018, -0x3c070001, 0x8ce73f80, 0x3c040001, 0x24843c00, -0x24020001, 0x3c010001, 0xac223e2c, 0xafa60010, -0x3c060001, 0x8cc63e24, 0x97a2001a, 0x3c05000d, -0x34a50100, 0x3c010001, 0xac203e28, 0x681821, -0x3c010001, 0xac233f78, 0xc002a03, 0xafa20014, -0x8fbf0034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, -0x3e00008, 0x27bd0038, 0x27bdffe8, 0x24070004, -0x3c040001, 0x8c843e28, 0x3021, 0x24020001, -0x1482000a, 0xafbf0010, 0x3c020001, 0x8c42603c, -0x3c050004, 0x30428000, 0x1040000c, 0x34a593e0, -0x3c05000f, 0x10000009, 0x34a54240, 0x3c020001, -0x8c42603c, 0x3c05000f, 0x30428000, 0x10400003, -0x34a54240, 0x3c05001e, 0x34a58480, 0x3c020001, -0x8c423f78, 0x8f830054, 0x451021, 0x431023, -0x45102b, 0x1440002e, 0x0, 0x3c020001, -0x8c423e30, 0x1440002a, 0x2cc20001, 0x7182b, -0x431024, 0x1040001d, 0x0, 0x3c090001, -0x8d293e24, 0x240b0001, 0x3c054000, 0x3c080001, -0x2508603c, 0x250afffc, 0x42042, 0x14800002, -0x24e7ffff, 0x24040008, 0x891024, 0x5040000b, -0x2cc20001, 0x148b0004, 0x0, 0x8d020000, -0x10000003, 0x451024, 0x8d420000, 0x451024, -0x54400001, 0x24060001, 0x2cc20001, 0x7182b, -0x431024, 0x5440ffed, 0x42042, 0x3c010001, -0x10c00020, 0xac243e28, 0x8f830054, 0x24020001, -0x3c010001, 0xac223e2c, 0x3c010001, 0xac233f78, -0x3c020001, 0x8c423e2c, 0x10400004, 0x24020001, -0x3c010001, 0xac203e2c, 0xaee204b8, 0x8ee304b8, -0x24020008, 0x10620005, 0x24020001, 0xc003fc1, +0x1040fff0, 0x34028000, 0x1082ff50, 0x26100001, +0x2e020064, 0x1440ffb0, 0x0, 0x3c020001, +0x8c426d94, 0x30420004, 0x14400007, 0x3c09fff0, +0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, +0xaf820044, 0x3c09fff0, 0x3529bdc0, 0x3c060001, +0x8cc66d94, 0x3c040001, 0x24846ae0, 0x24020001, +0x3c010001, 0xac226d9c, 0x8f820054, 0x3c070001, +0x8ce76f40, 0x3c030001, 0x94636f24, 0x3c080001, +0x95086f26, 0x3c05000d, 0x34a50100, 0x3c010001, +0xac206d98, 0x491021, 0x3c010001, 0xac226f30, +0xafa30010, 0xc002b3b, 0xafa80014, 0x8fbf002c, +0x8fb20028, 0x8fb10024, 0x8fb00020, 0x3e00008, +0x27bd0030, 0x27bdffe8, 0x3c050001, 0x8ca56d98, +0x24060004, 0x24020001, 0x14a20014, 0xafbf0010, +0x3c020002, 0x8c428ffc, 0x30428000, 0x10400005, +0x3c04000f, 0x3c030001, 0x8c636f40, 0x10000005, +0x34844240, 0x3c040004, 0x3c030001, 0x8c636f40, +0x348493e0, 0x24020005, 0x14620016, 0x0, +0x3c04003d, 0x10000013, 0x34840900, 0x3c020002, +0x8c428ff8, 0x30428000, 0x10400005, 0x3c04001e, +0x3c030001, 0x8c636f40, 0x10000005, 0x34848480, +0x3c04000f, 0x3c030001, 0x8c636f40, 0x34844240, +0x24020005, 0x14620003, 0x0, 0x3c04007a, +0x34841200, 0x3c020001, 0x8c426f30, 0x8f830054, +0x441021, 0x431023, 0x44102b, 0x1440004c, +0x0, 0x3c020001, 0x8c426da0, 0x14400048, +0x0, 0x3c010001, 0x10c00025, 0xac206db0, +0x3c090001, 0x8d296d94, 0x24070001, 0x3c044000, +0x3c080002, 0x25088ffc, 0x250afffc, 0x52842, +0x14a00002, 0x24c6ffff, 0x24050008, 0xa91024, +0x10400010, 0x0, 0x14a70008, 0x0, +0x8d020000, 0x441024, 0x1040000a, 0x0, +0x3c010001, 0x10000007, 0xac256db0, 0x8d420000, +0x441024, 0x10400003, 0x0, 0x3c010001, +0xac276db0, 0x3c020001, 0x8c426db0, 0x6182b, +0x2c420001, 0x431024, 0x5440ffe5, 0x52842, +0x8f820054, 0x3c030001, 0x8c636db0, 0x3c010001, +0xac226f30, 0x1060003b, 0x24020005, 0x3c030001, +0x8c636f40, 0x3c010001, 0xac256d98, 0x14620012, +0x24020001, 0x3c020002, 0x8c428ff8, 0x3c032000, +0x34635000, 0x431024, 0x14400006, 0x24020001, +0x3c010001, 0xac206f1c, 0x3c010001, 0xac226d98, +0x24020001, 0x3c010001, 0xac226e24, 0x3c010001, +0xac226da4, 0x24020001, 0x3c010001, 0xac226d9c, +0x3c020001, 0x8c426db0, 0x1040001e, 0x0, +0x3c020001, 0x8c426d9c, 0x10400008, 0x24020001, +0x3c010001, 0xac206d9c, 0xaee204b8, 0x3c010001, +0xac206e1c, 0x3c010001, 0xac226dd4, 0x8ee304b8, +0x24020008, 0x10620005, 0x24020001, 0xc004239, 0x0, 0x1000000b, 0x0, 0x3c030001, -0x8c633e28, 0x10620007, 0x2402000e, 0x3c030001, -0x8c635fd0, 0x10620003, 0x0, 0xc004640, +0x8c636d98, 0x10620007, 0x2402000e, 0x3c030002, +0x8c638f90, 0x10620003, 0x0, 0xc004e9c, 0x8f840220, 0x8fbf0010, 0x3e00008, 0x27bd0018, -0x27bdffe0, 0x3c03fdff, 0x3c040001, 0x8c843e28, -0x3c020001, 0x8c423e48, 0x3463ffff, 0x283a024, +0x27bdffe0, 0x3c03fdff, 0x3c040001, 0x8c846d98, +0x3c020001, 0x8c426dc0, 0x3463ffff, 0x283a024, 0x14820006, 0xafbf0018, 0x8ee304b8, 0x3c020001, -0x8c423e4c, 0x10620006, 0x0, 0x8ee204b8, -0x3c010001, 0xac243e48, 0x3c010001, 0xac223e4c, -0x3c030001, 0x8c633e28, 0x24020002, 0x1062013c, +0x8c426dc4, 0x10620006, 0x0, 0x8ee204b8, +0x3c010001, 0xac246dc0, 0x3c010001, 0xac226dc4, +0x3c030001, 0x8c636d98, 0x24020002, 0x1062019c, 0x2c620003, 0x10400005, 0x24020001, 0x1062000a, -0x0, 0x10000134, 0x0, 0x24020004, -0x1062006d, 0x24020008, 0x1062009f, 0x24020001, -0x1000012d, 0x0, 0x8ee204b8, 0x2443ffff, -0x2c620008, 0x1040012a, 0x31080, 0x3c010001, -0x220821, 0x8c223c18, 0x400008, 0x0, -0xc004118, 0x0, 0x3c020001, 0x8c423e34, -0x3c010001, 0xac203dc0, 0x104000d7, 0x24020002, -0xaee204b8, 0x3c010001, 0x10000119, 0xac203e34, -0xc00427b, 0x0, 0x3c030001, 0x8c633e50, -0x1000009e, 0x24020011, 0x3c050001, 0x8ca53e28, -0x3c060001, 0x8cc6603c, 0xc0048a8, 0x2021, -0x24020005, 0x3c010001, 0xac203e34, 0x10000108, -0xaee204b8, 0x3c040001, 0x24843c0c, 0x3c05000f, -0x34a50100, 0x3021, 0x3821, 0xafa00010, -0xc002a03, 0xafa00014, 0x100000fd, 0x0, -0x8f820220, 0x3c03f700, 0x431025, 0x100000a4, -0xaf820220, 0x8f820220, 0x3c030004, 0x431024, -0x144000ae, 0x24020007, 0x8f830054, 0x3c020001, -0x8c423f70, 0x2463d8f0, 0x431023, 0x2c422710, -0x144000eb, 0x24020001, 0x100000e7, 0x0, -0x3c050001, 0x8ca53e28, 0xc0049b1, 0x2021, -0xc004a7c, 0x2021, 0x3c030001, 0x8c636034, -0x46100dd, 0x24020001, 0x3c020008, 0x621024, -0x10400006, 0x0, 0x8f820214, 0x3c03ffff, -0x431024, 0x10000005, 0x3442251f, 0x8f820214, -0x3c03ffff, 0x431024, 0x3442241f, 0xaf820214, -0x8f820220, 0x3c030200, 0x283a025, 0x34420002, -0xaf820220, 0x24020008, 0xc003c9e, 0xaee204b8, -0x100000c7, 0x0, 0x8ee204b8, 0x2443ffff, -0x2c620008, 0x104000c2, 0x31080, 0x3c010001, -0x220821, 0x8c223c38, 0x400008, 0x0, -0x3c020001, 0x8c426038, 0x30424000, 0x10400004, -0x0, 0x8f820044, 0x10000006, 0x3442f080, -0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, -0x3442a080, 0xaf820044, 0x8f830054, 0x1000005a, -0x24020004, 0xc003d5c, 0x0, 0x104000a6, -0x24020001, 0x8f820214, 0x3c03ffff, 0x3c040001, -0x8c843f68, 0x431024, 0x3442251f, 0xaf820214, -0x24020008, 0x10800005, 0xaee204b8, 0x3c020001, -0x8c423eb4, 0x1040006d, 0x24020001, 0x8f820220, -0x3c030008, 0x431024, 0x10400073, 0x3c020200, -0x10000081, 0x0, 0x8ee204b8, 0x2443ffff, -0x2c620007, 0x1040008e, 0x31080, 0x3c010001, -0x220821, 0x8c223c58, 0x400008, 0x0, -0xc003be0, 0x0, 0x3c010001, 0xac203e2c, -0xaf800204, 0x3c010001, 0xc004118, 0xac206020, -0x24020001, 0x3c010001, 0xac223e40, 0x24020002, -0x1000007b, 0xaee204b8, 0xc0041c4, 0x0, -0x3c030001, 0x8c633e40, 0x24020009, 0x14620074, -0x24020003, 0x10000072, 0xaee204b8, 0x3c020001, -0x8c426038, 0x30424000, 0x10400003, 0x3c0200c8, +0x0, 0x10000226, 0x0, 0x24020004, +0x106200b6, 0x24020008, 0x1062010a, 0x24020001, +0x1000021f, 0x0, 0x8ee204b8, 0x2443ffff, +0x2c620008, 0x1040021c, 0x31080, 0x3c010001, +0x220821, 0x8c226af8, 0x400008, 0x0, +0x3c030001, 0x8c636f40, 0x24020005, 0x14620010, +0x0, 0x3c020001, 0x8c426da4, 0x10400008, +0x24020003, 0xc004482, 0x0, 0x24020002, +0xaee204b8, 0x3c010001, 0x10000002, 0xac206da4, +0xaee204b8, 0x3c010001, 0x10000203, 0xac206d30, +0xc004482, 0x0, 0x3c020001, 0x8c426da4, +0x3c010001, 0xac206d30, 0x1440017a, 0x24020002, +0x1000019d, 0x24020007, 0x3c030001, 0x8c636f40, +0x24020005, 0x14620003, 0x24020001, 0x3c010001, +0xac226dd0, 0xc0045ff, 0x0, 0x3c030001, +0x8c636dd0, 0x10000174, 0x24020011, 0x3c050001, +0x8ca56d98, 0x3c060002, 0x8cc68ffc, 0xc005104, +0x2021, 0x24020005, 0x3c010001, 0xac206da4, +0x100001e1, 0xaee204b8, 0x3c040001, 0x24846aec, +0x3c05000f, 0x34a50100, 0x3021, 0x3821, +0xafa00010, 0xc002b3b, 0xafa00014, 0x100001d6, +0x0, 0x8f820220, 0x3c030004, 0x431024, +0x14400175, 0x24020007, 0x8f830054, 0x3c020001, +0x8c426f28, 0x2463d8f0, 0x431023, 0x2c422710, +0x14400003, 0x24020001, 0x3c010001, 0xac226d9c, +0x3c020002, 0x8c428ffc, 0x30425000, 0x104001c2, +0x0, 0x8f820220, 0x30428000, 0x1040017d, +0x0, 0x10000175, 0x0, 0x3c050001, +0x8ca56d98, 0xc00529b, 0x2021, 0xc00551b, +0x2021, 0x3c030002, 0x8c638ff4, 0x46101b0, +0x24020001, 0x3c020008, 0x621024, 0x10400006, +0x0, 0x8f820214, 0x3c03ffff, 0x431024, +0x10000005, 0x3442251f, 0x8f820214, 0x3c03ffff, +0x431024, 0x3442241f, 0xaf820214, 0x8f820220, +0x3c030200, 0x34420002, 0xaf820220, 0x24020008, +0xaee204b8, 0x8f820220, 0x283a025, 0x3c030004, +0x431024, 0x14400016, 0x0, 0x3c020002, +0x8c428ffc, 0x30425000, 0x1040000d, 0x0, +0x8f820220, 0x30428000, 0x10400006, 0x0, +0x8f820220, 0x3c03ffff, 0x34637fff, 0x10000003, +0x431024, 0x8f820220, 0x34428000, 0xaf820220, +0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, +0x3c030001, 0x8c636f40, 0x24020005, 0x1462000a, +0x0, 0x3c020001, 0x94426f26, 0x24429fbc, +0x2c420004, 0x10400004, 0x24040018, 0x24050002, +0xc004ddb, 0x24060020, 0xc003e6d, 0x0, +0x3c010001, 0x10000170, 0xac206e20, 0x8ee204b8, +0x2443ffff, 0x2c620008, 0x1040016b, 0x31080, +0x3c010001, 0x220821, 0x8c226b18, 0x400008, +0x0, 0xc004547, 0x0, 0x3c030001, +0x8c636db4, 0x100000e8, 0x24020009, 0x3c020002, +0x8c428ff8, 0x30424000, 0x10400004, 0x0, +0x8f820044, 0x10000006, 0x3442f080, 0x8f820044, +0x3c03ffff, 0x34633f7f, 0x431024, 0x3442a080, +0xaf820044, 0x8f830054, 0x100000ea, 0x24020004, +0x8f830054, 0x3c020001, 0x8c426f28, 0x2463d8f0, +0x431023, 0x2c422710, 0x14400147, 0x24020005, +0x100000d8, 0x0, 0x8f820220, 0x3c03f700, +0x431025, 0xaf820220, 0xaf800204, 0x3c010002, +0x100000d6, 0xac208fe0, 0x8f830054, 0x3c020001, +0x8c426f28, 0x2463fff6, 0x431023, 0x2c42000a, +0x14400135, 0x24020007, 0x100000d7, 0x0, +0xc003f50, 0x0, 0x1040012d, 0x24020001, +0x8f820214, 0x3c03ffff, 0x3c040001, 0x8c846f1c, +0x431024, 0x3442251f, 0xaf820214, 0x24020008, +0x10800005, 0xaee204b8, 0x3c020001, 0x8c426e44, +0x10400064, 0x24020001, 0x8f820220, 0x3c030008, +0x431024, 0x1040006a, 0x3c020200, 0x10000078, +0x0, 0x8ee204b8, 0x2443ffff, 0x2c620007, +0x10400115, 0x31080, 0x3c010001, 0x220821, +0x8c226b38, 0x400008, 0x0, 0xc003daf, +0x0, 0x3c010001, 0xac206d9c, 0xaf800204, +0x3c010002, 0xc004482, 0xac208fe0, 0x24020001, +0x3c010001, 0xac226db4, 0x24020002, 0x10000102, +0xaee204b8, 0xc004547, 0x0, 0x3c030001, +0x8c636db4, 0x10000084, 0x24020009, 0x3c020002, +0x8c428ff8, 0x30424000, 0x10400003, 0x3c0200c8, 0x10000002, 0x344201f6, 0x344201fe, 0xaf820238, -0x8f830054, 0x10000014, 0x24020004, 0x8f830054, -0x3c020001, 0x8c423f70, 0x2463d8f0, 0x431023, -0x2c422710, 0x1440005e, 0x24020005, 0x1000005c, -0xaee204b8, 0x8f820220, 0x3c03f700, 0x431025, -0xaf820220, 0xaf800204, 0x3c010001, 0xac206020, -0x8f830054, 0x24020006, 0xaee204b8, 0x3c010001, -0x1000004f, 0xac233f70, 0x8f830054, 0x3c020001, -0x8c423f70, 0x2463fff6, 0x431023, 0x2c42000a, -0x14400047, 0x0, 0x24020007, 0x10000044, -0xaee204b8, 0xc003d5c, 0x0, 0x1040003e, -0x24020001, 0x8f820214, 0x3c03ffff, 0x3c040001, -0x8c843f68, 0x431024, 0x3442251f, 0xaf820214, -0x24020008, 0x1080000f, 0xaee204b8, 0x3c020001, -0x8c423eb4, 0x1440000b, 0x0, 0x8f820220, -0x34420002, 0xaf820220, 0x24020001, 0x3c010001, -0xac225fd0, 0xc004640, 0x8f840220, 0x10000016, -0x0, 0x8f820220, 0x3c030008, 0x431024, -0x14400011, 0x3c020200, 0x282a025, 0x2402000e, -0x3c010001, 0xac225fd0, 0xc004a7c, 0x2021, -0x8f820220, 0x34420002, 0xc003c9e, 0xaf820220, -0x3c050001, 0x8ca53e28, 0xc0049b1, 0x2021, -0x10000013, 0x0, 0x3c020001, 0x8c423eb4, -0x1040000f, 0x0, 0x3c020001, 0x8c423eb0, -0x2442ffff, 0x3c010001, 0xac223eb0, 0x14400008, -0x24020002, 0x3c010001, 0xac203eb4, 0x3c010001, -0x10000003, 0xac223eb0, 0x3c010001, 0xac223e2c, -0x8fbf0018, 0x3e00008, 0x27bd0020, 0x8f820200, -0x8f820220, 0x8f820220, 0x34420004, 0xaf820220, -0x8f820200, 0x3c040001, 0x8c843e28, 0x34420004, -0xaf820200, 0x24020002, 0x1082003a, 0x2c820003, -0x10400005, 0x24020001, 0x1082000a, 0x3c03f0ff, -0x10000098, 0x0, 0x24020004, 0x10820059, -0x24020008, 0x1082006c, 0x3c02f0ff, 0x10000091, -0x0, 0x8f820050, 0x3463ffff, 0x3c05ffff, -0x34a53f7f, 0x431024, 0x3c030700, 0x431025, -0xaf820050, 0x24020e00, 0xaf840200, 0xaf840220, -0xaf820238, 0x8f820044, 0x3c030001, 0x8c633e18, -0x3c040001, 0x8c843f80, 0x451024, 0x34630022, -0xaf820044, 0x24020004, 0x1082000c, 0xaf830200, -0x3c020001, 0x8c423e3c, 0x3c030001, 0x8c633e20, -0x3c040001, 0x8c843e1c, 0x34428000, 0x621825, -0x641825, 0x1000006e, 0x34620002, 0x3c020001, -0x8c423e20, 0x3c030001, 0x8c633e3c, 0x3c040001, -0x8c843e1c, 0x431025, 0x441025, 0x10000064, -0x34420002, 0x8f830050, 0x3c02f0ff, 0x3442ffff, -0x3c040001, 0x8c843f68, 0x621824, 0x3c020d00, -0x621825, 0x24020001, 0xaf830050, 0xaf820200, -0xaf820220, 0x24020e00, 0x10800009, 0xaf820238, -0x3c020001, 0x8c423eb4, 0x14400005, 0x3c033f00, -0x3c020001, 0x8c423e10, 0x10000005, 0x34630070, -0x3c020001, 0x8c423e10, 0x3c033f00, 0x34630072, -0x431025, 0xaf820200, 0x3c030001, 0x8c633e14, -0x3c04f700, 0x3c020001, 0x8c423e20, 0x3c050001, -0x8ca53e3c, 0x641825, 0x431025, 0x1000003c, -0x451025, 0x8f830050, 0x3c02f0ff, 0x3442ffff, -0x3c040001, 0x8c843f68, 0x621824, 0x3c020a00, -0x621825, 0x24020001, 0xaf830050, 0xaf820200, -0x1080001e, 0xaf820220, 0x3c020001, 0x8c423eb4, -0x1440001a, 0x3c033f00, 0x3c020001, 0x8c423e10, -0x1000001a, 0x346300e0, 0x8f830050, 0x3c040001, -0x8c843f68, 0x3442ffff, 0x621824, 0x1080000f, -0xaf830050, 0x3c020001, 0x8c423eb4, 0x1440000b, -0x3c043f00, 0x3c030001, 0x8c633e10, 0x348400e0, -0x24020001, 0xaf820200, 0xaf820220, 0x641825, -0xaf830200, 0x10000008, 0x3c05f700, 0x3c020001, -0x8c423e10, 0x3c033f00, 0x346300e2, 0x431025, -0xaf820200, 0x3c05f700, 0x34a58000, 0x3c030001, -0x8c633e14, 0x3c020001, 0x8c423e20, 0x3c040001, -0x8c843e3c, 0x651825, 0x431025, 0x441025, -0xaf820220, 0x3e00008, 0x0, 0x3c030001, -0x8c633e40, 0x3c020001, 0x8c423e44, 0x10620003, -0x24020002, 0x3c010001, 0xac233e44, 0x1062001d, -0x2c620003, 0x10400025, 0x24020001, 0x14620023, -0x24020004, 0x3c030001, 0x8c633e28, 0x10620006, -0x24020008, 0x1462000c, 0x3c0200c8, 0x344201fb, -0x10000009, 0xaf820238, 0x24020e01, 0xaf820238, -0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, -0x34420080, 0xaf820044, 0x8f830054, 0x24020002, -0x3c010001, 0xac223e40, 0x3c010001, 0x1000000b, -0xac233f74, 0x8f830054, 0x3c020001, 0x8c423f74, -0x2463d8f0, 0x431023, 0x2c422710, 0x14400003, -0x24020009, 0x3c010001, 0xac223e40, 0x3e00008, +0x8f830054, 0x1000008b, 0x24020004, 0x8f830054, +0x3c020001, 0x8c426f28, 0x2463d8f0, 0x431023, +0x2c422710, 0x144000e8, 0x24020005, 0x10000079, +0x0, 0x8f820220, 0x3c03f700, 0x431025, +0xaf820220, 0xaf800204, 0x3c010002, 0x10000077, +0xac208fe0, 0x8f830054, 0x3c020001, 0x8c426f28, +0x2463fff6, 0x431023, 0x2c42000a, 0x144000d6, +0x24020007, 0x10000078, 0x0, 0xc003f50, +0x0, 0x104000ce, 0x24020001, 0x8f820214, +0x3c03ffff, 0x3c040001, 0x8c846f1c, 0x431024, +0x3442251f, 0xaf820214, 0x24020008, 0x1080000f, +0xaee204b8, 0x3c020001, 0x8c426e44, 0x1440000b, +0x0, 0x8f820220, 0x34420002, 0xaf820220, +0x24020001, 0x3c010002, 0xac228f90, 0xc004e9c, +0x8f840220, 0x10000016, 0x0, 0x8f820220, +0x3c030008, 0x431024, 0x14400011, 0x3c020200, +0x282a025, 0x2402000e, 0x3c010002, 0xac228f90, +0xc00551b, 0x2021, 0x8f820220, 0x34420002, +0xc003e6d, 0xaf820220, 0x3c050001, 0x8ca56d98, +0xc00529b, 0x2021, 0x100000a3, 0x0, +0x3c020001, 0x8c426e44, 0x1040009f, 0x0, +0x3c020001, 0x8c426e40, 0x2442ffff, 0x3c010001, +0xac226e40, 0x14400098, 0x24020002, 0x3c010001, +0xac206e44, 0x3c010001, 0x10000093, 0xac226e40, +0x8ee204b8, 0x2443ffff, 0x2c620007, 0x1040008e, +0x31080, 0x3c010001, 0x220821, 0x8c226b58, +0x400008, 0x0, 0x3c020001, 0x8c426da4, +0x10400018, 0x24020005, 0xc004482, 0x0, +0x24020002, 0xaee204b8, 0x3c010001, 0x1000007e, +0xac206da4, 0xc004963, 0x0, 0x3c030001, +0x8c636dd4, 0x24020006, 0x14620077, 0x24020003, +0x10000075, 0xaee204b8, 0x3c050001, 0x8ca56d98, +0x3c060002, 0x8cc68ff8, 0xc005104, 0x2021, +0x24020005, 0x1000006c, 0xaee204b8, 0x8f820220, +0x3c03f700, 0x431025, 0xaf820220, 0x8f830054, +0x24020006, 0xaee204b8, 0x3c010001, 0x10000062, +0xac236f28, 0x8f820220, 0x3c030004, 0x431024, +0x10400003, 0x24020007, 0x1000005b, 0xaee204b8, +0x8f830054, 0x3c020001, 0x8c426f28, 0x2463d8f0, +0x431023, 0x2c422710, 0x14400003, 0x24020001, +0x3c010001, 0xac226d9c, 0x3c020002, 0x8c428ff8, +0x30425000, 0x1040004c, 0x0, 0x8f820220, +0x30428000, 0x10400007, 0x0, 0x8f820220, +0x3c03ffff, 0x34637fff, 0x431024, 0x10000042, +0xaf820220, 0x8f820220, 0x34428000, 0x1000003e, +0xaf820220, 0x3c050001, 0x8ca56d98, 0xc00529b, +0x2021, 0xc00551b, 0x2021, 0x3c020002, +0x8c428ff0, 0x4410032, 0x24020001, 0x8f820214, +0x3c03ffff, 0x431024, 0x3442251f, 0xaf820214, +0x24020008, 0xaee204b8, 0x8f820220, 0x34420002, +0xaf820220, 0x8f820220, 0x3c030004, 0x431024, +0x14400016, 0x0, 0x3c020002, 0x8c428ff8, +0x30425000, 0x1040000d, 0x0, 0x8f820220, +0x30428000, 0x10400006, 0x0, 0x8f820220, +0x3c03ffff, 0x34637fff, 0x10000003, 0x431024, +0x8f820220, 0x34428000, 0xaf820220, 0x8f820220, +0x3c03f700, 0x431025, 0xaf820220, 0x3c020001, +0x94426f26, 0x24429fbc, 0x2c420004, 0x10400004, +0x24040018, 0x24050002, 0xc004ddb, 0x24060020, +0xc003e6d, 0x0, 0x10000003, 0x0, +0x3c010001, 0xac226d9c, 0x8fbf0018, 0x3e00008, +0x27bd0020, 0x8f820200, 0x8f820220, 0x8f820220, +0x34420004, 0xaf820220, 0x8f820200, 0x3c050001, +0x8ca56d98, 0x34420004, 0xaf820200, 0x24020002, +0x10a2004b, 0x2ca20003, 0x10400005, 0x24020001, +0x10a2000a, 0x0, 0x100000b1, 0x0, +0x24020004, 0x10a20072, 0x24020008, 0x10a20085, +0x3c02f0ff, 0x100000aa, 0x0, 0x8f830050, +0x3c02f0ff, 0x3442ffff, 0x3c040001, 0x8c846f40, +0x621824, 0x3c020700, 0x621825, 0x24020e00, +0x2484fffb, 0x2c840002, 0xaf830050, 0xaf850200, +0xaf850220, 0x14800006, 0xaf820238, 0x8f820044, +0x3c03ffff, 0x34633f7f, 0x431024, 0xaf820044, +0x3c030001, 0x8c636f40, 0x24020005, 0x14620004, +0x0, 0x8f820044, 0x34425000, 0xaf820044, +0x3c020001, 0x8c426d88, 0x3c030001, 0x8c636f40, +0x34420022, 0x2463fffc, 0x2c630002, 0x1460000c, +0xaf820200, 0x3c020001, 0x8c426dac, 0x3c030001, +0x8c636d90, 0x3c040001, 0x8c846d8c, 0x34428000, +0x621825, 0x641825, 0x1000000a, 0x34620002, +0x3c020001, 0x8c426d90, 0x3c030001, 0x8c636dac, +0x3c040001, 0x8c846d8c, 0x431025, 0x441025, +0x34420002, 0xaf820220, 0x1000002f, 0x24020001, +0x24020e01, 0xaf820238, 0x8f830050, 0x3c02f0ff, +0x3442ffff, 0x3c040001, 0x8c846f1c, 0x621824, +0x3c020d00, 0x621825, 0x24020001, 0xaf830050, +0xaf820200, 0xaf820220, 0x10800005, 0x3c033f00, +0x3c020001, 0x8c426d80, 0x10000004, 0x34630070, +0x3c020001, 0x8c426d80, 0x34630072, 0x431025, +0xaf820200, 0x3c030001, 0x8c636d84, 0x3c02f700, +0x621825, 0x3c020001, 0x8c426d90, 0x3c040001, +0x8c846dac, 0x3c050001, 0x8ca56f40, 0x431025, +0x441025, 0xaf820220, 0x24020005, 0x14a20006, +0x24020001, 0x8f820044, 0x2403afff, 0x431024, +0xaf820044, 0x24020001, 0x1000003d, 0xaf820238, +0x8f830050, 0x3c02f0ff, 0x3442ffff, 0x3c040001, +0x8c846f1c, 0x621824, 0x3c020a00, 0x621825, +0x24020001, 0xaf830050, 0xaf820200, 0x1080001e, +0xaf820220, 0x3c020001, 0x8c426e44, 0x1440001a, +0x3c033f00, 0x3c020001, 0x8c426d80, 0x1000001a, +0x346300e0, 0x8f830050, 0x3c040001, 0x8c846f1c, +0x3442ffff, 0x621824, 0x1080000f, 0xaf830050, +0x3c020001, 0x8c426e44, 0x1440000b, 0x3c043f00, +0x3c030001, 0x8c636d80, 0x348400e0, 0x24020001, +0xaf820200, 0xaf820220, 0x641825, 0xaf830200, +0x10000008, 0x3c05f700, 0x3c020001, 0x8c426d80, +0x3c033f00, 0x346300e2, 0x431025, 0xaf820200, +0x3c05f700, 0x34a58000, 0x3c030001, 0x8c636d84, +0x3c020001, 0x8c426d90, 0x3c040001, 0x8c846dac, +0x651825, 0x431025, 0x441025, 0xaf820220, +0x3e00008, 0x0, 0x3c030001, 0x8c636db4, +0x3c020001, 0x8c426db8, 0x10620003, 0x24020002, +0x3c010001, 0xac236db8, 0x1062001d, 0x2c620003, +0x10400025, 0x24020001, 0x14620023, 0x24020004, +0x3c030001, 0x8c636d98, 0x10620006, 0x24020008, +0x1462000c, 0x3c0200c8, 0x344201fb, 0x10000009, +0xaf820238, 0x24020e01, 0xaf820238, 0x8f820044, +0x3c03ffff, 0x34633f7f, 0x431024, 0x34420080, +0xaf820044, 0x8f830054, 0x24020002, 0x3c010001, +0xac226db4, 0x3c010001, 0x1000000b, 0xac236f2c, +0x8f830054, 0x3c020001, 0x8c426f2c, 0x2463d8f0, +0x431023, 0x2c422710, 0x14400003, 0x24020009, +0x3c010001, 0xac226db4, 0x3e00008, 0x0, 0x0, 0x0, 0x0, 0x27bdffd8, 0xafb20018, 0x809021, 0xafb3001c, 0xa09821, 0xafb10014, 0xc08821, 0xafb00010, 0x8021, -0xafbf0020, 0xa6200000, 0xc0045f7, 0x24040001, +0xafbf0020, 0xa6200000, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, -0xc0045f7, 0x2021, 0xc0045f7, 0x24040001, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x2501024, 0x10400002, 0x2021, -0x24040001, 0xc0045f7, 0x108042, 0x1600fffa, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x2501024, 0x24100010, 0x2701024, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, -0x1600fffa, 0x2701024, 0xc00461d, 0x34108000, -0xc00461d, 0x0, 0xc0045d7, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x2701024, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc00461d, 0x0, 0x8fbf0020, 0x8fb3001c, +0xc004db9, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, 0x27bdffd8, 0xafb10014, 0x808821, 0xafb20018, 0xa09021, 0xafb3001c, 0xc09821, -0xafb00010, 0x8021, 0xafbf0020, 0xc0045f7, +0xafb00010, 0x8021, 0xafbf0020, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc0045f7, 0x2021, 0xc0045f7, -0x24040001, 0xc0045f7, 0x2021, 0xc0045f7, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, 0x24040001, 0x24100010, 0x2301024, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, +0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x2301024, 0x24100010, 0x2501024, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, -0x108042, 0x1600fffa, 0x2501024, 0xc0045f7, -0x24040001, 0xc0045f7, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x2501024, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96620000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc0045f7, 0x108042, 0x1600fff8, -0x0, 0xc00461d, 0x0, 0x8fbf0020, +0x24040001, 0xc004d78, 0x108042, 0x1600fff8, +0x0, 0xc004db9, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, -0x3e00008, 0x27bd0028, 0x3c030001, 0x8c633e50, -0x3c020001, 0x8c423e94, 0x27bdffd8, 0xafbf0020, -0xafb1001c, 0x10620003, 0xafb00018, 0x3c010001, -0xac233e94, 0x2463ffff, 0x2c620013, 0x10400349, -0x31080, 0x3c010001, 0x220821, 0x8c223c80, -0x400008, 0x0, 0xc00461d, 0x8021, -0x34028000, 0xa7a20010, 0x27b10010, 0xc0045f7, +0x3e00008, 0x27bd0028, 0x3c040001, 0x8c846dd0, +0x3c020001, 0x8c426e18, 0x27bdffd8, 0xafbf0020, +0xafb1001c, 0x10820003, 0xafb00018, 0x3c010001, +0xac246e18, 0x3c030001, 0x8c636f40, 0x24020005, +0x14620005, 0x2483ffff, 0xc004963, 0x0, +0x1000034c, 0x0, 0x2c620013, 0x10400349, +0x31080, 0x3c010001, 0x220821, 0x8c226b80, +0x400008, 0x0, 0xc004db9, 0x8021, +0x34028000, 0xa7a20010, 0x27b10010, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc0045f7, 0x2021, 0xc0045f7, -0x24040001, 0xc0045f7, 0x2021, 0xc0045f7, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, -0x1600fffa, 0x32020001, 0x24100010, 0xc0045f7, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0xc004d78, 0x2021, 0x108042, 0x1600fffc, 0x0, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, -0x1600fff8, 0x0, 0xc00461d, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x1000030e, 0x24020002, 0x27b10010, 0xa7a00010, -0x8021, 0xc0045f7, 0x24040001, 0x26100001, -0x2e020020, 0x1440fffb, 0x0, 0xc0045f7, -0x2021, 0xc0045f7, 0x24040001, 0xc0045f7, -0x24040001, 0xc0045f7, 0x2021, 0x24100010, +0x8021, 0xc004d78, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d78, +0x2021, 0xc004d78, 0x24040001, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020001, -0x24100010, 0xc0045f7, 0x2021, 0x108042, -0x1600fffc, 0x0, 0xc00461d, 0x34108000, -0xc00461d, 0x0, 0xc0045d7, 0x0, +0xc004d78, 0x108042, 0x1600fffa, 0x32020001, +0x24100010, 0xc004d78, 0x2021, 0x108042, +0x1600fffc, 0x0, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, -0xc00461d, 0x0, 0x97a20010, 0x30428000, +0xc004db9, 0x0, 0x97a20010, 0x30428000, 0x144002dc, 0x24020003, 0x100002d8, 0x0, 0x24021200, 0xa7a20010, 0x27b10010, 0x8021, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, -0xc0045f7, 0x2021, 0x108042, 0x1600fffc, -0x0, 0xc0045f7, 0x24040001, 0xc0045f7, +0xc004d78, 0x2021, 0x108042, 0x1600fffc, +0x0, 0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, -0x108042, 0x1600fff8, 0x0, 0xc00461d, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000296, 0x24020004, -0x8f830054, 0x3c020001, 0x8c423f7c, 0x2463ff9c, +0x8f830054, 0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440029e, 0x24020002, -0x3c030001, 0x8c633f80, 0x10620297, 0x2c620003, +0x3c030001, 0x8c636f40, 0x10620297, 0x2c620003, 0x14400296, 0x24020011, 0x24020003, 0x10620005, 0x24020004, 0x10620291, 0x2402000f, 0x1000028f, 0x24020011, 0x1000028d, 0x24020005, 0x24020014, -0xa7a20010, 0x27b10010, 0x8021, 0xc0045f7, +0xa7a20010, 0x27b10010, 0x8021, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc0045f7, 0x2021, 0xc0045f7, -0x24040001, 0xc0045f7, 0x2021, 0xc0045f7, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, +0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020012, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, -0x108042, 0x1600fffa, 0x32020012, 0xc0045f7, -0x24040001, 0xc0045f7, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x32020012, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc0045f7, 0x108042, 0x1600fff8, -0x0, 0xc00461d, 0x0, 0x8f830054, +0x24040001, 0xc004d78, 0x108042, 0x1600fff8, +0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000248, 0x24020006, 0x8f830054, 0x3c020001, -0x8c423f7c, 0x2463ff9c, 0x431023, 0x2c420064, +0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400250, 0x24020007, 0x1000024c, 0x0, 0x24020006, 0xa7a20010, 0x27b10010, 0x8021, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020013, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020013, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, -0x1600fff8, 0x0, 0xc00461d, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000207, 0x24020008, 0x8f830054, -0x3c020001, 0x8c423f7c, 0x2463ff9c, 0x431023, +0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440020f, 0x24020009, 0x1000020b, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x24040001, -0xc0045f7, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020018, -0xc00461d, 0x34108000, 0xc00461d, 0x0, -0xc0045d7, 0x0, 0x50400005, 0x108042, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc00461d, 0x8021, +0x1600fff7, 0x0, 0xc004db9, 0x8021, 0x97a20010, 0x27b10010, 0x34420001, 0xa7a20010, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020018, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, -0x1600fff8, 0x0, 0xc00461d, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000193, 0x2402000a, 0x8f830054, -0x3c020001, 0x8c423f7c, 0x2463ff9c, 0x431023, +0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440019b, 0x2402000b, 0x10000197, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x24040001, -0xc0045f7, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020017, -0xc00461d, 0x34108000, 0xc00461d, 0x0, -0xc0045d7, 0x0, 0x50400005, 0x108042, +0xc004d78, 0x108042, 0x1600fffa, 0x32020017, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc00461d, 0x8021, +0x1600fff7, 0x0, 0xc004db9, 0x8021, 0x97a20010, 0x27b10010, 0x34420700, 0xa7a20010, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020017, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020017, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, -0x1600fff8, 0x0, 0xc00461d, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x1000011f, 0x2402000c, 0x8f830054, -0x3c020001, 0x8c423f7c, 0x2463ff9c, 0x431023, +0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400127, 0x24020012, 0x10000123, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x24040001, -0xc0045f7, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020014, -0xc00461d, 0x34108000, 0xc00461d, 0x0, -0xc0045d7, 0x0, 0x50400005, 0x108042, +0xc004d78, 0x108042, 0x1600fffa, 0x32020014, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc00461d, 0x8021, +0x1600fff7, 0x0, 0xc004db9, 0x8021, 0x97a20010, 0x27b10010, 0x34420010, 0xa7a20010, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020014, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020014, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, -0x1600fff8, 0x0, 0xc00461d, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x100000ab, 0x24020013, 0x8f830054, -0x3c020001, 0x8c423f7c, 0x2463ff9c, 0x431023, +0x3c020001, 0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x144000b3, 0x2402000d, 0x100000af, 0x0, 0x27b10010, 0xa7a00010, 0x8021, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x24040001, -0xc0045f7, 0x2021, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020018, -0xc00461d, 0x34108000, 0xc00461d, 0x0, -0xc0045d7, 0x0, 0x50400005, 0x108042, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, -0x1600fff7, 0x0, 0xc00461d, 0x8021, +0x1600fff7, 0x0, 0xc004db9, 0x8021, 0x97a20010, 0x27b10010, 0x3042fffe, 0xa7a20010, -0xc0045f7, 0x24040001, 0x26100001, 0x2e020020, -0x1440fffb, 0x0, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, -0xc0045f7, 0x24040001, 0x24100010, 0x32020001, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, -0xc0045f7, 0x108042, 0x1600fffa, 0x32020018, -0xc0045f7, 0x24040001, 0xc0045f7, 0x2021, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, -0x1600fff8, 0x0, 0xc00461d, 0x0, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, 0x8f830054, 0x10000037, 0x2402000e, 0x24020840, -0xa7a20010, 0x27b10010, 0x8021, 0xc0045f7, +0xa7a20010, 0x27b10010, 0x8021, 0xc004d78, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, -0x0, 0xc0045f7, 0x2021, 0xc0045f7, -0x24040001, 0xc0045f7, 0x2021, 0xc0045f7, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, 0x24040001, 0x24100010, 0x32020001, 0x10400002, -0x2021, 0x24040001, 0xc0045f7, 0x108042, +0x2021, 0x24040001, 0xc004d78, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, -0x10400002, 0x2021, 0x24040001, 0xc0045f7, -0x108042, 0x1600fffa, 0x32020013, 0xc0045f7, -0x24040001, 0xc0045f7, 0x2021, 0x34108000, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x32020013, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, -0x24040001, 0xc0045f7, 0x108042, 0x1600fff8, -0x0, 0xc00461d, 0x0, 0x8f830054, -0x24020010, 0x3c010001, 0xac223e50, 0x3c010001, -0x1000000c, 0xac233f7c, 0x8f830054, 0x3c020001, -0x8c423f7c, 0x2463ff9c, 0x431023, 0x2c420064, +0x24040001, 0xc004d78, 0x108042, 0x1600fff8, +0x0, 0xc004db9, 0x0, 0x8f830054, +0x24020010, 0x3c010001, 0xac226dd0, 0x3c010001, +0x1000000c, 0xac236f3c, 0x8f830054, 0x3c020001, +0x8c426f3c, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400004, 0x0, 0x24020011, 0x3c010001, -0xac223e50, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, -0x3e00008, 0x27bd0028, 0x8f850044, 0x8f820044, -0x3c030001, 0x431025, 0x3c030008, 0xaf820044, -0x8f840054, 0x8f820054, 0xa32824, 0x10000002, -0x24840001, 0x8f820054, 0x821023, 0x2c420002, -0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, -0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, -0x8f820054, 0x10000002, 0x24630001, 0x8f820054, -0x621023, 0x2c420002, 0x1440fffc, 0x0, -0x3e00008, 0xa01021, 0x8f830044, 0x3c02fff0, -0x3442ffff, 0x42480, 0x621824, 0x3c020002, -0x822025, 0x641825, 0xaf830044, 0x8f820044, -0x3c030001, 0x431025, 0xaf820044, 0x8f830054, -0x8f820054, 0x10000002, 0x24630001, 0x8f820054, -0x621023, 0x2c420002, 0x1440fffc, 0x0, +0xac226dd0, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, +0x3e00008, 0x27bd0028, 0x3c030001, 0x8c636d98, +0x27bdffc8, 0x24020002, 0xafbf0034, 0xafb20030, +0xafb1002c, 0x14620004, 0xafb00028, 0x3c120002, +0x10000003, 0x8e528ff8, 0x3c120002, 0x8e528ffc, +0x3c030001, 0x8c636dd4, 0x3c020001, 0x8c426e1c, +0x50620004, 0x2463ffff, 0x3c010001, 0xac236e1c, +0x2463ffff, 0x2c620006, 0x10400377, 0x31080, +0x3c010001, 0x220821, 0x8c226bd8, 0x400008, +0x0, 0x2021, 0x2821, 0xc004ddb, +0x34068000, 0x24040010, 0x24050002, 0x24060002, +0x24020002, 0xc004ddb, 0xa7a20018, 0x24020002, +0x3c010001, 0x10000364, 0xac226dd4, 0x27b10018, +0xa7a00018, 0x8021, 0xc004d78, 0x24040001, +0x26100001, 0x2e020020, 0x1440fffb, 0x0, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0x24100010, 0x32020001, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x32020001, 0x24100010, 0xc004d78, 0x2021, +0x108042, 0x1600fffc, 0x0, 0xc004db9, +0x34108000, 0xc004db9, 0x0, 0xc004d58, +0x0, 0x50400005, 0x108042, 0x96220000, +0x501025, 0xa6220000, 0x108042, 0x1600fff7, +0x0, 0xc004db9, 0x0, 0x97a20018, +0x30428000, 0x14400004, 0x24020003, 0x3c010001, +0xac226dd4, 0x24020003, 0x3c010001, 0x1000032a, +0xac226dd4, 0x24040010, 0x24050002, 0x24060002, +0x24020002, 0xc004ddb, 0xa7a20018, 0x3c030001, +0x8c636e20, 0x24020001, 0x146201e1, 0x8021, +0x27b10018, 0xa7a00018, 0xc004d78, 0x24040001, +0x26100001, 0x2e020020, 0x1440fffb, 0x0, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0x24100010, 0x32020001, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x32020001, 0x24100010, 0x32020018, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020018, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, +0x50400005, 0x108042, 0x96220000, 0x501025, +0xa6220000, 0x108042, 0x1600fff7, 0x0, +0xc004db9, 0x8021, 0x27b10018, 0xa7a00018, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0x32020001, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x32020001, 0x24100010, +0x32020018, 0x10400002, 0x2021, 0x24040001, +0xc004d78, 0x108042, 0x1600fffa, 0x32020018, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, +0x96220000, 0x501025, 0xa6220000, 0x108042, +0x1600fff7, 0x0, 0xc004db9, 0x8021, +0x24040018, 0x2821, 0xc004ddb, 0x24060404, +0xa7a0001a, 0xc004d78, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d78, +0x2021, 0xc004d78, 0x24040001, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x24100010, +0x32020001, 0x10400002, 0x2021, 0x24040001, +0xc004d78, 0x108042, 0x1600fffa, 0x32020001, +0x24100010, 0x32020018, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x32020018, 0xc004db9, 0x34108000, 0xc004db9, +0x0, 0xc004d58, 0x0, 0x50400005, +0x108042, 0x97a2001a, 0x501025, 0xa7a2001a, +0x108042, 0x1600fff7, 0x0, 0xc004db9, +0x8021, 0xa7a0001a, 0xc004d78, 0x24040001, +0x26100001, 0x2e020020, 0x1440fffb, 0x0, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0x24100010, 0x32020001, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x32020001, 0x24100010, 0x32020018, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020018, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, +0x50400005, 0x108042, 0x97a2001a, 0x501025, +0xa7a2001a, 0x108042, 0x1600fff7, 0x0, +0xc004db9, 0x8021, 0xa7a0001c, 0xc004d78, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x24040001, 0xc004d78, +0x2021, 0x24100010, 0xc004d78, 0x2021, +0x108042, 0x1600fffc, 0x0, 0x24100010, +0x3202001e, 0x10400002, 0x2021, 0x24040001, +0xc004d78, 0x108042, 0x1600fffa, 0x3202001e, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, +0x97a2001c, 0x501025, 0xa7a2001c, 0x108042, +0x1600fff7, 0x0, 0xc004db9, 0x8021, +0xa7a0001c, 0xc004d78, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d78, +0x2021, 0xc004d78, 0x24040001, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x24100010, +0xc004d78, 0x2021, 0x108042, 0x1600fffc, +0x0, 0x24100010, 0x3202001e, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x3202001e, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, +0x50400005, 0x108042, 0x97a2001c, 0x501025, +0xa7a2001c, 0x108042, 0x1600fff7, 0x0, +0xc004db9, 0x8021, 0x24020002, 0xa7a2001e, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0x24100010, 0xc004d78, +0x2021, 0x108042, 0x1600fffc, 0x0, +0x24100010, 0x3202001e, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x3202001e, 0xc004d78, 0x24040001, 0xc004d78, +0x2021, 0x34108000, 0x97a2001e, 0x501024, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fff8, 0x0, 0xc004db9, +0x8021, 0xa7a00020, 0xc004d78, 0x24040001, +0x26100001, 0x2e020020, 0x1440fffb, 0x0, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0x24100010, 0xc004d78, 0x2021, 0x108042, +0x1600fffc, 0x0, 0x24100010, 0x3202001e, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x3202001e, 0xc004db9, +0x34108000, 0xc004db9, 0x0, 0xc004d58, +0x0, 0x50400005, 0x108042, 0x97a20020, +0x501025, 0xa7a20020, 0x108042, 0x1600fff7, +0x0, 0xc004db9, 0x8021, 0xa7a00020, +0xc004d78, 0x24040001, 0x26100001, 0x2e020020, +0x1440fffb, 0x0, 0xc004d78, 0x2021, +0xc004d78, 0x24040001, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0x24100010, 0xc004d78, +0x2021, 0x108042, 0x1600fffc, 0x0, +0x24100010, 0x3202001e, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fffa, +0x3202001e, 0xc004db9, 0x34108000, 0xc004db9, +0x0, 0xc004d58, 0x0, 0x50400005, +0x108042, 0x97a20020, 0x501025, 0xa7a20020, +0x108042, 0x1600fff7, 0x0, 0xc004db9, +0x8021, 0xa7a00022, 0xc004d78, 0x24040001, +0x26100001, 0x2e020020, 0x1440fffb, 0x0, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0xc004d78, 0x2021, 0xc004d78, 0x24040001, +0x24100010, 0xc004d78, 0x2021, 0x108042, +0x1600fffc, 0x0, 0x24100010, 0xc004d78, +0x2021, 0x108042, 0x1600fffc, 0x0, +0xc004d78, 0x24040001, 0xc004d78, 0x2021, +0x34108000, 0x97a20022, 0x501024, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fff8, 0x0, 0xc004db9, 0x0, +0x24040018, 0x24050002, 0xc004ddb, 0x24060004, +0x3c100001, 0x8e106e24, 0x24020001, 0x1602011d, +0x0, 0x3c020001, 0x94426f26, 0x3c010001, +0xac206e24, 0x24429fbc, 0x2c420004, 0x1040000c, +0x24040009, 0x24050001, 0xc004ddb, 0x24060400, +0x24040018, 0x24050001, 0xc004ddb, 0x24060020, +0x24040018, 0x24050001, 0xc004ddb, 0x24062000, +0x3c024000, 0x2421024, 0x10400123, 0x3c022000, +0x2421024, 0x10400004, 0x0, 0x3c010001, +0x10000003, 0xac306f1c, 0x3c010001, 0xac206f1c, +0x3c030001, 0x8c636f34, 0x24020005, 0x146200f9, +0x0, 0x3c020001, 0x8c426f1c, 0x10400067, +0x3c020004, 0x2421024, 0x10400011, 0xa7a00018, +0x3c020008, 0x2421024, 0x10400002, 0x24020200, +0xa7a20018, 0x3c020010, 0x2421024, 0x10400004, +0x0, 0x97a20018, 0x34420100, 0xa7a20018, +0x97a60018, 0x24040009, 0x10000004, 0x2821, +0x24040009, 0x2821, 0x3021, 0xc004ddb, +0x0, 0x24020001, 0xa7a2001a, 0x3c020008, +0x2421024, 0x1040000c, 0x3c020002, 0x2421024, +0x10400002, 0x24020101, 0xa7a2001a, 0x3c020001, +0x2421024, 0x10400005, 0x3c020010, 0x97a2001a, +0x34420040, 0xa7a2001a, 0x3c020010, 0x2421024, +0x1040000e, 0x3c020002, 0x2421024, 0x10400005, +0x3c020001, 0x97a2001a, 0x34420080, 0xa7a2001a, +0x3c020001, 0x2421024, 0x10400005, 0x3c0300a0, +0x97a2001a, 0x34420020, 0xa7a2001a, 0x3c0300a0, +0x2431024, 0x54430004, 0x3c020020, 0x97a2001a, +0x1000000c, 0x34420400, 0x2421024, 0x50400004, +0x3c020080, 0x97a2001a, 0x10000006, 0x34420800, +0x2421024, 0x10400004, 0x0, 0x97a2001a, +0x34420c00, 0xa7a2001a, 0x97a6001a, 0x24040004, +0xc004ddb, 0x2821, 0x3c020004, 0x2421024, +0x10400004, 0xa7a0001c, 0x32425000, 0x14400004, +0x0, 0x32424000, 0x10400005, 0x2021, +0xc004cf9, 0x2402021, 0x10000096, 0x0, +0x97a6001c, 0x2821, 0x34c61200, 0xc004ddb, +0xa7a6001c, 0x1000008f, 0x0, 0x2421024, +0x10400004, 0xa7a00018, 0x32425000, 0x14400004, +0x0, 0x32424000, 0x10400005, 0x3c020010, +0xc004cf9, 0x2402021, 0x10000019, 0xa7a0001a, +0x2421024, 0x10400004, 0x0, 0x97a20018, +0x10000004, 0xa7a20018, 0x97a20018, 0x34420100, +0xa7a20018, 0x3c020001, 0x2421024, 0x10400004, +0x0, 0x97a20018, 0x10000004, 0xa7a20018, +0x97a20018, 0x34422000, 0xa7a20018, 0x97a60018, +0x2021, 0xc004ddb, 0x2821, 0xa7a0001a, +0x8021, 0xc004d78, 0x24040001, 0x26100001, +0x2e020020, 0x1440fffb, 0x0, 0xc004d78, +0x2021, 0xc004d78, 0x24040001, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x24100010, +0x32020001, 0x10400002, 0x2021, 0x24040001, +0xc004d78, 0x108042, 0x1600fffa, 0x32020001, +0x24100010, 0xc004d78, 0x2021, 0x108042, +0x1600fffc, 0x0, 0xc004db9, 0x34108000, +0xc004db9, 0x0, 0xc004d58, 0x0, +0x50400005, 0x108042, 0x97a2001a, 0x501025, +0xa7a2001a, 0x108042, 0x1600fff7, 0x0, +0xc004db9, 0x8021, 0xa7a0001a, 0xc004d78, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x24040001, 0xc004d78, +0x2021, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0xc004d78, +0x2021, 0x108042, 0x1600fffc, 0x0, +0xc004db9, 0x34108000, 0xc004db9, 0x0, +0xc004d58, 0x0, 0x50400005, 0x108042, +0x97a2001a, 0x501025, 0xa7a2001a, 0x108042, +0x1600fff7, 0x0, 0xc004db9, 0x0, +0x3c040001, 0x24846bcc, 0x97a60018, 0x97a7001a, +0x3c020001, 0x8c426d98, 0x3c030001, 0x8c636f1c, +0x3c05000d, 0x34a50205, 0xafa20010, 0xc002b3b, +0xafa30014, 0x8f830054, 0x24020004, 0x3c010001, +0xac226dd4, 0x3c010001, 0x10000017, 0xac236f38, +0x8f830054, 0x3c020001, 0x8c426f38, 0x2463ff9c, +0x431023, 0x2c420064, 0x1440000f, 0x0, +0x8f820220, 0x24030005, 0x3c010001, 0xac236dd4, +0x3c03f700, 0x431025, 0x10000007, 0xaf820220, +0x24020006, 0x3c010001, 0xac226dd4, 0x24020011, +0x3c010001, 0xac226dd0, 0x8fbf0034, 0x8fb20030, +0x8fb1002c, 0x8fb00028, 0x3e00008, 0x27bd0038, +0x27bdffd8, 0xafb00018, 0x808021, 0xafb1001c, +0x8821, 0x32024000, 0x10400013, 0xafbf0020, +0x3c020010, 0x2021024, 0x2c420001, 0x21023, +0x30434100, 0x3c020001, 0x2021024, 0x14400006, +0x34714000, 0x3c020002, 0x2021024, 0x14400002, +0x34716000, 0x34714040, 0x2021, 0x2821, +0x10000036, 0x2203021, 0x32021000, 0x10400035, +0x2021, 0x2821, 0xc004ddb, 0x24060040, +0x24040018, 0x2821, 0xc004ddb, 0x24060c00, +0x24040017, 0x2821, 0xc004ddb, 0x24060400, +0x24040016, 0x2821, 0xc004ddb, 0x24060006, +0x24040017, 0x2821, 0xc004ddb, 0x24062500, +0x24040016, 0x2821, 0xc004ddb, 0x24060006, +0x24040017, 0x2821, 0xc004ddb, 0x24064600, +0x24040016, 0x2821, 0xc004ddb, 0x24060006, +0x24040017, 0x2821, 0xc004ddb, 0x24066700, +0x24040016, 0x2821, 0xc004ddb, 0x24060006, +0x2404001f, 0x2821, 0xc004ddb, 0x24060010, +0x24040009, 0x2821, 0xc004ddb, 0x24061500, +0x24040009, 0x2821, 0x24061d00, 0xc004ddb, +0x0, 0x3c040001, 0x24846bf0, 0x3c05000e, +0x34a50100, 0x2003021, 0x2203821, 0xafa00010, +0xc002b3b, 0xafa00014, 0x8fbf0020, 0x8fb1001c, +0x8fb00018, 0x3e00008, 0x27bd0028, 0x8f850044, +0x8f820044, 0x3c030001, 0x431025, 0x3c030008, +0xaf820044, 0x8f840054, 0x8f820054, 0xa32824, +0x10000002, 0x24840001, 0x8f820054, 0x821023, +0x2c420002, 0x1440fffc, 0x0, 0x8f820044, +0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, +0x8f830054, 0x8f820054, 0x10000002, 0x24630001, +0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, +0x0, 0x3e00008, 0xa01021, 0x8f830044, +0x3c02fff0, 0x3442ffff, 0x42480, 0x621824, +0x3c020002, 0x822025, 0x641825, 0xaf830044, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, +0x1440fffc, 0x0, 0x8f820044, 0x3c030001, +0x431025, 0xaf820044, 0x8f830054, 0x8f820054, +0x10000002, 0x24630001, 0x8f820054, 0x621023, +0x2c420002, 0x1440fffc, 0x0, 0x3e00008, +0x0, 0x8f820044, 0x2403ff7f, 0x431024, +0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, +0x24630001, 0x8f820054, 0x621023, 0x2c420002, +0x1440fffc, 0x0, 0x8f820044, 0x34420080, +0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, +0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0x0, 0x8f820044, 0x3c03fff0, 0x3463ffff, 0x431024, 0xaf820044, 0x8f820044, 0x3c030001, 0x431025, @@ -7940,138 +8571,186 @@ 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, -0x3e00008, 0x0, 0x0, 0x27bdffe8, +0x3e00008, 0x0, 0x27bdffc8, 0xafb30024, +0x809821, 0xafbe002c, 0xa0f021, 0xafb20020, +0xc09021, 0x33c2ffff, 0xafbf0030, 0xafb50028, +0xafb1001c, 0xafb00018, 0x14400034, 0xa7b20010, +0x3271ffff, 0x27b20010, 0x8021, 0xc004d78, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2301024, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x2301024, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, +0x96420000, 0x501024, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x12000075, +0x0, 0x1000fff6, 0x0, 0x3275ffff, +0x27b10010, 0xa7a00010, 0x8021, 0xc004d78, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x24040001, 0xc004d78, +0x2021, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2b01024, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x2b01024, 0xc004db9, +0x34108000, 0xc004db9, 0x0, 0xc004d58, +0x0, 0x50400005, 0x108042, 0x96220000, +0x501025, 0xa6220000, 0x108042, 0x1600fff7, +0x0, 0xc004db9, 0x0, 0x33c5ffff, +0x24020001, 0x54a20004, 0x24020002, 0x97a20010, +0x10000006, 0x521025, 0x14a20006, 0x3271ffff, +0x97a20010, 0x121827, 0x431024, 0xa7a20010, +0x3271ffff, 0x27b20010, 0x8021, 0xc004d78, +0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, +0x0, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0xc004d78, +0x24040001, 0x24100010, 0x32020001, 0x10400002, +0x2021, 0x24040001, 0xc004d78, 0x108042, +0x1600fffa, 0x32020001, 0x24100010, 0x2301024, +0x10400002, 0x2021, 0x24040001, 0xc004d78, +0x108042, 0x1600fffa, 0x2301024, 0xc004d78, +0x24040001, 0xc004d78, 0x2021, 0x34108000, +0x96420000, 0x501024, 0x10400002, 0x2021, +0x24040001, 0xc004d78, 0x108042, 0x1600fff8, +0x0, 0xc004db9, 0x0, 0x8fbf0030, +0x8fbe002c, 0x8fb50028, 0x8fb30024, 0x8fb20020, +0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0038, +0x0, 0x0, 0x0, 0x27bdffe8, 0xafbf0010, 0x8ee304b8, 0x24020008, 0x146201e0, -0x0, 0x3c020001, 0x8c423f68, 0x14400005, -0x0, 0xc003be0, 0x8f840224, 0x100001d8, +0x0, 0x3c020001, 0x8c426f1c, 0x14400005, +0x0, 0xc003daf, 0x8f840224, 0x100001d8, 0x0, 0x8f820220, 0x3c030008, 0x431024, 0x10400026, 0x24020001, 0x8f840224, 0x8f820220, 0x3c030400, 0x431024, 0x10400006, 0x0, -0x3c010001, 0xac205fe0, 0x3c010001, 0x1000000b, -0xac206000, 0x3c030001, 0x24635fe0, 0x8c620000, +0x3c010002, 0xac208fa0, 0x3c010002, 0x1000000b, +0xac208fc0, 0x3c030002, 0x24638fa0, 0x8c620000, 0x24420001, 0xac620000, 0x2c420002, 0x14400003, -0x24020001, 0x3c010001, 0xac226000, 0x3c020001, -0x8c426000, 0x10400006, 0x30820040, 0x10400004, -0x24020001, 0x3c010001, 0x10000003, 0xac226004, -0x3c010001, 0xac206004, 0x3c010001, 0xac245fdc, -0x3c010001, 0x1000000b, 0xac206010, 0x3c010001, -0xac226010, 0x3c010001, 0xac206000, 0x3c010001, -0xac205fe0, 0x3c010001, 0xac206004, 0x3c010001, -0xac205fdc, 0x3c030001, 0x8c635fd0, 0x3c020001, -0x8c425fd4, 0x50620004, 0x2463ffff, 0x3c010001, -0xac235fd4, 0x2463ffff, 0x2c62000e, 0x10400194, -0x31080, 0x3c010001, 0x220821, 0x8c223cd0, -0x400008, 0x0, 0x24020002, 0x3c010001, -0xac206000, 0x3c010001, 0xac205fe0, 0x3c010001, -0xac205fdc, 0x3c010001, 0xac206004, 0x3c010001, -0xac205ff8, 0x3c010001, 0xac205ff0, 0xaf800224, -0x3c010001, 0xac225fd0, 0x3c020001, 0x8c426010, -0x1440004f, 0x3c02fdff, 0x3442ffff, 0xc003be0, +0x24020001, 0x3c010002, 0xac228fc0, 0x3c020002, +0x8c428fc0, 0x10400006, 0x30820040, 0x10400004, +0x24020001, 0x3c010002, 0x10000003, 0xac228fc4, +0x3c010002, 0xac208fc4, 0x3c010002, 0xac248f9c, +0x3c010002, 0x1000000b, 0xac208fd0, 0x3c010002, +0xac228fd0, 0x3c010002, 0xac208fc0, 0x3c010002, +0xac208fa0, 0x3c010002, 0xac208fc4, 0x3c010002, +0xac208f9c, 0x3c030002, 0x8c638f90, 0x3c020002, +0x8c428f94, 0x50620004, 0x2463ffff, 0x3c010002, +0xac238f94, 0x2463ffff, 0x2c62000e, 0x10400194, +0x31080, 0x3c010001, 0x220821, 0x8c226c00, +0x400008, 0x0, 0x24020002, 0x3c010002, +0xac208fc0, 0x3c010002, 0xac208fa0, 0x3c010002, +0xac208f9c, 0x3c010002, 0xac208fc4, 0x3c010002, +0xac208fb8, 0x3c010002, 0xac208fb0, 0xaf800224, +0x3c010002, 0xac228f90, 0x3c020002, 0x8c428fd0, +0x1440004f, 0x3c02fdff, 0x3442ffff, 0xc003daf, 0x282a024, 0xaf800204, 0x8f820200, 0x2403fffd, -0x431024, 0xaf820200, 0x3c010001, 0xac206020, -0x8f830054, 0x3c020001, 0x8c425ff8, 0x24040001, -0x3c010001, 0xac24600c, 0x24420001, 0x3c010001, -0xac225ff8, 0x2c420004, 0x3c010001, 0xac235ff4, -0x14400006, 0x24020003, 0x3c010001, 0xac243e2c, -0x3c010001, 0x1000015e, 0xac205ff8, 0x3c010001, -0x1000015b, 0xac225fd0, 0x8f830054, 0x3c020001, -0x8c425ff4, 0x2463d8f0, 0x431023, 0x2c422710, -0x14400003, 0x24020004, 0x3c010001, 0xac225fd0, -0x3c020001, 0x8c426010, 0x14400021, 0x3c02fdff, +0x431024, 0xaf820200, 0x3c010002, 0xac208fe0, +0x8f830054, 0x3c020002, 0x8c428fb8, 0x24040001, +0x3c010002, 0xac248fcc, 0x24420001, 0x3c010002, +0xac228fb8, 0x2c420004, 0x3c010002, 0xac238fb4, +0x14400006, 0x24020003, 0x3c010001, 0xac246d9c, +0x3c010002, 0x1000015e, 0xac208fb8, 0x3c010002, +0x1000015b, 0xac228f90, 0x8f830054, 0x3c020002, +0x8c428fb4, 0x2463d8f0, 0x431023, 0x2c422710, +0x14400003, 0x24020004, 0x3c010002, 0xac228f90, +0x3c020002, 0x8c428fd0, 0x14400021, 0x3c02fdff, 0x3442ffff, 0x1000014a, 0x282a024, 0x3c040001, -0x8c843f6c, 0x3c010001, 0xc004828, 0xac205fe8, -0x3c020001, 0x8c42601c, 0xaf820204, 0x3c020001, -0x8c426010, 0x14400012, 0x3c03fdff, 0x8f820204, +0x8c846f20, 0x3c010002, 0xc005084, 0xac208fa8, +0x3c020002, 0x8c428fdc, 0xaf820204, 0x3c020002, +0x8c428fd0, 0x14400012, 0x3c03fdff, 0x8f820204, 0x3463ffff, 0x30420030, 0x1440012f, 0x283a024, -0x3c030001, 0x8c63601c, 0x24020005, 0x3c010001, -0xac225fd0, 0x3c010001, 0x10000131, 0xac236020, -0x3c020001, 0x8c426010, 0x10400010, 0x3c02fdff, -0x3c020001, 0x8c423eac, 0x24420001, 0x3c010001, -0xac223eac, 0x2c420002, 0x14400125, 0x24020001, -0x3c010001, 0xac223eb4, 0x3c010001, 0xac203eac, -0x3c010001, 0x1000011e, 0xac223e2c, 0x3c030001, -0x8c636000, 0x3442ffff, 0x10600119, 0x282a024, -0x3c020001, 0x8c425fdc, 0x10400115, 0x0, -0x3c010001, 0xac226008, 0x24020003, 0x3c010001, -0xac225fe0, 0x100000b8, 0x24020006, 0x3c010001, -0xac205fe8, 0x8f820204, 0x34420040, 0xaf820204, -0x3c020001, 0x8c426020, 0x24030007, 0x3c010001, -0xac235fd0, 0x34420040, 0x3c010001, 0xac226020, -0x3c020001, 0x8c426000, 0x10400005, 0x0, -0x3c020001, 0x8c425fdc, 0x104000f0, 0x24020002, -0x3c050001, 0x24a55fe0, 0x8ca20000, 0x2c424e21, -0x104000ea, 0x24020002, 0x3c020001, 0x8c426004, -0x104000ef, 0x2404ffbf, 0x3c020001, 0x8c425fdc, -0x3c030001, 0x8c636008, 0x441024, 0x641824, -0x10430004, 0x24020001, 0x3c010001, 0x100000e4, -0xac225fd0, 0x24020003, 0xaca20000, 0x24020008, -0x3c010001, 0xac225fd0, 0x3c020001, 0x8c42600c, -0x1040000c, 0x24020001, 0x3c040001, 0xc004835, -0x8c845fdc, 0x3c020001, 0x8c426028, 0x14400005, -0x24020001, 0x3c020001, 0x8c426024, 0x10400006, -0x24020001, 0x3c010001, 0xac223e2c, 0x3c010001, -0x100000cb, 0xac205ff8, 0x3c020001, 0x8c425ff0, -0x3c030001, 0x8c635fdc, 0x2c420001, 0x210c0, -0x30630008, 0x3c010001, 0xac225ff0, 0x3c010001, -0xac235fec, 0x8f830054, 0x24020009, 0x3c010001, -0xac225fd0, 0x3c010001, 0x100000b9, 0xac235ff4, -0x8f830054, 0x3c020001, 0x8c425ff4, 0x2463d8f0, +0x3c030002, 0x8c638fdc, 0x24020005, 0x3c010002, +0xac228f90, 0x3c010002, 0x10000131, 0xac238fe0, +0x3c020002, 0x8c428fd0, 0x10400010, 0x3c02fdff, +0x3c020001, 0x8c426e3c, 0x24420001, 0x3c010001, +0xac226e3c, 0x2c420002, 0x14400125, 0x24020001, +0x3c010001, 0xac226e44, 0x3c010001, 0xac206e3c, +0x3c010001, 0x1000011e, 0xac226d9c, 0x3c030002, +0x8c638fc0, 0x3442ffff, 0x10600119, 0x282a024, +0x3c020002, 0x8c428f9c, 0x10400115, 0x0, +0x3c010002, 0xac228fc8, 0x24020003, 0x3c010002, +0xac228fa0, 0x100000b8, 0x24020006, 0x3c010002, +0xac208fa8, 0x8f820204, 0x34420040, 0xaf820204, +0x3c020002, 0x8c428fe0, 0x24030007, 0x3c010002, +0xac238f90, 0x34420040, 0x3c010002, 0xac228fe0, +0x3c020002, 0x8c428fc0, 0x10400005, 0x0, +0x3c020002, 0x8c428f9c, 0x104000f0, 0x24020002, +0x3c050002, 0x24a58fa0, 0x8ca20000, 0x2c424e21, +0x104000ea, 0x24020002, 0x3c020002, 0x8c428fc4, +0x104000ef, 0x2404ffbf, 0x3c020002, 0x8c428f9c, +0x3c030002, 0x8c638fc8, 0x441024, 0x641824, +0x10430004, 0x24020001, 0x3c010002, 0x100000e4, +0xac228f90, 0x24020003, 0xaca20000, 0x24020008, +0x3c010002, 0xac228f90, 0x3c020002, 0x8c428fcc, +0x1040000c, 0x24020001, 0x3c040002, 0xc005091, +0x8c848f9c, 0x3c020002, 0x8c428fe8, 0x14400005, +0x24020001, 0x3c020002, 0x8c428fe4, 0x10400006, +0x24020001, 0x3c010001, 0xac226d9c, 0x3c010002, +0x100000cb, 0xac208fb8, 0x3c020002, 0x8c428fb0, +0x3c030002, 0x8c638f9c, 0x2c420001, 0x210c0, +0x30630008, 0x3c010002, 0xac228fb0, 0x3c010002, +0xac238fac, 0x8f830054, 0x24020009, 0x3c010002, +0xac228f90, 0x3c010002, 0x100000b9, 0xac238fb4, +0x8f830054, 0x3c020002, 0x8c428fb4, 0x2463d8f0, 0x431023, 0x2c422710, 0x1440009f, 0x0, -0x3c020001, 0x8c426000, 0x10400005, 0x0, -0x3c020001, 0x8c425fdc, 0x104000a0, 0x24020002, -0x3c030001, 0x24635fe0, 0x8c620000, 0x2c424e21, -0x1040009a, 0x24020002, 0x3c020001, 0x8c42600c, -0x1040000e, 0x0, 0x3c020001, 0x8c425fdc, -0x3c010001, 0xac20600c, 0x30420080, 0x1040002f, +0x3c020002, 0x8c428fc0, 0x10400005, 0x0, +0x3c020002, 0x8c428f9c, 0x104000a0, 0x24020002, +0x3c030002, 0x24638fa0, 0x8c620000, 0x2c424e21, +0x1040009a, 0x24020002, 0x3c020002, 0x8c428fcc, +0x1040000e, 0x0, 0x3c020002, 0x8c428f9c, +0x3c010002, 0xac208fcc, 0x30420080, 0x1040002f, 0x2402000c, 0x8f820204, 0x30420080, 0x1440000c, -0x24020003, 0x10000029, 0x2402000c, 0x3c020001, -0x8c425fdc, 0x30420080, 0x14400005, 0x24020003, +0x24020003, 0x10000029, 0x2402000c, 0x3c020002, +0x8c428f9c, 0x30420080, 0x14400005, 0x24020003, 0x8f820204, 0x30420080, 0x1040001f, 0x24020003, -0xac620000, 0x2402000a, 0x3c010001, 0xac225fd0, -0x3c040001, 0x24846018, 0x8c820000, 0x3c030001, -0x8c635ff0, 0x431025, 0xaf820204, 0x8c830000, -0x3c040001, 0x8c845ff0, 0x2402000b, 0x3c010001, -0xac225fd0, 0x641825, 0x3c010001, 0xac236020, -0x3c050001, 0x24a55fe0, 0x8ca20000, 0x2c424e21, -0x10400066, 0x24020002, 0x3c020001, 0x8c426010, -0x10400005, 0x0, 0x2402000c, 0x3c010001, -0x10000067, 0xac225fd0, 0x3c020001, 0x8c426000, -0x10400063, 0x0, 0x3c040001, 0x8c845fdc, -0x10800055, 0x30820008, 0x3c030001, 0x8c635fec, -0x1062005b, 0x24020003, 0x3c010001, 0xac246008, -0xaca20000, 0x24020006, 0x3c010001, 0x10000054, -0xac225fd0, 0x8f820200, 0x34420002, 0xaf820200, -0x8f830054, 0x2402000d, 0x3c010001, 0xac225fd0, -0x3c010001, 0xac235ff4, 0x8f830054, 0x3c020001, -0x8c425ff4, 0x2463d8f0, 0x431023, 0x2c422710, -0x14400031, 0x0, 0x3c020001, 0x8c426010, -0x10400020, 0x2402000e, 0x3c030001, 0x8c636024, -0x3c010001, 0x14600015, 0xac225fd0, 0xc003c9e, -0x0, 0x3c050001, 0x8ca53e28, 0xc0049b1, -0x2021, 0x3c030001, 0x8c633e28, 0x24020004, -0x14620005, 0x2403fffb, 0x3c020001, 0x8c423e24, -0x10000003, 0x2403fff7, 0x3c020001, 0x8c423e24, -0x431024, 0x3c010001, 0xac223e24, 0x8f830224, -0x3c020200, 0x3c010001, 0xac23602c, 0x10000020, -0x282a025, 0x3c020001, 0x8c426000, 0x10400005, -0x0, 0x3c020001, 0x8c425fdc, 0x1040000f, -0x24020002, 0x3c020001, 0x8c425fe0, 0x2c424e21, -0x1040000a, 0x24020002, 0x3c020001, 0x8c426000, -0x1040000f, 0x0, 0x3c020001, 0x8c425fdc, -0x1440000b, 0x0, 0x24020002, 0x3c010001, -0x10000007, 0xac225fd0, 0x3c020001, 0x8c426000, -0x10400003, 0x0, 0xc003be0, 0x0, +0xac620000, 0x2402000a, 0x3c010002, 0xac228f90, +0x3c040002, 0x24848fd8, 0x8c820000, 0x3c030002, +0x8c638fb0, 0x431025, 0xaf820204, 0x8c830000, +0x3c040002, 0x8c848fb0, 0x2402000b, 0x3c010002, +0xac228f90, 0x641825, 0x3c010002, 0xac238fe0, +0x3c050002, 0x24a58fa0, 0x8ca20000, 0x2c424e21, +0x10400066, 0x24020002, 0x3c020002, 0x8c428fd0, +0x10400005, 0x0, 0x2402000c, 0x3c010002, +0x10000067, 0xac228f90, 0x3c020002, 0x8c428fc0, +0x10400063, 0x0, 0x3c040002, 0x8c848f9c, +0x10800055, 0x30820008, 0x3c030002, 0x8c638fac, +0x1062005b, 0x24020003, 0x3c010002, 0xac248fc8, +0xaca20000, 0x24020006, 0x3c010002, 0x10000054, +0xac228f90, 0x8f820200, 0x34420002, 0xaf820200, +0x8f830054, 0x2402000d, 0x3c010002, 0xac228f90, +0x3c010002, 0xac238fb4, 0x8f830054, 0x3c020002, +0x8c428fb4, 0x2463d8f0, 0x431023, 0x2c422710, +0x14400031, 0x0, 0x3c020002, 0x8c428fd0, +0x10400020, 0x2402000e, 0x3c030002, 0x8c638fe4, +0x3c010002, 0x14600015, 0xac228f90, 0xc003e6d, +0x0, 0x3c050001, 0x8ca56d98, 0xc00529b, +0x2021, 0x3c030001, 0x8c636d98, 0x24020004, +0x14620005, 0x2403fffb, 0x3c020001, 0x8c426d94, +0x10000003, 0x2403fff7, 0x3c020001, 0x8c426d94, +0x431024, 0x3c010001, 0xac226d94, 0x8f830224, +0x3c020200, 0x3c010002, 0xac238fec, 0x10000020, +0x282a025, 0x3c020002, 0x8c428fc0, 0x10400005, +0x0, 0x3c020002, 0x8c428f9c, 0x1040000f, +0x24020002, 0x3c020002, 0x8c428fa0, 0x2c424e21, +0x1040000a, 0x24020002, 0x3c020002, 0x8c428fc0, +0x1040000f, 0x0, 0x3c020002, 0x8c428f9c, +0x1440000b, 0x0, 0x24020002, 0x3c010002, +0x10000007, 0xac228f90, 0x3c020002, 0x8c428fc0, +0x10400003, 0x0, 0xc003daf, 0x0, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, -0x8fbf0010, 0x3e00008, 0x27bd0018, 0x3c030001, -0x24636028, 0x8c620000, 0x10400005, 0x34422000, -0x3c010001, 0xac22601c, 0x10000003, 0xac600000, -0x3c010001, 0xac24601c, 0x3e00008, 0x0, -0x27bdffe0, 0x30820030, 0xafbf0018, 0x3c010001, -0xac226024, 0x14400067, 0x3c02ffff, 0x34421f0e, +0x8fbf0010, 0x3e00008, 0x27bd0018, 0x3c030002, +0x24638fe8, 0x8c620000, 0x10400005, 0x34422000, +0x3c010002, 0xac228fdc, 0x10000003, 0xac600000, +0x3c010002, 0xac248fdc, 0x3e00008, 0x0, +0x27bdffe0, 0x30820030, 0xafbf0018, 0x3c010002, +0xac228fe4, 0x14400067, 0x3c02ffff, 0x34421f0e, 0x821024, 0x14400061, 0x24020030, 0x30822000, 0x1040005d, 0x30838000, 0x31a02, 0x30820001, -0x21200, 0x3c040001, 0x8c843f6c, 0x621825, -0x331c2, 0x3c030001, 0x24633eb8, 0x30828000, +0x21200, 0x3c040001, 0x8c846f20, 0x621825, +0x331c2, 0x3c030001, 0x24636e48, 0x30828000, 0x21202, 0x30840001, 0x42200, 0x441025, 0x239c2, 0x61080, 0x431021, 0x471021, 0x90430000, 0x24020001, 0x10620025, 0x0, @@ -8079,191 +8758,400 @@ 0x1062002c, 0x3c05000f, 0x10000037, 0x0, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, -0xaf820220, 0x3c010001, 0xac206044, 0x3c010001, -0x10000034, 0xac20604c, 0x8f820200, 0x34420100, +0xaf820220, 0x3c010002, 0xac209004, 0x3c010002, +0x10000034, 0xac20900c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, -0x431024, 0xaf820220, 0x24020100, 0x3c010001, -0xac226044, 0x3c010001, 0x10000026, 0xac20604c, +0x431024, 0xaf820220, 0x24020100, 0x3c010002, +0xac229004, 0x3c010002, 0x10000026, 0xac20900c, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, -0x3c010001, 0xac206044, 0x3c010001, 0x10000019, -0xac23604c, 0x8f820200, 0x34420100, 0xaf820200, +0x3c010002, 0xac209004, 0x3c010002, 0x10000019, +0xac23900c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, -0x24020100, 0x3c010001, 0xac226044, 0x3c010001, -0x1000000c, 0xac23604c, 0x34a5ffff, 0x3c040001, -0x24843d08, 0xafa30010, 0xc002a03, 0xafa00014, -0x10000004, 0x0, 0x24020030, 0x3c010001, -0xac226028, 0x8fbf0018, 0x3e00008, 0x27bd0020, +0x24020100, 0x3c010002, 0xac229004, 0x3c010002, +0x1000000c, 0xac23900c, 0x34a5ffff, 0x3c040001, +0x24846c38, 0xafa30010, 0xc002b3b, 0xafa00014, +0x10000004, 0x0, 0x24020030, 0x3c010002, +0xac228fe8, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0, 0x0, 0x0, 0x27bdffc8, -0xafb10024, 0x808821, 0xafb3002c, 0xa09821, -0xafb00020, 0xc08021, 0x3c040001, 0x24843d20, -0x3c050009, 0x3c020001, 0x8c423e28, 0x34a59001, -0x2203021, 0x2603821, 0xafbf0030, 0xafb20028, -0xa7a0001a, 0xafb00014, 0xc002a03, 0xafa20010, -0x24020002, 0x126200eb, 0x2e620003, 0x10400005, -0x24020001, 0x1262000a, 0x3c02fffb, 0x100000e5, -0x0, 0x24020004, 0x1262006d, 0x24020008, -0x1262006c, 0x3c02ffec, 0x100000de, 0x0, -0x3442ffff, 0x2028024, 0x119140, 0x3c010001, -0x320821, 0xac30603c, 0x3c024000, 0x2021024, -0x10400046, 0x1023c2, 0x30840030, 0x101382, -0x3042000c, 0x3c030001, 0x24633e54, 0x431021, -0x823821, 0x3c020020, 0x2021024, 0x10400006, -0x24020100, 0x3c010001, 0x320821, 0xac226040, -0x10000005, 0x3c020080, 0x3c010001, 0x320821, -0xac206040, 0x3c020080, 0x2021024, 0x10400006, -0x111940, 0x3c020001, 0x3c010001, 0x230821, -0x10000005, 0xac226048, 0x111140, 0x3c010001, -0x220821, 0xac206048, 0x94e30000, 0x32024000, -0x10400003, 0xa7a30018, 0x34624000, 0xa7a20018, -0x24040001, 0x94e20002, 0x24050004, 0x24e60002, -0x34420001, 0xc00423a, 0xa4e20002, 0x24040001, -0x2821, 0xc00423a, 0x27a60018, 0x3c020001, -0x8c423e28, 0x24110001, 0x3c010001, 0xac313e34, -0x14530004, 0x32028000, 0xc003be0, 0x0, -0x32028000, 0x10400097, 0x0, 0xc003be0, -0x0, 0x24020002, 0x3c010001, 0xac313e2c, -0x3c010001, 0x1000008f, 0xac223e28, 0x24040001, -0x24050004, 0x27b0001a, 0xc00423a, 0x2003021, -0x24040001, 0x2821, 0xc00423a, 0x2003021, -0x3c020001, 0x521021, 0x8c426034, 0x3c040001, -0x8c843e28, 0x3c03bfff, 0x3463ffff, 0x3c010001, -0xac333e34, 0x431024, 0x3c010001, 0x320821, -0x10930076, 0xac226034, 0x10000076, 0x0, -0x3c02ffec, 0x3442ffff, 0x2028024, 0x3c020008, -0x2028025, 0x111140, 0x3c010001, 0x220821, -0xac306038, 0x3c022000, 0x2021024, 0x10400009, -0x0, 0x3c020001, 0x8c423eb4, 0x14400005, -0x24020001, 0x3c010001, 0xac223f68, 0x10000004, -0x3c024000, 0x3c010001, 0xac203f68, 0x3c024000, -0x2021024, 0x1440001a, 0x0, 0x3c020001, -0x8c423f68, 0x10400005, 0x24022020, 0x3c010001, -0xac223f6c, 0x24020001, 0xaee204b8, 0x3c04bfff, -0x111940, 0x3c020001, 0x431021, 0x8c426030, -0x3c050001, 0x8ca53e28, 0x3484ffff, 0x441024, -0x3c010001, 0x230821, 0xac226030, 0x24020001, -0x10a20044, 0x0, 0x10000040, 0x0, -0x3c020001, 0x8c423f68, 0x1040001c, 0x24022000, -0x3c010001, 0xac223f6c, 0x3c0300a0, 0x2031024, -0x14430005, 0x111140, 0x3402a000, 0x3c010001, -0x1000002d, 0xac223f6c, 0x3c030001, 0x621821, -0x8c636038, 0x3c020020, 0x621024, 0x10400004, -0x24022001, 0x3c010001, 0x10000023, 0xac223f6c, -0x3c020080, 0x621024, 0x1040001f, 0x3402a001, -0x3c010001, 0x1000001c, 0xac223f6c, 0x3c020020, -0x2021024, 0x10400007, 0x111940, 0x24020100, -0x3c010001, 0x230821, 0xac226044, 0x10000006, -0x3c020080, 0x111140, 0x3c010001, 0x220821, -0xac206044, 0x3c020080, 0x2021024, 0x10400006, -0x111940, 0x3c020001, 0x3c010001, 0x230821, -0x10000005, 0xac22604c, 0x111140, 0x3c010001, -0x220821, 0xac20604c, 0x3c030001, 0x8c633e28, -0x24020001, 0x10620003, 0x0, 0xc003be0, -0x0, 0x8fbf0030, 0x8fb3002c, 0x8fb20028, -0x8fb10024, 0x8fb00020, 0x3e00008, 0x27bd0038, -0x27bdffd0, 0xafb50028, 0x80a821, 0xafb20020, -0x9021, 0xafb30024, 0x9821, 0xafb1001c, -0x8821, 0x24020002, 0xafbf002c, 0xafb00018, -0xa7a00012, 0x10a20068, 0xa7a00010, 0x2ca20003, -0x10400005, 0x24020001, 0x10a2000a, 0x158140, -0x100000ae, 0x2201021, 0x24020004, 0x10a2005e, -0x24020008, 0x10a2005d, 0x152940, 0x100000a7, -0x2201021, 0x3c030001, 0x701821, 0x8c63603c, -0x3c024000, 0x621024, 0x14400009, 0x24040001, -0x3c027fff, 0x3442ffff, 0x628824, 0x3c010001, -0x300821, 0xac316034, 0x10000098, 0x2201021, -0x24050001, 0xc0041f8, 0x27a60010, 0x24040001, -0x24050001, 0xc0041f8, 0x27a60010, 0x97a20010, -0x30420004, 0x10400034, 0x3c114000, 0x3c030001, -0x8c633f80, 0x24020003, 0x10620008, 0x2c620004, -0x14400029, 0x3c028000, 0x24020004, 0x10620014, -0x24040001, 0x10000024, 0x3c028000, 0x24040001, -0x24050011, 0x27b00012, 0xc0041f8, 0x2003021, -0x24040001, 0x24050011, 0xc0041f8, 0x2003021, -0x97a30012, 0x30624000, 0x10400002, 0x3c130010, -0x3c130008, 0x3c120001, 0x10000010, 0x30628000, -0x24050014, 0x27b00012, 0xc0041f8, 0x2003021, -0x24040001, 0x24050014, 0xc0041f8, 0x2003021, -0x97a30012, 0x30621000, 0x10400002, 0x3c130010, -0x3c130008, 0x3c120001, 0x30620800, 0x54400001, -0x3c120002, 0x3c028000, 0x2221025, 0x2531825, -0x10000007, 0x438825, 0x3c110001, 0x2308821, -0x8e31603c, 0x3c027fff, 0x3442ffff, 0x2228824, -0x151140, 0x3c010001, 0x220821, 0xac316034, -0x1000004e, 0x2201021, 0x152940, 0x3c030001, -0x651821, 0x8c636038, 0x3c024000, 0x621024, +0xafb20028, 0x809021, 0xafb3002c, 0xa09821, +0xafb00020, 0xc08021, 0x3c040001, 0x24846c50, +0x3c050009, 0x3c020001, 0x8c426d98, 0x34a59001, +0x2403021, 0x2603821, 0xafbf0030, 0xafb10024, +0xa7a0001a, 0xafb00014, 0xc002b3b, 0xafa20010, +0x24020002, 0x12620083, 0x2e620003, 0x10400005, +0x24020001, 0x1262000a, 0x0, 0x10000173, +0x0, 0x24020004, 0x126200f8, 0x24020008, +0x126200f7, 0x3c02ffec, 0x1000016c, 0x0, +0x3c020001, 0x8c426d94, 0x30420002, 0x14400004, +0x128940, 0x3c02fffb, 0x3442ffff, 0x2028024, +0x3c010002, 0x310821, 0xac308ffc, 0x3c024000, +0x2021024, 0x1040004e, 0x1023c2, 0x30840030, +0x101382, 0x3042001c, 0x3c030001, 0x24636dd8, +0x431021, 0x823821, 0x3c020020, 0x2021024, +0x10400006, 0x24020100, 0x3c010002, 0x310821, +0xac229000, 0x10000005, 0x3c020080, 0x3c010002, +0x310821, 0xac209000, 0x3c020080, 0x2021024, +0x10400006, 0x121940, 0x3c020001, 0x3c010002, +0x230821, 0x10000005, 0xac229008, 0x121140, +0x3c010002, 0x220821, 0xac209008, 0x94e40000, +0x3c030001, 0x8c636f40, 0x24020005, 0x10620010, +0xa7a40018, 0x32024000, 0x10400002, 0x34824000, +0xa7a20018, 0x24040001, 0x94e20002, 0x24050004, +0x24e60002, 0x34420001, 0xc0045be, 0xa4e20002, +0x24040001, 0x2821, 0xc0045be, 0x27a60018, +0x3c020001, 0x8c426d98, 0x24110001, 0x3c010001, +0xac316da4, 0x14530004, 0x32028000, 0xc003daf, +0x0, 0x32028000, 0x1040011c, 0x0, +0xc003daf, 0x0, 0x3c030001, 0x8c636f40, +0x24020005, 0x10620115, 0x24020002, 0x3c010001, +0xac316d9c, 0x3c010001, 0x10000110, 0xac226d98, +0x24040001, 0x24050004, 0x27b0001a, 0xc0045be, +0x2003021, 0x24040001, 0x2821, 0xc0045be, +0x2003021, 0x3c020002, 0x511021, 0x8c428ff4, +0x3c040001, 0x8c846d98, 0x3c03bfff, 0x3463ffff, +0x3c010001, 0xac336da4, 0x431024, 0x3c010002, +0x310821, 0x109300f7, 0xac228ff4, 0x100000f7, +0x0, 0x3c022000, 0x2021024, 0x10400005, +0x24020001, 0x3c010001, 0xac226f1c, 0x10000004, +0x128940, 0x3c010001, 0xac206f1c, 0x128940, +0x3c010002, 0x310821, 0xac308ff8, 0x3c024000, +0x2021024, 0x14400014, 0x0, 0x3c020001, +0x8c426f1c, 0x10400006, 0x24040004, 0x24050001, +0xc004ddb, 0x24062000, 0x24020001, 0xaee204b8, +0x3c020002, 0x511021, 0x8c428ff0, 0x3c03bfff, +0x3463ffff, 0x431024, 0x3c010002, 0x310821, +0x100000d0, 0xac228ff0, 0x3c020001, 0x8c426f1c, +0x10400028, 0x3c0300a0, 0x2031024, 0x5443000d, +0x3c020020, 0x3c020001, 0x8c426f20, 0x24030100, +0x3c010002, 0x310821, 0xac239004, 0x3c030001, +0x3c010002, 0x310821, 0xac23900c, 0x10000015, +0x34420400, 0x2021024, 0x10400008, 0x24030100, +0x3c020001, 0x8c426f20, 0x3c010002, 0x310821, +0xac239004, 0x1000000b, 0x34420800, 0x3c020080, +0x2021024, 0x1040002e, 0x3c030001, 0x3c020001, +0x8c426f20, 0x3c010002, 0x310821, 0xac23900c, +0x34420c00, 0x3c010001, 0xac226f20, 0x10000025, +0x24040001, 0x3c020020, 0x2021024, 0x10400006, +0x24020100, 0x3c010002, 0x310821, 0xac229004, +0x10000005, 0x3c020080, 0x3c010002, 0x310821, +0xac209004, 0x3c020080, 0x2021024, 0x10400007, +0x121940, 0x3c020001, 0x3c010002, 0x230821, +0xac22900c, 0x10000006, 0x24040001, 0x121140, +0x3c010002, 0x220821, 0xac20900c, 0x24040001, +0x2821, 0x27b0001e, 0xc00457c, 0x2003021, +0x24040001, 0x2821, 0xc00457c, 0x2003021, +0x24040001, 0x24050001, 0x27b0001c, 0xc00457c, +0x2003021, 0x24040001, 0x24050001, 0xc00457c, +0x2003021, 0x10000077, 0x0, 0x3c02ffec, +0x3442ffff, 0x2028024, 0x3c020008, 0x2028025, +0x121140, 0x3c010002, 0x220821, 0xac308ff8, +0x3c022000, 0x2021024, 0x10400009, 0x0, +0x3c020001, 0x8c426e44, 0x14400005, 0x24020001, +0x3c010001, 0xac226f1c, 0x10000004, 0x3c024000, +0x3c010001, 0xac206f1c, 0x3c024000, 0x2021024, +0x1440001d, 0x24020e01, 0x3c030001, 0x8c636f1c, +0xaf820238, 0x3c010001, 0xac206db0, 0x10600005, +0x24022020, 0x3c010001, 0xac226f20, 0x24020001, +0xaee204b8, 0x3c04bfff, 0x121940, 0x3c020002, +0x431021, 0x8c428ff0, 0x3c050001, 0x8ca56d98, +0x3484ffff, 0x441024, 0x3c010002, 0x230821, +0xac228ff0, 0x24020001, 0x10a20044, 0x0, +0x10000040, 0x0, 0x3c020001, 0x8c426f1c, +0x1040001c, 0x24022000, 0x3c010001, 0xac226f20, +0x3c0300a0, 0x2031024, 0x14430005, 0x121140, +0x3402a000, 0x3c010001, 0x1000002d, 0xac226f20, +0x3c030002, 0x621821, 0x8c638ff8, 0x3c020020, +0x621024, 0x10400004, 0x24022001, 0x3c010001, +0x10000023, 0xac226f20, 0x3c020080, 0x621024, +0x1040001f, 0x3402a001, 0x3c010001, 0x1000001c, +0xac226f20, 0x3c020020, 0x2021024, 0x10400007, +0x121940, 0x24020100, 0x3c010002, 0x230821, +0xac229004, 0x10000006, 0x3c020080, 0x121140, +0x3c010002, 0x220821, 0xac209004, 0x3c020080, +0x2021024, 0x10400006, 0x121940, 0x3c020001, +0x3c010002, 0x230821, 0x10000005, 0xac22900c, +0x121140, 0x3c010002, 0x220821, 0xac20900c, +0x3c030001, 0x8c636d98, 0x24020001, 0x10620003, +0x0, 0xc003daf, 0x0, 0x8fbf0030, +0x8fb3002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, +0x3e00008, 0x27bd0038, 0x27bdffb0, 0xafb3003c, +0x9821, 0xafb50040, 0xa821, 0xafb10034, +0x8821, 0x24020002, 0xafbf0048, 0xafbe0044, +0xafb20038, 0xafb00030, 0xafa4002c, 0xa7a0001a, +0xa7a00018, 0xa7a00020, 0xa7a0001e, 0xa7a00022, +0x10a20130, 0xa7a0001c, 0x2ca20003, 0x10400005, +0x24020001, 0x10a2000a, 0x3c024000, 0x1000025d, +0x2201021, 0x24020004, 0x10a2020a, 0x24020008, +0x10a20208, 0x2201021, 0x10000256, 0x0, +0x8fa8002c, 0x88140, 0x3c030002, 0x701821, +0x8c638ffc, 0x621024, 0x14400009, 0x24040001, +0x3c027fff, 0x3442ffff, 0x628824, 0x3c010002, +0x300821, 0xac318ff4, 0x10000246, 0x2201021, +0x24050001, 0xc00457c, 0x27a60018, 0x24040001, +0x24050001, 0xc00457c, 0x27a60018, 0x97a20018, +0x30420004, 0x104000d9, 0x3c114000, 0x3c020001, +0x8c426f40, 0x2443ffff, 0x2c620006, 0x104000d9, +0x31080, 0x3c010001, 0x220821, 0x8c226c68, +0x400008, 0x0, 0x24040001, 0x24050011, +0x27b0001a, 0xc00457c, 0x2003021, 0x24040001, +0x24050011, 0xc00457c, 0x2003021, 0x97a3001a, +0x30624000, 0x10400002, 0x3c150010, 0x3c150008, +0x30628000, 0x104000aa, 0x3c130001, 0x100000a8, +0x3c130002, 0x24040001, 0x24050014, 0x27b0001a, +0xc00457c, 0x2003021, 0x24040001, 0x24050014, +0xc00457c, 0x2003021, 0x97a3001a, 0x30621000, +0x10400002, 0x3c150010, 0x3c150008, 0x30620800, +0x10400097, 0x3c130001, 0x10000095, 0x3c130002, +0x24040001, 0x24050019, 0x27b0001c, 0xc00457c, +0x2003021, 0x24040001, 0x24050019, 0xc00457c, +0x2003021, 0x97a2001c, 0x30430700, 0x24020400, +0x10620027, 0x28620401, 0x1040000e, 0x24020200, +0x1062001f, 0x28620201, 0x10400005, 0x24020100, +0x5062001e, 0x3c130001, 0x1000001e, 0x24040001, +0x24020300, 0x50620019, 0x3c130002, 0x10000019, +0x24040001, 0x24020600, 0x1062000d, 0x28620601, +0x10400005, 0x24020500, 0x5062000b, 0x3c130002, +0x10000010, 0x24040001, 0x24020700, 0x1462000d, +0x24040001, 0x3c130004, 0x1000000a, 0x3c150008, +0x10000006, 0x3c130004, 0x10000005, 0x3c150008, +0x3c130001, 0x10000002, 0x3c150008, 0x3c150010, +0x24040001, 0x24050018, 0x27b0001e, 0xc00457c, +0x2003021, 0x24040001, 0x24050018, 0xc00457c, +0x2003021, 0x8fa8002c, 0x97a7001e, 0x81140, +0x3c060002, 0xc23021, 0x8cc68ff4, 0x97a20022, +0x3c100001, 0x26106c5c, 0x2002021, 0xafa20010, +0x97a2001c, 0x3c05000c, 0x34a50303, 0xc002b3b, +0xafa20014, 0x3c020004, 0x16620010, 0x3c020001, +0x8f840054, 0x24030001, 0x24020002, 0x3c010001, +0xac236d9c, 0x3c010001, 0xac226d98, 0x3c010001, +0xac236da4, 0x3c010001, 0xac236e24, 0x3c010001, +0xac246f30, 0x1000004f, 0x2b38825, 0x16620039, +0x3c028000, 0x3c020001, 0x8c426e20, 0x1440001e, +0x24040018, 0x2021, 0x2821, 0xc004ddb, +0x34068000, 0x8f830054, 0x8f820054, 0x2b38825, +0x10000002, 0x24630032, 0x8f820054, 0x621023, +0x2c420033, 0x1440fffc, 0x0, 0x8f830054, +0x24020001, 0x3c010001, 0xac226e20, 0x3c010001, +0xac226d9c, 0x3c010001, 0xac226d98, 0x3c010001, +0xac226da4, 0x3c010001, 0xac226e24, 0x3c010001, +0x1000002c, 0xac236f30, 0x2821, 0xc004ddb, +0x24060404, 0x2021, 0x2405001e, 0x27a60018, +0x24020002, 0xc0045be, 0xa7a20018, 0x2021, +0x2821, 0x27a60018, 0xc0045be, 0xa7a00018, +0x24040018, 0x24050002, 0xc004ddb, 0x24060004, +0x3c028000, 0x2221025, 0x2b31825, 0x10000015, +0x438825, 0x2221025, 0x2751825, 0x438825, +0x2002021, 0x97a6001c, 0x3c070001, 0x8ce76d98, +0x3c05000c, 0x34a50326, 0xafb30010, 0xc002b3b, +0xafb10014, 0x10000007, 0x0, 0x3c110002, +0x2308821, 0x8e318ffc, 0x3c027fff, 0x3442ffff, +0x2228824, 0x3c020001, 0x8c426da8, 0x1040001e, +0x0, 0x3c020001, 0x8c426f1c, 0x10400002, +0x3c022000, 0x2228825, 0x8fa8002c, 0x81140, +0x3c010002, 0x220821, 0x8c229000, 0x10400003, +0x3c020020, 0x10000005, 0x2228825, 0x3c02ffdf, +0x3442ffff, 0x2228824, 0x8fa8002c, 0x81140, +0x3c010002, 0x220821, 0x8c229008, 0x10400003, +0x3c020080, 0x10000004, 0x2228825, 0x3c02ff7f, +0x3442ffff, 0x2228824, 0x8fa8002c, 0x81140, +0x3c010002, 0x220821, 0xac318ff4, 0x10000135, +0x2201021, 0x8fa8002c, 0x8f140, 0x3c030002, +0x7e1821, 0x8c638ff8, 0x3c024000, 0x621024, +0x14400009, 0x24040001, 0x3c027fff, 0x3442ffff, +0x628824, 0x3c010002, 0x3e0821, 0xac318ff0, +0x10000124, 0x2201021, 0x2821, 0xc00457c, +0x27a60018, 0x24040001, 0x2821, 0xc00457c, +0x27a60018, 0x24040001, 0x24050001, 0x27b20020, +0xc00457c, 0x2403021, 0x24040001, 0x24050001, +0xc00457c, 0x2403021, 0x24040001, 0x24050004, +0x27b1001e, 0xc00457c, 0x2203021, 0x24040001, +0x24050004, 0xc00457c, 0x2203021, 0x24040001, +0x24050005, 0x27b00022, 0xc00457c, 0x2003021, +0x24040001, 0x24050005, 0xc00457c, 0x2003021, +0x24040001, 0x24050010, 0xc00457c, 0x27a60018, +0x24040001, 0x24050010, 0xc00457c, 0x27a60018, +0x24040001, 0x2405000a, 0xc00457c, 0x2403021, +0x24040001, 0x2405000a, 0xc00457c, 0x2403021, +0x24040001, 0x24050018, 0xc00457c, 0x2203021, +0x24040001, 0x24050018, 0xc00457c, 0x2203021, +0x24040001, 0x24050001, 0xc00457c, 0x27a60018, +0x24040001, 0x24050001, 0xc00457c, 0x27a60018, +0x97a20018, 0x30420004, 0x10400066, 0x3c114000, +0x3c030001, 0x8c636f34, 0x24020005, 0x14620067, +0x24040001, 0x24050019, 0x27b0001c, 0xc00457c, +0x2003021, 0x24040001, 0x24050019, 0xc00457c, +0x2003021, 0x97a2001c, 0x30430700, 0x24020400, +0x10620027, 0x28620401, 0x1040000e, 0x24020200, +0x1062001f, 0x28620201, 0x10400005, 0x24020100, +0x5062001e, 0x3c130001, 0x1000001e, 0x3c020004, +0x24020300, 0x50620019, 0x3c130002, 0x10000019, +0x3c020004, 0x24020600, 0x1062000d, 0x28620601, +0x10400005, 0x24020500, 0x5062000b, 0x3c130002, +0x10000010, 0x3c020004, 0x24020700, 0x1462000d, +0x3c020004, 0x3c130004, 0x1000000a, 0x3c150008, +0x10000006, 0x3c130004, 0x10000005, 0x3c150008, +0x3c130001, 0x10000002, 0x3c150008, 0x3c150010, +0x3c020004, 0x12620017, 0x3c028000, 0x8f820054, +0x24100001, 0x3c010001, 0xac306d9c, 0x3c010001, +0xac306d98, 0x3c010001, 0xac306da4, 0x3c010001, +0xac306e24, 0x3c010001, 0xac226f30, 0x3c020001, +0x16620022, 0x2758825, 0x2021, 0x2821, +0xc004ddb, 0x34068000, 0x3c010001, 0x1000001b, +0xac306e20, 0x2221025, 0x2b31825, 0x438825, +0x97a6001c, 0x3c020001, 0x8c426f1c, 0x3c070001, +0x8ce76d98, 0x3c040001, 0x24846c5c, 0xafa20010, +0x97a2001e, 0x3c05000c, 0x34a50323, 0x3c010001, +0xac206e20, 0xc002b3b, 0xafa20014, 0x10000007, +0x0, 0x3c110002, 0x23e8821, 0x8e318ff0, +0x3c027fff, 0x3442ffff, 0x2228824, 0x3c020001, +0x8c426da8, 0x10400069, 0x0, 0x3c020001, +0x8c426f1c, 0x10400002, 0x3c022000, 0x2228825, +0x8fa8002c, 0x81140, 0x3c010002, 0x220821, +0x8c229004, 0x10400003, 0x3c020020, 0x10000005, +0x2228825, 0x3c02ffdf, 0x3442ffff, 0x2228824, +0x8fa8002c, 0x81140, 0x3c010002, 0x220821, +0x8c22900c, 0x10400003, 0x3c020080, 0x1000004f, +0x2228825, 0x3c02ff7f, 0x3442ffff, 0x1000004b, +0x2228824, 0x8fa8002c, 0x82940, 0x3c030002, +0x651821, 0x8c638ff8, 0x3c024000, 0x621024, 0x14400008, 0x3c027fff, 0x3442ffff, 0x628824, -0x3c010001, 0x250821, 0xac316030, 0x1000003f, -0x2201021, 0x3c020001, 0x8c423e38, 0x10400033, -0x3c11c00c, 0x3c020001, 0x8c423eb4, 0x3c04c00c, -0x34842000, 0x3c030001, 0x8c633f68, 0x2102b, +0x3c010002, 0x250821, 0xac318ff0, 0x10000041, +0x2201021, 0x3c020001, 0x8c426da8, 0x10400034, +0x3c11c00c, 0x3c020001, 0x8c426e44, 0x3c04c00c, +0x34842000, 0x3c030001, 0x8c636f1c, 0x2102b, 0x21023, 0x441024, 0x10600003, 0x518825, -0x3c022000, 0x2228825, 0x3c020001, 0x451021, -0x8c426044, 0x10400003, 0x3c020020, 0x10000004, +0x3c022000, 0x2228825, 0x3c020002, 0x451021, +0x8c429004, 0x10400003, 0x3c020020, 0x10000004, 0x2228825, 0x3c02ffdf, 0x3442ffff, 0x2228824, -0x151140, 0x3c010001, 0x220821, 0x8c22604c, -0x10400003, 0x3c020080, 0x10000004, 0x2228825, -0x3c02ff7f, 0x3442ffff, 0x2228824, 0x3c020001, -0x8c423ea0, 0x10400002, 0x3c020800, 0x2228825, -0x3c020001, 0x8c423ea4, 0x10400002, 0x3c020400, -0x2228825, 0x3c020001, 0x8c423ea8, 0x10400006, -0x3c020100, 0x10000004, 0x2228825, 0x3c027fff, -0x3442ffff, 0x628824, 0x151140, 0x3c010001, -0x220821, 0xac316030, 0x2201021, 0x8fbf002c, -0x8fb50028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, -0x8fb00018, 0x3e00008, 0x27bd0030, 0x27bdffe0, -0xafb20018, 0x809021, 0xafbf001c, 0xafb10014, -0xafb00010, 0x8f840200, 0x3c030001, 0x8c633e28, -0x8f860220, 0x24020002, 0x106200a6, 0x2c620003, -0x10400005, 0x24020001, 0x1062000a, 0x121940, -0x100000a0, 0x0, 0x24020004, 0x10620053, -0x24020008, 0x10620052, 0x128940, 0x10000099, -0x0, 0x3c050001, 0xa32821, 0x8ca5603c, -0x3c100001, 0x2038021, 0x8e106034, 0x3c024000, -0xa21024, 0x10400038, 0x3c020008, 0x2021024, -0x10400020, 0x34840002, 0x3c020001, 0x431021, -0x8c426040, 0x10400005, 0x34840020, 0x34840100, -0x3c020020, 0x10000006, 0x2028025, 0x2402feff, -0x822024, 0x3c02ffdf, 0x3442ffff, 0x2028024, -0x121140, 0x3c010001, 0x220821, 0x8c226048, -0x10400005, 0x3c020001, 0xc23025, 0x3c020080, -0x10000016, 0x2028025, 0x3c02fffe, 0x3442ffff, -0xc23024, 0x3c02ff7f, 0x3442ffff, 0x1000000f, -0x2028024, 0x2402fedf, 0x822024, 0x3c02fffe, -0x3442ffff, 0xc23024, 0x3c02ff5f, 0x3442ffff, -0x2028024, 0x3c010001, 0x230821, 0xac206040, -0x3c010001, 0x230821, 0xac206048, 0xaf840200, +0x8fa8002c, 0x81140, 0x3c010002, 0x220821, +0x8c22900c, 0x10400003, 0x3c020080, 0x10000004, +0x2228825, 0x3c02ff7f, 0x3442ffff, 0x2228824, +0x3c020001, 0x8c426e30, 0x10400002, 0x3c020800, +0x2228825, 0x3c020001, 0x8c426e34, 0x10400002, +0x3c020400, 0x2228825, 0x3c020001, 0x8c426e38, +0x10400006, 0x3c020100, 0x10000004, 0x2228825, +0x3c027fff, 0x3442ffff, 0x628824, 0x8fa8002c, +0x81140, 0x3c010002, 0x220821, 0xac318ff0, +0x2201021, 0x8fbf0048, 0x8fbe0044, 0x8fb50040, +0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, +0x3e00008, 0x27bd0050, 0x27bdffd0, 0xafb20028, +0x809021, 0xafbf002c, 0xafb10024, 0xafb00020, +0x8f840200, 0x3c100001, 0x8e106d98, 0x8f860220, +0x24020002, 0x1202005c, 0x2e020003, 0x10400005, +0x24020001, 0x1202000a, 0x121940, 0x1000010c, +0x0, 0x24020004, 0x120200bf, 0x24020008, +0x120200be, 0x128940, 0x10000105, 0x0, +0x3c050002, 0xa32821, 0x8ca58ffc, 0x3c100002, +0x2038021, 0x8e108ff4, 0x3c024000, 0xa21024, +0x10400038, 0x3c020008, 0x2021024, 0x10400020, +0x34840002, 0x3c020002, 0x431021, 0x8c429000, +0x10400005, 0x34840020, 0x34840100, 0x3c020020, +0x10000006, 0x2028025, 0x2402feff, 0x822024, +0x3c02ffdf, 0x3442ffff, 0x2028024, 0x121140, +0x3c010002, 0x220821, 0x8c229008, 0x10400005, +0x3c020001, 0xc23025, 0x3c020080, 0x10000016, +0x2028025, 0x3c02fffe, 0x3442ffff, 0xc23024, +0x3c02ff7f, 0x3442ffff, 0x1000000f, 0x2028024, +0x2402fedf, 0x822024, 0x3c02fffe, 0x3442ffff, +0xc23024, 0x3c02ff5f, 0x3442ffff, 0x2028024, +0x3c010002, 0x230821, 0xac209000, 0x3c010002, +0x230821, 0xac209008, 0xaf840200, 0xaf860220, +0x8f820220, 0x34420002, 0xaf820220, 0x1000000a, +0x121140, 0x3c02bfff, 0x3442ffff, 0x8f830200, +0x2028024, 0x2402fffd, 0x621824, 0xc003daf, +0xaf830200, 0x121140, 0x3c010002, 0x220821, +0x100000b7, 0xac308ff4, 0x3c020001, 0x8c426f1c, +0x10400069, 0x24050004, 0x24040001, 0xc00457c, +0x27a60018, 0x24040001, 0x24050005, 0xc00457c, +0x27a6001a, 0x97a30018, 0x97a2001a, 0x3c040001, +0x24846e48, 0x30630c00, 0x31a82, 0x30420c00, +0x21282, 0xa7a2001a, 0x21080, 0x441021, +0x431021, 0xa7a30018, 0x90480000, 0x24020001, +0x3103ffff, 0x10620029, 0x28620002, 0x10400005, +0x0, 0x10600009, 0x0, 0x1000003d, +0x0, 0x10700013, 0x24020003, 0x1062002c, +0x0, 0x10000037, 0x0, 0x8f820200, +0x2403feff, 0x431024, 0xaf820200, 0x8f820220, +0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, +0x3c010002, 0xac209004, 0x3c010002, 0x10000032, +0xac20900c, 0x8f820200, 0x34420100, 0xaf820200, +0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, +0xaf820220, 0x24020100, 0x3c010002, 0xac229004, +0x3c010002, 0x10000024, 0xac20900c, 0x8f820200, +0x2403feff, 0x431024, 0xaf820200, 0x8f820220, +0x3c030001, 0x431025, 0xaf820220, 0x3c010002, +0xac209004, 0x3c010002, 0x10000017, 0xac23900c, +0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, +0x3c030001, 0x431025, 0xaf820220, 0x24020100, +0x3c010002, 0xac229004, 0x3c010002, 0x1000000a, +0xac23900c, 0x3c040001, 0x24846c80, 0x97a6001a, +0x97a70018, 0x3c050001, 0x34a5ffff, 0xafa80010, +0xc002b3b, 0xafa00014, 0x8f820200, 0x34420002, +0x1000004b, 0xaf820200, 0x128940, 0x3c050002, +0xb12821, 0x8ca58ff8, 0x3c100002, 0x2118021, +0x8e108ff0, 0x3c024000, 0xa21024, 0x14400010, +0x0, 0x3c020001, 0x8c426f1c, 0x14400005, +0x3c02bfff, 0x8f820200, 0x34420002, 0xaf820200, +0x3c02bfff, 0x3442ffff, 0xc003daf, 0x2028024, +0x3c010002, 0x310821, 0x10000031, 0xac308ff0, +0x3c020001, 0x8c426f1c, 0x10400005, 0x3c020020, +0x3c020001, 0x8c426e44, 0x10400025, 0x3c020020, +0xa21024, 0x10400007, 0x34840020, 0x24020100, +0x3c010002, 0x310821, 0xac229004, 0x10000006, +0x34840100, 0x3c010002, 0x310821, 0xac209004, +0x2402feff, 0x822024, 0x3c020080, 0xa21024, +0x10400007, 0x121940, 0x3c020001, 0x3c010002, +0x230821, 0xac22900c, 0x10000008, 0xc23025, +0x121140, 0x3c010002, 0x220821, 0xac20900c, +0x3c02fffe, 0x3442ffff, 0xc23024, 0xaf840200, 0xaf860220, 0x8f820220, 0x34420002, 0xaf820220, -0x1000000a, 0x121140, 0x3c02bfff, 0x3442ffff, -0x8f830200, 0x2028024, 0x2402fffd, 0x621824, -0xc003be0, 0xaf830200, 0x121140, 0x3c010001, -0x220821, 0x1000004b, 0xac306034, 0x128940, -0x3c050001, 0xb12821, 0x8ca56038, 0x3c100001, -0x2118021, 0x8e106030, 0x3c024000, 0xa21024, -0x14400010, 0x0, 0x3c020001, 0x8c423f68, -0x14400005, 0x3c02bfff, 0x8f820200, 0x34420002, -0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc003be0, -0x2028024, 0x3c010001, 0x310821, 0x10000031, -0xac306030, 0x3c020001, 0x8c423f68, 0x10400005, -0x3c020020, 0x3c020001, 0x8c423eb4, 0x10400025, -0x3c020020, 0xa21024, 0x10400007, 0x34840020, -0x24020100, 0x3c010001, 0x310821, 0xac226044, -0x10000006, 0x34840100, 0x3c010001, 0x310821, -0xac206044, 0x2402feff, 0x822024, 0x3c020080, -0xa21024, 0x10400007, 0x121940, 0x3c020001, -0x3c010001, 0x230821, 0xac22604c, 0x10000008, -0xc23025, 0x121140, 0x3c010001, 0x220821, -0xac20604c, 0x3c02fffe, 0x3442ffff, 0xc23024, -0xaf840200, 0xaf860220, 0x8f820220, 0x34420002, -0xaf820220, 0x121140, 0x3c010001, 0x220821, -0xac306030, 0x8fbf001c, 0x8fb20018, 0x8fb10014, -0x8fb00010, 0x3e00008, 0x27bd0020, 0x1821, +0x121140, 0x3c010002, 0x220821, 0xac308ff0, +0x8fbf002c, 0x8fb20028, 0x8fb10024, 0x8fb00020, +0x3e00008, 0x27bd0030, 0x0, 0x1821, 0x308400ff, 0x2405ffdf, 0x2406ffbf, 0x641007, 0x30420001, 0x10400004, 0x0, 0x8f820044, 0x10000003, 0x34420040, 0x8f820044, 0x461024, 0xaf820044, 0x8f820044, 0x34420020, 0xaf820044, 0x8f820044, 0x451024, 0xaf820044, 0x24630001, 0x28620008, 0x5440ffee, 0x641007, 0x3e00008, +0x0, 0x2c820008, 0x1040001b, 0x0, +0x2405ffdf, 0x2406ffbf, 0x41880, 0x3c020001, +0x24426e60, 0x621821, 0x24640004, 0x90620000, +0x10400004, 0x0, 0x8f820044, 0x10000003, +0x34420040, 0x8f820044, 0x461024, 0xaf820044, +0x8f820044, 0x34420020, 0xaf820044, 0x8f820044, +0x451024, 0xaf820044, 0x24630001, 0x64102b, +0x1440ffee, 0x0, 0x3e00008, 0x0, +0x0, 0x0, 0x0, 0x8f8400c4, +0x8f8600e0, 0x8f8700e4, 0x2402fff8, 0xc22824, +0x10e5001a, 0x27623ff8, 0x14e20002, 0x24e80008, +0x27683000, 0x55050004, 0x8d0a0000, 0x30c20004, +0x14400012, 0x805021, 0x8ce90000, 0x8f42013c, +0x1494823, 0x49182b, 0x94eb0006, 0x10600002, +0x25630050, 0x494821, 0x123182b, 0x50400003, +0x8f4201fc, 0x3e00008, 0xe01021, 0xaf8800e8, +0x24420001, 0xaf4201fc, 0xaf8800e4, 0x3e00008, +0x1021, 0x3e00008, 0x0, 0x8f8300e4, +0x27623ff8, 0x10620004, 0x24620008, 0xaf8200e8, +0x3e00008, 0xaf8200e4, 0x27623000, 0xaf8200e8, +0x3e00008, 0xaf8200e4, 0x3e00008, 0x0, +0x0, 0x0, 0x0, 0x8f880120, +0x27624fe0, 0x8f830128, 0x15020002, 0x25090020, +0x27694800, 0x11230012, 0x8fa20010, 0xad040000, +0xad050004, 0xad060008, 0xa507000e, 0x8fa30014, +0xad020018, 0x8fa20018, 0xad03001c, 0x25030016, +0xad020010, 0xad030014, 0xaf890120, 0x8f4300fc, +0x24020001, 0x2463ffff, 0x3e00008, 0xaf4300fc, +0x8f430324, 0x1021, 0x24630001, 0x3e00008, +0xaf430324, 0x3e00008, 0x0, 0x8f880100, +0x276247e0, 0x8f830108, 0x15020002, 0x25090020, +0x27694000, 0x1123000f, 0x8fa20010, 0xad040000, +0xad050004, 0xad060008, 0xa507000e, 0x8fa30014, +0xad020018, 0x8fa20018, 0xad03001c, 0x25030016, +0xad020010, 0xad030014, 0xaf890100, 0x3e00008, +0x24020001, 0x8f430328, 0x1021, 0x24630001, +0x3e00008, 0xaf430328, 0x3e00008, 0x0, 0x0, 0x0, 0x0, 0x0 }; u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = { 0x24486561, 0x6465723a, 0x202f7072, @@ -8278,12 +9166,16 @@ 0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 0x51725072, 0x6f644600, 0x6261644d, 0x656d537a, -0x0, 0x68774677, 0x56657200, 0x62616448, +0x0, 0x68775665, 0x72000000, 0x62616448, 0x77566572, 0x0, 0x2a2a4441, 0x574e5f41, 0x0, 0x74785278, 0x4266537a, 0x0, 0x62664174, 0x6e4d726b, 0x0, 0x7265645a, 0x6f6e6531, 0x0, 0x70636943, 0x6f6e6600, -0x67656e43, 0x6f6e6600, 0x72636246, 0x6c616773, +0x67656e43, 0x6f6e6600, 0x2a646d61, 0x5244666c, +0x0, 0x2a50414e, 0x49432a00, 0x2e2e2f2e, +0x2e2f2e2e, 0x2f2e2e2f, 0x2e2e2f73, 0x72632f6e, +0x69632f66, 0x77322f63, 0x6f6d6d6f, 0x6e2f6677, +0x6d61696e, 0x2e630000, 0x72636246, 0x6c616773, 0x0, 0x62616452, 0x78526362, 0x0, 0x676c6f62, 0x466c6773, 0x0, 0x2b5f6469, 0x73705f6c, 0x6f6f7000, 0x2b65765f, 0x68616e64, @@ -8320,12 +9212,14 @@ 0x5f74785f, 0x636f6e73, 0x0, 0x2b685f64, 0x6f5f7570, 0x64617465, 0x5f72785f, 0x70726f64, 0x0, 0x2b636b73, 0x756d3136, 0x0, +0x2b706565, 0x6b5f6d61, 0x635f7278, 0x5f776100, 0x2b706565, 0x6b5f6d61, 0x635f7278, 0x0, 0x2b646571, 0x5f6d6163, 0x5f727800, 0x2b685f6d, 0x61635f72, 0x785f6174, 0x746e0000, 0x62616452, 0x6574537a, 0x0, 0x72784264, 0x4266537a, 0x0, 0x2b6e756c, 0x6c5f6861, 0x6e646c65, 0x72000000, 0x66774f70, 0x4661696c, 0x0, +0x2b685f75, 0x70646174, 0x655f6c65, 0x64340000, 0x2b685f75, 0x70646174, 0x655f6c65, 0x64360000, 0x2b685f75, 0x70646174, 0x655f6c65, 0x64320000, 0x696e7453, 0x74617465, 0x0, 0x2a2a696e, @@ -8368,12 +9262,12 @@ 0x0, 0x3f636d64, 0x48737453, 0x0, 0x3f636d64, 0x4d634d64, 0x0, 0x3f636d64, 0x50726f6d, 0x0, 0x3f636d64, 0x4c696e6b, -0x0, 0x3f636d64, 0x45727200, 0x811c, -0x8898, 0x8898, 0x8820, 0x85c4, -0x886c, 0x8898, 0x81f4, 0x8258, -0x83dc, 0x84b4, 0x8480, 0x8898, -0x82bc, 0x8570, 0x8898, 0x8580, -0x8218, 0x827c, 0x0, 0x0, +0x0, 0x3f636d64, 0x45727200, 0x86ac, +0x8e5c, 0x8e5c, 0x8de4, 0x8b78, +0x8e30, 0x8e5c, 0x8790, 0x8800, +0x8990, 0x8a68, 0x8a34, 0x8e5c, +0x8870, 0x8b24, 0x8e5c, 0x8b34, +0x87b4, 0x8824, 0x0, 0x0, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, @@ -8424,10 +9318,10 @@ 0x2e313220, 0x31393939, 0x2f30312f, 0x32302031, 0x393a3439, 0x3a353120, 0x73687561, 0x6e672045, 0x78702024, 0x0, 0x46575f56, 0x45525349, -0x4f4e3a20, 0x23312054, 0x75652041, 0x70722032, -0x30203137, 0x3a32333a, 0x30322050, 0x44542031, -0x39393900, 0x46575f43, 0x4f4d5049, 0x4c455f54, -0x494d453a, 0x2031373a, 0x32333a30, 0x32000000, +0x4f4e3a20, 0x23312046, 0x72692041, 0x70722037, +0x2031373a, 0x35373a35, 0x32205044, 0x54203230, +0x30300000, 0x46575f43, 0x4f4d5049, 0x4c455f54, +0x494d453a, 0x2031373a, 0x35373a35, 0x32000000, 0x46575f43, 0x4f4d5049, 0x4c455f42, 0x593a2064, 0x65767263, 0x73000000, 0x46575f43, 0x4f4d5049, 0x4c455f48, 0x4f53543a, 0x20636f6d, 0x70757465, @@ -8435,7 +9329,7 @@ 0x4f4d4149, 0x4e3a2065, 0x6e672e61, 0x6374656f, 0x6e2e636f, 0x6d000000, 0x46575f43, 0x4f4d5049, 0x4c45523a, 0x20676363, 0x20766572, 0x73696f6e, -0x20322e37, 0x2e320000, 0x0, 0x12030303, +0x20322e37, 0x2e320000, 0x0, 0x12041100, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, @@ -8465,15 +9359,15 @@ 0x4d657674, 0x526e6746, 0x0, 0x4d516576, 0x74460000, 0x4d516576, 0x505f4600, 0x5173436f, 0x6e495f46, 0x0, 0x5173436f, 0x6e734600, -0x51725072, 0x6f644600, 0x72784672, 0x6d324c67, -0x0, 0x72784e6f, 0x53744264, 0x0, -0x72784e6f, 0x4d694264, 0x0, 0x72784e6f, -0x4a6d4264, 0x0, 0x7278436b, 0x446d6146, -0x0, 0x72785144, 0x6d457846, 0x0, -0x72785144, 0x6d614600, 0x72785144, 0x4c426446, -0x0, 0x72785144, 0x6d426446, 0x0, -0x72784372, 0x63506164, 0x0, 0x72536d51, -0x446d6146, 0x0, 0x0, 0x0, +0x51725072, 0x6f644600, 0x724d6163, 0x43686b30, +0x0, 0x72784672, 0x6d324c67, 0x0, +0x72784e6f, 0x53744264, 0x0, 0x72784e6f, +0x4d694264, 0x0, 0x72784e6f, 0x4a6d4264, +0x0, 0x7278436b, 0x446d6146, 0x0, +0x72785144, 0x6d457846, 0x0, 0x72785144, +0x6d614600, 0x72785144, 0x4c426446, 0x0, +0x72785144, 0x6d426446, 0x0, 0x72784372, +0x63506164, 0x0, 0x72536d51, 0x446d6146, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f2e2f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, @@ -8503,30 +9397,39 @@ 0x6e495f46, 0x0, 0x5173436f, 0x6e734600, 0x51725072, 0x6f644600, 0x0, 0x0, 0x0, 0x50726f62, 0x65506879, 0x0, -0x6c6e6b41, 0x53535254, 0x0, 0xffc4, -0xfff4, 0x1000c, 0x10038, 0x10064, -0x10078, 0x100b4, 0x10454, 0x10234, -0x1026c, 0x10164, 0x102c0, 0x102e8, -0x1031c, 0x101a8, 0x10454, 0x10234, -0x1026c, 0x10290, 0x102c0, 0x102e8, -0x1031c, 0x10348, 0x0, 0x0, -0x0, 0x10a3c, 0x10b0c, 0x10be4, -0x10cb4, 0x10d10, 0x10dec, 0x10e14, -0x10ef0, 0x10f18, 0x110c0, 0x110e8, -0x11290, 0x11488, 0x1171c, 0x11630, -0x1171c, 0x11748, 0x112b8, 0x11460, -0x0, 0x11a4c, 0x11a8c, 0x11b1c, -0x11b60, 0x11bc4, 0x11c50, 0x11c84, -0x11d0c, 0x11da4, 0x11e74, 0x11eb4, -0x11f38, 0x11f5c, 0x1206c, 0x646f4261, +0x6c6e6b41, 0x53535254, 0x0, 0x109a4, +0x10a1c, 0x10a50, 0x10a7c, 0x11050, +0x10aa8, 0x10b10, 0x111fc, 0x10dc0, +0x10c68, 0x10c80, 0x10cc4, 0x10cec, +0x10d0c, 0x10d34, 0x111fc, 0x10dc0, +0x10df8, 0x10e10, 0x10e40, 0x10e68, +0x10e88, 0x10eb0, 0x0, 0x10fdc, +0x11008, 0x1102c, 0x111fc, 0x11050, +0x11078, 0x11108, 0x0, 0x0, +0x0, 0x1186c, 0x1193c, 0x11a14, +0x11ae4, 0x11b40, 0x11c1c, 0x11c44, +0x11d20, 0x11d48, 0x11ef0, 0x11f18, +0x120c0, 0x122b8, 0x1254c, 0x12460, +0x1254c, 0x12578, 0x120e8, 0x12290, +0x7273745f, 0x676d6969, 0x0, 0x12608, +0x12640, 0x12728, 0x13374, 0x133b4, +0x133cc, 0x7365746c, 0x6f6f7000, 0x0, +0x0, 0x13bbc, 0x13bfc, 0x13c8c, +0x13cd0, 0x13d34, 0x13dc0, 0x13df4, +0x13e7c, 0x13f14, 0x13fe4, 0x14024, +0x140a8, 0x140cc, 0x141dc, 0x646f4261, 0x73655067, 0x0, 0x0, 0x0, 0x0, 0x73746d61, 0x634c4e4b, 0x0, +0x6765746d, 0x636c6e6b, 0x0, 0x14ed8, +0x14ed8, 0x14b8c, 0x14bd8, 0x14c24, +0x14ed8, 0x7365746d, 0x61636163, 0x74000000, 0x0, 0x0 }; u32 tigon2FwData[(MAX_DATA_LEN/4) + 1] __initdata = { 0x1, 0x1, 0x1, 0xc001fc, 0x3ffc, 0xc00000, 0x416c7465, 0x6f6e2041, 0x63654e49, -0x43205600, 0x0, 0x0, 0x416c7465, +0x43205600, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x416c7465, 0x6f6e2041, 0x63654e49, 0x43205600, 0x42424242, 0x0, 0x0, 0x0, 0x1ffffc, 0x1fff7c, 0x0, 0x0, 0x0, @@ -8537,13 +9440,17 @@ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, -0x1, 0x0, 0x0, 0x1, +0x1, 0x0, 0x0, 0x0, +0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, -0x0, 0x0, 0x0, 0x0, -0x0, 0x1000000, 0x21000000, 0x12000140, -0x0, 0x0, 0x20000000, 0x120000a0, -0x0, 0x12000060, 0x12000180, 0x120001e0, -0x0, 0x0, 0x0, 0x0, +0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1000000, 0x21000000, +0x12000140, 0x0, 0x0, 0x20000000, +0x120000a0, 0x0, 0x12000060, 0x12000180, +0x120001e0, 0x0, 0x0, 0x0, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x30001, 0x1, -0x30201, 0x0, 0x0, 0x0 }; +0x30201, 0x0, 0x0, 0x1010101, +0x1010100, 0x10100, 0x1010001, 0x10001, +0x1000101, 0x101, 0x0, 0x0 }; diff -urN v2.2.15/linux/drivers/net/c101.c linux/drivers/net/c101.c --- v2.2.15/linux/drivers/net/c101.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/c101.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,276 @@ +/* + * Moxa C101 synchronous serial card driver for Linux + * + * Copyright (C) 2000 Krzysztof Halasa + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Requires hdlc.c, a generic HDLC support module + * Available from ftp://ftp.pm.waw.pl/pub/Linux/hdlc/ + * + * Current status: + * - this is work in progress + * - no support for SMP yet + * + * Sources of information: + * Hitachi HD64570 SCA User's Manual + * Moxa C101 User's Manual + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "syncppp.h" +#include +#include "hd64570.h" + +#define DEBUG_RINGS +#undef DEBUG_PKT + +static const char* version = "Moxa C101 driver revision: 1.0-pre9"; +static const char* devname = "C101"; + +#define C101_PAGE 0x1D00 +#define C101_DTR 0x1E00 +#define C101_SCA 0x1F00 +#define C101_WINDOW_SIZE 0x2000 + +#define RAM_SIZE (256*1024) +#define CLOCK_BASE 9830400 /* 9.8304 MHz */ +#define PAGE0_ALWAYS_MAPPED + +static char *hw=NULL; /* pointer to hw=xxx command line string */ + + +typedef struct card_s { + hdlc_device hdlc; /* HDLC device struct - must be first */ + int clkmode; /* clock speed, 0=ext */ + int loopback; + u8 *win0base; /* ISA window base address */ + u16 buff_offset; /* offset of first buffer of first channel */ + u8 irq; /* IRQ (3-15) */ + u8 ring_buffers; /* number of buffers in a ring */ + u8 page; + + u8 rxin; /* rx ring buffer 'in' pointer */ + u8 txin; /* tx ring buffer 'in' and 'last' pointers */ + u8 txlast; + + struct card_s *next_card; +}card_t; + +typedef card_t port_t; + + +#define sca_in(reg, card) readb(card->win0base+C101_SCA+reg) +#define sca_out(value, reg, card) writeb(value, card->win0base+C101_SCA+reg) +#define sca_inw(reg, card) readw(card->win0base+C101_SCA+reg) +#define sca_outw(value, reg, card) writew(value, card->win0base+C101_SCA+reg) + +#define port_to_card(port) (port) +#define log_node(port) (0) +#define phy_node(port) (0) +#define winsize(card) (C101_WINDOW_SIZE) +#define win0base(card) (card->win0base) +#define winbase(card) (card->win0base+0x2000) +#define get_port(card, port) (port == 0 ? card : NULL) + + +static __inline__ u8 get_page(card_t *card) +{ + return card->page; +} + + + +static __inline__ void openwin(card_t *card, u8 page) +{ + card->page=page; + writeb(page, card->win0base+C101_PAGE); +} + + +#define close_windows(card) {} /* no hardware support */ + + +static __inline__ int set_clock(port_t *port, int clock) +{ + port->clkmode = clock; /* selectable by jumper */ + return 0; +} + + +#define select_phys_iface(port, iface) (-EINVAL) /* No hardware support */ + + +static __inline__ void open_port(port_t *port) +{ + writeb(1, port->win0base+C101_DTR); +} + + +static __inline__ void close_port(port_t *port) +{ + writeb(0, port->win0base+C101_DTR); +} + + +#include "hd6457x.c" + + +static void c101_destroy_card(card_t *card) +{ + if (card->irq) + free_irq(card->irq, card); + + kfree(card); +} + + + +static int c101_run(unsigned long irq, unsigned long winbase) +{ + card_t *card; + int result; + + + if (irq<3 || irq>15 || irq == 6) /* FIXME */ { + printk(KERN_ERR "c101: invalid IRQ value\n"); + return -ENODEV; + } + + if (winbase<0xC0000 || winbase>0xDFFFF || (winbase&0x3FFF)!=0) { + printk(KERN_ERR "c101: invalid RAM value\n"); + return -ENODEV; + } + + card=kmalloc(sizeof(card_t), GFP_KERNEL); + if (card==NULL) { + printk(KERN_ERR "c101: unable to allocate memory\n"); + return -ENOBUFS; + } + memset(card, 0, sizeof(card_t)); + + if (request_irq(irq, sca_intr, 0, devname, card)) { + printk(KERN_ERR "c101: could not allocate IRQ\n"); + c101_destroy_card(card); + return(-EBUSY); + } + card->irq=irq; + + card->win0base=(u8*)winbase; + + /* 2 rings required for 1 port */ + card->ring_buffers = (RAM_SIZE-C101_WINDOW_SIZE) / (2 * HDLC_MAX_MTU); + printk(KERN_DEBUG "c101: using %u packets rings\n",card->ring_buffers); + + card->buff_offset = C101_WINDOW_SIZE; /* Bytes 1D00-1FFF reserved */ + + readb(card->win0base+C101_PAGE); /* Resets SCA? */ + udelay(100); + writeb(0, card->win0base+C101_PAGE); + writeb(0, card->win0base+C101_DTR); /* Power-up for RAM? */ + + sca_init(card, 0); + + card->hdlc.ioctl=sca_ioctl; + card->hdlc.open=sca_open; + card->hdlc.close=sca_close; + hdlc_to_dev(&card->hdlc)->hard_start_xmit=sca_xmit; + hdlc_to_dev(&card->hdlc)->irq=irq; + hdlc_to_dev(&card->hdlc)->tx_queue_len=50; + + result=register_hdlc_device(&card->hdlc); + if (result) { + printk(KERN_WARNING "c101: unable to register hdlc device\n"); + c101_destroy_card(card); + return result; + } + + sca_init_sync_port(card); /* Set up C101 memory */ + + *new_card=card; + new_card=&card->next_card; + return 0; +} + + + +void c101_init(void) +{ + if (hw==NULL) + return; + + printk(KERN_INFO "%s\n", version); + + do { + unsigned long irq, ram; + + irq=simple_strtoul(hw, &hw, 0); + + if (*hw++ != ',') + break; + ram=simple_strtoul(hw, &hw, 0); + + if (*hw == ':' || *hw == '\x0') + c101_run(irq, ram); + + if (*hw == '\x0') + return; + }while(*hw++ == ':'); + + printk(KERN_ERR "c101: invalid hardware parameters\n"); +} + + +#ifndef MODULE + +void c101_setup(char *str, int *ints) +{ + hw=str; +} + +#else + +MODULE_AUTHOR("Krzysztof Halasa "); +MODULE_DESCRIPTION("Moxa C101 serial port driver"); +MODULE_PARM(hw, "s"); /* hw=irq,ram,clock:irq,... */ +EXPORT_NO_SYMBOLS; + +int init_module(void) +{ + if (hw==NULL) { + printk(KERN_ERR "c101: no card initialized\n"); + return -ENOSYS; /* no parameters specified, abort */ + } + + c101_init(); + return first_card ? 0 : -ENOSYS; +} + + + +void cleanup_module(void) +{ + card_t *card=first_card; + + while (card) { + card_t *ptr=card; + card=card->next_card; + unregister_hdlc_device(&ptr->hdlc); + c101_destroy_card(ptr); + } +} + +#endif /* MODULE */ diff -urN v2.2.15/linux/drivers/net/comx-proto-ppp.c linux/drivers/net/comx-proto-ppp.c --- v2.2.15/linux/drivers/net/comx-proto-ppp.c Wed May 3 17:16:40 2000 +++ linux/drivers/net/comx-proto-ppp.c Wed Jun 7 14:26:43 2000 @@ -62,7 +62,7 @@ struct device *dev=(struct device *)d; struct comx_channel *ch=dev->priv; struct syncppp_data *spch=ch->LINE_privdata; - struct sppp *sp = &((struct ppp_device *)dev)->sppp; + struct sppp *sp = (struct sppp *)sppp_of(dev); if(!(ch->line_status & PROTO_UP) && (sp->pp_link_state==SPPP_LINK_UP)) { @@ -202,10 +202,11 @@ static int syncppp_init(struct device *dev) { struct comx_channel *ch = dev->priv; - struct ppp_device *pppdev = (struct ppp_device*)dev; + struct ppp_device *pppdev = (struct ppp_device *)ch->if_ptr; ch->LINE_privdata = kmalloc(sizeof(struct syncppp_data), GFP_KERNEL); + pppdev->dev = dev; sppp_attach(pppdev); if(ch->protocol == &hdlc_protocol) { diff -urN v2.2.15/linux/drivers/net/comx.c linux/drivers/net/comx.c --- v2.2.15/linux/drivers/net/comx.c Wed May 3 17:16:40 2000 +++ linux/drivers/net/comx.c Wed Jun 7 14:26:43 2000 @@ -890,12 +890,10 @@ debug_file->write_proc = &comx_write_proc; debug_file->nlink = 1; - /* struct ppp_device is a bit larger then struct device and the - syncppp driver needs it */ - if ((dev = kmalloc(sizeof(struct ppp_device), GFP_KERNEL)) == NULL) { + if ((dev = kmalloc(sizeof(struct device), GFP_KERNEL)) == NULL) { return -ENOMEM; } - memset(dev, 0, sizeof(struct ppp_device)); + memset(dev, 0, sizeof(struct device)); dev->name = (char *)new_dir->name; dev->init = comx_init_dev; @@ -903,6 +901,11 @@ return -EIO; } ch=dev->priv; + if((ch->if_ptr = (void *)kmalloc(sizeof(struct ppp_device), + GFP_KERNEL)) == NULL) { + return -ENOMEM; + } + memset(ch->if_ptr, 0, sizeof(struct ppp_device)); ch->debug_file = debug_file; ch->procdir = new_dir; new_dir->data = dev; diff -urN v2.2.15/linux/drivers/net/comx.h linux/drivers/net/comx.h --- v2.2.15/linux/drivers/net/comx.h Tue Jan 4 10:12:17 2000 +++ linux/drivers/net/comx.h Wed Jun 7 14:26:43 2000 @@ -45,6 +45,7 @@ }; struct comx_channel { + void *if_ptr; // General purpose pointer struct device *dev; // Where we belong to struct device *twin; // On dual-port cards struct proc_dir_entry *procdir; // the directory diff -urN v2.2.15/linux/drivers/net/cosa.c linux/drivers/net/cosa.c --- v2.2.15/linux/drivers/net/cosa.c Mon Aug 9 12:04:57 1999 +++ linux/drivers/net/cosa.c Wed Jun 7 14:26:43 2000 @@ -118,6 +118,7 @@ /* Per-channel data structure */ struct channel_data { + void *if_ptr; /* General purpose pointer (used by SPPP) */ int usage; /* Usage count; >0 for chrdev, -1 for netdev */ int num; /* Number of the channel */ struct cosa_data *cosa; /* Pointer to the per-card structure */ @@ -572,8 +573,10 @@ static void sppp_channel_init(struct channel_data *chan) { struct device *d; + chan->if_ptr = &chan->pppdev; + chan->pppdev.dev = kmalloc(sizeof(struct device), GFP_KERNEL); sppp_attach(&chan->pppdev); - d=&chan->pppdev.dev; + d=chan->pppdev.dev; d->name = chan->name; d->base_addr = chan->cosa->datareg; d->irq = chan->cosa->irq; @@ -588,15 +591,15 @@ dev_init_buffers(d); if (register_netdev(d) == -1) { printk(KERN_WARNING "%s: register_netdev failed.\n", d->name); - sppp_detach(&chan->pppdev.dev); + sppp_detach(chan->pppdev.dev); return; } } static void sppp_channel_delete(struct channel_data *chan) { - sppp_detach(&chan->pppdev.dev); - unregister_netdev(&chan->pppdev.dev); + sppp_detach(chan->pppdev.dev); + unregister_netdev(chan->pppdev.dev); } @@ -707,7 +710,7 @@ chan->stats.rx_dropped++; return NULL; } - chan->pppdev.dev.trans_start = jiffies; + chan->pppdev.dev->trans_start = jiffies; return skb_put(chan->rx_skb, size); } @@ -721,13 +724,13 @@ return 0; } chan->rx_skb->protocol = htons(ETH_P_WAN_PPP); - chan->rx_skb->dev = &chan->pppdev.dev; + chan->rx_skb->dev = chan->pppdev.dev; chan->rx_skb->mac.raw = chan->rx_skb->data; chan->stats.rx_packets++; chan->stats.rx_bytes += chan->cosa->rxsize; netif_rx(chan->rx_skb); chan->rx_skb = 0; - chan->pppdev.dev.trans_start = jiffies; + chan->pppdev.dev->trans_start = jiffies; return 0; } @@ -745,7 +748,7 @@ chan->tx_skb = 0; chan->stats.tx_packets++; chan->stats.tx_bytes += size; - chan->pppdev.dev.tbusy = 0; + chan->pppdev.dev->tbusy = 0; mark_bh(NET_BH); return 1; } diff -urN v2.2.15/linux/drivers/net/dgrs.c linux/drivers/net/dgrs.c --- v2.2.15/linux/drivers/net/dgrs.c Wed May 3 17:16:40 2000 +++ linux/drivers/net/dgrs.c Wed Jun 7 14:26:43 2000 @@ -4,7 +4,7 @@ * The RightSwitch is a 4 (EISA) or 6 (PCI) port etherswitch and * a NIC on an internal board. * - * Author: Rick Richardson, rick@dgii.com, rick_richardson@dgii.com + * Author: Rick Richardson, rick@remotepoint.com * Derived from the SVR4.2 (UnixWare) driver for the same card. * * Copyright 1995-1996 Digi International Inc. @@ -73,7 +73,7 @@ * */ -static char *version = "$Id: dgrs.c,v 1.12 1996/12/21 13:43:58 rick Exp $"; +static char *version = "$Id: dgrs.c,v 1.13 2000/06/06 04:07:00 rick Exp $"; #include #include @@ -209,7 +209,7 @@ I596_RFD *rfdp; /* Current RFD list */ I596_RBD *rbdp; /* Current RBD list */ - int intrcnt; /* Count of interrupts */ + volatile int intrcnt; /* Count of interrupts */ /* * SE-4 (EISA) board variables @@ -1193,7 +1193,7 @@ */ if (priv->plxreg) OUTL(dev->base_addr + PLX_LCL2PCI_DOORBELL, 1); - rc = request_irq(dev->irq, &dgrs_intr, 0, "RightSwitch", dev); + rc = request_irq(dev->irq, &dgrs_intr, SA_SHIRQ, "RightSwitch", dev); if (rc) return (rc); diff -urN v2.2.15/linux/drivers/net/dmfe.c linux/drivers/net/dmfe.c --- v2.2.15/linux/drivers/net/dmfe.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/dmfe.c Wed Jun 7 14:26:43 2000 @@ -363,10 +363,9 @@ pci_read_config_dword(net_dev, PCI_REVISION_ID, &dev_rev); /* IO range check */ - if (check_region(pci_iobase, CHK_IO_SIZE(pci_id, dev_rev))) { - printk(KERN_ERR "dmfe: I/O conflict : IO=%x Range=%x\n", pci_iobase, CHK_IO_SIZE(pci_id, dev_rev)); + if (check_region(pci_iobase, CHK_IO_SIZE(pci_id, dev_rev))) continue; - } + /* Interrupt check */ if (pci_irqline == 0) { printk(KERN_ERR "dmfe: Interrupt wrong : IRQ=%d\n", pci_irqline); diff -urN v2.2.15/linux/drivers/net/eepro.c linux/drivers/net/eepro.c --- v2.2.15/linux/drivers/net/eepro.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/eepro.c Wed Jun 7 14:26:43 2000 @@ -23,6 +23,10 @@ This is a compatibility hardware problem. Versions: + 0.12a fixed bug that would make impossible have ee10 boards and + other previous supported boards. (aris, 05/19/2000) + 0.12 added support to 82595FX etherexpress 10 based cards + (aris ), 04/26/2000) 0.11e some tweaks about multiple cards support (PdP, jul/aug 1999) 0.11d added __initdata, __initfunc stuff; call spin_lock_init in eepro_probe1. Replaced "eepro" by dev->name. Augmented @@ -93,7 +97,7 @@ */ static const char *version = - "eepro.c: v0.11d 08/12/1998 dupuis@lei.ucl.ac.be\n"; + "eepro.c: v0.12a 04/26/2000 aris@conectiva.com.br\n"; #include @@ -140,11 +144,6 @@ #include -/* need to remove these asap */ -/* 2.1.xx compatibility macros... */ -/* */ - - #include /* For linux 2.1.xx */ @@ -176,15 +175,10 @@ /* First, a few definitions that the brave might change. */ /* A zero-terminated list of I/O addresses to be probed. */ static unsigned int eepro_portlist[] compat_init_data = - { 0x300, 0x210, 0x240, 0x280, 0x2C0, 0x200, 0x320, 0x340, 0x360, 0}; + { 0x300, 0x210, 0x240, 0x280, 0x2C0, 0x200, 0x320, 0x340, 0x360, 0}; /* note: 0x300 is default, the 595FX supports ALL IO Ports from 0x000 to 0x3F0, some of which are reserved in PCs */ -/* To try the (not-really PnP Wakeup: */ -/* -#define PnPWakeup -*/ - /* use 0 for production, 1 for verification, >2 for debug */ #ifndef NET_DEBUG #define NET_DEBUG 0 @@ -198,6 +192,7 @@ #define LAN595 0 #define LAN595TX 1 #define LAN595FX 2 +#define LAN595FX_10ISA 3 /* Information that need to be kept for each board. */ struct eepro_local { @@ -212,9 +207,7 @@ int version; /* a flag to indicate if this is a TX or FX version of the 82595 chip. */ int stepping; -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 spinlock_t lock; /* Serializing lock */ -#endif }; /* The station (ethernet) address prefix, used for IDing the board. */ @@ -316,7 +309,7 @@ static struct enet_statistics *eepro_get_stats(struct device *dev); static void set_multicast_list(struct device *dev); -static int read_eeprom(int ioaddr, int location); +static int read_eeprom(int ioaddr, int location, struct device *dev); static void hardware_send_packet(struct device *dev, void *buf, short length); static int eepro_grab_irq(struct device *dev); @@ -350,18 +343,33 @@ buffer (transmit-buffer = 32K - receive-buffer). */ + +/* now this section could be used by both boards: the oldies and the ee10: + * ee10 uses tx buffer before of rx buffer and the oldies the inverse. + * (aris) + */ #define RAM_SIZE 0x8000 + #define RCV_HEADER 8 -#define RCV_RAM 0x6000 /* 24KB default for RCV buffer */ -#define RCV_LOWER_LIMIT 0x00 /* 0x0000 */ -/* #define RCV_UPPER_LIMIT ((RCV_RAM - 2) >> 8) */ /* 0x5ffe */ -#define RCV_UPPER_LIMIT (((rcv_ram) - 2) >> 8) -/* #define XMT_RAM (RAM_SIZE - RCV_RAM) */ /* 8KB for XMT buffer */ -#define XMT_RAM (RAM_SIZE - (rcv_ram)) /* 8KB for XMT buffer */ -/* #define XMT_LOWER_LIMIT (RCV_RAM >> 8) */ /* 0x6000 */ -#define XMT_LOWER_LIMIT ((rcv_ram) >> 8) -#define XMT_UPPER_LIMIT ((RAM_SIZE - 2) >> 8) /* 0x7ffe */ -#define XMT_HEADER 8 +#define RCV_DEFAULT_RAM 0x6000 +#define RCV_RAM rcv_ram + +static unsigned rcv_ram = RCV_DEFAULT_RAM; + +#define XMT_HEADER 8 +#define XMT_RAM (RAM_SIZE - RCV_RAM) + +#define XMT_START ((rcv_start + RCV_RAM) % RAM_SIZE) + +#define RCV_LOWER_LIMIT (rcv_start >> 8) +#define RCV_UPPER_LIMIT (((rcv_start + RCV_RAM) - 2) >> 8) +#define XMT_LOWER_LIMIT (XMT_START >> 8) +#define XMT_UPPER_LIMIT (((XMT_START + XMT_RAM) - 2) >> 8) + +#define RCV_START_PRO 0x00 +#define RCV_START_10 XMT_RAM + /* by default the old driver */ +static unsigned rcv_start = RCV_START_PRO; #define RCV_DONE 0x0008 #define RX_OK 0x2000 @@ -407,7 +415,11 @@ #define IO_32_BIT 0x10 #define RCV_BAR 0x04 /* The following are word (16-bit) registers */ #define RCV_STOP 0x06 -#define XMT_BAR 0x0a + +#define XMT_BAR_PRO 0x0a +#define XMT_BAR_10 0x0b +static unsigned xmt_bar = XMT_BAR_PRO; + #define HOST_ADDRESS_REG 0x0c #define IO_PORT 0x0e #define IO_PORT_32_BIT 0x0c @@ -419,8 +431,13 @@ #define INT_NO_REG 0x02 #define RCV_LOWER_LIMIT_REG 0x08 #define RCV_UPPER_LIMIT_REG 0x09 -#define XMT_LOWER_LIMIT_REG 0x0a -#define XMT_UPPER_LIMIT_REG 0x0b + +#define XMT_LOWER_LIMIT_REG_PRO 0x0a +#define XMT_UPPER_LIMIT_REG_PRO 0x0b +#define XMT_LOWER_LIMIT_REG_10 0x0b +#define XMT_UPPER_LIMIT_REG_10 0x0a +static unsigned xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_PRO; +static unsigned xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_PRO; /* Bank 2 registers */ #define XMT_Chain_Int 0x20 /* Interrupt at the end of the transmit chain */ @@ -443,12 +460,68 @@ #define I_ADD_REG4 0x08 #define I_ADD_REG5 0x09 -#define EEPROM_REG 0x0a +#define EEPROM_REG_PRO 0x0a +#define EEPROM_REG_10 0x0b +static unsigned eeprom_reg = EEPROM_REG_PRO; + #define EESK 0x01 #define EECS 0x02 #define EEDI 0x04 #define EEDO 0x08 +/* do a full reset */ +#define eepro_reset(ioaddr) outb(RESET_CMD, ioaddr) + +/* do a nice reset */ +#define eepro_sel_reset(ioaddr) { \ + outb(SEL_RESET_CMD, ioaddr); \ + SLOW_DOWN; \ + SLOW_DOWN; \ + } + +/* disable all interrupts */ +#define eepro_dis_int(ioaddr) outb(ALL_MASK, ioaddr + INT_MASK_REG) + +/* clear all interrupts */ +#define eepro_clear_int(ioaddr) outb(ALL_MASK, ioaddr + STATUS_REG) + +/* enable tx/rx */ +#define eepro_en_int(ioaddr) outb(ALL_MASK & ~(RX_MASK | TX_MASK), \ + ioaddr + INT_MASK_REG) + +/* enable exec event interrupt */ +#define eepro_en_intexec(ioaddr) outb(ALL_MASK & ~(EXEC_MASK), ioaddr + INT_MASK_REG) + +/* enable rx */ +#define eepro_en_rx(ioaddr) outb(RCV_ENABLE_CMD, ioaddr) + +/* disable rx */ +#define eepro_dis_rx(ioaddr) outb(RCV_DISABLE_CMD, ioaddr) + +/* switch bank */ +#define eepro_sw2bank0(ioaddr) outb(BANK0_SELECT, ioaddr) +#define eepro_sw2bank1(ioaddr) outb(BANK1_SELECT, ioaddr) +#define eepro_sw2bank2(ioaddr) outb(BANK2_SELECT, ioaddr) + +/* enable interrupt line */ +#define eepro_en_intline(ioaddr) outb(inb(ioaddr + REG1) | INT_ENABLE,\ + ioaddr + REG1) + +/* disable interrupt line */ +#define eepro_dis_intline(ioaddr) outb(inb(ioaddr + REG1) & 0x7f, \ + ioaddr + REG1); + +/* set diagnose flag */ +#define eepro_diag(ioaddr) outb(DIAGNOSE_CMD, ioaddr) + +/* ack for rx/tx int */ +#define eepro_ack_rxtx(ioaddr) outb (RX_INT | TX_INT, ioaddr + STATUS_REG) + +/* ack for rx int */ +#define eepro_ack_rx(ioaddr) outb (RX_INT, ioaddr + STATUS_REG) + +/* ack for tx int */ +#define eepro_ack_tx(ioaddr) outb (TX_INT, ioaddr + STATUS_REG) /* Check for a network adaptor of this type, and return '0' if one exists. If dev->base_addr == 0, probe all likely locations. @@ -457,53 +530,21 @@ (detachable devices only). */ #ifdef HAVE_DEVLIST -/* Support for an alternate probe manager, which will eliminate the - boilerplate below. */ + /* Support for an alternate probe manager, which will eliminate the + boilerplate below. */ struct netdev_entry netcard_drv = -{"eepro", eepro_probe1, EEPRO_IO_EXTENT, eepro_portlist}; + {"eepro", eepro_probe1, EEPRO_IO_EXTENT, eepro_portlist}; #else compat_init_func(int eepro_probe(struct device *dev)) { int i; int base_addr = dev ? dev->base_addr : 0; - - -#ifdef PnPWakeup - /* XXXX for multiple cards should this only be run once? */ - - /* Wakeup: */ - #define WakeupPort 0x279 - #define WakeupSeq {0x6A, 0xB5, 0xDA, 0xED, 0xF6, 0xFB, 0x7D, 0xBE,\ - 0xDF, 0x6F, 0x37, 0x1B, 0x0D, 0x86, 0xC3, 0x61,\ - 0xB0, 0x58, 0x2C, 0x16, 0x8B, 0x45, 0xA2, 0xD1,\ - 0xE8, 0x74, 0x3A, 0x9D, 0xCE, 0xE7, 0x73, 0x43} - - { - unsigned short int WS[32]=WakeupSeq; - - if (check_region(WakeupPort, 2)==0) { - - if (net_debug>5) - printk(KERN_DEBUG "Waking UP\n"); - - outb_p(0,WakeupPort); - outb_p(0,WakeupPort); - for (i=0; i<32; i++) { - outb_p(WS[i],WakeupPort); - if (net_debug>5) printk(KERN_DEBUG ": %#x ",WS[i]); - } - } else printk(KERN_WARNING "Checkregion Failed!\n"); - } -#endif - - if (base_addr > 0x1ff) /* Check a single specified location. */ return eepro_probe1(dev, base_addr); else if (base_addr != 0) /* Don't probe at all. */ return ENXIO; - for (i = 0; eepro_portlist[i]; i++) { int ioaddr = eepro_portlist[i]; @@ -512,21 +553,21 @@ if (eepro_probe1(dev, ioaddr) == 0) return 0; } - + return ENODEV; } #endif -void printEEPROMInfo(short ioaddr) +static void printEEPROMInfo(short ioaddr, struct device *dev) { unsigned short Word; int i,j; for (i=0, j=ee_Checksum; i>ee_IO0)<<4); if (net_debug>4) { - Word=read_eeprom(ioaddr, 1); + Word=read_eeprom(ioaddr, 1, dev); printk(KERN_DEBUG "Word1:\n"); printk(KERN_DEBUG " INT: %d\n", Word & ee_IntMask); printk(KERN_DEBUG " LI: %d\n", GetBit(Word,ee_LI)); @@ -545,7 +586,7 @@ printk(KERN_DEBUG " Duplex: %d\n", GetBit(Word,ee_Duplex)); } - Word=read_eeprom(ioaddr, 5); + Word=read_eeprom(ioaddr, 5, dev); printk(KERN_DEBUG "Word5:\n"); printk(KERN_DEBUG " BNC: %d\n",GetBit(Word,ee_BNC_TPE)); printk(KERN_DEBUG " NumConnectors: %d\n",GetBit(Word,ee_NumConn)); @@ -555,12 +596,12 @@ if (GetBit(Word,ee_PortAUI)) printk("AUI "); printk("port(s) \n"); - Word=read_eeprom(ioaddr, 6); + Word=read_eeprom(ioaddr, 6, dev); printk(KERN_DEBUG "Word6:\n"); printk(KERN_DEBUG " Stepping: %d\n",Word & ee_StepMask); printk(KERN_DEBUG " BoardID: %d\n",Word>>ee_BoardID); - Word=read_eeprom(ioaddr, 7); + Word=read_eeprom(ioaddr, 7, dev); printk(KERN_DEBUG "Word7:\n"); printk(KERN_DEBUG " INT to IRQ:\n"); @@ -580,7 +621,8 @@ { unsigned short station_addr[6], id, counter; int i,j, irqMask; - int eepro; + int eepro = 0; + struct eepro_local *lp; const char *ifmap[] = {"AUI", "10Base2", "10BaseT"}; enum iftype { AUI=0, BNC=1, TPE=2 }; @@ -589,40 +631,62 @@ id=inb(ioaddr + ID_REG); - printk(KERN_DEBUG " id: %#x ",id); - printk(" io: %#x ",ioaddr); - if (((id) & ID_REG_MASK) == ID_REG_SIG) { /* We seem to have the 82595 signature, let's play with its counter (last 2 bits of register 2 of bank 0) to be sure. */ - counter = (id & R_ROBIN_BITS); if (((id=inb(ioaddr+ID_REG)) & R_ROBIN_BITS) == (counter + 0x40)) { /* Yes, the 82595 has been found */ + printk(KERN_DEBUG " id: %#x ",id); + printk(" io: %#x ",ioaddr); + + /* Initialize the device structure */ + dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL); + if (dev->priv == NULL) + return -ENOMEM; + memset(dev->priv, 0, sizeof(struct eepro_local)); + + lp = (struct eepro_local *)dev->priv; /* Now, get the ethernet hardware address from the EEPROM */ - station_addr[0] = read_eeprom(ioaddr, 2); - station_addr[1] = read_eeprom(ioaddr, 3); - station_addr[2] = read_eeprom(ioaddr, 4); + station_addr[0] = read_eeprom(ioaddr, 2, dev); - /* Check the station address for the manufacturer's code */ - if (net_debug>3) - printEEPROMInfo(ioaddr); - - if (read_eeprom(ioaddr,7)== ee_FX_INT2IRQ) { /* int to IRQ Mask */ + /* FIXME - find another way to know that we've found + * a Etherexpress 10 + */ + if (station_addr[0] == 0x0000 || + station_addr[0] == 0xffff) { + eepro = 3; + lp->eepro = LAN595FX_10ISA; + eeprom_reg = EEPROM_REG_10; + rcv_start = RCV_START_10; + xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_10; + xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_10; + + station_addr[0] = read_eeprom(ioaddr, 2, dev); + } + + station_addr[1] = read_eeprom(ioaddr, 3, dev); + station_addr[2] = read_eeprom(ioaddr, 4, dev); + + + if (eepro) { + printk("%s: Intel EtherExpress 10 ISA\n at %#x,", + dev->name, ioaddr); + } else if (read_eeprom(ioaddr,7,dev)== ee_FX_INT2IRQ) { + /* int to IRQ Mask */ eepro = 2; printk("%s: Intel EtherExpress Pro/10+ ISA\n at %#x,", dev->name, ioaddr); - } else - if (station_addr[2] == 0x00aa) { + } else if (station_addr[2] == SA_ADDR1) { eepro = 1; - printk("%s: Intel EtherExpress Pro/10 ISA at %#x,", + printk("%s: Intel EtherExpress Pro/10 ISA at %#x,", dev->name, ioaddr); } else { @@ -638,21 +702,29 @@ dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i]; printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]); } - + + dev->mem_start = (RCV_LOWER_LIMIT << 8); + if ((dev->mem_end & 0x3f) < 3 || /* RX buffer must be more than 3K */ (dev->mem_end & 0x3f) > 29) /* and less than 29K */ - dev->mem_end = RCV_RAM; /* or it will be set to 24K */ - else dev->mem_end = 1024*dev->mem_end; /* Maybe I should shift << 10 */ + dev->mem_end = (RCV_UPPER_LIMIT << 8); + else { + dev->mem_end = (dev->mem_end * 1024) + + (RCV_LOWER_LIMIT << 8); + rcv_ram = dev->mem_end - (RCV_LOWER_LIMIT << 8); + } - /* From now on, dev->mem_end contains the actual size of rx buffer */ + /* From now on, dev->mem_end - dev->mem_start contains + * the actual size of rx buffer + */ if (net_debug > 3) - printk(", %dK RCV buffer", (int)(dev->mem_end)/1024); - - + printk(", %dK RCV buffer", + (int)(dev->mem_end - dev->mem_start)/1024); + /* ............... */ - if (GetBit( read_eeprom(ioaddr, 5),ee_BNC_TPE)) + if (GetBit( read_eeprom(ioaddr, 5, dev),ee_BNC_TPE)) dev->if_port = BNC; else dev->if_port = TPE; @@ -660,8 +732,8 @@ if ((dev->irq < 2) && (eepro!=0)) { - i = read_eeprom(ioaddr, 1); - irqMask = read_eeprom(ioaddr, 7); + i = read_eeprom(ioaddr, 1, dev); + irqMask = read_eeprom(ioaddr, 7, dev); i &= 0x07; /* Mask off INT number */ for (j=0; ((j<16) && (i>=0)); j++) { @@ -673,15 +745,13 @@ i--; /* count bits set in irqMask */ } } - if (dev -> irq<2) { + if (dev->irq < 2) { printk(" Duh! illegal interrupt vector stored in EEPROM.\n"); return ENODEV; } else - if (dev->irq==2) dev->irq = 9; - - else if (dev->irq == 2) - dev->irq = 9; + if (dev->irq==2) + dev->irq = 9; } if (dev->irq > 2) { @@ -690,11 +760,8 @@ } else printk(", %s.\n", ifmap[dev->if_port]); - if ((dev->mem_start & 0xf) > 0) /* I don't know if this is */ - net_debug = dev->mem_start & 7; /* still useful or not */ - if (net_debug > 3) { - i = read_eeprom(ioaddr, 5); + i = read_eeprom(ioaddr, 5, dev); if (i & 0x2000) /* bit 13 of EEPROM word 5 */ printk(KERN_DEBUG "%s: Concurrent Processing is enabled but not used!\n", dev->name); @@ -706,15 +773,7 @@ /* Grab the region so we can find another board if autoIRQ fails. */ request_region(ioaddr, EEPRO_IO_EXTENT, dev->name); - /* Initialize the device structure */ - dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL); - if (dev->priv == NULL) - return -ENOMEM; - memset(dev->priv, 0, sizeof(struct eepro_local)); - -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 spin_lock_init(&(((struct eepro_local *)dev->priv)->lock)); -#endif dev->open = eepro_open; dev->stop = eepro_close; dev->hard_start_xmit = eepro_send_packet; @@ -726,7 +785,12 @@ ether_setup(dev); - outb(RESET_CMD, ioaddr); /* RESET the 82595 */ + /* Check the station address for the manufacturer's code */ + if (net_debug>3) + printEEPROMInfo(ioaddr, dev); + + /* reset 82595 */ + eepro_reset(ioaddr); return 0; } @@ -752,55 +816,52 @@ int irqlist[] = { 3, 4, 5, 7, 9, 10, 11, 12 }; int *irqp = irqlist, temp_reg, ioaddr = dev->base_addr; - outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */ + eepro_sw2bank1(ioaddr); /* be CAREFUL, BANK 1 now */ /* Enable the interrupt line. */ - temp_reg = inb(ioaddr + REG1); - outb(temp_reg | INT_ENABLE, ioaddr + REG1); + eepro_en_intline(ioaddr); - outb(BANK0_SELECT, ioaddr); /* be CAREFUL, BANK 0 now */ + eepro_sw2bank0(ioaddr); /* be CAREFUL, BANK 0 now */ /* clear all interrupts */ - outb(ALL_MASK, ioaddr + STATUS_REG); + eepro_clear_int(ioaddr); /* Let EXEC event to interrupt */ - outb(ALL_MASK & ~(EXEC_MASK), ioaddr + INT_MASK_REG); + eepro_en_intexec(ioaddr); do { - outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */ - + eepro_sw2bank1(ioaddr); /* be CAREFUL, BANK 1 now */ temp_reg = inb(ioaddr + INT_NO_REG); outb((temp_reg & 0xf8) | irqrmap[*irqp], ioaddr + INT_NO_REG); - outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */ + eepro_sw2bank0(ioaddr); /* Switch back to Bank 0 */ if (request_irq (*irqp, NULL, 0, "bogus", dev) != EBUSY) { /* Twinkle the interrupt, and check if it's seen */ autoirq_setup(0); - outb(DIAGNOSE_CMD, ioaddr); /* RESET the 82595 */ + eepro_diag(ioaddr); /* RESET the 82595 */ if (*irqp == autoirq_report(2)) /* It's a good IRQ line */ break; /* clear all interrupts */ - outb(ALL_MASK, ioaddr + STATUS_REG); + eepro_clear_int(ioaddr); } } while (*++irqp); - outb(BANK1_SELECT, ioaddr); /* Switch back to Bank 1 */ + eepro_sw2bank1(ioaddr); /* Switch back to Bank 1 */ /* Disable the physical interrupt line. */ - temp_reg = inb(ioaddr + REG1); - outb(temp_reg & 0x7f, ioaddr + REG1); + eepro_dis_intline(ioaddr); - outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */ + eepro_sw2bank0(ioaddr); /* Switch back to Bank 0 */ /* Mask all the interrupts. */ - outb(ALL_MASK, ioaddr + INT_MASK_REG); + eepro_dis_int(ioaddr); /* clear all interrupts */ - outb(ALL_MASK, ioaddr + STATUS_REG); + eepro_clear_int(ioaddr); return dev->irq; } @@ -809,13 +870,19 @@ { unsigned short temp_reg, old8, old9; int irqMask; - int i, ioaddr = dev->base_addr, rcv_ram = dev->mem_end; + int i, ioaddr = dev->base_addr; + struct eepro_local *lp = (struct eepro_local *)dev->priv; if (net_debug > 3) printk(KERN_DEBUG "%s: entering eepro_open routine.\n", dev->name); - if ((irqMask=read_eeprom(ioaddr,7))== ee_FX_INT2IRQ) /* INT to IRQ Mask */ + irqMask = read_eeprom(ioaddr,7,dev); + + if (lp->eepro == LAN595FX_10ISA) { + if (net_debug > 3) printk(KERN_DEBUG "p->eepro = 3;\n"); + } + else if (irqMask == ee_FX_INT2IRQ) /* INT to IRQ Mask */ { lp->eepro = 2; /* Yes, an Intel EtherExpress Pro/10+ */ if (net_debug > 3) printk(KERN_DEBUG "p->eepro = 2;\n"); @@ -853,18 +920,19 @@ /* Initialize the 82595. */ - outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ - temp_reg = inb(ioaddr + EEPROM_REG); + eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */ + temp_reg = inb(ioaddr + eeprom_reg); lp->stepping = temp_reg >> 5; /* Get the stepping number of the 595 */ - + /* Get the stepping number of the 595 */ + if (net_debug > 3) printk(KERN_DEBUG "The stepping of the 82595 is %d\n", lp->stepping); if (temp_reg & 0x10) /* Check the TurnOff Enable bit */ - outb(temp_reg & 0xef, ioaddr + EEPROM_REG); - for (i=0; i < 6; i++) - outb(dev->dev_addr[i] , ioaddr + I_ADD_REG0 + i); + outb(temp_reg & 0xef, ioaddr + eeprom_reg); + for (i=0; i < 6; i++) /* Fill the mac address */ + outb(dev->dev_addr[i] , ioaddr + I_ADD_REG0 + i); temp_reg = inb(ioaddr + REG1); /* Setup Transmit Chaining */ outb(temp_reg | XMT_Chain_Int | XMT_Chain_ErrStop /* and discard bad RCV frames */ @@ -877,17 +945,16 @@ outb(temp_reg & 0x3f, ioaddr + REG3); /* clear test mode */ /* Set the receiving mode */ - outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */ + eepro_sw2bank1(ioaddr); /* be CAREFUL, BANK 1 now */ /* Set the interrupt vector */ temp_reg = inb(ioaddr + INT_NO_REG); - if (lp->eepro == 2) + if (lp->eepro == 2 || lp->eepro == LAN595FX_10ISA) outb((temp_reg & 0xf8) | irqrmap2[dev->irq], ioaddr + INT_NO_REG); else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG); - temp_reg = inb(ioaddr + INT_NO_REG); - if (lp->eepro == 2) + if (lp->eepro == 2 || lp->eepro == LAN595FX_10ISA) outb((temp_reg & 0xf0) | irqrmap2[dev->irq] | 0x08,ioaddr+INT_NO_REG); else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG); @@ -898,28 +965,27 @@ /* Initialize the RCV and XMT upper and lower limits */ outb(RCV_LOWER_LIMIT, ioaddr + RCV_LOWER_LIMIT_REG); outb(RCV_UPPER_LIMIT, ioaddr + RCV_UPPER_LIMIT_REG); - outb(XMT_LOWER_LIMIT, ioaddr + XMT_LOWER_LIMIT_REG); - outb(XMT_UPPER_LIMIT, ioaddr + XMT_UPPER_LIMIT_REG); + outb(XMT_LOWER_LIMIT, ioaddr + xmt_lower_limit_reg); + outb(XMT_UPPER_LIMIT, ioaddr + xmt_upper_limit_reg); /* Enable the interrupt line. */ - temp_reg = inb(ioaddr + REG1); - outb(temp_reg | INT_ENABLE, ioaddr + REG1); + eepro_en_intline(ioaddr); - outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */ + eepro_sw2bank0(ioaddr); /* Switch back to Bank 0 */ /* Let RX and TX events to interrupt */ - outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); + eepro_en_int(ioaddr); /* clear all interrupts */ - outb(ALL_MASK, ioaddr + STATUS_REG); + eepro_clear_int(ioaddr); /* Initialize RCV */ - outw(RCV_LOWER_LIMIT << 8, ioaddr + RCV_BAR); - lp->rx_start = (RCV_LOWER_LIMIT << 8) ; - outw((RCV_UPPER_LIMIT << 8) | 0xfe, ioaddr + RCV_STOP); + outw((RCV_LOWER_LIMIT << 8), ioaddr + RCV_BAR); + lp->rx_start = (RCV_LOWER_LIMIT << 8); + outw(((RCV_UPPER_LIMIT << 8) | 0xfe), ioaddr + RCV_STOP); /* Initialize XMT */ - outw(XMT_LOWER_LIMIT << 8, ioaddr + XMT_BAR); + outw((XMT_LOWER_LIMIT << 8), ioaddr + xmt_bar); /* Check for the i82595TX and i82595FX */ old8 = inb(ioaddr + 8); @@ -934,8 +1000,6 @@ lp->version = LAN595TX; outb(old8, ioaddr + 8); old9 = inb(ioaddr + 9); - /*outb(~old9, ioaddr + 9); - if (((temp_reg = inb(ioaddr + 9)) == ( (~old9)&0xff) )) {*/ if (irqMask==ee_FX_INT2IRQ) { enum iftype { AUI=0, BNC=1, TPE=2 }; @@ -949,12 +1013,12 @@ if (dev->if_port != TPE) { /* Hopefully, this will fix the problem of using Pentiums and pro/10 w/ BNC. */ - outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ + eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */ temp_reg = inb(ioaddr + REG13); /* disable the full duplex mode since it is not applicable with the 10Base2 cable. */ outb(temp_reg & ~(FDX | A_N_ENABLE), REG13); - outb(BANK0_SELECT, ioaddr); /* be CAREFUL, BANK 0 now */ + eepro_sw2bank0(ioaddr); /* be CAREFUL, BANK 0 now */ } } else if (net_debug > 3) { @@ -963,13 +1027,9 @@ } } - outb(SEL_RESET_CMD, ioaddr); - - /* We are supposed to wait for 2 us after a SEL_RESET */ - SLOW_DOWN; - SLOW_DOWN; + eepro_sel_reset(ioaddr); - lp->tx_start = lp->tx_end = XMT_LOWER_LIMIT << 8; /* or = RCV_RAM */ + lp->tx_start = lp->tx_end = (XMT_LOWER_LIMIT << 8); lp->tx_last = 0; dev->tbusy = 0; @@ -979,7 +1039,8 @@ if (net_debug > 3) printk(KERN_DEBUG "%s: exiting eepro_open routine.\n", dev->name); - outb(RCV_ENABLE_CMD, ioaddr); + /* enabling rx */ + eepro_en_rx(ioaddr); MOD_INC_USE_COUNT; return 0; @@ -989,22 +1050,24 @@ { struct eepro_local *lp = (struct eepro_local *)dev->priv; int ioaddr = dev->base_addr; - int rcv_ram = dev->mem_end; -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 unsigned long flags; -#endif - + if (net_debug > 5) printk(KERN_DEBUG "%s: entering eepro_send_packet routine.\n", dev->name); - + if (dev->tbusy) { /* If we get here, some higher level has decided we are broken. There should really be a "kick me" function call instead. */ int tickssofar = jiffies - dev->trans_start; + if (tickssofar < 40) return 1; - + + /* let's disable interrupts so we can avoid confusion on SMP + */ + eepro_dis_int(ioaddr); + /* if (net_debug > 1) */ printk(KERN_ERR "%s: transmit timed out, %s?\n", dev->name, "network cable problem"); @@ -1015,53 +1078,41 @@ lp->stats.tx_errors++; /* Try to restart the adaptor. */ - outb(SEL_RESET_CMD, ioaddr); /* We are supposed to wait for 2 us after a SEL_RESET */ - SLOW_DOWN; - SLOW_DOWN; + eepro_sel_reset(ioaddr); /* Do I also need to flush the transmit buffers here? YES? */ - lp->tx_start = lp->tx_end = rcv_ram; + lp->tx_start = lp->tx_end = (XMT_LOWER_LIMIT << 8); lp->tx_last = 0; dev->tbusy=0; dev->trans_start = jiffies; - outb(RCV_ENABLE_CMD, ioaddr); - } - -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x20155 - /* If some higher layer thinks we've missed an tx-done interrupt - we are passed NULL. Caution: dev_tint() handles the cli()/sti() - itself. */ - /* if (skb == NULL) { - dev_tint(dev); - return 0; - }*/ - /* according to A. Cox, this is obsolete since 1.0 */ -#endif + /* re-enabling all interrupts */ + eepro_en_int(ioaddr); -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 + /* enable rx */ + eepro_en_rx(ioaddr); + } spin_lock_irqsave(&lp->lock, flags); -#endif /* Block a timer-based transmit from overlapping. */ if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) { printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name); -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 spin_unlock_irqrestore(&lp->lock, flags); -#endif } else { short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; unsigned char *buf = skb->data; + int discard = lp->stats.tx_dropped; -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 lp->stats.tx_bytes+=skb->len; -#endif - hardware_send_packet(dev, buf, length); + + if (lp->stats.tx_dropped != discard) + return 1; + dev->trans_start = jiffies; } @@ -1074,9 +1125,7 @@ if (net_debug > 5) printk(KERN_DEBUG "%s: exiting eepro_send_packet routine.\n", dev->name); -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 spin_unlock_irqrestore(&lp->lock, flags); -#endif return 0; } @@ -1098,20 +1147,17 @@ return; } -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 spin_lock(&lp->lock); -#endif if (dev->interrupt) { printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name); -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 spin_unlock(&lp->lock); /* FIXME : with the lock, could this ever happen ? */ -#endif return; } + dev->interrupt = 1; if (net_debug > 5) @@ -1119,40 +1165,42 @@ ioaddr = dev->base_addr; - do { - status = inb(ioaddr + STATUS_REG); - + while (((status = inb(ioaddr + STATUS_REG)) & 0x06) && (boguscount--)) + { + switch (status & (RX_INT | TX_INT)) { + case (RX_INT | TX_INT): + eepro_ack_rxtx(ioaddr); + break; + case RX_INT: + eepro_ack_rx(ioaddr); + break; + case TX_INT: + eepro_ack_tx(ioaddr); + break; + } if (status & RX_INT) { if (net_debug > 4) - printk(KERN_DEBUG "%s: packet received interrupt.\n", dev->name); + printk(KERN_DEBUG "%s: packet received interrupt.\n", dev->name); - /* Acknowledge the RX_INT */ - outb(RX_INT, ioaddr + STATUS_REG); /* Get the received packets */ eepro_rx(dev); } - - else if (status & TX_INT) { + if (status & TX_INT) { if (net_debug > 4) - printk(KERN_DEBUG "%s: packet transmit interrupt.\n", dev->name); - - /* Acknowledge the TX_INT */ - outb(TX_INT, ioaddr + STATUS_REG); + printk(KERN_DEBUG "%s: packet transmit interrupt.\n", dev->name); /* Process the status of transmitted packets */ eepro_transmit_interrupt(dev); } + } - } while ((boguscount-- > 0) && (status & 0x06)); - - dev->interrupt = 0; + dev->interrupt = 0; if (net_debug > 5) printk(KERN_DEBUG "%s: exiting eepro_interrupt routine.\n", dev->name); -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 spin_unlock(&lp->lock); -#endif + return; } @@ -1160,33 +1208,32 @@ { struct eepro_local *lp = (struct eepro_local *)dev->priv; int ioaddr = dev->base_addr; - int rcv_ram = dev->mem_end; short temp_reg; dev->tbusy = 1; dev->start = 0; - outb(BANK1_SELECT, ioaddr); /* Switch back to Bank 1 */ + eepro_sw2bank1(ioaddr); /* Switch back to Bank 1 */ /* Disable the physical interrupt line. */ temp_reg = inb(ioaddr + REG1); outb(temp_reg & 0x7f, ioaddr + REG1); - outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */ + eepro_sw2bank0(ioaddr); /* Switch back to Bank 0 */ /* Flush the Tx and disable Rx. */ outb(STOP_RCV_CMD, ioaddr); - lp->tx_start = lp->tx_end = rcv_ram ; + lp->tx_start = lp->tx_end = (XMT_LOWER_LIMIT << 8); lp->tx_last = 0; /* Mask all the interrupts. */ - outb(ALL_MASK, ioaddr + INT_MASK_REG); + eepro_dis_int(ioaddr); /* clear all interrupts */ - outb(ALL_MASK, ioaddr + STATUS_REG); + eepro_clear_int(ioaddr); /* Reset the 82595 */ - outb(RESET_CMD, ioaddr); + eepro_reset(ioaddr); /* release the interrupt */ free_irq(dev->irq, dev); @@ -1197,10 +1244,6 @@ /* Update the statistics here. What statistics? */ - /* We are supposed to wait for 200 us after a RESET */ - SLOW_DOWN; - SLOW_DOWN; /* May not be enough? */ - MOD_DEC_USE_COUNT; return 0; } @@ -1235,23 +1278,23 @@ */ dev->flags|=IFF_PROMISC; - outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ + eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */ mode = inb(ioaddr + REG2); outb(mode | PRMSC_Mode, ioaddr + REG2); mode = inb(ioaddr + REG3); outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */ - outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */ + eepro_sw2bank0(ioaddr); /* Return to BANK 0 now */ printk("%s: promiscuous mode enabled.\n", dev->name); } else if (dev->mc_count==0 ) { - outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ + eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */ mode = inb(ioaddr + REG2); outb(mode & 0xd6, ioaddr + REG2); /* Turn off Multi-IA and PRMSC_Mode bits */ mode = inb(ioaddr + REG3); outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */ - outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */ + eepro_sw2bank0(ioaddr); /* Return to BANK 0 now */ } else @@ -1262,14 +1305,14 @@ /* Disable RX and TX interrupts. Necessary to avoid corruption of the HOST_ADDRESS_REG by interrupt service routines. */ - outb(ALL_MASK, ioaddr + INT_MASK_REG); + eepro_dis_int(ioaddr); - outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */ + eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */ mode = inb(ioaddr + REG2); outb(mode | Multi_IA, ioaddr + REG2); mode = inb(ioaddr + REG3); outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */ - outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */ + eepro_sw2bank0(ioaddr); /* Return to BANK 0 now */ outw(lp->tx_end, ioaddr + HOST_ADDRESS_REG); outw(MC_SETUP, ioaddr + IO_PORT); outw(0, ioaddr + IO_PORT); @@ -1289,7 +1332,7 @@ outw(eaddrs[0], ioaddr + IO_PORT); outw(eaddrs[1], ioaddr + IO_PORT); outw(eaddrs[2], ioaddr + IO_PORT); - outw(lp->tx_end, ioaddr + XMT_BAR); + outw(lp->tx_end, ioaddr + xmt_bar); outb(MC_SETUP, ioaddr); /* Update the transmit queue */ @@ -1333,10 +1376,11 @@ } while (++boguscount < 100); /* Re-enable RX and TX interrupts */ - outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); + eepro_en_int(ioaddr); } - outb(RCV_ENABLE_CMD, ioaddr); + /* enabling rx */ + eepro_en_rx(ioaddr); } /* The horrible routine to read a word from the serial EEPROM. */ @@ -1347,15 +1391,25 @@ #define EE_READ_CMD (6 << 6) int -read_eeprom(int ioaddr, int location) +read_eeprom(int ioaddr, int location, struct device *dev) { int i; unsigned short retval = 0; - short ee_addr = ioaddr + EEPROM_REG; + short ee_addr = ioaddr + eeprom_reg; + struct eepro_local *lp = (struct eepro_local *)dev->priv; int read_cmd = location | EE_READ_CMD; short ctrl_val = EECS ; - outb(BANK2_SELECT, ioaddr); + /* XXXX - this is not the final version. We must test this on other + * boards other than eepro10. I think that it won't let other + * boards to fail. (aris) + */ + if (lp->eepro == LAN595FX_10ISA) { + eepro_sw2bank1(ioaddr); + outb(0x00, ioaddr + STATUS_REG); + } + + eepro_sw2bank2(ioaddr); outb(ctrl_val, ee_addr); /* Shift the read command bits out. */ @@ -1382,7 +1436,7 @@ eeprom_delay(); outb(ctrl_val, ee_addr); eeprom_delay(); - outb(BANK0_SELECT, ioaddr); + eepro_sw2bank0(ioaddr); return retval; } @@ -1391,22 +1445,22 @@ { struct eepro_local *lp = (struct eepro_local *)dev->priv; short ioaddr = dev->base_addr; - int rcv_ram = dev->mem_end; + unsigned status, tx_available, last, end, boguscount = 100; if (net_debug > 5) printk(KERN_DEBUG "%s: entering hardware_send_packet routine.\n", dev->name); - while (boguscount-- > 0) { + while (boguscount-- > 0) { /* Disable RX and TX interrupts. Necessary to avoid corruption of the HOST_ADDRESS_REG by interrupt service routines. */ - outb(ALL_MASK, ioaddr + INT_MASK_REG); + eepro_dis_int(ioaddr); if (dev->interrupt == 1) { /* Enable RX and TX interrupts */ - outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); + eepro_en_int(ioaddr); continue; } @@ -1423,28 +1477,26 @@ eepro_transmit_interrupt(dev); /* Clean up the transmiting queue */ /* Enable RX and TX interrupts */ - outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); + eepro_en_int(ioaddr); continue; } last = lp->tx_end; end = last + (((length + 3) >> 1) << 1) + XMT_HEADER; - if (end >= RAM_SIZE) { /* the transmit buffer is wrapped around */ - - if ((RAM_SIZE - last) <= XMT_HEADER) { + if (end >= (XMT_UPPER_LIMIT << 8)) { /* the transmit buffer is wrapped around */ + if (((XMT_UPPER_LIMIT << 8) - last) <= XMT_HEADER) { /* Arrrr!!!, must keep the xmt header together, several days were lost to chase this one down. */ - last = rcv_ram; + last = (XMT_LOWER_LIMIT << 8); end = last + (((length + 3) >> 1) << 1) + XMT_HEADER; } - - else end = rcv_ram + (end - RAM_SIZE); + else end = (XMT_LOWER_LIMIT << 8) + (end - XMT_RAM); } outw(last, ioaddr + HOST_ADDRESS_REG); - outw(XMT_CMD, ioaddr + IO_PORT); + outw(XMT_CMD, ioaddr + IO_PORT); outw(0, ioaddr + IO_PORT); outw(end, ioaddr + IO_PORT); outw(length, ioaddr + IO_PORT); @@ -1461,15 +1513,14 @@ /* A dummy read to flush the DRAM write pipeline */ status = inw(ioaddr + IO_PORT); - if (lp->tx_start == lp->tx_end) { - outw(last, ioaddr + XMT_BAR); - outb(XMT_CMD, ioaddr); + if (lp->tx_start == lp->tx_end) { + outw(last, ioaddr + xmt_bar); + outb(XMT_CMD, ioaddr); lp->tx_start = last; /* I don't like to change tx_start here */ } else { /* update the next address and the chain bit in the last packet */ - if (lp->tx_end != last) { outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG); outw(last, ioaddr + IO_PORT); @@ -1478,7 +1529,6 @@ outw(lp->tx_last + XMT_COUNT, ioaddr + HOST_ADDRESS_REG); status = inw(ioaddr + IO_PORT); outw(status | CHAIN_BIT, ioaddr + IO_PORT); - /* Continue the transmit command */ outb(RESUME_XMT_CMD, ioaddr); } @@ -1490,15 +1540,23 @@ dev->tbusy = 0; } + /* now we are serializing tx. tbusy won't come back until + * the tx interrupt + */ + if (lp->eepro == LAN595FX_10ISA) + dev->tbusy = 1; + /* Enable RX and TX interrupts */ - outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); + eepro_en_int(ioaddr); if (net_debug > 5) printk(KERN_DEBUG "%s: exiting hardware_send_packet routine.\n", dev->name); return; } + eepro_en_int(ioaddr); dev->tbusy = 1; + if (net_debug > 5) printk(KERN_DEBUG "%s: exiting hardware_send_packet routine.\n", dev->name); } @@ -1507,13 +1565,17 @@ eepro_rx(struct device *dev) { struct eepro_local *lp = (struct eepro_local *)dev->priv; - short ioaddr = dev->base_addr, rcv_ram = dev->mem_end; + short ioaddr = dev->base_addr; + short boguscount = 20; - short rcv_car = lp->rx_start; + unsigned rcv_car = lp->rx_start; unsigned rcv_event, rcv_status, rcv_next_frame, rcv_size; if (net_debug > 5) printk(KERN_DEBUG "%s: entering eepro_rx routine.\n", dev->name); + + /* clear all interrupts */ + eepro_clear_int(ioaddr); /* Set the read pointer to the start of the RCV */ outw(rcv_car, ioaddr + HOST_ADDRESS_REG); @@ -1531,9 +1593,7 @@ /* Malloc up new buffer. */ struct sk_buff *skb; -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 lp->stats.rx_bytes+=rcv_size; -#endif rcv_size &= 0x3fff; skb = dev_alloc_skb(rcv_size+5); if (skb == NULL) { @@ -1589,12 +1649,15 @@ } if (rcv_car == 0) - rcv_car = (RCV_UPPER_LIMIT << 8) | 0xff; + rcv_car = ((RCV_UPPER_LIMIT << 8) | 0xff); outw(rcv_car - 1, ioaddr + RCV_STOP); if (net_debug > 5) printk(KERN_DEBUG "%s: exiting eepro_rx routine.\n", dev->name); + + /* enable tx/rx interrupts */ + eepro_en_int(ioaddr); } static void @@ -1603,8 +1666,8 @@ struct eepro_local *lp = (struct eepro_local *)dev->priv; short ioaddr = dev->base_addr; short boguscount = 20; - short xmt_status; - + unsigned xmt_status; + /* if (dev->tbusy == 0) { printk("%s: transmit_interrupt called with tbusy = 0 ??\n", @@ -1613,30 +1676,73 @@ dev->name); } */ + while (lp->tx_start != lp->tx_end && boguscount) { - while (lp->tx_start != lp->tx_end) { - - outw(lp->tx_start, ioaddr + HOST_ADDRESS_REG); + outw(lp->tx_start, ioaddr + HOST_ADDRESS_REG); xmt_status = inw(ioaddr+IO_PORT); - - if ((xmt_status & TX_DONE_BIT) == 0) break; + + if ((xmt_status & TX_DONE_BIT) == 0) { + udelay(40); + boguscount--; + continue; + } + xmt_status = inw(ioaddr+IO_PORT); lp->tx_start = inw(ioaddr+IO_PORT); + if (lp->eepro == LAN595FX_10ISA) { + lp->tx_start = (XMT_LOWER_LIMIT << 8); + lp->tx_end = lp->tx_start; + + /* yeah, black magic :( */ + eepro_sw2bank0(ioaddr); + eepro_en_int(ioaddr); + + /* disabling rx */ + eepro_dis_rx(ioaddr); + + /* enabling rx */ + eepro_en_rx(ioaddr); + } + + /* here the tbusy comes to 0 for normal and ee10 cards + */ dev->tbusy = 0; + mark_bh(NET_BH); - - if (xmt_status & 0x2000) + + if (xmt_status & 0x2000) { lp->stats.tx_packets++; + } else { lp->stats.tx_errors++; - if (xmt_status & 0x0400) + if (xmt_status & 0x0400) { lp->stats.tx_carrier_errors++; - printk("%s: XMT status = %#x\n", - dev->name, xmt_status); - printk(KERN_DEBUG "%s: XMT status = %#x\n", - dev->name, xmt_status); + printk(KERN_DEBUG "%s: carrier error\n", + dev->name); + printk(KERN_DEBUG "%s: XMT status = %#x\n", + dev->name, xmt_status); + } + else { + printk(KERN_DEBUG "%s: XMT status = %#x\n", + dev->name, xmt_status); + printk(KERN_DEBUG "%s: XMT status = %#x\n", + dev->name, xmt_status); + } + + if (lp->eepro == LAN595FX_10ISA) { + /* Try to restart the adaptor. */ + /* We are supposed to wait for 2 us after a SEL_RESET */ + eepro_sel_reset(ioaddr); + + /* first enable interrupts */ + eepro_sw2bank0(ioaddr); + outb(ALL_MASK & ~(RX_INT | TX_INT), ioaddr + STATUS_REG); + + /* enabling rx */ + eepro_en_rx(ioaddr); + } } if (xmt_status & 0x000f) { @@ -1646,9 +1752,7 @@ if ((xmt_status & 0x0040) == 0x0) { lp->stats.tx_heartbeat_errors++; } - - if (--boguscount == 0) - break; + boguscount--; } } @@ -1658,39 +1762,42 @@ static char devicename[MAX_EEPRO][9]; static struct device dev_eepro[MAX_EEPRO]; -static int io[MAX_EEPRO] = { -#ifdef PnPWakeup - 0x210, /*: default for PnP enabled FX chips */ -#else - 0x200, /* Why? */ -#endif - [1 ... MAX_EEPRO - 1] = -1 }; +static int io[MAX_EEPRO]; static int irq[MAX_EEPRO] = { [0 ... MAX_EEPRO-1] = 0 }; static int mem[MAX_EEPRO] = { /* Size of the rx buffer in KB */ - [0 ... MAX_EEPRO-1] = RCV_RAM/1024 + [0 ... MAX_EEPRO-1] = RCV_DEFAULT_RAM/1024 }; +static int autodetect; static int n_eepro = 0; -/* For linux 2.1.xx */ -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155 MODULE_AUTHOR("Pascal Dupuis for the 2.1 stuff (locking,...)"); MODULE_DESCRIPTION("Intel i82595 ISA EtherExpressPro10/10+ driver"); MODULE_PARM(io, "1-" __MODULE_STRING(MAX_EEPRO) "i"); MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_EEPRO) "i"); MODULE_PARM(mem, "1-" __MODULE_STRING(MAX_EEPRO) "i"); -#endif +MODULE_PARM(autodetect, "1-" __MODULE_STRING(1) "i"); int init_module(void) { - if (io[0] == 0) - printk("eepro_init_module: You should not use auto-probing with insmod!\n"); - - while (n_eepro < MAX_EEPRO && io[n_eepro] >= 0) { + int i; + if (io[0] == 0 && autodetect == 0) { + printk("eepro_init_module: Probe is very dangerous in ISA boards!\n"); + printk("eepro_init_module: Please add \"autodetect=1\" to force probe\n"); + return 1; + } + else if (autodetect) { + /* if autodetect is set then we must force detection */ + io[0] = 0; + + printk("eepro_init_module: Auto-detecting boards (May God protect us...)\n"); + } + + for (i = 0; i < MAX_EEPRO; i++) { struct device *d = &dev_eepro[n_eepro]; d->name = devicename[n_eepro]; /* inserted by drivers/net/net_init.c */ - d->mem_end = mem[n_eepro]; - d->base_addr = io[n_eepro]; + d->mem_end = mem[n_eepro]; + d->base_addr = io[0]; d->irq = irq[n_eepro]; d->init = eepro_probe; diff -urN v2.2.15/linux/drivers/net/eepro100.c linux/drivers/net/eepro100.c --- v2.2.15/linux/drivers/net/eepro100.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/eepro100.c Wed Jun 7 14:26:43 2000 @@ -24,11 +24,22 @@ The driver also contains updates by different kernel developers. This driver clone is maintained by Andrey V. Savochkin . Please use this email address and linux-kernel mailing list for bug reports. + + Modification history: + 2000 Mar 24 Dragan Stancevic + Disabled FC and ER, to avoid lockups when when we get FCP interrupts. + 2000 May 27 Andrey Moruga + Code duplication for 82559ER support was removed. + Accurate handling of all supported chips was implemented. + Some fixes in 2.3 clone of the driver were ported. + 2000 May 30 Dragan Stancevic and + Andrey Moruga + Honor PortReset timing specification. */ static const char *version = "eepro100.c:v1.09j-t 9/29/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.html\n" -"eepro100.c: $Revision: 1.20.2.3 $ 2000/03/02 Modified by Andrey V. Savochkin and others\n"; +"eepro100.c: $Revision: 1.20.2.10 $ 2000/05/31 Modified by Andrey V. Savochkin and others\n"; /* A few user-configurable values that apply to all boards. First set is undocumented and spelled per Intel recommendations. */ @@ -42,7 +53,7 @@ /* Set the copy breakpoint for the copy-only-tiny-buffer Rx method. Lower values use more memory, but are faster. */ -#if defined(__alpha__) || defined(__sparc__) +#ifdef __alpha__ /* force copying of all packets to avoid unaligned accesses on Alpha */ static int rx_copybreak = 1518; #else @@ -103,17 +114,8 @@ #include #include #include -#ifdef HAS_PCI_NETIF -#include "pci-netif.h" -#else -#include -#endif #include -#if LINUX_VERSION_CODE >= 0x20312 -#include -#else #include -#endif #include #include @@ -124,7 +126,7 @@ #include #if defined(MODULE) -MODULE_AUTHOR("Donald Becker "); +MODULE_AUTHOR("Maintainer: Andrey V. Savochkin "); MODULE_DESCRIPTION("Intel i82557/i82558 PCI EtherExpressPro driver"); MODULE_PARM(debug, "i"); MODULE_PARM(options, "1-" __MODULE_STRING(8) "i"); @@ -144,21 +146,24 @@ #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr)) #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr)) -#if LINUX_VERSION_CODE < 0x020314 #define net_device device #define pci_base_address(p, n) (p)->base_address[n] -#else -#define pci_base_address(p, n) (p)->resource[n].start -#endif #define dev_free_skb(skb) dev_kfree_skb(skb); -#if ! defined(HAS_NETIF_QUEUE) #define netif_wake_queue(dev) do { \ clear_bit(0, (void*)&dev->tbusy); \ mark_bh(NET_BH); \ } while(0) #define netif_start_queue(dev) clear_bit(0, (void*)&dev->tbusy) #define netif_stop_queue(dev) set_bit(0, (void*)&dev->tbusy) +#ifndef PCI_DEVICE_ID_INTEL_82559ER +#define PCI_DEVICE_ID_INTEL_82559ER 0x1209 +#endif +#ifndef PCI_DEVICE_ID_INTEL_ID1029 +#define PCI_DEVICE_ID_INTEL_ID1029 0x1029 +#endif +#ifndef PCI_DEVICE_ID_INTEL_ID1030 +#define PCI_DEVICE_ID_INTEL_ID1030 0x1030 #endif /* The total I/O port extent of the board. @@ -282,7 +287,9 @@ */ /* This table drives the PCI probe routines. */ -static struct net_device *speedo_found1(int pci_bus, int pci_devfn, long ioaddr, int irq, int chip_idx, int fnd_cnt); +static struct net_device *speedo_found1(struct pci_dev *pdev, int pci_bus, + int pci_devfn, long ioaddr, + int chip_idx, int card_idx); #ifdef USE_IO #define SPEEDO_IOTYPE PCI_USES_MASTER|PCI_USES_IO|PCI_ADDR1 @@ -292,29 +299,42 @@ #define SPEEDO_SIZE 0x1000 #endif -#if defined(HAS_PCI_NETIF) -struct pci_id_info static pci_tbl[] = { - { "Intel PCI EtherExpress Pro100", - { 0x12298086, 0xffffffff,}, SPEEDO_IOTYPE, SPEEDO_SIZE, - 0, speedo_found1 }, - {0,}, /* 0 terminated list. */ -}; -#else enum pci_flags_bit { PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3, }; struct pci_id_info { const char *name; - u16 vendor_id, device_id, device_id_mask, flags; - int io_size; - struct net_device *(*probe1)(int pci_bus, int pci_devfn, long ioaddr, int irq, int chip_idx, int fnd_cnt); + u16 vendor_id, device_id; + int pci_index; } static pci_tbl[] = { - { "Intel PCI EtherExpress Pro100", - 0x8086, 0x1229, 0xffff, PCI_USES_IO|PCI_USES_MASTER, 32, speedo_found1 }, - {0,}, /* 0 terminated list. */ + { "Intel PCI EtherExpress Pro100 82557", + PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82557, + 0 + }, + { "Intel PCI EtherExpress Pro100 82559ER", + PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82559ER, + 0 + }, + { "Intel PCI EtherExpress Pro100 ID1029", + PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ID1029, + 0 + }, + { "Intel Corporation 82559 InBusiness 10/100", + PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ID1030, + 0 + }, + {0,} /* 0 terminated list. */ }; -#endif + +static inline unsigned int io_inw(unsigned long port) +{ + return inw(port); +} +static inline void io_outw(unsigned int val, unsigned long port) +{ + outw(val, port); +} #ifndef USE_IO #undef inb @@ -338,6 +358,10 @@ int wait = 1000; do ; while(inb(cmd_ioaddr) && --wait >= 0); +#ifndef final_version + if (wait < 0) + printk(KERN_ALERT "eepro100: wait_for_cmd_done timeout!\n"); +#endif } /* Offsets to the various registers. @@ -426,8 +450,7 @@ struct speedo_mc_block { struct speedo_mc_block *next; unsigned int tx; - char fill[16 - sizeof(struct speedo_mc_block *) - sizeof(unsigned int)]; - struct descriptor frame; + struct descriptor frame __attribute__ ((__aligned__(16))); }; /* Elements of the dump_statistics block. This block must be lword aligned. */ @@ -480,7 +503,7 @@ struct timer_list timer; /* Media selection timer. */ struct speedo_mc_block *mc_setup_head;/* Multicast setup frame list head. */ struct speedo_mc_block *mc_setup_tail;/* Multicast setup frame list tail. */ - long in_interrupt; /* Word-aligned dev->interrupt */ + int in_interrupt; /* Word-aligned dev->interrupt */ char rx_mode; /* Current PROMISC/ALLMULTI setting. */ unsigned int tx_full:1; /* The Tx queue is full. */ unsigned int full_duplex:1; /* Full-duplex operation requested. */ @@ -506,7 +529,7 @@ const char i82558_config_cmd[22] = { 22, 0x08, 0, 1, 0, 0, 0x22, 0x03, 1, /* 1=Use MII 0=Use AUI */ 0, 0x2E, 0, 0x60, 0x08, 0x88, - 0x68, 0, 0x40, 0xf2, 0xBD, /* 0xBD->0xFD=Force full-duplex */ + 0x68, 0, 0x40, 0xf2, 0x84, /* Disable FC */ 0x31, 0x05, }; /* PHY media interface chips. */ @@ -551,138 +574,84 @@ /* A list of all installed Speedo devices, for removing the driver module. */ static struct net_device *root_speedo_dev = NULL; -#if ! defined(HAS_PCI_NETIF) int eepro100_init(void) { int cards_found = 0; - static int pci_index = 0; + int chip_idx; + struct pci_dev *pdev; if (! pcibios_present()) return cards_found; - for (; pci_index < 8; pci_index++) { - unsigned char pci_bus, pci_device_fn, pci_latency; - unsigned long pciaddr; - long ioaddr; - int irq; - - u16 pci_command, new_command; - - if (pcibios_find_device(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_82557, - pci_index, &pci_bus, - &pci_device_fn)) - break; - { - struct pci_dev *pdev = pci_find_slot(pci_bus, pci_device_fn); + for (chip_idx = 0; pci_tbl[chip_idx].name; chip_idx++) { + for (; pci_tbl[chip_idx].pci_index < 8; pci_tbl[chip_idx].pci_index++) { + unsigned char pci_bus, pci_device_fn, pci_latency; + unsigned long pciaddr; + long ioaddr; + int irq; + + u16 pci_command, new_command; + + if (pcibios_find_device(pci_tbl[chip_idx].vendor_id, + pci_tbl[chip_idx].device_id, + pci_tbl[chip_idx].pci_index, &pci_bus, + &pci_device_fn)) + break; + { + pdev = pci_find_slot(pci_bus, pci_device_fn); #ifdef USE_IO - pciaddr = pci_base_address(pdev, 1); /* Use [0] to mem-map */ + pciaddr = pci_base_address(pdev, 1); /* Use [0] to mem-map */ #else - pciaddr = pci_base_address(pdev, 0); + pciaddr = pci_base_address(pdev, 0); #endif - irq = pdev->irq; - } - /* Remove I/O space marker in bit 0. */ - if (pciaddr & 1) { - ioaddr = pciaddr & ~3UL; - if (check_region(ioaddr, 32)) + irq = pdev->irq; + } + /* Remove I/O space marker in bit 0. */ + if (pciaddr & 1) { + ioaddr = pciaddr & ~3UL; + if (check_region(ioaddr, 32)) + continue; + } else if ((ioaddr = (long)ioremap(pciaddr & ~0xfUL, 0x1000)) == 0) { + printk(KERN_INFO "Failed to map PCI address %#lx.\n", + pciaddr); continue; - } else -#ifdef __sparc__ - { - /* ioremap is hosed in 2.2.x on Sparc. */ - ioaddr = pciaddr & ~0xfUL; - } -#else - if ((ioaddr = (long)ioremap(pciaddr & ~0xfUL, 0x1000)) == 0) { - printk(KERN_INFO "Failed to map PCI address %#lx.\n", - pciaddr); - continue; - } -#endif - if (speedo_debug > 2) - printk("Found Intel i82557 PCI Speedo at I/O %#lx, IRQ %d.\n", - ioaddr, irq); + } + if (speedo_debug > 2) + printk("Found Intel i82557 PCI Speedo at I/O %#lx, IRQ %d.\n", + ioaddr, irq); + + /* Get and check the bus-master and latency values. */ + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, &pci_command); + new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO; + if (pci_command != new_command) { + printk(KERN_INFO " The PCI BIOS has not enabled this" + " device! Updating PCI command %4.4x->%4.4x.\n", + pci_command, new_command); + pcibios_write_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, new_command); + } + pcibios_read_config_byte(pci_bus, pci_device_fn, + PCI_LATENCY_TIMER, &pci_latency); + if (pci_latency < 32) { + printk(" PCI latency timer (CFLT) is unreasonably low at %d." + " Setting to 32 clocks.\n", pci_latency); + pcibios_write_config_byte(pci_bus, pci_device_fn, + PCI_LATENCY_TIMER, 32); + } else if (speedo_debug > 1) + printk(" PCI latency timer (CFLT) is %#x.\n", pci_latency); - /* Get and check the bus-master and latency values. */ - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, &pci_command); - new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO; - if (pci_command != new_command) { - printk(KERN_INFO " The PCI BIOS has not enabled this" - " device! Updating PCI command %4.4x->%4.4x.\n", - pci_command, new_command); - pcibios_write_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, new_command); - } - pcibios_read_config_byte(pci_bus, pci_device_fn, - PCI_LATENCY_TIMER, &pci_latency); - if (pci_latency < 32) { - printk(" PCI latency timer (CFLT) is unreasonably low at %d." - " Setting to 32 clocks.\n", pci_latency); - pcibios_write_config_byte(pci_bus, pci_device_fn, - PCI_LATENCY_TIMER, 32); - } else if (speedo_debug > 1) - printk(" PCI latency timer (CFLT) is %#x.\n", pci_latency); - - if (speedo_found1(pci_bus, pci_device_fn, ioaddr, irq, 0, cards_found)) - cards_found++; - } - - for (; pci_index < 8; pci_index++) { - unsigned char pci_bus, pci_device_fn, pci_latency; - long ioaddr; - int irq; - - u16 pci_command, new_command; - - if (pcibios_find_device(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_82559ER, - pci_index, &pci_bus, - &pci_device_fn)) - break; - { - struct pci_dev *pdev = pci_find_slot(pci_bus, pci_device_fn); - ioaddr = pdev->base_address[1]; /* Use [0] to mem-map */ - irq = pdev->irq; + if (speedo_found1(pdev, pci_bus, pci_device_fn, ioaddr, chip_idx, cards_found)) + cards_found++; } - /* Remove I/O space marker in bit 0. */ - ioaddr &= ~3; - if (speedo_debug > 2) - printk("Found Intel i82559ER PCI Speedo at I/O %#lx, IRQ %d.\n", - ioaddr, irq); - - /* Get and check the bus-master and latency values. */ - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, &pci_command); - new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO; - if (pci_command != new_command) { - printk(KERN_INFO " The PCI BIOS has not enabled this" - " device! Updating PCI command %4.4x->%4.4x.\n", - pci_command, new_command); - pcibios_write_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, new_command); - } - pcibios_read_config_byte(pci_bus, pci_device_fn, - PCI_LATENCY_TIMER, &pci_latency); - if (pci_latency < 32) { - printk(" PCI latency timer (CFLT) is unreasonably low at %d." - " Setting to 32 clocks.\n", pci_latency); - pcibios_write_config_byte(pci_bus, pci_device_fn, - PCI_LATENCY_TIMER, 32); - } else if (speedo_debug > 1) - printk(" PCI latency timer (CFLT) is %#x.\n", pci_latency); - - if(speedo_found1(pci_bus, pci_device_fn, ioaddr, irq, 0, cards_found)) - cards_found++; } return cards_found; } -#endif -static struct net_device *speedo_found1(int pci_bus, int pci_devfn, - long ioaddr, int irq, int chip_idx, int card_idx) +static struct net_device *speedo_found1(struct pci_dev *pdev, int pci_bus, + int pci_devfn, long ioaddr, + int chip_idx, int card_idx) { struct net_device *dev; struct speedo_private *sp; @@ -705,21 +674,21 @@ else option = 0; -#if defined(HAS_PCI_NETIF) - acpi_idle_state = acpi_set_pwr_state(pci_bus, pci_devfn, ACPI_D0); -#endif - /* Read the station address EEPROM before doing the reset. Nominally his should even be done before accepting the device, but then we wouldn't have a device name with which to report the error. The size test is for 6 bit vs. 8 bit address serial EEPROMs. */ { - u16 sum = 0; - int j; + unsigned long iobase; int read_cmd, ee_size; + u16 sum; + int j; - if ((do_eeprom_cmd(ioaddr, EE_READ_CMD << 24, 27) & 0xffe0000) + /* Use IO only to avoid postponed writes and satisfy EEPROM timing + requirements. */ + iobase = pci_base_address(pdev, 1) & ~3UL; + if ((do_eeprom_cmd(iobase, EE_READ_CMD << 24, 27) & 0xffe0000) == 0xffe0000) { ee_size = 0x100; read_cmd = EE_READ_CMD << 24; @@ -728,8 +697,8 @@ read_cmd = EE_READ_CMD << 22; } - for (j = 0, i = 0; i < ee_size; i++) { - u16 value = do_eeprom_cmd(ioaddr, read_cmd | (i << 16), 27); + for (j = 0, i = 0, sum = 0; i < ee_size; i++) { + u16 value = do_eeprom_cmd(iobase, read_cmd | (i << 16), 27); eeprom[i] = value; sum += value; if (i < 3) { @@ -742,24 +711,31 @@ "check settings before activating this device!\n", dev->name, sum); /* Don't unregister_netdev(dev); as the EEPro may actually be - usable, especially if the MAC address is set later. */ + usable, especially if the MAC address is set later. + On the other hand, it may be unusable if MDI data is corrupted. */ } /* Reset the chip: stop Tx and Rx processes and clear counters. This takes less than 10usec and will easily finish before the next action. */ outl(PortReset, ioaddr + SCBPort); + /* Honor PortReset timing. */ + udelay(10); if (eeprom[3] & 0x0100) product = "OEM i82557/i82558 10/100 Ethernet"; else product = pci_tbl[chip_idx].name; - printk(KERN_INFO "%s: %s at %#3lx, ", dev->name, product, ioaddr); + printk(KERN_INFO "%s: %s, ", dev->name, product); for (i = 0; i < 5; i++) printk("%2.2X:", dev->dev_addr[i]); - printk("%2.2X, IRQ %d.\n", dev->dev_addr[i], irq); + printk("%2.2X, ", dev->dev_addr[i]); +#ifdef USE_IO + printk("I/O at %#3lx, ", ioaddr); +#endif + printk("IRQ %d.\n", pdev->irq); #if 1 || defined(kernel_bloat) /* OK, this is pure kernel bloat. I don't like it when other drivers @@ -831,16 +807,14 @@ #endif /* kernel_bloat */ outl(PortReset, ioaddr + SCBPort); -#if defined(HAS_PCI_NETIF) - /* Return the chip to its original power state. */ - acpi_set_pwr_state(pci_bus, pci_devfn, acpi_idle_state); -#endif + /* Honor PortReset timing. */ + udelay(10); /* We do a request_region() only to register /proc/ioports info. */ request_region(ioaddr, SPEEDO3_TOTAL_SIZE, "Intel Speedo3 Ethernet"); dev->base_addr = ioaddr; - dev->irq = irq; + dev->irq = pdev->irq; sp = dev->priv; if (dev->priv == NULL) { @@ -898,30 +872,32 @@ #define EE_WRITE_1 0x4806 #define EE_OFFSET SCBeeprom -/* Delay between EEPROM clock transitions. - The code works with no delay on 33Mhz PCI. */ -#define eeprom_delay() inw(ee_addr) - +/* The fixes for the code were kindly provided by Dragan Stancevic + to strictly follow Intel specifications of EEPROM + access timing. + The publicly available sheet 64486302 (sec. 3.1) specifies 1us access + interval for serial EEPROM. However, it looks like that there is an + additional requirement dictating larger udelay's in the code below. + 2000/05/24 SAW */ static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len) { unsigned retval = 0; long ee_addr = ioaddr + SCBeeprom; - outw(EE_ENB | EE_SHIFT_CLK, ee_addr); + io_outw(EE_ENB, ee_addr); udelay(2); + io_outw(EE_ENB | EE_SHIFT_CLK, ee_addr); udelay(2); /* Shift the command bits out. */ do { short dataval = (cmd & (1 << cmd_len)) ? EE_WRITE_1 : EE_WRITE_0; - outw(dataval, ee_addr); - eeprom_delay(); - outw(dataval | EE_SHIFT_CLK, ee_addr); - eeprom_delay(); - retval = (retval << 1) | ((inw(ee_addr) & EE_DATA_READ) ? 1 : 0); + io_outw(dataval, ee_addr); udelay(2); + io_outw(dataval | EE_SHIFT_CLK, ee_addr); udelay(2); + retval = (retval << 1) | ((io_inw(ee_addr) & EE_DATA_READ) ? 1 : 0); } while (--cmd_len >= 0); - outw(EE_ENB, ee_addr); + io_outw(EE_ENB, ee_addr); udelay(2); /* Terminate the EEPROM access. */ - outw(EE_ENB & ~EE_CS, ee_addr); + io_outw(EE_ENB & ~EE_CS, ee_addr); return retval; } @@ -961,13 +937,11 @@ struct speedo_private *sp = (struct speedo_private *)dev->priv; long ioaddr = dev->base_addr; -#if defined(HAS_PCI_NETIF) - acpi_set_pwr_state(sp->pci_bus, sp->pci_devfn, ACPI_D0); -#endif - if (speedo_debug > 1) printk(KERN_DEBUG "%s: speedo_open() irq %d.\n", dev->name, dev->irq); + MOD_INC_USE_COUNT; + /* Set up the Tx queue early.. */ sp->cur_tx = 0; sp->dirty_tx = 0; @@ -978,9 +952,9 @@ /* .. we can safely take handler calls during init. */ if (request_irq(dev->irq, &speedo_interrupt, SA_SHIRQ, dev->name, dev)) { + MOD_DEC_USE_COUNT; return -EAGAIN; } - MOD_INC_USE_COUNT; dev->if_port = sp->default_port; @@ -1098,7 +1072,9 @@ wait_for_cmd_done(ioaddr + SCBCmd); outl(virt_to_bus(&sp->tx_ring[sp->dirty_tx % TX_RING_SIZE]), ioaddr + SCBPointer); - outw(CUStart, ioaddr + SCBCmd); + /* We are not ACK-ing FCP and ER in the interrupt handler yet so they should + remain masked --Dragan */ + outw(CUStart | SCBMaskEarlyRx | SCBMaskFlowCtl, ioaddr + SCBCmd); } /* Media monitoring and control. */ @@ -1114,8 +1090,11 @@ int partner = mdio_read(ioaddr, phy_num, 5); if (partner != sp->partner) { int flow_ctrl = sp->advertising & partner & 0x0400 ? 1 : 0; - if (speedo_debug > 2) + if (speedo_debug > 2) { printk(KERN_DEBUG "%s: Link status change.\n", dev->name); + printk(KERN_DEBUG "%s: Old partner %x, new %x, adv %x.\n", + dev->name, sp->partner, partner, sp->advertising); + } sp->partner = partner; if (flow_ctrl != sp->flow_ctrl) { sp->flow_ctrl = flow_ctrl; @@ -1179,12 +1158,14 @@ i, (sp->rx_ringp[i] != NULL) ? (unsigned)sp->rx_ringp[i]->status : 0); +#if 0 for (i = 0; i < 16; i++) { /* FIXME: what does it mean? --SAW */ if (i == 6) i = 21; printk(KERN_DEBUG "%s: PHY index %d register %d is %4.4x.\n", dev->name, phy_num, i, mdio_read(ioaddr, phy_num, i)); } +#endif } @@ -1213,12 +1194,8 @@ last_rxf = rxf; rxf->status = cpu_to_le32(0x00000001); /* '1' is flag value only. */ rxf->link = 0; /* None yet. */ - /* This field unused by i82557, we use it as a consistency check. */ -#ifdef final_version + /* This field unused by i82557. */ rxf->rx_buf_addr = 0xffffffff; -#else - rxf->rx_buf_addr = virt_to_bus(skb->tail); -#endif rxf->count = cpu_to_le32(PKT_BUF_SZ << 16); } sp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); @@ -1254,6 +1231,29 @@ netif_wake_queue(dev); } +static void reset_mii(struct net_device *dev) +{ + struct speedo_private *sp = (struct speedo_private *)dev->priv; + long ioaddr = dev->base_addr; + /* Reset the MII transceiver, suggested by Fred Young @ scalable.com. */ + if ((sp->phy[0] & 0x8000) == 0) { + int phy_addr = sp->phy[0] & 0x1f; + int advertising = mdio_read(ioaddr, phy_addr, 4); + int mii_bmcr = mdio_read(ioaddr, phy_addr, 0); + mdio_write(ioaddr, phy_addr, 0, 0x0400); + mdio_write(ioaddr, phy_addr, 1, 0x0000); + mdio_write(ioaddr, phy_addr, 4, 0x0000); + mdio_write(ioaddr, phy_addr, 0, 0x8000); +#ifdef honor_default_port + mdio_write(ioaddr, phy_addr, 0, mii_ctrl[dev->default_port & 7]); +#else + mdio_read(ioaddr, phy_addr, 0); + mdio_write(ioaddr, phy_addr, 0, mii_bmcr); + mdio_write(ioaddr, phy_addr, 4, advertising); +#endif + } +} + static void speedo_tx_timeout(struct net_device *dev) { struct speedo_private *sp = (struct speedo_private *)dev->priv; @@ -1280,6 +1280,7 @@ outl(virt_to_bus(&sp->tx_ring[sp->dirty_tx % TX_RING_SIZE]), ioaddr + SCBPointer); outw(CUStart, ioaddr + SCBCmd); + reset_mii(dev); } else { #else { @@ -1309,26 +1310,12 @@ dev->trans_start = jiffies; spin_unlock_irqrestore(&sp->lock, flags); set_rx_mode(dev); /* it takes the spinlock itself --SAW */ + /* Reset MII transceiver. Do it before starting the timer to serialize + mdio_xxx operations. Yes, it's a paranoya :-) 2000/05/09 SAW */ + reset_mii(dev); sp->timer.expires = RUN_AT(2*HZ); add_timer(&sp->timer); } - /* Reset the MII transceiver, suggested by Fred Young @ scalable.com. */ - if ((sp->phy[0] & 0x8000) == 0) { - int phy_addr = sp->phy[0] & 0x1f; - int advertising = mdio_read(ioaddr, phy_addr, 4); - int mii_bmcr = mdio_read(ioaddr, phy_addr, 0); - mdio_write(ioaddr, phy_addr, 0, 0x0400); - mdio_write(ioaddr, phy_addr, 1, 0x0000); - mdio_write(ioaddr, phy_addr, 4, 0x0000); - mdio_write(ioaddr, phy_addr, 0, 0x8000); -#ifdef honor_default_port - mdio_write(ioaddr, phy_addr, 0, mii_ctrl[dev->default_port & 7]); -#else - mdio_read(ioaddr, phy_addr, 0); - mdio_write(ioaddr, phy_addr, 0, mii_bmcr); - mdio_write(ioaddr, phy_addr, 4, advertising); -#endif - } return; } @@ -1346,7 +1333,13 @@ return 1; if (tickssofar < TX_TIMEOUT) { /* Reap sent packets from the full Tx queue. */ + unsigned long flags; + /* Take a spinlock to make wait_for_cmd_done and sending the + command atomic. --SAW */ + spin_lock_irqsave(&sp->lock, flags); + wait_for_cmd_done(ioaddr + SCBCmd); outw(SCBTriggerIntr, ioaddr + SCBCmd); + spin_unlock_irqrestore(&sp->lock, flags); return 1; } speedo_tx_timeout(dev); @@ -1495,6 +1488,8 @@ do { status = inw(ioaddr + SCBStatus); /* Acknowledge all of the current interrupt sources ASAP. */ + /* Will change from 0xfc00 to 0xff00 when we start handling + FCP and ER interrupts --Dragan */ outw(status & 0xfc00, ioaddr + SCBStatus); if (speedo_debug > 4) @@ -1594,6 +1589,8 @@ printk(KERN_ERR "%s: Too much work at interrupt, status=0x%4.4x.\n", dev->name, status); /* Clear all interrupt sources. */ + /* Will change from 0xfc00 to 0xff00 when we start handling + FCP and ER interrupts --Dragan */ outl(0xfc00, ioaddr + SCBStatus); break; } @@ -1754,7 +1751,6 @@ pkt_len); #endif } else { - void *temp; /* Pass up the already-filled skbuff. */ skb = sp->rx_skbuff[entry]; if (skb == NULL) { @@ -1763,13 +1759,7 @@ break; } sp->rx_skbuff[entry] = NULL; - temp = skb_put(skb, pkt_len); - if (bus_to_virt(sp->rx_ringp[entry]->rx_buf_addr) != temp) - printk(KERN_ERR "%s: Rx consistency error -- the skbuff " - "addresses do not match in speedo_rx: %p vs. %p " - "/ %p.\n", dev->name, - bus_to_virt(sp->rx_ringp[entry]->rx_buf_addr), - skb->head, temp); + skb_put(skb, pkt_len); sp->rx_ringp[entry] = NULL; } skb->protocol = eth_type_trans(skb, dev); @@ -1808,7 +1798,9 @@ dev->name, inw(ioaddr + SCBStatus)); /* Shut off the media monitoring timer. */ + start_bh_atomic(); del_timer(&sp->timer); + end_bh_atomic(); /* Shutting down the chip nicely fails to disable flow control. So.. */ outl(PortPartialReset, ioaddr + SCBPort); @@ -1847,10 +1839,6 @@ if (speedo_debug > 0) printk(KERN_DEBUG "%s: %d multicast blocks dropped.\n", dev->name, i); -#if defined(HAS_PCI_NETIF) - /* Alt: acpi_set_pwr_state(pci_bus, pci_devfn, sp->acpi_pwr); */ - acpi_set_pwr_state(sp->pci_bus, sp->pci_devfn, ACPI_D2); -#endif MOD_DEC_USE_COUNT; return 0; @@ -1891,7 +1879,7 @@ if (dev->start) { unsigned long flags; /* Take a spinlock to make wait_for_cmd_done and sending the - * command atomic. --SAW */ + command atomic. --SAW */ spin_lock_irqsave(&sp->lock, flags); wait_for_cmd_done(ioaddr + SCBCmd); outb(CUDumpStats, ioaddr + SCBCmd); @@ -1907,32 +1895,25 @@ long ioaddr = dev->base_addr; u16 *data = (u16 *)&rq->ifr_data; int phy = sp->phy[0] & 0x1f; -#if defined(HAS_PCI_NETIF) - int saved_acpi; -#endif switch(cmd) { case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ data[0] = phy; case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ -#if defined(HAS_PCI_NETIF) - saved_acpi = acpi_set_pwr_state(sp->pci_bus, sp->pci_devfn, ACPI_D0); - data[3] = mdio_read(ioaddr, data[0], data[1]); - acpi_set_pwr_state(sp->pci_bus, sp->pci_devfn, saved_acpi); -#else + /* FIXME: these operations need to be serialized with MDIO + access from the timeout handler. + They are currently serialized only with MDIO access from the + timer routine. 2000/05/09 SAW */ + start_bh_atomic(); data[3] = mdio_read(ioaddr, data[0], data[1]); -#endif + end_bh_atomic(); return 0; case SIOCDEVPRIVATE+2: /* Write the specified MII register */ if (!capable(CAP_NET_ADMIN)) return -EPERM; -#if defined(HAS_PCI_NETIF) - saved_acpi = acpi_set_pwr_state(sp->pci_bus, sp->pci_devfn, ACPI_D0); - mdio_write(ioaddr, data[0], data[1], data[2]); - acpi_set_pwr_state(sp->pci_bus, sp->pci_devfn, saved_acpi); -#else + start_bh_atomic(); mdio_write(ioaddr, data[0], data[1], data[2]); -#endif + end_bh_atomic(); return 0; default: return -EOPNOTSUPP; @@ -1995,7 +1976,10 @@ config_cmd_data[4] = rxdmacount; config_cmd_data[5] = txdmacount + 0x80; config_cmd_data[15] |= (new_rx_mode & 2) ? 1 : 0; - config_cmd_data[19] = sp->flow_ctrl ? 0xBD : 0x80; + /* 0x80 doesn't disable FC 0x84 does. + Disable Flow control since we are not ACK-ing any FC interrupts + for now. --Dragan */ + config_cmd_data[19] = 0x84; config_cmd_data[19] |= sp->full_duplex ? 0x40 : 0; config_cmd_data[21] = (new_rx_mode & 1) ? 0x0D : 0x05; if (sp->phy[0] & 0x8000) { /* Use the AUI port instead. */ @@ -2142,18 +2126,11 @@ if (speedo_debug) printk(KERN_INFO "%s", version); -#if defined(HAS_PCI_NETIF) - cards_found = netif_pci_probe(pci_tbl); - if (cards_found < 0) - printk(KERN_INFO "eepro100: No cards found, driver not installed.\n"); - return cards_found; -#else cards_found = eepro100_init(); if (cards_found <= 0) { printk(KERN_INFO "eepro100: No cards found, driver not installed.\n"); return -ENODEV; } -#endif return 0; } @@ -2169,9 +2146,6 @@ release_region(root_speedo_dev->base_addr, SPEEDO3_TOTAL_SIZE); #ifndef USE_IO iounmap((char *)root_speedo_dev->base_addr); -#endif -#if defined(HAS_PCI_NETIF) - acpi_set_pwr_state(sp->pci_bus, sp->pci_devfn, sp->acpi_pwr); #endif next_dev = sp->next_module; if (sp->priv_addr) diff -urN v2.2.15/linux/drivers/net/hamachi.c linux/drivers/net/hamachi.c --- v2.2.15/linux/drivers/net/hamachi.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/hamachi.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,2091 @@ +/* hamachi.c: A Packet Engines GNIC-II Gigabit Ethernet driver for Linux. */ +/* + Written 1998-2000 by Donald Becker. + Updates 2000 by Keith Underwood. + + This software may be used and distributed according to the terms of + the GNU Public License (GPL), incorporated herein by reference. + Drivers based on or derived from this code fall under the GPL and must + retain the authorship, copyright and license notice. This file is not + a complete program and may only be used when the entire operating + system is licensed under the GPL. + + The author may be reached as becker@scyld.com, or C/O + Scyld Computing Corporation + 410 Severn Ave., Suite 210 + Annapolis MD 21403 + + This driver is for the Packet Engines GNIC-II PCI Gigabit Ethernet + adapter. + + Support and updates available at + http://www.scyld.com/network/hamachi.html + or + http://www.parl.clemson.edu/~keithu/hamachi.html + + For best viewing, set your tabs to 3. + +*/ + +static const char *version = +"hamachi.c:v1.01 5/16/2000 Written by Donald Becker\n" +" Some modifications by Eric kasten \n" +" Further modifications by Keith Underwood \n" +" Support by many others\n" +" http://www.scyld.com/network/hamachi.html\n" +" or\n" +" http://www.parl.clemson.edu/~keithu/drivers/hamachi.html\n"; + + +/* A few user-configurable values. */ + +static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ +#define final_version +#define hamachi_debug debug +/* Maximum events (Rx packets, etc.) to handle at each interrupt. */ +static int max_interrupt_work = 40; +static int min_pci_latency = 64; +static int mtu = 0; +/* Default values selected by testing on a dual processor PIII-450 */ +/* These six interrupt control parameters may be set directly when loading the + * module, or through the rx_params and tx_params variables + */ +static int max_rx_latency = 0x11; +static int max_rx_gap = 0x05; +static int min_rx_pkt = 0x18; +static int max_tx_latency = 0x00; +static int max_tx_gap = 0x00; +static int min_tx_pkt = 0x30; + +/* Set the copy breakpoint for the copy-only-tiny-frames scheme. + -Setting to > 1518 causes all frames to be copied + -Setting to 0 disables copies +*/ +static int rx_copybreak = 0; + +/* An override for the hardware detection of bus width. + Set to 1 to force 32 bit PCI bus detection. Set to 4 to force 64 bit. + Add 2 to disable parity detection. +*/ +static int force32 = 0; + + +/* Used to pass the media type, etc. + These exist for driver interoperability. + No media types are currently defined. + - The lower 4 bits are reserved for the media type. + - The next three bits may be set to one of the following: + 0x00000000 : Autodetect PCI bus + 0x00000010 : Force 32 bit PCI bus + 0x00000020 : Disable parity detection + 0x00000040 : Force 64 bit PCI bus + Default is autodetect + - The next bit can be used to force half-duplex. This is a bad + idea since no known implementations implement half-duplex, and, + in general, half-duplex for gigabit ethernet is a bad idea. + 0x00000080 : Force half-duplex + Default is full-duplex. + - In the original driver, the ninth bit could be used to force + full-duplex. Maintain that for compatibility + 0x00000200 : Force full-duplex +*/ +#define MAX_UNITS 8 /* More are supported, limit only on options */ +static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; +static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; +/* The Hamachi chipset supports 3 parameters each for Rx and Tx + * interruput management. Parameters will be loaded as specified into + * the TxIntControl and RxIntControl registers. + * + * The registers are arranged as follows: + * 23 - 16 15 - 8 7 - 0 + * _________________________________ + * | min_pkt | max_gap | max_latency | + * --------------------------------- + * min_pkt : The minimum number of packets processed between + * interrupts. + * max_gap : The maximum inter-packet gap in units of 8.192 us + * max_latency : The absolute time between interrupts in units of 8.192 us + * + */ +static int rx_params[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; +static int tx_params[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; + +/* Operational parameters that are set at compile time. */ + +/* Keep the ring sizes a power of two for compile efficiency. + The compiler will convert '%'<2^N> into a bit mask. + Making the Tx ring too large decreases the effectiveness of channel + bonding and packet priority. + There are no ill effects from too-large receive rings, except for + excessive memory usage */ +/* Empirically it appears that the Tx ring needs to be a little bigger + for these Gbit adapters or you get into an overrun condition really + easily. Also, things appear to work a bit better in back-to-back + configurations if the Rx ring is 8 times the size of the Tx ring +*/ +#define TX_RING_SIZE 64 +#define RX_RING_SIZE 512 + +/* + * Enable mii_ioctl. Added interrupt coalescing parameter adjustment. + * 2/19/99 Pete Wyckoff + */ +#define HAVE_PRIVATE_IOCTL + +/* play with 64-bit addrlen; seems to be a teensy bit slower --pw */ +/* #define ADDRLEN 64 */ + +/* + * RX_CHECKSUM turns on card-generated receive checksum generation for + * TCP and UDP packets. Otherwise the upper layers do the calculation. + * TX_CHECKSUM won't do anything too useful, even if it works. There's no + * easy mechanism by which to tell the TCP/UDP stack that it need not + * generate checksums for this device. But if somebody can find a way + * to get that to work, most of the card work is in here already. + * 3/10/1999 Pete Wyckoff + */ +#undef TX_CHECKSUM +#define RX_CHECKSUM + +/* Operational parameters that usually are not changed. */ +/* Time in jiffies before concluding the transmitter is hung. */ +#define TX_TIMEOUT (2*HZ) + +#include +#ifdef MODULE +#ifdef MODVERSIONS +#include +#endif +#include +#include +#else +#define MOD_INC_USE_COUNT +#define MOD_DEC_USE_COUNT +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if LINUX_VERSION_CODE < 0x20155 +#include +#endif + +#include /* Processor type for cache alignment. */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +/* IP_MF appears to be only defined in , however, + we need it for hardware checksumming support. FYI... some of + the definitions in conflict/duplicate those in + other linux headers causing many compiler warnings. +*/ +#ifndef IP_MF + #define IP_MF 0x2000 /* IP more frags from */ +#endif + +/* Define IP_OFFSET to be IPOPT_OFFSET */ +#ifndef IP_OFFSET + #ifdef IPOPT_OFFSET + #define IP_OFFSET IPOPT_OFFSET + #else + #define IP_OFFSET 2 + #endif +#endif + +/* Kernel compatibility defines, some common to David Hind's PCMCIA package. + This is only in the support-all-kernels source code. */ +#include /* Evil, but neccessary */ + +#define RUN_AT(x) (jiffies + (x)) + +/* Condensed bus+endian portability operations. */ +#if ADDRLEN == 64 +#define virt_to_desc(addr) cpu_to_le64(virt_to_bus(addr)) +#else +#define virt_to_desc(addr) cpu_to_le32(virt_to_bus(addr)) +#define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr)) +#endif + + +#if (LINUX_VERSION_CODE >= 0x20100) +static char kernel_version[] = UTS_RELEASE; +#else +#ifndef __alpha__ +#define ioremap vremap +#define iounmap vfree +#endif +#endif +#if LINUX_VERSION_CODE < 0x20123 +#define test_and_set_bit(val, addr) set_bit(val, addr) +#endif +#if LINUX_VERSION_CODE <= 0x20139 +#define net_device_stats enet_statistics +#define NETSTATS_VER2 +#endif +#if LINUX_VERSION_CODE < 0x20155 +#define PCI_SUPPORT_VER1 +#endif +#if LINUX_VERSION_CODE < 0x20159 +#define DEV_FREE_SKB(skb) dev_kfree_skb(skb, FREE_WRITE); +#else /* Grrr, unneeded incompatible change. */ +#define DEV_FREE_SKB(skb) dev_kfree_skb(skb); +#endif +#if ! defined(CAP_NET_ADMIN) +#define capable(CAP_XXX) (suser()) +#endif +#if ! defined(HAS_NETIF_QUEUE) +#define netif_wake_queue(dev) mark_bh(NET_BH); +#endif + +/* + Theory of Operation + +I. Board Compatibility + +This device driver is designed for the Packet Engines "Hamachi" +Gigabit Ethernet chip. The only PCA currently supported is the GNIC-II 64-bit +66Mhz PCI card. + +II. Board-specific settings + +No jumpers exist on the board. The chip supports software correction of +various motherboard wiring errors, however this driver does not support +that feature. + +III. Driver operation + +IIIa. Ring buffers + +The Hamachi uses a typical descriptor based bus-master architecture. +The descriptor list is similar to that used by the Digital Tulip. +This driver uses two statically allocated fixed-size descriptor lists +formed into rings by a branch from the final descriptor to the beginning of +the list. The ring sizes are set at compile time by RX/TX_RING_SIZE. + +This driver uses a zero-copy receive and transmit scheme similar my other +network drivers. +The driver allocates full frame size skbuffs for the Rx ring buffers at +open() time and passes the skb->data field to the Hamachi as receive data +buffers. When an incoming frame is less than RX_COPYBREAK bytes long, +a fresh skbuff is allocated and the frame is copied to the new skbuff. +When the incoming frame is larger, the skbuff is passed directly up the +protocol stack and replaced by a newly allocated skbuff. + +The RX_COPYBREAK value is chosen to trade-off the memory wasted by +using a full-sized skbuff for small frames vs. the copying costs of larger +frames. Gigabit cards are typically used on generously configured machines +and the underfilled buffers have negligible impact compared to the benefit of +a single allocation size, so the default value of zero results in never +copying packets. + +IIIb/c. Transmit/Receive Structure + +The Rx and Tx descriptor structure are straight-forward, with no historical +baggage that must be explained. Unlike the awkward DBDMA structure, there +are no unused fields or option bits that had only one allowable setting. + +Two details should be noted about the descriptors: The chip supports both 32 +bit and 64 bit address structures, and the length field is overwritten on +the receive descriptors. The descriptor length is set in the control word +for each channel. The development driver uses 32 bit addresses only, however +64 bit addresses may be enabled for 64 bit architectures e.g. the Alpha. + +IIId. Synchronization + +This driver is very similar to my other network drivers. +The driver runs as two independent, single-threaded flows of control. One +is the send-packet routine, which enforces single-threaded use by the +dev->tbusy flag. The other thread is the interrupt handler, which is single +threaded by the hardware and other software. + +The send packet thread has partial control over the Tx ring and 'dev->tbusy' +flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next +queue slot is empty, it clears the tbusy flag when finished otherwise it sets +the 'hmp->tx_full' flag. + +The interrupt handler has exclusive control over the Rx ring and records stats +from the Tx ring. After reaping the stats, it marks the Tx queue entry as +empty by incrementing the dirty_tx mark. Iff the 'hmp->tx_full' flag is set, it +clears both the tx_full and tbusy flags. + +IV. Notes + +Thanks to Kim Stearns of Packet Engines for providing a pair of GNIC-II boards. + +IVb. References + +Hamachi Engineering Design Specification, 5/15/97 +(Note: This version was marked "Confidential".) + +IVc. Errata + +None noted. + +V. Recent Changes + +01/15/1999 EPK Enlargement of the TX and RX ring sizes. This appears + to help avoid some stall conditions -- this needs further research. + +01/15/1999 EPK Creation of the hamachi_tx function. This function cleans + the Tx ring and is called from hamachi_start_xmit (this used to be + called from hamachi_interrupt but it tends to delay execution of the + interrupt handler and thus reduce bandwidth by reducing the latency + between hamachi_rx()'s). Notably, some modification has been made so + that the cleaning loop checks only to make sure that the DescOwn bit + isn't set in the status flag since the card is not required + to set the entire flag to zero after processing. + +01/15/1999 EPK In the hamachi_start_tx function, the Tx ring full flag is + checked before attempting to add a buffer to the ring. If the ring is full + an attempt is made to free any dirty buffers and thus find space for + the new buffer or the function returns non-zero which should case the + scheduler to reschedule the buffer later. + +01/15/1999 EPK Some adjustments were made to the chip intialization. + End-to-end flow control should now be fully active and the interrupt + algorithm vars have been changed. These could probably use further tuning. + +01/15/1999 EPK Added the max_{rx,tx}_latency options. These are used to + set the rx and tx latencies for the Hamachi interrupts. If you're having + problems with network stalls, try setting these to higher values. + Valid values are 0x00 through 0xff. + +01/15/1999 EPK In general, the overall bandwidth has increased and + latencies are better (sometimes by a factor of 2). Stalls are rare at + this point, however there still appears to be a bug somewhere between the + hardware and driver. TCP checksum errors under load also appear to be + eliminated at this point. + +01/18/1999 EPK Ensured that the DescEndRing bit was being set on both the + Rx and Tx rings. This appears to have been affecting whether a particular + peer-to-peer connection would hang under high load. I believe the Rx + rings was typically getting set correctly, but the Tx ring wasn't getting + the DescEndRing bit set during initialization. ??? Does this mean the + hamachi card is using the DescEndRing in processing even if a particular + slot isn't in use -- hypothetically, the card might be searching the + entire Tx ring for slots with the DescOwn bit set and then processing + them. If the DescEndRing bit isn't set, then it might just wander off + through memory until it hits a chunk of data with that bit set + and then looping back. + +02/09/1999 EPK Added Michel Mueller's TxDMA Interrupt and Tx-timeout + problem (TxCmd and RxCmd need only to be set when idle or stopped. + +02/09/1999 EPK Added code to check/reset dev->tbusy in hamachi_interrupt. + (Michel Mueller pointed out the ``permanently busy'' potential + problem here). + +02/22/1999 EPK Added Pete Wyckoff's ioctl to control the Tx/Rx latencies. + +02/23/1999 EPK Verified that the interrupt status field bits for Tx were + incorrectly defined and corrected (as per Michel Mueller). + +02/23/1999 EPK Corrected the Tx full check to check that at least 4 slots + were available before reseting the tbusy and tx_full flags + (as per Michel Mueller). + +03/11/1999 EPK Added Pete Wyckoff's hardware checksumming support. + +12/31/1999 KDU Cleaned up assorted things and added Don's code to force +32 bit. + +02/20/2000 KDU Some of the control was just plain odd. Cleaned up the +hamachi_start_xmit() and hamachi_interrupt() code. There is still some +re-structuring I would like to do. + +03/01/2000 KDU Experimenting with a WIDE range of interrupt mitigation +parameters on a dual P3-450 setup yielded the new default interrupt +mitigation parameters. Tx should interrupt VERY infrequently due to +Eric's scheme. Rx should be more often... + +03/13/2000 KDU Added a patch to make the Rx Checksum code interact +nicely with non-linux machines. + +03/13/2000 KDU Experimented with some of the configuration values: + + -It seems that enabling PCI performance commands for descriptors + (changing RxDMACtrl and TxDMACtrl lower nibble from 5 to D) has minimal + performance impact for any of my tests. (ttcp, netpipe, netperf) I will + leave them that way until I hear further feedback. + + -Increasing the PCI_LATENCY_TIMER to 130 + (2 + (burst size of 128 * (0 wait states + 1))) seems to slightly + degrade performance. Leaving default at 64 pending further information. + +03/14/2000 KDU Further tuning: + + -adjusted boguscnt in hamachi_rx() to depend on interrupt + mitigation parameters chosen. + + -Selected a set of interrupt parameters based on some extensive testing. + These may change with more testing. + +TO DO: + +-Consider borrowing from the acenic driver code to check PCI_COMMAND for +PCI_COMMAND_INVALIDATE. Set maximum burst size to cache line size in +that case. + +-fix the reset procedure. It doesn't quite work. +*/ + +/* A few values that may be tweaked. */ +/* Size of each temporary Rx buffer, calculated as: + * 1518 bytes (ethernet packet) + 2 bytes (to get 8 byte alignment for + * the card) + 8 bytes of status info + 8 bytes for the Rx Checksum + + * 2 more because we use skb_reserve. + */ +#define PKT_BUF_SZ 1538 + +/* For now, this is going to be set to the maximum size of an ethernet + * packet. Eventually, we may want to make it a variable that is + * related to the MTU + */ +#define MAX_FRAME_SIZE 1518 + +/* The rest of these values should never change. */ + +static void hamachi_timer(unsigned long data); + +enum capability_flags {CanHaveMII=1, }; +struct chip_info { + u16 vendor_id, device_id, device_id_mask, pad; + const char *name; + void (*media_timer)(unsigned long data); + int flags; +} chip_tbl[] = { + {0x1318, 0x0911, 0xffff, 0, "Hamachi GNIC-II", hamachi_timer, 0}, + {0,}, +}; + +/* Offsets to the Hamachi registers. Various sizes. */ +enum hamachi_offsets { + TxDMACtrl=0x00, TxCmd=0x04, TxStatus=0x06, TxPtr=0x08, TxCurPtr=0x10, + RxDMACtrl=0x20, RxCmd=0x24, RxStatus=0x26, RxPtr=0x28, RxCurPtr=0x30, + PCIClkMeas=0x060, MiscStatus=0x066, ChipRev=0x68, ChipReset=0x06B, + LEDCtrl=0x06C, VirtualJumpers=0x06D, GPIO=0x6E, + TxChecksum=0x074, RxChecksum=0x076, + TxIntrCtrl=0x078, RxIntrCtrl=0x07C, + InterruptEnable=0x080, InterruptClear=0x084, IntrStatus=0x088, + EventStatus=0x08C, + MACCnfg=0x0A0, FrameGap0=0x0A2, FrameGap1=0x0A4, + /* See enum MII_offsets below. */ + MACCnfg2=0x0B0, RxDepth=0x0B8, FlowCtrl=0x0BC, MaxFrameSize=0x0CE, + AddrMode=0x0D0, StationAddr=0x0D2, + /* Gigabit AutoNegotiation. */ + ANCtrl=0x0E0, ANStatus=0x0E2, ANXchngCtrl=0x0E4, ANAdvertise=0x0E8, + ANLinkPartnerAbility=0x0EA, + EECmdStatus=0x0F0, EEData=0x0F1, EEAddr=0x0F2, + FIFOcfg=0x0F8, +}; + +/* Offsets to the MII-mode registers. */ +enum MII_offsets { + MII_Cmd=0xA6, MII_Addr=0xA8, MII_Wr_Data=0xAA, MII_Rd_Data=0xAC, + MII_Status=0xAE, +}; + +/* Bits in the interrupt status/mask registers. */ +enum intr_status_bits { + IntrRxDone=0x01, IntrRxPCIFault=0x02, IntrRxPCIErr=0x04, + IntrTxDone=0x100, IntrTxPCIFault=0x200, IntrTxPCIErr=0x400, + LinkChange=0x10000, NegotiationChange=0x20000, StatsMax=0x40000, }; + +/* The Hamachi Rx and Tx buffer descriptors. */ +struct hamachi_desc { + u32 status_n_length; +#if ADDRLEN == 64 + u32 pad; + u64 addr; +#else + u32 addr; +#endif +}; + +/* Bits in hamachi_desc.status_n_length */ +enum desc_status_bits { + DescOwn=0x80000000, DescEndPacket=0x40000000, DescEndRing=0x20000000, + DescIntr=0x10000000, +}; + +#define PRIV_ALIGN 15 /* Required alignment mask */ +struct hamachi_private { + /* Descriptor rings first for alignment. Tx requires a second descriptor + for status. */ + struct hamachi_desc rx_ring[RX_RING_SIZE]; + struct hamachi_desc tx_ring[TX_RING_SIZE]; + /* The addresses of receive-in-place skbuffs. */ + struct sk_buff* rx_skbuff[RX_RING_SIZE]; + /* The saved address of a sent-in-place packet/buffer, for skfree(). */ + struct sk_buff* tx_skbuff[TX_RING_SIZE]; + struct device *next_module; + void *priv_addr; /* Unaligned address for kfree */ + struct net_device_stats stats; + struct timer_list timer; /* Media selection timer. */ + /* Frequently used and paired value: keep adjacent for cache effect. */ + int chip_id; + int in_interrupt; + struct hamachi_desc *rx_head_desc; + unsigned int cur_rx, dirty_rx; /* Producer/consumer ring indices */ + unsigned int cur_tx, dirty_tx; + unsigned int rx_buf_sz; /* Based on MTU+slack. */ + unsigned int tx_full:1; /* The Tx queue is full. */ + unsigned int full_duplex:1; /* Full-duplex operation requested. */ + unsigned int duplex_lock:1; + unsigned int medialock:1; /* Do not sense media. */ + unsigned int default_port:4; /* Last dev->if_port value. */ + /* MII transceiver section. */ + int mii_cnt; /* MII device addresses. */ + u16 advertising; /* NWay media advertisement */ + unsigned char phys[2]; /* MII device addresses. */ + u_int32_t rx_int_var, tx_int_var; /* interrupt control variables */ + u_int32_t option; /* Hold on to a copy of the options */ + u_int8_t pad[16]; /* Used for 32-byte alignment */ +}; + +#ifdef MODULE + +#if LINUX_VERSION_CODE > 0x20115 +MODULE_AUTHOR("Donald Becker , Eric Kasten , Keith Underwood "); +MODULE_DESCRIPTION("Packet Engines 'Hamachi' GNIC-II Gigabit Ethernet driver"); +MODULE_PARM(max_interrupt_work, "i"); +MODULE_PARM(min_pci_latency, "i"); +MODULE_PARM(mtu, "i"); +MODULE_PARM(debug, "i"); +MODULE_PARM(min_rx_pkt, "i"); +MODULE_PARM(max_rx_gap, "i"); +MODULE_PARM(max_rx_latency, "i"); +MODULE_PARM(min_tx_pkt, "i"); +MODULE_PARM(max_tx_gap, "i"); +MODULE_PARM(max_tx_latency, "i"); +MODULE_PARM(rx_copybreak, "i"); +MODULE_PARM(rx_params, "1-" __MODULE_STRING(MAX_UNITS) "i"); +MODULE_PARM(tx_params, "1-" __MODULE_STRING(MAX_UNITS) "i"); +MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i"); +MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i"); +MODULE_PARM(force32, "i"); +#endif + +#endif + +static struct device *hamachi_probe1(struct device *dev, long ioaddr, + int irq, int chip_id, int options); +static int read_eeprom(long ioaddr, int location); +static int mdio_read(long ioaddr, int phy_id, int location); +static void mdio_write(long ioaddr, int phy_id, int location, int value); +static int hamachi_open(struct device *dev); +#ifdef HAVE_PRIVATE_IOCTL +static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd); +#endif +static void hamachi_timer(unsigned long data); +static void hamachi_tx_timeout(struct device *dev); +static void hamachi_init_ring(struct device *dev); +static int hamachi_start_xmit(struct sk_buff *skb, struct device *dev); +static void hamachi_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static inline int hamachi_rx(struct device *dev); +static inline int hamachi_tx(struct device *dev); +static void hamachi_error(struct device *dev, int intr_status); +static int hamachi_close(struct device *dev); +static struct net_device_stats *hamachi_get_stats(struct device *dev); +static void set_rx_mode(struct device *dev); + +/* A list of our installed devices, for removing the driver module. */ +static struct device *root_hamachi_dev = NULL; + +int hamachi_probe(struct device *dev) +{ + int cards_found = 0; + int pci_index = 0; + unsigned char pci_bus, pci_device_fn; + + if ( ! pcibios_present()) + return -ENODEV; + + for (;pci_index < 0xff; pci_index++) { + u16 pci_command, new_command, vendor, device; + int chip_idx; + int irq; + long pciaddr; + long ioaddr; + + if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, + pci_index, &pci_bus, &pci_device_fn) + != PCIBIOS_SUCCESSFUL) + break; + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_VENDOR_ID, &vendor); + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_DEVICE_ID, &device); + + for (chip_idx = 0; chip_tbl[chip_idx].vendor_id; chip_idx++) + if (vendor == chip_tbl[chip_idx].vendor_id + && (device & chip_tbl[chip_idx].device_id_mask) == + chip_tbl[chip_idx].device_id) + break; + if (chip_tbl[chip_idx].vendor_id == 0) /* Compiled out! */ + continue; + + { +#if LINUX_VERSION_CODE > 0x20155 || PCI_SUPPORT_1 + struct pci_dev *pdev = pci_find_slot(pci_bus, pci_device_fn); + pciaddr = pdev->base_address[0]; +#ifdef __alpha__ /* Really "64 bit addrs" */ + pciaddr |= ((long)pdev->base_address[1]) << 32; +#endif + irq = pdev->irq; + printk(KERN_INFO "Found %s at PCI address %#lx, IRQ %d.\n", + chip_tbl[chip_idx].name, pciaddr, irq); +#else + u32 pci_memaddr, pci_memaddr_hi = 0; + u8 pci_irq_line; + pcibios_read_config_byte(pci_bus, pci_device_fn, + PCI_INTERRUPT_LINE, &pci_irq_line); + pcibios_read_config_dword(pci_bus, pci_device_fn, + PCI_BASE_ADDRESS_0, &pci_memaddr); + pciaddr = pci_memaddr; +#ifdef __alpha__ /* Really "64 bit addrs" */ + pcibios_read_config_dword(pci_bus, pci_device_fn, + PCI_BASE_ADDRESS_1, &pci_memaddr_hi); + pciaddr = pci_memaddr + ((long)pci_memaddr_hi<<32); +#endif + irq = pci_irq_line; + printk(KERN_INFO "Found %s at PCI address %#8.8x %8.8x, IRQ %d.\n", + chip_tbl[chip_idx].name, pci_memaddr_hi, pci_memaddr, irq); +#endif + } + + if (hamachi_debug > 2) + printk(KERN_INFO "Found %s at PCI address %#lx, IRQ %d.\n", + chip_tbl[chip_idx].name, pciaddr, irq); + ioaddr = (long)ioremap(pciaddr & ~0xf, 0x400); + + if (ioaddr == 0) { + printk(KERN_INFO "Failed to map PCI address %#lx.\n", + pciaddr); + continue; + } + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, &pci_command); + new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_MEMORY; + + + if (pci_command != new_command) { + printk(KERN_INFO " The PCI BIOS has not enabled the" + " device at %d/%d! Updating PCI command %4.4x->%4.4x.\n", + pci_bus, pci_device_fn, pci_command, new_command); + pcibios_write_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, new_command); + } + + dev = hamachi_probe1(dev, ioaddr, irq, chip_idx, cards_found); + + if (dev) { + u8 pci_latency, pci_cache_line_size, cache_line_size_guess; + cache_line_size_guess = L1_CACHE_BYTES >> 2; + /* Disable timeouts (errata), check PCI latency values. */ + pcibios_write_config_byte(pci_bus, pci_device_fn, 0x40, 0); + pcibios_write_config_byte(pci_bus, pci_device_fn, 0x41, 0); + pcibios_read_config_byte(pci_bus, pci_device_fn, + PCI_LATENCY_TIMER, &pci_latency); + if (pci_latency < min_pci_latency) { + printk(KERN_INFO " PCI latency timer (CFLT) is " + "unreasonably low at %d. Setting to %d clocks.\n", + pci_latency, min_pci_latency); + pcibios_write_config_byte(pci_bus, pci_device_fn, + PCI_LATENCY_TIMER, min_pci_latency); + } else if (hamachi_debug > 1) + printk(KERN_INFO " PCI latency timer (CFLT) is %#x.\n", + pci_latency); + pcibios_read_config_byte(pci_bus, pci_device_fn, + PCI_CACHE_LINE_SIZE, &pci_cache_line_size); + if (pci_cache_line_size == 0){ + printk(KERN_INFO " PCI cache line size was %d. Setting to + %d\n", pci_cache_line_size, cache_line_size_guess); + pcibios_write_config_byte(pci_bus, pci_device_fn, + PCI_CACHE_LINE_SIZE, cache_line_size_guess); + } + } + dev = 0; + cards_found++; + } + + return cards_found ? 0 : -ENODEV; +} + +static struct device *hamachi_probe1(struct device *dev, long ioaddr, + int irq, int chip_id, int card_idx) +{ + static int did_version = 0; /* Already printed version info. */ + struct hamachi_private *hmp; + int option, i, rx_int_var, tx_int_var, boguscnt; + + if (hamachi_debug > 0 && did_version++ == 0) + printk(version); + + dev = init_etherdev(dev, sizeof(struct hamachi_private)); +#ifdef TX_CHECKSUM + printk("check that skbcopy in ip_queue_xmit isn't happening\n"); + dev->hard_header_len += 8; /* for cksum tag */ +#endif + + printk(KERN_INFO "%s: %s type %x at 0x%lx, ", + dev->name, chip_tbl[chip_id].name, readl(ioaddr + ChipRev), + ioaddr); + + for (i = 0; i < 6; i++) + dev->dev_addr[i] = 1 ? read_eeprom(ioaddr, 4 + i) + : readb(ioaddr + StationAddr + i); + for (i = 0; i < 5; i++) + printk("%2.2x:", dev->dev_addr[i]); + printk("%2.2x, IRQ %d.\n", dev->dev_addr[i], irq); + +#if ! defined(final_version) + if (hamachi_debug > 4) + for (i = 0; i < 0x10; i++) + printk("%2.2x%s", + read_eeprom(ioaddr, i), i % 16 != 15 ? " " : "\n"); +#endif + +#if 0 /* Moving this until after the force 32 check and reset. */ + i = readb(ioaddr + PCIClkMeas); + printk(KERN_INFO "%s: %d-bit %d Mhz PCI bus (%d), Virtual Jumpers " + "%2.2x, LPA %4.4x.\n", + dev->name, readw(ioaddr + MiscStatus) & 1 ? 64 : 32, + i ? 2000/(i&0x7f) : 0, i&0x7f, (int)readb(ioaddr + VirtualJumpers), + readw(ioaddr + ANLinkPartnerAbility)); +#endif + + /* Make certain the descriptor lists are aligned. */ + { + void *mem = kmalloc(sizeof(*hmp) + PRIV_ALIGN, GFP_KERNEL); + hmp = (void *)(((long)mem + PRIV_ALIGN) & ~PRIV_ALIGN); + dev->priv = hmp; + hmp->priv_addr = mem; + } + memset(hmp, 0, sizeof(*hmp)); + + /* Check for options being passed in */ + option = card_idx < MAX_UNITS ? options[card_idx] : 0; + if (dev->mem_start) + option = dev->mem_start; + + /* If the bus size is misidentified, do the following. */ + force32 = force32 ? force32 : + ((option >= 0) ? ((option & 0x00000070) >> 4) : 0 ); + if (force32) + writeb(force32, ioaddr + VirtualJumpers); + + /* Hmmm, do we really need to reset the chip???. */ + writeb(0x01, ioaddr + ChipReset); + + /* After a reset, the clock speed measurement of the PCI bus will not + * be valid for a moment. Wait for a little while until it is. If + * it takes more than 10ms, forget it. + */ + udelay(10); + i = readb(ioaddr + PCIClkMeas); + for (boguscnt = 0; (!(i & 0x080)) && boguscnt < 1000; boguscnt++){ + udelay(10); + i = readb(ioaddr + PCIClkMeas); + } + + printk(KERN_INFO "%s: %d-bit %d Mhz PCI bus (%d), Virtual Jumpers " + "%2.2x, LPA %4.4x.\n", + dev->name, readw(ioaddr + MiscStatus) & 1 ? 64 : 32, + i ? 2000/(i&0x7f) : 0, i&0x7f, (int)readb(ioaddr + VirtualJumpers), + readw(ioaddr + ANLinkPartnerAbility)); + + dev->base_addr = ioaddr; + dev->irq = irq; + + + hmp->next_module = root_hamachi_dev; + root_hamachi_dev = dev; + + hmp->chip_id = chip_id; + + /* The lower four bits are the media type. */ + if (option > 0) { + hmp->option = option; + if (option & 0x200) + hmp->full_duplex = 1; + else if (option & 0x080) + hmp->full_duplex = 0; + hmp->default_port = option & 15; + if (hmp->default_port) + hmp->medialock = 1; + } + if (card_idx < MAX_UNITS && full_duplex[card_idx] > 0) + hmp->full_duplex = 1; + + /* lock the duplex mode if someone specified a value */ + if (hmp->full_duplex || (option & 0x080)) + hmp->duplex_lock = 1; + + /* Set interrupt tuning parameters */ + max_rx_latency = max_rx_latency & 0x00ff; + max_rx_gap = max_rx_gap & 0x00ff; + min_rx_pkt = min_rx_pkt & 0x00ff; + max_tx_latency = max_tx_latency & 0x00ff; + max_tx_gap = max_tx_gap & 0x00ff; + min_tx_pkt = min_tx_pkt & 0x00ff; + + rx_int_var = card_idx < MAX_UNITS ? rx_params[card_idx] : -1; + tx_int_var = card_idx < MAX_UNITS ? tx_params[card_idx] : -1; + hmp->rx_int_var = rx_int_var >= 0 ? rx_int_var : + (min_rx_pkt << 16 | max_rx_gap << 8 | max_rx_latency); + hmp->tx_int_var = tx_int_var >= 0 ? tx_int_var : + (min_tx_pkt << 16 | max_tx_gap << 8 | max_tx_latency); + + + /* The Hamachi-specific entries in the device structure. */ + dev->open = &hamachi_open; + dev->hard_start_xmit = &hamachi_start_xmit; + dev->stop = &hamachi_close; + dev->get_stats = &hamachi_get_stats; + dev->set_multicast_list = &set_rx_mode; +#ifdef HAVE_PRIVATE_IOCTL + dev->do_ioctl = &mii_ioctl; +#endif + if (mtu) + dev->mtu = mtu; + + if (chip_tbl[hmp->chip_id].flags & CanHaveMII) { + int phy, phy_idx = 0; + for (phy = 0; phy < 32 && phy_idx < 4; phy++) { + int mii_status = mdio_read(ioaddr, phy, 1); + if (mii_status != 0xffff && + mii_status != 0x0000) { + hmp->phys[phy_idx++] = phy; + hmp->advertising = mdio_read(ioaddr, phy, 4); + printk(KERN_INFO "%s: MII PHY found at address %d, status " + "0x%4.4x advertising %4.4x.\n", + dev->name, phy, mii_status, hmp->advertising); + } + } + hmp->mii_cnt = phy_idx; + } + /* Configure gigabit autonegotiation. */ + writew(0x0400, ioaddr + ANXchngCtrl); /* Enable legacy links. */ + writew(0x08e0, ioaddr + ANAdvertise); /* Set our advertise word. */ + writew(0x1000, ioaddr + ANCtrl); /* Enable negotiation */ + return dev; +} + +static int read_eeprom(long ioaddr, int location) +{ + int bogus_cnt = 1000; + + /* We should check busy first - per docs -KDU */ + while ((readb(ioaddr + EECmdStatus) & 0x40) && --bogus_cnt > 0); + writew(location, ioaddr + EEAddr); + writeb(0x02, ioaddr + EECmdStatus); + bogus_cnt = 1000; + while ((readb(ioaddr + EECmdStatus) & 0x40) && --bogus_cnt > 0); + if (hamachi_debug > 5) + printk(" EEPROM status is %2.2x after %d ticks.\n", + (int)readb(ioaddr + EECmdStatus), 1000- bogus_cnt); + return readb(ioaddr + EEData); +} + +/* MII Managemen Data I/O accesses. + These routines assume the MDIO controller is idle, and do not exit until + the command is finished. */ + +static int mdio_read(long ioaddr, int phy_id, int location) +{ + int i; + + /* We should check busy first - per docs -KDU */ + for (i = 10000; i >= 0; i--) + if ((readw(ioaddr + MII_Status) & 1) == 0) + break; + writew((phy_id<<8) + location, ioaddr + MII_Addr); + writew(0x0001, ioaddr + MII_Cmd); + for (i = 10000; i >= 0; i--) + if ((readw(ioaddr + MII_Status) & 1) == 0) + break; + return readw(ioaddr + MII_Rd_Data); +} + +static void mdio_write(long ioaddr, int phy_id, int location, int value) +{ + int i; + + /* We should check busy first - per docs -KDU */ + for (i = 10000; i >= 0; i--) + if ((readw(ioaddr + MII_Status) & 1) == 0) + break; + writew((phy_id<<8) + location, ioaddr + MII_Addr); + writew(value, ioaddr + MII_Wr_Data); + + /* Wait for the command to finish. */ + for (i = 10000; i >= 0; i--) + if ((readw(ioaddr + MII_Status) & 1) == 0) + break; + return; +} + + +static int hamachi_open(struct device *dev) +{ + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + long ioaddr = dev->base_addr; + int i; + u_int32_t rx_int_var, tx_int_var; + u_int16_t fifo_info; + + if (request_irq(dev->irq, &hamachi_interrupt, SA_SHIRQ, dev->name, dev)) + return -EAGAIN; + + if (hamachi_debug > 1) + printk(KERN_DEBUG "%s: hamachi_open() irq %d.\n", + dev->name, dev->irq); + + MOD_INC_USE_COUNT; + + hamachi_init_ring(dev); + +#if ADDRLEN == 64 + writel(virt_to_bus(hmp->rx_ring), ioaddr + RxPtr); + writel(virt_to_bus(hmp->rx_ring) >> 32, ioaddr + RxPtr + 4); + writel(virt_to_bus(hmp->tx_ring), ioaddr + TxPtr); + writel(virt_to_bus(hmp->tx_ring) >> 32, ioaddr + TxPtr + 4); +#else + writel(virt_to_bus(hmp->rx_ring), ioaddr + RxPtr); + writel(virt_to_bus(hmp->tx_ring), ioaddr + TxPtr); +#endif + + /* TODO: It would make sense to organize this as words since the card + * documentation does. -KDU + */ + for (i = 0; i < 6; i++) + writeb(dev->dev_addr[i], ioaddr + StationAddr + i); + + /* Initialize other registers: with so many this eventually this will + converted to an offset/value list. */ + + /* Configure the FIFO */ + fifo_info = (readw(ioaddr + GPIO) & 0x00C0) >> 6; + switch (fifo_info){ + case 0 : + /* No FIFO */ + writew(0x0000, ioaddr + FIFOcfg); + break; + case 1 : + /* Configure the FIFO for 512K external, 16K used for Tx. */ + writew(0x0028, ioaddr + FIFOcfg); + break; + case 2 : + /* Configure the FIFO for 1024 external, 32K used for Tx. */ + writew(0x004C, ioaddr + FIFOcfg); + break; + case 3 : + /* Configure the FIFO for 2048 external, 32K used for Tx. */ + writew(0x006C, ioaddr + FIFOcfg); + break; + default : + printk(KERN_WARNING "%s: Unsupported external memory config!\n", + dev->name); + /* Default to no FIFO */ + writew(0x0000, ioaddr + FIFOcfg); + break; + } + + if (dev->if_port == 0) + dev->if_port = hmp->default_port; + + dev->tbusy = 0; + dev->interrupt = 0; + hmp->in_interrupt = 0; + + /* Setting the Rx mode will start the Rx process. */ + /* If someone didn't choose a duplex, default to full-duplex */ + if (hmp->duplex_lock != 1) + hmp->full_duplex = 1; + + /* always 1, takes no more time to do it */ + writew(0x0001, ioaddr + RxChecksum); +#ifdef TX_CHECKSUM + writew(0x0001, ioaddr + TxChecksum); +#else + writew(0x0000, ioaddr + TxChecksum); +#endif + writew(0x8000, ioaddr + MACCnfg); /* Soft reset the MAC */ + writew(0x215F, ioaddr + MACCnfg); + writew(0x000C, ioaddr + FrameGap0); + /* WHAT?!?!? Why isn't this documented somewhere? -KDU */ + writew(0x1018, ioaddr + FrameGap1); + /* Why do we enable receives/transmits here? -KDU */ + writew(0x0780, ioaddr + MACCnfg2); /* Upper 16 bits control LEDs. */ + /* Enable automatic generation of flow control frames, period 0xffff. */ + writel(0x0030FFFF, ioaddr + FlowCtrl); + writew(MAX_FRAME_SIZE, ioaddr + MaxFrameSize); /* dev->mtu+14 ??? */ + + /* Enable legacy links. */ + writew(0x0400, ioaddr + ANXchngCtrl); /* Enable legacy links. */ + /* Initial Link LED to blinking red. */ + writeb(0x03, ioaddr + LEDCtrl); + + /* Configure interrupt mitigation. This has a great effect on + performance, so systems tuning should start here!. */ + + rx_int_var = hmp->rx_int_var; + tx_int_var = hmp->tx_int_var; + + if (hamachi_debug > 1) { + printk("max_tx_latency: %d, max_tx_gap: %d, min_tx_pkt: %d\n", + tx_int_var & 0x00ff, (tx_int_var & 0x00ff00) >> 8, + (tx_int_var & 0x00ff0000) >> 16); + printk("max_rx_latency: %d, max_rx_gap: %d, min_rx_pkt: %d\n", + rx_int_var & 0x00ff, (rx_int_var & 0x00ff00) >> 8, + (rx_int_var & 0x00ff0000) >> 16); + printk("rx_int_var: %x, tx_int_var: %x\n", rx_int_var, tx_int_var); + } + + writel(tx_int_var, ioaddr + TxIntrCtrl); + writel(rx_int_var, ioaddr + RxIntrCtrl); + + set_rx_mode(dev); + + dev->start = 1; + + /* Enable interrupts by setting the interrupt mask. */ + writel(0x80878787, ioaddr + InterruptEnable); + writew(0x0000, ioaddr + EventStatus); /* Clear non-interrupting events */ + + /* Configure and start the DMA channels. */ + /* Burst sizes are in the low three bits: size = 4<<(val&7) */ +#if ADDRLEN == 64 + writew(0x005D, ioaddr + RxDMACtrl); /* 128 dword bursts */ + writew(0x005D, ioaddr + TxDMACtrl); +#else + writew(0x001D, ioaddr + RxDMACtrl); + writew(0x001D, ioaddr + TxDMACtrl); +#endif + writew(0x0001, dev->base_addr + RxCmd); + + if (hamachi_debug > 2) { + printk(KERN_DEBUG "%s: Done hamachi_open(), status: Rx %x Tx %x.\n", + dev->name, readw(ioaddr + RxStatus), readw(ioaddr + TxStatus)); + } + /* Set the timer to check for link beat. */ + init_timer(&hmp->timer); + hmp->timer.expires = RUN_AT((24*HZ)/10); /* 2.4 sec. */ + hmp->timer.data = (unsigned long)dev; + hmp->timer.function = &hamachi_timer; /* timer handler */ + add_timer(&hmp->timer); + + return 0; +} + +static inline int hamachi_tx(struct device *dev) +{ + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + + /* Update the dirty pointer until we find an entry that is + still owned by the card */ + for (; hmp->cur_tx - hmp->dirty_tx > 0; hmp->dirty_tx++) { + int entry = hmp->dirty_tx % TX_RING_SIZE; + if (hmp->tx_ring[entry].status_n_length & cpu_to_le32(DescOwn)) + break; + /* Free the original skb. */ + if (hmp->tx_skbuff[entry] != 0) { + DEV_FREE_SKB(hmp->tx_skbuff[entry]); + hmp->tx_skbuff[entry] = 0; + } + hmp->tx_ring[entry].status_n_length = 0; + if (entry >= TX_RING_SIZE-1) + hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= + cpu_to_le32(DescEndRing); + hmp->stats.tx_packets++; + } + + return 0; +} + +static void hamachi_timer(unsigned long data) +{ + struct device *dev = (struct device *)data; + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + long ioaddr = dev->base_addr; + int next_tick = 10*HZ; + + if (hamachi_debug > 2) { + printk(KERN_INFO "%s: Hamachi Autonegotiation status %4.4x, LPA " + "%4.4x.\n", dev->name, readw(ioaddr + ANStatus), + readw(ioaddr + ANLinkPartnerAbility)); + printk(KERN_INFO "%s: Autonegotiation regs %4.4x %4.4x %4.4x " + "%4.4x %4.4x %4.4x.\n", dev->name, + readw(ioaddr + 0x0e0), + readw(ioaddr + 0x0e2), + readw(ioaddr + 0x0e4), + readw(ioaddr + 0x0e6), + readw(ioaddr + 0x0e8), + readw(ioaddr + 0x0eA)); + } + /* We could do something here... nah. */ + hmp->timer.expires = RUN_AT(next_tick); + add_timer(&hmp->timer); +} + +static void hamachi_tx_timeout(struct device *dev) +{ + int i; + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + long ioaddr = dev->base_addr; + + /* no one else should act on this device while we are in here */ + set_bit(0, (void *)&dev->tbusy); + + printk(KERN_WARNING "%s: Hamachi transmit timed out, status %8.8x," + " resetting...\n", dev->name, (int)readw(ioaddr + TxStatus)); + +#ifndef __alpha__ + { + int i; + printk(KERN_DEBUG " Rx ring %8.8x: ", (int)hmp->rx_ring); + for (i = 0; i < RX_RING_SIZE; i++) + printk(" %8.8x", (unsigned int)hmp->rx_ring[i].status_n_length); + printk("\n"KERN_DEBUG" Tx ring %8.8x: ", (int)hmp->tx_ring); + for (i = 0; i < TX_RING_SIZE; i++) + printk(" %4.4x", hmp->tx_ring[i].status_n_length); + printk("\n"); + } +#endif + + /* Reinit the hardware and make sure the Rx and Tx processes + are up and running. + */ + dev->if_port = 0; + /* The right way to do Reset. -KDU + * -Clear OWN bit in all Rx/Tx descriptors + * -Wait 50 uS for channels to go idle + * -Turn off MAC receiver + * -Issue Reset + */ + + for (i = 0; i < RX_RING_SIZE; i++) + hmp->rx_ring[i].status_n_length &= ~DescOwn; + + /* Presume that all packets in the Tx queue are gone if we have to + * re-init the hardware. + */ + for (i = 0; i < TX_RING_SIZE; i++){ + if (i >= TX_RING_SIZE - 1) + hmp->tx_ring[i].status_n_length = DescEndRing | + (hmp->tx_ring[i].status_n_length & 0x0000FFFF); + else + hmp->tx_ring[i].status_n_length &= 0x0000ffff; + if (hmp->tx_skbuff[i]){ + DEV_FREE_SKB(hmp->tx_skbuff[i]); + hmp->tx_skbuff[i] = 0; + } + } + + udelay(60); /* Sleep 60 us just for safety sake */ + writew(0x0002, dev->base_addr + RxCmd); /* STOP Rx */ + + writeb(0x01, ioaddr + ChipReset); /* Reinit the hardware */ + + hmp->tx_full = 0; + hmp->cur_rx = hmp->cur_tx = 0; + hmp->dirty_rx = hmp->dirty_tx = 0; + hmp->rx_head_desc = &hmp->rx_ring[0]; + /* Rx packets are also presumed lost; however, we need to make sure a + * ring of buffers is in tact. -KDU + */ + for (i = 0; i < RX_RING_SIZE; i++){ + if (hmp->rx_skbuff[i]){ + DEV_FREE_SKB(hmp->rx_skbuff[i]); + hmp->rx_skbuff[i] = 0; + } + } + /* Fill in the Rx buffers. Handle allocation failure gracefully. */ + for (i = 0; i < RX_RING_SIZE; i++) { + struct sk_buff *skb = dev_alloc_skb(hmp->rx_buf_sz); + hmp->rx_skbuff[i] = skb; + if (skb == NULL) + break; + skb->dev = dev; /* Mark as being used by this device. */ + skb_reserve(skb, 2); /* 16 byte align the IP header. */ + hmp->rx_ring[i].addr = virt_to_desc(skb->tail); + hmp->rx_ring[i].status_n_length = + cpu_to_le32(DescOwn | DescEndPacket | DescIntr | (hmp->rx_buf_sz - 2)); + } + hmp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); + /* Mark the last entry as wrapping the ring. */ + hmp->rx_ring[RX_RING_SIZE-1].status_n_length |= cpu_to_le32(DescEndRing); + + + /* Trigger an immediate transmit demand. */ + dev->trans_start = jiffies; + hmp->stats.tx_errors++; + + /* Restart the chip's Tx/Rx processes . */ + writew(0x0002, dev->base_addr + TxCmd); /* STOP Tx */ + writew(0x0001, dev->base_addr + TxCmd); /* START Tx */ + writew(0x0001, dev->base_addr + RxCmd); /* START Rx */ + + clear_bit(0, (void *)&dev->tbusy); + + return; +} + + +/* Initialize the Rx and Tx rings, along with various 'dev' bits. */ +static void hamachi_init_ring(struct device *dev) +{ + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + int i; + + hmp->tx_full = 0; + hmp->cur_rx = hmp->cur_tx = 0; + hmp->dirty_rx = hmp->dirty_tx = 0; + +#if 0 + /* This is wrong. I'm not sure what the original plan was, but this + * is wrong. An MTU of 1 gets you a buffer of 1536, while an MTU + * of 1501 gets a buffer of 1533? -KDU + */ + hmp->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32); +#endif + /* My attempt at a reasonable correction */ + /* +26 gets the maximum ethernet encapsulation, +7 & ~7 because the + * card needs room to do 8 byte alignment, +2 so we can reserve + * the first 2 bytes, and +16 gets room for the status word from the + * card. -KDU + */ + hmp->rx_buf_sz = (dev->mtu <= 1492 ? PKT_BUF_SZ : + (((dev->mtu+26+7) & ~7) + 2 + 16)); + + hmp->rx_head_desc = &hmp->rx_ring[0]; + + /* Initialize all Rx descriptors. */ + for (i = 0; i < RX_RING_SIZE; i++) { + hmp->rx_ring[i].status_n_length = 0; + hmp->rx_skbuff[i] = 0; + } + /* Fill in the Rx buffers. Handle allocation failure gracefully. */ + for (i = 0; i < RX_RING_SIZE; i++) { + struct sk_buff *skb = dev_alloc_skb(hmp->rx_buf_sz); + hmp->rx_skbuff[i] = skb; + if (skb == NULL) + break; + skb->dev = dev; /* Mark as being used by this device. */ + skb_reserve(skb, 2); /* 16 byte align the IP header. */ + hmp->rx_ring[i].addr = virt_to_desc(skb->tail); + /* -2 because it doesn't REALLY have that first 2 bytes -KDU */ + hmp->rx_ring[i].status_n_length = + cpu_to_le32(DescOwn | DescEndPacket | DescIntr | (hmp->rx_buf_sz -2)); + } + hmp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); + /* Mark the last entry as wrapping the ring. */ + hmp->rx_ring[RX_RING_SIZE-1].status_n_length |= cpu_to_le32(DescEndRing); + + + /* Mark the last entry as wrapping the ring. */ + hmp->rx_ring[RX_RING_SIZE-1].status_n_length |= DescEndRing; + + for (i = 0; i < TX_RING_SIZE; i++) { + hmp->tx_skbuff[i] = 0; + hmp->tx_ring[i].status_n_length = 0; + } + /* Mark the last entry as wrapping the ring. */ + hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= cpu_to_le32(DescEndRing); + + return; +} + + +#ifdef TX_CHECKSUM +#define csum_add(it, val) \ +do { \ + it += (u16) (val); \ + if (it & 0xffff0000) { \ + it &= 0xffff; \ + ++it; \ + } \ +} while (0) + /* printk("add %04x --> %04x\n", val, it); \ */ + +/* uh->len already network format, do not swap */ +#define pseudo_csum_udp(sum,ih,uh) do { \ + sum = 0; \ + csum_add(sum, (ih)->saddr >> 16); \ + csum_add(sum, (ih)->saddr & 0xffff); \ + csum_add(sum, (ih)->daddr >> 16); \ + csum_add(sum, (ih)->daddr & 0xffff); \ + csum_add(sum, __constant_htons(IPPROTO_UDP)); \ + csum_add(sum, (uh)->len); \ +} while (0) + +/* swap len */ +#define pseudo_csum_tcp(sum,ih,len) do { \ + sum = 0; \ + csum_add(sum, (ih)->saddr >> 16); \ + csum_add(sum, (ih)->saddr & 0xffff); \ + csum_add(sum, (ih)->daddr >> 16); \ + csum_add(sum, (ih)->daddr & 0xffff); \ + csum_add(sum, __constant_htons(IPPROTO_TCP)); \ + csum_add(sum, htons(len)); \ +} while (0) +#endif + +static int hamachi_start_xmit(struct sk_buff *skb, struct device *dev) +{ + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + unsigned entry; + u16 status; + + /* Block a timer-based transmit from overlapping. This could better be + done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */ + if (test_and_set_bit(0, (void*)&dev->tbusy)) { + if (jiffies - dev->trans_start < TX_TIMEOUT) + return 1; + hamachi_tx_timeout(dev); + return 1; + } + + /* Ok, now make sure that the queue has space before trying to + add another skbuff. if we return non-zero the scheduler + should interpret this as a queue full and requeue the buffer + for later. + */ + if (hmp->tx_full) { + /* We should NEVER reach this point -KDU */ + printk(KERN_WARNING "%s: Hamachi transmit queue full at slot %d.\n",dev->name, hmp->cur_tx); + + /* Wake the potentially-idle transmit channel. */ + /* If we don't need to read status, DON'T -KDU */ + status=readw(dev->base_addr + TxStatus); + if( !(status & 0x0001) || (status & 0x0002)) + writew(0x0001, dev->base_addr + TxCmd); + return 1; + } + + /* Caution: the write order is important here, set the field + with the "ownership" bits last. */ + + /* Calculate the next Tx descriptor entry. */ + entry = hmp->cur_tx % TX_RING_SIZE; + + hmp->tx_skbuff[entry] = skb; + +#ifdef TX_CHECKSUM + { + /* tack on checksum tag */ + u32 tagval = 0; + struct ethhdr *eh = (struct ethhdr *)skb->data; + if (eh->h_proto == __constant_htons(ETH_P_IP)) { + struct iphdr *ih = (struct iphdr *)((char *)eh + ETH_HLEN); + if (ih->protocol == IPPROTO_UDP) { + struct udphdr *uh + = (struct udphdr *)((char *)ih + ih->ihl*4); + u32 offset = ((unsigned char *)uh + 6) - skb->data; + u32 pseudo; + pseudo_csum_udp(pseudo, ih, uh); + pseudo = htons(pseudo); + printk("udp cksum was %04x, sending pseudo %04x\n", + uh->check, pseudo); + uh->check = 0; /* zero out uh->check before card calc */ + /* + * start at 14 (skip ethhdr), store at offset (uh->check), + * use pseudo value given. + */ + tagval = (14 << 24) | (offset << 16) | pseudo; + } else if (ih->protocol == IPPROTO_TCP) { + printk("tcp, no auto cksum\n"); + } + } + *(u32 *)skb_push(skb, 8) = tagval; + } +#endif + + hmp->tx_ring[entry].addr = virt_to_desc(skb->data); + + /* Hmmmm, could probably put a DescIntr on these, but the way + the driver is currently coded makes Tx interrupts unnecessary + since the clearing of the Tx ring is handled by the start_xmit + routine. This organization helps mitigate the interrupts a + bit and probably renders the max_tx_latency param useless. + + Update: Putting a DescIntr bit on all of the descriptors and + mitigating interrupt frequency with the tx_min_pkt parameter. -KDU + */ + if (entry >= TX_RING_SIZE-1) /* Wrap ring */ + hmp->tx_ring[entry].status_n_length = + cpu_to_le32(DescOwn|DescEndPacket|DescEndRing|DescIntr | skb->len); + else + hmp->tx_ring[entry].status_n_length = + cpu_to_le32(DescOwn|DescEndPacket|DescIntr | skb->len); + hmp->cur_tx++; + + /* Non-x86 Todo: explicitly flush cache lines here. */ + + /* Wake the potentially-idle transmit channel. */ + /* If we don't need to read status, DON'T -KDU */ + status=readw(dev->base_addr + TxStatus); + if( !(status & 0x0001) || (status & 0x0002)) + writew(0x0001, dev->base_addr + TxCmd); + + /* Immediately before returning, let's clear as many entries as we can. */ + hamachi_tx(dev); + + if ((hmp->cur_tx - hmp->dirty_tx) < (TX_RING_SIZE - 4)) + clear_bit(0, (void*)&dev->tbusy); /* Typical path */ + else + hmp->tx_full = 1; + dev->trans_start = jiffies; + + if (hamachi_debug > 4) { + printk(KERN_DEBUG "%s: Hamachi transmit frame #%d queued in slot %d.\n", + dev->name, hmp->cur_tx, entry); + } + /* We should kick the bottom half here, since we are not accepting + * interrupts with every packet. i.e. realize that Gigabit ethernet + * can transmit faster than ordinary machines can load packets; + * hence, any packet that got put off because we were in the transmit + * routine should IMMEDIATELY get a chance to be re-queued. -KDU + */ + netif_wake_queue(dev); + return 0; +} + +/* The interrupt handler does all of the Rx thread work and cleans up + after the Tx thread. */ +static void hamachi_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) +{ + struct device *dev = (struct device *)dev_instance; + struct hamachi_private *hmp; + long ioaddr, boguscnt = max_interrupt_work; + +#ifndef final_version /* Can never occur. */ + if (dev == NULL) { + printk (KERN_ERR "hamachi_interrupt(): irq %d for unknown device.\n", irq); + return; + } +#endif + + ioaddr = dev->base_addr; + hmp = (struct hamachi_private *)dev->priv; + if (test_and_set_bit(0, (void*)&hmp->in_interrupt)) { + printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name); + clear_bit(0, (void *)&hmp->in_interrupt); /* Avoid future hang on bug */ + return; + } + + do { + u32 intr_status = readl(ioaddr + InterruptClear); + + if (hamachi_debug > 4) + printk(KERN_DEBUG "%s: Hamachi interrupt, status %4.4x.\n", + dev->name, intr_status); + + if (intr_status == 0) + break; + + if (intr_status & IntrRxDone) + hamachi_rx(dev); + + if (intr_status & IntrTxDone){ + /* This code should RARELY need to execute. After all, this is + * a gigabit link, it should consume packets as fast as we put + * them in AND we clear the Tx ring in hamachi_start_xmit(). + */ + if (hmp->tx_full){ + for (; hmp->cur_tx - hmp->dirty_tx > 0; hmp->dirty_tx++){ + int entry = hmp->dirty_tx % TX_RING_SIZE; + if (hmp->tx_ring[entry].status_n_length & cpu_to_le32(DescOwn)) + break; + /* Free the original skb. */ + if (hmp->tx_skbuff[entry]){ + DEV_FREE_SKB(hmp->tx_skbuff[entry]); + hmp->tx_skbuff[entry] = 0; + } + hmp->tx_ring[entry].status_n_length = 0; + if (entry >= TX_RING_SIZE-1) + hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= + cpu_to_le32(DescEndRing); + hmp->stats.tx_packets++; + } + if (hmp->cur_tx - hmp->dirty_tx < TX_RING_SIZE - 4){ + /* The ring is no longer full, clear tbusy. */ + hmp->tx_full = 0; + if (test_bit(0, (void*)&dev->tbusy)) + clear_bit(0, (void*)&dev->tbusy); + else /* We should NEVER come down this path. */ + printk(KERN_WARNING "tx_full, but not tbusy!\n"); + } + } + netif_wake_queue(dev); + } + + + /* Abnormal error summary/uncommon events handlers. */ + if (intr_status & + (IntrTxPCIFault | IntrTxPCIErr | IntrRxPCIFault | IntrRxPCIErr | + LinkChange | NegotiationChange | StatsMax)) + hamachi_error(dev, intr_status); + + if (--boguscnt < 0) { + printk(KERN_WARNING "%s: Too much work at interrupt, status=0x%4.4x.\n", + dev->name, intr_status); + break; + } + } while (1); + + if (hamachi_debug > 3) + printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n", + dev->name, readl(ioaddr + IntrStatus)); + +#ifndef final_version + /* Code that should never be run! Perhaps remove after testing.. */ + { + static int stopit = 10; + if (dev->start == 0 && --stopit < 0) { + printk(KERN_ERR "%s: Emergency stop, looping startup interrupt.\n", + dev->name); + free_irq(irq, dev); + } + } +#endif + + dev->interrupt = 0; + clear_bit(0, (void*)&hmp->in_interrupt); + return; +} + +#ifdef TX_CHECKSUM +/* + * Copied from eth_type_trans(), with reduced header, since we don't + * get it on RX, only on TX. + */ +static unsigned short hamachi_eth_type_trans(struct sk_buff *skb, + struct device *dev) +{ + struct ethhdr *eth; + unsigned char *rawp; + + skb->mac.raw=skb->data; + skb_pull(skb,dev->hard_header_len-8); /* artificially enlarged on tx */ + eth= skb->mac.ethernet; + + if(*eth->h_dest&1) + { + if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0) + skb->pkt_type=PACKET_BROADCAST; + else + skb->pkt_type=PACKET_MULTICAST; + } + + /* + * This ALLMULTI check should be redundant by 1.4 + * so don't forget to remove it. + * + * Seems, you forgot to remove it. All silly devices + * seems to set IFF_PROMISC. + */ + + else if(dev->flags&(IFF_PROMISC/*|IFF_ALLMULTI*/)) + { + if(memcmp(eth->h_dest,dev->dev_addr, ETH_ALEN)) + skb->pkt_type=PACKET_OTHERHOST; + } + + if (ntohs(eth->h_proto) >= 1536) + return eth->h_proto; + + rawp = skb->data; + + /* + * This is a magic hack to spot IPX packets. Older Novell breaks + * the protocol design and runs IPX over 802.3 without an 802.2 LLC + * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This + * won't work for fault tolerant netware but does for the rest. + */ + if (*(unsigned short *)rawp == 0xFFFF) + return htons(ETH_P_802_3); + + /* + * Real 802.2 LLC + */ + return htons(ETH_P_802_2); +} +#endif /* TX_CHECKSUM */ + +/* This routine is logically part of the interrupt handler, but seperated + for clarity and better register allocation. */ +static int hamachi_rx(struct device *dev) +{ + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + int entry = hmp->cur_rx % RX_RING_SIZE; + int boguscnt = (hmp->dirty_rx + RX_RING_SIZE) - hmp->cur_rx; + + if (hamachi_debug > 4) { + printk(KERN_DEBUG " In hamachi_rx(), entry %d status %4.4x.\n", + entry, hmp->rx_ring[entry].status_n_length); + } + + /* If EOP is set on the next entry, it's a new packet. Send it up. */ + while ( ! (hmp->rx_head_desc->status_n_length & cpu_to_le32(DescOwn))) { + struct hamachi_desc *desc = hmp->rx_head_desc; + u32 desc_status = le32_to_cpu(desc->status_n_length); + u16 data_size = desc_status; /* Implicit truncate */ + u8 *buf_addr = le32desc_to_virt(desc->addr); + s32 frame_status = + le32_to_cpu(get_unaligned((s32*)&(buf_addr[data_size - 12]))); + + if (hamachi_debug > 4) + printk(KERN_DEBUG " hamachi_rx() status was %8.8x.\n", + frame_status); + if (--boguscnt < 0) + break; + if ( ! (desc_status & DescEndPacket)) { + printk(KERN_WARNING "%s: Oversized Ethernet frame spanned " + "multiple buffers, entry %#x length %d status %4.4x!\n", + dev->name, hmp->cur_rx, data_size, desc_status); + printk(KERN_WARNING "%s: Oversized Ethernet frame %p vs %p.\n", + dev->name, desc, &hmp->rx_ring[hmp->cur_rx % RX_RING_SIZE]); + printk(KERN_WARNING "%s: Oversized Ethernet frame -- next status %x/%x last status %x.\n", + dev->name, + hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length & 0xffff0000, + hmp->rx_ring[(hmp->cur_rx+1) % RX_RING_SIZE].status_n_length & 0x0000ffff, + hmp->rx_ring[(hmp->cur_rx-1) % RX_RING_SIZE].status_n_length); + hmp->stats.rx_length_errors++; + } /* else Omit for prototype errata??? */ + if (frame_status & 0x00380000) { + /* There was an error. */ + if (hamachi_debug > 2) + printk(KERN_DEBUG " hamachi_rx() Rx error was %8.8x.\n", + frame_status); + hmp->stats.rx_errors++; + if (frame_status & 0x00600000) hmp->stats.rx_length_errors++; + if (frame_status & 0x00080000) hmp->stats.rx_frame_errors++; + if (frame_status & 0x00100000) hmp->stats.rx_crc_errors++; + if (frame_status < 0) hmp->stats.rx_dropped++; + } else { + struct sk_buff *skb; + /* Omit CRC */ + u16 pkt_len = (frame_status & 0x07ff) - 4; +#ifdef RX_CHECKSUM + u32 pfck = *(u32 *) &buf_addr[data_size - 8]; +#endif + + +#ifndef final_version + if (hamachi_debug > 4) + printk(KERN_DEBUG " hamachi_rx() normal Rx pkt length %d" + " of %d, bogus_cnt %d.\n", + pkt_len, data_size, boguscnt); + if (hamachi_debug > 5) + printk(KERN_DEBUG"%s: rx status %8.8x %8.8x %8.8x %8.8x %8.8x.\n", + dev->name, + *(s32*)&(buf_addr[data_size - 20]), + *(s32*)&(buf_addr[data_size - 16]), + *(s32*)&(buf_addr[data_size - 12]), + *(s32*)&(buf_addr[data_size - 8]), + *(s32*)&(buf_addr[data_size - 4])); +#endif + /* Check if the packet is long enough to accept without copying + to a minimally-sized skbuff. */ + if (pkt_len < rx_copybreak + && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { +#ifdef RX_CHECKSUM + printk(KERN_ERR "%s: rx_copybreak non-zero " + "not good with RX_CHECKSUM\n", dev->name); +#endif + skb->dev = dev; + skb_reserve(skb, 2); /* 16 byte align the IP header */ + /* Call copy + cksum if available. */ +#if 1 || USE_IP_COPYSUM + eth_copy_and_sum(skb, bus_to_virt(desc->addr), pkt_len, 0); + skb_put(skb, pkt_len); +#else + memcpy(skb_put(skb, pkt_len), bus_to_virt(desc->addr),pkt_len); +#endif + } else { + char *temp = skb_put(skb = hmp->rx_skbuff[entry], pkt_len); + hmp->rx_skbuff[entry] = NULL; +#ifndef final_version /* Remove after testing. */ + if (bus_to_virt(desc->addr) != temp) + printk(KERN_ERR "%s: Internal fault: The skbuff addresses " + "do not match in hamachi_rx: %p vs. %p / %p.\n", + dev->name, bus_to_virt(desc->addr), + skb->head, temp); +#endif + } +#ifdef TX_CHECKSUM + /* account for extra TX hard_header bytes */ + skb->protocol = hamachi_eth_type_trans(skb, dev); +#else + skb->protocol = eth_type_trans(skb, dev); +#endif + + +#ifdef RX_CHECKSUM + /* TCP or UDP on ipv4, DIX encoding */ + if (pfck>>24 == 0x91 || pfck>>24 == 0x51) { + struct iphdr *ih = (struct iphdr *) skb->data; + /* Check that IP packet is at least 46 bytes, otherwise, + * there may be pad bytes included in the hardware checksum. + * This wouldn't happen if everyone padded with 0. + */ + if (ntohs(ih->tot_len) >= 46){ + /* don't worry about frags */ + if (!(ih->frag_off & __constant_htons(IP_MF|IP_OFFSET))) { + u32 inv = *(u32 *) &buf_addr[data_size - 16]; + u32 *p = (u32 *) &buf_addr[data_size - 20]; + register u32 crc, p_r, p_r1; + + if (inv & 4) { + inv &= ~4; + --p; + } + p_r = *p; + p_r1 = *(p-1); + switch (inv) { + case 0: + crc = (p_r & 0xffff) + (p_r >> 16); + break; + case 1: + crc = (p_r >> 16) + (p_r & 0xffff) + + (p_r1 >> 16 & 0xff00); + break; + case 2: + crc = p_r + (p_r1 >> 16); + break; + case 3: + crc = p_r + (p_r1 & 0xff00) + (p_r1 >> 16); + break; + default: /*NOTREACHED*/ crc = 0; + } + if (crc & 0xffff0000) { + crc &= 0xffff; + ++crc; + } + /* tcp/udp will add in pseudo */ + skb->csum = ntohs(pfck & 0xffff); + if (skb->csum > crc) + skb->csum -= crc; + else + skb->csum += (~crc & 0xffff); + /* + * could do the pseudo myself and return + * CHECKSUM_UNNECESSARY + */ + skb->ip_summed = CHECKSUM_HW; + } + } + } +#endif /* RX_CHECKSUM */ + + netif_rx(skb); + dev->last_rx = jiffies; + hmp->stats.rx_packets++; + } + entry = (++hmp->cur_rx) % RX_RING_SIZE; + hmp->rx_head_desc = &hmp->rx_ring[entry]; + } + + /* Refill the Rx ring buffers. */ + for (; hmp->cur_rx - hmp->dirty_rx > 0; hmp->dirty_rx++) { + struct sk_buff *skb; + entry = hmp->dirty_rx % RX_RING_SIZE; + if (hmp->rx_skbuff[entry] == NULL) { + skb = dev_alloc_skb(hmp->rx_buf_sz); + hmp->rx_skbuff[entry] = skb; + if (skb == NULL) + break; /* Better luck next round. */ + skb->dev = dev; /* Mark as being used by this device. */ + skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ + hmp->rx_ring[entry].addr = virt_to_desc(skb->tail); + } + hmp->rx_ring[entry].status_n_length = cpu_to_le32(hmp->rx_buf_sz); + if (entry >= RX_RING_SIZE-1) + hmp->rx_ring[entry].status_n_length |= + cpu_to_le32(DescOwn | DescEndPacket | DescEndRing | DescIntr); + else + hmp->rx_ring[entry].status_n_length |= + cpu_to_le32(DescOwn | DescEndPacket | DescIntr); + } + + /* Restart Rx engine if stopped. */ + /* If we don't need to check status, don't. -KDU */ + if (readw(dev->base_addr + RxStatus) & 0x0002) + writew(0x0001, dev->base_addr + RxCmd); + + return 0; +} + +/* This is more properly named "uncommon interrupt events", as it covers more + than just errors. */ +static void hamachi_error(struct device *dev, int intr_status) +{ + long ioaddr = dev->base_addr; + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + + if (intr_status & (LinkChange|NegotiationChange)) { + if (hamachi_debug > 1) + printk(KERN_INFO "%s: Link changed: AutoNegotiation Ctrl" + " %4.4x, Status %4.4x %4.4x Intr status %4.4x.\n", + dev->name, readw(ioaddr + 0x0E0), readw(ioaddr + 0x0E2), + readw(ioaddr + ANLinkPartnerAbility), + readl(ioaddr + IntrStatus)); + if (readw(ioaddr + ANStatus) & 0x20) + writeb(0x01, ioaddr + LEDCtrl); + else + writeb(0x03, ioaddr + LEDCtrl); + } + if (intr_status & StatsMax) { + hamachi_get_stats(dev); + /* Read the overflow bits to clear. */ + readl(ioaddr + 0x370); + readl(ioaddr + 0x3F0); + } + if ((intr_status & ~(LinkChange|StatsMax|NegotiationChange|IntrRxDone|IntrTxDone)) + && hamachi_debug) + printk(KERN_ERR "%s: Something Wicked happened! %4.4x.\n", + dev->name, intr_status); + /* Hmmmmm, it's not clear how to recover from PCI faults. */ + if (intr_status & (IntrTxPCIErr | IntrTxPCIFault)) + hmp->stats.tx_fifo_errors++; + if (intr_status & (IntrRxPCIErr | IntrRxPCIFault)) + hmp->stats.rx_fifo_errors++; +} + +static int hamachi_close(struct device *dev) +{ + long ioaddr = dev->base_addr; + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + int i; + + dev->start = 0; + dev->tbusy = 1; + + if (hamachi_debug > 1) { + printk(KERN_DEBUG "%s: Shutting down ethercard, status was Tx %4.4x Rx %4.4x Int %2.2x.\n", + dev->name, readw(ioaddr + TxStatus), + readw(ioaddr + RxStatus), readl(ioaddr + IntrStatus)); + printk(KERN_DEBUG "%s: Queue pointers were Tx %d / %d, Rx %d / %d.\n", + dev->name, hmp->cur_tx, hmp->dirty_tx, hmp->cur_rx, hmp->dirty_rx); + } + + /* Disable interrupts by clearing the interrupt mask. */ + writel(0x0000, ioaddr + InterruptEnable); + + /* Stop the chip's Tx and Rx processes. */ + writel(2, ioaddr + RxCmd); + writew(2, ioaddr + TxCmd); + + del_timer(&hmp->timer); + +#ifdef __i386__ + if (hamachi_debug > 2) { + printk("\n"KERN_DEBUG" Tx ring at %8.8x:\n", + (int)virt_to_bus(hmp->tx_ring)); + for (i = 0; i < TX_RING_SIZE; i++) + printk(" %c #%d desc. %8.8x %8.8x.\n", + readl(ioaddr + TxCurPtr) == (long)&hmp->tx_ring[i] ? '>' : ' ', + i, hmp->tx_ring[i].status_n_length, hmp->tx_ring[i].addr); + printk("\n"KERN_DEBUG " Rx ring %8.8x:\n", + (int)virt_to_bus(hmp->rx_ring)); + for (i = 0; i < RX_RING_SIZE; i++) { + printk(KERN_DEBUG " %c #%d desc. %4.4x %8.8x\n", + readl(ioaddr + RxCurPtr) == (long)&hmp->rx_ring[i] ? '>' : ' ', + i, hmp->rx_ring[i].status_n_length, hmp->rx_ring[i].addr); + if (hamachi_debug > 6) { + if (*(u8*)bus_to_virt(hmp->rx_ring[i].addr) != 0x69) { + int j; + for (j = 0; j < 0x50; j++) + printk(" %4.4x",((u16*)le32desc_to_virt(hmp->rx_ring[i].addr))[j]); + printk("\n"); + } + } + } + } +#endif /* __i386__ debugging only */ + + free_irq(dev->irq, dev); + + /* Free all the skbuffs in the Rx queue. */ + for (i = 0; i < RX_RING_SIZE; i++) { + hmp->rx_ring[i].status_n_length = 0; + hmp->rx_ring[i].addr = 0xBADF00D0; /* An invalid address. */ + if (hmp->rx_skbuff[i]) { +#if LINUX_VERSION_CODE < 0x20100 + hmp->rx_skbuff[i]->free = 1; +#endif + DEV_FREE_SKB(hmp->rx_skbuff[i]); + } + hmp->rx_skbuff[i] = 0; + } + for (i = 0; i < TX_RING_SIZE; i++) { + if (hmp->tx_skbuff[i]) + DEV_FREE_SKB(hmp->tx_skbuff[i]); + hmp->tx_skbuff[i] = 0; + } + + writeb(0x00, ioaddr + LEDCtrl); + + MOD_DEC_USE_COUNT; + + return 0; +} + +static struct enet_statistics *hamachi_get_stats(struct device *dev) +{ + long ioaddr = dev->base_addr; + struct hamachi_private *hmp = (struct hamachi_private *)dev->priv; + + /* We should lock this segment of code for SMP eventually, although + the vulnerability window is very small and statistics are + non-critical. */ + /* Ok, what goes here? This appears to be stuck at 21 packets + according to ifconfig. It does get incremented in hamachi_tx(), + so I think I'll comment it out here and see if better things + happen. + */ + /* hmp->stats.tx_packets = readl(ioaddr + 0x000); */ + +#if LINUX_VERSION_CODE >= 0x20119 + hmp->stats.rx_bytes = readl(ioaddr + 0x330); /* Total Uni+Brd+Multi */ + hmp->stats.tx_bytes = readl(ioaddr + 0x3B0); /* Total Uni+Brd+Multi */ +#endif + hmp->stats.multicast = readl(ioaddr + 0x320); /* Multicast Rx */ + + hmp->stats.rx_length_errors = readl(ioaddr + 0x368); /* Over+Undersized */ + hmp->stats.rx_over_errors = readl(ioaddr + 0x35C); /* Jabber */ + hmp->stats.rx_crc_errors = readl(ioaddr + 0x360); /* Jabber */ + hmp->stats.rx_frame_errors = readl(ioaddr + 0x364); /* Symbol Errs */ + hmp->stats.rx_missed_errors = readl(ioaddr + 0x36C); /* Dropped */ + + return &hmp->stats; +} + +static void set_rx_mode(struct device *dev) +{ + long ioaddr = dev->base_addr; + + if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ + /* Unconditionally log net taps. */ + printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name); + writew(0x000F, ioaddr + AddrMode); + } else if ((dev->mc_count > 63) || (dev->flags & IFF_ALLMULTI)) { + /* Too many to match, or accept all multicasts. */ + writew(0x000B, ioaddr + AddrMode); + } else if (dev->mc_count > 0) { /* Must use the CAM filter. */ + struct dev_mc_list *mclist; + int i; + for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; + i++, mclist = mclist->next) { + writel(*(u32*)(mclist->dmi_addr), ioaddr + 0x100 + i*8); + writel(0x20000 | (*(u16*)&mclist->dmi_addr[4]), + ioaddr + 0x104 + i*8); + } + /* Clear remaining entries. */ + for (; i < 64; i++) + writel(0, ioaddr + 0x104 + i*8); + writew(0x0003, ioaddr + AddrMode); + } else { /* Normal, unicast/broadcast-only mode. */ + writew(0x0001, ioaddr + AddrMode); + } +} + +#ifdef HAVE_PRIVATE_IOCTL +static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd) +{ + long ioaddr = dev->base_addr; + u16 *data = (u16 *)&rq->ifr_data; + + switch(cmd) { + case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ + data[0] = ((struct hamachi_private *)dev->priv)->phys[0] & 0x1f; + /* Fall Through */ + case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ + data[3] = mdio_read(ioaddr, data[0] & 0x1f, data[1] & 0x1f); + return 0; + case SIOCDEVPRIVATE+2: /* Write the specified MII register */ + /* TODO: Check the sequencing of this. Might need to stop and + * restart Rx and Tx engines. -KDU + */ + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]); + return 0; + case SIOCDEVPRIVATE+3: { /* set rx,tx intr params */ + u32 *d = (u32 *)&rq->ifr_data; + /* Should add this check here or an ordinary user can do nasty + * things. -KDU + * + * TODO: Shut down the Rx and Tx engines while doing this. + */ + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + writel(d[0], dev->base_addr + TxIntrCtrl); + writel(d[1], dev->base_addr + RxIntrCtrl); + printk(KERN_NOTICE "%s: tx %08x, rx %08x intr\n", dev->name, + (u32) readl(dev->base_addr + TxIntrCtrl), + (u32) readl(dev->base_addr + RxIntrCtrl)); + return 0; + } + default: + return -EOPNOTSUPP; + } +} +#endif /* HAVE_PRIVATE_IOCTL */ + + +#ifdef MODULE + +int init_module(void) +{ + return hamachi_probe(0); +} + +void cleanup_module(void) +{ + struct device *next_dev; + + /* No need to check MOD_IN_USE, as sys_delete_module() checks. */ + while (root_hamachi_dev) { + struct hamachi_private *hmp = (void *)(root_hamachi_dev->priv); + unregister_netdev(root_hamachi_dev); + iounmap((char *)root_hamachi_dev->base_addr); + next_dev = hmp->next_module; + if (hmp->priv_addr) + kfree(hmp->priv_addr); + kfree(root_hamachi_dev); + root_hamachi_dev = next_dev; + } +} + +#endif /* MODULE */ + +/* + * Local variables: + * compile-command: "gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c hamachi.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`" + * SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c hamachi.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`" + * c-indent-level: 4 + * c-basic-offset: 4 + * tab-width: 4 + * End: + */ diff -urN v2.2.15/linux/drivers/net/hd64570.h linux/drivers/net/hd64570.h --- v2.2.15/linux/drivers/net/hd64570.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/hd64570.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,230 @@ +#ifndef __HD64570_H +#define __HD64570_H + +/* SCA HD64570 register definitions - all addresses for mode 0 (8086 MPU) + and 1 (64180 MPU). For modes 2 and 3, XOR the address with 0x01. + + Source: HD64570 SCA User's Manual +*/ + + + +/* SCA Control Registers */ +#define LPR 0x00 /* Low Power */ + +/* Wait controller registers */ +#define PABR0 0x02 /* Physical Address Boundary 0 */ +#define PABR1 0x03 /* Physical Address Boundary 1 */ +#define WCRL 0x04 /* Wait Control L */ +#define WCRM 0x05 /* Wait Control M */ +#define WCRH 0x06 /* Wait Control H */ + +#define PCR 0x08 /* DMA Priority Control */ +#define DMER 0x09 /* DMA Master Enable */ + + +/* Interrupt registers */ +#define ISR0 0x10 /* Interrupt Status 0 */ +#define ISR1 0x11 /* Interrupt Status 1 */ +#define ISR2 0x12 /* Interrupt Status 2 */ + +#define IER0 0x14 /* Interrupt Enable 0 */ +#define IER1 0x15 /* Interrupt Enable 1 */ +#define IER2 0x16 /* Interrupt Enable 2 */ + +#define ITCR 0x18 /* Interrupt Control */ +#define IVR 0x1A /* Interrupt Vector */ +#define IMVR 0x1C /* Interrupt Modified Vector */ + + + +/* MSCI channel (port) 0 registers - offset 0x20 + MSCI channel (port) 1 registers - offset 0x40 */ + +#define MSCI0_OFFSET 0x20 +#define MSCI1_OFFSET 0x40 + +#define TRBL 0x00 /* TX/RX buffer L */ +#define TRBH 0x01 /* TX/RX buffer H */ +#define ST0 0x02 /* Status 0 */ +#define ST1 0x03 /* Status 1 */ +#define ST2 0x04 /* Status 2 */ +#define ST3 0x05 /* Status 3 */ +#define FST 0x06 /* Frame Status */ +#define IE0 0x08 /* Interrupt Enable 0 */ +#define IE1 0x09 /* Interrupt Enable 1 */ +#define IE2 0x0A /* Interrupt Enable 2 */ +#define FIE 0x0B /* Frame Interrupt Enable */ +#define CMD 0x0C /* Command */ +#define MD0 0x0E /* Mode 0 */ +#define MD1 0x0F /* Mode 1 */ +#define MD2 0x10 /* Mode 2 */ +#define CTL 0x11 /* Control */ +#define SA0 0x12 /* Sync/Address 0 */ +#define SA1 0x13 /* Sync/Address 1 */ +#define IDL 0x14 /* Idle Pattern */ +#define TMC 0x15 /* Time Constant */ +#define RXS 0x16 /* RX Clock Source */ +#define TXS 0x17 /* TX Clock Source */ +#define TRC0 0x18 /* TX Ready Control 0 */ +#define TRC1 0x19 /* TX Ready Control 1 */ +#define RRC 0x1A /* RX Ready Control */ +#define CST0 0x1C /* Current Status 0 */ +#define CST1 0x1D /* Current Status 1 */ + + +/* Timer channel 0 (port 0 RX) registers - offset 0x60 + Timer channel 1 (port 0 TX) registers - offset 0x68 + Timer channel 2 (port 1 RX) registers - offset 0x70 + Timer channel 3 (port 1 TX) registers - offset 0x78 +*/ + +#define TIMER0RX_OFFSET 0x60 +#define TIMER0TX_OFFSET 0x68 +#define TIMER1RX_OFFSET 0x70 +#define TIMER1TX_OFFSET 0x78 + +#define TCNTL 0x00 /* Up-counter L */ +#define TCNTH 0x01 /* Up-counter H */ +#define TCONRL 0x02 /* Constant L */ +#define TCONRH 0x03 /* Constant H */ +#define TCSR 0x04 /* Control/Status */ +#define TEPR 0x05 /* Expand Prescale */ + + + +/* DMA channel 0 (port 0 RX) registers - offset 0x80 + DMA channel 1 (port 0 TX) registers - offset 0xA0 + DMA channel 2 (port 1 RX) registers - offset 0xC0 + DMA channel 3 (port 1 TX) registers - offset 0xE0 +*/ + +#define DMAC0RX_OFFSET 0x80 +#define DMAC0TX_OFFSET 0xA0 +#define DMAC1RX_OFFSET 0xC0 +#define DMAC1TX_OFFSET 0xE0 + +#define BARL 0x00 /* Buffer Address L (chained block) */ +#define BARH 0x01 /* Buffer Address H (chained block) */ +#define BARB 0x02 /* Buffer Address B (chained block) */ + +#define DARL 0x00 /* RX Destination Addr L (single block) */ +#define DARH 0x01 /* RX Destination Addr H (single block) */ +#define DARB 0x02 /* RX Destination Addr B (single block) */ + +#define SARL 0x04 /* TX Source Address L (single block) */ +#define SARH 0x05 /* TX Source Address H (single block) */ +#define SARB 0x06 /* TX Source Address B (single block) */ + +#define CPB 0x06 /* Chain Pointer Base (chained block) */ + +#define CDAL 0x08 /* Current Descriptor Addr L (chained block) */ +#define CDAH 0x09 /* Current Descriptor Addr H (chained block) */ +#define EDAL 0x0A /* Error Descriptor Addr L (chained block) */ +#define EDAH 0x0B /* Error Descriptor Addr H (chained block) */ +#define BFLL 0x0C /* RX Receive Buffer Length L (chained block)*/ +#define BFLH 0x0D /* RX Receive Buffer Length H (chained block)*/ +#define BCRL 0x0E /* Byte Count L */ +#define BCRH 0x0F /* Byte Count H */ +#define DSR 0x10 /* DMA Status */ +#define DSR_RX(node) (DSR + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) +#define DSR_TX(node) (DSR + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) +#define DMR 0x11 /* DMA Mode */ +#define DMR_RX(node) (DMR + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) +#define DMR_TX(node) (DMR + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) +#define FCT 0x13 /* Frame End Interrupt Counter */ +#define FCT_RX(node) (FCT + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) +#define FCT_TX(node) (FCT + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) +#define DIR 0x14 /* DMA Interrupt Enable */ +#define DIR_RX(node) (DIR + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) +#define DIR_TX(node) (DIR + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) +#define DCR 0x15 /* DMA Command */ +#define DCR_RX(node) (DCR + (node ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)) +#define DCR_TX(node) (DCR + (node ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)) + + + + +/* Descriptor Structure */ + +typedef struct { + u16 cp; /* Chain Pointer */ + u32 bp; /* Buffer Pointer (24 bits) */ + u16 len; /* Data Length */ + u8 stat; /* Status */ + u8 unused2; +}__attribute__ ((packed)) pkt_desc; + + +/* Packet Descriptor Status bits */ + +#define ST_TX_EOM 0x80 /* End of frame */ +#define ST_TX_EOT 0x01 /* End of transmition */ + +#define ST_RX_EOM 0x80 /* End of frame */ +#define ST_RX_SHORT 0x40 /* Short frame */ +#define ST_RX_ABORT 0x20 /* Abort */ +#define ST_RX_RESBIT 0x10 /* Residual bit */ +#define ST_RX_OVERRUN 0x08 /* Overrun */ +#define ST_RX_CRC 0x04 /* CRC */ + +#define DIR_EOTE 0x80 /* Transfer completed */ +#define DIR_EOME 0x40 /* Frame Transfer Completed (chained-block) */ +#define DIR_BOFE 0x20 /* Buffer Overflow/Underflow (chained-block)*/ +#define DIR_COFE 0x10 /* Counter Overflow (chained-block) */ + + +#define DSR_EOT 0x80 /* Transfer completed */ +#define DSR_EOM 0x40 /* Frame Transfer Completed (chained-block) */ +#define DSR_BOF 0x20 /* Buffer Overflow/Underflow (chained-block)*/ +#define DSR_COF 0x10 /* Counter Overflow (chained-block) */ +#define DSR_DE 0x02 /* DMA Enable */ +#define DSR_DWE 0x01 /* DMA Write Disable */ + +/* DMA Master Enable Register (DMER) bits */ +#define DMER_DME 0x80 /* DMA Master Enable */ + + +#define CMD_RESET 0x21 /* Reset Channel */ +#define CMD_TX_ENABLE 0x02 /* Start transmitter */ +#define CMD_RX_ENABLE 0x12 /* Start receiver */ + +#define MD0_HDLC 0x80 /* Bit-sync HDLC mode */ +#define MD0_CRC_ENA 0x04 /* Enable CRC code calculation */ +#define MD0_CRC_CCITT 0x02 /* CCITT CRC instead of CRC-16 */ +#define MD0_CRC_PR1 0x01 /* Initial all-ones instead of all-zeros */ + +#define MD0_CRC_NONE 0x00 +#define MD0_CRC_16_0 0x04 +#define MD0_CRC_16 0x05 +#define MD0_CRC_ITU_0 0x06 +#define MD0_CRC_ITU 0x07 + +#define MD2_NRZI 0x20 /* NRZI mode */ +#define MD2_LOOPBACK 0x03 /* Local data Loopback */ + +#define CTL_RTS 0x01 +#define CTL_IDLE 0x10 /* Transmit an idle pattern */ +#define CTL_UDRNC 0x20 /* Idle after CRC or FCS+flag transmition */ + +#define ST0_TXRDY 0x02 /* TX ready */ +#define ST0_RXRDY 0x01 /* RX ready */ + +#define ST1_UDRN 0x80 /* MSCI TX underrun */ + +#define ST3_CTS 0x08 /* modem input - /CTS */ +#define ST3_DCD 0x04 /* modem input - /DCD */ + +#define IE0_TXINT 0x80 /* TX INT MSCI interrupt enable */ +#define IE1_UDRN 0x80 /* TX underrun MSCI interrupt enable */ + +#define DCR_ABORT 0x01 /* Software abort command */ +#define DCR_CLEAR_EOF 0x02 /* Clear EOF interrupt */ + +/* TX and RX Clock Source - RXS and TXS */ +#define CLK_LINE_RX 0x00 /* TX/RX clock line input */ +#define CLK_LINE_TX 0x00 /* TX/RX line input */ +#define CLK_BRG_RX 0x40 /* internal baud rate generator */ +#define CLK_BRG_TX 0x40 /* internal baud rate generator */ + +#endif diff -urN v2.2.15/linux/drivers/net/hd6457x.c linux/drivers/net/hd6457x.c --- v2.2.15/linux/drivers/net/hd6457x.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/hd6457x.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,785 @@ +/* + * Hitachi SCA HD64570 and HD64572 common driver for Linux + * + * Copyright (C) 1998-2000 Krzysztof Halasa + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Sources of information: + * Hitachi HD64570 SCA User's Manual + * Hitachi HD64572 SCA-II User's Manual + * + * + * Some details: + * dev->tbusy bit 0 is used as hard_start_xmit lock + * bit 1 is a xmit buffer full flag (set by xmit, cleared by intr) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#if (!defined (__HD64570_H) && !defined (__HD64572_H)) || \ + (defined (__HD64570_H) && defined (__HD64572_H)) +#error Either hd64570.h or hd64572.h must be included +#endif + + +static card_t *first_card=NULL; +static card_t **new_card=&first_card; + + +/* Maximum events to handle at each interrupt - should I increase it? */ +#define INTR_WORK 4 + +#define get_msci(port) (phy_node(port) ? MSCI1_OFFSET : MSCI0_OFFSET) +#define get_dmac_rx(port) (phy_node(port) ? DMAC1RX_OFFSET : DMAC0RX_OFFSET) +#define get_dmac_tx(port) (phy_node(port) ? DMAC1TX_OFFSET : DMAC0TX_OFFSET) + +#define SCA_INTR_MSCI(node) (node ? 0x10 : 0x01) +#define SCA_INTR_DMAC_RX(node) (node ? 0x20 : 0x02) +#define SCA_INTR_DMAC_TX(node) (node ? 0x40 : 0x04) + +#ifdef __HD64570_H /* HD64570 */ +#define sca_outa(value, reg, card) sca_outw(value, reg, card) +#define sca_ina(reg, card) sca_inw(reg, card) +#define writea(value, ptr) writew(value, ptr) + +static __inline__ int sca_intr_status(card_t *card) +{ + u8 isr0 = sca_in(ISR0, card); + u8 isr1 = sca_in(ISR1, card); + u8 result = 0; + + if (isr1 & 0x03) result |= SCA_INTR_DMAC_RX(0); + if (isr1 & 0x0C) result |= SCA_INTR_DMAC_TX(0); + if (isr1 & 0x30) result |= SCA_INTR_DMAC_RX(1); + if (isr1 & 0xC0) result |= SCA_INTR_DMAC_TX(1); + if (isr0 & 0x0F) result |= SCA_INTR_MSCI(0); + if (isr0 & 0xF0) result |= SCA_INTR_MSCI(1); + + return result; +} + +#else /* HD64572 */ +#define sca_outa(value, reg, card) sca_outl(value, reg, card) +#define sca_ina(reg, card) sca_inl(reg, card) +#define writea(value, ptr) writel(value, ptr) + + +static __inline__ int sca_intr_status(card_t *card) +{ + u32 isr0 = sca_inl(ISR0, card); + u8 result = 0; + + if (isr0 & 0x0000000F) result |= SCA_INTR_DMAC_RX(0); + if (isr0 & 0x000000F0) result |= SCA_INTR_DMAC_TX(0); + if (isr0 & 0x00000F00) result |= SCA_INTR_DMAC_RX(1); + if (isr0 & 0x0000F000) result |= SCA_INTR_DMAC_TX(1); + if (isr0 & 0x003E0000) result |= SCA_INTR_MSCI(0); + if (isr0 & 0x3E000000) result |= SCA_INTR_MSCI(1); + + return result; +} + +#endif /* HD64570 vs HD64572 */ + + + + +static __inline__ port_t* hdlc_to_port(hdlc_device *hdlc) +{ + return (port_t*)hdlc; +} + + + +static __inline__ port_t* dev_to_port(struct device *dev) +{ + return hdlc_to_port(dev_to_hdlc(dev)); +} + + + +static __inline__ u8 next_desc(port_t *port, u8 desc) +{ + return (desc+1) % port_to_card(port)->ring_buffers; +} + + + +static __inline__ u16 desc_offset(port_t *port, u8 desc, u8 transmit) +{ + /* Descriptor offset always fits in 16 bytes */ + u8 buffs=port_to_card(port)->ring_buffers; + return ((log_node(port) * 2 + transmit) * buffs + (desc % buffs)) * + sizeof(pkt_desc); +} + + + +static __inline__ pkt_desc* desc_address(port_t *port, u8 desc, u8 transmit) +{ +#ifdef PAGE0_ALWAYS_MAPPED + return (pkt_desc*)(win0base(port_to_card(port)) + + desc_offset(port, desc, transmit)); +#else + return (pkt_desc*)(winbase(port_to_card(port)) + + desc_offset(port, desc, transmit)); +#endif +} + + + +static __inline__ u32 buffer_offset(port_t *port, u8 desc, u8 transmit) +{ + u8 buffs=port_to_card(port)->ring_buffers; + return port_to_card(port)->buff_offset + + ((log_node(port) * 2 + transmit) * buffs + (desc % buffs)) * + (u32)HDLC_MAX_MTU; +} + + + +static void sca_create_rings(port_t *port) +{ + card_t *card=port_to_card(port); + u8 transmit, i; + u16 dmac, buffs=card->ring_buffers; + +#if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED) + openwin(card, 0); +#endif + + for (transmit=0; transmit<2; transmit++) { + for (i = 0; icp); + writel(buff_off, &desc->bp); + writew(0, &desc->len); + writeb(0, &desc->stat); + } + + dmac = transmit ? get_dmac_tx(port) : get_dmac_rx(port); + /* DMA disable - to halt state */ + sca_out(0, transmit ? DSR_TX(phy_node(port)) : + DSR_RX(phy_node(port)), card); + /* software ABORT - to initial state */ + sca_out(DCR_ABORT, transmit ? DCR_TX(phy_node(port)) : + DCR_RX(phy_node(port)), card); + +#ifdef __HD64570_H + sca_out(0, dmac+CPB, card); /* pointer base */ +#endif + /* current desc addr */ + sca_outa(desc_offset(port, 0, transmit), dmac+CDAL, card); + if (!transmit) + sca_outa(desc_offset(port, buffs-1, transmit), + dmac+EDAL, card); + else + sca_outa(desc_offset(port, 0, transmit), dmac+EDAL, + card); + + /* clear frame end interrupt counter */ + sca_out(DCR_CLEAR_EOF, transmit ? DCR_TX(phy_node(port)) : + DCR_RX(phy_node(port)), card); + + if (!transmit) { /* Receive */ + /* set buffer length */ + sca_outw(HDLC_MAX_MTU, dmac+BFLL, card); + /* Chain mode, Multi-frame */ + sca_out(0x14, DMR_RX(phy_node(port)), card); + sca_out(DIR_EOME|DIR_BOFE, DIR_RX(phy_node(port)), + card); + /* DMA enable */ + sca_out(DSR_DE, DSR_RX(phy_node(port)), card); + } else { /* Transmit */ + /* Chain mode, Multi-frame */ + sca_out(0x14, DMR_TX(phy_node(port)), card); + /* enable underflow interrupts */ + sca_out(DIR_BOFE, DIR_TX(phy_node(port)), card); + } + } +} + + + +static void sca_init_sync_port(port_t *port) +{ + port->rxin = 0; + port->txin = 0; + port->txlast = 0; + sca_create_rings(port); +} + + + +/* MSCI interrupt service */ +static void sca_msci_intr(port_t *port) +{ + u16 msci=get_msci(port); + card_t* card=port_to_card(port); + u8 stat = sca_in(msci+ST1, card); /* read MSCI ST1 status */ + + /* printk(KERN_DEBUG "MSCI INT: ST1=%02X ILAR=%02X\n", + stat, sca_in(ILAR, card)); */ + + /* Reset MSCI TX underrun status bit */ + sca_out(stat & ST1_UDRN, msci+ST1, card); + + if (stat & ST1_UDRN) { + port->hdlc.stats.tx_errors++; /* TX Underrun error detected */ + port->hdlc.stats.tx_fifo_errors++; + } +} + + + +/* Receive DMA interrupt service */ +static void sca_rx_intr(port_t *port) +{ + u16 dmac = get_dmac_rx(port); + card_t *card = port_to_card(port); + u8 stat = sca_in(DSR_RX(phy_node(port)), card); /* read DMA Status */ + + /* Reset DSR status bits */ + sca_out((stat&(DSR_EOT|DSR_EOM|DSR_BOF|DSR_COF)) | DSR_DWE, + DSR_RX(phy_node(port)), card); + + if (stat & DSR_BOF) { + port->hdlc.stats.rx_errors++; /* Dropped one or more frames */ + port->hdlc.stats.rx_over_errors++; + } + + while (1) { + u32 desc_off = desc_offset(port, port->rxin, 0); + pkt_desc *desc; + u32 cda=sca_ina(dmac+CDAL, card); + + if (cda == desc_off) + break; /* No frame received */ + +#ifdef __HD64572_H + if (cda == desc_off + 8) + break; /* SCA-II updates CDA in 2 steps */ +#endif + + desc = desc_address(port, port->rxin, 0); + stat = readb(&desc->stat); + if (stat & ST_RX_OVERRUN) { + port->hdlc.stats.rx_errors++; + port->hdlc.stats.rx_fifo_errors++; + } else if (stat & ST_RX_CRC) { + port->hdlc.stats.rx_errors++; + port->hdlc.stats.rx_crc_errors++; + } else if ((stat & (ST_RX_SHORT|ST_RX_ABORT|ST_RX_RESBIT)) || + !(stat & (ST_RX_EOM))) { + port->hdlc.stats.rx_errors++; /* Malformed frame */ + port->hdlc.stats.rx_frame_errors++; + } else { + u16 len = readw(&desc->len); + struct sk_buff *skb = dev_alloc_skb(len); + if (!skb) + port->hdlc.stats.rx_dropped++; + else { +#ifdef DEBUG_PKT + int i; +#endif + u32 buff = buffer_offset(port, port->rxin, 0); +#ifndef ALL_PAGES_ALWAYS_MAPPED + u32 maxlen; + u8 page = buff / winsize(card); + buff = buff % winsize(card); + maxlen = winsize(card) - buff; + + openwin(card, page); + + if (len > maxlen) { + memcpy_fromio(skb->data, + winbase(card) + buff, + maxlen); + openwin(card, page+1); + memcpy_fromio(skb->data + maxlen, + winbase(card), + len - maxlen); + } else +#endif + memcpy_fromio(skb->data, + winbase(card) + buff, + len); + +#if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED) + /* select pkt_desc table page back */ + openwin(card, 0); +#endif + skb_put(skb, len); + +#ifdef DEBUG_PKT + printk(KERN_DEBUG "%s RX:", port->hdlc.name); + for (i=920; ilen; i++) + printk(" %02X", skb->data[i]); + printk("\n"); +#endif + + hdlc_netif_rx(&port->hdlc, skb, 0); + } + } + + /* Set new error descriptor address */ + sca_outa(desc_off, dmac+EDAL, card); + port->rxin = next_desc(port, port->rxin); + } + + /* make sure RX DMA is enabled */ + sca_out(DSR_DE, DSR_RX(phy_node(port)), card); +} + + + +/* Transmit DMA interrupt service */ +static void sca_tx_intr(port_t *port) +{ + u16 dmac = get_dmac_tx(port); + card_t* card=port_to_card(port); + u8 stat = sca_in(DSR_TX(phy_node(port)), card); /* read DMA Status */ + + /* Reset DSR status bits */ + sca_out((stat&(DSR_EOT|DSR_EOM|DSR_BOF|DSR_COF)) | DSR_DWE, + DSR_TX(phy_node(port)), card); + + while (1) { + u32 desc_off = desc_offset(port, port->txlast, 1); + pkt_desc *desc; + u16 len; + + if (sca_ina(dmac+CDAL, card) == desc_off) + break; /* Transmitter is/will_be sending this frame */ + + desc = desc_address(port, port->txlast, 1); + len=readw(&desc->len); + + port->hdlc.stats.tx_packets++; + port->hdlc.stats.tx_bytes+=len; + writeb(0, &desc->stat); /* Free descriptor */ + + port->txlast = (port->txlast + 1) % + port_to_card(port)->ring_buffers; + } + + if (test_and_clear_bit(1, &(hdlc_to_dev(&port->hdlc)->tbusy))) + mark_bh(NET_BH); /* Tell upper layers */ +} + + + +static void sca_intr(int irq, void* dev_id, struct pt_regs *regs) +{ + card_t *card=dev_id; + int boguscnt = INTR_WORK; + int i; + u8 stat; + +#ifndef ALL_PAGES_ALWAYS_MAPPED + u8 page = get_page(card); +#endif + + while((stat = sca_intr_status(card)) != 0) { + for (i=0; i<2; i++) { + port_t *port=get_port(card, i); + if (port) { + if (stat & SCA_INTR_MSCI(i)) + sca_msci_intr(port); + + if (stat & SCA_INTR_DMAC_RX(i)) + sca_rx_intr(port); + + if (stat & SCA_INTR_DMAC_TX(i)) + sca_tx_intr(port); + } + + if (--boguscnt < 0) { + printk(KERN_ERR "%s: too much work at " + "interrupt\n", port->hdlc.name); + goto exit; + } + } + } + + exit: +#ifndef ALL_PAGES_ALWAYS_MAPPED + openwin(card, page); /* Restore original page */ +#endif +} + + + +static inline void sca_set_loopback(port_t *port, int loopback) +{ + card_t* card=port_to_card(port); + u8 msci = get_msci(port); + u8 md2 = sca_in(msci+MD2, card); + + if (loopback) + md2 |= MD2_LOOPBACK; + else + md2 &= ~MD2_LOOPBACK; + + sca_out(md2, msci+MD2, card); + port->loopback = loopback; +} + + + +static int sca_set_clock(port_t *port, int clock) +{ + card_t *card=port_to_card(port); + u8 msci=get_msci(port); + + u8 result=set_clock(port, clock); /* Card-dependent settings */ + if (result) + return result; + + if (port->clkmode != LINE_EXT_CLOCK) { + unsigned int tmc, br=10, brv=1024; + + do { + br--; + brv>>=1; /* brv=2^9=512 max in specs */ + + /* Baud Rate = CLOCK_BASE / TMC / 2^BR */ + tmc=CLOCK_BASE / (brv*port->clkmode); + }while(br>1 && tmc<=128); /* Try lower br for better accuracy*/ + + if (tmc<1) { + tmc=1; + br=0; /* For baud=CLOCK_BASE we use tmc=1 br=0 */ + brv=1; + } + else if (tmc>255) + tmc=256; /* tmc=0 means 256 - low baud rates */ + + port->clkmode=CLOCK_BASE/(brv*tmc); + printk(KERN_INFO "%s: using internal clock %u. br=%d, " + "tmc=%d\n", port->hdlc.name, port->clkmode, br, tmc); + + /* baud divisor - time constant*/ +#ifdef __HD64570_H + sca_out(tmc, msci+TMC, card); +#else + sca_out(tmc, msci+TMCR, card); + sca_out(tmc, msci+TMCT, card); +#endif + sca_out(CLK_BRG_RX|br, msci+RXS, card); /* BRG output */ + sca_out(CLK_BRG_TX|br, msci+TXS, card); /* BRG output */ + } else { +#ifdef __HD64570_H + sca_out(1, msci+TMC, card); +#else + sca_out(1, msci+TMCR, card); + sca_out(1, msci+TMCT, card); +#endif + sca_out(CLK_LINE_RX, msci+RXS, card); /* RXC - line input */ + sca_out(CLK_LINE_TX, msci+TXS, card); /* TXC input */ + } + + return 0; +} + + + +static void sca_set_hdlc_mode(port_t *port, u8 idle, u8 crc, u8 nrzi) +{ + card_t* card=port_to_card(port); + u8 msci = get_msci(port); + u8 md2 = (nrzi ? MD2_NRZI : 0) | (port->loopback ? MD2_LOOPBACK : 0); + u8 ctl = (idle ? CTL_IDLE : 0); +#ifdef __HD64572_H + ctl |= CTL_URCT | CTL_URSKP; /* Skip the rest of underrun frame */ +#endif + + sca_out(CMD_RESET, msci+CMD, card); + sca_out(MD0_HDLC|crc, msci+MD0, card); + sca_out(0x00, msci+MD1, card); /* no address field check */ + sca_out(md2, msci+MD2, card); + sca_out(0x7E, msci+IDL, card); /* flag character 0x7E */ + sca_out(ctl, msci+CTL, card); + +#ifdef __HD64570_H + /* Allow at least 8 bytes before requesting RX DMA operation */ + /* TX with higher priority and possibly with shorter transfers */ + sca_out(0x07, msci+RRC, card); /* +1=RXRDY/DMA activation condition */ + sca_out(0x10, msci+TRC0, card); /* = TXRDY/DMA activation condition */ + sca_out(0x14, msci+TRC1, card); /* +1=TXRDY/DMA deactiv condition */ +#else + sca_out(0x0F, msci+RNR, card); /* +1=RX DMA activation condition */ + /* Setting than to larger value may cause Illegal Access */ + sca_out(0x20, msci+TNR0, card); /* =TX DMA activation condition */ + sca_out(0x30, msci+TNR1, card); /* +1=TX DMA deactivation condition */ + sca_out(0x04, msci+TCR, card); /* =Critical TX DMA activ condition */ +#endif + + sca_set_clock(port, port->clkmode); + open_port(port); + +#ifdef __HD64570_H + /* MSCI TX INT IRQ enable */ + sca_out(IE0_TXINT, msci+IE0, card); + sca_out(IE1_UDRN, msci+IE1, card); /* TX underrun IRQ */ + sca_out(sca_in(IER0, card) | (phy_node(port) ? 0x80 : 0x08), + IER0, card); + /* DMA IRQ enable */ + sca_out(sca_in(IER1, card) | (phy_node(port) ? 0xF0 : 0x0F), + IER1, card); +#else + /* MSCI TX INT and underrrun IRQ enable */ + sca_outl(IE0_TXINT|IE0_UDRN, msci+IE0, card); + /* DMA & MSCI IRQ enable */ + sca_outl(sca_in(IER0, card) | + (phy_node(port) ? 0x02006600 : 0x00020066), IER0, card); +#endif + + sca_out(CMD_TX_ENABLE, msci+CMD, card); + sca_out(CMD_RX_ENABLE, msci+CMD, card); +} + + + +static int sca_ioctl(hdlc_device *hdlc, struct ifreq *ifr, int cmd) +{ + int value; + port_t *port=hdlc_to_port(hdlc); +#ifdef DEBUG_RINGS + card_t *card=port_to_card(port); + u16 cnt; +#if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED) + u8 page; +#endif +#endif + + if(!capable(CAP_NET_ADMIN)) + return -EPERM; + + switch(cmd) { + case HDLCSETLINE: + value = ifr->ifr_ifru.ifru_ivalue; + switch (value) { + case LINE_LOOPBACK: + sca_set_loopback(port, 1); + return 0; + + case LINE_NOLOOPBACK: + sca_set_loopback(port, 0); + return 0; + + default: + if (value == LINE_EXT_CLOCK || value >= LINE_MIN_CLOCK) + return sca_set_clock(port, value); + } + return select_phys_iface(port, value); /* Last resort */ + +#ifdef DEBUG_RINGS + default: +#if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED) + page=get_page(card); + openwin(card, 0); +#endif + + printk(KERN_ERR "RX ring: CDA=%u EDA=%u DSR=%02X in=%u " + "%sactive", + sca_ina(get_dmac_rx(port)+CDAL, card), + sca_ina(get_dmac_rx(port)+EDAL, card), + sca_in(DSR_RX(phy_node(port)), card), + port->rxin, + sca_in(DSR_RX(phy_node(port)), card) & DSR_DE?"":"in"); + for (cnt=0; cntring_buffers; cnt++) + printk(" %02X", + readb(&(desc_address(port, cnt, 0)->stat))); + + printk("\n" KERN_ERR "TX ring: CDA=%u EDA=%u DSR=%02X in=%u " + "last=%u %sactive", + sca_ina(get_dmac_tx(port)+CDAL, card), + sca_ina(get_dmac_tx(port)+EDAL, card), + sca_in(DSR_TX(phy_node(port)), card), port->txin, + port->txlast, + sca_in(DSR_TX(phy_node(port)), card) & DSR_DE?"":"in"); + + for (cnt=0; cntring_buffers; cnt++) + printk(" %02X", + readb(&(desc_address(port, cnt, 1)->stat))); + printk("\n"); + + printk(KERN_ERR "MSCI: MD: %02x %02x %02x, " + "ST: %02x %02x %02x %02x" +#ifdef __HD64572_H + " %02x" +#endif + ", FST: %02x CST: %02x %02x\n", + sca_in(get_msci(port)+MD0, card), + sca_in(get_msci(port)+MD1, card), + sca_in(get_msci(port)+MD2, card), + sca_in(get_msci(port)+ST0, card), + sca_in(get_msci(port)+ST1, card), + sca_in(get_msci(port)+ST2, card), + sca_in(get_msci(port)+ST3, card), +#ifdef __HD64572_H + sca_in(get_msci(port)+ST4, card), +#endif + sca_in(get_msci(port)+FST, card), + sca_in(get_msci(port)+CST0, card), + sca_in(get_msci(port)+CST1, card)); + +#ifdef __HD64572_H + printk(KERN_ERR "ILAR: %02x\n", sca_in(ILAR, card)); +#endif + +#if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED) + openwin(card, page); /* Restore original page */ +#endif + return 0; +#endif /* DEBUG_RINGS */ + } + return -EINVAL; +} + + + +static int sca_open(hdlc_device *hdlc) +{ + port_t *port=hdlc_to_port(hdlc); + + MOD_INC_USE_COUNT; + sca_set_hdlc_mode(port, 1, MD0_CRC_ITU, 0); + return 0; +} + + +static void sca_close(hdlc_device *hdlc) +{ + port_t *port=hdlc_to_port(hdlc); + + /* reset channel */ + sca_out(CMD_RESET, get_msci(port) + CMD, port_to_card(port)); + close_port(port); + MOD_DEC_USE_COUNT; +} + + + +static int sca_xmit(struct sk_buff *skb, struct device *dev) +{ + port_t *port = dev_to_port(dev); + card_t *card = port_to_card(port); + pkt_desc *desc; + u32 buff, len; +#ifndef ALL_PAGES_ALWAYS_MAPPED + u8 page; + u32 maxlen; +#endif + +#ifdef DEBUG_PKT + int i; +#endif + + /* We assume SCA/SCA-II never hangs */ + if (test_bit(1, &dev->tbusy)) /* Transmitter buffer still full */ + return 1; + + /* Block a transmit from overlapping. + Would waiting on semaphore here be more effective? */ + if (test_and_set_bit(0, &dev->tbusy)) + return 1; + + desc = desc_address(port, port->txin+1, 1); + if (readb(&desc->stat)) { /* allow 1 packet gap */ +#ifdef DEBUG_PKT + printk(KERN_DEBUG "%s: transmitter buffer full\n", dev->name); +#endif + set_bit(1, &dev->tbusy); /* Transmitter buffer full */ + clear_bit(0, &dev->tbusy); /* no hard_start_xmit running */ + return 1; /* request packet to be queued */ + } + +#ifdef DEBUG_PKT + printk(KERN_DEBUG "%s TX:", dev->name); + for (i=0; ilen; i++) + printk(" %02X", skb->data[i]); + printk("\n"); +#endif + + desc = desc_address(port, port->txin, 1); + buff = buffer_offset(port, port->txin, 1); + len = skb->len; +#ifndef ALL_PAGES_ALWAYS_MAPPED + page = buff / winsize(card); + buff = buff % winsize(card); + maxlen = winsize(card) - buff; + + openwin(card, page); + if (len > maxlen) { + memcpy_toio(winbase(card) + buff, skb->data, maxlen); + openwin(card, page+1); + memcpy_toio(winbase(card), skb->data + maxlen, len - maxlen); + } + else +#endif + memcpy_toio(winbase(card) + buff, skb->data, len); + +#if !defined(PAGE0_ALWAYS_MAPPED) && !defined(ALL_PAGES_ALWAYS_MAPPED) + openwin(card, 0); /* select pkt_desc table page back */ +#endif + writew(len, &desc->len); + writeb(ST_TX_EOM, &desc->stat); + + port->txin = next_desc(port, port->txin); + sca_outa(desc_offset(port, port->txin, 1), + get_dmac_tx(port)+EDAL, card); + + sca_out(DSR_DE, DSR_TX(phy_node(port)), card); /* Enable TX DMA */ + clear_bit(0, &dev->tbusy); /* no hard_start_xmit running */ + + dev_kfree_skb(skb); + return 0; +} + + +static void sca_init(card_t *card, int wait_states) +{ + sca_out(wait_states, WCRL, card); /* Wait Control */ + sca_out(wait_states, WCRM, card); + sca_out(wait_states, WCRH, card); + + sca_out(0, DMER, card); /* DMA Master disable */ + sca_out(0x03, PCR, card); /* DMA priority */ + sca_out(0, IER1, card); /* DMA interrupt disable */ + sca_out(0, DSR_RX(0), card); /* DMA disable - to halt state */ + sca_out(0, DSR_TX(0), card); + sca_out(0, DSR_RX(1), card); + sca_out(0, DSR_TX(1), card); + sca_out(DMER_DME, DMER, card); /* DMA Master enable */ +} diff -urN v2.2.15/linux/drivers/net/hdlc.c linux/drivers/net/hdlc.c --- v2.2.15/linux/drivers/net/hdlc.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/hdlc.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,1276 @@ +/* + * Generic HDLC support routines for Linux + * + * Copyright (C) 1999, 2000 Krzysztof Halasa + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Current status: + * - this is work in progress + * - not heavily tested on SMP + * - currently supported: + * * raw IP-in-HDLC + * * Cisco HDLC + * * Frame Relay with ANSI or CCITT LMI (both user and network side) + * * PPP (using syncppp.c) + * + * Use sethdlc utility to set line parameters, protocol and PVCs + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "syncppp.h" +#include + +/* #define DEBUG_PKT */ +/* #define DEBUG_HARD_HEADER */ + +#ifndef MODULE +static int version_printed=0; +#endif +static const char* version = "HDLC support routines revision: 1.0-pre9"; + + +#define CISCO_MULTICAST 0x8f /* Cisco multicast address */ +#define CISCO_UNICAST 0x0f /* Cisco unicast address */ +#define CISCO_KEEPALIVE 0x8035 /* Cisco keepalive protocol */ +#define CISCO_ADDR_REQ 0 /* Cisco address request */ +#define CISCO_ADDR_REPLY 1 /* Cisco address reply */ +#define CISCO_KEEPALIVE_REQ 2 /* Cisco keepalive request */ + +static int hdlc_ioctl(struct device *dev, struct ifreq *ifr, int cmd); + +/******************************************************** + * + * Cisco HDLC support + * + *******************************************************/ + +static int cisco_hard_header(struct sk_buff *skb, struct device *dev, u16 type, + void *daddr, void *saddr, unsigned int len) +{ + hdlc_header *data; +#ifdef DEBUG_HARD_HEADER + printk(KERN_DEBUG "%s: cisco_hard_header called\n", dev->name); +#endif + + skb_push(skb, sizeof(hdlc_header)); + data=(hdlc_header*)skb->data; + data->address = CISCO_MULTICAST; + data->control = 0; + data->protocol = htons(type); + + return sizeof(hdlc_header); +} + + + +static void cisco_keepalive_send(hdlc_device *hdlc, u32 type, + u32 par1, u32 par2) +{ + struct sk_buff *skb; + cisco_packet *data; + + skb=dev_alloc_skb(sizeof(hdlc_header)+sizeof(cisco_packet)); + skb_reserve(skb, 4); + cisco_hard_header(skb, hdlc_to_dev(hdlc), CISCO_KEEPALIVE, + NULL, NULL, 0); + data=(cisco_packet*)skb->tail; + + data->type = htonl(type); + data->par1 = htonl(par1); + data->par2 = htonl(par2); + data->rel = 0xFFFF; + data->time = htonl(jiffies * 1000/HZ); + + skb_put(skb, sizeof(cisco_packet)); + skb->priority=TC_PRIO_CONTROL; + skb->dev = hdlc_to_dev(hdlc); + + dev_queue_xmit(skb); +} + + + +static void cisco_netif(hdlc_device *hdlc, struct sk_buff *skb) +{ + hdlc_header *data = (hdlc_header*)skb->data; + cisco_packet *cisco_data; + if (skb->lenaddress != CISCO_MULTICAST && + data->address != CISCO_UNICAST) + goto rx_error; + + skb_pull(skb, sizeof(hdlc_header)); + + switch(ntohs(data->protocol)) { +#ifdef CONFIG_INET + case ETH_P_IP: +#endif +#ifdef CONFIG_IPX + case ETH_P_IPX: +#endif +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + case ETH_P_IPV6: +#endif +#if defined(CONFIG_INET) || defined(CONFIG_IPX) || \ + defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + hdlc->stats.rx_packets++; /* data traffic */ + hdlc->stats.rx_bytes+=skb->len; + skb->protocol=data->protocol; + skb->dev=hdlc_to_dev(hdlc); + netif_rx(skb); + return; +#endif + + case CISCO_KEEPALIVE: + if (skb->len != sizeof(cisco_packet)) { + printk(KERN_INFO "%s: Invalid length of Cisco " + "control packet\n", hdlc->name); + goto rx_error; + } + + cisco_data=(cisco_packet*)skb->data; + + switch(ntohl (cisco_data->type)) { + case CISCO_ADDR_REQ: { /* Stolen from syncppp.c :-) */ + struct in_device *in_dev=hdlc_to_dev(hdlc)->ip_ptr; + u32 addr = 0, mask = ~0; /* is the mask correct? */ + + if (in_dev != NULL) { + struct in_ifaddr **ifap=&in_dev->ifa_list; + + while (*ifap != NULL) { + if (strcmp(hdlc_to_dev(hdlc)->name, + (*ifap)->ifa_label) == 0) { + addr = (*ifap)->ifa_local; + mask = (*ifap)->ifa_mask; + break; + } + ifap=&(*ifap)->ifa_next; + } + + hdlc->stats.rx_bytes+=skb->len; + hdlc->stats.rx_packets++; + cisco_keepalive_send(hdlc, CISCO_ADDR_REPLY, + addr, mask); + return; + } + } + + case CISCO_ADDR_REPLY: + printk(KERN_INFO "%s: Unexpected Cisco IP address " + "reply\n", hdlc->name); + goto rx_error; + + case CISCO_KEEPALIVE_REQ: + hdlc->lmi.rxseq = ntohl(cisco_data->par1); + if (hdlc->lmi.rxseq == hdlc->lmi.txseq) { + hdlc->lmi.last_poll = jiffies; + if (!(hdlc->lmi.state & LINK_STATE_RELIABLE)) + printk(KERN_INFO "%s: Link up\n", + hdlc->name); + hdlc->lmi.state |= LINK_STATE_RELIABLE; + } + + hdlc->stats.rx_bytes+=skb->len; + hdlc->stats.rx_packets++; + dev_kfree_skb(skb); + return; + } /* switch(keepalive type) */ + } /* switch(protocol) */ + + printk(KERN_INFO "%s: Unusupported protocol %x\n", hdlc->name, + data->protocol); + hdlc->stats.rx_bytes+=skb->len; + hdlc->stats.rx_packets++; + dev_kfree_skb(skb); + return; + + rx_error: + hdlc->stats.rx_errors++; /* Mark error */ + dev_kfree_skb(skb); +} + + + +static void cisco_timer(unsigned long arg) +{ + hdlc_device *hdlc=(hdlc_device*)arg; + + if ((hdlc->lmi.state & LINK_STATE_RELIABLE) && + (jiffies - hdlc->lmi.last_poll >= hdlc->lmi.T392 * HZ)) { + hdlc->lmi.state &= ~LINK_STATE_RELIABLE; + printk(KERN_INFO "%s: Link down\n", hdlc->name); + } + + cisco_keepalive_send(hdlc, CISCO_KEEPALIVE_REQ, ++hdlc->lmi.txseq, + hdlc->lmi.rxseq); + hdlc->timer.expires = jiffies + hdlc->lmi.T391*HZ; + + hdlc->timer.function = cisco_timer; + hdlc->timer.data = arg; + add_timer(&hdlc->timer); +} + + + +/****************************************************************** + * + * generic Frame Relay routines + * + *****************************************************************/ + + +static int fr_hard_header(struct sk_buff *skb, struct device *dev, u16 type, + void *daddr, void *saddr, unsigned int len) +{ + u16 head_len; + + if (!daddr) + daddr=dev->broadcast; + +#ifdef DEBUG_HARD_HEADER + printk(KERN_DEBUG "%s: fr_hard_header called\n", dev->name); +#endif + + switch(type) { + case ETH_P_IP: + head_len=4; + skb_push(skb, head_len); + skb->data[3] = NLPID_IP; + break; + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + case ETH_P_IPV6: + head_len=4; + skb_push(skb, head_len); + skb->data[3] = NLPID_IPV6; + break; +#endif + + case LMI_PROTO: + head_len=4; + skb_push(skb, head_len); + skb->data[3] = LMI_PROTO; + break; + + default: + head_len=10; + skb_push(skb, head_len); + skb->data[3] = FR_PAD; + skb->data[4] = NLPID_SNAP; + skb->data[5] = FR_PAD; + skb->data[6] = FR_PAD; + skb->data[7] = FR_PAD; + skb->data[8] = type>>8; + skb->data[9] = (u8)type; + } + + memcpy(skb->data, daddr, 2); + skb->data[2] = FR_UI; + + return head_len; +} + + + +static inline void fr_log_dlci_active(pvc_device *pvc) +{ + printk(KERN_INFO "%s: %sactive%s\n", pvc->name, + pvc->state & PVC_STATE_ACTIVE ? "" : "in", + pvc->state & PVC_STATE_NEW ? " new" : ""); +} + + + +static inline u8 fr_lmi_nextseq(u8 x) +{ + x++; + return x ? x : 1; +} + + + +static void fr_lmi_send(hdlc_device *hdlc, int fullrep) +{ + struct sk_buff *skb; + pvc_device *pvc=hdlc->first_pvc; + int len = mode_is(hdlc, MODE_FR_ANSI) ? LMI_ANSI_LENGTH : LMI_LENGTH; + int stat_len = 3; + u8 *data; + int i=0; + + if (mode_is(hdlc, MODE_DCE) && fullrep) { + len += hdlc->pvc_count * (2 + stat_len); + if (len>HDLC_MAX_MTU) { + printk(KERN_WARNING "%s: Too many PVCs while sending " + "LMI full report\n", hdlc->name); + return; + } + } + + skb=dev_alloc_skb(len); + memset(skb->data, 0, len); + skb_reserve(skb, 4); + fr_hard_header(skb, hdlc_to_dev(hdlc), LMI_PROTO, NULL, NULL, 0); + data=skb->tail; + data[i++] = LMI_CALLREF; + data[i++] = mode_is(hdlc, MODE_DCE) ? LMI_STATUS : LMI_STATUS_ENQUIRY; + if (mode_is(hdlc, MODE_FR_ANSI)) + data[i++] = LMI_ANSI_LOCKSHIFT; + data[i++] = mode_is(hdlc, MODE_FR_CCITT) ? LMI_CCITT_REPTYPE : + LMI_REPTYPE; + data[i++] = LMI_REPT_LEN; + data[i++] = fullrep ? LMI_FULLREP : LMI_INTEGRITY; + + data[i++] = mode_is(hdlc, MODE_FR_CCITT) ? LMI_CCITT_ALIVE : LMI_ALIVE; + data[i++] = LMI_INTEG_LEN; + data[i++] = hdlc->lmi.txseq = fr_lmi_nextseq(hdlc->lmi.txseq); + data[i++] = hdlc->lmi.rxseq; + + if (mode_is(hdlc, MODE_DCE) && fullrep) { + while (pvc) { + data[i++] = mode_is(hdlc, MODE_FR_CCITT) ? + LMI_CCITT_PVCSTAT:LMI_PVCSTAT; + data[i++] = stat_len; + + if ((hdlc->lmi.state & LINK_STATE_RELIABLE) && + (pvc->netdev.flags & IFF_UP) && + !(pvc->state & (PVC_STATE_ACTIVE|PVC_STATE_NEW))) { + pvc->state |= PVC_STATE_NEW; + fr_log_dlci_active(pvc); + } + + dlci_to_status(hdlc, netdev_dlci(&pvc->netdev), + data+i, pvc->state); + i+=stat_len; + pvc=pvc->next; + } + } + + skb_put(skb, i); + skb->priority=TC_PRIO_CONTROL; + skb->dev = hdlc_to_dev(hdlc); + + dev_queue_xmit(skb); +} + + + +static void fr_timer(unsigned long arg) +{ + hdlc_device *hdlc=(hdlc_device*)arg; + int i, cnt=0, reliable; + u32 list; + + if (mode_is(hdlc, MODE_DCE)) + reliable = (jiffies - hdlc->lmi.last_poll < hdlc->lmi.T392*HZ); + else { + hdlc->lmi.last_errors <<= 1; /* Shift the list */ + if (hdlc->lmi.state & LINK_STATE_REQUEST) { + printk(KERN_INFO "%s: No LMI status reply received\n", + hdlc->name); + hdlc->lmi.last_errors |= 1; + } + + for (i=0, list=hdlc->lmi.last_errors; ilmi.N393; + i++, list>>=1) + cnt += (list & 1); /* errors count */ + + reliable = (cnt < hdlc->lmi.N392); + } + + if ((hdlc->lmi.state & LINK_STATE_RELIABLE) != + (reliable ? LINK_STATE_RELIABLE : 0)) { + pvc_device *pvc=hdlc->first_pvc; + + while (pvc) {/* Deactivate all PVCs */ + pvc->state &= ~(PVC_STATE_NEW | PVC_STATE_ACTIVE); + pvc=pvc->next; + } + + hdlc->lmi.state ^= LINK_STATE_RELIABLE; + printk(KERN_INFO "%s: Link %sreliable\n", hdlc->name, + reliable ? "" : "un"); + + if (reliable) { + hdlc->lmi.N391cnt=0; /* Request full status */ + hdlc->lmi.state |= LINK_STATE_CHANGED; + } + } + + if (mode_is(hdlc, MODE_DCE)) + hdlc->timer.expires = jiffies + hdlc->lmi.T392*HZ; + else { + if (hdlc->lmi.N391cnt) + hdlc->lmi.N391cnt--; + + fr_lmi_send(hdlc, hdlc->lmi.N391cnt == 0); + + hdlc->lmi.state |= LINK_STATE_REQUEST; + hdlc->timer.expires = jiffies + hdlc->lmi.T391*HZ; + } + + hdlc->timer.function = fr_timer; + hdlc->timer.data = arg; + add_timer(&hdlc->timer); +} + + + +static int fr_lmi_recv(hdlc_device *hdlc, struct sk_buff *skb) +{ + int stat_len; + pvc_device *pvc; + int reptype=-1, error; + u8 rxseq, txseq; + int i; + + if (skb->len < (mode_is(hdlc, MODE_FR_ANSI) ? + LMI_ANSI_LENGTH : LMI_LENGTH)) { + printk(KERN_INFO "%s: Short LMI frame\n", hdlc->name); + return 1; + } + + if (skb->data[5] != (!mode_is(hdlc, MODE_DCE) ? + LMI_STATUS : LMI_STATUS_ENQUIRY)) { + printk(KERN_INFO "%s: LMI msgtype=%x, Not LMI status %s\n", + hdlc->name, skb->data[2], + mode_is(hdlc, MODE_DCE) ? "enquiry" : "reply"); + return 1; + } + + i = mode_is(hdlc, MODE_FR_ANSI) ? 7 : 6; + + if (skb->data[i] != + (mode_is(hdlc, MODE_FR_CCITT) ? LMI_CCITT_REPTYPE : LMI_REPTYPE)) { + printk(KERN_INFO "%s: Not a report type=%x\n", hdlc->name, + skb->data[i]); + return 1; + } + i++; + + i++; /* Skip length field */ + + reptype=skb->data[i++]; + + if (skb->data[i]!= + (mode_is(hdlc, MODE_FR_CCITT) ? LMI_CCITT_ALIVE : LMI_ALIVE)) { + printk(KERN_INFO "%s: Unsupported status element=%x\n", + hdlc->name, skb->data[i]); + return 1; + } + i++; + + i++; /* Skip length field */ + + hdlc->lmi.rxseq = skb->data[i++]; /* TX sequence from peer */ + rxseq = skb->data[i++]; /* Should confirm our sequence */ + + txseq = hdlc->lmi.txseq; + + if (mode_is(hdlc, MODE_DCE)) { + if (reptype != LMI_FULLREP && reptype != LMI_INTEGRITY) { + printk(KERN_INFO "%s: Unsupported report type=%x\n", + hdlc->name, reptype); + return 1; + } + } + + error=0; + if (!(hdlc->lmi.state & LINK_STATE_RELIABLE)) + error=1; + + if (rxseq == 0 || rxseq != txseq) { + hdlc->lmi.N391cnt=0; /* Ask for full report next time */ + error=1; + } + + if (mode_is(hdlc, MODE_DCE)) { + if ((hdlc->lmi.state & LINK_STATE_FULLREP_SENT) && !error) { +/* Stop sending full report - the last one has been confirmed by DTE */ + hdlc->lmi.state &= ~LINK_STATE_FULLREP_SENT; + pvc=hdlc->first_pvc; + while (pvc) { + if (pvc->state & PVC_STATE_NEW) { + pvc->state &= ~PVC_STATE_NEW; + pvc->state |= PVC_STATE_ACTIVE; + fr_log_dlci_active(pvc); + +/* Tell DTE that new PVC is now active */ + hdlc->lmi.state |= LINK_STATE_CHANGED; + } + pvc=pvc->next; + } + } + + if (hdlc->lmi.state & LINK_STATE_CHANGED) { + reptype = LMI_FULLREP; + hdlc->lmi.state |= LINK_STATE_FULLREP_SENT; + hdlc->lmi.state &= ~LINK_STATE_CHANGED; + } + + fr_lmi_send(hdlc, reptype == LMI_FULLREP ? 1 : 0); + return 0; + } + + /* DTE */ + + if (reptype != LMI_FULLREP || error) + return 0; + + stat_len = 3; + pvc=hdlc->first_pvc; + + while (pvc) { + pvc->newstate = 0; + pvc=pvc->next; + } + + while (skb->len >= i + 2 + stat_len) { + u16 dlci; + u8 state=0; + + if (skb->data[i] != (mode_is(hdlc, MODE_FR_CCITT) ? + LMI_CCITT_PVCSTAT : LMI_PVCSTAT)) { + printk(KERN_WARNING "%s: Invalid PVCSTAT ID: %x\n", + hdlc->name, skb->data[i]); + return 1; + } + i++; + + if (skb->data[i] != stat_len) { + printk(KERN_WARNING "%s: Invalid PVCSTAT length: %x\n", + hdlc->name, skb->data[i]); + return 1; + } + i++; + + dlci=status_to_dlci(hdlc, skb->data+i, &state); + pvc=find_pvc(hdlc, dlci); + + if (pvc) + pvc->newstate = state; + else if (state == PVC_STATE_NEW) + printk(KERN_INFO "%s: new PVC available, DLCI=%u\n", + hdlc->name, dlci); + + i+=stat_len; + } + + pvc=hdlc->first_pvc; + + while (pvc) { + if (pvc->newstate == PVC_STATE_NEW) + pvc->newstate = PVC_STATE_ACTIVE; + + pvc->newstate |= (pvc->state & + ~(PVC_STATE_NEW|PVC_STATE_ACTIVE)); + if (pvc->state != pvc->newstate) { + pvc->state=pvc->newstate; + fr_log_dlci_active(pvc); + } + pvc=pvc->next; + } + + /* Next full report after N391 polls */ + hdlc->lmi.N391cnt = hdlc->lmi.N391; + + return 0; +} + + + +static void fr_netif(hdlc_device *hdlc, struct sk_buff *skb) +{ + fr_hdr *fh = (fr_hdr*)skb->data; + u8 *data = skb->data; + u16 dlci; + pvc_device *pvc; + + if (skb->len<4 || fh->ea1 || data[2] != FR_UI) + goto rx_error; + + dlci = q922_to_dlci(skb->data); + + if (dlci == LMI_DLCI) { + if (data[3] == LMI_PROTO) { + if (fr_lmi_recv(hdlc, skb)) + goto rx_error; + else { + /* No request pending */ + hdlc->lmi.state &= ~LINK_STATE_REQUEST; + hdlc->lmi.last_poll = jiffies; + hdlc->stats.rx_bytes+=skb->len; + hdlc->stats.rx_packets++; + dev_kfree_skb(skb); + return; + } + } + + printk(KERN_INFO "%s: Received non-LMI frame with LMI DLCI\n", + hdlc->name); + goto rx_error; + } + + pvc=find_pvc(hdlc, dlci); + if (!pvc) { +#ifdef DEBUG_PKT + printk(KERN_INFO "%s: No PVC for received frame's DLCI %d\n", + hdlc->name, dlci); +#endif + goto rx_error; + } + + if ((pvc->netdev.flags & IFF_UP)==0) { +#ifdef DEBUG_PKT + printk(KERN_INFO "%s: PVC for received frame's DLCI %d is down\n", + hdlc->name, dlci); +#endif + goto rx_error; + } + + hdlc->stats.rx_packets++; /* PVC traffic */ + hdlc->stats.rx_bytes+=skb->len; + pvc->stats.rx_packets++; + pvc->stats.rx_bytes+=skb->len; + + if ((pvc->state & PVC_STATE_FECN) != (fh->fecn ? PVC_STATE_FECN : 0)) { + printk(KERN_INFO "%s: FECN O%s\n", pvc->name, + fh->fecn ? "N" : "FF"); + pvc->state ^= PVC_STATE_FECN; + } + + if ((pvc->state & PVC_STATE_BECN) != (fh->becn ? PVC_STATE_BECN : 0)) { + printk(KERN_INFO "%s: BECN O%s\n", pvc->name, fh->becn ? "N" : "FF"); + pvc->state ^= PVC_STATE_BECN; + } + + + if (data[3]==NLPID_IP) { + skb_pull(skb, 4); /* Remove 4-byte header (hdr, UI, NLPID) */ + skb->protocol=htons(ETH_P_IP); + skb->dev=&pvc->netdev; + netif_rx(skb); + return; + } + + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + if (data[3]==NLPID_IPV6) { + skb_pull(skb, 4); /* Remove 4-byte header (hdr, UI, NLPID) */ + skb->protocol=htons(ETH_P_IPV6); + skb->dev=&pvc->netdev; + netif_rx(skb); + return; + } +#endif + + if (data[3]==FR_PAD && data[4]==NLPID_SNAP && data[5]==FR_PAD && + data[6]==FR_PAD && data[7]==FR_PAD && + ((data[8]<<8) | data[9]) == ETH_P_ARP) { + skb_pull(skb, 10); + skb->protocol=htons(ETH_P_ARP); + skb->dev=&pvc->netdev; + netif_rx(skb); + return; + } + + printk(KERN_INFO "%s: Unusupported protocol %x\n", + hdlc->name, data[3]); + dev_kfree_skb(skb); + return; + + rx_error: + hdlc->stats.rx_errors++; /* Mark error */ + dev_kfree_skb(skb); +} + + + +static void fr_cisco_open(hdlc_device *hdlc) +{ + hdlc->lmi.state = LINK_STATE_CHANGED; + hdlc->lmi.txseq = hdlc->lmi.rxseq = 0; + hdlc->lmi.last_errors = 0xFFFFFFFF; + hdlc->lmi.N391cnt = 0; + + if (mode_is(hdlc, MODE_CISCO)) + hdlc_to_dev(hdlc)->hard_header=cisco_hard_header; + else + hdlc_to_dev(hdlc)->hard_header=fr_hard_header; + + init_timer(&hdlc->timer); + hdlc->timer.expires = jiffies + HZ; /* First poll after 1 second */ + hdlc->timer.function = mode_is(hdlc, MODE_FR) ? fr_timer : cisco_timer; + hdlc->timer.data = (unsigned long)hdlc; + add_timer(&hdlc->timer); +} + + + +static void fr_cisco_close(hdlc_device *hdlc) +{ + pvc_device *pvc=hdlc->first_pvc; + + del_timer(&hdlc->timer); + + while(pvc) /* NULL in Cisco mode */ { + dev_close(&pvc->netdev); /* Shutdown all PVCs for this FRAD */ + pvc=pvc->next; + } +} + + + +/****************************************************************** + * + * generic HDLC routines + * + *****************************************************************/ + + + +static int hdlc_change_mtu(struct device *dev, int new_mtu) +{ + if ((new_mtu < 68) || (new_mtu > HDLC_MAX_MTU)) + return -EINVAL; + dev->mtu = new_mtu; + return 0; +} + + + +/******************************************************** + * + * PVC device routines + * + *******************************************************/ + +static int pvc_open(struct device *dev) +{ + pvc_device *pvc=dev_to_pvc(dev); + int result=0; + + if ((hdlc_to_dev(pvc->master)->flags & IFF_UP) == 0) + return -EIO; /* Master must be UP in order to activate PVC */ + + memset(&(pvc->stats), 0, sizeof(struct net_device_stats)); + pvc->state=0; + + if (!mode_is(pvc->master, MODE_SOFT) && pvc->master->open_pvc) + result=pvc->master->open_pvc(pvc); + if (result) + return result; + + pvc->master->lmi.state |= LINK_STATE_CHANGED; + return 0; +} + + + +static int pvc_close(struct device *dev) +{ + pvc_device *pvc=dev_to_pvc(dev); + pvc->state=0; + + if (!mode_is(pvc->master, MODE_SOFT) && pvc->master->close_pvc) + pvc->master->close_pvc(pvc); + + pvc->master->lmi.state |= LINK_STATE_CHANGED; + return 0; +} + + + +static int pvc_xmit(struct sk_buff *skb, struct device *dev) +{ + pvc_device *pvc=dev_to_pvc(dev); + + if (pvc->state & PVC_STATE_ACTIVE) { + skb->dev = hdlc_to_dev(pvc->master); + pvc->stats.tx_bytes+=skb->len; + pvc->stats.tx_packets++; + dev_queue_xmit(skb); + } else { + pvc->stats.tx_dropped++; + dev_kfree_skb(skb); + } + + return 0; +} + + + +static struct net_device_stats *pvc_get_stats(struct device *dev) +{ + pvc_device *pvc=dev_to_pvc(dev); + return &pvc->stats; +} + + + +static int pvc_change_mtu(struct device *dev, int new_mtu) +{ + if ((new_mtu < 68) || (new_mtu > PVC_MAX_MTU)) + return -EINVAL; + dev->mtu = new_mtu; + return 0; +} + + + +static void destroy_pvc_list(hdlc_device *hdlc) +{ + pvc_device *pvc=hdlc->first_pvc; + while(pvc) { + pvc_device *next=pvc->next; + unregister_netdevice(&pvc->netdev); + kfree(pvc); + pvc=next; + } + + hdlc->first_pvc=NULL; /* All PVCs destroyed */ + hdlc->pvc_count=0; + hdlc->lmi.state |= LINK_STATE_CHANGED; +} + + + +/******************************************************** + * + * HDLC device routines + * + *******************************************************/ + +static int hdlc_open(struct device *dev) +{ + hdlc_device *hdlc=dev_to_hdlc(dev); + int result; + + if (hdlc->mode==MODE_NONE) + return -ENOSYS; + + result=hdlc->open(hdlc); + if (result) + return result; + + memset(&(hdlc->stats), 0, sizeof(struct net_device_stats)); + + if (mode_is(hdlc, MODE_FR | MODE_SOFT) || + mode_is(hdlc, MODE_CISCO | MODE_SOFT)) + fr_cisco_open(hdlc); + + else if (mode_is(hdlc, MODE_PPP | MODE_SOFT)) { + sppp_attach(&hdlc->pppdev); + /* sppp_attach nukes them. We don't need syncppp's ioctl */ + /* Anyway, I'm going to replace it with ppp_synctty.c */ + dev->do_ioctl = hdlc_ioctl; + hdlc->pppdev.sppp.pp_flags&=~PP_CISCO; + dev->type=ARPHRD_PPP; + sppp_open(dev); + } + + return 0; +} + + + +static int hdlc_close(struct device *dev) +{ + hdlc_device *hdlc=dev_to_hdlc(dev); + + if (mode_is(hdlc, MODE_FR | MODE_SOFT) || + mode_is(hdlc, MODE_CISCO | MODE_SOFT)) + fr_cisco_close(hdlc); + + else if (mode_is(hdlc, MODE_PPP | MODE_SOFT)) { + sppp_close(dev); + sppp_detach(dev); + dev->rebuild_header=NULL; + dev->change_mtu=hdlc_change_mtu; + dev->mtu=HDLC_MAX_MTU; + dev->hard_header_len=16; + } + + hdlc->close(hdlc); + return 0; +} + + + +void hdlc_netif_rx(hdlc_device *hdlc, struct sk_buff *skb, int dlci) +{ + skb->mac.raw=skb->data; + + if (mode_is(hdlc, MODE_SOFT)) { + if (mode_is(hdlc, MODE_FR)) { + fr_netif(hdlc, skb); + return; + } else if (mode_is(hdlc, MODE_CISCO)) { + cisco_netif(hdlc, skb); + return; + } else if (mode_is(hdlc, MODE_PPP)) { + hdlc->stats.rx_bytes+=skb->len; + hdlc->stats.rx_packets++; + skb->protocol=htons(ETH_P_WAN_PPP); + skb->dev=hdlc_to_dev(hdlc); + netif_rx(skb); + return; + } + } else { /* protocol support in hardware/firmware */ + hdlc->stats.rx_bytes+=skb->len; + hdlc->stats.rx_packets++; + + if (mode_is(hdlc, MODE_HDLC)) + skb->protocol=htons(ETH_P_IP); + /* otherwise protocol set by hw driver */ + + if (mode_is(hdlc, MODE_FR)) { + pvc_device *pvc=find_pvc(hdlc, dlci); + if (!pvc) { /* packet from nonexistent PVC */ + hdlc->stats.rx_errors++; + dev_kfree_skb(skb); + } + + pvc->stats.rx_bytes+=skb->len; + pvc->stats.rx_packets++; + skb->dev=&pvc->netdev; + } else + skb->dev=hdlc_to_dev(hdlc); + + netif_rx(skb); + return; + } + + hdlc->stats.rx_errors++; /* unsupported mode */ + dev_kfree_skb(skb); +} + + + +static struct net_device_stats *hdlc_get_stats(struct device *dev) +{ + return &dev_to_hdlc(dev)->stats; +} + + + +static int hdlc_set_mode(hdlc_device *hdlc, int mode) +{ + int result=-1; /* Default to soft modes */ + + if(!capable(CAP_NET_ADMIN)) + return -EPERM; + + if(hdlc_to_dev(hdlc)->flags & IFF_UP) + return -EBUSY; + + hdlc_to_dev(hdlc)->addr_len=0; + hdlc->mode=MODE_NONE; + + if (!(mode & MODE_SOFT)) + switch(mode) { + case MODE_HDLC: + result = hdlc->set_mode ? + hdlc->set_mode(hdlc, MODE_HDLC) : 0; + break; + + case MODE_X25: /* By card */ + case MODE_CISCO: + case MODE_PPP: + case MODE_FR_ANSI: + case MODE_FR_CCITT: + case MODE_FR_ANSI | MODE_DCE: + case MODE_FR_CCITT | MODE_DCE: + result = hdlc->set_mode ? + hdlc->set_mode(hdlc, mode) : -ENOSYS; + break; + + default: + return -EINVAL; + } + + if (result) { + mode |= MODE_SOFT; /* Try "host software" protocol */ + + switch(mode & ~MODE_SOFT) { + case MODE_CISCO: + result = hdlc->set_mode ? + hdlc->set_mode(hdlc, MODE_HDLC) : 0; + break; + + case MODE_PPP: + result = hdlc->set_mode ? + hdlc->set_mode(hdlc, MODE_HDLC) : 0; + break; + + case MODE_FR_ANSI: + case MODE_FR_CCITT: + case MODE_FR_ANSI | MODE_DCE: + case MODE_FR_CCITT | MODE_DCE: + hdlc_to_dev(hdlc)->addr_len=2; + *(u16*)hdlc_to_dev(hdlc)->dev_addr=htons(LMI_DLCI); + dlci_to_q922(hdlc_to_dev(hdlc)->broadcast, LMI_DLCI); + result = hdlc->set_mode ? + hdlc->set_mode(hdlc, MODE_HDLC) : 0; + break; + + default: + return -EINVAL; + } + } + + if (result) + return result; + + hdlc->mode=mode; + if (mode_is(hdlc, MODE_PPP)) + hdlc_to_dev(hdlc)->type=ARPHRD_PPP; + else if (mode_is(hdlc, MODE_FR)) + hdlc_to_dev(hdlc)->type=ARPHRD_FRAD; + else /* Conflict - raw HDLC and Cisco */ + hdlc_to_dev(hdlc)->type=ARPHRD_HDLC; + + memset(&(hdlc->stats), 0, sizeof(struct net_device_stats)); + destroy_pvc_list(hdlc); + return 0; +} + + + +static int hdlc_fr_pvc(hdlc_device *hdlc, int dlci) +{ + pvc_device **pvc_p=&hdlc->first_pvc; + pvc_device *pvc; + int result, create=1; /* Create or delete PVC */ + + if(!capable(CAP_NET_ADMIN)) + return -EPERM; + + if(dlci<0) { + dlci=-dlci; + create=0; + } + + if(dlci<=0 || dlci>=1024) + return -EINVAL; /* Only 10 bits for DLCI, DLCI=0 is reserved */ + + if(!mode_is(hdlc, MODE_FR)) + return -EINVAL; /* Only meaningfull on FR */ + + while(*pvc_p) { + if (netdev_dlci(&(*pvc_p)->netdev)==dlci) + break; + pvc_p=&(*pvc_p)->next; + } + + if (create) { /* Create PVC */ + if (*pvc_p!=NULL) + return -EEXIST; + + *pvc_p=kmalloc(sizeof(pvc_device), GFP_KERNEL); + pvc=*pvc_p; + memset(pvc, 0, sizeof(pvc_device)); + + pvc->netdev.name=pvc->name; + pvc->netdev.hard_start_xmit=pvc_xmit; + pvc->netdev.get_stats=pvc_get_stats; + pvc->netdev.open=pvc_open; + pvc->netdev.stop=pvc_close; + pvc->netdev.change_mtu=pvc_change_mtu; + pvc->netdev.mtu=PVC_MAX_MTU; + + pvc->netdev.type=ARPHRD_DLCI; + pvc->netdev.hard_header_len=16; + pvc->netdev.hard_header=fr_hard_header; + pvc->netdev.tx_queue_len=0; + pvc->netdev.flags=IFF_POINTOPOINT; + + dev_init_buffers(&pvc->netdev); + + pvc->master=hdlc; + *(u16*)pvc->netdev.dev_addr=htons(dlci); + dlci_to_q922(pvc->netdev.broadcast, dlci); + pvc->netdev.addr_len=2; /* 16 bits is enough */ + pvc->netdev.irq=hdlc_to_dev(hdlc)->irq; + + result=dev_alloc_name(&pvc->netdev, "pvc%d"); + if (result<0) { + kfree(pvc); + *pvc_p=NULL; + return result; + } + + if (register_netdevice(&pvc->netdev)!=0) { + kfree(pvc); + *pvc_p=NULL; + return -EIO; + } + + if (!mode_is(hdlc, MODE_SOFT) && hdlc->create_pvc) { + result=hdlc->create_pvc(pvc); + if (result) { + unregister_netdevice(&pvc->netdev); + kfree(pvc); + *pvc_p=NULL; + return result; + } + } + + hdlc->lmi.state |= LINK_STATE_CHANGED; + hdlc->pvc_count++; + return 0; + } + + if (*pvc_p==NULL) /* Delete PVC */ + return -ENOENT; + + pvc=*pvc_p; + + if (pvc->netdev.flags & IFF_UP) + return -EBUSY; /* PVC in use */ + + if (!mode_is(hdlc, MODE_SOFT) && hdlc->destroy_pvc) + hdlc->destroy_pvc(pvc); + + hdlc->lmi.state |= LINK_STATE_CHANGED; + hdlc->pvc_count--; + *pvc_p=pvc->next; + unregister_netdevice(&pvc->netdev); + kfree(pvc); + return 0; +} + + + +static int hdlc_ioctl(struct device *dev, struct ifreq *ifr, int cmd) +{ + hdlc_device *hdlc=dev_to_hdlc(dev); + + switch(cmd) { + case HDLCSETMODE: + return hdlc_set_mode(hdlc, ifr->ifr_ifru.ifru_ivalue); + + case HDLCPVC: + return hdlc_fr_pvc(hdlc, ifr->ifr_ifru.ifru_ivalue); + + default: + if (hdlc->ioctl!=NULL) + return hdlc->ioctl(hdlc, ifr, cmd); + } + + return -EINVAL; +} + + + +static int hdlc_init(struct device *dev) +{ + hdlc_device *hdlc=dev_to_hdlc(dev); + + memset(&(hdlc->stats), 0, sizeof(struct net_device_stats)); + + dev->get_stats=hdlc_get_stats; + dev->open=hdlc_open; + dev->stop=hdlc_close; + dev->do_ioctl=hdlc_ioctl; + dev->change_mtu=hdlc_change_mtu; + dev->mtu=HDLC_MAX_MTU; + + dev->type=ARPHRD_HDLC; + dev->hard_header_len=16; + + dev->flags=IFF_POINTOPOINT | IFF_NOARP; + + dev_init_buffers(dev); + return 0; +} + + + +int register_hdlc_device(hdlc_device *hdlc) +{ + int result; + +#ifndef MODULE + if (!version_printed) { + printk(KERN_INFO "%s\n", version); + version_printed = 1; + } +#endif + + hdlc_to_dev(hdlc)->name = hdlc->name; + hdlc_to_dev(hdlc)->init = hdlc_init; + hdlc_to_dev(hdlc)->priv = &hdlc->syncppp_ptr; /* remove in 2.3 */ + hdlc->syncppp_ptr = &hdlc->pppdev; + hdlc->pppdev.dev=hdlc_to_dev(hdlc); + hdlc->mode = MODE_NONE; + hdlc->lmi.T391 = 10; /* polling verification timer */ + hdlc->lmi.T392 = 15; /* link integrity verification polling timer */ + hdlc->lmi.N391 = 6; /* full status polling counter */ + hdlc->lmi.N392 = 3; /* error threshold */ + hdlc->lmi.N393 = 4; /* monitored events count */ + + result=dev_alloc_name(hdlc_to_dev(hdlc), "hdlc%d"); + if (result<0) + return result; + + if (register_netdevice(hdlc_to_dev(hdlc))!=0) { + hdlc_to_dev(hdlc)->name=NULL; /* non-NULL means registered */ + return -EIO; + } + + dev_init_buffers(hdlc_to_dev(hdlc)); + MOD_INC_USE_COUNT; + return 0; +} + + + +void unregister_hdlc_device(hdlc_device *hdlc) +{ + if (hdlc_to_dev(hdlc)->name==NULL) + return; /* device not registered */ + + destroy_pvc_list(hdlc); + unregister_netdevice(hdlc_to_dev(hdlc)); + MOD_DEC_USE_COUNT; +} + + + +#ifdef MODULE + +MODULE_AUTHOR("Krzysztof Halasa "); +MODULE_DESCRIPTION("HDLC support module"); + +int init_module(void) +{ + printk(KERN_INFO "%s\n", version); + return 0; +} + + + +void cleanup_module(void) +{ +} + +#endif diff -urN v2.2.15/linux/drivers/net/hostess_sv11.c linux/drivers/net/hostess_sv11.c --- v2.2.15/linux/drivers/net/hostess_sv11.c Mon Aug 9 12:04:39 1999 +++ linux/drivers/net/hostess_sv11.c Wed Jun 7 14:26:43 2000 @@ -41,6 +41,7 @@ struct sv11_device { + void *if_ptr; /* General purpose pointer (used by SPPP) */ struct z8530_dev sync; struct ppp_device netdev; char name[16]; @@ -240,6 +241,11 @@ goto fail3; memset(sv, 0, sizeof(*sv)); + sv->if_ptr=&sv->netdev; + + sv->netdev.dev=(struct device *)kmalloc(sizeof(struct device), GFP_KERNEL); + if(!sv->netdev.dev) + goto fail2; dev=&sv->sync; @@ -264,12 +270,12 @@ if(request_irq(irq, &z8530_interrupt, SA_INTERRUPT, "Hostess SV/11", dev)<0) { printk(KERN_WARNING "hostess: IRQ %d already in use.\n", irq); - goto fail2; + goto fail1; } dev->irq=irq; dev->chanA.private=sv; - dev->chanA.netdevice=&sv->netdev.dev; + dev->chanA.netdevice=sv->netdev.dev; dev->chanA.dev=dev; dev->chanB.dev=dev; dev->name=sv->name; @@ -374,6 +380,8 @@ free_dma(dev->chanA.txdma); fail: free_irq(irq, dev); +fail1: + kfree(sv->netdev.dev); fail2: kfree(sv); fail3: @@ -383,9 +391,9 @@ static void sv11_shutdown(struct sv11_device *dev) { - sppp_detach(&dev->netdev.dev); + sppp_detach(dev->netdev.dev); z8530_shutdown(&dev->sync); - unregister_netdev(&dev->netdev.dev); + unregister_netdev(dev->netdev.dev); free_irq(dev->sync.irq, dev); if(dma) { diff -urN v2.2.15/linux/drivers/net/ibmtr.c linux/drivers/net/ibmtr.c --- v2.2.15/linux/drivers/net/ibmtr.c Tue Oct 26 17:53:40 1999 +++ linux/drivers/net/ibmtr.c Wed Jun 7 14:26:43 2000 @@ -83,6 +83,11 @@ * Changes by Jochen Friedrich to enable RFC1469 Option 2 multicasting * i.e. using functional address C0 00 00 04 00 00 to transmit and * receive multicast packets. + * + * Changes by Mike Sullivan (based on original sram patch by Dave Grothe + * to support windowing into on adapter shared ram. + * i.e. Use LANAID to setup a PnP configuration with 16K RAM. Paging + * will shift this 16K window over the entire available shared RAM. */ /* change the define of IBMTR_DEBUG_MESSAGES to a nonzero value @@ -102,7 +107,8 @@ #define NO_AUTODETECT 1 #undef NO_AUTODETECT -#undef ENABLE_PAGING +//#undef ENABLE_PAGING +#define ENABLE_PAGING 1 #define FALSE 0 @@ -119,7 +125,8 @@ static char *version = "ibmtr.c: v1.3.57 8/ 7/94 Peter De Schrijver and Mark Swanson\n" " v2.1.125 10/20/98 Paul Norton \n" -" v2.2.0 12/30/98 Joel Sloan \n"; +" v2.2.0 12/30/98 Joel Sloan \n" +" v2.2.1 02/08/00 Mike Sullivan \n"; static char pcchannelid[] = { 0x05, 0x00, 0x04, 0x09, @@ -582,7 +589,7 @@ ti->mapped_ram_size = ti->avail_shared_ram; } else { #ifdef ENABLE_PAGING - unsigned char pg_size; + unsigned char pg_size=0; #endif #if !TR_NEWFORMAT @@ -602,15 +609,16 @@ pg_size=64; /* 32KB page size */ break; case 0xc: - ti->page_mask=(ti->mapped_ram_size==32) ? 0xc0 : 0; - ti->page_mask=(ti->mapped_ram_size==64) ? 0x80 : 0; - DPRINTK("Dual size shared RAM page (code=0xC), don't support it!\n"); - /* nb/dwm: I did this because RRR (3,2) bits are documented as - R/O and I can't find how to select which page size - Also, the above conditional statement sequence is invalid - as page_mask will always be set by the second stmt */ - kfree_s(ti, sizeof(struct tok_info)); - return -ENODEV; + switch (ti->mapped_ram_size) { + case 32: + ti->page_mask=0xc0; + pg_size=32; + break; + case 64: + ti->page_mask=0x80; + pg_size=64; + break; + } break; default: DPRINTK("Unknown shared ram paging info %01X\n",ti->shared_ram_paging); @@ -618,16 +626,23 @@ return -ENODEV; break; } + + if (ibmtr_debug_trace & TRC_INIT) + DPRINTK("Shared RAM paging code: " + "%02X mapped RAM size: %dK shared RAM size: %dK page mask: %0xX\n:", + ti->shared_ram_paging, ti->mapped_ram_size/2, ti->avail_shared_ram/2, ti->page_mask); + if (ti->page_mask) { if (pg_size > ti->mapped_ram_size) { DPRINTK("Page size (%d) > mapped ram window (%d), can't page.\n", - pg_size, ti->mapped_ram_size); + pg_size/2, ti->mapped_ram_size/2); ti->page_mask = 0; /* reset paging */ - } else { - ti->mapped_ram_size=ti->avail_shared_ram; - DPRINTK("Shared RAM paging enabled. Page size : %uK\n", - ((ti->page_mask^ 0xff)+1)>>2); } + } else if (pg_size > ti->mapped_ram_size) { + DPRINTK("Page size (%d) > mapped ram window (%d), can't page.\n", + pg_size/2, ti->mapped_ram_size/2); + } + #endif } /* finish figuring the shared RAM address */ @@ -685,9 +700,17 @@ DPRINTK("Hardware address : %02X:%02X:%02X:%02X:%02X:%02X\n", dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); + if (ti->page_mask) + DPRINTK("Shared RAM paging enabled. Page size: %uK Shared Ram size %dK\n", + ((ti->page_mask ^ 0xff)+1)>>2,ti->avail_shared_ram/2); + else + DPRINTK("Shared RAM paging disabled. ti->page_mask %x\n",ti->page_mask); #endif /* Calculate the maximum DHB we can use */ - switch (ti->mapped_ram_size) { + if (!ti->page_mask) { + ti->avail_shared_ram=ti->mapped_ram_size; + } + switch (ti->avail_shared_ram) { case 16 : /* 8KB shared RAM */ ti->dhb_size4mb = MIN(ti->dhb_size4mb, 2048); ti->rbuf_len4 = 1032; @@ -697,34 +720,34 @@ ti->rbuf_cnt16 = 2; break; case 32 : /* 16KB shared RAM */ - ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464); + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 2048); ti->rbuf_len4 = 520; ti->rbuf_cnt4 = 9; - ti->dhb_size16mb = MIN(ti->dhb_size16mb, 4096); + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 2048); ti->rbuf_len16 = 1032; /* 1024 usable */ ti->rbuf_cnt16 = 4; break; case 64 : /* 32KB shared RAM */ - ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464); + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 2048); ti->rbuf_len4 = 1032; ti->rbuf_cnt4 = 6; - ti->dhb_size16mb = MIN(ti->dhb_size16mb, 10240); + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 2048); ti->rbuf_len16 = 1032; ti->rbuf_cnt16 = 10; break; case 127 : /* 63KB shared RAM */ - ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464); + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 2048); ti->rbuf_len4 = 1032; ti->rbuf_cnt4 = 6; - ti->dhb_size16mb = MIN(ti->dhb_size16mb, 16384); + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 2048); ti->rbuf_len16 = 1032; ti->rbuf_cnt16 = 16; break; case 128 : /* 64KB shared RAM */ - ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464); + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 2048); ti->rbuf_len4 = 1032; ti->rbuf_cnt4 = 6; - ti->dhb_size16mb = MIN(ti->dhb_size16mb, 17960); + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 2048); ti->rbuf_len16 = 1032; ti->rbuf_cnt16 = 18; break; @@ -763,7 +786,7 @@ 'E' -- 8kb 'D' -- 16kb 'C' -- 32kb 'A' -- 64KB 'B' - 64KB less 512 bytes at top - (WARNING ... must zero top bytes in INIT */ + (WARNING ... must zero top bytes in INIT */ avail_sram_code=0xf-readb(adapt_info->mmio + AIPAVAILSHRAM); if (avail_sram_code) @@ -776,6 +799,7 @@ { struct tok_info *ti=(struct tok_info *)dev->priv; + SET_PAGE(ti->srb_page); ti->open_status = CLOSED; dev->init = tok_init_card; @@ -814,7 +838,7 @@ address[3] |= mclist->dmi_addr[5]; mclist = mclist->next; } - SET_PAGE(ti->srb); + SET_PAGE(ti->srb_page); for (i=0; isrb+i); @@ -862,6 +886,7 @@ struct tok_info *ti=(struct tok_info *) dev->priv; + SET_PAGE(ti->srb_page); writeb(DIR_CLOSE_ADAPTER, ti->srb + offsetof(struct srb_close_adapter, command)); writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); @@ -870,6 +895,7 @@ sleep_on(&ti->wait_for_tok_int); + SET_PAGE(ti->srb_page); if (readb(ti->srb + offsetof(struct srb_close_adapter, ret_code))) DPRINTK("close adapter failed: %02X\n", (int)readb(ti->srb + offsetof(struct srb_close_adapter, ret_code))); @@ -889,6 +915,9 @@ unsigned char status; struct tok_info *ti; struct device *dev; +#ifdef ENABLE_PAGING + unsigned char save_srpr; +#endif dev = dev_id; #if TR_VERBOSE @@ -896,6 +925,9 @@ #endif ti = (struct tok_info *) dev->priv; spin_lock(&(ti->lock)); +#ifdef ENABLE_PAGING + save_srpr=readb(ti->mmio+ACA_OFFSET+ACA_RW+SRPR_EVEN); +#endif /* Disable interrupts till processing is finished */ dev->interrupt=1; @@ -922,18 +954,16 @@ if (status == 0xFF) { DPRINTK("PCMCIA card removed.\n"); - spin_unlock(&(ti->lock)); - dev->interrupt = 0; - return; + dev->interrupt = 0; + goto return_point; } /* Check ISRP EVEN too. */ if ( readb (ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN) == 0xFF) { DPRINTK("PCMCIA card removed.\n"); - spin_unlock(&(ti->lock)); dev->interrupt = 0; - return; + goto return_point; } #endif @@ -942,8 +972,15 @@ int i; __u32 check_reason; + __u8 check_reason_page=0; - check_reason=ti->mmio + ntohs(readw(ti->sram + ACA_OFFSET + ACA_RW +WWCR_EVEN)); + check_reason=ntohs(readw(ti->sram + ACA_OFFSET + ACA_RW +WWCR_EVEN)); + if (ti->page_mask) { + check_reason_page=(check_reason>>8) & ti->page_mask; + check_reason &= ~(ti->page_mask << 8); + } + check_reason += ti->sram; + SET_PAGE(check_reason_page); DPRINTK("Adapter check interrupt\n"); DPRINTK("8 reason bytes follow: "); @@ -970,6 +1007,12 @@ /* SRB, ASB, ARB or SSB response */ if (status & SRB_RESP_INT) { /* SRB response */ + SET_PAGE(ti->srb_page); +#if TR_VERBOSE + DPRINTK("SRB resp: cmd=%02X rsp=%02X\n", + readb(ti->srb), + readb(ti->srb + offsetof(struct srb_xmit, ret_code))); +#endif switch(readb(ti->srb)) { /* SRB command check */ @@ -1011,10 +1054,25 @@ unsigned char open_ret_code; __u16 open_error_code; - ti->srb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, srb_addr))); - ti->ssb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, ssb_addr))); - ti->arb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, arb_addr))); - ti->asb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, asb_addr))); + ti->srb=ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, srb_addr))); + ti->ssb=ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, ssb_addr))); + ti->arb=ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, arb_addr))); + ti->asb=ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, asb_addr))); + if (ti->page_mask) { + ti->srb_page=(ti->srb>>8) & ti->page_mask; + ti->srb &= ~(ti->page_mask<<8); + ti->ssb_page=(ti->ssb>>8) & ti->page_mask; + ti->ssb &= ~(ti->page_mask<<8); + ti->arb_page=(ti->arb>>8) & ti->page_mask; + ti->arb &= ~(ti->page_mask<<8); + ti->asb_page=(ti->asb>>8) & ti->page_mask; + ti->asb &= ~(ti->page_mask<<8); + } + ti->srb+=ti->sram; + ti->ssb+=ti->sram; + ti->arb+=ti->sram; + ti->asb+=ti->sram; + ti->current_skb=NULL; open_ret_code = readb(ti->init_srb +offsetof(struct srb_open_response, ret_code)); @@ -1143,6 +1201,10 @@ } /* SRB response */ if (status & ASB_FREE_INT) { /* ASB response */ + SET_PAGE(ti->asb_page); +#if TR_VERBOSE + DPRINTK("ASB resp: cmd=%02X\n", readb(ti->asb)); +#endif switch(readb(ti->asb)) { /* ASB command check */ @@ -1165,6 +1227,12 @@ } /* ASB response */ if (status & ARB_CMD_INT) { /* ARB response */ + SET_PAGE(ti->arb_page); +#if TR_VERBOSE + DPRINTK("ARB resp: cmd=%02X rsp=%02X\n", + readb(ti->arb), + readb(ti->arb + offsetof(struct arb_dlc_status, status))); +#endif switch (readb(ti->arb)) { /* ARB command check */ @@ -1221,6 +1289,11 @@ if (status & SSB_RESP_INT) { /* SSB response */ unsigned char retcode; + SET_PAGE(ti->ssb_page); +#if TR_VERBOSE + DPRINTK("SSB resp: cmd=%02X rsp=%02X\n", + readb(ti->ssb), readb(ti->ssb+2)); +#endif switch (readb(ti->ssb)) { /* SSB command check */ case XMIT_DIR_FRAME: @@ -1234,6 +1307,7 @@ case XMIT_XID_CMD: DPRINTK("xmit xid ret_code: %02X\n", (int)readb(ti->ssb+2)); + break; default: DPRINTK("Unknown command %02X in ssb\n", (int)readb(ti->ssb)); @@ -1259,6 +1333,13 @@ DPRINTK("Unexpected interrupt from tr adapter\n"); } +#ifdef PCMCIA + return_point: +#endif +#ifdef ENABLE_PAGING + writeb(save_srpr, ti->mmio+ACA_OFFSET+ACA_RW+SRPR_EVEN); +#endif + spin_unlock(&(ti->lock)); } @@ -1281,9 +1362,26 @@ writeb(ti->sram_base, ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN); ti->sram=((__u32)ti->sram_base << 12); } - ti->init_srb=ti->sram - +ntohs((unsigned short)readw(ti->mmio+ ACA_OFFSET + WRBR_EVEN)); - SET_PAGE(ntohs((unsigned short)readw(ti->mmio+ACA_OFFSET + WRBR_EVEN))); + ti->init_srb=ntohs((unsigned short)readw(ti->mmio+ ACA_OFFSET + WRBR_EVEN)); + if (ti->page_mask) { + ti->init_srb_page=(ti->init_srb>>8)&ti->page_mask; + ti->init_srb &= ~(ti->page_mask<<8); + } + ti->init_srb+=ti->sram; + + if (ti->avail_shared_ram == 127) { + int i; + int last_512=0xfe00; + if (ti->page_mask) { + last_512 &= ~(ti->page_mask<<8); + } + // initialize high section of ram (if necessary) + SET_PAGE(0xc0); + for (i=0; i<512; i++) { + writeb(0,ti->sram+last_512+i); + } + } + SET_PAGE(ti->init_srb_page); dev->mem_start = ti->sram; dev->mem_end = ti->sram + (ti->mapped_ram_size<<9) - 1; @@ -1291,7 +1389,7 @@ #if TR_VERBOSE { int i; - DPRINTK("init_srb(%p):", ti->init_srb); + DPRINTK("init_srb(%lx):", (long)ti->init_srb); for (i=0;i<17;i++) printk("%02X ", (int)readb(ti->init_srb+i)); printk("\n"); } @@ -1344,10 +1442,6 @@ /* Reset adapter */ dev->tbusy=1; /* nothing can be done before reset and open completed */ -#ifdef ENABLE_PAGING - if(ti->page_mask) - writeb(SRPR_ENABLE_PAGING, ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN); -#endif writeb(~INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN); @@ -1358,6 +1452,10 @@ outb(0, PIOaddr+ADAPTRESET); for (i=jiffies+TR_RESET_INTERVAL; time_before_eq(jiffies, i);); /* wait 50ms */ outb(0,PIOaddr+ADAPTRESETREL); +#ifdef ENABLE_PAGING + if(ti->page_mask) + writeb(SRPR_ENABLE_PAGING, ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN); +#endif #if !TR_NEWFORMAT DPRINTK("card reset\n"); @@ -1373,7 +1471,7 @@ int i; struct tok_info *ti=(struct tok_info *) dev->priv; - SET_PAGE(ti->srb); + SET_PAGE(ti->srb_page); for (i=0; isrb+i); @@ -1432,10 +1530,16 @@ ti->init_srb + offsetof(struct dir_open_adapter, num_dhb)); writeb(DLC_MAX_SAP, ti->init_srb + offsetof(struct dir_open_adapter, dlc_max_sap)); - writeb(DLC_MAX_STA, + writeb(DLC_MAX_STA, ti->init_srb + offsetof(struct dir_open_adapter, dlc_max_sta)); ti->srb=ti->init_srb; /* We use this one in the interrupt handler */ + ti->srb_page=ti->init_srb_page; + DPRINTK("Opend adapter: Xmit bfrs: %d X %d, Rcv bfrs: %d X %d\n", + readb(ti->init_srb+offsetof(struct dir_open_adapter,num_dhb)), + ntohs(readw(ti->init_srb+offsetof(struct dir_open_adapter,dhb_length))), + ntohs(readw(ti->init_srb+offsetof(struct dir_open_adapter,num_rcv_buf))), + ntohs(readw(ti->init_srb+offsetof(struct dir_open_adapter,rcv_buf_len))) ); writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); @@ -1451,6 +1555,11 @@ unsigned char xmit_command; int i; struct trllc *llc; + struct srb_xmit xsrb; + __u8 dhb_page=0; + __u8 llc_ssap; + + SET_PAGE(ti->asb_page); if (readb(ti->asb + offsetof(struct asb_xmit_resp, ret_code))!=0xFF) DPRINTK("ASB not free !!!\n"); @@ -1460,8 +1569,13 @@ providing a shared memory address for us to stuff with data. Here we compute the effective address where we will place data.*/ - dhb=ti->sram - +ntohs(readw(ti->arb + offsetof(struct arb_xmit_req, dhb_address))); + SET_PAGE(ti->arb_page); + dhb=ntohs(readw(ti->arb + offsetof(struct arb_xmit_req, dhb_address))); + if (ti->page_mask) { + dhb_page=(dhb >> 8) & ti->page_mask; + dhb &= ~(ti->page_mask << 8); + } + dhb+=ti->sram; /* Figure out the size of the 802.5 header */ if (!(trhdr->saddr[0] & 0x80)) /* RIF present? */ @@ -1472,13 +1586,17 @@ llc = (struct trllc *)(ti->current_skb->data + hdr_len); - xmit_command = readb(ti->srb + offsetof(struct srb_xmit, command)); + llc_ssap=llc->ssap; + SET_PAGE(ti->srb_page); + memcpy_fromio(&xsrb, ti->srb, sizeof(xsrb)); + SET_PAGE(ti->asb_page); + xmit_command=xsrb.command; writeb(xmit_command, ti->asb + offsetof(struct asb_xmit_resp, command)); - writew(readb(ti->srb + offsetof(struct srb_xmit, station_id)), + writew(xsrb.station_id, ti->asb + offsetof(struct asb_xmit_resp, station_id)); - writeb(llc->ssap, ti->asb + offsetof(struct asb_xmit_resp, rsap_value)); - writeb(readb(ti->srb + offsetof(struct srb_xmit, cmd_corr)), + writeb(llc_ssap, ti->asb + offsetof(struct asb_xmit_resp, rsap_value)); + writeb(xsrb.cmd_corr, ti->asb + offsetof(struct asb_xmit_resp, cmd_corr)); writeb(0, ti->asb + offsetof(struct asb_xmit_resp, ret_code)); @@ -1487,6 +1605,7 @@ writew(htons(0x11), ti->asb + offsetof(struct asb_xmit_resp, frame_length)); writeb(0x0e, ti->asb + offsetof(struct asb_xmit_resp, hdr_length)); + SET_PAGE(dhb_page); writeb(AC, dhb); writeb(LLC_FRAME, dhb+1); @@ -1521,6 +1640,7 @@ { struct tok_info *ti=(struct tok_info *) dev->priv; __u32 rbuffer, rbufdata; + __u8 rbuffer_page=0; __u32 llc; unsigned char *data; unsigned int rbuffer_len, lan_hdr_len, hdr_len, ip_len, length; @@ -1529,31 +1649,41 @@ int IPv4_p = 0; unsigned int chksum = 0; struct iphdr *iph; + struct arb_rec_req rarb; - rbuffer=(ti->sram - +ntohs(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr))))+2; + SET_PAGE(ti->arb_page); + memcpy_fromio(&rarb, ti->arb, sizeof(rarb)); + rbuffer=ntohs(rarb.rec_buf_addr)+2; + if (ti->page_mask) { + rbuffer_page=(rbuffer >> 8) & ti->page_mask; + rbuffer &= ~(ti->page_mask<<8); + } + rbuffer += ti->sram; + + SET_PAGE(ti->asb_page); if(readb(ti->asb + offsetof(struct asb_rec, ret_code))!=0xFF) DPRINTK("ASB not free !!!\n"); writeb(REC_DATA, ti->asb + offsetof(struct asb_rec, command)); - writew(readw(ti->arb + offsetof(struct arb_rec_req, station_id)), + writew(rarb.station_id, ti->asb + offsetof(struct asb_rec, station_id)); - writew(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr)), + writew(rarb.rec_buf_addr, ti->asb + offsetof(struct asb_rec, rec_buf_addr)); - lan_hdr_len=readb(ti->arb + offsetof(struct arb_rec_req, lan_hdr_len)); + lan_hdr_len=rarb.lan_hdr_len; hdr_len = lan_hdr_len + sizeof(struct trllc) + sizeof(struct iphdr); + SET_PAGE(rbuffer_page); llc=(rbuffer + offsetof(struct rec_buf, data) + lan_hdr_len); #if TR_VERBOSE DPRINTK("offsetof data: %02X lan_hdr_len: %02X\n", (unsigned int)offsetof(struct rec_buf,data), (unsigned int)lan_hdr_len); - DPRINTK("llc: %08X rec_buf_addr: %04X ti->sram: %p\n", llc, - ntohs(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr))), - ti->sram); + DPRINTK("llc: %08X rec_buf_addr: %04X ti->sram: %lx\n", llc, + ntohs(rarb.rec_buf_addr), + (long)ti->sram); DPRINTK("dsap: %02X, ssap: %02X, llc: %02X, protid: %02X%02X%02X, " "ethertype: %04X\n", (int)readb(llc + offsetof(struct trllc, dsap)), @@ -1565,14 +1695,15 @@ (int)readw(llc + offsetof(struct trllc, ethertype))); #endif if (readb(llc + offsetof(struct trllc, llc))!=UI_CMD) { + SET_PAGE(ti->asb_page); writeb(DATA_LOST, ti->asb + offsetof(struct asb_rec, ret_code)); ti->tr_stats.rx_dropped++; writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); return; } - length = ntohs(readw(ti->arb+offsetof(struct arb_rec_req, frame_len))); - if ((readb(llc + offsetof(struct trllc, dsap))==EXTENDED_SAP) && + length = ntohs(rarb.frame_len); + if ((readb(llc + offsetof(struct trllc, dsap))==EXTENDED_SAP) && (readb(llc + offsetof(struct trllc, ssap))==EXTENDED_SAP) && (length>=hdr_len)) { IPv4_p = 1; @@ -1605,7 +1736,7 @@ } #endif - skb_size = length-lan_hdr_len+sizeof(struct trh_hdr)+sizeof(struct trllc); + skb_size = length; if (!(skb=dev_alloc_skb(skb_size))) { DPRINTK("out of memory. frame dropped.\n"); @@ -1650,11 +1781,17 @@ break; length -= rbuffer_len; data += rbuffer_len; + if (ti->page_mask) { + rbuffer_page=(rbuffer>>8) & ti->page_mask; + rbuffer &= ~(ti->page_mask << 8); + } rbuffer += ti->sram; + SET_PAGE(rbuffer_page); rbuffer_len = ntohs(readw(rbuffer + offsetof(struct rec_buf, buf_len))); rbufdata = rbuffer + offsetof(struct rec_buf, data); } + SET_PAGE(ti->asb_page); writeb(0, ti->asb + offsetof(struct asb_rec, ret_code)); writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); @@ -1696,6 +1833,7 @@ /* Save skb; we'll need it when the adapter asks for the data */ ti->current_skb=skb; + SET_PAGE(ti->srb_page); writeb(XMIT_UI_FRAME, ti->srb + offsetof(struct srb_xmit, command)); writew(ti->exsap_station_id, ti->srb +offsetof(struct srb_xmit, station_id)); @@ -1721,6 +1859,7 @@ ti=(struct tok_info *) dev->priv; ti->readlog_pending = 0; + SET_PAGE(ti->srb_page); writeb(DIR_READ_LOG, ti->srb); writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); diff -urN v2.2.15/linux/drivers/net/ibmtr.h linux/drivers/net/ibmtr.h --- v2.2.15/linux/drivers/net/ibmtr.h Tue Oct 26 17:53:40 1999 +++ linux/drivers/net/ibmtr.h Wed Jun 7 14:26:43 2000 @@ -133,9 +133,9 @@ #define TCR_ODD 0x0D #define TVR_EVEN 0x0E /* Timer value registers - even and odd */ #define TVR_ODD 0x0F -#define SRPR_EVEN 0x10 /* Shared RAM paging registers - even and odd */ +#define SRPR_EVEN 0x18 /* Shared RAM paging registers - even and odd */ #define SRPR_ENABLE_PAGING 0xc0 -#define SRPR_ODD 0x11 /* Not used. */ +#define SRPR_ODD 0x19 /* Not used. */ #define TOKREAD 0x60 #define TOKOR 0x40 #define TOKAND 0x20 @@ -162,8 +162,8 @@ #define ACA_RW 0x00 #ifdef ENABLE_PAGING -#define SET_PAGE(x) (writeb(((x>>8)&ti.page_mask), \ - ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN)) +#define SET_PAGE(x) (writeb((x), \ + ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN)) #else #define SET_PAGE(x) #endif @@ -205,6 +205,11 @@ __u32 ssb; /* System Status Block address */ __u32 arb; /* Adapter Request Block address */ __u32 asb; /* Adapter Status Block address */ + __u8 init_srb_page; + __u8 srb_page; + __u8 ssb_page; + __u8 arb_page; + __u8 asb_page; unsigned short exsap_station_id; unsigned short global_int_enable; struct sk_buff *current_skb; diff -urN v2.2.15/linux/drivers/net/irda/girbil.c linux/drivers/net/irda/girbil.c --- v2.2.15/linux/drivers/net/irda/girbil.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/irda/girbil.c Wed Jun 7 14:26:43 2000 @@ -201,13 +201,13 @@ self->set_dtr_rts(self->dev, TRUE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT1); /* Sleep at least 5 ms */ - ret = MSECS_TO_JIFFIES(10); + ret = MSECS_TO_JIFFIES(20); break; case IRDA_TASK_WAIT1: /* Set DTR and clear RTS to enter command mode */ self->set_dtr_rts(self->dev, FALSE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(10); + ret = MSECS_TO_JIFFIES(20); break; case IRDA_TASK_WAIT2: /* Write control byte */ diff -urN v2.2.15/linux/drivers/net/irda/irport.c linux/drivers/net/irda/irport.c --- v2.2.15/linux/drivers/net/irda/irport.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/irda/irport.c Wed Jun 7 14:26:43 2000 @@ -6,7 +6,7 @@ * Status: Experimental. * Author: Dag Brattli * Created at: Sun Aug 3 13:49:59 1997 - * Modified at: Sat Mar 11 07:41:54 2000 + * Modified at: Tue Apr 25 21:18:48 2000 * Modified by: Dag Brattli * Sources: serial.c by Linus Torvalds * @@ -943,7 +943,12 @@ switch (cmd) { case SIOCSBANDWIDTH: /* Set bandwidth */ - if (!capable(CAP_NET_ADMIN)) + /* + * This function will also be used by IrLAP to change the + * speed, so we still must allow for speed change within + * interrupt context. + */ + if (!in_interrupt() && !capable(CAP_NET_ADMIN)) return -EPERM; irda_task_execute(self, __irport_change_speed, NULL, NULL, (void *) irq->ifr_baudrate); diff -urN v2.2.15/linux/drivers/net/irda/irtty.c linux/drivers/net/irda/irtty.c --- v2.2.15/linux/drivers/net/irda/irtty.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/irda/irtty.c Wed Jun 7 14:26:43 2000 @@ -6,7 +6,7 @@ * Status: Experimental. * Author: Dag Brattli * Created at: Tue Dec 9 21:18:38 1997 - * Modified at: Sat Mar 11 07:43:30 2000 + * Modified at: Tue Apr 25 21:17:49 2000 * Modified by: Dag Brattli * Sources: slip.c by Laurence Culhane, * Fred N. van Kempen, @@ -974,7 +974,12 @@ switch (cmd) { case SIOCSBANDWIDTH: /* Set bandwidth */ - if (!capable(CAP_NET_ADMIN)) + /* + * This function will also be used by IrLAP to change the + * speed, so we still must allow for speed change within + * interrupt context. + */ + if (!in_interrupt() && !capable(CAP_NET_ADMIN)) return -EPERM; irda_task_execute(self, irtty_change_speed, NULL, NULL, (void *) irq->ifr_baudrate); diff -urN v2.2.15/linux/drivers/net/irda/nsc-ircc.c linux/drivers/net/irda/nsc-ircc.c --- v2.2.15/linux/drivers/net/irda/nsc-ircc.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/irda/nsc-ircc.c Wed Jun 7 14:26:43 2000 @@ -6,7 +6,7 @@ * Status: Stable. * Author: Dag Brattli * Created at: Sat Nov 7 21:43:15 1998 - * Modified at: Fri Mar 10 11:53:26 2000 + * Modified at: Tue Apr 25 21:19:12 2000 * Modified by: Dag Brattli * * Copyright (c) 1998-2000 Dag Brattli @@ -56,6 +56,7 @@ #include #include #include +#include #ifdef CONFIG_APM #include @@ -1969,8 +1970,15 @@ switch (cmd) { case SIOCSBANDWIDTH: /* Set bandwidth */ - if (!capable(CAP_NET_ADMIN)) + /* + * This function will also be used by IrLAP to change the + * speed, so we still must allow for speed change within + * interrupt context. + */ + if (!in_interrupt() && !capable(CAP_NET_ADMIN)) { + IRDA_DEBUG(0, __FUNCTION__ "(), not capable sysadm\n"); return -EPERM; + } nsc_ircc_change_speed(self, irq->ifr_baudrate); break; case SIOCSMEDIABUSY: /* Set media busy */ diff -urN v2.2.15/linux/drivers/net/irda/toshoboe.c linux/drivers/net/irda/toshoboe.c --- v2.2.15/linux/drivers/net/irda/toshoboe.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/irda/toshoboe.c Wed Jun 7 14:26:43 2000 @@ -612,7 +612,12 @@ switch (cmd) { case SIOCSBANDWIDTH: /* Set bandwidth */ - if (!capable(CAP_NET_ADMIN)) + /* + * This function will also be used by IrLAP to change the + * speed, so we still must allow for speed change within + * interrupt context. + */ + if (!in_interrupt() && !capable(CAP_NET_ADMIN)) return -EPERM; /* toshoboe_setbaud(self, irq->ifr_baudrate); */ /* Just change speed once - inserted by Paul Bristow */ diff -urN v2.2.15/linux/drivers/net/irda/w83977af_ir.c linux/drivers/net/irda/w83977af_ir.c --- v2.2.15/linux/drivers/net/irda/w83977af_ir.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/irda/w83977af_ir.c Wed Jun 7 14:26:43 2000 @@ -6,7 +6,7 @@ * Status: Experimental. * Author: Paul VanderSpek * Created at: Wed Nov 4 11:46:16 1998 - * Modified at: Fri Mar 10 11:53:53 2000 + * Modified at: Tue Apr 25 21:18:35 2000 * Modified by: Dag Brattli * * Copyright (c) 1998-2000 Dag Brattli @@ -258,13 +258,12 @@ dev->get_stats = w83977af_net_get_stats; rtnl_lock(); - err = register_netdev(dev); + err = register_netdevice(dev); rtnl_unlock(); if (err) { - ERROR(__FUNCTION__ "(), register_netdev() failed!\n"); + ERROR(__FUNCTION__ "(), register_netdevice() failed!\n"); return -1; } - MESSAGE("IrDA: Registered device %s\n", dev->name); return 0; @@ -307,7 +306,7 @@ /* Release the PORT that this driver is using */ IRDA_DEBUG(0 , __FUNCTION__ "(), Releasing Region %03x\n", - self->io.fir_base); + self->io.fir_base); release_region(self->io.fir_base, self->io.fir_ext); if (self->tx_buff.head) @@ -1348,7 +1347,12 @@ switch (cmd) { case SIOCSBANDWIDTH: /* Set bandwidth */ - if (!capable(CAP_NET_ADMIN)) + /* + * This function will also be used by IrLAP to change the + * speed, so we still must allow for speed change within + * interrupt context. + */ + if (!in_interrupt() && !capable(CAP_NET_ADMIN)) return -EPERM; w83977af_change_speed(self, irq->ifr_baudrate); break; diff -urN v2.2.15/linux/drivers/net/n2.c linux/drivers/net/n2.c --- v2.2.15/linux/drivers/net/n2.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/n2.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,505 @@ +/* + * SDL Inc. RISCom/N2 synchronous serial card driver for Linux + * + * Copyright (C) 1998-2000 Krzysztof Halasa + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Requires hdlc.c, a generic HDLC support module + * Available from ftp://ftp.pm.waw.pl/pub/Linux/hdlc/ + * + * Current status: + * - this is work in progress + * - no support for integrated CSU/DSU/DDS + * - no support for SMP yet + * + * Tested with dual channel card with 2 Mbps FR links and with loopback + * at 10Mbps. + * + * Sources of information: + * Hitachi HD64570 SCA User's Manual + * SDL Inc. PPP/HDLC/CISCO driver + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "syncppp.h" +#include +#include "hd64570.h" + +#define DEBUG_RINGS +/* #define DEBUG_PKT */ + +static const char* version = "SDL RISCom/N2 driver revision: 1.0-pre9"; +static const char* devname = "RISCom/N2"; + +#define USE_WINDOWSIZE 16384 +#define USE_BUS16BITS 1 +#define CLOCK_BASE 9830400 /* 9.8304 MHz */ + +#define N2_IOPORTS 0x10 + +static char *hw=NULL; /* pointer to hw=xxx command line string */ + +/* RISCom/N2 Board Registers */ + +/* PC Control Register */ +#define N2_PCR 0 +#define PCR_RUNSCA 1 /* Run 64570 */ +#define PCR_VPM 2 /* Enable VPM - needed if using RAM above 1 MB */ +#define PCR_ENWIN 4 /* Open window */ +#define PCR_BUS16 8 /* 16-bit bus */ + + +/* Memory Base Address Register */ +#define N2_BAR 2 + + +/* Page Scan Register */ +#define N2_PSR 4 +#define WIN16K 0x00 +#define WIN32K 0x20 +#define WIN64K 0x40 +#define PSR_WINBITS 0x60 +#define PSR_DMAEN 0x80 +#define PSR_PAGEBITS 0x0F + + +/* Modem Control Reg */ +#define N2_MCR 6 +#define CLOCK_OUT_PORT1 0x80 +#define CLOCK_OUT_PORT0 0x40 +#define TX422_PORT1 0x20 +#define TX422_PORT0 0x10 +#define DSR_PORT1 0x08 +#define DSR_PORT0 0x04 +#define DTR_PORT1 0x02 +#define DTR_PORT0 0x01 + + +typedef struct port_s { + hdlc_device hdlc; /* HDLC device struct - must be first */ + struct card_s *card; + int clkmode; /* clock speed */ + int loopback; + u8 valid; /* port enabled */ + u8 phy_node; /* physical port # - 0 or 1 */ + u8 log_node; /* logical port # */ + u8 rxin; /* rx ring buffer 'in' pointer */ + u8 txin; /* tx ring buffer 'in' and 'last' pointers */ + u8 txlast; +}port_t; + + + +typedef struct card_s { + u8 *winbase; /* ISA window base address */ + u32 ram_size; /* number of bytes */ + u16 io; /* IO Base address */ + u16 buff_offset; /* offset of first buffer of first channel */ + u8 irq; /* IRQ (3-15) */ + u8 ring_buffers; /* number of buffers in a ring */ + + port_t ports[2]; + struct card_s *next_card; +}card_t; + + + +#define sca_reg(reg, card) (0x8000 | card->io | \ + ((reg)&0x0F) | (((reg)&0xF0) << 6)) +#define sca_in(reg, card) readb(sca_reg(reg, card)) +#define sca_out(value, reg, card) writeb(value, sca_reg(reg, card)) +#define sca_inw(reg, card) readw(sca_reg(reg, card)) +#define sca_outw(value, reg, card) writew(value, sca_reg(reg, card)) + +#define port_to_card(port) (port->card) +#define log_node(port) (port->log_node) +#define phy_node(port) (port->phy_node) +#define winsize(card) (USE_WINDOWSIZE) +#define winbase(card) (card->winbase) +#define get_port(card, port) (card->ports[port].valid ? \ + &card->ports[port] : NULL) + + +static __inline__ u8 get_page(card_t *card) +{ + return inb(card->io+N2_PSR) & PSR_PAGEBITS; +} + + +static __inline__ void openwin(card_t *card, u8 page) +{ + u8 psr=inb(card->io+N2_PSR); + outb((psr & ~PSR_PAGEBITS) | page, card->io+N2_PSR); +} + + +static __inline__ void close_windows(card_t *card) +{ + outb(inb(card->io+N2_PCR) & ~PCR_ENWIN, card->io+N2_PCR); +} + + +static __inline__ int set_clock(port_t *port, int clock) +{ + int io=port->card->io; + u8 mcr = inb(io+N2_MCR); + + if (clock == LINE_EXT_CLOCK) /* External clock */ + mcr |= port->phy_node ? CLOCK_OUT_PORT1 : CLOCK_OUT_PORT0; + else + mcr &= port->phy_node ? ~CLOCK_OUT_PORT1 : ~CLOCK_OUT_PORT0; + + outb(mcr, io+N2_MCR); + port->clkmode = clock; + return 0; +} + + + +#define select_phys_iface(port, iface) (-EINVAL) /* No hardware support */ + + +static __inline__ void open_port(port_t *port) +{ + int io=port->card->io; + u8 mcr = inb(io+N2_MCR) | (port->phy_node ? TX422_PORT1 : TX422_PORT0); + + mcr &= port->phy_node ? ~DTR_PORT1 : ~DTR_PORT0; /* set DTR ON */ + outb(mcr, io+N2_MCR); + + outb(inb(io+N2_PCR) | PCR_ENWIN, io+N2_PCR); /* open window */ + outb(inb(io+N2_PSR) | PSR_DMAEN, io+N2_PSR); /* enable dma */ +} + + + +static __inline__ void close_port(port_t *port) +{ + int io=port->card->io; + u8 mcr = inb(io+N2_MCR) | (port->phy_node ? TX422_PORT1 : TX422_PORT0); + + /* set DTR OFF */ + mcr |= port->phy_node ? DTR_PORT1 : DTR_PORT0; + outb(mcr, io+N2_MCR); +} + + + +#include "hd6457x.c" + + +static u8 n2_count_page(card_t *card) +{ + u8 page; + int i, bcount=USE_WINDOWSIZE, wcount=USE_WINDOWSIZE/2; + u16 *dp=(u16*)card->winbase; + u8 *bp=(u8*)card->winbase; + u8 psr=inb(card->io+N2_PSR) & PSR_WINBITS; + + + for (page=0; page<16; page++) { + outb(psr | page, card->io+N2_PSR); /* select a page */ + writeb(page, dp); + if (readb(dp) != page) + break; /* If can't read back, no good memory */ + + outb(psr, card->io+N2_PSR); /* goto page 0 */ + if (readb(dp)) + break; /* If page 0 changed, then wrapped around */ + + outb(psr | page, card->io+N2_PSR); /* select page again */ + + /* first do byte tests */ + for (i = 0; i < bcount; i++) + writeb(i, bp + i); + for (i = 0; i < bcount; i++) + if (readb(bp + i) != (i & 0xff)) + return 0; + + for (i = 0; i < bcount; i++) + writeb(~i, bp + i); + for (i = 0; i < bcount; i++) + if (readb(bp + i) != (~i & 0xff)) + return 0; + + /* next do 16-bit tests */ + for (i = 0; i < wcount; i++) + writew(0x55AA, dp + i); + for (i = 0; i < wcount; i++) + if (readw(dp + i) != 0x55AA) + return 0; + + for (i = 0; i < wcount; i++) + writew(0xAA55, dp + i); + for (i = 0; i < wcount; i++) + if (readw(dp + i) != 0xAA55) + return 0; + + for (i = 0; i < wcount; i++) + writew(page, dp + i); + } + + return page; +} + + + +static void n2_destroy_card(card_t *card) +{ + int cnt; + + for (cnt=0; cnt<2; cnt++) + if (card->ports[cnt].card) + unregister_hdlc_device(&card->ports[cnt].hdlc); + + if (card->irq) + free_irq(card->irq, card); + + if (card->io) + release_region(card->io, N2_IOPORTS); + kfree(card); +} + + + +static int n2_run(unsigned long io, unsigned long irq, unsigned long winbase, + long valid0, long valid1) +{ + card_t *card; + u8 cnt, pcr; + + if (io<0x200 || io>0x3FF || (io % N2_IOPORTS)!=0) { + printk(KERN_ERR "n2: invalid I/O port value\n"); + return -ENODEV; + } + + if (irq<3 || irq>15 || irq == 6) /* FIXME */ { + printk(KERN_ERR "n2: invalid IRQ value\n"); + return -ENODEV; + } + + if (winbase<0xA0000 || winbase>0xFFFFF || (winbase&0xFFF)!=0) { + printk(KERN_ERR "n2: invalid RAM value\n"); + return -ENODEV; + } + + if (check_region(io, N2_IOPORTS)) { + printk(KERN_ERR "n2: I/O port region in use\n"); + return -EBUSY; + } + + card=kmalloc(sizeof(card_t), GFP_KERNEL); + if (card==NULL) { + printk(KERN_ERR "n2: unable to allocate memory\n"); + return -ENOBUFS; + } + memset(card, 0, sizeof(card_t)); + + request_region(io, N2_IOPORTS, devname); + card->io=io; + + if (request_irq(irq, &sca_intr, 0, devname, card)) { + printk(KERN_ERR "n2: could not allocate IRQ\n"); + n2_destroy_card(card); + return(-EBUSY); + } + card->irq=irq; + + card->winbase=(u8*)winbase; + + outb(0, io+N2_PCR); + outb(winbase>>12, io+N2_BAR); + + switch (USE_WINDOWSIZE) { + case 16384: + outb(WIN16K, io+N2_PSR); + break; + + case 32768: + outb(WIN32K, io+N2_PSR); + break; + + case 65536: + outb(WIN64K, io+N2_PSR); + break; + + default: + printk(KERN_ERR "n2: invalid window size\n"); + n2_destroy_card(card); + return -ENODEV; + } + + pcr = PCR_ENWIN | PCR_VPM | (USE_BUS16BITS ? PCR_BUS16 : 0); + outb(pcr, io+N2_PCR); + + cnt = n2_count_page(card); + if (!cnt) { + printk(KERN_ERR "n2: memory test failed.\n"); + n2_destroy_card(card); + return -EIO; + } + + card->ram_size=cnt*USE_WINDOWSIZE; + + /* 4 rings required for 2 ports, 2 rings for one port */ + card->ring_buffers = card->ram_size / + ((valid0 + valid1) * 2 * (sizeof(pkt_desc)+HDLC_MAX_MTU)); + + card->buff_offset = (valid0 + valid1) * 2 * (sizeof(pkt_desc)) + * card->ring_buffers; + + printk(KERN_DEBUG "n2: RISCom/N2 %u KB RAM, IRQ%u, " + "using %u packets rings\n", card->ram_size/1024, card->irq, + card->ring_buffers); + + pcr |= PCR_RUNSCA; /* run SCA */ + outb(pcr, io+N2_PCR); + outb(0, io+N2_MCR); + + sca_init(card, 0); + for (cnt=0; cnt<2; cnt++) { + port_t *port = &card->ports[cnt]; + + if ((cnt == 0 && !valid0) || (cnt == 1 && !valid1)) + continue; + + port->phy_node = cnt; + port->valid = 1; + + if ((cnt == 1) && valid0) + port->log_node = 1; + + hdlc_to_dev(&port->hdlc)->irq=irq; + hdlc_to_dev(&port->hdlc)->mem_start = winbase; + hdlc_to_dev(&port->hdlc)->mem_end = winbase + USE_WINDOWSIZE-1; + hdlc_to_dev(&port->hdlc)->tx_queue_len=50; + port->hdlc.ioctl=sca_ioctl; + port->hdlc.open=sca_open; + port->hdlc.close=sca_close; + hdlc_to_dev(&port->hdlc)->hard_start_xmit=sca_xmit; + + if (register_hdlc_device(&port->hdlc)) { + printk(KERN_WARNING "n2: unable to register hdlc " + "device\n"); + n2_destroy_card(card); + return -ENOBUFS; + } + port->card = card; + sca_init_sync_port(port); /* Set up SCA memory */ + + printk(KERN_INFO "%s: RISCom/N2 node %d\n", port->hdlc.name, + port->phy_node); + } + + *new_card=card; + new_card=&card->next_card; + + return 0; +} + + + +void n2_init(void) +{ + if (hw==NULL) + return; + + printk(KERN_INFO "%s\n", version); + + do { + unsigned long io, irq, ram; + long valid[2] = { 0, 0 }; /* Default = both ports disabled */ + + io=simple_strtoul(hw, &hw, 0); + + if (*hw++ != ',') + break; + irq=simple_strtoul(hw, &hw, 0); + + if (*hw++ != ',') + break; + ram=simple_strtoul(hw, &hw, 0); + + if (*hw++ != ',') + break; + while(1) { + if (*hw=='0' && !valid[0]) + valid[0]=1; /* Port 0 enabled */ + else if (*hw=='1' && !valid[1]) + valid[1]=1; /* Port 1 enabled */ + else + break; + hw++; + } + + if (!valid[0] && !valid[1]) + break; /* at least one port must be used */ + + if (*hw == ':' || *hw == '\x0') + n2_run(io, irq, ram, valid[0], valid[1]); + + if (*hw == '\x0') + return; + }while(*hw++ == ':'); + + printk(KERN_ERR "n2: invalid hardware parameters\n"); +} + + +#ifndef MODULE + +void n2_setup(char *str, int *ints) +{ + hw=str; +} + +#else + +MODULE_AUTHOR("Krzysztof Halasa "); +MODULE_DESCRIPTION("RISCom/N2 serial port driver"); +MODULE_PARM(hw, "s"); /* hw=io,irq,ram,ports:io,irq,... */ +EXPORT_NO_SYMBOLS; + +int init_module(void) +{ + if (hw==NULL) { + printk(KERN_ERR "n2: no card initialized\n"); + return -ENOSYS; /* no parameters specified, abort */ + } + + n2_init(); + return first_card ? 0 : -ENOSYS; +} + + + +void cleanup_module(void) +{ + card_t *card=first_card; + + while (card) { + card_t *ptr=card; + card=card->next_card; + n2_destroy_card(ptr); + } +} + +#endif /* MODULE */ diff -urN v2.2.15/linux/drivers/net/olympic.c linux/drivers/net/olympic.c --- v2.2.15/linux/drivers/net/olympic.c Wed May 3 17:16:41 2000 +++ linux/drivers/net/olympic.c Wed Jun 7 14:26:43 2000 @@ -24,7 +24,18 @@ * Merged into the kernel code * * 3/10/00 - Enabled FDX and fixed bugs produced thereafter. - * Put in smp code + * Put in smp code + * + * 5/20/00 - Changes to handle Olympic on LinuxPPC. Endian changes. + * The odd thing about the changes is that the fix for + * endian issues with the big-endian data in the arb, asb... + * was to always swab() the bytes, no matter what CPU. + * That's because the read[wl]() functions always swap the + * bytes on the way in on PPC. + * Fixing the hardware descriptors was another matter, + * because they weren't going through read[wl](), there all + * the results had to be in memory in le32 values. kdaaker + * * To Do: * * If Problems do Occur @@ -164,7 +175,15 @@ if (pci_present()) { while((pci_device=pci_find_device(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR_WAKE, pci_device))) { + u16 pci_command; + /* PCI Spec 2.1 states that it is either the driver or PCI card's + * responsibility to set the PCI Master Enable Bit if needed. + * (From Mark Stockton ) + */ + pci_read_config_word(pci_device, PCI_COMMAND, &pci_command); + pci_command |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY; + pci_write_config_word(pci_device, PCI_COMMAND, pci_command); pci_set_master(pci_device); /* Check to see if io has been allocated, if so, we've already done this card, @@ -314,14 +333,14 @@ return -1; } - uaa_addr=ntohs(readw(init_srb+8)); + uaa_addr=swab16(readw(init_srb+8)); #if OLYMPIC_DEBUG printk("UAA resides at %x\n",uaa_addr); #endif - writel(uaa_addr,olympic_mmio+LAPA); - adapter_addr=olympic_priv->olympic_lap + (uaa_addr & (~0xf800)); + writel(uaa_addr, olympic_mmio+LAPA); + adapter_addr = olympic_priv->olympic_lap + (uaa_addr & (~0xf800)); #if OLYMPIC_DEBUG printk("adapter address: %02x:%02x:%02x:%02x:%02x:%02x\n", @@ -331,8 +350,8 @@ memcpy_fromio(&dev->dev_addr[0], adapter_addr,6); - olympic_priv->olympic_addr_table_addr = ntohs(readw(init_srb + 12)) ; - olympic_priv->olympic_parms_addr = ntohs(readw(init_srb + 14)) ; + olympic_priv->olympic_addr_table_addr = swab16(readw(init_srb + 12)); + olympic_priv->olympic_parms_addr = swab16(readw(init_srb + 14)); return 0; @@ -394,9 +413,9 @@ /* If Network Monitor, instruct card to copy MAC frames through the ARB */ #if OLYMPIC_NETWORK_MONITOR - writew(ntohs(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON),init_srb+8); + writew(swab16(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON), init_srb+8); #else - writew(ntohs(OPEN_ADAPTER_ENABLE_FDX),init_srb+8); + writew(swab16(OPEN_ADAPTER_ENABLE_FDX), init_srb+8); #endif if (olympic_priv->olympic_laa[0]) { @@ -430,7 +449,7 @@ #if OLYMPIC_DEBUG printk("init_srb(%p): ",init_srb); for(i=0;i<20;i++) - printk("%x ",readb(init_srb+i)); + printk("%02x ",readb(init_srb+i)); printk("\n"); #endif @@ -489,10 +508,10 @@ if (olympic_priv->olympic_message_level) printk(KERN_INFO "%s: Opened in %d Mbps mode\n",dev->name, olympic_priv->olympic_ring_speed); - olympic_priv->asb=ntohs(readw(init_srb+8)); - olympic_priv->srb=ntohs(readw(init_srb+10)); - olympic_priv->arb=ntohs(readw(init_srb+12)); - olympic_priv->trb=ntohs(readw(init_srb+16)); + olympic_priv->asb = swab16(readw(init_srb+8)); + olympic_priv->srb = swab16(readw(init_srb+10)); + olympic_priv->arb = swab16(readw(init_srb+12)); + olympic_priv->trb = swab16(readw(init_srb+16)); olympic_priv->olympic_receive_options = 0x01 ; olympic_priv->olympic_copy_all_options = 0 ; @@ -513,8 +532,8 @@ skb->dev = dev; - olympic_priv->olympic_rx_ring[i].buffer=virt_to_bus(skb->data); - olympic_priv->olympic_rx_ring[i].res_length = olympic_priv->pkt_buf_sz ; + olympic_priv->olympic_rx_ring[i].buffer = cpu_to_le32(virt_to_bus(skb->data)); + olympic_priv->olympic_rx_ring[i].res_length = cpu_to_le32(olympic_priv->pkt_buf_sz); olympic_priv->rx_ring_skb[i]=skb; } @@ -524,17 +543,17 @@ return -EIO; } - writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]),olympic_mmio+RXDESCQ); - writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]),olympic_mmio+RXCDA); - writew(i,olympic_mmio+RXDESCQCNT); + writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]), olympic_mmio+RXDESCQ); + writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]), olympic_mmio+RXCDA); + writew(i, olympic_mmio+RXDESCQCNT); - writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]),olympic_mmio+RXSTATQ); - writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]),olympic_mmio+RXCSA); + writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]), olympic_mmio+RXSTATQ); + writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]), olympic_mmio+RXCSA); - olympic_priv->rx_ring_last_received=OLYMPIC_RX_RING_SIZE-1; /* last processed rx status */ - olympic_priv->rx_status_last_received = OLYMPIC_RX_RING_SIZE-1; + olympic_priv->rx_ring_last_received = OLYMPIC_RX_RING_SIZE - 1; /* last processed rx status */ + olympic_priv->rx_status_last_received = OLYMPIC_RX_RING_SIZE - 1; - writew(i,olympic_mmio+RXSTATQCNT); + writew(i, olympic_mmio+RXSTATQCNT); #if OLYMPIC_DEBUG printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ)); @@ -563,9 +582,9 @@ olympic_priv->olympic_tx_ring[i].buffer=0xdeadbeef; olympic_priv->free_tx_ring_entries=OLYMPIC_TX_RING_SIZE; - writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]),olympic_mmio+TXDESCQ_1); - writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]),olympic_mmio+TXCDA_1); - writew(OLYMPIC_TX_RING_SIZE,olympic_mmio+TXDESCQCNT_1); + writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]), olympic_mmio+TXDESCQ_1); + writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]), olympic_mmio+TXCDA_1); + writew(OLYMPIC_TX_RING_SIZE, olympic_mmio+TXDESCQCNT_1); writel(virt_to_bus(&olympic_priv->olympic_tx_status_ring[0]),olympic_mmio+TXSTATQ_1); writel(virt_to_bus(&olympic_priv->olympic_tx_status_ring[0]),olympic_mmio+TXCSA_1); @@ -642,34 +661,35 @@ rx_status=&(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received + 1) & (OLYMPIC_RX_RING_SIZE - 1)]) ; while (rx_status->status_buffercnt) { + __u32 l_status_buffercnt; olympic_priv->rx_status_last_received++ ; olympic_priv->rx_status_last_received &= (OLYMPIC_RX_RING_SIZE -1); #if OLYMPIC_DEBUG printk(" stat_ring addr: %x \n", &(olympic_priv->olympic_rx_status_ring[olympic_priv->rx_status_last_received]) ); - printk("rx status: %x rx len: %x \n",rx_status->status_buffercnt,rx_status->fragmentcnt_framelen); + printk("rx status: %x rx len: %x \n", le32_to_cpu(rx_status->status_buffercnt), le32_to_cpu(rx_status->fragmentcnt_framelen)); #endif - length=rx_status->fragmentcnt_framelen & 0xffff; - buffer_cnt = rx_status->status_buffercnt & 0xffff ; + length = le32_to_cpu(rx_status->fragmentcnt_framelen) & 0xffff; + buffer_cnt = le32_to_cpu(rx_status->status_buffercnt) & 0xffff; i = buffer_cnt ; /* Need buffer_cnt later for rxenq update */ - frag_len = rx_status->fragmentcnt_framelen >> 16 ; + frag_len = le32_to_cpu(rx_status->fragmentcnt_framelen) >> 16; #if OLYMPIC_DEBUG - printk("length: %x, frag_len: %x, buffer_cnt: %x\n",length,frag_len,buffer_cnt); + printk("length: %x, frag_len: %x, buffer_cnt: %x\n", length, frag_len, buffer_cnt); #endif - - if(rx_status->status_buffercnt & 0xC0000000) { - if (rx_status->status_buffercnt & 0x3B000000) { + l_status_buffercnt = le32_to_cpu(rx_status->status_buffercnt); + if(l_status_buffercnt & 0xC0000000) { + if (l_status_buffercnt & 0x3B000000) { if (olympic_priv->olympic_message_level) { - if (rx_status->status_buffercnt & (1<<29)) /* Rx Frame Truncated */ + if (l_status_buffercnt & (1<<29)) /* Rx Frame Truncated */ printk(KERN_WARNING "%s: Rx Frame Truncated \n",dev->name); - if (rx_status->status_buffercnt & (1<<28)) /*Rx receive overrun */ + if (l_status_buffercnt & (1<<28)) /*Rx receive overrun */ printk(KERN_WARNING "%s: Rx Frame Receive overrun \n",dev->name); - if (rx_status->status_buffercnt & (1<<27)) /* No receive buffers */ + if (l_status_buffercnt & (1<<27)) /* No receive buffers */ printk(KERN_WARNING "%s: No receive buffers \n",dev->name); - if (rx_status->status_buffercnt & (1<<25)) /* Receive frame error detect */ + if (l_status_buffercnt & (1<<25)) /* Receive frame error detect */ printk(KERN_WARNING "%s: Receive frame error detect \n",dev->name); - if (rx_status->status_buffercnt & (1<<24)) /* Received Error Detect */ + if (l_status_buffercnt & (1<<24)) /* Received Error Detect */ printk(KERN_WARNING "%s: Received Error Detect \n",dev->name); } olympic_priv->rx_ring_last_received += i ; @@ -705,8 +725,8 @@ skb2=olympic_priv->rx_ring_skb[rx_ring_last_received] ; skb_put(skb2,length); skb2->protocol = tr_type_trans(skb2,dev); - olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer=virt_to_bus(skb->data); - olympic_priv->olympic_rx_ring[rx_ring_last_received].res_length = olympic_priv->pkt_buf_sz ; + olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer = cpu_to_le32(virt_to_bus(skb->data)); + olympic_priv->olympic_rx_ring[rx_ring_last_received].res_length = cpu_to_le32(olympic_priv->pkt_buf_sz); olympic_priv->rx_ring_skb[rx_ring_last_received] = skb ; netif_rx(skb2) ; } else { @@ -715,8 +735,8 @@ olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1); rx_ring_last_received = olympic_priv->rx_ring_last_received ; rx_desc = &(olympic_priv->olympic_rx_ring[rx_ring_last_received]); - cpy_length = (i == 1 ? frag_len : rx_desc->res_length); - memcpy(skb_put(skb, cpy_length), bus_to_virt(rx_desc->buffer), cpy_length) ; + cpy_length = (i == 1 ? frag_len : le32_to_cpu(rx_desc->res_length)); + memcpy(skb_put(skb, cpy_length), bus_to_virt(le32_to_cpu(rx_desc->buffer)), cpy_length) ; } while (--i) ; skb->protocol = tr_type_trans(skb,dev); @@ -852,8 +872,8 @@ spin_lock_irqsave(&olympic_priv->olympic_lock, flags) ; if(olympic_priv->free_tx_ring_entries) { - olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer=virt_to_bus(skb->data); - olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length=skb->len | (0x80000000); + olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer = cpu_to_le32(virt_to_bus(skb->data)); + olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length = cpu_to_le32(skb->len | (0x80000000)); olympic_priv->tx_ring_skb[olympic_priv->tx_ring_free]=skb; olympic_priv->free_tx_ring_entries--; @@ -1240,9 +1260,9 @@ if (readb(arb_block+0) == ARB_RECEIVE_DATA) { /* Receive.data, MAC frames */ header_len = readb(arb_block+8) ; /* 802.5 Token-Ring Header Length */ - frame_len = ntohs(readw(arb_block + 10)) ; + frame_len = swab16(readw(arb_block + 10)) ; - buff_off = ntohs(readw(arb_block + 6)) ; + buff_off = swab16(readw(arb_block + 6)) ; buf_ptr = olympic_priv->olympic_lap + buff_off ; @@ -1264,7 +1284,7 @@ do { frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ; - buffer_len = ntohs(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); + buffer_len = swab16(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); memcpy_fromio(skb_put(mac_frame, buffer_len), frame_data , buffer_len ) ; next_ptr=readw(buf_ptr+offsetof(struct mac_receive_buffer,next)); @@ -1301,12 +1321,12 @@ writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM); - olympic_priv->asb_queued = 2 ; + olympic_priv->asb_queued = 2; - return ; + return; } else if (readb(arb_block) == ARB_LAN_CHANGE_STATUS) { /* Lan.change.status */ - lan_status = ntohs(readw(arb_block+6)) ; + lan_status = swab16(readw(arb_block+6)) ; fdx_prot_error = readb(arb_block+8) ; /* Issue ARB Free */ @@ -1572,9 +1592,9 @@ readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+3), readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+4), readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+5), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, acc_priority))), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, att_code)))); + swab16(readw(opt+offsetof(struct olympic_parameters_table, acc_priority))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, att_code)))); size += sprintf(buffer+size, "%6s: Source Address : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n", dev->name) ; @@ -1587,20 +1607,20 @@ readb(opt+offsetof(struct olympic_parameters_table, source_addr)+3), readb(opt+offsetof(struct olympic_parameters_table, source_addr)+4), readb(opt+offsetof(struct olympic_parameters_table, source_addr)+5), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, major_vector))), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, lan_status))), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, local_ring))), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, mon_error))), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, frame_correl)))); + swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, major_vector))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, lan_status))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, local_ring))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, mon_error))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, frame_correl)))); size += sprintf(buffer+size, "%6s: Beacon Details : Tx : Rx : NAUN Node Address : NAUN Node Phys : \n", dev->name) ; size += sprintf(buffer+size, "%6s: : %02x : %02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x : \n", dev->name, - ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))), - ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))), + swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))), readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)), readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+1), readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+2), diff -urN v2.2.15/linux/drivers/net/olympic.h linux/drivers/net/olympic.h --- v2.2.15/linux/drivers/net/olympic.h Wed May 3 17:16:41 2000 +++ linux/drivers/net/olympic.h Wed Jun 7 14:26:43 2000 @@ -207,6 +207,8 @@ /* Olympic data structures */ +/* xxxx These structures are all little endian in hardware. */ + struct olympic_tx_desc { __u32 buffer; __u32 status_length; @@ -218,13 +220,15 @@ struct olympic_rx_desc { __u32 buffer; - __u32 res_length ; + __u32 res_length; }; struct olympic_rx_status { __u32 fragmentcnt_framelen; __u32 status_buffercnt; }; +/* xxxx END These structures are all little endian in hardware. */ +/* xxxx There may be more, but I'm pretty sure about these */ struct mac_receive_buffer { __u16 next ; @@ -236,10 +240,10 @@ struct olympic_private { - __u16 srb; - __u16 trb; - __u16 arb; - __u16 asb; + __u16 srb; /* be16 */ + __u16 trb; /* be16 */ + __u16 arb; /* be16 */ + __u16 asb; /* be16 */ __u8 *olympic_mmio; __u8 *olympic_lap; diff -urN v2.2.15/linux/drivers/net/plx9060.h linux/drivers/net/plx9060.h --- v2.2.15/linux/drivers/net/plx9060.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/plx9060.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,349 @@ +/* plx9060 + * -*- linux-c -*- + * + * SBE wanXL device driver + * Copyright (C) 1999 RG Studio s.c., http://www.rgstudio.com.pl/ + * Written by Krzysztof Halasa + * + * Portions (C) SBE Inc., used by permission. + * + * Sources: + * wanXL technical reference manuals + * wanXL UNIXware X.25 driver + * Donald Becker's skeleton.c driver + * "Linux Kernel Module Programming" by Ori Pomerantz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __PLX9060_H +#define __PLX9060_H + + +typedef struct { + /* + * Local Configuration Registers + */ + volatile u32 range_las; /* Range for PCI to Local Address Space */ + volatile u32 remap_las; /* Re-map for PCI to Local Address Spc */ + volatile u32 lcl_arb; /* 9060ES Local Arbitration Register */ + volatile u32 _res5; /* Reserved */ + volatile u32 range_rom; /* Range for PCI to Expansion ROM */ + volatile u32 remap_rom; /* Re-map for PCI to Expansion ROM */ + volatile u32 region; /* Bus Region Descriptors for PCI to Local */ + volatile u32 range_dm; /* Range for Direct Master to PCI */ + volatile u32 lba_pmem; /* Local Base Address for PCI Memory Space */ + volatile u32 lba_pio; /* Local Base Address for PCI I/O - Cfg Spc*/ + volatile u32 remap_dm; /* Re-map for Direct Master to PCI */ + volatile u32 car_cfgio; /* Configuration Address Reg Cfg | I/O Spc */ + + volatile u8 _res6[(0x40 - 0x2C - 0x04)]; + + volatile u32 mbox_0; /* Mailbox #0 - sts */ + volatile u32 mbox_1; /* Mailbox #1 - cmd */ + volatile u32 mbox_2; /* Mailbox #2 - user */ + volatile u32 mbox_3; /* Mailbox #3 - intr */ + volatile u32 mbox_4; /* Mailbox #4 */ + volatile u32 mbox_5; /* Mailbox #5 */ + volatile u32 mbox_6; /* Mailbox #6 */ + volatile u32 mbox_7; /* Mailbox #7 */ + + volatile u32 dbr_in; /* Doorbell Reg Incoming Interrupts from PCI */ + volatile u32 dbr_out; /* Doorbell Reg Outgoing Interrupts to PCI */ + volatile u32 intr_cs; /* Interrupt Control and Status */ + volatile u32 control; /* EEPROM, Cmd codes, User I/O, Init Done */ + + volatile u8 _res8[(0x100 - 0xEC - 0x04)]; + + volatile u32 dma_mode_0; /* DMA Chan. #0 Mode Register */ + volatile u32 dma_pci_0; /* DMA Chan. #0 PCI Address Register */ + volatile u32 dma_lcl_0; /* DMA Chan. #0 Local Address Register */ + volatile u32 dma_cnt_0; /* DMA Chan. #0 Transfer Count Register */ + volatile u32 dma_desc_0; /* DMA Chan. #0 Descriptor Pointer */ + + volatile u32 dma_mode_1; /* DMA Chan. #1 Mode Register */ + volatile u32 dma_pci_1; /* DMA Chan. #1 PCI Address Register */ + volatile u32 dma_lcl_1; /* DMA Chan. #1 Local Address Register */ + volatile u32 dma_cnt_1; /* DMA Chan. #1 Transfer Count Register */ + volatile u32 dma_desc_1; /* DMA Chan. #1 Descriptor Pointer */ + + volatile u32 dma_csr; /* DMA Command/Status Register */ + volatile u32 dma_arb_0; /* DMA Arbitration Register 0 */ + volatile u32 dma_arb_1; /* DMA Arbitration Register 1 */ +}plx9060; + + +/********************************************************************** +** Register Offsets and Bit Definitions +** +** Note: All offsets zero relative. IE. Some standard base address +** must be added to the Register Number to properly access the register. +** +**********************************************************************/ + +#define PLX_LASMAP_REG 0x0000 /* L, Local Addr Space Range Register */ +#define LASMAP_IO 0x00000001 /* Map to: 1=I/O, 0=Mem */ +#define LMAP_ANY32 0x00000000 /* Locate anywhere in 32 bit */ +#define LMAP_LT1MB 0x00000002 /* Locate in 1st meg */ +#define LMAP_ANY64 0x00000004 /* Locate anywhere in 64 bit */ + +#define PLX_LASRNG_REG 0x0004 /* L, Local Addr Space Range Register */ +#define LRNG_EN 0x00000001 /* Enable slave decode */ +#define LRNG_IO 0xFFFFFFFC /* Decode bits if I/O spc */ +#define LRNG_MEM 0xFFFFFFF0 /* Decode bits if mem spc */ + + +/* Note: The Local Arbitration Register is only present on the 9060ES part. +** The 9060 part with DMA does not have this register +*/ +#define PLX_LCLARB_REG 0x0008 /* L, Local Arbitration Register */ +#define LARB_LLT 0x0000000F /* Local Bus Latency Timer */ +#define LARB_LPT 0x000000F0 /* Local Bus Pause Timer */ +#define LARB_LTEN 0x00000100 /* Latency Timer Enable */ +#define LARB_LPEN 0x00000200 /* Pause Timer Enable */ +#define LARB_BREQ 0x00000400 /* Local Bus BREQ Enable */ + +/* Note: The Expansion ROM stuff is only relevant to the PC environment. +** This expansion ROM code is executed by the host CPU at boot time. +** For this reason no bit definitions are provided here. +*/ +#define PLX_ROMRNG_REG 0x0010 /* L, Expn ROM Space Range Register */ +#define PLX_ROMMAP_REG 0x0014 /* L, Local Addr Space Range Register */ + + +#define PLX_REGION_REG 0x0018 /* L, Local Bus Region Descriptor */ +#define RGN_WIDTH 0x00000002 /* Local bus width bits */ +#define RGN_8BITS 0x00000000 /* 08 bit Local Bus */ +#define RGN_16BITS 0x00000001 /* 16 bit Local Bus */ +#define RGN_32BITS 0x00000002 /* 32 bit Local Bus */ +#define RGN_MWS 0x0000003C /* Memory Access Wait States */ +#define RGN_0MWS 0x00000000 +#define RGN_1MWS 0x00000004 +#define RGN_2MWS 0x00000008 +#define RGN_3MWS 0x0000000C +#define RGN_4MWS 0x00000010 +#define RGN_6MWS 0x00000018 +#define RGN_8MWS 0x00000020 +#define RGN_MRE 0x00000040 /* Memory Space Ready Input Enable */ +#define RGN_MBE 0x00000080 /* Memory Space Bterm Input Enable */ +#define RGN_RWS 0x003C0000 /* Expn ROM Wait States */ +#define RGN_RRE 0x00400000 /* ROM Space Ready Input Enable */ +#define RGN_RBE 0x00800000 /* ROM Space Bterm Input Enable */ +#define RGN_MBEN 0x01000000 /* Memory Space Burst Enable */ +#define RGN_RBEN 0x04000000 /* ROM Space Burst Enable */ +#define RGN_THROT 0x08000000 /* De-assert TRDY when FIFO full */ +#define RGN_TRD 0xF0000000 /* Target Ready Delay /8 */ + + +#define PLX_DMRNG_REG 0x001C /* L, Direct Master Range Register */ + +#define PLX_LBAPMEM_REG 0x0020 /* L, Lcl Base Addr for PCI mem space */ + +#define PLX_LBAPIO_REG 0x0024 /* L, Lcl Base Addr for PCI I/O space */ + +#define PLX_DMMAP_REG 0x0028 /* L, Direct Master Remap Register */ +#define DMM_MAE 0x00000001 /* Direct Mstr Memory Acc Enable */ +#define DMM_IAE 0x00000002 /* Direct Mstr I/O Acc Enable */ +#define DMM_LCK 0x00000004 /* LOCK Input Enable */ +#define DMM_PF4 0x00000008 /* Prefetch 4 Mode Enable */ +#define DMM_THROT 0x00000010 /* Assert IRDY when read FIFO full */ +#define DMM_PAF0 0x00000000 /* Programmable Almost fill level */ +#define DMM_PAF1 0x00000020 /* Programmable Almost fill level */ +#define DMM_PAF2 0x00000040 /* Programmable Almost fill level */ +#define DMM_PAF3 0x00000060 /* Programmable Almost fill level */ +#define DMM_PAF4 0x00000080 /* Programmable Almost fill level */ +#define DMM_PAF5 0x000000A0 /* Programmable Almost fill level */ +#define DMM_PAF6 0x000000C0 /* Programmable Almost fill level */ +#define DMM_PAF7 0x000000D0 /* Programmable Almost fill level */ +#define DMM_MAP 0xFFFF0000 /* Remap Address Bits */ + +#define PLX_CAR_REG 0x002C /* L, Configuration Address Register */ +#define CAR_CT0 0x00000000 /* Config Type 0 */ +#define CAR_CT1 0x00000001 /* Config Type 1 */ +#define CAR_REG 0x000000FC /* Register Number Bits */ +#define CAR_FUN 0x00000700 /* Function Number Bits */ +#define CAR_DEV 0x0000F800 /* Device Number Bits */ +#define CAR_BUS 0x00FF0000 /* Bus Number Bits */ +#define CAR_CFG 0x80000000 /* Config Spc Access Enable */ + + +#define PLX_DBR_IN_REG 0x0060 /* L, PCI to Local Doorbell Register */ + +#define PLX_DBR_OUT_REG 0x0064 /* L, Local to PCI Doorbell Register */ + +#define PLX_INTRCS_REG 0x0068 /* L, Interrupt Control/Status Reg */ +#define ICS_AERR 0x00000001 /* Assert LSERR on ABORT */ +#define ICS_PERR 0x00000002 /* Assert LSERR on Parity Error */ +#define ICS_SERR 0x00000004 /* Generate PCI SERR# */ +#define ICS_PIE 0x00000100 /* PCI Interrupt Enable */ +#define ICS_PDIE 0x00000200 /* PCI Doorbell Interrupt Enable */ +#define ICS_PAIE 0x00000400 /* PCI Abort Interrupt Enable */ +#define ICS_PLIE 0x00000800 /* PCI Local Int Enable */ +#define ICS_RAE 0x00001000 /* Retry Abort Enable */ +#define ICS_PDIA 0x00002000 /* PCI Doorbell Interrupt Active */ +#define ICS_PAIA 0x00004000 /* PCI Abort Interrupt Active */ +#define ICS_LIA 0x00008000 /* Local Interrupt Active */ +#define ICS_LIE 0x00010000 /* Local Interrupt Enable */ +#define ICS_LDIE 0x00020000 /* Local Doorbell Int Enable */ +#define ICS_DMA0_E 0x00040000 /* DMA #0 Interrupt Enable */ +#define ICS_DMA1_E 0x00080000 /* DMA #1 Interrupt Enable */ +#define ICS_LDIA 0x00100000 /* Local Doorbell Int Active */ +#define ICS_DMA0_A 0x00200000 /* DMA #0 Interrupt Active */ +#define ICS_DMA1_A 0x00400000 /* DMA #1 Interrupt Active */ +#define ICS_BIA 0x00800000 /* BIST Interrupt Active */ +#define ICS_TA_DM 0x01000000 /* Target Abort - Direct Master */ +#define ICS_TA_DMA0 0x02000000 /* Target Abort - DMA #0 */ +#define ICS_TA_DMA1 0x04000000 /* Target Abort - DMA #1 */ +#define ICS_TA_RA 0x08000000 /* Target Abort - Retry Timeout */ + +#define PLX_CONTROL_REG 0x006C /* L, EEPROM Cntl & PCI Cmd Codes */ +#define CTL_RDMA 0x0000000F /* DMA Read Command */ +#define CTL_WDMA 0x000000F0 /* DMA Write Command */ +#define CTL_RMEM 0x00000F00 /* Memory Read Command */ +#define CTL_WMEM 0x0000F000 /* Memory Write Command */ +#define CTL_USER0 0x00010000 /* USER0 pin control bit */ +#define CTL_USER1 0x00020000 /* USER1 pin control bit */ +#define CTL_EE_CLK 0x01000000 /* EEPROM Clock line */ +#define CTL_EE_CS 0x02000000 /* EEPROM Chip Select */ +#define CTL_EE_W 0x04000000 /* EEPROM Write bit */ +#define CTL_EE_R 0x08000000 /* EEPROM Read bit */ +#define CTL_EECHK 0x10000000 /* EEPROM Present bit */ +#define CTL_EERLD 0x20000000 /* EEPROM Reload Register */ +#define CTL_RESET 0x40000000 /* !! Adapter Reset !! */ +#define CTL_READY 0x80000000 /* Local Init Done */ + +/* + * Accesses near the end of memory can cause the PLX chip + * to pre-fetch data off of end-of-ram. Limit the size of + * memory so host-side accesses cannot occur. + */ + +#define PLX_PREFETCH 32 + +/* + * The PCI Interface, via the PCI-9060 Chip, has up to eight (8) Mailbox + * Registers. The PUTS (Power-Up Test Suite) handles the board-side + * interface/interaction using the first 4 registers. Specifications for + * the use of the full PUTS' command and status interface is contained + * within a separate SBE PUTS Manual. The Host-Side Device Driver only + * uses a subset of the full PUTS interface. + */ + + +/*****************************************/ +/*** MAILBOX #(-1) - MEM ACCESS STS ***/ +/*****************************************/ + +#define MBX_STS_VALID 0x57584744 /* 'WXGD' */ +#define MBX_STS_DILAV 0x44475857 /* swapped = 'DGXW' */ + +/*****************************************/ +/*** MAILBOX #0 - PUTS STATUS ***/ +/*****************************************/ + +#define MBX_STS_MASK 0x000000ff /* PUTS Status Register bits */ +#define MBX_STS_TMASK 0x0000000f /* register bits for TEST number */ + +#define MBX_STS_PCIRESET 0x00000100 /* Host issued PCI reset request */ +#define MBX_STS_BUSY 0x00000080 /* PUTS is in progress */ +#define MBX_STS_ERROR 0x00000040 /* PUTS has failed */ +#define MBX_STS_RESERVED 0x000000c0 /* Undefined -> status in transition. + We are in process of changing + bits; we SET Error bit before + RESET of Busy bit */ + +#define MBX_RESERVED_5 0x00000020 /* FYI: reserved/unused bit */ +#define MBX_RESERVED_4 0x00000010 /* FYI: reserved/unused bit */ + + +/******************************************/ +/*** MAILBOX #1 - PUTS COMMANDS ***/ +/******************************************/ + +/* + * Any attempt to execute an unimplement command results in the PUTS + * interface executing a NOOP and continuing as if the offending command + * completed normally. Note: this supplies a simple method to interrogate + * mailbox command processing functionality. + */ + +#define MBX_CMD_MASK 0xffff0000 /* PUTS Command Register bits */ + +#define MBX_CMD_ABORTJ 0x85000000 /* abort and jump */ +#define MBX_CMD_RESETP 0x86000000 /* reset and pause at start */ +#define MBX_CMD_PAUSE 0x87000000 /* pause immediately */ +#define MBX_CMD_PAUSEC 0x88000000 /* pause on completion */ +#define MBX_CMD_RESUME 0x89000000 /* resume operation */ +#define MBX_CMD_STEP 0x8a000000 /* single step tests */ + +#define MBX_CMD_BSWAP 0x8c000000 /* identify byte swap scheme */ +#define MBX_CMD_BSWAP_0 0x8c000000 /* use scheme 0 */ +#define MBX_CMD_BSWAP_1 0x8c000001 /* use scheme 1 */ + +#define MBX_CMD_SETHMS 0x8d000000 /* setup host memory access window + size */ +#define MBX_CMD_SETHBA 0x8e000000 /* setup host memory access base + address */ +#define MBX_CMD_MGO 0x8f000000 /* perform memory setup and continue + (IE. Done) */ +#define MBX_CMD_NOOP 0xFF000000 /* dummy, illegal command */ + +/*****************************************/ +/*** MAILBOX #2 - MEMORY SIZE ***/ +/*****************************************/ + +#define MBX_MEMSZ_MASK 0xffff0000 /* PUTS Memory Size Register bits */ + +#define MBX_MEMSZ_128KB 0x00020000 /* 128 kilobyte board */ +#define MBX_MEMSZ_256KB 0x00040000 /* 256 kilobyte board */ +#define MBX_MEMSZ_512KB 0x00080000 /* 512 kilobyte board */ +#define MBX_MEMSZ_1MB 0x00100000 /* 1 megabyte board */ +#define MBX_MEMSZ_2MB 0x00200000 /* 2 megabyte board */ +#define MBX_MEMSZ_4MB 0x00400000 /* 4 megabyte board */ +#define MBX_MEMSZ_8MB 0x00800000 /* 8 megabyte board */ +#define MBX_MEMSZ_16MB 0x01000000 /* 16 megabyte board */ + + +/***************************************/ +/*** MAILBOX #2 - BOARD TYPE ***/ +/***************************************/ + +#define MBX_BTYPE_MASK 0x0000ffff /* PUTS Board Type Register */ +#define MBX_BTYPE_FAMILY_MASK 0x0000ff00 /* PUTS Board Family Register */ +#define MBX_BTYPE_SUBTYPE_MASK 0x000000ff /* PUTS Board Subtype */ + +#define MBX_BTYPE_PLX9060 0x00000100 /* PLX family type */ +#define MBX_BTYPE_PLX9080 0x00000300 /* PLX wanXL100s family type */ + +#define MBX_BTYPE_WANXL_4 0x00000104 /* wanXL400, 4-port */ +#define MBX_BTYPE_WANXL_2 0x00000102 /* wanXL200, 2-port */ +#define MBX_BTYPE_WANXL_1s 0x00000301 /* wanXL100s, 1-port */ +#define MBX_BTYPE_WANXL_1t 0x00000401 /* wanXL100T1, 1-port */ + + +/*****************************************/ +/*** MAILBOX #3 - SHMQ MAILBOX ***/ +/*****************************************/ + +#define MBX_SMBX_MASK 0x000000ff /* PUTS SHMQ Mailbox bits */ + + +/***************************************/ +/*** GENERIC HOST-SIDE DRIVER ***/ +/***************************************/ + +#define MBX_ERR 0 +#define MBX_OK 1 + +/* mailbox check routine - type of testing */ +#define MBXCHK_STS 0x00 /* check for PUTS status */ +#define MBXCHK_NOWAIT 0x01 /* dont care about PUTS status */ + +/* system allocates this many bytes for address mapping mailbox space */ +#define MBX_ADDR_SPACE_360 0x80 /* wanXL100s/200/400 */ +#define MBX_ADDR_MASK_360 (MBX_ADDR_SPACE_360-1) + +#endif /* __PLX9060_H */ diff -urN v2.2.15/linux/drivers/net/sealevel.c linux/drivers/net/sealevel.c --- v2.2.15/linux/drivers/net/sealevel.c Mon Aug 9 12:04:39 1999 +++ linux/drivers/net/sealevel.c Wed Jun 7 14:26:43 2000 @@ -32,6 +32,7 @@ struct slvl_device { + void *if_ptr; /* General purpose pointer (used by SPPP) */ struct z8530_channel *chan; struct ppp_device netdev; char name[16]; @@ -243,7 +244,18 @@ memset(b, 0, sizeof(*sv)); b->dev[0].chan = &b->board.chanA; + b->dev[0].if_ptr = &b->dev[0].netdev; + b->dev[0].netdev.dev=(struct device *) + kmalloc(sizeof(struct device), GFP_KERNEL); + if(!b->dev[0].netdev.dev) + goto fail2; + b->dev[1].chan = &b->board.chanB; + b->dev[1].if_ptr = &b->dev[1].netdev; + b->dev[1].netdev.dev=(struct device *) + kmalloc(sizeof(struct device), GFP_KERNEL); + if(!b->dev[1].netdev.dev) + goto fail1_0; dev=&b->board; @@ -283,14 +295,14 @@ if(request_irq(irq, &z8530_interrupt, SA_INTERRUPT, "SeaLevel", dev)<0) { printk(KERN_WARNING "sealevel: IRQ %d already in use.\n", irq); - goto fail2; + goto fail1_1; } dev->irq=irq; dev->chanA.private=&b->dev[0]; dev->chanB.private=&b->dev[1]; - dev->chanA.netdevice=&b->dev[0].netdev.dev; - dev->chanB.netdevice=&b->dev[1].netdev.dev; + dev->chanA.netdevice=b->dev[0].netdev.dev; + dev->chanB.netdevice=b->dev[1].netdev.dev; dev->chanA.dev=dev; dev->chanB.dev=dev; dev->name=b->dev[0].name; @@ -399,6 +411,10 @@ free_dma(dev->chanA.txdma); fail: free_irq(irq, dev); +fail1_1: + kfree(b->dev[1].netdev.dev); +fail1_0: + kfree(b->dev[0].netdev.dev); fail2: kfree(b); fail3: @@ -414,8 +430,8 @@ for(u=0; u<2; u++) { - sppp_detach(&b->dev[u].netdev.dev); - unregister_netdev(&b->dev[u].netdev.dev); + sppp_detach(b->dev[u].netdev.dev); + unregister_netdev(b->dev[u].netdev.dev); } free_irq(b->board.irq, &b->board); diff -urN v2.2.15/linux/drivers/net/slhc.c linux/drivers/net/slhc.c --- v2.2.15/linux/drivers/net/slhc.c Tue Jan 4 10:12:18 2000 +++ linux/drivers/net/slhc.c Wed Jun 7 14:26:43 2000 @@ -78,7 +78,6 @@ #include #include #include -#include #include #include #include @@ -750,12 +749,6 @@ void cleanup_module(void) { return; -} - -#else /* MODULE */ - -__initfunc(void slhc_install(void)) -{ } #endif /* MODULE */ diff -urN v2.2.15/linux/drivers/net/smc9194.c linux/drivers/net/smc9194.c --- v2.2.15/linux/drivers/net/smc9194.c Wed Mar 10 16:51:35 1999 +++ linux/drivers/net/smc9194.c Wed Jun 7 14:26:43 2000 @@ -45,10 +45,12 @@ . Fixed bug reported by Gardner Buchanan in . smc_enable, with outw instead of outb . 03/06/96 Erik Stahlman Added hardware multicast from Peter Cammaert + . 04/14/00 Heiko Pruessing (SMA Regelsysteme) Fixed bug in chip memory + . allocation ----------------------------------------------------------------------------*/ static const char *version = - "smc9194.c:v0.12 03/06/96 by Erik Stahlman (erik@vt.edu)\n"; + "smc9194.c:v0.13 04/14/00 by Erik Stahlman (erik@vt.edu)\n"; #ifdef MODULE #include @@ -562,11 +564,15 @@ length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; + /* - . the MMU wants the number of pages to be the number of 256 bytes - . 'pages', minus 1 ( since a packet can't ever have 0 pages :) ) + ** The MMU wants the number of pages to be the number of 256 bytes + ** 'pages', minus 1 ( since a packet can't ever have 0 pages :) ) + ** + ** Pkt size for allocating is data length +6 (for additional status words, + ** length and ctl!) If odd size last byte is included in this header. */ - numPages = length / 256; + numPages = ((length & 0xfffe) + 6) / 256; if (numPages > 7 ) { printk(CARDNAME": Far too big packet error. \n"); diff -urN v2.2.15/linux/drivers/net/syncppp.c linux/drivers/net/syncppp.c --- v2.2.15/linux/drivers/net/syncppp.c Wed May 3 17:16:43 2000 +++ linux/drivers/net/syncppp.c Wed Jun 7 14:26:43 2000 @@ -50,6 +50,7 @@ #include #include #include +#include #include "syncppp.h" #define MAXALIVECNT 6 /* max. alive packets */ @@ -153,9 +154,9 @@ static void if_down(struct device *dev) { - struct sppp *sp = &((struct ppp_device *)dev)->sppp; + struct sppp *sp = (struct sppp *)sppp_of(dev); - sp->pp_link_state=SPPP_LINK_DOWN; + sp->pp_link_state = SPPP_LINK_DOWN; } /* @@ -191,7 +192,7 @@ void sppp_input (struct device *dev, struct sk_buff *skb) { struct ppp_header *h; - struct sppp *sp = &((struct ppp_device *)dev)->sppp; + struct sppp *sp = (struct sppp *)sppp_of(dev); skb->dev=dev; skb->mac.raw=skb->data; @@ -320,7 +321,7 @@ static int sppp_hard_header(struct sk_buff *skb, struct device *dev, __u16 type, void *daddr, void *saddr, unsigned int len) { - struct sppp *sp = &((struct ppp_device *)dev)->sppp; + struct sppp *sp = (struct sppp *)sppp_of(dev); struct ppp_header *h; skb_push(skb,sizeof(struct ppp_header)); h=(struct ppp_header *)skb->data; @@ -826,7 +827,7 @@ int sppp_close (struct device *dev) { - struct sppp *sp = &((struct ppp_device *)dev)->sppp; + struct sppp *sp = (struct sppp *)sppp_of(dev); sp->pp_link_state = SPPP_LINK_DOWN; sp->lcp.state = LCP_STATE_CLOSED; sp->ipcp.state = IPCP_STATE_CLOSED; @@ -839,7 +840,7 @@ int sppp_open (struct device *dev) { - struct sppp *sp = &((struct ppp_device *)dev)->sppp; + struct sppp *sp = (struct sppp *)sppp_of(dev); sppp_close(dev); if (!(sp->pp_flags & PP_CISCO)) { sppp_lcp_open (sp); @@ -852,7 +853,7 @@ int sppp_reopen (struct device *dev) { - struct sppp *sp = &((struct ppp_device *)dev)->sppp; + struct sppp *sp = (struct sppp *)sppp_of(dev); sppp_close(dev); if (!(sp->pp_flags & PP_CISCO)) { @@ -881,7 +882,7 @@ int sppp_do_ioctl(struct device *dev, struct ifreq *ifr, int cmd) { - struct sppp *sp = &((struct ppp_device *)dev)->sppp; + struct sppp *sp = (struct sppp *)sppp_of(dev); if(dev->flags&IFF_UP) return -EBUSY; @@ -904,6 +905,14 @@ if(ifr->ifr_flags) sp->pp_flags|=PP_DEBUG; break; + case SPPPIOCGFLAGS: + if(copy_to_user(ifr->ifr_data, &sp->pp_flags, sizeof(sp->pp_flags))) + return -EFAULT; + break; + case SPPPIOCSFLAGS: + if(copy_from_user(&sp->pp_flags, ifr->ifr_data, sizeof(sp->pp_flags))) + return -EFAULT; + break; default: return -EINVAL; } @@ -914,7 +923,7 @@ void sppp_attach(struct ppp_device *pd) { - struct device *dev=&pd->dev; + struct device *dev = pd->dev; struct sppp *sp = &pd->sppp; /* Initialize keepalive handler. */ @@ -971,8 +980,7 @@ void sppp_detach (struct device *dev) { - struct sppp **q, *p, *sp = &((struct ppp_device *)dev)->sppp; - + struct sppp **q, *p, *sp = (struct sppp *)sppp_of(dev); /* Remove the entry from the keepalive list. */ for (q = &spppq; (p = *q); q = &p->pp_next) @@ -1297,6 +1305,8 @@ sppp_packet_type.type=htons(ETH_P_WAN_PPP); dev_add_pack(&sppp_packet_type); } + +EXPORT_SYMBOL(sync_ppp_init); #ifdef MODULE diff -urN v2.2.15/linux/drivers/net/syncppp.h linux/drivers/net/syncppp.h --- v2.2.15/linux/drivers/net/syncppp.h Tue Jan 4 10:12:18 2000 +++ linux/drivers/net/syncppp.h Wed Jun 7 14:26:43 2000 @@ -52,10 +52,13 @@ struct ppp_device { - struct device dev; /* Network device */ + struct device *dev; /* Network device pointer */ struct sppp sppp; /* Synchronous PPP */ }; +#define sppp_of(dev) \ + (&((struct ppp_device *)(*(unsigned long *)((dev)->priv)))->sppp) + #define PP_KEEPALIVE 0x01 /* use keepalive protocol */ #define PP_CISCO 0x02 /* use Cisco protocol instead of PPP */ #define PP_TIMO 0x04 /* cp_timeout routine active */ @@ -86,10 +89,13 @@ int sppp_open (struct device *dev); int sppp_reopen (struct device *dev); int sppp_close (struct device *dev); +void sync_ppp_init (void); #endif #define SPPPIOCCISCO (SIOCDEVPRIVATE) #define SPPPIOCPPP (SIOCDEVPRIVATE+1) #define SPPPIOCDEBUG (SIOCDEVPRIVATE+2) +#define SPPPIOCSFLAGS (SIOCDEVPRIVATE+3) +#define SPPPIOCGFLAGS (SIOCDEVPRIVATE+4) #endif /* _SYNCPPP_H_ */ diff -urN v2.2.15/linux/drivers/net/via-rhine.c linux/drivers/net/via-rhine.c --- v2.2.15/linux/drivers/net/via-rhine.c Tue Oct 26 17:53:40 1999 +++ linux/drivers/net/via-rhine.c Wed Jun 7 14:26:43 2000 @@ -508,7 +508,9 @@ #ifndef MODULE int via_rhine_probe(struct device *dev) { - printk(KERN_INFO "%s" KERN_INFO "%s", versionA, versionB); + static int did_version = 0; + if (!did_version++) + printk(KERN_INFO "%s" KERN_INFO "%s", versionA, versionB); return pci_etherdev_probe(dev, pci_tbl); } #endif diff -urN v2.2.15/linux/drivers/net/wanxl.c linux/drivers/net/wanxl.c --- v2.2.15/linux/drivers/net/wanxl.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/wanxl.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,1233 @@ +/* wanxl.c + * -*- linux-c -*- + * + * (C) 1999 RG Studio s.c., http://www.rgstudio.com.pl/ + * Written by Krzysztof Halasa + * + * Portions (C) SBE Inc., used by permission. + * + * Sources: + * wanXL technical reference manuals + * wanXL UNIXware X.25 driver + * Donald Becker's skeleton.c driver + * "Linux Kernel Module Programming" by Ori Pomerantz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "syncppp.h" +#include +#include "plx9060.h" +#include "wanxl.h" + +static const char* version = "SBE wanXL driver revision: 1.0-pre9"; +static const char* irqdevname = "SBE wanXL"; + +#ifdef __LITTLE_ENDIAN +#define SWAP_OPTION MBX_CMD_BSWAP_1 +#else +#error "big endian untested yet" +#define SWAP_OPTION MBX_CMD_BSWAP_0 +#endif + + +#define WANXL_DEVICE_IDS 3 /* number of possible device IDs we will look + for on the PCI bus */ + +static int SBEdeviceIDs[WANXL_DEVICE_IDS] = { PCI_DEVICE_ID_SBE_WANXL100, + PCI_DEVICE_ID_SBE_WANXL200, + PCI_DEVICE_ID_SBE_WANXL400 }; + +#define MAX_PUTS_WAIT 20 /* in seconds */ +#define MAX_QUERY_WAIT 1 +#define WANXL_HOST_MEM_SIZE 0x10000000 +#define WANXL_BUS2HOST_MAP_ADDR 0x00000000 + +#define PCI_COMM_MAE 0x0002 /* memory access enable */ +#define PCI_COMM_ME 0x0004 /* master enable */ +#define PCI_CONF_COMM 0x4 /* command register, 2 bytes */ + + +static sbe_card *first_card=NULL; +static sbe_card **new_card=&first_card; + +static const char *cable_types[]={ "undefined0", + "undefined1", + "V.35", + "X.21", + "RS232", + "EIA530", + "no port", + "none" }; + + +#define max(x, y) (x > y ? x : y) + + + +static int wanxl_run_board(sbe_card *card, char *data, u32 *length); +#ifdef WANXL_QUERY +static int wanxl_query_port(sbe_port *port, char *data, u32 *length); +#endif + +static inline sbe_port* hdlc_to_port(hdlc_device *hdlc) +{ + return (sbe_port*)hdlc; +} + + + +static inline sbe_port* dev_to_port(struct device *dev) +{ + return hdlc_to_port(dev_to_hdlc(dev)); +} + + + +static inline char *port_name(sbe_port *port) +{ + return port->hdlc.name; +} + + + +static inline char *card_name(sbe_card *card) +{ + return card->first_port->hdlc.name; +} + + + +static inline int wanxl_card_running(sbe_card *card) +{ + return card->running; +} + + + +static inline void wanxl_send_interrupt(sbe_port *port, int transmit) +{ + if ((transmit && ((port->tx_ring->r_flags & BF_IREQ) == 0)) || + (!transmit && ((port->rx_ring->r_flags & BF_IREQ) == 0))) + return; /* No need for interrupt signaling */ + +#ifdef DEBUG_INTR + printk(KERN_DEBUG "%s: wanxl_send_interrupt (%s, node=%u)\n", + port_name(port), transmit ? "TX" : "RX", port->node); +#endif + if (transmit) + transmit=TX_IRQ_BIAS; + + writel(1<<(transmit+port->node), &port->card->wx_plx_viraddr->dbr_in); +} + + + +static void wanxl_parse_injector(sbe_port *port, void *data, u32 len) +{ + int i; + + printk(KERN_INFO "%s: got injector (len=%X):", port->hdlc.name, len); + + for (i=0; i<(len+3)/4; i++) + printk(" %08X", ((u32*)data)[i]); + printk("\n"); +} + + + +static int wanxl_submit_injector(sbe_port *port, void *packet, u32 size, + int wait) +{ +#ifdef DEBUG_INJ + int i; +#endif + pkt_desc *tx_pkt=port->tx_ring->v_inject; + pkt_desc *rx_pkt=port->rx_ring->v_inject; + bio_wrap *bio_tx=tx_pkt->v_data; + bio_wrap *bio_rx=rx_pkt->v_data; + u32 cmd; + + if (tx_pkt->pd_flags & PD_READY) { + sleep_on_timeout(&port->tx_inj, HZ*MAX_QUERY_WAIT); + if (tx_pkt->pd_flags & PD_READY) + return -EBUSY; /* TX injector still in use */ + } + + memcpy(bio_tx, packet, size); + cmd=bio_tx->type; + tx_pkt->pd_length=size; +#ifdef DEBUG_INJ + printk(KERN_DEBUG "%s: Sending injector:", port_name(port)); + for (i=0; ipd_flags=PD_FLAGS_INJ|PD_READY; + wanxl_send_interrupt(port, 1); + + if (!wait) + return 0; + + while(1) { + sleep_on_timeout(&port->rx_inj, HZ*MAX_QUERY_WAIT); + if ((rx_pkt->pd_flags & PD_READY)==0) { + printk(KERN_WARNING "%s: Timeout when waiting for " + "injector %X\n", port_name(port), cmd); + return -EIO; + } + + if (bio_rx->type==cmd && rx_pkt->pd_length==size) + break; + + wanxl_parse_injector(port, bio_rx, rx_pkt->pd_length); + rx_pkt->pd_flags=PD_FLAGS_INJ; + wanxl_send_interrupt(port, 0); + } + + memcpy(packet, bio_rx, size); + rx_pkt->pd_flags=PD_FLAGS_INJ; + wanxl_send_interrupt(port, 0); + + if (bio_rx->status) { + printk(KERN_WARNING "%s: injector %X failed, status=%X\n", + port_name(port), cmd, bio_rx->status); + return -EIO; + } + + return 0; +} + + + +static void wanxl_intr(int irq, void *dev_id, struct pt_regs *regs) +{ + sbe_card *card=dev_id; + sbe_port *port; + u32 int_mask; + + if (!wanxl_card_running(card)) + return; + + int_mask=readl(&card->wx_plx_viraddr->dbr_out); + writel(int_mask, &card->wx_plx_viraddr->dbr_out); /* Confirm IRQ */ + + for (port=card->first_port; port!=NULL; port=port->next_port) { + pkt_desc *pkt; + + if (port->rx_ring->v_inject->pd_flags & PD_READY) + if (waitqueue_active(&port->rx_inj)) + wake_up(&port->rx_inj); /* Got injector response */ + + if ((port->tx_ring->v_inject->pd_flags & PD_READY) == 0) + if (waitqueue_active(&port->tx_inj)) + wake_up(&port->tx_inj); /* Got free injector */ + + pkt=port->next_rx_pkt; + while (pkt->pd_flags & PD_READY) { +#ifdef DEBUG_PKT + int i; +#endif + if (pkt->pd_flags & PD_ERR) + port->hdlc.stats.rx_errors++; /* RX error */ + else { + struct sk_buff *skb=pkt->v_data; +#ifdef DEBUG_PKT + printk(KERN_DEBUG "%s RX (PCI=%08x, " + "proto=%x):", port_name(port), + pkt->p_data, pkt->mux.fr.protid); + for (i=0; ipd_length; i++) + printk(" %02X", skb->data[i]); + printk("\n"); +#endif + if ((port->mode & MODE_FR) && pkt->mux.fr.protid!=IP_PROTID && + pkt->mux.fr.protid!=ARP_PROTID) + port->hdlc.stats.rx_errors++; /* Ignore it for now */ + else { + struct sk_buff *newskb=dev_alloc_skb(HDLC_MAX_MTU); + if (newskb==NULL) + port->hdlc.stats.rx_dropped++; + else { + skb_put(skb, pkt->pd_length); + if ((port->mode & MODE_FR) && pkt->mux.fr.protid==ARP_PROTID) { + skb_pull(skb, 2); /* Remove 2 byte header left by PDM */ + skb->protocol=htons(ETH_P_ARP); + } else + skb->protocol=htons(ETH_P_IP); + + hdlc_netif_rx(&port->hdlc, skb, pkt->mux.fr.dlci); + pkt->v_data=newskb; + pkt->p_data=virt_to_bus(newskb->data); + } + } + } + + pkt->pd_length=0; + pkt->pd_flags = PD_FLAGS_RX | (pkt->pd_flags & PD_LAST); + + if (pkt->pd_flags & PD_LAST) + pkt=port->rx_ring->v_ring; /* Rewind */ + else + pkt++; + } /* while */ + + port->next_rx_pkt=pkt; + wanxl_send_interrupt(port, 0); /* RX ring serviced */ + + pkt=port->next_tx_pkt_done; + while (pkt->pd_flags & PD_DONE) { + if (pkt->pd_flags & PD_ERR) + printk(KERN_WARNING "%s: PD_ERROR set on TX packet\n", + port_name(port)); + + port->hdlc.stats.tx_packets++; + port->hdlc.stats.tx_bytes+=pkt->pd_length; + + dev_kfree_skb(pkt->v_data); + pkt->pd_flags = PD_FLAGS_TX | (pkt->pd_flags & PD_LAST); + + if (pkt->pd_flags & PD_LAST) + pkt=port->tx_ring->v_ring; /* Rewind */ + else + pkt++; + } /* while */ + port->next_tx_pkt_done=pkt; + wanxl_send_interrupt(port, 1); /* TX ring serviced */ + } +} + + + +static int wanxl_set_mode(hdlc_device *hdlc, int mode) +{ + sbe_port *port=hdlc_to_port(hdlc); + + if (wanxl_card_running(port->card)==0) + return -ENOSYS; /* Card not initialized */ + + if (mode!=MODE_HDLC && mode!=MODE_FR_ANSI && mode!=MODE_FR_CCITT) + return -ENOSYS; /* Not supported on this hardware yet */ + + port->mode=mode; + return 0; +} + + + +static int wanxl_create_pvc(pvc_device *pvc) +{ + sbe_port *port=hdlc_to_port(pvc->master); + u16 dlci=netdev_dlci(&pvc->netdev); + b_tnioc packet; + int result; + + if (wanxl_card_running(port->card)==0) + return -ENOSYS; /* Card not initialized */ + + if (!(hdlc_to_dev(pvc->master)->flags & IFF_UP)) + return -ENOSYS; /* HDLC port down */ + + memset(&packet, 0, sizeof(packet)); + packet.bio.type=B_SETTUNE; + packet.tune.fr_pvc.dlci=dlci; + packet.tune.fr_pvc.cir=16000; + packet.tune.fr_pvc.Bc=16000; + packet.tune.fr_pvc.Be=2048000; + packet.tune.fr_pvc.stepcount=8; + packet.tune.fr_pvc.flowstyle=FECN; + /* FIXME - must be set ? why ? */ + packet.tune.fr_pvc.protid=IP_PROTID|ARP_PROTID; + packet.type=FR_PVC_TYPE; + result = wanxl_submit_injector(port, &packet, sizeof(packet), 0); + if (result) + return result; + + return 0; +} + + + +static int wanxl_open_pvc(pvc_device *pvc) +{ + pvc->state |= PVC_STATE_ACTIVE; /* FIXME */ + return 0; +} + + + +static int wanxl_open(hdlc_device *hdlc) +{ + sbe_port *port=hdlc_to_port(hdlc); + b_tnioc packet; + int result; + + memset(&packet, 0, sizeof(packet)); + packet.bio.type=B_SETTUNE; + packet.tune.wan.WAN_baud=2048000; + packet.tune.wan.WAN_maxframe=HDLC_MAX_MTU; + packet.type=HDLC_TYPE; + result=wanxl_submit_injector(port, &packet, sizeof(packet), 1); + if (result) + return result; + + + memset(&packet.bio, 0, sizeof(packet.bio)); + packet.bio.type=B_OPEN; + result=wanxl_submit_injector(port, &packet.bio, sizeof(packet.bio), 1); + if (result) + return result; + + + if (port->mode==MODE_FR_ANSI || port->mode==MODE_FR_CCITT) { + memset(&packet, 0, sizeof(packet)); + packet.bio.type=B_SETTUNE; + packet.tune.fr.T391=hdlc->lmi.T391; + packet.tune.fr.T392=hdlc->lmi.T392; + packet.tune.fr.N391=hdlc->lmi.N391; + packet.tune.fr.N392=hdlc->lmi.N392; + packet.tune.fr.N393=hdlc->lmi.N393; + packet.tune.fr.maxframesize=HDLC_MAX_MTU; + packet.tune.fr.accessrate=2048000; + if (port->mode==MODE_FR_CCITT) + packet.tune.fr.standard=ITU; + else + packet.tune.fr.standard=ANSI; + packet.tune.fr.conform=NONE; + packet.type=FR_TYPE; + result=wanxl_submit_injector(port, &packet, sizeof(packet), 0); + if (result) + return result; + } + + + memset(&packet.bio, 0, sizeof(packet.bio)); + packet.bio.type=B_START; + result=wanxl_submit_injector(port, &packet.bio, sizeof(packet.bio), 1); + if (result) + return result; + + MOD_INC_USE_COUNT; + return 0; +} + + + +static void wanxl_close(hdlc_device *hdlc) +{ + sbe_port *port=hdlc_to_port(hdlc); + bio_wrap packet; + + memset(&packet, 0, sizeof(packet)); + packet.type=B_CLOSE; + wanxl_submit_injector(port, &packet, sizeof(packet), 1); + + MOD_DEC_USE_COUNT; +} + + + +static int wanxl_xmit(struct sk_buff *skb, struct device *dev) +{ + u16 dlci=0; + u8 proto=0; + sbe_port *port=dev_to_port(dev); + pkt_desc *pkt=port->next_tx_pkt; +#ifdef DEBUG_PKT + int i; +#endif + + if (pkt->pd_flags & (PD_READY|PD_DONE)) { +#ifdef DEBUG_PKT + printk(KERN_DEBUG "%s: Unable to send packet\n", + port_name(port)); +#endif + port->hdlc.stats.tx_dropped++; + dev_kfree_skb(skb); + return 0; /* Out of card buffers - drop the skb */ + } + + if (port->mode & MODE_FR) { + dlci=q922_to_dlci(skb->data); + switch(skb->protocol) { + case __constant_htons(ETH_P_IP): + proto=IP_PROTID; + skb_pull(skb, 4); + break; + + case __constant_htons(ETH_P_ARP): + proto=ARP_PROTID; + skb_pull(skb, 10); + break; + + default: + port->hdlc.stats.tx_errors++; + dev_kfree_skb(skb); + return 0; /* Ignore packet */ + } + } + + /* Align buffer at 4-byte boundary */ + if (virt_to_bus(skb->data) % 4) { + struct sk_buff *new=alloc_skb(skb->len, GFP_ATOMIC); + if (!new) { + port->hdlc.stats.tx_dropped++; + dev_kfree_skb(skb); + return 0; /* Out of memory - drop packet */ + } + + memcpy(new->data, skb->data, skb->len); + skb_put(new, skb->len); + dev_kfree_skb(skb); + skb=new; + } + + pkt->v_data=skb; + pkt->p_data=virt_to_bus(skb->data); + pkt->pd_length=skb->len; + pkt->mux.fr.dlci=dlci; + pkt->mux.fr.protid = (skb->protocol == __constant_htons(ETH_P_ARP) ? + ARP_PROTID : IP_PROTID); + + if (pkt->pd_flags & PD_LAST) + port->next_tx_pkt=port->tx_ring->v_ring; /* Rewind */ + else + port->next_tx_pkt=pkt+1; + +#ifdef DEBUG_PKT + printk(KERN_DEBUG "%s TX (PCI=%08x, proto=%x):", + dev->name, pkt->p_data, pkt->mux.fr.protid); + for (i=0; ilen; i++) + printk(" %02X", skb->data[i]); + printk("\n"); +#endif + + pkt->pd_flags=PD_FLAGS_TX|PD_READY | (pkt->pd_flags&PD_LAST); + wanxl_send_interrupt(port, 1); + return 0; +} + + + +static int wanxl_ioctl(hdlc_device *hdlc, struct ifreq *ifr, int cmd) +{ + sbe_port *port=hdlc_to_port(hdlc); + u32 length; + int result; + + if(!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (ifr->ifr_data==NULL) + return -EFAULT; + + if (copy_from_user(&length, ifr->ifr_data, 4)!=0) + return -EFAULT; + + switch(cmd) { + case HDLCRUN: + if (port->card->first_port != port) /* Not initial port */ + result=-EINVAL; + else if (port->card->rx_ring || port->card->tx_ring) + result=-EBUSY; /* Already running */ + else + result=wanxl_run_board(port->card, ifr->ifr_data+4, + &length); + break; + +#ifdef WANXLQUERY + case WANXLQUERY: + if (wanxl_card_running(port->card)==0) + result=-EIO; /* Board must be run first */ + else + result=wanxl_query_port(port, ifr->ifr_data+4, + &length); + break; +#endif + default: + result=-EINVAL; + length=0; + } + + if (copy_to_user(ifr->ifr_data, &length, 4)!=0) + return -EFAULT; + + return result; +} + + + + +static inline int wanxl_init_hdlc_port(sbe_port *port) +{ + port->hdlc.set_mode=wanxl_set_mode; + port->hdlc.open=wanxl_open; + port->hdlc.close=wanxl_close; + port->hdlc.ioctl=wanxl_ioctl; + port->hdlc.create_pvc=wanxl_create_pvc; + port->hdlc.open_pvc=wanxl_open_pvc; + hdlc_to_dev(&port->hdlc)->hard_start_xmit=wanxl_xmit; + return register_hdlc_device(&port->hdlc); +} + + + +static void wanxl_destroy_ring(desc_ring **root) +{ + int cnt; + desc_ring *node; + pkt_desc *pkts; + + if (*root==NULL) + return; + + node=*root; + while(node) { + pkts=node->v_ring; + if (pkts) + for (cnt=0; cntndesc; cnt++) { + if (pkts->v_data) + dev_kfree_skb(pkts->v_data); + pkts++; + } + node=node->next_node ? bus_to_virt(node->next_node) : NULL; + } + + if ((*root)->v_inject) { + if ((*root)->v_inject->v_data) + /* Delete injector buffers */ + kfree((*root)->v_inject->v_data); + + kfree((*root)->v_inject); /* Delete pkts descriptors */ + } + + + kfree(*root); /* Delete ring descriptors */ + *root=NULL; +} + + + +static int wanxl_create_ring(desc_ring **root, int transmit, int ports) +{ + int node, cnt; + desc_ring *ring; + pkt_desc *pkts; + char *inj; + int descs=transmit ? WANXL_TX_BUFFERS : WANXL_RX_BUFFERS; + + u32 ring_size=sizeof(desc_ring) * ports; + u32 pkts_size=sizeof(pkt_desc) * (descs+1) * ports; + u32 inj_size=MAX_IOCTL_PACKET * ports; + + ring=kmalloc(ring_size, GFP_KERNEL); + if (ring==NULL) + return -ENOBUFS; + memset(ring, 0, ring_size); + + pkts=kmalloc(pkts_size, GFP_KERNEL); + if (pkts==NULL) { + kfree(ring); + return -ENOBUFS; + } + memset(pkts, 0, pkts_size); + + inj=kmalloc(inj_size, GFP_KERNEL); + if (inj==NULL) { + kfree(ring); + kfree(pkts); + return -ENOBUFS; + } + memset(inj, 0, inj_size); + + *root=ring; + + for (node=0; noder_flags = HF_IREQ | HF_ACTIVE | node; + ring->ndesc=descs; + ring->pdm_offset=0; + ring->cpu=0; + ring->next_cpu=NULL; + ring->next_node = (node==ports-1 ? 0 : virt_to_bus(ring+1)); + + ring->p_inject=virt_to_bus(pkts); /* Injector */ + ring->v_inject=pkts; + pkts->pd_flags=PD_FLAGS_INJ; + pkts->p_data=virt_to_bus(inj); + pkts->v_data=inj; + pkts->pd_max_len=MAX_IOCTL_PACKET; + pkts++; + inj+=MAX_IOCTL_PACKET; + + ring->p_ring=virt_to_bus(pkts); /* Buffers */ + ring->v_ring=pkts; /* for host usage only */ + for (cnt=0; cntpd_flags=PD_FLAGS_TX; + else { + struct sk_buff *skb=dev_alloc_skb(HDLC_MAX_MTU); + if (skb==NULL) { + wanxl_destroy_ring(root); + return -ENOBUFS; + } + + pkts->pd_flags=PD_FLAGS_RX; + pkts->p_data=virt_to_bus(skb->data); + pkts->v_data=skb; + } + + if (cnt==descs-1) + pkts->pd_flags|=PD_LAST; + pkts->pd_max_len=HDLC_MAX_MTU; + pkts++; + } + ring++; + } + + return 0; +} + + + +static inline int wanxl_wait_on_box(volatile u32 *box_addr, + u32 *store_value, /* store value here */ + u32 break_mask, /* breaks */ + u32 equal, /* equal breaks */ + long ms) /* ms delay count */ +{ + u32 result; + unsigned long timeout=jiffies+max(2, ms * HZ / 1000); + do { + result=readl(box_addr); + + if ((result & break_mask) || (result==equal)) + break; + + schedule(); + }while(jiffieswx_plx_viraddr->mbox_1); + + if (wanxl_wait_on_box(&card->wx_plx_viraddr->mbox_1, &result, + 0, 0x0, wcnt)!=0) { + printk(KERN_WARNING "%s: wanxl_setmbx: timeout processing " + "command 0x%x, result=0x%x\n", + card_name(card), cmd, result); + return -ENODEV; + } + + return 0; +} + + + +/* issue a reset to the board */ +static int wanxl_reset_board(sbe_card *card, int wait) +{ + u32 result; + unsigned long timeout; + + printk(KERN_DEBUG "%s: resetting board\n", card_name(card)); + writel(MBX_STS_PCIRESET, &card->wx_plx_viraddr->mbox_0); + + result=readl(&card->wx_plx_viraddr->control) | CTL_RESET; + writel(result, &card->wx_plx_viraddr->control); + + timeout = jiffies + max(2, HZ / 500); + do + schedule(); + while(jiffieswx_plx_viraddr->control) & ~CTL_RESET; + writel(result, &card->wx_plx_viraddr->control); + + if (!wait) + return 0; + + /* wait for successful completion of self-tests */ + timeout = jiffies + MAX_PUTS_WAIT * HZ; + do { + result=readl(&card->wx_plx_viraddr->mbox_0); + if (result) { + if (result & MBX_STS_ERROR) { + printk(KERN_WARNING "%s: self-test failed, " + "status=0x%x.\n", + card_name(card), result); + return -ENODEV; + } + schedule(); + } else + break; + }while(jiffiescard)==0) + return -ENOSYS; /* Card not initialized */ + + if (copy_from_user(packet, data, *length)) + return -EFAULT; + + result=wanxl_submit_injector(port, packet, *length, 1); + if (result) + return result; + + if (copy_to_user(data, packet, *length)) + return -EFAULT; + + return 0; +} +#endif + + + +static void wanxl_destroy_card(sbe_card *card, int destroy_all) +{ + sbe_port *port=card->first_port; + + wanxl_reset_board(card, 0); + + if (!destroy_all && port) { + port=port->next_port; /* Omit first port */ + card->first_port->next_port=NULL; + } + + while (port) { + sbe_port *ptr=port; + + unregister_hdlc_device(&port->hdlc); + port=port->next_port; + kfree(ptr); + } + + if (card->rx_ring) + wanxl_destroy_ring(&card->rx_ring); + + if (card->tx_ring) + wanxl_destroy_ring(&card->tx_ring); + + if (destroy_all) { + if (card->irq) + free_irq(card->irq, card); + + if (card->wx_plx_viraddr) + iounmap(card->wx_plx_viraddr); + if (card->wx_mem_viraddr) + iounmap(card->wx_mem_viraddr); + kfree(card); + } +} + + + +static int wanxl_run_board(sbe_card *card, char *data, u32 *length) +{ + sbe_port *port=card->first_port, **prev_port; + desc_ring *tx_ring, *rx_ring; + u32 len=*length; + int result, cnt; + u32 bdsize; + ulong mt; + char *ms; + + if (len>MAX_PDM_LEN || len<=sizeof(PCI360Header) || len%4) { + printk(KERN_WARNING "%s: Invalid firmware length\n", + port_name(port)); + return -EFAULT; + } + + + /* reset board and wait for PUTS to complete */ + result=wanxl_reset_board(card, 1); + if (result) + return result; + + /* get on-board memory size */ + bdsize = readl(&card->wx_plx_viraddr->mbox_2) & MBX_MEMSZ_MASK; + + /* sanity check the board's reported memory size */ + if (bdsize < MBX_MEMSZ_1MB || bdsize > MBX_MEMSZ_4MB) { + printk(KERN_WARNING "%s: illegal board memory size 0x%x", + port_name(port), bdsize); + return -ENODEV; + } + + /* now, calculate the timeout value that will be added to a delay later + this is to allow time for clearing of on-board memory */ + switch (bdsize) { + case MBX_MEMSZ_1MB: ms = "1MB"; mt = 2800; break; + case MBX_MEMSZ_2MB: ms = "2MB"; mt = 3600; break; + case MBX_MEMSZ_4MB: ms = "4MB"; mt = 5200; break; + case MBX_MEMSZ_8MB: ms = "8MB"; mt = 8400; break; + default: ms = "(size?)"; mt = 3600; + } + printk(KERN_INFO "%s: board memory size 0x%x (%cMB)\n", + port_name(port), + bdsize, *ms); + + /* + * The processing of the BSWAP command is estimated at 50ms (board), + * there we set timeout value to 2 seconds, and add in the 0.8 + * seconds per MB of on/board memory. + */ + + result=wanxl_setmbx(card, SWAP_OPTION, mt); + if (result) { + printk(KERN_WARNING "%s: unable to set byte-swap option, " + "aborting.\n", port_name(port)); + return result; + } + + /* + * The processing of the HBA and HMS Mailbox Commands is estimated at + * 0.5 seconds each (wanXL), and we select 1 second for the timeout + * value. + * + * Host Memory Base Address and Host Memory Size setup are Host + * dependent. HMS should be set first to avoid PUTS Warning msg. + */ + + result=wanxl_setmbx(card, MBX_CMD_SETHMS+(WANXL_HOST_MEM_SIZE>>8), + 1000); + if (result) { + printk(KERN_WARNING "%s: mbx SETHMS command failure\n", + port_name(port)); + return result; + } + + result=wanxl_setmbx(card, MBX_CMD_SETHBA|(WANXL_BUS2HOST_MAP_ADDR>>8), + 1000); + if (result) { + printk(KERN_WARNING "%s: mbx SETHBA command failure\n", + port_name(port)); + return result; + } + + if (copy_from_user((char*)card->wx_mem_viraddr_order+PDM_OFFSET, + data+sizeof(PCI360Header), + len-sizeof(PCI360Header))) + return -EFAULT; + + writel(PDM_OFFSET, card->wx_mem_viraddr); + + writel(0, &card->wx_plx_viraddr->mbox_5); + writel(0, &card->wx_plx_viraddr->mbox_6); + writel(0, &card->wx_plx_viraddr->mbox_7); + + result=wanxl_setmbx(card, MBX_CMD_ABORTJ, 1000); + if (result) { + printk(KERN_WARNING "%s: unable to send AbortAndJump " + "command\n", port_name(port)); + return result; + } + + if (wanxl_wait_on_box(&card->wx_plx_viraddr->mbox_5, &result, + 0xFFFFFFFF, 0xFFFFFFFF, 1000)!=0) { + printk(KERN_WARNING "%s: board never became ready after " + "AbortAndJump command\n", port_name(port)); + return -EFAULT; + } + + card->config=(board_cfg*)(result+card->wx_mem_viraddr); + + printk(KERN_INFO "%s: serial number %d\n", port_name(port), + card->config->serial_num); + printk(KERN_INFO "%s: %d port%s, RAM=0x%x len=0x%x\n", port_name(port), + card->config->num_ports, card->config->num_ports>1 ? "s" : "", + card->config->mem_base, card->config->mem_size); + printk(KERN_DEBUG "%s: firmware version: %s\n", port_name(port), + card->wx_mem_viraddr_order+card->config->fw_version); + printk(KERN_DEBUG "%s: PDM version: %s\n", port_name(port), + card->wx_mem_viraddr_order+card->config->pdm_version); + printk(KERN_DEBUG "%s: PDM compiled: %s\n", port_name(port), + card->wx_mem_viraddr_order+card->config->pdm_compiled); + + if (card->config->num_ports > MAX_PORTS_PER_CARD) { + card->config->num_ports = MAX_PORTS_PER_CARD; + printk(KERN_WARNING "%s: Using only %i ports\n", port_name(port), + MAX_PORTS_PER_CARD); + } + + if (wanxl_create_ring(&card->rx_ring, 0, MAX_PORTS_PER_CARD)!=0) + return -EFAULT; + + if (wanxl_create_ring(&card->tx_ring, 1, MAX_PORTS_PER_CARD)!=0) { + wanxl_destroy_ring(&card->rx_ring); + return -EFAULT; + } + + card->config->rx_ring_head=virt_to_bus(card->rx_ring); + card->config->tx_ring_head=virt_to_bus(card->tx_ring); + card->config->rx_max_pkts=10; + card->config->tx_max_pkts=10; + + prev_port = &port->next_port; /* Back pointer to next_port address */ + rx_ring = card->rx_ring; + tx_ring = card->tx_ring; + + len=0; + for (cnt=0; cntconfig->num_ports; + cnt++) { + if (((card->config->port_info[cnt]&0xE0)>>5) != 6) { + /* port exist */ + if (len!=0) { + /* Create next ports */ + port=kmalloc(sizeof(sbe_port), GFP_KERNEL); + if (port==NULL) { + printk(KERN_WARNING "%s: Unable to create port structure\n", + card_name(card)); + wanxl_destroy_card(card, 0); + } + memset(port, 0, sizeof(sbe_port)); + + hdlc_to_dev(&port->hdlc)->irq=card->irq; + port->card=card; + *prev_port=port; /* Connect port to chain */ + prev_port=&port->next_port; + + result=wanxl_init_hdlc_port(port); + if (result) { + printk(KERN_WARNING "%s: Unable to register net device\n", + port_name(port)); + wanxl_destroy_card(card, 0); + return result; + } + } + + port->node=cnt; + printk(KERN_INFO "%s: cable=%s, PM=%s\n", + port_name(port), + cable_types[card->config->port_info[cnt]&0x7], + cable_types[(card->config->port_info[cnt]&0xE0)>>5]); + len++; /* port found */ + } + port->rx_ring=rx_ring++; + port->tx_ring=tx_ring++; + port->next_rx_pkt = port->rx_ring->v_ring; + port->next_tx_pkt = port->next_tx_pkt_done = port->tx_ring->v_ring; + } + + writel(HDLC_MAX_MTU, &card->config->max_frame_size); + writel(HDLC_MAX_MTU, &card->config->avg_msg_size); + writel(HDLC_MAX_MTU, &card->config->scc_rx_mblk_sz); + writel(100, &card->config->tx_intr_tmo); + + writel(1, &card->config->valid); + + copy_to_user(data, card->config, sizeof(board_cfg)); + *length=sizeof(board_cfg); + card->running=1; + return 0; +} + + + +/***************************************************************** + * + * Module initialization and destruction + * + ****************************************************************/ + +__initfunc(int wanxl_pci_init(struct pci_dev *pdev)) +{ + int result; + u16 command; + sbe_card *card; + sbe_port *port; + u32 memsize; + + card=kmalloc(sizeof(sbe_card), GFP_KERNEL); + if (card==NULL) + return -ENOBUFS; + memset(card, 0, sizeof(sbe_card)); + + port=kmalloc(sizeof(sbe_port), GFP_KERNEL); + if (port==NULL) { + kfree(card); + return -ENOBUFS; + } + memset(port, 0, sizeof(sbe_port)); + + card->first_port=port; + port->card=card; + port->node=0; + result=wanxl_init_hdlc_port(port); + if (result) { + printk(KERN_WARNING "wanXL: Unable to register hdlc device\n"); + kfree(card); + kfree(port); + return result; + } + + pci_read_config_word(pdev, PCI_CONF_COMM, &command); + if ((command & (PCI_COMM_ME|PCI_COMM_MAE))==0) { + command|=(PCI_COMM_ME|PCI_COMM_MAE); + printk(KERN_WARNING "%s: updating PCI config register %d to 0x%x\n", + port_name(port), PCI_CONF_COMM, command); + pci_write_config_word(pdev, PCI_CONF_COMM, command); + } + + /* set up addresses and mappings */ + card->wx_plx_phyaddr=pdev->base_address[0]; + card->wx_mem_phyaddr=pdev->base_address[2]; + card->wx_plx_viraddr=ioremap_nocache(card->wx_plx_phyaddr, + sizeof(plx9060)); + + memsize = card->wx_plx_viraddr->mbox_2 & MBX_MEMSZ_MASK; + card->wx_mem_viraddr = ioremap_nocache(card->wx_mem_phyaddr, + memsize*2); + card->wx_mem_viraddr_order = card->wx_mem_viraddr + memsize; + + printk(KERN_INFO "%s: plx9060/9080 at 0x%x, RAM at 0x%x, irq %u\n", + port_name(port), + card->wx_plx_phyaddr, card->wx_mem_phyaddr, pdev->irq); + + /* allocate IRQ for the board */ + + if (request_irq(pdev->irq, &wanxl_intr, SA_SHIRQ, irqdevname, card)) { + printk(KERN_WARNING "%s: could not allocate IRQ%d.\n", + port_name(port), pdev->irq); + wanxl_destroy_card(card, 1); + return(-ENODEV); + } + card->irq=hdlc_to_dev(&port->hdlc)->irq=pdev->irq; + + *new_card=card; + new_card=&card->next_card; + + return 0; +} + + + +__initfunc(int wanxl_init(void)) +{ + int i, devs=0, rep=0; + + if(!pci_present()) + return -ENODEV; + + for(i=0; inext_card; + wanxl_destroy_card(ptr, 1); + } +} + +#endif /* MODULE */ diff -urN v2.2.15/linux/drivers/net/wanxl.h linux/drivers/net/wanxl.h --- v2.2.15/linux/drivers/net/wanxl.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/wanxl.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,841 @@ +/* wanxl.h + * -*- linux-c -*- + * + * SBE wanXL device driver + * Copyright (C) 1999 RG Studio s.c., http://www.rgstudio.com.pl/ + * Written by Krzysztof Halasa + * + * Portions (C) SBE Inc., used by permission. + * + * Sources: + * wanXL technical reference manuals + * wanXL UNIXware X.25 driver + * Donald Becker's skeleton.c driver + * "Linux Kernel Module Programming" by Ori Pomerantz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#ifndef __WANXL_H +#define __WANXL_H + +#include + +#define SPIDER "we use Frame Relay" + +#define PDM_OFFSET 0x1000 +#define MAX_PDM_LEN 128000 +#define MAX_PORTS_PER_CARD 4 +#define MAX_IOCTL_PACKET 256 + +typedef struct { + u8 magic[2]; + u8 cbText[4]; + u8 cbData[4]; + u8 cbBss[4]; + u8 syms[4]; + u8 cbStack[4]; + u8 entryPoint[4]; + u8 flag[2]; + u8 dstart[4]; + u8 bstart[4]; +}PCI360Header; /* 36 = 0x24 bytes */ + + +#ifdef __KERNEL__ + +#define WANXL_RX_BUFFERS 10 +#define WANXL_TX_BUFFERS 10 + +typedef struct { + volatile u32 pd_flags; /* Control and attribute flags */ + u32 p_data; /* Physical Unbiased data buffer */ + volatile u32 pd_length; /* Length of valid data in the buffer */ + u32 pd_max_len; /* Maximum length of data buffer */ + +#ifdef SPIDER + union { + struct { + volatile u32 dlci; /* Frame Relay DLCI */ + volatile u32 protid; /* Frame Relay encapsulation */ + }fr; + volatile u32 lci; /* X25 logical channel identifier */ + }mux; +#endif + + /* + * Anything below this line is not within the PDM, except for + * diagnostics. If you change this structure be sure to update + * PKT_DESC_SIZE (for GET_LOCAL_PD) + */ + u32 pd_timestamp; /* Used in packet sequencing */ + void *v_data; /* Logical biased PCI data buffer */ + u32 pd_packet; /* For use by host as Packet back pointer */ + u32 pd_handle; /* Host handle used for completion msg */ +}pkt_desc; + + + +typedef struct { + volatile u32 r_flags; /* Ring Flags */ + u32 ndesc; /* Number of desciptors */ + u32 pdm_offset; /* Offset used by PDM to index p_ring */ + u32 next_node; /* Next ring head for this CPU */ + u32 p_inject; /* Asyncronous packet injector PCI address */ + u32 p_ring; /* Anchor pointer to 1st desciptor */ + + /* + * Anything below this line is not within the PDM, except for + * diagnostics. If you change this structure be sure to update + * DESC_RNG_SIZE (for GET_LOCAL_RP) + */ + + u32 host_offset; /* Offset used by host to index p_ring */ + u32 host_free; /* Source ring reclaim offset. Owned by src */ + pkt_desc *v_inject; /* Virtual address for injector */ + pkt_desc *v_ring; /* Virtual address for descriptor ring */ + u32 cpu; /* CPU servicing this ring [0-32] */ + struct desc_ring *next_cpu; /* Next ring head for this node */ + u32 pNode; /* Back pointer to to adapter Node structure */ + u32 WT_Handle; /* Pad reserved for host use */ + u32 WT_State; /* Pad reserved for host use */ + u32 PWT_Event; /* Pad reserved for host use */ +}desc_ring; + + + + +typedef struct { + volatile u32 valid; /* Info Structure Valid Flag */ + + u32 host_cls; /* Host's cache line size */ + u32 host_mpm; /* Multi-Processor Mode Enable */ + u32 pad; /* Padding for the sake of alignment */ + u32 psd_data[4]; /* Private segment data ptrs for each of + the virtual boards (adapters, whatever) */ + /* + * Board ID Information + */ + u32 port_info[16]; /* Status (I/F) for each num_port */ + u32 num_ports; /* Maximum number of ports supported by HW */ + u32 mem_base; /* Physical PCI base address of memory */ + u32 mem_size; /* Total size of physical on board memory */ + u32 hw_options; /* Hardware options byte from EEPROM */ + u32 serial_num; /* Board Serial Number from EEPROM */ + u32 fw_version; /* Ptr to firmware version string (\0 term) */ + u32 pdm_version; /* Ptr to PDM version string (\0 term) */ + u32 pdm_compiled; /* Ptr to PDM compilation timestamp (\0 term)*/ + + /* + * Lower WAN Driver Configuration Parameters + */ + u32 max_frame_size; /* Maximum frame size */ + u32 avg_msg_size; /* Average message size */ + u32 scc_rx_bd_cnt; /* SCC RX buffer pool count */ + u32 scc_tx_bd_cnt; /* SCC TX buffer pool count */ + u32 scc_rx_mblk_sz; /* SCC RX buffer size */ + u32 scc_rx_prealloc; /* SCC RX buffer preallocation count */ + u32 scc_rx_limit; + u32 scc_tx_limit; + + /* + * RX Packet Ring Parameter + */ + u32 rx_ring_head; /* Unbiased address of RX head of heads */ + u32 rx_max_pkts; /* RX fairness count */ + u32 rx_intr_tmo; /* Keep alive interrupt interval */ + u32 rx_intr_thrsh; /* Keep alive interrupt pkt count */ + u32 rx_lazy_tmo; /* Maximum time between polls */ + u32 rx_lazy_thrsh; /* Number of empty polls before going to lazy*/ + u32 rx_scc_tmo; /* Flow control recovery timeout, SCC FLOW */ + u32 rx_host_tmo; /* Flow control recovery timeout, HOST FLOW */ + + /* + * TX Packet Ring Parameters + */ + u32 tx_ring_head; /* Unbiased address of RX head of heads */ + u32 tx_max_pkts; /* TX fairness count */ + u32 tx_intr_tmo; /* Keep alive interrupt interval (50ths/sec) */ + u32 tx_intr_thrsh; /* Keep alive pkt count interrupt */ + u32 tx_lazy_thrsh; /* Number of empty polls before going to lazy*/ + u32 tx_lazy_tmo; /* Lazy mode timeout */ + u32 tx_flow_tmo; /* Flow control timeout, desciptor allocation*/ + u32 host_pads[4]; +}board_cfg; + + +#define PD_READY 0x10000000 +#define PD_DONE 0x20000000 +#define PD_NULL 0x40000000 +#define PD_ERR 0x80000000 +#define PD_LAST 0x00000100 +#define PD_INJ 0x00000200 +#define PD_PRI 0x00000003 +#define PD_LOWPRI 0x00000000 /* 00 = Low Priority */ +#define PD_MEDPRI 0x00000001 /* 01 = Med Priority */ +#define PD_HIPRI 0x00000002 /* 10 = High Priority */ +#define PD_CTLPRI 0x00000003 /* 11 = Control Message */ + +/*#define PD_FLAGS_TX PD_MEDPRI*/ +#define PD_FLAGS_TX 0 +#define PD_FLAGS_RX 0 +#define PD_FLAGS_INJ (PD_CTLPRI|PD_INJ) + +#define BF_IREQ 0x01000000 +#define BF_FLUSH 0x02000000 +#define BF_FLOW 0x04000000 +#define BF_LOCK 0x08000000 +#define BF_HALT 0x10000000 +#define BF_SCAN_DN 0x80000000 + +#define HF_IREQ 0x00010000 +#define HF_ACTIVE 0x00020000 +#define HF_FLUSH 0x00100000 +#define HF_SCAN 0x00800000 + +#define TX_IRQ_BIAS 16 /* 16 bits left for Tx interrupt mark */ + + +typedef struct sbe_port_s { + hdlc_device hdlc; /* HDLC device struct - must be first */ + struct sbe_card_s *card; + struct sbe_port_s *next_port; + desc_ring *rx_ring; + desc_ring *tx_ring; + pkt_desc *next_rx_pkt; + pkt_desc *next_tx_pkt; + pkt_desc *next_tx_pkt_done; + struct wait_queue *tx_inj; + struct wait_queue *rx_inj; + int mode; + u8 node; +}sbe_port; + + +typedef struct sbe_card_s { + board_cfg *config; + + u8 irq; + u8 running; + + u32 wx_plx_phyaddr; /* PLX register PCIbus base addr */ + plx9060 *wx_plx_viraddr; /* PLX register virtual base addr */ + u32 wx_mem_phyaddr; /* memory PCIbus base addr */ + u8 *wx_mem_viraddr; /* memory virtual base addr */ + u8 *wx_mem_viraddr_order; /* order-saving memory virtual base addr */ + desc_ring* rx_ring; + desc_ring* tx_ring; + + sbe_port *first_port; + struct sbe_card_s *next_card; +}sbe_card; + +#endif /* __KERNEL__ */ + + + +/* + * IOCTL Options for the bulit interface. + */ + +#define B_OPEN ('B'<<24 | 0x000001) /* Open Node bio_wrap */ +#define B_CLOSE ('B'<<24 | 0x000002) /* Close Node bio_wrap */ +#define B_CNT_CFM ('B'<<24 | 0x000004) /* Connect Confirm b_cnt_cfm */ +#define B_SETTUNE ('B'<<24 | 0x000008) /* Set tuning b_tnioc */ +#define B_GETTUNE ('B'<<24 | 0x000010) /* Get tuning b_tnioc */ +#define B_ZEROSTATS ('B'<<24 | 0x000020) /* Set stats = zero b_stioc */ +#define B_GETSTATS ('B'<<24 | 0x000040) /* Get stats b_stioc */ +#define B_MOD_SIG ('B'<<24 | 0x000080) /* Get/Set Modem Sigs. b_modsig */ + +#define B_X21_LOOP_EN ('B'<<24 | 0x000100) /* Req. X.21 loop3c b_x21lb_3c */ +#define B_X21_LOOP_DI ('B'<<24 | 0x000200) /* Exit X.21 loop3c b_x21lb_3c */ +#define B_LW_FLUSH ('B'<<24 | 0x000400) /* Tx or Rx Flush b_lw_flush */ + +#define B_MEM_DUMP ('B'<<24 | 0x000800) /* Dump PDM memory b_mem_dump */ +#define B_TELLUS ('B'<<24 | 0x001000) /* Tell me on change b_tellus */ +#define B_CONS_RD ('B'<<24 | 0x002000) /* Console Read b_cons_rd */ +#define B_CONS_WR ('B'<<24 | 0x004000) /* Console Write b_cons_wr */ +#define B_START ('B'<<24 | 0x008000) /* Start Node bio_wrap */ +#define B_CSR ('B'<<24 | 0x010000) /* Update CSR b_csr */ + +/* + * Return status return values + */ +#define RSI_IOCTL_ACK 0 /* General: Done */ +#define RSE_IOCTL_FAIL 1 /* General: Ioctl failed */ +#define RSE_IOCTL_NOT_AVAIL 2 /* General: Ioctl implemeted */ +#define RSE_BAD_STRUCT_FMAT 3 /* General: Invalid Structure format */ +#define RSE_BAD_STRUCT_SIZE 4 /* General: Invalid Structure size */ +#define RSE_STRUCT_TOO_BIG 5 /* General: Structure > MAXIO_BLOCK */ +#define RSE_IOCTL_INJ_FAIL 6 /* General: Ioctl failed */ +#define RSE_NO_HW_SUPPORT 7 /* General: No HW for the request */ +#define RSE_BAD_NODE 8 /* General: Invalid or mismatch node */ +#define RSE_NODE_NOT_OPENED 9 /* General: Node has never been opened */ +#define RSE_NODE_NOT_CLOSED 10 /* General: Node has never been opened */ +#define RSE_OUT_OF_MEM 11 /* General: Could not allocate memory */ +#define RSE_NO_UPSTREAM 13 /* General: Could not send upstream */ + +#define RSE_OPEN_FAIL 20 /* B_OPEN: General Open Fail */ +#define RSE_ALREADY_OPEN 21 /* B_OPEN: Port Allready Opened */ +#define RSE_START_FAIL 22 /* B_OPEN: Could not start port */ +#define RSE_CLOSE_FAIL 23 /* B_CLOSE: Port Not Opened */ +#define RSE_NO_CONNECT 24 /* B_CLOSE: Port Not Opened */ + +#define RSE_NO_SUPPORT_SCC 30 /* B_???TUNE: WAN_scc_opts not supported */ +#define RSE_NO_SUPPORT_OPT 31 /* B_???TUNE: WAN_opts not supported */ +#define RSE_NO_SUPPORT_TUS 32 /* B_???TUNE: WAN_tell_us not supported */ +#define RSE_NO_SUPPORT_DEF 33 /* B_???TUNE: WAN_cpdef not supported */ + +#define RSE_NO_STATS 34 /* B_???STATS: Stats not available */ +#define RSE_NO_SUPPORT 35 /* B_MOD_SIG: Invalid mask */ + +#define RSE_X21_FAIL 36 /* B_X21_LOOP: Failed to enter/quit mode */ +#define RSE_X21_REJ 37 /* B_X21_LOOP: Allready in x.21 3c mode */ +#define RSE_X21_BAD_HW 38 /* B_X21_LOOP: Failed to enter/quit mode */ +#define RSE_X21_DTE_ONLY 39 /* B_X21_LOOP: Failed to enter/quit mode */ + +#define RSE_RX_FLUSH 40 /* B_LW_FLUSH: Error trying to flush Rx */ +#define RSE_TX_FLUSH 41 /* B_LW_FLUSH: Error trying to flush Tx */ + +#define RSE_DUMP_FAIL 42 /* B_MEM_DUMP: Dump Failed */ +#define RSE_BUS_ERROR 43 /* B_MEM_DUMP: Range caused a bus error */ +#define RSE_BAD_RANGE 44 /* B_MEM_DUMP: Range too big for buffer */ +#define RSI_NO_STATUS 0xff /* General: Done */ + +/* + * Interrupt Request flag. see send_upstream() + */ +#define IO_INT 1 +#define IO_NO_INT 0 + +/* + * Block Sizes + */ +#define MAXIO_BLOCK (64 * 4) /* Max ioctl ioctl block size */ +#define DEF_DBLK (MAXIO_BLOCK - sizeof(bio_wrap) - 8) /* dump size */ +#define DEF_CBLK (32 * 4) /* Console RD/WR size */ +#define MAX_INJ_TRY 10 /* Max time to try to feed ioctl to inj */ + +#define PUT_INJ 0x1 /* OOB put on injecter */ +#define PUT_RING 0x2 /* INB Insert in ring */ +#define PUT_INJ_RING 0x3 /* Try OOB 1st INB 2nd */ + + +/* + * Wrapper for all ioctls + */ +typedef struct { + u32 type; /* bulit ioctl type / Name */ + u32 status; /* Return Status */ + u32 irp; /* IO Request Packet */ + u32 drv_data; /* Driver related Data */ +}bio_wrap; + + +/*****************************************************************************/ +/* + * B_SETTUNE & B_GETTUNE Support + */ + +/* Legal values for WAN_opts */ +#define WOPS_LOOPBACK 0x1 +#define WOPS_SPLIT_CH 0x2 +#define WOPS_DCE 0x4 + +/* Legal values for WAN_scc_opts */ +/* Note: Not all options and modes available for all boards */ +/* Don't set anything that you don't understand. + */ +#define B_MODE_MSK 0x0f /* Mode mask */ +#define B_HDLC 0x00 /* Default HDLC Mode */ +#define B_UART 0x04 /* UART Mode */ +#define B_BYSYNC 0x08 /* Reserved */ +#define B_ETH 0x0c /* Reserved */ + +#define B_GLITCH_DET 0x10 /* Enable Glitch Detect mode */ +#define B_TRX 0x20 /* Transparent Receiver */ +#define B_TTX 0x40 /* Transparent Transmitter */ +#define B_NO_AUTO_RTS 0x80 /* No Auto RTS Mode */ + +#define B_CODE_MSK 0x700 /* Encode/Decode mask */ +#define B_NRZ 0x000 /* Default NRZ Mode */ +#define B_NRZI_MARK 0x100 /* NRZI Mark */ +#define B_FM0 0x200 /* FM0 */ +#define B_FM1 0x300 /* FM1 (Set TINV) */ +#define B_MANCHESTER 0x400 /* Manchester */ +#define B_NRZI_SPACE 0x500 /* NRZI space (Set TINV) */ +#define B_DMANCHESTER 0x600 /* Differential Manchester */ +#define B_C_RES 0x700 /* Reserved */ + + +/* Legal values for WAN_phy_hw */ +#define B_NONE 0x0 +#define B_EIA_232 0x1 /* Read only for PCI-360 */ +#define B_EIA_422 0x2 +#define B_EIA_449 0x3 +#define B_EIA_530 0x4 +#define B_CCITT_X21 0x5 +#define B_CCITT_V35 0x6 + +/* Legal values for WAN_tell_us */ +/* Note: Not all options available for all modes and all boards */ +#define B_RXB 0x000001 /* Receive Buffer */ +#define B_TXB 0x000002 /* Transmit Buffer */ +#define B_BSY 0x000004 /* Busy Condition, Rx frame lost */ +#define B_RXF 0x000008 /* Rx frame received */ +#define B_TXE 0x000010 /* Tx Error CTS lost or underrun */ +#define B_GRA 0x000080 /* Graceful Stop Complete */ +#define B_IDL 0x000100 /* Idle Sequence Status Changed */ +#define B_FLG 0x000200 /* Flag Status */ +#define B_DCC 0x000400 /* DPLL CS Changed */ +#define B_GLt 0x000800 /* Glitch on Tx */ +#define B_GLr 0x001000 /* Glitch on Rx */ +#define B_DCD 0x010000 /* Change on CD */ +#define B_CTS 0x020000 /* Change on CTS */ +#define B_RTS 0x040000 /* Change on RTS */ +#define B_CAB 0x080000 /* Change of Cable */ +#define B_CRD 0x100000 /* Console Read */ +#define B_CWR 0x200000 /* Console Write */ +#define B_CON 0x400000 /* wan_connect Based on DCD */ +#define B_DCO 0x800000 /* wan_disconnect Based on DCD */ + +/* Legal values for WAN_cptype */ +#define WAN_NONE 0 /* No calling procedures */ +#define WAN_X21P 1 /* X21 calling procedures */ +#define WAN_V25bis 2 /* V25bis calling procedures */ +#define WAN_TRAN 128 /* transparent mode - no call prod. */ + + +#define CP_PADSIZE 40 + +/* + * Transparent Mode Parameters + */ +typedef struct { + u32 WAN_cptype; /* Variant type. (WAN_TRAN) */ + u32 tp_txidlp; /* tx idle pattern */ + u32 tp_txsynp; /* tx synchronize pattern */ + u32 tp_txsynl; /* tx synchronize pattern bit len */ + u32 tp_txflag; /* tx flags */ + u32 tp_rxidlp; /* rx idle pattern */ + u32 tp_rxsynp; /* rx synchronize pattern */ + u32 tp_rxsynl; /* rx synchronize pattern bit len */ + u32 tp_rxflag; /* rx flags */ +}WAN_tpx; + + +typedef struct { + u32 WAN_opts; /* WAN loopback */ + u32 WAN_baud; /* WAN baud rate */ + u32 WAN_maxframe; /* WAN maximum frame size */ + u32 WAN_interface; /* WAN physical interface */ + u32 WAN_phy_hw; /* Phy. Hw 232/449/X.21 etc */ + u32 WAN_scc_opts; /* SCC/USCC options */ + u32 WAN_tell_us; /* Tell Up Stream interrupt info */ + u32 cproc; /* Reserved */ + union { + u32 WAN_cptype; /* Variant type. */ + WAN_tpx WAN_tran; /* Transparent mode configuration */ + u8 WAN__pad[CP_PADSIZE]; /* pad - allows for new defs */ + }WAN_cpdef; /* WAN call procedural definition for + hardware interface. */ +}wan_tune; + + +#ifdef SPIDER +/* + * Tune/stats types + */ +#define WAN_TYPE 1 +#define HDLC_TYPE 1 +#define FR_TYPE 2 +#define FR_PVC_TYPE 3 + +/* + * Standards + */ +#define ITU 0 +#define ANSI 1 +#define OLDANSI 2 +#define OGOF 3 + +/* + * Conformance + */ +#define NONE 0 +#define SPRINT 1 + +/* + * Flow styles + */ +#define FECN 0x01 +#define BECN 0x02 +#define CLLM 0x04 + +/* + * Protocol ids + */ +#define PPP_PROTID 0x1 +#define IP_PROTID 0x2 +#define ARP_PROTID 0x4 + +/* + * Frame Relay tuning structure (required for each physical interface) + * Suitable defaults are { 0, 10, 15, 6, 3, 4, 1600, 56000, 1, 0 } + */ +typedef struct { + u32 lmidlci; /* the LMI DLCI */ + u32 T391; /* link integrity verification polling timer */ + u32 T392; /* polling verification timer */ + u32 N391; /* full status polling counter */ + u32 N392; /* error threshold */ + u32 N393; /* monitored events count */ + u32 maxframesize; /* maximum frame size */ + u32 accessrate; /* access rate */ + u32 standard; /* LMI standard */ + u32 conform; /* conformance requirements */ +}fr_tune; + +/* + * Frame Relay PVC tuning structure (required for each PVC) + * Suitable defaults are { ?, ?, ?, ?, 8, 0 } + */ +typedef struct { + u32 dlci; /* dlci for this PVC */ + u32 cir; /* committed information rate */ + u32 Bc; /* committed burst size */ + u32 Be; /* excess burst size */ + u32 stepcount; /* congestion step counter */ + u32 flowstyle; /* flow style */ + u32 protid; /* encapsulation */ +}fr_pvc_tune; +#endif + +typedef struct { + bio_wrap bio; /* type, status, irp & drv data */ +#ifndef SPIDER + wan_tune tune; /* Structure of tuning values */ +#else + union { + wan_tune wan; /* Structure of tuning values */ + fr_tune fr; /* Structure of tuning values */ + fr_pvc_tune fr_pvc; /* Structure of tuning values */ + }tune; + u32 type; /* tune type */ +#endif +}b_tnioc; + + +/*****************************************************************************/ + +/* + * B_ZEROSTATS & B_GETSTATS Support + */ + + + +typedef struct { + u32 hc_txgood; /* Good frames transmitted */ + u32 hc_txurun; /* Transmit underruns */ + u32 hc_txctslost; /* Transmit cts lost */ + u32 hc_rxgood; /* Good frames received */ + u32 hc_rxorun; /* Receive overruns */ + u32 hc_rxcrc; /* Receive CRC/Framing errors */ + u32 hc_rxnobuf; /* Rx frames with no buffer */ + u32 hc_rxnflow; /* Rx frames with no flow ctl */ + u32 hc_rxoflow; /* Receive buffer overflows */ + u32 hc_rxabort; /* Receive aborts */ + u32 hc_rxcnterr; /* Rx Counter Errors for VCOM34 */ + u32 hc_rxcdlost; /* Receive cd lost */ + u32 hc_rxalignerr; /* Receive align error */ + u32 res1; /* Future Use */ + u32 res2; /* Future Use */ + u32 res3; /* Future Use */ +}hdlcstats; + +#ifdef SPIDER +/* + * DLCI status + */ +#define DLCI_NOTATNET 0x80 +#define DLCI_NEWSENT 0x40 +#define DLCI_NEW 0x08 +#define DLCI_ACTIVE 0x02 + +/* + * Ioctl block for B_GETSTATS or B_ZEROSTATS command + */ + +typedef struct { + u32 ppastat; /* status of PPA */ + u32 wanstat; /* WAN status */ + u32 pvccount; /* number of DLCIs */ + u32 pad1; /* NOT USED */ + u32 txframes; /* total number of frames transmitted */ + u32 rxframes; /* total number of frames received */ + u32 txbytes; /* total number of bytes transmitted */ + u32 rxbytes; /* total number of bytes received */ + u32 txlmipolls; /* number of PVC status enquiries */ + u32 rxfullstat; /* number of full status frames received */ + u32 rxseqonly; /* number of keep alive frames received */ + u32 rxasynchs; /* number of asynchronous frames received */ + u32 rxcllms; /* number of CLLM messages received */ + u32 lmierrors; /* number of bad frames received on LMI DLCI */ + u32 lmitimeouts; /* number of times T392 timer expired */ + u32 rxtoobig; /* frames received exceeding maximum size */ + u32 rxinvDLCI; /* number of frames for invalid DLCIs */ + u32 rxunattDLCI; /* number of frames for unattached DLCIs */ + u32 rxdrops; /* number of rx buffer allocation failures */ + u32 txinvrq; /* number of invalid transmission frames */ + u32 rxinvrq; /* number of invalid frames received */ + u32 wanflows; /* number of canput fails on the wan */ + u32 LMIwanflows; /* ... and for frames on the LMI channel */ + u32 txstops; /* number of congested transmit frames */ + u32 txnobuffs; /* number of tx buffer allocation failures */ + u32 pad2; /* NOT USED */ + u32 rxlmipolls; /* number of received PVC status enquiries */ + u32 pad3; /* NOT USED */ + u32 txfullstat; /* number of full status enquiry responses */ + u32 txseqonly; /* ... else it is another type of response */ + u32 pad4; /* NOT USED */ + u32 pad5; /* NOT USED */ +}frstats; + +typedef struct { + u32 dlci; /* dlci for this PVC */ + u32 txframes; /* total number of frames transmitted */ + u32 rxframes; /* total number of frames received */ + u32 txbytes; /* total number of bytes transmitted */ + u32 rxbytes; /* total number of bytes received */ + u32 txstops; /* number of congested transmit frames */ + u32 rxstops; /* failed canputs to upper read queue */ + u32 rxFECNs; /* FECN bit set on received frame count */ + u32 rxBECNs; /* BECN bit set on received frame count */ + u32 pad2; /* NOT USED */ + u32 status; /* DLCI status flags */ + u32 pad3; /* NOT USED */ + u32 cirlowat; /* CIR low water mark */ + u32 cirhiwat; /* CIR high water mark */ + u32 txde; /* discard eligibility transmit total */ + u32 rxde; /* discard eligibility receive total */ + u32 vcstat; /* general VC status returned by MFE */ + u32 txPDUs; /* PDUs successfully sent */ + u32 txFragmentedPDUs; /* Outgoing PDUs fragmented */ + u32 txFragmentErrors; /* Fragmentation errors */ + u32 txFragments; /* Fragments successfully sent */ + u32 txDiscards; /* Outgoing PDUs discarded */ + u32 txBlocked; /* Transmission flow controlled */ + u32 rxPDUs; /* PDUs successfully received */ + u32 rxFragmentedPDUs; /* Fragmented PDUs received */ + u32 rxFragments; /* Fragments received */ + u32 rxReassemblyMismatch; /* Missing fragment(s) detected */ + u32 rxReassemblyTooBig; /* Incoming PDUs too large */ + u32 rxDiscards; /* Incoming PDUs/fragments discarded */ +}frpvcstats; +#endif + +/* + * Ioctl block for B_GETSTATS or B_ZEROSTATS command + */ +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ +#ifndef SPIDER + hdlcstats hdlc_stats; /* Table of HDLC stats values */ +#else + union { + hdlcstats hdlc; /* Table of HDLC stats values */ + frstats fr; /* Table of FR stats values */ + frpvcstats frpvc; /* Table of FR PVC stats values */ + }stats; + u32 type; /* stats type */ +#endif +}b_stioc; + + +/*****************************************************************************/ + +/* + * B_MOD_SIG Support + */ + +/* + * Note: All Modem signals are NOT supported on all boards. + * It is up to the application to know supported signals + * and signal direction based on the ports DTE/DCE + * configuration. + */ +#define GET_MOD_SIG 0 /* SBE Get Modem Signals [W_MOD_SIG] */ +#define SET_MOD_SIG 1 /* SBE Set Modem Signals [W_MOD_SIG] */ + + + + +/* Bit map for modem_sigs and modem_mask */ +#define M_TI 0x0001 /* Test Indicator */ +#define M_LL 0x0002 /* Local Loopback */ +#define M_MB 0x0004 /* Make Busy */ +#define M_RLSD 0x0008 /* Rx Sig. Detect */ +#define M_RI 0x0010 /* Ring Indicator */ +#define M_DTR 0x0020 /* Data Term Ready */ +#define M_DSR 0x0040 /* Data Set Ready */ +#define M_SP 0x0080 /* Spare */ +#define M_RTS 0x0100 /* Request to Send */ +#define M_CTS 0x0200 /* Clear to Send */ +#define M_DCD 0x0400 /* Carrier Detect */ +#define M_DTX 0x1000 /* Disable TX */ +#define M_DRX 0x2000 /* Disable RX */ +#define M_DCE 0x8000 /* DCE Port PCI-360 Read Only */ + +/* + * PCI-360 Modem masks + * Note: - This board can detect PM phy hardware for DTE or DCE operation. + */ +#define M_P360_SIO (M_LL | M_DTR | M_DSR | M_RTS | M_DRX | M_DTX) +#define M_P360_SET_DTE M_P360_SIO +#define M_P360_SET_DCE M_P360_SIO +#define M_P360_GET_DTE M_P360_SIO | M_DCE | M_RI | M_DSR +#define M_P360_GET_DCE M_P360_SIO | M_DCE | M_RI + + + +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ + u32 ctrl; /* GET_MOD_SIG or SET_MOD_SIG */ + u32 modem_sigs; /* See above M_??? for bit map */ + u32 modem_mask; /* Modem signals we care about */ +}b_modsig; + + + + + +/*****************************************************************************/ +/* + * B_X21_LOOP_EN & B_X21_LOOP_DI Support + */ +#define X21_LP_NORM 0 /* Use flags 0x0f only [X25_LOOP_EN] */ +#define X21_LP_SYN 1 /* Prefix flags with SYN [X25_LOOP_EN] */ + +/* Return Values */ +#define X21_ACK 0 /* No Errors */ +#define X21_MODE_FAIL 1 /* Could not start /exit req mode */ +#define X21_IN_3C_LB 2 /* All ready in Loopback 3c mode */ +#define X21_BAD_HW 3 /* Wrong HW Type. (should be X.21) */ +#define X21_DTE_ONLY 4 /* DCE not supported */ + + + +/* + * X.21 Lopback 3c Mode + */ + +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ + u32 flag; /* X21_LP_NORM or X21_LP_SYN */ +}b_x21lb_3c; + + +/*****************************************************************************/ + + + +/* + * B_LW_FLUSH Support + */ + +#define B_LW_RX_FLUSH 1 /* Flush lower wan driver Rx ring */ +#define B_LW_TX_FLUSH 2 /* Flush lower wan driver Tx ring */ + +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ + u32 flag; /* B_LW_RX_FLUSH and/or B_LW_TX_FLUSH */ +}b_lw_flush; + + + +/*****************************************************************************/ +/* + * B_MEM_DUMP Support + * Note: Use with care, dumps may cause unrecoverable errors, + * if the dump range points to a chip or invalid memory. + * The PDM ignores DEF_DBLK. So the driver may customize + * this structure. + * + * Care should be taken when getting a dump from across the + * bus. 'start_addr' and 'len' should assure the data + * starts and ends on a long word boundary. + * + * 'start_addr' is relative to the PDM's CPU. + */ + + + +/* + * dump structure + */ +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ + u32 start_addr; /* PDM's address to start dump */ + u32 len; /* length of dump */ + u32 dump[DEF_DBLK/4]; /* Must size >= len */ +}b_mem_dump; + + + +/*****************************************************************************/ +/* + * B_TELLUS Support + * Note: This ioctl provides a real time way to enable or disable + * events that could be sent upstream by the PDM. + * + * See WAN_tell_us above for bit def. + */ + +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ + u32 WAN_tell_us; /* Tell Up Stream interrupt info */ + u32 tell_val; /* Bits corrispond to WAN_tell_us */ +}b_tellus; + + + +/*****************************************************************************/ +/* + * B_CSR Support + */ + +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ + u32 csr[MAX_PORTS_PER_CARD]; /* CSR Registers */ +}b_csr; + + + +/*****************************************************************************/ +/* + * B_CONS_RD Support + */ + +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ + u32 len; /* length of dump */ + u32 buf[DEF_CBLK]; /* Must size >= len */ +}b_cons_rd; + + + +/*****************************************************************************/ +/* + * B_CONS_WR Support + */ + +typedef struct { + bio_wrap bio; /* type, status, irp &drv data */ + u32 len; /* length of dump */ + char buf[DEF_CBLK]; /* Must size >= len */ +}b_cons_wr; + +#endif /* __WANXL_H */ diff -urN v2.2.15/linux/drivers/pci/oldproc.c linux/drivers/pci/oldproc.c --- v2.2.15/linux/drivers/pci/oldproc.c Wed May 3 17:16:43 2000 +++ linux/drivers/pci/oldproc.c Wed Jun 7 14:26:43 2000 @@ -412,8 +412,11 @@ DEVICE( MUTECH, MUTECH_MV1000, "MV-1000"), DEVICE( RENDITION, RENDITION_VERITE,"Verite 1000"), DEVICE( RENDITION, RENDITION_VERITE2100,"Verite 2100"), - DEVICE( RCC, RCC_HE, "CNB20HE PCI Bridge"), - DEVICE( RCC, RCC_LE, "CNB30LE PCI Bridge"), + DEVICE( SERVERWORKS, SERVERWORKS_HE, "CNB20HE PCI Bridge"), + DEVICE( SERVERWORKS, SERVERWORKS_LE, "CNB30LE PCI Bridge"), + DEVICE( SERVERWORKS, SERVERWORKS_CMIC_HE, "CMIC-HE PCI Bridge"), + DEVICE( SERVERWORKS, SERVERWORKS_CIOB30, "CIOB30 I/O Bridge"), + DEVICE( SERVERWORKS, SERVERWORKS_CSB5, "CSB5 PCI Bridge"), DEVICE( TOSHIBA, TOSHIBA_601, "Laptop"), DEVICE( TOSHIBA, TOSHIBA_TOPIC95,"ToPIC95"), DEVICE( TOSHIBA, TOSHIBA_TOPIC97,"ToPIC97"), @@ -480,6 +483,7 @@ DEVICE( NVIDIA_SGS, NVIDIA_SGS_RIVA128, "Riva 128"), DEVICE( CBOARDS, CBOARDS_DAS1602_16,"DAS1602/16"), DEVICE( MOTOROLA_OOPS, MOTOROLA_FALCON,"Falcon"), + DEVICE( TIMEDIA, TIMEDIA_4008A, "Noname 4008A"), DEVICE( SYMPHONY, SYMPHONY_101, "82C101"), DEVICE( TEKRAM, TEKRAM_DC290, "DC-290"), DEVICE( 3DLABS, 3DLABS_300SX, "GLINT 300SX"), @@ -712,6 +716,7 @@ case PCI_CLASS_SERIAL_SSA: return "SSA"; case PCI_CLASS_SERIAL_USB: return "USB Controller"; case PCI_CLASS_SERIAL_FIBER: return "Fiber Channel"; + case PCI_CLASS_SERIAL_SMBUS: return "SM Bus"; case PCI_CLASS_HOT_SWAP_CONTROLLER: return "Hot Swap Controller"; @@ -843,6 +848,7 @@ case PCI_VENDOR_ID_PICTUREL: return "Picture Elements"; case PCI_VENDOR_ID_NVIDIA_SGS: return "NVidia/SGS Thomson"; case PCI_VENDOR_ID_CBOARDS: return "ComputerBoards"; + case PCI_VENDOR_ID_TIMEDIA: return "Timedia Technology"; case PCI_VENDOR_ID_SYMPHONY: return "Symphony"; case PCI_VENDOR_ID_COMPUTONE: return "Computone Corporation"; case PCI_VENDOR_ID_TEKRAM: return "Tekram"; diff -urN v2.2.15/linux/drivers/pci/pci.c linux/drivers/pci/pci.c --- v2.2.15/linux/drivers/pci/pci.c Wed May 3 17:16:43 2000 +++ linux/drivers/pci/pci.c Wed Jun 7 14:26:43 2000 @@ -305,9 +305,10 @@ * as a child bus */ if( - ((dev->vendor == PCI_VENDOR_ID_RCC) && - ((dev->device == PCI_DEVICE_ID_RCC_HE) || - (dev->device == PCI_DEVICE_ID_RCC_LE))) || + ((dev->vendor == PCI_VENDOR_ID_SERVERWORKS) && + ((dev->device == PCI_DEVICE_ID_SERVERWORKS_HE) || + (dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) || + (dev->device == PCI_DEVICE_ID_SERVERWORKS_CMIC_HE))) || ((dev->vendor == PCI_VENDOR_ID_COMPAQ) && (dev->device == PCI_DEVICE_ID_COMPAQ_6010)) || ((dev->vendor == PCI_VENDOR_ID_INTEL) && diff -urN v2.2.15/linux/drivers/s390/Config.in linux/drivers/s390/Config.in --- v2.2.15/linux/drivers/s390/Config.in Tue Jan 4 10:12:18 2000 +++ linux/drivers/s390/Config.in Wed Jun 7 14:26:43 2000 @@ -16,9 +16,13 @@ bool ' Boot support (linear, striped)' CONFIG_MD_BOOT fi tristate 'RAM disk support' CONFIG_BLK_DEV_RAM +if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then + int ' Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 8192 +fi if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD fi +tristate 'XPRAM disk support' CONFIG_BLK_DEV_XPRAM bool 'Support for VM minidisk (VM only)' CONFIG_MDISK if [ "$CONFIG_MDISK" = "y" ]; then @@ -29,15 +33,21 @@ if [ "$CONFIG_DASD" != "n" ]; then comment 'DASD disciplines' bool ' Support for ECKD Disks' CONFIG_DASD_ECKD + bool ' Support for FBA Disks' CONFIG_DASD_FBA +# bool ' Support for CKD Disks (unsupported)' CONFIG_DASD_CKD + if [ "$CONFIG_MDISK" = "n" ]; then + bool ' Support for DIAG access to CMS formatted Disks' CONFIG_DASD_MDSK + fi fi #menu_option next_comment +# comment 'S/390-SCSI support' +# tristate 'S/390-SCSI support' CONFIG_SCSI #endmenu if [ "$CONFIG_NET" = "y" ]; then mainmenu_option next_comment comment 'S/390 Network device support' - bool 'Network device support' CONFIG_NETDEVICES if [ "$CONFIG_NETDEVICES" = "y" ]; then menu_option next_comment diff -urN v2.2.15/linux/drivers/s390/Makefile linux/drivers/s390/Makefile --- v2.2.15/linux/drivers/s390/Makefile Tue Jan 4 10:12:18 2000 +++ linux/drivers/s390/Makefile Wed Jun 7 14:26:43 2000 @@ -16,7 +16,7 @@ SUBDIRS := $(SUBDIRS) arch/s390/drivers/block arch/s390/drivers/char \ arch/s390/drivers/misc arch/s390/drivers/net -MOD_SUB_DIRS += ./net +MOD_SUB_DIRS += ./net ./block O_OBJS := block/s390-block.o \ char/s390-char.o \ diff -urN v2.2.15/linux/drivers/s390/block/Makefile linux/drivers/s390/block/Makefile --- v2.2.15/linux/drivers/s390/block/Makefile Tue Jan 4 10:12:18 2000 +++ linux/drivers/s390/block/Makefile Wed Jun 7 14:26:43 2000 @@ -4,22 +4,60 @@ O_TARGET := s390-block.o O_OBJS := M_OBJS := +D_OBJS := ifeq ($(CONFIG_DASD),y) - O_OBJS += dasd.o dasd_ccwstuff.o + O_OBJS += dasd.o dasd_ccwstuff.o dasd_erp.o dasd_setup.o ifeq ($(CONFIG_PROC_FS),y) O_OBJS += dasd_proc.o dasd_profile.o endif ifeq ($(CONFIG_DASD_ECKD),y) - O_OBJS += dasd_eckd.o + O_OBJS += dasd_eckd.o dasd_eckd_erp.o dasd_3990_erp.o dasd_9343_erp.o endif + ifeq ($(CONFIG_DASD_FBA),y) + O_OBJS += dasd_fba.o + endif + ifeq ($(CONFIG_DASD_MDSK),y) + O_OBJS += dasd_mdsk.o + endif +# ifeq ($(CONFIG_DASD_CKD),y) +# O_OBJS += dasd_ckd.o +# endif +endif + +ifeq ($(CONFIG_DASD),m) + M_OBJS += dasd_mod.o + D_OBJS += dasd.o dasd_ccwstuff.o dasd_erp.o dasd_setup.o + ifeq ($(CONFIG_PROC_FS),y) + D_OBJS += dasd_proc.o dasd_profile.o + endif + ifeq ($(CONFIG_DASD_ECKD),y) + D_OBJS += dasd_eckd.o dasd_eckd_erp.o dasd_3990_erp.o dasd_9343_erp.o + endif + ifeq ($(CONFIG_DASD_FBA),y) + D_OBJS += dasd_fba.o + endif + ifeq ($(CONFIG_DASD_MDSK),y) + D_OBJS += dasd_mdsk.o + endif +# ifeq ($(CONFIG_DASD_CKD),y) +# D_OBJS += dasd_ckd.o +# endif endif ifeq ($(CONFIG_MDISK),y) O_OBJS += mdisk.o endif +ifeq ($(CONFIG_BLK_DEV_XPRAM),y) + O_OBJS += xpram.o +else + ifeq ($(CONFIG_BLK_DEV_XPRAM),m) + M_OBJS += xpram.o + endif +endif + dasd_mod.o: $(D_OBJS) - $(LD) $(LD_RFLAG) -r -o $@ $+ + $(LD) $(LD_RFLAG) -r -o $@ $(D_OBJS) include $(TOPDIR)/Rules.make diff -urN v2.2.15/linux/drivers/s390/block/dasd.c linux/drivers/s390/block/dasd.c --- v2.2.15/linux/drivers/s390/block/dasd.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/block/dasd.c Wed Jun 7 14:26:43 2000 @@ -1,7 +1,6 @@ /* * File...........: linux/drivers/s390/block/dasd.c * Author(s)......: Holger Smolinski - * : Utz Bacher * Bugreports.to..: * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 */ @@ -9,10 +8,6 @@ #include #include -#ifdef MODULE -#include -#endif /* MODULE */ - #include #include #include @@ -27,16 +22,18 @@ #include #include +#include -#include "dasd.h" +#include #include +#include "dasd_erp.h" #include "dasd_types.h" #include "dasd_ccwstuff.h" -#define PRINTK_HEADER DASD_NAME":" +#include "../../../arch/s390/kernel/debug.h" -#define CCW_READ_DEVICE_CHARACTERISTICS 0x64 +#define PRINTK_HEADER DASD_NAME":" #define DASD_SSCH_RETRIES 2 @@ -45,220 +42,107 @@ (( info -> sid_data.cu_type ct ) && ( info -> sid_data.cu_model cm )) && \ (( info -> sid_data.dev_type dt ) && ( info -> sid_data.dev_model dm )) ) +#ifdef MODULE +#include + +char *dasd[DASD_MAX_DEVICES] = +{NULL,}; +#ifdef CONFIG_DASD_MDSK +char *dasd_force_mdsk[DASD_MAX_DEVICES] = +{NULL,}; +#endif + +kdev_t ROOT_DEV; + +EXPORT_NO_SYMBOLS; +MODULE_AUTHOR ("Holger Smolinski "); +MODULE_DESCRIPTION ("Linux on S/390 DASD device driver, Copyright 2000 IBM Corporation"); +MODULE_PARM (dasd, "1-" __MODULE_STRING (DASD_MAX_DEVICES) "s"); +#ifdef CONFIG_DASD_MDSK +MODULE_PARM (dasd_force_mdsk, "1-" __MODULE_STRING (DASD_MAX_DEVICES) "s"); +#endif +#endif + /* Prototypes for the functions called from external */ -static ssize_t dasd_read (struct file *, char *, size_t, loff_t *); -static ssize_t dasd_write (struct file *, const char *, size_t, loff_t *); -static int dasd_ioctl (struct inode *, struct file *, unsigned int, unsigned long); -static int dasd_open (struct inode *, struct file *); -static int dasd_fsync (struct file *, struct dentry *); -static int dasd_release (struct inode *, struct file *); +void dasd_partn_detect (int di); +int devindex_from_devno (int devno); +int dasd_is_accessible (int devno); +void dasd_add_devno_to_ranges (int devno); + +#ifdef CONFIG_DASD_MDSK +extern int dasd_force_mdsk_flag[DASD_MAX_DEVICES]; +extern void do_dasd_mdsk_interrupt (struct pt_regs *regs, __u16 code); +extern int dasd_parse_module_params (void); +extern void (**ext_mdisk_int) (void); +#endif + void dasd_debug (unsigned long tag); void dasd_profile_add (cqr_t *cqr); void dasd_proc_init (void); -static struct file_operations dasd_file_operations; +static int dasd_format (int dev, format_data_t * fdata); + +static struct file_operations dasd_device_operations; spinlock_t dasd_lock; /* general purpose lock for the dasd driver */ /* All asynchronous I/O should waint on this wait_queue */ struct wait_queue *dasd_waitq = NULL; -static int dasd_autodetect = 1; -static int dasd_devno[DASD_MAX_DEVICES] = -{0,}; -static int dasd_count = 0; - extern dasd_chanq_t *cq_head; +extern int dasd_probeonly; -static int -dasd_get_hexdigit (char c) -{ - if ((c >= '0') && (c <= '9')) - return c - '0'; - if ((c >= 'a') && (c <= 'f')) - return c + 10 - 'a'; - if ((c >= 'A') && (c <= 'F')) - return c + 10 - 'A'; - return -1; -} +debug_info_t *dasd_debug_info; -/* sets the string pointer after the next comma */ -static void -dasd_scan_for_next_comma (char **strptr) -{ - while (((**strptr) != ',') && ((**strptr)++)) - (*strptr)++; +extern dasd_information_t **dasd_information; - /* set the position AFTER the comma */ - if (**strptr == ',') - (*strptr)++; -} +dasd_information_t *dasd_info[DASD_MAX_DEVICES] = +{NULL,}; +static struct hd_struct dd_hdstruct[DASD_MAX_DEVICES << PARTN_BITS]; +static int dasd_blks[256] = +{0,}; +static int dasd_secsize[256] = +{0,}; +static int dasd_blksize[256] = +{0,}; +static int dasd_maxsecs[256] = +{0,}; -/*sets the string pointer after the next comma, if a parse error occured */ -static int -dasd_get_next_int (char **strptr) +void +dasd_geninit (struct gendisk *dd) { - int j, i = -1; /* for cosmetic reasons first -1, then 0 */ - if (isxdigit (**strptr)) { - for (i = 0; isxdigit (**strptr);) { - i <<= 4; - j = dasd_get_hexdigit (**strptr); - if (j == -1) { - PRINT_ERR ("no integer: skipping range.\n"); - dasd_scan_for_next_comma (strptr); - i = -1; - break; - } - i += j; - (*strptr)++; - if (i > 0xffff) { - PRINT_ERR (" value too big, skipping range.\n"); - dasd_scan_for_next_comma (strptr); - i = -1; - break; - } - } - } - return i; } -static inline int -devindex_from_devno (int devno) +struct gendisk dd_gendisk = { - int i; - for (i = 0; i < dasd_count; i++) { - if (dasd_devno[i] == devno) - return i; - } - if (dasd_autodetect) { - if (dasd_count < DASD_MAX_DEVICES) { - dasd_devno[dasd_count] = devno; - return dasd_count++; - } - return -EOVERFLOW; - } - return -ENODEV; -} + major:MAJOR_NR, /* Major number */ + major_name:"dasd", /* Major name */ + minor_shift:PARTN_BITS, /* Bits to shift to get real from partn */ + max_p:1 << PARTN_BITS, /* Number of partitions per real */ + max_nr:0, /* number */ + init:dasd_geninit, + part:dd_hdstruct, /* hd struct */ + sizes:dasd_blks, /* sizes in blocks */ + nr_real:0, + real_devices:NULL, /* internal */ + next:NULL /* next */ +}; -/* returns 1, if dasd_no is in the specified ranges, otherwise 0 */ -static inline int -dasd_is_accessible (int devno) -{ - return (devindex_from_devno (devno) >= 0); -} +static atomic_t bh_scheduled = ATOMIC_INIT (0); -/* dasd_insert_range skips ranges, if the start or the end is -1 */ -static void -dasd_insert_range (int start, int end) +void +dasd_schedule_bh (void (*func) (void)) { - int curr; - FUNCTION_ENTRY ("dasd_insert_range"); - if (dasd_count >= DASD_MAX_DEVICES) { - PRINT_ERR (" too many devices specified, ignoring some.\n"); - FUNCTION_EXIT ("dasd_insert_range"); - return; - } - if ((start == -1) || (end == -1)) { - PRINT_ERR ("invalid format of parameter, skipping range\n"); - FUNCTION_EXIT ("dasd_insert_range"); + static struct tq_struct dasd_tq = + {0,}; + /* Protect against rescheduling, when already running */ + if (atomic_compare_and_swap (0, 1, &bh_scheduled)) return; - } - if (end < start) { - PRINT_ERR (" ignoring range from %x to %x - start value " \ - "must be less than end value.\n", start, end); - FUNCTION_EXIT ("dasd_insert_range"); + dasd_tq.routine = (void *) (void *) func; + queue_task (&dasd_tq, &tq_immediate); + mark_bh (IMMEDIATE_BH); return; } -/* concurrent execution would be critical, but will not occur here */ - for (curr = start; curr <= end; curr++) { - if (dasd_is_accessible (curr)) { - PRINT_WARN (" %x is already in list as device %d\n", - curr, devindex_from_devno (curr)); - } - dasd_devno[dasd_count] = curr; - dasd_count++; - if (dasd_count >= DASD_MAX_DEVICES) { - PRINT_ERR (" too many devices specified, ignoring some.\n"); - break; - } - } - PRINT_INFO (" added dasd range from %x to %x.\n", - start, dasd_devno[dasd_count - 1]); - - FUNCTION_EXIT ("dasd_insert_range"); -} - -void -dasd_setup (char *str, int *ints) -{ - int devno, devno2; - - FUNCTION_ENTRY ("dasd_setup"); - dasd_autodetect = 0; - while (*str && *str != 1) { - if (!isxdigit (*str)) { - str++; /* to avoid looping on two commas */ - PRINT_ERR (" kernel parameter in invalid format.\n"); - continue; - } - devno = dasd_get_next_int (&str); - - /* range was skipped? -> scan for comma has been done */ - if (devno == -1) - continue; - - if (*str == ',') { - str++; - dasd_insert_range (devno, devno); - continue; - } - if (*str == '-') { - str++; - devno2 = dasd_get_next_int (&str); - if (devno2 == -1) { - PRINT_ERR (" invalid character in " \ - "kernel parameters."); - } else { - dasd_insert_range (devno, devno2); - } - dasd_scan_for_next_comma (&str); - continue; - } - if (*str == 0) { - dasd_insert_range (devno, devno); - break; - } - PRINT_ERR (" unexpected character in kernel parameter, " \ - "skipping range.\n"); - } - FUNCTION_EXIT ("dasd_setup"); -} - -static void -dd_geninit (struct gendisk *ignored) -{ - FUNCTION_ENTRY ("dd_geninit"); - FUNCTION_EXIT ("dd_geninit"); -} - -static struct hd_struct dd_hdstruct[DASD_MAX_DEVICES << PARTN_BITS]; -static int dd_blocksizes[DASD_MAX_DEVICES << PARTN_BITS]; - -struct gendisk dd_gendisk = -{ - MAJOR_NR, /* Major number */ - "dd", /* Major name */ - PARTN_BITS, /* Bits to shift to get real from partn */ - 1 << PARTN_BITS, /* Number of partitions per real */ - DASD_MAX_DEVICES, /* maximum number of real */ - dd_geninit, /* init function */ - dd_hdstruct, /* hd struct */ - dd_blocksizes, /* block sizes */ - 0, /* number */ - NULL, /* internal */ - NULL /* next */ - -}; void sleep_done (struct semaphore *sem) @@ -288,104 +172,49 @@ #ifdef CONFIG_DASD_ECKD extern dasd_operations_t dasd_eckd_operations; #endif /* CONFIG_DASD_ECKD */ +#ifdef CONFIG_DASD_FBA +extern dasd_operations_t dasd_fba_operations; +#endif /* CONFIG_DASD_FBA */ +#ifdef CONFIG_DASD_MDSK +extern dasd_operations_t dasd_mdsk_operations; +#endif /* CONFIG_DASD_MDSK */ dasd_operations_t *dasd_disciplines[] = { #ifdef CONFIG_DASD_ECKD - &dasd_eckd_operations + &dasd_eckd_operations, #endif /* CONFIG_DASD_ECKD */ +#ifdef CONFIG_DASD_FBA + &dasd_fba_operations, +#endif /* CONFIG_DASD_FBA */ +#ifdef CONFIG_DASD_MDSK + &dasd_mdsk_operations, +#endif /* CONFIG_DASD_MDSK */ +#ifdef CONFIG_DASD_CKD + &dasd_ckd_operations, +#endif /* CONFIG_DASD_CKD */ + NULL }; char *dasd_name[] = { #ifdef CONFIG_DASD_ECKD - "ECKD" + "ECKD", #endif /* CONFIG_DASD_ECKD */ +#ifdef CONFIG_DASD_FBA + "FBA", +#endif /* CONFIG_DASD_FBA */ +#ifdef CONFIG_DASD_MDSK + "MDSK", +#endif /* CONFIG_DASD_MDSK */ +#ifdef CONFIG_DASD_CKD + "CKD", +#endif /* CONFIG_DASD_CKD */ + "END" }; -dasd_information_t *dasd_info[DASD_MAX_DEVICES] = -{NULL,}; - -static int dasd_blks[256] = -{0,}; -static int dasd_secsize[256] = -{0,}; -static int dasd_blksize[256] = -{0,}; -static int dasd_maxsecs[256] = -{0,}; - -void -fill_sizes (int di) -{ - int rc; - int minor; - rc = dasd_disciplines[dasd_info[di]->type]->fill_sizes (di); - switch (rc) { - case -EMEDIUMTYPE: - dasd_info[di]->flags |= DASD_NOT_FORMATTED; - break; - } - PRINT_INFO ("%ld kB <- 'soft'-block: %d, hardsect %d Bytes\n", - dasd_info[di]->sizes.kbytes, - dasd_info[di]->sizes.bp_block, - dasd_info[di]->sizes.bp_sector); - switch (dasd_info[di]->type) { -#ifdef CONFIG_DASD_ECKD - case dasd_eckd: - dasd_info[di]->sizes.first_sector = - 3 << dasd_info[di]->sizes.s2b_shift; - break; -#endif /* CONFIG_DASD_ECKD */ - default: - INTERNAL_CHECK ("Unknown dasd type %d\n", dasd_info[di]->type); - } - minor = di << PARTN_BITS; - dasd_blks[minor] = dasd_info[di]->sizes.kbytes; - dasd_secsize[minor] = dasd_info[di]->sizes.bp_sector; - dasd_blksize[minor] = dasd_info[di]->sizes.bp_block; - dasd_maxsecs[minor] = 252<sizes.s2b_shift; - dasd_blks[minor + 1] = dasd_info[di]->sizes.kbytes - - (dasd_info[di]->sizes.first_sector >> 1); - dasd_secsize[minor + 1] = dasd_info[di]->sizes.bp_sector; - dasd_blksize[minor + 1] = dasd_info[di]->sizes.bp_block; - dasd_maxsecs[minor+1] = 252<sizes.s2b_shift; -} - -int -dasd_format (int dev, format_data_t * fdata) -{ - int rc; - int devindex = DEVICE_NR (dev); - PRINT_INFO ("Format called with devno %x\n", dev); - if (MINOR (dev) & (0xff >> (8 - PARTN_BITS))) { - PRINT_WARN ("Can't format partition! minor %x %x\n", - MINOR (dev), 0xff >> (8 - PARTN_BITS)); - return -EINVAL; - } - down (&dasd_info[devindex]->sem); - if (dasd_info[devindex]->open_count == 1) { - rc = dasd_disciplines[dasd_info[devindex]->type]-> - dasd_format (devindex, fdata); - if (rc) { - PRINT_WARN ("Formatting failed rc=%d\n", rc); - } - } else { - PRINT_WARN ("device is open! %d\n", dasd_info[devindex]->open_count); - rc = -EINVAL; - } - if (!rc) { - fill_sizes (devindex); - dasd_info[devindex]->flags &= ~DASD_NOT_FORMATTED; - } else { - dasd_info[devindex]->flags |= DASD_NOT_FORMATTED; - } - up (&dasd_info[devindex]->sem); - return rc; -} - -static inline int -do_dasd_ioctl (struct inode *inp, unsigned int no, unsigned long data) +static int +do_dasd_ioctl (struct inode *inp, /* unsigned */ int no, unsigned long data) { int rc; int di; @@ -415,14 +244,10 @@ switch (no) { case BLKGETSIZE:{ /* Return device size */ - unsigned long blocks; - if (inp->i_rdev & 0x01) { - blocks = (dev->sizes.blocks - 3) << - dev->sizes.s2b_shift; - } else { - blocks = dev->sizes.kbytes << dev->sizes.s2b_shift; - } - rc = copy_to_user ((long *) data, &blocks, sizeof (long)); + int blocks = dasd_blks[MINOR (inp->i_rdev)] << 1; + rc = copy_to_user ((long *) data, + &blocks, + sizeof (long)); break; } case BLKFLSBUF:{ @@ -440,17 +265,30 @@ break; } case BLKRRPART:{ - INTERNAL_CHECK ("BLKRPART not implemented%s", ""); - rc = -EINVAL; + dasd_partn_detect (di); + rc = 0; + break; + } + case BIODASDRLB:{ + rc = copy_to_user ((int *) data, + &dasd_info[di]->sizes.label_block, + sizeof (int)); + break; + } + case BLKGETBSZ:{ + rc = copy_to_user ((int *) data, + &dasd_info[di]->sizes.bp_block, + sizeof (int)); break; } case HDIO_GETGEO:{ - INTERNAL_CHECK ("HDIO_GETGEO not implemented%s", ""); - rc = -EINVAL; + struct hd_geometry geo; + dasd_disciplines[dev->type]->fill_geometry (di, &geo); + rc = copy_to_user ((struct hd_geometry *) data, &geo, + sizeof (struct hd_geometry)); break; } RO_IOCTLS (inp->i_rdev, data); - case BIODASDRSID:{ rc = copy_to_user ((void *) data, &(dev->info.sid_data), @@ -462,13 +300,17 @@ int xlt; rc = copy_from_user (&xlt, (void *) data, sizeof (int)); +#if 0 PRINT_INFO("Xlating %d to",xlt); +#endif if (rc) break; - if (MINOR (inp->i_rdev) & 1) - offset = 3; + offset = dd_gendisk.part[MINOR (inp->i_rdev)].start_sect >> + dev->sizes.s2b_shift; xlt += offset; +#if 0 printk(" %d \n",xlt); +#endif rc = copy_to_user ((void *) data, &xlt, sizeof (int)); break; @@ -476,6 +318,7 @@ case BIODASDFORMAT:{ /* fdata == NULL is a valid arg to dasd_format ! */ format_data_t *fdata = NULL; + PRINT_WARN ("called format ioctl\n"); if (data) { fdata = kmalloc (sizeof (format_data_t), GFP_ATOMIC); @@ -495,6 +338,7 @@ break; } default: + PRINT_WARN ("unknown ioctl number %08x %08lx\n", no, BIODASDFORMAT); rc = -EINVAL; break; } @@ -533,13 +377,58 @@ wake_up (&dasd_waitq); } + +int +dasd_watch_volume (int di) +{ + int rc = 0; + + return rc; +} + +void +dasd_watcher (void) +{ + int i = 0; + int rc; + do { + for ( i = 0; i < DASD_MAX_DEVICES; i++ ) { + if ( dasd_info [i] ) { + rc = dasd_watch_volume ( i ); + } + } + interruptible_sleep_on(&dasd_waitq); + } while(1); +} + int -dasd_unregister_dasd (int irq, dasd_type_t dt, dev_info_t * info) +dasd_unregister_dasd (int di) { int rc = 0; - FUNCTION_ENTRY ("dasd_unregister_dasd"); - INTERNAL_CHECK ("dasd_unregister_dasd not implemented%s\n", ""); - FUNCTION_EXIT ("dasd_unregister_dasd"); + int minor; + int i; + + minor = di << PARTN_BITS; + if (!dasd_info[di]) { /* devindex is not free */ + INTERNAL_CHECK ("trying to free unallocated device %d\n", di); + return -ENODEV; + } + /* delete all that partition stuff */ + for (i = 0; i < (1 << PARTN_BITS); i++) { + dasd_blks[minor] = 0; + dasd_secsize[minor + i] = 0; + dasd_blksize[minor + i] = 0; + dasd_maxsecs[minor + i] = 0; + } + /* reset DASD to unknown statuss */ + atomic_set (&dasd_info[di]->status, DASD_INFO_STATUS_UNKNOWN); + + free_irq (dasd_info[di]->info.irq, &(dasd_info[di]->dev_status)); + if (dasd_info[di]->rdc_data) + kfree (dasd_info[di]->rdc_data); + kfree (dasd_info[di]); + PRINT_INFO ("%04d deleted from list of valid DASDs\n", + dasd_info[di]->info.devno); return rc; } @@ -548,8 +437,17 @@ check_type (dev_info_t * info) { dasd_type_t type = dasd_none; + int di; FUNCTION_ENTRY ("check_type"); + di = devindex_from_devno (info->devno); + +#ifdef CONFIG_DASD_MDSK + if (MACHINE_IS_VM && dasd_force_mdsk_flag[di] == 1) { + type = dasd_mdsk; + } else +#endif /* CONFIG_DASD_MDSK */ + #ifdef CONFIG_DASD_ECKD if (MATCH (info, == 0x3990, ||1, == 0x3390, ||1) || MATCH (info, == 0x9343, ||1, == 0x9345, ||1) || @@ -557,9 +455,20 @@ type = dasd_eckd; } else #endif /* CONFIG_DASD_ECKD */ +#ifdef CONFIG_DASD_FBA + if (MATCH (info, == 0x6310, ||1, == 0x9336, ||1)) { + type = dasd_fba; + } else +#endif /* CONFIG_DASD_FBA */ +#ifdef CONFIG_DASD_MDSK + if (MACHINE_IS_VM) { + type = dasd_mdsk; + } else +#endif /* CONFIG_DASD_MDSK */ { type = dasd_none; } + FUNCTION_EXIT ("check_type"); return type; } @@ -567,7 +476,7 @@ static int dasd_read_characteristics (dasd_information_t * info) { - int rc; + int rc = 0; int ct = 0; dev_info_t *di; dasd_type_t dt; @@ -598,13 +507,25 @@ #ifdef CONFIG_DASD_ECKD case dasd_eckd: ct = 64; + rc = read_dev_chars (info->info.irq, + (void *) &(info->rdc_data), ct); break; #endif /* CONFIG_DASD_ECKD */ +#ifdef CONFIG_DASD_FBA + case dasd_fba: + ct = 32; + rc = read_dev_chars (info->info.irq, + (void *) &(info->rdc_data), ct); + break; +#endif /* CONFIG_DASD_FBA */ +#ifdef CONFIG_DASD_MDSK + case dasd_mdsk: + ct = 0; + break; +#endif /* CONFIG_DASD_FBA */ default: INTERNAL_ERROR ("don't know dasd type %d\n", dt); } - rc = read_dev_chars (info->info.irq, - (void *) &(info->rdc_data), ct); if (rc) { PRINT_WARN ("RDC resulted in rc=%d\n", rc); } @@ -613,28 +534,12 @@ } /* How many sectors must be in a request to dequeue it ? */ -#define QUEUE_BLOCKS 100 +#define QUEUE_BLOCKS 25 #define QUEUE_SECTORS (QUEUE_BLOCKS << dasd_info[di]->sizes.s2b_shift) /* How often to retry an I/O before raising an error */ #define DASD_MAX_RETRIES 5 -static atomic_t bh_scheduled = ATOMIC_INIT (0); - -static inline void -schedule_bh (void (*func) (void)) -{ - static struct tq_struct dasd_tq = - {0,}; - /* Protect against rescheduling, when already running */ - if (atomic_compare_and_swap (0, 1, &bh_scheduled)) - return; - dasd_tq.routine = (void *) (void *) func; - queue_task (&dasd_tq, &tq_immediate); - mark_bh (IMMEDIATE_BH); - return; -} - static inline cqr_t * dasd_cqr_from_req (struct request *req) @@ -652,8 +557,9 @@ if (!info) return NULL; /* if applicable relocate block */ - if (MINOR (req->rq_dev) & 0x1) { - req->sector += info->sizes.first_sector; + if (MINOR (req->rq_dev) & ((1 << PARTN_BITS) - 1)) { + req->sector += + dd_gendisk.part[MINOR (req->rq_dev)].start_sect; } /* Now check for consistency */ if (!req->nr_sectors) { @@ -677,12 +583,7 @@ #ifdef DASD_PROFILE asm volatile ("STCK %0":"=m" (cqr->buildclk)); #endif /* DASD_PROFILE */ - if (atomic_compare_and_swap (CQR_STATUS_EMPTY, - CQR_STATUS_FILLED, - &cqr->status)) { - PRINT_WARN ("cqr from req stat changed %d\n", - atomic_read (&cqr->status)); - } + ACS (cqr->status, CQR_STATUS_EMPTY, CQR_STATUS_FILLED); } return cqr; } @@ -694,24 +595,22 @@ int retries = DASD_SSCH_RETRIES; int di, irq; - dasd_debug (cqr); /* cqr */ + dasd_debug ((unsigned long) cqr); /* cqr */ if (!cqr) { PRINT_WARN ("(start_IO) no cqr passed\n"); return -EINVAL; } - if (cqr->magic != DASD_MAGIC) { - PRINT_WARN ("(start_IO) magic number mismatch\n"); - return -EINVAL; - } - if (atomic_compare_and_swap (CQR_STATUS_QUEUED, - CQR_STATUS_IN_IO, - &cqr->status)) { - PRINT_WARN ("start_IO: status changed %d\n", - atomic_read (&cqr->status)); - atomic_set (&cqr->status, CQR_STATUS_ERROR); +#ifdef CONFIG_DASD_MDSK + if (cqr->magic == MDSK_MAGIC) { + return dasd_mdsk_start_IO (cqr); + } +#endif /* CONFIG_DASD_MDSK */ + if (cqr->magic != DASD_MAGIC && cqr->magic != ERP_MAGIC) { + PRINT_ERR ("(start_IO) magic number mismatch\n"); return -EINVAL; } + ACS (cqr->status, CQR_STATUS_QUEUED, CQR_STATUS_IN_IO); di = cqr->devindex; irq = dasd_info[di]->info.irq; do { @@ -732,10 +631,12 @@ cqr, dasd_info[di]->info.devno, retries); break; case -EBUSY: /* set up timer, try later */ + PRINT_WARN ("cqr %p: 0x%04x busy, %d retries left\n", cqr, dasd_info[di]->info.devno, retries); break; default: + PRINT_WARN ("cqr %p: 0x%04x %d, %d retries left\n", cqr, rc, dasd_info[di]->info.devno, retries); @@ -743,13 +644,7 @@ } } while (rc && --retries); if (rc) { - if (atomic_compare_and_swap (CQR_STATUS_IN_IO, - CQR_STATUS_ERROR, - &cqr->status)) { - PRINT_WARN ("start_IO:(done) status changed %d\n", - atomic_read (&cqr->status)); - atomic_set (&cqr->status, CQR_STATUS_ERROR); - } + ACS (cqr->status, CQR_STATUS_IN_IO, CQR_STATUS_ERROR); } return rc; } @@ -773,8 +668,11 @@ dasd_dump_sense (devstat_t * stat) { int sl, sct; + if (!stat->flag | DEVSTAT_FLAG_SENSE_AVAIL) { + PRINT_INFO ("I/O status w/o sense data\n"); + } else { printk (KERN_INFO PRINTK_HEADER - "-------------------I/O resulted in unit check:-----------\n"); + "-------------------I/O result:-----------\n"); for (sl = 0; sl < 4; sl++) { printk (KERN_INFO PRINTK_HEADER "Sense:"); for (sct = 0; sct < 8; sct++) { @@ -784,35 +682,65 @@ printk ("\n"); } } +} + +int +register_dasd_last (int di) +{ + int rc = 0; + int minor; + int i; + + rc = dasd_disciplines[dasd_info[di]->type]->fill_sizes_last (di); + if (!rc) { + ACS (dasd_info[di]->status, + DASD_INFO_STATUS_DETECTED, DASD_INFO_STATUS_FORMATTED); + } else { /* -EMEDIUMTYPE: */ + ACS (dasd_info[di]->status, + DASD_INFO_STATUS_DETECTED, DASD_INFO_STATUS_ANALYSED); + } + PRINT_INFO ("%04X (dasd%c):%ld kB <- block: %d on sector %d B\n", + dasd_info[di]->info.devno, + 'a' + di, + dasd_info[di]->sizes.kbytes, + dasd_info[di]->sizes.bp_block, + dasd_info[di]->sizes.bp_sector); + minor = di << PARTN_BITS; + dasd_blks[minor] = dasd_info[di]->sizes.kbytes; + for (i = 0; i < (1 << PARTN_BITS); i++) { + dasd_secsize[minor + i] = dasd_info[di]->sizes.bp_sector; + dasd_blksize[minor + i] = dasd_info[di]->sizes.bp_block; + dasd_maxsecs[minor + i] = 252 << dasd_info[di]->sizes.s2b_shift; + } + return rc; +} + +void +dasd_partn_detect (int di) +{ + int minor = di << PARTN_BITS; + while (atomic_read (&dasd_info[di]->status) != + DASD_INFO_STATUS_FORMATTED) { + interruptible_sleep_on(&dasd_info[di]->wait_q); + } + dd_gendisk.part[minor].nr_sects = dasd_info[di]->sizes.kbytes << 1; + resetup_one_dev (&dd_gendisk, di); +} void dasd_do_chanq (void) { dasd_chanq_t *qp = NULL; - cqr_t *cqr; + cqr_t *cqr, *next; long flags; int irq; int tasks; + atomic_set (&bh_scheduled, 0); dasd_debug (0xc4c40000); /* DD */ - while ((tasks = atomic_read(&chanq_tasks)) != 0) { -/* initialization and wraparound */ - if (qp == NULL) { - dasd_debug (0xc4c46df0); /* DD_0 */ - qp = cq_head; - if (!qp) { - dasd_debug (0xc4c46ff1); /* DD?1 */ - dasd_debug (tasks); - PRINT_ERR("Mismatch of NULL queue pointer and " - "still %d chanq_tasks to do!!\n" - "Please send output of /proc/dasd/debug " - "to Linux390@de.ibm.com\n", tasks); - atomic_set(&chanq_tasks,0); - break; - } - } + for (qp = cq_head; qp != NULL;) { /* Get first request */ - dasd_debug (qp); /* qp */ + dasd_debug ((unsigned long) qp); cqr = (cqr_t *) (qp->head); /* empty queue -> dequeue and proceed */ if (!cqr) { @@ -823,9 +751,11 @@ } /* process all requests on that queue */ do { - cqr_t *next; + next = NULL; dasd_debug ((unsigned long) cqr); /* cqr */ - if (cqr->magic != DASD_MAGIC) { + if (cqr->magic != DASD_MAGIC && + cqr->magic != MDSK_MAGIC && + cqr->magic != ERP_MAGIC) { dasd_debug (0xc4c46ff2); /* DD?2 */ panic ( PRINTK_HEADER "do_cq:" "magic mismatch %p -> %x\n", @@ -837,51 +767,106 @@ switch (atomic_read (&cqr->status)) { case CQR_STATUS_IN_IO: dasd_debug (0xc4c4c9d6); /* DDIO */ - cqr = NULL; break; case CQR_STATUS_QUEUED: dasd_debug (0xc4c4e2e3); /* DDST */ - if (dasd_start_IO (cqr) == 0) { - atomic_dec (&chanq_tasks); - cqr = NULL; + if (dasd_start_IO (cqr) != 0) { + PRINT_WARN("start_io failed\n"); } break; - case CQR_STATUS_ERROR: + case CQR_STATUS_ERROR:{ dasd_debug (0xc4c4c5d9); /* DDER */ - dasd_dump_sense (cqr->dstat); if ( ++ cqr->retries < 2 ) { atomic_set (&cqr->status, CQR_STATUS_QUEUED); - dasd_debug (0xc4c4e2e3); /* DDST */ + dasd_debug (0xc4c4e2e3); if (dasd_start_IO (cqr) == 0) { - atomic_dec (&chanq_tasks); - cqr = NULL; + atomic_dec (&qp-> + dirty_requests); + break; } + } + ACS (cqr->status, + CQR_STATUS_ERROR, + CQR_STATUS_FAILED); + break; + } + case CQR_STATUS_ERP_PEND:{ + /* This case is entered, when an interrupt + ended with a condittion */ + dasd_erp_action_t erp_action; + erp_t *erp = NULL; + + if ( cqr -> magic != ERP_MAGIC ) { + erp = request_er (); + if (erp == NULL) { + PRINT_WARN ("No memory for ERP%s\n", ""); + break; + } + memset (erp, 0, sizeof (erp_t)); + erp->cqr.magic = ERP_MAGIC; + erp->cqr.int4cqr = cqr; + erp->cqr.devindex= cqr->devindex; + erp_action = dasd_erp_action (cqr); + if (erp_action) { + PRINT_WARN ("Taking ERP action %p\n", erp_action); + erp_action (erp); + } + dasd_chanq_enq_head(qp, (cqr_t *) erp); + next = (cqr_t *) erp; } else { - atomic_set (&cqr->status, + PRINT_WARN("ERP_ACTION failed\n"); + ACS (cqr->status, + CQR_STATUS_ERP_PEND, CQR_STATUS_FAILED); } break; - case CQR_STATUS_DONE: + } + case CQR_STATUS_ERP_ACTIVE: + break; + case CQR_STATUS_DONE:{ next = cqr->next; - dasd_debug (0xc4c49692); /* DDok */ + if (cqr->magic == DASD_MAGIC) { + dasd_debug (0xc4c49692); + } else if (cqr->magic == ERP_MAGIC) { + dasd_erp_action_t erp_postaction; + erp_t *erp = (erp_t *) cqr; + erp_postaction = + dasd_erp_postaction (erp); + if (erp_postaction) + erp_postaction (erp); + atomic_dec (&qp->dirty_requests); + } else if (cqr->magic == MDSK_MAGIC) { + } else { + PRINT_WARN ("unknown magic%s\n", ""); + } dasd_end_cqr (cqr, 1); - atomic_dec (&chanq_tasks); - cqr = next; break; - case CQR_STATUS_FAILED: + } + case CQR_STATUS_FAILED: { next = cqr->next; - dasd_debug (0xc4c47a7a); /* DD:: */ + if (cqr->magic == DASD_MAGIC) { + dasd_debug (0xc4c49692); + } else if (cqr->magic == ERP_MAGIC) { + dasd_erp_action_t erp_postaction; + erp_t *erp = (erp_t *) cqr; + erp_postaction = + dasd_erp_postaction (erp); + if (erp_postaction) + erp_postaction (erp); + } else if (cqr->magic == MDSK_MAGIC) { + } else { + PRINT_WARN ("unknown magic%s\n", ""); + } dasd_end_cqr (cqr, 0); - atomic_dec (&chanq_tasks); - cqr = next; + atomic_dec (&qp->dirty_requests); break; + } default: PRINT_WARN ("unknown cqrstatus\n"); - cqr = NULL; } s390irq_spin_unlock_irqrestore (irq, flags); - } while (cqr); + } while ((cqr = next) != NULL); qp = qp->next_q; } spin_lock (&io_request_lock); @@ -901,20 +886,15 @@ void do_dasd_request (void) { - struct request *req; - struct request *prev; - struct request *next; - char broken[DASD_MAX_DEVICES] = {0,}; - char busy[DASD_MAX_DEVICES] = {0,}; - int di; + struct request *req, *next, *prev; cqr_t *cqr; - long caller; dasd_chanq_t *q; long flags; - int irq; + int di, irq; + int broken, busy; dasd_debug (0xc4d90000); /* DR */ - dasd_debug (__builtin_return_address(0)); /* calleraddres */ + dasd_debug ((unsigned long) __builtin_return_address (0)); prev = NULL; for (req = CURRENT; req != NULL; req = next) { next = req->next; @@ -926,12 +906,11 @@ irq = dasd_info[di]->info.irq; s390irq_spin_lock_irqsave (irq, flags); q = &dasd_info[di]->queue; - busy[di] = busy[di]||(atomic_read(&q->flags)&DASD_CHANQ_BUSY); - if ( !busy[di] || - ((!broken[di]) && (req->nr_sectors >= QUEUE_SECTORS))) { -#if 0 - if ( q -> queued_requests < QUEUE_THRESHOLD ) { -#endif + busy = atomic_read (&q->flags) & DASD_CHANQ_BUSY; + broken = atomic_read (&q->flags) & DASD_REQUEST_Q_BROKEN; + if (!busy || + (!broken && + (req->nr_sectors >= QUEUE_SECTORS))) { if (prev) { prev->next = next; } else { @@ -950,24 +929,22 @@ } dasd_debug ((unsigned long) cqr); /* cqr */ dasd_chanq_enq (q, cqr); - if (!(atomic_read (&q->flags) & - DASD_CHANQ_ACTIVE)) { + if (!(atomic_read (&q->flags) & DASD_CHANQ_ACTIVE)) { cql_enq_head (q); } - if (!busy[di]) { - dasd_debug (0xc4d9e2e3); /* DRST */ - if (dasd_start_IO (cqr) != 0) { - atomic_inc (&chanq_tasks); - schedule_bh (dasd_do_chanq); - busy[di] = 1; + if (!busy) { + atomic_clear_mask (DASD_REQUEST_Q_BROKEN, + &q->flags); + if ( atomic_read (&q->dirty_requests) == 0 ) { + if (dasd_start_IO (cqr) == 0) { + } else { + dasd_schedule_bh (dasd_do_chanq); } } -#if 0 } -#endif } else { dasd_debug (0xc4d9c2d9); /* DRBR */ - broken[di] = 1; + atomic_set_mask (DASD_REQUEST_Q_BROKEN, &q->flags); prev = req; } cont: @@ -983,60 +960,88 @@ int ip; cqr_t *cqr; int done_fast_io = 0; + dasd_era_t era; + static int counter = 0; dasd_debug (0xc4c80000); /* DH */ - if (!stat) + if (!stat) { PRINT_ERR ("handler called without devstat"); + return; + } ip = stat->intparm; dasd_debug (ip); /* intparm */ - switch (ip) { /* filter special intparms... */ - case 0x00000000: /* no intparm: unsolicited interrupt */ + if (!ip) { /* no intparm: unsolicited interrupt */ dasd_debug (0xc4c8a489); /* DHui */ - PRINT_INFO ("Unsolicited interrupt on device %04X\n", + PRINT_INFO ("%04X caught unsolicited interrupt\n", stat->devno); - dasd_dump_sense (stat); return; - default: + } if (ip & 0x80000001) { dasd_debug (0xc4c8a489); /* DHui */ - PRINT_INFO ("Spurious interrupt %08x on device %04X\n", - ip, stat->devno); + PRINT_INFO ("%04X caught spurious interrupt with parm %08x\n", + stat->devno, ip); return; } cqr = (cqr_t *) ip; - if (cqr->magic != DASD_MAGIC) { - dasd_debug (0xc4c86ff1); /* DH?1 */ - PRINT_ERR ("handler:magic mismatch on %p %08x\n", - cqr, cqr->magic); - return; - } + if (cqr->magic == DASD_MAGIC || cqr->magic == ERP_MAGIC) { asm volatile ("STCK %0":"=m" (cqr->stopclk)); - if (stat->cstat == 0x00 && stat->dstat == 0x0c) { + if ((stat->cstat == 0x00 && + stat->dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) || + ((era = dasd_erp_examine (cqr, stat)) == dasd_era_none)) { dasd_debug (0xc4c89692); /* DHok */ - if (atomic_compare_and_swap (CQR_STATUS_IN_IO, - CQR_STATUS_DONE, - &cqr->status)) { - PRINT_WARN ("handler: cqrstat changed%d\n", - atomic_read (&cqr->status)); +#if 0 + if ( counter < 20 || cqr -> magic == ERP_MAGIC) { + counter ++; +#endif + ACS (cqr->status, CQR_STATUS_IN_IO, CQR_STATUS_DONE); +#if 0 + } else { + counter=0; + PRINT_WARN ("Faking I/O error\n"); + ACS (cqr->status, CQR_STATUS_IN_IO, CQR_STATUS_ERP_PEND); + atomic_inc (&dasd_info[cqr->devindex]-> + queue.dirty_requests); + } +#endif + if (atomic_read (&dasd_info[cqr->devindex]->status) == + DASD_INFO_STATUS_DETECTED) { + register_dasd_last (cqr->devindex); + if ( dasd_info[cqr->devindex]->wait_q ) { + wake_up( &dasd_info[cqr->devindex]-> + wait_q); + } } - if (cqr->next) { + if (cqr->next && + (atomic_read (&cqr->next->status) == + CQR_STATUS_QUEUED)) { dasd_debug (0xc4c8e2e3); /* DHST */ - if (dasd_start_IO (cqr->next) == 0) + if (dasd_start_IO (cqr->next) == 0) { done_fast_io = 1; + } else { } - break; } + } else { /* only visited in case of error ! */ dasd_debug (0xc4c8c5d9); /* DHER */ + dasd_dump_sense (stat); if (!cqr->dstat) cqr->dstat = kmalloc (sizeof (devstat_t), GFP_ATOMIC); if (cqr->dstat) { memcpy (cqr->dstat, stat, sizeof (devstat_t)); } else { - PRINT_ERR ("no memory for dtstat\n"); + PRINT_ERR ("no memory for dstat\n"); } + atomic_inc (&dasd_info[cqr->devindex]-> + queue.dirty_requests); /* errorprocessing */ - atomic_set (&cqr->status, CQR_STATUS_ERROR); + if (era == dasd_era_fatal) { + PRINT_WARN ("ERP returned fatal error\n"); + ACS (cqr->status, + CQR_STATUS_IN_IO, CQR_STATUS_FAILED); + } else { + ACS (cqr->status, + CQR_STATUS_IN_IO, CQR_STATUS_ERP_PEND); + } } if (done_fast_io == 0) atomic_clear_mask (DASD_CHANQ_BUSY, @@ -1048,20 +1053,86 @@ dasd_wakeup (); } else if (! (cqr->options & DOIO_WAIT_FOR_INTERRUPT) ){ dasd_debug (0xc4c8a293); /* DHsl */ - atomic_inc (&chanq_tasks); - schedule_bh (dasd_do_chanq); + dasd_schedule_bh (dasd_do_chanq); } else { dasd_debug (0x64686f6f); /* DH_g */ dasd_debug (cqr->flags); /* DH_g */ } + } else { + dasd_debug (0xc4c86ff1); /* DH?1 */ + PRINT_ERR ("handler:magic mismatch on %p %08x\n", + cqr, cqr->magic); + return; + } dasd_debug (0xc4c86d6d); /* DHwu */ } static int +dasd_format (int dev, format_data_t * fdata) +{ + int rc; + int devindex = DEVICE_NR (dev); + dasd_chanq_t *q; + cqr_t *cqr; + int irq; + long flags; + PRINT_INFO ("%04X called format on %x\n", + dasd_info[devindex]->info.devno, dev); + if (MINOR (dev) & (0xff >> (8 - PARTN_BITS))) { + PRINT_WARN ("Can't format partition! minor %x %x\n", + MINOR (dev), 0xff >> (8 - PARTN_BITS)); + return -EINVAL; + } + down (&dasd_info[devindex]->sem); + atomic_set (&dasd_info[devindex]->status, + DASD_INFO_STATUS_UNKNOWN); + if (dasd_info[devindex]->open_count == 1) { + rc = dasd_disciplines[dasd_info[devindex]->type]-> + dasd_format (devindex, fdata); + if (rc) { + PRINT_WARN ("Formatting failed rc=%d\n", rc); + up (&dasd_info[devindex]->sem); + return rc; + } + } else { + PRINT_WARN ("device is open! %d\n", dasd_info[devindex]->open_count); + up (&dasd_info[devindex]->sem); + return -EINVAL; + } +#if DASD_PARANOIA > 1 + if (!dasd_disciplines[dasd_info[devindex]->type]->fill_sizes_first) { + INTERNAL_CHECK ("No fill_sizes for dt=%d\n", dasd_info[devindex]->type); + } else +#endif /* DASD_PARANOIA */ + { + ACS (dasd_info[devindex]->status, + DASD_INFO_STATUS_UNKNOWN, DASD_INFO_STATUS_DETECTED); + irq = dasd_info[devindex]->info.irq; + PRINT_INFO ("%04X reacessing, irq %x, index %d\n", + get_devno_by_irq (irq), irq, devindex); + s390irq_spin_lock_irqsave (irq, flags); + q = &dasd_info[devindex]->queue; + cqr = dasd_disciplines[dasd_info[devindex]->type]-> + fill_sizes_first (devindex); + dasd_chanq_enq (q, cqr); + if (!(atomic_read (&q->flags) & DASD_CHANQ_ACTIVE)) { + cql_enq_head (q); + } + dasd_schedule_bh (dasd_do_chanq); + s390irq_spin_unlock_irqrestore (irq, flags); + } + up (&dasd_info[devindex]->sem); + return rc; +} + +static int register_dasd (int irq, dasd_type_t dt, dev_info_t * info) { int rc = 0; int di; + unsigned long flags; + dasd_chanq_t *q; + cqr_t *cqr; static spinlock_t register_lock = SPIN_LOCK_UNLOCKED; spin_lock (®ister_lock); FUNCTION_ENTRY ("register_dasd"); @@ -1084,10 +1155,23 @@ memcpy (&(dasd_info[di]->info), info, sizeof (dev_info_t)); spin_lock_init (&dasd_info[di]->queue.f_lock); spin_lock_init (&dasd_info[di]->queue.q_lock); - atomic_set (&dasd_info[di]->queue.flags, 0); dasd_info[di]->type = dt; dasd_info[di]->irq = irq; dasd_info[di]->sem = MUTEX; +#ifdef CONFIG_DASD_MDSK + if (dt == dasd_mdsk) { + dasd_info[di]->rdc_data = kmalloc ( + sizeof (dasd_characteristics_t), GFP_ATOMIC); + if (!dasd_info[di]->rdc_data) { + PRINT_WARN ("No memory for char on irq %d\n", irq); + goto unalloc; + } + dasd_info[di]->rdc_data->mdsk.dev_nr = dasd_info[di]-> + info.devno; + dasd_info[di]->rdc_data->mdsk.rdc_len = + sizeof (dasd_mdsk_characteristics_t); + } else +#endif /* CONFIG_DASD_MDSK */ rc = dasd_read_characteristics (dasd_info[di]); if (rc) { PRINT_WARN ("RDC returned error %d\n", rc); @@ -1106,30 +1190,52 @@ rc = -ENODEV; goto unalloc; } +#ifdef CONFIG_DASD_MDSK + if (dt == dasd_mdsk) { + + } else +#endif /* CONFIG_DASD_MDSK */ rc = request_irq (irq, dasd_handler, 0, "dasd", &(dasd_info[di]->dev_status)); + ACS (dasd_info[di]->status, + DASD_INFO_STATUS_UNKNOWN, DASD_INFO_STATUS_DETECTED); if (rc) { #if DASD_PARANOIA > 0 printk (KERN_WARNING PRINTK_HEADER "Cannot register irq %d, rc=%d\n", irq, rc); -#endif /* DASD_DEBUG */ +#endif /* DASD_PARANOIA */ rc = -ENODEV; goto unalloc; } #if DASD_PARANOIA > 1 - if (!dasd_disciplines[dt]->fill_sizes) { + if (!dasd_disciplines[dt]->fill_sizes_first) { INTERNAL_CHECK ("No fill_sizes for dt=%d\n", dt); goto unregister; } #endif /* DASD_PARANOIA */ - fill_sizes (di); + irq = dasd_info[di]->info.irq; + PRINT_INFO ("%04X trying to access, irq %x, index %d\n", + get_devno_by_irq (irq), irq, di); + s390irq_spin_lock_irqsave (irq, flags); + q = &dasd_info[di]->queue; + cqr = dasd_disciplines[dt]->fill_sizes_first (di); + dasd_chanq_enq (q, cqr); + if (!(atomic_read (&q->flags) & DASD_CHANQ_ACTIVE)) { + cql_enq_head (q); + } + if (dasd_start_IO (cqr) != 0) { + dasd_schedule_bh (dasd_do_chanq); + } + s390irq_spin_unlock_irqrestore (irq, flags); + goto exit; unregister: free_irq (irq, &(dasd_info[di]->dev_status)); unalloc: kfree (dasd_info[di]); + dasd_info[di] = NULL; exit: spin_unlock (®ister_lock); FUNCTION_EXIT ("register_dasd"); @@ -1143,68 +1249,57 @@ dev_info_t info; dasd_type_t dt; - FUNCTION_ENTRY ("probe_for_dasd"); - rc = get_dev_info_by_irq (irq, &info); + if (rc == -ENODEV) { /* end of device list */ return rc; + } else if ((info.status & DEVSTAT_DEVICE_OWNED)) { + return -EBUSY; + } else if ((info.status & DEVSTAT_NOT_OPER)) { + return -ENODEV; } #if DASD_PARANOIA > 2 - if (rc) { + else { INTERNAL_CHECK ("unknown rc %d of get_dev_info", rc); return rc; } #endif /* DASD_PARANOIA */ - if ((info.status & DEVSTAT_NOT_OPER)) { + + dt = check_type (&info); /* make a first guess */ + + if (dt == dasd_none) { return -ENODEV; } - dt = check_type (&info); - switch (dt) { -#ifdef CONFIG_DASD_ECKD - case dasd_eckd: -#endif /* CONFIG_DASD_ECKD */ - FUNCTION_CONTROL ("Probing devno %d...\n", info.devno); if (!dasd_is_accessible (info.devno)) { - FUNCTION_CONTROL ("out of range...skip%s\n", ""); return -ENODEV; } - if (dasd_disciplines[dt]->ck_devinfo) { - rc = dasd_disciplines[dt]->ck_devinfo (&info); - } -#if DASD_PARANOIA > 1 - else { + if (!dasd_disciplines[dt]->ck_devinfo) { INTERNAL_ERROR ("no ck_devinfo function%s\n", ""); return -ENODEV; } -#endif /* DASD_PARANOIA */ - if (rc == -ENODEV) { + rc = dasd_disciplines[dt]->ck_devinfo (&info); + if (rc) { return rc; } -#if DASD_PARANOIA > 2 - if (rc) { - INTERNAL_CHECK ("unknown error rc=%d\n", rc); + if (dasd_probeonly) { + PRINT_INFO ("%04X not enabled due to probeonly mode\n", + info.devno); + dasd_add_devno_to_ranges (info.devno); return -ENODEV; - } -#endif /* DASD_PARANOIA */ + } else { rc = register_dasd (irq, dt, &info); + } if (rc) { - PRINT_INFO ("devno %x not enabled as minor %d due to errors\n", - info.devno, - devindex_from_devno (info.devno) << - PARTN_BITS); + PRINT_WARN ("%04X not enabled due to errors\n", + info.devno); } else { - PRINT_INFO ("devno %x added as minor %d (%s)\n", + PRINT_INFO ("%04X is (dasd%c) minor %d (%s)\n", info.devno, + 'a' + devindex_from_devno (info.devno), devindex_from_devno (info.devno) << PARTN_BITS, dasd_name[dt]); } - case dasd_none: - break; - default: - PRINT_DEBUG ("unknown device type\n"); - break; - } - FUNCTION_EXIT ("probe_for_dasd"); + return rc; } @@ -1214,7 +1309,7 @@ int rc = 0; FUNCTION_ENTRY ("register_major"); - rc = register_blkdev (major, DASD_NAME, &dasd_file_operations); + rc = register_blkdev (major, DASD_NAME, &dasd_device_operations); #if DASD_PARANOIA > 1 if (rc) { PRINT_WARN ("registering major -> rc=%d aborting... \n", rc); @@ -1233,24 +1328,6 @@ modifier is to make sure, that they are only called via the kernel's methods */ -static ssize_t -dasd_read (struct file *filp, char *b, size_t s, loff_t * o) -{ - ssize_t rc; - FUNCTION_ENTRY ("dasd_read"); - rc = block_read (filp, b, s, o); - FUNCTION_EXIT ("dasd_read"); - return rc; -} -static ssize_t -dasd_write (struct file *filp, const char *b, size_t s, loff_t * o) -{ - ssize_t rc; - FUNCTION_ENTRY ("dasd_write"); - rc = block_write (filp, b, s, o); - FUNCTION_EXIT ("dasd_write"); - return rc; -} static int dasd_ioctl (struct inode *inp, struct file *filp, unsigned int no, unsigned long data) @@ -1298,19 +1375,6 @@ } static int -dasd_fsync (struct file *filp, struct dentry *d) -{ - int rc = 0; - FUNCTION_ENTRY ("dasd_fsync"); - if (!filp) { - return -EINVAL; - } - rc = block_fsync (filp, d); - FUNCTION_EXIT ("dasd_fsync"); - return rc; -} - -static int dasd_release (struct inode *inp, struct file *filp) { int rc = 0; @@ -1346,23 +1410,14 @@ } static struct -file_operations dasd_file_operations = +file_operations dasd_device_operations = { - NULL, /* loff_t(*llseek)(struct file *,loff_t,int); */ - dasd_read, - dasd_write, - NULL, /* int(*readdir)(struct file *,void *,filldir_t); */ - NULL, /* u int(*poll)(struct file *,struct poll_table_struct *); */ - dasd_ioctl, - NULL, /* int (*mmap) (struct file *, struct vm_area_struct *); */ - dasd_open, - NULL, /* int (*flush) (struct file *) */ - dasd_release, - dasd_fsync, - NULL, /* int (*fasync) (int, struct file *, int); - int (*check_media_change) (kdev_t dev); - int (*revalidate) (kdev_t dev); - int (*lock) (struct file *, int, struct file_lock *); */ + read:block_read, + write:block_write, + fsync:block_fsync, + ioctl:dasd_ioctl, + open:dasd_open, + release:dasd_release, }; int @@ -1371,20 +1426,29 @@ int rc = 0; int i; - FUNCTION_ENTRY ("dasd_init"); PRINT_INFO ("initializing...\n"); - atomic_set (&chanq_tasks, 0); atomic_set (&bh_scheduled, 0); spin_lock_init (&dasd_lock); +#ifdef CONFIG_DASD_MDSK + /* + * enable service-signal external interruptions, + * Control Register 0 bit 22 := 1 + * (besides PSW bit 7 must be set to 1 somewhere for external + * interruptions) + */ + ctl_set_bit (0, 9); + register_external_interrupt (0x2603, do_dasd_mdsk_interrupt); +#endif + dasd_debug_info = debug_register ("dasd", 1, 4); /* First register to the major number */ + rc = register_major (MAJOR_NR); #if DASD_PARANOIA > 1 if (rc) { PRINT_WARN ("registering major_nr returned rc=%d\n", rc); return rc; } -#endif /* DASD_PARANOIA */ - read_ahead[MAJOR_NR] = 8; +#endif /* DASD_PARANOIA */ read_ahead[MAJOR_NR] = 8; blk_size[MAJOR_NR] = dasd_blks; hardsect_size[MAJOR_NR] = dasd_secsize; blksize_size[MAJOR_NR] = dasd_blksize; @@ -1393,17 +1457,14 @@ dasd_proc_init (); #endif /* CONFIG_PROC_FS */ /* Now scan the device list for DASDs */ - FUNCTION_CONTROL ("entering detection loop%s\n", ""); for (i = 0; i < NR_IRQS; i++) { int irc; /* Internal return code */ - LOOP_CONTROL ("Probing irq %d...\n", i); irc = probe_for_dasd (i); switch (irc) { case 0: - LOOP_CONTROL ("Added DASD%s\n", ""); break; case -ENODEV: - LOOP_CONTROL ("No DASD%s\n", ""); + case -EBUSY: break; case -EMEDIUMTYPE: PRINT_WARN ("DASD not formatted%s\n", ""); @@ -1413,33 +1474,64 @@ break; } } - FUNCTION_CONTROL ("detection loop completed%s\n", ""); + FUNCTION_CONTROL ("detection loop completed %s partn check...\n", ""); /* Finally do the genhd stuff */ -#if 0 /* 2 b done */ dd_gendisk.next = gendisk_head; gendisk_head = &dd_gendisk; - for (i = 0; i < DASD_MAXDEVICES; i++) { - LOOP_CONTROL ("Setting partitions of DASD %d\n", i); - resetup_one_dev (&dd_gendisk, i); + dasd_information = dasd_info; /* to enable genhd to know about DASD */ + tod_wait (1000000); + + /* wait on root filesystem before detecting partitions */ + if (MAJOR (ROOT_DEV) == DASD_MAJOR) { + int count = 10; + i = DEVICE_NR (ROOT_DEV); + if (dasd_info[i] == NULL) { + panic ("root device not accessible\n"); + } + while ((atomic_read (&dasd_info[i]->status) != + DASD_INFO_STATUS_FORMATTED) && + count ) { + PRINT_INFO ("Waiting on root volume...%d seconds left\n", count); + tod_wait (1000000); + count--; + } + if (count == 0) { + panic ("Waiting on root volume...giving up!\n"); + } + } + for (i = 0; i < DASD_MAX_DEVICES; i++) { + if (dasd_info[i]) { + if (atomic_read (&dasd_info[i]->status) == + DASD_INFO_STATUS_FORMATTED) { + dasd_partn_detect (i); + } else { /* start kernel thread for devices not ready now */ + kernel_thread (dasd_partn_detect, (void *) i, + CLONE_FS | CLONE_FILES | CLONE_SIGHAND); + } + } } -#endif /* 0 */ - FUNCTION_EXIT ("dasd_init"); return rc; } #ifdef MODULE + int init_module (void) { int rc = 0; - FUNCTION_ENTRY ("init_module"); - PRINT_INFO ("trying to load module\n"); + PRINT_INFO ("Initializing module\n"); + rc = dasd_parse_module_params (); + if (rc == 0) { + PRINT_INFO ("module parameters parsed successfully\n"); + } else { + PRINT_WARN ("parsing parameters returned rc=%d\n", rc); + } rc = dasd_init (); if (rc == 0) { - PRINT_INFO ("module loaded successfully\n"); + PRINT_INFO ("module initialized successfully\n"); } else { - PRINT_WARN ("warning: Module load returned rc=%d\n", rc); + PRINT_WARN ("initializing module returned rc=%d\n", rc); } FUNCTION_EXIT ("init_module"); return rc; @@ -1449,19 +1541,32 @@ cleanup_module (void) { int rc = 0; + struct gendisk *genhd = gendisk_head, *prev = NULL; - FUNCTION_ENTRY ("cleanup_module"); PRINT_INFO ("trying to unload module \n"); - /* FIXME: replace by proper unload functionality */ - INTERNAL_ERROR ("Modules not yet implemented %s", ""); + /* unregister gendisk stuff */ + for (genhd = gendisk_head; genhd; prev = genhd, genhd = genhd->next) { + if (genhd == dd_gendisk) { + if (prev) + prev->next = genhd->next; + else { + gendisk_head = genhd->next; + } + break; + } + } + /* unregister devices */ + for (i = 0; i = DASD_MAX_DEVICES; i++) { + if (dasd_info[i]) + dasd_unregister_dasd (i); + } if (rc == 0) { PRINT_INFO ("module unloaded successfully\n"); } else { PRINT_WARN ("module unloaded with errors\n"); } - FUNCTION_EXIT ("cleanup_module"); } #endif /* MODULE */ diff -urN v2.2.15/linux/drivers/s390/block/dasd.h linux/drivers/s390/block/dasd.h --- v2.2.15/linux/drivers/s390/block/dasd.h Tue Jan 4 10:12:18 2000 +++ linux/drivers/s390/block/dasd.h Wed Dec 31 16:00:00 1969 @@ -1,226 +0,0 @@ - -#ifndef DASD_H -#define DASD_H - -/* First of all the external stuff */ -#include -#include - -#define IOCTL_LETTER 'D' -#define BIODASDFORMAT _IO(IOCTL_LETTER,0) /* Format the volume or an extent */ -#define BIODASDDISABLE _IO(IOCTL_LETTER,1) /* Disable the volume (for Linux) */ -#define BIODASDENABLE _IO(IOCTL_LETTER,2) /* Enable the volume (for Linux) */ -/* Stuff for reading and writing the Label-Area to/from user space */ -#define BIODASDGTVLBL _IOR(IOCTL_LETTER,3,dasd_volume_label_t) -#define BIODASDSTVLBL _IOW(IOCTL_LETTER,4,dasd_volume_label_t) -#define BIODASDRWTB _IOWR(IOCTL_LETTER,5,int) -#define BIODASDRSID _IOR(IOCTL_LETTER,6,senseid_t) - -typedef -union { - char bytes[512]; - struct { - /* 80 Bytes of Label data */ - char identifier[4]; /* e.g. "LNX1", "VOL1" or "CMS1" */ - char label[6]; /* Given by user */ - char security; - char vtoc[5]; /* Null in "LNX1"-labelled partitions */ - char reserved0[5]; - long ci_size; - long blk_per_ci; - long lab_per_ci; - char reserved1[4]; - char owner[0xe]; - char no_part; - char reserved2[0x1c]; - /* 16 Byte of some information on the dasd */ - short blocksize; - char nopart; - char unused; - long unused2[3]; - /* 7*10 = 70 Bytes of partition data */ - struct { - char type; - long start; - long size; - char unused; - } part[7]; - } __attribute__ ((packed)) label; -} dasd_volume_label_t; - -typedef union { - struct { - unsigned long no; - unsigned int ct; - } __attribute__ ((packed)) input; - struct { - unsigned long noct; - } __attribute__ ((packed)) output; -} __attribute__ ((packed)) dasd_xlate_t; - -void dasd_setup (char *, int *); -int dasd_init (void); -#ifdef MODULE -int init_module (void); -void cleanup_module (void); -#endif /* MODULE */ - -/* Definitions for blk.h */ -/* #define DASD_MAGIC 0x44415344 is ascii-"DASD" */ -/* #define dasd_MAGIC 0x64617364; is ascii-"DASD" */ -#define DASD_MAGIC 0xC4C1E2C4 /* is ebcdic-"DASD" */ -#define dasd_MAGIC 0x8481A284 /* is ebcdic-"DASD" */ -#define DASD_NAME "dasd" -#define DASD_PARTN_BITS 2 -#define DASD_MAX_DEVICES (256>>DASD_PARTN_BITS) - -#define MAJOR_NR DASD_MAJOR -#define PARTN_BITS DASD_PARTN_BITS - -#ifdef __KERNEL__ -/* Now lets turn to the internal sbtuff */ - -/* - define the debug levels: - - 0 No debugging output to console or syslog - - 1 Log internal errors to syslog, ignore check conditions - - 2 Log internal errors and check conditions to syslog - - 3 Log internal errors to console, log check conditions to syslog - - 4 Log internal errors and check conditions to console - - 5 panic on internal errors, log check conditions to console - - 6 panic on both, internal errors and check conditions - */ -#define DASD_DEBUG 4 - -#define DASD_PROFILE -/* - define the level of paranoia - - 0 quite sure, that things are going right - - 1 sanity checking, only to avoid panics - - 2 normal sanity checking - - 3 extensive sanity checks - - 4 exhaustive debug messages - */ -#define DASD_PARANOIA 2 - -/* - define the depth of flow control, which is logged as a check condition - - 0 No flow control messages - - 1 Entry of functions logged like check condition - - 2 Entry and exit of functions logged like check conditions - - 3 Internal structure broken down - - 4 unrolling of loops,... - */ -#define DASD_FLOW_CONTROL 0 - -#if DASD_DEBUG > 0 -#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) -#define PRINT_INFO(x...) printk ( KERN_INFO PRINTK_HEADER x ) -#define PRINT_WARN(x...) printk ( KERN_WARNING PRINTK_HEADER x ) -#define PRINT_ERR(x...) printk ( KERN_ERR PRINTK_HEADER x ) -#define PRINT_FATAL(x...) panic ( PRINTK_HEADER x ) -#else -#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) -#define PRINT_INFO(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) -#define PRINT_WARN(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) -#define PRINT_ERR(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) -#define PRINT_FATAL(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) -#endif /* DASD_DEBUG */ - -#define INTERNAL_ERRMSG(x,y...) \ -"Internal error: in file " __FILE__ " line: %d: " x, __LINE__, y -#define INTERNAL_CHKMSG(x,y...) \ -"Inconsistency: in file " __FILE__ " line: %d: " x, __LINE__, y -#define INTERNAL_FLWMSG(x,y...) \ -"Flow control: file " __FILE__ " line: %d: " x, __LINE__, y - -#if DASD_DEBUG > 4 -#define INTERNAL_ERROR(x...) PRINT_FATAL ( INTERNAL_ERRMSG ( x ) ) -#elif DASD_DEBUG > 2 -#define INTERNAL_ERROR(x...) PRINT_ERR ( INTERNAL_ERRMSG ( x ) ) -#elif DASD_DEBUG > 0 -#define INTERNAL_ERROR(x...) PRINT_WARN ( INTERNAL_ERRMSG ( x ) ) -#else -#define INTERNAL_ERROR(x...) -#endif /* DASD_DEBUG */ - -#if DASD_DEBUG > 5 -#define INTERNAL_CHECK(x...) PRINT_FATAL ( INTERNAL_CHKMSG ( x ) ) -#elif DASD_DEBUG > 3 -#define INTERNAL_CHECK(x...) PRINT_ERR ( INTERNAL_CHKMSG ( x ) ) -#elif DASD_DEBUG > 1 -#define INTERNAL_CHECK(x...) PRINT_WARN ( INTERNAL_CHKMSG ( x ) ) -#else -#define INTERNAL_CHECK(x...) -#endif /* DASD_DEBUG */ - -#if DASD_DEBUG > 3 -#define INTERNAL_FLOW(x...) PRINT_ERR ( INTERNAL_FLWMSG ( x ) ) -#elif DASD_DEBUG > 2 -#define INTERNAL_FLOW(x...) PRINT_WARN ( INTERNAL_FLWMSG ( x ) ) -#else -#define INTERNAL_FLOW(x...) -#endif /* DASD_DEBUG */ - -#if DASD_FLOW_CONTROL > 0 -#define FUNCTION_ENTRY(x) INTERNAL_FLOW( x "entered %s\n","" ); -#else -#define FUNCTION_ENTRY(x) -#endif /* DASD_FLOW_CONTROL */ - -#if DASD_FLOW_CONTROL > 1 -#define FUNCTION_EXIT(x) INTERNAL_FLOW( x "exited %s\n","" ); -#else -#define FUNCTION_EXIT(x) -#endif /* DASD_FLOW_CONTROL */ - -#if DASD_FLOW_CONTROL > 2 -#define FUNCTION_CONTROL(x...) INTERNAL_FLOW( x ); -#else -#define FUNCTION_CONTROL(x...) -#endif /* DASD_FLOW_CONTROL */ - -#if DASD_FLOW_CONTROL > 3 -#define LOOP_CONTROL(x...) INTERNAL_FLOW( x ); -#else -#define LOOP_CONTROL(x...) -#endif /* DASD_FLOW_CONTROL */ - -#define DASD_DO_IO_SLEEP 0x01 -#define DASD_DO_IO_NOLOCK 0x02 -#define DASD_DO_IO_NODEC 0x04 - -#define DASD_NOT_FORMATTED 0x01 - -extern struct wait_queue *dasd_waitq; - -#undef DEBUG_DASD_MALLOC -#ifdef DEBUG_DASD_MALLOC -void *b; -#define kmalloc(x...) (PRINT_INFO(" kmalloc %p\n",b=kmalloc(x)),b) -#define kfree(x) PRINT_INFO(" kfree %p\n",x);kfree(x) -#define get_free_page(x...) (PRINT_INFO(" gfp %p\n",b=get_free_page(x)),b) -#define __get_free_pages(x...) (PRINT_INFO(" gfps %p\n",b=__get_free_pages(x)),b) -#endif /* DEBUG_DASD_MALLOC */ - -#endif /* __KERNEL__ */ -#endif /* DASD_H */ - -/* - * 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: - */ diff -urN v2.2.15/linux/drivers/s390/block/dasd_3990_erp.c linux/drivers/s390/block/dasd_3990_erp.c --- v2.2.15/linux/drivers/s390/block/dasd_3990_erp.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_3990_erp.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,140 @@ +/* + * File...........: linux/drivers/s390/block/dasd_3990_erp.c + * Author(s)......: Holger Smolinski + * Horst Hummel + * Bugreports.to..: + * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 + */ + +#include +#include "dasd_erp.h" + +#define PRINTK_HEADER "dasd_erp(3990)" + +/* + * DASD_3990_ERP_EXAMINE_32 + * + * DESCRIPTION + * Checks only for fatal/no/recoverable error. + * A detailed examination of the sense data is done later outside + * the interrupt handler. + * + * RETURN VALUES + * dasd_era_none no error + * dasd_era_fatal for all fatal (unrecoverable errors) + * dasd_era_recover for recoverable others. + */ +dasd_era_t +dasd_3990_erp_examine_32 (char *sense) +{ + + switch (sense[25]) { + case 0x00: + return dasd_era_none; + case 0x01: + return dasd_era_fatal; + default: + return dasd_era_recover; + } + +} /* end dasd_3990_erp_examine_32 */ + +/* + * DASD_3990_ERP_EXAMINE_24 + * + * DESCRIPTION + * Checks only for fatal (unrecoverable) error. + * A detailed examination of the sense data is done later outside + * the interrupt handler. + * + * Each bit configuration leading to an action code 2 (Exit with + * programming error or unusual condition indication) + * and 10 (disabled interface) are handled as fatal error´s. + * + * All other configurations are handled as recoverable errors. + * + * RETURN VALUES + * dasd_era_fatal for all fatal (unrecoverable errors) + * dasd_era_recover for all others. + */ +dasd_era_t +dasd_3990_erp_examine_24 (char *sense) +{ + + /* check for 'Command Recejct' which is always a fatal error */ + if (sense[0] & 0x80) { + return dasd_era_fatal; + } + /* check for 'Invalid Track Format' */ + if (sense[1] & 0x40) { + return dasd_era_fatal; + } + /* check for 'No Record Found' */ + if (sense[1] & 0x08) { + return dasd_era_fatal; + } + /* return recoverable for all others */ + return dasd_era_recover; + +} /* END dasd_3990_erp_examine_24 */ + +/* + * DASD_3990_ERP_EXAMINE + * + * DESCRIPTION + * Checks only for fatal/no/recover error. + * A detailed examination of the sense data is done later outside + * the interrupt handler. + * + * The logic is based on the 'IBM 3990 Storage Control Reference' manual + * 'Chapter 7. Error Recovery Procedures'. + * + * RETURN VALUES + * dasd_era_none no error + * dasd_era_fatal for all fatal (unrecoverable errors) + * dasd_era_recover for all others. + */ +dasd_era_t +dasd_3990_erp_examine (cqr_t * cqr, devstat_t * stat) +{ + + char *sense = stat->ii.sense.data; + + /* check for successful execution first */ + if (stat->cstat == 0x00 && + stat->dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) + return dasd_era_none; + + /* distinguish between 24 and 32 byte sense data */ + if (sense[27] & 0x80) { + + /* examine the 32 byte sense data */ + return dasd_3990_erp_examine_32 (sense); + + } else { + + /* examine the 24 byte sense data */ + return dasd_3990_erp_examine_24 (sense); + + } /* end distinguish between 24 and 32 byte sense data */ + +} /* END dasd_3990_erp_examine */ + +/* + * 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: + */ diff -urN v2.2.15/linux/drivers/s390/block/dasd_9343_erp.c linux/drivers/s390/block/dasd_9343_erp.c --- v2.2.15/linux/drivers/s390/block/dasd_9343_erp.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_9343_erp.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,20 @@ +/* + * File...........: linux/drivers/s390/block/dasd_9345_erp.h + * Author(s)......: Holger Smolinski + * Bugreports.to..: + * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 + */ + +#include +#include "dasd_erp.h" + +#define PRINTK_HEADER "dasd_erp(9343)" + +dasd_era_t +dasd_9343_erp_examine (cqr_t * cqr, devstat_t * stat) +{ + if (stat->cstat == 0x00 && + stat->dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) + return dasd_era_none; + return dasd_era_recover; +} diff -urN v2.2.15/linux/drivers/s390/block/dasd_ccwstuff.c linux/drivers/s390/block/dasd_ccwstuff.c --- v2.2.15/linux/drivers/s390/block/dasd_ccwstuff.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/block/dasd_ccwstuff.c Wed Jun 7 14:26:43 2000 @@ -9,9 +9,9 @@ #include #include #include +#include #include -#include "dasd.h" #include "dasd_types.h" #define PRINTK_HEADER "dasd_ccw:" @@ -148,7 +148,6 @@ } #endif /* DASD_PARANOIA */ exit: - FUNCTION_EXIT ("request_cpa"); return freeblk; } @@ -263,6 +262,69 @@ return; } +/* ---------------------------------------------------------- */ + +static erp_t *erpp = NULL; +#ifdef __SMP__ +static spinlock_t erp_lock = SPIN_LOCK_UNLOCKED; +#endif /* __SMP__ */ + +void +erf_enq (erp_t * cqf) +{ + *(erp_t **) cqf = erpp; + erpp = cqf; +} + +erp_t * +erf_deq (void) +{ + erp_t *erp = erpp; + erpp = *(erp_t **) erpp; + return erp; +} + +erp_t * +request_er (void) +{ + erp_t *erp = NULL; + int i; + erp_t *area; + + spin_lock (&erp_lock); + while (erpp == NULL) { + do { + area = (erp_t *) get_free_page (GFP_ATOMIC); + if (area == NULL) { + printk (KERN_WARNING PRINTK_HEADER + "No memory for chanq area\n"); + } + } while (!area); + memset (area, 0, PAGE_SIZE); + if (dasd_page_count + 1 >= MAX_DASD_PAGES) { + PRINT_WARN ("Requesting too many pages..."); + } else { + dasd_page[dasd_page_count++] = + (long) area; + } + for (i = 0; i < 4096 / sizeof (erp_t); i++) { + erf_enq (area + i); + } + } + erp = erf_deq (); + spin_unlock (&erp_lock); + return erp; +} + +void +release_er (erp_t * erp) +{ + spin_lock (&erp_lock); + erf_enq (erp); + spin_unlock (&erp_lock); + return; +} + /* ----------------------------------------------------------- */ cqr_t * request_cqr (int cpsize, int datasize) @@ -296,8 +358,6 @@ memset (cqr->data,0,datasize); } goto exit; - nodata: - release_cp (cqr->cplength, cqr->cpaddr); nocp: release_cq (cqr); cqr = NULL; @@ -327,6 +387,59 @@ return rc; } +/* ----------------------------------------------------------- */ +erp_t * +allloc_erp (erp_t * erp, int cpsize, int datasize) +{ + if (cpsize) { + erp->cqr.cpaddr = request_cp (cpsize); + if (erp->cqr.cpaddr == NULL) { + printk (KERN_WARNING PRINTK_HEADER __FILE__ + "No memory for channel program\n"); + goto nocp; + } + erp->cqr.cplength = cpsize; + } + if (datasize) { + do { + erp->cqr.data = (char *) kmalloc (datasize, GFP_ATOMIC); + if (erp->cqr.data == NULL) { + printk (KERN_WARNING PRINTK_HEADER __FILE__ + "No memory for ERP data area\n"); + } + } while (!erp->cqr.data); + memset (erp->cqr.data, 0, datasize); + } + goto exit; + nocp: + release_er (erp); + erp = NULL; + exit: + return erp; +} + +int +release_erp (erp_t * erp) +{ + int rc = 0; + if (erp == NULL) { + rc = -ENOENT; + return rc; + } + if (erp->cqr.data) { + kfree (erp->cqr.data); + } + if (erp->cqr.dstat) { + kfree (erp->cqr.dstat); + } + if (erp->cqr.cpaddr) { + release_cp (erp->cqr.cplength, erp->cqr.cpaddr); + } + erp->cqr.magic = dasd_MAGIC; + release_er (erp); + return rc; +} + /* -------------------------------------------------------------- */ void dasd_chanq_enq (dasd_chanq_t * q, cqr_t * cqr) @@ -338,13 +451,18 @@ cqr->next = NULL; q->tail = cqr; q->queued_requests ++; - if (atomic_compare_and_swap(CQR_STATUS_FILLED, - CQR_STATUS_QUEUED, - &cqr->status)) { - PRINT_WARN ("q_cqr: %p status changed %d\n", - cqr,atomic_read(&cqr->status)); - atomic_set(&cqr->status,CQR_STATUS_QUEUED); + ACS (cqr->status, CQR_STATUS_FILLED, CQR_STATUS_QUEUED); } + +void +dasd_chanq_enq_head (dasd_chanq_t * q, cqr_t * cqr) +{ + cqr->next = q->head; + q->head = cqr; + if (q->tail == NULL) + q->tail = cqr; + q->queued_requests++; + ACS (cqr->status, CQR_STATUS_FILLED, CQR_STATUS_QUEUED); } int @@ -370,6 +488,9 @@ } cqr->next = NULL; q->queued_requests --; + if (cqr->magic == ERP_MAGIC) + return release_erp ((erp_t *) cqr); + else return release_cqr(cqr); } @@ -408,8 +529,7 @@ spin_lock(&cq_lock); if (! (atomic_read(&q->flags) & DASD_CHANQ_ACTIVE)) { PRINT_WARN("Queue not active\n"); - } - else if (cq_head == q) { + } else if (cq_head == q) { cq_head = q->next_q; } else { c = cq_head; diff -urN v2.2.15/linux/drivers/s390/block/dasd_ccwstuff.h linux/drivers/s390/block/dasd_ccwstuff.h --- v2.2.15/linux/drivers/s390/block/dasd_ccwstuff.h Tue Jan 4 10:12:18 2000 +++ linux/drivers/s390/block/dasd_ccwstuff.h Wed Jun 7 14:26:43 2000 @@ -3,6 +3,8 @@ cqr_t *request_cqr (int, int); int release_cqr (cqr_t *); +erp_t *request_er (void); +int release_er (erp_t *); int dasd_chanq_enq (dasd_chanq_t *, cqr_t *); int dasd_chanq_deq (dasd_chanq_t *, cqr_t *); void cql_enq_head (dasd_chanq_t * q); diff -urN v2.2.15/linux/drivers/s390/block/dasd_eckd.c linux/drivers/s390/block/dasd_eckd.c --- v2.2.15/linux/drivers/s390/block/dasd_eckd.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/block/dasd_eckd.c Wed Jun 7 14:26:43 2000 @@ -8,11 +8,10 @@ #include #include -#ifdef MODULE -#include -#endif /* MODULE */ - #include +#include +#include /* HDIO_GETGEO */ + #include #include @@ -20,8 +19,6 @@ #include "dasd_types.h" #include "dasd_ccwstuff.h" -#include "dasd.h" - #ifdef PRINTK_HEADER #undef PRINTK_HEADER #endif /* PRINTK_HEADER */ @@ -270,16 +267,7 @@ eckd_home_t; -/* eckd count area */ -typedef struct { - __u16 cyl; - __u16 head; - __u8 record; - __u8 kl; - __u16 dl; -} __attribute__ ((packed)) - -eckd_count_t; +dasd_era_t dasd_eckd_erp_examine (cqr_t *, devstat_t *); static unsigned int round_up_multiple (unsigned int no, unsigned int mult) @@ -401,7 +389,7 @@ memset (de_ccw, 0, sizeof (ccw1_t)); de_ccw->cmd_code = CCW_DEFINE_EXTENT; de_ccw->count = 16; - de_ccw->cda = (void *) virt_to_phys (data); + de_ccw->cda = (void *) __pa (data); memset (data, 0, sizeof (DE_eckd_data_t)); switch (cmd) { @@ -417,6 +405,7 @@ break; case DASD_ECKD_CCW_WRITE: case DASD_ECKD_CCW_WRITE_MT: + data->mask.perm = 0x02; data->attributes.operation = 0x3; /* enable seq. caching */ break; case DASD_ECKD_CCW_WRITE_CKD: @@ -458,7 +447,7 @@ memset (lo_ccw, 0, sizeof (ccw1_t)); lo_ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD; lo_ccw->count = 16; - lo_ccw->cda = (void *) virt_to_phys (data); + lo_ccw->cda = (void *) __pa (data); memset (data, 0, sizeof (LO_eckd_data_t)); switch (cmd) { @@ -471,7 +460,7 @@ data->operation.operation = 0x16; break; case DASD_ECKD_CCW_WRITE_RECORD_ZERO: - data->operation.orientation = 0x3; + data->operation.orientation = 0x1; data->operation.operation = 0x03; data->count++; break; @@ -623,10 +612,10 @@ r0_data->record = 0; r0_data->kl = 0; r0_data->dl = 8; - last_ccw->cmd_code = 0x03; + last_ccw->cmd_code = DASD_ECKD_CCW_WRITE_RECORD_ZERO; last_ccw->count = 8; last_ccw->flags = CCW_FLAG_CC | CCW_FLAG_SLI; - last_ccw->cda = (void *) virt_to_phys (r0_data); + last_ccw->cda = (void *) __pa (r0_data); last_ccw++; } /* write remaining records */ @@ -640,14 +629,14 @@ last_ccw->cmd_code = DASD_ECKD_CCW_WRITE_CKD; last_ccw->flags = CCW_FLAG_CC | CCW_FLAG_SLI; last_ccw->count = 8; - last_ccw->cda = (void *) - virt_to_phys (ct_data + i); + last_ccw->cda = (void *) __pa (ct_data + i); } (last_ccw - 1)->flags &= ~(CCW_FLAG_CC | CCW_FLAG_DC); fcp -> devindex = di; fcp -> flags = DASD_DO_IO_SLEEP; do { - struct wait_queue wait = {current, NULL}; + struct wait_queue wait = + {current, NULL}; unsigned long flags; int irq; int cs; @@ -698,15 +687,11 @@ int blk_per_trk = recs_per_track (&(info->rdc_data->eckd), 0, info->sizes.bp_block); int byt_per_blk = info->sizes.bp_block; - int noblk = req-> nr_sectors >> info->sizes.s2b_shift; int btrk = (req->sector >> info->sizes.s2b_shift) / blk_per_trk; int etrk = ((req->sector + req->nr_sectors - 1) >> info->sizes.s2b_shift) / blk_per_trk; - - if ( ! noblk ) { - PRINT_ERR("No blocks to write...returning\n"); - return NULL; - } + int bhct; + long size; if (req->cmd == READ) { rw_cmd = DASD_ECKD_CCW_READ_MT; @@ -724,7 +709,21 @@ } #endif /* DASD_PARANOIA */ /* Build the request */ - rw_cp = request_cqr (2 + noblk, +#if 0 + PRINT_INFO ("req %d %d %d %d\n", devindex, req->cmd, req->sector, req->nr_sectors); +#endif + /* count bhs to prevent errors, when bh smaller than block */ + bhct = 0; + + for (bh = req->bh; bh; bh = bh->b_reqnext) { + if (bh->b_size > byt_per_blk) + for (size = 0; size < bh->b_size; size += byt_per_blk) + bhct++; + else + bhct++; + } + + rw_cp = request_cqr (2 + bhct, sizeof (DE_eckd_data_t) + sizeof (LO_eckd_data_t)); if ( ! rw_cp ) { @@ -743,58 +742,38 @@ req->nr_sectors >> info->sizes.s2b_shift, rw_cmd, info); ccw->flags = CCW_FLAG_CC; - for (bh = req->bh; bh; bh = bh->b_reqnext) { - long size; + for (bh = req->bh; bh != NULL;) { + if (bh->b_size > byt_per_blk) { for (size = 0; size < bh->b_size; size += byt_per_blk) { ccw++; ccw->flags = CCW_FLAG_CC; ccw->cmd_code = rw_cmd; ccw->count = byt_per_blk; - ccw->cda = (void *) virt_to_phys (bh->b_data + size); + ccw->cda = (void *) __pa (bh->b_data + size); + } + bh = bh->b_reqnext; + } else { /* group N bhs to fit into byt_per_blk */ + for (size = 0; bh != NULL && size < byt_per_blk;) { + ccw++; + ccw->flags = CCW_FLAG_DC; + ccw->cmd_code = rw_cmd; + ccw->count = bh->b_size; + ccw->cda = (void *) __pa (bh->b_data); + size += bh->b_size; + bh = bh->b_reqnext; + } + if (size != byt_per_blk) { + PRINT_WARN ("Cannot fulfill small request %d vs. %d (%d sects)\n", size, byt_per_blk, req->nr_sectors); + release_cqr (rw_cp); + return NULL; + } + ccw->flags = CCW_FLAG_CC; } } ccw->flags &= ~(CCW_FLAG_DC | CCW_FLAG_CC); return rw_cp; } -cqr_t * -dasd_eckd_rw_label (int devindex, int rw, char *buffer) -{ - int cmd_code = 0x03; - dasd_information_t *info = dasd_info[devindex]; - cqr_t *cqr; - ccw1_t *ccw; - - switch (rw) { - case READ: - cmd_code = DASD_ECKD_CCW_READ; - break; - case WRITE: - cmd_code = DASD_ECKD_CCW_WRITE; - break; -#if DASD_PARANOIA > 2 - default: - INTERNAL_ERROR ("unknown cmd %d", rw); - return NULL; -#endif /* DASD_PARANOIA */ - } - cqr = request_cqr (3, sizeof (DE_eckd_data_t) + - sizeof (LO_eckd_data_t)); - ccw = cqr->cpaddr; - define_extent (ccw, cqr->data, 0, 0, cmd_code, info); - ccw->flags |= CCW_FLAG_CC; - ccw++; - locate_record (ccw, cqr->data + 1, 0, 2, 1, cmd_code, info); - ccw->flags |= CCW_FLAG_CC; - ccw++; - ccw->cmd_code = cmd_code; - ccw->flags |= CCW_FLAG_SLI; - ccw->count = sizeof (dasd_volume_label_t); - ccw->cda = (void *) virt_to_phys ((void *) buffer); - return cqr; - -} - void dasd_eckd_print_char (dasd_characteristics_t * i) { @@ -886,27 +865,23 @@ return rc; } -int -dasd_eckd_read_count (int di) +cqr_t * +dasd_eckd_fill_sizes_first (int di) { - int rc; cqr_t *rw_cp = NULL; ccw1_t *ccw; DE_eckd_data_t *DE_data; LO_eckd_data_t *LO_data; - eckd_count_t *count_data; - int retries = 5; - unsigned long flags; - int irq; - int cs; dasd_information_t *info = dasd_info[di]; + eckd_count_t *count_data = &(info->private.eckd.count_data); + + dasd_info[di]->sizes.label_block = 2; + rw_cp = request_cqr (3, sizeof (DE_eckd_data_t) + - sizeof (LO_eckd_data_t) + - sizeof (eckd_count_t)); + sizeof (LO_eckd_data_t)); DE_data = rw_cp->data; LO_data = rw_cp->data + sizeof (DE_eckd_data_t); - count_data = (eckd_count_t*)((long)LO_data + sizeof (LO_eckd_data_t)); ccw = rw_cp->cpaddr; define_extent (ccw, DE_data, 0, 0, DASD_ECKD_CCW_READ_COUNT, info); ccw->flags = CCW_FLAG_CC; @@ -916,43 +891,18 @@ ccw++; ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT; ccw->count = 8; - ccw->cda = (void *) virt_to_phys (count_data); + ccw->cda = (void *) __pa (count_data); rw_cp->devindex = di; - rw_cp -> options = DOIO_WAIT_FOR_INTERRUPT; - do { - irq = dasd_info[di]->info.irq; - s390irq_spin_lock_irqsave (irq, flags); - atomic_set(&rw_cp -> status, CQR_STATUS_QUEUED); - rc = dasd_start_IO ( rw_cp ); - s390irq_spin_unlock_irqrestore (irq, flags); - retries --; - cs = atomic_read(&rw_cp->status); - if ( cs != CQR_STATUS_DONE && retries == 5 ) { - dasd_eckd_print_error(rw_cp->dstat); - } - } while ( ( ( cs != CQR_STATUS_DONE) || rc ) && retries ); - if ( ( rc || cs != CQR_STATUS_DONE) ) { - if ( ( cs == CQR_STATUS_ERROR ) && - ( rw_cp -> dstat -> ii.sense.data[1] == 0x08 ) ) { - rc = -EMEDIUMTYPE; - } else { - dasd_eckd_print_error (rw_cp->dstat); - rc = -EIO; - } - } else { - rc = count_data->dl; - } - release_cqr (rw_cp); - return rc; + atomic_set (&rw_cp->status, CQR_STATUS_FILLED); + return rw_cp; } int -dasd_eckd_fill_sizes (int devindex) +dasd_eckd_fill_sizes_last (int devindex) { - int bs = 0; - int sb; + int sb,rpt; dasd_information_t *in = dasd_info[devindex]; - bs = dasd_eckd_read_count (devindex); + int bs = in->private.eckd.count_data.dl; if (bs <= 0) { PRINT_INFO("Cannot figure out blocksize. did you format the disk?\n"); memset (&(in -> sizes), 0, sizeof(dasd_sizes_t )); @@ -962,10 +912,10 @@ } in->sizes.bp_sector = in->sizes.bp_block; - in->sizes.b2k_shift = 0; /* bits to shift a block to get 1k */ - for (sb = 1024; sb < bs; sb = sb << 1) - in->sizes.b2k_shift++; - + if (bs & 511) { + PRINT_INFO ("Probably no Linux formatted device!\n"); + return -EMEDIUMTYPE; + } in->sizes.s2b_shift = 0; /* bits to shift 512 to get a block */ for (sb = 512; sb < bs; sb = sb << 1) in->sizes.s2b_shift++; @@ -973,26 +923,42 @@ in->sizes.blocks = in->rdc_data->eckd.no_cyl * in->rdc_data->eckd.trk_per_cyl * recs_per_track (&(in->rdc_data->eckd), 0, bs); - in->sizes.kbytes = in->sizes.blocks << in->sizes.b2k_shift; + + in->sizes.kbytes = ( in->sizes.blocks << in->sizes.s2b_shift) >> 1; + + rpt = recs_per_track (&(in->rdc_data->eckd), 0, in->sizes.bp_block), PRINT_INFO ("Verified: %d B/trk %d B/Blk(%d B) %d Blks/trk %d kB/trk \n", bytes_per_track (&(in->rdc_data->eckd)), - bytes_per_record (&(in->rdc_data->eckd), 0, in->sizes.bp_block), + bytes_per_record (&(in->rdc_data->eckd), 0, + in->sizes.bp_block), in->sizes.bp_block, - recs_per_track (&(in->rdc_data->eckd), 0, in->sizes.bp_block), - (recs_per_track (&(in->rdc_data->eckd), 0, in->sizes.bp_block) << - in->sizes.b2k_shift )); + rpt, + (rpt << in->sizes.s2b_shift) >> 1); return 0; } +void +dasd_eckd_fill_geometry (int di, struct hd_geometry *geo) +{ + dasd_information_t *info = dasd_info[di]; + geo->cylinders = info->rdc_data->eckd.no_cyl; + geo->heads = info->rdc_data->eckd.trk_per_cyl; + geo->sectors = recs_per_track (&(info->rdc_data->eckd), + 0, info->sizes.bp_block); + geo->start = info->sizes.label_block + 1; +} + dasd_operations_t dasd_eckd_operations = { - dasd_eckd_ck_devinfo, - dasd_eckd_build_req, - dasd_eckd_rw_label, - dasd_eckd_ck_char, - dasd_eckd_fill_sizes, - dasd_eckd_format, + ck_devinfo:dasd_eckd_ck_devinfo, + get_req_ccw:dasd_eckd_build_req, + ck_characteristics:dasd_eckd_ck_char, + fill_sizes_first:dasd_eckd_fill_sizes_first, + fill_sizes_last:dasd_eckd_fill_sizes_last, + dasd_format:dasd_eckd_format, + fill_geometry:dasd_eckd_fill_geometry, + erp_examine:dasd_eckd_erp_examine }; /* diff -urN v2.2.15/linux/drivers/s390/block/dasd_eckd_erp.c linux/drivers/s390/block/dasd_eckd_erp.c --- v2.2.15/linux/drivers/s390/block/dasd_eckd_erp.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_eckd_erp.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,29 @@ +/* + * File...........: linux/drivers/s390/block/dasd_eckd_erp.h + * Author(s)......: Holger Smolinski + * Bugreports.to..: + * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 + */ + +#include +#include "dasd_erp.h" + +#define PRINTK_HEADER "dasd_erp(eckd)" + +dasd_era_t +dasd_eckd_erp_examine (cqr_t * cqr, devstat_t * stat) +{ + + if (stat->cstat == 0x00 && + stat->dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) + return dasd_era_none; + + switch (dasd_info[cqr->devindex]->info.sid_data.cu_model) { + case 0x3990: + return dasd_3990_erp_examine (cqr, stat); + case 0x9343: + return dasd_9343_erp_examine (cqr, stat); + default: + return dasd_era_recover; + } +} diff -urN v2.2.15/linux/drivers/s390/block/dasd_erp.c linux/drivers/s390/block/dasd_erp.c --- v2.2.15/linux/drivers/s390/block/dasd_erp.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_erp.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,77 @@ +/* + * File...........: linux/drivers/s390/block/dasd_erp.c + * Author(s)......: Holger Smolinski + * Bugreports.to..: + * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 + */ + +#include +#include +#include "dasd_erp.h" + +#define PRINTK_HEADER "dasd_erp" + +dasd_era_t +dasd_erp_examine (cqr_t * cqr, devstat_t * stat) +{ + int rc; + if (stat->cstat == 0x00 && + stat->dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) { + PRINT_WARN ("No error detected\n"); + rc = dasd_era_none; + } else if (!(stat->flag & DEVSTAT_FLAG_SENSE_AVAIL)) { + PRINT_WARN ("No sense data available, try to recover anyway\n"); + rc = dasd_era_recover; + } else +#if DASD_PARANOIA > 1 + if (!dasd_disciplines[dasd_info[cqr->devindex]->type]-> + erp_examine) { + INTERNAL_CHECK ("No erp_examinator for dt=%d\n", + dasd_info[cqr->devindex]->type); + rc = dasd_era_fatal; + } else +#endif + { + PRINT_WARN ("calling examinator\n"); + rc = dasd_disciplines[dasd_info[cqr->devindex]->type]-> + erp_examine (cqr, stat); + } + PRINT_WARN("ERP action code = %d\n",rc); + return rc; +} + +void +default_erp_action (erp_t * erp) +{ + cqr_t *cqr = erp->cqr.int4cqr; + ccw1_t *cpa = request_cp(1,0); + + memset (cpa,0,sizeof(ccw1_t)); + + cpa -> cmd_code = CCW_CMD_NOOP; + + ((cqr_t *) erp)->cpaddr = cpa; + if (cqr->retries++ <= 16) { + ACS (cqr->status, + CQR_STATUS_ERP_PEND, + CQR_STATUS_QUEUED); + } else { + PRINT_WARN ("ERP retry count exceeded\n"); + ACS (cqr->status, + CQR_STATUS_ERP_PEND, + CQR_STATUS_FAILED); + } + atomic_set (&(((cqr_t *) erp)->status), CQR_STATUS_FILLED); +} + +dasd_erp_action_t +dasd_erp_action (struct cqr_t *cqr) +{ + return default_erp_action; +} + +dasd_erp_action_t +dasd_erp_postaction (struct erp_t * erp) +{ + return NULL; +} diff -urN v2.2.15/linux/drivers/s390/block/dasd_erp.h linux/drivers/s390/block/dasd_erp.h --- v2.2.15/linux/drivers/s390/block/dasd_erp.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_erp.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,32 @@ +/* + * File...........: linux/drivers/s390/block/dasd_erp.h + * Author(s)......: Holger Smolinski + * Bugreports.to..: + * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 + */ + +#ifndef DASD_ERP_H +#define DASD_ERP_H + +typedef enum { + dasd_era_fatal = -1, /* no chance to recover */ + dasd_era_none = 0, /* don't recover, everything alright */ + dasd_era_msg = 1, /* don't recover, just report... */ + dasd_era_recover = 2 /* recovery action recommended */ +} dasd_era_t; + +#include "dasd_types.h" + +typedef struct erp_t { + struct cqr_t cqr; +} __attribute__ ((packed)) + +erp_t; + +typedef void (*dasd_erp_action_t) (erp_t *); + +dasd_era_t dasd_erp_examine (struct cqr_t *, devstat_t *); +dasd_erp_action_t dasd_erp_action (struct cqr_t *); +dasd_erp_action_t dasd_erp_postaction (struct erp_t *); + +#endif /* DASD_ERP_H */ diff -urN v2.2.15/linux/drivers/s390/block/dasd_fba.c linux/drivers/s390/block/dasd_fba.c --- v2.2.15/linux/drivers/s390/block/dasd_fba.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_fba.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,356 @@ + +#include +#include + +#ifdef MODULE +#include +#endif /* MODULE */ + +#include +#include +#include /* HDIO_GETGEO */ + +#include + +#include + +#include "dasd_types.h" +#include "dasd_ccwstuff.h" + +#define DASD_FBA_CCW_LOCATE 0x43 +#define DASD_FBA_CCW_READ 0x42 +#define DASD_FBA_CCW_WRITE 0x41 + +#ifdef PRINTK_HEADER +#undef PRINTK_HEADER +#endif /* PRINTK_HEADER */ +#define PRINTK_HEADER "dasd(fba):" + +typedef +struct { + struct { + unsigned char perm:2; /* Permissions on this extent */ + unsigned char zero:2; /* Must be zero */ + unsigned char da:1; /* usually zero */ + unsigned char diag:1; /* allow diagnose */ + unsigned char zero2:2; /* zero */ + } __attribute__ ((packed)) mask; + unsigned char zero; /* Must be zero */ + unsigned short blk_size; /* Blocksize */ + unsigned long ext_loc; /* Extent locator */ + unsigned long ext_beg; /* logical number of block 0 in extent */ + unsigned long ext_end; /* logocal number of last block in extent */ +} __attribute__ ((packed, aligned (32))) + +DE_fba_data_t; + +typedef +struct { + struct { + unsigned char zero:4; + unsigned char cmd:4; + } __attribute__ ((packed)) operation; + unsigned char auxiliary; + unsigned short blk_ct; + unsigned long blk_nr; +} __attribute__ ((packed, aligned (32))) + +LO_fba_data_t; + +static void +define_extent (ccw1_t * ccw, DE_fba_data_t * DE_data, int rw, + int blksize, int beg, int nr) +{ + memset (DE_data, 0, sizeof (DE_fba_data_t)); + ccw->cmd_code = CCW_DEFINE_EXTENT; + ccw->count = 16; + ccw->cda = (void *) __pa (DE_data); + if (rw == WRITE) + (DE_data->mask).perm = 0x0; + else if (rw == READ) + (DE_data->mask).perm = 0x1; + else + DE_data->mask.perm = 0x2; + DE_data->blk_size = blksize; + DE_data->ext_loc = beg; + DE_data->ext_end = nr - 1; +} + +static void +locate_record (ccw1_t * ccw, LO_fba_data_t * LO_data, int rw, int block_nr, + int block_ct) +{ + memset (LO_data, 0, sizeof (LO_fba_data_t)); + ccw->cmd_code = DASD_FBA_CCW_LOCATE; + ccw->count = 8; + ccw->cda = (void *) __pa (LO_data); + if (rw == WRITE) + LO_data->operation.cmd = 0x5; + else if (rw == READ) + LO_data->operation.cmd = 0x6; + else + LO_data->operation.cmd = 0x8; + LO_data->blk_nr = block_nr; + LO_data->blk_ct = block_ct; +} + +int +dasd_fba_ck_devinfo (dev_info_t * info) +{ + return 0; +} + +cqr_t * +dasd_fba_build_req (int devindex, + struct request * req) +{ + cqr_t *rw_cp = NULL; + ccw1_t *ccw; + + DE_fba_data_t *DE_data; + LO_fba_data_t *LO_data; + struct buffer_head *bh; + int rw_cmd; + int byt_per_blk = dasd_info[devindex]->sizes.bp_block; + int bhct; + long size; + + if (!req->nr_sectors) { + PRINT_ERR ("No blocks to write...returning\n"); + return NULL; + } + if (req->cmd == READ) { + rw_cmd = DASD_FBA_CCW_READ; + } else +#if DASD_PARANOIA > 2 + if (req->cmd == WRITE) +#endif /* DASD_PARANOIA */ + { + rw_cmd = DASD_FBA_CCW_WRITE; + } +#if DASD_PARANOIA > 2 + else { + PRINT_ERR ("Unknown command %d\n", req->cmd); + return NULL; + } +#endif /* DASD_PARANOIA */ + bhct = 0; + for (bh = req->bh; bh; bh = bh->b_reqnext) { + if (bh->b_size > byt_per_blk) + for (size = 0; size < bh->b_size; size += byt_per_blk) + bhct++; + else + bhct++; + } + + /* Build the request */ + rw_cp = request_cqr (2 + bhct, + sizeof (DE_fba_data_t) + + sizeof (LO_fba_data_t)); + if (!rw_cp) { + return NULL; + } + DE_data = rw_cp->data; + LO_data = rw_cp->data + sizeof (DE_fba_data_t); + ccw = rw_cp->cpaddr; + + define_extent (ccw, DE_data, req->cmd, byt_per_blk, + req->sector, req->nr_sectors); + ccw->flags = CCW_FLAG_CC; + ccw++; + locate_record (ccw, LO_data, req->cmd, 0, req->nr_sectors); + ccw->flags = CCW_FLAG_CC; + for (bh = req->bh; bh;) { + if (bh->b_size > byt_per_blk) { + for (size = 0; size < bh->b_size; size += byt_per_blk) { + ccw++; + if (dasd_info[devindex]->rdc_data->fba.mode.bits.data_chain) { + ccw->flags = CCW_FLAG_DC; + } else { + ccw->flags = CCW_FLAG_CC; + } + ccw->cmd_code = rw_cmd; + ccw->count = byt_per_blk; + ccw->cda = (void *) __pa (bh->b_data + size); + } + bh = bh->b_reqnext; + } else { /* group N bhs to fit into byt_per_blk */ + for (size = 0; bh != NULL && size < byt_per_blk;) { + ccw++; + if (dasd_info[devindex]->rdc_data->fba.mode.bits.data_chain) { + ccw->flags = CCW_FLAG_DC; + } else { + PRINT_WARN ("Cannot chain chunks smaller than one block\n"); + release_cqr (rw_cp); + return NULL; + } + ccw->cmd_code = rw_cmd; + ccw->count = bh->b_size; + ccw->cda = (void *) __pa (bh->b_data); + size += bh->b_size; + bh = bh->b_reqnext; + } + ccw->flags = CCW_FLAG_CC; + if (size != byt_per_blk) { + PRINT_WARN ("Cannot fulfill request smaller than block\n"); + release_cqr (rw_cp); + return NULL; + } + } + } + ccw->flags &= ~(CCW_FLAG_DC | CCW_FLAG_CC); + return rw_cp; +} + +void +dasd_fba_print_char (dasd_characteristics_t * ct) +{ + dasd_fba_characteristics_t *c = + (dasd_fba_characteristics_t *) ct; + PRINT_INFO ("%d blocks of %d bytes %d MB\n", + c->blk_bdsa, c->blk_size, + (c->blk_bdsa * (c->blk_size >> 9)) >> 11); + PRINT_INFO ("%soverrun, %s mode, data chains %sallowed\n" + "%sremovable, %sshared\n", + (c->mode.bits.overrunnable ? "" : "no "), + (c->mode.bits.burst_byte ? "burst" : "byte"), + (c->mode.bits.data_chain ? "" : "not "), + (c->features.bits.removable ? "" : "not "), + (c->features.bits.shared ? "" : "not ")); +}; + +int +dasd_fba_ck_char (dasd_characteristics_t * rdc) +{ + int rc = 0; + dasd_fba_print_char (rdc); + return rc; +} + +cqr_t * +dasd_fba_fill_sizes_first (int di) +{ + cqr_t *rw_cp = NULL; + ccw1_t *ccw; + DE_fba_data_t *DE_data; + LO_fba_data_t *LO_data; + dasd_information_t *info = dasd_info[di]; + static char buffer[8]; + + dasd_info[di]->sizes.label_block = 1; + + rw_cp = request_cqr (3, + sizeof (DE_fba_data_t) + + sizeof (LO_fba_data_t)); + DE_data = rw_cp->data; + LO_data = rw_cp->data + sizeof (DE_fba_data_t); + ccw = rw_cp->cpaddr; + define_extent (ccw, DE_data, READ, info->sizes.bp_block, 1, 1); + ccw->flags = CCW_FLAG_CC; + ccw++; + locate_record (ccw, LO_data, READ, 0, 1); + ccw->flags = CCW_FLAG_CC; + ccw++; + ccw->cmd_code = DASD_FBA_CCW_READ; + ccw->flags = CCW_FLAG_SLI; + ccw->count = 8; + ccw->cda = (void *) __pa (buffer); + rw_cp->devindex = di; + atomic_set (&rw_cp->status, CQR_STATUS_FILLED); + return rw_cp; +} + +int +dasd_fba_fill_sizes_last (int devindex) +{ + int rc = 0; + int sb; + dasd_information_t *info = dasd_info[devindex]; + + info->sizes.bp_sector = info->rdc_data->fba.blk_size; + info->sizes.bp_block = info->sizes.bp_sector; + + info->sizes.s2b_shift = 0; /* bits to shift 512 to get a block */ + for (sb = 512; sb < info->sizes.bp_sector; sb = sb << 1) + info->sizes.s2b_shift++; + + info->sizes.blocks = (info->rdc_data->fba.blk_bdsa); + + if (info->sizes.s2b_shift >= 1) + info->sizes.kbytes = info->sizes.blocks << + (info->sizes.s2b_shift - 1); + else + info->sizes.kbytes = info->sizes.blocks >> + (-(info->sizes.s2b_shift - 1)); + + return rc; +} + +int +dasd_fba_format (int devindex, format_data_t * fdata) +{ + int rc = 0; + return rc; +} + +void +dasd_fba_fill_geometry (int di, struct hd_geometry *geo) +{ + int bfactor, nr_sectors, sec_size; + int trk_cap, trk_low, trk_high, tfactor, nr_trks, trk_size; + int cfactor, nr_cyls, cyl_size; + int remainder; + + dasd_information_t *info = dasd_info[di]; + PRINT_INFO ("FBA has no geometry! Faking one...\n%s", ""); + + /* determine the blocking factor of sectors */ + for (bfactor = 8; bfactor > 0; bfactor--) { + remainder = info->rdc_data->fba.blk_bdsa % bfactor; + PRINT_INFO ("bfactor %d remainder %d\n", bfactor, remainder); + if (!remainder) + break; + } + nr_sectors = info->rdc_data->fba.blk_bdsa / bfactor; + sec_size = info->rdc_data->fba.blk_size * bfactor; + + geo -> sectors = bfactor; + + /* determine the nr of sectors per track */ + trk_cap = (64 * 1 << 10) / sec_size; /* 64k in sectors */ + trk_low = trk_cap * 2 / 3; + trk_high = trk_cap * 4 / 3; + for (tfactor = trk_high; tfactor > trk_low; tfactor--) { + PRINT_INFO ("remainder %d\n", remainder); + remainder = nr_sectors % bfactor; + if (!remainder) + break; + } + nr_trks = nr_sectors / tfactor; + trk_size = sec_size * tfactor; + + /* determine the nr of trks per cylinder */ + for (cfactor = 31; cfactor > 0; cfactor--) { + PRINT_INFO ("remainder %d\n", remainder); + remainder = nr_trks % bfactor; + if (!remainder) + break; + } + nr_cyls = nr_trks / cfactor; + sec_size = info->rdc_data->fba.blk_size * bfactor; + + geo -> heads = nr_trks; + geo -> cylinders = nr_cyls; + geo -> start = info->sizes.label_block + 1; +} + +dasd_operations_t dasd_fba_operations = +{ + ck_devinfo:dasd_fba_ck_devinfo, + get_req_ccw:dasd_fba_build_req, + ck_characteristics:dasd_fba_ck_char, + fill_sizes_first:dasd_fba_fill_sizes_first, + fill_sizes_last:dasd_fba_fill_sizes_last, + dasd_format:dasd_fba_format, + fill_geometry:dasd_fba_fill_geometry +}; diff -urN v2.2.15/linux/drivers/s390/block/dasd_mdsk.c linux/drivers/s390/block/dasd_mdsk.c --- v2.2.15/linux/drivers/s390/block/dasd_mdsk.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_mdsk.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,366 @@ +#include +#include +#include +#include "dasd_types.h" +#include "dasd_ccwstuff.h" +#include "dasd_mdsk.h" + +#ifdef PRINTK_HEADER +#undef PRINTK_HEADER +#endif /* PRINTK_HEADER */ +#define PRINTK_HEADER "dasd(mdsk):" + +int dasd_is_accessible (int devno); +void dasd_insert_range (int start, int end); + +/* + * The device characteristics function + */ +static __inline__ int +dia210 (void *devchar) +{ + int rc; + + asm volatile (" lr 2,%1\n" + " .long 0x83200210\n" + " ipm %0\n" + " srl %0,28" + :"=d" (rc) + :"d" ((void *) __pa (devchar)) + :"2"); + return rc; +} + +static __inline__ int +dia250 (void *iob, int cmd) +{ + int rc; + + asm volatile (" lr 2,%1\n" + " lr 3,%2\n" + " .long 0x83230250\n" + " lr %0,3" + :"=d" (rc) + :"d" ((void *) __pa (iob)), "d" (cmd) + :"2", "3"); + return rc; +} + +/* + * Init of minidisk device + */ + +static __inline__ int +mdsk_init_io (int di, int blocksize, int offset, int size) +{ + mdsk_init_io_t *iib = &(dasd_info[di]->private.mdsk.iib); + int rc; + + memset (iib, 0, sizeof (mdsk_init_io_t)); + + iib->dev_nr = dasd_info[di]->info.devno; + iib->block_size = blocksize; + iib->offset = offset; + iib->start_block = 0; + iib->end_block = size; + + rc = dia250 (iib, INIT_BIO); + + return rc; +} + +/* + * release of minidisk device + */ + +static __inline__ int +mdsk_term_io (int di) +{ + mdsk_init_io_t *iib = &(dasd_info[di]->private.mdsk.iib); + int rc; + + memset (iib, 0, sizeof (mdsk_init_io_t)); + iib->dev_nr = dasd_info[di]->info.devno; + rc = dia250 (iib, TERM_BIO); + return rc; +} + +void dasd_do_chanq (void); +void dasd_schedule_bh (void (*func) (void)); +int register_dasd_last (int di); + +int +dasd_mdsk_start_IO (cqr_t * cqr) +{ + int rc; + mdsk_rw_io_t *iob = &(dasd_info[cqr->devindex]->private.mdsk.iob); + + iob->dev_nr = dasd_info[cqr->devindex]->info.devno; + iob->key = 0; + iob->flags = 2; + iob->block_count = cqr->cplength >> 1; + iob->interrupt_params = (u32) cqr; + iob->bio_list = __pa (cqr->cpaddr); + + asm volatile ("STCK %0":"=m" (cqr->startclk)); + rc = dia250 (iob, RW_BIO); + if (rc > 8) { + PRINT_WARN ("dia250 returned CC %d\n", rc); + ACS (cqr->status, CQR_STATUS_QUEUED, CQR_STATUS_ERROR); + } else { + ACS (cqr->status, CQR_STATUS_QUEUED, CQR_STATUS_IN_IO); + atomic_dec (&chanq_tasks); + } + return rc; +} + +void +do_dasd_mdsk_interrupt (struct pt_regs *regs, __u16 code) +{ + int intparm = S390_lowcore.ext_params; + char status = *((char *) S390_lowcore.ext_params + 5); + cqr_t *cqr = (cqr_t *) intparm; + if (!intparm) + return; + if (cqr->magic != MDSK_MAGIC) { + panic ("unknown magic number\n"); + } + asm volatile ("STCK %0":"=m" (cqr->stopclk)); + if (atomic_read (&dasd_info[cqr->devindex]->status) == + DASD_INFO_STATUS_DETECTED) { + register_dasd_last (cqr->devindex); + } + switch (status) { + case 0x00: + ACS (cqr->status, CQR_STATUS_IN_IO, CQR_STATUS_DONE); + break; + case 0x01: + case 0x02: + case 0x03: + default: + ACS (cqr->status, CQR_STATUS_IN_IO, CQR_STATUS_FAILED); + atomic_inc (&dasd_info[cqr->devindex]-> + queue.dirty_requests); + break; + } + atomic_inc (&chanq_tasks); + dasd_schedule_bh (dasd_do_chanq); +} + +cqr_t * +dasd_mdsk_build_req (int devindex, + struct request *req) +{ + cqr_t *rw_cp = NULL; + struct buffer_head *bh; + int rw_cmd; + dasd_information_t *info = dasd_info[devindex]; + int noblk = req->nr_sectors >> info->sizes.s2b_shift; + int byt_per_blk = info->sizes.bp_block; + int block; + mdsk_bio_t *bio; + int bhct; + long size; + + if (!noblk) { + PRINT_ERR ("No blocks to write...returning\n"); + return NULL; + } + if (req->cmd == READ) { + rw_cmd = MDSK_READ_REQ; + } else +#if DASD_PARANOIA > 2 + if (req->cmd == WRITE) +#endif /* DASD_PARANOIA */ + { + rw_cmd = MDSK_WRITE_REQ; + } +#if DASD_PARANOIA > 2 + else { + PRINT_ERR ("Unknown command %d\n", req->cmd); + return NULL; + } +#endif /* DASD_PARANOIA */ + bhct = 0; + for (bh = req->bh; bh; bh = bh->b_reqnext) { + if (bh->b_size > byt_per_blk) + for (size = 0; size < bh->b_size; size += byt_per_blk) + bhct++; + else + bhct++; + } + /* Build the request */ + rw_cp = request_cqr (MDSK_BIOS (bhct), 0); + if (!rw_cp) { + return NULL; + } + rw_cp->magic = MDSK_MAGIC; + bio = (mdsk_bio_t *) (rw_cp->cpaddr); + + block = req->sector >> info->sizes.s2b_shift; + for (bh = req->bh; bh; bh = bh->b_reqnext) { + if (bh->b_size >= byt_per_blk) { + memset (bio, 0, sizeof (mdsk_bio_t)); + for (size = 0; size < bh->b_size; size += byt_per_blk) { + bio->type = rw_cmd; + bio->block_number = block + 1; + bio->buffer = __pa (bh->b_data + size); + bio++; + block++; + } + } else { + PRINT_WARN ("Cannot fulfill request smaller than block\n"); + release_cqr (rw_cp); + return NULL; + } + } + return rw_cp; +} + +int +dasd_mdsk_ck_devinfo (dev_info_t * info) +{ + int rc = 0; + + dasd_mdsk_characteristics_t devchar = + {0,}; + + devchar.dev_nr = info->devno; + devchar.rdc_len = sizeof (dasd_mdsk_characteristics_t); + + if (dia210 (&devchar) != 0) { + return -ENODEV; + } + if (devchar.vdev_class == DEV_CLASS_FBA || + devchar.vdev_class == DEV_CLASS_ECKD || + devchar.vdev_class == DEV_CLASS_CKD) { + return 0; + } else { + return -ENODEV; + } + return rc; +} + +int +dasd_mdsk_ck_characteristics (dasd_characteristics_t * dchar) +{ + int rc = 0; + dasd_mdsk_characteristics_t *devchar = + (dasd_mdsk_characteristics_t *) dchar; + + if (dia210 (devchar) != 0) { + return -ENODEV; + } + if (devchar->vdev_class != DEV_CLASS_FBA && + devchar->vdev_class != DEV_CLASS_ECKD && + devchar->vdev_class != DEV_CLASS_CKD) { + return -ENODEV; + } + return rc; +} + +cqr_t * +dasd_mdsk_fill_sizes_first (int di) +{ + cqr_t *cqr = NULL; + dasd_information_t *info = dasd_info[di]; + mdsk_bio_t *bio; + int bsize; + int rc; + /* Figure out position of label block */ + if (info->rdc_data->mdsk.vdev_class == DEV_CLASS_FBA) { + info->sizes.label_block = 1; + } else if (info->rdc_data->mdsk.vdev_class == DEV_CLASS_ECKD || + info->rdc_data->mdsk.vdev_class == DEV_CLASS_CKD) { + dasd_info[di]->sizes.label_block = 2; + } else { + return NULL; + } + + /* figure out blocksize of device */ + mdsk_term_io (di); + for (bsize = 512; bsize <= PAGE_SIZE; bsize = bsize << 1) { + rc = mdsk_init_io (di, bsize, 0, 64); + if (rc <= 4) { + break; + } + } + if (bsize > PAGE_SIZE) { + PRINT_INFO ("Blocksize larger than 4096??\n"); + rc = mdsk_term_io (di); + return NULL; + } + dasd_info[di]->sizes.bp_sector = bsize; + + info->private.mdsk.label = (long *) get_free_page (GFP_KERNEL); + cqr = request_cqr (MDSK_BIOS (1), 0); + cqr->magic = MDSK_MAGIC; + bio = (mdsk_bio_t *) (cqr->cpaddr); + memset (bio, 0, sizeof (mdsk_bio_t)); + bio->type = MDSK_READ_REQ; + bio->block_number = info->sizes.label_block + 1; + bio->buffer = __pa (info->private.mdsk.label); + cqr->devindex = di; + atomic_set (&cqr->status, CQR_STATUS_FILLED); + + return cqr; +} + +int +dasd_mdsk_fill_sizes_last (int di) +{ + int sb; + dasd_information_t *info = dasd_info[di]; + long *label = info->private.mdsk.label; + int bs = info->private.mdsk.iib.block_size; + + info->sizes.s2b_shift = 0; /* bits to shift 512 to get a block */ + for (sb = 512; sb < bs; sb = sb << 1) + info->sizes.s2b_shift++; + + if (label[3] != bs) { + PRINT_WARN ("%04X mismatching blocksizes\n", info->info.devno); + atomic_set (&dasd_info[di]->status, + DASD_INFO_STATUS_DETECTED); + return -EINVAL; + } + if (label[0] != 0xc3d4e2f1) { /* CMS1 */ + PRINT_WARN ("%04X is not CMS formatted\n", info->info.devno); + } + if (label[13] == 0) { + PRINT_WARN ("%04X is not reserved\n", info->info.devno); + } + /* defaults for first partition */ + info->private.mdsk.setup.size = + (label[7] - 1 - label[13]) * (label[3] >> 9) >> 1; + info->private.mdsk.setup.blksize = label[3]; + info->private.mdsk.setup.offset = label[13] + 1; + + /* real size of the volume */ + info->sizes.bp_block = label[3]; + info->sizes.kbytes = label[7] * (label[3] >> 9) >> 1; + + if (info->sizes.s2b_shift >= 1) + info->sizes.blocks = info->sizes.kbytes >> + (info->sizes.s2b_shift - 1); + else + info->sizes.blocks = info->sizes.kbytes << + (-(info->sizes.s2b_shift - 1)); + + PRINT_INFO ("%ld kBytes in %d blocks of %d Bytes\n", + info->sizes.kbytes, + info->sizes.blocks, + info->sizes.bp_sector); + return 0; + +} + +dasd_operations_t dasd_mdsk_operations = +{ + ck_devinfo:dasd_mdsk_ck_devinfo, + get_req_ccw:dasd_mdsk_build_req, + ck_characteristics:dasd_mdsk_ck_characteristics, + fill_sizes_first:dasd_mdsk_fill_sizes_first, + fill_sizes_last:dasd_mdsk_fill_sizes_last, + dasd_format:NULL +}; diff -urN v2.2.15/linux/drivers/s390/block/dasd_mdsk.h linux/drivers/s390/block/dasd_mdsk.h --- v2.2.15/linux/drivers/s390/block/dasd_mdsk.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_mdsk.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,63 @@ +#ifndef DASD_MDSK_H +#define DASD_MDSK_H + +#define MDSK_WRITE_REQ 0x01 +#define MDSK_READ_REQ 0x02 + +#define INIT_BIO 0x00 +#define RW_BIO 0x01 +#define TERM_BIO 0x02 + +#define DEV_CLASS_FBA 0x01 +#define DEV_CLASS_ECKD 0x02 /* sure ?? */ +#define DEV_CLASS_CKD 0x04 /* sure ?? */ + +#define MDSK_BIOS(x) (2*(x)) + +typedef struct mdsk_dev_char_t { + u8 type; + u8 status; + u16 spare1; + u32 block_number; + u32 alet; + u32 buffer; +} __attribute__ ((packed, aligned (8))) + +mdsk_bio_t; + +typedef struct { + u16 dev_nr; + u16 spare1[11]; + u32 block_size; + u32 offset; + u32 start_block; + u32 end_block; + u32 spare2[6]; +} __attribute__ ((packed, aligned (8))) + +mdsk_init_io_t; + +typedef struct { + u16 dev_nr; + u16 spare1[11]; + u8 key; + u8 flags; + u16 spare2; + u32 block_count; + u32 alet; + u32 bio_list; + u32 interrupt_params; + u32 spare3[5]; +} __attribute__ ((packed, aligned (8))) + +mdsk_rw_io_t; + +typedef struct { + long vdev; + long size; + long offset; + long blksize; + int force_mdsk; +} mdsk_setup_data_t; + +#endif diff -urN v2.2.15/linux/drivers/s390/block/dasd_proc.c linux/drivers/s390/block/dasd_proc.c --- v2.2.15/linux/drivers/s390/block/dasd_proc.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/block/dasd_proc.c Wed Jun 7 14:26:43 2000 @@ -9,7 +9,8 @@ #include -#include "dasd.h" +#include + #include "dasd_types.h" int dasd_proc_read_devices ( char *, char **, off_t, int, int); @@ -18,48 +19,61 @@ extern int dasd_proc_read_debug ( char *, char **, off_t, int, int); #endif /* DASD_PROFILE */ -struct proc_dir_entry dasd_proc_root_entry = { - 0, - 4,"dasd", - S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR | S_IWGRP, - 1,0,0, - 0, - NULL, +struct proc_dir_entry dasd_proc_root_entry = +{ + low_ino:0, + namelen:4, + name:"dasd", + mode:S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR | S_IWGRP, + nlink:1, + uid:0, + gid:0, + size:0 }; -struct proc_dir_entry dasd_proc_devices_entry = { - 0, - 7,"devices", - S_IFREG | S_IRUGO | S_IXUGO | S_IWUSR | S_IWGRP, - 1,0,0, - 0, - NULL, - &dasd_proc_read_devices, +struct proc_dir_entry dasd_proc_devices_entry = +{ + low_ino:0, + namelen:7, + name:"devices", + mode:S_IFREG | S_IRUGO | S_IXUGO | S_IWUSR | S_IWGRP, + nlink:1, + uid:0, + gid:0, + size:0, + get_info:&dasd_proc_read_devices, }; #ifdef DASD_PROFILE -struct proc_dir_entry dasd_proc_stats_entry = { - 0, - 10,"statistics", - S_IFREG | S_IRUGO | S_IXUGO | S_IWUSR | S_IWGRP, - 1,0,0, - 0, - NULL, - &dasd_proc_read_statistics, +struct proc_dir_entry dasd_proc_stats_entry = +{ + low_ino:0, + namelen:10, + name:"statistics", + mode:S_IFREG | S_IRUGO | S_IXUGO | S_IWUSR | S_IWGRP, + nlink:1, + uid:0, + gid:0, + size:0, + get_info:&dasd_proc_read_statistics }; -struct proc_dir_entry dasd_proc_debug_entry = { - 0, - 5,"debug", - S_IFREG | S_IRUGO | S_IXUGO | S_IWUSR | S_IWGRP, - 1,0,0, - 0, - NULL, - &dasd_proc_read_debug, +struct proc_dir_entry dasd_proc_debug_entry = +{ + low_ino:0, + namelen:5, + name:"debug", + mode:S_IFREG | S_IRUGO | S_IXUGO | S_IWUSR | S_IWGRP, + nlink:1, + uid:0, + gid:0, + size:0, + get_info:&dasd_proc_read_debug }; #endif /* DASD_PROFILE */ -struct proc_dir_entry dasd_proc_device_template = { +struct proc_dir_entry dasd_proc_device_template = +{ 0, 6,"dd????", S_IFBLK | S_IRUGO | S_IWUSR | S_IWGRP, @@ -79,7 +93,6 @@ #endif /* DASD_PROFILE */ } - int dasd_proc_read_devices ( char * buf, char **start, off_t off, int len, int d) { @@ -97,17 +110,24 @@ DASD_MAJOR, i << PARTN_BITS, 'a' + i ); - if (info->flags == DASD_NOT_FORMATTED) { - len += sprintf ( buf + len, " n/a"); - } else { - len += sprintf ( buf + len, " %6d", + switch (atomic_read (&info->status)) { + case DASD_INFO_STATUS_UNKNOWN: + len += sprintf (buf + len, " unknown"); + break; + case DASD_INFO_STATUS_DETECTED: + len += sprintf (buf + len, " avail"); + break; + case DASD_INFO_STATUS_ANALYSED: + len += sprintf (buf + len, " n/f"); + break; + default: + len += sprintf (buf + len, " %7d", info->sizes.bp_block); } len += sprintf ( buf + len, "\n"); } return len; } - void dasd_proc_add_node (int di) diff -urN v2.2.15/linux/drivers/s390/block/dasd_profile.c linux/drivers/s390/block/dasd_profile.c --- v2.2.15/linux/drivers/s390/block/dasd_profile.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/block/dasd_profile.c Wed Jun 7 14:26:43 2000 @@ -1,7 +1,9 @@ + #include #include -#include "dasd.h" +#include + #include "dasd_types.h" #define PRINTK_HEADER "dasd_profile:" @@ -141,7 +143,9 @@ } __attribute__ ((packed)) u; unsigned long caller_address; unsigned long tag; -} __attribute__ ((packed)) dasd_debug_entry; +} __attribute__ ((packed)) + +dasd_debug_entry; static dasd_debug_entry *dasd_debug_area = NULL; static dasd_debug_entry *dasd_debug_actual; @@ -155,7 +159,7 @@ /* initialize in first call ... */ if ( ! dasd_debug_area ) { dasd_debug_actual = dasd_debug_area = - get_free_page (GFP_ATOMIC); + (dasd_debug_entry *) get_free_page (GFP_ATOMIC); if ( ! dasd_debug_area ) { PRINT_WARN("No debug area allocated\n"); return; @@ -174,7 +178,7 @@ __asm__ __volatile__ ( "STCK %0" :"=m" (d->u.clock)); d->tag = tag; - d -> caller_address = __builtin_return_address(0); + d->caller_address = (unsigned long) __builtin_return_address (0); d->u.s.cpu = smp_processor_id(); } @@ -183,7 +187,8 @@ off_t off, int len, int dd) { dasd_debug_entry *d; - char tag[9] = { 0, }; + char tag[9] = + {0,}; long flags; spin_lock_irqsave(&debug_lock,flags); len = 0; @@ -193,13 +198,12 @@ if ( *(char*)(&d->tag) == 'D' ) { memcpy(tag,&(d->tag),4); tag[4]=0; - } - else { - sprintf(tag,"%08x",d->tag); + } else { + sprintf (tag, "%08lx", d->tag); tag[8]=0; } len += sprintf ( buf+len, - "%lx %08x%05x %08lx (%8s)\n", + "%x %08x%05x %08lx (%8s)\n", d->u.s.cpu, d->u.s.ts1, d->u.s.ts2, d->caller_address,tag); } diff -urN v2.2.15/linux/drivers/s390/block/dasd_setup.c linux/drivers/s390/block/dasd_setup.c --- v2.2.15/linux/drivers/s390/block/dasd_setup.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/dasd_setup.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,343 @@ +/* + * File...........: linux/drivers/s390/block/dasd_setup.c + * Author(s)......: Holger Smolinski + * : Utz Bacher + * Bugreports.to..: + * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 + */ + +#include +#include + +#include +#include "dasd_types.h" + +#define PRINTK_HEADER "dasd(setup):" + +#define MIN(a,b) (((a)<(b))?(a):(b)) + +static int dasd_autodetect = 0; +int dasd_probeonly = 1; +static int dasd_count = 0; +static int dasd_devno[DASD_MAX_DEVICES] = +{0,}; +int dasd_force_mdsk_flag[DASD_MAX_DEVICES] = +{0,}; + +extern char *dasd[DASD_MAX_DEVICES]; +#ifdef CONFIG_DASD_MDSK +extern char *dasd_force_mdsk[DASD_MAX_DEVICES]; +#endif + +typedef struct dasd_range { + int from, to; + struct dasd_range *next; +} dasd_range; + +static dasd_range *first_range = NULL; + +void +dasd_add_devno_to_ranges (int devno) +{ + dasd_range *p, *prev; + for (p = first_range; p; prev = p, p = prev->next) { + if (devno >= p->from && devno <= p->to) { + PRINT_WARN ("devno %04X already in range %04X-%04X\n", + devno, p->from, p->to); + return; + } + if (devno == (p->from - 1)) { + p->from--; + return; + } + if (devno == (p->to + 1)) { + p->to++; + return; + } + } + prev = kmalloc (sizeof (dasd_range), GFP_ATOMIC); + prev->from = prev->to = devno; + if (!first_range) { + first_range = prev; + } + return; +} + +int +dasd_proc_print_probed_ranges (char *buf, char **start, off_t off, int len, int d) +{ + dasd_range *p; + len = sprintf (buf, "Probed ranges of the DASD driver\n"); + for (p = first_range; p; p = p->next) { + if (len >= PAGE_SIZE - 80) + len += sprintf (buf + len, "terminated...\n"); + if (p != first_range) { + len += sprintf (buf + len, ","); + } + if (p->from == p->to) { + len += sprintf (buf + len, "%04x", p->from); + } else { + len += sprintf (buf + len, "%04x-%04x", + p->from, p->to); + } + } + len += sprintf (buf + len, "\n"); + return len; +} + +static int +dasd_get_hexdigit (char c) +{ + if ((c >= '0') && (c <= '9')) + return c - '0'; + if ((c >= 'a') && (c <= 'f')) + return c + 10 - 'a'; + if ((c >= 'A') && (c <= 'F')) + return c + 10 - 'A'; + return -1; +} + +/* sets the string pointer after the next comma */ +static void +dasd_scan_for_next_comma (char **strptr) +{ + while (((**strptr) != ',') && (**strptr)) + (*strptr)++; + + /* set the position AFTER the comma */ + if (**strptr == ',') + (*strptr)++; +} + +/*sets the string pointer after the next comma, if a parse error occured */ +static int +dasd_get_next_int (char **strptr) +{ + int j, i = -1; /* for cosmetic reasons first -1, then 0 */ + if (isxdigit (**strptr)) { + for (i = 0; isxdigit (**strptr);) { + i <<= 4; + j = dasd_get_hexdigit (**strptr); + if (j == -1) { + PRINT_ERR ("no integer: skipping range.\n"); + dasd_scan_for_next_comma (strptr); + i = -1; + break; + } + i += j; + (*strptr)++; + if (i > 0xffff) { + PRINT_ERR (" value too big, skipping range.\n"); + dasd_scan_for_next_comma (strptr); + i = -1; + break; + } + } + } + return i; +} + +int +devindex_from_devno (int devno) +{ + int i; + if (dasd_probeonly) { + return 0; + } + for (i = 0; i < dasd_count; i++) { + if (dasd_devno[i] == devno) + return i; + } + if (dasd_autodetect) { + if (dasd_count < DASD_MAX_DEVICES) { + dasd_devno[dasd_count] = devno; + return dasd_count++; + } + return -EOVERFLOW; + } + return -ENODEV; +} + +/* returns 1, if dasd_no is in the specified ranges, otherwise 0 */ +int +dasd_is_accessible (int devno) +{ + return (devindex_from_devno (devno) >= 0); +} + +/* dasd_insert_range skips ranges, if the start or the end is -1 */ +void +dasd_insert_range (int start, int end) +{ + int curr; + if (dasd_count >= DASD_MAX_DEVICES) { + PRINT_ERR (" too many devices specified, ignoring some.\n"); + return; + } + if ((start == -1) || (end == -1)) { + PRINT_ERR + ("invalid format of parameter, skipping range\n"); + return; + } + if (end < start) { + PRINT_ERR (" ignoring range from %x to %x - start value " \ + "must be less than end value.\n", start, end); + return; + } +/* concurrent execution would be critical, but will not occur here */ + for (curr = start; curr <= end; curr++) { + if (dasd_is_accessible (curr)) { + PRINT_WARN (" %x is already in list as device %d\n", + curr, devindex_from_devno (curr)); + } + dasd_devno[dasd_count] = curr; + dasd_count++; + if (dasd_count >= DASD_MAX_DEVICES) { + PRINT_ERR (" too many devices specified, ignoring some.\n"); + break; + } + } + PRINT_INFO (" added dasd range from %x to %x.\n", + start, dasd_devno[dasd_count - 1]); + +} + +void +dasd_setup (char *str, int *ints) +{ + int devno, devno2; + static const char *adstring = "autodetect"; + static const char *prstring = "probeonly"; + if (!strncmp (str, prstring, + MIN (strlen (str), strlen (prstring)))) { + dasd_autodetect = 1; + return; + } + if (!strncmp (str, adstring, + MIN (strlen (str), strlen (adstring)))) { + dasd_autodetect = 1; + dasd_probeonly = 0; + return; + } + dasd_probeonly = 0; + while (*str && *str != 1) { + if (!isxdigit (*str)) { + str++; /* to avoid looping on two commas */ + PRINT_ERR (" kernel parameter in invalid format.\n"); + continue; + } + devno = dasd_get_next_int (&str); + + /* range was skipped? -> scan for comma has been done */ + if (devno == -1) + continue; + + if (*str == ',') { + str++; + dasd_insert_range (devno, devno); + continue; + } + if (*str == '-') { + str++; + devno2 = dasd_get_next_int (&str); + if (devno2 == -1) { + PRINT_ERR (" invalid character in " \ + "kernel parameters."); + } else { + dasd_insert_range (devno, devno2); + } + dasd_scan_for_next_comma (&str); + continue; + } + if (*str == 0) { + dasd_insert_range (devno, devno); + break; + } + PRINT_ERR (" unexpected character in kernel parameter, " \ + "skipping range.\n"); + } +} +#ifdef CONFIG_DASD_MDSK +int dasd_force_mdsk_flag[DASD_MAX_DEVICES]; + +/* + * Parameter parsing function, called from init/main.c + * size : size in kbyte + * offset : offset after which minidisk is available + * blksize : blocksize minidisk is formated + * Format is: mdisk=,,... + */ +void +dasd_mdsk_setup (char *str, int *ints) +{ + int devno, devno2; + int di, i; + + while (*str && *str != 1) { + if (!isxdigit (*str)) { + str++; /* to avoid looping on two commas */ + PRINT_ERR (" kernel parameter in invalid format.\n"); + continue; + } + devno = dasd_get_next_int (&str); + + /* range was skipped? -> scan for comma has been done */ + if (devno == -1) + continue; + + if (*str == ',') { + str++; + di = devindex_from_devno (devno); + if (di >= DASD_MAX_DEVICES) { + return; + } else if (di < 0) + dasd_insert_range (devno, devno); + dasd_force_mdsk_flag[di] = 1; + continue; + } + if (*str == '-') { + str++; + devno2 = dasd_get_next_int (&str); + if (devno2 == -1) { + PRINT_ERR (" invalid character in " \ + "kernel parameters."); + } else { + for (i = devno; i <= devno2; i++) { + di = devindex_from_devno (i); + if (di >= DASD_MAX_DEVICES) { + return; + } else if (di < 0) + dasd_insert_range (i, i); + dasd_force_mdsk_flag[di] = 1; + } + } + dasd_scan_for_next_comma (&str); + continue; + } + if (*str == 0) { + di = devindex_from_devno (devno); + if (di >= DASD_MAX_DEVICES) { + return; + } else if (di < 0) + dasd_insert_range (devno, devno); + dasd_force_mdsk_flag[di] = 1; + break; + } + PRINT_ERR (" unexpected character in kernel parameter, " \ + "skipping range.\n"); + } +} +#endif + +#ifdef MODULE +int +dasd_parse_module_params (void) +{ + while (dasd) + dasd_setup (dasd, NULL); +#ifdef CONFIG_DASD_MDSK + while (dasd_force_mdsk) + dasd_mdsk_setup (dasd_force_mdsk, NULL); +#endif +} +#endif diff -urN v2.2.15/linux/drivers/s390/block/dasd_types.h linux/drivers/s390/block/dasd_types.h --- v2.2.15/linux/drivers/s390/block/dasd_types.h Wed May 3 17:16:43 2000 +++ linux/drivers/s390/block/dasd_types.h Wed Jun 7 14:26:43 2000 @@ -1,3 +1,4 @@ + /* * File...........: linux/drivers/s390/block/dasd_types.h * Author.........: Holger Smolinski @@ -21,12 +22,22 @@ #ifndef DASD_TYPES_H #define DASD_TYPES_H -#include "dasd.h" +#include #include +#include + #include +#include "dasd_mdsk.h" + +#define ACS(where,from,to) if (atomic_compare_and_swap (from, to, &where)) {\ + PRINT_WARN ("%s/%d atomic %s from %d(%s) to %d(%s) failed, was %d\n",\ + __FILE__,__LINE__,#where,from,#from,to,#to,\ + atomic_read (&where));\ + atomic_set(&where,to);} + #define CCW_DEFINE_EXTENT 0x63 #define CCW_LOCATE_RECORD 0x43 #define CCW_READ_DEVICE_CHARACTERISTICS 0x64 @@ -34,15 +45,19 @@ typedef enum { dasd_none = -1, +#ifdef CONFIG_DASD_ECKD + dasd_eckd, +#endif /* CONFIG_DASD_ECKD */ #ifdef CONFIG_DASD_FBA dasd_fba, #endif /* CONFIG_DASD_FBA */ +#ifdef CONFIG_DASD_MDSK + dasd_mdsk, +#endif /* CONFIG_DASD_MDSK */ #ifdef CONFIG_DASD_CKD dasd_ckd, #endif /* CONFIG_DASD_CKD */ -#ifdef CONFIG_DASD_ECKD - dasd_eckd -#endif /* CONFIG_DASD_ECKD */ + dasd_end } dasd_type_t; typedef @@ -158,6 +173,32 @@ dasd_eckd_characteristics_t; +typedef struct { + u16 dev_nr; + u16 rdc_len; + u8 vdev_class; + u8 vdev_type; + u8 vdev_status; + u8 vdev_flags; + u8 rdev_class; + u8 rdev_type; + u8 rdev_model; + u8 rdev_features; +} __attribute__ ((packed, aligned (32))) + +dasd_mdsk_characteristics_t; + +/* eckd count area */ +typedef struct { + __u16 cyl; + __u16 head; + __u8 record; + __u8 kl; + __u16 dl; +} __attribute__ ((packed)) + +eckd_count_t; + #ifdef CONFIG_DASD_CKD struct dasd_ckd_characteristics { char info[64]; @@ -165,13 +206,6 @@ #endif /* CONFIG_DASD_CKD */ -#ifdef CONFIG_DASD_ECKD -struct dasd_eckd_characteristics { - char info[64]; -}; - -#endif /* CONFIG_DASD_ECKD */ - typedef union { char __attribute__ ((aligned (32))) bytes[64]; @@ -184,6 +218,9 @@ #ifdef CONFIG_DASD_ECKD dasd_eckd_characteristics_t eckd; #endif /* CONFIG_DASD_ECKD */ +#ifdef CONFIG_DASD_MDSK + dasd_mdsk_characteristics_t mdsk; +#endif /* CONFIG_DASD_ECKD */ } __attribute__ ((aligned (32))) dasd_characteristics_t; @@ -193,10 +230,10 @@ #define CQR_STATUS_QUEUED 0x02 #define CQR_STATUS_IN_IO 0x04 #define CQR_STATUS_DONE 0x08 -#define CQR_STATUS_RETRY 0x10 -#define CQR_STATUS_ERROR 0x20 -#define CQR_STATUS_FAILED 0x40 -#define CQR_STATUS_SLEEP 0x80 +#define CQR_STATUS_ERROR 0x10 +#define CQR_STATUS_ERP_PEND 0x20 +#define CQR_STATUS_ERP_ACTIVE 0x40 +#define CQR_STATUS_FAILED 0x80 #define CQR_FLAGS_SLEEP 0x01 #define CQR_FLAGS_WAIT 0x02 @@ -225,6 +262,7 @@ spinlock_t lock; int options; } __attribute__ ((packed)) + cqr_t; typedef @@ -234,12 +272,13 @@ unsigned int bp_block; unsigned int blocks; unsigned int s2b_shift; - unsigned int b2k_shift; - unsigned int first_sector; + unsigned int label_block; } dasd_sizes_t; #define DASD_CHANQ_ACTIVE 0x01 #define DASD_CHANQ_BUSY 0x02 +#define DASD_REQUEST_Q_BROKEN 0x04 + typedef struct dasd_chanq_t { volatile cqr_t *head; @@ -248,10 +287,18 @@ spinlock_t f_lock; /* lock for flag operations */ int queued_requests; atomic_t flags; + atomic_t dirty_requests; struct dasd_chanq_t *next_q; /* pointer to next queue */ } __attribute__ ((packed, aligned (16))) + dasd_chanq_t; +#define DASD_INFO_STATUS_UNKNOWN 0x00 /* nothing known about DASD */ +#define DASD_INFO_STATUS_DETECTED 0x01 /* DASD identified as DASD, irq taken */ +#define DASD_INFO_STATUS_ANALYSED 0x02 /* first block read, filled sizes */ +#define DASD_INFO_STATUS_FORMATTED 0x04 /* identified valid format */ +#define DASD_INFO_STATUS_PARTITIONED 0x08 /* identified partitions */ + typedef struct dasd_information_t { devstat_t dev_status; @@ -264,38 +311,49 @@ int open_count; spinlock_t lock; struct semaphore sem; - unsigned long flags; + atomic_t status; int irq; + mdsk_setup_data_t *mdsk_setup; struct proc_dir_entry *proc_device; union { struct { + eckd_count_t count_data; + } eckd; + struct { char dummy; } fba; struct { + mdsk_init_io_t iib; + mdsk_rw_io_t iob; + mdsk_setup_data_t setup; + long *label; + } mdsk; + struct { char dummy; } ckd; - struct { - int blk_per_trk; - } eckd; } private; + struct wait_queue *wait_q; } dasd_information_t; -typedef struct { - int start_unit; - int stop_unit; - int blksize; -} format_data_t; +extern dasd_information_t *dasd_info[]; + +#include "dasd_erp.h" typedef struct { int (*ck_devinfo) (dev_info_t *); cqr_t *(*get_req_ccw) (int, struct request *); - cqr_t *(*rw_label) (int, int, char *); int (*ck_characteristics) (dasd_characteristics_t *); - int (*fill_sizes) (int); + cqr_t *(*fill_sizes_first) (int); + int (*fill_sizes_last) (int); int (*dasd_format) (int, format_data_t *); + void (*fill_geometry) (int, struct hd_geometry *); + dasd_era_t (*erp_examine) (cqr_t *, devstat_t *); } dasd_operations_t; -extern dasd_information_t *dasd_info[]; +extern dasd_operations_t *dasd_disciplines[]; + +/* Prototypes */ +int dasd_start_IO (cqr_t * cqr); #endif /* DASD_TYPES_H */ diff -urN v2.2.15/linux/drivers/s390/block/mdisk.c linux/drivers/s390/block/mdisk.c --- v2.2.15/linux/drivers/s390/block/mdisk.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/block/mdisk.c Wed Jun 7 14:26:43 2000 @@ -38,6 +38,7 @@ /* Added statement HSM 12/03/99 */ #include +#include #define MAJOR_NR MDISK_MAJOR /* force definitions on in blk.h */ @@ -637,7 +638,7 @@ * queues and marks a bottom half. * */ -void do_mdisk_interrupt(void) +void do_mdisk_interrupt(struct pt_regs *regs, __u16 code) { u16 code; mdisk_Dev *dev; @@ -713,7 +714,7 @@ ,MAJOR_NR); return MAJOR_NR; } - + register_external_interrupt(0x2603,do_mdisk_interrupt); /* * setup global major dependend structures */ diff -urN v2.2.15/linux/drivers/s390/block/xpram.c linux/drivers/s390/block/xpram.c --- v2.2.15/linux/drivers/s390/block/xpram.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/block/xpram.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,1037 @@ + +/* + * xpram.c -- the S/390 expanded memory RAM-disk + * + * significant parts of this code are based on + * the sbull device driver presented in + * A. Rubini: Linux Device Drivers + * + * Author of XPRAM specific coding: Reinhard Buendgen + * buendgen@de.ibm.com + * + * External interfaces: + * Interfaces to linux kernel + * xpram_setup: read kernel parameters (see init/main.c) + * xpram_init: initialize device driver (see drivers/block/ll_rw_blk.c) + * Module interfaces + * init_module + * cleanup_module + * Device specific file operations + * xpram_iotcl + * xpram_open + * xpram_release + * + * "ad-hoc" partitioning: + * the expanded memory can be partitioned among several devices + * (with different minors). The partitioning set up can be + * set by kernel or module parameters (int devs & int sizes[]) + * + * module parameters: devs= and sizes= + * kernel parameters: xpram_parts= + * note: I did not succeed in parsing numbers + * for module parameters of type string "s" ?!? + * + * Other kenel files/modules affected(gerp for "xpram" or "XPRAM": + * drivers/s390/block/Config.in + * drivers/s390/block/Makefile + * include/linux/blk.h + * include/linux/major.h + * init/main.c + * drivers/block/s390/block/ll_rw_blk.c + * + * + * Potential future improvements: + * request clustering: first coding started not yet tested or integrated + * I doubt that it really pays off + * generic hard disk support to replace ad-hoc partitioning + * + * Tested with 2.2.14 (under VM) + */ + + +#ifdef MODULE +# ifndef __KERNEL__ +# define __KERNEL__ +# endif +# define __NO_VERSION__ /* don't define kernel_version in module.h */ +#endif /* MODULE */ + +#include +#include + +#ifdef MODULE +char kernel_version [] = UTS_RELEASE; +#endif + +#include +#include /* printk() */ +#include /* kmalloc() */ +#include /* everything... */ +#include /* error codes */ +#include +#include /* size_t */ +#include /* isdigit, isxdigit */ +#include /* O_ACCMODE */ +#include /* HDIO_GETGEO */ + +#include /* cli(), *_flags */ +#include /* put_user */ + +/* + define the debug levels: + - 0 No debugging output to console or syslog + - 1 Log internal errors to syslog, ignore check conditions + - 2 Log internal errors and check conditions to syslog + - 3 Log internal errors to console, log check conditions to syslog + - 4 Log internal errors and check conditions to console + - 5 panic on internal errors, log check conditions to console + - 6 panic on both, internal errors and check conditions + */ +#define XPRAM_DEBUG 4 + +#define PRINTK_HEADER XPRAM_NAME + +#if XPRAM_DEBUG > 0 +#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER "debug:" x ) +#define PRINT_INFO(x...) printk ( KERN_INFO PRINTK_HEADER "info:" x ) +#define PRINT_WARN(x...) printk ( KERN_WARNING PRINTK_HEADER "warning:" x ) +#define PRINT_ERR(x...) printk ( KERN_ERR PRINTK_HEADER "error:" x ) +#define PRINT_FATAL(x...) panic ( PRINTK_HEADER "panic:"x ) +#else +#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER "debug:" x ) +#define PRINT_INFO(x...) printk ( KERN_DEBUG PRINTK_HEADER "info:" x ) +#define PRINT_WARN(x...) printk ( KERN_DEBUG PRINTK_HEADER "warning:" x ) +#define PRINT_ERR(x...) printk ( KERN_DEBUG PRINTK_HEADER "error:" x ) +#define PRINT_FATAL(x...) printk ( KERN_DEBUG PRINTK_HEADER "panic:" x ) +#endif + +#define MAJOR_NR xpram_major /* force definitions on in blk.h */ +int xpram_major; /* must be declared before including blk.h */ + + +#define DEVICE_NR(device) MINOR(device) /* xpram has no partition bits */ +#define DEVICE_NAME "xpram" /* name for messaging */ +#define DEVICE_INTR xpram_intrptr /* pointer to the bottom half */ +#define DEVICE_NO_RANDOM /* no entropy to contribute */ + + +#define DEVICE_OFF(d) /* do-nothing */ + +#define DEVICE_REQUEST *xpram_dummy_device_request /* dummy function variable + * to prevent warnings + */ + +#include + +#include "xpram.h" /* local definitions */ + +/* + * Non-prefixed symbols are static. They are meant to be assigned at + * load time. Prefixed symbols are not static, so they can be used in + * debugging. They are hidden anyways by register_symtab() unless + * XPRAM_DEBUG is defined. + */ + +static int major = XPRAM_MAJOR; +static int devs = XPRAM_DEVS; +static int rahead = XPRAM_RAHEAD; +static int sizes[XPRAM_MAX_DEVS] = { 0, }; +static int blksize = XPRAM_BLKSIZE; +static int hardsect = XPRAM_HARDSECT; + +int xpram_devs, xpram_rahead; +int xpram_blksize, xpram_hardsect; +int xpram_mem_avail = 0; +int xpram_sizes[XPRAM_MAX_DEVS]; + + +MODULE_PARM(devs,"i"); +MODULE_PARM(sizes,"1-" __MODULE_STRING(XPRAM_MAX_DEVS) "i"); + +MODULE_PARM_DESC(devs, "number of devices (\"partitions\"), " \ + "the default is " __MODULE_STRING(XPRAM_DEVS) "\n"); +MODULE_PARM_DESC(sizes, "list of device (partition) sizes " \ + "the defaults are 0s \n" \ + "All devices with size 0 equally partition the " + "remaining space on the expanded strorage not " + "claimed by explicit sizes\n"); + + + +/* The following items are obtained through kmalloc() in init_module() */ + +Xpram_Dev *xpram_devices = NULL; +int *xpram_blksizes = NULL; +int *xpram_hardsects = NULL; +int *xpram_offsets = NULL; /* partition offsets */ + +#define MIN(x,y) ((x) < (y) ? (x) : (y)) +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + +/* + * compute nearest multiple of 4 , argument must be non-negative + * the macros used depends on XPRAM_KB_IN_PG = 4 + */ + +#define NEXT4(x) ((x & 0x3) ? (x+4-(x &0x3)) : (x)) /* increment if needed */ +#define LAST4(x) ((x & 0x3) ? (x-4+(x & 0x3)) : (x)) /* decrement if needed */ + +#if 0 /* this is probably not faster than the previous code */ +#define NEXT4(x) ((((x-1)>>2)>>2)+4) /* increment if needed */ +#define LAST4(x) (((x+3)>>2)<<2) /* decrement if needed */ +#endif + +/* integer formats */ +#define XPRAM_INVALF -1 /* invalid */ +#define XPRAM_HEXF 0 /* hexadecimal */ +#define XPRAM_DECF 1 /* decimal */ + +/* + * parsing operations (needed for kernel parameter parsing) + */ + +/* ------------------------------------------------------------------------- + * sets the string pointer after the next comma + * + * argument: strptr pointer to string + * side effect: strptr points to endof string or to position of the next + * comma + * ------------------------------------------------------------------------*/ +static void +xpram_scan_to_next_comma (char **strptr) +{ + while ( ((**strptr) != ',') && (**strptr) ) + (*strptr)++; +} + +/* ------------------------------------------------------------------------- + * interpret character as hex-digit + * + * argument: c charcter + * result: c interpreted as hex-digit + * note: can be used to read digits for any base <= 16 + * ------------------------------------------------------------------------*/ +static int +xpram_get_hexdigit (char c) +{ + if ((c >= '0') && (c <= '9')) + return c - '0'; + if ((c >= 'a') && (c <= 'f')) + return c + 10 - 'a'; + if ((c >= 'A') && (c <= 'F')) + return c + 10 - 'A'; + return -1; +} + +/*-------------------------------------------------------------------------- + * Check format of unsigned integer + * + * Argument: strptr pointer to string + * result: -1 if strptr does not start with a digit + * (does not start an integer) + * 0 if strptr starts a positive hex-integer with "0x" + * 1 if strptr start a positive decimal integer + * + * side effect: if strptr start a positive hex-integer then strptr is + * set to the character after the "0x" + *-------------------------------------------------------------------------*/ +static int +xpram_int_format(char **strptr) +{ + if ( !isdigit(**strptr) ) + return XPRAM_INVALF; + if ( (**strptr == '0') + && ( (*((*strptr)+1) == 'x') || (*((*strptr) +1) == 'X') ) + && isdigit(*((*strptr)+3)) ) { + *strptr=(*strptr)+2; + return XPRAM_HEXF; + } else return XPRAM_DECF; +} + +/*-------------------------------------------------------------------------- + * Read non-negative decimal integer + * + * Argument: strptr pointer to string starting with a non-negative integer + * in decimal format + * result: the value of theinitial integer pointed to by strptr + * + * side effect: strptr is set to the first character following the integer + *-------------------------------------------------------------------------*/ + +static int +xpram_read_decint (char ** strptr) +{ + int res=0; + while ( isdigit(**strptr) ) { + res = (res*10) + xpram_get_hexdigit(**strptr); + (*strptr)++; + } + return res; +} + +/*-------------------------------------------------------------------------- + * Read non-negative hex-integer + * + * Argument: strptr pointer to string starting with a non-negative integer + * in hexformat (without "0x" prefix) + * result: the value of the initial integer pointed to by strptr + * + * side effect: strptr is set to the first character following the integer + *-------------------------------------------------------------------------*/ + +static int +xpram_read_hexint (char ** strptr) +{ + int res=0; + while ( isxdigit(**strptr) ) { + res = (res<<4) + xpram_get_hexdigit(**strptr); + (*strptr)++; + } + return res; +} +/*-------------------------------------------------------------------------- + * Read non-negative integer + * + * Argument: strptr pointer to string starting with a non-negative integer + (either in decimal- or in hex-format + * result: the value of the initial integer pointed to by strptr + * in case of a parsing error the result is -EINVAL + * + * side effect: strptr is set to the first character following the integer + *-------------------------------------------------------------------------*/ + +static int +xpram_read_int (char ** strptr) +{ + switch ( xpram_int_format(strptr) ) { + case XPRAM_INVALF: return -EINVAL; + case XPRAM_HEXF: return xpram_read_hexint(strptr); + case XPRAM_DECF: return xpram_read_decint(strptr); + default: return -EINVAL; + } +} + +/*-------------------------------------------------------------------------- + * Read size + * + * Argument: strptr pointer to string starting with a non-negative integer + * followed optionally by a size modifier: + * k or K for kilo (default), + * m or M for mega + * g or G for giga + * result: the value of the initial integer pointed to by strptr + * multiplied by the modifier value devided by 1024 + * in case of a parsing error the result is -EINVAL + * + * side effect: strptr is set to the first character following the size + *-------------------------------------------------------------------------*/ + +static int +xpram_read_size (char ** strptr) +{ + int res; + + res=xpram_read_int(strptr); + if ( res < 0 )return res; + switch ( **strptr ) { + case 'g': + case 'G': res=res*1024; + case 'm': + case 'M': res=res*1024; + case 'k' : + case 'K' : (* strptr)++; + } + + return res; +} + + +/*-------------------------------------------------------------------------- + * Read tail of comma separated size list ",i1,i2,...,in" + * + * Arguments:strptr pointer to string. It is assumed that the string has + * the format (",")* + * maxl integer describing the maximal number of elements in the + list pointed to by strptr, max must be > 0. + * ilist array of dimension >= maxl of integers to be modified + * + * result: -EINVAL if the list is longer than maxl + * 0 otherwise + * + * side effects: for j=1,...,n ilist[ij] is set to the value of ij if it is + * a valid non-negative integer and to -EINVAL otherwise + * if no comma is found where it is expected an entry in + * ilist is set to -EINVAL + *-------------------------------------------------------------------------*/ +static int +xpram_read_size_list_tail (char ** strptr, int maxl, int * ilist) +{ + int i=0; + char *str = *strptr; + int res=0; + + while ( (*str == ',') && (i < maxl) ) { + str++; + ilist[i] = xpram_read_size(&str); + if ( ilist[i] == -EINVAL ) { + xpram_scan_to_next_comma(&str); + res = -EINVAL; + } + i++; + } + return res; +#if 0 /* be lenient about trailing stuff */ + if ( *str != 0 && *str != ' ' ) { + ilist[MAX(i-1,0)] = -EINVAL; + return -EINVAL; + } else return 0; +#endif +} + + +/* + * expanded memory operations + */ + + +/*--------------------------------------------------------------------*/ +/* Copy expanded memory page (4kB) into main memory */ +/* Arguments */ +/* page_addr: address of target page */ +/* xpage_index: index of expandeded memory page */ +/* Return value */ +/* 0: if operation succeeds */ +/* non-0: otherwise */ +/*--------------------------------------------------------------------*/ +long xpram_page_in (unsigned long page_addr, unsigned long xpage_index) +{ + long cc=0; + unsigned long real_page_addr = __pa(page_addr); + __asm__ __volatile__ ( + " lr 1,%1 \n" /* r1 = real_page_addr */ + " lr 2,%2 \n" /* r2 = xpage_index */ + " .long 0xb22e0012 \n" /* pgin r1,r2 */ + /* copy page from expanded memory */ + "0: ipm %0 \n" /* save status (cc & program mask */ + " srl %0,28(0) \n" /* cc into least significant bits */ + "1: \n" /* we are done */ + ".section .fixup,\"ax\"\n" /* start of fix up section */ + "2: lhi %0,2 \n" /* return unused condition code 2 */ + " bras 1,3f \n" /* safe label 1: in r1 and goto 3 */ + " .long 1b \n" /* literal containing label 1 */ + "3: l 1,0(1) \n" /* load label 1 address into r1 */ + " br 1 \n" /* goto label 1 (across sections) */ + ".previous \n" /* back in text section */ + ".section __ex_table,\"a\"\n" /* start __extable */ + " .align 4 \n" + " .long 0b,2b \n" /* failure point 0, fixup code 2 */ + ".previous \n" + : "=d" (cc) : "d" (real_page_addr), "d" (xpage_index) : "cc", "1", "2" + ); + switch (cc) { + case 0: return 0; + case 1: return -EIO; + case 2: return -ENXIO; + case 3: return -ENXIO; + default: return -EIO; /* should not happen */ + }; +} + +/*--------------------------------------------------------------------*/ +/* Copy a 4kB page of main memory to an expanded memory page */ +/* Arguments */ +/* page_addr: address of source page */ +/* xpage_index: index of expandeded memory page */ +/* Return value */ +/* 0: if operation succeeds */ +/* non-0: otherwise */ +/*--------------------------------------------------------------------*/ +long xpram_page_out (unsigned long page_addr, unsigned long xpage_index) +{ + long cc=0; + unsigned long real_page_addr = __pa(page_addr); + __asm__ __volatile__ ( + " lr 1,%1 \n" /* r1 = mem_page */ + " lr 2,%2 \n" /* r2 = rpi */ + " .long 0xb22f0012 \n" /* pgout r1,r2 */ + /* copy page from expanded memory */ + "0: ipm %0 \n" /* save status (cc & program mask */ + " srl %0,28(0) \n" /* cc into least significant bits */ + "1: \n" /* we are done */ + ".section .fixup,\"ax\"\n" /* start of fix up section */ + "2: lhi %0,2 \n" /* return unused condition code 2 */ + " bras 1,3f \n" /* safe label 1: in r1 and goto 3 */ + " .long 1b \n" /* literal containing label 1 */ + "3: l 1,0(1) \n" /* load label 1 address into r1 */ + " br 1 \n" /* goto label 1 (across sections) */ + ".previous \n" /* back in text section */ + ".section __ex_table,\"a\"\n" /* start __extable */ + " .align 4 \n" + " .long 0b,2b \n" /* failure point 0, fixup code 2 */ + ".previous \n" + : "=d" (cc) : "d" (real_page_addr), "d" (xpage_index) : "cc", "1", "2" + ); + switch (cc) { + case 0: return 0; + case 1: return -EIO; + case 2: { PRINT_ERR("expanded storage lost!\n"); return -ENXIO; } + case 3: return -ENXIO; + default: return -EIO; /* should not happen */ + } +} + +/*--------------------------------------------------------------------*/ +/* Measure expanded memory */ +/* Return value */ +/* size of expanded memory in kB (must be a multipe of 4) */ +/*--------------------------------------------------------------------*/ +int xpram_size(void) +{ + long cc=0; + unsigned long base=0; + unsigned long po, pi, rpi; /* page index order, page index */ + + unsigned long mem_page = __get_free_page(GFP_KERNEL); + + /* for po=0,1,2,... try to move in page number base+(2^po)-1 */ + pi=1; + for (po=0; po <= 32; po++) { /* pi = 2^po */ + cc=xpram_page_in(mem_page,base+pi-1); + if ( cc ) break; + pi <<= 1; + } + if ( cc && (po < 31 ) ) { + pi >>=1; + base += pi; + pi >>=1; + for ( ; pi > 0; pi >>= 1) { + rpi = pi - 1; + cc=xpram_page_in(mem_page,base+rpi); + if ( !cc ) base += pi; + } + } + + free_page (mem_page); + + if ( cc && (po < 31) ) + return (XPRAM_KB_IN_PG * base); + else /* return maximal value possible */ + return INT_MAX; +} + +/* + * Open and close + */ + +int xpram_open (struct inode *inode, struct file *filp) +{ + Xpram_Dev *dev; /* device information */ + int num = MINOR(inode->i_rdev); + + + if (num >= xpram_devs) return -ENODEV; + dev = xpram_devices + num; + + PRINT_DEBUG("calling xpram_open for device %d (size %dkB, usage: %d)\n", num,dev->size,atomic_read(&(dev->usage))); + + atomic_inc(&(dev->usage)); + MOD_INC_USE_COUNT; + return 0; /* success */ +} + +int xpram_release (struct inode *inode, struct file *filp) +{ + Xpram_Dev *dev = xpram_devices + MINOR(inode->i_rdev); + + PRINT_DEBUG("calling xpram_release for device %d (size %dkB, usage: %d)\n",MINOR(inode->i_rdev) ,dev->size,atomic_read(&(dev->usage))); + + /* + * If the device is closed for the last time, start a timer + * to release RAM in half a minute. The function and argument + * for the timer have been setup in init_module() + */ + if (!atomic_dec_return(&(dev->usage))) { + /* but flush it right now */ + fsync_dev(inode->i_rdev); + invalidate_buffers(inode->i_rdev); + } + MOD_DEC_USE_COUNT; + return(0); +} + + +/* + * The ioctl() implementation + */ + +int xpram_ioctl (struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + int err, size; + struct hd_geometry *geo = (struct hd_geometry *)arg; + + PRINT_DEBUG("ioctl 0x%x 0x%lx\n", cmd, arg); + switch(cmd) { + + case BLKGETSIZE: /* 0x1260 */ + /* Return the device size, expressed in sectors */ + if (!arg) return -EINVAL; /* NULL pointer: not valid */ + err= 0; /* verify_area_20(VERIFY_WRITE, (long *) arg, sizeof(long)); + * if (err) return err; + */ + put_user ( 1024* xpram_sizes[MINOR(inode->i_rdev)] + / XPRAM_SOFTSECT, + (long *) arg); + return 0; + + case BLKFLSBUF: /* flush, 0x1261 */ + fsync_dev(inode->i_rdev); + if ( suser() )invalidate_buffers(inode->i_rdev); + return 0; + + case BLKRAGET: /* return the readahead value, 0x1263 */ + if (!arg) return -EINVAL; + err = 0; /* verify_area_20(VERIFY_WRITE, (long *) arg, sizeof(long)); + * if (err) return err; + */ + put_user(read_ahead[MAJOR(inode->i_rdev)], (long *)arg); + + return 0; + + case BLKRASET: /* set the readahead value, 0x1262 */ + if (!suser()) return -EACCES; + if (arg > 0xff) return -EINVAL; /* limit it */ + read_ahead[MAJOR(inode->i_rdev)] = arg; + atomic_eieio(); + return 0; + + case BLKRRPART: /* re-read partition table: can't do it, 0x1259 */ + return -EINVAL; + + RO_IOCTLS(inode->i_rdev, arg); /* the default RO operations + * BLKROSET + * BLKROGET + */ + + case HDIO_GETGEO: + /* + * get geometry: we have to fake one... trim the size to a + * multiple of 64 (32k): tell we have 16 sectors, 4 heads, + * whatever cylinders. Tell also that data starts at sector. 4. + */ + size = xpram_mem_avail * 1024 / XPRAM_SOFTSECT; + /* size = xpram_mem_avail * 1024 / xpram_hardsect; */ + size &= ~0x3f; /* multiple of 64 */ + if (geo==NULL) return -EINVAL; + /* + * err=verify_area_20(VERIFY_WRITE, geo, sizeof(*geo)); + * if (err) return err; + */ + + put_user(size >> 6, &geo->cylinders); + put_user( 4, &geo->heads); + put_user( 16, &geo->sectors); + put_user( 4, &geo->start); + + return 0; + } + + return -EINVAL; /* unknown command */ +} + +/* + * The file operations + */ + +struct file_operations xpram_fops = { + NULL, /* lseek: default */ + block_read, + block_write, + NULL, /* xpram_readdir */ + NULL, /* xpram_select */ + xpram_ioctl, + NULL, /* xpram_mmap */ + xpram_open, + NULL, /* flush */ + xpram_release, + block_fsync, + NULL, /* xpram_fasync */ + NULL, + NULL +}; + +/* + * Block-driver specific functions + */ + +void xpram_request(void) +{ + Xpram_Dev *device; + /* u8 *ptr; */ + /* int size; */ + unsigned long page_no; /* expanded memory page number */ + unsigned long sects_to_copy; /* number of sectors to be copied */ + char * buffer; /* local pointer into buffer cache */ + int dev_no; /* device number of request */ + int fault; /* faulty access to expanded memory */ + + while(1) { + INIT_REQUEST; + + fault=0; + dev_no = DEVICE_NR(CURRENT_DEV); + /* Check if the minor number is in range */ + if ( dev_no > xpram_devs ) { + static int count = 0; + if (count++ < 5) /* print the message at most five times */ + PRINT_WARN(" request for unknown device\n"); + end_request(0); + continue; + } + + /* pointer to device structure, from the global array */ + device = xpram_devices + dev_no; + sects_to_copy = CURRENT->current_nr_sectors; + /* does request exceed size of device ? */ + if ( XPRAM_SEC2KB(sects_to_copy) > xpram_sizes[dev_no] ) { + PRINT_WARN(" request past end of device\n"); + end_request(0); + continue; + } + + /* Does request start at page boundery? -- paranoia */ +#if 0 + PRINT_DEBUG(" req %lx, sect %lx, to copy %lx, buf addr %lx\n", (unsigned long) CURRENT, CURRENT->sector, sects_to_copy, (unsigned long) CURRENT->buffer); +#endif + buffer = CURRENT->buffer; +#if XPRAM_SEC_IN_PG != 1 + /* Does request start at an expanded storage page boundery? */ + if ( CURRENT->sector & (XPRAM_SEC_IN_PG - 1) ) { + PRINT_WARN(" request does not start at an expanded storage page boundery\n"); + PRINT_WARN(" referenced sector: %ld\n",CURRENT->sector); + end_request(0); + continue; + } + /* Does request refere to partial expanded storage pages? */ + if ( sects_to_copy & (XPRAM_SEC_IN_PG - 1) ) { + PRINT_WARN(" request referes to a partial expanded storage page\n"); + end_request(0); + continue; + } +#endif /* XPRAM_SEC_IN_PG != 1 */ + /* Is request buffer aligned with kernel pages? */ + if ( ((unsigned long)buffer) & (XPRAM_PGSIZE-1) ) { + PRINT_WARN(" request buffer is not aligned with kernel pages\n"); + end_request(0); + continue; + } + + /* which page of expanded storage is affected first? */ + page_no = (xpram_offsets[dev_no] >> XPRAM_KB_IN_PG_ORDER) + + (CURRENT->sector >> XPRAM_SEC_IN_PG_ORDER); + +#if 0 + PRINT_DEBUG("request: %d ( dev %d, copy %d sectors, at page %d ) \n", CURRENT->cmd,dev_no,sects_to_copy,page_no); +#endif + + switch(CURRENT->cmd) { + case READ: + do { + if ( (fault=xpram_page_in((unsigned long)buffer,page_no)) ) { + PRINT_WARN("xpram(dev %d): page in failed for page %ld.\n",dev_no,page_no); + break; + } + sects_to_copy -= XPRAM_SEC_IN_PG; + buffer += XPRAM_PGSIZE; + page_no++; + } while ( sects_to_copy > 0 ); + break; + case WRITE: + do { + if ( (fault=xpram_page_out((unsigned long)buffer,page_no)) + ) { + PRINT_WARN("xpram(dev %d): page out failed for page %ld.\n",dev_no,page_no); + break; + } + sects_to_copy -= XPRAM_SEC_IN_PG; + buffer += XPRAM_PGSIZE; + page_no++; + } while ( sects_to_copy > 0 ); + break; + default: + /* can't happen */ + end_request(0); + continue; + } + if ( fault ) end_request(0); + else end_request(1); /* success */ + } +} + +/* + * Kernel interfaces + */ + +/* + * Parses the kernel parameters given in the kernel parameter line. + * The expected format is + * [","]* + * where + * devices is a positive integer that initializes xpram_devs + * each size is a non-negative integer possibly followed by a + * magnitude (k,K,m,M,g,G), the list of sizes initialises + * xpram_sizes + * + * Arguments + * str: substring of kernel parameter line that contains xprams + * kernel parameters. + * ints: not used + * + * Side effects + * the global variabls devs is set to the value of + * and sizes[i] is set to the i-th + * partition size (if provided). A parsing error of a value + * results in this value being set to -EINVAL. + */ +void xpram_setup (char *str, int *ints) +{ + devs = xpram_read_int(&str); + if ( devs != -EINVAL ) + if ( xpram_read_size_list_tail(&str,devs,sizes) < 0 ) + PRINT_ERR("error while reading xpram parameters.\n"); +} + +/* + * initialize xpram device driver + * + * Result: 0 ok + * negative number: negative error code + */ + +int xpram_init(void) +{ + int result, i; + int mem_usable; /* net size of expanded memory */ + int mem_needed=0; /* size of expanded memory needed to fullfill + * requirements of non-zero parameters in sizes + */ + + int mem_auto_no=0; /* number of (implicit) zero parameters in zises */ + int mem_auto; /* automatically determined device size */ + + /* + * Copy the (static) cfg variables to public prefixed ones to allow + * snoozing with a debugger. + */ + + xpram_rahead = rahead; + xpram_blksize = blksize; + xpram_hardsect = hardsect; + + PRINT_INFO("initializing: %s\n",""); + /* check arguments */ + xpram_major = major; + if ( (devs <= 0) || (devs > XPRAM_MAX_DEVS) ) { + PRINT_ERR("invalid number %d of devices\n",devs); + PRINT_ERR("Giving up xpram\n"); + return -EINVAL; + } + xpram_devs = devs; + for (i=0; i < xpram_devs; i++) { + if ( sizes[i] < 0 ) { + PRINT_ERR("Invalid partition size %d kB\n",xpram_sizes[i]); + PRINT_ERR("Giving up xpram\n"); + return -EINVAL; + } else { + xpram_sizes[i] = NEXT4(sizes[i]); /* page align */ + if ( sizes[i] ) mem_needed += xpram_sizes[i]; + else mem_auto_no++; + } + } + + PRINT_DEBUG(" major %d \n", xpram_major); + PRINT_INFO(" number of devices (partitions): %d \n", xpram_devs); + for (i=0; i < xpram_devs; i++) { + if ( sizes[i] ) + PRINT_INFO(" size of partition %d: %d kB\n", i, xpram_sizes[i]); + else + PRINT_INFO(" size of partition %d to be set automatically\n",i); + } + PRINT_DEBUG(" memory needed (for sized partitions): %d kB\n", mem_needed); + PRINT_DEBUG(" partitions to be sized automaticallys: %d\n", mem_auto_no); + +#if 0 + /* Hardsect can't be changed :( */ + /* I try it any way. Yet I must distinguish + * between hardsects (to be changed to 4096) + * and soft sectors, hard-coded for buffer + * sizes within the requests + */ + if (hardsect != 512) { + PRINT_ERR("Can't change hardsect size\n"); + hardsect = xpram_hardsect = 512; + } +#endif + PRINT_INFO(" hardsector size: %dB \n",xpram_hardsect); + + /* + * Register your major, and accept a dynamic number + */ + result = register_blkdev(xpram_major, "xpram", &xpram_fops); + if (result < 0) { + PRINT_ERR("Can't get major %d\n",xpram_major); + PRINT_ERR("Giving up xpram\n"); + return result; + } + if (xpram_major == 0) xpram_major = result; /* dynamic */ + major = xpram_major; /* Use `major' later on to save typing */ + + result = -ENOMEM; /* for the possible errors */ + + /* + * measure expanded memory + */ + + xpram_mem_avail = xpram_size(); + if (!xpram_mem_avail) { + PRINT_ERR("No or not enough expanded memory available\n"); + PRINT_ERR("Giving up xpram\n"); + result = -ENODEV; + goto fail_malloc; + } + PRINT_INFO(" %d kB expanded memory found.\n",xpram_mem_avail ); + + /* + * Assign the other needed values: request, rahead, size, blksize, + * hardsect. All the minor devices feature the same value. + * Note that `xpram' defines all of them to allow testing non-default + * values. A real device could well avoid setting values in global + * arrays if it uses the default values. + */ + + blk_dev[major].request_fn = xpram_request; + read_ahead[major] = xpram_rahead; + + /* we want to have XPRAM_UNUSED blocks security buffer between devices */ + mem_usable=xpram_mem_avail-(XPRAM_UNUSED*(xpram_devs-1)); + if ( mem_needed > mem_usable ) { + PRINT_ERR("Not enough expanded memory available\n"); + PRINT_ERR("Giving up xpram\n"); + goto fail_malloc; + } + + /* + * partitioning: + * xpram_sizes[i] != 0; partition i has size xpram_sizes[i] kB + * else: ; all partitions i with xpram_sizesxpram_size[i] + * partition equally the remaining space + */ + + if ( mem_auto_no ) { + mem_auto=LAST4((mem_usable-mem_needed)/mem_auto_no); + PRINT_INFO(" automatically determined partition size: %d kB\n", mem_auto); + for (i=0; i < xpram_devs; i++) + if (xpram_sizes[i] == 0) xpram_sizes[i] = mem_auto; + } + blk_size[major]=xpram_sizes; + + xpram_offsets = kmalloc(xpram_devs * sizeof(int), GFP_KERNEL); + if (!xpram_offsets) + goto fail_malloc; + xpram_offsets[0] = 0; + for (i=1; i < xpram_devs; i++) + xpram_offsets[i] = xpram_offsets[i-1] + xpram_sizes[i-1] + XPRAM_UNUSED; + +#if 0 + for (i=0; i < xpram_devs; i++) + PRINT_DEBUG(" device(%d) offset = %d kB, size = %d kB\n",i, xpram_offsets[i], xpram_sizes[i]); +#endif + + xpram_blksizes = kmalloc(xpram_devs * sizeof(int), GFP_KERNEL); + if (!xpram_blksizes) + goto fail_malloc_blksizes; + for (i=0; i < xpram_devs; i++) /* all the same blocksize */ + xpram_blksizes[i] = xpram_blksize; + blksize_size[major]=xpram_blksizes; + + xpram_hardsects = kmalloc(xpram_devs * sizeof(int), GFP_KERNEL); + if (!xpram_hardsects) + goto fail_malloc_hardsects; + for (i=0; i < xpram_devs; i++) /* all the same hardsect */ + xpram_hardsects[i] = xpram_hardsect; + hardsect_size[major]=xpram_hardsects; + + /* + * allocate the devices -- we can't have them static, as the number + * can be specified at load time + */ + + xpram_devices = kmalloc(xpram_devs * sizeof (Xpram_Dev), GFP_KERNEL); + if (!xpram_devices) + goto fail_malloc_devices; + memset(xpram_devices, 0, xpram_devs * sizeof (Xpram_Dev)); + for (i=0; i < xpram_devs; i++) { + /* data and usage remain zeroed */ + xpram_devices[i].size = xpram_sizes[i]; /* size in kB not in bytes */ + atomic_set(&(xpram_devices[i].usage),0); + } + + return 0; /* succeed */ + + fail_malloc_blksizes: + kfree (xpram_offsets); + fail_malloc_hardsects: + kfree (xpram_blksizes); + blksize_size[major] = NULL; + fail_malloc_devices: + kfree(xpram_hardsects); + hardsect_size[major] = NULL; + fail_malloc: + read_ahead[major] = 0; + blk_dev[major].request_fn = NULL; + unregister_chrdev(major, "xpram"); + return result; +} + +/* + * Finally, the module stuff + */ + +int init_module(void) +{ + int rc = 0; + + PRINT_INFO ("trying to load module\n"); + rc = xpram_init (); + if (rc == 0) { + PRINT_INFO ("Module loaded successfully\n"); + } else { + PRINT_WARN ("Module load returned rc=%d\n", rc); + } + return rc; +} + +void cleanup_module(void) +{ + int i; + + /* first of all, flush it all and reset all the data structures */ + + + for (i=0; i +#include +#include + +/* version dependencies have been confined to a separate file */ + +/* + * Macros to help debugging + */ + +#define XPRAM_NAME "xpram" /* name of device/module */ +#define XPRAM_DEVS 1 /* one partition */ +#define XPRAM_RAHEAD 8 /* no real read ahead */ +#define XPRAM_PGSIZE 4096 /* page size of (expanded) mememory pages + * according to S/390 architecture + */ +#define XPRAM_BLKSIZE XPRAM_PGSIZE /* must be equalt to page size ! */ +#define XPRAM_HARDSECT XPRAM_PGSIZE /* FIXME -- we have to deal with both + * this hard sect size and in some cases + * hard coded 512 bytes which I call + * soft sects: + */ +#define XPRAM_SOFTSECT 512 +#define XPRAM_MAX_DEVS 32 /* maximal number of devices (partitions) */ +#define XPRAM_MAX_DEVS1 33 /* maximal number of devices (partitions) +1 */ + +/* The following macros depend on the sizes above */ + +#define XPRAM_KB_IN_PG 4 /* 4 kBs per page */ +#define XPRAM_KB_IN_PG_ORDER 2 /* 2^? kBs per page */ + +/* Eventhough XPRAM_HARDSECT is set to 4k some data structures use hard + * coded 512 byte sa sector size + */ +#define XPRAM_SEC2KB(x) ((x >> 1) + (x & 1)) /* modifier used to compute size + in kB from number of sectors */ +#define XPRAM_SEC_IN_PG 8 /* 8 sectors per page */ +#define XPRAM_SEC_IN_PG_ORDER 3 /* 2^? sectors per page */ + +#define XPRAM_UNUSED 40 /* unused space between devices, + * in kB, i.e. + * must be a multiple of 4 + */ +/* + * The xpram device is removable: if it is left closed for more than + * half a minute, it is removed. Thus use a usage count and a + * kernel timer + */ + +typedef struct Xpram_Dev { + int size; /* size in KB not in Byte - RB - */ + atomic_t usage; + u8 *data; +} Xpram_Dev; + +void xpram_setup (char *, int *); +int xpram_init(void); diff -urN v2.2.15/linux/drivers/s390/char/con3215.c linux/drivers/s390/char/con3215.c --- v2.2.15/linux/drivers/s390/char/con3215.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/char/con3215.c Wed Jun 7 14:26:43 2000 @@ -342,6 +342,7 @@ tty->ldisc.write_wakeup) (tty->ldisc.write_wakeup)(tty); wake_up_interruptible(&tty->write_wait); + wake_up_interruptible(&tty->poll_wait); } } @@ -445,22 +446,29 @@ if (count >= TTY_FLIPBUF_SIZE - tty->flip.count) count = TTY_FLIPBUF_SIZE - tty->flip.count - 1; EBCASC(raw->inbuf, count); - if (count == 2 && - strncmp(raw->inbuf, "^c", 2) == 0) { + if (count == 2 && ( + /* hat is 0xb0 in codepage 037 (US etc.) and thus */ + /* converted to 0x5e in ascii ('^') */ + strncmp(raw->inbuf, "^c", 2) == 0 || + /* hat is 0xb0 in several other codepages (German,*/ + /* UK, ...) and thus converted to ascii octal 252 */ + strncmp(raw->inbuf, "\252c", 2) == 0) ) { /* emulate a control C = break */ tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_NORMAL; *tty->flip.char_buf_ptr++ = INTR_CHAR(tty); tty_flip_buffer_push(raw->tty); - } else if (count == 2 && - strncmp(raw->inbuf, "^d", 2) == 0) { + } else if (count == 2 && ( + strncmp(raw->inbuf, "^d", 2) == 0 || + strncmp(raw->inbuf, "\252d", 2) == 0) ) { /* emulate a control D = end of file */ tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_NORMAL; *tty->flip.char_buf_ptr++ = EOF_CHAR(tty); tty_flip_buffer_push(raw->tty); - } else if (count == 2 && - strncmp(raw->inbuf, "^z", 2) == 0) { + } else if (count == 2 && ( + strncmp(raw->inbuf, "^z", 2) == 0 || + strncmp(raw->inbuf, "\252z", 2) == 0) ) { /* emulate a control Z = suspend */ tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_NORMAL; @@ -470,7 +478,8 @@ memcpy(tty->flip.char_buf_ptr, raw->inbuf, count); if (count < 2 || - strncmp(raw->inbuf+count-2, "^n", 2)) { + (strncmp(raw->inbuf+count-2, "^n", 2) || + strncmp(raw->inbuf+count-2, "\252n", 2)) ) { /* don't add the auto \n */ tty->flip.char_buf_ptr[count] = '\n'; memset(tty->flip.flag_buf_ptr, @@ -660,6 +669,7 @@ return -1; raw->flags |= RAW3215_ACTIVE; s390irq_spin_lock_irqsave(raw->irq, flags); + set_cons_dev(raw->irq); raw3215_try_io(raw); s390irq_spin_unlock_irqrestore(raw->irq, flags); @@ -934,6 +944,7 @@ raw = (raw3215_info *) tty->driver_data; raw3215_flush_buffer(raw); wake_up_interruptible(&tty->write_wait); + wake_up_interruptible(&tty->poll_wait); if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) (tty->ldisc.write_wakeup)(tty); @@ -1029,8 +1040,6 @@ if (MACHINE_IS_VM) { cpcmd("TERM CONMODE 3215", NULL, 0); cpcmd("TERM AUTOCR OFF", NULL, 0); - cpcmd("TERM HOLD OFF", NULL, 0); - cpcmd("TERM MORE 5 5", NULL, 0); } kmem_start = (kmem_start + 7) & -8L; @@ -1061,9 +1070,6 @@ if (raw->irq != -1) { register_console(&con3215); - s390irq_spin_lock(raw->irq); - set_cons_dev(raw->irq); - s390irq_spin_unlock(raw->irq); } else { kmem_start = (long) raw; raw3215[0] = NULL; diff -urN v2.2.15/linux/drivers/s390/char/hwc_con.c linux/drivers/s390/char/hwc_con.c --- v2.2.15/linux/drivers/s390/char/hwc_con.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/char/hwc_con.c Wed Jun 7 14:26:43 2000 @@ -28,6 +28,7 @@ void hwc_console_write(struct console *, const char *, unsigned int); kdev_t hwc_console_device(struct console *); +void hwc_console_unblank (void); #define HWC_CON_PRINT_HEADER "hwc console driver: " @@ -39,7 +40,7 @@ NULL, hwc_console_device, NULL, - NULL, + hwc_console_unblank, NULL, CON_PRINTBUFFER, 0, @@ -70,6 +71,12 @@ return MKDEV(hwc_console_major, hwc_console_minor); } +void +hwc_console_unblank (void) +{ + hwc_unblank (); +} + #endif __initfunc(unsigned long hwc_console_init(unsigned long kmem_start)) @@ -84,12 +91,12 @@ if (hwc_init(&kmem_start) == 0) { + hwc_tty_init (); + #ifdef CONFIG_HWC_CONSOLE register_console(&hwc_console); #endif - - hwc_tty_init(); } else panic (HWC_CON_PRINT_HEADER "hwc initialisation failed !"); diff -urN v2.2.15/linux/drivers/s390/char/hwc_rw.c linux/drivers/s390/char/hwc_rw.c --- v2.2.15/linux/drivers/s390/char/hwc_rw.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/char/hwc_rw.c Wed Jun 7 14:26:43 2000 @@ -26,6 +26,7 @@ #include #include #include +#include #ifndef MIN #define MIN(a,b) ((a= hwc_data.kmem_start && page < hwc_data.kmem_end) { - memset((void *) page, 0, PAGE_SIZE); +/* memset((void *) page, 0, PAGE_SIZE); */ page_nr = (int) ((page - hwc_data.kmem_start) >> 12); clear_bit(page_nr, &hwc_data.kmem_pages); @@ -693,7 +704,7 @@ release_write_hwcb(); - hwc_data.flags &= ~FLUSH_HWCBS; + hwc_data.flags &= ~HWC_FLUSH; } static int @@ -701,17 +712,28 @@ { write_hwcb_t *hwcb; int retval; + +#ifdef DUMP_HWC_WRITE_ERROR unsigned char *param; param = ext_int_param(); - if (param != hwc_data.current_hwcb) + if (param != hwc_data.current_hwcb) { + internal_print ( + DELAYED_WRITE, + HWC_RW_PRINT_HEADER + "write_event_mask_2 : " + "HWCB address does not fit " + "(expected: 0x%x, got: 0x%x).\n", + hwc_data.current_hwcb, + param); return -EINVAL; + } +#endif hwcb = (write_hwcb_t *) OUT_HWCB; -#ifdef DUMP_HWC_WRITE_ERROR -#if 0 - if (((unsigned char *) hwcb) != param) +#ifdef DUMP_HWC_WRITE_LIST_ERROR + if (((unsigned char *) hwcb) != hwc_data.current_hwcb) { __asm__("LHI 1,0xe22\n\t" "LRA 2,0(0,%0)\n\t" "LRA 3,0(0,%1)\n\t" @@ -722,33 +744,13 @@ :"a"(OUT_HWCB), "a"(hwc_data.current_hwcb), "a"(BUF_HWCB), - "a"(param) + "a" (hwcb) :"1", "2", "3", "4", "5"); + } #endif - if (hwcb->response_code != 0x0020) -#if 0 - internal_print(DELAYED_WRITE, HWC_RW_PRINT_HEADER - "\n************************ error in write_event_data_2()\n" - "OUT_HWCB: 0x%x\n" - "BUF_HWCB: 0x%x\n" - "response_code: 0x%x\n" - "hwc_data.hwcb_count: %d\n" - "hwc_data.kmem_pages: 0x%x\n" - "hwc_data.ioctls.kmem_hwcb: %d\n" - "hwc_data.ioctls.max_hwcb: %d\n" - "hwc_data.kmem_start: 0x%x\n" - "hwc_data.kmem_end: 0x%x\n" - "*****************************************************\n", - OUT_HWCB, - BUF_HWCB, - hwcb->response_code, - hwc_data.hwcb_count, - hwc_data.kmem_pages, - hwc_data.ioctls.kmem_hwcb, - hwc_data.ioctls.max_hwcb, - hwc_data.kmem_start, - hwc_data.kmem_end); -#endif + +#ifdef DUMP_HWC_WRITE_ERROR + if (hwcb->response_code != 0x0020) { __asm__("LHI 1,0xe21\n\t" "LRA 2,0(0,%0)\n\t" "LRA 3,0(0,%1)\n\t" @@ -761,19 +763,30 @@ "a"(BUF_HWCB), "a"(&(hwc_data.hwcb_count)) :"1", "2", "3", "4", "5"); + } #endif if (hwcb->response_code == 0x0020) { retval = OUT_HWCB_CHAR; release_write_hwcb(); - } else + } else { + internal_print ( + DELAYED_WRITE, + HWC_RW_PRINT_HEADER + "write_event_data_2 : " + "failed operation " + "(response code: 0x%x " + "HWCB address: 0x%x).\n", + hwcb->response_code, + hwcb); retval = -EIO; + } hwc_data.current_servc = 0; hwc_data.current_hwcb = NULL; - if (hwc_data.flags & FLUSH_HWCBS) + if (hwc_data.flags & HWC_FLUSH) flush_hwcbs(); return retval; @@ -860,7 +873,7 @@ static int do_hwc_write ( int from_user, - const unsigned char *msg, + unsigned char *msg, unsigned int count, unsigned char code, unsigned char write_time) @@ -891,7 +904,7 @@ else orig_ch = msg[i_msg]; if (code == CODE_EBCDIC) - ch = _ebcasc[orig_ch]; + ch = (MACHINE_IS_VM ? _ebcasc[orig_ch] : _ebcasc_500[orig_ch]); else ch = orig_ch; @@ -980,7 +993,10 @@ hwc_data.obuf[hwc_data.obuf_start + obuf_cursor++] = (code == CODE_ASCII) ? - _ascebc[orig_ch]:orig_ch; + (MACHINE_IS_VM ? + _ascebc[orig_ch] : + _ascebc_500[orig_ch]) : + orig_ch; } if (obuf_cursor > obuf_count) obuf_count = obuf_cursor; @@ -1042,7 +1058,8 @@ spin_lock_irqsave(&hwc_data.lock, flags); - retval = do_hwc_write(from_user, msg, count, hwc_data.ioctls.code, + retval = do_hwc_write (from_user, (unsigned char *) msg, + count, hwc_data.ioctls.code, IMMEDIATE_WRITE); spin_unlock_irqrestore(&hwc_data.lock, flags); @@ -1123,7 +1140,7 @@ if (hwc_data.current_servc != HWC_CMDW_WRITEDATA) flush_hwcbs(); else - hwc_data.flags |= FLUSH_HWCBS; + hwc_data.flags |= HWC_FLUSH; } if (flag & IN_WRITE_BUF) { hwc_data.obuf_cursor = 0; @@ -1302,10 +1319,15 @@ if (hwc_data.ioctls.echo) do_hwc_write(0, start, count, CODE_EBCDIC, IMMEDIATE_WRITE); - if (hwc_data.ioctls.code == CODE_ASCII) + if (hwc_data.ioctls.code == CODE_ASCII) { + if (MACHINE_IS_VM) EBCASC(start, count); - - store_hwc_input(start, count); + else + EBCASC_500 (start, count); + } + if (hwc_data.calls != NULL) + if (hwc_data.calls->move_input != NULL) + (hwc_data.calls->move_input) (start, count); return count; } @@ -1550,6 +1572,13 @@ case 0x60F0 : case 0x62F0 : + internal_print ( + IMMEDIATE_WRITE, + HWC_RW_PRINT_HEADER + "unconditional read: " + "got interrupt and tried to read input, " + "but nothing found (response code=0x%x).\n", + hwcb->response_code); return 0; case 0x0100 : @@ -1623,13 +1652,11 @@ unsigned int condition_code; int retval; - memcpy(hwc_data.page, &init_hwcb_template, sizeof(init_hwcb_t)); - condition_code = service_call(HWC_CMDW_WRITEMASK, hwc_data.page); #ifdef DUMP_HWC_INIT_ERROR - if (condition_code != HWC_COMMAND_INITIATED) + if (condition_code == HWC_NOT_OPERATIONAL) __asm__("LHI 1,0xe10\n\t" "L 2,0(0,%0)\n\t" "LRA 3,0(0,%1)\n\t" @@ -1667,12 +1694,18 @@ if (hwcb->hwc_receive_mask & ET_PMsgCmd_Mask) hwc_data.write_prio = 1; - if (hwcb->hwc_send_mask & ET_OpCmd_Mask) + if (hwcb->hwc_send_mask & ET_OpCmd_Mask) { + internal_print (DELAYED_WRITE, + HWC_RW_PRINT_HEADER + "capable of receipt of commands\n"); hwc_data.read_nonprio = 1; - - if (hwcb->hwc_send_mask & ET_PMsgCmd_Mask) + } + if (hwcb->hwc_send_mask & ET_PMsgCmd_Mask) { + internal_print (DELAYED_WRITE, + HWC_RW_PRINT_HEADER + "capable of receipt of priority commands\n"); hwc_data.read_nonprio = 1; - + } if ((hwcb->response_code != 0x0020) || (!hwc_data.write_nonprio) || ((!hwc_data.read_nonprio) && (!hwc_data.read_prio))) @@ -1685,7 +1718,7 @@ :"a"(hwcb), "a"(&(hwcb->response_code)) :"1", "2", "3"); #else - retval = -EIO + retval = -EIO; #endif hwc_data.current_servc = 0; @@ -1771,9 +1804,56 @@ } int +do_hwc_init (void) +{ + int retval; + + memcpy (hwc_data.page, &init_hwcb_template, sizeof (init_hwcb_t)); + + do { + + retval = write_event_mask_1 (); + + if (retval == -EBUSY) { + + hwc_data.flags |= HWC_INIT; + + asm volatile ("STCTL 0,0,%0":"=m" (cr0)); + cr0_save = cr0; + cr0 |= 0x00000200; + cr0 &= 0xFFFFF3AC; + asm volatile ("LCTL 0,0,%0"::"m" (cr0):"memory"); + + asm volatile ("STOSM %0,0x01" + :"=m" (psw_mask)::"memory"); + + while (!(hwc_data.flags & HWC_INTERRUPT)) + barrier (); + + asm volatile ("STNSM %0,0xFE" + :"=m" (psw_mask)::"memory"); + + asm volatile ("LCTL 0,0,%0" + ::"m" (cr0_save):"memory"); + + hwc_data.flags &= ~HWC_INIT; + } + } while (retval == -EBUSY); + + if (retval == -EIO) { + hwc_data.flags |= HWC_BROKEN; + printk (HWC_RW_PRINT_HEADER "HWC not operational\n"); + } + return retval; +} + +void do_hwc_interrupt (struct pt_regs *regs, __u16 code); + +int hwc_init (unsigned long *kmem_start) { int retval; + #ifdef BUFFER_STRESS_TEST init_hwcb_t *hwcb; @@ -1781,17 +1861,11 @@ #endif -#ifdef CONFIG_3215 - if (MACHINE_IS_VM) - return kmem_start; -#endif + if (register_external_interrupt (0x2401, do_hwc_interrupt) != 0) + panic ("Couldn't request external interrupts 0x2401"); spin_lock_init(&hwc_data.lock); - retval = write_event_mask_1(); - if (retval < 0) - return retval; - #ifdef USE_VM_DETECTION if (MACHINE_IS_VM) { @@ -1813,6 +1887,8 @@ *kmem_start += hwc_data.ioctls.kmem_hwcb * PAGE_SIZE; hwc_data.kmem_end = *kmem_start - 1; + retval = do_hwc_init (); + ctl_set_bit(0, 9); #ifdef BUFFER_STRESS_TEST @@ -1834,13 +1910,52 @@ #endif - return retval; + return /*retval */ 0; +} + +signed int +hwc_register_calls (hwc_high_level_calls_t * calls) +{ + if (calls == NULL) + return -EINVAL; + + if (hwc_data.calls != NULL) + return -EBUSY; + + hwc_data.calls = calls; + return 0; +} + +signed int +hwc_unregister_calls (hwc_high_level_calls_t * calls) +{ + if (hwc_data.calls == NULL) + return -EINVAL; + + if (calls != hwc_data.calls) + return -EINVAL; + + hwc_data.calls = NULL; + return 0; } void -do_hwc_interrupt (void) +do_hwc_interrupt (struct pt_regs *regs, __u16 code) { + if (hwc_data.flags & HWC_INIT) { + + hwc_data.flags |= HWC_INTERRUPT; + } else if (hwc_data.flags & HWC_BROKEN) { + + if (!do_hwc_init ()) { + hwc_data.flags &= ~HWC_BROKEN; + internal_print (DELAYED_WRITE, + HWC_RW_PRINT_HEADER + "delayed HWC setup after" + " temporary breakdown\n"); + } + } else { spin_lock(&hwc_data.lock); if (!hwc_data.current_servc) { @@ -1869,10 +1984,34 @@ write_event_data_1(); } + if (hwc_data.calls != NULL) + if (hwc_data.calls->wake_up != NULL) + (hwc_data.calls->wake_up) (); + spin_unlock (&hwc_data.lock); + } +} - wake_up_hwc_tty(); +void +hwc_unblank (void) +{ + spin_lock (&hwc_data.lock); spin_unlock(&hwc_data.lock); + + asm volatile ("STCTL 0,0,%0":"=m" (cr0)); + cr0_save = cr0; + cr0 |= 0x00000200; + cr0 &= 0xFFFFF3AC; + asm volatile ("LCTL 0,0,%0"::"m" (cr0):"memory"); + + asm volatile ("STOSM %0,0x01":"=m" (psw_mask)::"memory"); + + while (ALL_HWCB_CHAR) + barrier (); + + asm volatile ("STNSM %0,0xFE":"=m" (psw_mask)::"memory"); + + asm volatile ("LCTL 0,0,%0"::"m" (cr0_save):"memory"); } int diff -urN v2.2.15/linux/drivers/s390/char/hwc_rw.h linux/drivers/s390/char/hwc_rw.h --- v2.2.15/linux/drivers/s390/char/hwc_rw.h Wed May 3 17:16:43 2000 +++ linux/drivers/s390/char/hwc_rw.h Wed Jun 7 14:26:43 2000 @@ -12,31 +12,12 @@ #include -#ifndef __HWC_RW_C__ - -extern int hwc_init(unsigned long *); - -extern int hwc_write(int from_user, const unsigned char *, unsigned int); - -extern unsigned int hwc_chars_in_buffer(unsigned char); - -extern unsigned int hwc_write_room(unsigned char); - -extern void hwc_flush_buffer(unsigned char); - -extern signed int hwc_ioctl(unsigned int, unsigned long); - -extern void do_hwc_interrupt(void); - -extern int hwc_printk(const char *, ...); - -#else - -extern void store_hwc_input(unsigned char*, unsigned int); +typedef struct { -extern void wake_up_hwc_tty(void); + void (*move_input) (unsigned char *, unsigned int); -#endif + void (*wake_up) (void); +} hwc_high_level_calls_t; #define IN_HWCB 1 #define IN_WRITE_BUF 2 @@ -109,5 +90,31 @@ #define CODE_ASCII 0x0 #define CODE_EBCDIC 0x1 + +#ifndef __HWC_RW_C__ + +extern int hwc_init (unsigned long *); + +extern int hwc_write (int from_user, const unsigned char *, unsigned int); + +extern unsigned int hwc_chars_in_buffer (unsigned char); + +extern unsigned int hwc_write_room (unsigned char); + +extern void hwc_flush_buffer (unsigned char); + +extern void hwc_unblank (void); + +extern signed int hwc_ioctl (unsigned int, unsigned long); + +extern void do_hwc_interrupt (void); + +extern int hwc_printk (const char *,...); + +extern signed int hwc_register_calls (hwc_high_level_calls_t *); + +extern signed int hwc_unregister_calls (hwc_high_level_calls_t *); + +#endif #endif diff -urN v2.2.15/linux/drivers/s390/char/hwc_tty.c linux/drivers/s390/char/hwc_tty.c --- v2.2.15/linux/drivers/s390/char/hwc_tty.c Wed May 3 17:16:43 2000 +++ linux/drivers/s390/char/hwc_tty.c Wed Jun 7 14:26:43 2000 @@ -19,6 +19,7 @@ #include #include "hwc_rw.h" +#include "hwc_tty.h" #define HWC_TTY_PRINT_HEADER "hwc tty driver: " @@ -33,9 +34,14 @@ unsigned short int buf_count; spinlock_t lock; + + hwc_high_level_calls_t calls; + + hwc_tty_ioctl_t ioctl; } hwc_tty_data_struct; -static hwc_tty_data_struct hwc_tty_data; +static hwc_tty_data_struct hwc_tty_data = +{ /* NULL/0 */ }; static struct tty_driver hwc_tty_driver; static struct tty_struct * hwc_tty_table[1]; static struct termios * hwc_tty_termios[1]; @@ -44,6 +50,9 @@ extern struct termios tty_std_termios; +void hwc_tty_wake_up (void); +void hwc_tty_input (unsigned char *, unsigned int); + static int hwc_tty_open (struct tty_struct *tty, struct file *filp) @@ -57,17 +66,14 @@ hwc_tty_data.tty = tty; tty->low_latency = 0; + hwc_tty_data.calls.wake_up = hwc_tty_wake_up; + hwc_tty_data.calls.move_input = hwc_tty_input; + hwc_register_calls (&(hwc_tty_data.calls)); + return 0; } -void -wake_up_hwc_tty (void) -{ - if ((hwc_tty_data.tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && - hwc_tty_data.tty->ldisc.write_wakeup) - (hwc_tty_data.tty->ldisc.write_wakeup)(hwc_tty_data.tty); - wake_up_interruptible(&hwc_tty_data.tty->write_wait); -} +#if 0 static void hwc_tty_close (struct tty_struct *tty, @@ -79,7 +85,10 @@ return; } hwc_tty_data.tty = NULL; + + hwc_unregister_calls (&(hwc_tty_data.calls)); } +#endif static int hwc_tty_write_room (struct tty_struct *tty) @@ -145,7 +154,7 @@ static void hwc_tty_flush_buffer (struct tty_struct *tty) { - wake_up_hwc_tty(); + hwc_tty_wake_up (); } static int @@ -155,36 +164,117 @@ unsigned int cmd, unsigned long arg) { + unsigned long count; + if (tty->flags & (1 << TTY_IO_ERROR)) return -EIO; + switch (cmd) { + case TIOCHWCTTYSINTRC: + count = strlen_user ((const char *) arg); + if (count > HWC_TTY_MAX_CNTL_SIZE) + return -EINVAL; + strncpy_from_user (hwc_tty_data.ioctl.intr_char, + (const char *) arg, count); + + hwc_tty_data.ioctl.intr_char_size = count - 1; + return count; + + case TIOCHWCTTYGINTRC: + return copy_to_user ((void *) arg, + (const void *) hwc_tty_data.ioctl.intr_char, + (long) hwc_tty_data.ioctl.intr_char_size); + + default: return hwc_ioctl(cmd, arg); } +} + +void +hwc_tty_wake_up (void) +{ + if (hwc_tty_data.tty == NULL) + return; + if ((hwc_tty_data.tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && + hwc_tty_data.tty->ldisc.write_wakeup) + (hwc_tty_data.tty->ldisc.write_wakeup) (hwc_tty_data.tty); + wake_up_interruptible (&hwc_tty_data.tty->write_wait); + wake_up_interruptible (&hwc_tty_data.tty->poll_wait); +} void -store_hwc_input (unsigned char *buf, unsigned int count) +hwc_tty_input (unsigned char *buf, unsigned int count) { struct tty_struct *tty = hwc_tty_data.tty; if (tty != NULL) { - if (count == 2 && strncmp(buf, "^c", 2) == 0) { + if (count == 2 && ( + + strncmp (buf, "^c", 2) == 0 || + + strncmp (buf, "\0252c", 2) == 0)) { + tty->flip.count++; + *tty->flip.flag_buf_ptr++ = TTY_NORMAL; + *tty->flip.char_buf_ptr++ = INTR_CHAR (tty); + } else if (count == 2 && ( + strncmp (buf, "^d", 2) == 0 || + strncmp (buf, "\0252d", 2) == 0)) { + tty->flip.count++; + *tty->flip.flag_buf_ptr++ = TTY_NORMAL; + *tty->flip.char_buf_ptr++ = EOF_CHAR (tty); + } else if (count == 2 && ( + strncmp (buf, "^z", 2) == 0 || + strncmp (buf, "\0252z", 2) == 0)) { + tty->flip.count++; + *tty->flip.flag_buf_ptr++ = TTY_NORMAL; + *tty->flip.char_buf_ptr++ = SUSP_CHAR (tty); + } else { + + memcpy (tty->flip.char_buf_ptr, buf, count); + if (count < 2 || ( + strncmp (buf + count - 2, "^n", 2) || + strncmp (buf + count - 2, "\0252n", 2))) { + tty->flip.char_buf_ptr[count] = '\n'; + count++; + } else + count -= 2; + memset (tty->flip.flag_buf_ptr, TTY_NORMAL, count); + tty->flip.char_buf_ptr += count; + tty->flip.flag_buf_ptr += count; + tty->flip.count += count; + } + tty_flip_buffer_push (tty); + hwc_tty_wake_up (); + } +#if 0 + + if (tty != NULL) { + + if (count == hwc_tty_data.ioctl.intr_char_size && + strncmp (buf, hwc_tty_data.ioctl.intr_char, + hwc_tty_data.ioctl.intr_char_size) == 0) { tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_NORMAL; *tty->flip.char_buf_ptr++ = INTR_CHAR(tty); - } else if (count == 2 && strncmp(buf, "^d", 2) == 0) { + } else if (count == 2 && ( + strncmp (buf, "^d", 2) == 0 || + strncmp (buf, "\0252d", 2) == 0)) { tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_NORMAL; *tty->flip.char_buf_ptr++ = EOF_CHAR(tty); - } else if (count == 2 && strncmp(buf, "^z", 2) == 0) { + } else if (count == 2 && ( + strncmp (buf, "^z", 2) == 0 || + strncmp (buf, "\0252z", 2) == 0)) { tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_NORMAL; *tty->flip.char_buf_ptr++ = SUSP_CHAR(tty); } else { memcpy(tty->flip.char_buf_ptr, buf, count); - if (count < 2 || - strncmp(buf + count - 2, "^n", 2)) { + if (count < 2 || ( + strncmp (buf + count - 2, "^n", 2) || + strncmp (buf + count - 2, "\0252n", 2))) { tty->flip.char_buf_ptr[count] = '\n'; count++; } else @@ -195,14 +285,16 @@ tty->flip.count += count; } tty_flip_buffer_push(tty); - wake_up_hwc_tty(); + hwc_tty_wake_up (); } +#endif } void hwc_tty_init (void) { memset (&hwc_tty_driver, 0, sizeof(struct tty_driver)); + memset (&hwc_tty_data, 0, sizeof (hwc_tty_data_struct)); hwc_tty_driver.magic = TTY_DRIVER_MAGIC; hwc_tty_driver.driver_name = "tty_hwc"; hwc_tty_driver.name = "ttyS"; diff -urN v2.2.15/linux/drivers/s390/char/hwc_tty.h linux/drivers/s390/char/hwc_tty.h --- v2.2.15/linux/drivers/s390/char/hwc_tty.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/s390/char/hwc_tty.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,30 @@ +/* + * drivers/s390/char/hwc_tty.h + * interface to the HWC-terminal driver + * + * S390 version + * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Author(s): Martin Peschke + */ + +#ifndef __HWC_TTY_H__ +#define __HWC_TTY_H__ + +#include + +#define HWC_TTY_MAX_CNTL_SIZE 20 + +typedef struct { + unsigned char intr_char[HWC_TTY_MAX_CNTL_SIZE]; + unsigned char intr_char_size; +} hwc_tty_ioctl_t; + +static hwc_tty_ioctl_t _ioctl; + +#define HWC_TTY_IOCTL_LETTER 'B' + +#define TIOCHWCTTYSINTRC _IOW(HWC_TTY_IOCTL_LETTER, 40, _ioctl.intr_char) + +#define TIOCHWCTTYGINTRC _IOR(HWC_TTY_IOCTL_LETTER, 41, _ioctl.intr_char) + +#endif diff -urN v2.2.15/linux/drivers/s390/ebcdic.c linux/drivers/s390/ebcdic.c --- v2.2.15/linux/drivers/s390/ebcdic.c Tue Jan 4 10:12:18 2000 +++ linux/drivers/s390/ebcdic.c Wed Dec 31 16:00:00 1969 @@ -1,246 +0,0 @@ -/* - * arch/s390/kernel/ebcdic.c - * ECBDIC -> ASCII, ASCII -> ECBDIC conversion tables. - * - * S390 version - * Copyright (C) 1998 IBM Corporation - * Author(s): Martin Schwidefsky - */ - -#include - -/* - * ASCII -> EBCDIC - */ -__u8 _ascebc[256] = -{ - /*00 NL SH SX EX ET NQ AK BL */ - 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, - /*08 BS HT LF VT FF CR SO SI */ - 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - /*10 DL D1 D2 D3 D4 NK SN EB */ - 0x10, 0x11, 0x12, 0x13, 0x3C, 0x15, 0x32, 0x26, - /*18 CN EM SB EC FS GS RS US */ - 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, - /*20 SP ! " # $ % & ' */ - 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, - /*28 ( ) * + , - . / */ - 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, - /*30 0 1 2 3 4 5 6 7 */ - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, - /*38 8 9 : ; < = > ? */ - 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, - /*40 @ A B C D E F G */ - 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, - /*48 H I J K L M N O */ - 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, - /*50 P Q R S T U V W */ - 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, - /*58 X Y Z [ \ ] ^ _ */ - 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D, - /*60 ` a b c d e f g */ - 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - /*68 h i j k l m n o */ - 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, - /*70 p q r s t u v w */ - 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, - /*78 x y z { | } ~ DL */ - 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF -}; - -/* - * EBCDIC -> ASCII - */ -__u8 _ebcasc[256] = -{ - /* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */ - 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F, - /* 0x08 -GE -SPS -RPT VT FF CR SO SI */ - 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - /* 0x10 DLE DC1 DC2 DC3 -RES -NL BS -POC - -ENP ->LF */ - 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07, - /* 0x18 CAN EM -UBS -CU1 -IFS -IGS -IRS -ITB - -IUS */ - 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - /* 0x20 -DS -SOS FS -WUS -BYP LF ETB ESC - -INP */ - 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B, - /* 0x28 -SA -SFE -SM -CSP -MFA ENQ ACK BEL - -SW */ - 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, - /* 0x30 ---- ---- SYN -IR -PP -TRN -NBS EOT */ - 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04, - /* 0x38 -SBS -IT -RFF -CU3 DC4 NAK ---- SUB */ - 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A, - /* 0x40 SP RSP ä ---- */ - 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86, - /* 0x48 . < ( + | */ - 0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, - /* 0x50 & ---- */ - 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07, - /* 0x58 ß ! $ * ) ; */ - 0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA, - /* 0x60 - / ---- Ä ---- ---- ---- */ - 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F, - /* 0x68 ---- , % _ > ? */ - 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, - /* 0x70 ---- ---- ---- ---- ---- ---- ---- */ - 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - /* 0x78 * ` : # @ ' = " */ - 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, - /* 0x80 * a b c d e f g */ - 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - /* 0x88 h i ---- ---- ---- */ - 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1, - /* 0x90 ° j k l m n o p */ - 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, - /* 0x98 q r ---- ---- */ - 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07, - /* 0xA0 ~ s t u v w x */ - 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - /* 0xA8 y z ---- ---- ---- ---- */ - 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07, - /* 0xB0 ^ ---- § ---- */ - 0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC, - /* 0xB8 ---- [ ] ---- ---- ---- ---- */ - 0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07, - /* 0xC0 { A B C D E F G */ - 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - /* 0xC8 H I ---- ö ---- */ - 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07, - /* 0xD0 } J K L M N O P */ - 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, - /* 0xD8 Q R ---- ü */ - 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98, - /* 0xE0 \ S T U V W X */ - 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - /* 0xE8 Y Z ---- Ö ---- ---- ---- */ - 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07, - /* 0xF0 0 1 2 3 4 5 6 7 */ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - /* 0xF8 8 9 ---- ---- Ü ---- ---- ---- */ - 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07 -}; - -/* - * EBCDIC (capitals) -> ASCII (small case) - */ -__u8 _ebcasc_reduce_case[256] = -{ - /* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */ - 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F, - - /* 0x08 -GE -SPS -RPT VT FF CR SO SI */ - 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - - /* 0x10 DLE DC1 DC2 DC3 -RES -NL BS -POC - -ENP ->LF */ - 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07, - - /* 0x18 CAN EM -UBS -CU1 -IFS -IGS -IRS -ITB - -IUS */ - 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - - /* 0x20 -DS -SOS FS -WUS -BYP LF ETB ESC - -INP */ - 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B, - - /* 0x28 -SA -SFE -SM -CSP -MFA ENQ ACK BEL - -SW */ - 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, - - /* 0x30 ---- ---- SYN -IR -PP -TRN -NBS EOT */ - 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04, - - /* 0x38 -SBS -IT -RFF -CU3 DC4 NAK ---- SUB */ - 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A, - - /* 0x40 SP RSP ä ---- */ - 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86, - - /* 0x48 . < ( + | */ - 0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, - - /* 0x50 & ---- */ - 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07, - - /* 0x58 ß ! $ * ) ; */ - 0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA, - - /* 0x60 - / ---- Ä ---- ---- ---- */ - 0x2D, 0x2F, 0x07, 0x84, 0x07, 0x07, 0x07, 0x8F, - - /* 0x68 ---- , % _ > ? */ - 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, - - /* 0x70 ---- ---- ---- ---- ---- ---- ---- */ - 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - - /* 0x78 * ` : # @ ' = " */ - 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, - - /* 0x80 * a b c d e f g */ - 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - - /* 0x88 h i ---- ---- ---- */ - 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1, - - /* 0x90 ° j k l m n o p */ - 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, - - /* 0x98 q r ---- ---- */ - 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07, - - /* 0xA0 ~ s t u v w x */ - 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - - /* 0xA8 y z ---- ---- ---- ---- */ - 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07, - - /* 0xB0 ^ ---- § ---- */ - 0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC, - - /* 0xB8 ---- [ ] ---- ---- ---- ---- */ - 0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07, - - /* 0xC0 { A B C D E F G */ - 0x7B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - - /* 0xC8 H I ---- ö ---- */ - 0x68, 0x69, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07, - - /* 0xD0 } J K L M N O P */ - 0x7D, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, - - /* 0xD8 Q R ---- ü */ - 0x71, 0x72, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98, - - /* 0xE0 \ S T U V W X */ - 0x5C, 0xF6, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - - /* 0xE8 Y Z ---- Ö ---- ---- ---- */ - 0x79, 0x7A, 0xFD, 0x07, 0x94, 0x07, 0x07, 0x07, - - /* 0xF0 0 1 2 3 4 5 6 7 */ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - - /* 0xF8 8 9 ---- ---- Ü ---- ---- ---- */ - 0x38, 0x39, 0x07, 0x07, 0x81, 0x07, 0x07, 0x07 -}; diff -urN v2.2.15/linux/drivers/s390/misc/Makefile linux/drivers/s390/misc/Makefile --- v2.2.15/linux/drivers/s390/misc/Makefile Tue Jan 4 10:12:18 2000 +++ linux/drivers/s390/misc/Makefile Wed Jun 7 14:26:43 2000 @@ -6,3 +6,4 @@ M_OBJS := include $(TOPDIR)/Rules.make + diff -urN v2.2.15/linux/drivers/s390/net/ctc.c linux/drivers/s390/net/ctc.c --- v2.2.15/linux/drivers/s390/net/ctc.c Wed May 3 17:16:44 2000 +++ linux/drivers/s390/net/ctc.c Wed Jun 7 14:26:43 2000 @@ -3,9 +3,12 @@ * CTC / ESCON network driver * * S390 version - * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation * Author(s): Dieter Wellerdiek (wel@de.ibm.com) * + * 2.3 Updates Martin Schwidefsky (schwidefsky@de.ibm.com) + * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) + * * * Description of the Kernel Parameter * Normally the CTC driver selects the channels in order (automatic channel @@ -39,8 +42,12 @@ * IFCONFIG dev DOWN and IFCONFIG dev UP * - Possibility to switch the automatic selection off * - Minor bug fixes + * 0.52 Bug fixes + * - Subchannel check message enhanced + * - Read / Write retry routine check for CTC_STOP added */ - +#include +#include #include #include #include @@ -76,7 +83,7 @@ #define KERN_WARNING KERN_EMERG #define KERN_DEBUG KERN_EMERG #endif -//#undef DEBUG + #define CCW_CMD_WRITE 0x01 #define CCW_CMD_READ 0x02 @@ -161,6 +168,15 @@ struct block *block; }; +#if LINUX_VERSION_CODE>=0x020300 +typedef struct net_device net_device; +#else +typedef struct device net_device; +typedef struct wait_queue* wait_queue_head_t; +#define DECLARE_WAITQUEUE(waitqname,waitqtask) struct wait_queue waitqname = {waitqtask, NULL } +#define init_waitqueue_head(nothing) +#endif + struct channel { unsigned int devno; @@ -172,8 +188,8 @@ struct buffer *free_anchor; struct buffer *proc_anchor; devstat_t *devstat; - struct device *dev; /* backward pointer to the network device */ - struct wait_queue *wait; + net_device *dev; /* backward pointer to the network device */ + wait_queue_head_t wait; struct tq_struct tq; struct timer_list timer; unsigned long flag_a; /* atomic flags */ @@ -186,7 +202,10 @@ struct ctc_priv { - struct enet_statistics stats; + struct net_device_stats stats; +#if LINUX_VERSION_CODE>=0x02032D + int tbusy; +#endif struct channel channel[2]; __u16 protocol; }; @@ -210,6 +229,99 @@ struct packet data; }; +#if LINUX_VERSION_CODE>=0x02032D +#define ctc_protect_busy(dev) \ +s390irq_spin_lock(((struct ctc_priv *)dev->priv)->channel[WRITE].irq) +#define ctc_unprotect_busy(dev) \ +s390irq_spin_unlock(((struct ctc_priv *)dev->priv)->channel[WRITE].irq) + +#define ctc_protect_busy_irqsave(dev,flags) \ +s390irq_spin_lock_irqsave(((struct ctc_priv *)dev->priv)->channel[WRITE].irq,flags) +#define ctc_unprotect_busy_irqrestore(dev,flags) \ +s390irq_spin_unlock_irqrestore(((struct ctc_priv *)dev->priv)->channel[WRITE].irq,flags) + +static __inline__ void ctc_set_busy(net_device *dev) +{ + ((struct ctc_priv *)dev->priv)->tbusy=1; + netif_stop_queue(dev); +} + +static __inline__ void ctc_clear_busy(net_device *dev) +{ + ((struct ctc_priv *)dev->priv)->tbusy=0; + netif_start_queue(dev); +} + +static __inline__ int ctc_check_busy(net_device *dev) +{ + eieio(); + return(((struct ctc_priv *)dev->priv)->tbusy); +} + + +static __inline__ void ctc_setbit_busy(int nr,net_device *dev) +{ + set_bit(nr,&(((struct ctc_priv *)dev->priv)->tbusy)); + netif_stop_queue(dev); +} + +static __inline__ void ctc_clearbit_busy(int nr,net_device *dev) +{ + clear_bit(nr,&(((struct ctc_priv *)dev->priv)->tbusy)); + if(((struct ctc_priv *)dev->priv)->tbusy==0) + netif_start_queue(dev); +} + +static __inline__ int ctc_test_and_setbit_busy(int nr,net_device *dev) +{ + netif_stop_queue(dev); + return(test_and_set_bit(nr,&((struct ctc_priv *)dev->priv)->tbusy)); +} +#else + +#define ctc_protect_busy(dev) +#define ctc_unprotect_busy(dev) +#define ctc_protect_busy_irqsave(dev,flags) +#define ctc_unprotect_busy_irqrestore(dev,flags) + +static __inline__ void ctc_set_busy(net_device *dev) +{ + dev->tbusy=1; + eieio(); +} + +static __inline__ void ctc_clear_busy(net_device *dev) +{ + dev->tbusy=0; + eieio(); +} + +static __inline__ int ctc_check_busy(net_device *dev) +{ + eieio(); + return(dev->tbusy); +} + + +static __inline__ void ctc_setbit_busy(int nr,net_device *dev) +{ + set_bit(nr,(void *)&dev->tbusy); +} + +static __inline__ void ctc_clearbit_busy(int nr,net_device *dev) +{ + clear_bit(nr,(void *)&dev->tbusy); +} + +static __inline__ int ctc_test_and_setbit_busy(int nr,net_device *dev) +{ + return(test_and_set_bit(nr,(void *)&dev->tbusy)); +} +#endif + + + + /* Interrupt handler */ static void ctc_irq_handler(int irq, void *initparm, struct pt_regs *regs); @@ -219,16 +331,15 @@ /* Functions for the DEV methods */ -void ctc_setup(char *dev_name, int *ints); -int ctc_probe(struct device *dev); +int ctc_probe(net_device *dev); -static int ctc_open(struct device *dev); +static int ctc_open(net_device *dev); static void ctc_timer (struct channel *ctc); -static int ctc_release(struct device *dev); -static int ctc_tx(struct sk_buff *skb, struct device *dev); -static int ctc_change_mtu(struct device *dev, int new_mtu); -struct net_device_stats* ctc_stats(struct device *dev); +static int ctc_release(net_device *dev); +static int ctc_tx(struct sk_buff *skb, net_device *dev); +static int ctc_change_mtu(net_device *dev, int new_mtu); +struct net_device_stats* ctc_stats(net_device *dev); /* @@ -573,17 +684,28 @@ * 0xnnnn is the cu number write * ctcx can be ctc0 to ctc7 or escon0 to escon7 */ -void ctc_setup(char *dev_name, int *ints) +#if LINUX_VERSION_CODE>=0x020300 +static int __init ctc_setup(char *dev_name) +#else +__initfunc(void ctc_setup(char *dev_name,int *ints)) +#endif { struct adapterlist tmp; - +#if LINUX_VERSION_CODE>=0x020300 + #define CTC_MAX_PARMS 4 + int ints[CTC_MAX_PARMS+1]; + get_options(dev_name,CTC_MAX_PARMS,ints); + #define ctc_setup_return return(1) +#else + #define ctc_setup_return return +#endif ctc_tab_init(); ctc_no_auto = 1; if (!strcmp(dev_name,"noauto")) { printk(KERN_INFO "ctc: automatic channel selection deactivated\n"); - return; + ctc_setup_return; } tmp.devno[WRITE] = -ENODEV; @@ -605,30 +727,32 @@ break; } else { printk(KERN_WARNING "%s: wrong Channel protocol type passed\n", dev_name); - return; + ctc_setup_return; } break; default: printk(KERN_WARNING "ctc: wrong number of parameter passed\n"); - return; + ctc_setup_return; } ctc_adapter[extract_channel_media(dev_name)][extract_channel_id(dev_name)] = tmp; #ifdef DEBUG printk(DEBUG "%s: protocol=%x read=%04x write=%04x\n", dev_name, tmp.protocol, tmp.devno[READ], tmp.devno[WRITE]); #endif - return; + ctc_setup_return; } - +#if LINUX_VERSION_CODE>=0x020300 +__setup("ctc=", ctc_setup); +#endif /* * ctc_probe * this function is called for each channel network device, * which is defined in the /init/main.c */ -int ctc_probe(struct device *dev) +int ctc_probe(net_device *dev) { int rc; int c; @@ -729,7 +853,7 @@ * */ -static void inline ccw_check_return_code (struct device *dev, int return_code) +static void inline ccw_check_return_code (net_device *dev, int return_code) { if (return_code != 0) { switch (return_code) { @@ -750,7 +874,7 @@ } -static void inline ccw_check_unit_check (struct device *dev, char sense) +static void inline ccw_check_unit_check (net_device *dev, char sense) { #ifdef DEBUG printk(KERN_INFO "%s: Unit Check with sense code: %02x\n", @@ -786,17 +910,17 @@ __u8 flags = 0x00; struct channel *ctc = NULL; struct ctc_priv *privptr = NULL; - struct device *dev = NULL; + net_device *dev = NULL; ccw1_t ccw_set_x_mode[2] = {{CCW_CMD_SET_EXTENDED, CCW_FLAG_SLI | CCW_FLAG_CC, 0, NULL}, {CCW_CMD_NOOP, CCW_FLAG_SLI, 0, NULL}}; devstat_t *devstat = ((devstat_t *)initparm); - /* Bypass all 'unsolited interrupts' */ + /* Bypass all 'unsolicited interrupts' */ if (devstat->intparm == 0) { #ifdef DEBUG - printk(KERN_DEBUG "ctc: unsolited interrupt for device: %04x received c-%02x d-%02x f-%02x\n", + printk(KERN_DEBUG "ctc: unsolicited interrupt for device: %04x received c-%02x d-%02x f-%02x\n", devstat->devno, devstat->cstat, devstat->dstat, devstat->flag); #endif /* FIXME - find the related intparm!!! No IO outstanding!!!! */ @@ -804,7 +928,7 @@ } ctc = (struct channel *) (devstat->intparm); - dev = (struct device *) ctc->dev; + dev = (net_device *) ctc->dev; privptr = dev->priv; #ifdef DEBUG @@ -814,8 +938,8 @@ /* Check for good subchannel return code, otherwise error message */ if (devstat->cstat) { - printk(KERN_WARNING "%s: subchannel check for device: %04x - %02x\n", - dev->name, ctc->devno, devstat->cstat); + printk(KERN_WARNING "%s: subchannel check for device: %04x - %02x %02x %02x\n", + dev->name, ctc->devno, devstat->cstat, devstat->dstat, devstat->flag); return; } @@ -925,7 +1049,11 @@ (devstat->ii.sense.data[0] & 0x40) == 0x40 || devstat->ii.sense.data[0] == 0 ) { privptr->stats.rx_errors++; - set_bit(TB_RETRY, (void *)&dev->tbusy); + /* Need protection here cos we are in the read irq */ + /* handler the tbusy is for the write subchannel */ + ctc_protect_busy(dev); + ctc_setbit_busy(TB_RETRY,dev); + ctc_unprotect_busy(dev); init_timer(&ctc->timer); ctc->timer.function = (void *)ctc_read_retry; ctc->timer.data = (__u32)ctc; @@ -938,9 +1066,9 @@ if(!devstat->flag & DEVSTAT_FINAL_STATUS) return; - - clear_bit(TB_RETRY, (void *)&dev->tbusy); - + ctc_protect_busy(dev); + ctc_clearbit_busy(TB_RETRY,dev); + ctc_unprotect_busy(dev); ctc_buffer_swap(&ctc->free_anchor, &ctc->proc_anchor); if (ctc->free_anchor != NULL) { @@ -999,8 +1127,7 @@ ctc->proc_anchor->block->length = 0; ctc_buffer_swap(&ctc->proc_anchor, &ctc->free_anchor); - clear_bit(TB_NOBUFFER, (void *)&dev->tbusy); - + ctc_clearbit_busy(TB_NOBUFFER,dev); if (ctc->proc_anchor != NULL) { #ifdef DEBUG printk(KERN_DEBUG "%s: IRQ early swap buffer\n",dev->name); @@ -1017,9 +1144,10 @@ } if (ctc->free_anchor->block->length != 0) { - if (test_and_set_bit(TB_TX, (void *)&dev->tbusy) == 0) { /* set transmission to busy */ + if (ctc_test_and_setbit_busy(TB_TX,dev) == 0) { + /* set transmission to busy */ ctc_buffer_swap(&ctc->free_anchor, &ctc->proc_anchor); - clear_bit(TB_TX, (void *)&dev->tbusy); + ctc_clearbit_busy(TB_TX,dev); #ifdef DEBUG printk(KERN_DEBUG "%s: last buffer move in IRQ\n",dev->name); #endif @@ -1053,12 +1181,12 @@ __u8 flags = 0x00; __u32 saveflags; - struct device *dev; + net_device *dev; struct ctc_priv *privptr; struct packet *lp; struct sk_buff *skb; - dev = (struct device *) ctc->dev; + dev = (net_device *) ctc->dev; privptr = (struct ctc_priv *) dev->priv; #ifdef DEBUG @@ -1113,13 +1241,15 @@ __u32 parm; __u8 flags = 0x00; __u32 saveflags; - struct device *dev; + net_device *dev; - dev = (struct device *) ctc->dev; + dev = (net_device *) ctc->dev; #ifdef DEBUG printk(KERN_DEBUG "%s: read retry - state-%02x\n" ,dev->name, ctc->state); #endif + if (ctc->state == CTC_STOP) + return; s390irq_spin_lock_irqsave(ctc->irq, saveflags); ctc->ccw[1].cda = (char *)virt_to_phys(ctc->free_anchor->block); parm = (__u32) ctc; @@ -1137,13 +1267,15 @@ __u32 parm; __u8 flags = 0x00; __u32 saveflags; - struct device *dev; + net_device *dev; - dev = (struct device *) ctc->dev; + dev = (net_device *) ctc->dev; #ifdef DEBUG printk(KERN_DEBUG "%s: write retry - state-%02x\n" ,dev->name, ctc->state); #endif + if (ctc->state == CTC_STOP) + return; s390irq_spin_lock_irqsave(ctc->irq, saveflags); ctc->ccw[1].count = 0; ctc->ccw[1].cda = (char *)virt_to_phys(ctc->proc_anchor->block); @@ -1161,7 +1293,7 @@ * ctc_open * */ -static int ctc_open(struct device *dev) +static int ctc_open(net_device *dev) { int rc; int i; @@ -1170,12 +1302,11 @@ __u32 saveflags; __u32 parm; struct ctc_priv *privptr; - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); struct timer_list timer; - dev->tbusy = 1; - dev->start = 0; + ctc_set_busy(dev); privptr = (struct ctc_priv *) (dev->priv); @@ -1188,6 +1319,7 @@ if (rc != 0) return -ENOMEM; } + init_waitqueue_head(&privptr->channel[i].wait); privptr->channel[i].tq.next = NULL; privptr->channel[i].tq.sync = 0; privptr->channel[i].tq.routine = (void *)(void *)ctc_irq_bh; @@ -1264,8 +1396,7 @@ } printk(KERN_INFO "%s: connected with remote side\n",dev->name); - dev->start = 1; - dev->tbusy = 0; + ctc_clear_busy(dev); return 0; } @@ -1273,9 +1404,9 @@ static void ctc_timer (struct channel *ctc) { #ifdef DEBUG - struct device *dev; + net_device *dev; - dev = (struct device *) ctc->dev; + dev = (net_device *) ctc->dev; printk(KERN_DEBUG "%s: timer return\n" ,dev->name); #endif ctc->flag |= CTC_TIMER; @@ -1287,24 +1418,26 @@ * ctc_release * */ -static int ctc_release(struct device *dev) +static int ctc_release(net_device *dev) { int rc; + int x; int i; int j; __u8 flags = 0x00; __u32 saveflags; __u32 parm; struct ctc_priv *privptr; - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); privptr = (struct ctc_priv *) dev->priv; - dev->start = 0; - set_bit(TB_STOP, (void *)&dev->tbusy); - + ctc_protect_busy_irqsave(dev,saveflags); + ctc_setbit_busy(TB_STOP,dev); + ctc_unprotect_busy_irqrestore(dev,flags); for (i = 0; i < 2; i++) { s390irq_spin_lock_irqsave(privptr->channel[i].irq, saveflags); + del_timer(&privptr->channel[READ].timer); privptr->channel[i].state = CTC_STOP; parm = (__u32) &privptr->channel[i]; rc = halt_IO (privptr->channel[i].irq, parm, flags ); @@ -1339,15 +1472,16 @@ * * */ -static int ctc_tx(struct sk_buff *skb, struct device *dev) +static int ctc_tx(struct sk_buff *skb, net_device *dev) { - int rc; + int rc=0,rc2; __u32 parm; __u8 flags = 0x00; __u32 saveflags; struct ctc_priv *privptr; struct packet *lp; + privptr = (struct ctc_priv *) (dev->priv); if (skb == NULL) { @@ -1356,25 +1490,27 @@ return -EIO; } - if (dev->tbusy != 0) { - return -EBUSY; + s390irq_spin_lock_irqsave(privptr->channel[WRITE].irq, saveflags); + if (ctc_check_busy(dev)) { + rc=-EBUSY; + goto Done; } - if (test_and_set_bit(TB_TX, (void *)&dev->tbusy) != 0) { /* set transmission to busy */ - return -EBUSY; + if (ctc_test_and_setbit_busy(TB_TX,dev)) { /* set transmission to busy */ + rc=-EBUSY; + goto Done; } if (65535 - privptr->channel[WRITE].free_anchor->block->length - PACKET_HEADER_LENGTH <= skb->len + PACKET_HEADER_LENGTH + 2) { #ifdef DEBUG printk(KERN_DEBUG "%s: early swap\n", dev->name); #endif - s390irq_spin_lock_irqsave(privptr->channel[WRITE].irq, saveflags); + ctc_buffer_swap(&privptr->channel[WRITE].free_anchor, &privptr->channel[WRITE].proc_anchor); - s390irq_spin_unlock_irqrestore(privptr->channel[WRITE].irq, saveflags); if (privptr->channel[WRITE].free_anchor == NULL){ - set_bit(TB_NOBUFFER, (void *)&dev->tbusy); - clear_bit(TB_TX, (void *)&dev->tbusy); - return -EBUSY; + ctc_setbit_busy(TB_NOBUFFER,dev); + rc=-EBUSY; + goto Done2; } } @@ -1396,23 +1532,22 @@ privptr->channel[WRITE].free_anchor->packets++; if (test_and_set_bit(0, (void *)&privptr->channel[WRITE].IO_active) == 0) { - s390irq_spin_lock_irqsave(privptr->channel[WRITE].irq, saveflags); ctc_buffer_swap(&privptr->channel[WRITE].free_anchor,&privptr->channel[WRITE].proc_anchor); privptr->channel[WRITE].ccw[1].count = privptr->channel[WRITE].proc_anchor->block->length; privptr->channel[WRITE].ccw[1].cda = (char *)virt_to_phys(privptr->channel[WRITE].proc_anchor->block); parm = (__u32) &privptr->channel[WRITE]; - rc = do_IO (privptr->channel[WRITE].irq, &privptr->channel[WRITE].ccw[0], parm, 0xff, flags ); - if (rc != 0) - ccw_check_return_code(dev, rc); + rc2 = do_IO (privptr->channel[WRITE].irq, &privptr->channel[WRITE].ccw[0], parm, 0xff, flags ); + if (rc2 != 0) + ccw_check_return_code(dev, rc2); dev->trans_start = jiffies; - s390irq_spin_unlock_irqrestore(privptr->channel[WRITE].irq, saveflags); } - if (privptr->channel[WRITE].free_anchor == NULL) - set_bit(TB_NOBUFFER, (void *)&dev->tbusy); - - clear_bit(TB_TX, (void *)&dev->tbusy); - return 0; + ctc_setbit_busy(TB_NOBUFFER,dev); +Done2: + ctc_clearbit_busy(TB_TX,dev); +Done: + s390irq_spin_unlock_irqrestore(privptr->channel[WRITE].irq, saveflags); + return(rc); } @@ -1423,7 +1558,7 @@ * 576 to 65527 for OS/390 * */ -static int ctc_change_mtu(struct device *dev, int new_mtu) +static int ctc_change_mtu(net_device *dev, int new_mtu) { if ((new_mtu < 576) || (new_mtu > 65528)) return -EINVAL; @@ -1436,7 +1571,7 @@ * ctc_stats * */ -struct net_device_stats *ctc_stats(struct device *dev) +struct net_device_stats *ctc_stats(net_device *dev) { struct ctc_priv *privptr; diff -urN v2.2.15/linux/drivers/s390/net/iucv.c linux/drivers/s390/net/iucv.c --- v2.2.15/linux/drivers/s390/net/iucv.c Wed May 3 17:16:44 2000 +++ linux/drivers/s390/net/iucv.c Wed Jun 7 14:26:43 2000 @@ -3,9 +3,14 @@ * Network driver for VM using iucv * * S390 version - * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation * Author(s): Stefan Hegewald * Hartmut Penner + * + * 2.3 Updates Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) + * Martin Schwidefsky (schwidefsky@de.ibm.com) + * + */ #ifndef __KERNEL__ @@ -19,8 +24,8 @@ #include /* error codes */ #include /* size_t */ #include /* mark_bh */ -#include /* struct device, and other headers */ -#include /* struct device, and other headers */ +#include /* struct net_device, and other headers */ +#include /* struct net_device, and other headers */ #include #include #include /* struct iphdr */ @@ -31,9 +36,13 @@ #include #include #include +#include #include "iucv.h" + + + #define DEBUG123 #define MAX_DEVICES 10 @@ -47,7 +56,13 @@ static int iucv_pathid[MAX_DEVICES] = {0}; static unsigned char iucv_ext_int_buffer[40] __attribute__((aligned (8))) ={0}; static unsigned char glob_command_buffer[40] __attribute__((aligned (8))); -struct device iucv_devs[]; + +#if LINUX_VERSION_CODE>=0x20300 +typedef struct net_device net_device; +#else +typedef struct device net_device; +#endif +net_device iucv_devs[]; /* This structure is private to each device. It is used to pass */ @@ -73,6 +88,50 @@ short len; }; + + +static __inline__ int netif_is_busy(net_device *dev) +{ +#if LINUX_VERSION_CODE<0x02032D + return(dev->tbusy); +#else + return(test_bit(LINK_STATE_XOFF,&dev->flags)); +#endif +} + + + +#if LINUX_VERSION_CODE<0x02032D +#define netif_enter_interrupt(dev) dev->interrupt=1 +#define netif_exit_interrupt(dev) dev->interrupt=0 +#define netif_start(dev) dev->start=1 +#define netif_stop(dev) dev->start=0 + +static __inline__ void netif_stop_queue(net_device *dev) +{ + dev->tbusy=1; +} + +static __inline__ void netif_start_queue(net_device *dev) +{ + dev->tbusy=0; +} + +static __inline__ void netif_wake_queue(net_device *dev) +{ + dev->tbusy=0; + mark_bh(NET_BH); +} + +#else +#define netif_enter_interrupt(dev) +#define netif_exit_interrupt(dev) +#define netif_start(dev) +#define netif_stop(dev) +#endif + + + /* * Following the iucv primitives */ @@ -292,7 +351,7 @@ /*--------------------------*/ /* Get device from pathid */ /*--------------------------*/ -struct device * get_device_from_pathid(int pathid) +net_device * get_device_from_pathid(int pathid) { int i; for (i=0;i<=MAX_DEVICES;i++) @@ -309,10 +368,10 @@ /*--------------------------*/ /* Get device from userid */ /*--------------------------*/ -struct device * get_device_from_userid(char * userid) +net_device * get_device_from_userid(char * userid) { int i; - struct device * dev; + net_device * dev; struct iucv_priv *privptr; for (i=0;i<=MAX_DEVICES;i++) { @@ -329,7 +388,7 @@ /*--------------------------*/ /* Open iucv Device Driver */ /*--------------------------*/ -int iucv_open(struct device *dev) +int iucv_open(net_device *dev) { int rc; unsigned short iucv_used_pathid; @@ -344,8 +403,8 @@ privptr = (struct iucv_priv *)(dev->priv); if(privptr->pathid != -1) { - dev->start = 1; - dev->tbusy = 0; + netif_start(dev); + netif_start_queue(dev); return 0; } if ((rc = iucv_connect(privptr->command_buffer, @@ -365,8 +424,8 @@ printk( "iucv: iucv_connect ended with rc: %X\n",rc); printk( "iucv[%d] pathid %X \n",(int)(dev-iucv_devs),privptr->pathid); #endif - dev->start = 1; - dev->tbusy = 0; + netif_start(dev); + netif_start_queue(dev); return 0; } @@ -375,7 +434,7 @@ /*-----------------------------------------------------------------------*/ /* Receive a packet: retrieve, encapsulate and pass over to upper levels */ /*-----------------------------------------------------------------------*/ -void iucv_rx(struct device *dev, int len, unsigned char *buf) +void iucv_rx(net_device *dev, int len, unsigned char *buf) { struct sk_buff *skb; @@ -421,13 +480,13 @@ /*----------------------------*/ /* handle interrupts */ /*----------------------------*/ -void do_iucv_interrupt(void) +void do_iucv_interrupt(struct pt_regs *regs, __u16 code) { int rc; struct in_device *indev; struct in_ifaddr *inaddr; unsigned long len=0; - struct device *dev=0; + net_device *dev=0; struct iucv_priv *privptr; INTERRUPT_T * extern_int_buffer; unsigned short iucv_data_len=0; @@ -437,7 +496,7 @@ /* get own buffer: */ extern_int_buffer = (INTERRUPT_T*) iucv_ext_int_buffer; - dev->interrupt = 1; /* lock ! */ + netif_enter_interrupt(dev); /* lock ! */ #ifdef DEBUG printk( "iucv: do_iucv_interrupt %x received; pathid: %02X\n", @@ -539,8 +598,7 @@ dev = get_device_from_pathid(extern_int_buffer->ippathid); privptr = (struct iucv_priv *)(dev->priv); privptr->stats.tx_packets++; - mark_bh(NET_BH); - dev->tbusy = 0; /* transmission is no longer busy*/ + netif_wake_queue(dev); /* transmission is no longer busy*/ break; @@ -602,7 +660,7 @@ iucv_data_len= *((unsigned short*)rcvptr); } while (iucv_data_len != 0); - dev->tbusy = 0; /* transmission is no longer busy*/ + netif_start_queue(dev); /* transmission is no longer busy*/ break; default: @@ -610,7 +668,7 @@ break; } /* end switch */ - dev->interrupt = 0; /* release lock*/ + netif_exit_interrupt(dev); /* release lock*/ #ifdef DEBUG printk( "iucv: leaving do_iucv_interrupt.\n"); @@ -623,7 +681,7 @@ /*-------------------------------------------*/ /* Transmit a packet (low level interface) */ /*-------------------------------------------*/ -int iucv_hw_tx(char *send_buf, int len,struct device *dev) +int iucv_hw_tx(char *send_buf, int len,net_device *dev) { /* This function deals with hw details. */ /* This interface strips off the ethernet header details. */ @@ -689,7 +747,7 @@ /*------------------------------------------*/ /* Transmit a packet (called by the kernel) */ /*------------------------------------------*/ -int iucv_tx(struct sk_buff *skb, struct device *dev) +int iucv_tx(struct sk_buff *skb, net_device *dev) { int retval=0; @@ -714,14 +772,14 @@ printk( "iucv: enter iucv_tx, using %s\n",dev->name); #endif - if (dev->tbusy) /* shouldn't happen*/ + if (netif_is_busy(dev)) /* shouldn't happen */ { privptr->stats.tx_errors++; dev_kfree_skb(skb); printk("iucv: %s: transmit access conflict ! leaving iucv_tx.\n", dev->name); } - dev->tbusy = 1; /* transmission is busy*/ + netif_stop_queue(dev); /* transmission is busy*/ dev->trans_start = jiffies; /* save the timestamp*/ /* actual deliver of data is device-specific, and not shown here */ @@ -744,14 +802,14 @@ /*---------------*/ /* iucv_release */ /*---------------*/ -int iucv_release(struct device *dev) +int iucv_release(net_device *dev) { int rc =0; struct iucv_priv *privptr; privptr = (struct iucv_priv *) (dev->priv); - dev->start = 0; - dev->tbusy = 1; /* can't transmit any more*/ + netif_stop(dev); + netif_stop_queue(dev); /* can't transmit any more*/ rc = iucv_sever(privptr->command_buffer); if (rc!=0) { @@ -772,7 +830,7 @@ /*-----------------------------------------------*/ /* Configuration changes (passed on by ifconfig) */ /*-----------------------------------------------*/ -int iucv_config(struct device *dev, struct ifmap *map) +int iucv_config(net_device *dev, struct ifmap *map) { if (dev->flags & IFF_UP) /* can't act on a running interface*/ return -EBUSY; @@ -789,7 +847,7 @@ /*----------------*/ /* Ioctl commands */ /*----------------*/ -int iucv_ioctl(struct device *dev, struct ifreq *rq, int cmd) +int iucv_ioctl(net_device *dev, struct ifreq *rq, int cmd) { #ifdef DEBUG printk( "iucv: device %s; iucv_ioctl\n",dev->name); @@ -800,7 +858,7 @@ /*---------------------------------*/ /* Return statistics to the caller */ /*---------------------------------*/ -struct net_device_stats *iucv_stats(struct device *dev) +struct net_device_stats *iucv_stats(net_device *dev) { struct iucv_priv *priv = (struct iucv_priv *)dev->priv; #ifdef DEBUG @@ -815,7 +873,7 @@ * IUCV can handle MTU sizes from 576 to approx. 32000 */ -static int iucv_change_mtu(struct device *dev, int new_mtu) +static int iucv_change_mtu(net_device *dev, int new_mtu) { #ifdef DEBUG printk( "iucv: device %s; iucv_change_mtu\n",dev->name); @@ -833,7 +891,7 @@ /* The init function (sometimes called probe).*/ /* It is invoked by register_netdev() */ /*--------------------------------------------*/ -int iucv_init(struct device *dev) +int iucv_init(net_device *dev) { int rc; struct iucv_priv *privptr; @@ -842,6 +900,10 @@ printk( "iucv: iucv_init, device: %s\n",dev->name); #endif + /* request the 0x4000 external interrupt */ + if (register_external_interrupt(0x4000, do_iucv_interrupt) != 0) + panic("Couldn't request external interrupts 0x4000"); + dev->open = iucv_open; dev->stop = iucv_release; dev->set_config = iucv_config; @@ -926,12 +988,15 @@ * * string passed: iucv=userid1,...,useridn */ - -__initfunc(int iucv_setup(char* str, int *ints)) +#if LINUX_VERSION_CODE>=0x020300 +static int __init iucv_setup(char *str) +#else +__initfunc(void iucv_setup(char *str,int *ints)) +#endif { int result=0, i=0,j=0, k=0, device_present=0; char *s = str; - struct device * dev ={0}; + net_device * dev ={0}; #ifdef DEBUG printk( "iucv: start registering device(s)... \n"); @@ -1006,18 +1071,24 @@ #ifdef DEBUG printk( "iucv: end register devices, %d devices present\n",device_present); #endif - return device_present ? 0 : -ENODEV; + /* return device_present ? 0 : -ENODEV; */ +#if LINUX_VERSION_CODE>=0x020300 + return 1; +#else + return; +#endif } - - +#if LINUX_VERSION_CODE>=0x020300 +__setup("iucv=", iucv_setup); +#endif /*-------------*/ /* The devices */ /*-------------*/ char iucv_names[MAX_DEVICES*8]; /* MAX_DEVICES eight-byte buffers */ -struct device iucv_devs[MAX_DEVICES] = { +net_device iucv_devs[MAX_DEVICES] = { { iucv_names, /* name -- set at load time */ 0, 0, 0, 0, /* shmem addresses */ diff -urN v2.2.15/linux/drivers/sbus/audio/audio.c linux/drivers/sbus/audio/audio.c --- v2.2.15/linux/drivers/sbus/audio/audio.c Mon Aug 9 12:05:13 1999 +++ linux/drivers/sbus/audio/audio.c Wed Jun 7 14:26:43 2000 @@ -122,6 +122,7 @@ init_waitqueue_head(&drv->output_write_wait); init_waitqueue_head(&drv->output_drain_wait); init_waitqueue_head(&drv->input_read_wait); + init_waitqueue_head(&drv->poll_wait); #endif drv->num_output_buffers = 8; @@ -310,6 +311,7 @@ if ((status & 1) || ((drv->output_count + drv->playing_count) < drv->num_output_buffers)) { wake_up_interruptible(&drv->output_write_wait); + wake_up_interruptible(&drv->poll_wait); } /* If the output queue is empty, shut down the driver. */ @@ -323,6 +325,7 @@ /* Wake up any waiting writers or syncers and return. */ wake_up_interruptible(&drv->output_write_wait); wake_up_interruptible(&drv->output_drain_wait); + wake_up_interruptible(&drv->poll_wait); return; } @@ -344,6 +347,7 @@ drv->ops->start_input(drv, drv->input_buffers[drv->input_front], drv->input_buffer_size); wake_up_interruptible(&drv->input_read_wait); + wake_up_interruptible(&drv->poll_wait); return; } @@ -379,6 +383,7 @@ /* Wake up any tasks that are waiting. */ wake_up_interruptible(&drv->input_read_wait); + wake_up_interruptible(&drv->poll_wait); } @@ -401,14 +406,14 @@ dprintk(("read ready: c%d o%d\n", drv->input_count, drv->input_offset)); return 1; } - select_wait(&drv->input_read_wait, wait); + select_wait(&drv->poll_wait, wait); break; case SEL_OUT: dprintk(("sel out: c%d o%d p%d\n", drv->output_count, drv->output_offset, drv->playing_count)); if ((drv->output_count + drv->playing_count) < (drv->num_output_buffers)) { return 1; } - select_wait(&drv->output_write_wait, wait); + select_wait(&drv->poll_wait, wait); break; case SEL_EX: break; @@ -424,8 +429,7 @@ struct sparcaudio_driver *drv = drivers[(MINOR(inode->i_rdev) >> SPARCAUDIO_DEVICE_SHIFT)]; - poll_wait(file, &drv->input_read_wait, wait); - poll_wait(file, &drv->output_write_wait, wait); + poll_wait(file, &drv->poll_wait, wait); if (((!file->f_flags & O_NONBLOCK) && drv->input_count) || (drv->input_size > drv->buffer_size)) { mask |= POLLIN | POLLRDNORM; @@ -509,6 +513,7 @@ */ if (drv->duplex == 2) { wake_up_interruptible(&drv->output_write_wait); + wake_up_interruptible(&drv->poll_wait); } } @@ -1188,6 +1193,7 @@ sparcaudio_sync_output(drv); if (drv->output_active) { wake_up_interruptible(&drv->output_write_wait); + wake_up_interruptible(&drv->poll_wait); drv->ops->stop_output(drv); } drv->output_offset = 0; @@ -1204,6 +1210,7 @@ ((unsigned int)arg == FLUSHRW)) { if (drv->input_active && (file->f_mode & FMODE_READ)) { wake_up_interruptible(&drv->input_read_wait); + wake_up_interruptible(&drv->poll_wait); drv->ops->stop_input(drv); drv->input_active = 0; drv->input_front = 0; @@ -1236,6 +1243,7 @@ case AUDIO_FLUSH: if (drv->output_active && (file->f_mode & FMODE_WRITE)) { wake_up_interruptible(&drv->output_write_wait); + wake_up_interruptible(&drv->poll_wait); drv->ops->stop_output(drv); drv->output_active = 0; drv->output_front = 0; @@ -1248,6 +1256,7 @@ } if (drv->input_active && (file->f_mode & FMODE_READ)) { wake_up_interruptible(&drv->input_read_wait); + wake_up_interruptible(&drv->poll_wait); drv->ops->stop_input(drv); drv->input_active = 0; drv->input_front = 0; diff -urN v2.2.15/linux/drivers/sbus/char/envctrl.c linux/drivers/sbus/char/envctrl.c --- v2.2.15/linux/drivers/sbus/char/envctrl.c Mon Nov 16 10:37:28 1998 +++ linux/drivers/sbus/char/envctrl.c Wed Jun 7 14:26:43 2000 @@ -1,7 +1,17 @@ -/* $Id: envctrl.c,v 1.9 1998/11/06 07:38:20 ecd Exp $ +/* $Id: envctrl.c,v 1.9.2.1 2000/05/02 04:23:33 davem Exp $ * envctrl.c: Temperature and Fan monitoring on Machines providing it. * * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) + * Copyright (C) 2000 Vinh Truong (vinh.truong@eng.sun.com) + * VT - The implementation is to support Sun Microelectronics (SME) platform + * environment monitoring. SME platforms use pcf8584 as the i2c bus + * controller to access pcf8591 (8-bit A/D and D/A converter) and + * pcf8571 (256 x 8-bit static low-voltage RAM with I2C-bus interface). + * At board level, it follows SME Firmware I2C Specification. Reference: + * http://www-eu2.semiconductors.com/pip/PCF8584P + * http://www-eu2.semiconductors.com/pip/PCF8574AP + * http://www-eu2.semiconductors.com/pip/PCF8591P + * */ #include @@ -12,6 +22,8 @@ #include #include #include +#include +#include #include #include @@ -19,10 +31,8 @@ #define ENVCTRL_MINOR 162 - #undef DEBUG_BUS_SCAN - #define PCF8584_ADDRESS 0x55 #define CONTROL_PIN 0x80 @@ -57,229 +67,599 @@ #define CLK_8 0x18 #define CLK_12 0x1c +#define OBD_SEND_START 0xc5 /* value to generate I2c_bus START condition */ +#define OBD_SEND_STOP 0xc3 /* value to generate I2c_bus STOP condition */ -#define I2C_WRITE 0x00 -#define I2C_READ 0x01 +/* Monitor type of i2c child device. + * Firmware definitions. + */ +#define PCF8584_MAX_CHANNELS 8 +#define PCF8584_FANSTAT_TYPE 3 /* fan status monitor */ +#define PCF8584_VOLTAGE_TYPE 2 /* voltage monitor */ +#define PCF8584_TEMP_TYPE 1 /* temperature monitor*/ -struct pcf8584_reg -{ - __volatile__ unsigned char data; - __volatile__ unsigned char csr; -}; +/* Monitor type of i2c child device. + * Driver definitions. + */ +#define ENVCTRL_NOMON 0 +#define ENVCTRL_CPUTEMP_MON 1 /* cpu temperature monitor */ +#define ENVCTRL_CPUVOLTAGE_MON 2 /* voltage monitor */ +#define ENVCTRL_FANSTAT_MON 3 /* fan status monitor */ +#define ENVCTRL_ETHERTEMP_MON 4 /* ethernet temperarture */ + /* monitor */ +#define ENVCTRL_VOLTAGESTAT_MON 5 /* voltage status monitor */ +#define ENVCTRL_MTHRBDTEMP_MON 6 /* motherboard temperature */ +#define ENVCTRL_SCSITEMP_MON 7 /* scsi temperarture */ -static struct pcf8584_reg *i2c; +/* Child device type. + * Driver definitions. + */ +#define I2C_ADC 0 /* pcf8591 */ +#define I2C_GPIO 1 /* pcf8571 */ +/* Data read from child device may need to decode + * through a data table and a scale. + * Translation type as defined by firmware. + */ +#define ENVCTRL_TRANSLATE_NO 0 +#define ENVCTRL_TRANSLATE_PARTIAL 1 +#define ENVCTRL_TRANSLATE_COMBINED 2 +#define ENVCTRL_TRANSLATE_FULL 3 /* table[data] */ +#define ENVCTRL_TRANSLATE_SCALE 4 /* table[data]/scale */ + +/* Driver miscellaneous definitions. */ +#define ENVCTRL_MAX_CPU 4 +#define CHANNEL_DESC_SZ 256 + +struct pcf8584_reg { + unsigned char data; + unsigned char csr; +}; -#ifdef DEBUG_BUS_SCAN -struct i2c_addr_map { - unsigned char addr; - unsigned char mask; - char *name; +/* Each child device can be monitored by up to PCF8584_MAX_CHANNELS. + * Property of a port or channel as defined by the firmware. + */ +struct pcf8584_channel { + unsigned char chnl_no; + unsigned char io_direction; + unsigned char type; + unsigned char last; }; -static struct i2c_addr_map devmap[] = { - { 0x38, 0x78, "PCF8574A" }, - { 0x20, 0x78, "TDA8444" }, - { 0x48, 0x78, "PCF8591" }, +/* Each child device may have one or more tables of bytes to help decode + * data. Table property as defined by the firmware. + */ +struct pcf8584_tblprop { + unsigned int type; + unsigned int scale; + unsigned int offset; /* offset from the beginning of the table */ + unsigned int size; }; -#define NR_DEVMAP (sizeof(devmap) / sizeof(devmap[0])) -#endif -static __inline__ int -PUT_DATA(__volatile__ unsigned char *data, char *buffer, int user) +/* i2c child */ +struct i2c_child_t { + /* Either ADC or GPIO. */ + unsigned char i2ctype; + unsigned long addr; + struct pcf8584_channel chnl_array[PCF8584_MAX_CHANNELS]; + + /* Channel info. */ + unsigned int total_chnls; /* Number of monitor channels. */ + unsigned char fan_mask; /* Byte mask for fan status channels. */ + unsigned char voltage_mask; /* Byte mask for voltage status channels. */ + struct pcf8584_tblprop tblprop_array[PCF8584_MAX_CHANNELS]; + + /* Properties of all monitor channels. */ + unsigned int total_tbls; /* Number of monitor tables. */ + char *tables; /* Pointer to table(s). */ + char chnls_desc[CHANNEL_DESC_SZ]; /* Channel description. */ + char mon_type[PCF8584_MAX_CHANNELS]; +}; + +static struct pcf8584_reg *i2c = NULL; +static struct i2c_child_t i2c_childlist[ENVCTRL_MAX_CPU*2]; +static unsigned char chnls_mask[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; +static unsigned int warning_temperature = 0; +static unsigned int shutdown_temperature = 0; +static char read_cpu; + +/* Forward declarations. */ +static struct i2c_child_t *envctrl_get_i2c_child(unsigned char); + +/* Function description: Read a byte from an i2c controller register. + * Return: A byte from the passed in address. + */ +static inline unsigned char envctrl_readb(unsigned char *p) { - if (user) { - if (put_user(*data, buffer)) - return -EFAULT; - } else { - *buffer = *data; - } - return 0; + unsigned char result; + + __asm__ __volatile__("lduba [%1] %2, %0" + : "=r" (result) + : "r" (p), "i" (ASI_PHYS_BYPASS_EC_E)); + return result; } -static __inline__ int -GET_DATA(__volatile__ unsigned char *data, const char *buffer, int user) +/* Function description: Write a byte to an i2c controller register. + * Return: Nothing. + */ +static inline void envctrl_writeb(unsigned char val, unsigned char *p) { - if (user) { - if (get_user(*data, buffer)) - return -EFAULT; - } else { - *data = *buffer; - } - return 0; + __asm__ __volatile__("stba %0, [%1] %2" + : /* no outputs */ + : "r" (val), "r" (p), "i" (ASI_PHYS_BYPASS_EC_E)); } -static int -i2c_read(unsigned char dev, char *buffer, int len, int user) +/* Function Description: Test the PIN bit (Pending Interrupt Not) + * to test when serial transmission is completed . + * Return : None. + */ +static void envtrl_i2c_test_pin(void) { - unsigned char dummy; - unsigned char stat; - int error = -ENODEV; - int count = 0; + int limit = 1000000; - i2c->data = (dev << 1) | I2C_READ; - - while (!(i2c->csr & STATUS_BB)) + while (--limit > 0) { + if(!(envctrl_readb(&i2c->csr) & STATUS_PIN)) + break; udelay(1); + } - i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_STA | CONTROL_ACK; + if (limit <= 0) + printk(KERN_INFO "envctrl: Pin status will not clear.\n"); +} - do { +/* Function Description: Test busy bit. + * Return : None. + */ +static void envctrl_i2c_test_bb(void) +{ + int limit = 1000000; + + while (--limit > 0) { + /* Busy bit 0 means busy. */ + if (envctrl_readb(&i2c->csr) & STATUS_BB) + break; udelay(1); - while ((stat = i2c->csr) & STATUS_PIN) - udelay(1); + } + + if (limit <= 0) + printk(KERN_INFO "envctrl: Busy bit will not clear.\n"); +} - if (stat & STATUS_LRB) - goto stop; +/* Function Description: Send the adress for a read access. + * Return : 0 if not acknowledged, otherwise acknowledged. + */ +static int envctrl_i2c_read_addr(unsigned char addr) +{ + envctrl_i2c_test_bb(); - error = 0; - if (len == 0) { - count--; - break; - } + /* Load address. */ + envctrl_writeb(addr + 1, &i2c->data); - if (count == (len - 1)) - break; + envctrl_i2c_test_bb(); - if (count++ > 0) { - error = PUT_DATA(&i2c->data, buffer++, user); - if (error) - break; - } else - dummy = i2c->data; - } while (1); - - i2c->csr = CONTROL_ES0; - if (!error && (count++ > 0)) - error = PUT_DATA(&i2c->data, buffer++, user); - else - dummy = i2c->data; + envctrl_writeb(OBD_SEND_START, &i2c->csr); - udelay(1); - while ((stat = i2c->csr) & STATUS_PIN) - udelay(1); + /* Wait for PIN. */ + envtrl_i2c_test_pin(); -stop: - i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_STO | CONTROL_ACK; - if (!error && (count++ > 0)) - error = PUT_DATA(&i2c->data, buffer++, user); - else - dummy = i2c->data; - - if (error) - return error; - return count - 1; + /* CSR 0 means acknowledged. */ + if (!(envctrl_readb(&i2c->csr) & STATUS_LRB)) { + return envctrl_readb(&i2c->data); + } else { + envctrl_writeb(OBD_SEND_STOP, &i2c->csr); + return 0; + } } -static int -i2c_write(unsigned char dev, const char *buffer, int len, int user) +/* Function Description: Send the adress for write mode. + * Return : None. + */ +static void envctrl_i2c_write_addr(unsigned char addr) { - int error = -ENODEV; - int count = 0; + envctrl_i2c_test_bb(); + envctrl_writeb(addr, &i2c->data); - while (!(i2c->csr & STATUS_BB)) - udelay(1); + /* Generate Start condition. */ + envctrl_writeb(OBD_SEND_START, &i2c->csr); +} - i2c->data = (dev << 1) | I2C_WRITE; - i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_STA | CONTROL_ACK; +/* Function Description: Read 1 byte of data from addr + * set by envctrl_i2c_read_addr() + * Return : Data from address set by envctrl_i2c_read_addr(). + */ +static unsigned char envctrl_i2c_read_data(void) +{ + envtrl_i2c_test_pin(); + envctrl_writeb(CONTROL_ES0, &i2c->csr); /* Send neg ack. */ + return envctrl_readb(&i2c->data); +} - do { - unsigned char stat; +/* Function Description: Instruct the device which port to read data from. + * Return : None. + */ +static void envctrl_i2c_write_data(unsigned char port) +{ + envtrl_i2c_test_pin(); + envctrl_writeb(port, &i2c->data); +} - udelay(1); - while ((stat = i2c->csr) & STATUS_PIN) - udelay(1); +/* Function Description: Generate Stop condition after last byte is sent. + * Return : None. + */ +static void envctrl_i2c_stop(void) +{ + envtrl_i2c_test_pin(); + envctrl_writeb(OBD_SEND_STOP, &i2c->csr); +} - if (stat & STATUS_LRB) - break; +/* Function Description: Read adc device. + * Return : Data at address and port. + */ +static unsigned char envctrl_i2c_read_8591(unsigned char addr, unsigned char port) +{ + /* Send address. */ + envctrl_i2c_write_addr(addr); - error = count; - if (count == len) - break; + /* Setup port to read. */ + envctrl_i2c_write_data(port); + envctrl_i2c_stop(); - error = GET_DATA(&i2c->data, buffer++, user); - if (error) - break; + /* Read port. */ + envctrl_i2c_read_addr(addr); - count++; - } while (1); + /* Do a single byte read and send stop. */ + envctrl_i2c_read_data(); + envctrl_i2c_stop(); - i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_STO | CONTROL_ACK; - return error; + return envctrl_readb(&i2c->data); } -__initfunc(static int i2c_scan_bus(void)) +/* Function Description: Read gpio device. + * Return : Data at address. + */ +static unsigned char envctrl_i2c_read_8574(unsigned char addr) { - unsigned char dev; - int count = 0; - - for (dev = 1; dev < 128; dev++) { - if (i2c_read(dev, 0, 0, 0) == 0) { -#ifdef DEBUG_BUS_SCAN - int i; - for (i = 0; i < NR_DEVMAP; i++) - if ((dev & devmap[i].mask) == devmap[i].addr) - break; - printk("envctrl: i2c device at %02x: %s\n", dev, - i < NR_DEVMAP ? devmap[i].name : "unknown"); -#endif - count++; + unsigned char rd; + + envctrl_i2c_read_addr(addr); + + /* Do a single byte read and send stop. */ + rd = envctrl_i2c_read_data(); + envctrl_i2c_stop(); + + return rd; +} + +/* Function Description: Decode data read from an adc device using firmware + * table. + * Return: Number of read bytes. Data is stored in bufdata in ascii format. + */ +static int envctrl_i2c_data_translate(unsigned char data, int translate_type, + int scale, char *tbl, char *bufdata) +{ + int len = 0; + + switch (translate_type) { + case ENVCTRL_TRANSLATE_NO: + /* No decode necessary. */ + len = 1; + bufdata[0] = data; + break; + + case ENVCTRL_TRANSLATE_FULL: + /* Decode this way: data = table[data]. */ + len = 1; + bufdata[0] = tbl[data]; + break; + + case ENVCTRL_TRANSLATE_SCALE: + /* Decode this way: data = table[data]/scale */ + sprintf(bufdata,"%d ", (tbl[data] * 10) / (scale)); + len = strlen(bufdata); + bufdata[len - 1] = bufdata[len - 2]; + bufdata[len - 2] = '.'; + break; + + default: + break; + }; + + return len; +} + +/* Function Description: Read cpu-related data such as cpu temperature, voltage. + * Return: Number of read bytes. Data is stored in bufdata in ascii format. + */ +static int envctrl_read_cpu_info(struct i2c_child_t *pchild, + char mon_type, unsigned char *bufdata) +{ + unsigned char data; + int i; + char *tbl, j = -1; + + /* Find the right monitor type and channel. */ + for (i = 0; i< PCF8584_MAX_CHANNELS; i++) { + if (pchild->mon_type[i] == mon_type) { + if (++j == read_cpu) { + break; + } } } - if (!count) { - printk("%s: no devices found\n", __FUNCTION__); - return -ENODEV; - } - return 0; + + if (j != read_cpu) + return 0; + + /* Read data from address and port. */ + data = envctrl_i2c_read_8591((unsigned char)pchild->addr, + (unsigned char)pchild->chnl_array[i].chnl_no); + + /* Find decoding table. */ + tbl = pchild->tables + pchild->tblprop_array[i].offset; + + return envctrl_i2c_data_translate(data, pchild->tblprop_array[i].type, + pchild->tblprop_array[i].scale, + tbl, bufdata); } -static loff_t -envctrl_llseek(struct file *file, loff_t offset, int type) +/* Function Description: Read noncpu-related data such as motherboard + * temperature. + * Return: Number of read bytes. Data is stored in bufdata in ascii format. + */ +static int envctrl_read_noncpu_info(struct i2c_child_t *pchild, + char mon_type, unsigned char *bufdata) { - return -ESPIPE; + unsigned char data; + int i; + char *tbl = NULL; + + for (i = 0; i< PCF8584_MAX_CHANNELS; i++) { + if (pchild->mon_type[i] == mon_type) { + break; + } + } + + if (i >= PCF8584_MAX_CHANNELS) + return 0; + + /* Read data from address and port. */ + data = envctrl_i2c_read_8591((unsigned char)pchild->addr, + (unsigned char)pchild->chnl_array[i].chnl_no); + + /* Find decoding table. */ + tbl = pchild->tables + pchild->tblprop_array[i].offset; + + return envctrl_i2c_data_translate(data, pchild->tblprop_array[i].type, + pchild->tblprop_array[i].scale, + tbl, bufdata); } -static ssize_t -envctrl_read(struct file *file, char *buf, size_t count, loff_t *ppos) -{ - unsigned long addr = (unsigned long)file->private_data; +/* Function Description: Read fan status. + * Return : Always 1 byte. Status stored in bufdata. + */ +static int envctrl_i2c_fan_status(struct i2c_child_t *pchild, + unsigned char data, + char *bufdata) +{ + unsigned char tmp, ret = 0; + int i, j = 0; + + tmp = data & pchild->fan_mask; + + if (tmp == pchild->fan_mask) { + /* All bits are on. All fans are functioning. */ + ret = ENVCTRL_ALL_FANS_GOOD; + } else if (tmp == 0) { + /* No bits are on. No fans are functioning. */ + ret = ENVCTRL_ALL_FANS_BAD; + } else { + /* Go through all channels, mark 'on' the matched bits. + * Notice that fan_mask may have discontiguous bits but + * return mask are always contiguous. For example if we + * monitor 4 fans at channels 0,1,2,4, the return mask + * should be 00010000 if only fan at channel 4 is working. + */ + for (i = 0; i < PCF8584_MAX_CHANNELS;i++) { + if (pchild->fan_mask & chnls_mask[i]) { + if (!(chnls_mask[i] & tmp)) { + ret |= chnls_mask[j]; + } + j++; + } + } + } - return i2c_read(addr, buf, count, 1); + bufdata[0] = ret; + return 1; } +/* Function Description: Read voltage and power supply status. + * Return : Always 1 byte. Status stored in bufdata. + */ +static unsigned char envctrl_i2c_voltage_status(struct i2c_child_t *pchild, + unsigned char data, + char *bufdata) +{ + unsigned char tmp, ret = 0; + int i, j = 0; + + tmp = data & pchild->voltage_mask; + + /* Two channels are used to monitor voltage and power supply. */ + if (tmp == pchild->voltage_mask) { + /* All bits are on. Voltage and power supply are okay. */ + ret = ENVCTRL_VOLTAGE_POWERSUPPLY_GOOD; + } else if (tmp == 0) { + /* All bits are off. Voltage and power supply are bad */ + ret = ENVCTRL_VOLTAGE_POWERSUPPLY_BAD; + } else { + /* Either voltage or power supply has problem. */ + for (i = 0; i < PCF8584_MAX_CHANNELS; i++) { + if (pchild->voltage_mask & chnls_mask[i]) { + j++; + + /* Break out when there is a mismatch. */ + if (!(chnls_mask[i] & tmp)) + break; + } + } + + /* Make a wish that hardware will always use the + * first channel for voltage and the second for + * power supply. + */ + if (j == 1) + ret = ENVCTRL_VOLTAGE_BAD; + else + ret = ENVCTRL_POWERSUPPLY_BAD; + } + + bufdata[0] = ret; + return 1; +} + +/* Function Description: Read a byte from /dev/envctrl. Mapped to user read(). + * Return: Number of read bytes. 0 for error. + */ static ssize_t -envctrl_write(struct file *file, const char *buf, size_t count, loff_t *ppos) +envctrl_read(struct file *file, char *buf, size_t count, loff_t *ppos) { - unsigned long addr = (unsigned long)file->private_data; + struct i2c_child_t *pchild; + unsigned char data[10]; + int ret = 0; + + /* Get the type of read as decided in ioctl() call. + * Find the appropriate i2c child. + * Get the data and put back to the user buffer. + */ + + switch ((int)(long)file->private_data) { + case ENVCTRL_RD_WARNING_TEMPERATURE: + if (warning_temperature == 0) + return 0; + + data[0] = (unsigned char)(warning_temperature); + ret = 1; + copy_to_user((unsigned char*)buf, data, ret); + break; + + case ENVCTRL_RD_SHUTDOWN_TEMPERATURE: + if (shutdown_temperature == 0) + return 0; + + data[0] = (unsigned char)(shutdown_temperature); + ret = 1; + copy_to_user((unsigned char*)buf, data, ret); + break; + + case ENVCTRL_RD_MTHRBD_TEMPERATURE: + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_MTHRBDTEMP_MON))) + return 0; + ret = envctrl_read_noncpu_info(pchild, ENVCTRL_MTHRBDTEMP_MON, data); + copy_to_user((unsigned char*)buf, data, ret); + break; + + case ENVCTRL_RD_CPU_TEMPERATURE: + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON))) + return 0; + ret = envctrl_read_cpu_info(pchild, ENVCTRL_CPUTEMP_MON, data); + + /* Reset cpu to the default cpu0. */ + copy_to_user((unsigned char*)buf, data, ret); + break; + + case ENVCTRL_RD_CPU_VOLTAGE: + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUVOLTAGE_MON))) + return 0; + ret = envctrl_read_cpu_info(pchild, ENVCTRL_CPUVOLTAGE_MON, data); + + /* Reset cpu to the default cpu0. */ + copy_to_user((unsigned char*)buf, data, ret); + break; + + case ENVCTRL_RD_SCSI_TEMPERATURE: + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_SCSITEMP_MON))) + return 0; + ret = envctrl_read_noncpu_info(pchild, ENVCTRL_SCSITEMP_MON, data); + copy_to_user((unsigned char*)buf, data, ret); + break; + + case ENVCTRL_RD_ETHERNET_TEMPERATURE: + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_ETHERTEMP_MON))) + return 0; + ret = envctrl_read_noncpu_info(pchild, ENVCTRL_ETHERTEMP_MON, data); + copy_to_user((unsigned char*)buf, data, ret); + break; + + case ENVCTRL_RD_FAN_STATUS: + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_FANSTAT_MON))) + return 0; + data[0] = envctrl_i2c_read_8574(pchild->addr); + ret = envctrl_i2c_fan_status(pchild,data[0], data); + copy_to_user((unsigned char*)buf, data, ret); + break; + + case ENVCTRL_RD_VOLTAGE_STATUS: + if (!(pchild = envctrl_get_i2c_child(ENVCTRL_VOLTAGESTAT_MON))) + return 0; + data[0] = envctrl_i2c_read_8574(pchild->addr); + ret = envctrl_i2c_voltage_status(pchild, data[0], data); + copy_to_user((unsigned char*)buf, data, ret); + break; + + default: + break; + + }; - return i2c_write(addr, buf, count, 1); + return ret; } +/* Function Description: Command what to read. Mapped to user ioctl(). + * Return: Gives 0 for implemented commands, -EINVAL otherwise. + */ static int envctrl_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - unsigned long data; - int addr; + char *infobuf; switch (cmd) { - case I2CIOCSADR: - if (get_user(addr, (int *)arg)) - return -EFAULT; - data = addr & 0x7f; - file->private_data = (void *)data; - break; - case I2CIOCGADR: - addr = (unsigned long)file->private_data; - if (put_user(addr, (int *)arg)) - return -EFAULT; - break; - default: - return -EINVAL; - } + case ENVCTRL_RD_WARNING_TEMPERATURE: + case ENVCTRL_RD_SHUTDOWN_TEMPERATURE: + case ENVCTRL_RD_MTHRBD_TEMPERATURE: + case ENVCTRL_RD_FAN_STATUS: + case ENVCTRL_RD_VOLTAGE_STATUS: + case ENVCTRL_RD_ETHERNET_TEMPERATURE: + case ENVCTRL_RD_SCSI_TEMPERATURE: + file->private_data = (void *)(long)cmd; + break; + + case ENVCTRL_RD_CPU_TEMPERATURE: + case ENVCTRL_RD_CPU_VOLTAGE: + /* Check to see if application passes in any cpu number, + * the default is cpu0. + */ + infobuf = (char *) arg; + if (infobuf == NULL) { + read_cpu = 0; + }else { + get_user(read_cpu, infobuf); + } + + /* Save the command for use when reading. */ + file->private_data = (void *)(long)cmd; + break; + + default: + return -EINVAL; + }; + return 0; } +/* Function Description: open device. Mapped to user open(). + * Return: Always 0. + */ static int envctrl_open(struct inode *inode, struct file *file) { @@ -288,6 +668,9 @@ return 0; } +/* Function Description: Open device. Mapped to user close(). + * Return: Always 0. + */ static int envctrl_release(struct inode *inode, struct file *file) { @@ -296,11 +679,11 @@ } static struct file_operations envctrl_fops = { - envctrl_llseek, + NULL, envctrl_read, - envctrl_write, + NULL, NULL, /* readdir */ - NULL, /* poll */ + NULL, /* poll */ envctrl_ioctl, NULL, /* mmap */ envctrl_open, @@ -314,6 +697,189 @@ &envctrl_fops }; +/* Function Description: Set monitor type based on firmware description. + * Return: None. + */ +static void envctrl_set_mon(struct i2c_child_t *pchild, + char *chnl_desc, + int chnl_no) +{ + /* Firmware only has temperature type. It does not distinguish + * different kinds of temperatures. We use channel description + * to disinguish them. + */ + if (!(strcmp(chnl_desc,"temp,cpu")) || + !(strcmp(chnl_desc,"temp,cpu0")) || + !(strcmp(chnl_desc,"temp,cpu1")) || + !(strcmp(chnl_desc,"temp,cpu2")) || + !(strcmp(chnl_desc,"temp,cpu3"))) + pchild->mon_type[chnl_no] = ENVCTRL_CPUTEMP_MON; + + if (!(strcmp(chnl_desc,"vddcore,cpu0")) || + !(strcmp(chnl_desc,"vddcore,cpu1")) || + !(strcmp(chnl_desc,"vddcore,cpu2")) || + !(strcmp(chnl_desc,"vddcore,cpu3"))) + pchild->mon_type[chnl_no] = ENVCTRL_CPUVOLTAGE_MON; + + if (!(strcmp(chnl_desc,"temp,motherboard"))) + pchild->mon_type[chnl_no] = ENVCTRL_MTHRBDTEMP_MON; + + if (!(strcmp(chnl_desc,"temp,scsi"))) + pchild->mon_type[chnl_no] = ENVCTRL_SCSITEMP_MON; + + if (!(strcmp(chnl_desc,"temp,ethernet"))) + pchild->mon_type[chnl_no] = ENVCTRL_ETHERTEMP_MON; + + if (!(strcmp(chnl_desc,"temp,ethernet"))) + pchild->mon_type[chnl_no] = ENVCTRL_ETHERTEMP_MON; +} + +/* Function Description: Initialize monitor channel with channel desc, + * decoding tables, monitor type, optional properties. + * Return: None. + */ +static void envctrl_init_adc(struct i2c_child_t *pchild, int node) +{ + char chnls_desc[CHANNEL_DESC_SZ]; + int i, len, j = 0; + char *ptr; + + /* Firmware describe channels into a stream separated by a '\0'. + * Replace all '\0' with a space. + */ + len = prom_getproperty(node, "channels-description", chnls_desc, + CHANNEL_DESC_SZ); + for (i = 0; i < len; i++) { + if (chnls_desc[i] == '\0') + chnls_desc[i] = ' '; + } + + ptr = strtok(chnls_desc, " "); + while (ptr != NULL) { + envctrl_set_mon(pchild, ptr, j); + ptr = strtok(NULL, " "); + j++; + } + + /* Get optional properties. */ + len = prom_getproperty(node, "warning-temp", (char *)&warning_temperature, + sizeof(warning_temperature)); + len = prom_getproperty(node, "shutdown-temp", (char *)&shutdown_temperature, + sizeof(shutdown_temperature)); +} + +/* Function Description: Initialize child device monitoring fan status. + * Return: None. + */ +static void envctrl_init_fanstat(struct i2c_child_t *pchild) +{ + int i; + + /* Go through all channels and set up the mask. */ + for (i = 0; i < pchild->total_chnls; i++) + pchild->fan_mask |= chnls_mask[(pchild->chnl_array[i]).chnl_no]; + + /* We only need to know if this child has fan status monitored. + * We dont care which channels since we have the mask already. + */ + pchild->mon_type[0] = ENVCTRL_FANSTAT_MON; +} + +/* Initialize child device monitoring voltage status. */ +static void envctrl_init_voltage_status(struct i2c_child_t *pchild) +{ + int i; + + /* Go through all channels and set up the mask. */ + for (i = 0; i < pchild->total_chnls; i++) + pchild->voltage_mask |= chnls_mask[(pchild->chnl_array[i]).chnl_no]; + + /* We only need to know if this child has voltage status monitored. + * We dont care which channels since we have the mask already. + */ + pchild->mon_type[0] = ENVCTRL_VOLTAGESTAT_MON; +} + +/* Function Description: Initialize i2c child device. + * Return: None. + */ +static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child, + struct i2c_child_t *pchild) +{ + int node, len, i, tbls_size = 0; + + node = edev_child->prom_node; + + /* Get device address. */ + len = prom_getproperty(node, "reg", (char *)&(pchild->addr), sizeof(pchild->addr)); + + /* Get tables property. Read firmware temperature tables. */ + len = prom_getproperty(node, "translation", (char *)pchild->tblprop_array, + PCF8584_MAX_CHANNELS*sizeof(struct pcf8584_tblprop)); + if (len > 0) { + pchild->total_tbls = len / sizeof(struct pcf8584_tblprop); + for (i = 0; i < pchild->total_tbls; i++) { + if ((pchild->tblprop_array[i].size + pchild->tblprop_array[i].offset) > tbls_size) { + tbls_size = pchild->tblprop_array[i].size + pchild->tblprop_array[i].offset; + } + } + + pchild->tables = kmalloc(tbls_size, GFP_KERNEL); + len = prom_getproperty(node, "tables", (char *)pchild->tables, tbls_size); + if (len <= 0) { + printk("envctrl: Failed to get table.\n"); + return; + } + } + + /* Get the monitor channels. */ + len = prom_getproperty(node, "channels-in-use", (char *)pchild->chnl_array, + PCF8584_MAX_CHANNELS*sizeof(struct pcf8584_channel)); + pchild->total_chnls = len / sizeof(struct pcf8584_channel); + + for (i = 0; i < pchild->total_chnls; i++) { + switch (pchild->chnl_array[i].type) { + case PCF8584_TEMP_TYPE: + envctrl_init_adc(pchild, node); + break; + + case PCF8584_FANSTAT_TYPE: + envctrl_init_fanstat(pchild); + i = pchild->total_chnls; + break; + + case PCF8584_VOLTAGE_TYPE: + if (pchild->i2ctype == I2C_ADC) { + envctrl_init_adc(pchild,node); + } else { + envctrl_init_voltage_status(pchild); + } + i = pchild->total_chnls; + break; + + default: + break; + }; + } +} + +/* Function Description: Search the child device list for a device. + * Return : The i2c child if found. NULL otherwise. + */ +static struct i2c_child_t *envctrl_get_i2c_child(unsigned char mon_type) +{ + int i, j; + + for (i = 0; i < ENVCTRL_MAX_CPU*2; i++) { + for (j = 0; j < PCF8584_MAX_CHANNELS; j++) { + if ( i2c_childlist[i].mon_type[j] == mon_type) { + return (struct i2c_child_t*)(&(i2c_childlist[i])); + } + } + } + return NULL; +} + #ifdef MODULE int init_module(void) #else @@ -321,61 +887,77 @@ #endif { #ifdef CONFIG_PCI - struct linux_ebus *ebus; - struct linux_ebus_device *edev = 0; - int err; - + struct linux_ebus *ebus = NULL; + struct linux_ebus_device *edev = NULL; + struct linux_ebus_child *edev_child = NULL; + int i = 0; + + /* Traverse through ebus and ebus device list for i2c device and + * adc and gpio nodes. + */ for_each_ebus(ebus) { for_each_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "SUNW,envctrl")) - goto ebus_done; - if (!strcmp(edev->prom_name, "SUNW,rasctrl")) - goto ebus_done; + if (!strcmp(edev->prom_name, "i2c")) { + /* In the 2.3.x version we can replace this with just + * an "ioremap()" call, kill envctrl_{readb,writeb}() and + * replace such calls with just a normal {readb,writeb}(). -DaveM + */ + i2c = (struct pcf8584_reg *) __pa(edev->base_address[0]); + for_each_edevchild(edev, edev_child) { + if (!strcmp("gpio", edev_child->prom_name)) { + i2c_childlist[i].i2ctype = I2C_GPIO; + envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++])); + } + if (!strcmp("adc", edev_child->prom_name)) { + i2c_childlist[i].i2ctype = I2C_ADC; + envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++])); + } + } + goto done; + } } } -ebus_done: - if (!edev) { - printk("%s: ebus device not found\n", __FUNCTION__); - return -ENODEV; - } - if (check_region(edev->base_address[0], sizeof(*i2c))) { - printk("%s: Can't get region %lx, %d\n", - __FUNCTION__, edev->base_address[0], (int)sizeof(*i2c)); +done: + if (!edev) { + printk("envctrl: I2C device not found.\n"); return -ENODEV; } - i2c = (struct pcf8584_reg *)edev->base_address[0]; - - request_region((unsigned long)i2c, sizeof(*i2c), "i2c"); - - i2c->csr = CONTROL_PIN; - i2c->data = PCF8584_ADDRESS; - i2c->csr = CONTROL_PIN | CONTROL_ES1; - i2c->data = CLK_4_43 | BUS_CLK_90; - i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_ACK; - mdelay(10); + /* Set device address. */ + envctrl_writeb(CONTROL_PIN, &i2c->csr); + envctrl_writeb(PCF8584_ADDRESS, &i2c->data); + + /* Set system clock and SCL frequencies. */ + envctrl_writeb(CONTROL_PIN | CONTROL_ES1, &i2c->csr); + envctrl_writeb(CLK_4_43 | BUS_CLK_90, &i2c->data); + + /* Enable serial interface. */ + envctrl_writeb(CONTROL_PIN | CONTROL_ES0 | CONTROL_ACK, &i2c->csr); + udelay(200); + /* Register the device as a minor miscellaneous device. */ if (misc_register(&envctrl_dev)) { - printk("%s: unable to get misc minor %d\n", - __FUNCTION__, envctrl_dev.minor); - release_region((unsigned long)i2c, sizeof(*i2c)); + printk("envctrl: Unable to get misc minor %d\n", + envctrl_dev.minor); } - err = i2c_scan_bus(); - if (err) - release_region((unsigned long)i2c, sizeof(*i2c)); - return err; + return 0; #else return -ENODEV; #endif } - #ifdef MODULE void cleanup_module(void) { + int i; + misc_deregister(&envctrl_dev); - release_region((unsigned long)i2c, sizeof(*i2c)); + + for (i = 0; i < ENVCTRL_MAX_CPU * 2; i++) { + if (i2c_childlist[i].tables) + kfree(i2c_childlist[i].tables); + } } #endif diff -urN v2.2.15/linux/drivers/sbus/char/sab82532.c linux/drivers/sbus/char/sab82532.c --- v2.2.15/linux/drivers/sbus/char/sab82532.c Wed May 3 17:16:44 2000 +++ linux/drivers/sbus/char/sab82532.c Wed Jun 7 14:26:43 2000 @@ -1,4 +1,4 @@ -/* $Id: sab82532.c,v 1.30.2.2 1999/10/12 14:11:20 davem Exp $ +/* $Id: sab82532.c,v 1.30.2.4 2000/05/27 04:46:34 davem Exp $ * sab82532.c: ASYNC Driver for the SIEMENS SAB82532 DUSCC. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -2065,7 +2065,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -2146,7 +2146,7 @@ __initfunc(static inline void show_serial_version(void)) { - char *revision = "$Revision: 1.30.2.2 $"; + char *revision = "$Revision: 1.30.2.4 $"; char *version, *p; version = strchr(revision, ' '); diff -urN v2.2.15/linux/drivers/sbus/char/su.c linux/drivers/sbus/char/su.c --- v2.2.15/linux/drivers/sbus/char/su.c Wed May 3 17:16:44 2000 +++ linux/drivers/sbus/char/su.c Wed Jun 7 14:26:43 2000 @@ -1,4 +1,4 @@ -/* $Id: su.c,v 1.18.2.5 1999/10/14 08:44:35 davem Exp $ +/* $Id: su.c,v 1.18.2.7 2000/05/27 04:46:34 davem Exp $ * su.c: Small serial driver for keyboard/mouse interface on sparc32/PCI * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -2207,7 +2207,7 @@ done: if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -2226,7 +2226,7 @@ */ __initfunc(static __inline__ void show_su_version(void)) { - char *revision = "$Revision: 1.18.2.5 $"; + char *revision = "$Revision: 1.18.2.7 $"; char *version, *p; version = strchr(revision, ' '); diff -urN v2.2.15/linux/drivers/sbus/char/sunmouse.c linux/drivers/sbus/char/sunmouse.c --- v2.2.15/linux/drivers/sbus/char/sunmouse.c Tue Jan 4 10:12:19 2000 +++ linux/drivers/sbus/char/sunmouse.c Wed Jun 7 14:26:43 2000 @@ -524,13 +524,14 @@ /* This is a buggy application doing termios on the mouse driver */ /* we ignore it. I keep this check here so that we will notice */ /* future mouse vuid ioctls */ - break; + return -ENOTTY; + default: #ifdef DEBUG printk ("[MOUSE-ioctl: %8.8x]\n", cmd); #endif - return -1; + return -EINVAL; } return 0; } diff -urN v2.2.15/linux/drivers/sbus/char/zs.c linux/drivers/sbus/char/zs.c --- v2.2.15/linux/drivers/sbus/char/zs.c Wed May 3 17:16:44 2000 +++ linux/drivers/sbus/char/zs.c Wed Jun 7 14:26:43 2000 @@ -1,4 +1,4 @@ -/* $Id: zs.c,v 1.41.2.5 2000/01/21 01:05:47 davem Exp $ +/* $Id: zs.c,v 1.41.2.6 2000/04/17 05:46:05 davem Exp $ * zs.c: Zilog serial port driver for the Sparc. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -1857,7 +1857,7 @@ static void show_serial_version(void) { - char *revision = "$Revision: 1.41.2.5 $"; + char *revision = "$Revision: 1.41.2.6 $"; char *version, *p; version = strchr(revision, ' '); diff -urN v2.2.15/linux/drivers/scsi/ChangeLog.ips linux/drivers/scsi/ChangeLog.ips --- v2.2.15/linux/drivers/scsi/ChangeLog.ips Tue Oct 26 17:53:41 1999 +++ linux/drivers/scsi/ChangeLog.ips Wed Jun 7 14:26:43 2000 @@ -1,25 +1,53 @@ -Change Log -~~~~~~~~~~ +IBM ServeRAID driver Change Log +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 4.00.06 - Fix timeout with initial FFDC command + + 4.00.05 - Remove wish_block from init routine + - Use linux/spinlock.h instead of asm/spinlock.h for kernels + 2.3.18 and later + - Sync with other changes from the 2.3 kernels - 1.00.00 - Initial Public Release - - Functionally equivalent to 0.99.05 + 4.00.04 - Rename structures/constants to be prefixed with IPS_ + + 4.00.03 - Add alternative passthru interface + - Add ability to flash ServeRAID BIOS + + 4.00.02 - Fix problem with PT DCDB with no buffer + + 4.00.01 - Add support for First Failure Data Capture + + 4.00.00 - Add support for ServeRAID 4 + + 3.60.02 - Make DCDB direction based on lookup table. + - Only allow one DCDB command to a SCSI ID at a time. + + 3.60.01 - Remove bogus error check in passthru routine. + + 3.60.00 - Bump max commands to 128 for use with ServeRAID + firmware 3.60. + - Change version to 3.60 to coincide with ServeRAID release + numbering. + + 1.00.00 - Initial Public Release + - Functionally equivalent to 0.99.05 0.99.05 - Fix an oops on certain passthru commands - 0.99.04 - Fix race condition in the passthru mechanism + 0.99.04 - Fix race condition in the passthru mechanism -- this required the interface to the utilities to change - - Fix error recovery code + - Fix error recovery code - 0.99.03 - Make interrupt routine handle all completed request on the - adapter not just the first one - - Make sure passthru commands get woken up if we run out of - SCBs - - Send all of the commands on the queue at once rather than - one at a time since the card will support it. + 0.99.03 - Make interrupt routine handle all completed request on the + adapter not just the first one + - Make sure passthru commands get woken up if we run out of + SCBs + - Send all of the commands on the queue at once rather than + one at a time since the card will support it. - 0.99.02 - Added some additional debug statements to print out + 0.99.02 - Added some additional debug statements to print out errors if an error occurs while trying to read/write to a logical drive (IPS_DEBUG). - Fixed read/write errors when the adapter is using an + - Fixed read/write errors when the adapter is using an 8K stripe size. + diff -urN v2.2.15/linux/drivers/scsi/aha152x.c linux/drivers/scsi/aha152x.c --- v2.2.15/linux/drivers/scsi/aha152x.c Wed Aug 25 17:29:48 1999 +++ linux/drivers/scsi/aha152x.c Wed Jun 7 14:26:43 2000 @@ -572,8 +572,11 @@ "Adaptec AHA-1520 BIOS", 0x102e, 21 }, /* Adaptec 152x */ { - "Adaptec AHA-1520B", 0x0b, 19 + "Adaptec AHA-1520B", 0x0b, 17 }, /* Adaptec 152x rev B */ + { + "Adaptec AHA-1520B", 0x26, 17 + }, /* Iomega Jaz Jet ISA (AIC6370Q) */ { "Adaptec ASW-B626 BIOS", 0x1029, 21 }, /* on-board controller */ diff -urN v2.2.15/linux/drivers/scsi/esp.c linux/drivers/scsi/esp.c --- v2.2.15/linux/drivers/scsi/esp.c Wed May 3 17:16:44 2000 +++ linux/drivers/scsi/esp.c Wed Jun 7 14:26:43 2000 @@ -4316,6 +4316,13 @@ } #endif +int esp_revoke(Scsi_Device* SDptr) +{ + struct Sparc_ESP *esp = (struct Sparc_ESP *) SDptr->host->hostdata; + esp->targets_present &= ~(1 << SDptr->id); + return 0; +} + #ifdef MODULE Scsi_Host_Template driver_template = SCSI_SPARC_ESP; diff -urN v2.2.15/linux/drivers/scsi/esp.h linux/drivers/scsi/esp.h --- v2.2.15/linux/drivers/scsi/esp.h Tue May 11 10:36:36 1999 +++ linux/drivers/scsi/esp.h Wed Jun 7 14:26:43 2000 @@ -413,6 +413,7 @@ extern int esp_reset(Scsi_Cmnd *, unsigned int); extern int esp_proc_info(char *buffer, char **start, off_t offset, int length, int hostno, int inout); +extern int esp_revoke(Scsi_Device* SDptr); extern struct proc_dir_entry proc_scsi_esp; @@ -421,6 +422,7 @@ proc_info: &esp_proc_info, \ name: "Sun ESP 100/100a/200", \ detect: esp_detect, \ + revoke: esp_revoke, \ info: esp_info, \ command: esp_command, \ queuecommand: esp_queue, \ diff -urN v2.2.15/linux/drivers/scsi/hosts.h linux/drivers/scsi/hosts.h --- v2.2.15/linux/drivers/scsi/hosts.h Wed May 3 17:16:45 2000 +++ linux/drivers/scsi/hosts.h Wed Jun 7 14:26:43 2000 @@ -96,6 +96,8 @@ */ int (* detect)(struct SHT *); + int (*revoke)(Scsi_Device *); + /* Used with loadable modules to unload the host structures. Note: * there is a default action built into the modules code which may * be sufficient for most host adapters. Thus you may not have to supply diff -urN v2.2.15/linux/drivers/scsi/ide-scsi.c linux/drivers/scsi/ide-scsi.c --- v2.2.15/linux/drivers/scsi/ide-scsi.c Tue Jan 4 10:12:20 2000 +++ linux/drivers/scsi/ide-scsi.c Wed Jun 7 14:26:43 2000 @@ -364,7 +364,7 @@ pc->actually_transferred += temp; pc->current_position += temp; idescsi_discard_data (drive,bcount - temp); - ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc)); + ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), NULL); return ide_started; } #if IDESCSI_DEBUG_LOG @@ -388,7 +388,7 @@ pc->actually_transferred+=bcount; /* Update the current position */ pc->current_position+=bcount; - ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc)); /* And set the interrupt handler again */ + ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), NULL); /* And set the interrupt handler again */ return ide_started; } @@ -408,7 +408,7 @@ printk (KERN_ERR "ide-scsi: (IO,CoD) != (0,1) while issuing a packet command\n"); return ide_do_reset (drive); } - ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc)); /* Set the interrupt routine */ + ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), NULL); /* Set the interrupt routine */ atapi_output_bytes (drive, scsi->pc->c, 12); /* Send the actual packet */ return ide_started; } @@ -442,7 +442,7 @@ (void) (HWIF(drive)->dmaproc(ide_dma_begin, drive)); } if (test_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags)) { - ide_set_handler (drive, &idescsi_transfer_pc, get_timeout(pc)); + ide_set_handler (drive, &idescsi_transfer_pc, get_timeout(pc), NULL); OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* Issue the packet command */ return ide_started; } else { diff -urN v2.2.15/linux/drivers/scsi/ini9100u.c linux/drivers/scsi/ini9100u.c --- v2.2.15/linux/drivers/scsi/ini9100u.c Wed Aug 25 17:29:48 1999 +++ linux/drivers/scsi/ini9100u.c Wed Jun 7 14:26:43 2000 @@ -576,28 +576,28 @@ switch (i) { #if LINUX_VERSION_CODE >= CVT_LINUX_VERSION(1,3,0) case 0: - ok = request_irq(pHCB->HCS_Intr, i91u_intr0, SA_INTERRUPT | SA_SHIRQ, "i91u", NULL); + ok = request_irq(pHCB->HCS_Intr, i91u_intr0, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); break; case 1: - ok = request_irq(pHCB->HCS_Intr, i91u_intr1, SA_INTERRUPT | SA_SHIRQ, "i91u", NULL); + ok = request_irq(pHCB->HCS_Intr, i91u_intr1, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); break; case 2: - ok = request_irq(pHCB->HCS_Intr, i91u_intr2, SA_INTERRUPT | SA_SHIRQ, "i91u", NULL); + ok = request_irq(pHCB->HCS_Intr, i91u_intr2, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); break; case 3: - ok = request_irq(pHCB->HCS_Intr, i91u_intr3, SA_INTERRUPT | SA_SHIRQ, "i91u", NULL); + ok = request_irq(pHCB->HCS_Intr, i91u_intr3, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); break; case 4: - ok = request_irq(pHCB->HCS_Intr, i91u_intr4, SA_INTERRUPT | SA_SHIRQ, "i91u", NULL); + ok = request_irq(pHCB->HCS_Intr, i91u_intr4, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); break; case 5: - ok = request_irq(pHCB->HCS_Intr, i91u_intr5, SA_INTERRUPT | SA_SHIRQ, "i91u", NULL); + ok = request_irq(pHCB->HCS_Intr, i91u_intr5, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); break; case 6: - ok = request_irq(pHCB->HCS_Intr, i91u_intr6, SA_INTERRUPT | SA_SHIRQ, "i91u", NULL); + ok = request_irq(pHCB->HCS_Intr, i91u_intr6, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); break; case 7: - ok = request_irq(pHCB->HCS_Intr, i91u_intr7, SA_INTERRUPT | SA_SHIRQ, "i91u", NULL); + ok = request_irq(pHCB->HCS_Intr, i91u_intr7, SA_INTERRUPT | SA_SHIRQ, "i91u", hreg); break; default: i91u_panic("i91u: Too many host adapters\n"); diff -urN v2.2.15/linux/drivers/scsi/ips.c linux/drivers/scsi/ips.c --- v2.2.15/linux/drivers/scsi/ips.c Tue Jan 4 10:12:20 2000 +++ linux/drivers/scsi/ips.c Wed Jun 7 14:26:43 2000 @@ -66,6 +66,17 @@ /* 3.60.01 - Remove bogus error check in passthru routine */ /* 3.60.02 - Make DCDB direction based on lookup table */ /* - Only allow one DCDB command to a SCSI ID at a time */ +/* 4.00.00 - Add support for ServeRAID 4 */ +/* 4.00.01 - Add support for First Failure Data Capture */ +/* 4.00.02 - Fix problem with PT DCDB with no buffer */ +/* 4.00.03 - Add alternative passthru interface */ +/* - Add ability to flash ServeRAID BIOS */ +/* 4.00.04 - Rename structures/constants to be prefixed with IPS_ */ +/* 4.00.05 - Remove wish_block from init routine */ +/* - Use linux/spinlock.h instead of asm/spinlock.h for kernels */ +/* 2.3.18 and later */ +/* - Sync with other changes from the 2.3 kernels */ +/* 4.00.06 - Fix timeout with initial FFDC command */ /* */ /*****************************************************************************/ @@ -109,17 +120,23 @@ #include "ips.h" #include -#include #include + +#if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,18) +#include +#else #include +#endif + #include /* * DRIVER_VER */ -#define IPS_VERSION_HIGH "3.60" /* MUST be 4 chars */ -#define IPS_VERSION_LOW ".02 " /* MUST be 4 chars */ +#define IPS_VERSION_HIGH "4.00" /* MUST be 4 chars */ +#define IPS_VERSION_LOW ".06 " /* MUST be 4 chars */ +#if LINUX_VERSION_CODE < LinuxVersionCode(2,3,27) struct proc_dir_entry proc_scsi_ips = { #if !defined(PROC_SCSI_IPS) 0, /* Use dynamic inode allocation */ @@ -128,10 +145,8 @@ #endif 3, "ips", S_IFDIR | S_IRUGO | S_IXUGO, 2 -}; - -#if LINUX_VERSION_CODE < LinuxVersionCode(2,1,93) - #include +} +; #endif #if !defined(__i386__) @@ -147,7 +162,7 @@ #endif #if IPS_DEBUG >= 12 - #define DBG(s) printk(KERN_NOTICE s "\n"); MDELAY(2*ONE_SEC) + #define DBG(s) printk(KERN_NOTICE s "\n"); MDELAY(2*IPS_ONE_SEC) #elif IPS_DEBUG >= 11 #define DBG(s) printk(KERN_NOTICE s "\n") #else @@ -164,7 +179,7 @@ static int ips_cmd_timeout = 60; static int ips_reset_timeout = 60 * 5; -#define MAX_ADAPTER_NAME 6 +#define MAX_ADAPTER_NAME 7 static char ips_adapter_name[][30] = { "ServeRAID", @@ -172,64 +187,65 @@ "ServeRAID on motherboard", "ServeRAID on motherboard", "ServeRAID 3H", - "ServeRAID 3L" + "ServeRAID 3L", + "ServeRAID 4H" }; /* * Direction table */ static char ips_command_direction[] = { -IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, -IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, -IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, -IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_OUT, -IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT, -IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_IN, -IPS_DATA_UNK, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_UNK, -IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, -IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, -IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, -IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, -IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_NONE, -IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, -IPS_DATA_NONE, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_NONE, -IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_OUT, -IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_NONE, -IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_OUT, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK +IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, +IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, +IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, +IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_OUT, +IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT, +IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_IN, +IPS_DATA_UNK, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_UNK, +IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, +IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, +IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, +IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, +IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_NONE, +IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, +IPS_DATA_NONE, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_NONE, +IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_OUT, +IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_NONE, +IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_OUT, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, +IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK }; /* @@ -247,8 +263,8 @@ void do_ipsintr(int, void *, struct pt_regs *); static int ips_hainit(ips_ha_t *); static int ips_map_status(ips_scb_t *, ips_stat_t *); -static int ips_send(ips_ha_t *, ips_scb_t *, scb_callback); -static int ips_send_wait(ips_ha_t *, ips_scb_t *, int); +static int ips_send(ips_ha_t *, ips_scb_t *, ips_scb_callback); +static int ips_send_wait(ips_ha_t *, ips_scb_t *, int, int); static int ips_send_cmd(ips_ha_t *, ips_scb_t *); static int ips_chkstatus(ips_ha_t *); static int ips_online(ips_ha_t *, ips_scb_t *); @@ -262,14 +278,14 @@ static int ips_issue(ips_ha_t *, ips_scb_t *); static int ips_isintr(ips_ha_t *); static int ips_wait(ips_ha_t *, int, int); -static int ips_write_driver_status(ips_ha_t *); -static int ips_read_adapter_status(ips_ha_t *); -static int ips_read_subsystem_parameters(ips_ha_t *); -static int ips_read_config(ips_ha_t *); -static int ips_clear_adapter(ips_ha_t *); -static int ips_readwrite_page5(ips_ha_t *, int); +static int ips_write_driver_status(ips_ha_t *, int); +static int ips_read_adapter_status(ips_ha_t *, int); +static int ips_read_subsystem_parameters(ips_ha_t *, int); +static int ips_read_config(ips_ha_t *, int); +static int ips_clear_adapter(ips_ha_t *, int); +static int ips_readwrite_page5(ips_ha_t *, int, int); static void ips_intr(ips_ha_t *); -static void ips_next(ips_ha_t *); +static void ips_next(ips_ha_t *, int); static void ipsintr_blocking(ips_ha_t *, struct ips_scb *); static void ipsintr_done(ips_ha_t *, struct ips_scb *); static void ips_done(ips_ha_t *, ips_scb_t *); @@ -277,6 +293,9 @@ static void ips_init_scb(ips_ha_t *, ips_scb_t *); static void ips_freescb(ips_ha_t *, ips_scb_t *); static void ips_statinit(ips_ha_t *); +static void ips_fix_ffdc_time(ips_ha_t *, ips_scb_t *, time_t); +static void ips_ffdc_reset(ips_ha_t *, int); +static void ips_ffdc_time(ips_ha_t *, int); static ips_scb_t * ips_getscb(ips_ha_t *); static inline void ips_putq_scb_head(ips_scb_queue_t *, ips_scb_t *); static inline void ips_putq_scb_tail(ips_scb_queue_t *, ips_scb_t *); @@ -286,17 +305,26 @@ static inline void ips_putq_wait_tail(ips_wait_queue_t *, Scsi_Cmnd *); static inline Scsi_Cmnd * ips_removeq_wait_head(ips_wait_queue_t *); static inline Scsi_Cmnd * ips_removeq_wait(ips_wait_queue_t *, Scsi_Cmnd *); +static inline void ips_putq_copp_head(ips_copp_queue_t *, ips_copp_wait_item_t *); +static inline void ips_putq_copp_tail(ips_copp_queue_t *, ips_copp_wait_item_t *); +static inline ips_copp_wait_item_t * ips_removeq_copp(ips_copp_queue_t *, ips_copp_wait_item_t *); +static inline ips_copp_wait_item_t * ips_removeq_copp_head(ips_copp_queue_t *); +static int ips_erase_bios(ips_ha_t *); +static int ips_program_bios(ips_ha_t *, char *, int); +static int ips_verify_bios(ips_ha_t *, char *, int); #ifndef NO_IPS_CMDLINE static int ips_is_passthru(Scsi_Cmnd *); static int ips_make_passthru(ips_ha_t *, Scsi_Cmnd *, ips_scb_t *); static int ips_usrcmd(ips_ha_t *, ips_passthru_t *, ips_scb_t *); +static int ips_newusrcmd(ips_ha_t *, ips_passthru_t *, ips_scb_t *); +static void ips_cleanup_passthru(ips_ha_t *, ips_scb_t *); #endif int ips_proc_info(char *, char **, off_t, int, int, int); static int ips_host_info(ips_ha_t *, char *, off_t, int); -static void copy_mem_info(INFOSTR *, char *, int); -static int copy_info(INFOSTR *, char *, ...); +static void copy_mem_info(IPS_INFOSTR *, char *, int); +static int copy_info(IPS_INFOSTR *, char *, ...); /*--------------------------------------------------------------------------*/ /* Exported Functions */ @@ -310,6 +338,8 @@ /* */ /* Detect and initialize the driver */ /* */ +/* NOTE: this routine is called under the io_request_lock spinlock */ +/* */ /****************************************************************************/ int ips_detect(Scsi_Host_Template *SHT) { @@ -317,6 +347,7 @@ ips_ha_t *ha; u32 io_addr; u16 planer; + u8 revision_id; u8 bus; u8 func; u8 irq; @@ -326,7 +357,11 @@ DBG("ips_detect"); SHT->proc_info = ips_proc_info; +#if LINUX_VERSION_CODE < LinuxVersionCode(2,3,27) SHT->proc_dir = &proc_scsi_ips; +#else + SHT->proc_name = "ips"; +#endif #if defined(CONFIG_PCI) @@ -345,7 +380,6 @@ irq = dev->irq; bus = dev->bus->number; func = dev->devfn; - io_addr = dev->base_address[0]; /* get planer status */ if (pci_read_config_word(dev, 0x04, &planer)) { @@ -356,9 +390,21 @@ } /* check I/O address */ +#if LINUX_VERSION_CODE < LinuxVersionCode(2,3,13) + io_addr = dev->base_address[0]; + if ((io_addr & PCI_BASE_ADDRESS_SPACE) != PCI_BASE_ADDRESS_SPACE_IO) continue; + /* get the BASE IO Address */ + io_addr &= PCI_BASE_ADDRESS_IO_MASK; +#else + io_addr = dev->resource[0].start; + + if ((dev->resource[0].flags & PCI_BASE_ADDRESS_SPACE) != PCI_BASE_ADDRESS_SPACE_IO) + continue; +#endif + /* check to see if an onboard planer controller is disabled */ if (!(planer & 0x000C)) { @@ -370,14 +416,19 @@ continue; } - /* get the BASE IO Address */ - io_addr &= PCI_BASE_ADDRESS_IO_MASK; - #ifdef IPS_PCI_PROBE_DEBUG printk(KERN_NOTICE "(%s%d) detect bus %d, func %x, irq %d, io %x\n", ips_name, index, bus, func, irq, io_addr); #endif + /* get the revision ID */ + if (pci_read_config_byte(dev, 0x08, &revision_id)) { + printk(KERN_WARNING "(%s%d) can't get revision id.\n", + ips_name, index); + + continue; + } + /* found a controller */ sh = scsi_register(SHT, sizeof(ips_ha_t)); @@ -388,19 +439,23 @@ continue; } - ha = HA(sh); + ha = IPS_HA(sh); memset(ha, 0, sizeof(ips_ha_t)); /* Initialize spin lock */ spin_lock_init(&ha->scb_lock); spin_lock_init(&ha->copp_lock); + spin_lock_init(&ha->ips_lock); + spin_lock_init(&ha->copp_waitlist.lock); + spin_lock_init(&ha->scb_waitlist.lock); + spin_lock_init(&ha->scb_activelist.lock); ips_sh[ips_num_controllers] = sh; ips_ha[ips_num_controllers] = ha; ips_num_controllers++; ha->active = 1; - ha->enq = kmalloc(sizeof(ENQCMD), GFP_KERNEL|GFP_DMA); + ha->enq = kmalloc(sizeof(IPS_ENQ), GFP_KERNEL|GFP_DMA); if (!ha->enq) { printk(KERN_WARNING "(%s%d) Unable to allocate host inquiry structure - skipping contoller\n", @@ -411,7 +466,7 @@ continue; } - ha->adapt = kmalloc(sizeof(ADAPTER_AREA), GFP_KERNEL|GFP_DMA); + ha->adapt = kmalloc(sizeof(IPS_ADAPTER), GFP_KERNEL|GFP_DMA); if (!ha->adapt) { printk(KERN_WARNING "(%s%d) Unable to allocate host adapt structure - skipping controller\n", @@ -422,7 +477,7 @@ continue; } - ha->conf = kmalloc(sizeof(CONFCMD), GFP_KERNEL|GFP_DMA); + ha->conf = kmalloc(sizeof(IPS_CONF), GFP_KERNEL|GFP_DMA); if (!ha->conf) { printk(KERN_WARNING "(%s%d) Unable to allocate host conf structure - skipping controller\n", @@ -433,7 +488,7 @@ continue; } - ha->nvram = kmalloc(sizeof(NVRAM_PAGE5), GFP_KERNEL|GFP_DMA); + ha->nvram = kmalloc(sizeof(IPS_NVRAM_P5), GFP_KERNEL|GFP_DMA); if (!ha->nvram) { printk(KERN_WARNING "(%s%d) Unable to allocate host nvram structure - skipping controller\n", @@ -444,7 +499,7 @@ continue; } - ha->subsys = kmalloc(sizeof(SUBSYS_PARAM), GFP_KERNEL|GFP_DMA); + ha->subsys = kmalloc(sizeof(IPS_SUBSYS), GFP_KERNEL|GFP_DMA); if (!ha->subsys) { printk(KERN_WARNING "(%s%d) Unable to allocate host subsystem structure - skipping controller\n", @@ -455,7 +510,7 @@ continue; } - ha->dummy = kmalloc(sizeof(BASIC_IO_CMD), GFP_KERNEL|GFP_DMA); + ha->dummy = kmalloc(sizeof(IPS_IO_CMD), GFP_KERNEL|GFP_DMA); if (!ha->dummy) { printk(KERN_WARNING "(%s%d) Unable to allocate host dummy structure - skipping controller\n", @@ -466,6 +521,17 @@ continue; } + ha->ioctl_data = kmalloc(IPS_IOCTL_SIZE, GFP_KERNEL|GFP_DMA); + ha->ioctl_datasize = IPS_IOCTL_SIZE; + if (!ha->ioctl_data) { + printk(KERN_WARNING "(%s%d) Unable to allocate ioctl data - skipping controller\n", + ips_name, index); + + ha->active = 0; + + continue; + } + /* Store away needed values for later use */ sh->io_port = io_addr; sh->n_io_port = 255; @@ -477,12 +543,12 @@ sh->cmd_per_lun = sh->hostt->cmd_per_lun; sh->unchecked_isa_dma = sh->hostt->unchecked_isa_dma; sh->use_clustering = sh->hostt->use_clustering; - sh->wish_block = FALSE; /* Store info in HA structure */ ha->io_addr = io_addr; ha->irq = irq; ha->host_num = index; + ha->revision_id = revision_id; /* install the interrupt handler */ if (request_irq(irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) { @@ -509,7 +575,7 @@ } memset(ha->scbs, 0, sizeof(ips_scb_t)); - ha->scbs->sg_list = (SG_LIST *) kmalloc(sizeof(SG_LIST) * MAX_SG_ELEMENTS, GFP_KERNEL|GFP_DMA); + ha->scbs->sg_list = (IPS_SG_LIST *) kmalloc(sizeof(IPS_SG_LIST) * IPS_MAX_SG, GFP_KERNEL|GFP_DMA); if (!ha->scbs->sg_list) { /* couldn't allocate a temp SCB S/G list */ printk(KERN_WARNING "(%s%d) unable to allocate CCBs - skipping contoller\n", @@ -587,7 +653,7 @@ panic("(%s) release, invalid Scsi_Host pointer.\n", ips_name); - ha = HA(sh); + ha = IPS_HA(sh); if (!ha) return (FALSE); @@ -598,11 +664,11 @@ ips_init_scb(ha, scb); scb->timeout = ips_cmd_timeout; - scb->cdb[0] = FLUSH_CACHE; + scb->cdb[0] = IPS_CMD_FLUSH; - scb->cmd.flush_cache.op_code = FLUSH_CACHE; + scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH; scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.flush_cache.state = NORM_STATE; + scb->cmd.flush_cache.state = IPS_NORM_STATE; scb->cmd.flush_cache.reserved = 0; scb->cmd.flush_cache.reserved2 = 0; scb->cmd.flush_cache.reserved3 = 0; @@ -611,7 +677,7 @@ printk("(%s%d) Flushing Cache.\n", ips_name, ha->host_num); /* send command */ - if (ips_send_wait(ha, scb, ips_cmd_timeout) == IPS_FAILURE) + if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == IPS_FAILURE) printk("(%s%d) Incomplete Flush.\n", ips_name, ha->host_num); printk("(%s%d) Flushing Complete.\n", ips_name, ha->host_num); @@ -643,6 +709,7 @@ int ips_eh_abort(Scsi_Cmnd *SC) { ips_ha_t *ha; + ips_copp_wait_item_t *item; DBG("ips_eh_abort"); @@ -669,9 +736,23 @@ if (test_and_set_bit(IPS_IN_ABORT, &ha->flags)) return (FAILED); + /* See if the command is on the copp queue */ + IPS_QUEUE_LOCK(&ha->copp_waitlist); + item = ha->copp_waitlist.head; + while ((item) && (item->scsi_cmd != SC)) + item = item->next; + IPS_QUEUE_UNLOCK(&ha->copp_waitlist); + + if (item) { + /* Found it */ + ips_removeq_copp(&ha->copp_waitlist, item); + clear_bit(IPS_IN_ABORT, &ha->flags); + + return (SUCCESS); + } + /* See if the command is on the wait queue */ - if (ips_removeq_wait(&ha->scb_waitlist, SC) || - ips_removeq_wait(&ha->copp_waitlist, SC)) { + if (ips_removeq_wait(&ha->scb_waitlist, SC)) { /* command not sent yet */ clear_bit(IPS_IN_ABORT, &ha->flags); @@ -696,6 +777,7 @@ int ips_abort(Scsi_Cmnd *SC) { ips_ha_t *ha; + ips_copp_wait_item_t *item; DBG("ips_abort"); @@ -722,9 +804,23 @@ if (test_and_set_bit(IPS_IN_ABORT, &ha->flags)) return (SCSI_ABORT_SNOOZE); + /* See if the command is on the copp queue */ + IPS_QUEUE_LOCK(&ha->copp_waitlist); + item = ha->copp_waitlist.head; + while ((item) && (item->scsi_cmd != SC)) + item = item->next; + IPS_QUEUE_UNLOCK(&ha->copp_waitlist); + + if (item) { + /* Found it */ + ips_removeq_copp(&ha->copp_waitlist, item); + clear_bit(IPS_IN_ABORT, &ha->flags); + + return (SCSI_ABORT_PENDING); + } + /* See if the command is on the wait queue */ - if (ips_removeq_wait(&ha->scb_waitlist, SC) || - ips_removeq_wait(&ha->copp_waitlist, SC)) { + if (ips_removeq_wait(&ha->scb_waitlist, SC)) { /* command not sent yet */ clear_bit(IPS_IN_ABORT, &ha->flags); @@ -745,11 +841,15 @@ /* */ /* Reset the controller (with new eh error code) */ /* */ +/* NOTE: this routine is called under the io_request_lock spinlock */ +/* */ /****************************************************************************/ int ips_eh_reset(Scsi_Cmnd *SC) { - ips_ha_t *ha; - ips_scb_t *scb; + u32 cpu_flags; + ips_ha_t *ha; + ips_scb_t *scb; + ips_copp_wait_item_t *item; DBG("ips_eh_reset"); @@ -783,11 +883,25 @@ if (test_and_set_bit(IPS_IN_RESET, &ha->flags)) return (FAILED); - /* See if the command is on the waiting queue */ - if (ips_removeq_wait(&ha->scb_waitlist, SC) || - ips_removeq_wait(&ha->copp_waitlist, SC)) { + /* See if the command is on the copp queue */ + IPS_QUEUE_LOCK(&ha->copp_waitlist); + item = ha->copp_waitlist.head; + while ((item) && (item->scsi_cmd != SC)) + item = item->next; + IPS_QUEUE_UNLOCK(&ha->copp_waitlist); + + if (item) { + /* Found it */ + ips_removeq_copp(&ha->copp_waitlist, item); + clear_bit(IPS_IN_RESET, &ha->flags); + + return (SUCCESS); + } + + /* See if the command is on the wait queue */ + if (ips_removeq_wait(&ha->scb_waitlist, SC)) { /* command not sent yet */ - clear_bit(IPS_IN_ABORT, &ha->flags); + clear_bit(IPS_IN_RESET, &ha->flags); return (SUCCESS); } @@ -802,25 +916,39 @@ return (FAILED); } - if (!ips_clear_adapter(ha)) { + if (!ips_clear_adapter(ha, IPS_INTR_IORL)) { clear_bit(IPS_IN_RESET, &ha->flags); return (FAILED); } + /* FFDC */ + if (ha->subsys->param[3] & 0x300000) { + struct timeval tv; + + do_gettimeofday(&tv); + IPS_HA_LOCK(cpu_flags); + ha->last_ffdc = tv.tv_sec; + ha->reset_count++; + IPS_HA_UNLOCK(cpu_flags); + ips_ffdc_reset(ha, IPS_INTR_IORL); + } + /* Now fail all of the active commands */ #if IPS_DEBUG >= 1 printk(KERN_WARNING "(%s%d) Failing active commands\n", ips_name, ha->host_num); #endif while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) { - scb->scsi_cmd->result = DID_RESET << 16; + scb->scsi_cmd->result = (DID_RESET << 16) | (SUGGEST_RETRY << 24); scb->scsi_cmd->scsi_done(scb->scsi_cmd); ips_freescb(ha, scb); } /* Reset the number of active IOCTLs */ + IPS_HA_LOCK(cpu_flags); ha->num_ioctl = 0; + IPS_HA_UNLOCK(cpu_flags); clear_bit(IPS_IN_RESET, &ha->flags); @@ -832,7 +960,7 @@ * handler wants to do this and since * interrupts are turned off here.... */ - ips_next(ha); + ips_next(ha, IPS_INTR_IORL); } return (SUCCESS); @@ -849,11 +977,15 @@ /* */ /* Reset the controller */ /* */ +/* NOTE: this routine is called under the io_request_lock spinlock */ +/* */ /****************************************************************************/ int ips_reset(Scsi_Cmnd *SC, unsigned int flags) { - ips_ha_t *ha; - ips_scb_t *scb; + u32 cpu_flags; + ips_ha_t *ha; + ips_scb_t *scb; + ips_copp_wait_item_t *item; DBG("ips_reset"); @@ -887,11 +1019,25 @@ if (test_and_set_bit(IPS_IN_RESET, &ha->flags)) return (SCSI_RESET_SNOOZE); - /* See if the command is on the waiting queue */ - if (ips_removeq_wait(&ha->scb_waitlist, SC) || - ips_removeq_wait(&ha->copp_waitlist, SC)) { + /* See if the command is on the copp queue */ + IPS_QUEUE_LOCK(&ha->copp_waitlist); + item = ha->copp_waitlist.head; + while ((item) && (item->scsi_cmd != SC)) + item = item->next; + IPS_QUEUE_UNLOCK(&ha->copp_waitlist); + + if (item) { + /* Found it */ + ips_removeq_copp(&ha->copp_waitlist, item); + clear_bit(IPS_IN_RESET, &ha->flags); + + return (SCSI_RESET_SNOOZE); + } + + /* See if the command is on the wait queue */ + if (ips_removeq_wait(&ha->scb_waitlist, SC)) { /* command not sent yet */ - clear_bit(IPS_IN_ABORT, &ha->flags); + clear_bit(IPS_IN_RESET, &ha->flags); return (SCSI_RESET_SNOOZE); } @@ -903,25 +1049,39 @@ return (SCSI_RESET_ERROR); } - if (!ips_clear_adapter(ha)) { + if (!ips_clear_adapter(ha, IPS_INTR_IORL)) { clear_bit(IPS_IN_RESET, &ha->flags); return (SCSI_RESET_ERROR); } + /* FFDC */ + if (ha->subsys->param[3] & 0x300000) { + struct timeval tv; + + do_gettimeofday(&tv); + IPS_HA_LOCK(cpu_flags); + ha->last_ffdc = tv.tv_sec; + ha->reset_count++; + IPS_HA_UNLOCK(cpu_flags); + ips_ffdc_reset(ha, IPS_INTR_IORL); + } + /* Now fail all of the active commands */ #if IPS_DEBUG >= 1 printk(KERN_WARNING "(%s%d) Failing active commands\n", ips_name, ha->host_num); #endif while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) { - scb->scsi_cmd->result = DID_RESET << 16; + scb->scsi_cmd->result = (DID_RESET << 16) | (SUGGEST_RETRY << 24); scb->scsi_cmd->scsi_done(scb->scsi_cmd); ips_freescb(ha, scb); } /* Reset the number of active IOCTLs */ + IPS_HA_LOCK(cpu_flags); ha->num_ioctl = 0; + IPS_HA_UNLOCK(cpu_flags); clear_bit(IPS_IN_RESET, &ha->flags); @@ -933,7 +1093,7 @@ * handler wants to do this and since * interrupts are turned off here.... */ - ips_next(ha); + ips_next(ha, IPS_INTR_IORL); } return (SCSI_RESET_SUCCESS); @@ -950,10 +1110,19 @@ /* */ /* Send a command to the controller */ /* */ +/* NOTE: */ +/* Linux obtains io_request_lock before calling this function */ +/* */ /****************************************************************************/ int ips_queue(Scsi_Cmnd *SC, void (*done) (Scsi_Cmnd *)) { ips_ha_t *ha; + u32 cpu_flags; +#if LINUX_VERSION_CODE < LinuxVersionCode(2,3,1) + struct semaphore sem = MUTEX_LOCKED; +#else + DECLARE_MUTEX_LOCKED(sem); +#endif DBG("ips_queue"); @@ -967,19 +1136,27 @@ #ifndef NO_IPS_CMDLINE if (ips_is_passthru(SC)) { + IPS_QUEUE_LOCK(&ha->copp_waitlist); if (ha->copp_waitlist.count == IPS_MAX_IOCTL_QUEUE) { + IPS_QUEUE_UNLOCK(&ha->copp_waitlist); SC->result = DID_BUS_BUSY << 16; done(SC); return (0); + } else { + IPS_QUEUE_UNLOCK(&ha->copp_waitlist); } } else { #endif + IPS_QUEUE_LOCK(&ha->scb_waitlist); if (ha->scb_waitlist.count == IPS_MAX_QUEUE) { + IPS_QUEUE_UNLOCK(&ha->scb_waitlist); SC->result = DID_BUS_BUSY << 16; done(SC); return (0); + } else { + IPS_QUEUE_UNLOCK(&ha->scb_waitlist); } #ifndef NO_IPS_CMDLINE @@ -996,21 +1173,82 @@ SC->target, SC->lun); #if IPS_DEBUG >= 11 - MDELAY(2*ONE_SEC); + MDELAY(2*IPS_ONE_SEC); #endif #endif #ifndef NO_IPS_CMDLINE - if (ips_is_passthru(SC)) - ips_putq_wait_tail(&ha->copp_waitlist, SC); + if (ips_is_passthru(SC)) { + ips_copp_wait_item_t *scratch; + + /* allocate space for the scribble */ + scratch = kmalloc(sizeof(ips_copp_wait_item_t), GFP_KERNEL); + + if (!scratch) { + SC->result = DID_ERROR << 16; + done(SC); + + return (0); + } + + scratch->scsi_cmd = SC; + scratch->sem = &sem; + scratch->next = NULL; + + ips_putq_copp_tail(&ha->copp_waitlist, scratch); + } else #endif ips_putq_wait_tail(&ha->scb_waitlist, SC); + IPS_HA_LOCK(cpu_flags); if ((!test_bit(IPS_IN_INTR, &ha->flags)) && (!test_bit(IPS_IN_ABORT, &ha->flags)) && - (!test_bit(IPS_IN_RESET, &ha->flags))) - ips_next(ha); + (!test_bit(IPS_IN_RESET, &ha->flags))) { + IPS_HA_UNLOCK(cpu_flags); + ips_next(ha, IPS_INTR_IORL); + } else { + IPS_HA_UNLOCK(cpu_flags); + } + + /* + * If this request was a new style IOCTL wait + * for it to finish. + * + * NOTE: we relinquished the lock above so this should + * not cause contention problems + */ + if (ips_is_passthru(SC) && SC->cmnd[0] == IPS_IOCTL_NEW_COMMAND) { + char *user_area; + char *kern_area; + u32 datasize; + + /* free io_request_lock */ + spin_unlock_irq(&io_request_lock); + + /* wait for the command to finish */ + down(&sem); + + /* reobtain the lock */ + spin_lock_irq(&io_request_lock); + + /* command finished -- copy back */ + user_area = *((char **) &SC->cmnd[4]); + kern_area = ha->ioctl_data; + datasize = *((u32 *) &SC->cmnd[8]); + + if (copy_to_user(user_area, kern_area, datasize) > 0) { +#if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) passthru failed - unable to copy out user data\n", + ips_name, ha->host_num); +#endif + + SC->result = DID_ERROR << 16; + SC->scsi_done(SC); + } else { + SC->scsi_done(SC); + } + } return (0); } @@ -1042,17 +1280,17 @@ if (!ha->active) return (0); - if (!ips_read_adapter_status(ha)) + if (!ips_read_adapter_status(ha, IPS_INTR_ON)) /* ?!?! Enquiry command failed */ return (0); if ((disk->capacity > 0x400000) && ((ha->enq->ucMiscFlag & 0x8) == 0)) { - heads = NORM_MODE_HEADS; - sectors = NORM_MODE_SECTORS; + heads = IPS_NORM_HEADS; + sectors = IPS_NORM_SECTORS; } else { - heads = COMP_MODE_HEADS; - sectors = COMP_MODE_SECTORS; + heads = IPS_COMP_HEADS; + sectors = IPS_COMP_SECTORS; } cylinders = disk->capacity / (heads * sectors); @@ -1081,7 +1319,7 @@ void do_ipsintr(int irq, void *dev_id, struct pt_regs *regs) { ips_ha_t *ha; - unsigned int cpu_flags; + u32 cpu_flags; DBG("do_ipsintr"); @@ -1114,6 +1352,9 @@ clear_bit(IPS_IN_INTR, &ha->flags); spin_unlock_irqrestore(&io_request_lock, cpu_flags); + + /* start the next command */ + ips_next(ha, IPS_INTR_ON); } /****************************************************************************/ @@ -1132,6 +1373,7 @@ ips_stat_t *sp; ips_scb_t *scb; int status; + u32 cpu_flags; DBG("ips_intr"); @@ -1141,6 +1383,7 @@ if (!ha->active) return; + IPS_HA_LOCK(cpu_flags); while (ips_isintr(ha)) { sp = &ha->sp; @@ -1157,10 +1400,12 @@ * use the callback function to finish things up * NOTE: interrupts are OFF for this */ + IPS_HA_UNLOCK(cpu_flags); (*scb->callback) (ha, scb); + IPS_HA_LOCK(cpu_flags); } - clear_bit(IPS_IN_INTR, &ha->flags); + IPS_HA_UNLOCK(cpu_flags); } /****************************************************************************/ @@ -1180,7 +1425,7 @@ DBG("ips_info"); - ha = HA(SH); + ha = IPS_HA(SH); if (!ha) return (NULL); @@ -1268,10 +1513,10 @@ if (!SC) return (0); - if ((SC->channel == 0) && + if (((SC->cmnd[0] == IPS_IOCTL_COMMAND) || (SC->cmnd[0] == IPS_IOCTL_NEW_COMMAND)) && + (SC->channel == 0) && (SC->target == IPS_ADAPTER_ID) && (SC->lun == 0) && - (SC->cmnd[0] == 0x0d) && (SC->request_bufflen) && (!SC->use_sg) && (((char *) SC->request_buffer)[0] == 'C') && @@ -1286,7 +1531,7 @@ /****************************************************************************/ /* */ -/* Routine Name: ips_is_passthru */ +/* Routine Name: ips_make_passthru */ /* */ /* Routine Description: */ /* */ @@ -1333,17 +1578,23 @@ } pt = (ips_passthru_t *) SC->request_buffer; - scb->scsi_cmd = SC; - - if (SC->request_bufflen < (sizeof(ips_passthru_t) + pt->CmdBSize)) { - /* wrong size */ -#if IPS_DEBUG_PT >= 1 - printk(KERN_NOTICE "(%s%d) Passthru structure wrong size\n", - ips_name, ha->host_num); -#endif - return (IPS_FAILURE); - } + /* + * Some notes about the passthru interface used + * + * IF the scsi op_code == 0x0d then we assume + * that the data came along with/goes with the + * packet we received from the sg driver. In this + * case the CmdBSize field of the pt structure is + * used for the size of the buffer. + * + * IF the scsi op_code == 0x81 then we assume that + * we will need our own buffer and we will copy the + * data to/from the user buffer passed in the scsi + * command. The data address resides at offset 4 + * in the scsi command. The length of the data resides + * at offset 8 in the scsi command. + */ switch (pt->CoppCmd) { case IPS_NUMCTRLS: @@ -1352,19 +1603,128 @@ SC->result = DID_OK << 16; return (IPS_SUCCESS_IMM); + case IPS_CTRLINFO: memcpy(SC->request_buffer + sizeof(ips_passthru_t), ha, sizeof(ips_ha_t)); SC->result = DID_OK << 16; return (IPS_SUCCESS_IMM); - case COPPUSRCMD: - if (ips_usrcmd(ha, pt, scb)) - return (IPS_SUCCESS); - else - return (IPS_FAILURE); + + case IPS_COPPUSRCMD: + case IPS_COPPIOCCMD: + if (SC->cmnd[0] == IPS_IOCTL_COMMAND) { + if (SC->request_bufflen < (sizeof(ips_passthru_t) + pt->CmdBSize)) { + /* wrong size */ + #if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) Passthru structure wrong size\n", + ips_name, ha->host_num); + #endif + + return (IPS_FAILURE); + } + + if (ips_usrcmd(ha, pt, scb)) + return (IPS_SUCCESS); + else + return (IPS_FAILURE); + } else if (SC->cmnd[0] == IPS_IOCTL_NEW_COMMAND) { + if (SC->request_bufflen < (sizeof(ips_passthru_t))) { + /* wrong size */ + #if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) Passthru structure wrong size\n", + ips_name, ha->host_num); + #endif + + return (IPS_FAILURE); + } + + if (ips_newusrcmd(ha, pt, scb)) + return (IPS_SUCCESS); + else + return (IPS_FAILURE); + } + break; - } + + case IPS_FLASHBIOS: + /* we must use the new interface */ + if (SC->cmnd[0] != IPS_IOCTL_NEW_COMMAND) + return (IPS_FAILURE); + + /* don't flash the BIOS on future cards */ + if (ha->revision_id > IPS_REVID_TROMBONE64) { +#if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) flash bios failed - unsupported controller\n", + ips_name, ha->host_num); +#endif + return (IPS_FAILURE); + } + + /* copy in the size/buffer ptr from the scsi command */ + memcpy(&pt->CmdBuffer, &SC->cmnd[4], 4); + memcpy(&pt->CmdBSize, &SC->cmnd[8], 4); + + /* must have a buffer */ + if ((!pt->CmdBSize) || (!pt->CmdBuffer)) + return (IPS_FAILURE); + + /* make sure buffer is big enough */ + if (pt->CmdBSize > ha->ioctl_datasize) { + void *bigger_struct; + + /* try to allocate a bigger struct */ + bigger_struct = kmalloc(pt->CmdBSize, GFP_KERNEL|GFP_DMA); + if (bigger_struct) { + /* free the old memory */ + kfree(ha->ioctl_data); + + /* use the new memory */ + ha->ioctl_data = bigger_struct; + ha->ioctl_datasize = pt->CmdBSize; + } else + return (IPS_FAILURE); + } + + /* copy in the buffer */ + if (copy_from_user(ha->ioctl_data, pt->CmdBuffer, pt->CmdBSize) > 0) { +#if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) flash bios failed - unable to copy user buffer\n", + ips_name, ha->host_num); +#endif + + return (IPS_FAILURE); + } + + if (ips_erase_bios(ha)) { +#if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) flash bios failed - unable to erase flash\n", + ips_name, ha->host_num); +#endif + + return (IPS_FAILURE); + } + + if (ips_program_bios(ha, ha->ioctl_data, pt->CmdBSize)) { +#if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) flash bios failed - unable to program flash\n", + ips_name, ha->host_num); +#endif + + return (IPS_FAILURE); + } + + if (ips_verify_bios(ha, ha->ioctl_data, pt->CmdBSize)) { +#if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) flash bios failed - unable to verify flash\n", + ips_name, ha->host_num); +#endif + + return (IPS_FAILURE); + } + + return (IPS_SUCCESS_IMM); + } /* end switch */ return (IPS_FAILURE); } @@ -1380,7 +1740,7 @@ /****************************************************************************/ static int ips_usrcmd(ips_ha_t *ha, ips_passthru_t *pt, ips_scb_t *scb) { - SG_LIST *sg_list; + IPS_SG_LIST *sg_list; DBG("ips_usrcmd"); @@ -1391,15 +1751,15 @@ sg_list = scb->sg_list; /* copy in the CP */ - memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof(IOCTL_INFO)); - memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof(DCDB_TABLE)); + memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof(IPS_IOCTL_CMD)); + memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof(IPS_DCDB_TABLE)); /* FIX stuff that might be wrong */ scb->sg_list = sg_list; scb->scb_busaddr = VIRT_TO_BUS(scb); - scb->bus = 0; - scb->target_id = 0; - scb->lun = 0; + scb->bus = scb->scsi_cmd->channel; + scb->target_id = scb->scsi_cmd->target; + scb->lun = scb->scsi_cmd->lun; scb->sg_len = 0; scb->data_len = 0; scb->flags = 0; @@ -1409,9 +1769,9 @@ scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); /* we don't support DCDB/READ/WRITE Scatter Gather */ - if ((scb->cmd.basic_io.op_code == READ_SCATTER_GATHER) || - (scb->cmd.basic_io.op_code == WRITE_SCATTER_GATHER) || - (scb->cmd.basic_io.op_code == DIRECT_CDB_SCATTER_GATHER)) + if ((scb->cmd.basic_io.op_code == IPS_CMD_READ_SG) || + (scb->cmd.basic_io.op_code == IPS_CMD_WRITE_SG) || + (scb->cmd.basic_io.op_code == IPS_CMD_DCDB_SG)) return (0); if (pt->CmdBSize) { @@ -1420,13 +1780,129 @@ scb->data_busaddr = 0L; } + if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) + scb->cmd.dcdb.dcdb_address = VIRT_TO_BUS(&scb->dcdb); + if (pt->CmdBSize) { - if (scb->cmd.dcdb.op_code == DIRECT_CDB) { - scb->cmd.dcdb.dcdb_address = VIRT_TO_BUS(&scb->dcdb); + if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) scb->dcdb.buffer_pointer = scb->data_busaddr; - } else { + else scb->cmd.basic_io.sg_addr = scb->data_busaddr; + } + + /* set timeouts */ + if (pt->TimeOut) { + scb->timeout = pt->TimeOut; + + if (pt->TimeOut <= 10) + scb->dcdb.cmd_attribute |= IPS_TIMEOUT10; + else if (pt->TimeOut <= 60) + scb->dcdb.cmd_attribute |= IPS_TIMEOUT60; + else + scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; + } + + /* assume success */ + scb->scsi_cmd->result = DID_OK << 16; + + /* success */ + return (1); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_newusrcmd */ +/* */ +/* Routine Description: */ +/* */ +/* Process a user command and make it ready to send */ +/* */ +/****************************************************************************/ +static int +ips_newusrcmd(ips_ha_t *ha, ips_passthru_t *pt, ips_scb_t *scb) { + IPS_SG_LIST *sg_list; + char *user_area; + char *kern_area; + u32 datasize; + + DBG("ips_usrcmd"); + + if ((!scb) || (!pt) || (!ha)) + return (0); + + /* Save the S/G list pointer so it doesn't get clobbered */ + sg_list = scb->sg_list; + + /* copy in the CP */ + memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof(IPS_IOCTL_CMD)); + memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof(IPS_DCDB_TABLE)); + + /* FIX stuff that might be wrong */ + scb->sg_list = sg_list; + scb->scb_busaddr = VIRT_TO_BUS(scb); + scb->bus = scb->scsi_cmd->channel; + scb->target_id = scb->scsi_cmd->target; + scb->lun = scb->scsi_cmd->lun; + scb->sg_len = 0; + scb->data_len = 0; + scb->flags = 0; + scb->op_code = 0; + scb->callback = ipsintr_done; + scb->timeout = ips_cmd_timeout; + scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); + + /* we don't support DCDB/READ/WRITE Scatter Gather */ + if ((scb->cmd.basic_io.op_code == IPS_CMD_READ_SG) || + (scb->cmd.basic_io.op_code == IPS_CMD_WRITE_SG) || + (scb->cmd.basic_io.op_code == IPS_CMD_DCDB_SG)) + return (0); + + if (pt->CmdBSize) { + if (pt->CmdBSize > ha->ioctl_datasize) { + void *bigger_struct; + + /* try to allocate a bigger struct */ + bigger_struct = kmalloc(pt->CmdBSize, GFP_KERNEL|GFP_DMA); + if (bigger_struct) { + /* free the old memory */ + kfree(ha->ioctl_data); + + /* use the new memory */ + ha->ioctl_data = bigger_struct; + ha->ioctl_datasize = pt->CmdBSize; + } else + return (0); + } + + scb->data_busaddr = VIRT_TO_BUS(ha->ioctl_data); + + /* Attempt to copy in the data */ + user_area = *((char **) &scb->scsi_cmd->cmnd[4]); + kern_area = ha->ioctl_data; + datasize = *((u32 *) &scb->scsi_cmd->cmnd[8]); + + if (copy_from_user(kern_area, user_area, datasize) > 0) { +#if IPS_DEBUG_PT >= 1 + printk(KERN_NOTICE "(%s%d) passthru failed - unable to copy in user data\n", + ips_name, ha->host_num); +#endif + + return (0); + } + + } else { + scb->data_busaddr = 0L; + } + + if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) + scb->cmd.dcdb.dcdb_address = VIRT_TO_BUS(&scb->dcdb); + + if (pt->CmdBSize) { + if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) + scb->dcdb.buffer_pointer = scb->data_busaddr; + else + scb->cmd.basic_io.sg_addr = scb->data_busaddr; } /* set timeouts */ @@ -1434,15 +1910,15 @@ scb->timeout = pt->TimeOut; if (pt->TimeOut <= 10) - scb->dcdb.cmd_attribute |= TIMEOUT_10; + scb->dcdb.cmd_attribute |= IPS_TIMEOUT10; else if (pt->TimeOut <= 60) - scb->dcdb.cmd_attribute |= TIMEOUT_60; + scb->dcdb.cmd_attribute |= IPS_TIMEOUT60; else - scb->dcdb.cmd_attribute |= TIMEOUT_20M; + scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; } - /* assume error */ - scb->scsi_cmd->result = DID_ERROR << 16; + /* assume success */ + scb->scsi_cmd->result = DID_OK << 16; /* success */ return (1); @@ -1458,7 +1934,7 @@ /* */ /****************************************************************************/ static void -ips_cleanup_passthru(ips_scb_t *scb) { +ips_cleanup_passthru(ips_ha_t *ha, ips_scb_t *scb) { ips_passthru_t *pt; DBG("ips_cleanup_passthru"); @@ -1474,10 +1950,15 @@ pt = (ips_passthru_t *) scb->scsi_cmd->request_buffer; /* Copy data back to the user */ - pt->BasicStatus = scb->basic_status; - pt->ExtendedStatus = scb->extended_status; - - scb->scsi_cmd->result = DID_OK << 16; + if (scb->scsi_cmd->cmnd[0] == IPS_IOCTL_COMMAND) { + /* Copy data back to the user */ + pt->BasicStatus = scb->basic_status; + pt->ExtendedStatus = scb->extended_status; + } else { + pt->BasicStatus = scb->basic_status; + pt->ExtendedStatus = scb->extended_status; + up(scb->sem); + } } #endif @@ -1493,7 +1974,7 @@ /****************************************************************************/ static int ips_host_info(ips_ha_t *ha, char *ptr, off_t offset, int len) { - INFOSTR info; + IPS_INFOSTR info; DBG("ips_host_info"); @@ -1504,7 +1985,7 @@ copy_info(&info, "\nIBM ServeRAID General Information:\n\n"); - if ((ha->nvram->signature == NVRAM_PAGE5_SIGNATURE) && + if ((ha->nvram->signature == IPS_NVRAM_P5_SIG) && (ha->nvram->adapter_type != 0)) copy_info(&info, "\tController Type : %s\n", ips_adapter_name[ha->ad_type-1]); else @@ -1513,7 +1994,7 @@ copy_info(&info, "\tIO port address : 0x%lx\n", ha->io_addr); copy_info(&info, "\tIRQ number : %d\n", ha->irq); - if (ha->nvram->signature == NVRAM_PAGE5_SIGNATURE) + if (ha->nvram->signature == IPS_NVRAM_P5_SIG) copy_info(&info, "\tBIOS Version : %c%c%c%c%c%c%c%c\n", ha->nvram->bios_high[0], ha->nvram->bios_high[1], ha->nvram->bios_high[2], ha->nvram->bios_high[3], @@ -1559,11 +2040,11 @@ /* */ /* Routine Description: */ /* */ -/* Copy data into an INFOSTR structure */ +/* Copy data into an IPS_INFOSTR structure */ /* */ /****************************************************************************/ static void -copy_mem_info(INFOSTR *info, char *data, int len) { +copy_mem_info(IPS_INFOSTR *info, char *data, int len) { DBG("copy_mem_info"); if (info->pos + len > info->length) @@ -1595,7 +2076,7 @@ /* */ /****************************************************************************/ static int -copy_info(INFOSTR *info, char *fmt, ...) { +copy_info(IPS_INFOSTR *info, char *fmt, ...) { va_list args; char buf[81]; int len; @@ -1634,11 +2115,15 @@ /* initialize status queue */ ips_statinit(ha); + ha->reset_count = 1; + /* Setup HBA ID's */ - if (!ips_read_config(ha)) { + if (!ips_read_config(ha, IPS_INTR_IORL)) { #ifndef NO_IPS_RESET + ha->reset_count++; + /* Try to reset the controller and try again */ if (!ips_reset_adapter(ha)) { printk(KERN_WARNING "(%s%d) unable to reset controller.\n", @@ -1647,7 +2132,7 @@ return (0); } - if (!ips_clear_adapter(ha)) { + if (!ips_clear_adapter(ha, IPS_INTR_IORL)) { printk(KERN_WARNING "(%s%d) unable to initialize controller.\n", ips_name, ha->host_num); @@ -1656,7 +2141,7 @@ #endif - if (!ips_read_config(ha)) { + if (!ips_read_config(ha, IPS_INTR_IORL)) { printk(KERN_WARNING "(%s%d) unable to read config from controller.\n", ips_name, ha->host_num); @@ -1665,31 +2150,40 @@ } /* end if */ /* write driver version */ - if (!ips_write_driver_status(ha)) { + if (!ips_write_driver_status(ha, IPS_INTR_IORL)) { printk(KERN_WARNING "(%s%d) unable to write driver info to controller.\n", ips_name, ha->host_num); return (0); } - if (!ips_read_adapter_status(ha)) { + if (!ips_read_adapter_status(ha, IPS_INTR_IORL)) { printk(KERN_WARNING "(%s%d) unable to read controller status.\n", ips_name, ha->host_num); return (0); } - if (!ips_read_subsystem_parameters(ha)) { + if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) { printk(KERN_WARNING "(%s%d) unable to read subsystem parameters.\n", ips_name, ha->host_num); return (0); } + /* FFDC */ + if (ha->subsys->param[3] & 0x300000) { + struct timeval tv; + + do_gettimeofday(&tv); + ha->last_ffdc = tv.tv_sec; + ips_ffdc_reset(ha, IPS_INTR_IORL); + } + /* set limits on SID, LUN, BUS */ - ha->ntargets = MAX_TARGETS + 1; + ha->ntargets = IPS_MAX_TARGETS + 1; ha->nlun = 1; - ha->nbus = (ha->enq->ucMaxPhysicalDevices / MAX_TARGETS); + ha->nbus = (ha->enq->ucMaxPhysicalDevices / IPS_MAX_TARGETS); switch (ha->conf->logical_drive[0].ucStripeSize) { case 4: @@ -1754,21 +2248,55 @@ /* */ /* Take the next command off the queue and send it to the controller */ /* */ -/* ASSUMED to be called from within a lock */ -/* */ /****************************************************************************/ static void -ips_next(ips_ha_t *ha) { - ips_scb_t *scb; - Scsi_Cmnd *SC; - Scsi_Cmnd *p; - int ret; +ips_next(ips_ha_t *ha, int intr) { + ips_scb_t *scb; + Scsi_Cmnd *SC; + Scsi_Cmnd *p; + ips_copp_wait_item_t *item; + int ret; + int intr_status; + u32 cpu_flags; + u32 cpu_flags2; DBG("ips_next"); if (!ha) return ; + /* + * Block access to the queue function so + * this command won't time out + */ + if (intr == IPS_INTR_ON) { + spin_lock_irqsave(&io_request_lock, cpu_flags2); + intr_status = IPS_INTR_IORL; + } else { + intr_status = intr; + + /* Quiet the compiler */ + cpu_flags2 = 0; + } + + if (ha->subsys->param[3] & 0x300000) { + struct timeval tv; + + do_gettimeofday(&tv); + + IPS_HA_LOCK(cpu_flags); + if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) { + ha->last_ffdc = tv.tv_sec; + IPS_HA_UNLOCK(cpu_flags); + ips_ffdc_time(ha, intr_status); + } else { + IPS_HA_UNLOCK(cpu_flags); + } + } + + if (intr == IPS_INTR_ON) + spin_unlock_irqrestore(&io_request_lock, cpu_flags2); + #ifndef NO_IPS_CMDLINE /* * Send passthru commands @@ -1777,32 +2305,50 @@ * since we limit the number that can be active * on the card at any one time */ + IPS_HA_LOCK(cpu_flags); + IPS_QUEUE_LOCK(&ha->copp_waitlist); while ((ha->num_ioctl < IPS_MAX_IOCTL) && (ha->copp_waitlist.head) && (scb = ips_getscb(ha))) { - SC = ips_removeq_wait_head(&ha->copp_waitlist); - ret = ips_make_passthru(ha, SC, scb); + IPS_QUEUE_UNLOCK(&ha->copp_waitlist); + IPS_HA_UNLOCK(cpu_flags); + item = ips_removeq_copp_head(&ha->copp_waitlist); + scb->scsi_cmd = item->scsi_cmd; + scb->sem = item->sem; + kfree(item); + + ret = ips_make_passthru(ha, scb->scsi_cmd, scb); switch (ret) { case IPS_FAILURE: if (scb->scsi_cmd) { + /* raise the semaphore */ + if (scb->scsi_cmd->cmnd[0] == IPS_IOCTL_NEW_COMMAND) + up(scb->sem); + scb->scsi_cmd->result = DID_ERROR << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); } ips_freescb(ha, scb); break; case IPS_SUCCESS_IMM: - if (scb->scsi_cmd) - scb->scsi_cmd->scsi_done(scb->scsi_cmd); + if (scb->scsi_cmd) { + /* raise the semaphore */ + if (scb->scsi_cmd->cmnd[0] == IPS_IOCTL_NEW_COMMAND) + up(scb->sem); + } + ips_freescb(ha, scb); break; default: break; } /* end case */ - if (ret != IPS_SUCCESS) + if (ret != IPS_SUCCESS) { + IPS_HA_LOCK(cpu_flags); + IPS_QUEUE_LOCK(&ha->copp_waitlist); continue; + } ret = ips_send_cmd(ha, scb); @@ -1814,27 +2360,43 @@ switch(ret) { case IPS_FAILURE: if (scb->scsi_cmd) { + /* raise the semaphore */ + if (scb->scsi_cmd->cmnd[0] == IPS_IOCTL_NEW_COMMAND) + up(scb->sem); + scb->scsi_cmd->result = DID_ERROR << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); } ips_freescb(ha, scb); break; case IPS_SUCCESS_IMM: - if (scb->scsi_cmd) - scb->scsi_cmd->scsi_done(scb->scsi_cmd); + if (scb->scsi_cmd) { + /* raise the semaphore */ + if (scb->scsi_cmd->cmnd[0] == IPS_IOCTL_NEW_COMMAND) + up(scb->sem); + } + ips_freescb(ha, scb); break; default: break; } /* end case */ + + IPS_HA_LOCK(cpu_flags); + IPS_QUEUE_LOCK(&ha->copp_waitlist); } + + IPS_QUEUE_UNLOCK(&ha->copp_waitlist); + IPS_HA_UNLOCK(cpu_flags); #endif /* * Send "Normal" I/O commands */ + IPS_HA_LOCK(cpu_flags); + IPS_QUEUE_LOCK(&ha->scb_waitlist); p = ha->scb_waitlist.head; + IPS_QUEUE_UNLOCK(&ha->scb_waitlist); while ((p) && (scb = ips_getscb(ha))) { if ((p->channel > 0) && (ha->dcdb_active[p->channel-1] & (1 << p->target))) { ips_freescb(ha, scb); @@ -1842,6 +2404,8 @@ continue; } + IPS_HA_UNLOCK(cpu_flags); + SC = ips_removeq_wait(&ha->scb_waitlist, p); SC->result = DID_OK; @@ -1922,7 +2486,7 @@ scb->dcdb.transfer_length = 0; if (scb->data_len >= IPS_MAX_XFER) { - scb->dcdb.cmd_attribute |= TRANSFER_64K; + scb->dcdb.cmd_attribute |= IPS_TRANSFER64K; scb->dcdb.transfer_length = 0; } @@ -1957,7 +2521,11 @@ } /* end case */ p = (Scsi_Cmnd *) p->host_scribble; + + IPS_HA_LOCK(cpu_flags); } /* end while */ + + IPS_HA_UNLOCK(cpu_flags); } /****************************************************************************/ @@ -1978,6 +2546,8 @@ if (!item) return ; + IPS_QUEUE_LOCK(queue); + item->q_next = queue->head; queue->head = item; @@ -1985,6 +2555,8 @@ queue->tail = item; queue->count++; + + IPS_QUEUE_UNLOCK(queue); } /****************************************************************************/ @@ -2005,6 +2577,8 @@ if (!item) return ; + IPS_QUEUE_LOCK(queue); + item->q_next = NULL; if (queue->tail) @@ -2016,6 +2590,8 @@ queue->head = item; queue->count++; + + IPS_QUEUE_UNLOCK(queue); } /****************************************************************************/ @@ -2035,10 +2611,15 @@ DBG("ips_removeq_scb_head"); + IPS_QUEUE_LOCK(queue); + item = queue->head; - if (!item) + if (!item) { + IPS_QUEUE_UNLOCK(queue); + return (NULL); + } queue->head = item->q_next; item->q_next = NULL; @@ -2048,6 +2629,8 @@ queue->count--; + IPS_QUEUE_UNLOCK(queue); + return (item); } @@ -2062,42 +2645,210 @@ /* ASSUMED to be called from within a lock */ /* */ /****************************************************************************/ -static inline ips_scb_t * -ips_removeq_scb(ips_scb_queue_t *queue, ips_scb_t *item) { - ips_scb_t *p; +static inline ips_scb_t * +ips_removeq_scb(ips_scb_queue_t *queue, ips_scb_t *item) { + ips_scb_t *p; + + DBG("ips_removeq_scb"); + + if (!item) + return (NULL); + + IPS_QUEUE_LOCK(queue); + + if (item == queue->head) { + IPS_QUEUE_UNLOCK(queue); + + return (ips_removeq_scb_head(queue)); + } + + p = queue->head; + + while ((p) && (item != p->q_next)) + p = p->q_next; + + if (p) { + /* found a match */ + p->q_next = item->q_next; + + if (!item->q_next) + queue->tail = p; + + item->q_next = NULL; + queue->count--; + + IPS_QUEUE_UNLOCK(queue); + + return (item); + } + + IPS_QUEUE_UNLOCK(queue); + + return (NULL); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_putq_wait_head */ +/* */ +/* Routine Description: */ +/* */ +/* Add an item to the head of the queue */ +/* */ +/* ASSUMED to be called from within a lock */ +/* */ +/****************************************************************************/ +static inline void +ips_putq_wait_head(ips_wait_queue_t *queue, Scsi_Cmnd *item) { + DBG("ips_putq_wait_head"); + + if (!item) + return ; + + IPS_QUEUE_LOCK(queue); + + item->host_scribble = (char *) queue->head; + queue->head = item; + + if (!queue->tail) + queue->tail = item; + + queue->count++; + + IPS_QUEUE_UNLOCK(queue); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_putq_wait_tail */ +/* */ +/* Routine Description: */ +/* */ +/* Add an item to the tail of the queue */ +/* */ +/* ASSUMED to be called from within a lock */ +/* */ +/****************************************************************************/ +static inline void +ips_putq_wait_tail(ips_wait_queue_t *queue, Scsi_Cmnd *item) { + DBG("ips_putq_wait_tail"); + + if (!item) + return ; + + IPS_QUEUE_LOCK(queue); + + item->host_scribble = NULL; + + if (queue->tail) + queue->tail->host_scribble = (char *)item; + + queue->tail = item; + + if (!queue->head) + queue->head = item; + + queue->count++; + + IPS_QUEUE_UNLOCK(queue); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_removeq_wait_head */ +/* */ +/* Routine Description: */ +/* */ +/* Remove the head of the queue */ +/* */ +/* ASSUMED to be called from within a lock */ +/* */ +/****************************************************************************/ +static inline Scsi_Cmnd * +ips_removeq_wait_head(ips_wait_queue_t *queue) { + Scsi_Cmnd *item; + + DBG("ips_removeq_wait_head"); + + IPS_QUEUE_LOCK(queue); + + item = queue->head; + + if (!item) { + IPS_QUEUE_UNLOCK(queue); + + return (NULL); + } + + queue->head = (Scsi_Cmnd *) item->host_scribble; + item->host_scribble = NULL; + + if (queue->tail == item) + queue->tail = NULL; + + queue->count--; + + IPS_QUEUE_UNLOCK(queue); + + return (item); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_removeq_wait */ +/* */ +/* Routine Description: */ +/* */ +/* Remove an item from a queue */ +/* */ +/* ASSUMED to be called from within a lock */ +/* */ +/****************************************************************************/ +static inline Scsi_Cmnd * +ips_removeq_wait(ips_wait_queue_t *queue, Scsi_Cmnd *item) { + Scsi_Cmnd *p; - DBG("ips_removeq_scb"); + DBG("ips_removeq_wait"); if (!item) return (NULL); - if (item == queue->head) - return (ips_removeq_scb_head(queue)); + IPS_QUEUE_LOCK(queue); + + if (item == queue->head) { + IPS_QUEUE_UNLOCK(queue); + + return (ips_removeq_wait_head(queue)); + } p = queue->head; - while ((p) && (item != p->q_next)) - p = p->q_next; + while ((p) && (item != (Scsi_Cmnd *) p->host_scribble)) + p = (Scsi_Cmnd *) p->host_scribble; if (p) { /* found a match */ - p->q_next = item->q_next; + p->host_scribble = item->host_scribble; - if (!item->q_next) + if (!item->host_scribble) queue->tail = p; - item->q_next = NULL; + item->host_scribble = NULL; queue->count--; + IPS_QUEUE_UNLOCK(queue); + return (item); } + IPS_QUEUE_UNLOCK(queue); + return (NULL); } /****************************************************************************/ /* */ -/* Routine Name: ips_putq_wait_head */ +/* Routine Name: ips_putq_copp_head */ /* */ /* Routine Description: */ /* */ @@ -2107,24 +2858,28 @@ /* */ /****************************************************************************/ static inline void -ips_putq_wait_head(ips_wait_queue_t *queue, Scsi_Cmnd *item) { - DBG("ips_putq_wait_head"); +ips_putq_copp_head(ips_copp_queue_t *queue, ips_copp_wait_item_t *item) { + DBG("ips_putq_copp_head"); if (!item) return ; - item->host_scribble = (char *) queue->head; + IPS_QUEUE_LOCK(queue); + + item->next = queue->head; queue->head = item; if (!queue->tail) queue->tail = item; queue->count++; + + IPS_QUEUE_UNLOCK(queue); } /****************************************************************************/ /* */ -/* Routine Name: ips_putq_wait_tail */ +/* Routine Name: ips_putq_copp_tail */ /* */ /* Routine Description: */ /* */ @@ -2134,16 +2889,18 @@ /* */ /****************************************************************************/ static inline void -ips_putq_wait_tail(ips_wait_queue_t *queue, Scsi_Cmnd *item) { - DBG("ips_putq_wait_tail"); +ips_putq_copp_tail(ips_copp_queue_t *queue, ips_copp_wait_item_t *item) { + DBG("ips_putq_copp_tail"); if (!item) return ; - item->host_scribble = NULL; + IPS_QUEUE_LOCK(queue); + + item->next = NULL; if (queue->tail) - queue->tail->host_scribble = (char *)item; + queue->tail->next = item; queue->tail = item; @@ -2151,11 +2908,13 @@ queue->head = item; queue->count++; + + IPS_QUEUE_UNLOCK(queue); } /****************************************************************************/ /* */ -/* Routine Name: ips_removeq_wait_head */ +/* Routine Name: ips_removeq_copp_head */ /* */ /* Routine Description: */ /* */ @@ -2164,31 +2923,38 @@ /* ASSUMED to be called from within a lock */ /* */ /****************************************************************************/ -static inline Scsi_Cmnd * -ips_removeq_wait_head(ips_wait_queue_t *queue) { - Scsi_Cmnd *item; +static inline ips_copp_wait_item_t * +ips_removeq_copp_head(ips_copp_queue_t *queue) { + ips_copp_wait_item_t *item; - DBG("ips_removeq_wait_head"); + DBG("ips_removeq_copp_head"); + + IPS_QUEUE_LOCK(queue); item = queue->head; - if (!item) + if (!item) { + IPS_QUEUE_UNLOCK(queue); + return (NULL); + } - queue->head = (Scsi_Cmnd *) item->host_scribble; - item->host_scribble = NULL; + queue->head = item->next; + item->next = NULL; if (queue->tail == item) queue->tail = NULL; queue->count--; + IPS_QUEUE_UNLOCK(queue); + return (item); } /****************************************************************************/ /* */ -/* Routine Name: ips_removeq_wait */ +/* Routine Name: ips_removeq_copp */ /* */ /* Routine Description: */ /* */ @@ -2197,36 +2963,45 @@ /* ASSUMED to be called from within a lock */ /* */ /****************************************************************************/ -static inline Scsi_Cmnd * -ips_removeq_wait(ips_wait_queue_t *queue, Scsi_Cmnd *item) { - Scsi_Cmnd *p; +static inline ips_copp_wait_item_t * +ips_removeq_copp(ips_copp_queue_t *queue, ips_copp_wait_item_t *item) { + ips_copp_wait_item_t *p; - DBG("ips_removeq_wait"); + DBG("ips_removeq_copp"); if (!item) return (NULL); - if (item == queue->head) - return (ips_removeq_wait_head(queue)); + IPS_QUEUE_LOCK(queue); + + if (item == queue->head) { + IPS_QUEUE_UNLOCK(queue); + + return (ips_removeq_copp_head(queue)); + } p = queue->head; - while ((p) && (item != (Scsi_Cmnd *) p->host_scribble)) - p = (Scsi_Cmnd *) p->host_scribble; + while ((p) && (item != p->next)) + p = p->next; if (p) { /* found a match */ - p->host_scribble = item->host_scribble; + p->next = item->next; - if (!item->host_scribble) + if (!item->next) queue->tail = p; - item->host_scribble = NULL; + item->next = NULL; queue->count--; + IPS_QUEUE_UNLOCK(queue); + return (item); } + IPS_QUEUE_UNLOCK(queue); + return (NULL); } @@ -2287,6 +3062,7 @@ static void ips_done(ips_ha_t *ha, ips_scb_t *scb) { int ret; + u32 cpu_flags; DBG("ips_done"); @@ -2295,8 +3071,10 @@ #ifndef NO_IPS_CMDLINE if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) { - ips_cleanup_passthru(scb); + ips_cleanup_passthru(ha, scb); + IPS_HA_LOCK(cpu_flags); ha->num_ioctl--; + IPS_HA_UNLOCK(cpu_flags); } else { #endif /* @@ -2365,7 +3143,7 @@ scb->dcdb.transfer_length = 0; if (scb->data_len >= IPS_MAX_XFER) { - scb->dcdb.cmd_attribute |= TRANSFER_64K; + scb->dcdb.cmd_attribute |= IPS_TRANSFER64K; scb->dcdb.transfer_length = 0; } @@ -2398,15 +3176,17 @@ } /* end if passthru */ #endif - if (scb->bus) + if (scb->bus) { + IPS_HA_LOCK(cpu_flags); ha->dcdb_active[scb->bus-1] &= ~(1 << scb->target_id); + IPS_HA_UNLOCK(cpu_flags); + } /* call back to SCSI layer */ - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - ips_freescb(ha, scb); + if (scb->scsi_cmd && scb->scsi_cmd->cmnd[0] != IPS_IOCTL_NEW_COMMAND) + scb->scsi_cmd->scsi_done(scb->scsi_cmd); - /* do the next command */ - ips_next(ha); + ips_freescb(ha, scb); } /****************************************************************************/ @@ -2445,19 +3225,19 @@ /* default driver error */ errcode = DID_ERROR; - switch (scb->basic_status & GSC_STATUS_MASK) { - case CMD_TIMEOUT: + switch (scb->basic_status & IPS_GSC_STATUS_MASK) { + case IPS_CMD_TIMEOUT: errcode = DID_TIME_OUT; break; - case INVAL_OPCO: - case INVAL_CMD_BLK: - case INVAL_PARM_BLK: - case LOG_DRV_ERROR: - case CMD_CMPLT_WERROR: + case IPS_INVAL_OPCO: + case IPS_INVAL_CMD_BLK: + case IPS_INVAL_PARM_BLK: + case IPS_LD_ERROR: + case IPS_CMD_CMPLT_WERROR: break; - case PHYS_DRV_ERROR: + case IPS_PHYS_DRV_ERROR: /* * For physical drive errors that * are not on a logical drive should @@ -2468,14 +3248,14 @@ errcode = DID_OK; switch (scb->extended_status) { - case SELECTION_TIMEOUT: + case IPS_ERR_SEL_TO: if (scb->bus) { scb->scsi_cmd->result |= DID_TIME_OUT << 16; return (0); } break; - case DATA_OVER_UNDER_RUN: + case IPS_ERR_OU_RUN: if ((scb->bus) && (scb->dcdb.transfer_length < scb->data_len)) { if ((scb->scsi_cmd->cmnd[0] == INQUIRY) && ((((char *) scb->scsi_cmd->buffer)[0] & 0x1f) == TYPE_DISK)) { @@ -2494,7 +3274,7 @@ } break; - case EXT_RECOVERY: + case IPS_ERR_RECOVERY: /* don't fail recovered errors */ if (scb->bus) { scb->scsi_cmd->result |= DID_OK << 16; @@ -2503,12 +3283,12 @@ } break; - case EXT_HOST_RESET: - case EXT_DEVICE_RESET: + case IPS_ERR_HOST_RESET: + case IPS_ERR_DEV_RESET: errcode = DID_RESET; break; - case EXT_CHECK_CONDITION: + case IPS_ERR_CKCOND: break; } /* end switch */ } /* end switch */ @@ -2528,7 +3308,7 @@ /* */ /****************************************************************************/ static int -ips_send(ips_ha_t *ha, ips_scb_t *scb, scb_callback callback) { +ips_send(ips_ha_t *ha, ips_scb_t *scb, ips_scb_callback callback) { int ret; DBG("ips_send"); @@ -2550,7 +3330,7 @@ /* */ /****************************************************************************/ static int -ips_send_wait(ips_ha_t *ha, ips_scb_t *scb, int timeout) { +ips_send_wait(ips_ha_t *ha, ips_scb_t *scb, int timeout, int intr) { int ret; DBG("ips_send_wait"); @@ -2563,7 +3343,7 @@ if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM)) return (ret); - ret = ips_wait(ha, timeout, IPS_INTR_OFF); + ret = ips_wait(ha, timeout, intr); return (ret); } @@ -2629,9 +3409,9 @@ scb->scsi_cmd->result = DID_OK << 16; if (scb->scsi_cmd->cmnd[0] == INQUIRY) { - INQUIRYDATA inq; + IPS_INQ_DATA inq; - memset(&inq, 0, sizeof(INQUIRYDATA)); + memset(&inq, 0, sizeof(IPS_INQ_DATA)); inq.DeviceType = TYPE_PROCESSOR; inq.DeviceTypeQualifier = 0; @@ -2647,7 +3427,7 @@ scb->scsi_cmd->result = DID_OK << 16; } } else { - scb->cmd.logical_info.op_code = GET_LOGICAL_DRIVE_INFO; + scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO; scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.logical_info.buffer_addr = VIRT_TO_BUS(&ha->adapt->logical_drive_info); scb->cmd.logical_info.reserved = 0; @@ -2666,10 +3446,10 @@ case WRITE_6: if (!scb->sg_len) { scb->cmd.basic_io.op_code = - (scb->scsi_cmd->cmnd[0] == READ_6) ? IPS_READ : IPS_WRITE; + (scb->scsi_cmd->cmnd[0] == READ_6) ? IPS_CMD_READ : IPS_CMD_WRITE; } else { scb->cmd.basic_io.op_code = - (scb->scsi_cmd->cmnd[0] == READ_6) ? READ_SCATTER_GATHER : WRITE_SCATTER_GATHER; + (scb->scsi_cmd->cmnd[0] == READ_6) ? IPS_CMD_READ_SG : IPS_CMD_WRITE_SG; } scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); @@ -2697,10 +3477,10 @@ case WRITE_10: if (!scb->sg_len) { scb->cmd.basic_io.op_code = - (scb->scsi_cmd->cmnd[0] == READ_10) ? IPS_READ : IPS_WRITE; + (scb->scsi_cmd->cmnd[0] == READ_10) ? IPS_CMD_READ : IPS_CMD_WRITE; } else { scb->cmd.basic_io.op_code = - (scb->scsi_cmd->cmnd[0] == READ_10) ? READ_SCATTER_GATHER : WRITE_SCATTER_GATHER; + (scb->scsi_cmd->cmnd[0] == READ_10) ? IPS_CMD_READ_SG : IPS_CMD_WRITE_SG; } scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); @@ -2738,14 +3518,14 @@ break; case MODE_SENSE: - scb->cmd.basic_io.op_code = ENQUIRY; + scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY; scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.basic_io.sg_addr = VIRT_TO_BUS(ha->enq); ret = IPS_SUCCESS; break; case READ_CAPACITY: - scb->cmd.logical_info.op_code = GET_LOGICAL_DRIVE_INFO; + scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO; scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.logical_info.buffer_addr = VIRT_TO_BUS(&ha->adapt->logical_drive_info); scb->cmd.logical_info.reserved = 0; @@ -2777,9 +3557,9 @@ /* setup DCDB */ if (scb->bus > 0) { if (!scb->sg_len) - scb->cmd.dcdb.op_code = DIRECT_CDB; + scb->cmd.dcdb.op_code = IPS_CMD_DCDB; else - scb->cmd.dcdb.op_code = DIRECT_CDB_SCATTER_GATHER; + scb->cmd.dcdb.op_code = IPS_CMD_DCDB_SG; ha->dcdb_active[scb->bus-1] |= (1 << scb->target_id); scb->cmd.dcdb.command_id = IPS_COMMAND_ID(ha, scb); @@ -2789,19 +3569,19 @@ scb->cmd.dcdb.reserved3 = 0; scb->dcdb.device_address = ((scb->bus - 1) << 4) | scb->target_id; - scb->dcdb.cmd_attribute |= DISCONNECT_ALLOWED; + scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED; if (scb->timeout) { if (scb->timeout <= 10) - scb->dcdb.cmd_attribute |= TIMEOUT_10; + scb->dcdb.cmd_attribute |= IPS_TIMEOUT10; else if (scb->timeout <= 60) - scb->dcdb.cmd_attribute |= TIMEOUT_60; + scb->dcdb.cmd_attribute |= IPS_TIMEOUT60; else - scb->dcdb.cmd_attribute |= TIMEOUT_20M; + scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; } - if (!(scb->dcdb.cmd_attribute & TIMEOUT_20M)) - scb->dcdb.cmd_attribute |= TIMEOUT_20M; + if (!(scb->dcdb.cmd_attribute & IPS_TIMEOUT20M)) + scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; scb->dcdb.sense_length = sizeof(scb->scsi_cmd->sense_buffer); scb->dcdb.buffer_pointer = scb->data_busaddr; @@ -2836,7 +3616,7 @@ command_id = ips_statupd(ha); - if (command_id > (MAX_CMDS-1)) { + if (command_id > (IPS_MAX_CMDS-1)) { printk(KERN_NOTICE "(%s%d) invalid command id received: %d\n", ips_name, ha->host_num, command_id); @@ -2846,7 +3626,7 @@ scb = &ha->scbs[command_id]; sp->scb_addr = (u32) scb; sp->residue_len = 0; - scb->basic_status = basic_status = ha->adapt->p_status_tail->basic_status & BASIC_STATUS_MASK; + scb->basic_status = basic_status = ha->adapt->p_status_tail->basic_status & IPS_BASIC_STATUS_MASK; scb->extended_status = ext_status = ha->adapt->p_status_tail->extended_status; /* Remove the item from the active queue */ @@ -2865,12 +3645,12 @@ errcode = DID_OK; ret = 0; - if (((basic_status & GSC_STATUS_MASK) == SSUCCESS) || - ((basic_status & GSC_STATUS_MASK) == RECOVERED_ERROR)) { + if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) || + ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) { if (scb->bus == 0) { #if IPS_DEBUG >= 1 - if ((basic_status & GSC_STATUS_MASK) == RECOVERED_ERROR) { + if ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR) { printk(KERN_NOTICE "(%s%d) Recovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x\n", ips_name, ha->host_num, scb->cmd.basic_io.op_code, basic_status, ext_status); @@ -2994,20 +3774,20 @@ ips_online(ips_ha_t *ha, ips_scb_t *scb) { DBG("ips_online"); - if (scb->target_id >= MAX_LOGICAL_DRIVES) + if (scb->target_id >= IPS_MAX_LD) return (0); - if ((scb->basic_status & GSC_STATUS_MASK) > 1) { + if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) { memset(&ha->adapt->logical_drive_info, 0, sizeof(ha->adapt->logical_drive_info)); return (0); } if (scb->target_id < ha->adapt->logical_drive_info.no_of_log_drive && - ha->adapt->logical_drive_info.drive_info[scb->target_id].state != OFF_LINE && - ha->adapt->logical_drive_info.drive_info[scb->target_id].state != FREE && - ha->adapt->logical_drive_info.drive_info[scb->target_id].state != CRS && - ha->adapt->logical_drive_info.drive_info[scb->target_id].state != SYS) + ha->adapt->logical_drive_info.drive_info[scb->target_id].state != IPS_LD_OFFLINE && + ha->adapt->logical_drive_info.drive_info[scb->target_id].state != IPS_LD_FREE && + ha->adapt->logical_drive_info.drive_info[scb->target_id].state != IPS_LD_CRS && + ha->adapt->logical_drive_info.drive_info[scb->target_id].state != IPS_LD_SYS) return (1); else return (0); @@ -3024,11 +3804,11 @@ /****************************************************************************/ static int ips_inquiry(ips_ha_t *ha, ips_scb_t *scb) { - INQUIRYDATA inq; + IPS_INQ_DATA inq; DBG("ips_inquiry"); - memset(&inq, 0, sizeof(INQUIRYDATA)); + memset(&inq, 0, sizeof(IPS_INQ_DATA)); inq.DeviceType = TYPE_DISK; inq.DeviceTypeQualifier = 0; @@ -3055,14 +3835,14 @@ /****************************************************************************/ static int ips_rdcap(ips_ha_t *ha, ips_scb_t *scb) { - CAPACITY_T *cap; + IPS_CAPACITY *cap; DBG("ips_rdcap"); if (scb->scsi_cmd->bufflen < 8) return (0); - cap = (CAPACITY_T *) scb->scsi_cmd->request_buffer; + cap = (IPS_CAPACITY *) scb->scsi_cmd->request_buffer; cap->lba = htonl(ha->adapt->logical_drive_info.drive_info[scb->target_id].sector_count - 1); cap->len = htonl((u32) IPS_BLKSIZE); @@ -3090,11 +3870,11 @@ if (ha->enq->ulDriveSize[scb->target_id] > 0x400000 && (ha->enq->ucMiscFlag & 0x8) == 0) { - heads = NORM_MODE_HEADS; - sectors = NORM_MODE_SECTORS; + heads = IPS_NORM_HEADS; + sectors = IPS_NORM_SECTORS; } else { - heads = COMP_MODE_HEADS; - sectors = COMP_MODE_SECTORS; + heads = IPS_COMP_HEADS; + sectors = IPS_COMP_SECTORS; } cylinders = ha->enq->ulDriveSize[scb->target_id] / (heads * sectors); @@ -3107,7 +3887,7 @@ case 0x03: /* page 3 */ mdata.pdata.pg3.pg_pc = 0x3; mdata.pdata.pg3.pg_res1 = 0; - mdata.pdata.pg3.pg_len = sizeof(DADF_T); + mdata.pdata.pg3.pg_len = sizeof(IPS_DADF); mdata.plh.plh_len = 3 + mdata.plh.plh_bdl + mdata.pdata.pg3.pg_len; mdata.pdata.pg3.pg_trk_z = 0; mdata.pdata.pg3.pg_asec_z = 0; @@ -3129,7 +3909,7 @@ case 0x4: mdata.pdata.pg4.pg_pc = 0x4; mdata.pdata.pg4.pg_res1 = 0; - mdata.pdata.pg4.pg_len = sizeof(RDDG_T); + mdata.pdata.pg4.pg_len = sizeof(IPS_RDDG); mdata.plh.plh_len = 3 + mdata.plh.plh_bdl + mdata.pdata.pg4.pg_len; mdata.pdata.pg4.pg_cylu = (cylinders >> 8) & 0xffff; mdata.pdata.pg4.pg_cyll = cylinders & 0xff; @@ -3223,6 +4003,12 @@ ha->dummy = NULL; } + if (ha->ioctl_data) { + kfree(ha->ioctl_data); + ha->ioctl_data = NULL; + ha->ioctl_datasize = 0; + } + if (ha->scbs) { for (i = 0; i < ha->max_cmds; i++) { if (ha->scbs[i].sg_list) @@ -3260,7 +4046,7 @@ scb_p = &ha->scbs[i]; /* allocate S/G list */ - scb_p->sg_list = (SG_LIST *) kmalloc(sizeof(SG_LIST) * MAX_SG_ELEMENTS, GFP_KERNEL|GFP_DMA); + scb_p->sg_list = (IPS_SG_LIST *) kmalloc(sizeof(IPS_SG_LIST) * IPS_MAX_SG, GFP_KERNEL|GFP_DMA); if (! scb_p->sg_list) return (0); @@ -3287,7 +4073,7 @@ /****************************************************************************/ static void ips_init_scb(ips_ha_t *ha, ips_scb_t *scb) { - SG_LIST *sg_list; + IPS_SG_LIST *sg_list; DBG("ips_init_scb"); @@ -3298,19 +4084,19 @@ /* zero fill */ memset(scb, 0, sizeof(ips_scb_t)); - memset(ha->dummy, 0, sizeof(BASIC_IO_CMD)); + memset(ha->dummy, 0, sizeof(IPS_IO_CMD)); /* Initialize dummy command bucket */ ha->dummy->op_code = 0xFF; ha->dummy->ccsar = VIRT_TO_BUS(ha->dummy); - ha->dummy->command_id = MAX_CMDS; + ha->dummy->command_id = IPS_MAX_CMDS; /* set bus address of scb */ scb->scb_busaddr = VIRT_TO_BUS(scb); scb->sg_list = sg_list; /* Neptune Fix */ - scb->cmd.basic_io.cccr = ILE; + scb->cmd.basic_io.cccr = IPS_BIT_ILE; scb->cmd.basic_io.ccsar = VIRT_TO_BUS(ha->dummy); } @@ -3328,13 +4114,13 @@ static ips_scb_t * ips_getscb(ips_ha_t *ha) { ips_scb_t *scb; - unsigned int cpu_flags; + u32 cpu_flags; DBG("ips_getscb"); - spin_lock_irqsave(&ha->scb_lock, cpu_flags); + IPS_SCB_LOCK(cpu_flags); if ((scb = ha->scb_freelist) == NULL) { - spin_unlock_irqrestore(&ha->scb_lock, cpu_flags); + IPS_SCB_UNLOCK(cpu_flags); return (NULL); } @@ -3342,7 +4128,7 @@ ha->scb_freelist = scb->q_next; scb->q_next = NULL; - spin_unlock_irqrestore(&ha->scb_lock, cpu_flags); + IPS_SCB_UNLOCK(cpu_flags); ips_init_scb(ha, scb); @@ -3362,16 +4148,16 @@ /****************************************************************************/ static void ips_freescb(ips_ha_t *ha, ips_scb_t *scb) { - unsigned int cpu_flags; + u32 cpu_flags; DBG("ips_freescb"); /* check to make sure this is not our "special" scb */ if (IPS_COMMAND_ID(ha, scb) < (ha->max_cmds - 1)) { - spin_lock_irqsave(&ha->scb_lock, cpu_flags); + IPS_SCB_LOCK(cpu_flags); scb->q_next = ha->scb_freelist; ha->scb_freelist = scb; - spin_unlock_irqrestore(&ha->scb_lock, cpu_flags); + IPS_SCB_UNLOCK(cpu_flags); } } @@ -3388,10 +4174,11 @@ ips_reset_adapter(ips_ha_t *ha) { u8 Isr; u8 Cbsp; - u8 PostByte[MAX_POST_BYTES]; - u8 ConfigByte[MAX_CONFIG_BYTES]; + u8 PostByte[IPS_MAX_POST_BYTES]; + u8 ConfigByte[IPS_MAX_CONFIG_BYTES]; int i, j; int reset_counter; + u32 cpu_flags; DBG("ips_reset_adapter"); @@ -3400,108 +4187,125 @@ ha->io_addr, ha->irq); #endif + IPS_HA_LOCK(cpu_flags); + reset_counter = 0; while (reset_counter < 2) { reset_counter++; - outb(RST, ha->io_addr + SCPR); - MDELAY(ONE_SEC); - outb(0, ha->io_addr + SCPR); - MDELAY(ONE_SEC); + outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR); + MDELAY(IPS_ONE_SEC); + outb(0, ha->io_addr + IPS_REG_SCPR); + MDELAY(IPS_ONE_SEC); - for (i = 0; i < MAX_POST_BYTES; i++) { + for (i = 0; i < IPS_MAX_POST_BYTES; i++) { for (j = 0; j < 45; j++) { - Isr = inb(ha->io_addr + HISR); - if (Isr & GHI) + Isr = inb(ha->io_addr + IPS_REG_HISR); + if (Isr & IPS_BIT_GHI) break; - MDELAY(ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (j >= 45) { /* error occured */ if (reset_counter < 2) continue; - else + else { /* reset failed */ + IPS_HA_UNLOCK(cpu_flags); + return (0); + } } - PostByte[i] = inb(ha->io_addr + ISPR); - outb(Isr, ha->io_addr + HISR); + PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR); + outb(Isr, ha->io_addr + IPS_REG_HISR); } - if (PostByte[0] < GOOD_POST_BASIC_STATUS) { + if (PostByte[0] < IPS_GOOD_POST_STATUS) { printk("(%s%d) reset controller fails (post status %x %x).\n", ips_name, ha->host_num, PostByte[0], PostByte[1]); + IPS_HA_UNLOCK(cpu_flags); + return (0); } - for (i = 0; i < MAX_CONFIG_BYTES; i++) { + for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) { for (j = 0; j < 240; j++) { - Isr = inb(ha->io_addr + HISR); - if (Isr & GHI) + Isr = inb(ha->io_addr + IPS_REG_HISR); + if (Isr & IPS_BIT_GHI) break; - MDELAY(ONE_SEC); /* 100 msec */ + MDELAY(IPS_ONE_SEC); /* 100 msec */ } if (j >= 240) { /* error occured */ if (reset_counter < 2) continue; - else + else { /* reset failed */ + IPS_HA_UNLOCK(cpu_flags); + return (0); + } } - ConfigByte[i] = inb(ha->io_addr + ISPR); - outb(Isr, ha->io_addr + HISR); + ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR); + outb(Isr, ha->io_addr + IPS_REG_HISR); } if (ConfigByte[0] == 0 && ConfigByte[1] == 2) { printk("(%s%d) reset controller fails (status %x %x).\n", ips_name, ha->host_num, ConfigByte[0], ConfigByte[1]); + IPS_HA_UNLOCK(cpu_flags); + return (0); } for (i = 0; i < 240; i++) { - Cbsp = inb(ha->io_addr + CBSP); + Cbsp = inb(ha->io_addr + IPS_REG_CBSP); - if ((Cbsp & OP) == 0) + if ((Cbsp & IPS_BIT_OP) == 0) break; - MDELAY(ONE_SEC); + MDELAY(IPS_ONE_SEC); } if (i >= 240) { /* error occured */ if (reset_counter < 2) continue; - else + else { /* reset failed */ + IPS_HA_UNLOCK(cpu_flags); + return (0); + } } /* setup CCCR */ - outw(0x1010, ha->io_addr + CCCR); + outw(0x1010, ha->io_addr + IPS_REG_CCCR); /* Enable busmastering */ - outb(EBM, ha->io_addr + SCPR); + outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR); /* setup status queues */ ips_statinit(ha); /* Enable interrupts */ - outb(EI, ha->io_addr + HISR); + outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR); /* if we get here then everything went OK */ break; } + IPS_HA_UNLOCK(cpu_flags); + return (1); } @@ -3521,14 +4325,14 @@ DBG("ips_statinit"); ha->adapt->p_status_start = ha->adapt->status; - ha->adapt->p_status_end = ha->adapt->status + MAX_CMDS; + ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS; ha->adapt->p_status_tail = ha->adapt->status; phys_status_start = VIRT_TO_BUS(ha->adapt->status); - outl(phys_status_start, ha->io_addr + SQSR); - outl(phys_status_start + STATUS_Q_SIZE, ha->io_addr + SQER); - outl(phys_status_start + STATUS_SIZE, ha->io_addr + SQHR); - outl(phys_status_start, ha->io_addr + SQTR); + outl(phys_status_start, ha->io_addr + IPS_REG_SQSR); + outl(phys_status_start + IPS_STATUS_Q_SIZE, ha->io_addr + IPS_REG_SQER); + outl(phys_status_start + IPS_STATUS_SIZE, ha->io_addr + IPS_REG_SQHR); + outl(phys_status_start, ha->io_addr + IPS_REG_SQTR); ha->adapt->hw_status_start = phys_status_start; ha->adapt->hw_status_tail = phys_status_start; @@ -3551,13 +4355,13 @@ if (ha->adapt->p_status_tail != ha->adapt->p_status_end) { ha->adapt->p_status_tail++; - ha->adapt->hw_status_tail += sizeof(STATUS); + ha->adapt->hw_status_tail += sizeof(IPS_STATUS); } else { ha->adapt->p_status_tail = ha->adapt->p_status_start; ha->adapt->hw_status_tail = ha->adapt->hw_status_start; } - outl(ha->adapt->hw_status_tail, ha->io_addr + SQTR); + outl(ha->adapt->hw_status_tail, ha->io_addr + IPS_REG_SQTR); command_id = ha->adapt->p_status_tail->command_id; @@ -3579,6 +4383,7 @@ ips_issue(ips_ha_t *ha, ips_scb_t *scb) { u32 TimeOut; u16 val; + u32 cpu_flags; DBG("ips_issue"); @@ -3596,17 +4401,19 @@ ips_name, scb->cmd.basic_io.command_id); #if IPS_DEBUG >= 11 - MDELAY(ONE_SEC); + MDELAY(IPS_ONE_SEC); #endif #endif + IPS_HA_LOCK(cpu_flags); + TimeOut = 0; - while ((val = inw(ha->io_addr + CCCR)) & SEMAPHORE) { + while ((val = inw(ha->io_addr + IPS_REG_CCCR)) & IPS_BIT_SEM) { UDELAY(1000); - if (++TimeOut >= SEMAPHORE_TIMEOUT) { - if (!(val & START_STOP_BIT)) + if (++TimeOut >= IPS_SEM_TIMEOUT) { + if (!(val & IPS_BIT_START_STOP)) break; printk(KERN_WARNING "(%s%d) ips_issue val [0x%x].\n", @@ -3614,12 +4421,16 @@ printk(KERN_WARNING "(%s%d) ips_issue semaphore chk timeout.\n", ips_name, ha->host_num); + IPS_HA_UNLOCK(cpu_flags); + return (IPS_FAILURE); } /* end if */ } /* end while */ - outl(scb->scb_busaddr, ha->io_addr + CCSAR); - outw(START_COMMAND, ha->io_addr + CCCR); + outl(scb->scb_busaddr, ha->io_addr + IPS_REG_CCSAR); + outw(IPS_BIT_START_CMD, ha->io_addr + IPS_REG_CCCR); + + IPS_HA_UNLOCK(cpu_flags); return (IPS_SUCCESS); } @@ -3639,18 +4450,18 @@ DBG("ips_isintr"); - Isr = inb(ha->io_addr + HISR); + Isr = inb(ha->io_addr + IPS_REG_HISR); if (Isr == 0xFF) /* ?!?! Nothing really there */ return (0); - if (Isr & SCE) + if (Isr & IPS_BIT_SCE) return (1); - else if (Isr & (SQO | GHI)) { + else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) { /* status queue overflow or GHI */ /* just clear the interrupt */ - outb(Isr, ha->io_addr + HISR); + outb(Isr, ha->io_addr + IPS_REG_HISR); } return (0); @@ -3668,15 +4479,23 @@ static int ips_wait(ips_ha_t *ha, int time, int intr) { int ret; + u8 done; DBG("ips_wait"); ret = IPS_FAILURE; + done = FALSE; - time *= ONE_SEC; /* convert seconds to milliseconds */ + time *= IPS_ONE_SEC; /* convert seconds to milliseconds */ - while (time > 0) { - if (intr == IPS_INTR_OFF) { + while ((time > 0) && (!done)) { + if (intr == IPS_INTR_ON) { + if (ha->waitflag == FALSE) { + ret = IPS_SUCCESS; + done = TRUE; + break; + } + } else if (intr == IPS_INTR_IORL) { if (ha->waitflag == FALSE) { /* * controller generated an interupt to @@ -3684,28 +4503,50 @@ * and ips_intr() has serviced the interrupt. */ ret = IPS_SUCCESS; + done = TRUE; break; } /* - * NOTE: Interrupts are disabled here - * On an SMP system interrupts will only - * be disabled on one processor. - * So, ultimately we still need to set the - * "I'm in the interrupt handler flag" + * NOTE: we already have the io_request_lock so + * even if we get an interrupt it won't get serviced + * until after we finish. */ + while (test_and_set_bit(IPS_IN_INTR, &ha->flags)) UDELAY(1000); ips_intr(ha); clear_bit(IPS_IN_INTR, &ha->flags); - - } else { + } else if (intr == IPS_INTR_HAL) { if (ha->waitflag == FALSE) { + /* + * controller generated an interupt to + * acknowledge completion of the command + * and ips_intr() has serviced the interrupt. + */ ret = IPS_SUCCESS; + done = TRUE; break; } + + /* + * NOTE: since we were not called with the iorequest lock + * we must obtain it before we can call the interrupt handler. + * We were called under the HA lock so we can assume that interrupts + * are masked. + */ + spin_lock(&io_request_lock); + + while (test_and_set_bit(IPS_IN_INTR, &ha->flags)) + UDELAY(1000); + + ips_intr(ha); + + clear_bit(IPS_IN_INTR, &ha->flags); + + spin_unlock(&io_request_lock); } UDELAY(1000); /* 1 milisecond */ @@ -3725,10 +4566,10 @@ /* */ /****************************************************************************/ static int -ips_write_driver_status(ips_ha_t *ha) { +ips_write_driver_status(ips_ha_t *ha, int intr) { DBG("ips_write_driver_status"); - if (!ips_readwrite_page5(ha, FALSE)) { + if (!ips_readwrite_page5(ha, FALSE, intr)) { printk(KERN_WARNING "(%s%d) unable to read NVRAM page 5.\n", ips_name, ha->host_num); @@ -3737,7 +4578,7 @@ /* check to make sure the page has a valid */ /* signature */ - if (ha->nvram->signature != NVRAM_PAGE5_SIGNATURE) { + if (ha->nvram->signature != IPS_NVRAM_P5_SIG) { #if IPS_DEBUG >= 1 printk("(%s%d) NVRAM page 5 has an invalid signature: %X.\n", ips_name, ha->host_num, ha->nvram->signature); @@ -3758,12 +4599,12 @@ ha->ad_type = ha->nvram->adapter_type; /* change values (as needed) */ - ha->nvram->operating_system = OS_LINUX; + ha->nvram->operating_system = IPS_OS_LINUX; strncpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4); strncpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4); /* now update the page */ - if (!ips_readwrite_page5(ha, TRUE)) { + if (!ips_readwrite_page5(ha, TRUE, intr)) { printk(KERN_WARNING "(%s%d) unable to write NVRAM page 5.\n", ips_name, ha->host_num); @@ -3783,7 +4624,7 @@ /* */ /****************************************************************************/ static int -ips_read_adapter_status(ips_ha_t *ha) { +ips_read_adapter_status(ips_ha_t *ha, int intr) { ips_scb_t *scb; int ret; @@ -3794,9 +4635,9 @@ ips_init_scb(ha, scb); scb->timeout = ips_cmd_timeout; - scb->cdb[0] = ENQUIRY; + scb->cdb[0] = IPS_CMD_ENQUIRY; - scb->cmd.basic_io.op_code = ENQUIRY; + scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY; scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.basic_io.sg_count = 0; scb->cmd.basic_io.sg_addr = VIRT_TO_BUS(ha->enq); @@ -3806,7 +4647,7 @@ scb->cmd.basic_io.reserved = 0; /* send command */ - ret = ips_send_wait(ha, scb, ips_cmd_timeout); + ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr); if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM)) return (0); @@ -3823,7 +4664,7 @@ /* */ /****************************************************************************/ static int -ips_read_subsystem_parameters(ips_ha_t *ha) { +ips_read_subsystem_parameters(ips_ha_t *ha, int intr) { ips_scb_t *scb; int ret; @@ -3834,9 +4675,9 @@ ips_init_scb(ha, scb); scb->timeout = ips_cmd_timeout; - scb->cdb[0] = GET_SUBSYS_PARAM; + scb->cdb[0] = IPS_CMD_GET_SUBSYS; - scb->cmd.basic_io.op_code = GET_SUBSYS_PARAM; + scb->cmd.basic_io.op_code = IPS_CMD_GET_SUBSYS; scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.basic_io.sg_count = 0; scb->cmd.basic_io.sg_addr = VIRT_TO_BUS(ha->subsys); @@ -3846,7 +4687,7 @@ scb->cmd.basic_io.reserved = 0; /* send command */ - ret = ips_send_wait(ha, scb, ips_cmd_timeout); + ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr); if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM)) return (0); @@ -3863,7 +4704,7 @@ /* */ /****************************************************************************/ static int -ips_read_config(ips_ha_t *ha) { +ips_read_config(ips_ha_t *ha, int intr) { ips_scb_t *scb; int i; int ret; @@ -3880,18 +4721,18 @@ ips_init_scb(ha, scb); scb->timeout = ips_cmd_timeout; - scb->cdb[0] = READ_NVRAM_CONFIGURATION; + scb->cdb[0] = IPS_CMD_READ_CONF; - scb->cmd.basic_io.op_code = READ_NVRAM_CONFIGURATION; + scb->cmd.basic_io.op_code = IPS_CMD_READ_CONF; scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.basic_io.sg_addr = VIRT_TO_BUS(ha->conf); /* send command */ - if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout)) == IPS_FAILURE) || + if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & GSC_STATUS_MASK) > 1)) { + ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) { - memset(ha->conf, 0, sizeof(CONFCMD)); + memset(ha->conf, 0, sizeof(IPS_CONF)); /* reset initiator IDs */ ha->conf->init_id[0] = IPS_ADAPTER_ID; @@ -3910,11 +4751,11 @@ /* */ /* Routine Description: */ /* */ -/* Read the configuration on the adapter */ +/* Read nvram page 5 from the adapter */ /* */ /****************************************************************************/ static int -ips_readwrite_page5(ips_ha_t *ha, int write) { +ips_readwrite_page5(ips_ha_t *ha, int write, int intr) { ips_scb_t *scb; int ret; @@ -3925,9 +4766,9 @@ ips_init_scb(ha, scb); scb->timeout = ips_cmd_timeout; - scb->cdb[0] = RW_NVRAM_PAGE; + scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE; - scb->cmd.nvram.op_code = RW_NVRAM_PAGE; + scb->cmd.nvram.op_code = IPS_CMD_RW_NVRAM_PAGE; scb->cmd.nvram.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.nvram.page = 5; scb->cmd.nvram.write = write; @@ -3936,11 +4777,11 @@ scb->cmd.nvram.reserved2 = 0; /* issue the command */ - if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout)) == IPS_FAILURE) || + if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & GSC_STATUS_MASK) > 1)) { + ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) { - memset(ha->nvram, 0, sizeof(NVRAM_PAGE5)); + memset(ha->nvram, 0, sizeof(IPS_NVRAM_P5)); return (0); } @@ -3958,7 +4799,7 @@ /* */ /****************************************************************************/ static int -ips_clear_adapter(ips_ha_t *ha) { +ips_clear_adapter(ips_ha_t *ha, int intr) { ips_scb_t *scb; int ret; @@ -3969,41 +4810,413 @@ ips_init_scb(ha, scb); scb->timeout = ips_reset_timeout; - scb->cdb[0] = CONFIG_SYNC; + scb->cdb[0] = IPS_CMD_CONFIG_SYNC; - scb->cmd.config_sync.op_code = CONFIG_SYNC; + scb->cmd.config_sync.op_code = IPS_CMD_CONFIG_SYNC; scb->cmd.config_sync.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.config_sync.channel = 0; - scb->cmd.config_sync.source_target = POCL; + scb->cmd.config_sync.source_target = IPS_POCL; scb->cmd.config_sync.reserved = 0; scb->cmd.config_sync.reserved2 = 0; scb->cmd.config_sync.reserved3 = 0; /* issue command */ - ret = ips_send_wait(ha, scb, ips_reset_timeout); + ret = ips_send_wait(ha, scb, ips_reset_timeout, intr); if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM)) return (0); /* send unlock stripe command */ ips_init_scb(ha, scb); - scb->cdb[0] = GET_ERASE_ERROR_TABLE; + scb->cdb[0] = IPS_CMD_ERROR_TABLE; scb->timeout = ips_reset_timeout; - scb->cmd.unlock_stripe.op_code = GET_ERASE_ERROR_TABLE; + scb->cmd.unlock_stripe.op_code = IPS_CMD_ERROR_TABLE; scb->cmd.unlock_stripe.command_id = IPS_COMMAND_ID(ha, scb); scb->cmd.unlock_stripe.log_drv = 0; - scb->cmd.unlock_stripe.control = CSL; + scb->cmd.unlock_stripe.control = IPS_CSL; scb->cmd.unlock_stripe.reserved = 0; scb->cmd.unlock_stripe.reserved2 = 0; scb->cmd.unlock_stripe.reserved3 = 0; /* issue command */ - ret = ips_send_wait(ha, scb, ips_reset_timeout); + ret = ips_send_wait(ha, scb, ips_reset_timeout, intr); if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM)) return (0); return (1); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_ffdc_reset */ +/* */ +/* Routine Description: */ +/* */ +/* FFDC: write reset info */ +/* */ +/****************************************************************************/ +static void +ips_ffdc_reset(ips_ha_t *ha, int intr) { + ips_scb_t *scb; + + DBG("ips_ffdc_reset"); + + scb = &ha->scbs[ha->max_cmds-1]; + + ips_init_scb(ha, scb); + + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_FFDC; + scb->cmd.ffdc.op_code = IPS_CMD_FFDC; + scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.ffdc.reset_count = ha->reset_count; + scb->cmd.ffdc.reset_type = 0x80; + + /* convert time to what the card wants */ + ips_fix_ffdc_time(ha, scb, ha->last_ffdc); + + /* issue command */ + ips_send_wait(ha, scb, ips_cmd_timeout, intr); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_ffdc_time */ +/* */ +/* Routine Description: */ +/* */ +/* FFDC: write time info */ +/* */ +/****************************************************************************/ +static void +ips_ffdc_time(ips_ha_t *ha, int intr) { + ips_scb_t *scb; + + DBG("ips_ffdc_time"); + +#if IPS_DEBUG >= 1 + printk(KERN_NOTICE "(%s%d) Sending time update.\n", + ips_name, ha->host_num); +#endif + + scb = &ha->scbs[ha->max_cmds-1]; + + ips_init_scb(ha, scb); + + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_FFDC; + scb->cmd.ffdc.op_code = IPS_CMD_FFDC; + scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.ffdc.reset_count = 0; + scb->cmd.ffdc.reset_type = 0x80; + + /* convert time to what the card wants */ + ips_fix_ffdc_time(ha, scb, ha->last_ffdc); + + /* issue command */ + ips_send_wait(ha, scb, ips_cmd_timeout, intr); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_fix_ffdc_time */ +/* */ +/* Routine Description: */ +/* Adjust time_t to what the card wants */ +/* */ +/****************************************************************************/ +static void +ips_fix_ffdc_time(ips_ha_t *ha, ips_scb_t *scb, time_t current_time) { + long days; + long rem; + int i; + int year; + int yleap; + int year_lengths[2] = { IPS_DAYS_NORMAL_YEAR, IPS_DAYS_LEAP_YEAR }; + int month_lengths[12][2] = { {31, 31}, + {28, 29}, + {31, 31}, + {30, 30}, + {31, 31}, + {30, 30}, + {31, 31}, + {31, 31}, + {30, 30}, + {31, 31}, + {30, 30}, + {31, 31} }; + + days = current_time / IPS_SECS_DAY; + rem = current_time % IPS_SECS_DAY; + + scb->cmd.ffdc.hour = (rem / IPS_SECS_HOUR); + rem = rem % IPS_SECS_HOUR; + scb->cmd.ffdc.minute = (rem / IPS_SECS_MIN); + scb->cmd.ffdc.second = (rem % IPS_SECS_MIN); + + year = IPS_EPOCH_YEAR; + while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) { + int newy; + + newy = year + (days / IPS_DAYS_NORMAL_YEAR); + if (days < 0) + --newy; + days -= (newy - year) * IPS_DAYS_NORMAL_YEAR + + IPS_NUM_LEAP_YEARS_THROUGH(newy - 1) - + IPS_NUM_LEAP_YEARS_THROUGH(year - 1); + year = newy; + } + + scb->cmd.ffdc.yearH = year / 100; + scb->cmd.ffdc.yearL = year % 100; + + for (i = 0; days >= month_lengths[i][yleap]; ++i) + days -= month_lengths[i][yleap]; + + scb->cmd.ffdc.month = i + 1; + scb->cmd.ffdc.day = days + 1; +} + +/**************************************************************************** + * BIOS Flash Routines * + ****************************************************************************/ + +/****************************************************************************/ +/* */ +/* Routine Name: ips_erase_bios */ +/* */ +/* Routine Description: */ +/* Erase the BIOS on the adapter */ +/* */ +/****************************************************************************/ +static int +ips_erase_bios(ips_ha_t *ha) { + int timeout; + u8 status; + + /* Clear the status register */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + outb(0x50, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + /* Erase Setup */ + outb(0x20, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + /* Erase Confirm */ + outb(0xD0, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + /* Erase Status */ + outb(0x70, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + timeout = 80000; /* 80 seconds */ + + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + outl(0, ha->io_addr + IPS_REG_FLAP); + UDELAY(5); /* 5 us */ + } + + status = inb(ha->io_addr + IPS_REG_FLDP); + + if (status & 0x80) + break; + + MDELAY(1); + timeout--; + } + + /* check for timeout */ + if (timeout <= 0) { + /* timeout */ + + /* try to suspend the erase */ + outb(0xB0, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + /* wait for 10 seconds */ + timeout = 10000; + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + outl(0, ha->io_addr + IPS_REG_FLAP); + UDELAY(5); /* 5 us */ + } + + status = inb(ha->io_addr + IPS_REG_FLDP); + + if (status & 0xC0) + break; + + MDELAY(1); + timeout--; + } + + return (1); + } + + /* check for valid VPP */ + if (status & 0x08) + /* VPP failure */ + return (1); + + /* check for succesful flash */ + if (status & 0x30) + /* sequence error */ + return (1); + + /* Otherwise, we were successful */ + /* clear status */ + outb(0x50, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + /* enable reads */ + outb(0xFF, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + return (0); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_program_bios */ +/* */ +/* Routine Description: */ +/* Program the BIOS on the adapter */ +/* */ +/****************************************************************************/ +static int +ips_program_bios(ips_ha_t *ha, char *buffer, int buffersize) { + int i; + int timeout; + u8 status; + + for (i = 0; i < buffersize; i++) { + /* write a byte */ + outl(i, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + outb(0x40, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + outb(buffer[i], ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + /* wait up to one second */ + timeout = 1000; + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + outl(0, ha->io_addr + IPS_REG_FLAP); + UDELAY(5); /* 5 us */ + } + + status = inb(ha->io_addr + IPS_REG_FLDP); + + if (status & 0x80) + break; + + MDELAY(1); + timeout--; + } + + if (timeout == 0) { + /* timeout error */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + outb(0xFF, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + return (1); + } + + /* check the status */ + if (status & 0x18) { + /* programming error */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + outb(0xFF, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + return (1); + } + } /* end for */ + + /* Enable reading */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + outb(0xFF, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + return (0); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_verify_bios */ +/* */ +/* Routine Description: */ +/* Verify the BIOS on the adapter */ +/* */ +/****************************************************************************/ +static int +ips_verify_bios(ips_ha_t *ha, char *buffer, int buffersize) { + u8 checksum; + int i; + + /* test 1st byte */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55) + return (1); + + outl(1, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA) + return (1); + + checksum = 0xff; + for (i = 2; i < buffersize; i++) { + + outl(i, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + UDELAY(5); /* 5 us */ + + checksum = (u8) checksum + inb(ha->io_addr + IPS_REG_FLDP); + } + + if (checksum != 0) + /* failure */ + return (1); + else + /* success */ + return (0); } #if defined (MODULE) diff -urN v2.2.15/linux/drivers/scsi/ips.h linux/drivers/scsi/ips.h --- v2.2.15/linux/drivers/scsi/ips.h Tue Jan 4 10:12:20 2000 +++ linux/drivers/scsi/ips.h Wed Jun 7 14:26:43 2000 @@ -66,213 +66,279 @@ * Some handy macros */ #ifndef LinuxVersionCode - #define LinuxVersionCode(x,y,z) (((x)<<16)+((y)<<8)+(z)) + #define LinuxVersionCode(x,y,z) (((x)<<16)+((y)<<8)+(z)) #endif - #define HA(x) ((ips_ha_t *) x->hostdata) + #define IPS_HA(x) ((ips_ha_t *) x->hostdata) #define IPS_COMMAND_ID(ha, scb) (int) (scb - ha->scbs) - #define VIRT_TO_BUS(x) (unsigned int)virt_to_bus((void *) x) - - #define UDELAY udelay - #define MDELAY mdelay - - #define verify_area_20(t,a,sz) (0) /* success */ - #define PUT_USER put_user - #define __PUT_USER __put_user - #define PUT_USER_RET put_user_ret - #define GET_USER get_user - #define __GET_USER __get_user - #define GET_USER_RET get_user_ret - -/* - * Adapter address map equates - */ - #define HISR 0x08 /* Host Interrupt Status Reg */ - #define CCSAR 0x10 /* Cmd Channel System Addr Reg */ - #define CCCR 0x14 /* Cmd Channel Control Reg */ - #define SQHR 0x20 /* Status Q Head Reg */ - #define SQTR 0x24 /* Status Q Tail Reg */ - #define SQER 0x28 /* Status Q End Reg */ - #define SQSR 0x2C /* Status Q Start Reg */ - #define SCPR 0x05 /* Subsystem control port reg */ - #define ISPR 0x06 /* interrupt status port reg */ - #define CBSP 0x07 /* CBSP register */ + + #ifndef VIRT_TO_BUS + #define VIRT_TO_BUS(x) (unsigned int)virt_to_bus((void *) x) + #endif -/* - * Adapter register bit equates - */ - #define GHI 0x04 /* HISR General Host Interrupt */ - #define SQO 0x02 /* HISR Status Q Overflow */ - #define SCE 0x01 /* HISR Status Channel Enqueue */ - #define SEMAPHORE 0x08 /* CCCR Semaphore Bit */ - #define ILE 0x10 /* CCCR ILE Bit */ - #define START_COMMAND 0x101A /* CCCR Start Command Channel */ - #define START_STOP_BIT 0x0002 /* CCCR Start/Stop Bit */ - #define RST 0x80 /* SCPR Reset Bit */ - #define EBM 0x02 /* SCPR Enable Bus Master */ - #define EI 0x80 /* HISR Enable Interrupts */ - #define OP 0x01 /* OP bit in CBSP */ + #ifndef UDELAY + #define UDELAY udelay + #endif + + #ifndef MDELAY + #define MDELAY mdelay + #endif -/* - * Adapter Command ID Equates - */ - #define GET_LOGICAL_DRIVE_INFO 0x19 - #define GET_SUBSYS_PARAM 0x40 - #define READ_NVRAM_CONFIGURATION 0x38 - #define RW_NVRAM_PAGE 0xBC - #define IPS_READ 0x02 - #define IPS_WRITE 0x03 - #define ENQUIRY 0x05 - #define FLUSH_CACHE 0x0A - #define NORM_STATE 0x00 - #define READ_SCATTER_GATHER 0x82 - #define WRITE_SCATTER_GATHER 0x83 - #define DIRECT_CDB 0x04 - #define DIRECT_CDB_SCATTER_GATHER 0x84 - #define CONFIG_SYNC 0x58 - #define POCL 0x30 - #define GET_ERASE_ERROR_TABLE 0x17 - #define RESET_CHANNEL 0x1A - #define CSL 0xFF - #define ADAPT_RESET 0xFF + #ifndef verify_area_20 + #define verify_area_20(t,a,sz) (0) /* success */ + #endif + + #ifndef PUT_USER + #define PUT_USER put_user + #endif + + #ifndef __PUT_USER + #define __PUT_USER __put_user + #endif + + #ifndef PUT_USER_RET + #define PUT_USER_RET put_user_ret + #endif + + #ifndef GET_USER + #define GET_USER get_user + #endif + + #ifndef __GET_USER + #define __GET_USER __get_user + #endif + + #ifndef GET_USER_RET + #define GET_USER_RET get_user_ret + #endif -/* - * Adapter Equates - */ + /* + * Lock macros + */ + #define IPS_SCB_LOCK(cpu_flags) spin_lock_irqsave(&ha->scb_lock, cpu_flags) + #define IPS_SCB_UNLOCK(cpu_flags) spin_unlock_irqrestore(&ha->scb_lock, cpu_flags) + #define IPS_QUEUE_LOCK(queue) spin_lock_irqsave(&(queue)->lock, (queue)->cpu_flags) + #define IPS_QUEUE_UNLOCK(queue) spin_unlock_irqrestore(&(queue)->lock, (queue)->cpu_flags) + #define IPS_HA_LOCK(cpu_flags) spin_lock_irqsave(&ha->ips_lock, cpu_flags) + #define IPS_HA_UNLOCK(cpu_flags) spin_unlock_irqrestore(&ha->ips_lock, cpu_flags) + + /* + * Adapter address map equates + */ + #define IPS_REG_HISR 0x08 /* Host Interrupt Status Reg */ + #define IPS_REG_CCSAR 0x10 /* Cmd Channel System Addr Reg */ + #define IPS_REG_CCCR 0x14 /* Cmd Channel Control Reg */ + #define IPS_REG_SQHR 0x20 /* Status Q Head Reg */ + #define IPS_REG_SQTR 0x24 /* Status Q Tail Reg */ + #define IPS_REG_SQER 0x28 /* Status Q End Reg */ + #define IPS_REG_SQSR 0x2C /* Status Q Start Reg */ + #define IPS_REG_SCPR 0x05 /* Subsystem control port reg */ + #define IPS_REG_ISPR 0x06 /* interrupt status port reg */ + #define IPS_REG_CBSP 0x07 /* CBSP register */ + #define IPS_REG_FLAP 0x18 /* Flash address port */ + #define IPS_REG_FLDP 0x1C /* Flash data port */ + + /* + * Adapter register bit equates + */ + #define IPS_BIT_GHI 0x04 /* HISR General Host Interrupt */ + #define IPS_BIT_SQO 0x02 /* HISR Status Q Overflow */ + #define IPS_BIT_SCE 0x01 /* HISR Status Channel Enqueue */ + #define IPS_BIT_SEM 0x08 /* CCCR Semaphore Bit */ + #define IPS_BIT_ILE 0x10 /* CCCR ILE Bit */ + #define IPS_BIT_START_CMD 0x101A /* CCCR Start Command Channel */ + #define IPS_BIT_START_STOP 0x0002 /* CCCR Start/Stop Bit */ + #define IPS_BIT_RST 0x80 /* SCPR Reset Bit */ + #define IPS_BIT_EBM 0x02 /* SCPR Enable Bus Master */ + #define IPS_BIT_EI 0x80 /* HISR Enable Interrupts */ + #define IPS_BIT_OP 0x01 /* OP bit in CBSP */ + + /* + * Adapter Command ID Equates + */ + #define IPS_CMD_GET_LD_INFO 0x19 + #define IPS_CMD_GET_SUBSYS 0x40 + #define IPS_CMD_READ_CONF 0x38 + #define IPS_CMD_RW_NVRAM_PAGE 0xBC + #define IPS_CMD_READ 0x02 + #define IPS_CMD_WRITE 0x03 + #define IPS_CMD_FFDC 0xD7 + #define IPS_CMD_ENQUIRY 0x05 + #define IPS_CMD_FLUSH 0x0A + #define IPS_CMD_READ_SG 0x82 + #define IPS_CMD_WRITE_SG 0x83 + #define IPS_CMD_DCDB 0x04 + #define IPS_CMD_DCDB_SG 0x84 + #define IPS_CMD_CONFIG_SYNC 0x58 + #define IPS_CMD_ERROR_TABLE 0x17 + + /* + * Adapter Equates + */ + #define IPS_CSL 0xFF + #define IPS_POCL 0x30 + #define IPS_NORM_STATE 0x00 #define IPS_MAX_ADAPTERS 16 #define IPS_MAX_IOCTL 1 #define IPS_MAX_IOCTL_QUEUE 8 #define IPS_MAX_QUEUE 128 #define IPS_BLKSIZE 512 - #define MAX_SG_ELEMENTS 17 - #define MAX_LOGICAL_DRIVES 8 - #define MAX_CHANNELS 3 - #define MAX_TARGETS 15 - #define MAX_CHUNKS 16 - #define MAX_CMDS 128 + #define IPS_MAX_SG 17 + #define IPS_MAX_LD 8 + #define IPS_MAX_CHANNELS 4 + #define IPS_MAX_TARGETS 15 + #define IPS_MAX_CHUNKS 16 + #define IPS_MAX_CMDS 128 #define IPS_MAX_XFER 0x10000 - #define COMP_MODE_HEADS 128 - #define COMP_MODE_SECTORS 32 - #define NORM_MODE_HEADS 254 - #define NORM_MODE_SECTORS 63 - #define NVRAM_PAGE5_SIGNATURE 0xFFDDBB99 - #define MAX_POST_BYTES 0x02 - #define MAX_CONFIG_BYTES 0x02 - #define GOOD_POST_BASIC_STATUS 0x80 - #define SEMAPHORE_TIMEOUT 2000 - #define IPS_INTR_OFF 0 - #define IPS_INTR_ON 1 + #define IPS_NVRAM_P5_SIG 0xFFDDBB99 + #define IPS_MAX_POST_BYTES 0x02 + #define IPS_MAX_CONFIG_BYTES 0x02 + #define IPS_GOOD_POST_STATUS 0x80 + #define IPS_SEM_TIMEOUT 2000 + #define IPS_IOCTL_COMMAND 0x0D + #define IPS_IOCTL_NEW_COMMAND 0x81 + #define IPS_INTR_ON 0 + #define IPS_INTR_IORL 1 + #define IPS_INTR_HAL 2 #define IPS_ADAPTER_ID 0xF #define IPS_VENDORID 0x1014 #define IPS_DEVICEID 0x002E - #define TIMEOUT_10 0x10 - #define TIMEOUT_60 0x20 - #define TIMEOUT_20M 0x30 - #define STATUS_SIZE 4 - #define STATUS_Q_SIZE (MAX_CMDS+1) * STATUS_SIZE - #define ONE_MSEC 1 - #define ONE_SEC 1000 - -/* - * Adapter Basic Status Codes - */ - #define BASIC_STATUS_MASK 0xFF - #define GSC_STATUS_MASK 0x0F - #define SSUCCESS 0x00 - #define RECOVERED_ERROR 0x01 - #define IPS_CHECK_CONDITION 0x02 - #define INVAL_OPCO 0x03 - #define INVAL_CMD_BLK 0x04 - #define INVAL_PARM_BLK 0x05 + #define IPS_IOCTL_SIZE 8192 + #define IPS_STATUS_SIZE 4 + #define IPS_STATUS_Q_SIZE (IPS_MAX_CMDS+1) * IPS_STATUS_SIZE + #define IPS_ONE_MSEC 1 + #define IPS_ONE_SEC 1000 + + /* + * Geometry Settings + */ + #define IPS_COMP_HEADS 128 + #define IPS_COMP_SECTORS 32 + #define IPS_NORM_HEADS 254 + #define IPS_NORM_SECTORS 63 + + /* + * Adapter Basic Status Codes + */ + #define IPS_BASIC_STATUS_MASK 0xFF + #define IPS_GSC_STATUS_MASK 0x0F + #define IPS_CMD_SUCCESS 0x00 + #define IPS_CMD_RECOVERED_ERROR 0x01 + #define IPS_INVAL_OPCO 0x03 + #define IPS_INVAL_CMD_BLK 0x04 + #define IPS_INVAL_PARM_BLK 0x05 #define IPS_BUSY 0x08 - #define ADAPT_HARDWARE_ERROR 0x09 - #define ADAPT_FIRMWARE_ERROR 0x0A - #define CMD_CMPLT_WERROR 0x0C - #define LOG_DRV_ERROR 0x0D - #define CMD_TIMEOUT 0x0E - #define PHYS_DRV_ERROR 0x0F - -/* - * Adapter Extended Status Equates - */ - #define SELECTION_TIMEOUT 0xF0 - #define DATA_OVER_UNDER_RUN 0xF2 - #define EXT_HOST_RESET 0xF7 - #define EXT_DEVICE_RESET 0xF8 - #define EXT_RECOVERY 0xFC - #define EXT_CHECK_CONDITION 0xFF - -/* - * Operating System Defines - */ - #define OS_WINDOWS_NT 0x01 - #define OS_NETWARE 0x02 - #define OS_OPENSERVER 0x03 - #define OS_UNIXWARE 0x04 - #define OS_SOLARIS 0x05 - #define OS_OS2 0x06 - #define OS_LINUX 0x07 - #define OS_FREEBSD 0x08 - -/* - * Adapter Command/Status Packet Definitions - */ + #define IPS_CMD_CMPLT_WERROR 0x0C + #define IPS_LD_ERROR 0x0D + #define IPS_CMD_TIMEOUT 0x0E + #define IPS_PHYS_DRV_ERROR 0x0F + + /* + * Adapter Extended Status Equates + */ + #define IPS_ERR_SEL_TO 0xF0 + #define IPS_ERR_OU_RUN 0xF2 + #define IPS_ERR_HOST_RESET 0xF7 + #define IPS_ERR_DEV_RESET 0xF8 + #define IPS_ERR_RECOVERY 0xFC + #define IPS_ERR_CKCOND 0xFF + + /* + * Operating System Defines + */ + #define IPS_OS_WINDOWS_NT 0x01 + #define IPS_OS_NETWARE 0x02 + #define IPS_OS_OPENSERVER 0x03 + #define IPS_OS_UNIXWARE 0x04 + #define IPS_OS_SOLARIS 0x05 + #define IPS_OS_OS2 0x06 + #define IPS_OS_LINUX 0x07 + #define IPS_OS_FREEBSD 0x08 + + /* + * Adapter Revision ID's + */ + #define IPS_REVID_SERVERAID 0x02 + #define IPS_REVID_NAVAJO 0x03 + #define IPS_REVID_SERVERAID2 0x04 + #define IPS_REVID_CLARINETP1 0x05 + #define IPS_REVID_CLARINETP2 0x07 + #define IPS_REVID_CLARINETP3 0x0D + #define IPS_REVID_TROMBONE32 0x0F + #define IPS_REVID_TROMBONE64 0x10 + + /* + * Adapter Command/Status Packet Definitions + */ #define IPS_SUCCESS 0x01 /* Successfully completed */ #define IPS_SUCCESS_IMM 0x02 /* Success - Immediately */ #define IPS_FAILURE 0x04 /* Completed with Error */ -/* - * Logical Drive Equates - */ - #define OFF_LINE 0x02 - #define OKAY 0x03 - #define FREE 0x00 - #define SYS 0x06 - #define CRS 0x24 - -/* - * DCDB Table Equates - */ -#ifndef HOSTS_C - #define NO_DISCONNECT 0x00 - #define DISCONNECT_ALLOWED 0x80 - #define NO_AUTO_REQUEST_SENSE 0x40 + /* + * Logical Drive Equates + */ + #define IPS_LD_OFFLINE 0x02 + #define IPS_LD_OKAY 0x03 + #define IPS_LD_FREE 0x00 + #define IPS_LD_SYS 0x06 + #define IPS_LD_CRS 0x24 + + /* + * DCDB Table Equates + */ + #define IPS_NO_DISCONNECT 0x00 + #define IPS_DISCONNECT_ALLOWED 0x80 + #define IPS_NO_AUTO_REQSEN 0x40 #define IPS_DATA_NONE 0x00 #define IPS_DATA_UNK 0x00 #define IPS_DATA_IN 0x01 #define IPS_DATA_OUT 0x02 - #define TRANSFER_64K 0x08 - #define NOTIMEOUT 0x00 - #define TIMEOUT10 0x10 - #define TIMEOUT60 0x20 - #define TIMEOUT20M 0x30 -/* - * Host adapter Flags (bit numbers) - */ + #define IPS_TRANSFER64K 0x08 + #define IPS_NOTIMEOUT 0x00 + #define IPS_TIMEOUT10 0x10 + #define IPS_TIMEOUT60 0x20 + #define IPS_TIMEOUT20M 0x30 + + /* + * Host adapter Flags (bit numbers) + */ #define IPS_IN_INTR 0 #define IPS_IN_ABORT 1 #define IPS_IN_RESET 2 -/* - * SCB Flags - */ - #define SCB_ACTIVE 0x00001 - #define SCB_WAITING 0x00002 -#endif /* HOSTS_C */ -/* - * Passthru stuff - */ - #define COPPUSRCMD (('C'<<8) | 65) + /* + * SCB Flags + */ + #define IPS_SCB_ACTIVE 0x00001 + #define IPS_SCB_WAITING 0x00002 + + /* + * Passthru stuff + */ + #define IPS_COPPUSRCMD (('C'<<8) | 65) + #define IPS_COPPIOCCMD (('C'<<8) | 66) #define IPS_NUMCTRLS (('C'<<8) | 68) #define IPS_CTRLINFO (('C'<<8) | 69) + #define IPS_FLASHBIOS (('C'<<8) | 70) -/* - * Scsi_Host Template - */ + /* time oriented stuff */ + #define IPS_IS_LEAP_YEAR(y) (((y % 4 == 0) && ((y % 100 != 0) || (y % 400 == 0))) ? 1 : 0) + #define IPS_NUM_LEAP_YEARS_THROUGH(y) ((y) / 4 - (y) / 100 + (y) / 400) + + #define IPS_SECS_MIN 60 + #define IPS_SECS_HOUR 3600 + #define IPS_SECS_8HOURS 28800 + #define IPS_SECS_DAY 86400 + #define IPS_DAYS_NORMAL_YEAR 365 + #define IPS_DAYS_LEAP_YEAR 366 + #define IPS_EPOCH_YEAR 1970 + + /* + * Scsi_Host Template + */ #define IPS { \ next : NULL, \ module : NULL, \ - proc_dir : NULL, \ proc_info : NULL, \ name : NULL, \ detect : ips_detect, \ @@ -291,7 +357,7 @@ bios_param : ips_biosparam, \ can_queue : 0, \ this_id: -1, \ - sg_tablesize : MAX_SG_ELEMENTS, \ + sg_tablesize : IPS_MAX_SG, \ cmd_per_lun: 16, \ present : 0, \ unchecked_isa_dma : 0, \ @@ -313,7 +379,7 @@ u16 reserved; u32 ccsar; u32 cccr; -} BASIC_IO_CMD, *PBASIC_IO_CMD; +} IPS_IO_CMD, *PIPS_IO_CMD; typedef struct { u8 op_code; @@ -324,7 +390,7 @@ u32 reserved3; u32 ccsar; u32 cccr; -} LOGICAL_INFO, *PLOGICAL_INFO; +} IPS_LD_CMD, *PIPS_LD_CMD; typedef struct { u8 op_code; @@ -334,7 +400,7 @@ u32 reserved3; u32 buffer_addr; u32 reserved4; -} IOCTL_INFO, *PIOCTL_INFO; +} IPS_IOCTL_CMD, *PIPS_IOCTL_CMD; typedef struct { u8 op_code; @@ -345,7 +411,7 @@ u32 reserved3; u32 ccsar; u32 cccr; -} DCDB_CMD, *PDCDB_CMD; +} IPS_DCDB_CMD, *PIPS_DCDB_CMD; typedef struct { u8 op_code; @@ -357,7 +423,7 @@ u32 reserved3; u32 ccsar; u32 cccr; -} CONFIG_SYNC_CMD, *PCONFIG_SYNC_CMD; +} IPS_CS_CMD, *PIPS_CS_CMD; typedef struct { u8 op_code; @@ -369,7 +435,7 @@ u32 reserved3; u32 ccsar; u32 cccr; -} UNLOCK_STRIPE_CMD, *PUNLOCK_STRIPE_CMD; +} IPS_US_CMD, *PIPS_US_CMD; typedef struct { u8 op_code; @@ -381,7 +447,7 @@ u32 reserved4; u32 ccsar; u32 cccr; -} FLUSH_CACHE_CMD, *PFLUSH_CACHE_CMD; +} IPS_FC_CMD, *PIPS_FC_CMD; typedef struct { u8 op_code; @@ -393,7 +459,7 @@ u32 reserved3; u32 ccsar; u32 cccr; -} STATUS_CMD, *PSTATUS_CMD; +} IPS_STATUS_CMD, *PIPS_STATUS_CMD; typedef struct { u8 op_code; @@ -405,19 +471,36 @@ u32 reserved2; u32 ccsar; u32 cccr; -} NVRAM_CMD, *PNVRAM_CMD; +} IPS_NVRAM_CMD, *PIPS_NVRAM_CMD; + +typedef struct { + u8 op_code; + u8 command_id; + u8 reset_count; + u8 reset_type; + u8 second; + u8 minute; + u8 hour; + u8 day; + u8 reserved1[4]; + u8 month; + u8 yearH; + u8 yearL; + u8 reserved2; +} IPS_FFDC_CMD, *PIPS_FFDC_CMD; typedef union { - BASIC_IO_CMD basic_io; - LOGICAL_INFO logical_info; - IOCTL_INFO ioctl_info; - DCDB_CMD dcdb; - CONFIG_SYNC_CMD config_sync; - UNLOCK_STRIPE_CMD unlock_stripe; - FLUSH_CACHE_CMD flush_cache; - STATUS_CMD status; - NVRAM_CMD nvram; -} HOST_COMMAND, *PHOST_COMMAND; + IPS_IO_CMD basic_io; + IPS_LD_CMD logical_info; + IPS_IOCTL_CMD ioctl_info; + IPS_DCDB_CMD dcdb; + IPS_CS_CMD config_sync; + IPS_US_CMD unlock_stripe; + IPS_FC_CMD flush_cache; + IPS_STATUS_CMD status; + IPS_NVRAM_CMD nvram; + IPS_FFDC_CMD ffdc; +} IPS_HOST_COMMAND, *PIPS_HOST_COMMAND; typedef struct { u8 logical_id; @@ -425,25 +508,13 @@ u8 raid_level; u8 state; u32 sector_count; -} DRIVE_INFO, *PDRIVE_INFO; +} IPS_DRIVE_INFO, *PIPS_DRIVE_INFO; typedef struct { - u8 no_of_log_drive; - u8 reserved[3]; - DRIVE_INFO drive_info[MAX_LOGICAL_DRIVES]; -} LOGICAL_DRIVE_INFO, *PLOGICAL_DRIVE_INFO; - -typedef struct { - u8 ha_num; - u8 bus_num; - u8 id; - u8 device_type; - u32 data_len; - u32 data_ptr; - u8 scsi_cdb[12]; - u32 data_counter; - u32 block_size; -} NON_DISK_DEVICE_INFO, *PNON_DISK_DEVICE_INFO; + u8 no_of_log_drive; + u8 reserved[3]; + IPS_DRIVE_INFO drive_info[IPS_MAX_LD]; +} IPS_LD_INFO, *PIPS_LD_INFO; typedef struct { u8 device_address; @@ -458,24 +529,24 @@ u8 sense_info[64]; u8 scsi_status; u8 reserved2[3]; -} DCDB_TABLE, *PDCDB_TABLE; +} IPS_DCDB_TABLE, *PIPS_DCDB_TABLE; typedef struct { volatile u8 reserved; volatile u8 command_id; volatile u8 basic_status; volatile u8 extended_status; -} STATUS, *PSTATUS; +} IPS_STATUS, *PIPS_STATUS; typedef struct { - STATUS status[MAX_CMDS + 1]; - volatile PSTATUS p_status_start; - volatile PSTATUS p_status_end; - volatile PSTATUS p_status_tail; + IPS_STATUS status[IPS_MAX_CMDS + 1]; + volatile PIPS_STATUS p_status_start; + volatile PIPS_STATUS p_status_end; + volatile PIPS_STATUS p_status_tail; volatile u32 hw_status_start; volatile u32 hw_status_tail; - LOGICAL_DRIVE_INFO logical_drive_info; -} ADAPTER_AREA, *PADAPTER_AREA; + IPS_LD_INFO logical_drive_info; +} IPS_ADAPTER, *PIPS_ADAPTER; typedef struct { u8 ucLogDriveCount; @@ -488,7 +559,7 @@ u8 ucNVramDevChgCnt; u8 CodeBlkVersion[8]; u8 BootBlkVersion[8]; - u32 ulDriveSize[MAX_LOGICAL_DRIVES]; + u32 ulDriveSize[IPS_MAX_LD]; u8 ucConcurrentCmdCount; u8 ucMaxPhysicalDevices; u16 usFlashRepgmCount; @@ -499,8 +570,8 @@ u16 usConfigUpdateCount; u8 ucBlkFlag; u8 reserved; - u16 usAddrDeadDisk[MAX_CHANNELS * MAX_TARGETS]; -} ENQCMD, *PENQCMD; + u16 usAddrDeadDisk[IPS_MAX_CHANNELS * IPS_MAX_TARGETS]; +} IPS_ENQ, *PIPS_ENQ; typedef struct { u8 ucInitiator; @@ -509,7 +580,7 @@ u8 ucState; u32 ulBlockCount; u8 ucDeviceId[28]; -} DEVSTATE, *PDEVSTATE; +} IPS_DEVSTATE, *PIPS_DEVSTATE; typedef struct { u8 ucChn; @@ -517,7 +588,7 @@ u16 ucReserved; u32 ulStartSect; u32 ulNoOfSects; -} CHUNK, *PCHUNK; +} IPS_CHUNK, *PIPS_CHUNK; typedef struct { u16 ucUserField; @@ -528,8 +599,8 @@ u8 ucParams; u8 ucReserved; u32 ulLogDrvSize; - CHUNK chunk[MAX_CHUNKS]; -} LOGICAL_DRIVE, *PLOGICAL_DRIVE; + IPS_CHUNK chunk[IPS_MAX_CHUNKS]; +} IPS_LD, *PIPS_LD; typedef struct { u8 board_disc[8]; @@ -539,7 +610,7 @@ u8 ucCompression; u8 ucNvramType; u32 ulNvramSize; -} HARDWARE_DISC, *PHARDWARE_DISC; +} IPS_HARDWARE, *PIPS_HARDWARE; typedef struct { u8 ucLogDriveCount; @@ -563,12 +634,12 @@ u16 user_field; u8 ucRebuildRate; u8 ucReserve; - HARDWARE_DISC hardware_disc; - LOGICAL_DRIVE logical_drive[MAX_LOGICAL_DRIVES]; - DEVSTATE dev[MAX_CHANNELS][MAX_TARGETS+1]; + IPS_HARDWARE hardware_disc; + IPS_LD logical_drive[IPS_MAX_LD]; + IPS_DEVSTATE dev[IPS_MAX_CHANNELS][IPS_MAX_TARGETS+1]; u8 reserved[512]; -} CONFCMD, *PCONFCMD; +} IPS_CONF, *PIPS_CONF; typedef struct { u32 signature; @@ -583,17 +654,15 @@ u8 driver_high[4]; u8 driver_low[4]; u8 reserved4[100]; -} NVRAM_PAGE5, *PNVRAM_PAGE5; +} IPS_NVRAM_P5, *PIPS_NVRAM_P5; -typedef struct _SUBSYS_PARAM { +typedef struct _IPS_SUBSYS { u32 param[128]; -} SUBSYS_PARAM, *PSUBSYS_PARAM; +} IPS_SUBSYS, *PIPS_SUBSYS; /* * Inquiry Data Format */ -#ifndef HOSTS_C - typedef struct { u8 DeviceType:5; u8 DeviceTypeQualifier:3; @@ -616,16 +685,15 @@ u8 ProductRevisionLevel[4]; u8 VendorSpecific[20]; u8 Reserved3[40]; -} INQUIRYDATA, *PINQUIRYDATA; +} IPS_INQ_DATA, *PIPS_INQ_DATA; -#endif /* * Read Capacity Data Format */ typedef struct { u32 lba; u32 len; -} CAPACITY_T; +} IPS_CAPACITY; /* * Sense Data Format @@ -649,7 +717,7 @@ u32 pg_rmb:1; /* Removeable */ u32 pg_hsec:1; /* Hard sector formatting */ u32 pg_ssec:1; /* Soft sector formatting */ -} DADF_T; +} IPS_DADF; typedef struct { u8 pg_pc:6; /* Page Code */ @@ -665,9 +733,9 @@ u32 pg_landu:16; /* Landing zone cylinder (upper) */ u32 pg_landl:8; /* Landing zone cylinder (lower) */ u32 pg_res2:24; /* Reserved */ -} RDDG_T; +} IPS_RDDG; -struct blk_desc { +struct ips_blk_desc { u8 bd_dencode; u8 bd_nblks1; u8 bd_nblks2; @@ -684,15 +752,15 @@ u8 plh_res:7; /* Reserved */ u8 plh_wp:1; /* Write protect */ u8 plh_bdl; /* Block descriptor length */ -} SENSE_PLH_T; +} ips_sense_plh_t; typedef struct { - SENSE_PLH_T plh; - struct blk_desc blk_desc; + ips_sense_plh_t plh; + struct ips_blk_desc blk_desc; union { - DADF_T pg3; - RDDG_T pg4; + IPS_DADF pg3; + IPS_RDDG pg4; } pdata; } ips_mdata_t; @@ -702,14 +770,14 @@ typedef struct ips_sglist { u32 address; u32 length; -} SG_LIST, *PSG_LIST; +} IPS_SG_LIST, *PIPS_SG_LIST; -typedef struct _INFOSTR { +typedef struct _IPS_INFOSTR { char *buffer; int length; int offset; int pos; -} INFOSTR; +} IPS_INFOSTR; /* * Status Info @@ -725,7 +793,9 @@ typedef struct ips_scb_queue { struct ips_scb *head; struct ips_scb *tail; - unsigned int count; + u32 count; + u32 cpu_flags; + spinlock_t lock; } ips_scb_queue_t; /* @@ -734,12 +804,28 @@ typedef struct ips_wait_queue { Scsi_Cmnd *head; Scsi_Cmnd *tail; - unsigned int count; + u32 count; + u32 cpu_flags; + spinlock_t lock; } ips_wait_queue_t; +typedef struct ips_copp_wait_item { + Scsi_Cmnd *scsi_cmd; + struct semaphore *sem; + struct ips_copp_wait_item *next; +} ips_copp_wait_item_t; + +typedef struct ips_copp_queue { + struct ips_copp_wait_item *head; + struct ips_copp_wait_item *tail; + u32 count; + u32 cpu_flags; + spinlock_t lock; +} ips_copp_queue_t; + typedef struct ips_ha { - u8 ha_id[MAX_CHANNELS+1]; - u32 dcdb_active[MAX_CHANNELS]; + u8 ha_id[IPS_MAX_CHANNELS+1]; + u32 dcdb_active[IPS_MAX_CHANNELS]; u32 io_addr; /* Base I/O address */ u8 irq; /* IRQ for adapter */ u8 ntargets; /* Number of targets */ @@ -754,35 +840,39 @@ struct ips_scb *scbs; /* Array of all CCBS */ struct ips_scb *scb_freelist; /* SCB free list */ ips_wait_queue_t scb_waitlist; /* Pending SCB list */ - ips_wait_queue_t copp_waitlist; /* Pending PT list */ + ips_copp_queue_t copp_waitlist; /* Pending PT list */ ips_scb_queue_t scb_activelist; /* Active SCB list */ - BASIC_IO_CMD *dummy; /* dummy command */ - ADAPTER_AREA *adapt; /* Adapter status area */ - ENQCMD *enq; /* Adapter Enquiry data */ - CONFCMD *conf; /* Adapter config data */ - NVRAM_PAGE5 *nvram; /* NVRAM page 5 data */ - SUBSYS_PARAM *subsys; /* Subsystem parameters */ + IPS_IO_CMD *dummy; /* dummy command */ + IPS_ADAPTER *adapt; /* Adapter status area */ + IPS_ENQ *enq; /* Adapter Enquiry data */ + IPS_CONF *conf; /* Adapter config data */ + IPS_NVRAM_P5 *nvram; /* NVRAM page 5 data */ + IPS_SUBSYS *subsys; /* Subsystem parameters */ + char *ioctl_data; /* IOCTL data area */ + u32 ioctl_datasize; /* IOCTL data size */ u32 cmd_in_progress; /* Current command in progress*/ u32 flags; /* HA flags */ u8 waitflag; /* are we waiting for cmd */ u8 active; - u32 reserved:16; /* reserved space */ - struct wait_queue *copp_queue; /* passthru sync queue */ + u16 reset_count; /* number of resets */ + u32 last_ffdc; /* last time we sent ffdc info*/ + u8 revision_id; /* Revision level */ #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,0) spinlock_t scb_lock; spinlock_t copp_lock; + spinlock_t ips_lock; #endif } ips_ha_t; -typedef void (*scb_callback) (ips_ha_t *, struct ips_scb *); +typedef void (*ips_scb_callback) (ips_ha_t *, struct ips_scb *); /* * SCB Format */ typedef struct ips_scb { - HOST_COMMAND cmd; - DCDB_TABLE dcdb; + IPS_HOST_COMMAND cmd; + IPS_DCDB_TABLE dcdb; u8 target_id; u8 bus; u8 lun; @@ -797,31 +887,53 @@ u32 sg_len; u32 flags; u32 op_code; - SG_LIST *sg_list; + IPS_SG_LIST *sg_list; Scsi_Cmnd *scsi_cmd; struct ips_scb *q_next; - scb_callback callback; + ips_scb_callback callback; + struct semaphore *sem; } ips_scb_t; +typedef struct ips_scb_pt { + IPS_HOST_COMMAND cmd; + IPS_DCDB_TABLE dcdb; + u8 target_id; + u8 bus; + u8 lun; + u8 cdb[12]; + u32 scb_busaddr; + u32 data_busaddr; + u32 timeout; + u8 basic_status; + u8 extended_status; + u16 breakup; + u32 data_len; + u32 sg_len; + u32 flags; + u32 op_code; + IPS_SG_LIST *sg_list; + Scsi_Cmnd *scsi_cmd; + struct ips_scb *q_next; + ips_scb_callback callback; +} ips_scb_pt_t; + /* * Passthru Command Format */ typedef struct { - u8 CoppID[4]; - u32 CoppCmd; - u32 PtBuffer; - u8 *CmdBuffer; - u32 CmdBSize; - ips_scb_t CoppCP; - u32 TimeOut; - u8 BasicStatus; - u8 ExtendedStatus; - u16 reserved; + u8 CoppID[4]; + u32 CoppCmd; + u32 PtBuffer; + u8 *CmdBuffer; + u32 CmdBSize; + ips_scb_pt_t CoppCP; + u32 TimeOut; + u8 BasicStatus; + u8 ExtendedStatus; + u16 reserved; } ips_passthru_t; #endif - - /* * Overrides for Emacs so that we almost follow Linus's tabbing style. diff -urN v2.2.15/linux/drivers/scsi/megaraid.c linux/drivers/scsi/megaraid.c --- v2.2.15/linux/drivers/scsi/megaraid.c Wed May 3 17:16:45 2000 +++ linux/drivers/scsi/megaraid.c Wed Jun 7 14:26:43 2000 @@ -1677,7 +1677,7 @@ "megaraid: to protect your data, please upgrade your firmware to version\n" "megaraid: 3.10 or later, available from the Dell Technical Support web\n" "megaraid: site at\n" -"http://support.dell.com/us/en/filelib/download/index.asp?fileid=2489\n"); +"http://support.dell.com/us/en/filelib/download/index.asp?fileid=2940\n"); megaraid_release (host); #ifdef MODULE continue; diff -urN v2.2.15/linux/drivers/scsi/scsi.c linux/drivers/scsi/scsi.c --- v2.2.15/linux/drivers/scsi/scsi.c Wed May 3 17:16:45 2000 +++ linux/drivers/scsi/scsi.c Wed Jun 7 14:26:43 2000 @@ -114,7 +114,6 @@ #define BLIST_MAX5LUN 0x080 #define BLIST_ISDISK 0x100 #define BLIST_ISROM 0x200 -#define BLIST_GHOST 0x400 /* * Data declarations. @@ -307,13 +306,7 @@ {"NEC","PD-1 ODX654P","*", BLIST_FORCELUN | BLIST_SINGLELUN}, {"MATSHITA","PD-1","*", BLIST_FORCELUN | BLIST_SINGLELUN}, {"iomega","jaz 1GB","J.86", BLIST_NOTQ | BLIST_NOLUN}, -{"CREATIVE","DVD-RAM RAM","*", BLIST_GHOST}, -{"MATSHITA","PD-2 LF-D100","*", BLIST_GHOST}, -{"AOpen","PD-2 DVD-520S","*", BLIST_GHOST}, -{"HITACHI","GF-1050","*", BLIST_GHOST}, /* Hitachi SCSI DVD-RAM */ {"TOSHIBA","CDROM","*", BLIST_ISROM}, -{"TOSHIBA","DVD-RAM SD-W1101","*", BLIST_GHOST}, -{"TOSHIBA","DVD-RAM SD-W1111","*", BLIST_GHOST}, {"MegaRAID", "LD", "*", BLIST_FORCELUN}, /* * Must be at end of list... @@ -677,8 +670,6 @@ struct Scsi_Device_Template *sdtpnt; Scsi_Device * SDtail, *SDpnt=*SDpnt2; int bflags, type=-1; - static int ghost_channel=-1, ghost_dev=-1; - int org_lun = lun; SDpnt->host = shpnt; SDpnt->id = dev; @@ -686,12 +677,6 @@ SDpnt->channel = channel; SDpnt->online = TRUE; - if ((channel == ghost_channel) && (dev == ghost_dev) && (lun == 1)) { - SDpnt->lun = 0; - } else { - ghost_channel = ghost_dev = -1; - } - /* Some low level driver could use device->type (DB) */ SDpnt->type = -1; @@ -804,17 +789,6 @@ scsi_result[1] |= 0x80; /* removable */ } - if (bflags & BLIST_GHOST) { - if ((ghost_channel == channel) && (ghost_dev == dev) && (org_lun == 1)) { - lun=1; - } else { - ghost_channel = channel; - ghost_dev = dev; - scsi_result[0] = TYPE_MOD; - scsi_result[1] |= 0x80; /* removable */ - } - } - memcpy (SDpnt->vendor, scsi_result + 8, 8); memcpy (SDpnt->model, scsi_result + 16, 16); memcpy (SDpnt->rev, scsi_result + 32, 4); @@ -1003,15 +977,6 @@ } /* - * If this device is Ghosted, scan upto two luns. (It physically only - * has one). -- REW - */ - if (bflags & BLIST_GHOST) { - *max_dev_lun = 2; - return 1; - } - - /* * REGAL CDC-4X: avoid hang after LUN 4 */ if (bflags & BLIST_MAX5LUN) { @@ -2500,6 +2465,8 @@ * Nobody is using this device any more. * Free all of the command structures. */ + if (HBA_ptr->hostt->revoke) + HBA_ptr->hostt->revoke(scd); for(SCpnt=scd->device_queue; SCpnt; SCpnt = scd->device_queue) { scd->device_queue = SCpnt->next; diff -urN v2.2.15/linux/drivers/scsi/sd.c linux/drivers/scsi/sd.c --- v2.2.15/linux/drivers/scsi/sd.c Wed May 3 17:16:45 2000 +++ linux/drivers/scsi/sd.c Wed Jun 7 14:26:43 2000 @@ -999,7 +999,7 @@ if(block & 7) panic("sd.c:Bad block number requested"); if(this_count & 7) panic("sd.c:Bad block number requested"); block = block >> 3; - this_count = block >> 3; + this_count = this_count >> 3; } if (rscsi_disks[dev].sector_size == 2048){ @@ -1381,7 +1381,7 @@ } } - if( rscsi_disks[i].sector_size == 2048 ) + if( rscsi_disks[i].sector_size > 1024 ) { int m; @@ -1393,7 +1393,7 @@ */ for (m=i<<4; m<((i+1)<<4); m++) { - sd_blocksizes[m] = 2048; + sd_blocksizes[m] = rscsi_disks[i].sector_size; } } { diff -urN v2.2.15/linux/drivers/scsi/sd_ioctl.c linux/drivers/scsi/sd_ioctl.c --- v2.2.15/linux/drivers/scsi/sd_ioctl.c Wed Feb 24 16:27:54 1999 +++ linux/drivers/scsi/sd_ioctl.c Wed Jun 7 14:26:43 2000 @@ -113,6 +113,10 @@ return put_user(blksize_size[MAJOR(dev)][MINOR(dev)&0x0F], (int *)arg); + case BLKELVGET: + case BLKELVSET: + return blkelv_ioctl(inode->i_rdev, cmd, arg); + RO_IOCTLS(dev, arg); default: diff -urN v2.2.15/linux/drivers/scsi/seagate.c linux/drivers/scsi/seagate.c --- v2.2.15/linux/drivers/scsi/seagate.c Tue Jan 4 10:12:21 2000 +++ linux/drivers/scsi/seagate.c Wed Jun 7 14:26:43 2000 @@ -318,6 +318,8 @@ {"FUTURE DOMAIN CORP. (C) 1992 V8.00.004/02/92", 5, 44, FD}, {"IBM F1 BIOS V1.1004/30/92", 5, 25, FD}, {"FUTURE DOMAIN TMC-950", 5, 21, FD}, + /* Added for 2.2.16 by Matthias_Heidbrink@b.maus.de */ + {"IBM F1 V1.2009/22/93", 5, 25, FD}, }; #define NUM_SIGNATURES (sizeof(signatures) / sizeof(Signature)) diff -urN v2.2.15/linux/drivers/scsi/sg.c linux/drivers/scsi/sg.c --- v2.2.15/linux/drivers/scsi/sg.c Tue Jan 4 10:12:21 2000 +++ linux/drivers/scsi/sg.c Wed Jun 7 14:26:43 2000 @@ -7,7 +7,7 @@ * Original driver (sg.c): * Copyright (C) 1992 Lawrence Foard * 2.x extensions to driver: - * Copyright (C) 1998, 1999 Douglas Gilbert + * Copyright (C) 1998 - 2000 Douglas Gilbert * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,8 +16,8 @@ * * Borrows code from st driver. Thanks to Alessandro Rubini's "dd" book. */ - static char * sg_version_str = "Version: 2.1.36 (991218)"; - static int sg_version_num = 20136; /* 2 digits for each component */ + static char * sg_version_str = "Version: 2.1.38 (20000527)"; + static int sg_version_num = 20138; /* 2 digits for each component */ /* * D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes: * - scsi logging is available via SCSI_LOG_TIMEOUT macros. First @@ -35,7 +35,7 @@ * # echo "scsi dump 1" > /proc/scsi/scsi * To dump the state of sg's data structures get the 'sg_debug' * program from the utilities and enter: - * # sg_debug /dev/sga + * # sg_debug /dev/sg0 * or any valid sg device name. The state of _all_ sg devices * will be sent to the console and the log. * @@ -100,7 +100,7 @@ static void sg_detach(Scsi_Device *); -struct Scsi_Device_Template sg_template = {NULL, NULL, "sg", NULL, 0xff, +struct Scsi_Device_Template sg_template = {NULL, "generic", "sg", NULL, 0xff, SCSI_GENERIC_MAJOR, 0, 0, 0, 0, sg_detect, sg_init, sg_finish, sg_attach, sg_detach}; @@ -127,6 +127,7 @@ Sg_scatter_hold data; /* hold buffer, perhaps scatter list */ struct sg_header header; /* scsi command+info, see */ char res_used; /* 1 -> using reserve buffer, 0 -> not ... */ + char done; /* 0->before bh, 1->before read, 2->read */ } Sg_request; /* 72 bytes long on i386 */ typedef struct sg_fd /* holds the state of a file descriptor */ @@ -186,7 +187,7 @@ static void sg_low_free(char * buff, int size, int mem_src); static Sg_fd * sg_add_sfp(Sg_device * sdp, int dev, int get_reserved); static int sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp); -static Sg_request * sg_get_request(const Sg_fd * sfp, int pack_id); +static Sg_request * sg_get_rq_mark(Sg_fd * sfp, int pack_id); static Sg_request * sg_add_request(Sg_fd * sfp); static int sg_remove_request(Sg_fd * sfp, const Sg_request * srp); static int sg_res_in_use(const Sg_fd * sfp); @@ -319,13 +320,13 @@ copy_from_user(&hdr, buf, size_sg_header); req_pack_id = hdr.pack_id; } - srp = sg_get_request(sfp, req_pack_id); + srp = sg_get_rq_mark(sfp, req_pack_id); if (! srp) { /* now wait on packet to arrive */ if (filp->f_flags & O_NONBLOCK) return -EAGAIN; res = 0; /* following is a macro that beats race condition */ __wait_event_interruptible(sfp->read_wait, - (srp = sg_get_request(sfp, req_pack_id)), + (srp = sg_get_rq_mark(sfp, req_pack_id)), res); if (res) return res; /* -ERESTARTSYS because signal hit process */ @@ -533,7 +534,7 @@ if (result) return result; srp = sfp->headrp; while (srp) { - if (! srp->my_cmdp) { + if (1 == srp->done) { __put_user(srp->header.pack_id, (int *)arg); return 0; } @@ -545,7 +546,7 @@ srp = sfp->headrp; val = 0; while (srp) { - if (! srp->my_cmdp) + if (1 == srp->done) ++val; srp = srp->nextrp; } @@ -609,8 +610,29 @@ return -EBUSY; result = get_user(val, (int *)arg); if (result) return result; - /* Don't do anything till scsi mod level visibility */ - return 0; + if (SG_SCSI_RESET_NOTHING == val) + return 0; +#ifdef SCSI_TRY_RESET_DEVICE + switch (val) + { + case SG_SCSI_RESET_DEVICE: + val = SCSI_TRY_RESET_DEVICE; + break; + case SG_SCSI_RESET_BUS: + val = SCSI_TRY_RESET_BUS; + break; + case SG_SCSI_RESET_HOST: + val = SCSI_TRY_RESET_HOST; + break; + default: + return -EINVAL; + } + if(! capable(CAP_SYS_ADMIN)) return -EACCES; + return (scsi_reset_provider(sdp->device, val) == SUCCESS) ? 0 : -EIO; +#else + SCSI_LOG_TIMEOUT(1, printk("sg_ioctl: SG_RESET_SCSI not supported\n")); + result = -EINVAL; +#endif case SCSI_IOCTL_SEND_COMMAND: /* Allow SCSI_IOCTL_SEND_COMMAND without checking suser() since the user already has read/write access to the generic device and so @@ -652,7 +674,7 @@ poll_wait(filp, &sfp->read_wait, wait); srp = sfp->headrp; while (srp) { /* if any read waiting, flag it */ - if (! (res || srp->my_cmdp)) + if ((0 == res) && (1 == srp->done)) res = POLLIN | POLLRDNORM; ++count; srp = srp->nextrp; @@ -732,6 +754,7 @@ srp->data.buffer = SCpnt->buffer; sg_clr_scpnt(SCpnt); srp->my_cmdp = NULL; + srp->done = 1; SCSI_LOG_TIMEOUT(4, printk("sg__done: dev=%d, scsi_stat=%d, res=0x%x\n", dev, (int)status_byte(SCpnt->result), (int)SCpnt->result)); @@ -864,9 +887,9 @@ dev = MINOR(sdp->i_rdev); if (part_of) - printk(" >>> device=%d(sg%c), ", dev, 'a' + dev); + printk(" >>> device=%d (sg%d), ", dev, dev); else - printk("sg_debug: device=%d(sg%c), ", dev, 'a' + dev); + printk("sg_debug: device=%d (sg%d), ", dev, dev); printk("scsi%d chan=%d id=%d lun=%d em=%d\n", sdp->device->host->host_no, sdp->device->channel, sdp->device->id, sdp->device->lun, sdp->device->host->hostt->emulated); @@ -908,7 +931,8 @@ srp->header.pack_id, srp->my_cmdp->bufflen, srp->my_cmdp->use_sg); else - printk("to_read: pack_id=%d, bufflen=%d, use_sg=%d\n", + printk("%s: pack_id=%d, bufflen=%d, use_sg=%d\n", + ((1 == srp->done) ? "to_read" : "prior"), srp->header.pack_id, srp->data.bufflen, srp->data.use_sg); if (! srp->parentfp) printk(">> request has NULL parent pointer ???\n"); @@ -945,9 +969,9 @@ case TYPE_WORM: case TYPE_TAPE: break; default: - printk("Detected scsi generic sg%c at scsi%d," + printk("Detected scsi generic sg%d at scsi%d," " channel %d, id %d, lun %d\n", - 'a'+sg_template.dev_noticed, + sg_template.dev_noticed, scsidp->host->host_no, scsidp->channel, scsidp->id, scsidp->lun); } @@ -1124,6 +1148,8 @@ SCSI_LOG_TIMEOUT(4, printk("sg_start_req: max_buff_size=%d\n", max_buff_size)); + if (max_buff_size <= 0) + return 0; if ((! sg_res_in_use(sfp)) && (max_buff_size <= rsv_schp->bufflen)) { sg_link_reserve(sfp, srp, max_buff_size); sg_write_xfer(req_schp, inp, num_write_xfer); @@ -1351,6 +1377,8 @@ Sg_scatter_hold * rsv_schp = &sfp->reserve; SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size)); + /* round request up to next highest SG_SECTOR_SZ byte boundary */ + size = (size + SG_SECTOR_MSK) & (~SG_SECTOR_MSK); if (rsv_schp->use_sg > 0) { int k, num; int rem = size; @@ -1413,15 +1441,17 @@ srp->res_used = 0; } -static Sg_request * sg_get_request(const Sg_fd * sfp, int pack_id) +static Sg_request * sg_get_rq_mark(Sg_fd * sfp, int pack_id) { Sg_request * resp = NULL; resp = sfp->headrp; while (resp) { - if ((! resp->my_cmdp) && - ((-1 == pack_id) || (resp->header.pack_id == pack_id))) + if ((1 == resp->done) && + ((-1 == pack_id) || (resp->header.pack_id == pack_id))) { + resp->done = 2; return resp; + } resp = resp->nextrp; } return resp; @@ -1431,12 +1461,12 @@ static Sg_request * sg_add_request(Sg_fd * sfp) { int k; - Sg_request * resp = NULL; - Sg_request * rp; + Sg_request * resp = sfp->headrp; + Sg_request * rp = sfp->req_arr; - resp = sfp->headrp; - rp = sfp->req_arr; if (! resp) { + memset(rp, 0, sizeof(Sg_request)); + rp->parentfp = sfp; resp = rp; sfp->headrp = resp; } @@ -1444,12 +1474,15 @@ if (0 == sfp->cmd_q) resp = NULL; /* command queuing disallowed */ else { - for (k = 0, rp; k < SG_MAX_QUEUE; ++k, ++rp) { + for (k = 0; k < SG_MAX_QUEUE; ++k, ++rp) { if (! rp->parentfp) break; } if (k < SG_MAX_QUEUE) { - while (resp->nextrp) resp = resp->nextrp; + memset(rp, 0, sizeof(Sg_request)); + rp->parentfp = sfp; + while (resp->nextrp) + resp = resp->nextrp; resp->nextrp = rp; resp = rp; } @@ -1458,11 +1491,7 @@ } } if (resp) { - resp->parentfp = sfp; resp->nextrp = NULL; - resp->res_used = 0; - memset(&resp->data, 0, sizeof(Sg_scatter_hold)); - memset(&resp->header, 0, sizeof(struct sg_header)); resp->my_cmdp = NULL; } return resp; @@ -1478,14 +1507,14 @@ return 0; prev_rp = sfp->headrp; if (srp == prev_rp) { - prev_rp->parentfp = NULL; sfp->headrp = prev_rp->nextrp; + prev_rp->parentfp = NULL; return 1; } while ((rp = prev_rp->nextrp)) { if (srp == rp) { - rp->parentfp = NULL; prev_rp->nextrp = rp->nextrp; + rp->parentfp = NULL; return 1; } prev_rp = rp; @@ -1551,7 +1580,7 @@ /* Need to stop sg_command_done() playing with this list during this loop */ while (srp) { tsrp = srp->nextrp; - if (! srp->my_cmdp) + if (srp->done) sg_finish_rem_req(srp, NULL, 0); else ++dirty; diff -urN v2.2.15/linux/drivers/scsi/sr.c linux/drivers/scsi/sr.c --- v2.2.15/linux/drivers/scsi/sr.c Fri Jan 15 14:41:04 1999 +++ linux/drivers/scsi/sr.c Wed Jun 7 14:26:43 2000 @@ -1,25 +1,31 @@ /* * sr.c Copyright (C) 1992 David Giller - * Copyright (C) 1993, 1994, 1995 Eric Youngdale + * Copyright (C) 1993, 1994, 1995 Eric Youngdale * * adapted from: - * sd.c Copyright (C) 1992 Drew Eckhardt - * Linux scsi disk driver by - * Drew Eckhardt + * sd.c Copyright (C) 1992 Drew Eckhardt + * Linux scsi disk driver by + * Drew Eckhardt * * Modified by Eric Youngdale ericy@cais.com to * add scatter-gather, multiple outstanding request, and other * enhancements. * - * Modified by Eric Youngdale eric@aib.com to support loadable - * low-level scsi drivers. + * Modified by Eric Youngdale eric@aib.com to support loadable + * low-level scsi drivers. * - * Modified by Thomas Quinot thomas@melchior.cuivre.fdn.fr to - * provide auto-eject. + * Modified by Thomas Quinot thomas@melchior.cuivre.fdn.fr to + * provide auto-eject. * * Modified by Gerd Knorr to support the * generic cdrom interface * + * Modified by Jens Axboe - Uniform sr_packet() + * interface, capabilities probe additions, ioctl cleanups, etc. + * + * Modified by Jens Axboe - support DVD-RAM + * transparently and loose the GHOST hack + * */ #include @@ -34,19 +40,22 @@ #include #include #include +#include #define MAJOR_NR SCSI_CDROM_MAJOR #include #include "scsi.h" #include "hosts.h" #include "sr.h" -#include /* For the door lock/unlock commands */ +#include /* For the door lock/unlock commands */ #include "constants.h" -MODULE_PARM(xa_test,"i"); /* see sr_ioctl.c */ +#ifdef MODULE +MODULE_PARM(xa_test, "i"); /* see sr_ioctl.c */ +#endif -#define MAX_RETRIES 3 -#define SR_TIMEOUT (30 * HZ) +#define MAX_RETRIES 3 +#define SR_TIMEOUT (30 * HZ) static int sr_init(void); static void sr_finish(void); @@ -54,53 +63,60 @@ static int sr_detect(Scsi_Device *); static void sr_detach(Scsi_Device *); -struct Scsi_Device_Template sr_template = {NULL, "cdrom", "sr", NULL, TYPE_ROM, - SCSI_CDROM_MAJOR, 0, 0, 0, 1, - sr_detect, sr_init, - sr_finish, sr_attach, sr_detach}; +struct Scsi_Device_Template sr_template = { + NULL, "cdrom", "sr", NULL, TYPE_ROM, + SCSI_CDROM_MAJOR, 0, 0, 0, 1, + sr_detect, sr_init, + sr_finish, sr_attach, sr_detach +}; -Scsi_CD * scsi_CDs = NULL; -static int * sr_sizes = NULL; +Scsi_CD *scsi_CDs = NULL; +static int *sr_sizes = NULL; -static int * sr_blocksizes = NULL; +static int *sr_blocksizes = NULL; -static int sr_open(struct cdrom_device_info*, int); +static int sr_open(struct cdrom_device_info *, int); void get_sectorsize(int); void get_capabilities(int); -void requeue_sr_request (Scsi_Cmnd * SCpnt); -static int sr_media_change(struct cdrom_device_info*, int); +void requeue_sr_request(Scsi_Cmnd * SCpnt); +static int sr_media_change(struct cdrom_device_info *, int); +static int sr_packet(struct cdrom_device_info *, struct cdrom_generic_command *); static void sr_release(struct cdrom_device_info *cdi) { if (scsi_CDs[MINOR(cdi->dev)].sector_size > 2048) - sr_set_blocklength(MINOR(cdi->dev),2048); + sr_set_blocklength(MINOR(cdi->dev), 2048); sync_dev(cdi->dev); scsi_CDs[MINOR(cdi->dev)].device->access_count--; if (scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module) __MOD_DEC_USE_COUNT(scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module); - if(sr_template.module) - __MOD_DEC_USE_COUNT(sr_template.module); + if (sr_template.module) + __MOD_DEC_USE_COUNT(sr_template.module); } -static struct cdrom_device_ops sr_dops = { - sr_open, /* open */ - sr_release, /* release */ - sr_drive_status, /* drive status */ - sr_media_change, /* media changed */ - sr_tray_move, /* tray move */ - sr_lock_door, /* lock door */ - sr_select_speed, /* select speed */ - NULL, /* select disc */ - sr_get_last_session, /* get last session */ - sr_get_mcn, /* get universal product code */ - sr_reset, /* hard reset */ - sr_audio_ioctl, /* audio ioctl */ - sr_dev_ioctl, /* device-specific ioctl */ - CDC_CLOSE_TRAY | CDC_OPEN_TRAY| CDC_LOCK | CDC_SELECT_SPEED | - CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | - CDC_RESET | CDC_IOCTLS | CDC_DRIVE_STATUS, - 0 +static struct cdrom_device_ops sr_dops = +{ + sr_open, /* open */ + sr_release, /* release */ + sr_drive_status, /* drive status */ + sr_media_change, /* media changed */ + sr_tray_move, /* tray move */ + sr_lock_door, /* lock door */ + sr_select_speed, /* select speed */ + NULL, /* select disc */ + sr_get_last_session, /* get last session */ + sr_get_mcn, /* get universal product code */ + sr_reset, /* hard reset */ + sr_audio_ioctl, /* audio ioctl */ + sr_dev_ioctl, /* device-specific ioctl */ + CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | + CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | + CDC_PLAY_AUDIO | CDC_RESET | CDC_IOCTLS | CDC_DRIVE_STATUS | + CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | + CDC_GENERIC_PACKET, + 0, + sr_packet }; /* @@ -113,48 +129,47 @@ * an inode for that to work, and we do not always have one. */ -int sr_media_change(struct cdrom_device_info *cdi, int slot){ +int sr_media_change(struct cdrom_device_info *cdi, int slot) +{ int retval; - if (CDSL_CURRENT != slot) { - /* no changer support */ - return -EINVAL; - } - + if (CDSL_CURRENT != slot) { + /* no changer support */ + return -EINVAL; + } retval = scsi_ioctl(scsi_CDs[MINOR(cdi->dev)].device, - SCSI_IOCTL_TEST_UNIT_READY, 0); + SCSI_IOCTL_TEST_UNIT_READY, 0); - if(retval) - { - /* Unable to test, unit probably not ready. This usually + if (retval) { + /* Unable to test, unit probably not ready. This usually * means there is no disc in the drive. Mark as changed, * and we will figure it out later once the drive is * available again. */ - scsi_CDs[MINOR(cdi->dev)].device->changed = 1; - return 1; /* This will force a flush, if called from - * check_disk_change */ + scsi_CDs[MINOR(cdi->dev)].device->changed = 1; + return 1; /* This will force a flush, if called from + * check_disk_change */ }; retval = scsi_CDs[MINOR(cdi->dev)].device->changed; - scsi_CDs[MINOR(cdi->dev)].device->changed = 0; - /* If the disk changed, the capacity will now be different, - * so we force a re-read of this information */ - if (retval) { + scsi_CDs[MINOR(cdi->dev)].device->changed = 0; + /* If the disk changed, the capacity will now be different, + * so we force a re-read of this information */ + if (retval) { /* check multisession offset etc */ - sr_cd_check(cdi); - - /* - * If the disk changed, the capacity will now be different, - * so we force a re-read of this information - * Force 2048 for the sector size so that filesystems won't - * be trying to use something that is too small if the disc - * has changed. - */ - scsi_CDs[MINOR(cdi->dev)].needs_sector_size = 1; + sr_cd_check(cdi); + + /* + * If the disk changed, the capacity will now be different, + * so we force a re-read of this information + * Force 2048 for the sector size so that filesystems won't + * be trying to use something that is too small if the disc + * has changed. + */ + scsi_CDs[MINOR(cdi->dev)].needs_sector_size = 1; - scsi_CDs[MINOR(cdi->dev)].sector_size = 2048; - } + scsi_CDs[MINOR(cdi->dev)].sector_size = 2048; + } return retval; } @@ -163,7 +178,7 @@ * end of a SCSI read / write, and will take on of several actions based on success or failure. */ -static void rw_intr (Scsi_Cmnd * SCpnt) +static void rw_intr(Scsi_Cmnd * SCpnt) { int result = SCpnt->result; int this_count = SCpnt->this_count; @@ -171,137 +186,130 @@ int block_sectors = 0; #ifdef DEBUG - printk("sr.c done: %x %x\n",result, SCpnt->request.bh->b_data); + printk("sr.c done: %x %x\n", result, SCpnt->request.bh->b_data); #endif - /* - Handle MEDIUM ERRORs or VOLUME OVERFLOWs that indicate partial success. - Since this is a relatively rare error condition, no care is taken to - avoid unnecessary additional work such as memcpy's that could be avoided. - */ + /* + Handle MEDIUM ERRORs or VOLUME OVERFLOWs that indicate partial success. + Since this is a relatively rare error condition, no care is taken to + avoid unnecessary additional work such as memcpy's that could be avoided. + */ - if (driver_byte(result) != 0 && /* An error occurred */ - SCpnt->sense_buffer[0] == 0xF0 && /* Sense data is valid */ + if (driver_byte(result) != 0 && /* An error occurred */ + SCpnt->sense_buffer[0] == 0xF0 && /* Sense data is valid */ (SCpnt->sense_buffer[2] == MEDIUM_ERROR || SCpnt->sense_buffer[2] == VOLUME_OVERFLOW || - SCpnt->sense_buffer[2] == ILLEGAL_REQUEST)) - { - long error_sector = (SCpnt->sense_buffer[3] << 24) | - (SCpnt->sense_buffer[4] << 16) | - (SCpnt->sense_buffer[5] << 8) | - SCpnt->sense_buffer[6]; - int device_nr = DEVICE_NR(SCpnt->request.rq_dev); - if (SCpnt->request.bh != NULL) - block_sectors = SCpnt->request.bh->b_size >> 9; - if (block_sectors < 4) block_sectors = 4; - if (scsi_CDs[device_nr].sector_size == 2048) - error_sector <<= 2; - error_sector &= ~ (block_sectors - 1); - good_sectors = error_sector - SCpnt->request.sector; - if (good_sectors < 0 || good_sectors >= this_count) - good_sectors = 0; - /* - The SCSI specification allows for the value returned by READ - CAPACITY to be up to 75 2K sectors past the last readable - block. Therefore, if we hit a medium error within the last - 75 2K sectors, we decrease the saved size value. - */ - if ((error_sector >> 1) < sr_sizes[device_nr] && - scsi_CDs[device_nr].capacity - error_sector < 4*75) - sr_sizes[device_nr] = error_sector >> 1; - } - - if (good_sectors > 0) - { /* Some sectors were read successfully. */ - if (SCpnt->use_sg == 0) { - if (SCpnt->buffer != SCpnt->request.buffer) - { - int offset; - offset = (SCpnt->request.sector % 4) << 9; - memcpy((char *)SCpnt->request.buffer, - (char *)SCpnt->buffer + offset, - good_sectors << 9); - /* Even though we are not using scatter-gather, we look - * ahead and see if there is a linked request for the - * other half of this buffer. If there is, then satisfy - * it. */ - if((offset == 0) && good_sectors == 2 && - SCpnt->request.nr_sectors > good_sectors && - SCpnt->request.bh && - SCpnt->request.bh->b_reqnext && - SCpnt->request.bh->b_reqnext->b_size == 1024) { - memcpy((char *)SCpnt->request.bh->b_reqnext->b_data, - (char *)SCpnt->buffer + 1024, - 1024); - good_sectors += 2; - }; + SCpnt->sense_buffer[2] == ILLEGAL_REQUEST)) { + long error_sector = (SCpnt->sense_buffer[3] << 24) | + (SCpnt->sense_buffer[4] << 16) | + (SCpnt->sense_buffer[5] << 8) | + SCpnt->sense_buffer[6]; + int device_nr = DEVICE_NR(SCpnt->request.rq_dev); + if (SCpnt->request.bh != NULL) + block_sectors = SCpnt->request.bh->b_size >> 9; + if (block_sectors < 4) + block_sectors = 4; + if (scsi_CDs[device_nr].sector_size == 2048) + error_sector <<= 2; + error_sector &= ~(block_sectors - 1); + good_sectors = error_sector - SCpnt->request.sector; + if (good_sectors < 0 || good_sectors >= this_count) + good_sectors = 0; + /* + The SCSI specification allows for the value returned by READ + CAPACITY to be up to 75 2K sectors past the last readable + block. Therefore, if we hit a medium error within the last + 75 2K sectors, we decrease the saved size value. + */ + if ((error_sector >> 1) < sr_sizes[device_nr] && + scsi_CDs[device_nr].capacity - error_sector < 4 * 75) + sr_sizes[device_nr] = error_sector >> 1; + } + if (good_sectors > 0) { /* Some sectors were read successfully. */ + if (SCpnt->use_sg == 0) { + if (SCpnt->buffer != SCpnt->request.buffer) { + int offset; + offset = (SCpnt->request.sector % 4) << 9; + memcpy((char *) SCpnt->request.buffer, + (char *) SCpnt->buffer + offset, + good_sectors << 9); + /* Even though we are not using scatter-gather, we look + * ahead and see if there is a linked request for the + * other half of this buffer. If there is, then satisfy + * it. */ + if ((offset == 0) && good_sectors == 2 && + SCpnt->request.nr_sectors > good_sectors && + SCpnt->request.bh && + SCpnt->request.bh->b_reqnext && + SCpnt->request.bh->b_reqnext->b_size == 1024) { + memcpy((char *) SCpnt->request.bh->b_reqnext->b_data, + (char *) SCpnt->buffer + 1024, + 1024); + good_sectors += 2; + }; - scsi_free(SCpnt->buffer, 2048); - } - } else { - struct scatterlist * sgpnt; - int i; - sgpnt = (struct scatterlist *) SCpnt->buffer; - for(i=0; iuse_sg; i++) { - if (sgpnt[i].alt_address) { - if (sgpnt[i].alt_address != sgpnt[i].address) { - memcpy(sgpnt[i].alt_address, sgpnt[i].address, sgpnt[i].length); - }; - scsi_free(sgpnt[i].address, sgpnt[i].length); + scsi_free(SCpnt->buffer, 2048); + } + } else { + struct scatterlist *sgpnt; + int i; + sgpnt = (struct scatterlist *) SCpnt->buffer; + for (i = 0; i < SCpnt->use_sg; i++) { + if (sgpnt[i].alt_address) { + if (sgpnt[i].alt_address != sgpnt[i].address) { + memcpy(sgpnt[i].alt_address, sgpnt[i].address, sgpnt[i].length); + }; + scsi_free(sgpnt[i].address, sgpnt[i].length); + }; + }; + scsi_free(SCpnt->buffer, SCpnt->sglist_len); /* Free list of scatter-gather pointers */ + if (SCpnt->request.sector % 4) + good_sectors -= 2; + /* See if there is a padding record at the end that needs to be removed */ + if (good_sectors > SCpnt->request.nr_sectors) + good_sectors -= 2; }; - }; - scsi_free(SCpnt->buffer, SCpnt->sglist_len); /* Free list of scatter-gather pointers */ - if(SCpnt->request.sector % 4) good_sectors -= 2; - /* See if there is a padding record at the end that needs to be removed */ - if(good_sectors > SCpnt->request.nr_sectors) - good_sectors -= 2; - }; #ifdef DEBUG - printk("(%x %x %x) ",SCpnt->request.bh, SCpnt->request.nr_sectors, + printk("(%x %x %x) ", SCpnt->request.bh, SCpnt->request.nr_sectors, good_sectors); #endif - if (SCpnt->request.nr_sectors > this_count) - { + if (SCpnt->request.nr_sectors > this_count) { SCpnt->request.errors = 0; if (!SCpnt->request.bh) - panic("sr.c: linked page request (%lx %x)", - SCpnt->request.sector, this_count); - } - - SCpnt = end_scsi_request(SCpnt, 1, good_sectors); /* All done */ - if (result == 0) - { - requeue_sr_request(SCpnt); - return; - } - } - - if (good_sectors == 0) { - /* We only come through here if no sectors were read successfully. */ - - /* Free up any indirection buffers we allocated for DMA purposes. */ - if (SCpnt->use_sg) { - struct scatterlist * sgpnt; - int i; - sgpnt = (struct scatterlist *) SCpnt->buffer; - for(i=0; iuse_sg; i++) { - if (sgpnt[i].alt_address) { - scsi_free(sgpnt[i].address, sgpnt[i].length); - } - } - scsi_free(SCpnt->buffer, SCpnt->sglist_len); /* Free list of scatter-gather pointers */ - } else { - if (SCpnt->buffer != SCpnt->request.buffer) - scsi_free(SCpnt->buffer, SCpnt->bufflen); + panic("sr.c: linked page request (%lx %x)", + SCpnt->request.sector, this_count); + } + SCpnt = end_scsi_request(SCpnt, 1, good_sectors); /* All done */ + if (result == 0) { + requeue_sr_request(SCpnt); + return; + } } + if (good_sectors == 0) { + /* We only come through here if no sectors were read successfully. */ - } + /* Free up any indirection buffers we allocated for DMA purposes. */ + if (SCpnt->use_sg) { + struct scatterlist *sgpnt; + int i; + sgpnt = (struct scatterlist *) SCpnt->buffer; + for (i = 0; i < SCpnt->use_sg; i++) { + if (sgpnt[i].alt_address) { + scsi_free(sgpnt[i].address, sgpnt[i].length); + } + } + scsi_free(SCpnt->buffer, SCpnt->sglist_len); /* Free list of scatter-gather pointers */ + } else { + if (SCpnt->buffer != SCpnt->request.buffer) + scsi_free(SCpnt->buffer, SCpnt->bufflen); + } + } if (driver_byte(result) != 0) { if ((SCpnt->sense_buffer[0] & 0x7f) == 0x70) { if ((SCpnt->sense_buffer[2] & 0xf) == UNIT_ATTENTION) { /* detected disc change. set a bit and quietly refuse - * further access. */ + * further access. */ scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->changed = 1; SCpnt = end_scsi_request(SCpnt, 0, this_count); @@ -309,10 +317,9 @@ return; } } - if (SCpnt->sense_buffer[2] == ILLEGAL_REQUEST) { printk("sr%d: CD-ROM error: ", - DEVICE_NR(SCpnt->request.rq_dev)); + DEVICE_NR(SCpnt->request.rq_dev)); print_sense("sr", SCpnt); printk("command was: "); print_command(SCpnt->cmnd); @@ -323,95 +330,87 @@ return; } else { SCpnt = end_scsi_request(SCpnt, 0, this_count); - requeue_sr_request(SCpnt); /* Do next request */ + requeue_sr_request(SCpnt); /* Do next request */ return; } } - if (SCpnt->sense_buffer[2] == NOT_READY) { printk(KERN_INFO "sr%d: CD-ROM not ready. Make sure you have a disc in the drive.\n", - DEVICE_NR(SCpnt->request.rq_dev)); + DEVICE_NR(SCpnt->request.rq_dev)); SCpnt = end_scsi_request(SCpnt, 0, this_count); - requeue_sr_request(SCpnt); /* Do next request */ + requeue_sr_request(SCpnt); /* Do next request */ return; } - if (SCpnt->sense_buffer[2] == MEDIUM_ERROR) { - printk("scsi%d: MEDIUM ERROR on " - "channel %d, id %d, lun %d, CDB: ", - SCpnt->host->host_no, (int) SCpnt->channel, - (int) SCpnt->target, (int) SCpnt->lun); - print_command(SCpnt->cmnd); - print_sense("sr", SCpnt); - SCpnt = end_scsi_request(SCpnt, 0, block_sectors); - requeue_sr_request(SCpnt); - return; + printk("scsi%d: MEDIUM ERROR on " + "channel %d, id %d, lun %d, CDB: ", + SCpnt->host->host_no, (int) SCpnt->channel, + (int) SCpnt->target, (int) SCpnt->lun); + print_command(SCpnt->cmnd); + print_sense("sr", SCpnt); + SCpnt = end_scsi_request(SCpnt, 0, block_sectors); + requeue_sr_request(SCpnt); + return; } - if (SCpnt->sense_buffer[2] == VOLUME_OVERFLOW) { - printk("scsi%d: VOLUME OVERFLOW on " - "channel %d, id %d, lun %d, CDB: ", - SCpnt->host->host_no, (int) SCpnt->channel, - (int) SCpnt->target, (int) SCpnt->lun); - print_command(SCpnt->cmnd); - print_sense("sr", SCpnt); - SCpnt = end_scsi_request(SCpnt, 0, block_sectors); - requeue_sr_request(SCpnt); - return; + printk("scsi%d: VOLUME OVERFLOW on " + "channel %d, id %d, lun %d, CDB: ", + SCpnt->host->host_no, (int) SCpnt->channel, + (int) SCpnt->target, (int) SCpnt->lun); + print_command(SCpnt->cmnd); + print_sense("sr", SCpnt); + SCpnt = end_scsi_request(SCpnt, 0, block_sectors); + requeue_sr_request(SCpnt); + return; } - } - + } /* We only get this far if we have an error we have not recognized */ - if(result) { - printk("SCSI CD error : host %d id %d lun %d return code = %03x\n", - scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->host->host_no, - scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->id, - scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->lun, - result); - - if (status_byte(result) == CHECK_CONDITION) - print_sense("sr", SCpnt); - - SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.current_nr_sectors); - requeue_sr_request(SCpnt); - } + if (result) { + printk("SCSI CD error : host %d id %d lun %d return code = %03x\n", + scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->host->host_no, + scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->id, + scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->lun, + result); + + if (status_byte(result) == CHECK_CONDITION) + print_sense("sr", SCpnt); + + SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.current_nr_sectors); + requeue_sr_request(SCpnt); + } } static int sr_open(struct cdrom_device_info *cdi, int purpose) { - check_disk_change(cdi->dev); + check_disk_change(cdi->dev); - if( MINOR(cdi->dev) >= sr_template.dev_max - || !scsi_CDs[MINOR(cdi->dev)].device) - { - return -ENXIO; /* No such device */ - } - - /* - * If the device is in error recovery, wait until it is done. - * If the device is offline, then disallow any access to it. - */ - if( !scsi_block_when_processing_errors(scsi_CDs[MINOR(cdi->dev)].device) ) - { - return -ENXIO; - } - - scsi_CDs[MINOR(cdi->dev)].device->access_count++; - if (scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module) - __MOD_INC_USE_COUNT(scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module); - if(sr_template.module) - __MOD_INC_USE_COUNT(sr_template.module); - - /* If this device did not have media in the drive at boot time, then - * we would have been unable to get the sector size. Check to see if - * this is the case, and try again. - */ + if (MINOR(cdi->dev) >= sr_template.dev_max + || !scsi_CDs[MINOR(cdi->dev)].device) { + return -ENXIO; /* No such device */ + } + /* + * If the device is in error recovery, wait until it is done. + * If the device is offline, then disallow any access to it. + */ + if (!scsi_block_when_processing_errors(scsi_CDs[MINOR(cdi->dev)].device)) { + return -ENXIO; + } + scsi_CDs[MINOR(cdi->dev)].device->access_count++; + if (scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module) + __MOD_INC_USE_COUNT(scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module); + if (sr_template.module) + __MOD_INC_USE_COUNT(sr_template.module); + + /* If this device did not have media in the drive at boot time, then + * we would have been unable to get the sector size. Check to see if + * this is the case, and try again. + */ - if(scsi_CDs[MINOR(cdi->dev)].needs_sector_size) - get_sectorsize(MINOR(cdi->dev)); + if (scsi_CDs[MINOR(cdi->dev)].needs_sector_size) + get_sectorsize(MINOR(cdi->dev)); - return 0; + return 0; } /* @@ -420,111 +419,106 @@ * translate them to SCSI commands. */ -static void do_sr_request (void) +static void do_sr_request(void) { - Scsi_Cmnd * SCpnt = NULL; - struct request * req = NULL; - Scsi_Device * SDev; - int flag = 0; - - while (1==1){ - if (CURRENT != NULL && CURRENT->rq_status == RQ_INACTIVE) { - return; - }; + Scsi_Cmnd *SCpnt = NULL; + struct request *req = NULL; + Scsi_Device *SDev; + int flag = 0; - INIT_SCSI_REQUEST; + while (1 == 1) { + if (CURRENT != NULL && CURRENT->rq_status == RQ_INACTIVE) { + return; + }; - SDev = scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].device; + INIT_SCSI_REQUEST; - /* - * If the host for this device is in error recovery mode, don't - * do anything at all here. When the host leaves error recovery - * mode, it will automatically restart things and start queueing - * commands again. - */ - if( SDev->host->in_recovery ) - { - return; - } + SDev = scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].device; - /* - * I am not sure where the best place to do this is. We need - * to hook in a place where we are likely to come if in user - * space. - */ - if( SDev->was_reset ) - { - /* - * We need to relock the door, but we might - * be in an interrupt handler. Only do this - * from user space, since we do not want to - * sleep from an interrupt. - */ - if( SDev->removable && !in_interrupt() ) - { - spin_unlock_irq(&io_request_lock); /* FIXME!!!! */ - scsi_ioctl(SDev, SCSI_IOCTL_DOORLOCK, 0); - spin_lock_irq(&io_request_lock); /* FIXME!!!! */ - /* scsi_ioctl may allow CURRENT to change, so start over. */ - SDev->was_reset = 0; - continue; - } - SDev->was_reset = 0; - } - - /* we do lazy blocksize switching (when reading XA sectors, - * see CDROMREADMODE2 ioctl) */ - if (scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].sector_size > 2048) { - if (!in_interrupt()) - sr_set_blocklength(DEVICE_NR(CURRENT->rq_dev),2048); + /* + * If the host for this device is in error recovery mode, don't + * do anything at all here. When the host leaves error recovery + * mode, it will automatically restart things and start queueing + * commands again. + */ + if (SDev->host->in_recovery) { + return; + } + /* + * I am not sure where the best place to do this is. We need + * to hook in a place where we are likely to come if in user + * space. + */ + if (SDev->was_reset) { + /* + * We need to relock the door, but we might + * be in an interrupt handler. Only do this + * from user space, since we do not want to + * sleep from an interrupt. + */ + if (SDev->removable && !in_interrupt()) { + spin_unlock_irq(&io_request_lock); /* FIXME!!!! */ + scsi_ioctl(SDev, SCSI_IOCTL_DOORLOCK, 0); + spin_lock_irq(&io_request_lock); /* FIXME!!!! */ + /* scsi_ioctl may allow CURRENT to change, so start over. */ + SDev->was_reset = 0; + continue; + } + SDev->was_reset = 0; + } + /* we do lazy blocksize switching (when reading XA sectors, + * see CDROMREADMODE2 ioctl) */ + if (scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].sector_size > 2048) { + if (!in_interrupt()) + sr_set_blocklength(DEVICE_NR(CURRENT->rq_dev), 2048); #if 1 - else - printk("sr: can't switch blocksize: in interrupt\n"); + else + printk("sr: can't switch blocksize: in interrupt\n"); #endif - } - - if (flag++ == 0) - SCpnt = scsi_allocate_device(&CURRENT, - scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].device, 0); - else SCpnt = NULL; - - /* This is a performance enhancement. We dig down into the request list and - * try to find a queueable request (i.e. device not busy, and host able to - * accept another command. If we find one, then we queue it. This can - * make a big difference on systems with more than one disk drive. We want - * to have the interrupts off when monkeying with the request list, because - * otherwise the kernel might try to slip in a request in between somewhere. */ - - if (!SCpnt && sr_template.nr_dev > 1){ - struct request *req1; - req1 = NULL; - req = CURRENT; - while(req){ - SCpnt = scsi_request_queueable(req, - scsi_CDs[DEVICE_NR(req->rq_dev)].device); - if(SCpnt) break; - req1 = req; - req = req->next; - } - if (SCpnt && req->rq_status == RQ_INACTIVE) { - if (req == CURRENT) - CURRENT = CURRENT->next; + } + if (flag++ == 0) + SCpnt = scsi_allocate_device(&CURRENT, + scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].device, 0); else - req1->next = req->next; - } - } + SCpnt = NULL; - if (!SCpnt) - return; /* Could not find anything to do */ + /* This is a performance enhancement. We dig down into the request list and + * try to find a queueable request (i.e. device not busy, and host able to + * accept another command. If we find one, then we queue it. This can + * make a big difference on systems with more than one disk drive. We want + * to have the interrupts off when monkeying with the request list, because + * otherwise the kernel might try to slip in a request in between somewhere. */ + + if (!SCpnt && sr_template.nr_dev > 1) { + struct request *req1; + req1 = NULL; + req = CURRENT; + while (req) { + SCpnt = scsi_request_queueable(req, + scsi_CDs[DEVICE_NR(req->rq_dev)].device); + if (SCpnt) + break; + req1 = req; + req = req->next; + } + if (SCpnt && req->rq_status == RQ_INACTIVE) { + if (req == CURRENT) + CURRENT = CURRENT->next; + else + req1->next = req->next; + } + } + if (!SCpnt) + return; /* Could not find anything to do */ - wake_up(&wait_for_request); + wake_up(&wait_for_request); - /* Queue command */ - requeue_sr_request(SCpnt); - } /* While */ + /* Queue command */ + requeue_sr_request(SCpnt); + } /* While */ } -void requeue_sr_request (Scsi_Cmnd * SCpnt) +void requeue_sr_request(Scsi_Cmnd * SCpnt) { unsigned int dev, block, realcount; unsigned char cmd[10], *buffer, tries; @@ -532,409 +526,395 @@ tries = 2; - repeat: - if(!SCpnt || SCpnt->request.rq_status == RQ_INACTIVE) { +repeat: + if (!SCpnt || SCpnt->request.rq_status == RQ_INACTIVE) { do_sr_request(); return; } - - dev = MINOR(SCpnt->request.rq_dev); + dev = MINOR(SCpnt->request.rq_dev); block = SCpnt->request.sector; buffer = NULL; this_count = 0; if (dev >= sr_template.nr_dev) { - /* printk("CD-ROM request error: invalid device.\n"); */ + /* printk("CD-ROM request error: invalid device.\n"); */ SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors); tries = 2; goto repeat; } - if (!scsi_CDs[dev].use) { - /* printk("CD-ROM request error: device marked not in use.\n"); */ + /* printk("CD-ROM request error: device marked not in use.\n"); */ + SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors); + tries = 2; + goto repeat; + } + if (!scsi_CDs[dev].device->online) { SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors); tries = 2; goto repeat; } - - if( !scsi_CDs[dev].device->online ) - { - SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors); - tries = 2; - goto repeat; - } - if (scsi_CDs[dev].device->changed) { - /* - * quietly refuse to do anything to a changed disc - * until the changed bit has been reset - */ - /* printk("CD-ROM has been changed. Prohibiting further I/O.\n"); */ + /* + * quietly refuse to do anything to a changed disc + * until the changed bit has been reset + */ + /* printk("CD-ROM has been changed. Prohibiting further I/O.\n"); */ SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors); tries = 2; goto repeat; } - - switch (SCpnt->request.cmd) - { - case WRITE: - SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors); - goto repeat; - break; - case READ : - cmd[0] = READ_6; - break; - default : - panic ("Unknown sr command %d\n", SCpnt->request.cmd); - } + switch (SCpnt->request.cmd) { + case WRITE: + if (!scsi_CDs[dev].device->writeable) { + SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors); + goto repeat; + } + cmd[0] = WRITE_10; + break; + case READ: + cmd[0] = READ_10; + break; + default: + panic("Unknown sr command %d\n", SCpnt->request.cmd); + } cmd[1] = (SCpnt->lun << 5) & 0xe0; - /* - * Now do the grungy work of figuring out which sectors we need, and - * where in memory we are going to put them. - * - * The variables we need are: - * - * this_count= number of 512 byte sectors being read - * block = starting cdrom sector to read. - * realcount = # of cdrom sectors to read - * - * The major difference between a scsi disk and a scsi cdrom - * is that we will always use scatter-gather if we can, because we can - * work around the fact that the buffer cache has a block size of 1024, - * and we have 2048 byte sectors. This code should work for buffers that - * are any multiple of 512 bytes long. - */ + /* + * Now do the grungy work of figuring out which sectors we need, and + * where in memory we are going to put them. + * + * The variables we need are: + * + * this_count= number of 512 byte sectors being read + * block = starting cdrom sector to read. + * realcount = # of cdrom sectors to read + * + * The major difference between a scsi disk and a scsi cdrom + * is that we will always use scatter-gather if we can, because we can + * work around the fact that the buffer cache has a block size of 1024, + * and we have 2048 byte sectors. This code should work for buffers that + * are any multiple of 512 bytes long. + */ SCpnt->use_sg = 0; if (SCpnt->host->sg_tablesize > 0 && (!scsi_need_isa_buffer || - scsi_dma_free_sectors >= 10)) { - struct buffer_head * bh; - struct scatterlist * sgpnt; - int count, this_count_max; - bh = SCpnt->request.bh; - this_count = 0; - count = 0; - this_count_max = (scsi_CDs[dev].ten ? 0xffff : 0xff) << 4; - /* Calculate how many links we can use. First see if we need - * a padding record at the start */ - this_count = SCpnt->request.sector % 4; - if(this_count) count++; - while(bh && count < SCpnt->host->sg_tablesize) { - if ((this_count + (bh->b_size >> 9)) > this_count_max) break; - this_count += (bh->b_size >> 9); - count++; - bh = bh->b_reqnext; - }; - /* Fix up in case of an odd record at the end */ - end_rec = 0; - if(this_count % 4) { - if (count < SCpnt->host->sg_tablesize) { - count++; - end_rec = (4 - (this_count % 4)) << 9; - this_count += 4 - (this_count % 4); - } else { - count--; - this_count -= (this_count % 4); - }; - }; - SCpnt->use_sg = count; /* Number of chains */ - /* scsi_malloc can only allocate in chunks of 512 bytes */ - count = (SCpnt->use_sg * sizeof(struct scatterlist) + 511) & ~511; - - SCpnt->sglist_len = count; - sgpnt = (struct scatterlist * ) scsi_malloc(count); - if (!sgpnt) { - printk("Warning - running *really* short on DMA buffers\n"); - SCpnt->use_sg = 0; /* No memory left - bail out */ - } else { - buffer = (unsigned char *) sgpnt; - count = 0; - bh = SCpnt->request.bh; - if(SCpnt->request.sector % 4) { - sgpnt[count].length = (SCpnt->request.sector % 4) << 9; - sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length); - if(!sgpnt[count].address) panic("SCSI DMA pool exhausted."); - sgpnt[count].alt_address = sgpnt[count].address; /* Flag to delete - if needed */ - count++; - }; - for(bh = SCpnt->request.bh; count < SCpnt->use_sg; - count++, bh = bh->b_reqnext) { - if (bh) { /* Need a placeholder at the end of the record? */ - sgpnt[count].address = bh->b_data; - sgpnt[count].length = bh->b_size; - sgpnt[count].alt_address = NULL; - } else { - sgpnt[count].address = (char *) scsi_malloc(end_rec); - if(!sgpnt[count].address) panic("SCSI DMA pool exhausted."); - sgpnt[count].length = end_rec; - sgpnt[count].alt_address = sgpnt[count].address; - if (count+1 != SCpnt->use_sg) panic("Bad sr request list"); - break; + scsi_dma_free_sectors >= 10)) { + struct buffer_head *bh; + struct scatterlist *sgpnt; + int count, this_count_max; + bh = SCpnt->request.bh; + this_count = 0; + count = 0; + this_count_max = (scsi_CDs[dev].ten ? 0xffff : 0xff) << 4; + /* Calculate how many links we can use. First see if we need + * a padding record at the start */ + this_count = SCpnt->request.sector % 4; + if (this_count) + count++; + while (bh && count < SCpnt->host->sg_tablesize) { + if ((this_count + (bh->b_size >> 9)) > this_count_max) + break; + this_count += (bh->b_size >> 9); + count++; + bh = bh->b_reqnext; }; - if (virt_to_phys(sgpnt[count].address) + sgpnt[count].length - 1 > - ISA_DMA_THRESHOLD && SCpnt->host->unchecked_isa_dma) { - sgpnt[count].alt_address = sgpnt[count].address; - /* We try to avoid exhausting the DMA pool, since it is easier - * to control usage here. In other places we might have a more - * pressing need, and we would be screwed if we ran out */ - if(scsi_dma_free_sectors < (sgpnt[count].length >> 9) + 5) { - sgpnt[count].address = NULL; - } else { - sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length); - }; - /* If we start running low on DMA buffers, we abort the scatter-gather - * operation, and free all of the memory we have allocated. We want to - * ensure that all scsi operations are able to do at least a non-scatter/gather - * operation */ - if(sgpnt[count].address == NULL){ /* Out of dma memory */ - printk("Warning: Running low on SCSI DMA buffers\n"); - /* Try switching back to a non scatter-gather operation. */ - while(--count >= 0){ - if(sgpnt[count].alt_address) - scsi_free(sgpnt[count].address, sgpnt[count].length); + /* Fix up in case of an odd record at the end */ + end_rec = 0; + if (this_count % 4) { + if (count < SCpnt->host->sg_tablesize) { + count++; + end_rec = (4 - (this_count % 4)) << 9; + this_count += 4 - (this_count % 4); + } else { + count--; + this_count -= (this_count % 4); }; - SCpnt->use_sg = 0; - scsi_free(buffer, SCpnt->sglist_len); - break; - }; /* if address == NULL */ - }; /* if need DMA fixup */ - }; /* for loop to fill list */ + }; + SCpnt->use_sg = count; /* Number of chains */ + /* scsi_malloc can only allocate in chunks of 512 bytes */ + count = (SCpnt->use_sg * sizeof(struct scatterlist) + 511) & ~511; + + SCpnt->sglist_len = count; + sgpnt = (struct scatterlist *) scsi_malloc(count); + if (!sgpnt) { + printk("Warning - running *really* short on DMA buffers\n"); + SCpnt->use_sg = 0; /* No memory left - bail out */ + } else { + buffer = (unsigned char *) sgpnt; + count = 0; + bh = SCpnt->request.bh; + if (SCpnt->request.sector % 4) { + sgpnt[count].length = (SCpnt->request.sector % 4) << 9; + sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length); + if (!sgpnt[count].address) + panic("SCSI DMA pool exhausted."); + sgpnt[count].alt_address = sgpnt[count].address; /* Flag to delete + if needed */ + count++; + }; + for (bh = SCpnt->request.bh; count < SCpnt->use_sg; + count++, bh = bh->b_reqnext) { + if (bh) { /* Need a placeholder at the end of the record? */ + sgpnt[count].address = bh->b_data; + sgpnt[count].length = bh->b_size; + sgpnt[count].alt_address = NULL; + } else { + sgpnt[count].address = (char *) scsi_malloc(end_rec); + if (!sgpnt[count].address) + panic("SCSI DMA pool exhausted."); + sgpnt[count].length = end_rec; + sgpnt[count].alt_address = sgpnt[count].address; + if (count + 1 != SCpnt->use_sg) + panic("Bad sr request list"); + break; + }; + if (virt_to_phys(sgpnt[count].address) + sgpnt[count].length - 1 > + ISA_DMA_THRESHOLD && SCpnt->host->unchecked_isa_dma) { + sgpnt[count].alt_address = sgpnt[count].address; + /* We try to avoid exhausting the DMA pool, since it is easier + * to control usage here. In other places we might have a more + * pressing need, and we would be screwed if we ran out */ + if (scsi_dma_free_sectors < (sgpnt[count].length >> 9) + 5) { + sgpnt[count].address = NULL; + } else { + sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length); + }; + /* If we start running low on DMA buffers, we abort the scatter-gather + * operation, and free all of the memory we have allocated. We want to + * ensure that all scsi operations are able to do at least a non-scatter/gather + * operation */ + if (sgpnt[count].address == NULL) { /* Out of dma memory */ + printk("Warning: Running low on SCSI DMA buffers\n"); + /* Try switching back to a non scatter-gather operation. */ + while (--count >= 0) { + if (sgpnt[count].alt_address) + scsi_free(sgpnt[count].address, sgpnt[count].length); + }; + SCpnt->use_sg = 0; + scsi_free(buffer, SCpnt->sglist_len); + break; + }; /* if address == NULL */ + }; /* if need DMA fixup */ + }; /* for loop to fill list */ #ifdef DEBUG - printk("SR: %d %d %d %d %d *** ",SCpnt->use_sg, SCpnt->request.sector, - this_count, - SCpnt->request.current_nr_sectors, - SCpnt->request.nr_sectors); - for(count=0; countuse_sg; count++) - printk("SGlist: %d %x %x %x\n", count, - sgpnt[count].address, - sgpnt[count].alt_address, - sgpnt[count].length); + printk("SR: %d %d %d %d %d *** ", SCpnt->use_sg, SCpnt->request.sector, + this_count, + SCpnt->request.current_nr_sectors, + SCpnt->request.nr_sectors); + for (count = 0; count < SCpnt->use_sg; count++) + printk("SGlist: %d %x %x %x\n", count, + sgpnt[count].address, + sgpnt[count].alt_address, + sgpnt[count].length); #endif - }; /* Able to allocate scatter-gather list */ + }; /* Able to allocate scatter-gather list */ }; - if (SCpnt->use_sg == 0){ - /* We cannot use scatter-gather. Do this the old fashion way */ - if (!SCpnt->request.bh) - this_count = SCpnt->request.nr_sectors; - else - this_count = (SCpnt->request.bh->b_size >> 9); + if (SCpnt->use_sg == 0) { + /* We cannot use scatter-gather. Do this the old fashion way */ + if (!SCpnt->request.bh) + this_count = SCpnt->request.nr_sectors; + else + this_count = (SCpnt->request.bh->b_size >> 9); - start = block % 4; - if (start) - { - this_count = ((this_count > 4 - start) ? - (4 - start) : (this_count)); - buffer = (unsigned char *) scsi_malloc(2048); - } - else if (this_count < 4) - { - buffer = (unsigned char *) scsi_malloc(2048); - } - else - { - this_count -= this_count % 4; - buffer = (unsigned char *) SCpnt->request.buffer; - if (virt_to_phys(buffer) + (this_count << 9) > ISA_DMA_THRESHOLD && - SCpnt->host->unchecked_isa_dma) - buffer = (unsigned char *) scsi_malloc(this_count << 9); - } + start = block % 4; + if (start) { + this_count = ((this_count > 4 - start) ? + (4 - start) : (this_count)); + buffer = (unsigned char *) scsi_malloc(2048); + } else if (this_count < 4) { + buffer = (unsigned char *) scsi_malloc(2048); + } else { + this_count -= this_count % 4; + buffer = (unsigned char *) SCpnt->request.buffer; + if (virt_to_phys(buffer) + (this_count << 9) > ISA_DMA_THRESHOLD && + SCpnt->host->unchecked_isa_dma) + buffer = (unsigned char *) scsi_malloc(this_count << 9); + } }; if (scsi_CDs[dev].sector_size == 2048) - block = block >> 2; /* These are the sectors that the cdrom uses */ + block = block >> 2; /* These are the sectors that the cdrom uses */ else - block = block & 0xfffffffc; + block = block & 0xfffffffc; realcount = (this_count + 3) / 4; - if (scsi_CDs[dev].sector_size == 512) realcount = realcount << 2; - - /* - * Note: The scsi standard says that READ_6 is *optional*, while - * READ_10 is mandatory. Thus there is no point in using - * READ_6. - */ - if (scsi_CDs[dev].ten) - - { - if (realcount > 0xffff) - { - realcount = 0xffff; - this_count = realcount * (scsi_CDs[dev].sector_size >> 9); - } + if (scsi_CDs[dev].sector_size == 512) + realcount = realcount << 2; - cmd[0] += READ_10 - READ_6 ; - cmd[2] = (unsigned char) (block >> 24) & 0xff; - cmd[3] = (unsigned char) (block >> 16) & 0xff; - cmd[4] = (unsigned char) (block >> 8) & 0xff; - cmd[5] = (unsigned char) block & 0xff; - cmd[6] = cmd[9] = 0; - cmd[7] = (unsigned char) (realcount >> 8) & 0xff; - cmd[8] = (unsigned char) realcount & 0xff; - } - else - { - if (realcount > 0xff) - { - realcount = 0xff; - this_count = realcount * (scsi_CDs[dev].sector_size >> 9); + if (realcount > 0xffff) { + realcount = 0xffff; + this_count = realcount * (scsi_CDs[dev].sector_size >> 9); } - cmd[1] |= (unsigned char) ((block >> 16) & 0x1f); - cmd[2] = (unsigned char) ((block >> 8) & 0xff); - cmd[3] = (unsigned char) block & 0xff; - cmd[4] = (unsigned char) realcount; - cmd[5] = 0; - } + cmd[2] = (unsigned char) (block >> 24) & 0xff; + cmd[3] = (unsigned char) (block >> 16) & 0xff; + cmd[4] = (unsigned char) (block >> 8) & 0xff; + cmd[5] = (unsigned char) block & 0xff; + cmd[6] = cmd[9] = 0; + cmd[7] = (unsigned char) (realcount >> 8) & 0xff; + cmd[8] = (unsigned char) realcount & 0xff; #ifdef DEBUG - { - int i; - printk("ReadCD: %d %d %d %d\n",block, realcount, buffer, this_count); - printk("Use sg: %d\n", SCpnt->use_sg); - printk("Dumping command: "); - for(i=0; i<12; i++) printk("%2.2x ", cmd[i]); - printk("\n"); - }; + { + int i; + printk("ReadCD: %d %d %d %d\n", block, realcount, buffer, this_count); + printk("Use sg: %d\n", SCpnt->use_sg); + printk("Dumping command: "); + for (i = 0; i < 12; i++) + printk("%2.2x ", cmd[i]); + printk("\n"); + }; #endif - /* Some dumb host adapters can speed transfers by knowing the - * minimum transfersize in advance. - * - * We shouldn't disconnect in the middle of a sector, but the cdrom - * sector size can be larger than the size of a buffer and the - * transfer may be split to the size of a buffer. So it's safe to - * assume that we can at least transfer the minimum of the buffer - * size (1024) and the sector size between each connect / disconnect. - */ + /* Some dumb host adapters can speed transfers by knowing the + * minimum transfersize in advance. + * + * We shouldn't disconnect in the middle of a sector, but the cdrom + * sector size can be larger than the size of a buffer and the + * transfer may be split to the size of a buffer. So it's safe to + * assume that we can at least transfer the minimum of the buffer + * size (1024) and the sector size between each connect / disconnect. + */ - SCpnt->transfersize = (scsi_CDs[dev].sector_size > 1024) ? - 1024 : scsi_CDs[dev].sector_size; + SCpnt->transfersize = (scsi_CDs[dev].sector_size > 1024) ? + 1024 : scsi_CDs[dev].sector_size; SCpnt->this_count = this_count; - scsi_do_cmd (SCpnt, (void *) cmd, buffer, - realcount * scsi_CDs[dev].sector_size, - rw_intr, SR_TIMEOUT, MAX_RETRIES); + scsi_do_cmd(SCpnt, (void *) cmd, buffer, + realcount * scsi_CDs[dev].sector_size, + rw_intr, SR_TIMEOUT, MAX_RETRIES); } -static int sr_detect(Scsi_Device * SDp){ +static int sr_detect(Scsi_Device * SDp) +{ - if(SDp->type != TYPE_ROM && SDp->type != TYPE_WORM) return 0; + if (SDp->type != TYPE_ROM && SDp->type != TYPE_WORM) + return 0; - printk("Detected scsi CD-ROM sr%d at scsi%d, channel %d, id %d, lun %d\n", - sr_template.dev_noticed++, - SDp->host->host_no, SDp->channel, SDp->id, SDp->lun); + printk("Detected scsi CD-ROM sr%d at scsi%d, channel %d, id %d, lun %d\n", + sr_template.dev_noticed++, + SDp->host->host_no, SDp->channel, SDp->id, SDp->lun); - return 1; + return 1; } -static int sr_attach(Scsi_Device * SDp){ - Scsi_CD * cpnt; - int i; - - if(SDp->type != TYPE_ROM && SDp->type != TYPE_WORM) return 1; - - if (sr_template.nr_dev >= sr_template.dev_max) - { - SDp->attached--; - return 1; - } +static int sr_attach(Scsi_Device * SDp) +{ + Scsi_CD *cpnt; + int i; - for(cpnt = scsi_CDs, i=0; idevice) break; + if (SDp->type != TYPE_ROM && SDp->type != TYPE_WORM) + return 1; + + if (sr_template.nr_dev >= sr_template.dev_max) { + SDp->attached--; + return 1; + } + for (cpnt = scsi_CDs, i = 0; i < sr_template.dev_max; i++, cpnt++) + if (!cpnt->device) + break; - if(i >= sr_template.dev_max) panic ("scsi_devices corrupt (sr)"); + if (i >= sr_template.dev_max) + panic("scsi_devices corrupt (sr)"); - SDp->scsi_request_fn = do_sr_request; - scsi_CDs[i].device = SDp; + SDp->scsi_request_fn = do_sr_request; + scsi_CDs[i].device = SDp; - sr_template.nr_dev++; - if(sr_template.nr_dev > sr_template.dev_max) - panic ("scsi_devices corrupt (sr)"); - return 0; + sr_template.nr_dev++; + if (sr_template.nr_dev > sr_template.dev_max) + panic("scsi_devices corrupt (sr)"); + return 0; } -static void sr_init_done (Scsi_Cmnd * SCpnt) +static void sr_init_done(Scsi_Cmnd * SCpnt) { - struct request * req; + struct request *req; - req = &SCpnt->request; - req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */ + req = &SCpnt->request; + req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */ - if (req->sem != NULL) { - up(req->sem); - } + if (req->sem != NULL) { + up(req->sem); + } } -void get_sectorsize(int i){ - unsigned char cmd[10]; - unsigned char *buffer; - int the_result, retries; - Scsi_Cmnd * SCpnt; - unsigned long flags; - - buffer = (unsigned char *) scsi_malloc(512); - SCpnt = scsi_allocate_device(NULL, scsi_CDs[i].device, 1); - - retries = 3; - do { - cmd[0] = READ_CAPACITY; - cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0; - memset ((void *) &cmd[2], 0, 8); - SCpnt->request.rq_status = RQ_SCSI_BUSY; /* Mark as really busy */ - SCpnt->cmd_len = 0; +void get_sectorsize(int i) +{ + unsigned char cmd[10]; + unsigned char *buffer; + int the_result, retries; + Scsi_Cmnd *SCpnt; + unsigned long flags; + + spin_lock_irq(&io_request_lock); + buffer = (unsigned char *) scsi_malloc(512); + SCpnt = scsi_allocate_device(NULL, scsi_CDs[i].device, 1); + spin_unlock_irq(&io_request_lock); + + retries = 3; + do { + cmd[0] = READ_CAPACITY; + cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0; + memset((void *) &cmd[2], 0, 8); + SCpnt->request.rq_status = RQ_SCSI_BUSY; /* Mark as really busy */ + SCpnt->cmd_len = 0; + + memset(buffer, 0, 8); + + /* Do the command and wait.. */ + { + struct semaphore sem = MUTEX_LOCKED; + SCpnt->request.sem = &sem; + spin_lock_irqsave(&io_request_lock, flags); + scsi_do_cmd (SCpnt, + (void *) cmd, (void *) buffer, + 512, sr_init_done, SR_TIMEOUT, + MAX_RETRIES); + spin_unlock_irqrestore(&io_request_lock, flags); + down(&sem); + } - memset(buffer, 0, 8); + the_result = SCpnt->result; + retries--; - /* Do the command and wait.. */ - { - struct semaphore sem = MUTEX_LOCKED; - SCpnt->request.sem = &sem; - spin_lock_irqsave(&io_request_lock, flags); - scsi_do_cmd (SCpnt, - (void *) cmd, (void *) buffer, - 512, sr_init_done, SR_TIMEOUT, - MAX_RETRIES); - spin_unlock_irqrestore(&io_request_lock, flags); - down(&sem); - } - - the_result = SCpnt->result; - retries--; - - } while(the_result && retries); - - - wake_up(&SCpnt->device->device_wait); - scsi_release_command(SCpnt); - SCpnt = NULL; - - if (the_result) { - scsi_CDs[i].capacity = 0x1fffff; - scsi_CDs[i].sector_size = 2048; /* A guess, just in case */ - scsi_CDs[i].needs_sector_size = 1; - } else { - scsi_CDs[i].capacity = 1 + ((buffer[0] << 24) | - (buffer[1] << 16) | - (buffer[2] << 8) | - buffer[3]); - scsi_CDs[i].sector_size = (buffer[4] << 24) | - (buffer[5] << 16) | (buffer[6] << 8) | buffer[7]; - switch (scsi_CDs[i].sector_size) { - /* - * HP 4020i CD-Recorder reports 2340 byte sectors - * Philips CD-Writers report 2352 byte sectors - * - * Use 2k sectors for them.. - */ - case 0: case 2340: case 2352: + } while (the_result && retries); + + + wake_up(&SCpnt->device->device_wait); + scsi_release_command(SCpnt); + SCpnt = NULL; + + if (the_result) { + scsi_CDs[i].capacity = 0x1fffff; + scsi_CDs[i].sector_size = 2048; /* A guess, just in case */ + scsi_CDs[i].needs_sector_size = 1; + } else { +#if 0 + if (cdrom_get_last_written(MKDEV(MAJOR_NR, i), + (long *) &scsi_CDs[i].capacity)) +#endif + scsi_CDs[i].capacity = 1 + ((buffer[0] << 24) | + (buffer[1] << 16) | + (buffer[2] << 8) | + buffer[3]); + scsi_CDs[i].sector_size = (buffer[4] << 24) | + (buffer[5] << 16) | (buffer[6] << 8) | buffer[7]; + switch (scsi_CDs[i].sector_size) { + /* + * HP 4020i CD-Recorder reports 2340 byte sectors + * Philips CD-Writers report 2352 byte sectors + * + * Use 2k sectors for them.. + */ + case 0: + case 2340: + case 2352: scsi_CDs[i].sector_size = 2048; /* fall through */ case 2048: @@ -943,229 +923,338 @@ case 512: break; default: - printk ("sr%d: unsupported sector size %d.\n", - i, scsi_CDs[i].sector_size); + printk("sr%d: unsupported sector size %d.\n", + i, scsi_CDs[i].sector_size); scsi_CDs[i].capacity = 0; scsi_CDs[i].needs_sector_size = 1; - } + } - /* - * Add this so that we have the ability to correctly gauge - * what the device is capable of. - */ - scsi_CDs[i].needs_sector_size = 0; - sr_sizes[i] = scsi_CDs[i].capacity >> (BLOCK_SIZE_BITS - 9); - }; - scsi_free(buffer, 512); + /* + * Add this so that we have the ability to correctly gauge + * what the device is capable of. + */ + scsi_CDs[i].needs_sector_size = 0; + sr_sizes[i] = scsi_CDs[i].capacity >> (BLOCK_SIZE_BITS - 9); + }; + scsi_free(buffer, 512); } -void get_capabilities(int i){ - unsigned char cmd[6]; - unsigned char *buffer; - int rc,n; - - static char *loadmech[] = { - "caddy", - "tray", - "pop-up", - "", - "changer", - "changer", - "", - "" - }; - - buffer = (unsigned char *) scsi_malloc(512); - cmd[0] = MODE_SENSE; - cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0; - cmd[2] = 0x2a; - cmd[4] = 128; - cmd[3] = cmd[5] = 0; - rc = sr_do_ioctl(i, cmd, buffer, 128, 1); - - if (-EINVAL == rc) { - /* failed, drive has'nt this mode page */ - scsi_CDs[i].cdi.speed = 1; - /* disable speed select, drive probably can't do this either */ - scsi_CDs[i].cdi.mask |= CDC_SELECT_SPEED; - } else { - n = buffer[3]+4; - scsi_CDs[i].cdi.speed = ((buffer[n+8] << 8) + buffer[n+9])/176; - scsi_CDs[i].readcd_known = 1; - scsi_CDs[i].readcd_cdda = buffer[n+5] & 0x01; - /* print some capability bits */ - printk("sr%i: scsi3-mmc drive: %dx/%dx %s%s%s%s%s\n",i, - ((buffer[n+14] << 8) + buffer[n+15])/176, - scsi_CDs[i].cdi.speed, - buffer[n+3]&0x01 ? "writer " : "", /* CD Writer */ - buffer[n+2]&0x02 ? "cd/rw " : "", /* can read rewriteable */ - buffer[n+4]&0x20 ? "xa/form2 " : "", /* can read xa/from2 */ - buffer[n+5]&0x01 ? "cdda " : "", /* can read audio data */ - loadmech[buffer[n+6]>>5]); - if ((buffer[n+6] >> 5) == 0) +void get_capabilities(int i) +{ + unsigned char cmd[6]; + unsigned char *buffer; + int rc, n; + + static char *loadmech[] = + { + "caddy", + "tray", + "pop-up", + "", + "changer", + "cartridge changer", + "", + "" + }; + + scsi_CDs[i].device->writeable = 0; + spin_lock_irq(&io_request_lock); + buffer = (unsigned char *) scsi_malloc(512); + spin_unlock_irq(&io_request_lock); + cmd[0] = MODE_SENSE; + cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0; + cmd[2] = 0x2a; + cmd[4] = 128; + cmd[3] = cmd[5] = 0; + rc = sr_do_ioctl(i, cmd, buffer, 128, 1); + + if (-EINVAL == rc) { + /* failed, drive has'nt this mode page */ + scsi_CDs[i].cdi.speed = 1; + /* disable speed select, drive probably can't do this either */ + scsi_CDs[i].cdi.mask |= CDC_SELECT_SPEED; + scsi_free(buffer, 512); + return; + } + n = buffer[3] + 4; + scsi_CDs[i].cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176; + scsi_CDs[i].readcd_known = 1; + scsi_CDs[i].readcd_cdda = buffer[n + 5] & 0x01; + /* print some capability bits */ + printk("sr%i: scsi3-mmc drive: %dx/%dx %s%s%s%s%s%s\n", i, + ((buffer[n + 14] << 8) + buffer[n + 15]) / 176, + scsi_CDs[i].cdi.speed, + buffer[n + 3] & 0x01 ? "writer " : "", /* CD Writer */ + buffer[n + 3] & 0x20 ? "dvd-ram " : "", + buffer[n + 2] & 0x02 ? "cd/rw " : "", /* can read rewriteable */ + buffer[n + 4] & 0x20 ? "xa/form2 " : "", /* can read xa/from2 */ + buffer[n + 5] & 0x01 ? "cdda " : "", /* can read audio data */ + loadmech[buffer[n + 6] >> 5]); + if ((buffer[n + 6] >> 5) == 0) /* caddy drives can't close tray... */ - scsi_CDs[i].cdi.mask |= CDC_CLOSE_TRAY; - } - scsi_free(buffer, 512); + scsi_CDs[i].cdi.mask |= CDC_CLOSE_TRAY; + if ((buffer[n + 2] & 0x8) == 0) + /* not a DVD drive */ + scsi_CDs[i].cdi.mask |= CDC_DVD; + if ((buffer[n + 3] & 0x20) == 0) { + /* can't write DVD-RAM media */ + scsi_CDs[i].cdi.mask |= CDC_DVD_RAM; + } else { + scsi_CDs[i].device->writeable = 1; + } + if ((buffer[n + 3] & 0x10) == 0) + /* can't write DVD-R media */ + scsi_CDs[i].cdi.mask |= CDC_DVD_R; + if ((buffer[n + 3] & 0x2) == 0) + /* can't write CD-RW media */ + scsi_CDs[i].cdi.mask |= CDC_CD_RW; + if ((buffer[n + 3] & 0x1) == 0) + /* can't write CD-R media */ + scsi_CDs[i].cdi.mask |= CDC_CD_R; + if ((buffer[n+6] & 0x8) == 0) + /* can't eject */ + scsi_CDs[i].cdi.mask |= CDC_OPEN_TRAY; + + if ((buffer[n+6] >> 5) == mechtype_individual_changer || + (buffer[n+6] >> 5) == mechtype_cartridge_changer) + scsi_CDs[i].cdi.capacity = + cdrom_number_of_slots(&(scsi_CDs[i].cdi)); + if (scsi_CDs[i].cdi.capacity <= 1) + /* not a changer */ + scsi_CDs[i].cdi.mask |= CDC_SELECT_DISC; + /*else I don't think it can close its tray + scsi_CDs[i].cdi.mask |= CDC_CLOSE_TRAY; */ + + scsi_free(buffer, 512); +} + +/* + * sr_packet() is the entry point for the generic commands generated + * by the Uniform CD-ROM layer. + */ +static int sr_packet(struct cdrom_device_info *cdi, struct cdrom_generic_command *cgc) +{ + Scsi_Cmnd *SCpnt; + Scsi_Device *device = scsi_CDs[MINOR(cdi->dev)].device; + unsigned char *buffer = cgc->buffer; + unsigned long flags; + int buflen; + int stat; + + /* get the device */ + SCpnt = scsi_allocate_device(NULL, device, 1); + if (SCpnt == NULL) + return -ENODEV; /* this just doesn't seem right /axboe */ + + /* use buffer for ISA DMA */ + buflen = (cgc->buflen + 511) & ~511; + if (cgc->buffer && SCpnt->host->unchecked_isa_dma && + (virt_to_phys(cgc->buffer) + cgc->buflen - 1 > ISA_DMA_THRESHOLD)) { + spin_lock_irq(&io_request_lock); + buffer = scsi_malloc(buflen); + spin_unlock_irq(&io_request_lock); + if (buffer == NULL) { + printk("sr: SCSI DMA pool exhausted."); + return -ENOMEM; + } + memcpy(buffer, cgc->buffer, cgc->buflen); + } + + /* set the LUN */ + cgc->cmd[1] |= device->lun << 5; + + /* do the locking and issue the command */ + SCpnt->request.rq_dev = cdi->dev; + /* scsi_do_cmd sets the command length */ + SCpnt->cmd_len = 0; + + { + struct semaphore sem = MUTEX_LOCKED; + SCpnt->request.sem = &sem; + spin_lock_irqsave(&io_request_lock, flags); + scsi_do_cmd(SCpnt, (void *)cgc->cmd, (void *) buffer, + cgc->buflen, sr_init_done, SR_TIMEOUT, + MAX_RETRIES); + spin_unlock_irqrestore(&io_request_lock, flags); + down(&sem); + } + + stat = SCpnt->result; + + /* release */ + SCpnt->request.rq_dev = MKDEV(0, 0); + scsi_release_command(SCpnt); + SCpnt = NULL; + + /* write DMA buffer back if used */ + if (buffer && (buffer != cgc->buffer)) { + memcpy(cgc->buffer, buffer, cgc->buflen); + scsi_free(buffer, buflen); + } + + return stat; } static int sr_registered = 0; static int sr_init() { - int i; + int i; - if(sr_template.dev_noticed == 0) return 0; + if (sr_template.dev_noticed == 0) + return 0; - if(!sr_registered) { - if (register_blkdev(MAJOR_NR,"sr",&cdrom_fops)) { - printk("Unable to get major %d for SCSI-CD\n",MAJOR_NR); - return 1; + if (!sr_registered) { + if (register_blkdev(MAJOR_NR, "sr", &cdrom_fops)) { + printk("Unable to get major %d for SCSI-CD\n", MAJOR_NR); + return 1; + } + sr_registered++; } - sr_registered++; - } + if (scsi_CDs) + return 0; + sr_template.dev_max = + sr_template.dev_noticed + SR_EXTRA_DEVS; + scsi_CDs = (Scsi_CD *) scsi_init_malloc(sr_template.dev_max * sizeof(Scsi_CD), GFP_ATOMIC); + memset(scsi_CDs, 0, sr_template.dev_max * sizeof(Scsi_CD)); + sr_sizes = (int *) scsi_init_malloc(sr_template.dev_max * sizeof(int), GFP_ATOMIC); + memset(sr_sizes, 0, sr_template.dev_max * sizeof(int)); - if (scsi_CDs) return 0; - sr_template.dev_max = - sr_template.dev_noticed + SR_EXTRA_DEVS; - scsi_CDs = (Scsi_CD *) scsi_init_malloc(sr_template.dev_max * sizeof(Scsi_CD), GFP_ATOMIC); - memset(scsi_CDs, 0, sr_template.dev_max * sizeof(Scsi_CD)); + sr_blocksizes = (int *) scsi_init_malloc(sr_template.dev_max * + sizeof(int), GFP_ATOMIC); - sr_sizes = (int *) scsi_init_malloc(sr_template.dev_max * sizeof(int), GFP_ATOMIC); - memset(sr_sizes, 0, sr_template.dev_max * sizeof(int)); - - sr_blocksizes = (int *) scsi_init_malloc(sr_template.dev_max * - sizeof(int), GFP_ATOMIC); - - /* - * These are good guesses for the time being. - */ - for(i=0;ichanged = 1; /* force recheck CD type */ + for (i = 0; i < sr_template.nr_dev; ++i) { + /* If we have already seen this, then skip it. Comes up + * with loadable modules. */ + if (scsi_CDs[i].capacity) + continue; + scsi_CDs[i].capacity = 0x1fffff; + scsi_CDs[i].sector_size = 2048; /* A guess, just in case */ + scsi_CDs[i].needs_sector_size = 1; + scsi_CDs[i].device->changed = 1; /* force recheck CD type */ #if 0 - /* seems better to leave this for later */ - get_sectorsize(i); - printk("Scd sectorsize = %d bytes.\n", scsi_CDs[i].sector_size); + /* seems better to leave this for later */ + get_sectorsize(i); + printk("Scd sectorsize = %d bytes.\n", scsi_CDs[i].sector_size); #endif - scsi_CDs[i].use = 1; - scsi_CDs[i].ten = 1; - scsi_CDs[i].remap = 1; - scsi_CDs[i].readcd_known = 0; - scsi_CDs[i].readcd_cdda = 0; - sr_sizes[i] = scsi_CDs[i].capacity >> (BLOCK_SIZE_BITS - 9); - - scsi_CDs[i].cdi.ops = &sr_dops; - scsi_CDs[i].cdi.handle = &scsi_CDs[i]; - scsi_CDs[i].cdi.dev = MKDEV(MAJOR_NR,i); - scsi_CDs[i].cdi.mask = 0; - scsi_CDs[i].cdi.capacity = 1; - get_capabilities(i); - sr_vendor_init(i); - - sprintf(name, "sr%d", i); - strcpy(scsi_CDs[i].cdi.name, name); - register_cdrom(&scsi_CDs[i].cdi); - } - - - /* If our host adapter is capable of scatter-gather, then we increase - * the read-ahead to 16 blocks (32 sectors). If not, we use - * a two block (4 sector) read ahead. */ - if(scsi_CDs[0].device && scsi_CDs[0].device->host->sg_tablesize) - read_ahead[MAJOR_NR] = 32; /* 32 sector read-ahead. Always removable. */ - else - read_ahead[MAJOR_NR] = 4; /* 4 sector read-ahead */ + scsi_CDs[i].use = 1; + scsi_CDs[i].ten = 1; + scsi_CDs[i].remap = 1; + scsi_CDs[i].readcd_known = 0; + scsi_CDs[i].readcd_cdda = 0; + sr_sizes[i] = scsi_CDs[i].capacity >> (BLOCK_SIZE_BITS - 9); + + scsi_CDs[i].cdi.ops = &sr_dops; + scsi_CDs[i].cdi.handle = &scsi_CDs[i]; + scsi_CDs[i].cdi.dev = MKDEV(MAJOR_NR, i); + scsi_CDs[i].cdi.mask = 0; + scsi_CDs[i].cdi.capacity = 1; + get_capabilities(i); + sr_vendor_init(i); + + sprintf(name, "sr%d", i); + strcpy(scsi_CDs[i].cdi.name, name); + register_cdrom(&scsi_CDs[i].cdi); + } - return; + + /* If our host adapter is capable of scatter-gather, then we increase + * the read-ahead to 16 blocks (32 sectors). If not, we use + * a two block (4 sector) read ahead. */ + if (scsi_CDs[0].device && scsi_CDs[0].device->host->sg_tablesize) + read_ahead[MAJOR_NR] = 32; /* 32 sector read-ahead. Always removable. */ + else + read_ahead[MAJOR_NR] = 4; /* 4 sector read-ahead */ + + return; } static void sr_detach(Scsi_Device * SDp) { - Scsi_CD * cpnt; - int i; + Scsi_CD *cpnt; + int i; - for(cpnt = scsi_CDs, i=0; idevice == SDp) { - kdev_t devi = MKDEV(MAJOR_NR, i); - struct super_block * sb = get_super(devi); - - /* - * Since the cdrom is read-only, no need to sync the device. - * We should be kind to our buffer cache, however. - */ - if (sb) invalidate_inodes(sb); - invalidate_buffers(devi); - - /* - * Reset things back to a sane state so that one can re-load a new - * driver (perhaps the same one). - */ - unregister_cdrom(&(cpnt->cdi)); - cpnt->device = NULL; - cpnt->capacity = 0; - SDp->attached--; - sr_template.nr_dev--; - sr_template.dev_noticed--; - sr_sizes[i] = 0; - return; - } - return; + for (cpnt = scsi_CDs, i = 0; i < sr_template.dev_max; i++, cpnt++) + if (cpnt->device == SDp) { + kdev_t devi = MKDEV(MAJOR_NR, i); + struct super_block *sb = get_super(devi); + + /* + * Since the cdrom is read-only, no need to sync the device. + * We should be kind to our buffer cache, however. + */ + if (sb) + invalidate_inodes(sb); + invalidate_buffers(devi); + + /* + * Reset things back to a sane state so that one can re-load a new + * driver (perhaps the same one). + */ + unregister_cdrom(&(cpnt->cdi)); + cpnt->device = NULL; + cpnt->capacity = 0; + SDp->attached--; + sr_template.nr_dev--; + sr_template.dev_noticed--; + sr_sizes[i] = 0; + return; + } + return; } #ifdef MODULE -int init_module(void) { - sr_template.module = &__this_module; - return scsi_register_module(MODULE_SCSI_DEV, &sr_template); +int init_module(void) +{ + sr_template.module = &__this_module; + return scsi_register_module(MODULE_SCSI_DEV, &sr_template); } -void cleanup_module( void) +void cleanup_module(void) { - scsi_unregister_module(MODULE_SCSI_DEV, &sr_template); - unregister_blkdev(MAJOR_NR, "sr"); - sr_registered--; - if(scsi_CDs != NULL) { - scsi_init_free((char *) scsi_CDs, - (sr_template.dev_noticed + SR_EXTRA_DEVS) - * sizeof(Scsi_CD)); - - scsi_init_free((char *) sr_sizes, sr_template.dev_max * sizeof(int)); - sr_sizes = NULL; - - scsi_init_free((char *) sr_blocksizes, sr_template.dev_max * sizeof(int)); - sr_blocksizes = NULL; - } - - blksize_size[MAJOR_NR] = NULL; - blk_dev[MAJOR_NR].request_fn = NULL; - blk_size[MAJOR_NR] = NULL; - read_ahead[MAJOR_NR] = 0; + scsi_unregister_module(MODULE_SCSI_DEV, &sr_template); + unregister_blkdev(MAJOR_NR, "sr"); + sr_registered--; + if (scsi_CDs != NULL) { + scsi_init_free((char *) scsi_CDs, + (sr_template.dev_noticed + SR_EXTRA_DEVS) + * sizeof(Scsi_CD)); + + scsi_init_free((char *) sr_sizes, sr_template.dev_max * sizeof(int)); + sr_sizes = NULL; - sr_template.dev_max = 0; + scsi_init_free((char *) sr_blocksizes, sr_template.dev_max * sizeof(int)); + sr_blocksizes = NULL; + } + blksize_size[MAJOR_NR] = NULL; + blk_dev[MAJOR_NR].request_fn = NULL; + blk_size[MAJOR_NR] = NULL; + read_ahead[MAJOR_NR] = 0; + + sr_template.dev_max = 0; } -#endif /* MODULE */ + +#endif /* MODULE */ /* * Overrides for Emacs so that we follow Linus's tabbing style. diff -urN v2.2.15/linux/drivers/scsi/sr_ioctl.c linux/drivers/scsi/sr_ioctl.c --- v2.2.15/linux/drivers/scsi/sr_ioctl.c Tue Jan 4 10:12:21 2000 +++ linux/drivers/scsi/sr_ioctl.c Wed Jun 7 14:26:43 2000 @@ -18,9 +18,6 @@ # define DEBUG #endif -/* for now we borrow the "operation not supported" from the network folks */ -#define EDRIVE_CANT_DO_THIS EOPNOTSUPP - /* The sr_is_xa() seems to trigger firmware bugs with some drives :-( * It is off by default and can be turned on with this module parameter */ static int xa_test = 0; @@ -38,6 +35,12 @@ req = &SCpnt->request; req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */ + + if (SCpnt->buffer && req->buffer && SCpnt->buffer != req->buffer) { + memcpy(req->buffer, SCpnt->buffer, SCpnt->bufflen); + scsi_free(SCpnt->buffer, (SCpnt->bufflen + 511) & ~511); + SCpnt->buffer = req->buffer; + } if (req->sem != NULL) { up(req->sem); @@ -54,12 +57,26 @@ Scsi_Device * SDev; int result, err = 0, retries = 0; unsigned long flags; + char * bounce_buffer; spin_lock_irqsave(&io_request_lock, flags); SDev = scsi_CDs[target].device; SCpnt = scsi_allocate_device(NULL, scsi_CDs[target].device, 1); spin_unlock_irqrestore(&io_request_lock, flags); + /* use ISA DMA buffer if necessary */ + SCpnt->request.buffer=buffer; + if (buffer && SCpnt->host->unchecked_isa_dma && + (virt_to_phys(buffer) + buflength - 1 > ISA_DMA_THRESHOLD)) { + bounce_buffer = (char *)scsi_malloc((buflength + 511) & ~511); + if (bounce_buffer == NULL) { + printk("SCSI DMA pool exhausted."); + return -ENOMEM; + } + memcpy(bounce_buffer, (char *)buffer, buflength); + buffer = bounce_buffer; + } + retry: if( !scsi_block_when_processing_errors(SDev) ) return -ENODEV; @@ -74,7 +91,7 @@ down(&sem); SCpnt->request.sem = NULL; } - + result = SCpnt->result; /* Minimal error checking. Ignore cases we know about, and report the rest. */ @@ -159,7 +176,7 @@ { u_char sr_cmd[10]; - sr_cmd[0] = TEST_UNIT_READY; + sr_cmd[0] = GPCMD_TEST_UNIT_READY; sr_cmd[1] = ((scsi_CDs[minor].device -> lun) << 5); sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = sr_cmd[5] = 0; return sr_do_ioctl(minor, sr_cmd, NULL, 255, 1); @@ -169,7 +186,7 @@ { u_char sr_cmd[10]; - sr_cmd[0] = START_STOP; + sr_cmd[0] = GPCMD_START_STOP_UNIT; sr_cmd[1] = ((scsi_CDs[MINOR(cdi->dev)].device -> lun) << 5); sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0; sr_cmd[4] = (pos == 0) ? 0x03 /* close */ : 0x02 /* eject */; @@ -239,10 +256,10 @@ int sr_get_mcn(struct cdrom_device_info *cdi,struct cdrom_mcn *mcn) { u_char sr_cmd[10]; - char * buffer; + char buffer[32]; int result; - sr_cmd[0] = SCMD_READ_SUBCHANNEL; + sr_cmd[0] = GPCMD_READ_SUBCHANNEL; sr_cmd[1] = ((scsi_CDs[MINOR(cdi->dev)].device->lun) << 5); sr_cmd[2] = 0x40; /* I do want the subchannel info */ sr_cmd[3] = 0x02; /* Give me medium catalog number info */ @@ -252,15 +269,11 @@ sr_cmd[8] = 24; sr_cmd[9] = 0; - if ((buffer = (unsigned char*) scsi_malloc(512)) == NULL) - return -ENOMEM; - result = sr_do_ioctl(MINOR(cdi->dev), sr_cmd, buffer, 24, 0); memcpy (mcn->medium_catalog_number, buffer + 9, 13); mcn->medium_catalog_number[13] = 0; - scsi_free(buffer, 512); return result; } @@ -280,7 +293,7 @@ speed *= 177; /* Nx to kbyte/s */ memset(sr_cmd,0,12); - sr_cmd[0] = 0xbb; /* SET CD SPEED */ + sr_cmd[0] = GPCMD_SET_SPEED; /* SET CD SPEED */ sr_cmd[1] = (scsi_CDs[MINOR(cdi->dev)].device->lun) << 5; sr_cmd[2] = (speed >> 8) & 0xff; /* MSB for speed (in kbytes/sec) */ sr_cmd[3] = speed & 0xff; /* LSB */ @@ -293,104 +306,22 @@ /* ----------------------------------------------------------------------- */ /* this is called by the generic cdrom driver. arg is a _kernel_ pointer, */ /* becauce the generic cdrom driver does the user access stuff for us. */ +/* only cdromreadtochdr and cdromreadtocentry are left - for use with the */ +/* sr_disk_status interface for the generic cdrom driver. */ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void* arg) { u_char sr_cmd[10]; - int result, target; - - target = MINOR(cdi->dev); + int result, target = MINOR(cdi->dev); + unsigned char buffer[32]; switch (cmd) { - /* Sun-compatible */ - case CDROMPAUSE: - - sr_cmd[0] = SCMD_PAUSE_RESUME; - sr_cmd[1] = scsi_CDs[target].device->lun << 5; - sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = 0; - sr_cmd[5] = sr_cmd[6] = sr_cmd[7] = 0; - sr_cmd[8] = 0; - sr_cmd[9] = 0; - - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0); - break; - - case CDROMRESUME: - - sr_cmd[0] = SCMD_PAUSE_RESUME; - sr_cmd[1] = scsi_CDs[target].device->lun << 5; - sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = 0; - sr_cmd[5] = sr_cmd[6] = sr_cmd[7] = 0; - sr_cmd[8] = 1; - sr_cmd[9] = 0; - - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0); - break; - - case CDROMPLAYMSF: - { - struct cdrom_msf* msf = (struct cdrom_msf*)arg; - - sr_cmd[0] = SCMD_PLAYAUDIO_MSF; - sr_cmd[1] = scsi_CDs[target].device->lun << 5; - sr_cmd[2] = 0; - sr_cmd[3] = msf->cdmsf_min0; - sr_cmd[4] = msf->cdmsf_sec0; - sr_cmd[5] = msf->cdmsf_frame0; - sr_cmd[6] = msf->cdmsf_min1; - sr_cmd[7] = msf->cdmsf_sec1; - sr_cmd[8] = msf->cdmsf_frame1; - sr_cmd[9] = 0; - - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0); - break; - } - - case CDROMPLAYBLK: - { - struct cdrom_blk* blk = (struct cdrom_blk*)arg; - - sr_cmd[0] = SCMD_PLAYAUDIO10; - sr_cmd[1] = scsi_CDs[target].device->lun << 5; - sr_cmd[2] = blk->from >> 24; - sr_cmd[3] = blk->from >> 16; - sr_cmd[4] = blk->from >> 8; - sr_cmd[5] = blk->from; - sr_cmd[6] = 0; - sr_cmd[7] = blk->len >> 8; - sr_cmd[8] = blk->len; - sr_cmd[9] = 0; - - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0); - break; - } - - case CDROMPLAYTRKIND: - { - struct cdrom_ti* ti = (struct cdrom_ti*)arg; - - sr_cmd[0] = SCMD_PLAYAUDIO_TI; - sr_cmd[1] = scsi_CDs[target].device->lun << 5; - sr_cmd[2] = 0; - sr_cmd[3] = 0; - sr_cmd[4] = ti->cdti_trk0; - sr_cmd[5] = ti->cdti_ind0; - sr_cmd[6] = 0; - sr_cmd[7] = ti->cdti_trk1; - sr_cmd[8] = ti->cdti_ind1; - sr_cmd[9] = 0; - - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0); - break; - } - case CDROMREADTOCHDR: { struct cdrom_tochdr* tochdr = (struct cdrom_tochdr*)arg; - char * buffer; - sr_cmd[0] = SCMD_READ_TOC; + sr_cmd[0] = GPCMD_READ_TOC_PMA_ATIP; sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5); sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = sr_cmd[5] = 0; sr_cmd[6] = 0; @@ -398,24 +329,19 @@ sr_cmd[8] = 12; /* LSB of length */ sr_cmd[9] = 0; - if ((buffer = (unsigned char *) scsi_malloc(512)) == NULL) - return -ENOMEM; - result = sr_do_ioctl(target, sr_cmd, buffer, 12, 1); tochdr->cdth_trk0 = buffer[2]; tochdr->cdth_trk1 = buffer[3]; - scsi_free(buffer, 512); break; } case CDROMREADTOCENTRY: { struct cdrom_tocentry* tocentry = (struct cdrom_tocentry*)arg; - unsigned char * buffer; - sr_cmd[0] = SCMD_READ_TOC; + sr_cmd[0] = GPCMD_READ_TOC_PMA_ATIP; sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | (tocentry->cdte_format == CDROM_MSF ? 0x02 : 0); sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = sr_cmd[5] = 0; @@ -424,9 +350,6 @@ sr_cmd[8] = 12; /* LSB of length */ sr_cmd[9] = 0; - if ((buffer = (unsigned char *) scsi_malloc(512)) == NULL) - return -ENOMEM; - result = sr_do_ioctl (target, sr_cmd, buffer, 12, 0); tocentry->cdte_ctrl = buffer[5] & 0xf; @@ -440,160 +363,9 @@ tocentry->cdte_addr.lba = (((((buffer[8] << 8) + buffer[9]) << 8) + buffer[10]) << 8) + buffer[11]; - scsi_free(buffer, 512); break; } - - case CDROMSTOP: - sr_cmd[0] = START_STOP; - sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 1; - sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0; - sr_cmd[4] = 0; - - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0); - break; - - case CDROMSTART: - sr_cmd[0] = START_STOP; - sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 1; - sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0; - sr_cmd[4] = 1; - - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0); - break; - - case CDROMVOLCTRL: - { - char * buffer, * mask; - struct cdrom_volctrl* volctrl = (struct cdrom_volctrl*)arg; - - /* First we get the current params so we can just twiddle the volume */ - - sr_cmd[0] = MODE_SENSE; - sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5; - sr_cmd[2] = 0xe; /* Want mode page 0xe, CDROM audio params */ - sr_cmd[3] = 0; - sr_cmd[4] = 28; - sr_cmd[5] = 0; - - if ((buffer = (unsigned char *) scsi_malloc(512)) == NULL) - return -ENOMEM; - - if ((result = sr_do_ioctl (target, sr_cmd, buffer, 28, 0))) { - printk ("Hosed while obtaining audio mode page\n"); - scsi_free(buffer, 512); - break; - } - - sr_cmd[0] = MODE_SENSE; - sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5; - sr_cmd[2] = 0x4e; /* Want the mask for mode page 0xe */ - sr_cmd[3] = 0; - sr_cmd[4] = 28; - sr_cmd[5] = 0; - - mask = (unsigned char *) scsi_malloc(512); - if(!mask) { - scsi_free(buffer, 512); - result = -ENOMEM; - break; - }; - - if ((result = sr_do_ioctl (target, sr_cmd, mask, 28, 0))) { - printk ("Hosed while obtaining mask for audio mode page\n"); - scsi_free(buffer, 512); - scsi_free(mask, 512); - break; - } - - /* Now mask and substitute our own volume and reuse the rest */ - buffer[0] = 0; /* Clear reserved field */ - - buffer[21] = volctrl->channel0 & mask[21]; - buffer[23] = volctrl->channel1 & mask[23]; - buffer[25] = volctrl->channel2 & mask[25]; - buffer[27] = volctrl->channel3 & mask[27]; - - sr_cmd[0] = MODE_SELECT; - sr_cmd[1] = ((scsi_CDs[target].device -> lun) << 5) | 0x10; /* Params are SCSI-2 */ - sr_cmd[2] = sr_cmd[3] = 0; - sr_cmd[4] = 28; - sr_cmd[5] = 0; - - result = sr_do_ioctl (target, sr_cmd, buffer, 28, 0); - scsi_free(buffer, 512); - scsi_free(mask, 512); - break; - } - - case CDROMVOLREAD: - { - char * buffer; - struct cdrom_volctrl* volctrl = (struct cdrom_volctrl*)arg; - - /* Get the current params */ - - sr_cmd[0] = MODE_SENSE; - sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5; - sr_cmd[2] = 0xe; /* Want mode page 0xe, CDROM audio params */ - sr_cmd[3] = 0; - sr_cmd[4] = 28; - sr_cmd[5] = 0; - - if ((buffer = (unsigned char *) scsi_malloc(512)) == NULL) - return -ENOMEM; - - if ((result = sr_do_ioctl (target, sr_cmd, buffer, 28, 0))) { - printk ("(CDROMVOLREAD) Hosed while obtaining audio mode page\n"); - scsi_free(buffer, 512); - break; - } - volctrl->channel0 = buffer[21]; - volctrl->channel1 = buffer[23]; - volctrl->channel2 = buffer[25]; - volctrl->channel3 = buffer[27]; - - scsi_free(buffer, 512); - break; - } - - case CDROMSUBCHNL: - { - struct cdrom_subchnl* subchnl = (struct cdrom_subchnl*)arg; - char * buffer; - - sr_cmd[0] = SCMD_READ_SUBCHANNEL; - sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 0x02; /* MSF format */ - sr_cmd[2] = 0x40; /* I do want the subchannel info */ - sr_cmd[3] = 0x01; /* Give me current position info */ - sr_cmd[4] = sr_cmd[5] = 0; - sr_cmd[6] = 0; - sr_cmd[7] = 0; - sr_cmd[8] = 16; - sr_cmd[9] = 0; - - if ((buffer = (unsigned char *) scsi_malloc(512)) == NULL) - return -ENOMEM; - - result = sr_do_ioctl(target, sr_cmd, buffer, 16, 0); - - subchnl->cdsc_audiostatus = buffer[1]; - subchnl->cdsc_format = CDROM_MSF; - subchnl->cdsc_ctrl = buffer[5] & 0xf; - subchnl->cdsc_trk = buffer[6]; - subchnl->cdsc_ind = buffer[7]; - - subchnl->cdsc_reladdr.msf.minute = buffer[13]; - subchnl->cdsc_reladdr.msf.second = buffer[14]; - subchnl->cdsc_reladdr.msf.frame = buffer[15]; - subchnl->cdsc_absaddr.msf.minute = buffer[9]; - subchnl->cdsc_absaddr.msf.second = buffer[10]; - subchnl->cdsc_absaddr.msf.frame = buffer[11]; - - scsi_free(buffer, 512); - break; - } default: return -EINVAL; } @@ -631,7 +403,7 @@ #endif memset(cmd,0,12); - cmd[0] = 0xbe /* READ_CD */; + cmd[0] = GPCMD_READ_CD; /* READ_CD */ cmd[1] = (scsi_CDs[minor].device->lun << 5) | ((format & 7) << 2); cmd[2] = (unsigned char)(lba >> 24) & 0xff; cmd[3] = (unsigned char)(lba >> 16) & 0xff; @@ -677,7 +449,7 @@ #endif memset(cmd,0,12); - cmd[0] = READ_10; + cmd[0] = GPCMD_READ_10; cmd[1] = (scsi_CDs[minor].device->lun << 5); cmd[2] = (unsigned char)(lba >> 24) & 0xff; cmd[3] = (unsigned char)(lba >> 16) & 0xff; @@ -723,123 +495,33 @@ int sr_dev_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, unsigned long arg) { - int target, err; - - target = MINOR(cdi->dev); - - switch (cmd) { - case CDROMREADMODE1: - case CDROMREADMODE2: - case CDROMREADRAW: - { - unsigned char *raw; - struct cdrom_msf msf; - int lba, rc; - int blocksize = 2048; - - switch (cmd) { - case CDROMREADMODE2: blocksize = CD_FRAMESIZE_RAW0; break; /* 2336 */ - case CDROMREADRAW: blocksize = CD_FRAMESIZE_RAW; break; /* 2352 */ - } - - if (copy_from_user(&msf,(void*)arg,sizeof(msf))) - return -EFAULT; - - if ((raw = scsi_malloc(2048+512)) == NULL) - return -ENOMEM; - - lba = (((msf.cdmsf_min0 * CD_SECS) + msf.cdmsf_sec0) - * CD_FRAMES + msf.cdmsf_frame0) - CD_MSF_OFFSET; - if (lba < 0 || lba >= scsi_CDs[target].capacity) - { - scsi_free(raw, 2048+512); - return -EINVAL; - } - - rc = sr_read_sector(target, lba, blocksize, raw); - if (!rc) - if (copy_to_user((void*)arg, raw, blocksize)) - rc = -EFAULT; - - scsi_free(raw,2048+512); - return rc; - } - case CDROMREADAUDIO: - { - unsigned char *raw; - int lba, rc=0; - struct cdrom_read_audio ra; - - if (!scsi_CDs[target].readcd_known || !scsi_CDs[target].readcd_cdda) - return -EINVAL; /* -EDRIVE_DOES_NOT_SUPPORT_THIS ? */ - - if (copy_from_user(&ra,(void*)arg,sizeof(ra))) - return -EFAULT; - - if (ra.addr_format == CDROM_LBA) - lba = ra.addr.lba; - else - lba = (((ra.addr.msf.minute * CD_SECS) + ra.addr.msf.second) - * CD_FRAMES + ra.addr.msf.frame) - CD_MSF_OFFSET; - - if (lba < 0 || lba >= scsi_CDs[target].capacity) - return -EINVAL; - if ((raw = scsi_malloc(2048+512)) == NULL) - return -ENOMEM; - - while (ra.nframes > 0) { - rc = sr_read_cd(target, raw, lba, 1, CD_FRAMESIZE_RAW); - if (!rc) - if (copy_to_user(ra.buf, raw, CD_FRAMESIZE_RAW)) - rc = -EFAULT; - if (rc) - break; - - ra.buf += CD_FRAMESIZE_RAW; - ra.nframes -= 1; - lba++; - } - scsi_free(raw,2048+512); - return rc; - } - case BLKRAGET: - if (!arg) - return -EINVAL; - err = verify_area(VERIFY_WRITE, (long *) arg, sizeof(long)); - if (err) - return err; - put_user(read_ahead[MAJOR(cdi->dev)], (long *) arg); - return 0; - - case BLKRASET: - if(!capable(CAP_SYS_ADMIN)) - return -EACCES; - if(!(cdi->dev)) - return -EINVAL; - if(arg > 0xff) - return -EINVAL; - read_ahead[MAJOR(cdi->dev)] = arg; - return 0; - - case BLKSSZGET: - /* Block size of media */ - return put_user(blksize_size[MAJOR(cdi->dev)][MINOR(cdi->dev)], - (int *)arg); - - RO_IOCTLS(cdi->dev,arg); - - case BLKFLSBUF: - if(!capable(CAP_SYS_ADMIN)) - return -EACCES; - if(!(cdi->dev)) - return -EINVAL; - fsync_dev(cdi->dev); - invalidate_buffers(cdi->dev); - return 0; - - default: - return scsi_ioctl(scsi_CDs[target].device,cmd,(void *) arg); - } + switch (cmd) { + case BLKRAGET: + if (!arg) + return -EINVAL; + return put_user(read_ahead[MAJOR(cdi->dev)], (long *) arg); + case BLKRASET: + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + if (!(cdi->dev)) + return -EINVAL; + if (arg > 0xff) + return -EINVAL; + read_ahead[MAJOR(cdi->dev)] = arg; + return 0; + case BLKSSZGET: + return put_user(blksize_size[MAJOR(cdi->dev)][MINOR(cdi->dev)], (int *) arg); + case BLKFLSBUF: + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + if (!(cdi->dev)) + return -EINVAL; + fsync_dev(cdi->dev); + invalidate_buffers(cdi->dev); + return 0; + default: + return scsi_ioctl(scsi_CDs[MINOR(cdi->dev)].device,cmd,(void *) arg); + } } /* diff -urN v2.2.15/linux/drivers/scsi/sr_vendor.c linux/drivers/scsi/sr_vendor.c --- v2.2.15/linux/drivers/scsi/sr_vendor.c Tue Jan 4 10:12:21 2000 +++ linux/drivers/scsi/sr_vendor.c Wed Jun 7 14:26:43 2000 @@ -60,8 +60,7 @@ #define VENDOR_ID (scsi_CDs[minor].vendor) -void -sr_vendor_init(int minor) +void sr_vendor_init(int minor) { #ifndef CONFIG_BLK_DEV_SR_VENDOR VENDOR_ID = VENDOR_SCSI3; @@ -104,8 +103,7 @@ /* small handy function for switching block length using MODE SELECT, * used by sr_read_sector() */ -int -sr_set_blocklength(int minor, int blocklength) +int sr_set_blocklength(int minor, int blocklength) { unsigned char *buffer; /* the buffer for the ioctl */ unsigned char cmd[12]; /* the scsi-command */ diff -urN v2.2.15/linux/drivers/scsi/sym53c8xx_defs.h linux/drivers/scsi/sym53c8xx_defs.h --- v2.2.15/linux/drivers/scsi/sym53c8xx_defs.h Tue Jan 4 10:12:21 2000 +++ linux/drivers/scsi/sym53c8xx_defs.h Wed Jun 7 14:26:43 2000 @@ -176,6 +176,13 @@ #endif /* + * Should we enable DAC cycles on this platform? + * Until further investigation we do not enable it + * anywhere at the moment. + */ +#undef SCSI_NCR_USE_64BIT_DAC + +/* * Sync transfer frequency at startup. * Allow from 5Mhz to 40Mhz default 20 Mhz. */ diff -urN v2.2.15/linux/drivers/sound/724hwmcode.h linux/drivers/sound/724hwmcode.h --- v2.2.15/linux/drivers/sound/724hwmcode.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/sound/724hwmcode.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,1575 @@ +//============================================================================= +// Copyright (c) 1997-1999 Yamaha Corporation. All Rights Reserved. +// +// Title: +// hwmcode.c +// Desc: +// micro-code for CTRL & DSP +//============================================================================= +#ifndef _HWMCODE_ +#define _HWMCODE_ + +static unsigned long int DspInst[] = { + 0x00000081, 0x000001a4, 0x0000000a, 0x0000002f, + 0x00080253, 0x01800317, 0x0000407b, 0x0000843f, + 0x0001483c, 0x0001943c, 0x0005d83c, 0x00001c3c, + 0x0000c07b, 0x00050c3f, 0x0121503c, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + +static unsigned long int CntrlInst[] = { + 0x000007, 0x240007, 0x0C0007, 0x1C0007, + 0x060007, 0x700002, 0x000020, 0x030040, + 0x007104, 0x004286, 0x030040, 0x000F0D, + 0x000810, 0x20043A, 0x000282, 0x00020D, + 0x000810, 0x20043A, 0x001282, 0x200E82, + 0x001A82, 0x032D0D, 0x000810, 0x10043A, + 0x02D38D, 0x000810, 0x18043A, 0x00010D, + 0x020015, 0x0000FD, 0x000020, 0x038860, + 0x039060, 0x038060, 0x038040, 0x038040, + 0x038040, 0x018040, 0x000A7D, 0x038040, + 0x038040, 0x018040, 0x200402, 0x000882, + 0x08001A, 0x000904, 0x015986, 0x000007, + 0x260007, 0x000007, 0x000007, 0x018A06, + 0x000007, 0x030C8D, 0x000810, 0x18043A, + 0x260007, 0x00087D, 0x018042, 0x00160A, + 0x04A206, 0x000007, 0x00218D, 0x000810, + 0x08043A, 0x21C206, 0x000007, 0x0007FD, + 0x018042, 0x08000A, 0x000904, 0x029386, + 0x000195, 0x090D04, 0x000007, 0x000820, + 0x0000F5, 0x000B7D, 0x01F060, 0x0000FD, + 0x032206, 0x018040, 0x000A7D, 0x038042, + 0x13804A, 0x18000A, 0x001820, 0x059060, + 0x058860, 0x018040, 0x0000FD, 0x018042, + 0x70000A, 0x000115, 0x071144, 0x032386, + 0x030000, 0x007020, 0x034A06, 0x018040, + 0x00348D, 0x000810, 0x08043A, 0x21EA06, + 0x000007, 0x02D38D, 0x000810, 0x18043A, + 0x018206, 0x000007, 0x240007, 0x000F8D, + 0x000810, 0x00163A, 0x002402, 0x005C02, + 0x0028FD, 0x000020, 0x018040, 0x08000D, + 0x000815, 0x510984, 0x000007, 0x00004D, + 0x000E5D, 0x000E02, 0x00418D, 0x000810, + 0x08043A, 0x2C8A06, 0x000007, 0x00008D, + 0x000924, 0x000F02, 0x00458D, 0x000810, + 0x08043A, 0x2C8A06, 0x000007, 0x00387D, + 0x018042, 0x08000A, 0x001015, 0x010984, + 0x018386, 0x000007, 0x01AA06, 0x000007, + 0x0008FD, 0x018042, 0x18000A, 0x001904, + 0x218086, 0x280007, 0x001810, 0x28043A, + 0x280C02, 0x00000D, 0x000810, 0x28143A, + 0x08808D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00020D, 0x189904, 0x000007, + 0x00402D, 0x0000BD, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x055A86, 0x000007, + 0x000100, 0x000A20, 0x00047D, 0x018040, + 0x018042, 0x20000A, 0x003015, 0x012144, + 0x034986, 0x000007, 0x002104, 0x034986, + 0x000007, 0x000F8D, 0x000810, 0x280C3A, + 0x023944, 0x06C986, 0x000007, 0x001810, + 0x28043A, 0x08810D, 0x000820, 0x0002FD, + 0x018040, 0x200007, 0x002810, 0x78003A, + 0x00688D, 0x000810, 0x08043A, 0x288A06, + 0x000007, 0x00400D, 0x001015, 0x189904, + 0x292904, 0x393904, 0x000007, 0x060206, + 0x000007, 0x0004F5, 0x00007D, 0x000020, + 0x00008D, 0x010860, 0x018040, 0x00047D, + 0x038042, 0x21804A, 0x18000A, 0x021944, + 0x215886, 0x000007, 0x004075, 0x71F104, + 0x000007, 0x010042, 0x28000A, 0x002904, + 0x212086, 0x000007, 0x003C0D, 0x30A904, + 0x000007, 0x00077D, 0x018042, 0x08000A, + 0x000904, 0x07DA86, 0x00057D, 0x002820, + 0x03B060, 0x07F206, 0x018040, 0x003020, + 0x03A860, 0x018040, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x07FA86, 0x000007, + 0x00057D, 0x018042, 0x28040A, 0x000E8D, + 0x000810, 0x280C3A, 0x00000D, 0x000810, + 0x28143A, 0x09000D, 0x000820, 0x0002FD, + 0x018040, 0x200007, 0x003DFD, 0x000020, + 0x018040, 0x00107D, 0x008D8D, 0x000810, + 0x08043A, 0x288A06, 0x000007, 0x000815, + 0x08001A, 0x010984, 0x095186, 0x00137D, + 0x200500, 0x280F20, 0x338F60, 0x3B8F60, + 0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60, + 0x038A60, 0x018040, 0x007FBD, 0x383DC4, + 0x000007, 0x001A7D, 0x001375, 0x018042, + 0x09004A, 0x10000A, 0x0B8D04, 0x139504, + 0x000007, 0x000820, 0x019060, 0x001104, + 0x212086, 0x010040, 0x0017FD, 0x018042, + 0x08000A, 0x000904, 0x212286, 0x000007, + 0x00197D, 0x038042, 0x09804A, 0x10000A, + 0x000924, 0x001664, 0x0011FD, 0x038042, + 0x2B804A, 0x19804A, 0x00008D, 0x218944, + 0x000007, 0x002244, 0x0AE186, 0x000007, + 0x001A64, 0x002A24, 0x00197D, 0x080102, + 0x100122, 0x000820, 0x039060, 0x018040, + 0x003DFD, 0x00008D, 0x000820, 0x018040, + 0x001375, 0x001A7D, 0x010042, 0x09804A, + 0x10000A, 0x00021D, 0x0189E4, 0x2992E4, + 0x309144, 0x000007, 0x00060D, 0x000A15, + 0x000C1D, 0x001025, 0x00A9E4, 0x012BE4, + 0x000464, 0x01B3E4, 0x0232E4, 0x000464, + 0x000464, 0x000464, 0x000464, 0x00040D, + 0x08B1C4, 0x000007, 0x000820, 0x000BF5, + 0x030040, 0x00197D, 0x038042, 0x09804A, + 0x000A24, 0x08000A, 0x080E64, 0x000007, + 0x100122, 0x000820, 0x031060, 0x010040, + 0x0064AC, 0x00027D, 0x000020, 0x018040, + 0x00107D, 0x018042, 0x0011FD, 0x3B804A, + 0x09804A, 0x20000A, 0x000095, 0x1A1144, + 0x00A144, 0x0D2086, 0x00040D, 0x00B984, + 0x0D2186, 0x0018FD, 0x018042, 0x0010FD, + 0x09804A, 0x28000A, 0x000095, 0x010924, + 0x002A64, 0x0D1186, 0x000007, 0x002904, + 0x0D2286, 0x000007, 0x0D2A06, 0x080002, + 0x00008D, 0x00387D, 0x000820, 0x018040, + 0x00127D, 0x018042, 0x10000A, 0x003904, + 0x0DD186, 0x00080D, 0x7FFFB5, 0x00B984, + 0x0DA186, 0x000025, 0x0E7A06, 0x00002D, + 0x000015, 0x00082D, 0x02C78D, 0x000820, + 0x0EC206, 0x00000D, 0x7F8035, 0x00B984, + 0x0E7186, 0x400025, 0x00008D, 0x110944, + 0x000007, 0x00018D, 0x109504, 0x000007, + 0x009164, 0x000424, 0x000424, 0x000424, + 0x100102, 0x280002, 0x02C68D, 0x000820, + 0x0EC206, 0x00018D, 0x00042D, 0x00008D, + 0x109504, 0x000007, 0x00020D, 0x109184, + 0x000007, 0x02C70D, 0x000820, 0x00008D, + 0x0038FD, 0x018040, 0x003BFD, 0x001020, + 0x03A860, 0x000815, 0x313184, 0x212184, + 0x000007, 0x03B060, 0x03A060, 0x018040, + 0x0022FD, 0x000095, 0x010924, 0x000424, + 0x000424, 0x001264, 0x100102, 0x000820, + 0x039060, 0x018040, 0x001924, 0x00FB8D, + 0x00397D, 0x000820, 0x058040, 0x038042, + 0x09844A, 0x000606, 0x08040A, 0x000424, + 0x000424, 0x00117D, 0x018042, 0x08000A, + 0x000A24, 0x280502, 0x280C02, 0x09800D, + 0x000820, 0x0002FD, 0x018040, 0x200007, + 0x0022FD, 0x018042, 0x08000A, 0x000095, + 0x280DC4, 0x011924, 0x00197D, 0x018042, + 0x0011FD, 0x09804A, 0x10000A, 0x0000B5, + 0x113144, 0x0A8D04, 0x000007, 0x080A44, + 0x129504, 0x000007, 0x0023FD, 0x001020, + 0x038040, 0x101244, 0x000007, 0x000820, + 0x039060, 0x018040, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x10FA86, 0x000007, + 0x003BFD, 0x000100, 0x000A10, 0x0B807A, + 0x13804A, 0x090984, 0x000007, 0x000095, + 0x013D04, 0x118086, 0x10000A, 0x100002, + 0x090984, 0x000007, 0x038042, 0x11804A, + 0x090D04, 0x000007, 0x10000A, 0x090D84, + 0x000007, 0x00257D, 0x000820, 0x018040, + 0x00010D, 0x000810, 0x28143A, 0x00127D, + 0x018042, 0x20000A, 0x00197D, 0x018042, + 0x00117D, 0x31804A, 0x10000A, 0x003124, + 0x01280D, 0x00397D, 0x000820, 0x058040, + 0x038042, 0x09844A, 0x000606, 0x08040A, + 0x300102, 0x003124, 0x000424, 0x000424, + 0x001224, 0x280502, 0x001A4C, 0x130186, + 0x700002, 0x00002D, 0x030000, 0x00387D, + 0x018042, 0x10000A, 0x132A06, 0x002124, + 0x0000AD, 0x100002, 0x00010D, 0x000924, + 0x006B24, 0x01368D, 0x00397D, 0x000820, + 0x058040, 0x038042, 0x09844A, 0x000606, + 0x08040A, 0x003264, 0x00008D, 0x000A24, + 0x001020, 0x00227D, 0x018040, 0x013C0D, + 0x000810, 0x08043A, 0x29D206, 0x000007, + 0x002820, 0x00207D, 0x018040, 0x00117D, + 0x038042, 0x13804A, 0x33800A, 0x00387D, + 0x018042, 0x08000A, 0x000904, 0x163A86, + 0x000007, 0x00008D, 0x030964, 0x01478D, + 0x00397D, 0x000820, 0x058040, 0x038042, + 0x09844A, 0x000606, 0x08040A, 0x380102, + 0x000424, 0x000424, 0x001224, 0x0002FD, + 0x018042, 0x08000A, 0x000904, 0x14A286, + 0x000007, 0x280502, 0x001A4C, 0x163986, + 0x000007, 0x032164, 0x00632C, 0x003DFD, + 0x018042, 0x08000A, 0x000095, 0x090904, + 0x000007, 0x000820, 0x001A4C, 0x156186, + 0x018040, 0x030000, 0x157A06, 0x002124, + 0x00010D, 0x000924, 0x006B24, 0x015B8D, + 0x00397D, 0x000820, 0x058040, 0x038042, + 0x09844A, 0x000606, 0x08040A, 0x003A64, + 0x000095, 0x001224, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x15DA86, 0x000007, + 0x01628D, 0x000810, 0x08043A, 0x29D206, + 0x000007, 0x14D206, 0x000007, 0x007020, + 0x08010A, 0x10012A, 0x0020FD, 0x038860, + 0x039060, 0x018040, 0x00227D, 0x018042, + 0x003DFD, 0x08000A, 0x31844A, 0x000904, + 0x16D886, 0x18008B, 0x00008D, 0x189904, + 0x00312C, 0x17AA06, 0x000007, 0x00324C, + 0x173386, 0x000007, 0x001904, 0x173086, + 0x000007, 0x000095, 0x199144, 0x00222C, + 0x003124, 0x00636C, 0x000E3D, 0x001375, + 0x000BFD, 0x010042, 0x09804A, 0x10000A, + 0x038AEC, 0x0393EC, 0x00224C, 0x17A986, + 0x000007, 0x00008D, 0x189904, 0x00226C, + 0x00322C, 0x30050A, 0x301DAB, 0x002083, + 0x0018FD, 0x018042, 0x08000A, 0x018924, + 0x300502, 0x001083, 0x001875, 0x010042, + 0x10000A, 0x00008D, 0x010924, 0x001375, + 0x330542, 0x330CCB, 0x332CCB, 0x3334CB, + 0x333CCB, 0x3344CB, 0x334CCB, 0x3354CB, + 0x305C8B, 0x006083, 0x0002F5, 0x010042, + 0x08000A, 0x000904, 0x187A86, 0x000007, + 0x001E2D, 0x0005FD, 0x018042, 0x08000A, + 0x028924, 0x280502, 0x00060D, 0x000810, + 0x280C3A, 0x00008D, 0x000810, 0x28143A, + 0x0A808D, 0x000820, 0x0002F5, 0x010040, + 0x220007, 0x001275, 0x030042, 0x21004A, + 0x00008D, 0x1A0944, 0x000007, 0x01980D, + 0x000810, 0x08043A, 0x2B2206, 0x000007, + 0x0001F5, 0x030042, 0x0D004A, 0x10000A, + 0x089144, 0x000007, 0x000820, 0x010040, + 0x0025F5, 0x0A3144, 0x000007, 0x000820, + 0x032860, 0x030040, 0x00217D, 0x038042, + 0x0B804A, 0x10000A, 0x000820, 0x031060, + 0x030040, 0x00008D, 0x000124, 0x00012C, + 0x000E64, 0x001A64, 0x00636C, 0x08010A, + 0x10012A, 0x000820, 0x031060, 0x030040, + 0x0020FD, 0x018042, 0x08000A, 0x00227D, + 0x018042, 0x10000A, 0x000820, 0x031060, + 0x030040, 0x00197D, 0x018042, 0x08000A, + 0x0022FD, 0x038042, 0x10000A, 0x000820, + 0x031060, 0x030040, 0x090D04, 0x000007, + 0x000820, 0x030040, 0x038042, 0x0B804A, + 0x10000A, 0x000820, 0x031060, 0x030040, + 0x038042, 0x13804A, 0x19804A, 0x110D04, + 0x198D04, 0x000007, 0x08000A, 0x001020, + 0x031860, 0x030860, 0x030040, 0x00008D, + 0x0B0944, 0x000007, 0x000820, 0x010040, + 0x0005F5, 0x030042, 0x08000A, 0x000820, + 0x010040, 0x0000F5, 0x010042, 0x08000A, + 0x000904, 0x1C6086, 0x001E75, 0x030042, + 0x01044A, 0x000C0A, 0x1C7206, 0x000007, + 0x000402, 0x000C02, 0x00177D, 0x001AF5, + 0x018042, 0x03144A, 0x031C4A, 0x03244A, + 0x032C4A, 0x03344A, 0x033C4A, 0x03444A, + 0x004C0A, 0x00043D, 0x0013F5, 0x001AFD, + 0x030042, 0x0B004A, 0x1B804A, 0x13804A, + 0x20000A, 0x089144, 0x19A144, 0x0389E4, + 0x0399EC, 0x005502, 0x005D0A, 0x030042, + 0x0B004A, 0x1B804A, 0x13804A, 0x20000A, + 0x089144, 0x19A144, 0x0389E4, 0x0399EC, + 0x006502, 0x006D0A, 0x030042, 0x0B004A, + 0x19004A, 0x2B804A, 0x13804A, 0x21804A, + 0x30000A, 0x089144, 0x19A144, 0x2AB144, + 0x0389E4, 0x0399EC, 0x007502, 0x007D0A, + 0x03A9E4, 0x000702, 0x00107D, 0x000415, + 0x018042, 0x08000A, 0x0109E4, 0x000F02, + 0x002AF5, 0x0019FD, 0x010042, 0x09804A, + 0x10000A, 0x000934, 0x001674, 0x0029F5, + 0x010042, 0x10000A, 0x00917C, 0x002075, + 0x010042, 0x08000A, 0x000904, 0x1ED286, + 0x0026F5, 0x0027F5, 0x030042, 0x09004A, + 0x10000A, 0x000A3C, 0x00167C, 0x001A75, + 0x000BFD, 0x010042, 0x51804A, 0x48000A, + 0x160007, 0x001075, 0x010042, 0x282C0A, + 0x281D12, 0x282512, 0x001F32, 0x1E0007, + 0x0E0007, 0x001975, 0x010042, 0x002DF5, + 0x0D004A, 0x10000A, 0x009144, 0x1FB286, + 0x010042, 0x28340A, 0x000E5D, 0x00008D, + 0x000375, 0x000820, 0x010040, 0x05D2F4, + 0x54D104, 0x00735C, 0x205386, 0x000007, + 0x0C0007, 0x080007, 0x0A0007, 0x02040D, + 0x000810, 0x08043A, 0x332206, 0x000007, + 0x205A06, 0x000007, 0x080007, 0x002275, + 0x010042, 0x20000A, 0x002104, 0x212086, + 0x001E2D, 0x0002F5, 0x010042, 0x08000A, + 0x000904, 0x209286, 0x000007, 0x002010, + 0x30043A, 0x00057D, 0x0180C3, 0x08000A, + 0x028924, 0x280502, 0x280C02, 0x0A810D, + 0x000820, 0x0002F5, 0x010040, 0x220007, + 0x0004FD, 0x018042, 0x70000A, 0x030000, + 0x007020, 0x06FA06, 0x018040, 0x02180D, + 0x000810, 0x08043A, 0x2B2206, 0x000007, + 0x0002FD, 0x018042, 0x08000A, 0x000904, + 0x218A86, 0x000007, 0x01F206, 0x000007, + 0x000875, 0x0009FD, 0x00010D, 0x220A06, + 0x000295, 0x000B75, 0x00097D, 0x00000D, + 0x000515, 0x010042, 0x18000A, 0x001904, + 0x287886, 0x0006F5, 0x001020, 0x010040, + 0x0004F5, 0x000820, 0x010040, 0x000775, + 0x010042, 0x09804A, 0x10000A, 0x001124, + 0x000904, 0x22BA86, 0x000815, 0x080102, + 0x101204, 0x22DA06, 0x000575, 0x081204, + 0x000007, 0x100102, 0x000575, 0x000425, + 0x021124, 0x100102, 0x000820, 0x031060, + 0x010040, 0x001924, 0x287886, 0x00008D, + 0x000464, 0x009D04, 0x278886, 0x180102, + 0x000575, 0x010042, 0x28040A, 0x00018D, + 0x000924, 0x280D02, 0x00000D, 0x000924, + 0x281502, 0x10000D, 0x000820, 0x0002F5, + 0x010040, 0x200007, 0x001175, 0x0002FD, + 0x018042, 0x08000A, 0x000904, 0x23C286, + 0x000007, 0x000100, 0x080B20, 0x130B60, + 0x1B0B60, 0x030A60, 0x010040, 0x050042, + 0x3D004A, 0x35004A, 0x2D004A, 0x20000A, + 0x0006F5, 0x010042, 0x28140A, 0x0004F5, + 0x010042, 0x08000A, 0x000315, 0x010D04, + 0x24CA86, 0x004015, 0x000095, 0x010D04, + 0x24B886, 0x100022, 0x10002A, 0x24E206, + 0x000007, 0x333104, 0x2AA904, 0x000007, + 0x032124, 0x280502, 0x001124, 0x000424, + 0x000424, 0x003224, 0x00292C, 0x00636C, + 0x25F386, 0x000007, 0x02B164, 0x000464, + 0x000464, 0x00008D, 0x000A64, 0x280D02, + 0x10008D, 0x000820, 0x0002F5, 0x010040, + 0x220007, 0x00008D, 0x38B904, 0x000007, + 0x03296C, 0x30010A, 0x0002F5, 0x010042, + 0x08000A, 0x000904, 0x25BA86, 0x000007, + 0x02312C, 0x28050A, 0x00008D, 0x01096C, + 0x280D0A, 0x10010D, 0x000820, 0x0002F5, + 0x010040, 0x220007, 0x001124, 0x000424, + 0x000424, 0x003224, 0x300102, 0x032944, + 0x267A86, 0x000007, 0x300002, 0x0004F5, + 0x010042, 0x08000A, 0x000315, 0x010D04, + 0x26C086, 0x003124, 0x000464, 0x300102, + 0x0002F5, 0x010042, 0x08000A, 0x000904, + 0x26CA86, 0x000007, 0x003124, 0x300502, + 0x003924, 0x300583, 0x000883, 0x0005F5, + 0x010042, 0x28040A, 0x00008D, 0x008124, + 0x280D02, 0x00008D, 0x008124, 0x281502, + 0x10018D, 0x000820, 0x0002F5, 0x010040, + 0x220007, 0x001025, 0x000575, 0x030042, + 0x09004A, 0x10000A, 0x0A0904, 0x121104, + 0x000007, 0x001020, 0x050860, 0x050040, + 0x0006FD, 0x018042, 0x09004A, 0x10000A, + 0x0000A5, 0x0A0904, 0x121104, 0x000007, + 0x000820, 0x019060, 0x010040, 0x0002F5, + 0x010042, 0x08000A, 0x000904, 0x284286, + 0x000007, 0x230A06, 0x000007, 0x000606, + 0x000007, 0x0002F5, 0x010042, 0x08000A, + 0x000904, 0x289286, 0x000007, 0x000100, + 0x080B20, 0x138B60, 0x1B8B60, 0x238B60, + 0x2B8B60, 0x338B60, 0x3B8B60, 0x438B60, + 0x4B8B60, 0x538B60, 0x5B8B60, 0x638B60, + 0x6B8B60, 0x738B60, 0x7B8B60, 0x038F60, + 0x0B8F60, 0x138F60, 0x1B8F60, 0x238F60, + 0x2B8F60, 0x338F60, 0x3B8F60, 0x438F60, + 0x4B8F60, 0x538F60, 0x5B8F60, 0x638F60, + 0x6B8F60, 0x738F60, 0x7B8F60, 0x038A60, + 0x000606, 0x018040, 0x00008D, 0x000A64, + 0x280D02, 0x000A24, 0x00027D, 0x018042, + 0x10000A, 0x001224, 0x0003FD, 0x018042, + 0x08000A, 0x000904, 0x2A8286, 0x000007, + 0x00018D, 0x000A24, 0x000464, 0x000464, + 0x080102, 0x000924, 0x000424, 0x000424, + 0x100102, 0x02000D, 0x009144, 0x2AD986, + 0x000007, 0x0001FD, 0x018042, 0x08000A, + 0x000A44, 0x2ABB86, 0x018042, 0x0A000D, + 0x000820, 0x0002FD, 0x018040, 0x200007, + 0x00027D, 0x001020, 0x000606, 0x018040, + 0x0002F5, 0x010042, 0x08000A, 0x000904, + 0x2B2A86, 0x000007, 0x00037D, 0x018042, + 0x08000A, 0x000904, 0x2B5A86, 0x000007, + 0x000075, 0x002E7D, 0x010042, 0x0B804A, + 0x000020, 0x000904, 0x000686, 0x010040, + 0x31844A, 0x30048B, 0x000883, 0x00008D, + 0x000810, 0x28143A, 0x00008D, 0x000810, + 0x280C3A, 0x000675, 0x010042, 0x08000A, + 0x003815, 0x010924, 0x280502, 0x0B000D, + 0x000820, 0x0002F5, 0x010040, 0x000606, + 0x220007, 0x000464, 0x000464, 0x000606, + 0x000007, 0x000134, 0x007F8D, 0x00093C, + 0x281D12, 0x282512, 0x001F32, 0x0E0007, + 0x00010D, 0x00037D, 0x000820, 0x018040, + 0x05D2F4, 0x000007, 0x080007, 0x00037D, + 0x018042, 0x08000A, 0x000904, 0x2D0286, + 0x000007, 0x000606, 0x000007, 0x000007, + 0x000012, 0x100007, 0x320007, 0x600007, + 0x100080, 0x48001A, 0x004904, 0x2D6186, + 0x000007, 0x001210, 0x58003A, 0x000145, + 0x5C5D04, 0x000007, 0x000080, 0x48001A, + 0x004904, 0x2DB186, 0x000007, 0x001210, + 0x50003A, 0x005904, 0x2E0886, 0x000045, + 0x0000C5, 0x7FFFF5, 0x7FFF7D, 0x07D524, + 0x004224, 0x500102, 0x200502, 0x000082, + 0x40001A, 0x004104, 0x2E3986, 0x000007, + 0x003865, 0x40001A, 0x004020, 0x00104D, + 0x04C184, 0x301B86, 0x000040, 0x040007, + 0x000165, 0x000145, 0x004020, 0x000040, + 0x000765, 0x080080, 0x40001A, 0x004104, + 0x2EC986, 0x000007, 0x001210, 0x40003A, + 0x004104, 0x2F2286, 0x00004D, 0x0000CD, + 0x004810, 0x20043A, 0x000882, 0x40001A, + 0x004104, 0x2F3186, 0x000007, 0x004820, + 0x005904, 0x300886, 0x000040, 0x0007E5, + 0x200480, 0x2816A0, 0x3216E0, 0x3A16E0, + 0x4216E0, 0x021260, 0x000040, 0x000032, + 0x400075, 0x00007D, 0x07D574, 0x200512, + 0x000082, 0x40001A, 0x004104, 0x2FE186, + 0x000007, 0x037206, 0x640007, 0x060007, + 0x0000E5, 0x000020, 0x000040, 0x000A65, + 0x000020, 0x020040, 0x020040, 0x000040, + 0x000165, 0x000042, 0x70000A, 0x007104, + 0x30A286, 0x000007, 0x018206, 0x640007, + 0x050000, 0x007020, 0x000040, 0x037206, + 0x640007, 0x000007, 0x00306D, 0x028860, + 0x029060, 0x08000A, 0x028860, 0x008040, + 0x100012, 0x00100D, 0x009184, 0x314186, + 0x000E0D, 0x009184, 0x325186, 0x000007, + 0x300007, 0x001020, 0x003B6D, 0x008040, + 0x000080, 0x08001A, 0x000904, 0x316186, + 0x000007, 0x001220, 0x000DED, 0x008040, + 0x008042, 0x10000A, 0x40000D, 0x109544, + 0x000007, 0x001020, 0x000DED, 0x008040, + 0x008042, 0x20040A, 0x000082, 0x08001A, + 0x000904, 0x31F186, 0x000007, 0x003B6D, + 0x008042, 0x08000A, 0x000E15, 0x010984, + 0x329B86, 0x600007, 0x08001A, 0x000C15, + 0x010984, 0x328386, 0x000020, 0x1A0007, + 0x0002ED, 0x008040, 0x620007, 0x00306D, + 0x028042, 0x0A804A, 0x000820, 0x0A804A, + 0x000606, 0x10804A, 0x000007, 0x282512, + 0x001F32, 0x05D2F4, 0x54D104, 0x00735C, + 0x000786, 0x000007, 0x0C0007, 0x0A0007, + 0x1C0007, 0x003465, 0x020040, 0x004820, + 0x025060, 0x40000A, 0x024060, 0x000040, + 0x454944, 0x000007, 0x004020, 0x003AE5, + 0x000040, 0x0028E5, 0x000042, 0x48000A, + 0x004904, 0x386886, 0x002C65, 0x000042, + 0x40000A, 0x0000D5, 0x454104, 0x000007, + 0x000655, 0x054504, 0x34F286, 0x0001D5, + 0x054504, 0x34F086, 0x002B65, 0x000042, + 0x003AE5, 0x50004A, 0x40000A, 0x45C3D4, + 0x000007, 0x454504, 0x000007, 0x0000CD, + 0x444944, 0x000007, 0x454504, 0x000007, + 0x00014D, 0x554944, 0x000007, 0x045144, + 0x34E986, 0x002C65, 0x000042, 0x48000A, + 0x4CD104, 0x000007, 0x04C144, 0x34F386, + 0x000007, 0x160007, 0x002CE5, 0x040042, + 0x40000A, 0x004020, 0x000040, 0x002965, + 0x000042, 0x40000A, 0x004104, 0x356086, + 0x000007, 0x002402, 0x36A206, 0x005C02, + 0x0025E5, 0x000042, 0x40000A, 0x004274, + 0x002AE5, 0x000042, 0x40000A, 0x004274, + 0x500112, 0x0029E5, 0x000042, 0x40000A, + 0x004234, 0x454104, 0x000007, 0x004020, + 0x000040, 0x003EE5, 0x000020, 0x000040, + 0x002DE5, 0x400152, 0x50000A, 0x045144, + 0x364A86, 0x0000C5, 0x003EE5, 0x004020, + 0x000040, 0x002BE5, 0x000042, 0x40000A, + 0x404254, 0x000007, 0x002AE5, 0x004020, + 0x000040, 0x500132, 0x040134, 0x005674, + 0x0029E5, 0x020042, 0x42000A, 0x000042, + 0x50000A, 0x05417C, 0x0028E5, 0x000042, + 0x48000A, 0x0000C5, 0x4CC144, 0x371086, + 0x0026E5, 0x0027E5, 0x020042, 0x40004A, + 0x50000A, 0x00423C, 0x00567C, 0x0028E5, + 0x004820, 0x000040, 0x281D12, 0x282512, + 0x001F72, 0x002965, 0x000042, 0x40000A, + 0x004104, 0x37AA86, 0x0E0007, 0x160007, + 0x1E0007, 0x003EE5, 0x000042, 0x40000A, + 0x004104, 0x37E886, 0x002D65, 0x000042, + 0x28340A, 0x003465, 0x020042, 0x42004A, + 0x004020, 0x4A004A, 0x50004A, 0x05D2F4, + 0x54D104, 0x00735C, 0x385186, 0x000007, + 0x000606, 0x080007, 0x0C0007, 0x080007, + 0x0A0007, 0x0001E5, 0x020045, 0x004020, + 0x000060, 0x000365, 0x000040, 0x002E65, + 0x001A20, 0x0A1A60, 0x000040, 0x003465, + 0x020042, 0x42004A, 0x004020, 0x4A004A, + 0x000606, 0x50004A, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000 +}; + +// -------------------------------------------- +// DS-1E Controller InstructionRAM Code +// 1999/06/21 +// Buf441 slot is Enabled. +// -------------------------------------------- +// 04/09@creat +// 04/12 stop nise fix +// 06/21@WorkingOff timming +static unsigned long int CntrlInst1E[] = { + 0x000007, 0x240007, 0x0C0007, 0x1C0007, + 0x060007, 0x700002, 0x000020, 0x030040, + 0x007104, 0x004286, 0x030040, 0x000F0D, + 0x000810, 0x20043A, 0x000282, 0x00020D, + 0x000810, 0x20043A, 0x001282, 0x200E82, + 0x00800D, 0x000810, 0x20043A, 0x001A82, + 0x03460D, 0x000810, 0x10043A, 0x02EC0D, + 0x000810, 0x18043A, 0x00010D, 0x020015, + 0x0000FD, 0x000020, 0x038860, 0x039060, + 0x038060, 0x038040, 0x038040, 0x038040, + 0x018040, 0x000A7D, 0x038040, 0x038040, + 0x018040, 0x200402, 0x000882, 0x08001A, + 0x000904, 0x017186, 0x000007, 0x260007, + 0x400007, 0x000007, 0x03258D, 0x000810, + 0x18043A, 0x260007, 0x284402, 0x00087D, + 0x018042, 0x00160A, 0x05A206, 0x000007, + 0x440007, 0x00230D, 0x000810, 0x08043A, + 0x22FA06, 0x000007, 0x0007FD, 0x018042, + 0x08000A, 0x000904, 0x02AB86, 0x000195, + 0x090D04, 0x000007, 0x000820, 0x0000F5, + 0x000B7D, 0x01F060, 0x0000FD, 0x033A06, + 0x018040, 0x000A7D, 0x038042, 0x13804A, + 0x18000A, 0x001820, 0x059060, 0x058860, + 0x018040, 0x0000FD, 0x018042, 0x70000A, + 0x000115, 0x071144, 0x033B86, 0x030000, + 0x007020, 0x036206, 0x018040, 0x00360D, + 0x000810, 0x08043A, 0x232206, 0x000007, + 0x02EC0D, 0x000810, 0x18043A, 0x019A06, + 0x000007, 0x240007, 0x000F8D, 0x000810, + 0x00163A, 0x002402, 0x005C02, 0x0028FD, + 0x000020, 0x018040, 0x08000D, 0x000815, + 0x510984, 0x000007, 0x00004D, 0x000E5D, + 0x000E02, 0x00430D, 0x000810, 0x08043A, + 0x2E1206, 0x000007, 0x00008D, 0x000924, + 0x000F02, 0x00470D, 0x000810, 0x08043A, + 0x2E1206, 0x000007, 0x480480, 0x001210, + 0x28043A, 0x00778D, 0x000810, 0x280C3A, + 0x00068D, 0x000810, 0x28143A, 0x284402, + 0x03258D, 0x000810, 0x18043A, 0x07FF8D, + 0x000820, 0x0002FD, 0x018040, 0x260007, + 0x200007, 0x0002FD, 0x018042, 0x08000A, + 0x000904, 0x051286, 0x000007, 0x240007, + 0x02EC0D, 0x000810, 0x18043A, 0x00387D, + 0x018042, 0x08000A, 0x001015, 0x010984, + 0x019B86, 0x000007, 0x01B206, 0x000007, + 0x0008FD, 0x018042, 0x18000A, 0x001904, + 0x22B886, 0x280007, 0x001810, 0x28043A, + 0x280C02, 0x00000D, 0x000810, 0x28143A, + 0x08808D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00020D, 0x189904, 0x000007, + 0x00402D, 0x0000BD, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x065A86, 0x000007, + 0x000100, 0x000A20, 0x00047D, 0x018040, + 0x018042, 0x20000A, 0x003015, 0x012144, + 0x036186, 0x000007, 0x002104, 0x036186, + 0x000007, 0x000F8D, 0x000810, 0x280C3A, + 0x023944, 0x07C986, 0x000007, 0x001810, + 0x28043A, 0x08810D, 0x000820, 0x0002FD, + 0x018040, 0x200007, 0x002810, 0x78003A, + 0x00788D, 0x000810, 0x08043A, 0x2A1206, + 0x000007, 0x00400D, 0x001015, 0x189904, + 0x292904, 0x393904, 0x000007, 0x070206, + 0x000007, 0x0004F5, 0x00007D, 0x000020, + 0x00008D, 0x010860, 0x018040, 0x00047D, + 0x038042, 0x21804A, 0x18000A, 0x021944, + 0x229086, 0x000007, 0x004075, 0x71F104, + 0x000007, 0x010042, 0x28000A, 0x002904, + 0x225886, 0x000007, 0x003C0D, 0x30A904, + 0x000007, 0x00077D, 0x018042, 0x08000A, + 0x000904, 0x08DA86, 0x00057D, 0x002820, + 0x03B060, 0x08F206, 0x018040, 0x003020, + 0x03A860, 0x018040, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x08FA86, 0x000007, + 0x00057D, 0x018042, 0x28040A, 0x000E8D, + 0x000810, 0x280C3A, 0x00000D, 0x000810, + 0x28143A, 0x09000D, 0x000820, 0x0002FD, + 0x018040, 0x200007, 0x003DFD, 0x000020, + 0x018040, 0x00107D, 0x009D8D, 0x000810, + 0x08043A, 0x2A1206, 0x000007, 0x000815, + 0x08001A, 0x010984, 0x0A5186, 0x00137D, + 0x200500, 0x280F20, 0x338F60, 0x3B8F60, + 0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60, + 0x038A60, 0x018040, 0x00107D, 0x018042, + 0x08000A, 0x000215, 0x010984, 0x3A8186, + 0x000007, 0x007FBD, 0x383DC4, 0x000007, + 0x001A7D, 0x001375, 0x018042, 0x09004A, + 0x10000A, 0x0B8D04, 0x139504, 0x000007, + 0x000820, 0x019060, 0x001104, 0x225886, + 0x010040, 0x0017FD, 0x018042, 0x08000A, + 0x000904, 0x225A86, 0x000007, 0x00197D, + 0x038042, 0x09804A, 0x10000A, 0x000924, + 0x001664, 0x0011FD, 0x038042, 0x2B804A, + 0x19804A, 0x00008D, 0x218944, 0x000007, + 0x002244, 0x0C1986, 0x000007, 0x001A64, + 0x002A24, 0x00197D, 0x080102, 0x100122, + 0x000820, 0x039060, 0x018040, 0x003DFD, + 0x00008D, 0x000820, 0x018040, 0x001375, + 0x001A7D, 0x010042, 0x09804A, 0x10000A, + 0x00021D, 0x0189E4, 0x2992E4, 0x309144, + 0x000007, 0x00060D, 0x000A15, 0x000C1D, + 0x001025, 0x00A9E4, 0x012BE4, 0x000464, + 0x01B3E4, 0x0232E4, 0x000464, 0x000464, + 0x000464, 0x000464, 0x00040D, 0x08B1C4, + 0x000007, 0x000820, 0x000BF5, 0x030040, + 0x00197D, 0x038042, 0x09804A, 0x000A24, + 0x08000A, 0x080E64, 0x000007, 0x100122, + 0x000820, 0x031060, 0x010040, 0x0064AC, + 0x00027D, 0x000020, 0x018040, 0x00107D, + 0x018042, 0x0011FD, 0x3B804A, 0x09804A, + 0x20000A, 0x000095, 0x1A1144, 0x00A144, + 0x0E5886, 0x00040D, 0x00B984, 0x0E5986, + 0x0018FD, 0x018042, 0x0010FD, 0x09804A, + 0x28000A, 0x000095, 0x010924, 0x002A64, + 0x0E4986, 0x000007, 0x002904, 0x0E5A86, + 0x000007, 0x0E6206, 0x080002, 0x00008D, + 0x00387D, 0x000820, 0x018040, 0x00127D, + 0x018042, 0x10000A, 0x003904, 0x0F0986, + 0x00080D, 0x7FFFB5, 0x00B984, 0x0ED986, + 0x000025, 0x0FB206, 0x00002D, 0x000015, + 0x00082D, 0x02E00D, 0x000820, 0x0FFA06, + 0x00000D, 0x7F8035, 0x00B984, 0x0FA986, + 0x400025, 0x00008D, 0x110944, 0x000007, + 0x00018D, 0x109504, 0x000007, 0x009164, + 0x000424, 0x000424, 0x000424, 0x100102, + 0x280002, 0x02DF0D, 0x000820, 0x0FFA06, + 0x00018D, 0x00042D, 0x00008D, 0x109504, + 0x000007, 0x00020D, 0x109184, 0x000007, + 0x02DF8D, 0x000820, 0x00008D, 0x0038FD, + 0x018040, 0x003BFD, 0x001020, 0x03A860, + 0x000815, 0x313184, 0x212184, 0x000007, + 0x03B060, 0x03A060, 0x018040, 0x0022FD, + 0x000095, 0x010924, 0x000424, 0x000424, + 0x001264, 0x100102, 0x000820, 0x039060, + 0x018040, 0x001924, 0x010F0D, 0x00397D, + 0x000820, 0x058040, 0x038042, 0x09844A, + 0x000606, 0x08040A, 0x000424, 0x000424, + 0x00117D, 0x018042, 0x08000A, 0x000A24, + 0x280502, 0x280C02, 0x09800D, 0x000820, + 0x0002FD, 0x018040, 0x200007, 0x0022FD, + 0x018042, 0x08000A, 0x000095, 0x280DC4, + 0x011924, 0x00197D, 0x018042, 0x0011FD, + 0x09804A, 0x10000A, 0x0000B5, 0x113144, + 0x0A8D04, 0x000007, 0x080A44, 0x129504, + 0x000007, 0x0023FD, 0x001020, 0x038040, + 0x101244, 0x000007, 0x000820, 0x039060, + 0x018040, 0x0002FD, 0x018042, 0x08000A, + 0x000904, 0x123286, 0x000007, 0x003BFD, + 0x000100, 0x000A10, 0x0B807A, 0x13804A, + 0x090984, 0x000007, 0x000095, 0x013D04, + 0x12B886, 0x10000A, 0x100002, 0x090984, + 0x000007, 0x038042, 0x11804A, 0x090D04, + 0x000007, 0x10000A, 0x090D84, 0x000007, + 0x00257D, 0x000820, 0x018040, 0x00010D, + 0x000810, 0x28143A, 0x00127D, 0x018042, + 0x20000A, 0x00197D, 0x018042, 0x00117D, + 0x31804A, 0x10000A, 0x003124, 0x013B8D, + 0x00397D, 0x000820, 0x058040, 0x038042, + 0x09844A, 0x000606, 0x08040A, 0x300102, + 0x003124, 0x000424, 0x000424, 0x001224, + 0x280502, 0x001A4C, 0x143986, 0x700002, + 0x00002D, 0x030000, 0x00387D, 0x018042, + 0x10000A, 0x146206, 0x002124, 0x0000AD, + 0x100002, 0x00010D, 0x000924, 0x006B24, + 0x014A0D, 0x00397D, 0x000820, 0x058040, + 0x038042, 0x09844A, 0x000606, 0x08040A, + 0x003264, 0x00008D, 0x000A24, 0x001020, + 0x00227D, 0x018040, 0x014F8D, 0x000810, + 0x08043A, 0x2B5A06, 0x000007, 0x002820, + 0x00207D, 0x018040, 0x00117D, 0x038042, + 0x13804A, 0x33800A, 0x00387D, 0x018042, + 0x08000A, 0x000904, 0x177286, 0x000007, + 0x00008D, 0x030964, 0x015B0D, 0x00397D, + 0x000820, 0x058040, 0x038042, 0x09844A, + 0x000606, 0x08040A, 0x380102, 0x000424, + 0x000424, 0x001224, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x15DA86, 0x000007, + 0x280502, 0x001A4C, 0x177186, 0x000007, + 0x032164, 0x00632C, 0x003DFD, 0x018042, + 0x08000A, 0x000095, 0x090904, 0x000007, + 0x000820, 0x001A4C, 0x169986, 0x018040, + 0x030000, 0x16B206, 0x002124, 0x00010D, + 0x000924, 0x006B24, 0x016F0D, 0x00397D, + 0x000820, 0x058040, 0x038042, 0x09844A, + 0x000606, 0x08040A, 0x003A64, 0x000095, + 0x001224, 0x0002FD, 0x018042, 0x08000A, + 0x000904, 0x171286, 0x000007, 0x01760D, + 0x000810, 0x08043A, 0x2B5A06, 0x000007, + 0x160A06, 0x000007, 0x007020, 0x08010A, + 0x10012A, 0x0020FD, 0x038860, 0x039060, + 0x018040, 0x00227D, 0x018042, 0x003DFD, + 0x08000A, 0x31844A, 0x000904, 0x181086, + 0x18008B, 0x00008D, 0x189904, 0x00312C, + 0x18E206, 0x000007, 0x00324C, 0x186B86, + 0x000007, 0x001904, 0x186886, 0x000007, + 0x000095, 0x199144, 0x00222C, 0x003124, + 0x00636C, 0x000E3D, 0x001375, 0x000BFD, + 0x010042, 0x09804A, 0x10000A, 0x038AEC, + 0x0393EC, 0x00224C, 0x18E186, 0x000007, + 0x00008D, 0x189904, 0x00226C, 0x00322C, + 0x30050A, 0x301DAB, 0x002083, 0x0018FD, + 0x018042, 0x08000A, 0x018924, 0x300502, + 0x001083, 0x001875, 0x010042, 0x10000A, + 0x00008D, 0x010924, 0x001375, 0x330542, + 0x330CCB, 0x332CCB, 0x3334CB, 0x333CCB, + 0x3344CB, 0x334CCB, 0x3354CB, 0x305C8B, + 0x006083, 0x0002F5, 0x010042, 0x08000A, + 0x000904, 0x19B286, 0x000007, 0x001E2D, + 0x0005FD, 0x018042, 0x08000A, 0x028924, + 0x280502, 0x00060D, 0x000810, 0x280C3A, + 0x00008D, 0x000810, 0x28143A, 0x0A808D, + 0x000820, 0x0002F5, 0x010040, 0x220007, + 0x001275, 0x030042, 0x21004A, 0x00008D, + 0x1A0944, 0x000007, 0x01AB8D, 0x000810, + 0x08043A, 0x2CAA06, 0x000007, 0x0001F5, + 0x030042, 0x0D004A, 0x10000A, 0x089144, + 0x000007, 0x000820, 0x010040, 0x0025F5, + 0x0A3144, 0x000007, 0x000820, 0x032860, + 0x030040, 0x00217D, 0x038042, 0x0B804A, + 0x10000A, 0x000820, 0x031060, 0x030040, + 0x00008D, 0x000124, 0x00012C, 0x000E64, + 0x001A64, 0x00636C, 0x08010A, 0x10012A, + 0x000820, 0x031060, 0x030040, 0x0020FD, + 0x018042, 0x08000A, 0x00227D, 0x018042, + 0x10000A, 0x000820, 0x031060, 0x030040, + 0x00197D, 0x018042, 0x08000A, 0x0022FD, + 0x038042, 0x10000A, 0x000820, 0x031060, + 0x030040, 0x090D04, 0x000007, 0x000820, + 0x030040, 0x038042, 0x0B804A, 0x10000A, + 0x000820, 0x031060, 0x030040, 0x038042, + 0x13804A, 0x19804A, 0x110D04, 0x198D04, + 0x000007, 0x08000A, 0x001020, 0x031860, + 0x030860, 0x030040, 0x00008D, 0x0B0944, + 0x000007, 0x000820, 0x010040, 0x0005F5, + 0x030042, 0x08000A, 0x000820, 0x010040, + 0x0000F5, 0x010042, 0x08000A, 0x000904, + 0x1D9886, 0x001E75, 0x030042, 0x01044A, + 0x000C0A, 0x1DAA06, 0x000007, 0x000402, + 0x000C02, 0x00177D, 0x001AF5, 0x018042, + 0x03144A, 0x031C4A, 0x03244A, 0x032C4A, + 0x03344A, 0x033C4A, 0x03444A, 0x004C0A, + 0x00043D, 0x0013F5, 0x001AFD, 0x030042, + 0x0B004A, 0x1B804A, 0x13804A, 0x20000A, + 0x089144, 0x19A144, 0x0389E4, 0x0399EC, + 0x005502, 0x005D0A, 0x030042, 0x0B004A, + 0x1B804A, 0x13804A, 0x20000A, 0x089144, + 0x19A144, 0x0389E4, 0x0399EC, 0x006502, + 0x006D0A, 0x030042, 0x0B004A, 0x19004A, + 0x2B804A, 0x13804A, 0x21804A, 0x30000A, + 0x089144, 0x19A144, 0x2AB144, 0x0389E4, + 0x0399EC, 0x007502, 0x007D0A, 0x03A9E4, + 0x000702, 0x00107D, 0x000415, 0x018042, + 0x08000A, 0x0109E4, 0x000F02, 0x002AF5, + 0x0019FD, 0x010042, 0x09804A, 0x10000A, + 0x000934, 0x001674, 0x0029F5, 0x010042, + 0x10000A, 0x00917C, 0x002075, 0x010042, + 0x08000A, 0x000904, 0x200A86, 0x0026F5, + 0x0027F5, 0x030042, 0x09004A, 0x10000A, + 0x000A3C, 0x00167C, 0x001A75, 0x000BFD, + 0x010042, 0x51804A, 0x48000A, 0x160007, + 0x001075, 0x010042, 0x282C0A, 0x281D12, + 0x282512, 0x001F32, 0x1E0007, 0x0E0007, + 0x001975, 0x010042, 0x002DF5, 0x0D004A, + 0x10000A, 0x009144, 0x20EA86, 0x010042, + 0x28340A, 0x000E5D, 0x00008D, 0x000375, + 0x000820, 0x010040, 0x05D2F4, 0x54D104, + 0x00735C, 0x218B86, 0x000007, 0x0C0007, + 0x080007, 0x0A0007, 0x02178D, 0x000810, + 0x08043A, 0x34B206, 0x000007, 0x219206, + 0x000007, 0x080007, 0x002275, 0x010042, + 0x20000A, 0x002104, 0x225886, 0x001E2D, + 0x0002F5, 0x010042, 0x08000A, 0x000904, + 0x21CA86, 0x000007, 0x002010, 0x30043A, + 0x00057D, 0x0180C3, 0x08000A, 0x028924, + 0x280502, 0x280C02, 0x0A810D, 0x000820, + 0x0002F5, 0x010040, 0x220007, 0x0004FD, + 0x018042, 0x70000A, 0x030000, 0x007020, + 0x07FA06, 0x018040, 0x022B8D, 0x000810, + 0x08043A, 0x2CAA06, 0x000007, 0x0002FD, + 0x018042, 0x08000A, 0x000904, 0x22C286, + 0x000007, 0x020206, 0x000007, 0x000875, + 0x0009FD, 0x00010D, 0x234206, 0x000295, + 0x000B75, 0x00097D, 0x00000D, 0x000515, + 0x010042, 0x18000A, 0x001904, 0x2A0086, + 0x0006F5, 0x001020, 0x010040, 0x0004F5, + 0x000820, 0x010040, 0x000775, 0x010042, + 0x09804A, 0x10000A, 0x001124, 0x000904, + 0x23F286, 0x000815, 0x080102, 0x101204, + 0x241206, 0x000575, 0x081204, 0x000007, + 0x100102, 0x000575, 0x000425, 0x021124, + 0x100102, 0x000820, 0x031060, 0x010040, + 0x001924, 0x2A0086, 0x00008D, 0x000464, + 0x009D04, 0x291086, 0x180102, 0x000575, + 0x010042, 0x28040A, 0x00018D, 0x000924, + 0x280D02, 0x00000D, 0x000924, 0x281502, + 0x10000D, 0x000820, 0x0002F5, 0x010040, + 0x200007, 0x001175, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x24FA86, 0x000007, + 0x000100, 0x080B20, 0x130B60, 0x1B0B60, + 0x030A60, 0x010040, 0x050042, 0x3D004A, + 0x35004A, 0x2D004A, 0x20000A, 0x0006F5, + 0x010042, 0x28140A, 0x0004F5, 0x010042, + 0x08000A, 0x000315, 0x010D04, 0x260286, + 0x004015, 0x000095, 0x010D04, 0x25F086, + 0x100022, 0x10002A, 0x261A06, 0x000007, + 0x333104, 0x2AA904, 0x000007, 0x032124, + 0x280502, 0x284402, 0x001124, 0x400102, + 0x000424, 0x000424, 0x003224, 0x00292C, + 0x00636C, 0x277386, 0x000007, 0x02B164, + 0x000464, 0x000464, 0x00008D, 0x000A64, + 0x280D02, 0x10008D, 0x000820, 0x0002F5, + 0x010040, 0x220007, 0x00008D, 0x38B904, + 0x000007, 0x03296C, 0x30010A, 0x0002F5, + 0x010042, 0x08000A, 0x000904, 0x270286, + 0x000007, 0x00212C, 0x28050A, 0x00316C, + 0x00046C, 0x00046C, 0x28450A, 0x001124, + 0x006B64, 0x100102, 0x00008D, 0x01096C, + 0x280D0A, 0x10010D, 0x000820, 0x0002F5, + 0x010040, 0x220007, 0x004124, 0x000424, + 0x000424, 0x003224, 0x300102, 0x032944, + 0x27FA86, 0x000007, 0x300002, 0x0004F5, + 0x010042, 0x08000A, 0x000315, 0x010D04, + 0x284086, 0x003124, 0x000464, 0x300102, + 0x0002F5, 0x010042, 0x08000A, 0x000904, + 0x284A86, 0x000007, 0x284402, 0x003124, + 0x300502, 0x003924, 0x300583, 0x000883, + 0x0005F5, 0x010042, 0x28040A, 0x00008D, + 0x008124, 0x280D02, 0x00008D, 0x008124, + 0x281502, 0x10018D, 0x000820, 0x0002F5, + 0x010040, 0x220007, 0x001025, 0x000575, + 0x030042, 0x09004A, 0x10000A, 0x0A0904, + 0x121104, 0x000007, 0x001020, 0x050860, + 0x050040, 0x0006FD, 0x018042, 0x09004A, + 0x10000A, 0x0000A5, 0x0A0904, 0x121104, + 0x000007, 0x000820, 0x019060, 0x010040, + 0x0002F5, 0x010042, 0x08000A, 0x000904, + 0x29CA86, 0x000007, 0x244206, 0x000007, + 0x000606, 0x000007, 0x0002F5, 0x010042, + 0x08000A, 0x000904, 0x2A1A86, 0x000007, + 0x000100, 0x080B20, 0x138B60, 0x1B8B60, + 0x238B60, 0x2B8B60, 0x338B60, 0x3B8B60, + 0x438B60, 0x4B8B60, 0x538B60, 0x5B8B60, + 0x638B60, 0x6B8B60, 0x738B60, 0x7B8B60, + 0x038F60, 0x0B8F60, 0x138F60, 0x1B8F60, + 0x238F60, 0x2B8F60, 0x338F60, 0x3B8F60, + 0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60, + 0x638F60, 0x6B8F60, 0x738F60, 0x7B8F60, + 0x038A60, 0x000606, 0x018040, 0x00008D, + 0x000A64, 0x280D02, 0x000A24, 0x00027D, + 0x018042, 0x10000A, 0x001224, 0x0003FD, + 0x018042, 0x08000A, 0x000904, 0x2C0A86, + 0x000007, 0x00018D, 0x000A24, 0x000464, + 0x000464, 0x080102, 0x000924, 0x000424, + 0x000424, 0x100102, 0x02000D, 0x009144, + 0x2C6186, 0x000007, 0x0001FD, 0x018042, + 0x08000A, 0x000A44, 0x2C4386, 0x018042, + 0x0A000D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00027D, 0x001020, 0x000606, + 0x018040, 0x0002F5, 0x010042, 0x08000A, + 0x000904, 0x2CB286, 0x000007, 0x00037D, + 0x018042, 0x08000A, 0x000904, 0x2CE286, + 0x000007, 0x000075, 0x002E7D, 0x010042, + 0x0B804A, 0x000020, 0x000904, 0x000686, + 0x010040, 0x31844A, 0x30048B, 0x000883, + 0x00008D, 0x000810, 0x28143A, 0x00008D, + 0x000810, 0x280C3A, 0x000675, 0x010042, + 0x08000A, 0x003815, 0x010924, 0x280502, + 0x0B000D, 0x000820, 0x0002F5, 0x010040, + 0x000606, 0x220007, 0x000464, 0x000464, + 0x000606, 0x000007, 0x000134, 0x007F8D, + 0x00093C, 0x281D12, 0x282512, 0x001F32, + 0x0E0007, 0x00010D, 0x00037D, 0x000820, + 0x018040, 0x05D2F4, 0x000007, 0x080007, + 0x00037D, 0x018042, 0x08000A, 0x000904, + 0x2E8A86, 0x000007, 0x000606, 0x000007, + 0x000007, 0x000012, 0x100007, 0x320007, + 0x600007, 0x460007, 0x100080, 0x48001A, + 0x004904, 0x2EF186, 0x000007, 0x001210, + 0x58003A, 0x000145, 0x5C5D04, 0x000007, + 0x000080, 0x48001A, 0x004904, 0x2F4186, + 0x000007, 0x001210, 0x50003A, 0x005904, + 0x2F9886, 0x000045, 0x0000C5, 0x7FFFF5, + 0x7FFF7D, 0x07D524, 0x004224, 0x500102, + 0x200502, 0x000082, 0x40001A, 0x004104, + 0x2FC986, 0x000007, 0x003865, 0x40001A, + 0x004020, 0x00104D, 0x04C184, 0x31AB86, + 0x000040, 0x040007, 0x000165, 0x000145, + 0x004020, 0x000040, 0x000765, 0x080080, + 0x40001A, 0x004104, 0x305986, 0x000007, + 0x001210, 0x40003A, 0x004104, 0x30B286, + 0x00004D, 0x0000CD, 0x004810, 0x20043A, + 0x000882, 0x40001A, 0x004104, 0x30C186, + 0x000007, 0x004820, 0x005904, 0x319886, + 0x000040, 0x0007E5, 0x200480, 0x2816A0, + 0x3216E0, 0x3A16E0, 0x4216E0, 0x021260, + 0x000040, 0x000032, 0x400075, 0x00007D, + 0x07D574, 0x200512, 0x000082, 0x40001A, + 0x004104, 0x317186, 0x000007, 0x038A06, + 0x640007, 0x0000E5, 0x000020, 0x000040, + 0x000A65, 0x000020, 0x020040, 0x020040, + 0x000040, 0x000165, 0x000042, 0x70000A, + 0x007104, 0x323286, 0x000007, 0x060007, + 0x019A06, 0x640007, 0x050000, 0x007020, + 0x000040, 0x038A06, 0x640007, 0x000007, + 0x00306D, 0x028860, 0x029060, 0x08000A, + 0x028860, 0x008040, 0x100012, 0x00100D, + 0x009184, 0x32D186, 0x000E0D, 0x009184, + 0x33E186, 0x000007, 0x300007, 0x001020, + 0x003B6D, 0x008040, 0x000080, 0x08001A, + 0x000904, 0x32F186, 0x000007, 0x001220, + 0x000DED, 0x008040, 0x008042, 0x10000A, + 0x40000D, 0x109544, 0x000007, 0x001020, + 0x000DED, 0x008040, 0x008042, 0x20040A, + 0x000082, 0x08001A, 0x000904, 0x338186, + 0x000007, 0x003B6D, 0x008042, 0x08000A, + 0x000E15, 0x010984, 0x342B86, 0x600007, + 0x08001A, 0x000C15, 0x010984, 0x341386, + 0x000020, 0x1A0007, 0x0002ED, 0x008040, + 0x620007, 0x00306D, 0x028042, 0x0A804A, + 0x000820, 0x0A804A, 0x000606, 0x10804A, + 0x000007, 0x282512, 0x001F32, 0x05D2F4, + 0x54D104, 0x00735C, 0x000786, 0x000007, + 0x0C0007, 0x0A0007, 0x1C0007, 0x003465, + 0x020040, 0x004820, 0x025060, 0x40000A, + 0x024060, 0x000040, 0x454944, 0x000007, + 0x004020, 0x003AE5, 0x000040, 0x0028E5, + 0x000042, 0x48000A, 0x004904, 0x39F886, + 0x002C65, 0x000042, 0x40000A, 0x0000D5, + 0x454104, 0x000007, 0x000655, 0x054504, + 0x368286, 0x0001D5, 0x054504, 0x368086, + 0x002B65, 0x000042, 0x003AE5, 0x50004A, + 0x40000A, 0x45C3D4, 0x000007, 0x454504, + 0x000007, 0x0000CD, 0x444944, 0x000007, + 0x454504, 0x000007, 0x00014D, 0x554944, + 0x000007, 0x045144, 0x367986, 0x002C65, + 0x000042, 0x48000A, 0x4CD104, 0x000007, + 0x04C144, 0x368386, 0x000007, 0x160007, + 0x002CE5, 0x040042, 0x40000A, 0x004020, + 0x000040, 0x002965, 0x000042, 0x40000A, + 0x004104, 0x36F086, 0x000007, 0x002402, + 0x383206, 0x005C02, 0x0025E5, 0x000042, + 0x40000A, 0x004274, 0x002AE5, 0x000042, + 0x40000A, 0x004274, 0x500112, 0x0029E5, + 0x000042, 0x40000A, 0x004234, 0x454104, + 0x000007, 0x004020, 0x000040, 0x003EE5, + 0x000020, 0x000040, 0x002DE5, 0x400152, + 0x50000A, 0x045144, 0x37DA86, 0x0000C5, + 0x003EE5, 0x004020, 0x000040, 0x002BE5, + 0x000042, 0x40000A, 0x404254, 0x000007, + 0x002AE5, 0x004020, 0x000040, 0x500132, + 0x040134, 0x005674, 0x0029E5, 0x020042, + 0x42000A, 0x000042, 0x50000A, 0x05417C, + 0x0028E5, 0x000042, 0x48000A, 0x0000C5, + 0x4CC144, 0x38A086, 0x0026E5, 0x0027E5, + 0x020042, 0x40004A, 0x50000A, 0x00423C, + 0x00567C, 0x0028E5, 0x004820, 0x000040, + 0x281D12, 0x282512, 0x001F72, 0x002965, + 0x000042, 0x40000A, 0x004104, 0x393A86, + 0x0E0007, 0x160007, 0x1E0007, 0x003EE5, + 0x000042, 0x40000A, 0x004104, 0x397886, + 0x002D65, 0x000042, 0x28340A, 0x003465, + 0x020042, 0x42004A, 0x004020, 0x4A004A, + 0x50004A, 0x05D2F4, 0x54D104, 0x00735C, + 0x39E186, 0x000007, 0x000606, 0x080007, + 0x0C0007, 0x080007, 0x0A0007, 0x0001E5, + 0x020045, 0x004020, 0x000060, 0x000365, + 0x000040, 0x002E65, 0x001A20, 0x0A1A60, + 0x000040, 0x003465, 0x020042, 0x42004A, + 0x004020, 0x4A004A, 0x000606, 0x50004A, + 0x0017FD, 0x018042, 0x08000A, 0x000904, + 0x225A86, 0x000007, 0x00107D, 0x018042, + 0x0011FD, 0x33804A, 0x19804A, 0x20000A, + 0x000095, 0x2A1144, 0x01A144, 0x3B9086, + 0x00040D, 0x00B184, 0x3B9186, 0x0018FD, + 0x018042, 0x0010FD, 0x09804A, 0x38000A, + 0x000095, 0x010924, 0x003A64, 0x3B8186, + 0x000007, 0x003904, 0x3B9286, 0x000007, + 0x3B9A06, 0x00000D, 0x00008D, 0x000820, + 0x00387D, 0x018040, 0x700002, 0x00117D, + 0x018042, 0x00197D, 0x29804A, 0x30000A, + 0x380002, 0x003124, 0x000424, 0x000424, + 0x002A24, 0x280502, 0x00068D, 0x000810, + 0x28143A, 0x00750D, 0x00B124, 0x002264, + 0x3D0386, 0x284402, 0x000810, 0x280C3A, + 0x0B800D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00758D, 0x00B124, 0x100102, + 0x012144, 0x3E4986, 0x001810, 0x10003A, + 0x00387D, 0x018042, 0x08000A, 0x000904, + 0x3E4886, 0x030000, 0x3E4A06, 0x0000BD, + 0x00008D, 0x023164, 0x000A64, 0x280D02, + 0x0B808D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00387D, 0x018042, 0x08000A, + 0x000904, 0x3E3286, 0x030000, 0x0002FD, + 0x018042, 0x08000A, 0x000904, 0x3D8286, + 0x000007, 0x002810, 0x28043A, 0x00750D, + 0x030924, 0x002264, 0x280D02, 0x02316C, + 0x28450A, 0x0B810D, 0x000820, 0x0002FD, + 0x018040, 0x200007, 0x00008D, 0x000A24, + 0x3E4A06, 0x100102, 0x001810, 0x10003A, + 0x0000BD, 0x003810, 0x30043A, 0x00187D, + 0x018042, 0x0018FD, 0x09804A, 0x20000A, + 0x0000AD, 0x028924, 0x07212C, 0x001010, + 0x300583, 0x300D8B, 0x3014BB, 0x301C83, + 0x002083, 0x00137D, 0x038042, 0x33844A, + 0x33ACCB, 0x33B4CB, 0x33BCCB, 0x33C4CB, + 0x33CCCB, 0x33D4CB, 0x305C8B, 0x006083, + 0x001E0D, 0x0005FD, 0x018042, 0x20000A, + 0x020924, 0x00068D, 0x00A96C, 0x00009D, + 0x0002FD, 0x018042, 0x08000A, 0x000904, + 0x3F6A86, 0x000007, 0x280502, 0x280D0A, + 0x284402, 0x001810, 0x28143A, 0x0C008D, + 0x000820, 0x0002FD, 0x018040, 0x220007, + 0x003904, 0x225886, 0x001E0D, 0x00057D, + 0x018042, 0x20000A, 0x020924, 0x0000A5, + 0x0002FD, 0x018042, 0x08000A, 0x000904, + 0x402A86, 0x000007, 0x280502, 0x280C02, + 0x002010, 0x28143A, 0x0C010D, 0x000820, + 0x0002FD, 0x018040, 0x225A06, 0x220007, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000 +}; + +#endif //_HWMCODE_ + + diff -urN v2.2.15/linux/drivers/sound/Config.in linux/drivers/sound/Config.in --- v2.2.15/linux/drivers/sound/Config.in Tue Jan 4 10:12:21 2000 +++ linux/drivers/sound/Config.in Wed Jun 7 14:26:43 2000 @@ -35,12 +35,16 @@ dep_tristate 'ESS Solo1 (Experimental)' CONFIG_SOUND_ESSSOLO1 $CONFIG_SOUND fi +dep_tristate 'Intel ICH (810, 820, 440MX...)' CONFIG_SOUND_ICH $CONFIG_SOUND + dep_tristate 'S3 SonicVibes' CONFIG_SOUND_SONICVIBES $CONFIG_SOUND if [ "$CONFIG_VISWS" = "y" ]; then - dep_tristate 'SGI Visual Workstation Sound' CONFIG_SOUND_VWSND $CONFIG_SOUND + dep_tristate ' Workstation Sound' CONFIG_SOUND_VWSND $CONFIG_SOUND fi +dep_tristate 'Trident 4DWave DX/NX or SiS 7018 PCI Audio Core or ALi 5451' CONFIG_SOUND_TRIDENT $CONFIG_SOUND + dep_tristate 'Support for Turtle Beach MultiSound Classic, Tahiti, Monterey' CONFIG_SOUND_MSNDCLAS $CONFIG_SOUND if [ "$CONFIG_SOUND_MSNDCLAS" = "y" -o "$CONFIG_SOUND_MSNDCLAS" = "m" ]; then if [ "$CONFIG_SOUND_MSNDCLAS" = "y" ]; then @@ -305,6 +309,7 @@ fi dep_tristate 'NM256AV/NM256ZX audio support' CONFIG_SOUND_NM256 $CONFIG_SOUND_OSS + dep_tristate 'Yamaha PCI legacy mode support' CONFIG_SOUND_YMPCI $CONFIG_SOUND_OSS # Additional low level drivers. diff -urN v2.2.15/linux/drivers/sound/Hwmcode.h linux/drivers/sound/Hwmcode.h --- v2.2.15/linux/drivers/sound/Hwmcode.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/sound/Hwmcode.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,804 @@ +//============================================================================= +// Copyright (c) 1997 Yamaha Corporation. All Rights Reserved. +// +// Title: +// hwmcode.c +// Desc: +// micro-code for CTRL & DSP +// HISTORY: +// April 03, 1997: 1st try by M. Mukojima +//============================================================================= +#define YDSXG_DSPLENGTH 0x0080 +#define YDSXG_CTRLLENGTH 0x3000 + + +static unsigned long int gdwDSPCode[YDSXG_DSPLENGTH >> 2] = { + 0x00000081, 0x000001a4, 0x0000000a, 0x0000002f, + 0x00080253, 0x01800317, 0x0000407b, 0x0000843f, + 0x0001483c, 0x0001943c, 0x0005d83c, 0x00001c3c, + 0x0000c07b, 0x00050c3f, 0x0121503c, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + + +// -------------------------------------------- +// DS-1E Controller InstructionRAM Code +// 1999/06/21 +// Buf441 slot is Enabled. +// -------------------------------------------- +// 04/09@creat +// 04/12 stop nise fix +// 06/21@WorkingOff timming +static unsigned long gdwCtrl1eCode[YDSXG_CTRLLENGTH >> 2] = { + 0x000007, 0x240007, 0x0C0007, 0x1C0007, + 0x060007, 0x700002, 0x000020, 0x030040, + 0x007104, 0x004286, 0x030040, 0x000F0D, + 0x000810, 0x20043A, 0x000282, 0x00020D, + 0x000810, 0x20043A, 0x001282, 0x200E82, + 0x00800D, 0x000810, 0x20043A, 0x001A82, + 0x03460D, 0x000810, 0x10043A, 0x02EC0D, + 0x000810, 0x18043A, 0x00010D, 0x020015, + 0x0000FD, 0x000020, 0x038860, 0x039060, + 0x038060, 0x038040, 0x038040, 0x038040, + 0x018040, 0x000A7D, 0x038040, 0x038040, + 0x018040, 0x200402, 0x000882, 0x08001A, + 0x000904, 0x017186, 0x000007, 0x260007, + 0x400007, 0x000007, 0x03258D, 0x000810, + 0x18043A, 0x260007, 0x284402, 0x00087D, + 0x018042, 0x00160A, 0x05A206, 0x000007, + 0x440007, 0x00230D, 0x000810, 0x08043A, + 0x22FA06, 0x000007, 0x0007FD, 0x018042, + 0x08000A, 0x000904, 0x02AB86, 0x000195, + 0x090D04, 0x000007, 0x000820, 0x0000F5, + 0x000B7D, 0x01F060, 0x0000FD, 0x033A06, + 0x018040, 0x000A7D, 0x038042, 0x13804A, + 0x18000A, 0x001820, 0x059060, 0x058860, + 0x018040, 0x0000FD, 0x018042, 0x70000A, + 0x000115, 0x071144, 0x033B86, 0x030000, + 0x007020, 0x036206, 0x018040, 0x00360D, + 0x000810, 0x08043A, 0x232206, 0x000007, + 0x02EC0D, 0x000810, 0x18043A, 0x019A06, + 0x000007, 0x240007, 0x000F8D, 0x000810, + 0x00163A, 0x002402, 0x005C02, 0x0028FD, + 0x000020, 0x018040, 0x08000D, 0x000815, + 0x510984, 0x000007, 0x00004D, 0x000E5D, + 0x000E02, 0x00430D, 0x000810, 0x08043A, + 0x2E1206, 0x000007, 0x00008D, 0x000924, + 0x000F02, 0x00470D, 0x000810, 0x08043A, + 0x2E1206, 0x000007, 0x480480, 0x001210, + 0x28043A, 0x00778D, 0x000810, 0x280C3A, + 0x00068D, 0x000810, 0x28143A, 0x284402, + 0x03258D, 0x000810, 0x18043A, 0x07FF8D, + 0x000820, 0x0002FD, 0x018040, 0x260007, + 0x200007, 0x0002FD, 0x018042, 0x08000A, + 0x000904, 0x051286, 0x000007, 0x240007, + 0x02EC0D, 0x000810, 0x18043A, 0x00387D, + 0x018042, 0x08000A, 0x001015, 0x010984, + 0x019B86, 0x000007, 0x01B206, 0x000007, + 0x0008FD, 0x018042, 0x18000A, 0x001904, + 0x22B886, 0x280007, 0x001810, 0x28043A, + 0x280C02, 0x00000D, 0x000810, 0x28143A, + 0x08808D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00020D, 0x189904, 0x000007, + 0x00402D, 0x0000BD, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x065A86, 0x000007, + 0x000100, 0x000A20, 0x00047D, 0x018040, + 0x018042, 0x20000A, 0x003015, 0x012144, + 0x036186, 0x000007, 0x002104, 0x036186, + 0x000007, 0x000F8D, 0x000810, 0x280C3A, + 0x023944, 0x07C986, 0x000007, 0x001810, + 0x28043A, 0x08810D, 0x000820, 0x0002FD, + 0x018040, 0x200007, 0x002810, 0x78003A, + 0x00788D, 0x000810, 0x08043A, 0x2A1206, + 0x000007, 0x00400D, 0x001015, 0x189904, + 0x292904, 0x393904, 0x000007, 0x070206, + 0x000007, 0x0004F5, 0x00007D, 0x000020, + 0x00008D, 0x010860, 0x018040, 0x00047D, + 0x038042, 0x21804A, 0x18000A, 0x021944, + 0x229086, 0x000007, 0x004075, 0x71F104, + 0x000007, 0x010042, 0x28000A, 0x002904, + 0x225886, 0x000007, 0x003C0D, 0x30A904, + 0x000007, 0x00077D, 0x018042, 0x08000A, + 0x000904, 0x08DA86, 0x00057D, 0x002820, + 0x03B060, 0x08F206, 0x018040, 0x003020, + 0x03A860, 0x018040, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x08FA86, 0x000007, + 0x00057D, 0x018042, 0x28040A, 0x000E8D, + 0x000810, 0x280C3A, 0x00000D, 0x000810, + 0x28143A, 0x09000D, 0x000820, 0x0002FD, + 0x018040, 0x200007, 0x003DFD, 0x000020, + 0x018040, 0x00107D, 0x009D8D, 0x000810, + 0x08043A, 0x2A1206, 0x000007, 0x000815, + 0x08001A, 0x010984, 0x0A5186, 0x00137D, + 0x200500, 0x280F20, 0x338F60, 0x3B8F60, + 0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60, + 0x038A60, 0x018040, 0x00107D, 0x018042, + 0x08000A, 0x000215, 0x010984, 0x3A8186, + 0x000007, 0x007FBD, 0x383DC4, 0x000007, + 0x001A7D, 0x001375, 0x018042, 0x09004A, + 0x10000A, 0x0B8D04, 0x139504, 0x000007, + 0x000820, 0x019060, 0x001104, 0x225886, + 0x010040, 0x0017FD, 0x018042, 0x08000A, + 0x000904, 0x225A86, 0x000007, 0x00197D, + 0x038042, 0x09804A, 0x10000A, 0x000924, + 0x001664, 0x0011FD, 0x038042, 0x2B804A, + 0x19804A, 0x00008D, 0x218944, 0x000007, + 0x002244, 0x0C1986, 0x000007, 0x001A64, + 0x002A24, 0x00197D, 0x080102, 0x100122, + 0x000820, 0x039060, 0x018040, 0x003DFD, + 0x00008D, 0x000820, 0x018040, 0x001375, + 0x001A7D, 0x010042, 0x09804A, 0x10000A, + 0x00021D, 0x0189E4, 0x2992E4, 0x309144, + 0x000007, 0x00060D, 0x000A15, 0x000C1D, + 0x001025, 0x00A9E4, 0x012BE4, 0x000464, + 0x01B3E4, 0x0232E4, 0x000464, 0x000464, + 0x000464, 0x000464, 0x00040D, 0x08B1C4, + 0x000007, 0x000820, 0x000BF5, 0x030040, + 0x00197D, 0x038042, 0x09804A, 0x000A24, + 0x08000A, 0x080E64, 0x000007, 0x100122, + 0x000820, 0x031060, 0x010040, 0x0064AC, + 0x00027D, 0x000020, 0x018040, 0x00107D, + 0x018042, 0x0011FD, 0x3B804A, 0x09804A, + 0x20000A, 0x000095, 0x1A1144, 0x00A144, + 0x0E5886, 0x00040D, 0x00B984, 0x0E5986, + 0x0018FD, 0x018042, 0x0010FD, 0x09804A, + 0x28000A, 0x000095, 0x010924, 0x002A64, + 0x0E4986, 0x000007, 0x002904, 0x0E5A86, + 0x000007, 0x0E6206, 0x080002, 0x00008D, + 0x00387D, 0x000820, 0x018040, 0x00127D, + 0x018042, 0x10000A, 0x003904, 0x0F0986, + 0x00080D, 0x7FFFB5, 0x00B984, 0x0ED986, + 0x000025, 0x0FB206, 0x00002D, 0x000015, + 0x00082D, 0x02E00D, 0x000820, 0x0FFA06, + 0x00000D, 0x7F8035, 0x00B984, 0x0FA986, + 0x400025, 0x00008D, 0x110944, 0x000007, + 0x00018D, 0x109504, 0x000007, 0x009164, + 0x000424, 0x000424, 0x000424, 0x100102, + 0x280002, 0x02DF0D, 0x000820, 0x0FFA06, + 0x00018D, 0x00042D, 0x00008D, 0x109504, + 0x000007, 0x00020D, 0x109184, 0x000007, + 0x02DF8D, 0x000820, 0x00008D, 0x0038FD, + 0x018040, 0x003BFD, 0x001020, 0x03A860, + 0x000815, 0x313184, 0x212184, 0x000007, + 0x03B060, 0x03A060, 0x018040, 0x0022FD, + 0x000095, 0x010924, 0x000424, 0x000424, + 0x001264, 0x100102, 0x000820, 0x039060, + 0x018040, 0x001924, 0x010F0D, 0x00397D, + 0x000820, 0x058040, 0x038042, 0x09844A, + 0x000606, 0x08040A, 0x000424, 0x000424, + 0x00117D, 0x018042, 0x08000A, 0x000A24, + 0x280502, 0x280C02, 0x09800D, 0x000820, + 0x0002FD, 0x018040, 0x200007, 0x0022FD, + 0x018042, 0x08000A, 0x000095, 0x280DC4, + 0x011924, 0x00197D, 0x018042, 0x0011FD, + 0x09804A, 0x10000A, 0x0000B5, 0x113144, + 0x0A8D04, 0x000007, 0x080A44, 0x129504, + 0x000007, 0x0023FD, 0x001020, 0x038040, + 0x101244, 0x000007, 0x000820, 0x039060, + 0x018040, 0x0002FD, 0x018042, 0x08000A, + 0x000904, 0x123286, 0x000007, 0x003BFD, + 0x000100, 0x000A10, 0x0B807A, 0x13804A, + 0x090984, 0x000007, 0x000095, 0x013D04, + 0x12B886, 0x10000A, 0x100002, 0x090984, + 0x000007, 0x038042, 0x11804A, 0x090D04, + 0x000007, 0x10000A, 0x090D84, 0x000007, + 0x00257D, 0x000820, 0x018040, 0x00010D, + 0x000810, 0x28143A, 0x00127D, 0x018042, + 0x20000A, 0x00197D, 0x018042, 0x00117D, + 0x31804A, 0x10000A, 0x003124, 0x013B8D, + 0x00397D, 0x000820, 0x058040, 0x038042, + 0x09844A, 0x000606, 0x08040A, 0x300102, + 0x003124, 0x000424, 0x000424, 0x001224, + 0x280502, 0x001A4C, 0x143986, 0x700002, + 0x00002D, 0x030000, 0x00387D, 0x018042, + 0x10000A, 0x146206, 0x002124, 0x0000AD, + 0x100002, 0x00010D, 0x000924, 0x006B24, + 0x014A0D, 0x00397D, 0x000820, 0x058040, + 0x038042, 0x09844A, 0x000606, 0x08040A, + 0x003264, 0x00008D, 0x000A24, 0x001020, + 0x00227D, 0x018040, 0x014F8D, 0x000810, + 0x08043A, 0x2B5A06, 0x000007, 0x002820, + 0x00207D, 0x018040, 0x00117D, 0x038042, + 0x13804A, 0x33800A, 0x00387D, 0x018042, + 0x08000A, 0x000904, 0x177286, 0x000007, + 0x00008D, 0x030964, 0x015B0D, 0x00397D, + 0x000820, 0x058040, 0x038042, 0x09844A, + 0x000606, 0x08040A, 0x380102, 0x000424, + 0x000424, 0x001224, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x15DA86, 0x000007, + 0x280502, 0x001A4C, 0x177186, 0x000007, + 0x032164, 0x00632C, 0x003DFD, 0x018042, + 0x08000A, 0x000095, 0x090904, 0x000007, + 0x000820, 0x001A4C, 0x169986, 0x018040, + 0x030000, 0x16B206, 0x002124, 0x00010D, + 0x000924, 0x006B24, 0x016F0D, 0x00397D, + 0x000820, 0x058040, 0x038042, 0x09844A, + 0x000606, 0x08040A, 0x003A64, 0x000095, + 0x001224, 0x0002FD, 0x018042, 0x08000A, + 0x000904, 0x171286, 0x000007, 0x01760D, + 0x000810, 0x08043A, 0x2B5A06, 0x000007, + 0x160A06, 0x000007, 0x007020, 0x08010A, + 0x10012A, 0x0020FD, 0x038860, 0x039060, + 0x018040, 0x00227D, 0x018042, 0x003DFD, + 0x08000A, 0x31844A, 0x000904, 0x181086, + 0x18008B, 0x00008D, 0x189904, 0x00312C, + 0x18E206, 0x000007, 0x00324C, 0x186B86, + 0x000007, 0x001904, 0x186886, 0x000007, + 0x000095, 0x199144, 0x00222C, 0x003124, + 0x00636C, 0x000E3D, 0x001375, 0x000BFD, + 0x010042, 0x09804A, 0x10000A, 0x038AEC, + 0x0393EC, 0x00224C, 0x18E186, 0x000007, + 0x00008D, 0x189904, 0x00226C, 0x00322C, + 0x30050A, 0x301DAB, 0x002083, 0x0018FD, + 0x018042, 0x08000A, 0x018924, 0x300502, + 0x001083, 0x001875, 0x010042, 0x10000A, + 0x00008D, 0x010924, 0x001375, 0x330542, + 0x330CCB, 0x332CCB, 0x3334CB, 0x333CCB, + 0x3344CB, 0x334CCB, 0x3354CB, 0x305C8B, + 0x006083, 0x0002F5, 0x010042, 0x08000A, + 0x000904, 0x19B286, 0x000007, 0x001E2D, + 0x0005FD, 0x018042, 0x08000A, 0x028924, + 0x280502, 0x00060D, 0x000810, 0x280C3A, + 0x00008D, 0x000810, 0x28143A, 0x0A808D, + 0x000820, 0x0002F5, 0x010040, 0x220007, + 0x001275, 0x030042, 0x21004A, 0x00008D, + 0x1A0944, 0x000007, 0x01AB8D, 0x000810, + 0x08043A, 0x2CAA06, 0x000007, 0x0001F5, + 0x030042, 0x0D004A, 0x10000A, 0x089144, + 0x000007, 0x000820, 0x010040, 0x0025F5, + 0x0A3144, 0x000007, 0x000820, 0x032860, + 0x030040, 0x00217D, 0x038042, 0x0B804A, + 0x10000A, 0x000820, 0x031060, 0x030040, + 0x00008D, 0x000124, 0x00012C, 0x000E64, + 0x001A64, 0x00636C, 0x08010A, 0x10012A, + 0x000820, 0x031060, 0x030040, 0x0020FD, + 0x018042, 0x08000A, 0x00227D, 0x018042, + 0x10000A, 0x000820, 0x031060, 0x030040, + 0x00197D, 0x018042, 0x08000A, 0x0022FD, + 0x038042, 0x10000A, 0x000820, 0x031060, + 0x030040, 0x090D04, 0x000007, 0x000820, + 0x030040, 0x038042, 0x0B804A, 0x10000A, + 0x000820, 0x031060, 0x030040, 0x038042, + 0x13804A, 0x19804A, 0x110D04, 0x198D04, + 0x000007, 0x08000A, 0x001020, 0x031860, + 0x030860, 0x030040, 0x00008D, 0x0B0944, + 0x000007, 0x000820, 0x010040, 0x0005F5, + 0x030042, 0x08000A, 0x000820, 0x010040, + 0x0000F5, 0x010042, 0x08000A, 0x000904, + 0x1D9886, 0x001E75, 0x030042, 0x01044A, + 0x000C0A, 0x1DAA06, 0x000007, 0x000402, + 0x000C02, 0x00177D, 0x001AF5, 0x018042, + 0x03144A, 0x031C4A, 0x03244A, 0x032C4A, + 0x03344A, 0x033C4A, 0x03444A, 0x004C0A, + 0x00043D, 0x0013F5, 0x001AFD, 0x030042, + 0x0B004A, 0x1B804A, 0x13804A, 0x20000A, + 0x089144, 0x19A144, 0x0389E4, 0x0399EC, + 0x005502, 0x005D0A, 0x030042, 0x0B004A, + 0x1B804A, 0x13804A, 0x20000A, 0x089144, + 0x19A144, 0x0389E4, 0x0399EC, 0x006502, + 0x006D0A, 0x030042, 0x0B004A, 0x19004A, + 0x2B804A, 0x13804A, 0x21804A, 0x30000A, + 0x089144, 0x19A144, 0x2AB144, 0x0389E4, + 0x0399EC, 0x007502, 0x007D0A, 0x03A9E4, + 0x000702, 0x00107D, 0x000415, 0x018042, + 0x08000A, 0x0109E4, 0x000F02, 0x002AF5, + 0x0019FD, 0x010042, 0x09804A, 0x10000A, + 0x000934, 0x001674, 0x0029F5, 0x010042, + 0x10000A, 0x00917C, 0x002075, 0x010042, + 0x08000A, 0x000904, 0x200A86, 0x0026F5, + 0x0027F5, 0x030042, 0x09004A, 0x10000A, + 0x000A3C, 0x00167C, 0x001A75, 0x000BFD, + 0x010042, 0x51804A, 0x48000A, 0x160007, + 0x001075, 0x010042, 0x282C0A, 0x281D12, + 0x282512, 0x001F32, 0x1E0007, 0x0E0007, + 0x001975, 0x010042, 0x002DF5, 0x0D004A, + 0x10000A, 0x009144, 0x20EA86, 0x010042, + 0x28340A, 0x000E5D, 0x00008D, 0x000375, + 0x000820, 0x010040, 0x05D2F4, 0x54D104, + 0x00735C, 0x218B86, 0x000007, 0x0C0007, + 0x080007, 0x0A0007, 0x02178D, 0x000810, + 0x08043A, 0x34B206, 0x000007, 0x219206, + 0x000007, 0x080007, 0x002275, 0x010042, + 0x20000A, 0x002104, 0x225886, 0x001E2D, + 0x0002F5, 0x010042, 0x08000A, 0x000904, + 0x21CA86, 0x000007, 0x002010, 0x30043A, + 0x00057D, 0x0180C3, 0x08000A, 0x028924, + 0x280502, 0x280C02, 0x0A810D, 0x000820, + 0x0002F5, 0x010040, 0x220007, 0x0004FD, + 0x018042, 0x70000A, 0x030000, 0x007020, + 0x07FA06, 0x018040, 0x022B8D, 0x000810, + 0x08043A, 0x2CAA06, 0x000007, 0x0002FD, + 0x018042, 0x08000A, 0x000904, 0x22C286, + 0x000007, 0x020206, 0x000007, 0x000875, + 0x0009FD, 0x00010D, 0x234206, 0x000295, + 0x000B75, 0x00097D, 0x00000D, 0x000515, + 0x010042, 0x18000A, 0x001904, 0x2A0086, + 0x0006F5, 0x001020, 0x010040, 0x0004F5, + 0x000820, 0x010040, 0x000775, 0x010042, + 0x09804A, 0x10000A, 0x001124, 0x000904, + 0x23F286, 0x000815, 0x080102, 0x101204, + 0x241206, 0x000575, 0x081204, 0x000007, + 0x100102, 0x000575, 0x000425, 0x021124, + 0x100102, 0x000820, 0x031060, 0x010040, + 0x001924, 0x2A0086, 0x00008D, 0x000464, + 0x009D04, 0x291086, 0x180102, 0x000575, + 0x010042, 0x28040A, 0x00018D, 0x000924, + 0x280D02, 0x00000D, 0x000924, 0x281502, + 0x10000D, 0x000820, 0x0002F5, 0x010040, + 0x200007, 0x001175, 0x0002FD, 0x018042, + 0x08000A, 0x000904, 0x24FA86, 0x000007, + 0x000100, 0x080B20, 0x130B60, 0x1B0B60, + 0x030A60, 0x010040, 0x050042, 0x3D004A, + 0x35004A, 0x2D004A, 0x20000A, 0x0006F5, + 0x010042, 0x28140A, 0x0004F5, 0x010042, + 0x08000A, 0x000315, 0x010D04, 0x260286, + 0x004015, 0x000095, 0x010D04, 0x25F086, + 0x100022, 0x10002A, 0x261A06, 0x000007, + 0x333104, 0x2AA904, 0x000007, 0x032124, + 0x280502, 0x284402, 0x001124, 0x400102, + 0x000424, 0x000424, 0x003224, 0x00292C, + 0x00636C, 0x277386, 0x000007, 0x02B164, + 0x000464, 0x000464, 0x00008D, 0x000A64, + 0x280D02, 0x10008D, 0x000820, 0x0002F5, + 0x010040, 0x220007, 0x00008D, 0x38B904, + 0x000007, 0x03296C, 0x30010A, 0x0002F5, + 0x010042, 0x08000A, 0x000904, 0x270286, + 0x000007, 0x00212C, 0x28050A, 0x00316C, + 0x00046C, 0x00046C, 0x28450A, 0x001124, + 0x006B64, 0x100102, 0x00008D, 0x01096C, + 0x280D0A, 0x10010D, 0x000820, 0x0002F5, + 0x010040, 0x220007, 0x004124, 0x000424, + 0x000424, 0x003224, 0x300102, 0x032944, + 0x27FA86, 0x000007, 0x300002, 0x0004F5, + 0x010042, 0x08000A, 0x000315, 0x010D04, + 0x284086, 0x003124, 0x000464, 0x300102, + 0x0002F5, 0x010042, 0x08000A, 0x000904, + 0x284A86, 0x000007, 0x284402, 0x003124, + 0x300502, 0x003924, 0x300583, 0x000883, + 0x0005F5, 0x010042, 0x28040A, 0x00008D, + 0x008124, 0x280D02, 0x00008D, 0x008124, + 0x281502, 0x10018D, 0x000820, 0x0002F5, + 0x010040, 0x220007, 0x001025, 0x000575, + 0x030042, 0x09004A, 0x10000A, 0x0A0904, + 0x121104, 0x000007, 0x001020, 0x050860, + 0x050040, 0x0006FD, 0x018042, 0x09004A, + 0x10000A, 0x0000A5, 0x0A0904, 0x121104, + 0x000007, 0x000820, 0x019060, 0x010040, + 0x0002F5, 0x010042, 0x08000A, 0x000904, + 0x29CA86, 0x000007, 0x244206, 0x000007, + 0x000606, 0x000007, 0x0002F5, 0x010042, + 0x08000A, 0x000904, 0x2A1A86, 0x000007, + 0x000100, 0x080B20, 0x138B60, 0x1B8B60, + 0x238B60, 0x2B8B60, 0x338B60, 0x3B8B60, + 0x438B60, 0x4B8B60, 0x538B60, 0x5B8B60, + 0x638B60, 0x6B8B60, 0x738B60, 0x7B8B60, + 0x038F60, 0x0B8F60, 0x138F60, 0x1B8F60, + 0x238F60, 0x2B8F60, 0x338F60, 0x3B8F60, + 0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60, + 0x638F60, 0x6B8F60, 0x738F60, 0x7B8F60, + 0x038A60, 0x000606, 0x018040, 0x00008D, + 0x000A64, 0x280D02, 0x000A24, 0x00027D, + 0x018042, 0x10000A, 0x001224, 0x0003FD, + 0x018042, 0x08000A, 0x000904, 0x2C0A86, + 0x000007, 0x00018D, 0x000A24, 0x000464, + 0x000464, 0x080102, 0x000924, 0x000424, + 0x000424, 0x100102, 0x02000D, 0x009144, + 0x2C6186, 0x000007, 0x0001FD, 0x018042, + 0x08000A, 0x000A44, 0x2C4386, 0x018042, + 0x0A000D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00027D, 0x001020, 0x000606, + 0x018040, 0x0002F5, 0x010042, 0x08000A, + 0x000904, 0x2CB286, 0x000007, 0x00037D, + 0x018042, 0x08000A, 0x000904, 0x2CE286, + 0x000007, 0x000075, 0x002E7D, 0x010042, + 0x0B804A, 0x000020, 0x000904, 0x000686, + 0x010040, 0x31844A, 0x30048B, 0x000883, + 0x00008D, 0x000810, 0x28143A, 0x00008D, + 0x000810, 0x280C3A, 0x000675, 0x010042, + 0x08000A, 0x003815, 0x010924, 0x280502, + 0x0B000D, 0x000820, 0x0002F5, 0x010040, + 0x000606, 0x220007, 0x000464, 0x000464, + 0x000606, 0x000007, 0x000134, 0x007F8D, + 0x00093C, 0x281D12, 0x282512, 0x001F32, + 0x0E0007, 0x00010D, 0x00037D, 0x000820, + 0x018040, 0x05D2F4, 0x000007, 0x080007, + 0x00037D, 0x018042, 0x08000A, 0x000904, + 0x2E8A86, 0x000007, 0x000606, 0x000007, + 0x000007, 0x000012, 0x100007, 0x320007, + 0x600007, 0x460007, 0x100080, 0x48001A, + 0x004904, 0x2EF186, 0x000007, 0x001210, + 0x58003A, 0x000145, 0x5C5D04, 0x000007, + 0x000080, 0x48001A, 0x004904, 0x2F4186, + 0x000007, 0x001210, 0x50003A, 0x005904, + 0x2F9886, 0x000045, 0x0000C5, 0x7FFFF5, + 0x7FFF7D, 0x07D524, 0x004224, 0x500102, + 0x200502, 0x000082, 0x40001A, 0x004104, + 0x2FC986, 0x000007, 0x003865, 0x40001A, + 0x004020, 0x00104D, 0x04C184, 0x31AB86, + 0x000040, 0x040007, 0x000165, 0x000145, + 0x004020, 0x000040, 0x000765, 0x080080, + 0x40001A, 0x004104, 0x305986, 0x000007, + 0x001210, 0x40003A, 0x004104, 0x30B286, + 0x00004D, 0x0000CD, 0x004810, 0x20043A, + 0x000882, 0x40001A, 0x004104, 0x30C186, + 0x000007, 0x004820, 0x005904, 0x319886, + 0x000040, 0x0007E5, 0x200480, 0x2816A0, + 0x3216E0, 0x3A16E0, 0x4216E0, 0x021260, + 0x000040, 0x000032, 0x400075, 0x00007D, + 0x07D574, 0x200512, 0x000082, 0x40001A, + 0x004104, 0x317186, 0x000007, 0x038A06, + 0x640007, 0x0000E5, 0x000020, 0x000040, + 0x000A65, 0x000020, 0x020040, 0x020040, + 0x000040, 0x000165, 0x000042, 0x70000A, + 0x007104, 0x323286, 0x000007, 0x060007, + 0x019A06, 0x640007, 0x050000, 0x007020, + 0x000040, 0x038A06, 0x640007, 0x000007, + 0x00306D, 0x028860, 0x029060, 0x08000A, + 0x028860, 0x008040, 0x100012, 0x00100D, + 0x009184, 0x32D186, 0x000E0D, 0x009184, + 0x33E186, 0x000007, 0x300007, 0x001020, + 0x003B6D, 0x008040, 0x000080, 0x08001A, + 0x000904, 0x32F186, 0x000007, 0x001220, + 0x000DED, 0x008040, 0x008042, 0x10000A, + 0x40000D, 0x109544, 0x000007, 0x001020, + 0x000DED, 0x008040, 0x008042, 0x20040A, + 0x000082, 0x08001A, 0x000904, 0x338186, + 0x000007, 0x003B6D, 0x008042, 0x08000A, + 0x000E15, 0x010984, 0x342B86, 0x600007, + 0x08001A, 0x000C15, 0x010984, 0x341386, + 0x000020, 0x1A0007, 0x0002ED, 0x008040, + 0x620007, 0x00306D, 0x028042, 0x0A804A, + 0x000820, 0x0A804A, 0x000606, 0x10804A, + 0x000007, 0x282512, 0x001F32, 0x05D2F4, + 0x54D104, 0x00735C, 0x000786, 0x000007, + 0x0C0007, 0x0A0007, 0x1C0007, 0x003465, + 0x020040, 0x004820, 0x025060, 0x40000A, + 0x024060, 0x000040, 0x454944, 0x000007, + 0x004020, 0x003AE5, 0x000040, 0x0028E5, + 0x000042, 0x48000A, 0x004904, 0x39F886, + 0x002C65, 0x000042, 0x40000A, 0x0000D5, + 0x454104, 0x000007, 0x000655, 0x054504, + 0x368286, 0x0001D5, 0x054504, 0x368086, + 0x002B65, 0x000042, 0x003AE5, 0x50004A, + 0x40000A, 0x45C3D4, 0x000007, 0x454504, + 0x000007, 0x0000CD, 0x444944, 0x000007, + 0x454504, 0x000007, 0x00014D, 0x554944, + 0x000007, 0x045144, 0x367986, 0x002C65, + 0x000042, 0x48000A, 0x4CD104, 0x000007, + 0x04C144, 0x368386, 0x000007, 0x160007, + 0x002CE5, 0x040042, 0x40000A, 0x004020, + 0x000040, 0x002965, 0x000042, 0x40000A, + 0x004104, 0x36F086, 0x000007, 0x002402, + 0x383206, 0x005C02, 0x0025E5, 0x000042, + 0x40000A, 0x004274, 0x002AE5, 0x000042, + 0x40000A, 0x004274, 0x500112, 0x0029E5, + 0x000042, 0x40000A, 0x004234, 0x454104, + 0x000007, 0x004020, 0x000040, 0x003EE5, + 0x000020, 0x000040, 0x002DE5, 0x400152, + 0x50000A, 0x045144, 0x37DA86, 0x0000C5, + 0x003EE5, 0x004020, 0x000040, 0x002BE5, + 0x000042, 0x40000A, 0x404254, 0x000007, + 0x002AE5, 0x004020, 0x000040, 0x500132, + 0x040134, 0x005674, 0x0029E5, 0x020042, + 0x42000A, 0x000042, 0x50000A, 0x05417C, + 0x0028E5, 0x000042, 0x48000A, 0x0000C5, + 0x4CC144, 0x38A086, 0x0026E5, 0x0027E5, + 0x020042, 0x40004A, 0x50000A, 0x00423C, + 0x00567C, 0x0028E5, 0x004820, 0x000040, + 0x281D12, 0x282512, 0x001F72, 0x002965, + 0x000042, 0x40000A, 0x004104, 0x393A86, + 0x0E0007, 0x160007, 0x1E0007, 0x003EE5, + 0x000042, 0x40000A, 0x004104, 0x397886, + 0x002D65, 0x000042, 0x28340A, 0x003465, + 0x020042, 0x42004A, 0x004020, 0x4A004A, + 0x50004A, 0x05D2F4, 0x54D104, 0x00735C, + 0x39E186, 0x000007, 0x000606, 0x080007, + 0x0C0007, 0x080007, 0x0A0007, 0x0001E5, + 0x020045, 0x004020, 0x000060, 0x000365, + 0x000040, 0x002E65, 0x001A20, 0x0A1A60, + 0x000040, 0x003465, 0x020042, 0x42004A, + 0x004020, 0x4A004A, 0x000606, 0x50004A, + 0x0017FD, 0x018042, 0x08000A, 0x000904, + 0x225A86, 0x000007, 0x00107D, 0x018042, + 0x0011FD, 0x33804A, 0x19804A, 0x20000A, + 0x000095, 0x2A1144, 0x01A144, 0x3B9086, + 0x00040D, 0x00B184, 0x3B9186, 0x0018FD, + 0x018042, 0x0010FD, 0x09804A, 0x38000A, + 0x000095, 0x010924, 0x003A64, 0x3B8186, + 0x000007, 0x003904, 0x3B9286, 0x000007, + 0x3B9A06, 0x00000D, 0x00008D, 0x000820, + 0x00387D, 0x018040, 0x700002, 0x00117D, + 0x018042, 0x00197D, 0x29804A, 0x30000A, + 0x380002, 0x003124, 0x000424, 0x000424, + 0x002A24, 0x280502, 0x00068D, 0x000810, + 0x28143A, 0x00750D, 0x00B124, 0x002264, + 0x3D0386, 0x284402, 0x000810, 0x280C3A, + 0x0B800D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00758D, 0x00B124, 0x100102, + 0x012144, 0x3E4986, 0x001810, 0x10003A, + 0x00387D, 0x018042, 0x08000A, 0x000904, + 0x3E4886, 0x030000, 0x3E4A06, 0x0000BD, + 0x00008D, 0x023164, 0x000A64, 0x280D02, + 0x0B808D, 0x000820, 0x0002FD, 0x018040, + 0x200007, 0x00387D, 0x018042, 0x08000A, + 0x000904, 0x3E3286, 0x030000, 0x0002FD, + 0x018042, 0x08000A, 0x000904, 0x3D8286, + 0x000007, 0x002810, 0x28043A, 0x00750D, + 0x030924, 0x002264, 0x280D02, 0x02316C, + 0x28450A, 0x0B810D, 0x000820, 0x0002FD, + 0x018040, 0x200007, 0x00008D, 0x000A24, + 0x3E4A06, 0x100102, 0x001810, 0x10003A, + 0x0000BD, 0x003810, 0x30043A, 0x00187D, + 0x018042, 0x0018FD, 0x09804A, 0x20000A, + 0x0000AD, 0x028924, 0x07212C, 0x001010, + 0x300583, 0x300D8B, 0x3014BB, 0x301C83, + 0x002083, 0x00137D, 0x038042, 0x33844A, + 0x33ACCB, 0x33B4CB, 0x33BCCB, 0x33C4CB, + 0x33CCCB, 0x33D4CB, 0x305C8B, 0x006083, + 0x001E0D, 0x0005FD, 0x018042, 0x20000A, + 0x020924, 0x00068D, 0x00A96C, 0x00009D, + 0x0002FD, 0x018042, 0x08000A, 0x000904, + 0x3F6A86, 0x000007, 0x280502, 0x280D0A, + 0x284402, 0x001810, 0x28143A, 0x0C008D, + 0x000820, 0x0002FD, 0x018040, 0x220007, + 0x003904, 0x225886, 0x001E0D, 0x00057D, + 0x018042, 0x20000A, 0x020924, 0x0000A5, + 0x0002FD, 0x018042, 0x08000A, 0x000904, + 0x402A86, 0x000007, 0x280502, 0x280C02, + 0x002010, 0x28143A, 0x0C010D, 0x000820, + 0x0002FD, 0x018040, 0x225A06, 0x220007, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000, + 0x000000, 0x000000, 0x000000, 0x000000 +}; diff -urN v2.2.15/linux/drivers/sound/Makefile linux/drivers/sound/Makefile --- v2.2.15/linux/drivers/sound/Makefile Tue Jan 4 10:12:21 2000 +++ linux/drivers/sound/Makefile Wed Jun 7 14:26:43 2000 @@ -25,7 +25,7 @@ export-objs := ad1848.o audio_syms.o midi_syms.o mpu401.o \ msnd.o opl3.o sb_card.o sequencer_syms.o \ sound_core.o sound_syms.o uart401.o ad1816.o \ - nm256_audio.o + nm256_audio.o ac97_codec.o @@ -53,7 +53,8 @@ obj-$(CONFIG_SOUND_CS4232) += uart401.o obj-$(CONFIG_SOUND_GUS) += gus.o ad1848.o obj-$(CONFIG_SOUND_MAD16) += mad16.o ad1848.o sb.o uart401.o -obj-$(CONFIG_SOUND_VIA82CXXX) += via82cxxx.o sb.o uart401.o +obj-$(CONFIG_SOUND_VIA82CXXX) += via82cxxx.o sb.o uart401.o +obj-$(CONFIG_SOUND_YMPCI) += ymf_sb.o sb.o uart401.o ac97_codec.o obj-$(CONFIG_SOUND_MAUI) += maui.o mpu401.o obj-$(CONFIG_SOUND_MPU401) += mpu401.o obj-$(CONFIG_SOUND_MSNDCLAS) += msnd.o msnd_classic.o @@ -83,13 +84,15 @@ obj-$(CONFIG_SOUND_ES1370) += es1370.o obj-$(CONFIG_SOUND_ES1371) += es1371.o obj-$(CONFIG_SOUND_ESSSOLO1) += esssolo1.o +obj-$(CONFIG_SOUND_ICH) += i810_audio.o ac97_codec.o obj-$(CONFIG_SOUND_MAESTRO) += maestro.o obj-$(CONFIG_SOUND_SONICVIBES) += sonicvibes.o +obj-$(CONFIG_SOUND_TRIDENT) += trident.o ac97_codec.o # Declare multi-part drivers. list-multi := sound.o gus.o pas2.o sb.o softoss2.o vidc_mod.o \ - soundcore.o wavefront.o nm256.o + soundcore.o wavefront.o nm256.o via82cxxx.o \ sound-objs := \ dev_table.o soundcard.o sound_syms.o \ @@ -107,6 +110,7 @@ vidc_mod-objs := vidc.o vidc_audio.o vidc_fill.o vidc_mixer.o vidc_synth.o wavefront-objs := wavfront.o wf_midi.o yss225.o nm256-objs := nm256_audio.o ac97.o +via82cxxx-objs := via82cxxx_audio.o ac97.o # Extract lists of the multi-part drivers. @@ -194,6 +198,9 @@ nm256.o: $(nm256-objs) $(LD) -r -o $@ $(nm256-objs) + +via82cxxx.o: $(via82cxxx-objs) + $(LD) -r -o $@ $(via82cxxx-objs) # Firmware files that need translation # diff -urN v2.2.15/linux/drivers/sound/ac97_codec.c linux/drivers/sound/ac97_codec.c --- v2.2.15/linux/drivers/sound/ac97_codec.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/sound/ac97_codec.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,634 @@ +/* + * ac97_codec.c: Generic AC97 mixer/modem module + * + * Derived from ac97 mixer in maestro and trident driver. + * + * Copyright 2000 Silicon Integrated System Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * History + * v0.4 Mar 15 2000 Ollie Lho + * dual codecs support verified with 4 channels output + * v0.3 Feb 22 2000 Ollie Lho + * bug fix for record mask setting + * v0.2 Feb 10 2000 Ollie Lho + * add ac97_read_proc for /proc/driver/{vendor}/ac97 + * v0.1 Jan 14 2000 Ollie Lho + * Isolated from trident.c to support multiple ac97 codec + */ +#include +#include +#include +#include +#include +#include +#include +#include + +static int ac97_read_mixer(struct ac97_codec *codec, int oss_channel); +static void ac97_write_mixer(struct ac97_codec *codec, int oss_channel, + unsigned int left, unsigned int right); +static void ac97_set_mixer(struct ac97_codec *codec, unsigned int oss_mixer, unsigned int val ); +static int ac97_recmask_io(struct ac97_codec *codec, int rw, int mask); +static int ac97_mixer_ioctl(struct ac97_codec *codec, unsigned int cmd, unsigned long arg); + +static int ac97_init_mixer(struct ac97_codec *codec); + +static int sigmatel_init(struct ac97_codec *codec); + +#define arraysize(x) (sizeof(x)/sizeof((x)[0])) + +static struct { + unsigned int id; + char *name; + int (*init) (struct ac97_codec *codec); +} ac97_codec_ids[] = { + {0x414B4D00, "Asahi Kasei AK4540" , NULL}, + {0x41445340, "Analog Devices AD1881" , NULL}, + {0x43525900, "Cirrus Logic CS4297" , NULL}, + {0x43525903, "Cirrus Logic CS4297" , NULL}, + {0x43525913, "Cirrus Logic CS4297A" , NULL}, + {0x43525923, "Cirrus Logic CS4298" , NULL}, + {0x43525931, "Cirrus Logic CS4299" , NULL}, + {0x4e534331, "National Semiconductor LM4549" , NULL}, + {0x53494c22, "Silicon Laboratory Si3036" , NULL}, + {0x53494c23, "Silicon Laboratory Si3038" , NULL}, + {0x83847600, "SigmaTel STAC????" , NULL}, + {0x83847604, "SigmaTel STAC9701/3/4/5", NULL}, + {0x83847605, "SigmaTel STAC9704" , NULL}, + {0x83847608, "SigmaTel STAC9708" , NULL}, + {0x83847609, "SigmaTel STAC9721/23" , sigmatel_init}, + {0x54524106, "TriTech TR28026" , NULL}, + {0x54524108, "TriTech TR28028" , NULL}, + {0x574D4C00, "Wolfson WM9704" , NULL}, + {0x00000000, NULL, NULL} +}; + +static const char *ac97_stereo_enhancements[] = +{ + /* 0 */ "No 3D Stereo Enhancement", + /* 1 */ "Analog Devices Phat Stereo", + /* 2 */ "Creative Stereo Enhancement", + /* 3 */ "National Semi 3D Stereo Enhancement", + /* 4 */ "YAMAHA Ymersion", + /* 5 */ "BBE 3D Stereo Enhancement", + /* 6 */ "Crystal Semi 3D Stereo Enhancement", + /* 7 */ "Qsound QXpander", + /* 8 */ "Spatializer 3D Stereo Enhancement", + /* 9 */ "SRS 3D Stereo Enhancement", + /* 10 */ "Platform Tech 3D Stereo Enhancement", + /* 11 */ "AKM 3D Audio", + /* 12 */ "Aureal Stereo Enhancement", + /* 13 */ "Aztech 3D Enhancement", + /* 14 */ "Binaura 3D Audio Enhancement", + /* 15 */ "ESS Technology Stereo Enhancement", + /* 16 */ "Harman International VMAx", + /* 17 */ "Nvidea 3D Stereo Enhancement", + /* 18 */ "Philips Incredible Sound", + /* 19 */ "Texas Instruments 3D Stereo Enhancement", + /* 20 */ "VLSI Technology 3D Stereo Enhancement", + /* 21 */ "TriTech 3D Stereo Enhancement", + /* 22 */ "Realtek 3D Stereo Enhancement", + /* 23 */ "Samsung 3D Stereo Enhancement", + /* 24 */ "Wolfson Microelectronics 3D Enhancement", + /* 25 */ "Delta Integration 3D Enhancement", + /* 26 */ "SigmaTel 3D Enhancement", + /* 27 */ "Reserved 27", + /* 28 */ "Rockwell 3D Stereo Enhancement", + /* 29 */ "Reserved 29", + /* 30 */ "Reserved 30", + /* 31 */ "Reserved 31" +}; + +/* this table has default mixer values for all OSS mixers. */ +static struct mixer_defaults { + int mixer; + unsigned int value; +} mixer_defaults[SOUND_MIXER_NRDEVICES] = { + /* all values 0 -> 100 in bytes */ + {SOUND_MIXER_VOLUME, 0x3232}, + {SOUND_MIXER_BASS, 0x3232}, + {SOUND_MIXER_TREBLE, 0x3232}, + {SOUND_MIXER_PCM, 0x3232}, + {SOUND_MIXER_SPEAKER, 0x3232}, + {SOUND_MIXER_LINE, 0x3232}, + {SOUND_MIXER_MIC, 0x3232}, + {SOUND_MIXER_CD, 0x3232}, + {SOUND_MIXER_ALTPCM, 0x3232}, + {SOUND_MIXER_IGAIN, 0x3232}, + {SOUND_MIXER_LINE1, 0x3232}, + {SOUND_MIXER_PHONEIN, 0x3232}, + {SOUND_MIXER_PHONEOUT, 0x3232}, + {SOUND_MIXER_VIDEO, 0x3232}, + {-1,0} +}; + +/* table to scale scale from OSS mixer value to AC97 mixer register value */ +static struct ac97_mixer_hw { + unsigned char offset; + int scale; +} ac97_hw[SOUND_MIXER_NRDEVICES]= { + [SOUND_MIXER_VOLUME] = {AC97_MASTER_VOL_STEREO,63}, + [SOUND_MIXER_BASS] = {AC97_MASTER_TONE, 15}, + [SOUND_MIXER_TREBLE] = {AC97_MASTER_TONE, 15}, + [SOUND_MIXER_PCM] = {AC97_PCMOUT_VOL, 31}, + [SOUND_MIXER_SPEAKER] = {AC97_PCBEEP_VOL, 15}, + [SOUND_MIXER_LINE] = {AC97_LINEIN_VOL, 31}, + [SOUND_MIXER_MIC] = {AC97_MIC_VOL, 31}, + [SOUND_MIXER_CD] = {AC97_CD_VOL, 31}, + [SOUND_MIXER_ALTPCM] = {AC97_HEADPHONE_VOL, 63}, + [SOUND_MIXER_IGAIN] = {AC97_RECORD_GAIN, 31}, + [SOUND_MIXER_LINE1] = {AC97_AUX_VOL, 31}, + [SOUND_MIXER_PHONEIN] = {AC97_PHONE_VOL, 15}, + [SOUND_MIXER_PHONEOUT] = {AC97_MASTER_VOL_MONO, 63}, + [SOUND_MIXER_VIDEO] = {AC97_VIDEO_VOL, 31}, +}; + +/* the following tables allow us to go from OSS <-> ac97 quickly. */ +enum ac97_recsettings { + AC97_REC_MIC=0, + AC97_REC_CD, + AC97_REC_VIDEO, + AC97_REC_AUX, + AC97_REC_LINE, + AC97_REC_STEREO, /* combination of all enabled outputs.. */ + AC97_REC_MONO, /*.. or the mono equivalent */ + AC97_REC_PHONE +}; + +static unsigned int ac97_rm2oss[] = { + [AC97_REC_MIC] = SOUND_MIXER_MIC, + [AC97_REC_CD] = SOUND_MIXER_CD, + [AC97_REC_VIDEO] = SOUND_MIXER_VIDEO, + [AC97_REC_AUX] = SOUND_MIXER_LINE1, + [AC97_REC_LINE] = SOUND_MIXER_LINE, + [AC97_REC_STEREO]= SOUND_MIXER_IGAIN, + [AC97_REC_PHONE] = SOUND_MIXER_PHONEIN +}; + +/* indexed by bit position */ +static unsigned int ac97_oss_rm[] = { + [SOUND_MIXER_MIC] = AC97_REC_MIC, + [SOUND_MIXER_CD] = AC97_REC_CD, + [SOUND_MIXER_VIDEO] = AC97_REC_VIDEO, + [SOUND_MIXER_LINE1] = AC97_REC_AUX, + [SOUND_MIXER_LINE] = AC97_REC_LINE, + [SOUND_MIXER_IGAIN] = AC97_REC_STEREO, + [SOUND_MIXER_PHONEIN] = AC97_REC_PHONE +}; + +/* reads the given OSS mixer from the ac97 the caller must have insured that the ac97 knows + about that given mixer, and should be holding a spinlock for the card */ +static int ac97_read_mixer(struct ac97_codec *codec, int oss_channel) +{ + u16 val; + int ret = 0; + struct ac97_mixer_hw *mh = &ac97_hw[oss_channel]; + + val = codec->codec_read(codec , mh->offset); + + if (AC97_STEREO_MASK & (1 << oss_channel)) { + /* nice stereo mixers .. */ + int left,right; + + left = (val >> 8) & 0x7f; + right = val & 0x7f; + + if (oss_channel == SOUND_MIXER_IGAIN) { + right = (right * 100) / mh->scale; + left = (left * 100) / mh->scale; + } else { + right = 100 - ((right * 100) / mh->scale); + left = 100 - ((left * 100) / mh->scale); + } + ret = left | (right << 8); + } else if (oss_channel == SOUND_MIXER_SPEAKER) { + ret = 100 - ((((val & 0x1e)>>1) * 100) / mh->scale); + } else if (oss_channel == SOUND_MIXER_PHONEIN) { + ret = 100 - (((val & 0x1f) * 100) / mh->scale); + } else if (oss_channel == SOUND_MIXER_PHONEOUT) { + ret = 100 - (((val & 0x1f) * 100) / mh->scale); + } else if (oss_channel == SOUND_MIXER_MIC) { + ret = 100 - (((val & 0x1f) * 100) / mh->scale); + /* the low bit is optional in the tone sliders and masking + it lets us avoid the 0xf 'bypass'.. */ + } else if (oss_channel == SOUND_MIXER_BASS) { + ret = 100 - ((((val >> 8) & 0xe) * 100) / mh->scale); + } else if (oss_channel == SOUND_MIXER_TREBLE) { + ret = 100 - (((val & 0xe) * 100) / mh->scale); + } + +#ifdef DEBUG + printk("ac97_codec: read OSS mixer %2d (%s ac97 register 0x%02x), " + "0x%04x -> 0x%04x\n", + oss_channel, codec->id ? "Secondary" : "Primary", + mh->offset, val, ret); +#endif + + return ret; +} + +/* write the OSS encoded volume to the given OSS encoded mixer, again caller's job to + make sure all is well in arg land, call with spinlock held */ +static void ac97_write_mixer(struct ac97_codec *codec, int oss_channel, + unsigned int left, unsigned int right) +{ + u16 val = 0; + struct ac97_mixer_hw *mh = &ac97_hw[oss_channel]; + +#ifdef DEBUG + printk("ac97_codec: wrote OSS mixer %2d (%s ac97 register 0x%02x), " + "left vol:%2d, right vol:%2d:", + oss_channel, codec->id ? "Secondary" : "Primary", + mh->offset, left, right); +#endif + + if (AC97_STEREO_MASK & (1 << oss_channel)) { + /* stereo mixers */ + if (oss_channel == SOUND_MIXER_IGAIN) { + right = (right * mh->scale) / 100; + left = (left * mh->scale) / 100; + } else { + right = ((100 - right) * mh->scale) / 100; + left = ((100 - left) * mh->scale) / 100; + } + val = (left << 8) | right; + } else if (oss_channel == SOUND_MIXER_SPEAKER) { + val = (((100 - left) * mh->scale) / 100) << 1; + } else if (oss_channel == SOUND_MIXER_PHONEIN) { + val = (((100 - left) * mh->scale) / 100); + } else if (oss_channel == SOUND_MIXER_PHONEOUT) { + val = (((100 - left) * mh->scale) / 100); + } else if (oss_channel == SOUND_MIXER_MIC) { + val = codec->codec_read(codec , mh->offset) & ~0x801f; + val |= (((100 - left) * mh->scale) / 100); + /* the low bit is optional in the tone sliders and masking + it lets us avoid the 0xf 'bypass'.. */ + } else if (oss_channel == SOUND_MIXER_BASS) { + val = codec->codec_read(codec , mh->offset) & ~0x0f00; + val |= ((((100 - left) * mh->scale) / 100) << 8) & 0x0e00; + } else if (oss_channel == SOUND_MIXER_TREBLE) { + val = codec->codec_read(codec , mh->offset) & ~0x000f; + val |= (((100 - left) * mh->scale) / 100) & 0x000e; + } +#ifdef DEBUG + printk(" 0x%04x", val); +#endif + + codec->codec_write(codec, mh->offset, val); + +#ifdef DEBUG + val = codec->codec_read(codec, mh->offset); + printk(" -> 0x%04x\n", val); +#endif +} + +/* a thin wrapper for write_mixer */ +static void ac97_set_mixer(struct ac97_codec *codec, unsigned int oss_mixer, unsigned int val ) +{ + unsigned int left,right; + + /* cleanse input a little */ + right = ((val >> 8) & 0xff) ; + left = (val & 0xff) ; + + if (right > 100) right = 100; + if (left > 100) left = 100; + + codec->mixer_state[oss_mixer] = (right << 8) | left; + codec->write_mixer(codec, oss_mixer, left, right); +} + +/* read or write the recmask, the ac97 can really have left and right recording + inputs independantly set, but OSS doesn't seem to want us to express that to + the user. the caller guarantees that we have a supported bit set, and they + must be holding the card's spinlock */ +static int ac97_recmask_io(struct ac97_codec *codec, int rw, int mask) +{ + unsigned int val; + + if (rw) { + /* read it from the card */ + val = codec->codec_read(codec, AC97_RECORD_SELECT); +#ifdef DEBUG + printk("ac97_codec: ac97 recmask to set to 0x%04x\n", val); +#endif + return (1 << ac97_rm2oss[val & 0x07]); + } + + /* else, write the first set in the mask as the + output */ + /* clear out current set value first (AC97 supports only 1 input!) */ + val = (1 << ac97_rm2oss[codec->codec_read(codec, AC97_RECORD_SELECT) & 0x07]); + if (mask != val) + mask &= ~val; + + val = ffs(mask); + val = ac97_oss_rm[val-1]; + val |= val << 8; /* set both channels */ + +#ifdef DEBUG + printk("ac97_codec: setting ac97 recmask to 0x%04x\n", val); +#endif + + codec->codec_write(codec, AC97_RECORD_SELECT, val); + + return 0; +}; + +static int ac97_mixer_ioctl(struct ac97_codec *codec, unsigned int cmd, unsigned long arg) +{ + int i, val = 0; + + if (cmd == SOUND_MIXER_INFO) { + mixer_info info; + strncpy(info.id, codec->name, sizeof(info.id)); + strncpy(info.name, codec->name, sizeof(info.name)); + info.modify_counter = codec->modcnt; + if (copy_to_user((void *)arg, &info, sizeof(info))) + return -EFAULT; + return 0; + } + if (cmd == SOUND_OLD_MIXER_INFO) { + _old_mixer_info info; + strncpy(info.id, codec->name, sizeof(info.id)); + strncpy(info.name, codec->name, sizeof(info.name)); + if (copy_to_user((void *)arg, &info, sizeof(info))) + return -EFAULT; + return 0; + } + + if (_IOC_TYPE(cmd) != 'M' || _IOC_SIZE(cmd) != sizeof(int)) + return -EINVAL; + + if (cmd == OSS_GETVERSION) + return put_user(SOUND_VERSION, (int *)arg); + + if (_IOC_DIR(cmd) == _IOC_READ) { + switch (_IOC_NR(cmd)) { + case SOUND_MIXER_RECSRC: /* give them the current record source */ + if (!codec->recmask_io) { + val = 0; + } else { + val = codec->recmask_io(codec, 1, 0); + } + break; + + case SOUND_MIXER_DEVMASK: /* give them the supported mixers */ + val = codec->supported_mixers; + break; + + case SOUND_MIXER_RECMASK: /* Arg contains a bit for each supported recording source */ + val = codec->record_sources; + break; + + case SOUND_MIXER_STEREODEVS: /* Mixer channels supporting stereo */ + val = codec->stereo_mixers; + break; + + case SOUND_MIXER_CAPS: + val = SOUND_CAP_EXCL_INPUT; + break; + + default: /* read a specific mixer */ + i = _IOC_NR(cmd); + + if (!supported_mixer(codec, i)) + return -EINVAL; + + /* do we ever want to touch the hardware? */ + /* val = codec->read_mixer(codec, i); */ + val = codec->mixer_state[i]; + break; + } + return put_user(val, (int *)arg); + } + + if (_IOC_DIR(cmd) == (_IOC_WRITE|_IOC_READ)) { + codec->modcnt++; + get_user_ret(val, (int *)arg, -EFAULT); + + switch (_IOC_NR(cmd)) { + case SOUND_MIXER_RECSRC: /* Arg contains a bit for each recording source */ + if (!codec->recmask_io) return -EINVAL; + if (!val) return 0; + if (!(val &= codec->record_sources)) return -EINVAL; + + codec->recmask_io(codec, 0, val); + + return 0; + default: /* write a specific mixer */ + i = _IOC_NR(cmd); + + if (!supported_mixer(codec, i)) + return -EINVAL; + + ac97_set_mixer(codec, i, val); + + return 0; + } + } + return -EINVAL; +} + +/* entry point for /proc/driver/controller_vendor/ac97/%d */ +int ac97_read_proc (char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + int len = 0, cap, extid, val, id1, id2; + struct ac97_codec *codec; + int is_ac97_20 = 0; + + if ((codec = data) == NULL) + return -ENODEV; + + id1 = codec->codec_read(codec, AC97_VENDOR_ID1); + id2 = codec->codec_read(codec, AC97_VENDOR_ID2); + len += sprintf (page+len, "Vendor name : %s\n", codec->name); + len += sprintf (page+len, "Vendor id : %04X %04X\n", id1, id2); + + extid = codec->codec_read(codec, AC97_EXTENDED_ID); + extid &= ~((1<<2)|(1<<4)|(1<<5)|(1<<10)|(1<<11)|(1<<12)|(1<<13)); + len += sprintf (page+len, "AC97 Version : %s\n", + extid ? "2.0 or later" : "1.0"); + if (extid) is_ac97_20 = 1; + + cap = codec->codec_read(codec, AC97_RESET); + len += sprintf (page+len, "Capabilities :%s%s%s%s%s%s\n", + cap & 0x0001 ? " -dedicated MIC PCM IN channel-" : "", + cap & 0x0002 ? " -reserved1-" : "", + cap & 0x0004 ? " -bass & treble-" : "", + cap & 0x0008 ? " -simulated stereo-" : "", + cap & 0x0010 ? " -headphone out-" : "", + cap & 0x0020 ? " -loudness-" : ""); + val = cap & 0x00c0; + len += sprintf (page+len, "DAC resolutions :%s%s%s\n", + " -16-bit-", + val & 0x0040 ? " -18-bit-" : "", + val & 0x0080 ? " -20-bit-" : ""); + val = cap & 0x0300; + len += sprintf (page+len, "ADC resolutions :%s%s%s\n", + " -16-bit-", + val & 0x0100 ? " -18-bit-" : "", + val & 0x0200 ? " -20-bit-" : ""); + len += sprintf (page+len, "3D enhancement : %s\n", + ac97_stereo_enhancements[(cap >> 10) & 0x1f]); + + val = codec->codec_read(codec, AC97_GENERAL_PURPOSE); + len += sprintf (page+len, "POP path : %s 3D\n" + "Sim. stereo : %s\n" + "3D enhancement : %s\n" + "Loudness : %s\n" + "Mono output : %s\n" + "MIC select : %s\n" + "ADC/DAC loopback : %s\n", + val & 0x8000 ? "post" : "pre", + val & 0x4000 ? "on" : "off", + val & 0x2000 ? "on" : "off", + val & 0x1000 ? "on" : "off", + val & 0x0200 ? "MIC" : "MIX", + val & 0x0100 ? "MIC2" : "MIC1", + val & 0x0080 ? "on" : "off"); + + extid = codec->codec_read(codec, AC97_EXTENDED_ID); + cap = extid; + len += sprintf (page+len, "Ext Capabilities :%s%s%s%s%s%s%s\n", + cap & 0x0001 ? " -var rate PCM audio-" : "", + cap & 0x0002 ? " -2x PCM audio out-" : "", + cap & 0x0008 ? " -var rate MIC in-" : "", + cap & 0x0040 ? " -PCM center DAC-" : "", + cap & 0x0080 ? " -PCM surround DAC-" : "", + cap & 0x0100 ? " -PCM LFE DAC-" : "", + cap & 0x0200 ? " -slot/DAC mappings-" : ""); + if (is_ac97_20) { + len += sprintf (page+len, "Front DAC rate : %d\n", + codec->codec_read(codec, AC97_PCM_FRONT_DAC_RATE)); + } + + return len; +} + +int ac97_probe_codec(struct ac97_codec *codec) +{ + u16 id1, id2; + u16 audio, modem; + int i; + + /* probing AC97 codec, AC97 2.0 says that bit 15 of register 0x00 (reset) should + be read zero. Probing of AC97 in this way is not reliable, it is not even SAFE !! */ + codec->codec_write(codec, AC97_RESET, 0L); + if ((audio = codec->codec_read(codec, AC97_RESET)) & 0x8000) { + printk(KERN_ERR "ac97_codec: %s ac97 codec not present\n", + codec->id ? "Secondary" : "Primary"); + return 0; + } + + /* probe for Modem Codec */ + codec->codec_write(codec, AC97_EXTENDED_MODEM_ID, 0L); + modem = codec->codec_read(codec, AC97_EXTENDED_MODEM_ID); + + codec->name = NULL; + codec->codec_init = NULL; + + id1 = codec->codec_read(codec, AC97_VENDOR_ID1); + id2 = codec->codec_read(codec, AC97_VENDOR_ID2); + for (i = 0; i < arraysize(ac97_codec_ids); i++) { + if (ac97_codec_ids[i].id == ((id1 << 16) | id2)) { + codec->name = ac97_codec_ids[i].name; + codec->codec_init = ac97_codec_ids[i].init; + break; + } + } + if (codec->name == NULL) + codec->name = "Unknown"; + printk(KERN_INFO "ac97_codec: AC97 %s codec, vendor id1: 0x%04x, " + "id2: 0x%04x (%s)\n", audio ? "Audio" : (modem ? "Modem" : ""), + id1, id2, codec->name); + + return ac97_init_mixer(codec); +} + +static int ac97_init_mixer(struct ac97_codec *codec) +{ + u16 cap; + int i; + + cap = codec->codec_read(codec, AC97_RESET); + + /* mixer masks */ + codec->supported_mixers = AC97_SUPPORTED_MASK; + codec->stereo_mixers = AC97_STEREO_MASK; + codec->record_sources = AC97_RECORD_MASK; + if (!(cap & 0x04)) + codec->supported_mixers &= ~(SOUND_MASK_BASS|SOUND_MASK_TREBLE); + if (!(cap & 0x10)) + codec->supported_mixers &= ~SOUND_MASK_ALTPCM; + + /* generic OSS to AC97 wrapper */ + codec->read_mixer = ac97_read_mixer; + codec->write_mixer = ac97_write_mixer; + codec->recmask_io = ac97_recmask_io; + codec->mixer_ioctl = ac97_mixer_ioctl; + + /* initialize volume level */ + codec->codec_write(codec, AC97_MASTER_VOL_STEREO, 0L); + codec->codec_write(codec, AC97_PCMOUT_VOL, 0L); + + /* codec specific initialization for 4-6 channel output or secondary codec stuff */ + if (codec->id != 0 && codec->codec_init != NULL) { + codec->codec_init(codec); + } + + /* initilize mixer channel volumes */ + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { + struct mixer_defaults *md = &mixer_defaults[i]; + if (md->mixer == -1) + break; + if (!supported_mixer(codec, md->mixer)) + continue; + ac97_set_mixer(codec, md->mixer, md->value); + } + + return 1; +} + +static int ac97_init_modem(struct ac97_codec *codec) +{ + return 0; +} + +static int sigmatel_init(struct ac97_codec * codec) +{ + codec->codec_write(codec, AC97_SURROUND_MASTER, 0L); + + /* initialize SigmaTel STAC9721/23 as secondary codec, decoding AC link + sloc 3,4 = 0x01, slot 7,8 = 0x00, */ + codec->codec_write(codec, 0x74, 0x00); + + /* we don't have the crystal when we are on an AMR card, so use + BIT_CLK as our clock source. Write the magic word ABBA and read + back to enable register 0x78 */ + codec->codec_write(codec, 0x76, 0xabba); + codec->codec_read(codec, 0x76); + + /* sync all the clocks*/ + codec->codec_write(codec, 0x78, 0x3802); + + return 1; +} + +EXPORT_SYMBOL(ac97_read_proc); +EXPORT_SYMBOL(ac97_probe_codec); diff -urN v2.2.15/linux/drivers/sound/cmpci.c linux/drivers/sound/cmpci.c --- v2.2.15/linux/drivers/sound/cmpci.c Wed May 3 17:16:45 2000 +++ linux/drivers/sound/cmpci.c Wed Jun 7 14:26:43 2000 @@ -489,6 +489,44 @@ } } s->ratedac = rate; + if ( !(inb(s->iobase+CODEC_CMI_FUNCTRL1)&0x80) ) { + int functrl1; + outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) & ~0x80, s->iobase + CODEC_CMI_FUNCTRL1); + if ( rate == 44100 || rate == 48000 ) { + functrl1 = inb(s->iobase + 0x16); + functrl1 |= 0x80; /* enable XSPDIF/OUT */ + outb(functrl1, s->iobase + 0x16); + functrl1 = inb(s->iobase + 0x16); + functrl1 |= 0x20; /* enable DAC2SPDO */ + outb(functrl1, s->iobase + 0x16); + functrl1 = inb(s->iobase + 0x19); + if ( rate == 44100 ) + functrl1 &= ~0x80; /* 0:44.1/ 1:48kHz */ + else + functrl1 |= 0x80; /* 0:44.1/ 1:48kHz */ + outb(functrl1, s->iobase + 0x19); + functrl1 = inb(s->iobase + 0x05); + functrl1 |= 0x01; /* SPDIF out */ + outb(functrl1, s->iobase + 0x05); + functrl1 = inb(s->iobase + 0x24); + functrl1 &= ~0x01; /* SPDIF in to DAC*/ + outb(functrl1, s->iobase + 0x24); + } + else { + functrl1 = inb(s->iobase + 0x16); + functrl1 &= ~0x80; /* disable XSPDIF/OUT */ + outb(functrl1, s->iobase + 0x16); + functrl1 = inb(s->iobase + 0x16); + functrl1 &= ~0x20; /* disable DAC2SPDO */ + outb(functrl1, s->iobase + 0x16); + functrl1 = inb(s->iobase + 0x05); + functrl1 &= ~0x01; /* disable SPDIF out */ + outb(functrl1, s->iobase + 0x05); + functrl1 = inb(s->iobase + 0x24); + functrl1 &= ~0x01; /* SPDIF in to DAC*/ + outb(functrl1, s->iobase + 0x24); + } + } freq <<= 2; spin_lock_irqsave(&s->lock, flags); val = inb(s->iobase + CODEC_CMI_FUNCTRL1 + 1) & ~0x1c; @@ -588,7 +626,7 @@ /* --------------------------------------------------------------------- */ -#define DMABUF_DEFAULTORDER (17-PAGE_SHIFT) +#define DMABUF_DEFAULTORDER (16-PAGE_SHIFT) #define DMABUF_MINORDER 1 static void dealloc_dmabuf(struct dmabuf *db) @@ -781,6 +819,7 @@ { unsigned char ch; int wake; + int timeout; wake = 0; while (!(inb(s->iomidi+1) & 0x80)) { @@ -797,6 +836,13 @@ wake_up(&s->midi.iwait); wake_up(&s->midi.pollwait); } + for (timeout = 120000; timeout > 0 && (inb(s->iomidi+1)&0x40); timeout--); +/* + if((inb(s->iomidi+1) & 0x40)) { + printk(KERN_WARNING "cmpci: UART Timeout - Device not responding\n"); + return; + } +*/ wake = 0; while (!(inb(s->iomidi+1) & 0x40) && s->midi.ocnt > 0) { outb(s->midi.obuf[s->midi.ord], s->iomidi); @@ -837,7 +883,7 @@ outb(intstat | 2, s->iobase + CODEC_CMI_INT_HLDCLR + 2); } cm_update_ptr(s); - cm_handle_midi(s); + /*cm_handle_midi(s);*/ spin_unlock(&s->lock); } @@ -2302,6 +2348,8 @@ { SOUND_MIXER_WRITE_VOLUME, 0x4040 }, { SOUND_MIXER_WRITE_PCM, 0x4040 } }; +static int mpu_io = 0; +static int synth_io = 0; #ifdef MODULE static int spdif_loop = 0; @@ -2310,7 +2358,8 @@ MODULE_PARM(spdif_loop, "i"); MODULE_PARM(four_ch, "i"); MODULE_PARM(rear_out, "i"); - +MODULE_PARM(mpu_io, "i"); +MODULE_PARM(synth_io, "i"); int __init init_module(void) #else #ifdef CONFIG_SOUND_CMPCI_SPDIFLOOP @@ -2387,8 +2436,36 @@ s->open_sem = MUTEX; s->magic = CM_MAGIC; s->iobase = pcidev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; - s->iosynth = 0x388; - s->iomidi = 0x330; + switch (synth_io) { + case 0x3c8: + s->iosynth = 0x3c8; + break; + case 0x3e0: + s->iosynth = 0x3e0; + break; + case 0x3e8: + s->iosynth = 0x3e8; + break; + case 0x388: + default: + s->iosynth = 0x388; + break; + } + switch (mpu_io) { + case 0x300: + s->iomidi = 0x300; + break; + case 0x310: + s->iomidi = 0x310; + break; + case 0x320: + s->iomidi = 0x320; + break; + case 0x330: + default: + s->iomidi = 0x330; + break; + } if (s->iobase == 0) continue; s->irq = pcidev->irq; @@ -2405,8 +2482,21 @@ else { request_region(s->iomidi, CM_EXTENT_MIDI, "cmpci Midi"); - /* set IO based at 0x330 */ - outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60, s->iobase + CODEC_CMI_LEGACY_CTRL + 3); + /* set IO based at specified address */ + switch (s->iomidi) { + case 0x300: + outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) | 0x60, s->iobase + CODEC_CMI_LEGACY_CTRL + 3); + break; + case 0x310: + outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60) | 0x40, s->iobase + CODEC_CMI_LEGACY_CTRL + 3); + break; + case 0x320: + outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60) | 0x20, s->iobase + CODEC_CMI_LEGACY_CTRL + 3); + break; + default: /* 0x330 */ + outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60, s->iobase + CODEC_CMI_LEGACY_CTRL + 3); + break; + } } if (check_region(s->iosynth, CM_EXTENT_SYNTH)) { printk(KERN_WARNING "cmpci: io ports %#x-%#x in use, synth disabled.\n", s->iosynth, s->iosynth+CM_EXTENT_SYNTH-1); @@ -2417,6 +2507,22 @@ request_region(s->iosynth, CM_EXTENT_SYNTH, "cmpci FM"); /* enable FM */ outb(inb(s->iobase + CODEC_CMI_MISC_CTRL + 2) | 8, s->iobase + CODEC_CMI_MISC_CTRL); + + /* set IO base at specified address */ + switch (s->iosynth) { + case 0x3e8: + outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) | 0x03, s->iobase + CODEC_CMI_LEGACY_CTRL+3); + break; + case 0x3e0: + outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x03) | 0x02, s->iobase + CODEC_CMI_LEGACY_CTRL+3); + break; + case 0x3c8: + outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x03) | 0x01, s->iobase + CODEC_CMI_LEGACY_CTRL+3); + break; + default: /* 0x388 */ + outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x03, s->iobase + CODEC_CMI_LEGACY_CTRL+3); + break; + } } /* initialize codec registers */ outb(0, s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* disable ints */ @@ -2463,8 +2569,10 @@ outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) | 0x80, s->iobase + CODEC_CMI_FUNCTRL1); printk(KERN_INFO "cmpci: Enable SPDIF loop\n"); } - else + else { outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) & ~0x80, s->iobase + CODEC_CMI_FUNCTRL1); + } + /* enable 4 channels mode */ if (four_ch) { diff -urN v2.2.15/linux/drivers/sound/i810_audio.c linux/drivers/sound/i810_audio.c --- v2.2.15/linux/drivers/sound/i810_audio.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/sound/i810_audio.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,1859 @@ +/* + * Intel i810 and friends ICH driver for Linux + * Alan Cox + * + * Built from: + * Low level code: Zach Brown (original nonworking i810 OSS driver) + * Jaroslav Kysela (working ALSA driver) + * + * Framework: Thomas Sailer + * Extended by: Zach Brown + * and others.. + * + * Hardware Provided By: + * Analog Devices (A major AC97 codec maker) + * Intel Corp (you've probably heard of them already) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * Intel 810 theory of operation + * + * The chipset provides three DMA channels that talk to an AC97 + * CODEC (AC97 is a digital/analog mixer standard). At its simplest + * you get 48Khz audio with basic volume and mixer controls. At the + * best you get rate adaption in the codec. We set the card up so + * that we never take completion interrupts but instead keep the card + * chasing its tail around a ring buffer. This is needed for mmap + * mode audio and happens to work rather well for non-mmap modes too. + * + * The board has one output channel for PCM audio (supported) and + * a stereo line in and mono microphone input. Again these are normally + * locked to 48Khz only. Right now recording is not finished. + * + * There is no midi support, no synth support. Use timidity. To get + * esd working you need to use esd -r 48000 as it won't probe 48KHz + * by default. mpg123 can't handle 48Khz only audio so use xmms. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef PCI_DEVICE_ID_INTEL_82801 +#define PCI_DEVICE_ID_INTEL_82801 0x2415 +#endif +#ifndef PCI_DEVICE_ID_INTEL_82901 +#define PCI_DEVICE_ID_INTEL_82901 0x2425 +#endif +#ifndef PCI_DEVICE_ID_INTEL_440MX +#define PCI_DEVICE_ID_INTEL_440MX 0x7195 +#endif + +#define ADC_RUNNING 1 +#define DAC_RUNNING 2 + +#define I810_FMT_16BIT 1 /* These are fixed in fact */ +#define I810_FMT_STEREO 2 +#define I810_FMT_MASK 3 + +/* the 810's array of pointers to data buffers */ + +struct sg_item { +#define BUSADDR_MASK 0xFFFFFFFE + u32 busaddr; +#define CON_IOC 0x80000000 /* interrupt on completion */ +#define CON_BUFPAD 0x40000000 /* pad underrun with last sample, else 0 */ +#define CON_BUFLEN_MASK 0x0000ffff /* buffer length in samples */ + u32 control; +}; + +/* an instance of the i810 channel */ +#define SG_LEN 32 +struct i810_channel +{ + /* these sg guys should probably be allocated + seperately as nocache. Must be 8 byte aligned */ + struct sg_item sg[SG_LEN]; /* 32*8 */ + u32 offset; /* 4 */ + u32 port; /* 4 */ + u32 used; /* 4 */ + u32 num; /* 4 */ +}; + +/* + * we have 3 seperate dma engines. pcm in, pcm out, and mic. + * each dma engine has controlling registers. These goofy + * names are from the datasheet, but make it easy to write + * code while leafing through it. Right now we don't support + * the MIC input. + */ + +#define ENUM_ENGINE(PRE,DIG) \ +enum { \ + ##PRE##_BDBAR = 0x##DIG##0, /* Buffer Descriptor list Base Address */ \ + ##PRE##_CIV = 0x##DIG##4, /* Current Index Value */ \ + ##PRE##_LVI = 0x##DIG##5, /* Last Valid Index */ \ + ##PRE##_SR = 0x##DIG##6, /* Status Register */ \ + ##PRE##_PICB = 0x##DIG##8, /* Position In Current Buffer */ \ + ##PRE##_PIV = 0x##DIG##a, /* Prefetched Index Value */ \ + ##PRE##_CR = 0x##DIG##b /* Control Register */ \ +} + +ENUM_ENGINE(OFF,0); /* Offsets */ +ENUM_ENGINE(PI,0); /* PCM In */ +ENUM_ENGINE(PO,1); /* PCM Out */ +ENUM_ENGINE(MC,2); /* Mic In */ + +enum { + GLOB_CNT = 0x2c, /* Global Control */ + GLOB_STA = 0x30, /* Global Status */ + CAS = 0x34 /* Codec Write Semaphore Register */ +}; + +/* interrupts for a dma engine */ +#define DMA_INT_FIFO (1<<4) /* fifo under/over flow */ +#define DMA_INT_COMPLETE (1<<3) /* buffer read/write complete and ioc set */ +#define DMA_INT_LVI (1<<2) /* last valid done */ +#define DMA_INT_CELV (1<<1) /* last valid is current */ +#define DMA_INT_MASK (DMA_INT_FIFO|DMA_INT_COMPLETE|DMA_INT_LVI) + +/* interrupts for the whole chip */ +#define INT_SEC (1<<11) +#define INT_PRI (1<<10) +#define INT_MC (1<<7) +#define INT_PO (1<<6) +#define INT_PI (1<<5) +#define INT_MO (1<<2) +#define INT_NI (1<<1) +#define INT_GPI (1<<0) +#define INT_MASK (INT_SEC|INT_PRI|INT_MC|INT_PO|INT_PI|INT_MO|INT_NI|INT_GPI) + + +#define DRIVER_VERSION "0.02" + +/* magic numbers to protect our data structures */ +#define I810_CARD_MAGIC 0x5072696E /* "Prin" */ +#define I810_STATE_MAGIC 0x63657373 /* "cess" */ +#define NR_HW_CH 3 + +/* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */ +#define NR_AC97 2 + +/* minor number of /dev/dspW */ +#define SND_DEV_DSP8 1 + +/* minor number of /dev/dspW */ +#define SND_DEV_DSP16 1 + +static const unsigned sample_size[] = { 1, 2, 2, 4 }; +static const unsigned sample_shift[] = { 0, 1, 1, 2 }; + +enum { + ICH82801AA = 0, + ICH82901AB, + INTEL440MX +}; + +/* "software" or virtual channel, an instance of opened /dev/dsp */ +struct i810_state { + unsigned int magic; + struct i810_card *card; /* Card info */ + + /* single open lock mechanism, only used for recording */ + struct semaphore open_sem; + struct wait_queue *open_wait; + + /* file mode */ + mode_t open_mode; + + /* virtual channel number */ + int virt; + + struct dmabuf { + /* wave sample stuff */ + unsigned int rate; + unsigned char fmt, enable; + + /* hardware channel */ + struct i810_channel *channel; + + /* OSS buffer management stuff */ + void *rawbuf; + unsigned buforder; + unsigned numfrag; + unsigned fragshift; + + /* our buffer acts like a circular ring */ + unsigned hwptr; /* where dma last started, updated by update_ptr */ + unsigned swptr; /* where driver last clear/filled, updated by read/write */ + int count; /* bytes to be comsumed or been generated by dma machine */ + unsigned total_bytes; /* total bytes dmaed by hardware */ + + unsigned error; /* number of over/underruns */ + struct wait_queue *wait; /* put process on wait queue when no more space in buffer */ + + /* redundant, but makes calculations easier */ + unsigned fragsize; + unsigned dmasize; + unsigned fragsamples; + + /* OSS stuff */ + unsigned mapped:1; + unsigned ready:1; + unsigned endcleared:1; + unsigned update_flag; + unsigned ossfragshift; + int ossmaxfrags; + unsigned subdivision; + } dmabuf; +}; + + +struct i810_card { + struct i810_channel channel[3]; + unsigned int magic; + + /* We keep i810 cards in a linked list */ + struct i810_card *next; + + /* The i810 has a certain amount of cross channel interaction + so we use a single per card lock */ + spinlock_t lock; + + /* PCI device stuff */ + struct pci_dev * pci_dev; + u16 pci_id; + + /* soundcore stuff */ + int dev_audio; + + /* structures for abstraction of hardware facilities, codecs, banks and channels*/ + struct ac97_codec *ac97_codec[NR_AC97]; + struct i810_state *states[NR_HW_CH]; + + u16 ac97_features; + + /* hardware resources */ + unsigned long iobase; + unsigned long ac97base; + u32 irq; + + /* Function support */ + struct i810_channel *(*alloc_pcm_channel)(struct i810_card *); + struct i810_channel *(*alloc_rec_pcm_channel)(struct i810_card *); + void (*free_pcm_channel)(struct i810_card *, int chan); +}; + +static struct i810_card *devs = NULL; + +static int i810_open_mixdev(struct inode *inode, struct file *file); +static int i810_release_mixdev(struct inode *inode, struct file *file); +static int i810_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, + unsigned long arg); +static loff_t i810_llseek(struct file *file, loff_t offset, int origin); + +extern __inline__ unsigned ld2(unsigned int x) +{ + unsigned r = 0; + + if (x >= 0x10000) { + x >>= 16; + r += 16; + } + if (x >= 0x100) { + x >>= 8; + r += 8; + } + if (x >= 0x10) { + x >>= 4; + r += 4; + } + if (x >= 4) { + x >>= 2; + r += 2; + } + if (x >= 2) + r++; + return r; +} + +static u16 i810_ac97_get(struct ac97_codec *dev, u8 reg); +static void i810_ac97_set(struct ac97_codec *dev, u8 reg, u16 data); + +static struct i810_channel *i810_alloc_pcm_channel(struct i810_card *card) +{ + if(card->channel[1].used==1) + return NULL; + card->channel[1].used=1; + card->channel[1].offset = 0; + card->channel[1].port = 0x10; + card->channel[1].num=1; + return &card->channel[1]; +} + +static struct i810_channel *i810_alloc_rec_pcm_channel(struct i810_card *card) +{ + if(card->channel[0].used==1) + return NULL; + card->channel[0].used=1; + card->channel[0].offset = 0; + card->channel[0].port = 0x00; + card->channel[1].num=0; + return &card->channel[0]; +} + +static void i810_free_pcm_channel(struct i810_card *card, int channel) +{ + card->channel[channel].used=0; +} + +/* set playback sample rate */ +static unsigned int i810_set_dac_rate(struct i810_state * state, unsigned int rate) +{ + struct dmabuf *dmabuf = &state->dmabuf; + u16 dacp, rp; + struct ac97_codec *codec=state->card->ac97_codec[0]; + + if(!(state->card->ac97_features&0x0001)) + { + dmabuf->rate=48000; + return 48000; + } + + if (rate > 48000) + rate = 48000; + if (rate < 4000) + rate = 4000; + + /* Power down the DAC */ + dacp=i810_ac97_get(codec, AC97_POWER_CONTROL); + i810_ac97_set(codec, AC97_POWER_CONTROL, dacp|0x0200); + + /* Load the rate and read the effective rate */ + i810_ac97_set(codec, AC97_PCM_FRONT_DAC_RATE, rate); + rp=i810_ac97_get(codec, AC97_PCM_FRONT_DAC_RATE); + +// printk("DAC rate set to %d Returned %d\n", +// rate, (int)rp); + + rate=rp; + + /* Power it back up */ + i810_ac97_set(codec, AC97_POWER_CONTROL, dacp); + + dmabuf->rate = rate; +#ifdef DEBUG + printk("i810_audio: called i810_set_dac_rate : rate = %d\n", rate); +#endif + + return rate; +} + +/* set recording sample rate */ +static unsigned int i810_set_adc_rate(struct i810_state * state, unsigned int rate) +{ + struct dmabuf *dmabuf = &state->dmabuf; + u16 dacp, rp; + struct ac97_codec *codec=state->card->ac97_codec[0]; + + if(!(state->card->ac97_features&0x0001)) + { + dmabuf->rate = 48000; + return 48000; + } + + if (rate > 48000) + rate = 48000; + if (rate < 4000) + rate = 4000; + + /* Power down the ADC */ + dacp=i810_ac97_get(codec, AC97_POWER_CONTROL); + i810_ac97_set(codec, AC97_POWER_CONTROL, dacp|0x0100); + + /* Load the rate and read the effective rate */ + i810_ac97_set(codec, AC97_PCM_LR_DAC_RATE, rate); + rp=i810_ac97_get(codec, AC97_PCM_LR_DAC_RATE); + +// printk("ADC rate set to %d Returned %d\n", +// rate, (int)rp); + + rate=rp; + + /* Power it back up */ + i810_ac97_set(codec, AC97_POWER_CONTROL, dacp); + + dmabuf->rate = rate; +#ifdef DEBUG + printk("i810_audio: called i810_set_adc_rate : rate = %d\n", rate); +#endif + + return rate; + +} + +/* prepare channel attributes for playback */ +static void i810_play_setup(struct i810_state *state) +{ +// struct dmabuf *dmabuf = &state->dmabuf; +// struct i810_channel *channel = dmabuf->channel; + /* Fixed format. .. */ + //if (dmabuf->fmt & I810_FMT_16BIT) + //if (dmabuf->fmt & I810_FMT_STEREO) +} + +/* prepare channel attributes for recording */ +static void i810_rec_setup(struct i810_state *state) +{ +// u16 w; +// struct i810_card *card = state->card; +// struct dmabuf *dmabuf = &state->dmabuf; +// struct i810_channel *channel = dmabuf->channel; + + /* Enable AC-97 ADC (capture) */ +// if (dmabuf->fmt & I810_FMT_16BIT) { +// if (dmabuf->fmt & I810_FMT_STEREO) +} + + +/* get current playback/recording dma buffer pointer (byte offset from LBA), + called with spinlock held! */ + +extern __inline__ unsigned i810_get_dma_addr(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + u32 offset; + struct i810_channel *c = dmabuf->channel; + + if (!dmabuf->enable) + return 0; + offset = inb(state->card->iobase+c->port+OFF_CIV); +// offset++; + offset&=31; + /* Offset has to compensate for the fact we finished the segment + on the IRQ so we are at next_segment,0 */ +// printk("BANK%d ", offset); + offset *= (dmabuf->dmasize/SG_LEN); +// printk("DMASZ=%d", dmabuf->dmasize); +// offset += 1024-(2*inw(state->card->iobase+c->port+OFF_PICB)); +// printk("OFF%d ", offset); + return offset; +} + +static void resync_dma_ptrs(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + struct i810_channel *c = dmabuf->channel; + int offset; + + offset = inb(state->card->iobase+c->port+OFF_CIV); + offset *= (dmabuf->dmasize/SG_LEN); + + dmabuf->hwptr=dmabuf->swptr = offset; +} + +/* Stop recording (lock held) */ +extern __inline__ void __stop_adc(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + struct i810_card *card = state->card; + + dmabuf->enable &= ~ADC_RUNNING; + outb(0, card->iobase + PI_CR); +} + +static void stop_adc(struct i810_state *state) +{ + struct i810_card *card = state->card; + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + __stop_adc(state); + spin_unlock_irqrestore(&card->lock, flags); +} + +static void start_adc(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + struct i810_card *card = state->card; + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + if ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize) && dmabuf->ready) { + dmabuf->enable |= ADC_RUNNING; + outb((1<<4) | 1<<2 | 1, card->iobase + PI_CR); + } + spin_unlock_irqrestore(&card->lock, flags); +} + +/* stop playback (lock held) */ +extern __inline__ void __stop_dac(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + struct i810_card *card = state->card; + + dmabuf->enable &= ~DAC_RUNNING; + outb(0, card->iobase + PO_CR); +} + +static void stop_dac(struct i810_state *state) +{ + struct i810_card *card = state->card; + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + __stop_dac(state); + spin_unlock_irqrestore(&card->lock, flags); +} + +static void start_dac(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + struct i810_card *card = state->card; + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + if ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) { + if(!(dmabuf->enable&DAC_RUNNING)) + { + dmabuf->enable |= DAC_RUNNING; + outb((1<<4) | 1<<2 | 1, card->iobase + PO_CR); + } + } + spin_unlock_irqrestore(&card->lock, flags); +} + +#define DMABUF_DEFAULTORDER (15-PAGE_SHIFT) +#define DMABUF_MINORDER 1 + +/* allocate DMA buffer, playback and recording buffer should be allocated seperately */ +static int alloc_dmabuf(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + void *rawbuf = NULL; + int order; + unsigned long map, mapend; + + /* alloc as big a chunk as we can */ + for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--) + if((rawbuf = (void *)__get_free_pages(GFP_KERNEL|GFP_DMA, order))) + break; + + if (!rawbuf) + return -ENOMEM; + +#ifdef DEBUG + printk("i810_audio: allocated %ld (order = %d) bytes at %p\n", + PAGE_SIZE << order, order, rawbuf); +#endif + + dmabuf->ready = dmabuf->mapped = 0; + dmabuf->rawbuf = rawbuf; + dmabuf->buforder = order; + + /* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */ + mapend = MAP_NR(rawbuf + (PAGE_SIZE << order) - 1); + for (map = MAP_NR(rawbuf); map <= mapend; map++) + set_bit(PG_reserved, &mem_map[map].flags); + + return 0; +} + +/* free DMA buffer */ +static void dealloc_dmabuf(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned long map, mapend; + + if (dmabuf->rawbuf) { + /* undo marking the pages as reserved */ + mapend = MAP_NR(dmabuf->rawbuf + (PAGE_SIZE << dmabuf->buforder) - 1); + for (map = MAP_NR(dmabuf->rawbuf); map <= mapend; map++) + clear_bit(PG_reserved, &mem_map[map].flags); + free_pages((unsigned long)dmabuf->rawbuf,dmabuf->buforder); + } + dmabuf->rawbuf = NULL; + dmabuf->mapped = dmabuf->ready = 0; +} + +static int prog_dmabuf(struct i810_state *state, unsigned rec) +{ + struct dmabuf *dmabuf = &state->dmabuf; + struct sg_item *sg; + unsigned bytepersec; + unsigned bufsize; + unsigned long flags; + int ret; + unsigned fragsize; + int i; + + spin_lock_irqsave(&state->card->lock, flags); + resync_dma_ptrs(state); + dmabuf->total_bytes = 0; + dmabuf->count = dmabuf->error = 0; + spin_unlock_irqrestore(&state->card->lock, flags); + + /* allocate DMA buffer if not allocated yet */ + if (!dmabuf->rawbuf) + if ((ret = alloc_dmabuf(state))) + return ret; + + /* FIXME: figure out all this OSS fragment stuff */ + bytepersec = dmabuf->rate << sample_shift[dmabuf->fmt]; + bufsize = PAGE_SIZE << dmabuf->buforder; + if (dmabuf->ossfragshift) { + if ((1000 << dmabuf->ossfragshift) < bytepersec) + dmabuf->fragshift = ld2(bytepersec/1000); + else + dmabuf->fragshift = dmabuf->ossfragshift; + } else { + /* lets hand out reasonable big ass buffers by default */ + dmabuf->fragshift = (dmabuf->buforder + PAGE_SHIFT -2); + } + dmabuf->numfrag = bufsize >> dmabuf->fragshift; + while (dmabuf->numfrag < 4 && dmabuf->fragshift > 3) { + dmabuf->fragshift--; + dmabuf->numfrag = bufsize >> dmabuf->fragshift; + } + dmabuf->fragsize = 1 << dmabuf->fragshift; + if (dmabuf->ossmaxfrags >= 4 && dmabuf->ossmaxfrags < dmabuf->numfrag) + dmabuf->numfrag = dmabuf->ossmaxfrags; + dmabuf->fragsamples = dmabuf->fragsize >> sample_shift[dmabuf->fmt]; + dmabuf->dmasize = dmabuf->numfrag << dmabuf->fragshift; + + memset(dmabuf->rawbuf, (dmabuf->fmt & I810_FMT_16BIT) ? 0 : 0x80, + dmabuf->dmasize); + + /* + * Now set up the ring + */ + + sg=&dmabuf->channel->sg[0]; + fragsize = bufsize / SG_LEN; + + /* + * Load up 32 sg entries and take an interrupt at each + * step (we might want less interrupts later..) + */ + + for(i=0;i<32;i++) + { + sg->busaddr=virt_to_bus(dmabuf->rawbuf+fragsize*i); + sg->control=(fragsize>>1); + sg->control|=CON_IOC; + sg++; + } + spin_lock_irqsave(&state->card->lock, flags); + outl(virt_to_bus(&dmabuf->channel->sg[0]), state->card->iobase+dmabuf->channel->port+OFF_BDBAR); + outb(16, state->card->iobase+dmabuf->channel->port+OFF_LVI); + outb(0, state->card->iobase+dmabuf->channel->port+OFF_CIV); + if (rec) { + i810_rec_setup(state); + } else { + i810_play_setup(state); + } + spin_unlock_irqrestore(&state->card->lock, flags); + + /* set the ready flag for the dma buffer */ + dmabuf->ready = 1; + +#ifdef DEBUG + printk("i810_audio: prog_dmabuf, sample rate = %d, format = %d, numfrag = %d, " + "fragsize = %d dmasize = %d\n", + dmabuf->rate, dmabuf->fmt, dmabuf->numfrag, + dmabuf->fragsize, dmabuf->dmasize); +#endif + + return 0; +} + +/* we are doing quantum mechanics here, the buffer can only be empty, half or full filled i.e. + |------------|------------| or |xxxxxxxxxxxx|------------| or |xxxxxxxxxxxx|xxxxxxxxxxxx| + but we almost always get this + |xxxxxx------|------------| or |xxxxxxxxxxxx|xxxxx-------| + so we have to clear the tail space to "silence" + |xxxxxx000000|------------| or |xxxxxxxxxxxx|xxxxxx000000| +*/ +static void i810_clear_tail(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned swptr; + unsigned char silence = (dmabuf->fmt & I810_FMT_16BIT) ? 0 : 0x80; + unsigned int len; + unsigned long flags; + + spin_lock_irqsave(&state->card->lock, flags); + swptr = dmabuf->swptr; + spin_unlock_irqrestore(&state->card->lock, flags); + + if (swptr == 0 || swptr == dmabuf->dmasize / 2 || swptr == dmabuf->dmasize) + return; + + if (swptr < dmabuf->dmasize/2) + len = dmabuf->dmasize/2 - swptr; + else + len = dmabuf->dmasize - swptr; + + memset(dmabuf->rawbuf + swptr, silence, len); + + spin_lock_irqsave(&state->card->lock, flags); + dmabuf->swptr += len; + dmabuf->count += len; + spin_unlock_irqrestore(&state->card->lock, flags); + + /* restart the dma machine in case it is halted */ + start_dac(state); +} + +static int drain_dac(struct i810_state *state, int nonblock) +{ + struct wait_queue wait = {current, NULL}; + struct dmabuf *dmabuf = &state->dmabuf; + unsigned long flags; + unsigned long tmo; + int count; + + if (dmabuf->mapped || !dmabuf->ready) + return 0; + + add_wait_queue(&dmabuf->wait, &wait); + for (;;) { + /* It seems that we have to set the current state to TASK_INTERRUPTIBLE + every time to make the process really go to sleep */ + current->state = TASK_INTERRUPTIBLE; + + spin_lock_irqsave(&state->card->lock, flags); + count = dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); + + if (count <= 0) + break; + + if (signal_pending(current)) + break; + + if (nonblock) { + remove_wait_queue(&dmabuf->wait, &wait); + current->state = TASK_RUNNING; + return -EBUSY; + } + + tmo = (dmabuf->dmasize * HZ) / dmabuf->rate; + tmo >>= sample_shift[dmabuf->fmt]; + if (!schedule_timeout(tmo ? tmo : 1) && tmo){ + printk(KERN_ERR "i810_audio: drain_dac, dma timeout?\n"); + break; + } + } + remove_wait_queue(&dmabuf->wait, &wait); + current->state = TASK_RUNNING; + if (signal_pending(current)) + return -ERESTARTSYS; + + return 0; +} + +/* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */ +static void i810_update_ptr(struct i810_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned hwptr, swptr; + int clear_cnt = 0; + int diff; + unsigned char silence; +// unsigned half_dmasize; + + /* update hardware pointer */ + hwptr = i810_get_dma_addr(state); + diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize; +// printk("HWP %d,%d,%d\n", hwptr, dmabuf->hwptr, diff); + dmabuf->hwptr = hwptr; + dmabuf->total_bytes += diff; + + /* error handling and process wake up for DAC */ + if (dmabuf->enable == ADC_RUNNING) { + if (dmabuf->mapped) { + dmabuf->count -= diff; + if (dmabuf->count >= (signed)dmabuf->fragsize) + wake_up(&dmabuf->wait); + } else { + dmabuf->count += diff; + + if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) { + /* buffer underrun or buffer overrun, we have no way to recover + it here, just stop the machine and let the process force hwptr + and swptr to sync */ + __stop_adc(state); + dmabuf->error++; + } + else if (!dmabuf->endcleared) { + swptr = dmabuf->swptr; + silence = (dmabuf->fmt & I810_FMT_16BIT ? 0 : 0x80); + if (dmabuf->count < (signed) dmabuf->fragsize) + { + clear_cnt = dmabuf->fragsize; + if ((swptr + clear_cnt) > dmabuf->dmasize) + clear_cnt = dmabuf->dmasize - swptr; + memset (dmabuf->rawbuf + swptr, silence, clear_cnt); + dmabuf->endcleared = 1; + } + } + wake_up(&dmabuf->wait); + } + } + /* error handling and process wake up for DAC */ + if (dmabuf->enable == DAC_RUNNING) { + if (dmabuf->mapped) { + dmabuf->count += diff; + if (dmabuf->count >= (signed)dmabuf->fragsize) + wake_up(&dmabuf->wait); + } else { + dmabuf->count -= diff; + + if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) { + /* buffer underrun or buffer overrun, we have no way to recover + it here, just stop the machine and let the process force hwptr + and swptr to sync */ + __stop_dac(state); +// printk("DMA overrun on send\n"); + dmabuf->error++; + } + wake_up(&dmabuf->wait); + } + } +} + +static void i810_channel_interrupt(struct i810_card *card) +{ + int i; + +// printk("CHANNEL IRQ .. "); + for(i=0;istates[i]; + struct i810_channel *c; + unsigned long port = card->iobase; + u16 status; + + if(!state) + continue; + if(!state->dmabuf.ready) + continue; + c=state->dmabuf.channel; + + port+=c->port; + +// printk("PORT %lX (", port); + + status = inw(port + OFF_SR); + +// printk("ST%d ", status); + + if(status & DMA_INT_LVI) + { + /* Back to the start */ +// printk("LVI - STOP"); + outb((inb(port+OFF_CIV)-1)&31, port+OFF_LVI); + i810_update_ptr(state); + outb(0, port + OFF_CR); + } + if(status & DMA_INT_COMPLETE) + { + int x; + /* Keep the card chasing its tail */ + outb(x=((inb(port+OFF_CIV)-1)&31), port+OFF_LVI); + i810_update_ptr(state); +// printk("COMP%d ",x); + } +// printk(")"); + outw(status & DMA_INT_MASK, port + OFF_SR); + } +// printk("\n"); +} + +static void i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + struct i810_card *card = (struct i810_card *)dev_id; + u32 status; + + spin_lock(&card->lock); + + status = inl(card->iobase + GLOB_STA); + if(!(status & INT_MASK)) + { + spin_unlock(&card->lock); + return; /* not for us */ + } + +// printk("Interrupt %X: ", status); + if(status & (INT_PO|INT_PI|INT_MC)) + i810_channel_interrupt(card); + + /* clear 'em */ + outl(status & INT_MASK, card->iobase + GLOB_STA); + spin_unlock(&card->lock); +} + +static loff_t i810_llseek(struct file *file, loff_t offset, int origin) +{ + return -ESPIPE; +} + +/* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to + the user's buffer. it is filled by the dma machine and drained by this loop. */ +static ssize_t i810_read(struct file *file, char *buffer, size_t count, loff_t *ppos) +{ + struct i810_state *state = (struct i810_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + ssize_t ret; + unsigned long flags; + unsigned swptr; + int cnt; + +#ifdef DEBUG + printk("i810_audio: i810_read called, count = %d\n", count); +#endif + + if (ppos != &file->f_pos) + return -ESPIPE; + if (dmabuf->mapped) + return -ENXIO; + if (!dmabuf->ready && (ret = prog_dmabuf(state, 1))) + return ret; + if (!access_ok(VERIFY_WRITE, buffer, count)) + return -EFAULT; + ret = 0; + + while (count > 0) { + spin_lock_irqsave(&state->card->lock, flags); + if (dmabuf->count > (signed) dmabuf->dmasize) { + /* buffer overrun, we are recovering from sleep_on_timeout, + resync hwptr and swptr, make process flush the buffer */ + dmabuf->count = dmabuf->dmasize; + dmabuf->swptr = dmabuf->hwptr; + } + swptr = dmabuf->swptr; + cnt = dmabuf->dmasize - swptr; + if (dmabuf->count < cnt) + cnt = dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); + + if (cnt > count) + cnt = count; + if (cnt <= 0) { + unsigned long tmo; + /* buffer is empty, start the dma machine and wait for data to be + recorded */ + start_adc(state); + if (file->f_flags & O_NONBLOCK) { + if (!ret) ret = -EAGAIN; + return ret; + } + /* This isnt strictly right for the 810 but it'll do */ + tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2); + tmo >>= sample_shift[dmabuf->fmt]; + /* There are two situations when sleep_on_timeout returns, one is when + the interrupt is serviced correctly and the process is waked up by + ISR ON TIME. Another is when timeout is expired, which means that + either interrupt is NOT serviced correctly (pending interrupt) or it + is TOO LATE for the process to be scheduled to run (scheduler latency) + which results in a (potential) buffer overrun. And worse, there is + NOTHING we can do to prevent it. */ + if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) { +#ifdef DEBUG + printk(KERN_ERR "i810_audio: recording schedule timeout, " + "dmasz %u fragsz %u count %i hwptr %u swptr %u\n", + dmabuf->dmasize, dmabuf->fragsize, dmabuf->count, + dmabuf->hwptr, dmabuf->swptr); +#endif + /* a buffer overrun, we delay the recovery untill next time the + while loop begin and we REALLY have space to record */ + } + if (signal_pending(current)) { + ret = ret ? ret : -ERESTARTSYS; + return ret; + } + continue; + } + + if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) { + if (!ret) ret = -EFAULT; + return ret; + } + + swptr = (swptr + cnt) % dmabuf->dmasize; + + spin_lock_irqsave(&state->card->lock, flags); + dmabuf->swptr = swptr; + dmabuf->count -= cnt; + spin_unlock_irqrestore(&state->card->lock, flags); + + count -= cnt; + buffer += cnt; + ret += cnt; + start_adc(state); + } + return ret; +} + +/* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to + the soundcard. it is drained by the dma machine and filled by this loop. */ +static ssize_t i810_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) +{ + struct i810_state *state = (struct i810_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + ssize_t ret; + unsigned long flags; + unsigned swptr; + int cnt; + +#ifdef DEBUG + printk("i810_audio: i810_write called, count = %d\n", count); +#endif + + if (ppos != &file->f_pos) + return -ESPIPE; + if (dmabuf->mapped) + return -ENXIO; + if (!dmabuf->ready && (ret = prog_dmabuf(state, 0))) + return ret; + if (!access_ok(VERIFY_READ, buffer, count)) + return -EFAULT; + ret = 0; + + while (count > 0) { + spin_lock_irqsave(&state->card->lock, flags); + if (dmabuf->count < 0) { + /* buffer underrun, we are recovering from sleep_on_timeout, + resync hwptr and swptr */ + dmabuf->count = 0; + dmabuf->swptr = dmabuf->hwptr; + } + swptr = dmabuf->swptr; + cnt = dmabuf->dmasize - swptr; + if (dmabuf->count + cnt > dmabuf->dmasize) + cnt = dmabuf->dmasize - dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); + + if (cnt > count) + cnt = count; + if (cnt <= 0) { + unsigned long tmo; + /* buffer is full, start the dma machine and wait for data to be + played */ + start_dac(state); + if (file->f_flags & O_NONBLOCK) { + if (!ret) ret = -EAGAIN; + return ret; + } + /* Not strictly correct but works */ + tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2); + tmo >>= sample_shift[dmabuf->fmt]; + /* There are two situations when sleep_on_timeout returns, one is when + the interrupt is serviced correctly and the process is waked up by + ISR ON TIME. Another is when timeout is expired, which means that + either interrupt is NOT serviced correctly (pending interrupt) or it + is TOO LATE for the process to be scheduled to run (scheduler latency) + which results in a (potential) buffer underrun. And worse, there is + NOTHING we can do to prevent it. */ + if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) { +#ifdef DEBUG + printk(KERN_ERR "i810_audio: playback schedule timeout, " + "dmasz %u fragsz %u count %i hwptr %u swptr %u\n", + dmabuf->dmasize, dmabuf->fragsize, dmabuf->count, + dmabuf->hwptr, dmabuf->swptr); +#endif + /* a buffer underrun, we delay the recovery untill next time the + while loop begin and we REALLY have data to play */ + } + if (signal_pending(current)) { + if (!ret) ret = -ERESTARTSYS; + return ret; + } + continue; + } + if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) { + if (!ret) ret = -EFAULT; + return ret; + } + + swptr = (swptr + cnt) % dmabuf->dmasize; + + spin_lock_irqsave(&state->card->lock, flags); + dmabuf->swptr = swptr; + dmabuf->count += cnt; + dmabuf->endcleared = 0; + spin_unlock_irqrestore(&state->card->lock, flags); + + count -= cnt; + buffer += cnt; + ret += cnt; + start_dac(state); + } + return ret; +} + +static unsigned int i810_poll(struct file *file, struct poll_table_struct *wait) +{ + struct i810_state *state = (struct i810_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + unsigned long flags; + unsigned int mask = 0; + + if (file->f_mode & FMODE_WRITE) + poll_wait(file, &dmabuf->wait, wait); + if (file->f_mode & FMODE_READ) + poll_wait(file, &dmabuf->wait, wait); + + spin_lock_irqsave(&state->card->lock, flags); + i810_update_ptr(state); + if (file->f_mode & FMODE_READ) { + if (dmabuf->count >= (signed)dmabuf->fragsize) + mask |= POLLIN | POLLRDNORM; + } + if (file->f_mode & FMODE_WRITE) { + if (dmabuf->mapped) { + if (dmabuf->count >= (signed)dmabuf->fragsize) + mask |= POLLOUT | POLLWRNORM; + } else { + if ((signed)dmabuf->dmasize >= dmabuf->count + (signed)dmabuf->fragsize) + mask |= POLLOUT | POLLWRNORM; + } + } + spin_unlock_irqrestore(&state->card->lock, flags); + + return mask; +} + +static int i810_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct i810_state *state = (struct i810_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + int ret; + unsigned long size; + + if (vma->vm_flags & VM_WRITE) { + if ((ret = prog_dmabuf(state, 0)) != 0) + return ret; + } else if (vma->vm_flags & VM_READ) { + if ((ret = prog_dmabuf(state, 1)) != 0) + return ret; + } else + return -EINVAL; + + if (vma->vm_offset != 0) + return -EINVAL; + size = vma->vm_end - vma->vm_start; + if (size > (PAGE_SIZE << dmabuf->buforder)) + return -EINVAL; + if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf), + size, vma->vm_page_prot)) + return -EAGAIN; + dmabuf->mapped = 1; + + return 0; +} + +static int i810_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +{ + struct i810_state *state = (struct i810_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + unsigned long flags; + audio_buf_info abinfo; + count_info cinfo; + int val, mapped, ret; + + mapped = ((file->f_mode & FMODE_WRITE) && dmabuf->mapped) || + ((file->f_mode & FMODE_READ) && dmabuf->mapped); +#ifdef DEBUG + printk("i810_audio: i810_ioctl, command = %2d, arg = 0x%08x\n", + _IOC_NR(cmd), arg ? *(int *)arg : 0); +#endif + + switch (cmd) + { + case OSS_GETVERSION: + return put_user(SOUND_VERSION, (int *)arg); + + case SNDCTL_DSP_RESET: + /* FIXME: spin_lock ? */ + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + synchronize_irq(); + dmabuf->ready = 0; + resync_dma_ptrs(state); + dmabuf->swptr = dmabuf->hwptr = 0; + dmabuf->count = dmabuf->total_bytes = 0; + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + synchronize_irq(); + resync_dma_ptrs(state); + dmabuf->ready = 0; + dmabuf->swptr = dmabuf->hwptr = 0; + dmabuf->count = dmabuf->total_bytes = 0; + } + return 0; + + case SNDCTL_DSP_SYNC: + if (file->f_mode & FMODE_WRITE) + return drain_dac(state, file->f_flags & O_NONBLOCK); + return 0; + + case SNDCTL_DSP_SPEED: /* set smaple rate */ + get_user_ret(val, (int *)arg, -EFAULT); + if (val >= 0) { + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dmabuf->ready = 0; + spin_lock_irqsave(&state->card->lock, flags); + i810_set_dac_rate(state, val); + spin_unlock_irqrestore(&state->card->lock, flags); + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dmabuf->ready = 0; + spin_lock_irqsave(&state->card->lock, flags); + i810_set_adc_rate(state, val); + spin_unlock_irqrestore(&state->card->lock, flags); + } + } + return put_user(dmabuf->rate, (int *)arg); + + case SNDCTL_DSP_STEREO: /* set stereo or mono channel */ + get_user_ret(val, (int *)arg, -EFAULT); + if(val==0) + return -EINVAL; + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dmabuf->ready = 0; + dmabuf->fmt = I810_FMT_STEREO; + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dmabuf->ready = 0; + dmabuf->fmt = I810_FMT_STEREO; + } + return 0; + + case SNDCTL_DSP_GETBLKSIZE: + if (file->f_mode & FMODE_WRITE) { + if ((val = prog_dmabuf(state, 0))) + return val; + return put_user(dmabuf->fragsize, (int *)arg); + } + if (file->f_mode & FMODE_READ) { + if ((val = prog_dmabuf(state, 1))) + return val; + return put_user(dmabuf->fragsize, (int *)arg); + } + + case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/ + return put_user(AFMT_S16_LE, (int *)arg); + + case SNDCTL_DSP_SETFMT: /* Select sample format */ + get_user_ret(val, (int *)arg, -EFAULT); + if (val != AFMT_QUERY) { + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dmabuf->ready = 0; + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dmabuf->ready = 0; + } + } + return put_user(AFMT_S16_LE, (int *)arg); + + case SNDCTL_DSP_CHANNELS: + get_user_ret(val, (int *)arg, -EFAULT); + if (val != 0) { + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dmabuf->ready = 0; + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dmabuf->ready = 0; + } + } + return put_user(2, (int *)arg); + + case SNDCTL_DSP_POST: + /* FIXME: the same as RESET ?? */ + return 0; + + case SNDCTL_DSP_SUBDIVIDE: + if (dmabuf->subdivision) + return -EINVAL; + get_user_ret(val, (int *)arg, -EFAULT); + if (val != 1 && val != 2 && val != 4) + return -EINVAL; + dmabuf->subdivision = val; + return 0; + + case SNDCTL_DSP_SETFRAGMENT: + get_user_ret(val, (int *)arg, -EFAULT); + + dmabuf->ossfragshift = val & 0xffff; + dmabuf->ossmaxfrags = (val >> 16) & 0xffff; + if (dmabuf->ossfragshift < 4) + dmabuf->ossfragshift = 4; + if (dmabuf->ossfragshift > 15) + dmabuf->ossfragshift = 15; + if (dmabuf->ossmaxfrags < 4) + dmabuf->ossmaxfrags = 4; + + return 0; + + case SNDCTL_DSP_GETOSPACE: + if (!(file->f_mode & FMODE_WRITE)) + return -EINVAL; + if (!dmabuf->enable && (val = prog_dmabuf(state, 0)) != 0) + return val; + spin_lock_irqsave(&state->card->lock, flags); + i810_update_ptr(state); + abinfo.fragsize = dmabuf->fragsize; + abinfo.bytes = dmabuf->dmasize - dmabuf->count; + abinfo.fragstotal = dmabuf->numfrag; + abinfo.fragments = abinfo.bytes >> dmabuf->fragshift; + spin_unlock_irqrestore(&state->card->lock, flags); + return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0; + + case SNDCTL_DSP_GETISPACE: + if (!(file->f_mode & FMODE_READ)) + return -EINVAL; + if (!dmabuf->enable && (val = prog_dmabuf(state, 1)) != 0) + return val; + spin_lock_irqsave(&state->card->lock, flags); + i810_update_ptr(state); + abinfo.fragsize = dmabuf->fragsize; + abinfo.bytes = dmabuf->count; + abinfo.fragstotal = dmabuf->numfrag; + abinfo.fragments = abinfo.bytes >> dmabuf->fragshift; + spin_unlock_irqrestore(&state->card->lock, flags); + return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0; + + case SNDCTL_DSP_NONBLOCK: + file->f_flags |= O_NONBLOCK; + return 0; + + case SNDCTL_DSP_GETCAPS: + return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP, + (int *)arg); + + case SNDCTL_DSP_GETTRIGGER: + val = 0; + if (file->f_mode & FMODE_READ && dmabuf->enable) + val |= PCM_ENABLE_INPUT; + if (file->f_mode & FMODE_WRITE && dmabuf->enable) + val |= PCM_ENABLE_OUTPUT; + return put_user(val, (int *)arg); + + case SNDCTL_DSP_SETTRIGGER: + get_user_ret(val, (int *)arg, -EFAULT); + if (file->f_mode & FMODE_READ) { + if (val & PCM_ENABLE_INPUT) { + if (!dmabuf->ready && (ret = prog_dmabuf(state, 1))) + return ret; + start_adc(state); + } else + stop_adc(state); + } + if (file->f_mode & FMODE_WRITE) { + if (val & PCM_ENABLE_OUTPUT) { + if (!dmabuf->ready && (ret = prog_dmabuf(state, 0))) + return ret; + start_dac(state); + } else + stop_dac(state); + } + return 0; + + case SNDCTL_DSP_GETIPTR: + if (!(file->f_mode & FMODE_READ)) + return -EINVAL; + spin_lock_irqsave(&state->card->lock, flags); + i810_update_ptr(state); + cinfo.bytes = dmabuf->total_bytes; + cinfo.blocks = dmabuf->count >> dmabuf->fragshift; + cinfo.ptr = dmabuf->hwptr; + if (dmabuf->mapped) + dmabuf->count &= dmabuf->fragsize-1; + spin_unlock_irqrestore(&state->card->lock, flags); + return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)); + + case SNDCTL_DSP_GETOPTR: + if (!(file->f_mode & FMODE_WRITE)) + return -EINVAL; + spin_lock_irqsave(&state->card->lock, flags); + i810_update_ptr(state); + cinfo.bytes = dmabuf->total_bytes; + cinfo.blocks = dmabuf->count >> dmabuf->fragshift; + cinfo.ptr = dmabuf->hwptr; + if (dmabuf->mapped) + dmabuf->count &= dmabuf->fragsize-1; + spin_unlock_irqrestore(&state->card->lock, flags); + return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)); + + case SNDCTL_DSP_SETDUPLEX: + return -EINVAL; + + case SNDCTL_DSP_GETODELAY: + if (!(file->f_mode & FMODE_WRITE)) + return -EINVAL; + spin_lock_irqsave(&state->card->lock, flags); + i810_update_ptr(state); + val = dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); + return put_user(val, (int *)arg); + + case SOUND_PCM_READ_RATE: + return put_user(dmabuf->rate, (int *)arg); + + case SOUND_PCM_READ_CHANNELS: + return put_user((dmabuf->fmt & I810_FMT_STEREO) ? 2 : 1, + (int *)arg); + + case SOUND_PCM_READ_BITS: + return put_user(AFMT_S16_LE, (int *)arg); + + case SNDCTL_DSP_MAPINBUF: + case SNDCTL_DSP_MAPOUTBUF: + case SNDCTL_DSP_SETSYNCRO: + case SOUND_PCM_WRITE_FILTER: + case SOUND_PCM_READ_FILTER: + return -EINVAL; + } + return -EINVAL; +} + +static int i810_open(struct inode *inode, struct file *file) +{ + int i = 0; + int minor = MINOR(inode->i_rdev); + struct i810_card *card = devs; + struct i810_state *state = NULL; + struct dmabuf *dmabuf = NULL; + + /* find an avaiable virtual channel (instance of /dev/dsp) */ + while (card != NULL) { + for (i = 0; i < NR_HW_CH; i++) { + if (card->states[i] == NULL) { + state = card->states[i] = (struct i810_state *) + kmalloc(sizeof(struct i810_state), GFP_KERNEL); + if (state == NULL) + return -ENOMEM; + memset(state, 0, sizeof(struct i810_state)); + dmabuf = &state->dmabuf; + goto found_virt; + } + } + card = card->next; + } + /* no more virtual channel avaiable */ + if (!state) + return -ENODEV; + + found_virt: + /* found a free virtual channel, allocate hardware channels */ + if(file->f_mode & FMODE_READ) + dmabuf->channel = card->alloc_rec_pcm_channel(card); + else + dmabuf->channel = card->alloc_pcm_channel(card); + + if (dmabuf->channel == NULL) { + kfree (card->states[i]); + card->states[i] = NULL;; + return -ENODEV; + } + + /* initialize the virtual channel */ + state->virt = i; + state->card = card; + state->magic = I810_STATE_MAGIC; + dmabuf->wait = NULL; + state->open_sem = MUTEX; + file->private_data = state; + + down(&state->open_sem); + + /* set default sample format. According to OSS Programmer's Guide /dev/dsp + should be default to unsigned 8-bits, mono, with sample rate 8kHz and + /dev/dspW will accept 16-bits sample */ + if (file->f_mode & FMODE_WRITE) { + dmabuf->fmt &= ~I810_FMT_MASK; + dmabuf->fmt |= I810_FMT_16BIT; + dmabuf->ossfragshift = 0; + dmabuf->ossmaxfrags = 0; + dmabuf->subdivision = 0; + i810_set_dac_rate(state, 48000); + } + + if (file->f_mode & FMODE_READ) { + dmabuf->fmt &= ~I810_FMT_MASK; + dmabuf->fmt |= I810_FMT_16BIT; + dmabuf->ossfragshift = 0; + dmabuf->ossmaxfrags = 0; + dmabuf->subdivision = 0; + i810_set_adc_rate(state, 48000); + } + + state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); + up(&state->open_sem); + + MOD_INC_USE_COUNT; + return 0; +} + +static int i810_release(struct inode *inode, struct file *file) +{ + struct i810_state *state = (struct i810_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + + if (file->f_mode & FMODE_WRITE) { + /* FIXME :.. */ + i810_clear_tail(state); + drain_dac(state, file->f_flags & O_NONBLOCK); + } + + /* stop DMA state machine and free DMA buffers/channels */ + down(&state->open_sem); + + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dealloc_dmabuf(state); + state->card->free_pcm_channel(state->card, dmabuf->channel->num); + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dealloc_dmabuf(state); + state->card->free_pcm_channel(state->card, dmabuf->channel->num); + } + + kfree(state->card->states[state->virt]); + state->card->states[state->virt] = NULL; + state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); + + /* we're covered by the open_sem */ + up(&state->open_sem); + + MOD_DEC_USE_COUNT; + return 0; +} + +static /*const*/ struct file_operations i810_audio_fops = { + llseek: i810_llseek, + read: i810_read, + write: i810_write, + poll: i810_poll, + ioctl: i810_ioctl, + mmap: i810_mmap, + open: i810_open, + release: i810_release, +}; + +/* Write AC97 codec registers */ + +static u16 i810_ac97_get(struct ac97_codec *dev, u8 reg) +{ + struct i810_card *card = dev->private_data; + int count = 100; + + while(count-- && (inb(card->iobase + CAS) & 1)) + udelay(1); + return inw(card->ac97base + (reg&0x7f)); +} + +static void i810_ac97_set(struct ac97_codec *dev, u8 reg, u16 data) +{ + struct i810_card *card = dev->private_data; + int count = 100; + + while(count-- && (inb(card->iobase + CAS) & 1)) + udelay(1); + outw(data, card->ac97base + (reg&0x7f)); +} + + +/* OSS /dev/mixer file operation methods */ + +static int i810_open_mixdev(struct inode *inode, struct file *file) +{ + int i; + int minor = MINOR(inode->i_rdev); + struct i810_card *card = devs; + + for (card = devs; card != NULL; card = card->next) + for (i = 0; i < NR_AC97; i++) + if (card->ac97_codec[i] != NULL && + card->ac97_codec[i]->dev_mixer == minor) + goto match; + + if (!card) + return -ENODEV; + + match: + file->private_data = card->ac97_codec[i]; + + MOD_INC_USE_COUNT; + return 0; +} + +static int i810_release_mixdev(struct inode *inode, struct file *file) +{ + MOD_DEC_USE_COUNT; + return 0; +} + +static int i810_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct ac97_codec *codec = (struct ac97_codec *)file->private_data; + + return codec->mixer_ioctl(codec, cmd, arg); +} + +static /*const*/ struct file_operations i810_mixer_fops = { + llseek: i810_llseek, + ioctl: i810_ioctl_mixdev, + open: i810_open_mixdev, + release: i810_release_mixdev, +}; + +/* AC97 codec initialisation. */ +static int __init i810_ac97_init(struct i810_card *card) +{ + int num_ac97 = 0; + int ready_2nd = 0; + struct ac97_codec *codec; + u16 eid; + + outl(0, card->iobase + GLOB_CNT); + udelay(500); + outl(1<<1, card->iobase + GLOB_CNT); + + for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) { + if ((codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL)) == NULL) + return -ENOMEM; + memset(codec, 0, sizeof(struct ac97_codec)); + + /* initialize some basic codec information, other fields will be filled + in ac97_probe_codec */ + codec->private_data = card; + codec->id = num_ac97; + + codec->codec_read = i810_ac97_get; + codec->codec_write = i810_ac97_set; + + if (ac97_probe_codec(codec) == 0) + break; + + eid = i810_ac97_get(codec, AC97_EXTENDED_ID); + + if(eid==0xFFFFFF) + { + printk(KERN_WARNING "i810_audio: no codec attached ?\n"); + kfree(codec); + break; + } + + card->ac97_features = eid; + + if(!(eid&0x0001)) + printk(KERN_WARNING "i810_audio: only 48Khz playback available.\n"); + else + /* Enable variable rate mode */ + i810_ac97_set(codec, AC97_EXTENDED_STATUS, + i810_ac97_get(codec,AC97_EXTENDED_STATUS)|1); + + if ((codec->dev_mixer = register_sound_mixer(&i810_mixer_fops, -1)) < 0) { + printk(KERN_ERR "i810_audio: couldn't register mixer!\n"); + kfree(codec); + break; + } + + /* Now check the codec for useful features to make up for + the dumbness of the 810 hardware engine */ + + card->ac97_codec[num_ac97] = codec; + + /* if there is no secondary codec at all, don't probe any more */ + if (!ready_2nd) + return num_ac97+1; + } + return num_ac97; +} + +/* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered + untill "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */ + +static int __init i810_install(struct pci_dev *pci_dev, int type, char *name) +{ + struct i810_card *card; + + if ((card = kmalloc(sizeof(struct i810_card), GFP_KERNEL)) == NULL) { + printk(KERN_ERR "i810_audio: out of memory\n"); + return -ENOMEM; + } + memset(card, 0, sizeof(*card)); + + card->iobase = pci_dev->base_address[1]&PCI_BASE_ADDRESS_IO_MASK; + card->ac97base = pci_dev->base_address[0]&PCI_BASE_ADDRESS_IO_MASK; + card->pci_dev = pci_dev; + card->pci_id = type; + card->irq = pci_dev->irq; + card->next = devs; + card->magic = I810_CARD_MAGIC; + spin_lock_init(&card->lock); + devs = card; + + pci_set_master(pci_dev); + + printk(KERN_INFO "i810: %s found at IO 0x%04lx and 0x%04lx, IRQ %d\n", + name, card->iobase, card->ac97base, card->irq); + + card->alloc_pcm_channel = i810_alloc_pcm_channel; + card->alloc_rec_pcm_channel = i810_alloc_rec_pcm_channel; + card->free_pcm_channel = i810_free_pcm_channel; + + /* claim our iospace and irq */ + request_region(card->iobase, 64, name); + request_region(card->ac97base, 256, name); + + if (request_irq(card->irq, &i810_interrupt, SA_SHIRQ, name, card)) { + printk(KERN_ERR "i810_audio: unable to allocate irq %d\n", card->irq); + release_region(card->iobase, 64); + release_region(card->ac97base, 256); + kfree(card); + return -ENODEV; + } + /* register /dev/dsp */ + if ((card->dev_audio = register_sound_dsp(&i810_audio_fops, -1)) < 0) { + printk(KERN_ERR "i810_audio: couldn't register DSP device!\n"); + release_region(card->iobase, 64); + release_region(card->ac97base, 256); + free_irq(card->irq, card); + kfree(card); + return -ENODEV; + } + + + /* initialize AC97 codec and register /dev/mixer */ + if (i810_ac97_init(card) <= 0) { + unregister_sound_dsp(card->dev_audio); + release_region(card->iobase, 64); + release_region(card->ac97base, 256); + free_irq(card->irq, card); + kfree(card); + return -ENODEV; + } + +// printk("resetting codec?\n"); + outl(0, card->iobase + GLOB_CNT); + udelay(500); +// printk("bringing it back?\n"); + outl(1<<1, card->iobase + GLOB_CNT); + return 0; +} + +static void i810_remove(struct i810_card *card) +{ + int i; + /* free hardware resources */ + free_irq(card->irq, card); + release_region(card->iobase, 64); + release_region(card->ac97base, 256); + + /* unregister audio devices */ + for (i = 0; i < NR_AC97; i++) + if (card->ac97_codec[i] != NULL) { + unregister_sound_mixer(card->ac97_codec[i]->dev_mixer); + kfree (card->ac97_codec[i]); + } + unregister_sound_dsp(card->dev_audio); + kfree(card); +} + +MODULE_AUTHOR("Assorted"); +MODULE_DESCRIPTION("Intel 810 audio support"); + +int __init i810_probe(void) +{ + struct pci_dev *pcidev = NULL; + int foundone=0; + + if (!pci_present()) /* No PCI bus in this machine! */ + return -ENODEV; + + printk(KERN_INFO "Intel 810 + AC97 Audio, version " + DRIVER_VERSION ", " __TIME__ " " __DATE__ "\n"); + + while( (pcidev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801, pcidev))!=NULL ) { + if (i810_install(pcidev, ICH82801AA, "Intel ICH 82801AA")==0) + foundone++; + } + while( (pcidev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82901, pcidev))!=NULL ) { + if (i810_install(pcidev, ICH82901AB, "Intel ICH 82901AB")==0) + foundone++; + } + while( (pcidev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_440MX, pcidev))!=NULL ) { + if (i810_install(pcidev, INTEL440MX, "Intel 440MX")==0) + foundone++; + } + + printk(KERN_INFO "i810_audio: Found %d audio device(s).\n", + foundone); + return foundone; +} + +#ifdef MODULE + +int init_module(void) +{ + if(i810_probe()==0) + printk(KERN_ERR "i810_audio: No devices found.\n"); + return 0; +} + +void cleanup_module (void) +{ + struct i810_card *next; + while(devs) + { + next=devs->next; + i810_remove(devs); + devs=next; + } +} + +#endif \ No newline at end of file diff -urN v2.2.15/linux/drivers/sound/maestro.c linux/drivers/sound/maestro.c --- v2.2.15/linux/drivers/sound/maestro.c Wed May 3 17:16:46 2000 +++ linux/drivers/sound/maestro.c Wed Jun 7 14:26:43 2000 @@ -2407,10 +2407,24 @@ struct ess_state *s = (struct ess_state *)file->private_data; unsigned long flags; unsigned int mask = 0; + int ret; VALIDATE_STATE(s); + + +/* In 0.14 prog_dmabuf always returns success anyway ... */ + if (file->f_mode & FMODE_WRITE) { + if (!s->dma_dac.ready && (ret = prog_dmabuf(s, 0))) + return POLLERR; + } + if (file->f_mode & FMODE_READ) { + if (!s->dma_adc.ready && (ret = prog_dmabuf(s, 1))) + return POLLERR; + } + if (file->f_mode & (FMODE_WRITE|FMODE_READ)) poll_wait(file, &s->poll_wait, wait); + spin_lock_irqsave(&s->lock, flags); ess_update_ptr(s); if (file->f_mode & FMODE_READ) { @@ -3448,6 +3462,7 @@ unregister_sound_dsp(s->dev_audio); } release_region(card->iobase, 256); + unregister_reboot_notifier(&maestro_nb); kfree(card); return 0; } diff -urN v2.2.15/linux/drivers/sound/pss.c linux/drivers/sound/pss.c --- v2.2.15/linux/drivers/sound/pss.c Wed Dec 16 12:52:01 1998 +++ linux/drivers/sound/pss.c Wed Jun 7 14:26:43 2000 @@ -24,6 +24,30 @@ * To probe_pss_mss added test for initialize AD1848 * 98-05-28: Vladimir Michl * Fixed computation of mixer volumes + * 04-05-1999: Anthony Barbachan + * Added code that allows the user to enable his cdrom and/or + * joystick through the module parameters pss_cdrom_port and + * pss_enable_joystick. pss_cdrom_port takes a port address as its + * argument. pss_enable_joystick takes either a 0 or a non-0 as its + * argument. + * 04-06-1999: Anthony Barbachan + * Separated some code into new functions for easier reuse. + * Cleaned up and streamlined new code. Added code to allow a user + * to only use this driver for enabling non-sound components + * through the new module parameter pss_no_sound (flag). Added + * code that would allow a user to decide whether the driver should + * reset the configured hardware settings for the PSS board through + * the module parameter pss_keep_settings (flag). This flag will + * allow a user to free up resources in use by this card if needbe, + * furthermore it allows him to use this driver to just enable the + * emulations and then be unloaded as it is no longer needed. Both + * new settings are only available to this driver if compiled as a + * module. The default settings of all new parameters are set to + * load the driver as it did in previous versions. + * 04-07-1999: Anthony Barbachan + * Added module parameter pss_firmware to allow the user to tell + * the driver where the fireware file is located. The default + * setting is the previous hardcoded setting "/etc/sound/pss_synth". */ @@ -87,8 +111,7 @@ #include "pss_boot.h" #else static int pss_synthLen = 0; -static unsigned char *pss_synth = -NULL; +static unsigned char *pss_synth = NULL; #endif /* If compiled into kernel, it enable or disable pss mixer */ @@ -121,6 +144,8 @@ static int pss_initialized = 0; static int nonstandard_microcode = 0; +static int pss_cdrom_port = -1; /* Parameter for the PSS cdrom port */ +static int pss_enable_joystick = 0;/* Parameter for enabling the joystick */ static void pss_write(pss_confdata *devc, int data) { @@ -578,6 +603,49 @@ pss_mixer_ioctl }; +void disable_all_emulations(void) +{ + outw(0x0000, REG(CONF_PSS)); /* 0x0400 enables joystick */ + outw(0x0000, REG(CONF_WSS)); + outw(0x0000, REG(CONF_SB)); + outw(0x0000, REG(CONF_MIDI)); + outw(0x0000, REG(CONF_CDROM)); +} + +void configure_nonsound_components(void) +{ + /* Configure Joystick port */ + + if(pss_enable_joystick) + { + outw(0x0400, REG(CONF_PSS)); /* 0x0400 enables joystick */ + printk(KERN_INFO "PSS: joystick enabled.\n"); + } + else + { + printk(KERN_INFO "PSS: joystick port not enabled.\n"); + } + + /* Configure CDROM port */ + + if(pss_cdrom_port == -1) /* If cdrom port enablation wasn't requested */ + { + printk(KERN_INFO "PSS: CDROM port not enabled.\n"); + } + else if(check_region(pss_cdrom_port, 2)) + { + printk(KERN_ERR "PSS: CDROM I/O port conflict.\n"); + } + else if(!set_io_base(devc, CONF_CDROM, pss_cdrom_port)) + { + printk(KERN_ERR "PSS: CDROM I/O port could not be set.\n"); + } + else /* CDROM port successfully configured */ + { + printk(KERN_INFO "PSS: CDROM I/O port set to 0x%x.\n", pss_cdrom_port); + } +} + void attach_pss(struct address_info *hw_config) { unsigned short id; @@ -598,13 +666,10 @@ id = inw(REG(PSS_ID)) & 0x00ff; /* - * Disable all emulations. Will be enabled later (if required). + * Disable all emulations. Will be enabled later (if required). */ - outw(0x0000, REG(CONF_PSS)); /* 0x0400 enables joystick */ - outw(0x0000, REG(CONF_WSS)); - outw(0x0000, REG(CONF_SB)); - outw(0x0000, REG(CONF_MIDI)); - outw(0x0000, REG(CONF_CDROM)); + + disable_all_emulations(); #if YOU_REALLY_WANT_TO_ALLOCATE_THESE_RESOURCES if (sound_alloc_dma(hw_config->dma, "PSS")) @@ -624,6 +689,7 @@ } #endif + configure_nonsound_components(); pss_initialized = 1; sprintf(tmp, "ECHO-PSS Rev. %d", id); conf_printf(tmp, hw_config); @@ -1028,6 +1094,8 @@ #ifdef MODULE int pss_io = -1; +int pss_no_sound = 0; /* Just configure non-sound components */ +int pss_keep_settings = 1; /* Keep hardware settings at module exit */ int mss_io = -1; int mss_irq = -1; @@ -1035,6 +1103,7 @@ int mpu_io = -1; int mpu_irq = -1; +char* pss_firmware = "/etc/sound/pss_synth"; struct address_info cfgpss = { 0 /* pss_io */, 0, -1, -1 }; struct address_info cfgmpu = { 0 /* mpu_io */, 0 /* mpu_irq */, 0, -1 }; @@ -1052,6 +1121,16 @@ MODULE_PARM_DESC(mpu_io, "Set MIDI i/o base (0x330 or other. Address must be on 4 location boundaries and must be from 0x100 to 0xFFC)"); MODULE_PARM(mpu_irq, "i"); MODULE_PARM_DESC(mpu_irq, "Set MIDI IRQ (3, 5, 7, 9, 10, 11, 12)"); +MODULE_PARM(pss_cdrom_port, "i"); +MODULE_PARM_DESC(pss_cdrom_port, "Set the PSS CDROM port i/o base (0x340 or other)"); +MODULE_PARM(pss_enable_joystick, "i"); +MODULE_PARM_DESC(pss_enable_joystick, "Enables the PSS joystick port (1 to enable, 0 to disable)"); +MODULE_PARM(pss_no_sound, "i"); +MODULE_PARM_DESC(pss_no_sound, "Configure sound compoents (0 - no, 1 - yes)"); +MODULE_PARM(pss_keep_settings, "i"); +MODULE_PARM_DESC(pss_keep_settings, "Keep hardware setting at driver unloading (0 - no, 1 - yes)"); +MODULE_PARM(pss_firmware, "s"); +MODULE_PARM_DESC(pss_firmware, "Location of the firmware file (default - /etc/sound/pss_synth)"); MODULE_PARM(pss_mixer, "b"); MODULE_PARM_DESC(pss_mixer, "Enable (1) or disable (0) PSS mixer (controlling of output volume, bass, treble, synth volume). The mixer is not available on all PSS cards."); MODULE_AUTHOR("Hannu Savolainen, Vladimir Michl"); @@ -1066,6 +1145,17 @@ int init_module(void) { + if(pss_no_sound) /* If configuring only nonsound components */ + { + cfgpss.io_base = pss_io; + if(!probe_pss(&cfgpss)) return -ENODEV; + printk(KERN_INFO "ECHO-PSS Rev. %d\n", inw(REG(PSS_ID)) & 0x00ff); + printk(KERN_INFO "PSS: loading in no sound mode.\n"); + disable_all_emulations(); + configure_nonsound_components(); + return 0; + } + if (pss_io == -1 || mss_io == -1 || mss_irq == -1 || mss_dma == -1) { printk(KERN_INFO "pss: mss_io, mss_dma, mss_irq and pss_io must be set.\n"); return -EINVAL; @@ -1083,7 +1173,7 @@ if (!pss_synth) { fw_load = 1; - pss_synthLen = mod_firmware_load("/etc/sound/pss_synth", (void *) &pss_synth); + pss_synthLen = mod_firmware_load(pss_firmware, (void *) &pss_synth); } if (!probe_pss(&cfgpss)) return -ENODEV; @@ -1105,14 +1195,23 @@ void cleanup_module(void) { - if (fw_load && pss_synth) - vfree(pss_synth); - if (pssmss) - unload_pss_mss(&cfgmss); - if (pssmpu) - unload_pss_mpu(&cfgmpu); - unload_pss(&cfgpss); - SOUND_LOCK_END; + if(!pss_no_sound) + { + if(fw_load && pss_synth) + vfree(pss_synth); + if(pssmss) + unload_pss_mss(&cfgmss); + if(pssmpu) + unload_pss_mpu(&cfgmpu); + unload_pss(&cfgpss); + SOUND_LOCK_END; + } + + if(!pss_keep_settings) /* Keep hardware settings if asked */ + { + disable_all_emulations(); + printk(KERN_INFO "Resetting PSS sound card configurations.\n"); + } } #endif #endif diff -urN v2.2.15/linux/drivers/sound/sound_core.c linux/drivers/sound/sound_core.c --- v2.2.15/linux/drivers/sound/sound_core.c Tue Jan 4 10:12:22 2000 +++ linux/drivers/sound/sound_core.c Wed Jun 7 14:26:43 2000 @@ -58,6 +58,12 @@ #ifdef CONFIG_SOUND_MAESTRO extern int init_maestro(void); #endif +#ifdef CONFIG_SOUND_TRIDENT +extern int init_trident(void); +#endif +#ifdef CONFIG_SOUND_ICH +extern int i810_probe(void); +#endif #ifdef CONFIG_SOUND_ES1370 extern int init_es1370(void); #endif @@ -73,6 +79,9 @@ #ifdef CONFIG_SOUND_ESSSOLO1 extern int init_solo1(void); #endif +#ifdef CONFIG_SOUND_YMPCI +extern init_ymf7xxsb_module(); +#endif /* * Low level list operator. Scan the ordered list, find a hole and @@ -416,6 +425,9 @@ #ifdef CONFIG_SOUND_MAESTRO init_maestro(); #endif +#ifdef CONFIG_SOUND_TRIDENT + init_trident(); +#endif #ifdef CONFIG_SOUND_MSNDCLAS msnd_classic_init(); #endif @@ -424,6 +436,12 @@ #endif #ifdef CONFIG_SOUND_ESSSOLO1 init_solo1(); +#endif +#ifdef CONFIG_SOUND_ICH + i810_probe(); +#endif +#ifdef CONFIG_SOUND_YMPCI + init_ymf7xxsb_module(); #endif return 0; } diff -urN v2.2.15/linux/drivers/sound/trident.c linux/drivers/sound/trident.c --- v2.2.15/linux/drivers/sound/trident.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/sound/trident.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,2504 @@ +/* + * + * Trident 4D-Wave/SiS 7018 OSS driver for Linux 2.2.x + * + * Driver: Alan Cox + * + * Built from: + * Low level code: from ALSA + * Framework: Thomas Sailer + * Extended by: Zach Brown + * + * Hacked up by: + * Aaron Holtzman + * Ollie Lho SiS 7018 Audio Core Support + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * History + * v0.14.5 June 3 2000 Ollie Lho + * Misc bug fix from the Net + * Backported from 2.4.0-test1 to 2.2.16 (Eric Brombaugh) + * v0.14.4 May 20 2000 Aaron Holtzman + * Fix kfree'd memory access in release + * Fix race in open while looking for a free virtual channel slot + * remove open_wait wq (which appears to be unused) + * v0.14.3 May 10 2000 Ollie Lho + * fixed a small bug in trident_update_ptr, xmms 1.0.1 no longer uses 100% CPU + * v0.14.2 Mar 29 2000 Ching Ling Lee + * Add clear to silence advance in trident_update_ptr + * fix invalid data of the end of the sound + * v0.14.1 Mar 24 2000 Ching Ling Lee + * ALi 5451 support added, playback and recording O.K. + * ALi 5451 originally developed and structured based on sonicvibes, and + * suggested to merge into this file by Alan Cox. + * v0.14 Mar 15 2000 Ollie Lho + * 5.1 channel output support with channel binding. What's the Matrix ? + * v0.13.1 Mar 10 2000 Ollie Lho + * few minor bugs on dual codec support, needs more testing + * v0.13 Mar 03 2000 Ollie Lho + * new pci_* for 2.4 kernel, back ported to 2.2 + * v0.12 Feb 23 2000 Ollie Lho + * Preliminary Recording support + * v0.11.2 Feb 19 2000 Ollie Lho + * removed incomplete full-dulplex support + * v0.11.1 Jan 28 2000 Ollie Lho + * small bug in setting sample rate for 4d-nx (reported by Aaron) + * v0.11 Jan 27 2000 Ollie Lho + * DMA bug, scheduler latency, second try + * v0.10 Jan 24 2000 Ollie Lho + * DMA bug fixed, found kernel scheduling problem + * v0.09 Jan 20 2000 Ollie Lho + * Clean up of channel register access routine (prepare for channel binding) + * v0.08 Jan 14 2000 Ollie Lho + * Isolation of AC97 codec code + * v0.07 Jan 13 2000 Ollie Lho + * Get rid of ugly old low level access routines (e.g. CHRegs.lp****) + * v0.06 Jan 11 2000 Ollie Lho + * Preliminary support for dual (more ?) AC97 codecs + * v0.05 Jan 08 2000 Luca Montecchiani + * adapt to 2.3.x new __setup/__init call + * v0.04 Dec 31 1999 Ollie Lho + * Multiple Open, using Middle Loop Interrupt to smooth playback + * v0.03 Dec 24 1999 Ollie Lho + * mem leak in prog_dmabuf and dealloc_dmabuf removed + * v0.02 Dec 15 1999 Ollie Lho + * SiS 7018 support added, playback O.K. + * v0.01 Alan Cox et. al. + * Initial Release in kernel 2.3.30, does not work + * + * ToDo + * Clean up of low level channel register access code. (done) + * Fix the bug on dma buffer management in update_ptr, read/write, drain_dac (done) + * Dual AC97 codecs support (done) + * Recording support (done) + * Mmap support + * "Channel Binding" ioctl extension (done) + * new pci device driver interface for 2.4 kernel (done) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "trident.h" + +#define DRIVER_VERSION "0.14.5" + +/* magic numbers to protect our data structures */ +#define TRIDENT_CARD_MAGIC 0x5072696E /* "Prin" */ +#define TRIDENT_STATE_MAGIC 0x63657373 /* "cess" */ + +#define TRIDENT_DMA_MASK 0x3fffffff /* DMA buffer mask for pci_alloc_consist */ + +#define NR_HW_CH 32 + +/* maxinum nuber of AC97 codecs connected, AC97 2.0 defined 4, but 7018 and 4D-NX only + have 2 SDATA_IN lines (currently) */ +#define NR_AC97 2 + +/* minor number of /dev/dspW */ +#define SND_DEV_DSP8 3 + +/* minor number of /dev/dspW */ +#define SND_DEV_DSP16 5 + +/* minor number of /dev/swmodem (temporary, experimental) */ +#define SND_DEV_SWMODEM 7 + +static const unsigned sample_size[] = { 1, 2, 2, 4 }; +static const unsigned sample_shift[] = { 0, 1, 1, 2 }; + +static const char invalid_magic[] = KERN_CRIT "trident: invalid magic value in %s\n"; + +struct pci_audio_info { + u16 vendor; + u16 device; + char *name; +}; + +static struct pci_audio_info pci_audio_devices[] = { + {PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX, "Trident 4DWave DX"}, + {PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX, "Trident 4DWave NX"}, + {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018, "SiS 7018 PCI Audio"}, + {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI_5451, "ALi Audio Accelerator"} +}; + +/* "software" or virtual channel, an instance of opened /dev/dsp */ +struct trident_state { + unsigned int magic; + struct trident_card *card; /* Card info */ + + /* file mode */ + mode_t open_mode; + + /* virtual channel number */ + int virt; + + struct dmabuf { + /* wave sample stuff */ + unsigned int rate; + unsigned char fmt, enable; + + /* hardware channel */ + struct trident_channel *channel; + + /* OSS buffer management stuff */ + void *rawbuf; + + unsigned buforder; + unsigned numfrag; + unsigned fragshift; + + /* our buffer acts like a circular ring */ + unsigned hwptr; /* where dma last started, updated by update_ptr */ + unsigned swptr; /* where driver last clear/filled, updated by read/write */ + int count; /* bytes to be comsumed or been generated by dma machine */ + unsigned total_bytes; /* total bytes dmaed by hardware */ + + unsigned error; /* number of over/underruns */ + struct wait_queue *wait; /* put process on wait queue when no more space in buffer */ + + /* redundant, but makes calculations easier */ + unsigned fragsize; + unsigned dmasize; + unsigned fragsamples; + + /* OSS stuff */ + unsigned mapped:1; + unsigned ready:1; + unsigned endcleared:1; + unsigned update_flag; + unsigned ossfragshift; + int ossmaxfrags; + unsigned subdivision; + } dmabuf; +}; + +/* hardware channels */ +struct trident_channel { + int num; /* channel number */ + u32 lba; /* Loop Begine Address, where dma buffer starts */ + u32 eso; /* End Sample Offset, wehre dma buffer ends (in the unit of samples) */ + u32 delta; /* delta value, sample rate / 48k for playback, 48k/sample rate for recording */ + u16 attribute; /* control where PCM data go and come */ + u16 fm_vol; + u32 control; /* signed/unsigned, 8/16 bits, mono/stereo */ +}; + +struct trident_pcm_bank_address { + u32 start; + u32 stop; + u32 aint; + u32 aint_en; +}; +static struct trident_pcm_bank_address bank_a_addrs = +{ + T4D_START_A, + T4D_STOP_A, + T4D_AINT_A, + T4D_AINTEN_A +}; +static struct trident_pcm_bank_address bank_b_addrs = +{ + T4D_START_B, + T4D_STOP_B, + T4D_AINT_B, + T4D_AINTEN_B +}; +struct trident_pcm_bank { + /* register addresses to control bank operations */ + struct trident_pcm_bank_address *addresses; + /* each bank has 32 channels */ + u32 bitmap; /* channel allocation bitmap */ + struct trident_channel channels[32]; +}; + +struct trident_card { + unsigned int magic; + + /* We keep trident cards in a linked list */ + struct trident_card *next; + + /* single open lock mechanism, only used for recording */ + struct semaphore open_sem; + + /* The trident has a certain amount of cross channel interaction + so we use a single per card lock */ + spinlock_t lock; + + /* PCI device stuff */ + struct pci_audio_info *pci_info; + struct pci_dev * pci_dev; + u16 pci_id; + u8 revision; + + /* soundcore stuff */ + int dev_audio; + + /* structures for abstraction of hardware facilities, codecs, banks and channels*/ + struct ac97_codec *ac97_codec[NR_AC97]; + struct trident_pcm_bank banks[NR_BANKS]; + struct trident_state *states[NR_HW_CH]; + + /* hardware resources */ + unsigned long iobase; + u32 irq; + + /* Function support */ + struct trident_channel *(*alloc_pcm_channel)(struct trident_card *); + struct trident_channel *(*alloc_rec_pcm_channel)(struct trident_card *); + void (*free_pcm_channel)(struct trident_card *, int chan); + void (*address_interrupt)(struct trident_card *); +}; + +static struct trident_card *devs = NULL; + +static void ali_ac97_set(struct ac97_codec *codec, u8 reg, u16 val); +static u16 ali_ac97_get(struct ac97_codec *codec, u8 reg); + +static void trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val); +static u16 trident_ac97_get(struct ac97_codec *codec, u8 reg); + +static int trident_open_mixdev(struct inode *inode, struct file *file); +static int trident_release_mixdev(struct inode *inode, struct file *file); +static int trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, + unsigned long arg); +static loff_t trident_llseek(struct file *file, loff_t offset, int origin); + +static int trident_enable_loop_interrupts(struct trident_card * card) +{ + u32 global_control; + + global_control = inl(TRID_REG(card, T4D_LFO_GC_CIR)); + + switch (card->pci_id) + { + case PCI_DEVICE_ID_SI_7018: + global_control |= (ENDLP_IE | MIDLP_IE| BANK_B_EN); + break; + case PCI_DEVICE_ID_ALI_5451: + case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX: + case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX: + global_control |= (ENDLP_IE | MIDLP_IE); + break; + default: + return FALSE; + } + + outl(global_control, TRID_REG(card, T4D_LFO_GC_CIR)); + +#ifdef DEBUG + printk("trident: Enable Loop Interrupts, globctl = 0x%08X\n", + global_control); +#endif + return (TRUE); +} + +static int trident_disable_loop_interrupts(struct trident_card * card) +{ + u32 global_control; + + global_control = inl(TRID_REG(card, T4D_LFO_GC_CIR)); + global_control &= ~(ENDLP_IE | MIDLP_IE); + outl(global_control, TRID_REG(card, T4D_LFO_GC_CIR)); + +#ifdef DEBUG + printk("trident: Disabled Loop Interrupts, globctl = 0x%08X\n", + global_control); +#endif + return (TRUE); +} + +static void trident_enable_voice_irq(struct trident_card * card, unsigned int channel) +{ + unsigned int mask = 1 << (channel & 0x1f); + struct trident_pcm_bank *bank = &card->banks[channel >> 5]; + u32 reg, addr = bank->addresses->aint_en; + + reg = inl(TRID_REG(card, addr)); + reg |= mask; + outl(reg, TRID_REG(card, addr)); + +#ifdef DEBUG + reg = inl(TRID_REG(card, T4D_AINTEN_B)); + printk("trident: enabled IRQ on channel %d, AINTEN_B = 0x%08x\n", + channel, reg); +#endif +} + +static void trident_disable_voice_irq(struct trident_card * card, unsigned int channel) +{ + unsigned int mask = 1 << (channel & 0x1f); + struct trident_pcm_bank *bank = &card->banks[channel >> 5]; + u32 reg, addr = bank->addresses->aint_en; + + reg = inl(TRID_REG(card, addr)); + reg &= ~mask; + outl(reg, TRID_REG(card, addr)); + + /* Ack the channel in case the interrupt was set before we disable it. */ + outl(mask, TRID_REG(card, bank->addresses->aint)); + +#ifdef DEBUG + reg = inl(TRID_REG(card, T4D_AINTEN_B)); + printk("trident: disabled IRQ on channel %d, AINTEN_B = 0x%08x\n", + channel, reg); +#endif +} + +static void trident_start_voice(struct trident_card * card, unsigned int channel) +{ + unsigned int mask = 1 << (channel & 0x1f); + struct trident_pcm_bank *bank = &card->banks[channel >> 5]; + u32 addr = bank->addresses->start; + +#ifdef DEBUG + u32 reg; +#endif + + outl(mask, TRID_REG(card, addr)); + +#ifdef DEBUG + reg = inl(TRID_REG(card, T4D_START_B)); + printk("trident: start voice on channel %d, START_B = 0x%08x\n", + channel, reg); +#endif +} + +static void trident_stop_voice(struct trident_card * card, unsigned int channel) +{ + unsigned int mask = 1 << (channel & 0x1f); + struct trident_pcm_bank *bank = &card->banks[channel >> 5]; + u32 addr = bank->addresses->stop; + +#ifdef DEBUG + u32 reg; +#endif + + outl(mask, TRID_REG(card, addr)); + +#ifdef DEBUG + reg = inl(TRID_REG(card, T4D_STOP_B)); + printk("trident: stop voice on channel %d, STOP_B = 0x%08x\n", + channel, reg); +#endif +} + +static u32 trident_get_interrupt_mask (struct trident_card * card, unsigned int channel) +{ + struct trident_pcm_bank *bank = &card->banks[channel]; + u32 addr = bank->addresses->aint; + return inl(TRID_REG(card, addr)); +} + +static int trident_check_channel_interrupt(struct trident_card * card, unsigned int channel) +{ + unsigned int mask = 1 << (channel & 0x1f); + u32 reg = trident_get_interrupt_mask (card, channel >> 5); + +#ifdef DEBUG + if (reg & mask) + printk("trident: channel %d has interrupt, AINT_B = 0x%08x\n", + channel, reg); +#endif + return (reg & mask) ? TRUE : FALSE; +} + +static void trident_ack_channel_interrupt(struct trident_card * card, unsigned int channel) +{ + unsigned int mask = 1 << (channel & 0x1f); + struct trident_pcm_bank *bank = &card->banks[channel >> 5]; + u32 reg, addr = bank->addresses->aint; + + reg = inl(TRID_REG(card, addr)); + reg &= mask; + outl(reg, TRID_REG(card, addr)); + +#ifdef DEBUG + reg = inl(TRID_REG(card, T4D_AINT_B)); + printk("trident: Ack channel %d interrupt, AINT_B = 0x%08x\n", + channel, reg); +#endif +} + +static struct trident_channel * trident_alloc_pcm_channel(struct trident_card *card) +{ + struct trident_pcm_bank *bank; + int idx; + + bank = &card->banks[BANK_B]; + + for (idx = 31; idx >= 0; idx--) { + if (!(bank->bitmap & (1 << idx))) { + struct trident_channel *channel = &bank->channels[idx]; + bank->bitmap |= 1 << idx; + channel->num = idx + 32; + return channel; + } + } + + /* no more free channels avaliable */ + printk(KERN_ERR "trident: no more channels available on Bank B.\n"); + return NULL; +} + +static struct trident_channel *ali_alloc_pcm_channel(struct trident_card *card) +{ + struct trident_pcm_bank *bank; + int idx; + + bank = &card->banks[BANK_A]; + + for (idx = ALI_PCM_OUT_CHANNEL_FIRST; idx <= ALI_PCM_OUT_CHANNEL_LAST ; idx++) { + if (!(bank->bitmap & (1 << idx))) { + struct trident_channel *channel = &bank->channels[idx]; + bank->bitmap |= 1 << idx; + channel->num = idx; + return channel; + } + } + + /* no more free channels avaliable */ + printk(KERN_ERR "trident: no more channels available on Bank B.\n"); + return NULL; +} + +static struct trident_channel *ali_alloc_rec_pcm_channel(struct trident_card *card) +{ + struct trident_pcm_bank *bank; + int idx = ALI_PCM_IN_CHANNEL; + + bank = &card->banks[BANK_A]; + + if (!(bank->bitmap & (1 << idx))) { + struct trident_channel *channel = &bank->channels[idx]; + bank->bitmap |= 1 << idx; + channel->num = idx; + return channel; + } + return NULL; +} + + +static void trident_free_pcm_channel(struct trident_card *card, int channel) +{ + int bank; + + if (channel < 31 || channel > 63) + return; + + bank = channel >> 5; + channel = channel & 0x1f; + + card->banks[bank].bitmap &= ~(1 << (channel)); +} + +static void ali_free_pcm_channel(struct trident_card *card, int channel) +{ + int bank; + + if (channel > 31) + return; + + bank = channel >> 5; + channel = channel & 0x1f; + + card->banks[bank].bitmap &= ~(1 << (channel)); +} + + +/* called with spin lock held */ + +static int trident_load_channel_registers(struct trident_card *card, u32 *data, unsigned int channel) +{ + int i; + + if (channel > 63) + return FALSE; + + /* select hardware channel to write */ + outb(channel, TRID_REG(card, T4D_LFO_GC_CIR)); + + /* Output the channel registers, but don't write register + three to an ALI chip. */ + for (i = 0; i < CHANNEL_REGS; i++) { + if (i == 3 && card->pci_id == PCI_DEVICE_ID_ALI_5451) + continue; + outl(data[i], TRID_REG(card, CHANNEL_START + 4*i)); + } + return TRUE; +} + +/* called with spin lock held */ +static int trident_write_voice_regs(struct trident_state *state) +{ + unsigned int data[CHANNEL_REGS + 1]; + struct trident_channel *channel; + + channel = state->dmabuf.channel; + + data[1] = channel->lba; + data[4] = channel->control; + + switch (state->card->pci_id) + { + case PCI_DEVICE_ID_ALI_5451: + data[0] = 0; /* Current Sample Offset */ + data[2] = (channel->eso << 16) | (channel->delta & 0xffff); + data[3] = 0; + break; + case PCI_DEVICE_ID_SI_7018: + data[0] = 0; /* Current Sample Offset */ + data[2] = (channel->eso << 16) | (channel->delta & 0xffff); + data[3] = (channel->attribute << 16) | (channel->fm_vol & 0xffff); + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX: + data[0] = 0; /* Current Sample Offset */ + data[2] = (channel->eso << 16) | (channel->delta & 0xffff); + data[3] = channel->fm_vol & 0xffff; + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX: + data[0] = (channel->delta << 24); + data[2] = ((channel->delta << 16) & 0xff000000) | (channel->eso & 0x00ffffff); + data[3] = channel->fm_vol & 0xffff; + break; + default: + return FALSE; + } + + return trident_load_channel_registers(state->card, data, channel->num); +} + +static int compute_rate_play(u32 rate) +{ + int delta; + /* We special case 44100 and 8000 since rounding with the equation + does not give us an accurate enough value. For 11025 and 22050 + the equation gives us the best answer. All other frequencies will + also use the equation. JDW */ + if (rate == 44100) + delta = 0xeb3; + else if (rate == 8000) + delta = 0x2ab; + else if (rate == 48000) + delta = 0x1000; + else + delta = (((rate << 12) + rate) / 48000) & 0x0000ffff; + return delta; +} + +static int compute_rate_rec(u32 rate) +{ + int delta; + + if (rate == 44100) + delta = 0x116a; + else if (rate == 8000) + delta = 0x6000; + else if (rate == 48000) + delta = 0x1000; + else + delta = ((48000 << 12) / rate) & 0x0000ffff; + + return delta; +} +/* set playback sample rate */ +static unsigned int trident_set_dac_rate(struct trident_state * state, unsigned int rate) +{ + struct dmabuf *dmabuf = &state->dmabuf; + + if (rate > 48000) + rate = 48000; + if (rate < 4000) + rate = 4000; + + dmabuf->rate = rate; + dmabuf->channel->delta = compute_rate_play(rate); + + trident_write_voice_regs(state); + +#ifdef DEBUG + printk("trident: called trident_set_dac_rate : rate = %d\n", rate); +#endif + + return rate; +} + +/* set recording sample rate */ +static unsigned int trident_set_adc_rate(struct trident_state * state, unsigned int rate) +{ + struct dmabuf *dmabuf = &state->dmabuf; + + if (rate > 48000) + rate = 48000; + if (rate < 4000) + rate = 4000; + + dmabuf->rate = rate; + dmabuf->channel->delta = compute_rate_rec(rate); + + trident_write_voice_regs(state); + +#ifdef DEBUG + printk("trident: called trident_set_adc_rate : rate = %d\n", rate); +#endif + return rate; +} + +/* prepare channel attributes for playback */ +static void trident_play_setup(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + struct trident_channel *channel = dmabuf->channel; + + channel->lba = virt_to_bus(dmabuf->rawbuf); + channel->delta = compute_rate_play(dmabuf->rate); + + channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt]; + channel->eso -= 1; + + if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) { + channel->attribute = 0; + } + + channel->fm_vol = 0x0; + + channel->control = CHANNEL_LOOP; + if (dmabuf->fmt & TRIDENT_FMT_16BIT) { + /* 16-bits */ + channel->control |= CHANNEL_16BITS; + /* signed */ + channel->control |= CHANNEL_SIGNED; + } + if (dmabuf->fmt & TRIDENT_FMT_STEREO) + /* stereo */ + channel->control |= CHANNEL_STEREO; +#ifdef DEBUG + printk("trident: trident_play_setup, LBA = 0x%08x, " + "Delat = 0x%08x, ESO = 0x%08x, Control = 0x%08x\n", + channel->lba, channel->delta, channel->eso, channel->control); +#endif + trident_write_voice_regs(state); +} + +/* prepare channel attributes for recording */ +static void trident_rec_setup(struct trident_state *state) +{ + u16 w; + struct trident_card *card = state->card; + struct dmabuf *dmabuf = &state->dmabuf; + struct trident_channel *channel = dmabuf->channel; + + /* Enable AC-97 ADC (capture) */ + switch (card->pci_id) + { + case PCI_DEVICE_ID_ALI_5451: + case PCI_DEVICE_ID_SI_7018: + /* for 7018, the ac97 is always in playback/record (duplex) mode */ + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX: + w = inb(TRID_REG(card, DX_ACR2_AC97_COM_STAT)); + outb(w | 0x48, TRID_REG(card, DX_ACR2_AC97_COM_STAT)); + /* enable and set record channel */ + outb(0x80 | channel->num, TRID_REG(card, T4D_REC_CH)); + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX: + w = inw(TRID_REG(card, T4D_MISCINT)); + outw(w | 0x1000, TRID_REG(card, T4D_MISCINT)); + /* enable and set record channel */ + outb(0x80 | channel->num, TRID_REG(card, T4D_REC_CH)); + break; + default: + return; + } + + channel->lba = virt_to_bus(dmabuf->rawbuf); + channel->delta = compute_rate_rec(dmabuf->rate); + + channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt]; + channel->eso -= 1; + + if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) { + channel->attribute = 0; + } + + channel->fm_vol = 0x0; + + channel->control = CHANNEL_LOOP; + if (dmabuf->fmt & TRIDENT_FMT_16BIT) { + /* 16-bits */ + channel->control |= CHANNEL_16BITS; + /* signed */ + channel->control |= CHANNEL_SIGNED; + } + if (dmabuf->fmt & TRIDENT_FMT_STEREO) + /* stereo */ + channel->control |= CHANNEL_STEREO; +#ifdef DEBUG + printk("trident: trident_rec_setup, LBA = 0x%08x, " + "Delat = 0x%08x, ESO = 0x%08x, Control = 0x%08x\n", + channel->lba, channel->delta, channel->eso, channel->control); +#endif + trident_write_voice_regs(state); +} + +/* get current playback/recording dma buffer pointer (byte offset from LBA), + called with spinlock held! */ +extern __inline__ unsigned trident_get_dma_addr(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + u32 cso; + + if (!dmabuf->enable) + return 0; + + outb(dmabuf->channel->num, TRID_REG(state->card, T4D_LFO_GC_CIR)); + + switch (state->card->pci_id) + { + case PCI_DEVICE_ID_ALI_5451: + case PCI_DEVICE_ID_SI_7018: + case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX: + /* 16 bits ESO, CSO for 7018 and DX */ + cso = inw(TRID_REG(state->card, CH_DX_CSO_ALPHA_FMS + 2)); + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX: + /* 24 bits ESO, CSO for NX */ + cso = inl(TRID_REG(state->card, CH_NX_DELTA_CSO)) & 0x00ffffff; + break; + default: + return 0; + } + +#ifdef DEBUG + printk("trident: trident_get_dma_addr: chip reported channel: %d, " + "cso = 0x%04x\n", + dmabuf->channel->num, cso); +#endif + /* ESO and CSO are in units of Samples, convert to byte offset */ + cso <<= sample_shift[dmabuf->fmt]; + + return (cso % dmabuf->dmasize); +} + +/* Stop recording (lock held) */ +extern __inline__ void __stop_adc(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned int chan_num = dmabuf->channel->num; + struct trident_card *card = state->card; + + dmabuf->enable &= ~ADC_RUNNING; + trident_stop_voice(card, chan_num); + trident_disable_voice_irq(card, chan_num); +} + +static void stop_adc(struct trident_state *state) +{ + struct trident_card *card = state->card; + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + __stop_adc(state); + spin_unlock_irqrestore(&card->lock, flags); +} + +static void start_adc(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned int chan_num = dmabuf->channel->num; + struct trident_card *card = state->card; + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + if ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize) && dmabuf->ready) { + dmabuf->enable |= ADC_RUNNING; + trident_enable_voice_irq(card, chan_num); + trident_start_voice(card, chan_num); + } + spin_unlock_irqrestore(&card->lock, flags); +} + +/* stop playback (lock held) */ +extern __inline__ void __stop_dac(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned int chan_num = dmabuf->channel->num; + struct trident_card *card = state->card; + + dmabuf->enable &= ~DAC_RUNNING; + trident_stop_voice(card, chan_num); + trident_disable_voice_irq(card, chan_num); +} + +static void stop_dac(struct trident_state *state) +{ + struct trident_card *card = state->card; + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + __stop_dac(state); + spin_unlock_irqrestore(&card->lock, flags); +} + +static void start_dac(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned int chan_num = dmabuf->channel->num; + struct trident_card *card = state->card; + unsigned long flags; + + spin_lock_irqsave(&card->lock, flags); + if ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) { + dmabuf->enable |= DAC_RUNNING; + trident_enable_voice_irq(card, chan_num); + trident_start_voice(card, chan_num); + } + spin_unlock_irqrestore(&card->lock, flags); +} + +#define DMABUF_DEFAULTORDER (15-PAGE_SHIFT) +#define DMABUF_MINORDER 1 + +/* allocate DMA buffer, playback and recording buffer should be allocated seperately */ +static int alloc_dmabuf(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + void *rawbuf; + int order; + unsigned long map, mapend; + + /* alloc as big a chunk as we can, FIXME: is this necessary ?? */ + for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--) + if ((rawbuf = (void *)__get_free_pages(GFP_KERNEL, order))) + break; + if (!rawbuf) + return -ENOMEM; + +#ifdef DEBUG + printk("trident: allocated %ld (order = %d) bytes at %p\n", + PAGE_SIZE << order, order, rawbuf); +#endif + + /* for 4DWave and 7018, there are only 30 (31) siginifcan bits for Loop Begin Address + (LBA) which limits the address space to 1 (2) GB, bad T^2 design */ + if ((virt_to_bus(rawbuf) + (PAGE_SIZE << order) - 1) & ~0x3fffffff) { + printk(KERN_ERR "trident: DMA buffer beyond 1 GB; " + "bus address = 0x%lx, size = %ld\n", + virt_to_bus(rawbuf), PAGE_SIZE << order); + free_pages((unsigned long)rawbuf, order); + return -ENOMEM; + } + dmabuf->ready = dmabuf->mapped = 0; + dmabuf->rawbuf = rawbuf; + dmabuf->buforder = order; + + /* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */ + mapend = MAP_NR(rawbuf + (PAGE_SIZE << order) - 1); + for (map = MAP_NR(rawbuf); map <= mapend; map++) + set_bit(PG_reserved, &mem_map[map].flags); + + return 0; +} + +/* free DMA buffer */ +static void dealloc_dmabuf(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned long map, mapend; + + if (dmabuf->rawbuf) { + /* undo marking the pages as reserved */ + mapend = MAP_NR(dmabuf->rawbuf + (PAGE_SIZE << dmabuf->buforder) - 1); + for (map = MAP_NR(dmabuf->rawbuf); map <= mapend; map++) + clear_bit(PG_reserved, &mem_map[map].flags); + free_pages((unsigned long)dmabuf->rawbuf, dmabuf->buforder); + } + dmabuf->rawbuf = NULL; + dmabuf->mapped = dmabuf->ready = 0; +} + +static int prog_dmabuf(struct trident_state *state, unsigned rec) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned bytepersec; + unsigned bufsize; + unsigned long flags; + int ret; + + spin_lock_irqsave(&state->card->lock, flags); + dmabuf->hwptr = dmabuf->swptr = dmabuf->total_bytes = 0; + dmabuf->count = dmabuf->error = 0; + spin_unlock_irqrestore(&state->card->lock, flags); + + /* allocate DMA buffer if not allocated yet */ + if (!dmabuf->rawbuf) + if ((ret = alloc_dmabuf(state))) + return ret; + + /* FIXME: figure out all this OSS fragment stuff */ + bytepersec = dmabuf->rate << sample_shift[dmabuf->fmt]; + bufsize = PAGE_SIZE << dmabuf->buforder; + if (dmabuf->ossfragshift) { + if ((1000 << dmabuf->ossfragshift) < bytepersec) + dmabuf->fragshift = ld2(bytepersec/1000); + else + dmabuf->fragshift = dmabuf->ossfragshift; + } else { + /* lets hand out reasonable big ass buffers by default */ + dmabuf->fragshift = (dmabuf->buforder + PAGE_SHIFT -2); + } + dmabuf->numfrag = bufsize >> dmabuf->fragshift; + while (dmabuf->numfrag < 4 && dmabuf->fragshift > 3) { + dmabuf->fragshift--; + dmabuf->numfrag = bufsize >> dmabuf->fragshift; + } + dmabuf->fragsize = 1 << dmabuf->fragshift; + if (dmabuf->ossmaxfrags >= 4 && dmabuf->ossmaxfrags < dmabuf->numfrag) + dmabuf->numfrag = dmabuf->ossmaxfrags; + dmabuf->fragsamples = dmabuf->fragsize >> sample_shift[dmabuf->fmt]; + dmabuf->dmasize = dmabuf->numfrag << dmabuf->fragshift; + + memset(dmabuf->rawbuf, (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80, + dmabuf->dmasize); + + spin_lock_irqsave(&state->card->lock, flags); + if (rec) { + trident_rec_setup(state); + } else { + trident_play_setup(state); + } + spin_unlock_irqrestore(&state->card->lock, flags); + + /* set the ready flag for the dma buffer */ + dmabuf->ready = 1; + +#ifdef DEBUG + printk("trident: prog_dmabuf, sample rate = %d, format = %d, numfrag = %d, " + "fragsize = %d dmasize = %d\n", + dmabuf->rate, dmabuf->fmt, dmabuf->numfrag, + dmabuf->fragsize, dmabuf->dmasize); +#endif + + return 0; +} + +/* we are doing quantum mechanics here, the buffer can only be empty, half or full filled i.e. + |------------|------------| or |xxxxxxxxxxxx|------------| or |xxxxxxxxxxxx|xxxxxxxxxxxx| + but we almost always get this + |xxxxxx------|------------| or |xxxxxxxxxxxx|xxxxx-------| + so we have to clear the tail space to "silence" + |xxxxxx000000|------------| or |xxxxxxxxxxxx|xxxxxx000000| +*/ +static void trident_clear_tail(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned swptr; + unsigned char silence = (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80; + unsigned int len; + unsigned long flags; + + spin_lock_irqsave(&state->card->lock, flags); + swptr = dmabuf->swptr; + spin_unlock_irqrestore(&state->card->lock, flags); + + if (swptr == 0 || swptr == dmabuf->dmasize / 2 || swptr == dmabuf->dmasize) + return; + + if (swptr < dmabuf->dmasize/2) + len = dmabuf->dmasize/2 - swptr; + else + len = dmabuf->dmasize - swptr; + + memset(dmabuf->rawbuf + swptr, silence, len); + + spin_lock_irqsave(&state->card->lock, flags); + dmabuf->swptr += len; + dmabuf->count += len; + spin_unlock_irqrestore(&state->card->lock, flags); + + /* restart the dma machine in case it is halted */ + start_dac(state); +} + +static int drain_dac(struct trident_state *state, int nonblock) +{ + struct wait_queue wait = {current, NULL}; + struct dmabuf *dmabuf = &state->dmabuf; + unsigned long flags; + unsigned long tmo; + int count; + + if (dmabuf->mapped || !dmabuf->ready) + return 0; + + add_wait_queue(&dmabuf->wait, &wait); + for (;;) { + /* It seems that we have to set the current state to TASK_INTERRUPTIBLE + every time to make the process really go to sleep */ + current->state = TASK_INTERRUPTIBLE; + + spin_lock_irqsave(&state->card->lock, flags); + count = dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); + + if (count <= 0) + break; + + if (signal_pending(current)) + break; + + if (nonblock) { + remove_wait_queue(&dmabuf->wait, &wait); + current->state = TASK_RUNNING; + return -EBUSY; + } + + /* No matter how much data left in the buffer, we have to wait untill + CSO == ESO/2 or CSO == ESO when address engine interrupts */ + tmo = (dmabuf->dmasize * HZ) / dmabuf->rate; + tmo >>= sample_shift[dmabuf->fmt]; + if (!schedule_timeout(tmo ? tmo : 1) && tmo){ + printk(KERN_ERR "trident: drain_dac, dma timeout?\n"); + break; + } + } + remove_wait_queue(&dmabuf->wait, &wait); + current->state = TASK_RUNNING; + if (signal_pending(current)) + return -ERESTARTSYS; + + return 0; +} + +/* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */ +static void trident_update_ptr(struct trident_state *state) +{ + struct dmabuf *dmabuf = &state->dmabuf; + unsigned hwptr, swptr; + int clear_cnt = 0; + int diff; + unsigned char silence; + unsigned half_dmasize; + + /* update hardware pointer */ + hwptr = trident_get_dma_addr(state); + diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize; + dmabuf->hwptr = hwptr; + dmabuf->total_bytes += diff; + + /* error handling and process wake up for ADC */ + if (dmabuf->enable == ADC_RUNNING) { + if (dmabuf->mapped) { + dmabuf->count -= diff; + if (dmabuf->count >= (signed)dmabuf->fragsize) + wake_up(&dmabuf->wait); + } else { + dmabuf->count += diff; + + if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) { + /* buffer underrun or buffer overrun, we have no way to recover + it here, just stop the machine and let the process force hwptr + and swptr to sync */ + __stop_adc(state); + dmabuf->error++; + } + else if (!dmabuf->endcleared) { + swptr = dmabuf->swptr; + silence = (dmabuf->fmt & TRIDENT_FMT_16BIT ? 0 : 0x80); + if (dmabuf->update_flag & ALI_ADDRESS_INT_UPDATE) { + /* We must clear end data of 1/2 dmabuf if needed. + According to 1/2 algorithm of Address Engine Interrupt, + check the validation of the data of half dmasize. */ + half_dmasize = dmabuf->dmasize / 2; + if ((diff = hwptr - half_dmasize) < 0 ) + diff = hwptr; + if ((dmabuf->count + diff) < half_dmasize) { + //there is invalid data in the end of half buffer + if ((clear_cnt = half_dmasize - swptr) < 0) + clear_cnt += half_dmasize; + //clear the invalid data + memset (dmabuf->rawbuf + swptr, + silence, clear_cnt); + + dmabuf->endcleared = 1; + } + } else if (dmabuf->count < (signed) dmabuf->fragsize) { + clear_cnt = dmabuf->fragsize; + if ((swptr + clear_cnt) > dmabuf->dmasize) + clear_cnt = dmabuf->dmasize - swptr; + memset (dmabuf->rawbuf + swptr, silence, clear_cnt); + dmabuf->endcleared = 1; + } + } + /* trident_update_ptr is called by interrupt handler or by process via + ioctl/poll, we only wake up the waiting process when we have more + than 1/2 buffer of data to process (always true for interrupt handler) */ + if (dmabuf->count > (signed)dmabuf->dmasize/2) + wake_up(&dmabuf->wait); + } + } + + /* error handling and process wake up for DAC */ + if (dmabuf->enable == DAC_RUNNING) { + if (dmabuf->mapped) { + dmabuf->count += diff; + if (dmabuf->count >= (signed)dmabuf->fragsize) + wake_up(&dmabuf->wait); + } else { + dmabuf->count -= diff; + + if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) { + /* buffer underrun or buffer overrun, we have no way to recover + it here, just stop the machine and let the process force hwptr + and swptr to sync */ + __stop_dac(state); + dmabuf->error++; + } + /* trident_update_ptr is called by interrupt handler or by process via + ioctl/poll, we only wake up the waiting process when we have more + than 1/2 buffer free (always true for interrupt handler) */ + if (dmabuf->count < (signed)dmabuf->dmasize/2) + wake_up(&dmabuf->wait); + } + } + dmabuf->update_flag &= ~ALI_ADDRESS_INT_UPDATE; +} + +static void trident_address_interrupt(struct trident_card *card) +{ + int i; + struct trident_state *state; + + /* Update the pointers for all channels we are running. */ + /* FIXME: should read interrupt status only once */ + for (i = 0; i < NR_HW_CH; i++) { + if (trident_check_channel_interrupt(card, 63 - i)) { + trident_ack_channel_interrupt(card, 63 - i); + if ((state = card->states[i]) != NULL) { + trident_update_ptr(state); + } else { + printk("trident: spurious channel irq %d.\n", + 63 - i); + trident_stop_voice(card, 63 - i); + trident_disable_voice_irq(card, 63 - i); + } + } + } +} + +static void ali_address_interrupt(struct trident_card *card) +{ + int i; + u32 mask = trident_get_interrupt_mask (card, BANK_A); + +#ifdef DEBUG + /* Sanity check to make sure that every state has a channel + and vice versa. */ + u32 done = 0; + unsigned ns = 0; + unsigned nc = 0; + for (i = 0; i < NR_HW_CH; i++) { + if (card->banks[BANK_A].bitmap & (1<states[i]) { + u32 bit = 1 << card->states[i]->dmabuf.channel->num; + if (bit & done) + printk (KERN_ERR "trident: channel allocated to two states\n"); + ns++; + + done |= bit; + } + } + if (ns != nc) + printk (KERN_ERR "trident: number of states != number of channels\n"); +#endif + + for (i = 0; mask && i < NR_HW_CH; i++) { + struct trident_state *state = card->states[i]; + if (!state) + continue; + + trident_ack_channel_interrupt(card, state->dmabuf.channel->num); + mask &= ~ (1<dmabuf.channel->num); + state->dmabuf.update_flag |= ALI_ADDRESS_INT_UPDATE; + trident_update_ptr(state); + } + + if (mask) + for (i = 0; i < NR_HW_CH; i++) + if (mask & (1<lock); + event = inl(TRID_REG(card, T4D_MISCINT)); + +#ifdef DEBUG + printk("trident: trident_interrupt called, MISCINT = 0x%08x\n", event); +#endif + + if (event & ADDRESS_IRQ) { + card->address_interrupt(card); + } + + /* manually clear interrupt status, bad hardware design, blame T^2 */ + outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), + TRID_REG(card, T4D_MISCINT)); + spin_unlock(&card->lock); +} + +static loff_t trident_llseek(struct file *file, loff_t offset, int origin) +{ + return -ESPIPE; +} + +/* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to + the user's buffer. it is filled by the dma machine and drained by this loop. */ +static ssize_t trident_read(struct file *file, char *buffer, size_t count, loff_t *ppos) +{ + struct trident_state *state = (struct trident_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + ssize_t ret; + unsigned long flags; + unsigned swptr; + int cnt; + +#ifdef DEBUG + printk("trident: trident_read called, count = %d\n", count); +#endif + + VALIDATE_STATE(state); + if (ppos != &file->f_pos) + return -ESPIPE; + if (dmabuf->mapped) + return -ENXIO; + if (!dmabuf->ready && (ret = prog_dmabuf(state, 1))) + return ret; + if (!access_ok(VERIFY_WRITE, buffer, count)) + return -EFAULT; + ret = 0; + + if (state->card->pci_id == PCI_DEVICE_ID_ALI_5451) + outl(inl(TRID_REG (state->card, ALI_GLOBAL_CONTROL)) | ALI_PCM_IN_ENABLE, + TRID_REG (state->card, ALI_GLOBAL_CONTROL)); + + while (count > 0) { + spin_lock_irqsave(&state->card->lock, flags); + if (dmabuf->count > (signed) dmabuf->dmasize) { + /* buffer overrun, we are recovering from sleep_on_timeout, + resync hwptr and swptr, make process flush the buffer */ + dmabuf->count = dmabuf->dmasize; + dmabuf->swptr = dmabuf->hwptr; + } + swptr = dmabuf->swptr; + cnt = dmabuf->dmasize - swptr; + if (dmabuf->count < cnt) + cnt = dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); + + if (cnt > count) + cnt = count; + if (cnt <= 0) { + unsigned long tmo; + /* buffer is empty, start the dma machine and wait for data to be + recorded */ + start_adc(state); + if (file->f_flags & O_NONBLOCK) { + if (!ret) ret = -EAGAIN; + return ret; + } + /* No matter how much space left in the buffer, we have to wait untill + CSO == ESO/2 or CSO == ESO when address engine interrupts */ + tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2); + tmo >>= sample_shift[dmabuf->fmt]; + /* There are two situations when sleep_on_timeout returns, one is when + the interrupt is serviced correctly and the process is waked up by + ISR ON TIME. Another is when timeout is expired, which means that + either interrupt is NOT serviced correctly (pending interrupt) or it + is TOO LATE for the process to be scheduled to run (scheduler latency) + which results in a (potential) buffer overrun. And worse, there is + NOTHING we can do to prevent it. */ + if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) { +#ifdef DEBUG + printk(KERN_ERR "trident: recording schedule timeout, " + "dmasz %u fragsz %u count %i hwptr %u swptr %u\n", + dmabuf->dmasize, dmabuf->fragsize, dmabuf->count, + dmabuf->hwptr, dmabuf->swptr); +#endif + /* a buffer overrun, we delay the recovery untill next time the + while loop begin and we REALLY have space to record */ + } + if (signal_pending(current)) { + ret = ret ? ret : -ERESTARTSYS; + return ret; + } + continue; + } + + if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) { + if (!ret) ret = -EFAULT; + return ret; + } + + swptr = (swptr + cnt) % dmabuf->dmasize; + + spin_lock_irqsave(&state->card->lock, flags); + dmabuf->swptr = swptr; + dmabuf->count -= cnt; + spin_unlock_irqrestore(&state->card->lock, flags); + + count -= cnt; + buffer += cnt; + ret += cnt; + start_adc(state); + } + return ret; +} + +/* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to + the soundcard. it is drained by the dma machine and filled by this loop. */ +static ssize_t trident_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) +{ + struct trident_state *state = (struct trident_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + ssize_t ret; + unsigned long flags; + unsigned swptr; + int cnt; + +#ifdef DEBUG + printk("trident: trident_write called, count = %d\n", count); +#endif + + VALIDATE_STATE(state); + if (ppos != &file->f_pos) + return -ESPIPE; + if (dmabuf->mapped) + return -ENXIO; + if (!dmabuf->ready && (ret = prog_dmabuf(state, 0))) + return ret; + if (!access_ok(VERIFY_READ, buffer, count)) + return -EFAULT; + ret = 0; + + if (state->card->pci_id == PCI_DEVICE_ID_ALI_5451) + if (dmabuf->channel->num == ALI_PCM_IN_CHANNEL) + outl ( inl (TRID_REG (state->card, ALI_GLOBAL_CONTROL)) & + ALI_PCM_IN_DISABLE, TRID_REG (state->card, ALI_GLOBAL_CONTROL)); + + while (count > 0) { + spin_lock_irqsave(&state->card->lock, flags); + if (dmabuf->count < 0) { + /* buffer underrun, we are recovering from sleep_on_timeout, + resync hwptr and swptr */ + dmabuf->count = 0; + dmabuf->swptr = dmabuf->hwptr; + } + swptr = dmabuf->swptr; + cnt = dmabuf->dmasize - swptr; + if (dmabuf->count + cnt > dmabuf->dmasize) + cnt = dmabuf->dmasize - dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); + + if (cnt > count) + cnt = count; + if (cnt <= 0) { + unsigned long tmo; + /* buffer is full, start the dma machine and wait for data to be + played */ + start_dac(state); + if (file->f_flags & O_NONBLOCK) { + if (!ret) ret = -EAGAIN; + return ret; + } + /* No matter how much data left in the buffer, we have to wait untill + CSO == ESO/2 or CSO == ESO when address engine interrupts */ + tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2); + tmo >>= sample_shift[dmabuf->fmt]; + /* There are two situations when sleep_on_timeout returns, one is when + the interrupt is serviced correctly and the process is waked up by + ISR ON TIME. Another is when timeout is expired, which means that + either interrupt is NOT serviced correctly (pending interrupt) or it + is TOO LATE for the process to be scheduled to run (scheduler latency) + which results in a (potential) buffer underrun. And worse, there is + NOTHING we can do to prevent it. */ + if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) { +#ifdef DEBUG + printk(KERN_ERR "trident: playback schedule timeout, " + "dmasz %u fragsz %u count %i hwptr %u swptr %u\n", + dmabuf->dmasize, dmabuf->fragsize, dmabuf->count, + dmabuf->hwptr, dmabuf->swptr); +#endif + /* a buffer underrun, we delay the recovery untill next time the + while loop begin and we REALLY have data to play */ + } + if (signal_pending(current)) { + if (!ret) ret = -ERESTARTSYS; + return ret; + } + continue; + } + if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) { + if (!ret) ret = -EFAULT; + return ret; + } + + swptr = (swptr + cnt) % dmabuf->dmasize; + + spin_lock_irqsave(&state->card->lock, flags); + dmabuf->swptr = swptr; + dmabuf->count += cnt; + dmabuf->endcleared = 0; + spin_unlock_irqrestore(&state->card->lock, flags); + + count -= cnt; + buffer += cnt; + ret += cnt; + start_dac(state); + } + return ret; +} + +/* No kernel lock - we have our own spinlock */ +static unsigned int trident_poll(struct file *file, struct poll_table_struct *wait) +{ + struct trident_state *state = (struct trident_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + unsigned long flags; + unsigned int mask = 0; + + VALIDATE_STATE(state); + if (file->f_mode & FMODE_WRITE) + poll_wait(file, &dmabuf->wait, wait); + if (file->f_mode & FMODE_READ) + poll_wait(file, &dmabuf->wait, wait); + + spin_lock_irqsave(&state->card->lock, flags); + trident_update_ptr(state); + if (file->f_mode & FMODE_READ) { + if (dmabuf->count >= (signed)dmabuf->fragsize) + mask |= POLLIN | POLLRDNORM; + } + if (file->f_mode & FMODE_WRITE) { + if (dmabuf->mapped) { + if (dmabuf->count >= (signed)dmabuf->fragsize) + mask |= POLLOUT | POLLWRNORM; + } else { + if ((signed)dmabuf->dmasize >= dmabuf->count + (signed)dmabuf->fragsize) + mask |= POLLOUT | POLLWRNORM; + } + } + spin_unlock_irqrestore(&state->card->lock, flags); + + return mask; +} + +static int trident_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct trident_state *state = (struct trident_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + int ret; + unsigned long size; + + VALIDATE_STATE(state); + if (vma->vm_flags & VM_WRITE) { + if ((ret = prog_dmabuf(state, 0)) != 0) + return ret; + } else if (vma->vm_flags & VM_READ) { + if ((ret = prog_dmabuf(state, 1)) != 0) + return ret; + } else + return -EINVAL; + + + if (vma->vm_offset != 0) + return -EINVAL; + size = vma->vm_end - vma->vm_start; + if (size > (PAGE_SIZE << dmabuf->buforder)) + return -EINVAL; + if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf), + size, vma->vm_page_prot)) + return -EAGAIN; + dmabuf->mapped = 1; + + return 0; +} + +static int trident_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +{ + struct trident_state *state = (struct trident_state *)file->private_data; + struct dmabuf *dmabuf = &state->dmabuf; + unsigned long flags; + audio_buf_info abinfo; + count_info cinfo; + int val, mapped, ret; + + VALIDATE_STATE(state); + mapped = ((file->f_mode & FMODE_WRITE) && dmabuf->mapped) || + ((file->f_mode & FMODE_READ) && dmabuf->mapped); +#ifdef DEBUG + printk("trident: trident_ioctl, command = %2d, arg = 0x%08x\n", + _IOC_NR(cmd), arg ? *(int *)arg : 0); +#endif + + switch (cmd) + { + case OSS_GETVERSION: + return put_user(SOUND_VERSION, (int *)arg); + + case SNDCTL_DSP_RESET: + /* FIXME: spin_lock ? */ + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + synchronize_irq(); + dmabuf->ready = 0; + dmabuf->swptr = dmabuf->hwptr = 0; + dmabuf->count = dmabuf->total_bytes = 0; + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + synchronize_irq(); + dmabuf->ready = 0; + dmabuf->swptr = dmabuf->hwptr = 0; + dmabuf->count = dmabuf->total_bytes = 0; + } + return 0; + + case SNDCTL_DSP_SYNC: + if (file->f_mode & FMODE_WRITE) + return drain_dac(state, file->f_flags & O_NONBLOCK); + return 0; + + case SNDCTL_DSP_SPEED: /* set smaple rate */ + get_user_ret(val, (int *)arg, -EFAULT); + if (val >= 0) { + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dmabuf->ready = 0; + spin_lock_irqsave(&state->card->lock, flags); + trident_set_dac_rate(state, val); + spin_unlock_irqrestore(&state->card->lock, flags); + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dmabuf->ready = 0; + spin_lock_irqsave(&state->card->lock, flags); + trident_set_adc_rate(state, val); + spin_unlock_irqrestore(&state->card->lock, flags); + } + } + return put_user(dmabuf->rate, (int *)arg); + + case SNDCTL_DSP_STEREO: /* set stereo or mono channel */ + get_user_ret(val, (int *)arg, -EFAULT); + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dmabuf->ready = 0; + if (val) + dmabuf->fmt |= TRIDENT_FMT_STEREO; + else + dmabuf->fmt &= ~TRIDENT_FMT_STEREO; + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dmabuf->ready = 0; + if (val) + dmabuf->fmt |= TRIDENT_FMT_STEREO; + else + dmabuf->fmt &= ~TRIDENT_FMT_STEREO; + } + return 0; + + case SNDCTL_DSP_GETBLKSIZE: + if (file->f_mode & FMODE_WRITE) { + if ((val = prog_dmabuf(state, 0))) + return val; + return put_user(dmabuf->fragsize, (int *)arg); + } + if (file->f_mode & FMODE_READ) { + if ((val = prog_dmabuf(state, 1))) + return val; + return put_user(dmabuf->fragsize, (int *)arg); + } + + case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/ + return put_user(AFMT_S16_LE|AFMT_U16_LE|AFMT_S8|AFMT_U8, (int *)arg); + + case SNDCTL_DSP_SETFMT: /* Select sample format */ + get_user_ret(val, (int *)arg, -EFAULT); + if (val != AFMT_QUERY) { + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dmabuf->ready = 0; + if (val == AFMT_S16_LE) + dmabuf->fmt |= TRIDENT_FMT_16BIT; + else + dmabuf->fmt &= ~TRIDENT_FMT_16BIT; + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dmabuf->ready = 0; + if (val == AFMT_S16_LE) + dmabuf->fmt |= TRIDENT_FMT_16BIT; + else + dmabuf->fmt &= ~TRIDENT_FMT_16BIT; + } + } + return put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ? + AFMT_S16_LE : AFMT_U8, (int *)arg); + + case SNDCTL_DSP_CHANNELS: + get_user_ret(val, (int *)arg, -EFAULT); + if (val != 0) { + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dmabuf->ready = 0; + if (val >= 2) + dmabuf->fmt |= TRIDENT_FMT_STEREO; + else + dmabuf->fmt &= ~TRIDENT_FMT_STEREO; + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dmabuf->ready = 0; + if (val >= 2) + dmabuf->fmt |= TRIDENT_FMT_STEREO; + else + dmabuf->fmt &= ~TRIDENT_FMT_STEREO; + } + } + return put_user((dmabuf->fmt & TRIDENT_FMT_STEREO) ? 2 : 1, + (int *)arg); + + case SNDCTL_DSP_POST: + /* FIXME: the same as RESET ?? */ + return 0; + + case SNDCTL_DSP_SUBDIVIDE: + if (dmabuf->subdivision) + return -EINVAL; + get_user_ret(val, (int *)arg, -EFAULT); + if (val != 1 && val != 2 && val != 4) + return -EINVAL; + dmabuf->subdivision = val; + return 0; + + case SNDCTL_DSP_SETFRAGMENT: + get_user_ret(val, (int *)arg, -EFAULT); + + dmabuf->ossfragshift = val & 0xffff; + dmabuf->ossmaxfrags = (val >> 16) & 0xffff; + if (dmabuf->ossfragshift < 4) + dmabuf->ossfragshift = 4; + if (dmabuf->ossfragshift > 15) + dmabuf->ossfragshift = 15; + if (dmabuf->ossmaxfrags < 4) + dmabuf->ossmaxfrags = 4; + + return 0; + + case SNDCTL_DSP_GETOSPACE: + if (!(file->f_mode & FMODE_WRITE)) + return -EINVAL; + if (!dmabuf->enable && (val = prog_dmabuf(state, 0)) != 0) + return val; + spin_lock_irqsave(&state->card->lock, flags); + trident_update_ptr(state); + abinfo.fragsize = dmabuf->fragsize; + abinfo.bytes = dmabuf->dmasize - dmabuf->count; + abinfo.fragstotal = dmabuf->numfrag; + abinfo.fragments = abinfo.bytes >> dmabuf->fragshift; + spin_unlock_irqrestore(&state->card->lock, flags); + return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0; + + case SNDCTL_DSP_GETISPACE: + if (!(file->f_mode & FMODE_READ)) + return -EINVAL; + if (!dmabuf->enable && (val = prog_dmabuf(state, 1)) != 0) + return val; + spin_lock_irqsave(&state->card->lock, flags); + trident_update_ptr(state); + abinfo.fragsize = dmabuf->fragsize; + abinfo.bytes = dmabuf->count; + abinfo.fragstotal = dmabuf->numfrag; + abinfo.fragments = abinfo.bytes >> dmabuf->fragshift; + spin_unlock_irqrestore(&state->card->lock, flags); + return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0; + + case SNDCTL_DSP_NONBLOCK: + file->f_flags |= O_NONBLOCK; + return 0; + + case SNDCTL_DSP_GETCAPS: + return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP, + (int *)arg); + + case SNDCTL_DSP_GETTRIGGER: + val = 0; + if (file->f_mode & FMODE_READ && dmabuf->enable) + val |= PCM_ENABLE_INPUT; + if (file->f_mode & FMODE_WRITE && dmabuf->enable) + val |= PCM_ENABLE_OUTPUT; + return put_user(val, (int *)arg); + + case SNDCTL_DSP_SETTRIGGER: + get_user_ret(val, (int *)arg, -EFAULT); + if (file->f_mode & FMODE_READ) { + if (val & PCM_ENABLE_INPUT) { + if (!dmabuf->ready && (ret = prog_dmabuf(state, 1))) + return ret; + start_adc(state); + } else + stop_adc(state); + } + if (file->f_mode & FMODE_WRITE) { + if (val & PCM_ENABLE_OUTPUT) { + if (!dmabuf->ready && (ret = prog_dmabuf(state, 0))) + return ret; + start_dac(state); + } else + stop_dac(state); + } + return 0; + + case SNDCTL_DSP_GETIPTR: + if (!(file->f_mode & FMODE_READ)) + return -EINVAL; + spin_lock_irqsave(&state->card->lock, flags); + trident_update_ptr(state); + cinfo.bytes = dmabuf->total_bytes; + cinfo.blocks = dmabuf->count >> dmabuf->fragshift; + cinfo.ptr = dmabuf->hwptr; + if (dmabuf->mapped) + dmabuf->count &= dmabuf->fragsize-1; + spin_unlock_irqrestore(&state->card->lock, flags); + return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)); + + case SNDCTL_DSP_GETOPTR: + if (!(file->f_mode & FMODE_WRITE)) + return -EINVAL; + spin_lock_irqsave(&state->card->lock, flags); + trident_update_ptr(state); + cinfo.bytes = dmabuf->total_bytes; + cinfo.blocks = dmabuf->count >> dmabuf->fragshift; + cinfo.ptr = dmabuf->hwptr; + if (dmabuf->mapped) + dmabuf->count &= dmabuf->fragsize-1; + spin_unlock_irqrestore(&state->card->lock, flags); + return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)); + + case SNDCTL_DSP_SETDUPLEX: + return -EINVAL; + + case SNDCTL_DSP_GETODELAY: + if (!(file->f_mode & FMODE_WRITE)) + return -EINVAL; + spin_lock_irqsave(&state->card->lock, flags); + trident_update_ptr(state); + val = dmabuf->count; + spin_unlock_irqrestore(&state->card->lock, flags); + return put_user(val, (int *)arg); + + case SOUND_PCM_READ_RATE: + return put_user(dmabuf->rate, (int *)arg); + + case SOUND_PCM_READ_CHANNELS: + return put_user((dmabuf->fmt & TRIDENT_FMT_STEREO) ? 2 : 1, + (int *)arg); + + case SOUND_PCM_READ_BITS: + return put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ? + AFMT_S16_LE : AFMT_U8, (int *)arg); + + case SNDCTL_DSP_MAPINBUF: + case SNDCTL_DSP_MAPOUTBUF: + case SNDCTL_DSP_SETSYNCRO: + case SOUND_PCM_WRITE_FILTER: + case SOUND_PCM_READ_FILTER: + return -EINVAL; + + } + return -EINVAL; +} + +static int trident_open(struct inode *inode, struct file *file) +{ + int i = 0; + int minor = MINOR(inode->i_rdev); + struct trident_card *card = devs; + struct trident_state *state = NULL; + struct dmabuf *dmabuf = NULL; + + MOD_INC_USE_COUNT; + /* find an avaiable virtual channel (instance of /dev/dsp) */ + while (card != NULL) { + down(&card->open_sem); + for (i = 0; i < NR_HW_CH; i++) { + if (card->states[i] == NULL) { + state = card->states[i] = (struct trident_state *) + kmalloc(sizeof(struct trident_state), GFP_KERNEL); + if (state == NULL) { + MOD_DEC_USE_COUNT; + return -ENOMEM; + } + memset(state, 0, sizeof(struct trident_state)); + dmabuf = &state->dmabuf; + goto found_virt; + } + } + up(&card->open_sem); + card = card->next; + } + /* no more virtual channel avaiable */ + if (!state) { + MOD_DEC_USE_COUNT; + return -ENODEV; + } + found_virt: + /* found a free virtual channel, allocate hardware channels */ + if(file->f_mode & FMODE_READ) + dmabuf->channel = card->alloc_rec_pcm_channel(card); + else + dmabuf->channel = card->alloc_pcm_channel(card); + + if (dmabuf->channel == NULL) { + kfree (card->states[i]); + card->states[i] = NULL; + MOD_DEC_USE_COUNT; + return -ENODEV; + } + + /* initialize the virtual channel */ + state->virt = i; + state->card = card; + state->magic = TRIDENT_STATE_MAGIC; + init_waitqueue(&dmabuf->wait); + file->private_data = state; + + /* set default sample format. According to OSS Programmer's Guide /dev/dsp + should be default to unsigned 8-bits, mono, with sample rate 8kHz and + /dev/dspW will accept 16-bits sample */ + if (file->f_mode & FMODE_WRITE) { + dmabuf->fmt &= ~TRIDENT_FMT_MASK; + if ((minor & 0x0f) == SND_DEV_DSP16) + dmabuf->fmt |= TRIDENT_FMT_16BIT; + dmabuf->ossfragshift = 0; + dmabuf->ossmaxfrags = 0; + dmabuf->subdivision = 0; + if (card->pci_id == PCI_DEVICE_ID_SI_7018) { + /* set default channel attribute to normal playback */ + dmabuf->channel->attribute = CHANNEL_PB; + } + trident_set_dac_rate(state, 8000); + } + + if (file->f_mode & FMODE_READ) { + if (card->pci_id == PCI_DEVICE_ID_ALI_5451) { + card->states[ALI_PCM_IN_CHANNEL] = state; + card->states[i] = NULL; + state->virt = ALI_PCM_IN_CHANNEL; + } + /* FIXME: Trident 4d can only record in signed 16-bits stereo, 48kHz sample, + to be dealed with in trident_set_adc_rate() ?? */ + dmabuf->fmt &= ~TRIDENT_FMT_MASK; + if ((minor & 0x0f) == SND_DEV_DSP16) + dmabuf->fmt |= TRIDENT_FMT_16BIT; + dmabuf->ossfragshift = 0; + dmabuf->ossmaxfrags = 0; + dmabuf->subdivision = 0; + if (card->pci_id == PCI_DEVICE_ID_SI_7018) { + /* set default channel attribute to 0x8a80, record from + PCM L/R FIFO and mono = (left + right + 1)/2*/ + dmabuf->channel->attribute = + (CHANNEL_REC|PCM_LR|MONO_MIX); + } + trident_set_adc_rate(state, 8000); + } + + state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); + up(&card->open_sem); + +#ifdef DEBUG + printk(KERN_ERR "trident: open virtual channel %d, hard channel %d\n", + state->virt, dmabuf->channel->num); +#endif + + return 0; +} + +static int trident_release(struct inode *inode, struct file *file) +{ + struct trident_state *state = (struct trident_state *)file->private_data; + struct trident_card *card = state->card; + struct dmabuf *dmabuf = &state->dmabuf; + + VALIDATE_STATE(state); + + if (file->f_mode & FMODE_WRITE) { + trident_clear_tail(state); + drain_dac(state, file->f_flags & O_NONBLOCK); + } + + /* stop DMA state machine and free DMA buffers/channels */ + down(&card->open_sem); + + if (file->f_mode & FMODE_WRITE) { + stop_dac(state); + dealloc_dmabuf(state); + state->card->free_pcm_channel(state->card, dmabuf->channel->num); + } + if (file->f_mode & FMODE_READ) { + stop_adc(state); + dealloc_dmabuf(state); + state->card->free_pcm_channel(state->card, dmabuf->channel->num); + } + + card->states[state->virt] = NULL; + kfree(state); + + /* we're covered by the open_sem */ + up(&card->open_sem); + + MOD_DEC_USE_COUNT; + return 0; +} + +static /*const*/ struct file_operations trident_audio_fops = { + llseek: trident_llseek, + read: trident_read, + write: trident_write, + poll: trident_poll, + ioctl: trident_ioctl, + mmap: trident_mmap, + open: trident_open, + release: trident_release, +}; + +/* trident specific AC97 functions */ +/* Write AC97 codec registers */ +static void trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val) +{ + struct trident_card *card = (struct trident_card *)codec->private_data; + unsigned int address, mask, busy; + unsigned short count = 0xffff; + unsigned long flags; + u32 data; + + data = ((u32) val) << 16; + + switch (card->pci_id) + { + default: + case PCI_DEVICE_ID_SI_7018: + address = SI_AC97_WRITE; + mask = SI_AC97_BUSY_WRITE | SI_AC97_AUDIO_BUSY; + if (codec->id) + mask |= SI_AC97_SECONDARY; + busy = SI_AC97_BUSY_WRITE; + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX: + address = DX_ACR0_AC97_W; + mask = busy = DX_AC97_BUSY_WRITE; + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX: + address = NX_ACR1_AC97_W; + mask = NX_AC97_BUSY_WRITE; + if (codec->id) + mask |= NX_AC97_WRITE_SECONDARY; + busy = NX_AC97_BUSY_WRITE; + break; + } + + spin_lock_irqsave(&card->lock, flags); + do { + if ((inw(TRID_REG(card, address)) & busy) == 0) + break; + } while (count--); + + + data |= (mask | (reg & AC97_REG_ADDR)); + + if (count == 0) { + printk(KERN_ERR "trident: AC97 CODEC write timed out.\n"); + spin_unlock_irqrestore(&card->lock, flags); + return; + } + + outl(data, TRID_REG(card, address)); + spin_unlock_irqrestore(&card->lock, flags); +} + +/* Read AC97 codec registers */ +static u16 trident_ac97_get(struct ac97_codec *codec, u8 reg) +{ + struct trident_card *card = (struct trident_card *)codec->private_data; + unsigned int address, mask, busy; + unsigned short count = 0xffff; + unsigned long flags; + u32 data; + + switch (card->pci_id) + { + default: + case PCI_DEVICE_ID_SI_7018: + address = SI_AC97_READ; + mask = SI_AC97_BUSY_READ | SI_AC97_AUDIO_BUSY; + if (codec->id) + mask |= SI_AC97_SECONDARY; + busy = SI_AC97_BUSY_READ; + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX: + address = DX_ACR1_AC97_R; + mask = busy = DX_AC97_BUSY_READ; + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX: + if (codec->id) + address = NX_ACR3_AC97_R_SECONDARY; + else + address = NX_ACR2_AC97_R_PRIMARY; + mask = NX_AC97_BUSY_READ; + busy = NX_AC97_BUSY_READ | NX_AC97_BUSY_DATA; + break; + } + + data = (mask | (reg & AC97_REG_ADDR)); + + spin_lock_irqsave(&card->lock, flags); + outl(data, TRID_REG(card, address)); + do { + data = inl(TRID_REG(card, address)); + if ((data & busy) == 0) + break; + } while (count--); + spin_unlock_irqrestore(&card->lock, flags); + + if (count == 0) { + printk(KERN_ERR "trident: AC97 CODEC read timed out.\n"); + data = 0; + } + return ((u16) (data >> 16)); +} + +/* Write AC97 codec registers for ALi*/ +static void ali_ac97_set(struct ac97_codec *codec, u8 reg, u16 val) +{ + struct trident_card *card = (struct trident_card *)codec->private_data; + unsigned int address, mask; + unsigned int wCount1 = 0xffff; + unsigned int wCount2= 0xffff; + unsigned long chk1, chk2; + unsigned long flags; + u32 data; + + data = ((u32) val) << 16; + + address = ALI_AC97_WRITE; + mask = ALI_AC97_WRITE_ACTION | ALI_AC97_AUDIO_BUSY; + if (codec->id) + mask |= ALI_AC97_SECONDARY; + if (card->revision == 0x02) + mask |= ALI_AC97_WRITE_MIXER_REGISTER; + + spin_lock_irqsave(&card->lock, flags); + while (wCount1--) { + if ((inw(TRID_REG(card, address)) & ALI_AC97_BUSY_WRITE) == 0) { + data |= (mask | (reg & AC97_REG_ADDR)); + + chk1 = inl(TRID_REG(card, ALI_STIMER)); + chk2 = inl(TRID_REG(card, ALI_STIMER)); + while (wCount2-- && (chk1 == chk2)) + chk2 = inl(TRID_REG(card, ALI_STIMER)); + if (wCount2 == 0) { + spin_unlock_irqrestore(&card->lock, flags); + return; + } + outl(data, TRID_REG(card, address)); //write! + spin_unlock_irqrestore(&card->lock, flags); + return; //success + } + inw(TRID_REG(card, address)); //wait a read cycle + } + + printk(KERN_ERR "ali: AC97 CODEC write timed out.\n"); + spin_unlock_irqrestore(&card->lock, flags); + return; +} + +/* Read AC97 codec registers for ALi*/ +static u16 ali_ac97_get(struct ac97_codec *codec, u8 reg) +{ + struct trident_card *card = (struct trident_card *)codec->private_data; + unsigned int address, mask; + unsigned int wCount1 = 0xffff; + unsigned int wCount2= 0xffff; + unsigned long chk1, chk2; + unsigned long flags; + u32 data; + + address = ALI_AC97_READ; + if (card->revision == 0x02) { + address = ALI_AC97_WRITE; + mask &= ALI_AC97_READ_MIXER_REGISTER; + } + mask = ALI_AC97_READ_ACTION | ALI_AC97_AUDIO_BUSY; + if (codec->id) + mask |= ALI_AC97_SECONDARY; + + spin_lock_irqsave(&card->lock, flags); + data = (mask | (reg & AC97_REG_ADDR)); + while (wCount1--) { + if ((inw(TRID_REG(card, address)) & ALI_AC97_BUSY_READ) == 0) { + chk1 = inl(TRID_REG(card, ALI_STIMER)); + chk2 = inl(TRID_REG(card, ALI_STIMER)); + while (wCount2-- && (chk1 == chk2)) + chk2 = inl(TRID_REG(card, ALI_STIMER)); + if (wCount2 == 0) { + printk(KERN_ERR "ali: AC97 CODEC read timed out.\n"); + spin_unlock_irqrestore(&card->lock, flags); + return 0; + } + outl(data, TRID_REG(card, address)); //read! + wCount2 = 0xffff; + while (wCount2--) { + if ((inw(TRID_REG(card, address)) & ALI_AC97_BUSY_READ) == 0) { + data = inl(TRID_REG(card, address)); + spin_unlock_irqrestore(&card->lock, flags); + return ((u16) (data >> 16)); + } + } + } + inw(TRID_REG(card, address)); //wait a read cycle + } + spin_unlock_irqrestore(&card->lock, flags); + printk(KERN_ERR "ali: AC97 CODEC read timed out.\n"); + return 0; +} + +/* OSS /dev/mixer file operation methods */ +static int trident_open_mixdev(struct inode *inode, struct file *file) +{ + int i; + int minor = MINOR(inode->i_rdev); + struct trident_card *card = devs; + + MOD_INC_USE_COUNT; + for (card = devs; card != NULL; card = card->next) + for (i = 0; i < NR_AC97; i++) + if (card->ac97_codec[i] != NULL && + card->ac97_codec[i]->dev_mixer == minor) + goto match; + + if (!card) { + MOD_DEC_USE_COUNT; + return -ENODEV; + } + match: + file->private_data = card->ac97_codec[i]; + + + return 0; +} + +static int trident_release_mixdev(struct inode *inode, struct file *file) +{ + MOD_DEC_USE_COUNT; + return 0; +} + +static int trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct ac97_codec *codec = (struct ac97_codec *)file->private_data; + + return codec->mixer_ioctl(codec, cmd, arg); +} + +static /*const*/ struct file_operations trident_mixer_fops = { + llseek: trident_llseek, + ioctl: trident_ioctl_mixdev, + open: trident_open_mixdev, + release: trident_release_mixdev, +}; + +/* AC97 codec initialisation. */ +static int __init trident_ac97_init(struct trident_card *card) +{ + int num_ac97 = 0; + int ready_2nd = 0; + struct ac97_codec *codec; + + /* initialize controller side of AC link, and find out if secondary codes + really exist */ + switch (card->pci_id) + { + case PCI_DEVICE_ID_ALI_5451: + outl(PCMOUT|SECONDARY_ID, TRID_REG(card, SI_SERIAL_INTF_CTRL)); + ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL)); + ready_2nd &= SI_AC97_SECONDARY_READY; + break; + case PCI_DEVICE_ID_SI_7018: + /* disable AC97 GPIO interrupt */ + outl(0x00, TRID_REG(card, SI_AC97_GPIO)); + /* when power up the AC link is in cold reset mode so stop it */ + outl(PCMOUT|SURROUT|CENTEROUT|LFEOUT|SECONDARY_ID, + TRID_REG(card, SI_SERIAL_INTF_CTRL)); + /* it take a long time to recover from a cold reset (especially when you have + more than one codec) */ + udelay(2000); + ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL)); + ready_2nd &= SI_AC97_SECONDARY_READY; + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX: + /* playback on */ + outl(DX_AC97_PLAYBACK, TRID_REG(card, DX_ACR2_AC97_COM_STAT)); + break; + case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX: + /* enable AC97 Output Slot 3,4 (PCM Left/Right Playback) */ + outl(NX_AC97_PCM_OUTPUT, TRID_REG(card, NX_ACR0_AC97_COM_STAT)); + ready_2nd = inl(TRID_REG(card, NX_ACR0_AC97_COM_STAT)); + ready_2nd &= NX_AC97_SECONDARY_READY; + break; + } + + for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) { + if ((codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL)) == NULL) + return -ENOMEM; + memset(codec, 0, sizeof(struct ac97_codec)); + + /* initialize some basic codec information, other fields will be filled + in ac97_probe_codec */ + codec->private_data = card; + codec->id = num_ac97; + + if (card->pci_id == PCI_DEVICE_ID_ALI_5451) { + codec->codec_read = ali_ac97_get; + codec->codec_write = ali_ac97_set; + } + else { + codec->codec_read = trident_ac97_get; + codec->codec_write = trident_ac97_set; + } + + if (ac97_probe_codec(codec) == 0) + break; + + if ((codec->dev_mixer = register_sound_mixer(&trident_mixer_fops, -1)) < 0) { + printk(KERN_ERR "trident: couldn't register mixer!\n"); + kfree(codec); + break; + } + + card->ac97_codec[num_ac97] = codec; + + /* if there is no secondary codec at all, don't probe any more */ + if (!ready_2nd) + return num_ac97+1; + } + + return num_ac97; +} + +/* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered + untill "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */ +static int __init trident_install(struct pci_dev *pci_dev, struct pci_audio_info *pci_info) +{ + u16 w; + unsigned long iobase; + struct trident_card *card; + + + iobase = pci_dev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; + if (check_region(iobase, 256)) { + printk(KERN_ERR "trident: can't allocate I/O space at 0x%4.4lx\n", + iobase); + return -ENODEV; + } + + /* just to be sure that IO space and bus master is on */ + pci_set_master(pci_dev); + pci_read_config_word(pci_dev, PCI_COMMAND, &w); + w |= PCI_COMMAND_IO|PCI_COMMAND_MASTER; + pci_write_config_word(pci_dev, PCI_COMMAND, w); + + if ((card = kmalloc(sizeof(struct trident_card), GFP_KERNEL)) == NULL) { + printk(KERN_ERR "trident: out of memory\n"); + return -ENOMEM; + } + memset(card, 0, sizeof(*card)); + + card->iobase = iobase; + card->pci_info = pci_info; + card->pci_id = pci_info->device; + card->irq = pci_dev->irq; + card->next = devs; + card->magic = TRIDENT_CARD_MAGIC; + card->banks[BANK_A].addresses = &bank_a_addrs; + card->banks[BANK_A].bitmap = 0UL; + card->banks[BANK_B].addresses = &bank_b_addrs; + card->banks[BANK_B].bitmap = 0UL; + card->open_sem = MUTEX; + spin_lock_init(&card->lock); + devs = card; + + printk(KERN_INFO "trident: %s found at IO 0x%04lx, IRQ %d\n", + card->pci_info->name, card->iobase, card->irq); + + if(card->pci_id == PCI_DEVICE_ID_ALI_5451) { + card->alloc_pcm_channel = ali_alloc_pcm_channel; + card->alloc_rec_pcm_channel = ali_alloc_rec_pcm_channel; + card->free_pcm_channel = ali_free_pcm_channel; + card->address_interrupt = ali_address_interrupt; + } + else { + card->alloc_pcm_channel = trident_alloc_pcm_channel; + card->alloc_rec_pcm_channel = trident_alloc_pcm_channel; + card->free_pcm_channel = trident_free_pcm_channel; + card->address_interrupt = trident_address_interrupt; + } + + /* claim our iospace and irq */ + request_region(card->iobase, 256, card->pci_info->name); + if (request_irq(card->irq, &trident_interrupt, SA_SHIRQ, card->pci_info->name, card)) { + printk(KERN_ERR "trident: unable to allocate irq %d\n", card->irq); + release_region(card->iobase, 256); + kfree(card); + return -ENODEV; + } + /* register /dev/dsp */ + if ((card->dev_audio = register_sound_dsp(&trident_audio_fops, -1)) < 0) { + printk(KERN_ERR "trident: couldn't register DSP device!\n"); + release_region(iobase, 256); + free_irq(card->irq, card); + kfree(card); + return -ENODEV; + } + /* initilize AC97 codec and register /dev/mixer */ + if (trident_ac97_init(card) <= 0) { + unregister_sound_dsp(card->dev_audio); + release_region(iobase, 256); + free_irq(card->irq, card); + kfree(card); + return -ENODEV; + } + outl(0x00, TRID_REG(card, T4D_MUSICVOL_WAVEVOL)); + + if (card->pci_id == PCI_DEVICE_ID_ALI_5451) { + /* edited by HMSEO for GT sound */ +#ifdef CONFIG_ALPHA_NAUTILUS + ac97_data = trident_ac97_get (card->ac97_codec[0], AC97_POWER_CONTROL); + trident_ac97_set (card->ac97_codec[0], AC97_POWER_CONTROL, + ac97_data | ALI_EAPD_POWER_DOWN); +#endif + /* edited by HMSEO for GT sound*/ + } + + /* Enable Address Engine Interrupts */ + trident_enable_loop_interrupts(card); + + return 1; +} + +#ifdef MODULE +int init_module(void) +#else +int init_trident(void) +#endif + { + struct pci_dev *pcidev = NULL; + int foundone = 0; + int i; + + if (!pci_present()) /* No PCI bus in this machine! */ + return -ENODEV; + + printk(KERN_INFO "Trident 4DWave/SiS 7018 PCI Audio, version " + DRIVER_VERSION ", " __TIME__ " " __DATE__ "\n"); + + for (i = 0; i < sizeof (pci_audio_devices); i++) { + pcidev = NULL; + while ((pcidev = pci_find_device(pci_audio_devices[i].vendor, + pci_audio_devices[i].device, + pcidev)) != NULL) { + foundone += trident_install(pcidev, pci_audio_devices + i); + } + } + + if (!foundone) + return -ENODEV; + return 0; +} + +#ifdef MODULE +MODULE_AUTHOR("Alan Cox, Aaron Holtzman, Ollie Lho, Ching Ling Lee"); +MODULE_DESCRIPTION("Trident 4DWave/SiS 7018/ALi 5451 PCI Audio Driver"); + +void cleanup_module(void) +#else +void cleanup_trident(void) +#endif +{ + while (devs != NULL) { + int i; + /* Kill interrupts, and SP/DIF */ + trident_disable_loop_interrupts(devs); + + /* free hardware resources */ + free_irq(devs->irq, devs); + release_region(devs->iobase, 256); + + /* unregister audio devices */ + for (i = 0; i < NR_AC97; i++) + if (devs->ac97_codec[i] != NULL) { + unregister_sound_mixer(devs->ac97_codec[i]->dev_mixer); + kfree (devs->ac97_codec[i]); + } + unregister_sound_dsp(devs->dev_audio); + + kfree(devs); + devs = devs->next; + } +} + diff -urN v2.2.15/linux/drivers/sound/trident.h linux/drivers/sound/trident.h --- v2.2.15/linux/drivers/sound/trident.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/sound/trident.h Wed Jun 7 14:26:43 2000 @@ -0,0 +1,289 @@ +#ifndef __TRID4DWAVE_H +#define __TRID4DWAVE_H + +/* + * audio@tridentmicro.com + * Fri Feb 19 15:55:28 MST 1999 + * Definitions for Trident 4DWave DX/NX chips + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* PCI vendor and device ID */ +#ifndef PCI_VENDOR_ID_TRIDENT +#define PCI_VENDOR_ID_TRIDENT 0x1023 +#endif + +#ifndef PCI_VENDOR_ID_SI +#define PCI_VENDOR_ID_SI 0x0139 +#endif + +#ifndef PCI_VENDOR_ID_ALI +#define PCI_VENDOR_ID_ALI 0x10b9 +#endif + +#ifndef PCI_DEVICE_ID_TRIDENT_4DWAVE_DX +#define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000 +#endif + +#ifndef PCI_DEVICE_ID_TRIDENT_4DWAVE_NX +#define PCI_DEVICE_ID_TRIDENT_4DWAVE_NX 0x2001 +#endif + +#ifndef PCI_DEVICE_ID_SI_7018 +#define PCI_DEVICE_ID_SI_7018 0x7018 +#endif + +#ifndef PCI_DEVICE_ID_ALI_5451 +#define PCI_DEVICE_ID_ALI_5451 0x5451 +#endif + +#ifndef FALSE +#define FALSE 0 +#define TRUE 1 +#endif + +#define CHANNEL_REGS 5 +#define CHANNEL_START 0xe0 // The first bytes of the contiguous register space. + +#define BANK_A 0 +#define BANK_B 1 +#define NR_BANKS 2 + +#define TRIDENT_FMT_STEREO 0x01 +#define TRIDENT_FMT_16BIT 0x02 +#define TRIDENT_FMT_MASK 0x03 + +#define DAC_RUNNING 0x01 +#define ADC_RUNNING 0x02 + +/* Register Addresses */ + +/* operational registers common to DX, NX, 7018 */ +enum trident_op_registers { + T4D_REC_CH = 0x70, + T4D_START_A = 0x80, T4D_STOP_A = 0x84, + T4D_DLY_A = 0x88, T4D_SIGN_CSO_A = 0x8c, + T4D_CSPF_A = 0x90, T4D_CEBC_A = 0x94, + T4D_AINT_A = 0x98, T4D_EINT_A = 0x9c, + T4D_LFO_GC_CIR = 0xa0, T4D_AINTEN_A = 0xa4, + T4D_MUSICVOL_WAVEVOL = 0xa8, T4D_SBDELTA_DELTA_R = 0xac, + T4D_MISCINT = 0xb0, T4D_START_B = 0xb4, + T4D_STOP_B = 0xb8, T4D_CSPF_B = 0xbc, + T4D_SBBL_SBCL = 0xc0, T4D_SBCTRL_SBE2R_SBDD = 0xc4, + T4D_STIMER = 0xc8, T4D_LFO_B_I2S_DELTA = 0xcc, + T4D_AINT_B = 0xd8, T4D_AINTEN_B = 0xdc +}; + +enum ali_op_registers { + ALI_GLOBAL_CONTROL = 0xd4, + ALI_STIMER = 0xc8 +}; + +enum ali_global_control_bit { + ALI_PCM_IN_ENABLE = 0x80000000, + ALI_PCM_IN_DISABLE = 0x7fffffff +}; + +enum ali_pcm_in_channel_num { + ALI_PCM_IN_CHANNEL = 31 +}; + +enum ali_pcm_out_channel_num { + ALI_PCM_OUT_CHANNEL_FIRST = 1, + ALI_PCM_OUT_CHANNEL_LAST = 30 +}; + +enum ali_ac97_power_control_bit { + ALI_EAPD_POWER_DOWN = 0x8000 +}; + +enum ali_update_ptr_flags { + ALI_ADDRESS_INT_UPDATE = 0x01 +}; + +/* S/PDIF Operational Registers for 4D-NX */ +enum nx_spdif_registers { + NX_SPCTRL_SPCSO = 0x24, NX_SPLBA = 0x28, + NX_SPESO = 0x2c, NX_SPCSTATUS = 0x64 +}; + +/* OP registers to access each hardware channel */ +enum channel_registers { + CH_DX_CSO_ALPHA_FMS = 0xe0, CH_DX_ESO_DELTA = 0xe8, + CH_DX_FMC_RVOL_CVOL = 0xec, + CH_NX_DELTA_CSO = 0xe0, CH_NX_DELTA_ESO = 0xe8, + CH_NX_ALPHA_FMS_FMC_RVOL_CVOL = 0xec, + CH_LBA = 0xe4, + CH_GVSEL_PAN_VOL_CTRL_EC = 0xf0 +}; + +/* registers to read/write/control AC97 codec */ +enum dx_ac97_registers { + DX_ACR0_AC97_W = 0x40, DX_ACR1_AC97_R = 0x44, + DX_ACR2_AC97_COM_STAT = 0x48 +}; + +enum nx_ac97_registers { + NX_ACR0_AC97_COM_STAT = 0x40, NX_ACR1_AC97_W = 0x44, + NX_ACR2_AC97_R_PRIMARY = 0x48, NX_ACR3_AC97_R_SECONDARY = 0x4c +}; + +enum si_ac97_registers { + SI_AC97_WRITE = 0x40, SI_AC97_READ = 0x44, + SI_SERIAL_INTF_CTRL = 0x48, SI_AC97_GPIO = 0x4c +}; + +enum ali_ac97_registers { + ALI_AC97_WRITE = 0x40, ALI_AC97_READ = 0x44 +}; + +/* Bit mask for operational registers */ +#define AC97_REG_ADDR 0x000000ff + +enum ali_ac97_bits { + ALI_AC97_BUSY_WRITE = 0x8000, ALI_AC97_BUSY_READ = 0x8000, + ALI_AC97_WRITE_ACTION = 0x8000, ALI_AC97_READ_ACTION = 0x8000, + ALI_AC97_AUDIO_BUSY = 0x4000, ALI_AC97_SECONDARY = 0x0080, + ALI_AC97_READ_MIXER_REGISTER = 0xfeff, + ALI_AC97_WRITE_MIXER_REGISTER = 0x0100 +}; + +enum sis7018_ac97_bits { + SI_AC97_BUSY_WRITE = 0x8000, SI_AC97_BUSY_READ = 0x8000, + SI_AC97_AUDIO_BUSY = 0x4000, SI_AC97_MODEM_BUSY = 0x2000, + SI_AC97_SECONDARY = 0x0080 +}; + +enum trident_dx_ac97_bits { + DX_AC97_BUSY_WRITE = 0x8000, DX_AC97_BUSY_READ = 0x8000, + DX_AC97_READY = 0x0010, DX_AC97_RECORD = 0x0008, + DX_AC97_PLAYBACK = 0x0002 +}; + +enum trident_nx_ac97_bits { + /* ACR1-3 */ + NX_AC97_BUSY_WRITE = 0x0800, NX_AC97_BUSY_READ = 0x0800, + NX_AC97_BUSY_DATA = 0x0400, NX_AC97_WRITE_SECONDARY = 0x0100, + /* ACR0 */ + NX_AC97_SECONDARY_READY = 0x0040, NX_AC97_SECONDARY_RECORD = 0x0020, + NX_AC97_SURROUND_OUTPUT = 0x0010, + NX_AC97_PRIMARY_READY = 0x0008, NX_AC97_PRIMARY_RECORD = 0x0004, + NX_AC97_PCM_OUTPUT = 0x0002, + NX_AC97_WARM_RESET = 0x0001 +}; + +enum serial_intf_ctrl_bits { + WARM_REST = 0x00000001, COLD_RESET = 0x00000002, + I2S_CLOCK = 0x00000004, PCM_SEC_AC97= 0x00000008, + AC97_DBL_RATE = 0x00000010, SPDIF_EN = 0x00000020, + I2S_OUTPUT_EN = 0x00000040, I2S_INPUT_EN = 0x00000080, + PCMIN = 0x00000100, LINE1IN = 0x00000200, + MICIN = 0x00000400, LINE2IN = 0x00000800, + HEAD_SET_IN = 0x00001000, GPIOIN = 0x00002000, + /* 7018 spec says id = 01 but the demo board routed to 10 + SECONDARY_ID= 0x00004000, */ + SECONDARY_ID= 0x00004000, + PCMOUT = 0x00010000, SURROUT = 0x00020000, + CENTEROUT = 0x00040000, LFEOUT = 0x00080000, + LINE1OUT = 0x00100000, LINE2OUT = 0x00200000, + GPIOOUT = 0x00400000, + SI_AC97_PRIMARY_READY = 0x01000000, + SI_AC97_SECONDARY_READY = 0x02000000, +}; + +enum global_control_bits { + CHANNLE_IDX = 0x0000003f, PB_RESET = 0x00000100, + PAUSE_ENG = 0x00000200, + OVERRUN_IE = 0x00000400, UNDERRUN_IE = 0x00000800, + ENDLP_IE = 0x00001000, MIDLP_IE = 0x00002000, + ETOG_IE = 0x00004000, + EDROP_IE = 0x00008000, BANK_B_EN = 0x00010000 +}; + +enum channel_control_bits { + CHANNEL_LOOP = 0x00001000, CHANNEL_SIGNED = 0x00002000, + CHANNEL_STEREO = 0x00004000, CHANNEL_16BITS = 0x00008000, +}; + +enum channel_attribute { + /* playback/record select */ + CHANNEL_PB = 0x0000, CHANNEL_SPC_PB = 0x4000, + CHANNEL_REC = 0x8000, CHANNEL_REC_PB = 0xc000, + /* playback destination/record source select */ + MODEM_LINE1 = 0x0000, MODEM_LINE2 = 0x0400, + PCM_LR = 0x0800, HSET = 0x0c00, + I2S_LR = 0x1000, CENTER_LFE = 0x1400, + SURR_LR = 0x1800, SPDIF_LR = 0x1c00, + MIC = 0x1400, + /* mist stuff */ + MONO_LEFT = 0x0000, MONO_RIGHT = 0x0100, + MONO_MIX = 0x0200, SRC_ENABLE = 0x0080, +}; + +enum miscint_bits { + PB_UNDERRUN_IRO = 0x00000001, REC_OVERRUN_IRQ = 0x00000002, + SB_IRQ = 0x00000004, MPU401_IRQ = 0x00000008, + OPL3_IRQ = 0x00000010, ADDRESS_IRQ = 0x00000020, + ENVELOPE_IRQ = 0x00000040, ST_IRQ = 0x00000080, + PB_UNDERRUN = 0x00000100, REC_OVERRUN = 0x00000200, + MIXER_UNDERFLOW = 0x00000400, MIXER_OVERFLOW = 0x00000800, + ST_TARGET_REACHED = 0x00008000, PB_24K_MODE = 0x00010000, + ST_IRQ_EN = 0x00800000, ACGPIO_IRQ = 0x01000000 +}; + +#define TRID_REG( trident, x ) ( (trident) -> iobase + (x) ) + +#define VALIDATE_MAGIC(FOO,MAG) \ +({ \ + if (!(FOO) || (FOO)->magic != MAG) { \ + printk(invalid_magic,__FUNCTION__); \ + return -ENXIO; \ + } \ +}) + +#define VALIDATE_STATE(a) VALIDATE_MAGIC(a,TRIDENT_STATE_MAGIC) +#define VALIDATE_CARD(a) VALIDATE_MAGIC(a,TRIDENT_CARD_MAGIC) + + +extern __inline__ unsigned ld2(unsigned int x) +{ + unsigned r = 0; + + if (x >= 0x10000) { + x >>= 16; + r += 16; + } + if (x >= 0x100) { + x >>= 8; + r += 8; + } + if (x >= 0x10) { + x >>= 4; + r += 4; + } + if (x >= 4) { + x >>= 2; + r += 2; + } + if (x >= 2) + r++; + return r; +} + +#endif /* __TRID4DWAVE_H */ + diff -urN v2.2.15/linux/drivers/sound/via82cxxx.c linux/drivers/sound/via82cxxx.c --- v2.2.15/linux/drivers/sound/via82cxxx.c Tue Oct 26 17:53:41 1999 +++ linux/drivers/sound/via82cxxx.c Wed Dec 31 16:00:00 1969 @@ -1,266 +0,0 @@ -/* - * Support for VIA 82Cxxx Audio Codecs - * Copyright 1999 Jeff Garzik - * - * Distributed under the GNU GENERAL PUBLIC LICENSE (GPL) Version 2. - * See the "COPYING" file distributed with this software for more info. - * - ******************************************************************** - * - * TODO: - * - * - Integrate AC'97 support, when AC'97 interface released - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "sound_config.h" -#include "soundmodule.h" -#include "sb.h" - -#ifndef SOUND_LOCK -#define SOUND_LOCK do {} while (0) -#define SOUND_LOCK_END do {} while (0) -#endif - -#define MAX_CARDS 2 - -#define PFX "via82cxxx: " - -#define VIA_VERSION "1.0.0" -#define VIA_CARD_NAME "VIA 82Cxxx Audio driver " VIA_VERSION - -#define VIA_FUNC_ENABLE 0x42 -#define VIA_PNP_CONTROL 0x43 - -#define VIA_CR42_SB_ENABLE 0x01 -#define VIA_CR42_MIDI_ENABLE 0x02 -#define VIA_CR42_FM_ENABLE 0x04 - -#define via_probe_midi probe_uart401 -#define via_attach_midi attach_uart401 -#define via_unload_midi unload_uart401 - -static struct address_info sb_data[MAX_CARDS]; -static struct address_info opl3_data[MAX_CARDS]; -static unsigned cards = 0; - - -static void __init via_attach_sb(struct address_info *hw_config) -{ - if(!sb_dsp_init(hw_config)) - hw_config->slots[0] = -1; -} - - -static int __init via_probe_sb(struct address_info *hw_config) -{ - if (check_region(hw_config->io_base, 16)) - { - printk(KERN_DEBUG PFX "SBPro port 0x%x is already in use\n", - hw_config->io_base); - return 0; - } - return sb_dsp_detect(hw_config, 0, 0); -} - - -static void via_unload_sb(struct address_info *hw_config, int unload_mpu) -{ - if(hw_config->slots[0]!=-1) - sb_dsp_unload(hw_config, unload_mpu); -} - - -static int __init via82cxxx_install (struct pci_dev *pcidev) -{ - int sb_io_base = 0; - int sb_irq = 0; - int sb_dma = 0; - int midi_base = 0; - u8 tmp8; - - memset (&sb_data[cards], 0, sizeof (struct address_info)); - memset (&opl3_data[cards], 0, sizeof (struct address_info)); - - sb_data[cards].name = opl3_data[cards].name = VIA_CARD_NAME; - opl3_data[cards].irq = -1; - - /* turn on features, if not already */ - pci_read_config_byte (pcidev, VIA_FUNC_ENABLE, &tmp8); - tmp8 |= VIA_CR42_SB_ENABLE | VIA_CR42_MIDI_ENABLE | - VIA_CR42_FM_ENABLE; - pci_write_config_byte (pcidev, VIA_FUNC_ENABLE, tmp8); - - /* read legacy PNP info byte */ - pci_read_config_byte (pcidev, VIA_PNP_CONTROL, &tmp8); - pci_write_config_byte (pcidev, VIA_PNP_CONTROL, tmp8); - - switch ((tmp8 >> 6) & 0x03) { - case 0: sb_irq = 5; break; - case 1: sb_irq = 7; break; - case 2: sb_irq = 9; break; - case 3: sb_irq = 10; break; - default: /* do nothing */ break; - } - switch ((tmp8 >> 4) & 0x03) { - case 0: sb_dma = 0; break; - case 1: sb_dma = 1; break; - case 2: sb_dma = 2; break; - case 3: sb_dma = 3; break; - default: /* do nothing */ break; - } - switch ((tmp8 >> 2) & 0x03) { - case 0: midi_base = 0x300; break; - case 1: midi_base = 0x310; break; - case 2: midi_base = 0x320; break; - case 3: midi_base = 0x330; break; - default: /* do nothing */ break; - } - switch (tmp8 & 0x03) { - case 0: sb_io_base = 0x220; break; - case 1: sb_io_base = 0x240; break; - case 2: sb_io_base = 0x260; break; - case 3: sb_io_base = 0x280; break; - default: /* do nothing */ break; - } - - udelay(100); - - printk(KERN_INFO PFX "legacy " - "MIDI: 0x%X, SB: 0x%X / %d IRQ / %d DMA\n", - midi_base, sb_io_base, sb_irq, sb_dma); - - sb_data[cards].card_subtype = MDL_SBPRO; - sb_data[cards].io_base = sb_io_base; - sb_data[cards].irq = sb_irq; - sb_data[cards].dma = sb_dma; - - opl3_data[cards].io_base = midi_base; - - /* register legacy SoundBlaster Pro */ - if (!via_probe_sb (&sb_data[cards])) { - printk (KERN_ERR PFX - "SB probe @ 0x%X failed, aborting\n", - sb_io_base); - return -1; - } - via_attach_sb (&sb_data[cards]); - - /* register legacy MIDI */ - if (!via_probe_midi (&opl3_data[cards])) { - printk (KERN_ERR PFX - "MIDI probe @ 0x%X failed, aborting\n", - midi_base); - via_unload_sb (&sb_data[cards], 0); - return -1; - } - via_attach_midi (&opl3_data[cards]); - - cards++; - return 0; -} - - -/* - * This loop walks the PCI configuration database and finds where - * the sound cards are. - */ - -static int __init probe_via82cxxx (void) -{ - struct pci_dev *pcidev = NULL; - - while ((pcidev = pci_find_device (PCI_VENDOR_ID_VIA, - PCI_DEVICE_ID_VIA_82C686_5, - pcidev)) != NULL) { - - if (via82cxxx_install (pcidev) != 0) { - printk (KERN_ERR PFX "audio init failed\n"); - return -1; - } - - if (cards == MAX_CARDS) { - printk (KERN_DEBUG PFX "maximum number of cards reached\n"); - break; - } - } - - return 0; -} - - -/* - * This function is called when the user or kernel loads the - * module into memory. - */ - - -static int __init init_via82cxxx_module(void) -{ - if (!pci_present ()) { - printk (KERN_DEBUG PFX "PCI not present, exiting\n"); - return -ENODEV; - } - - if (probe_via82cxxx() != 0) { - printk(KERN_ERR PFX "probe failed, aborting\n"); - /* XXX unload cards registered so far, if any */ - return -ENODEV; - } - - if (cards == 0) { - printk(KERN_DEBUG PFX "No chips found, aborting\n"); - return -ENODEV; - } - - printk (KERN_INFO PFX VIA_CARD_NAME " loaded\n"); - - /* - * Binds us to the sound subsystem - */ - SOUND_LOCK; - return 0; -} - -/* - * This is called when it is removed. It will only be removed - * when its use count is 0. For sound the SOUND_LOCK/SOUND_UNLOCK - * macros hide the entire work for this. - */ - -static void cleanup_via82cxxx_module(void) -{ - int i; - - for (i = 0; i < cards; i++) - via_unload_sb (&sb_data[i], 1); - - /* - * Final clean up with the sound layer - */ - SOUND_LOCK_END; -} - -#ifdef MODULE - -int init_module(void) -{ - return init_via82cxxx_module(); -} - -void cleanup_module(void) -{ - cleanup_via82cxxx_module(); -} - -#endif diff -urN v2.2.15/linux/drivers/sound/via82cxxx_audio.c linux/drivers/sound/via82cxxx_audio.c --- v2.2.15/linux/drivers/sound/via82cxxx_audio.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/sound/via82cxxx_audio.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,729 @@ +/* + * Support for VIA 82Cxxx Audio Codecs + * Copyright 1999,2000 Jeff Garzik + * + * Distributed under the GNU GENERAL PUBLIC LICENSE (GPL) Version 2. + * See the "COPYING" file distributed with this software for more info. + * + * Documentation for this driver available as + * linux/Documentation/sound/via82cxxx.txt. + * + * Since the mixer is called from the OSS glue the kernel lock is always held + * on our AC97 mixing + */ + + +#define VIA_VERSION "1.1.2.1" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "sound_config.h" +#include "soundmodule.h" +#include "sb.h" +#include "ac97.h" + +#ifndef SOUND_LOCK +#define SOUND_LOCK do {} while (0) +#define SOUND_LOCK_END do {} while (0) +#endif + +#define VIA_DEBUG 0 /* define to 1 to enable debugging output and checks */ +#if VIA_DEBUG +/* note: prints function name for you */ +#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args) +#else +#define DPRINTK(fmt, args...) +#endif + +#define VIA_NDEBUG 0 /* define to 1 to disable lightweight runtime checks */ +#if VIA_NDEBUG +#define assert(expr) +#else +#define assert(expr) \ + if(!(expr)) { \ + printk( "Assertion failed! %s,%s,%s,line=%d\n", \ + #expr,__FILE__,__FUNCTION__,__LINE__); \ + } +#endif + +#define arraysize(x) (sizeof(x)/sizeof(*(x))) + +#define MAX_CARDS 2 + +#define LINE_SIZE 10 + +#define VIA_CARD_NAME "VIA 82Cxxx Audio driver " VIA_VERSION +#define VIA_MODULE_NAME "via_audio" +#define PFX VIA_MODULE_NAME ": " + +#define VIA_COUNTER_LIMIT 100000 + +/* 82C686 function 5 (audio codec) PCI configuration registers */ +#define VIA_FUNC_ENABLE 0x42 +#define VIA_PNP_CONTROL 0x43 +#define VIA_AC97_CTRL 0x80 + +/* PCI configuration register bits and masks */ +#define VIA_CR40_AC97_READY 0x01 +#define VIA_CR40_AC97_LOW_POWER 0x02 +#define VIA_CR40_SECONDARY_READY 0x04 + +#define VIA_CR41_ACLINK_ENABLE 0x80 + +#define VIA_CR42_SB_ENABLE 0x01 +#define VIA_CR42_MIDI_ENABLE 0x02 +#define VIA_CR42_FM_ENABLE 0x04 +#define VIA_CR42_GAME_ENABLE 0x08 + +#define VIA_CR44_SECOND_CODEC_SUPPORT (1 << 6) +#define VIA_CR44_AC_LINK_ACCESS (1 << 7) + +#define VIA_CR80_FIRST_CODEC 0 +#define VIA_CR80_SECOND_CODEC (1 << 30) +#define VIA_CR80_FIRST_CODEC_VALID (1 << 25) +#define VIA_CR80_SECOND_CODEC_VALID (1 << 27) +#define VIA_CR80_BUSY (1 << 24) +#define VIA_CR80_READ_MODE (1 << 23) +#define VIA_CR80_WRITE_MODE 0 +#define VIA_CR80_REG_IDX(idx) (((idx) & 0x7E) << 16) + +struct via_info { + struct address_info sb_data; + struct address_info opl3_data; + struct pci_dev *pdev; + struct ac97_hwint ac97; + int mixer_oss_dev; + int have_ac97; +}; +static struct via_info cards [MAX_CARDS]; +static unsigned num_cards = 0; + + +static const struct { + int revision; + const char *rev_name; +} via_chip_revs[] __initdata = { + { 0x10, "A" }, + { 0x11, "B" }, + { 0x12, "C" }, + { 0x13, "D" }, + { 0x14, "E" }, + { 0x20, "H" }, +}; + +static inline void via_ac97_write32 (struct pci_dev *pdev, int port, u32 data) +{ + + int iobase = pdev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; + + outw ((u16)data,iobase+port); + outw ((u16)(data>>16),iobase+port+2); +} + +static inline u32 via_ac97_read32 (struct pci_dev *pdev, int port) +{ + int iobase = pdev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; + + return + ((u32)inw (iobase+port)) | + (((u32)inw (iobase+port+2)) << 16); +} + +/**************************************************************** + * + * Intel Audio Codec '97 interface + * + * + */ + +static inline void via_ac97_wait_idle (struct pci_dev *pdev) +{ + u32 tmp; + int counter = VIA_COUNTER_LIMIT; + + DPRINTK ("ENTER\n"); + + assert (pdev != NULL); + + do { + tmp = via_ac97_read32 (pdev,VIA_AC97_CTRL); + } while ((tmp & VIA_CR80_BUSY) && (counter-- > 0)); + + DPRINTK ("EXIT%s\n", counter > 0 ? "" : ", counter limit reached"); +} + + +static int via_ac97_read_reg (struct ac97_hwint *dev, u8 reg) +{ + u32 data; + struct via_info *card; + struct pci_dev *pdev; + + DPRINTK ("ENTER\n"); + + assert (dev != NULL); + assert (dev->driver_private != NULL); + + card = (struct via_info *) dev->driver_private; + pdev = card->pdev; + assert (pdev != NULL); + + via_ac97_wait_idle (pdev); + data = VIA_CR80_FIRST_CODEC | VIA_CR80_FIRST_CODEC_VALID | + VIA_CR80_READ_MODE | VIA_CR80_REG_IDX(reg); + via_ac97_write32 (pdev,VIA_AC97_CTRL,data); + via_ac97_wait_idle (pdev); + data = via_ac97_read32 (pdev,VIA_AC97_CTRL); + +#if 0 + if (! (data & VIA_CR80_FIRST_CODEC_VALID)) { + DPRINTK ("EXIT, first codec not valid, returning -1\n"); + return -1; + } +#endif + + DPRINTK ("EXIT, returning %d\n", data & 0xFFFF); + return data & 0xFFFF; +} + + +static int via_ac97_write_reg (struct ac97_hwint *dev, u8 reg, u16 value) +{ + u32 data; + struct via_info *card; + struct pci_dev *pdev; + + DPRINTK ("ENTER\n"); + + assert (dev != NULL); + assert (dev->driver_private != NULL); + + card = (struct via_info *) dev->driver_private; + pdev = card->pdev; + assert (pdev != NULL); + + via_ac97_wait_idle (pdev); + data = VIA_CR80_FIRST_CODEC | VIA_CR80_FIRST_CODEC_VALID | + VIA_CR80_WRITE_MODE | VIA_CR80_REG_IDX(reg) | value; + via_ac97_write32 (pdev,VIA_AC97_CTRL,data); + +#if 0 + if (! (data & VIA_CR80_FIRST_CODEC_VALID)) { + DPRINTK ("EXIT, first codec invalid, returning -1\n"); + return -1; + } +#endif + + DPRINTK ("EXIT, returning 0\n"); + return 0; +} + + +static int via_ac97_reset (struct ac97_hwint *dev) +{ + struct via_info *card; + struct pci_dev *pdev; + + DPRINTK ("ENTER\n"); + + assert (dev != NULL); + assert (dev->driver_private != NULL); + + card = (struct via_info *) dev->driver_private; + pdev = card->pdev; + assert (pdev != NULL); + + pci_write_config_word (pdev, PCI_COMMAND, PCI_COMMAND_IO); + + DPRINTK ("EXIT, returning 0\n"); + return 0; +} + + +static struct via_info *via_ac97_find_card_for_mixer (int dev) +{ + int x; + + DPRINTK ("ENTER\n"); + + for (x = 0; x < num_cards; x++) + if (cards[x].mixer_oss_dev == dev) { + DPRINTK ("EXIT, returning %p\n", cards + x); + return cards + x; + } + + DPRINTK ("EXIT, returning 0\n"); + return NULL; +} + + +static int +via_ac97_default_mixer_ioctl (int dev, unsigned int cmd, caddr_t arg) +{ + int rc; + struct via_info *card = via_ac97_find_card_for_mixer (dev); + + DPRINTK ("ENTER\n"); + + if (card != NULL) { + rc = ac97_mixer_ioctl (&card->ac97, cmd, arg); + DPRINTK ("EXIT, returning %d\n", rc); + return rc; + } + + DPRINTK ("EXIT, returning -ENODEV\n"); + return -ENODEV; + +} + +static struct mixer_operations via_ac97_mixer_operations = +{ + "VIA82Cxxx", + "via82cxxxAC97Mixer", + via_ac97_default_mixer_ioctl +}; + +static int __init via_attach_ac97 (struct via_info *card) +{ + int mixer; + struct ac97_hwint *mdev; + + DPRINTK ("ENTER\n"); + + assert (card != NULL); + + mdev = &card->ac97; + + memset (mdev, 0, sizeof (*mdev)); + mdev->reset_device = via_ac97_reset; + mdev->read_reg = via_ac97_read_reg; + mdev->write_reg = via_ac97_write_reg; + mdev->driver_private = (void *) card; + + if (ac97_init (mdev)) { + printk (KERN_ERR PFX "Unable to init AC97\n"); + DPRINTK ("EXIT, returning -1\n"); + return -1; + } + mixer = sound_alloc_mixerdev (); + if (mixer < 0 || num_mixers >= MAX_MIXER_DEV) { + printk (KERN_ERR PFX "Unable to alloc mixerdev\n"); + DPRINTK ("EXIT, returning -1\n"); + return -1; + } + mixer_devs[mixer] = &via_ac97_mixer_operations; + card->mixer_oss_dev = mixer; + + /* Some reasonable default values. */ + ac97_set_mixer (mdev, SOUND_MIXER_VOLUME, (85 << 8) | 85); + ac97_set_mixer (mdev, SOUND_MIXER_SPEAKER, 100); + ac97_set_mixer (mdev, SOUND_MIXER_PCM, (65 << 8) | 65); + ac97_set_mixer (mdev, SOUND_MIXER_CD, (65 << 8) | 65); + + printk (KERN_INFO PFX "Initialized AC97 mixer\n"); + + card->have_ac97 = mixer; + + DPRINTK ("EXIT, returning 0\n"); + return 0; +} + + +static void via_unload_ac97 (struct via_info *card) +{ + DPRINTK ("ENTER\n"); + + assert (card != NULL); + + if (card->have_ac97 >= 0) + sound_unload_mixerdev (card->have_ac97); + + DPRINTK ("EXIT\n"); +} + +#if 0 +#ifdef CONFIG_PROC_FS + +/**************************************************************** + * + * /proc/driver/via82cxxx/info + * + * + */ +static int via_info_read_proc (char *page, char **start, off_t off, + int count, int *eof, void *data) +{ +#define YN(val,bit) (((val) & (bit)) ? "yes" : "no") + + int len = 0, i; + u8 r40, r41, r42, r44; + + DPRINTK ("ENTER\n"); + + len += sprintf (page+len, VIA_CARD_NAME "\n\n"); + + for (i = 0; i < num_cards; i++) { + pci_read_config_byte (cards[i].pdev, 0x40, &r40); + pci_read_config_byte (cards[i].pdev, 0x42, &r41); + pci_read_config_byte (cards[i].pdev, 0x42, &r42); + pci_read_config_byte (cards[i].pdev, 0x44, &r44); + + len += sprintf (page+len, + "40 AC97 Codec Ready: %s\n" + " AC97 Codec Low-power: %s\n" + " Secondary Codec Ready: %s\n" + + "41 AC-Link Interface Enable: %s\n" + + "42 Game port enabled: %s\n" + " SoundBlaster enabled: %s\n" + " FM enabled: %s\n" + " MIDI enabled: %s\n" + + "44 AC-Link Interface Access: %s\n" + " Secondary Codec Support: %s\n" + + "\n", + + YN (r40, VIA_CR40_AC97_READY), + YN (r40, VIA_CR40_AC97_LOW_POWER), + YN (r40, VIA_CR40_SECONDARY_READY), + + YN (r41, VIA_CR41_ACLINK_ENABLE), + + YN (r42, VIA_CR42_GAME_ENABLE), + YN (r42, VIA_CR42_SB_ENABLE), + YN (r42, VIA_CR42_FM_ENABLE), + YN (r42, VIA_CR42_MIDI_ENABLE), + + YN (r44, VIA_CR44_AC_LINK_ACCESS), + YN (r44, VIA_CR44_SECOND_CODEC_SUPPORT) + + ); + } + + DPRINTK("EXIT, returning %d\n", len); + return len; + +#undef YN +} + + +/**************************************************************** + * + * /proc/driver/via82cxxx + * + * + */ + +static int __init via_init_proc (void) +{ + DPRINTK ("ENTER\n"); + + + proc_mkdir ("driver/via_audio", 0); + create_proc_read_entry ("driver/via_audio/info", 0, 0, via_info_read_proc, NULL); + + DPRINTK("EXIT\n"); + return 0; +} + + + +static void __exit via_cleanup_proc (void) +{ + DPRINTK ("ENTER\n"); + remove_proc_entry ("driver/via_audio/info", NULL); + remove_proc_entry ("driver/via_audio", NULL); + DPRINTK("EXIT\n"); +} + + +#else +#endif /* CONFIG_PROC_FS */ + +#endif /* if 0 */ + +static inline int via_init_proc (void) { return 0; } +static inline void via_cleanup_proc (void) {} + + + +/**************************************************************** + * + * Legacy SoundBlaster Pro, FM support via OSS + * + * + */ + +static void via_attach_sb(struct address_info *hw_config) +{ + DPRINTK ("ENTER\n"); + + if(!sb_dsp_init(hw_config)) + hw_config->slots[0] = -1; + + DPRINTK("EXIT\n"); +} + + +static int via_probe_sb(struct address_info *hw_config) +{ + DPRINTK ("ENTER\n"); + + if (check_region(hw_config->io_base, 16)) + { + printk(KERN_DEBUG PFX "SBPro port 0x%x is already in use\n", + hw_config->io_base); + return 0; + } + DPRINTK("EXIT after sb_dsp_detect\n"); + return sb_dsp_detect(hw_config, 0, 0); +} + + +static void via_unload_sb(struct address_info *hw_config) +{ + DPRINTK ("ENTER\n"); + + if(hw_config->slots[0] != -1) + sb_dsp_unload(hw_config, 1); + + DPRINTK("EXIT\n"); +} + + +static const struct { + int sb_irq, + sb_dma, + midi_base, + sb_io_base; +} via_pnp_data[] __initdata = { + { 5, 0, 0x300, 0x220 }, + { 7, 1, 0x310, 0x240 }, + { 9, 2, 0x320, 0x260 }, + { 10,3, 0x330, 0x280 }, +}; + + +/**************************************************************** + * + * Chip setup and kernel registration + * + * + */ + +static int __init via82cxxx_install (struct pci_dev *pcidev) +{ + int sb_io_base; + int sb_irq; + int sb_dma; + int midi_base, rc; + u8 tmp8; + struct via_info *card = &cards[num_cards]; + + DPRINTK ("ENTER\n"); + + card->pdev = pcidev; + card->have_ac97 = -1; + + /* turn off legacy features, if not already */ + pci_read_config_byte (pcidev, VIA_FUNC_ENABLE, &tmp8); + tmp8 &= ~(VIA_CR42_SB_ENABLE | VIA_CR42_MIDI_ENABLE | + VIA_CR42_FM_ENABLE); + pci_write_config_byte (pcidev, VIA_FUNC_ENABLE, tmp8); + + /* + * try to init AC97 mixer device + */ + rc = via_attach_ac97 (card); + if (rc) { + printk (KERN_WARNING PFX + "AC97 init failed, SB legacy mode only\n"); + } + + /* turn on legacy features */ + pci_read_config_byte (pcidev, VIA_FUNC_ENABLE, &tmp8); + tmp8 |= VIA_CR42_SB_ENABLE | VIA_CR42_MIDI_ENABLE | + VIA_CR42_FM_ENABLE; + pci_write_config_byte (pcidev, VIA_FUNC_ENABLE, tmp8); + + /* read legacy PNP info byte */ + pci_read_config_byte (pcidev, VIA_PNP_CONTROL, &tmp8); + pci_write_config_byte (pcidev, VIA_PNP_CONTROL, tmp8); + + sb_irq = via_pnp_data[((tmp8 >> 6) & 0x03)].sb_irq; + sb_dma = via_pnp_data[((tmp8 >> 4) & 0x03)].sb_dma; + midi_base = via_pnp_data[((tmp8 >> 2) & 0x03)].midi_base; + sb_io_base = via_pnp_data[(tmp8 & 0x03)].sb_io_base; + + udelay(100); + + printk(KERN_INFO PFX "legacy " + "MIDI: 0x%X, SB: 0x%X / %d IRQ / %d DMA\n", + midi_base, sb_io_base, sb_irq, sb_dma); + + card->sb_data.name = VIA_CARD_NAME; + card->sb_data.card_subtype = MDL_SBPRO; + card->sb_data.io_base = sb_io_base; + card->sb_data.irq = sb_irq; + card->sb_data.dma = sb_dma; + + /* register legacy SoundBlaster Pro */ + if (!via_probe_sb (&card->sb_data)) { + printk (KERN_ERR PFX + "SB probe @ 0x%X failed, aborting\n", + sb_io_base); + DPRINTK ("EXIT, returning -1\n"); + return -1; + } + via_attach_sb (&card->sb_data); + + card->opl3_data.name = card->sb_data.name; + card->opl3_data.io_base = midi_base; + card->opl3_data.irq = -1; + + /* register legacy MIDI */ + if (!probe_uart401 (&card->opl3_data)) { + printk (KERN_WARNING PFX + "MIDI probe @ 0x%X failed, continuing\n", + midi_base); + card->opl3_data.io_base = 0; + } else { + attach_uart401 (&card->opl3_data); + } + + num_cards++; + DPRINTK ("EXIT, returning 0\n"); + return 0; +} + + +/* + * This loop walks the PCI configuration database and finds where + * the sound cards are. + * + * Note - only a single PCI scan occurs, eliminating possibility + * of multiple audio chips + * + */ + +static int __init probe_via82cxxx (void) +{ + struct pci_dev *pcidev = NULL; + + DPRINTK ("ENTER\n"); + + pcidev = pci_find_device (PCI_VENDOR_ID_VIA, + PCI_DEVICE_ID_VIA_82C686_5, NULL); + + if (!pcidev || via82cxxx_install (pcidev) != 0) { + printk (KERN_ERR PFX "audio init failed\n"); + DPRINTK ("EXIT, returning -1\n"); + return -1; + } + + DPRINTK ("EXIT, returning 0\n"); + return 0; +} + + +/* + * This function is called when the user or kernel loads the + * module into memory. + */ + + +static int init_via82cxxx_module(void) +{ + u8 tmp; + int i; + const char *rev = "unknown!"; + + memset (cards, 0, sizeof (cards)); + + DPRINTK ("ENTER\n"); + + if (!pci_present ()) { + printk (KERN_DEBUG PFX "PCI not present, exiting\n"); + DPRINTK ("EXIT, returning -ENODEV\n"); + return -ENODEV; + } + + if (probe_via82cxxx() != 0) { + printk(KERN_ERR PFX "probe failed, aborting\n"); + /* XXX unload cards registered so far, if any */ + DPRINTK ("EXIT, returning -ENODEV\n"); + return -ENODEV; + } + + pci_read_config_byte (cards[0].pdev, PCI_REVISION_ID, &tmp); + for (i = 0; i < arraysize(via_chip_revs); i++) + if (via_chip_revs[i].revision == tmp) { + rev = via_chip_revs[i].rev_name; + break; + } + printk (KERN_INFO PFX VIA_CARD_NAME " loaded\n"); + printk (KERN_INFO PFX "Chip rev %s. Features: SBPro compat%s%s\n", + rev, + cards[0].opl3_data.io_base == 0 ? "" : ", MPU-401 MIDI", + cards[0].have_ac97 == -1 ? "" : ", AC97 mixer"); + + if (via_init_proc () != 0) { + printk (KERN_WARNING PFX + "Unable to init experimental /proc, ignoring\n"); + } + + /* + * Binds us to the sound subsystem + */ + SOUND_LOCK; + DPRINTK ("EXIT, returning 0\n"); + return 0; +} + +int init_module(void) { + return init_via82cxxx_module(); +} + +/* + * This is called when it is removed. It will only be removed + * when its use count is 0. For sound the SOUND_LOCK/SOUND_UNLOCK + * macros hide the entire work for this. + */ + +static void cleanup_via82cxxx_module(void) +{ + DPRINTK("ENTER\n"); + + if (cards[0].opl3_data.io_base) + unload_uart401 (&cards[0].opl3_data); + + via_unload_sb (&cards[0].sb_data); + + via_unload_ac97 (&cards[0]); + + via_cleanup_proc (); + + /* + * Final clean up with the sound layer + */ + SOUND_LOCK_END; + + DPRINTK("EXIT\n"); +} + +void cleanup_module(void) { + cleanup_via82cxxx_module(); +} + diff -urN v2.2.15/linux/drivers/sound/vidc_audio.c linux/drivers/sound/vidc_audio.c --- v2.2.15/linux/drivers/sound/vidc_audio.c Wed May 3 17:16:46 2000 +++ linux/drivers/sound/vidc_audio.c Wed Jun 7 14:26:43 2000 @@ -79,9 +79,9 @@ newsize = 208; if (newsize > 4096) newsize = 4096; - for (new2size = 128; new2size < newsize; new2size <<= 1) - if (new2size - newsize > newsize - (new2size >> 1)) - new2size >>= 1; + for (new2size = 128; new2size < newsize; new2size <<= 1); + if (new2size - newsize > newsize - (new2size >> 1)) + new2size >>= 1; dma_bufsize = new2size; } return 250000 / vidc_audio_rate; diff -urN v2.2.15/linux/drivers/sound/ymf_sb.c linux/drivers/sound/ymf_sb.c --- v2.2.15/linux/drivers/sound/ymf_sb.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/sound/ymf_sb.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,893 @@ +/* + Legacy audio driver for YMF724, 740, 744, 754 series. + Copyright 2000 Daisuke Nagano + + Based on the VIA 82Cxxx driver by Jeff Garzik + + Distribued under the GNU PUBLIC LICENSE (GPL) Version 2. + See the "COPYING" file distributed with kernel source tree for more info. + + ------------------------------------------------------------------------- + + It only supports SBPro compatible function of YMF7xx series s.t. + * 22.05kHz, 8-bit and stereo sample + * OPL3-compatible FM synthesizer + * MPU-401 compatible "external" MIDI interface + + ------------------------------------------------------------------------- + + Revision history + + Tue May 14 19:00:00 2000 0.0.1 + * initial release + + Tue May 16 19:29:29 2000 0.0.2 + + * add a little delays for reset devices. + * fixed addressing bug. + + Sun May 21 15:14:37 2000 0.0.3 + + * Add 'master_vol' module parameter to change 'PCM out Vol' of AC'97. + * remove native UART401 support. External MIDI port should be supported + by sb_midi driver. + * add support for SPDIF OUT. Module parameter 'spdif_out' is now available. + + Wed May 31 00:13:57 2000 0.0.4 + + * remove entries in Hwmcode.h. Now YMF744 / YMF754 sets instructions + in 724hwmcode.h. + * fixed wrong legacy_io setting on YMF744/YMF754 . + + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "sound_config.h" +#include "soundmodule.h" +#include "sb.h" +#include "ac97.h" + +#include "724hwmcode.h" + +#undef YMF_DEBUG +#define SUPPORT_UART401_MIDI 1 + +/* ---------------------------------------------------------------------- */ + +#ifndef SOUND_LOCK +#define SOUND_LOCK do {} while (0) +#define SOUND_LOCK_END do {} while (0) +#endif + +#ifndef PCI_VENDOR_ID_YAMAHA +#define PCI_VENDOR_ID_YAMAHA 0x1073 +#endif +#ifndef PCI_DEVICE_ID_YMF724 +#define PCI_DEVICE_ID_YMF724 0x0004 +#endif +#ifndef PCI_DEVICE_ID_YMF740 +#define PCI_DEVICE_ID_YMF740 0x000A +#endif +#ifndef PCI_DEVICE_ID_YMF740C +#define PCI_DEVICE_ID_YMF740C 0x000C +#endif +#ifndef PCI_DEVICE_ID_YMF724F +#define PCI_DEVICE_ID_YMF724F 0x000D +#endif +#ifndef PCI_DEVICE_ID_YMF744 +#define PCI_DEVICE_ID_YMF744 0x0010 +#endif +#ifndef PCI_DEVICE_ID_YMF754 +#define PCI_DEVICE_ID_YMF754 0x0012 +#endif + +/* ---------------------------------------------------------------------- */ + +#define YMFSB_RESET_DELAY 5 + +#define YMFSB_REGSIZE 0x8000 + +#define YMFSB_AC97TIMEOUT 2000 + +#define YMFSB_WORKBITTIMEOUT 250000 + +#define YMFSB_DSPLENGTH 0x0080 +#define YMFSB_CTRLLENGTH 0x3000 + +#define YMFSB_PCIR_VENDORID 0x00 +#define YMFSB_PCIR_DEVICEID 0x02 +#define YMFSB_PCIR_CMD 0x04 +#define YMFSB_PCIR_REVISIONID 0x08 +#define YMFSB_PCIR_BASEADDR 0x10 +#define YMFSB_PCIR_IRQ 0x3c + +#define YMFSB_PCIR_LEGCTRL 0x40 +#define YMFSB_PCIR_ELEGCTRL 0x42 +#define YMFSB_PCIR_DSXGCTRL 0x48 +#define YMFSB_PCIR_OPLADR 0x60 +#define YMFSB_PCIR_SBADR 0x62 +#define YMFSB_PCIR_MPUADR 0x64 + +#define YMFSB_INTFLAG 0x0004 +#define YMFSB_ACTIVITY 0x0006 +#define YMFSB_GLOBALCTRL 0x0008 +#define YMFSB_ZVCTRL 0x000A +#define YMFSB_TIMERCTRL 0x0010 +#define YMFSB_TIMERCOUNT 0x0012 +#define YMFSB_SPDIFOUTCTRL 0x0018 +#define YMFSB_SPDIFOUTSTATUS 0x001C +#define YMFSB_EEPROMCTRL 0x0020 +#define YMFSB_SPDIFINCTRL 0x0034 +#define YMFSB_SPDIFINSTATUS 0x0038 +#define YMFSB_DSPPROGRAMDL 0x0048 +#define YMFSB_DLCNTRL 0x004C +#define YMFSB_GPIOININTFLAG 0x0050 +#define YMFSB_GPIOININTENABLE 0x0052 +#define YMFSB_GPIOINSTATUS 0x0054 +#define YMFSB_GPIOOUTCTRL 0x0056 +#define YMFSB_GPIOFUNCENABLE 0x0058 +#define YMFSB_GPIOTYPECONFIG 0x005A +#define YMFSB_AC97CMDDATA 0x0060 +#define YMFSB_AC97CMDADR 0x0062 +#define YMFSB_PRISTATUSDATA 0x0064 +#define YMFSB_PRISTATUSADR 0x0066 +#define YMFSB_SECSTATUSDATA 0x0068 +#define YMFSB_SECSTATUSADR 0x006A +#define YMFSB_SECCONFIG 0x0070 +#define YMFSB_LEGACYOUTVOL 0x0080 +#define YMFSB_LEGACYOUTVOLL 0x0080 +#define YMFSB_LEGACYOUTVOLR 0x0082 +#define YMFSB_NATIVEDACOUTVOL 0x0084 +#define YMFSB_NATIVEDACOUTVOLL 0x0084 +#define YMFSB_NATIVEDACOUTVOLR 0x0086 +#define YMFSB_SPDIFOUTVOL 0x0088 +#define YMFSB_SPDIFOUTVOLL 0x0088 +#define YMFSB_SPDIFOUTVOLR 0x008A +#define YMFSB_AC3OUTVOL 0x008C +#define YMFSB_AC3OUTVOLL 0x008C +#define YMFSB_AC3OUTVOLR 0x008E +#define YMFSB_PRIADCOUTVOL 0x0090 +#define YMFSB_PRIADCOUTVOLL 0x0090 +#define YMFSB_PRIADCOUTVOLR 0x0092 +#define YMFSB_LEGACYLOOPVOL 0x0094 +#define YMFSB_LEGACYLOOPVOLL 0x0094 +#define YMFSB_LEGACYLOOPVOLR 0x0096 +#define YMFSB_NATIVEDACLOOPVOL 0x0098 +#define YMFSB_NATIVEDACLOOPVOLL 0x0098 +#define YMFSB_NATIVEDACLOOPVOLR 0x009A +#define YMFSB_SPDIFLOOPVOL 0x009C +#define YMFSB_SPDIFLOOPVOLL 0x009E +#define YMFSB_SPDIFLOOPVOLR 0x009E +#define YMFSB_AC3LOOPVOL 0x00A0 +#define YMFSB_AC3LOOPVOLL 0x00A0 +#define YMFSB_AC3LOOPVOLR 0x00A2 +#define YMFSB_PRIADCLOOPVOL 0x00A4 +#define YMFSB_PRIADCLOOPVOLL 0x00A4 +#define YMFSB_PRIADCLOOPVOLR 0x00A6 +#define YMFSB_NATIVEADCINVOL 0x00A8 +#define YMFSB_NATIVEADCINVOLL 0x00A8 +#define YMFSB_NATIVEADCINVOLR 0x00AA +#define YMFSB_NATIVEDACINVOL 0x00AC +#define YMFSB_NATIVEDACINVOLL 0x00AC +#define YMFSB_NATIVEDACINVOLR 0x00AE +#define YMFSB_BUF441OUTVOL 0x00B0 +#define YMFSB_BUF441OUTVOLL 0x00B0 +#define YMFSB_BUF441OUTVOLR 0x00B2 +#define YMFSB_BUF441LOOPVOL 0x00B4 +#define YMFSB_BUF441LOOPVOLL 0x00B4 +#define YMFSB_BUF441LOOPVOLR 0x00B6 +#define YMFSB_SPDIFOUTVOL2 0x00B8 +#define YMFSB_SPDIFOUTVOL2L 0x00B8 +#define YMFSB_SPDIFOUTVOL2R 0x00BA +#define YMFSB_SPDIFLOOPVOL2 0x00BC +#define YMFSB_SPDIFLOOPVOL2L 0x00BC +#define YMFSB_SPDIFLOOPVOL2R 0x00BE +#define YMFSB_ADCSLOTSR 0x00C0 +#define YMFSB_RECSLOTSR 0x00C4 +#define YMFSB_ADCFORMAT 0x00C8 +#define YMFSB_RECFORMAT 0x00CC +#define YMFSB_P44SLOTSR 0x00D0 +#define YMFSB_STATUS 0x0100 +#define YMFSB_CTRLSELECT 0x0104 +#define YMFSB_MODE 0x0108 +#define YMFSB_SAMPLECOUNT 0x010C +#define YMFSB_NUMOFSAMPLES 0x0110 +#define YMFSB_CONFIG 0x0114 +#define YMFSB_PLAYCTRLSIZE 0x0140 +#define YMFSB_RECCTRLSIZE 0x0144 +#define YMFSB_EFFCTRLSIZE 0x0148 +#define YMFSB_WORKSIZE 0x014C +#define YMFSB_MAPOFREC 0x0150 +#define YMFSB_MAPOFEFFECT 0x0154 +#define YMFSB_PLAYCTRLBASE 0x0158 +#define YMFSB_RECCTRLBASE 0x015C +#define YMFSB_EFFCTRLBASE 0x0160 +#define YMFSB_WORKBASE 0x0164 +#define YMFSB_DSPINSTRAM 0x1000 +#define YMFSB_CTRLINSTRAM 0x4000 + + +/* ---------------------------------------------------------------------- */ + +#define MAX_CARDS 4 + +#define PFX "ymf_sb: " + +#define YMFSB_VERSION "0.0.4" +#define YMFSB_CARD_NAME "YMF7xx Legacy Audio driver " YMFSB_VERSION + +#ifdef SUPPORT_UART401_MIDI +#if 0 +# define ymf7xxsb_probe_midi probe_uart401 +# define ymf7xxsb_attach_midi attach_uart401 +# define ymf7xxsb_unload_midi unload_uart401 +#else +# define ymf7xxsb_probe_midi probe_sbmpu +# define ymf7xxsb_attach_midi attach_sbmpu +# define ymf7xxsb_unload_midi unload_sbmpu +#endif +#endif + +/* ---------------------------------------------------------------------- */ + +static struct address_info sb_data[MAX_CARDS]; +static struct address_info opl3_data[MAX_CARDS]; +#ifdef SUPPORT_UART401_MIDI +static struct address_info mpu_data[MAX_CARDS]; +#endif +static unsigned cards = 0; +static unsigned short *ymfbase[MAX_CARDS]; + +/* ---------------------------------------------------------------------- */ + +#ifdef MODULE +#ifdef SUPPORT_UART401_MIDI +static int mpu_io = 0; +#endif +static int synth_io = 0; +static int io = 0; +static int dma = 0; +static int master_vol = -1; +static int spdif_out = 0; +#ifdef SUPPORT_UART401_MIDI +MODULE_PARM(mpu_io, "i"); +#endif +MODULE_PARM(synth_io, "i"); +MODULE_PARM(io,"i"); +MODULE_PARM(dma,"i"); +MODULE_PARM(master_vol,"i"); +MODULE_PARM(spdif_out,"i"); +#else +#ifdef SUPPORT_UART401_MIDI +static int mpu_io = 0x330; +#endif +static int synth_io = 0x388; +static int io = 0x220; +static int dma = 1; +static int master_vol = 80; +static int spdif_out = 0; +#endif + +/* ---------------------------------------------------------------------- */ + +static int readRegWord( int adr ) { + + if (ymfbase[cards]==NULL) return 0; + + return readw(ymfbase[cards]+adr/2); +} + +static void writeRegWord( int adr, int val ) { + + if (ymfbase[cards]==NULL) return; + + writew((unsigned short)(val&0xffff), ymfbase[cards] + adr/2); + + return; +} + +static int readRegDWord( int adr ) { + + if (ymfbase[cards]==NULL) return 0; + + return (readl(ymfbase[cards]+adr/2)); +} + +static void writeRegDWord( int adr, int val ) { + + if (ymfbase[cards]==NULL) return; + + writel((unsigned int)(val&0xffffffff), ymfbase[cards]+adr/2); + + return; +} + +/* ---------------------------------------------------------------------- */ + +static int checkPrimaryBusy( void ) +{ + int timeout=0; + + while ( timeout++ < YMFSB_AC97TIMEOUT ) + { + if ( (readRegWord(YMFSB_PRISTATUSADR) & 0x8000) == 0x0000 ) + return 0; + } + return -1; +} + +static int writeAc97( int adr, unsigned short val ) +{ + + if ( adr > 0x7f || adr < 0x00 ) return -1; + + if ( checkPrimaryBusy() ) return -1; + +#ifdef YMF_DEBUG + printk(KERN_INFO PFX "AC97 0x%0x = 0x%0x\n",adr,val); +#endif + + writeRegWord( YMFSB_AC97CMDADR, 0x0000 | adr ); + writeRegWord( YMFSB_AC97CMDDATA, val ); + + return 0; +} + +static int checkCodec( struct pci_dev *pcidev ) +{ + u8 tmp8; + + pci_read_config_byte( pcidev, YMFSB_PCIR_DSXGCTRL, &tmp8 ); + if ( tmp8 & 0x03 ) { + pci_write_config_byte(pcidev, YMFSB_PCIR_DSXGCTRL, tmp8&0xfc); + mdelay(YMFSB_RESET_DELAY); + pci_write_config_byte(pcidev, YMFSB_PCIR_DSXGCTRL, tmp8|0x03); + mdelay(YMFSB_RESET_DELAY); + pci_write_config_byte(pcidev, YMFSB_PCIR_DSXGCTRL, tmp8&0xfc); + mdelay(YMFSB_RESET_DELAY); + } + + if ( checkPrimaryBusy() ) return -1; + + return 0; +} + +static int setupLegacyIO( struct pci_dev *pcidev ) +{ + int v; + int sbio=0, mpuio=0, oplio=0,dma=0; + + switch(sb_data[cards].io_base) { + case 0x220: + sbio = 0; + break; + case 0x240: + sbio = 1; + break; + case 0x260: + sbio = 2; + break; + case 0x280: + sbio = 3; + break; + default: + return -1; + break; + } +#ifdef YMF_DEBUG + printk(PFX "set SBPro I/O at 0x%x\n",sb_data[cards].io_base); +#endif + +#ifdef SUPPORT_UART401_MIDI + switch(mpu_data[cards].io_base) { + case 0x330: + mpuio = 0; + break; + case 0x300: + mpuio = 1; + break; + case 0x332: + mpuio = 2; + break; + case 0x334: + mpuio = 3; + break; + default: + mpuio = 0; + break; + } +# ifdef YMF_DEBUG + printk(PFX "set MPU401 I/O at 0x%x\n",mpu_data[cards].io_base); +# endif +#endif + + switch(opl3_data[cards].io_base) { + case 0x388: + oplio = 0; + break; + case 0x398: + oplio = 1; + break; + case 0x3a0: + oplio = 2; + break; + case 0x3a8: + oplio = 3; + break; + default: + return -1; + break; + } +#ifdef YMF_DEBUG + printk(PFX "set OPL3 I/O at 0x%x\n",opl3_data[cards].io_base); +#endif + + dma = sb_data[cards].dma; +#ifdef YMF_DEBUG + printk(PFX "set DMA address at 0x%x\n",sb_data[cards].dma); +#endif + + v = 0x0000 | ((dma<<6)&0x03) | 0x003f; + pci_write_config_word(pcidev, YMFSB_PCIR_LEGCTRL, v); +#ifdef YMF_DEBUG + printk(PFX "LEGCTRL: 0x%x\n",v); +#endif + switch( pcidev->device ) { + case PCI_DEVICE_ID_YMF724: + case PCI_DEVICE_ID_YMF740: + case PCI_DEVICE_ID_YMF724F: + case PCI_DEVICE_ID_YMF740C: + v = 0x8800 | ((mpuio<<4)&0x03) | ((sbio<<2)&0x03) | (oplio&0x03); + pci_write_config_word(pcidev, YMFSB_PCIR_ELEGCTRL, v); +#ifdef YMF_DEBUG + printk(PFX "ELEGCTRL: 0x%x\n",v); +#endif + break; + + case PCI_DEVICE_ID_YMF744: + case PCI_DEVICE_ID_YMF754: + v = 0x8800; + pci_write_config_word(pcidev, YMFSB_PCIR_ELEGCTRL, v); + pci_write_config_word(pcidev, YMFSB_PCIR_OPLADR, opl3_data[cards].io_base); + pci_write_config_word(pcidev, YMFSB_PCIR_SBADR, sb_data[cards].io_base); +#ifdef SUPPORT_UART401_MIDI + pci_write_config_word(pcidev, YMFSB_PCIR_MPUADR, mpu_data[cards].io_base); +#endif + break; + + default: + printk(KERN_ERR PFX "Invalid device ID: %d\n",pcidev->device); + return -1; + break; + } + + return 0; +} + +/* ---------------------------------------------------------------------- */ + +static void enableDSP( void ) +{ + writeRegDWord( YMFSB_CONFIG, 0x00000001 ); + return; +} + +static void disableDSP( void ) +{ + int val; + int i; + + val = readRegDWord( YMFSB_CONFIG ); + if ( val ) { + writeRegDWord( YMFSB_CONFIG, 0 ); + } + + i=0; + while( ++i < YMFSB_WORKBITTIMEOUT ) { + val = readRegDWord(YMFSB_STATUS); + if ( (val & 0x00000002) == 0x00000000 ) break; + } + + return; +} + +static int setupInstruction( struct pci_dev *pcidev ) +{ + int i; + int val; + + writeRegDWord( YMFSB_NATIVEDACOUTVOL, 0 ); /* mute dac */ + disableDSP(); + + writeRegDWord( YMFSB_MODE, 0x00010000 ); + + /* DS-XG Software Reset */ + writeRegDWord( YMFSB_MODE, 0x00000000 ); + writeRegDWord( YMFSB_MAPOFREC, 0x00000000 ); + writeRegDWord( YMFSB_MAPOFEFFECT, 0x00000000 ); + writeRegDWord( YMFSB_PLAYCTRLBASE, 0x00000000 ); + writeRegDWord( YMFSB_RECCTRLBASE, 0x00000000 ); + writeRegDWord( YMFSB_EFFCTRLBASE, 0x00000000 ); + + val = readRegWord( YMFSB_GLOBALCTRL ); + writeRegWord( YMFSB_GLOBALCTRL, (val&~0x0007) ); + + /* setup DSP instruction code */ + for ( i=0 ; i>2] ); + } + + switch( pcidev->device ) { + case PCI_DEVICE_ID_YMF724: + case PCI_DEVICE_ID_YMF740: + /* setup Control instruction code */ + for ( i=0 ; i>2] ); + } + break; + + case PCI_DEVICE_ID_YMF724F: + case PCI_DEVICE_ID_YMF740C: + case PCI_DEVICE_ID_YMF744: + case PCI_DEVICE_ID_YMF754: + /* setup Control instruction code */ + + for ( i=0 ; i>2] ); + } + break; + + default: + return -1; + } + + enableDSP(); + + return 0; +} + +/* ---------------------------------------------------------------------- */ + +static int __init ymf7xx_init(struct pci_dev *pcidev) +{ + unsigned short v; + + /* Read hardware information */ +#ifdef YMF_DEBUG + unsigned int dv; + pci_read_config_word(pcidev, YMFSB_PCIR_VENDORID, &v); + printk(KERN_INFO PFX "Vendor ID = 0x%x\n",v); + pci_read_config_word(pcidev, YMFSB_PCIR_DEVICEID, &v); + printk(KERN_INFO PFX "Device ID = 0x%x\n",v); + pci_read_config_word(pcidev, YMFSB_PCIR_REVISIONID, &v); + printk(KERN_INFO PFX "Revision ID = 0x%x\n",v&0xff); + pci_read_config_dword(pcidev, YMFSB_PCIR_BASEADDR, &dv); + printk(KERN_INFO PFX "Base address = 0x%x\n",dv); + pci_read_config_word(pcidev, YMFSB_PCIR_IRQ, &v); + printk(KERN_INFO PFX "IRQ line = 0x%x\n",v&0xff); +#endif + + /* enables memory space access / bus mastering */ + pci_read_config_word(pcidev, YMFSB_PCIR_CMD, &v); + pci_write_config_word(pcidev, YMFSB_PCIR_CMD, v|0x06); + + /* check codec */ +#ifdef YMF_DEBUG + printk(KERN_INFO PFX "check codec...\n"); +#endif + if (checkCodec(pcidev)) return -1; + + /* setup legacy I/O */ +#ifdef YMF_DEBUG + printk(KERN_INFO PFX "setup legacy I/O...\n"); +#endif + if (setupLegacyIO(pcidev)) return -1; + + /* setup instruction code */ +#ifdef YMF_DEBUG + printk(KERN_INFO PFX "setup instructions...\n"); +#endif + if (setupInstruction(pcidev)) return -1; + + /* AC'97 setup */ +#ifdef YMF_DEBUG + printk(KERN_INFO PFX "setup AC'97...\n"); +#endif + if ( writeAc97(AC97_RESET ,0x0000) ) /* Reset */ + return -1; + if ( writeAc97(AC97_MASTER_VOL_STEREO,0x0000) ) /* Master Volume */ + return -1; + + v = 31*(100-master_vol)/100; + v = (v<<8 | v)&0x7fff; + if ( writeAc97(AC97_PCMOUT_VOL ,v ) ) /* PCM out Volume */ + return -1; + +#ifdef YMF_DEBUG + printk(KERN_INFO PFX "setup Legacy Volume...\n"); +#endif + /* Legacy Audio Output Volume L & R ch */ + writeRegDWord( YMFSB_LEGACYOUTVOL, 0x3fff3fff ); + +#ifdef YMF_DEBUG + printk(KERN_INFO PFX "setup SPDIF output control...\n"); +#endif + /* SPDIF Output control */ + v = spdif_out != 0 ? 0x0001 : 0x0000; + writeRegWord( YMFSB_SPDIFOUTCTRL, v ); + /* no copyright protection, + sample-rate converted, + re-recorded software comercially available (the 1st generation), + original */ + writeRegWord( YMFSB_SPDIFOUTSTATUS, 0x9a04 ); + + return 0; +} + +/* ---------------------------------------------------------------------- */ + +static void __init ymf7xxsb_attach_sb(struct address_info *hw_config) +{ + if(!sb_dsp_init(hw_config)) + hw_config->slots[0] = -1; +} + +static int __init ymf7xxsb_probe_sb(struct address_info *hw_config) +{ + if (check_region(hw_config->io_base, 16)) + { + printk(KERN_DEBUG PFX "SBPro port 0x%x is already in use\n", + hw_config->io_base); + return 0; + } + return sb_dsp_detect(hw_config, SB_PCI_YAMAHA, 0); +} + + +static void ymf7xxsb_unload_sb(struct address_info *hw_config, int unload_mpu) +{ + if(hw_config->slots[0]!=-1) + sb_dsp_unload(hw_config, unload_mpu); +} + +/* ---------------------------------------------------------------------- */ + +static int __init ymf7xxsb_install (struct pci_dev *pcidev) +{ + struct { + unsigned short deviceid; + char *devicename; + } devicetable[] = + { + { PCI_DEVICE_ID_YMF724, "YMF724A-E" }, + { PCI_DEVICE_ID_YMF724F, "YMF724F" }, + { PCI_DEVICE_ID_YMF740, "YMF740A-B" }, + { PCI_DEVICE_ID_YMF740C, "YMF740C" }, + { PCI_DEVICE_ID_YMF744, "YMF744" }, + { PCI_DEVICE_ID_YMF754, "YMF754" }, + }; + + char *devicename = "unknown"; + int i; + unsigned long iobase; + + if ( pcidev->irq == 0 ) return -1; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,13) + iobase = pcidev->base_address[0]&PCI_BASE_ADDRESS_MEM_MASK; +#else + iobase = pcidev->resource[0].start&PCI_BASE_ADDRESS_MEM_MASK; +#endif + if ( iobase == 0x00000000 ) return -1; + + for ( i=0 ; idevice) + { + devicename = devicetable[i].devicename; + break; + } + } + + /* remap memory mapped I/O onto kernel virtual memory */ + if ( (ymfbase[cards] = ioremap_nocache(iobase, YMFSB_REGSIZE)) == 0 ) + { + printk(KERN_ERR PFX "ioremap (0x%lx) returns zero\n", iobase); + return -1; + } + printk(KERN_INFO PFX "found %s at 0x%lx\n", devicename, iobase); +#ifdef YMF_DEBUG + printk(KERN_INFO PFX "remappling to 0x%p\n", ymfbase[cards]); +#endif + + memset (&sb_data[cards], 0, sizeof (struct address_info)); + memset (&opl3_data[cards], 0, sizeof (struct address_info)); +#ifdef SUPPORT_UART401_MIDI + memset (&mpu_data[cards], 0, sizeof (struct address_info)); +#endif + + sb_data[cards].name = YMFSB_CARD_NAME; + opl3_data[cards].name = YMFSB_CARD_NAME; +#ifdef SUPPORT_UART401_MIDI + mpu_data[cards].name = YMFSB_CARD_NAME; +#endif + + sb_data[cards].card_subtype = MDL_YMPCI; + + if ( io == 0 ) io = 0x220; + sb_data[cards].io_base = io; + sb_data[cards].irq = pcidev->irq; + sb_data[cards].dma = dma; + + if ( synth_io == 0 ) synth_io = 0x388; + opl3_data[cards].io_base = synth_io; + opl3_data[cards].irq = -1; + +#ifdef SUPPORT_UART401_MIDI + if ( mpu_io == 0 ) mpu_io = 0x330; + mpu_data[cards].io_base = mpu_io; + mpu_data[cards].irq = -1; +#endif + + if ( ymf7xx_init(pcidev) ) { + printk (KERN_ERR PFX + "Cannot initialize %s, aborting\n", + devicename); + return -1; + } + + /* register legacy SoundBlaster Pro */ + if (!ymf7xxsb_probe_sb(&sb_data[cards])) { + printk (KERN_ERR PFX + "SB probe at 0x%X failed, aborting\n", + io); + return -1; + } + ymf7xxsb_attach_sb (&sb_data[cards]); + +#ifdef SUPPORT_UART401_MIDI + /* register legacy MIDI */ + if ( mpu_io > 0 && 0) + { + if (!ymf7xxsb_probe_midi (&mpu_data[cards])) { + printk (KERN_ERR PFX + "MIDI probe @ 0x%X failed, aborting\n", + mpu_io); + ymf7xxsb_unload_sb (&sb_data[cards], 0); + return -1; + } + ymf7xxsb_attach_midi (&mpu_data[cards]); + } +#endif + + /* register legacy OPL3 */ + + cards++; + return 0; +} + +static int __init probe_ymf7xxsb (void) +{ + struct pci_dev *pcidev = NULL; + int i; + + for (i=0 ; i 100 ) master_vol = 100; + + if (!pci_present ()) { + printk (KERN_DEBUG PFX "PCI not present, exiting\n"); + return -ENODEV; + } + + if (probe_ymf7xxsb() != 0) { + printk(KERN_ERR PFX "probe failed, aborting\n"); + /* XXX unload cards registered so far, if any */ + free_iomaps(); + return -ENODEV; + } + + if (cards == 0) { + printk(KERN_DEBUG PFX "No chips found, aborting\n"); + free_iomaps(); + return -ENODEV; + } + + printk (KERN_INFO PFX YMFSB_CARD_NAME " loaded\n"); + + /* + * Binds us to the sound subsystem + */ + SOUND_LOCK; + return 0; +} + +static void cleanup_ymf7xxsb_module(void) +{ + int i; + + for (i = 0; i < cards; i++) { +#ifdef SUPPORT_UART401_MIDI + ymf7xxsb_unload_sb (&sb_data[i], 0); + ymf7xxsb_unload_midi (&mpu_data[i]); +#else + ymf7xxsb_unload_sb (&sb_data[i], 1); +#endif + } + + free_iomaps(); + + /* + * Final clean up with the sound layer + */ + SOUND_LOCK_END; +} + +#ifdef MODULE + +MODULE_AUTHOR("Daisuke Nagano, breeze.nagano@nifty.ne.jp"); +MODULE_DESCRIPTION("YMF7xx Legacy Audio Driver"); + +int init_module(void) +{ + return init_ymf7xxsb_module(); +} + +void cleanup_module(void) +{ + cleanup_ymf7xxsb_module(); +} + +#endif diff -urN v2.2.15/linux/drivers/video/atyfb.c linux/drivers/video/atyfb.c --- v2.2.15/linux/drivers/video/atyfb.c Wed May 3 17:16:46 2000 +++ linux/drivers/video/atyfb.c Wed Jun 7 14:26:43 2000 @@ -1,4 +1,4 @@ -/* $Id: atyfb.c,v 1.106.2.7 1999/11/19 00:12:29 davem Exp $ +/* $Id: atyfb.c,v 1.106.2.8 2000/04/28 04:40:09 davem Exp $ * linux/drivers/video/atyfb.c -- Frame buffer device for ATI Mach64 * * Copyright (C) 1997-1998 Geert Uytterhoeven @@ -2875,8 +2875,13 @@ pci_read_config_dword(pdev, breg, &size); pci_write_config_dword(pdev, breg, pbase); - if (io) - size &= ~1; + if (io) { + size &= PCI_BASE_ADDRESS_IO_MASK; + base &= PCI_BASE_ADDRESS_IO_MASK; + } else { + size &= PCI_BASE_ADDRESS_MEM_MASK; + base &= PCI_BASE_ADDRESS_MEM_MASK; + } size = ~(size) + 1; /* diff -urN v2.2.15/linux/drivers/video/mdacon.c linux/drivers/video/mdacon.c --- v2.2.15/linux/drivers/video/mdacon.c Fri May 14 17:46:16 1999 +++ linux/drivers/video/mdacon.c Wed Jun 7 14:26:43 2000 @@ -5,6 +5,8 @@ * * including portions (c) 1995-1998 Patrick Caulfield. * + * slight improvements (c) 2000 Edward Betts + * * This file is based on the VGA console driver (vgacon.c): * * Created 28 Sep 1997 by Geert Uytterhoeven @@ -240,13 +242,18 @@ /* Ok, there is definitely a card registering at the correct * memory location, so now we do an I/O port test. */ - - if (! test_mda_b(0x66, 0x0f)) { /* cursor low register */ + + /* Edward: These two mess `tests' mess up my cursor on bootup */ + + /* cursor low register */ + /* if (! test_mda_b(0x66, 0x0f)) { return 0; - } - if (! test_mda_b(0x99, 0x0f)) { /* cursor low register */ + } */ + + /* cursor low register */ + /* if (! test_mda_b(0x99, 0x0f)) { return 0; - } + } */ /* See if the card is a Hercules, by checking whether the vsync * bit of the status register is changing. This test lasts for @@ -339,6 +346,9 @@ mda_initialize(); } + /* cursor looks ugly during boot-up, so turn it off */ + mda_set_cursor(mda_vram_len - 1); + printk("mdacon: %s with %ldK of memory detected.\n", mda_type_name, mda_vram_len/1024); @@ -494,13 +504,21 @@ static int mdacon_blank(struct vc_data *c, int blank) { - if (blank) { - outb_p(0x00, mda_mode_port); /* disable video */ + if (mda_type == TYPE_MDA) { + if (blank) + scr_memsetw((void *)mda_vram_base, + mda_convert_attr(c->vc_video_erase_char), + c->vc_screenbuf_size); + /* Tell console.c that it has to restore the screen itself */ + return 1; } else { - outb_p(MDA_MODE_VIDEO_EN | MDA_MODE_BLINK_EN, mda_mode_port); + if (blank) + outb_p(0x00, mda_mode_port); /* disable video */ + else + outb_p(MDA_MODE_VIDEO_EN | MDA_MODE_BLINK_EN, + mda_mode_port); + return 0; } - - return 0; } static int mdacon_font_op(struct vc_data *c, struct console_font_op *op) diff -urN v2.2.15/linux/drivers/video/vga16fb.c linux/drivers/video/vga16fb.c --- v2.2.15/linux/drivers/video/vga16fb.c Tue Jan 4 10:12:22 2000 +++ linux/drivers/video/vga16fb.c Wed Jun 7 14:26:43 2000 @@ -480,7 +480,7 @@ if (pos & 0x200) r7 |= 0x80; pos += vslen; - par->crtc[CRTC_V_SYNC_END] = (pos & 0x0F) | 0x10; /* disabled IRQ */ + par->crtc[CRTC_V_SYNC_END] = (pos & 0x0F) & ~0x10; /* disabled IRQ */ pos += upper - 1; /* blank_end + 1 <= ytotal + 2 */ par->crtc[CRTC_V_BLANK_END] = pos & 0xFF; /* 0x7F for original VGA, but some SVGA chips requires all 8 bits to set */ diff -urN v2.2.15/linux/fs/binfmt_elf.c linux/fs/binfmt_elf.c --- v2.2.15/linux/fs/binfmt_elf.c Wed May 3 17:16:46 2000 +++ linux/fs/binfmt_elf.c Wed Jun 7 14:26:43 2000 @@ -376,6 +376,9 @@ goto out; } + if ((unsigned long)addr + text_data < text_data) + goto out; + do_mmap(NULL, 0, text_data, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_PRIVATE, 0); retval = read_exec(interpreter_dentry, offset, addr, text_data, 0); diff -urN v2.2.15/linux/fs/buffer.c linux/fs/buffer.c --- v2.2.15/linux/fs/buffer.c Wed May 3 17:16:46 2000 +++ linux/fs/buffer.c Wed Jun 7 14:26:43 2000 @@ -679,21 +679,26 @@ bhnext = bh->b_next_free; if (bh->b_dev != dev || bh->b_size == size) continue; - if (buffer_dirty(bh)) - printk(KERN_ERR "set_blocksize: dev %s buffer_dirty %lu size %lu\n", kdevname(dev), bh->b_blocknr, bh->b_size); if (buffer_locked(bh)) { slept = 1; wait_on_buffer(bh); } + if (buffer_dirty(bh)) + printk(KERN_WARNING "set_blocksize: dev %s buffer_dirty %lu size %lu\n", kdevname(dev), bh->b_blocknr, bh->b_size); if (!bh->b_count) put_last_free(bh); else - printk(KERN_ERR + { + mark_buffer_clean(bh); + clear_bit(BH_Uptodate, &bh->b_state); + clear_bit(BH_Req, &bh->b_state); + printk(KERN_WARNING "set_blocksize: " - "b_count %d, dev %s, block %lu!\n", + "b_count %d, dev %s, block %lu, from %p\n", bh->b_count, bdevname(bh->b_dev), - bh->b_blocknr); + bh->b_blocknr, __builtin_return_address(0)); + } if (slept) goto again; } @@ -708,6 +713,7 @@ if (!grow_buffers(size)) { wakeup_bdflush(1); current->policy |= SCHED_YIELD; + current->state = TASK_RUNNING; schedule(); } } diff -urN v2.2.15/linux/fs/dcache.c linux/fs/dcache.c --- v2.2.15/linux/fs/dcache.c Tue Jan 4 10:12:23 2000 +++ linux/fs/dcache.c Wed Jun 7 14:26:43 2000 @@ -378,7 +378,8 @@ resume: while (next != &this_parent->d_subdirs) { struct list_head *tmp = next; - struct dentry *dentry = list_entry(tmp, struct dentry, d_child); next = tmp->next; + struct dentry *dentry = list_entry(tmp, struct dentry, d_child); + next = tmp->next; /* Have we found a mount point ? */ if (dentry->d_mounts != dentry) return 1; diff -urN v2.2.15/linux/fs/exec.c linux/fs/exec.c --- v2.2.15/linux/fs/exec.c Tue Oct 26 17:53:42 1999 +++ linux/fs/exec.c Wed Jun 7 14:26:43 2000 @@ -515,6 +515,8 @@ /* This is the point of no return */ release_old_signals(oldsig); + current->sas_ss_sp = current->sas_ss_size = 0; + if (current->euid == current->uid && current->egid == current->gid) current->dumpable = 1; name = bprm->filename; @@ -611,21 +613,18 @@ cap_clear(bprm->cap_effective); /* To support inheritance of root-permissions and suid-root - * executables under compatibility mode, we raise the - * effective and inherited bitmasks of the executable file - * (translation: we set the executable "capability dumb" and - * set the allowed set to maximum). We don't set any forced - * bits. + * executables under compatibility mode, we raise all three + * capability sets for the file. * * If only the real uid is 0, we only raise the inheritable - * bitmask of the executable file (translation: we set the - * allowed set to maximum and the application to "capability - * smart"). + * and permitted sets of the executable file. */ if (!issecure(SECURE_NOROOT)) { - if (bprm->e_uid == 0 || current->uid == 0) + if (bprm->e_uid == 0 || current->uid == 0) { cap_set_full(bprm->cap_inheritable); + cap_set_full(bprm->cap_permitted); + } if (bprm->e_uid == 0) cap_set_full(bprm->cap_effective); } @@ -636,10 +635,12 @@ * privilege does not go against other system constraints. * The new Permitted set is defined below -- see (***). */ { - kernel_cap_t working = - cap_combine(bprm->cap_permitted, - cap_intersect(bprm->cap_inheritable, - current->cap_inheritable)); + kernel_cap_t permitted, working; + + permitted = cap_intersect(bprm->cap_permitted, cap_bset); + working = cap_intersect(bprm->cap_inheritable, + current->cap_inheritable); + working = cap_combine(permitted, working); if (!cap_issubset(working, current->cap_permitted)) { cap_raised = 1; } @@ -672,26 +673,29 @@ * The formula used for evolving capabilities is: * * pI' = pI - * (***) pP' = fP | (fI & pI) + * (***) pP' = (fP & X) | (fI & pI) * pE' = pP' & fE [NB. fE is 0 or ~0] * * I=Inheritable, P=Permitted, E=Effective // p=process, f=file - * ' indicates post-exec(). + * ' indicates post-exec(), and X is the global 'cap_bset'. */ void compute_creds(struct linux_binprm *bprm) { - int new_permitted = cap_t(bprm->cap_permitted) | - (cap_t(bprm->cap_inheritable) & - cap_t(current->cap_inheritable)); + kernel_cap_t new_permitted, working; + + new_permitted = cap_intersect(bprm->cap_permitted, cap_bset); + working = cap_intersect(bprm->cap_inheritable, + current->cap_inheritable); + new_permitted = cap_combine(new_permitted, working); /* For init, we want to retain the capabilities set * in the init_task struct. Thus we skip the usual * capability rules */ if (current->pid != 1) { - cap_t(current->cap_permitted) = new_permitted; - cap_t(current->cap_effective) = new_permitted & - cap_t(bprm->cap_effective); + current->cap_permitted = new_permitted; + current->cap_effective = + cap_intersect(new_permitted, bprm->cap_effective); } /* AUD: Audit candidate if current->cap_effective is set */ @@ -761,6 +765,17 @@ } } #endif + /* + * kernel module loader fixup + * We don't try to load run modprobe in kernel space but at the + * same time kernel/kmod.c calls us with fs set to KERNEL_DS. This + * would cause us to explode messily on a split address space machine + * and its sort of lucky it ever worked before. Since the S/390 is + * such a split address space box we have to fix it.. + */ + + set_fs(USER_DS); + for (try=0; try<2; try++) { for (fmt = formats ; fmt ; fmt = fmt->next) { int (*fn)(struct linux_binprm *, struct pt_regs *) = fmt->load_binary; diff -urN v2.2.15/linux/fs/ext2/balloc.c linux/fs/ext2/balloc.c --- v2.2.15/linux/fs/ext2/balloc.c Tue Jan 4 10:12:23 2000 +++ linux/fs/ext2/balloc.c Wed Jun 7 14:26:43 2000 @@ -213,7 +213,7 @@ */ if (sb->u.ext2_sb.s_loaded_block_bitmaps > 0 && sb->u.ext2_sb.s_block_bitmap_number[0] == block_group && - sb->u.ext2_sb.s_block_bitmap[block_group]) { + sb->u.ext2_sb.s_block_bitmap[0]) { return 0; } /* diff -urN v2.2.15/linux/fs/fat/dir.c linux/fs/fat/dir.c --- v2.2.15/linux/fs/fat/dir.c Tue Jan 4 10:12:23 2000 +++ linux/fs/fat/dir.c Wed Jun 7 14:26:43 2000 @@ -76,25 +76,21 @@ op = ascii; while (*ip || ip[1]) { - cl = *ip++; - ch = *ip++; - - uni_page = nls->page_uni2charset[ch]; - if (uni_page && uni_page[cl]) { - *op++ = uni_page[cl]; - } else { - if (uni_xlate == 1) { - *op++ = ':'; - val = (cl << 8) + ch; - op[2] = fat_uni2esc[val & 0x3f]; - val >>= 6; - op[1] = fat_uni2esc[val & 0x3f]; - val >>= 6; - *op = fat_uni2esc[val & 0x3f]; - op += 3; - } else { - *op++ = '?'; - } + int len; + nls->uni2char(ip[1], ip[0], op, 20, &len); + if (uni_xlate == 1 && len == 1 && op[0] == '?'){ + *op++ = ':'; + val = (ip[0] << 8) + ip[1]; + op[2] = fat_uni2esc[val & 0x3f]; + val >>= 6; + op[1] = fat_uni2esc[val & 0x3f]; + val >>= 6; + op[0] = fat_uni2esc[val & 0x3f]; + op += 3; + } + else{ + ip += 2; + op += len; } /* We have some slack there, so it's OK */ if (op>ascii+256) { diff -urN v2.2.15/linux/fs/fat/inode.c linux/fs/fat/inode.c --- v2.2.15/linux/fs/fat/inode.c Tue Jan 4 10:12:23 2000 +++ linux/fs/fat/inode.c Wed Jun 7 14:26:43 2000 @@ -633,7 +633,7 @@ MSDOS_SB(sb)->nls_io = NULL; if (MSDOS_SB(sb)->options.isvfat && !opts.utf8) { - p = opts.iocharset ? opts.iocharset : "iso8859-1"; + p = opts.iocharset ? opts.iocharset : CONFIG_NLS_DEFAULT; MSDOS_SB(sb)->nls_io = load_nls(p); if (! MSDOS_SB(sb)->nls_io) { /* Fail only if explicit charset specified */ diff -urN v2.2.15/linux/fs/isofs/inode.c linux/fs/isofs/inode.c --- v2.2.15/linux/fs/isofs/inode.c Wed May 3 17:16:46 2000 +++ linux/fs/isofs/inode.c Wed Jun 7 14:26:43 2000 @@ -411,7 +411,7 @@ struct inode inode_fake; struct file_operations *fops; extern struct file_operations * get_blkfops(unsigned int); - int i; + int i, session = 0; vol_desc_start=0; fops = get_blkfops(MAJOR(dev)); @@ -424,6 +424,27 @@ mm_segment_t old_fs=get_fs(); inode_fake.i_rdev=dev; ms_info.addr_format=CDROM_LBA; + /* If a minor device was explicitly opened, set session to the + * minor number. For instance, if /dev/hdc1 is mounted, session + * 1 on the CD-ROM is selected. CD_PART_MAX gives access to + * a max of 64 sessions on IDE. SCSI drives must still use + * the session option to mount. + */ + if ((MINOR(dev) % CD_PART_MAX) && (MAJOR(dev) != SCSI_CDROM_MAJOR)) + session = MINOR(dev) % CD_PART_MAX; + if (session > 0 && session <= CD_PART_MAX) { + struct cdrom_tocentry entry; + entry.cdte_track=session; + entry.cdte_format=CDROM_LBA; + set_fs(KERNEL_DS); + i=get_blkfops(MAJOR(dev))->ioctl(&inode_fake, + NULL, CDROMREADTOCENTRY, (unsigned long) &entry); + set_fs(old_fs); + if(!i) printk(KERN_ERR"Session %d start %d type %d\n",session,entry.cdte_addr.lba,entry.cdte_ctrl&CDROM_DATA_TRACK); + if(i || (entry.cdte_ctrl & CDROM_DATA_TRACK) != 4) + printk(KERN_ERR"Invalid session number or type of track\n"); + else return entry.cdte_addr.lba; + } set_fs(KERNEL_DS); i=get_blkfops(MAJOR(dev))->ioctl(&inode_fake, NULL, @@ -736,7 +757,7 @@ #ifdef CONFIG_JOLIET if (joliet_level && opt.utf8 == 0) { - char * p = opt.iocharset ? opt.iocharset : "iso8859-1"; + char * p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT; s->u.isofs_sb.s_nls_iocharset = load_nls(p); if (! s->u.isofs_sb.s_nls_iocharset) { /* Fail only if explicit charset specified */ diff -urN v2.2.15/linux/fs/isofs/joliet.c linux/fs/isofs/joliet.c --- v2.2.15/linux/fs/isofs/joliet.c Wed Aug 26 09:54:41 1998 +++ linux/fs/isofs/joliet.c Wed Jun 7 14:26:43 2000 @@ -26,15 +26,10 @@ op = ascii; while ((*ip || ip[1]) && len) { - ch = *ip++; - cl = *ip++; - - uni_page = nls->page_uni2charset[ch]; - if (uni_page && uni_page[cl]) { - *op++ = uni_page[cl]; - } else { - *op++ = '?'; - } + int llen; + nls->uni2char(ip[0], ip[1], op, 20, &llen); + op += llen; + ip += 2; len--; } *op = 0; diff -urN v2.2.15/linux/fs/ncpfs/dir.c linux/fs/ncpfs/dir.c --- v2.2.15/linux/fs/ncpfs/dir.c Wed May 3 17:16:46 2000 +++ linux/fs/ncpfs/dir.c Wed Jun 7 14:26:43 2000 @@ -1018,9 +1018,9 @@ error = ncp_del_file_or_subdir2(NCP_SERVER(dir), dentry); #ifdef CONFIG_NCPFS_STRONG - /* 9C is Invalid path.. It should be 8F, 90 - read only, but - it is not :-( */ - if (error == 0x9C && NCP_SERVER(dir)->m.flags & NCP_MOUNT_STRONG) { /* R/O */ + /* 9C is Invalid path, used by traditional NW filesystem... + 8F, 90 is Some/All read-only and is used by NSS :-( */ + if ((error == 0x9C || error == 0x8F || error == 0x90) && NCP_SERVER(dir)->m.flags & NCP_MOUNT_STRONG) { /* R/O */ error = ncp_force_unlink(dir, dentry); } #endif @@ -1085,7 +1085,7 @@ old_dir, _old_name, new_dir, _new_name); #ifdef CONFIG_NCPFS_STRONG - if ((error == 0x90 || error == -EACCES) && NCP_SERVER(old_dir)->m.flags & NCP_MOUNT_STRONG) { /* RO */ + if ((error == 0x90 || error == 0x8B || error == -EACCES) && NCP_SERVER(old_dir)->m.flags & NCP_MOUNT_STRONG) { /* RO */ error = ncp_force_rename(old_dir, old_dentry, _old_name, new_dir, new_dentry, _new_name); } diff -urN v2.2.15/linux/fs/ncpfs/inode.c linux/fs/ncpfs/inode.c --- v2.2.15/linux/fs/ncpfs/inode.c Wed May 3 17:16:46 2000 +++ linux/fs/ncpfs/inode.c Wed Jun 7 14:26:43 2000 @@ -105,8 +105,7 @@ switch (nwi->attributes & (aHIDDEN|aSYSTEM)) { case aHIDDEN: if (server->m.flags & NCP_MOUNT_SYMLINKS) { - if ((inode->i_size >= NCP_MIN_SYMLINK_SIZE) - && (inode->i_size <= NCP_MAX_SYMLINK_SIZE)) { + if (inode->i_size <= NCP_MAX_SYMLINK_SIZE) { inode->i_mode = (inode->i_mode & ~S_IFMT) | S_IFLNK; break; } @@ -168,8 +167,7 @@ switch (nwi->attributes & (aHIDDEN|aSYSTEM)) { case aHIDDEN: if (server->m.flags & NCP_MOUNT_SYMLINKS) { - if ((inode->i_size >= NCP_MIN_SYMLINK_SIZE) - && (inode->i_size <= NCP_MAX_SYMLINK_SIZE)) { + if (inode->i_size <= NCP_MAX_SYMLINK_SIZE) { inode->i_mode = (inode->i_mode & ~S_IFMT) | S_IFLNK; break; } diff -urN v2.2.15/linux/fs/ncpfs/ncplib_kernel.h linux/fs/ncpfs/ncplib_kernel.h --- v2.2.15/linux/fs/ncpfs/ncplib_kernel.h Fri May 14 12:43:13 1999 +++ linux/fs/ncpfs/ncplib_kernel.h Wed Jun 7 14:26:43 2000 @@ -114,9 +114,9 @@ static inline void io2vol(struct ncp_server *server, char *name, int case_trans) { - unsigned char nc; + unsigned char nc[2]; unsigned char *np; - unsigned char *up; + int len; struct nls_unicode uc; struct nls_table *nls_in; struct nls_table *nls_out; @@ -127,11 +127,10 @@ while (*np) { - nc = 0; - uc = nls_in->charset2uni[toupperif(*np, case_trans)]; - up = nls_out->page_uni2charset[uc.uni2]; - if (up != NULL) nc = up[uc.uni1]; - if (nc != 0) *np = nc; + nc[0] = toupperif(*np, case_trans); + nc[1] = 0x00; + nls_in->char2uni(nc, &len, &uc.uni2, &uc.uni1); + nls_out->uni2char(0x00, uc.uni2, np, 1, &len); np++; } } @@ -139,9 +138,9 @@ static inline void vol2io(struct ncp_server *server, char *name, int case_trans) { - unsigned char nc; + unsigned char nc[2]; unsigned char *np; - unsigned char *up; + int len; struct nls_unicode uc; struct nls_table *nls_in; struct nls_table *nls_out; @@ -152,12 +151,11 @@ while (*np) { - nc = 0; - uc = nls_in->charset2uni[*np]; - up = nls_out->page_uni2charset[uc.uni2]; - if (up != NULL) nc = up[uc.uni1]; - if (nc == 0) nc = *np; - *np = tolowerif(nc, case_trans); + nc[0] = *np; + nc[1] = 0; + nls_in->char2uni(nc, &len, &uc.uni2, &uc.uni1); + nls_out->uni2char(0x00, uc.uni2, nc, 1, &len); + *np = tolowerif(nc[0], case_trans); np++; } } diff -urN v2.2.15/linux/fs/nfs/inode.c linux/fs/nfs/inode.c --- v2.2.15/linux/fs/nfs/inode.c Wed May 3 17:16:46 2000 +++ linux/fs/nfs/inode.c Wed Jun 7 14:26:43 2000 @@ -413,23 +413,25 @@ int unhashed; restart: - tmp = head; + tmp = head->next; unhashed = 0; - while ((tmp = tmp->next) != head) { + while (tmp != head) { struct dentry *dentry = list_entry(tmp, struct dentry, d_alias); + dget(dentry); if (!list_empty(&dentry->d_subdirs)) shrink_dcache_parent(dentry); dprintk("nfs_free_dentries: found %s/%s, d_count=%d, hashed=%d\n", dentry->d_parent->d_name.name, dentry->d_name.name, dentry->d_count, !list_empty(&dentry->d_hash)); - if (!dentry->d_count) { - dget(dentry); + if (dentry->d_count == 1) { d_drop(dentry); dput(dentry); goto restart; } if (list_empty(&dentry->d_hash)) unhashed++; + tmp = tmp->next; + dput(dentry); } return unhashed; } diff -urN v2.2.15/linux/fs/nls/Config.in linux/fs/nls/Config.in --- v2.2.15/linux/fs/nls/Config.in Wed Aug 25 17:29:49 1999 +++ linux/fs/nls/Config.in Wed Jun 7 14:26:43 2000 @@ -13,6 +13,7 @@ if [ "$CONFIG_NLS" = "y" ]; then mainmenu_option next_comment comment 'Native Language Support' + string 'Default NLS Option' CONFIG_NLS_DEFAULT "cp437" tristate 'Codepage 437 (United States, Canada)' CONFIG_NLS_CODEPAGE_437 tristate 'Codepage 737 (Greek)' CONFIG_NLS_CODEPAGE_737 tristate 'Codepage 775 (Baltic Rim)' CONFIG_NLS_CODEPAGE_775 @@ -29,6 +30,10 @@ tristate 'Codepage 866 (Cyrillic/Russian)' CONFIG_NLS_CODEPAGE_866 tristate 'Codepage 869 (Greek)' CONFIG_NLS_CODEPAGE_869 tristate 'Codepage 874 (Thai)' CONFIG_NLS_CODEPAGE_874 + tristate 'Codepage 932 (Shift-JIS)' CONFIG_NLS_CODEPAGE_932 + tristate 'Codepage 936 (GBK)' CONFIG_NLS_CODEPAGE_936 + tristate 'Codepage 949 (UnifiedHangul)' CONFIG_NLS_CODEPAGE_949 + tristate 'Codepage 950 (Big5)' CONFIG_NLS_CODEPAGE_950 tristate 'NLS ISO 8859-1 (Latin 1; Western European Languages)' CONFIG_NLS_ISO8859_1 tristate 'NLS ISO 8859-2 (Latin 2; Slavic/Central European Languages)' CONFIG_NLS_ISO8859_2 tristate 'NLS ISO 8859-3 (Latin 3; Esperanto, Galician, Maltese, Turkish)' CONFIG_NLS_ISO8859_3 diff -urN v2.2.15/linux/fs/nls/Makefile linux/fs/nls/Makefile --- v2.2.15/linux/fs/nls/Makefile Wed Aug 25 17:29:49 1999 +++ linux/fs/nls/Makefile Wed Jun 7 14:26:43 2000 @@ -134,6 +134,38 @@ endif endif +ifeq ($(CONFIG_NLS_CODEPAGE_932),y) +NLS += nls_cp932.o +else + ifeq ($(CONFIG_NLS_CODEPAGE_932),m) + M_OBJS += nls_cp932.o + endif +endif + +ifeq ($(CONFIG_NLS_CODEPAGE_936),y) +NLS += nls_cp936.o +else + ifeq ($(CONFIG_NLS_CODEPAGE_936),m) + M_OBJS += nls_cp936.o + endif +endif + +ifeq ($(CONFIG_NLS_CODEPAGE_949),y) +NLS += nls_cp949.o +else + ifeq ($(CONFIG_NLS_CODEPAGE_949),m) + M_OBJS += nls_cp949.o + endif +endif + +ifeq ($(CONFIG_NLS_CODEPAGE_950),y) +NLS += nls_cp950.o +else + ifeq ($(CONFIG_NLS_CODEPAGE_950),m) + M_OBJS += nls_cp950.o + endif +endif + ifeq ($(CONFIG_NLS_CODEPAGE_1250),y) NLS += nls_cp1250.o else diff -urN v2.2.15/linux/fs/nls/nls_base.c linux/fs/nls/nls_base.c --- v2.2.15/linux/fs/nls/nls_base.c Wed Aug 25 17:29:49 1999 +++ linux/fs/nls/nls_base.c Wed Jun 7 14:26:43 2000 @@ -15,6 +15,7 @@ #ifdef CONFIG_KMOD #include #endif +#include #include static struct nls_table *tables = (struct nls_table *) NULL; @@ -363,6 +364,29 @@ page00 }; +void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} void inc_use_count(void) { @@ -374,8 +398,8 @@ static struct nls_table default_table = { "default", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL @@ -386,7 +410,13 @@ /* Returns a simple default translation table */ struct nls_table *load_nls_default(void) { - return &default_table; + struct nls_table *default_nls; + + default_nls = load_nls(CONFIG_NLS_DEFAULT); + if (default_nls != NULL) + return default_nls; + else + return &default_table; } EXPORT_SYMBOL(register_nls); @@ -400,7 +430,7 @@ EXPORT_SYMBOL(utf8_wctomb); EXPORT_SYMBOL(utf8_wcstombs); -int init_nls(void) +int __init init_nls(void) { #ifdef CONFIG_NLS_ISO8859_1 init_nls_iso8859_1(); @@ -482,6 +512,18 @@ #endif #ifdef CONFIG_NLS_CODEPAGE_874 init_nls_cp874(); +#endif +#ifdef CONFIG_NLS_CODEPAGE_932 + init_nls_cp932(); +#endif +#ifdef CONFIG_NLS_CODEPAGE_936 + init_nls_cp936(); +#endif +#ifdef CONFIG_NLS_CODEPAGE_949 + init_nls_cp949(); +#endif +#ifdef CONFIG_NLS_CODEPAGE_950 + init_nls_cp950(); #endif #ifdef CONFIG_NLS_KOI8_R init_nls_koi8_r(); diff -urN v2.2.15/linux/fs/nls/nls_cp437.c linux/fs/nls/nls_cp437.c --- v2.2.15/linux/fs/nls/nls_cp437.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp437.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -392,6 +393,29 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} static void inc_use_count(void) { @@ -405,14 +429,14 @@ static struct nls_table table = { "cp437", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp437(void) +int __init init_nls_cp437(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp737.c linux/fs/nls/nls_cp737.c --- v2.2.15/linux/fs/nls/nls_cp737.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp737.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -320,6 +321,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { @@ -333,14 +358,14 @@ static struct nls_table table = { "cp737", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp737(void) +int __init init_nls_cp737(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp775.c linux/fs/nls/nls_cp775.c --- v2.2.15/linux/fs/nls/nls_cp775.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp775.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -320,6 +321,29 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} static void inc_use_count(void) { @@ -333,14 +357,14 @@ static struct nls_table table = { "cp775", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp775(void) +int __init init_nls_cp775(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp850.c linux/fs/nls/nls_cp850.c --- v2.2.15/linux/fs/nls/nls_cp850.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp850.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -284,6 +285,29 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} static void inc_use_count(void) { @@ -297,14 +321,14 @@ static struct nls_table table = { "cp850", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp850(void) +int __init init_nls_cp850(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp852.c linux/fs/nls/nls_cp852.c --- v2.2.15/linux/fs/nls/nls_cp852.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp852.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -284,6 +285,29 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} static void inc_use_count(void) { @@ -297,14 +321,14 @@ static struct nls_table table = { "cp852", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp852(void) +int __init init_nls_cp852(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp855.c linux/fs/nls/nls_cp855.c --- v2.2.15/linux/fs/nls/nls_cp855.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp855.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -284,6 +285,29 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} static void inc_use_count(void) { @@ -297,14 +321,14 @@ static struct nls_table table = { "cp855", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp855(void) +int __init init_nls_cp855(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp857.c linux/fs/nls/nls_cp857.c --- v2.2.15/linux/fs/nls/nls_cp857.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp857.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -248,6 +249,29 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} static void inc_use_count(void) { @@ -261,14 +285,14 @@ static struct nls_table table = { "cp857", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp857(void) +int __init init_nls_cp857(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp860.c linux/fs/nls/nls_cp860.c --- v2.2.15/linux/fs/nls/nls_cp860.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp860.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -356,6 +357,29 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} static void inc_use_count(void) { @@ -369,14 +393,14 @@ static struct nls_table table = { "cp860", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp860(void) +int __init init_nls_cp860(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp861.c linux/fs/nls/nls_cp861.c --- v2.2.15/linux/fs/nls/nls_cp861.c Sun Jan 4 10:55:09 1998 +++ linux/fs/nls/nls_cp861.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -392,6 +393,29 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} static void inc_use_count(void) { @@ -405,14 +429,14 @@ static struct nls_table table = { "cp861", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp861(void) +int __init init_nls_cp861(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp862.c linux/fs/nls/nls_cp862.c --- v2.2.15/linux/fs/nls/nls_cp862.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_cp862.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -428,6 +429,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -440,14 +465,14 @@ static struct nls_table table = { "cp862", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp862(void) +int __init init_nls_cp862(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp863.c linux/fs/nls/nls_cp863.c --- v2.2.15/linux/fs/nls/nls_cp863.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_cp863.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -392,6 +393,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -404,14 +429,14 @@ static struct nls_table table = { "cp863", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp863(void) +int __init init_nls_cp863(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp864.c linux/fs/nls/nls_cp864.c --- v2.2.15/linux/fs/nls/nls_cp864.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_cp864.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -383,6 +384,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -395,14 +420,14 @@ static struct nls_table table = { "cp864", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp864(void) +int __init init_nls_cp864(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp865.c linux/fs/nls/nls_cp865.c --- v2.2.15/linux/fs/nls/nls_cp865.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_cp865.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -392,6 +393,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -404,14 +429,14 @@ static struct nls_table table = { "cp865", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp865(void) +int __init init_nls_cp865(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp866.c linux/fs/nls/nls_cp866.c --- v2.2.15/linux/fs/nls/nls_cp866.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_cp866.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -320,6 +321,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -332,14 +357,14 @@ static struct nls_table table = { "cp866", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp866(void) +int __init init_nls_cp866(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp869.c linux/fs/nls/nls_cp869.c --- v2.2.15/linux/fs/nls/nls_cp869.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_cp869.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -284,6 +285,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -296,14 +321,14 @@ static struct nls_table table = { "cp869", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp869(void) +int __init init_nls_cp869(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp874.c linux/fs/nls/nls_cp874.c --- v2.2.15/linux/fs/nls/nls_cp874.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_cp874.c Wed Jun 7 14:26:43 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -248,6 +249,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -260,14 +285,14 @@ static struct nls_table table = { "cp874", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_cp874(void) +int __init init_nls_cp874(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_cp932.c linux/fs/nls/nls_cp932.c --- v2.2.15/linux/fs/nls/nls_cp932.c Wed Dec 31 16:00:00 1969 +++ linux/fs/nls/nls_cp932.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,9848 @@ +/* + * linux/fs/nls_cp932.c + * + * Charset cp932 translation tables. + * Generated automatically from the Microsoft + */ + +#include +#include +#include +#include +#include + +static struct nls_unicode c2u_81[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x30, 0x00}, {0x30, 0x01}, {0x30, 0x02}, {0xFF, 0x0C}, /* 0x40-0x43 */ + {0xFF, 0x0E}, {0x30, 0xFB}, {0xFF, 0x1A}, {0xFF, 0x1B}, /* 0x44-0x47 */ + {0xFF, 0x1F}, {0xFF, 0x01}, {0x30, 0x9B}, {0x30, 0x9C}, /* 0x48-0x4B */ + {0x00, 0xB4}, {0xFF, 0x40}, {0x00, 0xA8}, {0xFF, 0x3E}, /* 0x4C-0x4F */ + {0xFF, 0xE3}, {0xFF, 0x3F}, {0x30, 0xFD}, {0x30, 0xFE}, /* 0x50-0x53 */ + {0x30, 0x9D}, {0x30, 0x9E}, {0x30, 0x03}, {0x4E, 0xDD}, /* 0x54-0x57 */ + {0x30, 0x05}, {0x30, 0x06}, {0x30, 0x07}, {0x30, 0xFC}, /* 0x58-0x5B */ + {0x20, 0x15}, {0x20, 0x10}, {0xFF, 0x0F}, {0xFF, 0x3C}, /* 0x5C-0x5F */ + {0xFF, 0x5E}, {0x22, 0x25}, {0xFF, 0x5C}, {0x20, 0x26}, /* 0x60-0x63 */ + {0x20, 0x25}, {0x20, 0x18}, {0x20, 0x19}, {0x20, 0x1C}, /* 0x64-0x67 */ + {0x20, 0x1D}, {0xFF, 0x08}, {0xFF, 0x09}, {0x30, 0x14}, /* 0x68-0x6B */ + {0x30, 0x15}, {0xFF, 0x3B}, {0xFF, 0x3D}, {0xFF, 0x5B}, /* 0x6C-0x6F */ + {0xFF, 0x5D}, {0x30, 0x08}, {0x30, 0x09}, {0x30, 0x0A}, /* 0x70-0x73 */ + {0x30, 0x0B}, {0x30, 0x0C}, {0x30, 0x0D}, {0x30, 0x0E}, /* 0x74-0x77 */ + {0x30, 0x0F}, {0x30, 0x10}, {0x30, 0x11}, {0xFF, 0x0B}, /* 0x78-0x7B */ + {0xFF, 0x0D}, {0x00, 0xB1}, {0x00, 0xD7}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0xF7}, {0xFF, 0x1D}, {0x22, 0x60}, {0xFF, 0x1C}, /* 0x80-0x83 */ + {0xFF, 0x1E}, {0x22, 0x66}, {0x22, 0x67}, {0x22, 0x1E}, /* 0x84-0x87 */ + {0x22, 0x34}, {0x26, 0x42}, {0x26, 0x40}, {0x00, 0xB0}, /* 0x88-0x8B */ + {0x20, 0x32}, {0x20, 0x33}, {0x21, 0x03}, {0xFF, 0xE5}, /* 0x8C-0x8F */ + {0xFF, 0x04}, {0xFF, 0xE0}, {0xFF, 0xE1}, {0xFF, 0x05}, /* 0x90-0x93 */ + {0xFF, 0x03}, {0xFF, 0x06}, {0xFF, 0x0A}, {0xFF, 0x20}, /* 0x94-0x97 */ + {0x00, 0xA7}, {0x26, 0x06}, {0x26, 0x05}, {0x25, 0xCB}, /* 0x98-0x9B */ + {0x25, 0xCF}, {0x25, 0xCE}, {0x25, 0xC7}, {0x25, 0xC6}, /* 0x9C-0x9F */ + {0x25, 0xA1}, {0x25, 0xA0}, {0x25, 0xB3}, {0x25, 0xB2}, /* 0xA0-0xA3 */ + {0x25, 0xBD}, {0x25, 0xBC}, {0x20, 0x3B}, {0x30, 0x12}, /* 0xA4-0xA7 */ + {0x21, 0x92}, {0x21, 0x90}, {0x21, 0x91}, {0x21, 0x93}, /* 0xA8-0xAB */ + {0x30, 0x13}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x22, 0x08}, {0x22, 0x0B}, {0x22, 0x86}, {0x22, 0x87}, /* 0xB8-0xBB */ + {0x22, 0x82}, {0x22, 0x83}, {0x22, 0x2A}, {0x22, 0x29}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x22, 0x27}, {0x22, 0x28}, {0xFF, 0xE2}, {0x21, 0xD2}, /* 0xC8-0xCB */ + {0x21, 0xD4}, {0x22, 0x00}, {0x22, 0x03}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x22, 0x20}, {0x22, 0xA5}, /* 0xD8-0xDB */ + {0x23, 0x12}, {0x22, 0x02}, {0x22, 0x07}, {0x22, 0x61}, /* 0xDC-0xDF */ + {0x22, 0x52}, {0x22, 0x6A}, {0x22, 0x6B}, {0x22, 0x1A}, /* 0xE0-0xE3 */ + {0x22, 0x3D}, {0x22, 0x1D}, {0x22, 0x35}, {0x22, 0x2B}, /* 0xE4-0xE7 */ + {0x22, 0x2C}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x21, 0x2B}, {0x20, 0x30}, {0x26, 0x6F}, {0x26, 0x6D}, /* 0xF0-0xF3 */ + {0x26, 0x6A}, {0x20, 0x20}, {0x20, 0x21}, {0x00, 0xB6}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x25, 0xEF}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_82[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0xFF, 0x10}, /* 0x4C-0x4F */ + {0xFF, 0x11}, {0xFF, 0x12}, {0xFF, 0x13}, {0xFF, 0x14}, /* 0x50-0x53 */ + {0xFF, 0x15}, {0xFF, 0x16}, {0xFF, 0x17}, {0xFF, 0x18}, /* 0x54-0x57 */ + {0xFF, 0x19}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0xFF, 0x21}, {0xFF, 0x22}, {0xFF, 0x23}, {0xFF, 0x24}, /* 0x60-0x63 */ + {0xFF, 0x25}, {0xFF, 0x26}, {0xFF, 0x27}, {0xFF, 0x28}, /* 0x64-0x67 */ + {0xFF, 0x29}, {0xFF, 0x2A}, {0xFF, 0x2B}, {0xFF, 0x2C}, /* 0x68-0x6B */ + {0xFF, 0x2D}, {0xFF, 0x2E}, {0xFF, 0x2F}, {0xFF, 0x30}, /* 0x6C-0x6F */ + {0xFF, 0x31}, {0xFF, 0x32}, {0xFF, 0x33}, {0xFF, 0x34}, /* 0x70-0x73 */ + {0xFF, 0x35}, {0xFF, 0x36}, {0xFF, 0x37}, {0xFF, 0x38}, /* 0x74-0x77 */ + {0xFF, 0x39}, {0xFF, 0x3A}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xFF, 0x41}, {0xFF, 0x42}, {0xFF, 0x43}, /* 0x80-0x83 */ + {0xFF, 0x44}, {0xFF, 0x45}, {0xFF, 0x46}, {0xFF, 0x47}, /* 0x84-0x87 */ + {0xFF, 0x48}, {0xFF, 0x49}, {0xFF, 0x4A}, {0xFF, 0x4B}, /* 0x88-0x8B */ + {0xFF, 0x4C}, {0xFF, 0x4D}, {0xFF, 0x4E}, {0xFF, 0x4F}, /* 0x8C-0x8F */ + {0xFF, 0x50}, {0xFF, 0x51}, {0xFF, 0x52}, {0xFF, 0x53}, /* 0x90-0x93 */ + {0xFF, 0x54}, {0xFF, 0x55}, {0xFF, 0x56}, {0xFF, 0x57}, /* 0x94-0x97 */ + {0xFF, 0x58}, {0xFF, 0x59}, {0xFF, 0x5A}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x30, 0x41}, /* 0x9C-0x9F */ + {0x30, 0x42}, {0x30, 0x43}, {0x30, 0x44}, {0x30, 0x45}, /* 0xA0-0xA3 */ + {0x30, 0x46}, {0x30, 0x47}, {0x30, 0x48}, {0x30, 0x49}, /* 0xA4-0xA7 */ + {0x30, 0x4A}, {0x30, 0x4B}, {0x30, 0x4C}, {0x30, 0x4D}, /* 0xA8-0xAB */ + {0x30, 0x4E}, {0x30, 0x4F}, {0x30, 0x50}, {0x30, 0x51}, /* 0xAC-0xAF */ + {0x30, 0x52}, {0x30, 0x53}, {0x30, 0x54}, {0x30, 0x55}, /* 0xB0-0xB3 */ + {0x30, 0x56}, {0x30, 0x57}, {0x30, 0x58}, {0x30, 0x59}, /* 0xB4-0xB7 */ + {0x30, 0x5A}, {0x30, 0x5B}, {0x30, 0x5C}, {0x30, 0x5D}, /* 0xB8-0xBB */ + {0x30, 0x5E}, {0x30, 0x5F}, {0x30, 0x60}, {0x30, 0x61}, /* 0xBC-0xBF */ + {0x30, 0x62}, {0x30, 0x63}, {0x30, 0x64}, {0x30, 0x65}, /* 0xC0-0xC3 */ + {0x30, 0x66}, {0x30, 0x67}, {0x30, 0x68}, {0x30, 0x69}, /* 0xC4-0xC7 */ + {0x30, 0x6A}, {0x30, 0x6B}, {0x30, 0x6C}, {0x30, 0x6D}, /* 0xC8-0xCB */ + {0x30, 0x6E}, {0x30, 0x6F}, {0x30, 0x70}, {0x30, 0x71}, /* 0xCC-0xCF */ + {0x30, 0x72}, {0x30, 0x73}, {0x30, 0x74}, {0x30, 0x75}, /* 0xD0-0xD3 */ + {0x30, 0x76}, {0x30, 0x77}, {0x30, 0x78}, {0x30, 0x79}, /* 0xD4-0xD7 */ + {0x30, 0x7A}, {0x30, 0x7B}, {0x30, 0x7C}, {0x30, 0x7D}, /* 0xD8-0xDB */ + {0x30, 0x7E}, {0x30, 0x7F}, {0x30, 0x80}, {0x30, 0x81}, /* 0xDC-0xDF */ + {0x30, 0x82}, {0x30, 0x83}, {0x30, 0x84}, {0x30, 0x85}, /* 0xE0-0xE3 */ + {0x30, 0x86}, {0x30, 0x87}, {0x30, 0x88}, {0x30, 0x89}, /* 0xE4-0xE7 */ + {0x30, 0x8A}, {0x30, 0x8B}, {0x30, 0x8C}, {0x30, 0x8D}, /* 0xE8-0xEB */ + {0x30, 0x8E}, {0x30, 0x8F}, {0x30, 0x90}, {0x30, 0x91}, /* 0xEC-0xEF */ + {0x30, 0x92}, {0x30, 0x93}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_83[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x30, 0xA1}, {0x30, 0xA2}, {0x30, 0xA3}, {0x30, 0xA4}, /* 0x40-0x43 */ + {0x30, 0xA5}, {0x30, 0xA6}, {0x30, 0xA7}, {0x30, 0xA8}, /* 0x44-0x47 */ + {0x30, 0xA9}, {0x30, 0xAA}, {0x30, 0xAB}, {0x30, 0xAC}, /* 0x48-0x4B */ + {0x30, 0xAD}, {0x30, 0xAE}, {0x30, 0xAF}, {0x30, 0xB0}, /* 0x4C-0x4F */ + {0x30, 0xB1}, {0x30, 0xB2}, {0x30, 0xB3}, {0x30, 0xB4}, /* 0x50-0x53 */ + {0x30, 0xB5}, {0x30, 0xB6}, {0x30, 0xB7}, {0x30, 0xB8}, /* 0x54-0x57 */ + {0x30, 0xB9}, {0x30, 0xBA}, {0x30, 0xBB}, {0x30, 0xBC}, /* 0x58-0x5B */ + {0x30, 0xBD}, {0x30, 0xBE}, {0x30, 0xBF}, {0x30, 0xC0}, /* 0x5C-0x5F */ + {0x30, 0xC1}, {0x30, 0xC2}, {0x30, 0xC3}, {0x30, 0xC4}, /* 0x60-0x63 */ + {0x30, 0xC5}, {0x30, 0xC6}, {0x30, 0xC7}, {0x30, 0xC8}, /* 0x64-0x67 */ + {0x30, 0xC9}, {0x30, 0xCA}, {0x30, 0xCB}, {0x30, 0xCC}, /* 0x68-0x6B */ + {0x30, 0xCD}, {0x30, 0xCE}, {0x30, 0xCF}, {0x30, 0xD0}, /* 0x6C-0x6F */ + {0x30, 0xD1}, {0x30, 0xD2}, {0x30, 0xD3}, {0x30, 0xD4}, /* 0x70-0x73 */ + {0x30, 0xD5}, {0x30, 0xD6}, {0x30, 0xD7}, {0x30, 0xD8}, /* 0x74-0x77 */ + {0x30, 0xD9}, {0x30, 0xDA}, {0x30, 0xDB}, {0x30, 0xDC}, /* 0x78-0x7B */ + {0x30, 0xDD}, {0x30, 0xDE}, {0x30, 0xDF}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x30, 0xE0}, {0x30, 0xE1}, {0x30, 0xE2}, {0x30, 0xE3}, /* 0x80-0x83 */ + {0x30, 0xE4}, {0x30, 0xE5}, {0x30, 0xE6}, {0x30, 0xE7}, /* 0x84-0x87 */ + {0x30, 0xE8}, {0x30, 0xE9}, {0x30, 0xEA}, {0x30, 0xEB}, /* 0x88-0x8B */ + {0x30, 0xEC}, {0x30, 0xED}, {0x30, 0xEE}, {0x30, 0xEF}, /* 0x8C-0x8F */ + {0x30, 0xF0}, {0x30, 0xF1}, {0x30, 0xF2}, {0x30, 0xF3}, /* 0x90-0x93 */ + {0x30, 0xF4}, {0x30, 0xF5}, {0x30, 0xF6}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x03, 0x91}, /* 0x9C-0x9F */ + {0x03, 0x92}, {0x03, 0x93}, {0x03, 0x94}, {0x03, 0x95}, /* 0xA0-0xA3 */ + {0x03, 0x96}, {0x03, 0x97}, {0x03, 0x98}, {0x03, 0x99}, /* 0xA4-0xA7 */ + {0x03, 0x9A}, {0x03, 0x9B}, {0x03, 0x9C}, {0x03, 0x9D}, /* 0xA8-0xAB */ + {0x03, 0x9E}, {0x03, 0x9F}, {0x03, 0xA0}, {0x03, 0xA1}, /* 0xAC-0xAF */ + {0x03, 0xA3}, {0x03, 0xA4}, {0x03, 0xA5}, {0x03, 0xA6}, /* 0xB0-0xB3 */ + {0x03, 0xA7}, {0x03, 0xA8}, {0x03, 0xA9}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x03, 0xB1}, /* 0xBC-0xBF */ + {0x03, 0xB2}, {0x03, 0xB3}, {0x03, 0xB4}, {0x03, 0xB5}, /* 0xC0-0xC3 */ + {0x03, 0xB6}, {0x03, 0xB7}, {0x03, 0xB8}, {0x03, 0xB9}, /* 0xC4-0xC7 */ + {0x03, 0xBA}, {0x03, 0xBB}, {0x03, 0xBC}, {0x03, 0xBD}, /* 0xC8-0xCB */ + {0x03, 0xBE}, {0x03, 0xBF}, {0x03, 0xC0}, {0x03, 0xC1}, /* 0xCC-0xCF */ + {0x03, 0xC3}, {0x03, 0xC4}, {0x03, 0xC5}, {0x03, 0xC6}, /* 0xD0-0xD3 */ + {0x03, 0xC7}, {0x03, 0xC8}, {0x03, 0xC9}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_84[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x04, 0x10}, {0x04, 0x11}, {0x04, 0x12}, {0x04, 0x13}, /* 0x40-0x43 */ + {0x04, 0x14}, {0x04, 0x15}, {0x04, 0x01}, {0x04, 0x16}, /* 0x44-0x47 */ + {0x04, 0x17}, {0x04, 0x18}, {0x04, 0x19}, {0x04, 0x1A}, /* 0x48-0x4B */ + {0x04, 0x1B}, {0x04, 0x1C}, {0x04, 0x1D}, {0x04, 0x1E}, /* 0x4C-0x4F */ + {0x04, 0x1F}, {0x04, 0x20}, {0x04, 0x21}, {0x04, 0x22}, /* 0x50-0x53 */ + {0x04, 0x23}, {0x04, 0x24}, {0x04, 0x25}, {0x04, 0x26}, /* 0x54-0x57 */ + {0x04, 0x27}, {0x04, 0x28}, {0x04, 0x29}, {0x04, 0x2A}, /* 0x58-0x5B */ + {0x04, 0x2B}, {0x04, 0x2C}, {0x04, 0x2D}, {0x04, 0x2E}, /* 0x5C-0x5F */ + {0x04, 0x2F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x04, 0x30}, {0x04, 0x31}, {0x04, 0x32}, {0x04, 0x33}, /* 0x70-0x73 */ + {0x04, 0x34}, {0x04, 0x35}, {0x04, 0x51}, {0x04, 0x36}, /* 0x74-0x77 */ + {0x04, 0x37}, {0x04, 0x38}, {0x04, 0x39}, {0x04, 0x3A}, /* 0x78-0x7B */ + {0x04, 0x3B}, {0x04, 0x3C}, {0x04, 0x3D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x04, 0x3E}, {0x04, 0x3F}, {0x04, 0x40}, {0x04, 0x41}, /* 0x80-0x83 */ + {0x04, 0x42}, {0x04, 0x43}, {0x04, 0x44}, {0x04, 0x45}, /* 0x84-0x87 */ + {0x04, 0x46}, {0x04, 0x47}, {0x04, 0x48}, {0x04, 0x49}, /* 0x88-0x8B */ + {0x04, 0x4A}, {0x04, 0x4B}, {0x04, 0x4C}, {0x04, 0x4D}, /* 0x8C-0x8F */ + {0x04, 0x4E}, {0x04, 0x4F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x25, 0x00}, /* 0x9C-0x9F */ + {0x25, 0x02}, {0x25, 0x0C}, {0x25, 0x10}, {0x25, 0x18}, /* 0xA0-0xA3 */ + {0x25, 0x14}, {0x25, 0x1C}, {0x25, 0x2C}, {0x25, 0x24}, /* 0xA4-0xA7 */ + {0x25, 0x34}, {0x25, 0x3C}, {0x25, 0x01}, {0x25, 0x03}, /* 0xA8-0xAB */ + {0x25, 0x0F}, {0x25, 0x13}, {0x25, 0x1B}, {0x25, 0x17}, /* 0xAC-0xAF */ + {0x25, 0x23}, {0x25, 0x33}, {0x25, 0x2B}, {0x25, 0x3B}, /* 0xB0-0xB3 */ + {0x25, 0x4B}, {0x25, 0x20}, {0x25, 0x2F}, {0x25, 0x28}, /* 0xB4-0xB7 */ + {0x25, 0x37}, {0x25, 0x3F}, {0x25, 0x1D}, {0x25, 0x30}, /* 0xB8-0xBB */ + {0x25, 0x25}, {0x25, 0x38}, {0x25, 0x42}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_87[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x24, 0x60}, {0x24, 0x61}, {0x24, 0x62}, {0x24, 0x63}, /* 0x40-0x43 */ + {0x24, 0x64}, {0x24, 0x65}, {0x24, 0x66}, {0x24, 0x67}, /* 0x44-0x47 */ + {0x24, 0x68}, {0x24, 0x69}, {0x24, 0x6A}, {0x24, 0x6B}, /* 0x48-0x4B */ + {0x24, 0x6C}, {0x24, 0x6D}, {0x24, 0x6E}, {0x24, 0x6F}, /* 0x4C-0x4F */ + {0x24, 0x70}, {0x24, 0x71}, {0x24, 0x72}, {0x24, 0x73}, /* 0x50-0x53 */ + {0x21, 0x60}, {0x21, 0x61}, {0x21, 0x62}, {0x21, 0x63}, /* 0x54-0x57 */ + {0x21, 0x64}, {0x21, 0x65}, {0x21, 0x66}, {0x21, 0x67}, /* 0x58-0x5B */ + {0x21, 0x68}, {0x21, 0x69}, {0x00, 0x3F}, {0x33, 0x49}, /* 0x5C-0x5F */ + {0x33, 0x14}, {0x33, 0x22}, {0x33, 0x4D}, {0x33, 0x18}, /* 0x60-0x63 */ + {0x33, 0x27}, {0x33, 0x03}, {0x33, 0x36}, {0x33, 0x51}, /* 0x64-0x67 */ + {0x33, 0x57}, {0x33, 0x0D}, {0x33, 0x26}, {0x33, 0x23}, /* 0x68-0x6B */ + {0x33, 0x2B}, {0x33, 0x4A}, {0x33, 0x3B}, {0x33, 0x9C}, /* 0x6C-0x6F */ + {0x33, 0x9D}, {0x33, 0x9E}, {0x33, 0x8E}, {0x33, 0x8F}, /* 0x70-0x73 */ + {0x33, 0xC4}, {0x33, 0xA1}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x33, 0x7B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x30, 0x1D}, {0x30, 0x1F}, {0x21, 0x16}, {0x33, 0xCD}, /* 0x80-0x83 */ + {0x21, 0x21}, {0x32, 0xA4}, {0x32, 0xA5}, {0x32, 0xA6}, /* 0x84-0x87 */ + {0x32, 0xA7}, {0x32, 0xA8}, {0x32, 0x31}, {0x32, 0x32}, /* 0x88-0x8B */ + {0x32, 0x39}, {0x33, 0x7E}, {0x33, 0x7D}, {0x33, 0x7C}, /* 0x8C-0x8F */ + {0x22, 0x52}, {0x22, 0x61}, {0x22, 0x2B}, {0x22, 0x2E}, /* 0x90-0x93 */ + {0x22, 0x11}, {0x22, 0x1A}, {0x22, 0xA5}, {0x22, 0x20}, /* 0x94-0x97 */ + {0x22, 0x1F}, {0x22, 0xBF}, {0x22, 0x35}, {0x22, 0x29}, /* 0x98-0x9B */ + {0x22, 0x2A}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_88[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x4E, 0x9C}, /* 0x9C-0x9F */ + {0x55, 0x16}, {0x5A, 0x03}, {0x96, 0x3F}, {0x54, 0xC0}, /* 0xA0-0xA3 */ + {0x61, 0x1B}, {0x63, 0x28}, {0x59, 0xF6}, {0x90, 0x22}, /* 0xA4-0xA7 */ + {0x84, 0x75}, {0x83, 0x1C}, {0x7A, 0x50}, {0x60, 0xAA}, /* 0xA8-0xAB */ + {0x63, 0xE1}, {0x6E, 0x25}, {0x65, 0xED}, {0x84, 0x66}, /* 0xAC-0xAF */ + {0x82, 0xA6}, {0x9B, 0xF5}, {0x68, 0x93}, {0x57, 0x27}, /* 0xB0-0xB3 */ + {0x65, 0xA1}, {0x62, 0x71}, {0x5B, 0x9B}, {0x59, 0xD0}, /* 0xB4-0xB7 */ + {0x86, 0x7B}, {0x98, 0xF4}, {0x7D, 0x62}, {0x7D, 0xBE}, /* 0xB8-0xBB */ + {0x9B, 0x8E}, {0x62, 0x16}, {0x7C, 0x9F}, {0x88, 0xB7}, /* 0xBC-0xBF */ + {0x5B, 0x89}, {0x5E, 0xB5}, {0x63, 0x09}, {0x66, 0x97}, /* 0xC0-0xC3 */ + {0x68, 0x48}, {0x95, 0xC7}, {0x97, 0x8D}, {0x67, 0x4F}, /* 0xC4-0xC7 */ + {0x4E, 0xE5}, {0x4F, 0x0A}, {0x4F, 0x4D}, {0x4F, 0x9D}, /* 0xC8-0xCB */ + {0x50, 0x49}, {0x56, 0xF2}, {0x59, 0x37}, {0x59, 0xD4}, /* 0xCC-0xCF */ + {0x5A, 0x01}, {0x5C, 0x09}, {0x60, 0xDF}, {0x61, 0x0F}, /* 0xD0-0xD3 */ + {0x61, 0x70}, {0x66, 0x13}, {0x69, 0x05}, {0x70, 0xBA}, /* 0xD4-0xD7 */ + {0x75, 0x4F}, {0x75, 0x70}, {0x79, 0xFB}, {0x7D, 0xAD}, /* 0xD8-0xDB */ + {0x7D, 0xEF}, {0x80, 0xC3}, {0x84, 0x0E}, {0x88, 0x63}, /* 0xDC-0xDF */ + {0x8B, 0x02}, {0x90, 0x55}, {0x90, 0x7A}, {0x53, 0x3B}, /* 0xE0-0xE3 */ + {0x4E, 0x95}, {0x4E, 0xA5}, {0x57, 0xDF}, {0x80, 0xB2}, /* 0xE4-0xE7 */ + {0x90, 0xC1}, {0x78, 0xEF}, {0x4E, 0x00}, {0x58, 0xF1}, /* 0xE8-0xEB */ + {0x6E, 0xA2}, {0x90, 0x38}, {0x7A, 0x32}, {0x83, 0x28}, /* 0xEC-0xEF */ + {0x82, 0x8B}, {0x9C, 0x2F}, {0x51, 0x41}, {0x53, 0x70}, /* 0xF0-0xF3 */ + {0x54, 0xBD}, {0x54, 0xE1}, {0x56, 0xE0}, {0x59, 0xFB}, /* 0xF4-0xF7 */ + {0x5F, 0x15}, {0x98, 0xF2}, {0x6D, 0xEB}, {0x80, 0xE4}, /* 0xF8-0xFB */ + {0x85, 0x2D}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_89[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x96, 0x62}, {0x96, 0x70}, {0x96, 0xA0}, {0x97, 0xFB}, /* 0x40-0x43 */ + {0x54, 0x0B}, {0x53, 0xF3}, {0x5B, 0x87}, {0x70, 0xCF}, /* 0x44-0x47 */ + {0x7F, 0xBD}, {0x8F, 0xC2}, {0x96, 0xE8}, {0x53, 0x6F}, /* 0x48-0x4B */ + {0x9D, 0x5C}, {0x7A, 0xBA}, {0x4E, 0x11}, {0x78, 0x93}, /* 0x4C-0x4F */ + {0x81, 0xFC}, {0x6E, 0x26}, {0x56, 0x18}, {0x55, 0x04}, /* 0x50-0x53 */ + {0x6B, 0x1D}, {0x85, 0x1A}, {0x9C, 0x3B}, {0x59, 0xE5}, /* 0x54-0x57 */ + {0x53, 0xA9}, {0x6D, 0x66}, {0x74, 0xDC}, {0x95, 0x8F}, /* 0x58-0x5B */ + {0x56, 0x42}, {0x4E, 0x91}, {0x90, 0x4B}, {0x96, 0xF2}, /* 0x5C-0x5F */ + {0x83, 0x4F}, {0x99, 0x0C}, {0x53, 0xE1}, {0x55, 0xB6}, /* 0x60-0x63 */ + {0x5B, 0x30}, {0x5F, 0x71}, {0x66, 0x20}, {0x66, 0xF3}, /* 0x64-0x67 */ + {0x68, 0x04}, {0x6C, 0x38}, {0x6C, 0xF3}, {0x6D, 0x29}, /* 0x68-0x6B */ + {0x74, 0x5B}, {0x76, 0xC8}, {0x7A, 0x4E}, {0x98, 0x34}, /* 0x6C-0x6F */ + {0x82, 0xF1}, {0x88, 0x5B}, {0x8A, 0x60}, {0x92, 0xED}, /* 0x70-0x73 */ + {0x6D, 0xB2}, {0x75, 0xAB}, {0x76, 0xCA}, {0x99, 0xC5}, /* 0x74-0x77 */ + {0x60, 0xA6}, {0x8B, 0x01}, {0x8D, 0x8A}, {0x95, 0xB2}, /* 0x78-0x7B */ + {0x69, 0x8E}, {0x53, 0xAD}, {0x51, 0x86}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x57, 0x12}, {0x58, 0x30}, {0x59, 0x44}, {0x5B, 0xB4}, /* 0x80-0x83 */ + {0x5E, 0xF6}, {0x60, 0x28}, {0x63, 0xA9}, {0x63, 0xF4}, /* 0x84-0x87 */ + {0x6C, 0xBF}, {0x6F, 0x14}, {0x70, 0x8E}, {0x71, 0x14}, /* 0x88-0x8B */ + {0x71, 0x59}, {0x71, 0xD5}, {0x73, 0x3F}, {0x7E, 0x01}, /* 0x8C-0x8F */ + {0x82, 0x76}, {0x82, 0xD1}, {0x85, 0x97}, {0x90, 0x60}, /* 0x90-0x93 */ + {0x92, 0x5B}, {0x9D, 0x1B}, {0x58, 0x69}, {0x65, 0xBC}, /* 0x94-0x97 */ + {0x6C, 0x5A}, {0x75, 0x25}, {0x51, 0xF9}, {0x59, 0x2E}, /* 0x98-0x9B */ + {0x59, 0x65}, {0x5F, 0x80}, {0x5F, 0xDC}, {0x62, 0xBC}, /* 0x9C-0x9F */ + {0x65, 0xFA}, {0x6A, 0x2A}, {0x6B, 0x27}, {0x6B, 0xB4}, /* 0xA0-0xA3 */ + {0x73, 0x8B}, {0x7F, 0xC1}, {0x89, 0x56}, {0x9D, 0x2C}, /* 0xA4-0xA7 */ + {0x9D, 0x0E}, {0x9E, 0xC4}, {0x5C, 0xA1}, {0x6C, 0x96}, /* 0xA8-0xAB */ + {0x83, 0x7B}, {0x51, 0x04}, {0x5C, 0x4B}, {0x61, 0xB6}, /* 0xAC-0xAF */ + {0x81, 0xC6}, {0x68, 0x76}, {0x72, 0x61}, {0x4E, 0x59}, /* 0xB0-0xB3 */ + {0x4F, 0xFA}, {0x53, 0x78}, {0x60, 0x69}, {0x6E, 0x29}, /* 0xB4-0xB7 */ + {0x7A, 0x4F}, {0x97, 0xF3}, {0x4E, 0x0B}, {0x53, 0x16}, /* 0xB8-0xBB */ + {0x4E, 0xEE}, {0x4F, 0x55}, {0x4F, 0x3D}, {0x4F, 0xA1}, /* 0xBC-0xBF */ + {0x4F, 0x73}, {0x52, 0xA0}, {0x53, 0xEF}, {0x56, 0x09}, /* 0xC0-0xC3 */ + {0x59, 0x0F}, {0x5A, 0xC1}, {0x5B, 0xB6}, {0x5B, 0xE1}, /* 0xC4-0xC7 */ + {0x79, 0xD1}, {0x66, 0x87}, {0x67, 0x9C}, {0x67, 0xB6}, /* 0xC8-0xCB */ + {0x6B, 0x4C}, {0x6C, 0xB3}, {0x70, 0x6B}, {0x73, 0xC2}, /* 0xCC-0xCF */ + {0x79, 0x8D}, {0x79, 0xBE}, {0x7A, 0x3C}, {0x7B, 0x87}, /* 0xD0-0xD3 */ + {0x82, 0xB1}, {0x82, 0xDB}, {0x83, 0x04}, {0x83, 0x77}, /* 0xD4-0xD7 */ + {0x83, 0xEF}, {0x83, 0xD3}, {0x87, 0x66}, {0x8A, 0xB2}, /* 0xD8-0xDB */ + {0x56, 0x29}, {0x8C, 0xA8}, {0x8F, 0xE6}, {0x90, 0x4E}, /* 0xDC-0xDF */ + {0x97, 0x1E}, {0x86, 0x8A}, {0x4F, 0xC4}, {0x5C, 0xE8}, /* 0xE0-0xE3 */ + {0x62, 0x11}, {0x72, 0x59}, {0x75, 0x3B}, {0x81, 0xE5}, /* 0xE4-0xE7 */ + {0x82, 0xBD}, {0x86, 0xFE}, {0x8C, 0xC0}, {0x96, 0xC5}, /* 0xE8-0xEB */ + {0x99, 0x13}, {0x99, 0xD5}, {0x4E, 0xCB}, {0x4F, 0x1A}, /* 0xEC-0xEF */ + {0x89, 0xE3}, {0x56, 0xDE}, {0x58, 0x4A}, {0x58, 0xCA}, /* 0xF0-0xF3 */ + {0x5E, 0xFB}, {0x5F, 0xEB}, {0x60, 0x2A}, {0x60, 0x94}, /* 0xF4-0xF7 */ + {0x60, 0x62}, {0x61, 0xD0}, {0x62, 0x12}, {0x62, 0xD0}, /* 0xF8-0xFB */ + {0x65, 0x39}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8A[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9B, 0x41}, {0x66, 0x66}, {0x68, 0xB0}, {0x6D, 0x77}, /* 0x40-0x43 */ + {0x70, 0x70}, {0x75, 0x4C}, {0x76, 0x86}, {0x7D, 0x75}, /* 0x44-0x47 */ + {0x82, 0xA5}, {0x87, 0xF9}, {0x95, 0x8B}, {0x96, 0x8E}, /* 0x48-0x4B */ + {0x8C, 0x9D}, {0x51, 0xF1}, {0x52, 0xBE}, {0x59, 0x16}, /* 0x4C-0x4F */ + {0x54, 0xB3}, {0x5B, 0xB3}, {0x5D, 0x16}, {0x61, 0x68}, /* 0x50-0x53 */ + {0x69, 0x82}, {0x6D, 0xAF}, {0x78, 0x8D}, {0x84, 0xCB}, /* 0x54-0x57 */ + {0x88, 0x57}, {0x8A, 0x72}, {0x93, 0xA7}, {0x9A, 0xB8}, /* 0x58-0x5B */ + {0x6D, 0x6C}, {0x99, 0xA8}, {0x86, 0xD9}, {0x57, 0xA3}, /* 0x5C-0x5F */ + {0x67, 0xFF}, {0x86, 0xCE}, {0x92, 0x0E}, {0x52, 0x83}, /* 0x60-0x63 */ + {0x56, 0x87}, {0x54, 0x04}, {0x5E, 0xD3}, {0x62, 0xE1}, /* 0x64-0x67 */ + {0x64, 0xB9}, {0x68, 0x3C}, {0x68, 0x38}, {0x6B, 0xBB}, /* 0x68-0x6B */ + {0x73, 0x72}, {0x78, 0xBA}, {0x7A, 0x6B}, {0x89, 0x9A}, /* 0x6C-0x6F */ + {0x89, 0xD2}, {0x8D, 0x6B}, {0x8F, 0x03}, {0x90, 0xED}, /* 0x70-0x73 */ + {0x95, 0xA3}, {0x96, 0x94}, {0x97, 0x69}, {0x5B, 0x66}, /* 0x74-0x77 */ + {0x5C, 0xB3}, {0x69, 0x7D}, {0x98, 0x4D}, {0x98, 0x4E}, /* 0x78-0x7B */ + {0x63, 0x9B}, {0x7B, 0x20}, {0x6A, 0x2B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6A, 0x7F}, {0x68, 0xB6}, {0x9C, 0x0D}, {0x6F, 0x5F}, /* 0x80-0x83 */ + {0x52, 0x72}, {0x55, 0x9D}, {0x60, 0x70}, {0x62, 0xEC}, /* 0x84-0x87 */ + {0x6D, 0x3B}, {0x6E, 0x07}, {0x6E, 0xD1}, {0x84, 0x5B}, /* 0x88-0x8B */ + {0x89, 0x10}, {0x8F, 0x44}, {0x4E, 0x14}, {0x9C, 0x39}, /* 0x8C-0x8F */ + {0x53, 0xF6}, {0x69, 0x1B}, {0x6A, 0x3A}, {0x97, 0x84}, /* 0x90-0x93 */ + {0x68, 0x2A}, {0x51, 0x5C}, {0x7A, 0xC3}, {0x84, 0xB2}, /* 0x94-0x97 */ + {0x91, 0xDC}, {0x93, 0x8C}, {0x56, 0x5B}, {0x9D, 0x28}, /* 0x98-0x9B */ + {0x68, 0x22}, {0x83, 0x05}, {0x84, 0x31}, {0x7C, 0xA5}, /* 0x9C-0x9F */ + {0x52, 0x08}, {0x82, 0xC5}, {0x74, 0xE6}, {0x4E, 0x7E}, /* 0xA0-0xA3 */ + {0x4F, 0x83}, {0x51, 0xA0}, {0x5B, 0xD2}, {0x52, 0x0A}, /* 0xA4-0xA7 */ + {0x52, 0xD8}, {0x52, 0xE7}, {0x5D, 0xFB}, {0x55, 0x9A}, /* 0xA8-0xAB */ + {0x58, 0x2A}, {0x59, 0xE6}, {0x5B, 0x8C}, {0x5B, 0x98}, /* 0xAC-0xAF */ + {0x5B, 0xDB}, {0x5E, 0x72}, {0x5E, 0x79}, {0x60, 0xA3}, /* 0xB0-0xB3 */ + {0x61, 0x1F}, {0x61, 0x63}, {0x61, 0xBE}, {0x63, 0xDB}, /* 0xB4-0xB7 */ + {0x65, 0x62}, {0x67, 0xD1}, {0x68, 0x53}, {0x68, 0xFA}, /* 0xB8-0xBB */ + {0x6B, 0x3E}, {0x6B, 0x53}, {0x6C, 0x57}, {0x6F, 0x22}, /* 0xBC-0xBF */ + {0x6F, 0x97}, {0x6F, 0x45}, {0x74, 0xB0}, {0x75, 0x18}, /* 0xC0-0xC3 */ + {0x76, 0xE3}, {0x77, 0x0B}, {0x7A, 0xFF}, {0x7B, 0xA1}, /* 0xC4-0xC7 */ + {0x7C, 0x21}, {0x7D, 0xE9}, {0x7F, 0x36}, {0x7F, 0xF0}, /* 0xC8-0xCB */ + {0x80, 0x9D}, {0x82, 0x66}, {0x83, 0x9E}, {0x89, 0xB3}, /* 0xCC-0xCF */ + {0x8A, 0xCC}, {0x8C, 0xAB}, {0x90, 0x84}, {0x94, 0x51}, /* 0xD0-0xD3 */ + {0x95, 0x93}, {0x95, 0x91}, {0x95, 0xA2}, {0x96, 0x65}, /* 0xD4-0xD7 */ + {0x97, 0xD3}, {0x99, 0x28}, {0x82, 0x18}, {0x4E, 0x38}, /* 0xD8-0xDB */ + {0x54, 0x2B}, {0x5C, 0xB8}, {0x5D, 0xCC}, {0x73, 0xA9}, /* 0xDC-0xDF */ + {0x76, 0x4C}, {0x77, 0x3C}, {0x5C, 0xA9}, {0x7F, 0xEB}, /* 0xE0-0xE3 */ + {0x8D, 0x0B}, {0x96, 0xC1}, {0x98, 0x11}, {0x98, 0x54}, /* 0xE4-0xE7 */ + {0x98, 0x58}, {0x4F, 0x01}, {0x4F, 0x0E}, {0x53, 0x71}, /* 0xE8-0xEB */ + {0x55, 0x9C}, {0x56, 0x68}, {0x57, 0xFA}, {0x59, 0x47}, /* 0xEC-0xEF */ + {0x5B, 0x09}, {0x5B, 0xC4}, {0x5C, 0x90}, {0x5E, 0x0C}, /* 0xF0-0xF3 */ + {0x5E, 0x7E}, {0x5F, 0xCC}, {0x63, 0xEE}, {0x67, 0x3A}, /* 0xF4-0xF7 */ + {0x65, 0xD7}, {0x65, 0xE2}, {0x67, 0x1F}, {0x68, 0xCB}, /* 0xF8-0xFB */ + {0x68, 0xC4}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8B[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6A, 0x5F}, {0x5E, 0x30}, {0x6B, 0xC5}, {0x6C, 0x17}, /* 0x40-0x43 */ + {0x6C, 0x7D}, {0x75, 0x7F}, {0x79, 0x48}, {0x5B, 0x63}, /* 0x44-0x47 */ + {0x7A, 0x00}, {0x7D, 0x00}, {0x5F, 0xBD}, {0x89, 0x8F}, /* 0x48-0x4B */ + {0x8A, 0x18}, {0x8C, 0xB4}, {0x8D, 0x77}, {0x8E, 0xCC}, /* 0x4C-0x4F */ + {0x8F, 0x1D}, {0x98, 0xE2}, {0x9A, 0x0E}, {0x9B, 0x3C}, /* 0x50-0x53 */ + {0x4E, 0x80}, {0x50, 0x7D}, {0x51, 0x00}, {0x59, 0x93}, /* 0x54-0x57 */ + {0x5B, 0x9C}, {0x62, 0x2F}, {0x62, 0x80}, {0x64, 0xEC}, /* 0x58-0x5B */ + {0x6B, 0x3A}, {0x72, 0xA0}, {0x75, 0x91}, {0x79, 0x47}, /* 0x5C-0x5F */ + {0x7F, 0xA9}, {0x87, 0xFB}, {0x8A, 0xBC}, {0x8B, 0x70}, /* 0x60-0x63 */ + {0x63, 0xAC}, {0x83, 0xCA}, {0x97, 0xA0}, {0x54, 0x09}, /* 0x64-0x67 */ + {0x54, 0x03}, {0x55, 0xAB}, {0x68, 0x54}, {0x6A, 0x58}, /* 0x68-0x6B */ + {0x8A, 0x70}, {0x78, 0x27}, {0x67, 0x75}, {0x9E, 0xCD}, /* 0x6C-0x6F */ + {0x53, 0x74}, {0x5B, 0xA2}, {0x81, 0x1A}, {0x86, 0x50}, /* 0x70-0x73 */ + {0x90, 0x06}, {0x4E, 0x18}, {0x4E, 0x45}, {0x4E, 0xC7}, /* 0x74-0x77 */ + {0x4F, 0x11}, {0x53, 0xCA}, {0x54, 0x38}, {0x5B, 0xAE}, /* 0x78-0x7B */ + {0x5F, 0x13}, {0x60, 0x25}, {0x65, 0x51}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x67, 0x3D}, {0x6C, 0x42}, {0x6C, 0x72}, {0x6C, 0xE3}, /* 0x80-0x83 */ + {0x70, 0x78}, {0x74, 0x03}, {0x7A, 0x76}, {0x7A, 0xAE}, /* 0x84-0x87 */ + {0x7B, 0x08}, {0x7D, 0x1A}, {0x7C, 0xFE}, {0x7D, 0x66}, /* 0x88-0x8B */ + {0x65, 0xE7}, {0x72, 0x5B}, {0x53, 0xBB}, {0x5C, 0x45}, /* 0x8C-0x8F */ + {0x5D, 0xE8}, {0x62, 0xD2}, {0x62, 0xE0}, {0x63, 0x19}, /* 0x90-0x93 */ + {0x6E, 0x20}, {0x86, 0x5A}, {0x8A, 0x31}, {0x8D, 0xDD}, /* 0x94-0x97 */ + {0x92, 0xF8}, {0x6F, 0x01}, {0x79, 0xA6}, {0x9B, 0x5A}, /* 0x98-0x9B */ + {0x4E, 0xA8}, {0x4E, 0xAB}, {0x4E, 0xAC}, {0x4F, 0x9B}, /* 0x9C-0x9F */ + {0x4F, 0xA0}, {0x50, 0xD1}, {0x51, 0x47}, {0x7A, 0xF6}, /* 0xA0-0xA3 */ + {0x51, 0x71}, {0x51, 0xF6}, {0x53, 0x54}, {0x53, 0x21}, /* 0xA4-0xA7 */ + {0x53, 0x7F}, {0x53, 0xEB}, {0x55, 0xAC}, {0x58, 0x83}, /* 0xA8-0xAB */ + {0x5C, 0xE1}, {0x5F, 0x37}, {0x5F, 0x4A}, {0x60, 0x2F}, /* 0xAC-0xAF */ + {0x60, 0x50}, {0x60, 0x6D}, {0x63, 0x1F}, {0x65, 0x59}, /* 0xB0-0xB3 */ + {0x6A, 0x4B}, {0x6C, 0xC1}, {0x72, 0xC2}, {0x72, 0xED}, /* 0xB4-0xB7 */ + {0x77, 0xEF}, {0x80, 0xF8}, {0x81, 0x05}, {0x82, 0x08}, /* 0xB8-0xBB */ + {0x85, 0x4E}, {0x90, 0xF7}, {0x93, 0xE1}, {0x97, 0xFF}, /* 0xBC-0xBF */ + {0x99, 0x57}, {0x9A, 0x5A}, {0x4E, 0xF0}, {0x51, 0xDD}, /* 0xC0-0xC3 */ + {0x5C, 0x2D}, {0x66, 0x81}, {0x69, 0x6D}, {0x5C, 0x40}, /* 0xC4-0xC7 */ + {0x66, 0xF2}, {0x69, 0x75}, {0x73, 0x89}, {0x68, 0x50}, /* 0xC8-0xCB */ + {0x7C, 0x81}, {0x50, 0xC5}, {0x52, 0xE4}, {0x57, 0x47}, /* 0xCC-0xCF */ + {0x5D, 0xFE}, {0x93, 0x26}, {0x65, 0xA4}, {0x6B, 0x23}, /* 0xD0-0xD3 */ + {0x6B, 0x3D}, {0x74, 0x34}, {0x79, 0x81}, {0x79, 0xBD}, /* 0xD4-0xD7 */ + {0x7B, 0x4B}, {0x7D, 0xCA}, {0x82, 0xB9}, {0x83, 0xCC}, /* 0xD8-0xDB */ + {0x88, 0x7F}, {0x89, 0x5F}, {0x8B, 0x39}, {0x8F, 0xD1}, /* 0xDC-0xDF */ + {0x91, 0xD1}, {0x54, 0x1F}, {0x92, 0x80}, {0x4E, 0x5D}, /* 0xE0-0xE3 */ + {0x50, 0x36}, {0x53, 0xE5}, {0x53, 0x3A}, {0x72, 0xD7}, /* 0xE4-0xE7 */ + {0x73, 0x96}, {0x77, 0xE9}, {0x82, 0xE6}, {0x8E, 0xAF}, /* 0xE8-0xEB */ + {0x99, 0xC6}, {0x99, 0xC8}, {0x99, 0xD2}, {0x51, 0x77}, /* 0xEC-0xEF */ + {0x61, 0x1A}, {0x86, 0x5E}, {0x55, 0xB0}, {0x7A, 0x7A}, /* 0xF0-0xF3 */ + {0x50, 0x76}, {0x5B, 0xD3}, {0x90, 0x47}, {0x96, 0x85}, /* 0xF4-0xF7 */ + {0x4E, 0x32}, {0x6A, 0xDB}, {0x91, 0xE7}, {0x5C, 0x51}, /* 0xF8-0xFB */ + {0x5C, 0x48}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8C[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x63, 0x98}, {0x7A, 0x9F}, {0x6C, 0x93}, {0x97, 0x74}, /* 0x40-0x43 */ + {0x8F, 0x61}, {0x7A, 0xAA}, {0x71, 0x8A}, {0x96, 0x88}, /* 0x44-0x47 */ + {0x7C, 0x82}, {0x68, 0x17}, {0x7E, 0x70}, {0x68, 0x51}, /* 0x48-0x4B */ + {0x93, 0x6C}, {0x52, 0xF2}, {0x54, 0x1B}, {0x85, 0xAB}, /* 0x4C-0x4F */ + {0x8A, 0x13}, {0x7F, 0xA4}, {0x8E, 0xCD}, {0x90, 0xE1}, /* 0x50-0x53 */ + {0x53, 0x66}, {0x88, 0x88}, {0x79, 0x41}, {0x4F, 0xC2}, /* 0x54-0x57 */ + {0x50, 0xBE}, {0x52, 0x11}, {0x51, 0x44}, {0x55, 0x53}, /* 0x58-0x5B */ + {0x57, 0x2D}, {0x73, 0xEA}, {0x57, 0x8B}, {0x59, 0x51}, /* 0x5C-0x5F */ + {0x5F, 0x62}, {0x5F, 0x84}, {0x60, 0x75}, {0x61, 0x76}, /* 0x60-0x63 */ + {0x61, 0x67}, {0x61, 0xA9}, {0x63, 0xB2}, {0x64, 0x3A}, /* 0x64-0x67 */ + {0x65, 0x6C}, {0x66, 0x6F}, {0x68, 0x42}, {0x6E, 0x13}, /* 0x68-0x6B */ + {0x75, 0x66}, {0x7A, 0x3D}, {0x7C, 0xFB}, {0x7D, 0x4C}, /* 0x6C-0x6F */ + {0x7D, 0x99}, {0x7E, 0x4B}, {0x7F, 0x6B}, {0x83, 0x0E}, /* 0x70-0x73 */ + {0x83, 0x4A}, {0x86, 0xCD}, {0x8A, 0x08}, {0x8A, 0x63}, /* 0x74-0x77 */ + {0x8B, 0x66}, {0x8E, 0xFD}, {0x98, 0x1A}, {0x9D, 0x8F}, /* 0x78-0x7B */ + {0x82, 0xB8}, {0x8F, 0xCE}, {0x9B, 0xE8}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x52, 0x87}, {0x62, 0x1F}, {0x64, 0x83}, {0x6F, 0xC0}, /* 0x80-0x83 */ + {0x96, 0x99}, {0x68, 0x41}, {0x50, 0x91}, {0x6B, 0x20}, /* 0x84-0x87 */ + {0x6C, 0x7A}, {0x6F, 0x54}, {0x7A, 0x74}, {0x7D, 0x50}, /* 0x88-0x8B */ + {0x88, 0x40}, {0x8A, 0x23}, {0x67, 0x08}, {0x4E, 0xF6}, /* 0x8C-0x8F */ + {0x50, 0x39}, {0x50, 0x26}, {0x50, 0x65}, {0x51, 0x7C}, /* 0x90-0x93 */ + {0x52, 0x38}, {0x52, 0x63}, {0x55, 0xA7}, {0x57, 0x0F}, /* 0x94-0x97 */ + {0x58, 0x05}, {0x5A, 0xCC}, {0x5E, 0xFA}, {0x61, 0xB2}, /* 0x98-0x9B */ + {0x61, 0xF8}, {0x62, 0xF3}, {0x63, 0x72}, {0x69, 0x1C}, /* 0x9C-0x9F */ + {0x6A, 0x29}, {0x72, 0x7D}, {0x72, 0xAC}, {0x73, 0x2E}, /* 0xA0-0xA3 */ + {0x78, 0x14}, {0x78, 0x6F}, {0x7D, 0x79}, {0x77, 0x0C}, /* 0xA4-0xA7 */ + {0x80, 0xA9}, {0x89, 0x8B}, {0x8B, 0x19}, {0x8C, 0xE2}, /* 0xA8-0xAB */ + {0x8E, 0xD2}, {0x90, 0x63}, {0x93, 0x75}, {0x96, 0x7A}, /* 0xAC-0xAF */ + {0x98, 0x55}, {0x9A, 0x13}, {0x9E, 0x78}, {0x51, 0x43}, /* 0xB0-0xB3 */ + {0x53, 0x9F}, {0x53, 0xB3}, {0x5E, 0x7B}, {0x5F, 0x26}, /* 0xB4-0xB7 */ + {0x6E, 0x1B}, {0x6E, 0x90}, {0x73, 0x84}, {0x73, 0xFE}, /* 0xB8-0xBB */ + {0x7D, 0x43}, {0x82, 0x37}, {0x8A, 0x00}, {0x8A, 0xFA}, /* 0xBC-0xBF */ + {0x96, 0x50}, {0x4E, 0x4E}, {0x50, 0x0B}, {0x53, 0xE4}, /* 0xC0-0xC3 */ + {0x54, 0x7C}, {0x56, 0xFA}, {0x59, 0xD1}, {0x5B, 0x64}, /* 0xC4-0xC7 */ + {0x5D, 0xF1}, {0x5E, 0xAB}, {0x5F, 0x27}, {0x62, 0x38}, /* 0xC8-0xCB */ + {0x65, 0x45}, {0x67, 0xAF}, {0x6E, 0x56}, {0x72, 0xD0}, /* 0xCC-0xCF */ + {0x7C, 0xCA}, {0x88, 0xB4}, {0x80, 0xA1}, {0x80, 0xE1}, /* 0xD0-0xD3 */ + {0x83, 0xF0}, {0x86, 0x4E}, {0x8A, 0x87}, {0x8D, 0xE8}, /* 0xD4-0xD7 */ + {0x92, 0x37}, {0x96, 0xC7}, {0x98, 0x67}, {0x9F, 0x13}, /* 0xD8-0xDB */ + {0x4E, 0x94}, {0x4E, 0x92}, {0x4F, 0x0D}, {0x53, 0x48}, /* 0xDC-0xDF */ + {0x54, 0x49}, {0x54, 0x3E}, {0x5A, 0x2F}, {0x5F, 0x8C}, /* 0xE0-0xE3 */ + {0x5F, 0xA1}, {0x60, 0x9F}, {0x68, 0xA7}, {0x6A, 0x8E}, /* 0xE4-0xE7 */ + {0x74, 0x5A}, {0x78, 0x81}, {0x8A, 0x9E}, {0x8A, 0xA4}, /* 0xE8-0xEB */ + {0x8B, 0x77}, {0x91, 0x90}, {0x4E, 0x5E}, {0x9B, 0xC9}, /* 0xEC-0xEF */ + {0x4E, 0xA4}, {0x4F, 0x7C}, {0x4F, 0xAF}, {0x50, 0x19}, /* 0xF0-0xF3 */ + {0x50, 0x16}, {0x51, 0x49}, {0x51, 0x6C}, {0x52, 0x9F}, /* 0xF4-0xF7 */ + {0x52, 0xB9}, {0x52, 0xFE}, {0x53, 0x9A}, {0x53, 0xE3}, /* 0xF8-0xFB */ + {0x54, 0x11}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8D[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x54, 0x0E}, {0x55, 0x89}, {0x57, 0x51}, {0x57, 0xA2}, /* 0x40-0x43 */ + {0x59, 0x7D}, {0x5B, 0x54}, {0x5B, 0x5D}, {0x5B, 0x8F}, /* 0x44-0x47 */ + {0x5D, 0xE5}, {0x5D, 0xE7}, {0x5D, 0xF7}, {0x5E, 0x78}, /* 0x48-0x4B */ + {0x5E, 0x83}, {0x5E, 0x9A}, {0x5E, 0xB7}, {0x5F, 0x18}, /* 0x4C-0x4F */ + {0x60, 0x52}, {0x61, 0x4C}, {0x62, 0x97}, {0x62, 0xD8}, /* 0x50-0x53 */ + {0x63, 0xA7}, {0x65, 0x3B}, {0x66, 0x02}, {0x66, 0x43}, /* 0x54-0x57 */ + {0x66, 0xF4}, {0x67, 0x6D}, {0x68, 0x21}, {0x68, 0x97}, /* 0x58-0x5B */ + {0x69, 0xCB}, {0x6C, 0x5F}, {0x6D, 0x2A}, {0x6D, 0x69}, /* 0x5C-0x5F */ + {0x6E, 0x2F}, {0x6E, 0x9D}, {0x75, 0x32}, {0x76, 0x87}, /* 0x60-0x63 */ + {0x78, 0x6C}, {0x7A, 0x3F}, {0x7C, 0xE0}, {0x7D, 0x05}, /* 0x64-0x67 */ + {0x7D, 0x18}, {0x7D, 0x5E}, {0x7D, 0xB1}, {0x80, 0x15}, /* 0x68-0x6B */ + {0x80, 0x03}, {0x80, 0xAF}, {0x80, 0xB1}, {0x81, 0x54}, /* 0x6C-0x6F */ + {0x81, 0x8F}, {0x82, 0x2A}, {0x83, 0x52}, {0x88, 0x4C}, /* 0x70-0x73 */ + {0x88, 0x61}, {0x8B, 0x1B}, {0x8C, 0xA2}, {0x8C, 0xFC}, /* 0x74-0x77 */ + {0x90, 0xCA}, {0x91, 0x75}, {0x92, 0x71}, {0x78, 0x3F}, /* 0x78-0x7B */ + {0x92, 0xFC}, {0x95, 0xA4}, {0x96, 0x4D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x98, 0x05}, {0x99, 0x99}, {0x9A, 0xD8}, {0x9D, 0x3B}, /* 0x80-0x83 */ + {0x52, 0x5B}, {0x52, 0xAB}, {0x53, 0xF7}, {0x54, 0x08}, /* 0x84-0x87 */ + {0x58, 0xD5}, {0x62, 0xF7}, {0x6F, 0xE0}, {0x8C, 0x6A}, /* 0x88-0x8B */ + {0x8F, 0x5F}, {0x9E, 0xB9}, {0x51, 0x4B}, {0x52, 0x3B}, /* 0x8C-0x8F */ + {0x54, 0x4A}, {0x56, 0xFD}, {0x7A, 0x40}, {0x91, 0x77}, /* 0x90-0x93 */ + {0x9D, 0x60}, {0x9E, 0xD2}, {0x73, 0x44}, {0x6F, 0x09}, /* 0x94-0x97 */ + {0x81, 0x70}, {0x75, 0x11}, {0x5F, 0xFD}, {0x60, 0xDA}, /* 0x98-0x9B */ + {0x9A, 0xA8}, {0x72, 0xDB}, {0x8F, 0xBC}, {0x6B, 0x64}, /* 0x9C-0x9F */ + {0x98, 0x03}, {0x4E, 0xCA}, {0x56, 0xF0}, {0x57, 0x64}, /* 0xA0-0xA3 */ + {0x58, 0xBE}, {0x5A, 0x5A}, {0x60, 0x68}, {0x61, 0xC7}, /* 0xA4-0xA7 */ + {0x66, 0x0F}, {0x66, 0x06}, {0x68, 0x39}, {0x68, 0xB1}, /* 0xA8-0xAB */ + {0x6D, 0xF7}, {0x75, 0xD5}, {0x7D, 0x3A}, {0x82, 0x6E}, /* 0xAC-0xAF */ + {0x9B, 0x42}, {0x4E, 0x9B}, {0x4F, 0x50}, {0x53, 0xC9}, /* 0xB0-0xB3 */ + {0x55, 0x06}, {0x5D, 0x6F}, {0x5D, 0xE6}, {0x5D, 0xEE}, /* 0xB4-0xB7 */ + {0x67, 0xFB}, {0x6C, 0x99}, {0x74, 0x73}, {0x78, 0x02}, /* 0xB8-0xBB */ + {0x8A, 0x50}, {0x93, 0x96}, {0x88, 0xDF}, {0x57, 0x50}, /* 0xBC-0xBF */ + {0x5E, 0xA7}, {0x63, 0x2B}, {0x50, 0xB5}, {0x50, 0xAC}, /* 0xC0-0xC3 */ + {0x51, 0x8D}, {0x67, 0x00}, {0x54, 0xC9}, {0x58, 0x5E}, /* 0xC4-0xC7 */ + {0x59, 0xBB}, {0x5B, 0xB0}, {0x5F, 0x69}, {0x62, 0x4D}, /* 0xC8-0xCB */ + {0x63, 0xA1}, {0x68, 0x3D}, {0x6B, 0x73}, {0x6E, 0x08}, /* 0xCC-0xCF */ + {0x70, 0x7D}, {0x91, 0xC7}, {0x72, 0x80}, {0x78, 0x15}, /* 0xD0-0xD3 */ + {0x78, 0x26}, {0x79, 0x6D}, {0x65, 0x8E}, {0x7D, 0x30}, /* 0xD4-0xD7 */ + {0x83, 0xDC}, {0x88, 0xC1}, {0x8F, 0x09}, {0x96, 0x9B}, /* 0xD8-0xDB */ + {0x52, 0x64}, {0x57, 0x28}, {0x67, 0x50}, {0x7F, 0x6A}, /* 0xDC-0xDF */ + {0x8C, 0xA1}, {0x51, 0xB4}, {0x57, 0x42}, {0x96, 0x2A}, /* 0xE0-0xE3 */ + {0x58, 0x3A}, {0x69, 0x8A}, {0x80, 0xB4}, {0x54, 0xB2}, /* 0xE4-0xE7 */ + {0x5D, 0x0E}, {0x57, 0xFC}, {0x78, 0x95}, {0x9D, 0xFA}, /* 0xE8-0xEB */ + {0x4F, 0x5C}, {0x52, 0x4A}, {0x54, 0x8B}, {0x64, 0x3E}, /* 0xEC-0xEF */ + {0x66, 0x28}, {0x67, 0x14}, {0x67, 0xF5}, {0x7A, 0x84}, /* 0xF0-0xF3 */ + {0x7B, 0x56}, {0x7D, 0x22}, {0x93, 0x2F}, {0x68, 0x5C}, /* 0xF4-0xF7 */ + {0x9B, 0xAD}, {0x7B, 0x39}, {0x53, 0x19}, {0x51, 0x8A}, /* 0xF8-0xFB */ + {0x52, 0x37}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8E[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5B, 0xDF}, {0x62, 0xF6}, {0x64, 0xAE}, {0x64, 0xE6}, /* 0x40-0x43 */ + {0x67, 0x2D}, {0x6B, 0xBA}, {0x85, 0xA9}, {0x96, 0xD1}, /* 0x44-0x47 */ + {0x76, 0x90}, {0x9B, 0xD6}, {0x63, 0x4C}, {0x93, 0x06}, /* 0x48-0x4B */ + {0x9B, 0xAB}, {0x76, 0xBF}, {0x66, 0x52}, {0x4E, 0x09}, /* 0x4C-0x4F */ + {0x50, 0x98}, {0x53, 0xC2}, {0x5C, 0x71}, {0x60, 0xE8}, /* 0x50-0x53 */ + {0x64, 0x92}, {0x65, 0x63}, {0x68, 0x5F}, {0x71, 0xE6}, /* 0x54-0x57 */ + {0x73, 0xCA}, {0x75, 0x23}, {0x7B, 0x97}, {0x7E, 0x82}, /* 0x58-0x5B */ + {0x86, 0x95}, {0x8B, 0x83}, {0x8C, 0xDB}, {0x91, 0x78}, /* 0x5C-0x5F */ + {0x99, 0x10}, {0x65, 0xAC}, {0x66, 0xAB}, {0x6B, 0x8B}, /* 0x60-0x63 */ + {0x4E, 0xD5}, {0x4E, 0xD4}, {0x4F, 0x3A}, {0x4F, 0x7F}, /* 0x64-0x67 */ + {0x52, 0x3A}, {0x53, 0xF8}, {0x53, 0xF2}, {0x55, 0xE3}, /* 0x68-0x6B */ + {0x56, 0xDB}, {0x58, 0xEB}, {0x59, 0xCB}, {0x59, 0xC9}, /* 0x6C-0x6F */ + {0x59, 0xFF}, {0x5B, 0x50}, {0x5C, 0x4D}, {0x5E, 0x02}, /* 0x70-0x73 */ + {0x5E, 0x2B}, {0x5F, 0xD7}, {0x60, 0x1D}, {0x63, 0x07}, /* 0x74-0x77 */ + {0x65, 0x2F}, {0x5B, 0x5C}, {0x65, 0xAF}, {0x65, 0xBD}, /* 0x78-0x7B */ + {0x65, 0xE8}, {0x67, 0x9D}, {0x6B, 0x62}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6B, 0x7B}, {0x6C, 0x0F}, {0x73, 0x45}, {0x79, 0x49}, /* 0x80-0x83 */ + {0x79, 0xC1}, {0x7C, 0xF8}, {0x7D, 0x19}, {0x7D, 0x2B}, /* 0x84-0x87 */ + {0x80, 0xA2}, {0x81, 0x02}, {0x81, 0xF3}, {0x89, 0x96}, /* 0x88-0x8B */ + {0x8A, 0x5E}, {0x8A, 0x69}, {0x8A, 0x66}, {0x8A, 0x8C}, /* 0x8C-0x8F */ + {0x8A, 0xEE}, {0x8C, 0xC7}, {0x8C, 0xDC}, {0x96, 0xCC}, /* 0x90-0x93 */ + {0x98, 0xFC}, {0x6B, 0x6F}, {0x4E, 0x8B}, {0x4F, 0x3C}, /* 0x94-0x97 */ + {0x4F, 0x8D}, {0x51, 0x50}, {0x5B, 0x57}, {0x5B, 0xFA}, /* 0x98-0x9B */ + {0x61, 0x48}, {0x63, 0x01}, {0x66, 0x42}, {0x6B, 0x21}, /* 0x9C-0x9F */ + {0x6E, 0xCB}, {0x6C, 0xBB}, {0x72, 0x3E}, {0x74, 0xBD}, /* 0xA0-0xA3 */ + {0x75, 0xD4}, {0x78, 0xC1}, {0x79, 0x3A}, {0x80, 0x0C}, /* 0xA4-0xA7 */ + {0x80, 0x33}, {0x81, 0xEA}, {0x84, 0x94}, {0x8F, 0x9E}, /* 0xA8-0xAB */ + {0x6C, 0x50}, {0x9E, 0x7F}, {0x5F, 0x0F}, {0x8B, 0x58}, /* 0xAC-0xAF */ + {0x9D, 0x2B}, {0x7A, 0xFA}, {0x8E, 0xF8}, {0x5B, 0x8D}, /* 0xB0-0xB3 */ + {0x96, 0xEB}, {0x4E, 0x03}, {0x53, 0xF1}, {0x57, 0xF7}, /* 0xB4-0xB7 */ + {0x59, 0x31}, {0x5A, 0xC9}, {0x5B, 0xA4}, {0x60, 0x89}, /* 0xB8-0xBB */ + {0x6E, 0x7F}, {0x6F, 0x06}, {0x75, 0xBE}, {0x8C, 0xEA}, /* 0xBC-0xBF */ + {0x5B, 0x9F}, {0x85, 0x00}, {0x7B, 0xE0}, {0x50, 0x72}, /* 0xC0-0xC3 */ + {0x67, 0xF4}, {0x82, 0x9D}, {0x5C, 0x61}, {0x85, 0x4A}, /* 0xC4-0xC7 */ + {0x7E, 0x1E}, {0x82, 0x0E}, {0x51, 0x99}, {0x5C, 0x04}, /* 0xC8-0xCB */ + {0x63, 0x68}, {0x8D, 0x66}, {0x65, 0x9C}, {0x71, 0x6E}, /* 0xCC-0xCF */ + {0x79, 0x3E}, {0x7D, 0x17}, {0x80, 0x05}, {0x8B, 0x1D}, /* 0xD0-0xD3 */ + {0x8E, 0xCA}, {0x90, 0x6E}, {0x86, 0xC7}, {0x90, 0xAA}, /* 0xD4-0xD7 */ + {0x50, 0x1F}, {0x52, 0xFA}, {0x5C, 0x3A}, {0x67, 0x53}, /* 0xD8-0xDB */ + {0x70, 0x7C}, {0x72, 0x35}, {0x91, 0x4C}, {0x91, 0xC8}, /* 0xDC-0xDF */ + {0x93, 0x2B}, {0x82, 0xE5}, {0x5B, 0xC2}, {0x5F, 0x31}, /* 0xE0-0xE3 */ + {0x60, 0xF9}, {0x4E, 0x3B}, {0x53, 0xD6}, {0x5B, 0x88}, /* 0xE4-0xE7 */ + {0x62, 0x4B}, {0x67, 0x31}, {0x6B, 0x8A}, {0x72, 0xE9}, /* 0xE8-0xEB */ + {0x73, 0xE0}, {0x7A, 0x2E}, {0x81, 0x6B}, {0x8D, 0xA3}, /* 0xEC-0xEF */ + {0x91, 0x52}, {0x99, 0x96}, {0x51, 0x12}, {0x53, 0xD7}, /* 0xF0-0xF3 */ + {0x54, 0x6A}, {0x5B, 0xFF}, {0x63, 0x88}, {0x6A, 0x39}, /* 0xF4-0xF7 */ + {0x7D, 0xAC}, {0x97, 0x00}, {0x56, 0xDA}, {0x53, 0xCE}, /* 0xF8-0xFB */ + {0x54, 0x68}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8F[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5B, 0x97}, {0x5C, 0x31}, {0x5D, 0xDE}, {0x4F, 0xEE}, /* 0x40-0x43 */ + {0x61, 0x01}, {0x62, 0xFE}, {0x6D, 0x32}, {0x79, 0xC0}, /* 0x44-0x47 */ + {0x79, 0xCB}, {0x7D, 0x42}, {0x7E, 0x4D}, {0x7F, 0xD2}, /* 0x48-0x4B */ + {0x81, 0xED}, {0x82, 0x1F}, {0x84, 0x90}, {0x88, 0x46}, /* 0x4C-0x4F */ + {0x89, 0x72}, {0x8B, 0x90}, {0x8E, 0x74}, {0x8F, 0x2F}, /* 0x50-0x53 */ + {0x90, 0x31}, {0x91, 0x4B}, {0x91, 0x6C}, {0x96, 0xC6}, /* 0x54-0x57 */ + {0x91, 0x9C}, {0x4E, 0xC0}, {0x4F, 0x4F}, {0x51, 0x45}, /* 0x58-0x5B */ + {0x53, 0x41}, {0x5F, 0x93}, {0x62, 0x0E}, {0x67, 0xD4}, /* 0x5C-0x5F */ + {0x6C, 0x41}, {0x6E, 0x0B}, {0x73, 0x63}, {0x7E, 0x26}, /* 0x60-0x63 */ + {0x91, 0xCD}, {0x92, 0x83}, {0x53, 0xD4}, {0x59, 0x19}, /* 0x64-0x67 */ + {0x5B, 0xBF}, {0x6D, 0xD1}, {0x79, 0x5D}, {0x7E, 0x2E}, /* 0x68-0x6B */ + {0x7C, 0x9B}, {0x58, 0x7E}, {0x71, 0x9F}, {0x51, 0xFA}, /* 0x6C-0x6F */ + {0x88, 0x53}, {0x8F, 0xF0}, {0x4F, 0xCA}, {0x5C, 0xFB}, /* 0x70-0x73 */ + {0x66, 0x25}, {0x77, 0xAC}, {0x7A, 0xE3}, {0x82, 0x1C}, /* 0x74-0x77 */ + {0x99, 0xFF}, {0x51, 0xC6}, {0x5F, 0xAA}, {0x65, 0xEC}, /* 0x78-0x7B */ + {0x69, 0x6F}, {0x6B, 0x89}, {0x6D, 0xF3}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6E, 0x96}, {0x6F, 0x64}, {0x76, 0xFE}, {0x7D, 0x14}, /* 0x80-0x83 */ + {0x5D, 0xE1}, {0x90, 0x75}, {0x91, 0x87}, {0x98, 0x06}, /* 0x84-0x87 */ + {0x51, 0xE6}, {0x52, 0x1D}, {0x62, 0x40}, {0x66, 0x91}, /* 0x88-0x8B */ + {0x66, 0xD9}, {0x6E, 0x1A}, {0x5E, 0xB6}, {0x7D, 0xD2}, /* 0x8C-0x8F */ + {0x7F, 0x72}, {0x66, 0xF8}, {0x85, 0xAF}, {0x85, 0xF7}, /* 0x90-0x93 */ + {0x8A, 0xF8}, {0x52, 0xA9}, {0x53, 0xD9}, {0x59, 0x73}, /* 0x94-0x97 */ + {0x5E, 0x8F}, {0x5F, 0x90}, {0x60, 0x55}, {0x92, 0xE4}, /* 0x98-0x9B */ + {0x96, 0x64}, {0x50, 0xB7}, {0x51, 0x1F}, {0x52, 0xDD}, /* 0x9C-0x9F */ + {0x53, 0x20}, {0x53, 0x47}, {0x53, 0xEC}, {0x54, 0xE8}, /* 0xA0-0xA3 */ + {0x55, 0x46}, {0x55, 0x31}, {0x56, 0x17}, {0x59, 0x68}, /* 0xA4-0xA7 */ + {0x59, 0xBE}, {0x5A, 0x3C}, {0x5B, 0xB5}, {0x5C, 0x06}, /* 0xA8-0xAB */ + {0x5C, 0x0F}, {0x5C, 0x11}, {0x5C, 0x1A}, {0x5E, 0x84}, /* 0xAC-0xAF */ + {0x5E, 0x8A}, {0x5E, 0xE0}, {0x5F, 0x70}, {0x62, 0x7F}, /* 0xB0-0xB3 */ + {0x62, 0x84}, {0x62, 0xDB}, {0x63, 0x8C}, {0x63, 0x77}, /* 0xB4-0xB7 */ + {0x66, 0x07}, {0x66, 0x0C}, {0x66, 0x2D}, {0x66, 0x76}, /* 0xB8-0xBB */ + {0x67, 0x7E}, {0x68, 0xA2}, {0x6A, 0x1F}, {0x6A, 0x35}, /* 0xBC-0xBF */ + {0x6C, 0xBC}, {0x6D, 0x88}, {0x6E, 0x09}, {0x6E, 0x58}, /* 0xC0-0xC3 */ + {0x71, 0x3C}, {0x71, 0x26}, {0x71, 0x67}, {0x75, 0xC7}, /* 0xC4-0xC7 */ + {0x77, 0x01}, {0x78, 0x5D}, {0x79, 0x01}, {0x79, 0x65}, /* 0xC8-0xCB */ + {0x79, 0xF0}, {0x7A, 0xE0}, {0x7B, 0x11}, {0x7C, 0xA7}, /* 0xCC-0xCF */ + {0x7D, 0x39}, {0x80, 0x96}, {0x83, 0xD6}, {0x84, 0x8B}, /* 0xD0-0xD3 */ + {0x85, 0x49}, {0x88, 0x5D}, {0x88, 0xF3}, {0x8A, 0x1F}, /* 0xD4-0xD7 */ + {0x8A, 0x3C}, {0x8A, 0x54}, {0x8A, 0x73}, {0x8C, 0x61}, /* 0xD8-0xDB */ + {0x8C, 0xDE}, {0x91, 0xA4}, {0x92, 0x66}, {0x93, 0x7E}, /* 0xDC-0xDF */ + {0x94, 0x18}, {0x96, 0x9C}, {0x97, 0x98}, {0x4E, 0x0A}, /* 0xE0-0xE3 */ + {0x4E, 0x08}, {0x4E, 0x1E}, {0x4E, 0x57}, {0x51, 0x97}, /* 0xE4-0xE7 */ + {0x52, 0x70}, {0x57, 0xCE}, {0x58, 0x34}, {0x58, 0xCC}, /* 0xE8-0xEB */ + {0x5B, 0x22}, {0x5E, 0x38}, {0x60, 0xC5}, {0x64, 0xFE}, /* 0xEC-0xEF */ + {0x67, 0x61}, {0x67, 0x56}, {0x6D, 0x44}, {0x72, 0xB6}, /* 0xF0-0xF3 */ + {0x75, 0x73}, {0x7A, 0x63}, {0x84, 0xB8}, {0x8B, 0x72}, /* 0xF4-0xF7 */ + {0x91, 0xB8}, {0x93, 0x20}, {0x56, 0x31}, {0x57, 0xF4}, /* 0xF8-0xFB */ + {0x98, 0xFE}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_90[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x62, 0xED}, {0x69, 0x0D}, {0x6B, 0x96}, {0x71, 0xED}, /* 0x40-0x43 */ + {0x7E, 0x54}, {0x80, 0x77}, {0x82, 0x72}, {0x89, 0xE6}, /* 0x44-0x47 */ + {0x98, 0xDF}, {0x87, 0x55}, {0x8F, 0xB1}, {0x5C, 0x3B}, /* 0x48-0x4B */ + {0x4F, 0x38}, {0x4F, 0xE1}, {0x4F, 0xB5}, {0x55, 0x07}, /* 0x4C-0x4F */ + {0x5A, 0x20}, {0x5B, 0xDD}, {0x5B, 0xE9}, {0x5F, 0xC3}, /* 0x50-0x53 */ + {0x61, 0x4E}, {0x63, 0x2F}, {0x65, 0xB0}, {0x66, 0x4B}, /* 0x54-0x57 */ + {0x68, 0xEE}, {0x69, 0x9B}, {0x6D, 0x78}, {0x6D, 0xF1}, /* 0x58-0x5B */ + {0x75, 0x33}, {0x75, 0xB9}, {0x77, 0x1F}, {0x79, 0x5E}, /* 0x5C-0x5F */ + {0x79, 0xE6}, {0x7D, 0x33}, {0x81, 0xE3}, {0x82, 0xAF}, /* 0x60-0x63 */ + {0x85, 0xAA}, {0x89, 0xAA}, {0x8A, 0x3A}, {0x8E, 0xAB}, /* 0x64-0x67 */ + {0x8F, 0x9B}, {0x90, 0x32}, {0x91, 0xDD}, {0x97, 0x07}, /* 0x68-0x6B */ + {0x4E, 0xBA}, {0x4E, 0xC1}, {0x52, 0x03}, {0x58, 0x75}, /* 0x6C-0x6F */ + {0x58, 0xEC}, {0x5C, 0x0B}, {0x75, 0x1A}, {0x5C, 0x3D}, /* 0x70-0x73 */ + {0x81, 0x4E}, {0x8A, 0x0A}, {0x8F, 0xC5}, {0x96, 0x63}, /* 0x74-0x77 */ + {0x97, 0x6D}, {0x7B, 0x25}, {0x8A, 0xCF}, {0x98, 0x08}, /* 0x78-0x7B */ + {0x91, 0x62}, {0x56, 0xF3}, {0x53, 0xA8}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x90, 0x17}, {0x54, 0x39}, {0x57, 0x82}, {0x5E, 0x25}, /* 0x80-0x83 */ + {0x63, 0xA8}, {0x6C, 0x34}, {0x70, 0x8A}, {0x77, 0x61}, /* 0x84-0x87 */ + {0x7C, 0x8B}, {0x7F, 0xE0}, {0x88, 0x70}, {0x90, 0x42}, /* 0x88-0x8B */ + {0x91, 0x54}, {0x93, 0x10}, {0x93, 0x18}, {0x96, 0x8F}, /* 0x8C-0x8F */ + {0x74, 0x5E}, {0x9A, 0xC4}, {0x5D, 0x07}, {0x5D, 0x69}, /* 0x90-0x93 */ + {0x65, 0x70}, {0x67, 0xA2}, {0x8D, 0xA8}, {0x96, 0xDB}, /* 0x94-0x97 */ + {0x63, 0x6E}, {0x67, 0x49}, {0x69, 0x19}, {0x83, 0xC5}, /* 0x98-0x9B */ + {0x98, 0x17}, {0x96, 0xC0}, {0x88, 0xFE}, {0x6F, 0x84}, /* 0x9C-0x9F */ + {0x64, 0x7A}, {0x5B, 0xF8}, {0x4E, 0x16}, {0x70, 0x2C}, /* 0xA0-0xA3 */ + {0x75, 0x5D}, {0x66, 0x2F}, {0x51, 0xC4}, {0x52, 0x36}, /* 0xA4-0xA7 */ + {0x52, 0xE2}, {0x59, 0xD3}, {0x5F, 0x81}, {0x60, 0x27}, /* 0xA8-0xAB */ + {0x62, 0x10}, {0x65, 0x3F}, {0x65, 0x74}, {0x66, 0x1F}, /* 0xAC-0xAF */ + {0x66, 0x74}, {0x68, 0xF2}, {0x68, 0x16}, {0x6B, 0x63}, /* 0xB0-0xB3 */ + {0x6E, 0x05}, {0x72, 0x72}, {0x75, 0x1F}, {0x76, 0xDB}, /* 0xB4-0xB7 */ + {0x7C, 0xBE}, {0x80, 0x56}, {0x58, 0xF0}, {0x88, 0xFD}, /* 0xB8-0xBB */ + {0x89, 0x7F}, {0x8A, 0xA0}, {0x8A, 0x93}, {0x8A, 0xCB}, /* 0xBC-0xBF */ + {0x90, 0x1D}, {0x91, 0x92}, {0x97, 0x52}, {0x97, 0x59}, /* 0xC0-0xC3 */ + {0x65, 0x89}, {0x7A, 0x0E}, {0x81, 0x06}, {0x96, 0xBB}, /* 0xC4-0xC7 */ + {0x5E, 0x2D}, {0x60, 0xDC}, {0x62, 0x1A}, {0x65, 0xA5}, /* 0xC8-0xCB */ + {0x66, 0x14}, {0x67, 0x90}, {0x77, 0xF3}, {0x7A, 0x4D}, /* 0xCC-0xCF */ + {0x7C, 0x4D}, {0x7E, 0x3E}, {0x81, 0x0A}, {0x8C, 0xAC}, /* 0xD0-0xD3 */ + {0x8D, 0x64}, {0x8D, 0xE1}, {0x8E, 0x5F}, {0x78, 0xA9}, /* 0xD4-0xD7 */ + {0x52, 0x07}, {0x62, 0xD9}, {0x63, 0xA5}, {0x64, 0x42}, /* 0xD8-0xDB */ + {0x62, 0x98}, {0x8A, 0x2D}, {0x7A, 0x83}, {0x7B, 0xC0}, /* 0xDC-0xDF */ + {0x8A, 0xAC}, {0x96, 0xEA}, {0x7D, 0x76}, {0x82, 0x0C}, /* 0xE0-0xE3 */ + {0x87, 0x49}, {0x4E, 0xD9}, {0x51, 0x48}, {0x53, 0x43}, /* 0xE4-0xE7 */ + {0x53, 0x60}, {0x5B, 0xA3}, {0x5C, 0x02}, {0x5C, 0x16}, /* 0xE8-0xEB */ + {0x5D, 0xDD}, {0x62, 0x26}, {0x62, 0x47}, {0x64, 0xB0}, /* 0xEC-0xEF */ + {0x68, 0x13}, {0x68, 0x34}, {0x6C, 0xC9}, {0x6D, 0x45}, /* 0xF0-0xF3 */ + {0x6D, 0x17}, {0x67, 0xD3}, {0x6F, 0x5C}, {0x71, 0x4E}, /* 0xF4-0xF7 */ + {0x71, 0x7D}, {0x65, 0xCB}, {0x7A, 0x7F}, {0x7B, 0xAD}, /* 0xF8-0xFB */ + {0x7D, 0xDA}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_91[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7E, 0x4A}, {0x7F, 0xA8}, {0x81, 0x7A}, {0x82, 0x1B}, /* 0x40-0x43 */ + {0x82, 0x39}, {0x85, 0xA6}, {0x8A, 0x6E}, {0x8C, 0xCE}, /* 0x44-0x47 */ + {0x8D, 0xF5}, {0x90, 0x78}, {0x90, 0x77}, {0x92, 0xAD}, /* 0x48-0x4B */ + {0x92, 0x91}, {0x95, 0x83}, {0x9B, 0xAE}, {0x52, 0x4D}, /* 0x4C-0x4F */ + {0x55, 0x84}, {0x6F, 0x38}, {0x71, 0x36}, {0x51, 0x68}, /* 0x50-0x53 */ + {0x79, 0x85}, {0x7E, 0x55}, {0x81, 0xB3}, {0x7C, 0xCE}, /* 0x54-0x57 */ + {0x56, 0x4C}, {0x58, 0x51}, {0x5C, 0xA8}, {0x63, 0xAA}, /* 0x58-0x5B */ + {0x66, 0xFE}, {0x66, 0xFD}, {0x69, 0x5A}, {0x72, 0xD9}, /* 0x5C-0x5F */ + {0x75, 0x8F}, {0x75, 0x8E}, {0x79, 0x0E}, {0x79, 0x56}, /* 0x60-0x63 */ + {0x79, 0xDF}, {0x7C, 0x97}, {0x7D, 0x20}, {0x7D, 0x44}, /* 0x64-0x67 */ + {0x86, 0x07}, {0x8A, 0x34}, {0x96, 0x3B}, {0x90, 0x61}, /* 0x68-0x6B */ + {0x9F, 0x20}, {0x50, 0xE7}, {0x52, 0x75}, {0x53, 0xCC}, /* 0x6C-0x6F */ + {0x53, 0xE2}, {0x50, 0x09}, {0x55, 0xAA}, {0x58, 0xEE}, /* 0x70-0x73 */ + {0x59, 0x4F}, {0x72, 0x3D}, {0x5B, 0x8B}, {0x5C, 0x64}, /* 0x74-0x77 */ + {0x53, 0x1D}, {0x60, 0xE3}, {0x60, 0xF3}, {0x63, 0x5C}, /* 0x78-0x7B */ + {0x63, 0x83}, {0x63, 0x3F}, {0x63, 0xBB}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x64, 0xCD}, {0x65, 0xE9}, {0x66, 0xF9}, {0x5D, 0xE3}, /* 0x80-0x83 */ + {0x69, 0xCD}, {0x69, 0xFD}, {0x6F, 0x15}, {0x71, 0xE5}, /* 0x84-0x87 */ + {0x4E, 0x89}, {0x75, 0xE9}, {0x76, 0xF8}, {0x7A, 0x93}, /* 0x88-0x8B */ + {0x7C, 0xDF}, {0x7D, 0xCF}, {0x7D, 0x9C}, {0x80, 0x61}, /* 0x8C-0x8F */ + {0x83, 0x49}, {0x83, 0x58}, {0x84, 0x6C}, {0x84, 0xBC}, /* 0x90-0x93 */ + {0x85, 0xFB}, {0x88, 0xC5}, {0x8D, 0x70}, {0x90, 0x01}, /* 0x94-0x97 */ + {0x90, 0x6D}, {0x93, 0x97}, {0x97, 0x1C}, {0x9A, 0x12}, /* 0x98-0x9B */ + {0x50, 0xCF}, {0x58, 0x97}, {0x61, 0x8E}, {0x81, 0xD3}, /* 0x9C-0x9F */ + {0x85, 0x35}, {0x8D, 0x08}, {0x90, 0x20}, {0x4F, 0xC3}, /* 0xA0-0xA3 */ + {0x50, 0x74}, {0x52, 0x47}, {0x53, 0x73}, {0x60, 0x6F}, /* 0xA4-0xA7 */ + {0x63, 0x49}, {0x67, 0x5F}, {0x6E, 0x2C}, {0x8D, 0xB3}, /* 0xA8-0xAB */ + {0x90, 0x1F}, {0x4F, 0xD7}, {0x5C, 0x5E}, {0x8C, 0xCA}, /* 0xAC-0xAF */ + {0x65, 0xCF}, {0x7D, 0x9A}, {0x53, 0x52}, {0x88, 0x96}, /* 0xB0-0xB3 */ + {0x51, 0x76}, {0x63, 0xC3}, {0x5B, 0x58}, {0x5B, 0x6B}, /* 0xB4-0xB7 */ + {0x5C, 0x0A}, {0x64, 0x0D}, {0x67, 0x51}, {0x90, 0x5C}, /* 0xB8-0xBB */ + {0x4E, 0xD6}, {0x59, 0x1A}, {0x59, 0x2A}, {0x6C, 0x70}, /* 0xBC-0xBF */ + {0x8A, 0x51}, {0x55, 0x3E}, {0x58, 0x15}, {0x59, 0xA5}, /* 0xC0-0xC3 */ + {0x60, 0xF0}, {0x62, 0x53}, {0x67, 0xC1}, {0x82, 0x35}, /* 0xC4-0xC7 */ + {0x69, 0x55}, {0x96, 0x40}, {0x99, 0xC4}, {0x9A, 0x28}, /* 0xC8-0xCB */ + {0x4F, 0x53}, {0x58, 0x06}, {0x5B, 0xFE}, {0x80, 0x10}, /* 0xCC-0xCF */ + {0x5C, 0xB1}, {0x5E, 0x2F}, {0x5F, 0x85}, {0x60, 0x20}, /* 0xD0-0xD3 */ + {0x61, 0x4B}, {0x62, 0x34}, {0x66, 0xFF}, {0x6C, 0xF0}, /* 0xD4-0xD7 */ + {0x6E, 0xDE}, {0x80, 0xCE}, {0x81, 0x7F}, {0x82, 0xD4}, /* 0xD8-0xDB */ + {0x88, 0x8B}, {0x8C, 0xB8}, {0x90, 0x00}, {0x90, 0x2E}, /* 0xDC-0xDF */ + {0x96, 0x8A}, {0x9E, 0xDB}, {0x9B, 0xDB}, {0x4E, 0xE3}, /* 0xE0-0xE3 */ + {0x53, 0xF0}, {0x59, 0x27}, {0x7B, 0x2C}, {0x91, 0x8D}, /* 0xE4-0xE7 */ + {0x98, 0x4C}, {0x9D, 0xF9}, {0x6E, 0xDD}, {0x70, 0x27}, /* 0xE8-0xEB */ + {0x53, 0x53}, {0x55, 0x44}, {0x5B, 0x85}, {0x62, 0x58}, /* 0xEC-0xEF */ + {0x62, 0x9E}, {0x62, 0xD3}, {0x6C, 0xA2}, {0x6F, 0xEF}, /* 0xF0-0xF3 */ + {0x74, 0x22}, {0x8A, 0x17}, {0x94, 0x38}, {0x6F, 0xC1}, /* 0xF4-0xF7 */ + {0x8A, 0xFE}, {0x83, 0x38}, {0x51, 0xE7}, {0x86, 0xF8}, /* 0xF8-0xFB */ + {0x53, 0xEA}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_92[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x53, 0xE9}, {0x4F, 0x46}, {0x90, 0x54}, {0x8F, 0xB0}, /* 0x40-0x43 */ + {0x59, 0x6A}, {0x81, 0x31}, {0x5D, 0xFD}, {0x7A, 0xEA}, /* 0x44-0x47 */ + {0x8F, 0xBF}, {0x68, 0xDA}, {0x8C, 0x37}, {0x72, 0xF8}, /* 0x48-0x4B */ + {0x9C, 0x48}, {0x6A, 0x3D}, {0x8A, 0xB0}, {0x4E, 0x39}, /* 0x4C-0x4F */ + {0x53, 0x58}, {0x56, 0x06}, {0x57, 0x66}, {0x62, 0xC5}, /* 0x50-0x53 */ + {0x63, 0xA2}, {0x65, 0xE6}, {0x6B, 0x4E}, {0x6D, 0xE1}, /* 0x54-0x57 */ + {0x6E, 0x5B}, {0x70, 0xAD}, {0x77, 0xED}, {0x7A, 0xEF}, /* 0x58-0x5B */ + {0x7B, 0xAA}, {0x7D, 0xBB}, {0x80, 0x3D}, {0x80, 0xC6}, /* 0x5C-0x5F */ + {0x86, 0xCB}, {0x8A, 0x95}, {0x93, 0x5B}, {0x56, 0xE3}, /* 0x60-0x63 */ + {0x58, 0xC7}, {0x5F, 0x3E}, {0x65, 0xAD}, {0x66, 0x96}, /* 0x64-0x67 */ + {0x6A, 0x80}, {0x6B, 0xB5}, {0x75, 0x37}, {0x8A, 0xC7}, /* 0x68-0x6B */ + {0x50, 0x24}, {0x77, 0xE5}, {0x57, 0x30}, {0x5F, 0x1B}, /* 0x6C-0x6F */ + {0x60, 0x65}, {0x66, 0x7A}, {0x6C, 0x60}, {0x75, 0xF4}, /* 0x70-0x73 */ + {0x7A, 0x1A}, {0x7F, 0x6E}, {0x81, 0xF4}, {0x87, 0x18}, /* 0x74-0x77 */ + {0x90, 0x45}, {0x99, 0xB3}, {0x7B, 0xC9}, {0x75, 0x5C}, /* 0x78-0x7B */ + {0x7A, 0xF9}, {0x7B, 0x51}, {0x84, 0xC4}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x90, 0x10}, {0x79, 0xE9}, {0x7A, 0x92}, {0x83, 0x36}, /* 0x80-0x83 */ + {0x5A, 0xE1}, {0x77, 0x40}, {0x4E, 0x2D}, {0x4E, 0xF2}, /* 0x84-0x87 */ + {0x5B, 0x99}, {0x5F, 0xE0}, {0x62, 0xBD}, {0x66, 0x3C}, /* 0x88-0x8B */ + {0x67, 0xF1}, {0x6C, 0xE8}, {0x86, 0x6B}, {0x88, 0x77}, /* 0x8C-0x8F */ + {0x8A, 0x3B}, {0x91, 0x4E}, {0x92, 0xF3}, {0x99, 0xD0}, /* 0x90-0x93 */ + {0x6A, 0x17}, {0x70, 0x26}, {0x73, 0x2A}, {0x82, 0xE7}, /* 0x94-0x97 */ + {0x84, 0x57}, {0x8C, 0xAF}, {0x4E, 0x01}, {0x51, 0x46}, /* 0x98-0x9B */ + {0x51, 0xCB}, {0x55, 0x8B}, {0x5B, 0xF5}, {0x5E, 0x16}, /* 0x9C-0x9F */ + {0x5E, 0x33}, {0x5E, 0x81}, {0x5F, 0x14}, {0x5F, 0x35}, /* 0xA0-0xA3 */ + {0x5F, 0x6B}, {0x5F, 0xB4}, {0x61, 0xF2}, {0x63, 0x11}, /* 0xA4-0xA7 */ + {0x66, 0xA2}, {0x67, 0x1D}, {0x6F, 0x6E}, {0x72, 0x52}, /* 0xA8-0xAB */ + {0x75, 0x3A}, {0x77, 0x3A}, {0x80, 0x74}, {0x81, 0x39}, /* 0xAC-0xAF */ + {0x81, 0x78}, {0x87, 0x76}, {0x8A, 0xBF}, {0x8A, 0xDC}, /* 0xB0-0xB3 */ + {0x8D, 0x85}, {0x8D, 0xF3}, {0x92, 0x9A}, {0x95, 0x77}, /* 0xB4-0xB7 */ + {0x98, 0x02}, {0x9C, 0xE5}, {0x52, 0xC5}, {0x63, 0x57}, /* 0xB8-0xBB */ + {0x76, 0xF4}, {0x67, 0x15}, {0x6C, 0x88}, {0x73, 0xCD}, /* 0xBC-0xBF */ + {0x8C, 0xC3}, {0x93, 0xAE}, {0x96, 0x73}, {0x6D, 0x25}, /* 0xC0-0xC3 */ + {0x58, 0x9C}, {0x69, 0x0E}, {0x69, 0xCC}, {0x8F, 0xFD}, /* 0xC4-0xC7 */ + {0x93, 0x9A}, {0x75, 0xDB}, {0x90, 0x1A}, {0x58, 0x5A}, /* 0xC8-0xCB */ + {0x68, 0x02}, {0x63, 0xB4}, {0x69, 0xFB}, {0x4F, 0x43}, /* 0xCC-0xCF */ + {0x6F, 0x2C}, {0x67, 0xD8}, {0x8F, 0xBB}, {0x85, 0x26}, /* 0xD0-0xD3 */ + {0x7D, 0xB4}, {0x93, 0x54}, {0x69, 0x3F}, {0x6F, 0x70}, /* 0xD4-0xD7 */ + {0x57, 0x6A}, {0x58, 0xF7}, {0x5B, 0x2C}, {0x7D, 0x2C}, /* 0xD8-0xDB */ + {0x72, 0x2A}, {0x54, 0x0A}, {0x91, 0xE3}, {0x9D, 0xB4}, /* 0xDC-0xDF */ + {0x4E, 0xAD}, {0x4F, 0x4E}, {0x50, 0x5C}, {0x50, 0x75}, /* 0xE0-0xE3 */ + {0x52, 0x43}, {0x8C, 0x9E}, {0x54, 0x48}, {0x58, 0x24}, /* 0xE4-0xE7 */ + {0x5B, 0x9A}, {0x5E, 0x1D}, {0x5E, 0x95}, {0x5E, 0xAD}, /* 0xE8-0xEB */ + {0x5E, 0xF7}, {0x5F, 0x1F}, {0x60, 0x8C}, {0x62, 0xB5}, /* 0xEC-0xEF */ + {0x63, 0x3A}, {0x63, 0xD0}, {0x68, 0xAF}, {0x6C, 0x40}, /* 0xF0-0xF3 */ + {0x78, 0x87}, {0x79, 0x8E}, {0x7A, 0x0B}, {0x7D, 0xE0}, /* 0xF4-0xF7 */ + {0x82, 0x47}, {0x8A, 0x02}, {0x8A, 0xE6}, {0x8E, 0x44}, /* 0xF8-0xFB */ + {0x90, 0x13}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_93[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x90, 0xB8}, {0x91, 0x2D}, {0x91, 0xD8}, {0x9F, 0x0E}, /* 0x40-0x43 */ + {0x6C, 0xE5}, {0x64, 0x58}, {0x64, 0xE2}, {0x65, 0x75}, /* 0x44-0x47 */ + {0x6E, 0xF4}, {0x76, 0x84}, {0x7B, 0x1B}, {0x90, 0x69}, /* 0x48-0x4B */ + {0x93, 0xD1}, {0x6E, 0xBA}, {0x54, 0xF2}, {0x5F, 0xB9}, /* 0x4C-0x4F */ + {0x64, 0xA4}, {0x8F, 0x4D}, {0x8F, 0xED}, {0x92, 0x44}, /* 0x50-0x53 */ + {0x51, 0x78}, {0x58, 0x6B}, {0x59, 0x29}, {0x5C, 0x55}, /* 0x54-0x57 */ + {0x5E, 0x97}, {0x6D, 0xFB}, {0x7E, 0x8F}, {0x75, 0x1C}, /* 0x58-0x5B */ + {0x8C, 0xBC}, {0x8E, 0xE2}, {0x98, 0x5B}, {0x70, 0xB9}, /* 0x5C-0x5F */ + {0x4F, 0x1D}, {0x6B, 0xBF}, {0x6F, 0xB1}, {0x75, 0x30}, /* 0x60-0x63 */ + {0x96, 0xFB}, {0x51, 0x4E}, {0x54, 0x10}, {0x58, 0x35}, /* 0x64-0x67 */ + {0x58, 0x57}, {0x59, 0xAC}, {0x5C, 0x60}, {0x5F, 0x92}, /* 0x68-0x6B */ + {0x65, 0x97}, {0x67, 0x5C}, {0x6E, 0x21}, {0x76, 0x7B}, /* 0x6C-0x6F */ + {0x83, 0xDF}, {0x8C, 0xED}, {0x90, 0x14}, {0x90, 0xFD}, /* 0x70-0x73 */ + {0x93, 0x4D}, {0x78, 0x25}, {0x78, 0x3A}, {0x52, 0xAA}, /* 0x74-0x77 */ + {0x5E, 0xA6}, {0x57, 0x1F}, {0x59, 0x74}, {0x60, 0x12}, /* 0x78-0x7B */ + {0x50, 0x12}, {0x51, 0x5A}, {0x51, 0xAC}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x51, 0xCD}, {0x52, 0x00}, {0x55, 0x10}, {0x58, 0x54}, /* 0x80-0x83 */ + {0x58, 0x58}, {0x59, 0x57}, {0x5B, 0x95}, {0x5C, 0xF6}, /* 0x84-0x87 */ + {0x5D, 0x8B}, {0x60, 0xBC}, {0x62, 0x95}, {0x64, 0x2D}, /* 0x88-0x8B */ + {0x67, 0x71}, {0x68, 0x43}, {0x68, 0xBC}, {0x68, 0xDF}, /* 0x8C-0x8F */ + {0x76, 0xD7}, {0x6D, 0xD8}, {0x6E, 0x6F}, {0x6D, 0x9B}, /* 0x90-0x93 */ + {0x70, 0x6F}, {0x71, 0xC8}, {0x5F, 0x53}, {0x75, 0xD8}, /* 0x94-0x97 */ + {0x79, 0x77}, {0x7B, 0x49}, {0x7B, 0x54}, {0x7B, 0x52}, /* 0x98-0x9B */ + {0x7C, 0xD6}, {0x7D, 0x71}, {0x52, 0x30}, {0x84, 0x63}, /* 0x9C-0x9F */ + {0x85, 0x69}, {0x85, 0xE4}, {0x8A, 0x0E}, {0x8B, 0x04}, /* 0xA0-0xA3 */ + {0x8C, 0x46}, {0x8E, 0x0F}, {0x90, 0x03}, {0x90, 0x0F}, /* 0xA4-0xA7 */ + {0x94, 0x19}, {0x96, 0x76}, {0x98, 0x2D}, {0x9A, 0x30}, /* 0xA8-0xAB */ + {0x95, 0xD8}, {0x50, 0xCD}, {0x52, 0xD5}, {0x54, 0x0C}, /* 0xAC-0xAF */ + {0x58, 0x02}, {0x5C, 0x0E}, {0x61, 0xA7}, {0x64, 0x9E}, /* 0xB0-0xB3 */ + {0x6D, 0x1E}, {0x77, 0xB3}, {0x7A, 0xE5}, {0x80, 0xF4}, /* 0xB4-0xB7 */ + {0x84, 0x04}, {0x90, 0x53}, {0x92, 0x85}, {0x5C, 0xE0}, /* 0xB8-0xBB */ + {0x9D, 0x07}, {0x53, 0x3F}, {0x5F, 0x97}, {0x5F, 0xB3}, /* 0xBC-0xBF */ + {0x6D, 0x9C}, {0x72, 0x79}, {0x77, 0x63}, {0x79, 0xBF}, /* 0xC0-0xC3 */ + {0x7B, 0xE4}, {0x6B, 0xD2}, {0x72, 0xEC}, {0x8A, 0xAD}, /* 0xC4-0xC7 */ + {0x68, 0x03}, {0x6A, 0x61}, {0x51, 0xF8}, {0x7A, 0x81}, /* 0xC8-0xCB */ + {0x69, 0x34}, {0x5C, 0x4A}, {0x9C, 0xF6}, {0x82, 0xEB}, /* 0xCC-0xCF */ + {0x5B, 0xC5}, {0x91, 0x49}, {0x70, 0x1E}, {0x56, 0x78}, /* 0xD0-0xD3 */ + {0x5C, 0x6F}, {0x60, 0xC7}, {0x65, 0x66}, {0x6C, 0x8C}, /* 0xD4-0xD7 */ + {0x8C, 0x5A}, {0x90, 0x41}, {0x98, 0x13}, {0x54, 0x51}, /* 0xD8-0xDB */ + {0x66, 0xC7}, {0x92, 0x0D}, {0x59, 0x48}, {0x90, 0xA3}, /* 0xDC-0xDF */ + {0x51, 0x85}, {0x4E, 0x4D}, {0x51, 0xEA}, {0x85, 0x99}, /* 0xE0-0xE3 */ + {0x8B, 0x0E}, {0x70, 0x58}, {0x63, 0x7A}, {0x93, 0x4B}, /* 0xE4-0xE7 */ + {0x69, 0x62}, {0x99, 0xB4}, {0x7E, 0x04}, {0x75, 0x77}, /* 0xE8-0xEB */ + {0x53, 0x57}, {0x69, 0x60}, {0x8E, 0xDF}, {0x96, 0xE3}, /* 0xEC-0xEF */ + {0x6C, 0x5D}, {0x4E, 0x8C}, {0x5C, 0x3C}, {0x5F, 0x10}, /* 0xF0-0xF3 */ + {0x8F, 0xE9}, {0x53, 0x02}, {0x8C, 0xD1}, {0x80, 0x89}, /* 0xF4-0xF7 */ + {0x86, 0x79}, {0x5E, 0xFF}, {0x65, 0xE5}, {0x4E, 0x73}, /* 0xF8-0xFB */ + {0x51, 0x65}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_94[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x59, 0x82}, {0x5C, 0x3F}, {0x97, 0xEE}, {0x4E, 0xFB}, /* 0x40-0x43 */ + {0x59, 0x8A}, {0x5F, 0xCD}, {0x8A, 0x8D}, {0x6F, 0xE1}, /* 0x44-0x47 */ + {0x79, 0xB0}, {0x79, 0x62}, {0x5B, 0xE7}, {0x84, 0x71}, /* 0x48-0x4B */ + {0x73, 0x2B}, {0x71, 0xB1}, {0x5E, 0x74}, {0x5F, 0xF5}, /* 0x4C-0x4F */ + {0x63, 0x7B}, {0x64, 0x9A}, {0x71, 0xC3}, {0x7C, 0x98}, /* 0x50-0x53 */ + {0x4E, 0x43}, {0x5E, 0xFC}, {0x4E, 0x4B}, {0x57, 0xDC}, /* 0x54-0x57 */ + {0x56, 0xA2}, {0x60, 0xA9}, {0x6F, 0xC3}, {0x7D, 0x0D}, /* 0x58-0x5B */ + {0x80, 0xFD}, {0x81, 0x33}, {0x81, 0xBF}, {0x8F, 0xB2}, /* 0x5C-0x5F */ + {0x89, 0x97}, {0x86, 0xA4}, {0x5D, 0xF4}, {0x62, 0x8A}, /* 0x60-0x63 */ + {0x64, 0xAD}, {0x89, 0x87}, {0x67, 0x77}, {0x6C, 0xE2}, /* 0x64-0x67 */ + {0x6D, 0x3E}, {0x74, 0x36}, {0x78, 0x34}, {0x5A, 0x46}, /* 0x68-0x6B */ + {0x7F, 0x75}, {0x82, 0xAD}, {0x99, 0xAC}, {0x4F, 0xF3}, /* 0x6C-0x6F */ + {0x5E, 0xC3}, {0x62, 0xDD}, {0x63, 0x92}, {0x65, 0x57}, /* 0x70-0x73 */ + {0x67, 0x6F}, {0x76, 0xC3}, {0x72, 0x4C}, {0x80, 0xCC}, /* 0x74-0x77 */ + {0x80, 0xBA}, {0x8F, 0x29}, {0x91, 0x4D}, {0x50, 0x0D}, /* 0x78-0x7B */ + {0x57, 0xF9}, {0x5A, 0x92}, {0x68, 0x85}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x69, 0x73}, {0x71, 0x64}, {0x72, 0xFD}, {0x8C, 0xB7}, /* 0x80-0x83 */ + {0x58, 0xF2}, {0x8C, 0xE0}, {0x96, 0x6A}, {0x90, 0x19}, /* 0x84-0x87 */ + {0x87, 0x7F}, {0x79, 0xE4}, {0x77, 0xE7}, {0x84, 0x29}, /* 0x88-0x8B */ + {0x4F, 0x2F}, {0x52, 0x65}, {0x53, 0x5A}, {0x62, 0xCD}, /* 0x8C-0x8F */ + {0x67, 0xCF}, {0x6C, 0xCA}, {0x76, 0x7D}, {0x7B, 0x94}, /* 0x90-0x93 */ + {0x7C, 0x95}, {0x82, 0x36}, {0x85, 0x84}, {0x8F, 0xEB}, /* 0x94-0x97 */ + {0x66, 0xDD}, {0x6F, 0x20}, {0x72, 0x06}, {0x7E, 0x1B}, /* 0x98-0x9B */ + {0x83, 0xAB}, {0x99, 0xC1}, {0x9E, 0xA6}, {0x51, 0xFD}, /* 0x9C-0x9F */ + {0x7B, 0xB1}, {0x78, 0x72}, {0x7B, 0xB8}, {0x80, 0x87}, /* 0xA0-0xA3 */ + {0x7B, 0x48}, {0x6A, 0xE8}, {0x5E, 0x61}, {0x80, 0x8C}, /* 0xA4-0xA7 */ + {0x75, 0x51}, {0x75, 0x60}, {0x51, 0x6B}, {0x92, 0x62}, /* 0xA8-0xAB */ + {0x6E, 0x8C}, {0x76, 0x7A}, {0x91, 0x97}, {0x9A, 0xEA}, /* 0xAC-0xAF */ + {0x4F, 0x10}, {0x7F, 0x70}, {0x62, 0x9C}, {0x7B, 0x4F}, /* 0xB0-0xB3 */ + {0x95, 0xA5}, {0x9C, 0xE9}, {0x56, 0x7A}, {0x58, 0x59}, /* 0xB4-0xB7 */ + {0x86, 0xE4}, {0x96, 0xBC}, {0x4F, 0x34}, {0x52, 0x24}, /* 0xB8-0xBB */ + {0x53, 0x4A}, {0x53, 0xCD}, {0x53, 0xDB}, {0x5E, 0x06}, /* 0xBC-0xBF */ + {0x64, 0x2C}, {0x65, 0x91}, {0x67, 0x7F}, {0x6C, 0x3E}, /* 0xC0-0xC3 */ + {0x6C, 0x4E}, {0x72, 0x48}, {0x72, 0xAF}, {0x73, 0xED}, /* 0xC4-0xC7 */ + {0x75, 0x54}, {0x7E, 0x41}, {0x82, 0x2C}, {0x85, 0xE9}, /* 0xC8-0xCB */ + {0x8C, 0xA9}, {0x7B, 0xC4}, {0x91, 0xC6}, {0x71, 0x69}, /* 0xCC-0xCF */ + {0x98, 0x12}, {0x98, 0xEF}, {0x63, 0x3D}, {0x66, 0x69}, /* 0xD0-0xD3 */ + {0x75, 0x6A}, {0x76, 0xE4}, {0x78, 0xD0}, {0x85, 0x43}, /* 0xD4-0xD7 */ + {0x86, 0xEE}, {0x53, 0x2A}, {0x53, 0x51}, {0x54, 0x26}, /* 0xD8-0xDB */ + {0x59, 0x83}, {0x5E, 0x87}, {0x5F, 0x7C}, {0x60, 0xB2}, /* 0xDC-0xDF */ + {0x62, 0x49}, {0x62, 0x79}, {0x62, 0xAB}, {0x65, 0x90}, /* 0xE0-0xE3 */ + {0x6B, 0xD4}, {0x6C, 0xCC}, {0x75, 0xB2}, {0x76, 0xAE}, /* 0xE4-0xE7 */ + {0x78, 0x91}, {0x79, 0xD8}, {0x7D, 0xCB}, {0x7F, 0x77}, /* 0xE8-0xEB */ + {0x80, 0xA5}, {0x88, 0xAB}, {0x8A, 0xB9}, {0x8C, 0xBB}, /* 0xEC-0xEF */ + {0x90, 0x7F}, {0x97, 0x5E}, {0x98, 0xDB}, {0x6A, 0x0B}, /* 0xF0-0xF3 */ + {0x7C, 0x38}, {0x50, 0x99}, {0x5C, 0x3E}, {0x5F, 0xAE}, /* 0xF4-0xF7 */ + {0x67, 0x87}, {0x6B, 0xD8}, {0x74, 0x35}, {0x77, 0x09}, /* 0xF8-0xFB */ + {0x7F, 0x8E}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_95[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9F, 0x3B}, {0x67, 0xCA}, {0x7A, 0x17}, {0x53, 0x39}, /* 0x40-0x43 */ + {0x75, 0x8B}, {0x9A, 0xED}, {0x5F, 0x66}, {0x81, 0x9D}, /* 0x44-0x47 */ + {0x83, 0xF1}, {0x80, 0x98}, {0x5F, 0x3C}, {0x5F, 0xC5}, /* 0x48-0x4B */ + {0x75, 0x62}, {0x7B, 0x46}, {0x90, 0x3C}, {0x68, 0x67}, /* 0x4C-0x4F */ + {0x59, 0xEB}, {0x5A, 0x9B}, {0x7D, 0x10}, {0x76, 0x7E}, /* 0x50-0x53 */ + {0x8B, 0x2C}, {0x4F, 0xF5}, {0x5F, 0x6A}, {0x6A, 0x19}, /* 0x54-0x57 */ + {0x6C, 0x37}, {0x6F, 0x02}, {0x74, 0xE2}, {0x79, 0x68}, /* 0x58-0x5B */ + {0x88, 0x68}, {0x8A, 0x55}, {0x8C, 0x79}, {0x5E, 0xDF}, /* 0x5C-0x5F */ + {0x63, 0xCF}, {0x75, 0xC5}, {0x79, 0xD2}, {0x82, 0xD7}, /* 0x60-0x63 */ + {0x93, 0x28}, {0x92, 0xF2}, {0x84, 0x9C}, {0x86, 0xED}, /* 0x64-0x67 */ + {0x9C, 0x2D}, {0x54, 0xC1}, {0x5F, 0x6C}, {0x65, 0x8C}, /* 0x68-0x6B */ + {0x6D, 0x5C}, {0x70, 0x15}, {0x8C, 0xA7}, {0x8C, 0xD3}, /* 0x6C-0x6F */ + {0x98, 0x3B}, {0x65, 0x4F}, {0x74, 0xF6}, {0x4E, 0x0D}, /* 0x70-0x73 */ + {0x4E, 0xD8}, {0x57, 0xE0}, {0x59, 0x2B}, {0x5A, 0x66}, /* 0x74-0x77 */ + {0x5B, 0xCC}, {0x51, 0xA8}, {0x5E, 0x03}, {0x5E, 0x9C}, /* 0x78-0x7B */ + {0x60, 0x16}, {0x62, 0x76}, {0x65, 0x77}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x65, 0xA7}, {0x66, 0x6E}, {0x6D, 0x6E}, {0x72, 0x36}, /* 0x80-0x83 */ + {0x7B, 0x26}, {0x81, 0x50}, {0x81, 0x9A}, {0x82, 0x99}, /* 0x84-0x87 */ + {0x8B, 0x5C}, {0x8C, 0xA0}, {0x8C, 0xE6}, {0x8D, 0x74}, /* 0x88-0x8B */ + {0x96, 0x1C}, {0x96, 0x44}, {0x4F, 0xAE}, {0x64, 0xAB}, /* 0x8C-0x8F */ + {0x6B, 0x66}, {0x82, 0x1E}, {0x84, 0x61}, {0x85, 0x6A}, /* 0x90-0x93 */ + {0x90, 0xE8}, {0x5C, 0x01}, {0x69, 0x53}, {0x98, 0xA8}, /* 0x94-0x97 */ + {0x84, 0x7A}, {0x85, 0x57}, {0x4F, 0x0F}, {0x52, 0x6F}, /* 0x98-0x9B */ + {0x5F, 0xA9}, {0x5E, 0x45}, {0x67, 0x0D}, {0x79, 0x8F}, /* 0x9C-0x9F */ + {0x81, 0x79}, {0x89, 0x07}, {0x89, 0x86}, {0x6D, 0xF5}, /* 0xA0-0xA3 */ + {0x5F, 0x17}, {0x62, 0x55}, {0x6C, 0xB8}, {0x4E, 0xCF}, /* 0xA4-0xA7 */ + {0x72, 0x69}, {0x9B, 0x92}, {0x52, 0x06}, {0x54, 0x3B}, /* 0xA8-0xAB */ + {0x56, 0x74}, {0x58, 0xB3}, {0x61, 0xA4}, {0x62, 0x6E}, /* 0xAC-0xAF */ + {0x71, 0x1A}, {0x59, 0x6E}, {0x7C, 0x89}, {0x7C, 0xDE}, /* 0xB0-0xB3 */ + {0x7D, 0x1B}, {0x96, 0xF0}, {0x65, 0x87}, {0x80, 0x5E}, /* 0xB4-0xB7 */ + {0x4E, 0x19}, {0x4F, 0x75}, {0x51, 0x75}, {0x58, 0x40}, /* 0xB8-0xBB */ + {0x5E, 0x63}, {0x5E, 0x73}, {0x5F, 0x0A}, {0x67, 0xC4}, /* 0xBC-0xBF */ + {0x4E, 0x26}, {0x85, 0x3D}, {0x95, 0x89}, {0x96, 0x5B}, /* 0xC0-0xC3 */ + {0x7C, 0x73}, {0x98, 0x01}, {0x50, 0xFB}, {0x58, 0xC1}, /* 0xC4-0xC7 */ + {0x76, 0x56}, {0x78, 0xA7}, {0x52, 0x25}, {0x77, 0xA5}, /* 0xC8-0xCB */ + {0x85, 0x11}, {0x7B, 0x86}, {0x50, 0x4F}, {0x59, 0x09}, /* 0xCC-0xCF */ + {0x72, 0x47}, {0x7B, 0xC7}, {0x7D, 0xE8}, {0x8F, 0xBA}, /* 0xD0-0xD3 */ + {0x8F, 0xD4}, {0x90, 0x4D}, {0x4F, 0xBF}, {0x52, 0xC9}, /* 0xD4-0xD7 */ + {0x5A, 0x29}, {0x5F, 0x01}, {0x97, 0xAD}, {0x4F, 0xDD}, /* 0xD8-0xDB */ + {0x82, 0x17}, {0x92, 0xEA}, {0x57, 0x03}, {0x63, 0x55}, /* 0xDC-0xDF */ + {0x6B, 0x69}, {0x75, 0x2B}, {0x88, 0xDC}, {0x8F, 0x14}, /* 0xE0-0xE3 */ + {0x7A, 0x42}, {0x52, 0xDF}, {0x58, 0x93}, {0x61, 0x55}, /* 0xE4-0xE7 */ + {0x62, 0x0A}, {0x66, 0xAE}, {0x6B, 0xCD}, {0x7C, 0x3F}, /* 0xE8-0xEB */ + {0x83, 0xE9}, {0x50, 0x23}, {0x4F, 0xF8}, {0x53, 0x05}, /* 0xEC-0xEF */ + {0x54, 0x46}, {0x58, 0x31}, {0x59, 0x49}, {0x5B, 0x9D}, /* 0xF0-0xF3 */ + {0x5C, 0xF0}, {0x5C, 0xEF}, {0x5D, 0x29}, {0x5E, 0x96}, /* 0xF4-0xF7 */ + {0x62, 0xB1}, {0x63, 0x67}, {0x65, 0x3E}, {0x65, 0xB9}, /* 0xF8-0xFB */ + {0x67, 0x0B}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_96[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6C, 0xD5}, {0x6C, 0xE1}, {0x70, 0xF9}, {0x78, 0x32}, /* 0x40-0x43 */ + {0x7E, 0x2B}, {0x80, 0xDE}, {0x82, 0xB3}, {0x84, 0x0C}, /* 0x44-0x47 */ + {0x84, 0xEC}, {0x87, 0x02}, {0x89, 0x12}, {0x8A, 0x2A}, /* 0x48-0x4B */ + {0x8C, 0x4A}, {0x90, 0xA6}, {0x92, 0xD2}, {0x98, 0xFD}, /* 0x4C-0x4F */ + {0x9C, 0xF3}, {0x9D, 0x6C}, {0x4E, 0x4F}, {0x4E, 0xA1}, /* 0x50-0x53 */ + {0x50, 0x8D}, {0x52, 0x56}, {0x57, 0x4A}, {0x59, 0xA8}, /* 0x54-0x57 */ + {0x5E, 0x3D}, {0x5F, 0xD8}, {0x5F, 0xD9}, {0x62, 0x3F}, /* 0x58-0x5B */ + {0x66, 0xB4}, {0x67, 0x1B}, {0x67, 0xD0}, {0x68, 0xD2}, /* 0x5C-0x5F */ + {0x51, 0x92}, {0x7D, 0x21}, {0x80, 0xAA}, {0x81, 0xA8}, /* 0x60-0x63 */ + {0x8B, 0x00}, {0x8C, 0x8C}, {0x8C, 0xBF}, {0x92, 0x7E}, /* 0x64-0x67 */ + {0x96, 0x32}, {0x54, 0x20}, {0x98, 0x2C}, {0x53, 0x17}, /* 0x68-0x6B */ + {0x50, 0xD5}, {0x53, 0x5C}, {0x58, 0xA8}, {0x64, 0xB2}, /* 0x6C-0x6F */ + {0x67, 0x34}, {0x72, 0x67}, {0x77, 0x66}, {0x7A, 0x46}, /* 0x70-0x73 */ + {0x91, 0xE6}, {0x52, 0xC3}, {0x6C, 0xA1}, {0x6B, 0x86}, /* 0x74-0x77 */ + {0x58, 0x00}, {0x5E, 0x4C}, {0x59, 0x54}, {0x67, 0x2C}, /* 0x78-0x7B */ + {0x7F, 0xFB}, {0x51, 0xE1}, {0x76, 0xC6}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x64, 0x69}, {0x78, 0xE8}, {0x9B, 0x54}, {0x9E, 0xBB}, /* 0x80-0x83 */ + {0x57, 0xCB}, {0x59, 0xB9}, {0x66, 0x27}, {0x67, 0x9A}, /* 0x84-0x87 */ + {0x6B, 0xCE}, {0x54, 0xE9}, {0x69, 0xD9}, {0x5E, 0x55}, /* 0x88-0x8B */ + {0x81, 0x9C}, {0x67, 0x95}, {0x9B, 0xAA}, {0x67, 0xFE}, /* 0x8C-0x8F */ + {0x9C, 0x52}, {0x68, 0x5D}, {0x4E, 0xA6}, {0x4F, 0xE3}, /* 0x90-0x93 */ + {0x53, 0xC8}, {0x62, 0xB9}, {0x67, 0x2B}, {0x6C, 0xAB}, /* 0x94-0x97 */ + {0x8F, 0xC4}, {0x4F, 0xAD}, {0x7E, 0x6D}, {0x9E, 0xBF}, /* 0x98-0x9B */ + {0x4E, 0x07}, {0x61, 0x62}, {0x6E, 0x80}, {0x6F, 0x2B}, /* 0x9C-0x9F */ + {0x85, 0x13}, {0x54, 0x73}, {0x67, 0x2A}, {0x9B, 0x45}, /* 0xA0-0xA3 */ + {0x5D, 0xF3}, {0x7B, 0x95}, {0x5C, 0xAC}, {0x5B, 0xC6}, /* 0xA4-0xA7 */ + {0x87, 0x1C}, {0x6E, 0x4A}, {0x84, 0xD1}, {0x7A, 0x14}, /* 0xA8-0xAB */ + {0x81, 0x08}, {0x59, 0x99}, {0x7C, 0x8D}, {0x6C, 0x11}, /* 0xAC-0xAF */ + {0x77, 0x20}, {0x52, 0xD9}, {0x59, 0x22}, {0x71, 0x21}, /* 0xB0-0xB3 */ + {0x72, 0x5F}, {0x77, 0xDB}, {0x97, 0x27}, {0x9D, 0x61}, /* 0xB4-0xB7 */ + {0x69, 0x0B}, {0x5A, 0x7F}, {0x5A, 0x18}, {0x51, 0xA5}, /* 0xB8-0xBB */ + {0x54, 0x0D}, {0x54, 0x7D}, {0x66, 0x0E}, {0x76, 0xDF}, /* 0xBC-0xBF */ + {0x8F, 0xF7}, {0x92, 0x98}, {0x9C, 0xF4}, {0x59, 0xEA}, /* 0xC0-0xC3 */ + {0x72, 0x5D}, {0x6E, 0xC5}, {0x51, 0x4D}, {0x68, 0xC9}, /* 0xC4-0xC7 */ + {0x7D, 0xBF}, {0x7D, 0xEC}, {0x97, 0x62}, {0x9E, 0xBA}, /* 0xC8-0xCB */ + {0x64, 0x78}, {0x6A, 0x21}, {0x83, 0x02}, {0x59, 0x84}, /* 0xCC-0xCF */ + {0x5B, 0x5F}, {0x6B, 0xDB}, {0x73, 0x1B}, {0x76, 0xF2}, /* 0xD0-0xD3 */ + {0x7D, 0xB2}, {0x80, 0x17}, {0x84, 0x99}, {0x51, 0x32}, /* 0xD4-0xD7 */ + {0x67, 0x28}, {0x9E, 0xD9}, {0x76, 0xEE}, {0x67, 0x62}, /* 0xD8-0xDB */ + {0x52, 0xFF}, {0x99, 0x05}, {0x5C, 0x24}, {0x62, 0x3B}, /* 0xDC-0xDF */ + {0x7C, 0x7E}, {0x8C, 0xB0}, {0x55, 0x4F}, {0x60, 0xB6}, /* 0xE0-0xE3 */ + {0x7D, 0x0B}, {0x95, 0x80}, {0x53, 0x01}, {0x4E, 0x5F}, /* 0xE4-0xE7 */ + {0x51, 0xB6}, {0x59, 0x1C}, {0x72, 0x3A}, {0x80, 0x36}, /* 0xE8-0xEB */ + {0x91, 0xCE}, {0x5F, 0x25}, {0x77, 0xE2}, {0x53, 0x84}, /* 0xEC-0xEF */ + {0x5F, 0x79}, {0x7D, 0x04}, {0x85, 0xAC}, {0x8A, 0x33}, /* 0xF0-0xF3 */ + {0x8E, 0x8D}, {0x97, 0x56}, {0x67, 0xF3}, {0x85, 0xAE}, /* 0xF4-0xF7 */ + {0x94, 0x53}, {0x61, 0x09}, {0x61, 0x08}, {0x6C, 0xB9}, /* 0xF8-0xFB */ + {0x76, 0x52}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_97[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8A, 0xED}, {0x8F, 0x38}, {0x55, 0x2F}, {0x4F, 0x51}, /* 0x40-0x43 */ + {0x51, 0x2A}, {0x52, 0xC7}, {0x53, 0xCB}, {0x5B, 0xA5}, /* 0x44-0x47 */ + {0x5E, 0x7D}, {0x60, 0xA0}, {0x61, 0x82}, {0x63, 0xD6}, /* 0x48-0x4B */ + {0x67, 0x09}, {0x67, 0xDA}, {0x6E, 0x67}, {0x6D, 0x8C}, /* 0x4C-0x4F */ + {0x73, 0x36}, {0x73, 0x37}, {0x75, 0x31}, {0x79, 0x50}, /* 0x50-0x53 */ + {0x88, 0xD5}, {0x8A, 0x98}, {0x90, 0x4A}, {0x90, 0x91}, /* 0x54-0x57 */ + {0x90, 0xF5}, {0x96, 0xC4}, {0x87, 0x8D}, {0x59, 0x15}, /* 0x58-0x5B */ + {0x4E, 0x88}, {0x4F, 0x59}, {0x4E, 0x0E}, {0x8A, 0x89}, /* 0x5C-0x5F */ + {0x8F, 0x3F}, {0x98, 0x10}, {0x50, 0xAD}, {0x5E, 0x7C}, /* 0x60-0x63 */ + {0x59, 0x96}, {0x5B, 0xB9}, {0x5E, 0xB8}, {0x63, 0xDA}, /* 0x64-0x67 */ + {0x63, 0xFA}, {0x64, 0xC1}, {0x66, 0xDC}, {0x69, 0x4A}, /* 0x68-0x6B */ + {0x69, 0xD8}, {0x6D, 0x0B}, {0x6E, 0xB6}, {0x71, 0x94}, /* 0x6C-0x6F */ + {0x75, 0x28}, {0x7A, 0xAF}, {0x7F, 0x8A}, {0x80, 0x00}, /* 0x70-0x73 */ + {0x84, 0x49}, {0x84, 0xC9}, {0x89, 0x81}, {0x8B, 0x21}, /* 0x74-0x77 */ + {0x8E, 0x0A}, {0x90, 0x65}, {0x96, 0x7D}, {0x99, 0x0A}, /* 0x78-0x7B */ + {0x61, 0x7E}, {0x62, 0x91}, {0x6B, 0x32}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6C, 0x83}, {0x6D, 0x74}, {0x7F, 0xCC}, {0x7F, 0xFC}, /* 0x80-0x83 */ + {0x6D, 0xC0}, {0x7F, 0x85}, {0x87, 0xBA}, {0x88, 0xF8}, /* 0x84-0x87 */ + {0x67, 0x65}, {0x83, 0xB1}, {0x98, 0x3C}, {0x96, 0xF7}, /* 0x88-0x8B */ + {0x6D, 0x1B}, {0x7D, 0x61}, {0x84, 0x3D}, {0x91, 0x6A}, /* 0x8C-0x8F */ + {0x4E, 0x71}, {0x53, 0x75}, {0x5D, 0x50}, {0x6B, 0x04}, /* 0x90-0x93 */ + {0x6F, 0xEB}, {0x85, 0xCD}, {0x86, 0x2D}, {0x89, 0xA7}, /* 0x94-0x97 */ + {0x52, 0x29}, {0x54, 0x0F}, {0x5C, 0x65}, {0x67, 0x4E}, /* 0x98-0x9B */ + {0x68, 0xA8}, {0x74, 0x06}, {0x74, 0x83}, {0x75, 0xE2}, /* 0x9C-0x9F */ + {0x88, 0xCF}, {0x88, 0xE1}, {0x91, 0xCC}, {0x96, 0xE2}, /* 0xA0-0xA3 */ + {0x96, 0x78}, {0x5F, 0x8B}, {0x73, 0x87}, {0x7A, 0xCB}, /* 0xA4-0xA7 */ + {0x84, 0x4E}, {0x63, 0xA0}, {0x75, 0x65}, {0x52, 0x89}, /* 0xA8-0xAB */ + {0x6D, 0x41}, {0x6E, 0x9C}, {0x74, 0x09}, {0x75, 0x59}, /* 0xAC-0xAF */ + {0x78, 0x6B}, {0x7C, 0x92}, {0x96, 0x86}, {0x7A, 0xDC}, /* 0xB0-0xB3 */ + {0x9F, 0x8D}, {0x4F, 0xB6}, {0x61, 0x6E}, {0x65, 0xC5}, /* 0xB4-0xB7 */ + {0x86, 0x5C}, {0x4E, 0x86}, {0x4E, 0xAE}, {0x50, 0xDA}, /* 0xB8-0xBB */ + {0x4E, 0x21}, {0x51, 0xCC}, {0x5B, 0xEE}, {0x65, 0x99}, /* 0xBC-0xBF */ + {0x68, 0x81}, {0x6D, 0xBC}, {0x73, 0x1F}, {0x76, 0x42}, /* 0xC0-0xC3 */ + {0x77, 0xAD}, {0x7A, 0x1C}, {0x7C, 0xE7}, {0x82, 0x6F}, /* 0xC4-0xC7 */ + {0x8A, 0xD2}, {0x90, 0x7C}, {0x91, 0xCF}, {0x96, 0x75}, /* 0xC8-0xCB */ + {0x98, 0x18}, {0x52, 0x9B}, {0x7D, 0xD1}, {0x50, 0x2B}, /* 0xCC-0xCF */ + {0x53, 0x98}, {0x67, 0x97}, {0x6D, 0xCB}, {0x71, 0xD0}, /* 0xD0-0xD3 */ + {0x74, 0x33}, {0x81, 0xE8}, {0x8F, 0x2A}, {0x96, 0xA3}, /* 0xD4-0xD7 */ + {0x9C, 0x57}, {0x9E, 0x9F}, {0x74, 0x60}, {0x58, 0x41}, /* 0xD8-0xDB */ + {0x6D, 0x99}, {0x7D, 0x2F}, {0x98, 0x5E}, {0x4E, 0xE4}, /* 0xDC-0xDF */ + {0x4F, 0x36}, {0x4F, 0x8B}, {0x51, 0xB7}, {0x52, 0xB1}, /* 0xE0-0xE3 */ + {0x5D, 0xBA}, {0x60, 0x1C}, {0x73, 0xB2}, {0x79, 0x3C}, /* 0xE4-0xE7 */ + {0x82, 0xD3}, {0x92, 0x34}, {0x96, 0xB7}, {0x96, 0xF6}, /* 0xE8-0xEB */ + {0x97, 0x0A}, {0x9E, 0x97}, {0x9F, 0x62}, {0x66, 0xA6}, /* 0xEC-0xEF */ + {0x6B, 0x74}, {0x52, 0x17}, {0x52, 0xA3}, {0x70, 0xC8}, /* 0xF0-0xF3 */ + {0x88, 0xC2}, {0x5E, 0xC9}, {0x60, 0x4B}, {0x61, 0x90}, /* 0xF4-0xF7 */ + {0x6F, 0x23}, {0x71, 0x49}, {0x7C, 0x3E}, {0x7D, 0xF4}, /* 0xF8-0xFB */ + {0x80, 0x6F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_98[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x84, 0xEE}, {0x90, 0x23}, {0x93, 0x2C}, {0x54, 0x42}, /* 0x40-0x43 */ + {0x9B, 0x6F}, {0x6A, 0xD3}, {0x70, 0x89}, {0x8C, 0xC2}, /* 0x44-0x47 */ + {0x8D, 0xEF}, {0x97, 0x32}, {0x52, 0xB4}, {0x5A, 0x41}, /* 0x48-0x4B */ + {0x5E, 0xCA}, {0x5F, 0x04}, {0x67, 0x17}, {0x69, 0x7C}, /* 0x4C-0x4F */ + {0x69, 0x94}, {0x6D, 0x6A}, {0x6F, 0x0F}, {0x72, 0x62}, /* 0x50-0x53 */ + {0x72, 0xFC}, {0x7B, 0xED}, {0x80, 0x01}, {0x80, 0x7E}, /* 0x54-0x57 */ + {0x87, 0x4B}, {0x90, 0xCE}, {0x51, 0x6D}, {0x9E, 0x93}, /* 0x58-0x5B */ + {0x79, 0x84}, {0x80, 0x8B}, {0x93, 0x32}, {0x8A, 0xD6}, /* 0x5C-0x5F */ + {0x50, 0x2D}, {0x54, 0x8C}, {0x8A, 0x71}, {0x6B, 0x6A}, /* 0x60-0x63 */ + {0x8C, 0xC4}, {0x81, 0x07}, {0x60, 0xD1}, {0x67, 0xA0}, /* 0x64-0x67 */ + {0x9D, 0xF2}, {0x4E, 0x99}, {0x4E, 0x98}, {0x9C, 0x10}, /* 0x68-0x6B */ + {0x8A, 0x6B}, {0x85, 0xC1}, {0x85, 0x68}, {0x69, 0x00}, /* 0x6C-0x6F */ + {0x6E, 0x7E}, {0x78, 0x97}, {0x81, 0x55}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x5F, 0x0C}, /* 0x9C-0x9F */ + {0x4E, 0x10}, {0x4E, 0x15}, {0x4E, 0x2A}, {0x4E, 0x31}, /* 0xA0-0xA3 */ + {0x4E, 0x36}, {0x4E, 0x3C}, {0x4E, 0x3F}, {0x4E, 0x42}, /* 0xA4-0xA7 */ + {0x4E, 0x56}, {0x4E, 0x58}, {0x4E, 0x82}, {0x4E, 0x85}, /* 0xA8-0xAB */ + {0x8C, 0x6B}, {0x4E, 0x8A}, {0x82, 0x12}, {0x5F, 0x0D}, /* 0xAC-0xAF */ + {0x4E, 0x8E}, {0x4E, 0x9E}, {0x4E, 0x9F}, {0x4E, 0xA0}, /* 0xB0-0xB3 */ + {0x4E, 0xA2}, {0x4E, 0xB0}, {0x4E, 0xB3}, {0x4E, 0xB6}, /* 0xB4-0xB7 */ + {0x4E, 0xCE}, {0x4E, 0xCD}, {0x4E, 0xC4}, {0x4E, 0xC6}, /* 0xB8-0xBB */ + {0x4E, 0xC2}, {0x4E, 0xD7}, {0x4E, 0xDE}, {0x4E, 0xED}, /* 0xBC-0xBF */ + {0x4E, 0xDF}, {0x4E, 0xF7}, {0x4F, 0x09}, {0x4F, 0x5A}, /* 0xC0-0xC3 */ + {0x4F, 0x30}, {0x4F, 0x5B}, {0x4F, 0x5D}, {0x4F, 0x57}, /* 0xC4-0xC7 */ + {0x4F, 0x47}, {0x4F, 0x76}, {0x4F, 0x88}, {0x4F, 0x8F}, /* 0xC8-0xCB */ + {0x4F, 0x98}, {0x4F, 0x7B}, {0x4F, 0x69}, {0x4F, 0x70}, /* 0xCC-0xCF */ + {0x4F, 0x91}, {0x4F, 0x6F}, {0x4F, 0x86}, {0x4F, 0x96}, /* 0xD0-0xD3 */ + {0x51, 0x18}, {0x4F, 0xD4}, {0x4F, 0xDF}, {0x4F, 0xCE}, /* 0xD4-0xD7 */ + {0x4F, 0xD8}, {0x4F, 0xDB}, {0x4F, 0xD1}, {0x4F, 0xDA}, /* 0xD8-0xDB */ + {0x4F, 0xD0}, {0x4F, 0xE4}, {0x4F, 0xE5}, {0x50, 0x1A}, /* 0xDC-0xDF */ + {0x50, 0x28}, {0x50, 0x14}, {0x50, 0x2A}, {0x50, 0x25}, /* 0xE0-0xE3 */ + {0x50, 0x05}, {0x4F, 0x1C}, {0x4F, 0xF6}, {0x50, 0x21}, /* 0xE4-0xE7 */ + {0x50, 0x29}, {0x50, 0x2C}, {0x4F, 0xFE}, {0x4F, 0xEF}, /* 0xE8-0xEB */ + {0x50, 0x11}, {0x50, 0x06}, {0x50, 0x43}, {0x50, 0x47}, /* 0xEC-0xEF */ + {0x67, 0x03}, {0x50, 0x55}, {0x50, 0x50}, {0x50, 0x48}, /* 0xF0-0xF3 */ + {0x50, 0x5A}, {0x50, 0x56}, {0x50, 0x6C}, {0x50, 0x78}, /* 0xF4-0xF7 */ + {0x50, 0x80}, {0x50, 0x9A}, {0x50, 0x85}, {0x50, 0xB4}, /* 0xF8-0xFB */ + {0x50, 0xB2}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_99[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x50, 0xC9}, {0x50, 0xCA}, {0x50, 0xB3}, {0x50, 0xC2}, /* 0x40-0x43 */ + {0x50, 0xD6}, {0x50, 0xDE}, {0x50, 0xE5}, {0x50, 0xED}, /* 0x44-0x47 */ + {0x50, 0xE3}, {0x50, 0xEE}, {0x50, 0xF9}, {0x50, 0xF5}, /* 0x48-0x4B */ + {0x51, 0x09}, {0x51, 0x01}, {0x51, 0x02}, {0x51, 0x16}, /* 0x4C-0x4F */ + {0x51, 0x15}, {0x51, 0x14}, {0x51, 0x1A}, {0x51, 0x21}, /* 0x50-0x53 */ + {0x51, 0x3A}, {0x51, 0x37}, {0x51, 0x3C}, {0x51, 0x3B}, /* 0x54-0x57 */ + {0x51, 0x3F}, {0x51, 0x40}, {0x51, 0x52}, {0x51, 0x4C}, /* 0x58-0x5B */ + {0x51, 0x54}, {0x51, 0x62}, {0x7A, 0xF8}, {0x51, 0x69}, /* 0x5C-0x5F */ + {0x51, 0x6A}, {0x51, 0x6E}, {0x51, 0x80}, {0x51, 0x82}, /* 0x60-0x63 */ + {0x56, 0xD8}, {0x51, 0x8C}, {0x51, 0x89}, {0x51, 0x8F}, /* 0x64-0x67 */ + {0x51, 0x91}, {0x51, 0x93}, {0x51, 0x95}, {0x51, 0x96}, /* 0x68-0x6B */ + {0x51, 0xA4}, {0x51, 0xA6}, {0x51, 0xA2}, {0x51, 0xA9}, /* 0x6C-0x6F */ + {0x51, 0xAA}, {0x51, 0xAB}, {0x51, 0xB3}, {0x51, 0xB1}, /* 0x70-0x73 */ + {0x51, 0xB2}, {0x51, 0xB0}, {0x51, 0xB5}, {0x51, 0xBD}, /* 0x74-0x77 */ + {0x51, 0xC5}, {0x51, 0xC9}, {0x51, 0xDB}, {0x51, 0xE0}, /* 0x78-0x7B */ + {0x86, 0x55}, {0x51, 0xE9}, {0x51, 0xED}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x51, 0xF0}, {0x51, 0xF5}, {0x51, 0xFE}, {0x52, 0x04}, /* 0x80-0x83 */ + {0x52, 0x0B}, {0x52, 0x14}, {0x52, 0x0E}, {0x52, 0x27}, /* 0x84-0x87 */ + {0x52, 0x2A}, {0x52, 0x2E}, {0x52, 0x33}, {0x52, 0x39}, /* 0x88-0x8B */ + {0x52, 0x4F}, {0x52, 0x44}, {0x52, 0x4B}, {0x52, 0x4C}, /* 0x8C-0x8F */ + {0x52, 0x5E}, {0x52, 0x54}, {0x52, 0x6A}, {0x52, 0x74}, /* 0x90-0x93 */ + {0x52, 0x69}, {0x52, 0x73}, {0x52, 0x7F}, {0x52, 0x7D}, /* 0x94-0x97 */ + {0x52, 0x8D}, {0x52, 0x94}, {0x52, 0x92}, {0x52, 0x71}, /* 0x98-0x9B */ + {0x52, 0x88}, {0x52, 0x91}, {0x8F, 0xA8}, {0x8F, 0xA7}, /* 0x9C-0x9F */ + {0x52, 0xAC}, {0x52, 0xAD}, {0x52, 0xBC}, {0x52, 0xB5}, /* 0xA0-0xA3 */ + {0x52, 0xC1}, {0x52, 0xCD}, {0x52, 0xD7}, {0x52, 0xDE}, /* 0xA4-0xA7 */ + {0x52, 0xE3}, {0x52, 0xE6}, {0x98, 0xED}, {0x52, 0xE0}, /* 0xA8-0xAB */ + {0x52, 0xF3}, {0x52, 0xF5}, {0x52, 0xF8}, {0x52, 0xF9}, /* 0xAC-0xAF */ + {0x53, 0x06}, {0x53, 0x08}, {0x75, 0x38}, {0x53, 0x0D}, /* 0xB0-0xB3 */ + {0x53, 0x10}, {0x53, 0x0F}, {0x53, 0x15}, {0x53, 0x1A}, /* 0xB4-0xB7 */ + {0x53, 0x23}, {0x53, 0x2F}, {0x53, 0x31}, {0x53, 0x33}, /* 0xB8-0xBB */ + {0x53, 0x38}, {0x53, 0x40}, {0x53, 0x46}, {0x53, 0x45}, /* 0xBC-0xBF */ + {0x4E, 0x17}, {0x53, 0x49}, {0x53, 0x4D}, {0x51, 0xD6}, /* 0xC0-0xC3 */ + {0x53, 0x5E}, {0x53, 0x69}, {0x53, 0x6E}, {0x59, 0x18}, /* 0xC4-0xC7 */ + {0x53, 0x7B}, {0x53, 0x77}, {0x53, 0x82}, {0x53, 0x96}, /* 0xC8-0xCB */ + {0x53, 0xA0}, {0x53, 0xA6}, {0x53, 0xA5}, {0x53, 0xAE}, /* 0xCC-0xCF */ + {0x53, 0xB0}, {0x53, 0xB6}, {0x53, 0xC3}, {0x7C, 0x12}, /* 0xD0-0xD3 */ + {0x96, 0xD9}, {0x53, 0xDF}, {0x66, 0xFC}, {0x71, 0xEE}, /* 0xD4-0xD7 */ + {0x53, 0xEE}, {0x53, 0xE8}, {0x53, 0xED}, {0x53, 0xFA}, /* 0xD8-0xDB */ + {0x54, 0x01}, {0x54, 0x3D}, {0x54, 0x40}, {0x54, 0x2C}, /* 0xDC-0xDF */ + {0x54, 0x2D}, {0x54, 0x3C}, {0x54, 0x2E}, {0x54, 0x36}, /* 0xE0-0xE3 */ + {0x54, 0x29}, {0x54, 0x1D}, {0x54, 0x4E}, {0x54, 0x8F}, /* 0xE4-0xE7 */ + {0x54, 0x75}, {0x54, 0x8E}, {0x54, 0x5F}, {0x54, 0x71}, /* 0xE8-0xEB */ + {0x54, 0x77}, {0x54, 0x70}, {0x54, 0x92}, {0x54, 0x7B}, /* 0xEC-0xEF */ + {0x54, 0x80}, {0x54, 0x76}, {0x54, 0x84}, {0x54, 0x90}, /* 0xF0-0xF3 */ + {0x54, 0x86}, {0x54, 0xC7}, {0x54, 0xA2}, {0x54, 0xB8}, /* 0xF4-0xF7 */ + {0x54, 0xA5}, {0x54, 0xAC}, {0x54, 0xC4}, {0x54, 0xC8}, /* 0xF8-0xFB */ + {0x54, 0xA8}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9A[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x54, 0xAB}, {0x54, 0xC2}, {0x54, 0xA4}, {0x54, 0xBE}, /* 0x40-0x43 */ + {0x54, 0xBC}, {0x54, 0xD8}, {0x54, 0xE5}, {0x54, 0xE6}, /* 0x44-0x47 */ + {0x55, 0x0F}, {0x55, 0x14}, {0x54, 0xFD}, {0x54, 0xEE}, /* 0x48-0x4B */ + {0x54, 0xED}, {0x54, 0xFA}, {0x54, 0xE2}, {0x55, 0x39}, /* 0x4C-0x4F */ + {0x55, 0x40}, {0x55, 0x63}, {0x55, 0x4C}, {0x55, 0x2E}, /* 0x50-0x53 */ + {0x55, 0x5C}, {0x55, 0x45}, {0x55, 0x56}, {0x55, 0x57}, /* 0x54-0x57 */ + {0x55, 0x38}, {0x55, 0x33}, {0x55, 0x5D}, {0x55, 0x99}, /* 0x58-0x5B */ + {0x55, 0x80}, {0x54, 0xAF}, {0x55, 0x8A}, {0x55, 0x9F}, /* 0x5C-0x5F */ + {0x55, 0x7B}, {0x55, 0x7E}, {0x55, 0x98}, {0x55, 0x9E}, /* 0x60-0x63 */ + {0x55, 0xAE}, {0x55, 0x7C}, {0x55, 0x83}, {0x55, 0xA9}, /* 0x64-0x67 */ + {0x55, 0x87}, {0x55, 0xA8}, {0x55, 0xDA}, {0x55, 0xC5}, /* 0x68-0x6B */ + {0x55, 0xDF}, {0x55, 0xC4}, {0x55, 0xDC}, {0x55, 0xE4}, /* 0x6C-0x6F */ + {0x55, 0xD4}, {0x56, 0x14}, {0x55, 0xF7}, {0x56, 0x16}, /* 0x70-0x73 */ + {0x55, 0xFE}, {0x55, 0xFD}, {0x56, 0x1B}, {0x55, 0xF9}, /* 0x74-0x77 */ + {0x56, 0x4E}, {0x56, 0x50}, {0x71, 0xDF}, {0x56, 0x34}, /* 0x78-0x7B */ + {0x56, 0x36}, {0x56, 0x32}, {0x56, 0x38}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x56, 0x6B}, {0x56, 0x64}, {0x56, 0x2F}, {0x56, 0x6C}, /* 0x80-0x83 */ + {0x56, 0x6A}, {0x56, 0x86}, {0x56, 0x80}, {0x56, 0x8A}, /* 0x84-0x87 */ + {0x56, 0xA0}, {0x56, 0x94}, {0x56, 0x8F}, {0x56, 0xA5}, /* 0x88-0x8B */ + {0x56, 0xAE}, {0x56, 0xB6}, {0x56, 0xB4}, {0x56, 0xC2}, /* 0x8C-0x8F */ + {0x56, 0xBC}, {0x56, 0xC1}, {0x56, 0xC3}, {0x56, 0xC0}, /* 0x90-0x93 */ + {0x56, 0xC8}, {0x56, 0xCE}, {0x56, 0xD1}, {0x56, 0xD3}, /* 0x94-0x97 */ + {0x56, 0xD7}, {0x56, 0xEE}, {0x56, 0xF9}, {0x57, 0x00}, /* 0x98-0x9B */ + {0x56, 0xFF}, {0x57, 0x04}, {0x57, 0x09}, {0x57, 0x08}, /* 0x9C-0x9F */ + {0x57, 0x0B}, {0x57, 0x0D}, {0x57, 0x13}, {0x57, 0x18}, /* 0xA0-0xA3 */ + {0x57, 0x16}, {0x55, 0xC7}, {0x57, 0x1C}, {0x57, 0x26}, /* 0xA4-0xA7 */ + {0x57, 0x37}, {0x57, 0x38}, {0x57, 0x4E}, {0x57, 0x3B}, /* 0xA8-0xAB */ + {0x57, 0x40}, {0x57, 0x4F}, {0x57, 0x69}, {0x57, 0xC0}, /* 0xAC-0xAF */ + {0x57, 0x88}, {0x57, 0x61}, {0x57, 0x7F}, {0x57, 0x89}, /* 0xB0-0xB3 */ + {0x57, 0x93}, {0x57, 0xA0}, {0x57, 0xB3}, {0x57, 0xA4}, /* 0xB4-0xB7 */ + {0x57, 0xAA}, {0x57, 0xB0}, {0x57, 0xC3}, {0x57, 0xC6}, /* 0xB8-0xBB */ + {0x57, 0xD4}, {0x57, 0xD2}, {0x57, 0xD3}, {0x58, 0x0A}, /* 0xBC-0xBF */ + {0x57, 0xD6}, {0x57, 0xE3}, {0x58, 0x0B}, {0x58, 0x19}, /* 0xC0-0xC3 */ + {0x58, 0x1D}, {0x58, 0x72}, {0x58, 0x21}, {0x58, 0x62}, /* 0xC4-0xC7 */ + {0x58, 0x4B}, {0x58, 0x70}, {0x6B, 0xC0}, {0x58, 0x52}, /* 0xC8-0xCB */ + {0x58, 0x3D}, {0x58, 0x79}, {0x58, 0x85}, {0x58, 0xB9}, /* 0xCC-0xCF */ + {0x58, 0x9F}, {0x58, 0xAB}, {0x58, 0xBA}, {0x58, 0xDE}, /* 0xD0-0xD3 */ + {0x58, 0xBB}, {0x58, 0xB8}, {0x58, 0xAE}, {0x58, 0xC5}, /* 0xD4-0xD7 */ + {0x58, 0xD3}, {0x58, 0xD1}, {0x58, 0xD7}, {0x58, 0xD9}, /* 0xD8-0xDB */ + {0x58, 0xD8}, {0x58, 0xE5}, {0x58, 0xDC}, {0x58, 0xE4}, /* 0xDC-0xDF */ + {0x58, 0xDF}, {0x58, 0xEF}, {0x58, 0xFA}, {0x58, 0xF9}, /* 0xE0-0xE3 */ + {0x58, 0xFB}, {0x58, 0xFC}, {0x58, 0xFD}, {0x59, 0x02}, /* 0xE4-0xE7 */ + {0x59, 0x0A}, {0x59, 0x10}, {0x59, 0x1B}, {0x68, 0xA6}, /* 0xE8-0xEB */ + {0x59, 0x25}, {0x59, 0x2C}, {0x59, 0x2D}, {0x59, 0x32}, /* 0xEC-0xEF */ + {0x59, 0x38}, {0x59, 0x3E}, {0x7A, 0xD2}, {0x59, 0x55}, /* 0xF0-0xF3 */ + {0x59, 0x50}, {0x59, 0x4E}, {0x59, 0x5A}, {0x59, 0x58}, /* 0xF4-0xF7 */ + {0x59, 0x62}, {0x59, 0x60}, {0x59, 0x67}, {0x59, 0x6C}, /* 0xF8-0xFB */ + {0x59, 0x69}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9B[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x59, 0x78}, {0x59, 0x81}, {0x59, 0x9D}, {0x4F, 0x5E}, /* 0x40-0x43 */ + {0x4F, 0xAB}, {0x59, 0xA3}, {0x59, 0xB2}, {0x59, 0xC6}, /* 0x44-0x47 */ + {0x59, 0xE8}, {0x59, 0xDC}, {0x59, 0x8D}, {0x59, 0xD9}, /* 0x48-0x4B */ + {0x59, 0xDA}, {0x5A, 0x25}, {0x5A, 0x1F}, {0x5A, 0x11}, /* 0x4C-0x4F */ + {0x5A, 0x1C}, {0x5A, 0x09}, {0x5A, 0x1A}, {0x5A, 0x40}, /* 0x50-0x53 */ + {0x5A, 0x6C}, {0x5A, 0x49}, {0x5A, 0x35}, {0x5A, 0x36}, /* 0x54-0x57 */ + {0x5A, 0x62}, {0x5A, 0x6A}, {0x5A, 0x9A}, {0x5A, 0xBC}, /* 0x58-0x5B */ + {0x5A, 0xBE}, {0x5A, 0xCB}, {0x5A, 0xC2}, {0x5A, 0xBD}, /* 0x5C-0x5F */ + {0x5A, 0xE3}, {0x5A, 0xD7}, {0x5A, 0xE6}, {0x5A, 0xE9}, /* 0x60-0x63 */ + {0x5A, 0xD6}, {0x5A, 0xFA}, {0x5A, 0xFB}, {0x5B, 0x0C}, /* 0x64-0x67 */ + {0x5B, 0x0B}, {0x5B, 0x16}, {0x5B, 0x32}, {0x5A, 0xD0}, /* 0x68-0x6B */ + {0x5B, 0x2A}, {0x5B, 0x36}, {0x5B, 0x3E}, {0x5B, 0x43}, /* 0x6C-0x6F */ + {0x5B, 0x45}, {0x5B, 0x40}, {0x5B, 0x51}, {0x5B, 0x55}, /* 0x70-0x73 */ + {0x5B, 0x5A}, {0x5B, 0x5B}, {0x5B, 0x65}, {0x5B, 0x69}, /* 0x74-0x77 */ + {0x5B, 0x70}, {0x5B, 0x73}, {0x5B, 0x75}, {0x5B, 0x78}, /* 0x78-0x7B */ + {0x65, 0x88}, {0x5B, 0x7A}, {0x5B, 0x80}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x5B, 0x83}, {0x5B, 0xA6}, {0x5B, 0xB8}, {0x5B, 0xC3}, /* 0x80-0x83 */ + {0x5B, 0xC7}, {0x5B, 0xC9}, {0x5B, 0xD4}, {0x5B, 0xD0}, /* 0x84-0x87 */ + {0x5B, 0xE4}, {0x5B, 0xE6}, {0x5B, 0xE2}, {0x5B, 0xDE}, /* 0x88-0x8B */ + {0x5B, 0xE5}, {0x5B, 0xEB}, {0x5B, 0xF0}, {0x5B, 0xF6}, /* 0x8C-0x8F */ + {0x5B, 0xF3}, {0x5C, 0x05}, {0x5C, 0x07}, {0x5C, 0x08}, /* 0x90-0x93 */ + {0x5C, 0x0D}, {0x5C, 0x13}, {0x5C, 0x20}, {0x5C, 0x22}, /* 0x94-0x97 */ + {0x5C, 0x28}, {0x5C, 0x38}, {0x5C, 0x39}, {0x5C, 0x41}, /* 0x98-0x9B */ + {0x5C, 0x46}, {0x5C, 0x4E}, {0x5C, 0x53}, {0x5C, 0x50}, /* 0x9C-0x9F */ + {0x5C, 0x4F}, {0x5B, 0x71}, {0x5C, 0x6C}, {0x5C, 0x6E}, /* 0xA0-0xA3 */ + {0x4E, 0x62}, {0x5C, 0x76}, {0x5C, 0x79}, {0x5C, 0x8C}, /* 0xA4-0xA7 */ + {0x5C, 0x91}, {0x5C, 0x94}, {0x59, 0x9B}, {0x5C, 0xAB}, /* 0xA8-0xAB */ + {0x5C, 0xBB}, {0x5C, 0xB6}, {0x5C, 0xBC}, {0x5C, 0xB7}, /* 0xAC-0xAF */ + {0x5C, 0xC5}, {0x5C, 0xBE}, {0x5C, 0xC7}, {0x5C, 0xD9}, /* 0xB0-0xB3 */ + {0x5C, 0xE9}, {0x5C, 0xFD}, {0x5C, 0xFA}, {0x5C, 0xED}, /* 0xB4-0xB7 */ + {0x5D, 0x8C}, {0x5C, 0xEA}, {0x5D, 0x0B}, {0x5D, 0x15}, /* 0xB8-0xBB */ + {0x5D, 0x17}, {0x5D, 0x5C}, {0x5D, 0x1F}, {0x5D, 0x1B}, /* 0xBC-0xBF */ + {0x5D, 0x11}, {0x5D, 0x14}, {0x5D, 0x22}, {0x5D, 0x1A}, /* 0xC0-0xC3 */ + {0x5D, 0x19}, {0x5D, 0x18}, {0x5D, 0x4C}, {0x5D, 0x52}, /* 0xC4-0xC7 */ + {0x5D, 0x4E}, {0x5D, 0x4B}, {0x5D, 0x6C}, {0x5D, 0x73}, /* 0xC8-0xCB */ + {0x5D, 0x76}, {0x5D, 0x87}, {0x5D, 0x84}, {0x5D, 0x82}, /* 0xCC-0xCF */ + {0x5D, 0xA2}, {0x5D, 0x9D}, {0x5D, 0xAC}, {0x5D, 0xAE}, /* 0xD0-0xD3 */ + {0x5D, 0xBD}, {0x5D, 0x90}, {0x5D, 0xB7}, {0x5D, 0xBC}, /* 0xD4-0xD7 */ + {0x5D, 0xC9}, {0x5D, 0xCD}, {0x5D, 0xD3}, {0x5D, 0xD2}, /* 0xD8-0xDB */ + {0x5D, 0xD6}, {0x5D, 0xDB}, {0x5D, 0xEB}, {0x5D, 0xF2}, /* 0xDC-0xDF */ + {0x5D, 0xF5}, {0x5E, 0x0B}, {0x5E, 0x1A}, {0x5E, 0x19}, /* 0xE0-0xE3 */ + {0x5E, 0x11}, {0x5E, 0x1B}, {0x5E, 0x36}, {0x5E, 0x37}, /* 0xE4-0xE7 */ + {0x5E, 0x44}, {0x5E, 0x43}, {0x5E, 0x40}, {0x5E, 0x4E}, /* 0xE8-0xEB */ + {0x5E, 0x57}, {0x5E, 0x54}, {0x5E, 0x5F}, {0x5E, 0x62}, /* 0xEC-0xEF */ + {0x5E, 0x64}, {0x5E, 0x47}, {0x5E, 0x75}, {0x5E, 0x76}, /* 0xF0-0xF3 */ + {0x5E, 0x7A}, {0x9E, 0xBC}, {0x5E, 0x7F}, {0x5E, 0xA0}, /* 0xF4-0xF7 */ + {0x5E, 0xC1}, {0x5E, 0xC2}, {0x5E, 0xC8}, {0x5E, 0xD0}, /* 0xF8-0xFB */ + {0x5E, 0xCF}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9C[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5E, 0xD6}, {0x5E, 0xE3}, {0x5E, 0xDD}, {0x5E, 0xDA}, /* 0x40-0x43 */ + {0x5E, 0xDB}, {0x5E, 0xE2}, {0x5E, 0xE1}, {0x5E, 0xE8}, /* 0x44-0x47 */ + {0x5E, 0xE9}, {0x5E, 0xEC}, {0x5E, 0xF1}, {0x5E, 0xF3}, /* 0x48-0x4B */ + {0x5E, 0xF0}, {0x5E, 0xF4}, {0x5E, 0xF8}, {0x5E, 0xFE}, /* 0x4C-0x4F */ + {0x5F, 0x03}, {0x5F, 0x09}, {0x5F, 0x5D}, {0x5F, 0x5C}, /* 0x50-0x53 */ + {0x5F, 0x0B}, {0x5F, 0x11}, {0x5F, 0x16}, {0x5F, 0x29}, /* 0x54-0x57 */ + {0x5F, 0x2D}, {0x5F, 0x38}, {0x5F, 0x41}, {0x5F, 0x48}, /* 0x58-0x5B */ + {0x5F, 0x4C}, {0x5F, 0x4E}, {0x5F, 0x2F}, {0x5F, 0x51}, /* 0x5C-0x5F */ + {0x5F, 0x56}, {0x5F, 0x57}, {0x5F, 0x59}, {0x5F, 0x61}, /* 0x60-0x63 */ + {0x5F, 0x6D}, {0x5F, 0x73}, {0x5F, 0x77}, {0x5F, 0x83}, /* 0x64-0x67 */ + {0x5F, 0x82}, {0x5F, 0x7F}, {0x5F, 0x8A}, {0x5F, 0x88}, /* 0x68-0x6B */ + {0x5F, 0x91}, {0x5F, 0x87}, {0x5F, 0x9E}, {0x5F, 0x99}, /* 0x6C-0x6F */ + {0x5F, 0x98}, {0x5F, 0xA0}, {0x5F, 0xA8}, {0x5F, 0xAD}, /* 0x70-0x73 */ + {0x5F, 0xBC}, {0x5F, 0xD6}, {0x5F, 0xFB}, {0x5F, 0xE4}, /* 0x74-0x77 */ + {0x5F, 0xF8}, {0x5F, 0xF1}, {0x5F, 0xDD}, {0x60, 0xB3}, /* 0x78-0x7B */ + {0x5F, 0xFF}, {0x60, 0x21}, {0x60, 0x60}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x60, 0x19}, {0x60, 0x10}, {0x60, 0x29}, {0x60, 0x0E}, /* 0x80-0x83 */ + {0x60, 0x31}, {0x60, 0x1B}, {0x60, 0x15}, {0x60, 0x2B}, /* 0x84-0x87 */ + {0x60, 0x26}, {0x60, 0x0F}, {0x60, 0x3A}, {0x60, 0x5A}, /* 0x88-0x8B */ + {0x60, 0x41}, {0x60, 0x6A}, {0x60, 0x77}, {0x60, 0x5F}, /* 0x8C-0x8F */ + {0x60, 0x4A}, {0x60, 0x46}, {0x60, 0x4D}, {0x60, 0x63}, /* 0x90-0x93 */ + {0x60, 0x43}, {0x60, 0x64}, {0x60, 0x42}, {0x60, 0x6C}, /* 0x94-0x97 */ + {0x60, 0x6B}, {0x60, 0x59}, {0x60, 0x81}, {0x60, 0x8D}, /* 0x98-0x9B */ + {0x60, 0xE7}, {0x60, 0x83}, {0x60, 0x9A}, {0x60, 0x84}, /* 0x9C-0x9F */ + {0x60, 0x9B}, {0x60, 0x96}, {0x60, 0x97}, {0x60, 0x92}, /* 0xA0-0xA3 */ + {0x60, 0xA7}, {0x60, 0x8B}, {0x60, 0xE1}, {0x60, 0xB8}, /* 0xA4-0xA7 */ + {0x60, 0xE0}, {0x60, 0xD3}, {0x60, 0xB4}, {0x5F, 0xF0}, /* 0xA8-0xAB */ + {0x60, 0xBD}, {0x60, 0xC6}, {0x60, 0xB5}, {0x60, 0xD8}, /* 0xAC-0xAF */ + {0x61, 0x4D}, {0x61, 0x15}, {0x61, 0x06}, {0x60, 0xF6}, /* 0xB0-0xB3 */ + {0x60, 0xF7}, {0x61, 0x00}, {0x60, 0xF4}, {0x60, 0xFA}, /* 0xB4-0xB7 */ + {0x61, 0x03}, {0x61, 0x21}, {0x60, 0xFB}, {0x60, 0xF1}, /* 0xB8-0xBB */ + {0x61, 0x0D}, {0x61, 0x0E}, {0x61, 0x47}, {0x61, 0x3E}, /* 0xBC-0xBF */ + {0x61, 0x28}, {0x61, 0x27}, {0x61, 0x4A}, {0x61, 0x3F}, /* 0xC0-0xC3 */ + {0x61, 0x3C}, {0x61, 0x2C}, {0x61, 0x34}, {0x61, 0x3D}, /* 0xC4-0xC7 */ + {0x61, 0x42}, {0x61, 0x44}, {0x61, 0x73}, {0x61, 0x77}, /* 0xC8-0xCB */ + {0x61, 0x58}, {0x61, 0x59}, {0x61, 0x5A}, {0x61, 0x6B}, /* 0xCC-0xCF */ + {0x61, 0x74}, {0x61, 0x6F}, {0x61, 0x65}, {0x61, 0x71}, /* 0xD0-0xD3 */ + {0x61, 0x5F}, {0x61, 0x5D}, {0x61, 0x53}, {0x61, 0x75}, /* 0xD4-0xD7 */ + {0x61, 0x99}, {0x61, 0x96}, {0x61, 0x87}, {0x61, 0xAC}, /* 0xD8-0xDB */ + {0x61, 0x94}, {0x61, 0x9A}, {0x61, 0x8A}, {0x61, 0x91}, /* 0xDC-0xDF */ + {0x61, 0xAB}, {0x61, 0xAE}, {0x61, 0xCC}, {0x61, 0xCA}, /* 0xE0-0xE3 */ + {0x61, 0xC9}, {0x61, 0xF7}, {0x61, 0xC8}, {0x61, 0xC3}, /* 0xE4-0xE7 */ + {0x61, 0xC6}, {0x61, 0xBA}, {0x61, 0xCB}, {0x7F, 0x79}, /* 0xE8-0xEB */ + {0x61, 0xCD}, {0x61, 0xE6}, {0x61, 0xE3}, {0x61, 0xF6}, /* 0xEC-0xEF */ + {0x61, 0xFA}, {0x61, 0xF4}, {0x61, 0xFF}, {0x61, 0xFD}, /* 0xF0-0xF3 */ + {0x61, 0xFC}, {0x61, 0xFE}, {0x62, 0x00}, {0x62, 0x08}, /* 0xF4-0xF7 */ + {0x62, 0x09}, {0x62, 0x0D}, {0x62, 0x0C}, {0x62, 0x14}, /* 0xF8-0xFB */ + {0x62, 0x1B}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9D[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x62, 0x1E}, {0x62, 0x21}, {0x62, 0x2A}, {0x62, 0x2E}, /* 0x40-0x43 */ + {0x62, 0x30}, {0x62, 0x32}, {0x62, 0x33}, {0x62, 0x41}, /* 0x44-0x47 */ + {0x62, 0x4E}, {0x62, 0x5E}, {0x62, 0x63}, {0x62, 0x5B}, /* 0x48-0x4B */ + {0x62, 0x60}, {0x62, 0x68}, {0x62, 0x7C}, {0x62, 0x82}, /* 0x4C-0x4F */ + {0x62, 0x89}, {0x62, 0x7E}, {0x62, 0x92}, {0x62, 0x93}, /* 0x50-0x53 */ + {0x62, 0x96}, {0x62, 0xD4}, {0x62, 0x83}, {0x62, 0x94}, /* 0x54-0x57 */ + {0x62, 0xD7}, {0x62, 0xD1}, {0x62, 0xBB}, {0x62, 0xCF}, /* 0x58-0x5B */ + {0x62, 0xFF}, {0x62, 0xC6}, {0x64, 0xD4}, {0x62, 0xC8}, /* 0x5C-0x5F */ + {0x62, 0xDC}, {0x62, 0xCC}, {0x62, 0xCA}, {0x62, 0xC2}, /* 0x60-0x63 */ + {0x62, 0xC7}, {0x62, 0x9B}, {0x62, 0xC9}, {0x63, 0x0C}, /* 0x64-0x67 */ + {0x62, 0xEE}, {0x62, 0xF1}, {0x63, 0x27}, {0x63, 0x02}, /* 0x68-0x6B */ + {0x63, 0x08}, {0x62, 0xEF}, {0x62, 0xF5}, {0x63, 0x50}, /* 0x6C-0x6F */ + {0x63, 0x3E}, {0x63, 0x4D}, {0x64, 0x1C}, {0x63, 0x4F}, /* 0x70-0x73 */ + {0x63, 0x96}, {0x63, 0x8E}, {0x63, 0x80}, {0x63, 0xAB}, /* 0x74-0x77 */ + {0x63, 0x76}, {0x63, 0xA3}, {0x63, 0x8F}, {0x63, 0x89}, /* 0x78-0x7B */ + {0x63, 0x9F}, {0x63, 0xB5}, {0x63, 0x6B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x63, 0x69}, {0x63, 0xBE}, {0x63, 0xE9}, {0x63, 0xC0}, /* 0x80-0x83 */ + {0x63, 0xC6}, {0x63, 0xE3}, {0x63, 0xC9}, {0x63, 0xD2}, /* 0x84-0x87 */ + {0x63, 0xF6}, {0x63, 0xC4}, {0x64, 0x16}, {0x64, 0x34}, /* 0x88-0x8B */ + {0x64, 0x06}, {0x64, 0x13}, {0x64, 0x26}, {0x64, 0x36}, /* 0x8C-0x8F */ + {0x65, 0x1D}, {0x64, 0x17}, {0x64, 0x28}, {0x64, 0x0F}, /* 0x90-0x93 */ + {0x64, 0x67}, {0x64, 0x6F}, {0x64, 0x76}, {0x64, 0x4E}, /* 0x94-0x97 */ + {0x65, 0x2A}, {0x64, 0x95}, {0x64, 0x93}, {0x64, 0xA5}, /* 0x98-0x9B */ + {0x64, 0xA9}, {0x64, 0x88}, {0x64, 0xBC}, {0x64, 0xDA}, /* 0x9C-0x9F */ + {0x64, 0xD2}, {0x64, 0xC5}, {0x64, 0xC7}, {0x64, 0xBB}, /* 0xA0-0xA3 */ + {0x64, 0xD8}, {0x64, 0xC2}, {0x64, 0xF1}, {0x64, 0xE7}, /* 0xA4-0xA7 */ + {0x82, 0x09}, {0x64, 0xE0}, {0x64, 0xE1}, {0x62, 0xAC}, /* 0xA8-0xAB */ + {0x64, 0xE3}, {0x64, 0xEF}, {0x65, 0x2C}, {0x64, 0xF6}, /* 0xAC-0xAF */ + {0x64, 0xF4}, {0x64, 0xF2}, {0x64, 0xFA}, {0x65, 0x00}, /* 0xB0-0xB3 */ + {0x64, 0xFD}, {0x65, 0x18}, {0x65, 0x1C}, {0x65, 0x05}, /* 0xB4-0xB7 */ + {0x65, 0x24}, {0x65, 0x23}, {0x65, 0x2B}, {0x65, 0x34}, /* 0xB8-0xBB */ + {0x65, 0x35}, {0x65, 0x37}, {0x65, 0x36}, {0x65, 0x38}, /* 0xBC-0xBF */ + {0x75, 0x4B}, {0x65, 0x48}, {0x65, 0x56}, {0x65, 0x55}, /* 0xC0-0xC3 */ + {0x65, 0x4D}, {0x65, 0x58}, {0x65, 0x5E}, {0x65, 0x5D}, /* 0xC4-0xC7 */ + {0x65, 0x72}, {0x65, 0x78}, {0x65, 0x82}, {0x65, 0x83}, /* 0xC8-0xCB */ + {0x8B, 0x8A}, {0x65, 0x9B}, {0x65, 0x9F}, {0x65, 0xAB}, /* 0xCC-0xCF */ + {0x65, 0xB7}, {0x65, 0xC3}, {0x65, 0xC6}, {0x65, 0xC1}, /* 0xD0-0xD3 */ + {0x65, 0xC4}, {0x65, 0xCC}, {0x65, 0xD2}, {0x65, 0xDB}, /* 0xD4-0xD7 */ + {0x65, 0xD9}, {0x65, 0xE0}, {0x65, 0xE1}, {0x65, 0xF1}, /* 0xD8-0xDB */ + {0x67, 0x72}, {0x66, 0x0A}, {0x66, 0x03}, {0x65, 0xFB}, /* 0xDC-0xDF */ + {0x67, 0x73}, {0x66, 0x35}, {0x66, 0x36}, {0x66, 0x34}, /* 0xE0-0xE3 */ + {0x66, 0x1C}, {0x66, 0x4F}, {0x66, 0x44}, {0x66, 0x49}, /* 0xE4-0xE7 */ + {0x66, 0x41}, {0x66, 0x5E}, {0x66, 0x5D}, {0x66, 0x64}, /* 0xE8-0xEB */ + {0x66, 0x67}, {0x66, 0x68}, {0x66, 0x5F}, {0x66, 0x62}, /* 0xEC-0xEF */ + {0x66, 0x70}, {0x66, 0x83}, {0x66, 0x88}, {0x66, 0x8E}, /* 0xF0-0xF3 */ + {0x66, 0x89}, {0x66, 0x84}, {0x66, 0x98}, {0x66, 0x9D}, /* 0xF4-0xF7 */ + {0x66, 0xC1}, {0x66, 0xB9}, {0x66, 0xC9}, {0x66, 0xBE}, /* 0xF8-0xFB */ + {0x66, 0xBC}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9E[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x66, 0xC4}, {0x66, 0xB8}, {0x66, 0xD6}, {0x66, 0xDA}, /* 0x40-0x43 */ + {0x66, 0xE0}, {0x66, 0x3F}, {0x66, 0xE6}, {0x66, 0xE9}, /* 0x44-0x47 */ + {0x66, 0xF0}, {0x66, 0xF5}, {0x66, 0xF7}, {0x67, 0x0F}, /* 0x48-0x4B */ + {0x67, 0x16}, {0x67, 0x1E}, {0x67, 0x26}, {0x67, 0x27}, /* 0x4C-0x4F */ + {0x97, 0x38}, {0x67, 0x2E}, {0x67, 0x3F}, {0x67, 0x36}, /* 0x50-0x53 */ + {0x67, 0x41}, {0x67, 0x38}, {0x67, 0x37}, {0x67, 0x46}, /* 0x54-0x57 */ + {0x67, 0x5E}, {0x67, 0x60}, {0x67, 0x59}, {0x67, 0x63}, /* 0x58-0x5B */ + {0x67, 0x64}, {0x67, 0x89}, {0x67, 0x70}, {0x67, 0xA9}, /* 0x5C-0x5F */ + {0x67, 0x7C}, {0x67, 0x6A}, {0x67, 0x8C}, {0x67, 0x8B}, /* 0x60-0x63 */ + {0x67, 0xA6}, {0x67, 0xA1}, {0x67, 0x85}, {0x67, 0xB7}, /* 0x64-0x67 */ + {0x67, 0xEF}, {0x67, 0xB4}, {0x67, 0xEC}, {0x67, 0xB3}, /* 0x68-0x6B */ + {0x67, 0xE9}, {0x67, 0xB8}, {0x67, 0xE4}, {0x67, 0xDE}, /* 0x6C-0x6F */ + {0x67, 0xDD}, {0x67, 0xE2}, {0x67, 0xEE}, {0x67, 0xB9}, /* 0x70-0x73 */ + {0x67, 0xCE}, {0x67, 0xC6}, {0x67, 0xE7}, {0x6A, 0x9C}, /* 0x74-0x77 */ + {0x68, 0x1E}, {0x68, 0x46}, {0x68, 0x29}, {0x68, 0x40}, /* 0x78-0x7B */ + {0x68, 0x4D}, {0x68, 0x32}, {0x68, 0x4E}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x68, 0xB3}, {0x68, 0x2B}, {0x68, 0x59}, {0x68, 0x63}, /* 0x80-0x83 */ + {0x68, 0x77}, {0x68, 0x7F}, {0x68, 0x9F}, {0x68, 0x8F}, /* 0x84-0x87 */ + {0x68, 0xAD}, {0x68, 0x94}, {0x68, 0x9D}, {0x68, 0x9B}, /* 0x88-0x8B */ + {0x68, 0x83}, {0x6A, 0xAE}, {0x68, 0xB9}, {0x68, 0x74}, /* 0x8C-0x8F */ + {0x68, 0xB5}, {0x68, 0xA0}, {0x68, 0xBA}, {0x69, 0x0F}, /* 0x90-0x93 */ + {0x68, 0x8D}, {0x68, 0x7E}, {0x69, 0x01}, {0x68, 0xCA}, /* 0x94-0x97 */ + {0x69, 0x08}, {0x68, 0xD8}, {0x69, 0x22}, {0x69, 0x26}, /* 0x98-0x9B */ + {0x68, 0xE1}, {0x69, 0x0C}, {0x68, 0xCD}, {0x68, 0xD4}, /* 0x9C-0x9F */ + {0x68, 0xE7}, {0x68, 0xD5}, {0x69, 0x36}, {0x69, 0x12}, /* 0xA0-0xA3 */ + {0x69, 0x04}, {0x68, 0xD7}, {0x68, 0xE3}, {0x69, 0x25}, /* 0xA4-0xA7 */ + {0x68, 0xF9}, {0x68, 0xE0}, {0x68, 0xEF}, {0x69, 0x28}, /* 0xA8-0xAB */ + {0x69, 0x2A}, {0x69, 0x1A}, {0x69, 0x23}, {0x69, 0x21}, /* 0xAC-0xAF */ + {0x68, 0xC6}, {0x69, 0x79}, {0x69, 0x77}, {0x69, 0x5C}, /* 0xB0-0xB3 */ + {0x69, 0x78}, {0x69, 0x6B}, {0x69, 0x54}, {0x69, 0x7E}, /* 0xB4-0xB7 */ + {0x69, 0x6E}, {0x69, 0x39}, {0x69, 0x74}, {0x69, 0x3D}, /* 0xB8-0xBB */ + {0x69, 0x59}, {0x69, 0x30}, {0x69, 0x61}, {0x69, 0x5E}, /* 0xBC-0xBF */ + {0x69, 0x5D}, {0x69, 0x81}, {0x69, 0x6A}, {0x69, 0xB2}, /* 0xC0-0xC3 */ + {0x69, 0xAE}, {0x69, 0xD0}, {0x69, 0xBF}, {0x69, 0xC1}, /* 0xC4-0xC7 */ + {0x69, 0xD3}, {0x69, 0xBE}, {0x69, 0xCE}, {0x5B, 0xE8}, /* 0xC8-0xCB */ + {0x69, 0xCA}, {0x69, 0xDD}, {0x69, 0xBB}, {0x69, 0xC3}, /* 0xCC-0xCF */ + {0x69, 0xA7}, {0x6A, 0x2E}, {0x69, 0x91}, {0x69, 0xA0}, /* 0xD0-0xD3 */ + {0x69, 0x9C}, {0x69, 0x95}, {0x69, 0xB4}, {0x69, 0xDE}, /* 0xD4-0xD7 */ + {0x69, 0xE8}, {0x6A, 0x02}, {0x6A, 0x1B}, {0x69, 0xFF}, /* 0xD8-0xDB */ + {0x6B, 0x0A}, {0x69, 0xF9}, {0x69, 0xF2}, {0x69, 0xE7}, /* 0xDC-0xDF */ + {0x6A, 0x05}, {0x69, 0xB1}, {0x6A, 0x1E}, {0x69, 0xED}, /* 0xE0-0xE3 */ + {0x6A, 0x14}, {0x69, 0xEB}, {0x6A, 0x0A}, {0x6A, 0x12}, /* 0xE4-0xE7 */ + {0x6A, 0xC1}, {0x6A, 0x23}, {0x6A, 0x13}, {0x6A, 0x44}, /* 0xE8-0xEB */ + {0x6A, 0x0C}, {0x6A, 0x72}, {0x6A, 0x36}, {0x6A, 0x78}, /* 0xEC-0xEF */ + {0x6A, 0x47}, {0x6A, 0x62}, {0x6A, 0x59}, {0x6A, 0x66}, /* 0xF0-0xF3 */ + {0x6A, 0x48}, {0x6A, 0x38}, {0x6A, 0x22}, {0x6A, 0x90}, /* 0xF4-0xF7 */ + {0x6A, 0x8D}, {0x6A, 0xA0}, {0x6A, 0x84}, {0x6A, 0xA2}, /* 0xF8-0xFB */ + {0x6A, 0xA3}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9F[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6A, 0x97}, {0x86, 0x17}, {0x6A, 0xBB}, {0x6A, 0xC3}, /* 0x40-0x43 */ + {0x6A, 0xC2}, {0x6A, 0xB8}, {0x6A, 0xB3}, {0x6A, 0xAC}, /* 0x44-0x47 */ + {0x6A, 0xDE}, {0x6A, 0xD1}, {0x6A, 0xDF}, {0x6A, 0xAA}, /* 0x48-0x4B */ + {0x6A, 0xDA}, {0x6A, 0xEA}, {0x6A, 0xFB}, {0x6B, 0x05}, /* 0x4C-0x4F */ + {0x86, 0x16}, {0x6A, 0xFA}, {0x6B, 0x12}, {0x6B, 0x16}, /* 0x50-0x53 */ + {0x9B, 0x31}, {0x6B, 0x1F}, {0x6B, 0x38}, {0x6B, 0x37}, /* 0x54-0x57 */ + {0x76, 0xDC}, {0x6B, 0x39}, {0x98, 0xEE}, {0x6B, 0x47}, /* 0x58-0x5B */ + {0x6B, 0x43}, {0x6B, 0x49}, {0x6B, 0x50}, {0x6B, 0x59}, /* 0x5C-0x5F */ + {0x6B, 0x54}, {0x6B, 0x5B}, {0x6B, 0x5F}, {0x6B, 0x61}, /* 0x60-0x63 */ + {0x6B, 0x78}, {0x6B, 0x79}, {0x6B, 0x7F}, {0x6B, 0x80}, /* 0x64-0x67 */ + {0x6B, 0x84}, {0x6B, 0x83}, {0x6B, 0x8D}, {0x6B, 0x98}, /* 0x68-0x6B */ + {0x6B, 0x95}, {0x6B, 0x9E}, {0x6B, 0xA4}, {0x6B, 0xAA}, /* 0x6C-0x6F */ + {0x6B, 0xAB}, {0x6B, 0xAF}, {0x6B, 0xB2}, {0x6B, 0xB1}, /* 0x70-0x73 */ + {0x6B, 0xB3}, {0x6B, 0xB7}, {0x6B, 0xBC}, {0x6B, 0xC6}, /* 0x74-0x77 */ + {0x6B, 0xCB}, {0x6B, 0xD3}, {0x6B, 0xDF}, {0x6B, 0xEC}, /* 0x78-0x7B */ + {0x6B, 0xEB}, {0x6B, 0xF3}, {0x6B, 0xEF}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9E, 0xBE}, {0x6C, 0x08}, {0x6C, 0x13}, {0x6C, 0x14}, /* 0x80-0x83 */ + {0x6C, 0x1B}, {0x6C, 0x24}, {0x6C, 0x23}, {0x6C, 0x5E}, /* 0x84-0x87 */ + {0x6C, 0x55}, {0x6C, 0x62}, {0x6C, 0x6A}, {0x6C, 0x82}, /* 0x88-0x8B */ + {0x6C, 0x8D}, {0x6C, 0x9A}, {0x6C, 0x81}, {0x6C, 0x9B}, /* 0x8C-0x8F */ + {0x6C, 0x7E}, {0x6C, 0x68}, {0x6C, 0x73}, {0x6C, 0x92}, /* 0x90-0x93 */ + {0x6C, 0x90}, {0x6C, 0xC4}, {0x6C, 0xF1}, {0x6C, 0xD3}, /* 0x94-0x97 */ + {0x6C, 0xBD}, {0x6C, 0xD7}, {0x6C, 0xC5}, {0x6C, 0xDD}, /* 0x98-0x9B */ + {0x6C, 0xAE}, {0x6C, 0xB1}, {0x6C, 0xBE}, {0x6C, 0xBA}, /* 0x9C-0x9F */ + {0x6C, 0xDB}, {0x6C, 0xEF}, {0x6C, 0xD9}, {0x6C, 0xEA}, /* 0xA0-0xA3 */ + {0x6D, 0x1F}, {0x88, 0x4D}, {0x6D, 0x36}, {0x6D, 0x2B}, /* 0xA4-0xA7 */ + {0x6D, 0x3D}, {0x6D, 0x38}, {0x6D, 0x19}, {0x6D, 0x35}, /* 0xA8-0xAB */ + {0x6D, 0x33}, {0x6D, 0x12}, {0x6D, 0x0C}, {0x6D, 0x63}, /* 0xAC-0xAF */ + {0x6D, 0x93}, {0x6D, 0x64}, {0x6D, 0x5A}, {0x6D, 0x79}, /* 0xB0-0xB3 */ + {0x6D, 0x59}, {0x6D, 0x8E}, {0x6D, 0x95}, {0x6F, 0xE4}, /* 0xB4-0xB7 */ + {0x6D, 0x85}, {0x6D, 0xF9}, {0x6E, 0x15}, {0x6E, 0x0A}, /* 0xB8-0xBB */ + {0x6D, 0xB5}, {0x6D, 0xC7}, {0x6D, 0xE6}, {0x6D, 0xB8}, /* 0xBC-0xBF */ + {0x6D, 0xC6}, {0x6D, 0xEC}, {0x6D, 0xDE}, {0x6D, 0xCC}, /* 0xC0-0xC3 */ + {0x6D, 0xE8}, {0x6D, 0xD2}, {0x6D, 0xC5}, {0x6D, 0xFA}, /* 0xC4-0xC7 */ + {0x6D, 0xD9}, {0x6D, 0xE4}, {0x6D, 0xD5}, {0x6D, 0xEA}, /* 0xC8-0xCB */ + {0x6D, 0xEE}, {0x6E, 0x2D}, {0x6E, 0x6E}, {0x6E, 0x2E}, /* 0xCC-0xCF */ + {0x6E, 0x19}, {0x6E, 0x72}, {0x6E, 0x5F}, {0x6E, 0x3E}, /* 0xD0-0xD3 */ + {0x6E, 0x23}, {0x6E, 0x6B}, {0x6E, 0x2B}, {0x6E, 0x76}, /* 0xD4-0xD7 */ + {0x6E, 0x4D}, {0x6E, 0x1F}, {0x6E, 0x43}, {0x6E, 0x3A}, /* 0xD8-0xDB */ + {0x6E, 0x4E}, {0x6E, 0x24}, {0x6E, 0xFF}, {0x6E, 0x1D}, /* 0xDC-0xDF */ + {0x6E, 0x38}, {0x6E, 0x82}, {0x6E, 0xAA}, {0x6E, 0x98}, /* 0xE0-0xE3 */ + {0x6E, 0xC9}, {0x6E, 0xB7}, {0x6E, 0xD3}, {0x6E, 0xBD}, /* 0xE4-0xE7 */ + {0x6E, 0xAF}, {0x6E, 0xC4}, {0x6E, 0xB2}, {0x6E, 0xD4}, /* 0xE8-0xEB */ + {0x6E, 0xD5}, {0x6E, 0x8F}, {0x6E, 0xA5}, {0x6E, 0xC2}, /* 0xEC-0xEF */ + {0x6E, 0x9F}, {0x6F, 0x41}, {0x6F, 0x11}, {0x70, 0x4C}, /* 0xF0-0xF3 */ + {0x6E, 0xEC}, {0x6E, 0xF8}, {0x6E, 0xFE}, {0x6F, 0x3F}, /* 0xF4-0xF7 */ + {0x6E, 0xF2}, {0x6F, 0x31}, {0x6E, 0xEF}, {0x6F, 0x32}, /* 0xF8-0xFB */ + {0x6E, 0xCC}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6F, 0x3E}, {0x6F, 0x13}, {0x6E, 0xF7}, {0x6F, 0x86}, /* 0x40-0x43 */ + {0x6F, 0x7A}, {0x6F, 0x78}, {0x6F, 0x81}, {0x6F, 0x80}, /* 0x44-0x47 */ + {0x6F, 0x6F}, {0x6F, 0x5B}, {0x6F, 0xF3}, {0x6F, 0x6D}, /* 0x48-0x4B */ + {0x6F, 0x82}, {0x6F, 0x7C}, {0x6F, 0x58}, {0x6F, 0x8E}, /* 0x4C-0x4F */ + {0x6F, 0x91}, {0x6F, 0xC2}, {0x6F, 0x66}, {0x6F, 0xB3}, /* 0x50-0x53 */ + {0x6F, 0xA3}, {0x6F, 0xA1}, {0x6F, 0xA4}, {0x6F, 0xB9}, /* 0x54-0x57 */ + {0x6F, 0xC6}, {0x6F, 0xAA}, {0x6F, 0xDF}, {0x6F, 0xD5}, /* 0x58-0x5B */ + {0x6F, 0xEC}, {0x6F, 0xD4}, {0x6F, 0xD8}, {0x6F, 0xF1}, /* 0x5C-0x5F */ + {0x6F, 0xEE}, {0x6F, 0xDB}, {0x70, 0x09}, {0x70, 0x0B}, /* 0x60-0x63 */ + {0x6F, 0xFA}, {0x70, 0x11}, {0x70, 0x01}, {0x70, 0x0F}, /* 0x64-0x67 */ + {0x6F, 0xFE}, {0x70, 0x1B}, {0x70, 0x1A}, {0x6F, 0x74}, /* 0x68-0x6B */ + {0x70, 0x1D}, {0x70, 0x18}, {0x70, 0x1F}, {0x70, 0x30}, /* 0x6C-0x6F */ + {0x70, 0x3E}, {0x70, 0x32}, {0x70, 0x51}, {0x70, 0x63}, /* 0x70-0x73 */ + {0x70, 0x99}, {0x70, 0x92}, {0x70, 0xAF}, {0x70, 0xF1}, /* 0x74-0x77 */ + {0x70, 0xAC}, {0x70, 0xB8}, {0x70, 0xB3}, {0x70, 0xAE}, /* 0x78-0x7B */ + {0x70, 0xDF}, {0x70, 0xCB}, {0x70, 0xDD}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x70, 0xD9}, {0x71, 0x09}, {0x70, 0xFD}, {0x71, 0x1C}, /* 0x80-0x83 */ + {0x71, 0x19}, {0x71, 0x65}, {0x71, 0x55}, {0x71, 0x88}, /* 0x84-0x87 */ + {0x71, 0x66}, {0x71, 0x62}, {0x71, 0x4C}, {0x71, 0x56}, /* 0x88-0x8B */ + {0x71, 0x6C}, {0x71, 0x8F}, {0x71, 0xFB}, {0x71, 0x84}, /* 0x8C-0x8F */ + {0x71, 0x95}, {0x71, 0xA8}, {0x71, 0xAC}, {0x71, 0xD7}, /* 0x90-0x93 */ + {0x71, 0xB9}, {0x71, 0xBE}, {0x71, 0xD2}, {0x71, 0xC9}, /* 0x94-0x97 */ + {0x71, 0xD4}, {0x71, 0xCE}, {0x71, 0xE0}, {0x71, 0xEC}, /* 0x98-0x9B */ + {0x71, 0xE7}, {0x71, 0xF5}, {0x71, 0xFC}, {0x71, 0xF9}, /* 0x9C-0x9F */ + {0x71, 0xFF}, {0x72, 0x0D}, {0x72, 0x10}, {0x72, 0x1B}, /* 0xA0-0xA3 */ + {0x72, 0x28}, {0x72, 0x2D}, {0x72, 0x2C}, {0x72, 0x30}, /* 0xA4-0xA7 */ + {0x72, 0x32}, {0x72, 0x3B}, {0x72, 0x3C}, {0x72, 0x3F}, /* 0xA8-0xAB */ + {0x72, 0x40}, {0x72, 0x46}, {0x72, 0x4B}, {0x72, 0x58}, /* 0xAC-0xAF */ + {0x72, 0x74}, {0x72, 0x7E}, {0x72, 0x82}, {0x72, 0x81}, /* 0xB0-0xB3 */ + {0x72, 0x87}, {0x72, 0x92}, {0x72, 0x96}, {0x72, 0xA2}, /* 0xB4-0xB7 */ + {0x72, 0xA7}, {0x72, 0xB9}, {0x72, 0xB2}, {0x72, 0xC3}, /* 0xB8-0xBB */ + {0x72, 0xC6}, {0x72, 0xC4}, {0x72, 0xCE}, {0x72, 0xD2}, /* 0xBC-0xBF */ + {0x72, 0xE2}, {0x72, 0xE0}, {0x72, 0xE1}, {0x72, 0xF9}, /* 0xC0-0xC3 */ + {0x72, 0xF7}, {0x50, 0x0F}, {0x73, 0x17}, {0x73, 0x0A}, /* 0xC4-0xC7 */ + {0x73, 0x1C}, {0x73, 0x16}, {0x73, 0x1D}, {0x73, 0x34}, /* 0xC8-0xCB */ + {0x73, 0x2F}, {0x73, 0x29}, {0x73, 0x25}, {0x73, 0x3E}, /* 0xCC-0xCF */ + {0x73, 0x4E}, {0x73, 0x4F}, {0x9E, 0xD8}, {0x73, 0x57}, /* 0xD0-0xD3 */ + {0x73, 0x6A}, {0x73, 0x68}, {0x73, 0x70}, {0x73, 0x78}, /* 0xD4-0xD7 */ + {0x73, 0x75}, {0x73, 0x7B}, {0x73, 0x7A}, {0x73, 0xC8}, /* 0xD8-0xDB */ + {0x73, 0xB3}, {0x73, 0xCE}, {0x73, 0xBB}, {0x73, 0xC0}, /* 0xDC-0xDF */ + {0x73, 0xE5}, {0x73, 0xEE}, {0x73, 0xDE}, {0x74, 0xA2}, /* 0xE0-0xE3 */ + {0x74, 0x05}, {0x74, 0x6F}, {0x74, 0x25}, {0x73, 0xF8}, /* 0xE4-0xE7 */ + {0x74, 0x32}, {0x74, 0x3A}, {0x74, 0x55}, {0x74, 0x3F}, /* 0xE8-0xEB */ + {0x74, 0x5F}, {0x74, 0x59}, {0x74, 0x41}, {0x74, 0x5C}, /* 0xEC-0xEF */ + {0x74, 0x69}, {0x74, 0x70}, {0x74, 0x63}, {0x74, 0x6A}, /* 0xF0-0xF3 */ + {0x74, 0x76}, {0x74, 0x7E}, {0x74, 0x8B}, {0x74, 0x9E}, /* 0xF4-0xF7 */ + {0x74, 0xA7}, {0x74, 0xCA}, {0x74, 0xCF}, {0x74, 0xD4}, /* 0xF8-0xFB */ + {0x73, 0xF1}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x74, 0xE0}, {0x74, 0xE3}, {0x74, 0xE7}, {0x74, 0xE9}, /* 0x40-0x43 */ + {0x74, 0xEE}, {0x74, 0xF2}, {0x74, 0xF0}, {0x74, 0xF1}, /* 0x44-0x47 */ + {0x74, 0xF8}, {0x74, 0xF7}, {0x75, 0x04}, {0x75, 0x03}, /* 0x48-0x4B */ + {0x75, 0x05}, {0x75, 0x0C}, {0x75, 0x0E}, {0x75, 0x0D}, /* 0x4C-0x4F */ + {0x75, 0x15}, {0x75, 0x13}, {0x75, 0x1E}, {0x75, 0x26}, /* 0x50-0x53 */ + {0x75, 0x2C}, {0x75, 0x3C}, {0x75, 0x44}, {0x75, 0x4D}, /* 0x54-0x57 */ + {0x75, 0x4A}, {0x75, 0x49}, {0x75, 0x5B}, {0x75, 0x46}, /* 0x58-0x5B */ + {0x75, 0x5A}, {0x75, 0x69}, {0x75, 0x64}, {0x75, 0x67}, /* 0x5C-0x5F */ + {0x75, 0x6B}, {0x75, 0x6D}, {0x75, 0x78}, {0x75, 0x76}, /* 0x60-0x63 */ + {0x75, 0x86}, {0x75, 0x87}, {0x75, 0x74}, {0x75, 0x8A}, /* 0x64-0x67 */ + {0x75, 0x89}, {0x75, 0x82}, {0x75, 0x94}, {0x75, 0x9A}, /* 0x68-0x6B */ + {0x75, 0x9D}, {0x75, 0xA5}, {0x75, 0xA3}, {0x75, 0xC2}, /* 0x6C-0x6F */ + {0x75, 0xB3}, {0x75, 0xC3}, {0x75, 0xB5}, {0x75, 0xBD}, /* 0x70-0x73 */ + {0x75, 0xB8}, {0x75, 0xBC}, {0x75, 0xB1}, {0x75, 0xCD}, /* 0x74-0x77 */ + {0x75, 0xCA}, {0x75, 0xD2}, {0x75, 0xD9}, {0x75, 0xE3}, /* 0x78-0x7B */ + {0x75, 0xDE}, {0x75, 0xFE}, {0x75, 0xFF}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x75, 0xFC}, {0x76, 0x01}, {0x75, 0xF0}, {0x75, 0xFA}, /* 0x80-0x83 */ + {0x75, 0xF2}, {0x75, 0xF3}, {0x76, 0x0B}, {0x76, 0x0D}, /* 0x84-0x87 */ + {0x76, 0x09}, {0x76, 0x1F}, {0x76, 0x27}, {0x76, 0x20}, /* 0x88-0x8B */ + {0x76, 0x21}, {0x76, 0x22}, {0x76, 0x24}, {0x76, 0x34}, /* 0x8C-0x8F */ + {0x76, 0x30}, {0x76, 0x3B}, {0x76, 0x47}, {0x76, 0x48}, /* 0x90-0x93 */ + {0x76, 0x46}, {0x76, 0x5C}, {0x76, 0x58}, {0x76, 0x61}, /* 0x94-0x97 */ + {0x76, 0x62}, {0x76, 0x68}, {0x76, 0x69}, {0x76, 0x6A}, /* 0x98-0x9B */ + {0x76, 0x67}, {0x76, 0x6C}, {0x76, 0x70}, {0x76, 0x72}, /* 0x9C-0x9F */ + {0x76, 0x76}, {0x76, 0x78}, {0x76, 0x7C}, {0x76, 0x80}, /* 0xA0-0xA3 */ + {0x76, 0x83}, {0x76, 0x88}, {0x76, 0x8B}, {0x76, 0x8E}, /* 0xA4-0xA7 */ + {0x76, 0x96}, {0x76, 0x93}, {0x76, 0x99}, {0x76, 0x9A}, /* 0xA8-0xAB */ + {0x76, 0xB0}, {0x76, 0xB4}, {0x76, 0xB8}, {0x76, 0xB9}, /* 0xAC-0xAF */ + {0x76, 0xBA}, {0x76, 0xC2}, {0x76, 0xCD}, {0x76, 0xD6}, /* 0xB0-0xB3 */ + {0x76, 0xD2}, {0x76, 0xDE}, {0x76, 0xE1}, {0x76, 0xE5}, /* 0xB4-0xB7 */ + {0x76, 0xE7}, {0x76, 0xEA}, {0x86, 0x2F}, {0x76, 0xFB}, /* 0xB8-0xBB */ + {0x77, 0x08}, {0x77, 0x07}, {0x77, 0x04}, {0x77, 0x29}, /* 0xBC-0xBF */ + {0x77, 0x24}, {0x77, 0x1E}, {0x77, 0x25}, {0x77, 0x26}, /* 0xC0-0xC3 */ + {0x77, 0x1B}, {0x77, 0x37}, {0x77, 0x38}, {0x77, 0x47}, /* 0xC4-0xC7 */ + {0x77, 0x5A}, {0x77, 0x68}, {0x77, 0x6B}, {0x77, 0x5B}, /* 0xC8-0xCB */ + {0x77, 0x65}, {0x77, 0x7F}, {0x77, 0x7E}, {0x77, 0x79}, /* 0xCC-0xCF */ + {0x77, 0x8E}, {0x77, 0x8B}, {0x77, 0x91}, {0x77, 0xA0}, /* 0xD0-0xD3 */ + {0x77, 0x9E}, {0x77, 0xB0}, {0x77, 0xB6}, {0x77, 0xB9}, /* 0xD4-0xD7 */ + {0x77, 0xBF}, {0x77, 0xBC}, {0x77, 0xBD}, {0x77, 0xBB}, /* 0xD8-0xDB */ + {0x77, 0xC7}, {0x77, 0xCD}, {0x77, 0xD7}, {0x77, 0xDA}, /* 0xDC-0xDF */ + {0x77, 0xDC}, {0x77, 0xE3}, {0x77, 0xEE}, {0x77, 0xFC}, /* 0xE0-0xE3 */ + {0x78, 0x0C}, {0x78, 0x12}, {0x79, 0x26}, {0x78, 0x20}, /* 0xE4-0xE7 */ + {0x79, 0x2A}, {0x78, 0x45}, {0x78, 0x8E}, {0x78, 0x74}, /* 0xE8-0xEB */ + {0x78, 0x86}, {0x78, 0x7C}, {0x78, 0x9A}, {0x78, 0x8C}, /* 0xEC-0xEF */ + {0x78, 0xA3}, {0x78, 0xB5}, {0x78, 0xAA}, {0x78, 0xAF}, /* 0xF0-0xF3 */ + {0x78, 0xD1}, {0x78, 0xC6}, {0x78, 0xCB}, {0x78, 0xD4}, /* 0xF4-0xF7 */ + {0x78, 0xBE}, {0x78, 0xBC}, {0x78, 0xC5}, {0x78, 0xCA}, /* 0xF8-0xFB */ + {0x78, 0xEC}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x78, 0xE7}, {0x78, 0xDA}, {0x78, 0xFD}, {0x78, 0xF4}, /* 0x40-0x43 */ + {0x79, 0x07}, {0x79, 0x12}, {0x79, 0x11}, {0x79, 0x19}, /* 0x44-0x47 */ + {0x79, 0x2C}, {0x79, 0x2B}, {0x79, 0x40}, {0x79, 0x60}, /* 0x48-0x4B */ + {0x79, 0x57}, {0x79, 0x5F}, {0x79, 0x5A}, {0x79, 0x55}, /* 0x4C-0x4F */ + {0x79, 0x53}, {0x79, 0x7A}, {0x79, 0x7F}, {0x79, 0x8A}, /* 0x50-0x53 */ + {0x79, 0x9D}, {0x79, 0xA7}, {0x9F, 0x4B}, {0x79, 0xAA}, /* 0x54-0x57 */ + {0x79, 0xAE}, {0x79, 0xB3}, {0x79, 0xB9}, {0x79, 0xBA}, /* 0x58-0x5B */ + {0x79, 0xC9}, {0x79, 0xD5}, {0x79, 0xE7}, {0x79, 0xEC}, /* 0x5C-0x5F */ + {0x79, 0xE1}, {0x79, 0xE3}, {0x7A, 0x08}, {0x7A, 0x0D}, /* 0x60-0x63 */ + {0x7A, 0x18}, {0x7A, 0x19}, {0x7A, 0x20}, {0x7A, 0x1F}, /* 0x64-0x67 */ + {0x79, 0x80}, {0x7A, 0x31}, {0x7A, 0x3B}, {0x7A, 0x3E}, /* 0x68-0x6B */ + {0x7A, 0x37}, {0x7A, 0x43}, {0x7A, 0x57}, {0x7A, 0x49}, /* 0x6C-0x6F */ + {0x7A, 0x61}, {0x7A, 0x62}, {0x7A, 0x69}, {0x9F, 0x9D}, /* 0x70-0x73 */ + {0x7A, 0x70}, {0x7A, 0x79}, {0x7A, 0x7D}, {0x7A, 0x88}, /* 0x74-0x77 */ + {0x7A, 0x97}, {0x7A, 0x95}, {0x7A, 0x98}, {0x7A, 0x96}, /* 0x78-0x7B */ + {0x7A, 0xA9}, {0x7A, 0xC8}, {0x7A, 0xB0}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7A, 0xB6}, {0x7A, 0xC5}, {0x7A, 0xC4}, {0x7A, 0xBF}, /* 0x80-0x83 */ + {0x90, 0x83}, {0x7A, 0xC7}, {0x7A, 0xCA}, {0x7A, 0xCD}, /* 0x84-0x87 */ + {0x7A, 0xCF}, {0x7A, 0xD5}, {0x7A, 0xD3}, {0x7A, 0xD9}, /* 0x88-0x8B */ + {0x7A, 0xDA}, {0x7A, 0xDD}, {0x7A, 0xE1}, {0x7A, 0xE2}, /* 0x8C-0x8F */ + {0x7A, 0xE6}, {0x7A, 0xED}, {0x7A, 0xF0}, {0x7B, 0x02}, /* 0x90-0x93 */ + {0x7B, 0x0F}, {0x7B, 0x0A}, {0x7B, 0x06}, {0x7B, 0x33}, /* 0x94-0x97 */ + {0x7B, 0x18}, {0x7B, 0x19}, {0x7B, 0x1E}, {0x7B, 0x35}, /* 0x98-0x9B */ + {0x7B, 0x28}, {0x7B, 0x36}, {0x7B, 0x50}, {0x7B, 0x7A}, /* 0x9C-0x9F */ + {0x7B, 0x04}, {0x7B, 0x4D}, {0x7B, 0x0B}, {0x7B, 0x4C}, /* 0xA0-0xA3 */ + {0x7B, 0x45}, {0x7B, 0x75}, {0x7B, 0x65}, {0x7B, 0x74}, /* 0xA4-0xA7 */ + {0x7B, 0x67}, {0x7B, 0x70}, {0x7B, 0x71}, {0x7B, 0x6C}, /* 0xA8-0xAB */ + {0x7B, 0x6E}, {0x7B, 0x9D}, {0x7B, 0x98}, {0x7B, 0x9F}, /* 0xAC-0xAF */ + {0x7B, 0x8D}, {0x7B, 0x9C}, {0x7B, 0x9A}, {0x7B, 0x8B}, /* 0xB0-0xB3 */ + {0x7B, 0x92}, {0x7B, 0x8F}, {0x7B, 0x5D}, {0x7B, 0x99}, /* 0xB4-0xB7 */ + {0x7B, 0xCB}, {0x7B, 0xC1}, {0x7B, 0xCC}, {0x7B, 0xCF}, /* 0xB8-0xBB */ + {0x7B, 0xB4}, {0x7B, 0xC6}, {0x7B, 0xDD}, {0x7B, 0xE9}, /* 0xBC-0xBF */ + {0x7C, 0x11}, {0x7C, 0x14}, {0x7B, 0xE6}, {0x7B, 0xE5}, /* 0xC0-0xC3 */ + {0x7C, 0x60}, {0x7C, 0x00}, {0x7C, 0x07}, {0x7C, 0x13}, /* 0xC4-0xC7 */ + {0x7B, 0xF3}, {0x7B, 0xF7}, {0x7C, 0x17}, {0x7C, 0x0D}, /* 0xC8-0xCB */ + {0x7B, 0xF6}, {0x7C, 0x23}, {0x7C, 0x27}, {0x7C, 0x2A}, /* 0xCC-0xCF */ + {0x7C, 0x1F}, {0x7C, 0x37}, {0x7C, 0x2B}, {0x7C, 0x3D}, /* 0xD0-0xD3 */ + {0x7C, 0x4C}, {0x7C, 0x43}, {0x7C, 0x54}, {0x7C, 0x4F}, /* 0xD4-0xD7 */ + {0x7C, 0x40}, {0x7C, 0x50}, {0x7C, 0x58}, {0x7C, 0x5F}, /* 0xD8-0xDB */ + {0x7C, 0x64}, {0x7C, 0x56}, {0x7C, 0x65}, {0x7C, 0x6C}, /* 0xDC-0xDF */ + {0x7C, 0x75}, {0x7C, 0x83}, {0x7C, 0x90}, {0x7C, 0xA4}, /* 0xE0-0xE3 */ + {0x7C, 0xAD}, {0x7C, 0xA2}, {0x7C, 0xAB}, {0x7C, 0xA1}, /* 0xE4-0xE7 */ + {0x7C, 0xA8}, {0x7C, 0xB3}, {0x7C, 0xB2}, {0x7C, 0xB1}, /* 0xE8-0xEB */ + {0x7C, 0xAE}, {0x7C, 0xB9}, {0x7C, 0xBD}, {0x7C, 0xC0}, /* 0xEC-0xEF */ + {0x7C, 0xC5}, {0x7C, 0xC2}, {0x7C, 0xD8}, {0x7C, 0xD2}, /* 0xF0-0xF3 */ + {0x7C, 0xDC}, {0x7C, 0xE2}, {0x9B, 0x3B}, {0x7C, 0xEF}, /* 0xF4-0xF7 */ + {0x7C, 0xF2}, {0x7C, 0xF4}, {0x7C, 0xF6}, {0x7C, 0xFA}, /* 0xF8-0xFB */ + {0x7D, 0x06}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7D, 0x02}, {0x7D, 0x1C}, {0x7D, 0x15}, {0x7D, 0x0A}, /* 0x40-0x43 */ + {0x7D, 0x45}, {0x7D, 0x4B}, {0x7D, 0x2E}, {0x7D, 0x32}, /* 0x44-0x47 */ + {0x7D, 0x3F}, {0x7D, 0x35}, {0x7D, 0x46}, {0x7D, 0x73}, /* 0x48-0x4B */ + {0x7D, 0x56}, {0x7D, 0x4E}, {0x7D, 0x72}, {0x7D, 0x68}, /* 0x4C-0x4F */ + {0x7D, 0x6E}, {0x7D, 0x4F}, {0x7D, 0x63}, {0x7D, 0x93}, /* 0x50-0x53 */ + {0x7D, 0x89}, {0x7D, 0x5B}, {0x7D, 0x8F}, {0x7D, 0x7D}, /* 0x54-0x57 */ + {0x7D, 0x9B}, {0x7D, 0xBA}, {0x7D, 0xAE}, {0x7D, 0xA3}, /* 0x58-0x5B */ + {0x7D, 0xB5}, {0x7D, 0xC7}, {0x7D, 0xBD}, {0x7D, 0xAB}, /* 0x5C-0x5F */ + {0x7E, 0x3D}, {0x7D, 0xA2}, {0x7D, 0xAF}, {0x7D, 0xDC}, /* 0x60-0x63 */ + {0x7D, 0xB8}, {0x7D, 0x9F}, {0x7D, 0xB0}, {0x7D, 0xD8}, /* 0x64-0x67 */ + {0x7D, 0xDD}, {0x7D, 0xE4}, {0x7D, 0xDE}, {0x7D, 0xFB}, /* 0x68-0x6B */ + {0x7D, 0xF2}, {0x7D, 0xE1}, {0x7E, 0x05}, {0x7E, 0x0A}, /* 0x6C-0x6F */ + {0x7E, 0x23}, {0x7E, 0x21}, {0x7E, 0x12}, {0x7E, 0x31}, /* 0x70-0x73 */ + {0x7E, 0x1F}, {0x7E, 0x09}, {0x7E, 0x0B}, {0x7E, 0x22}, /* 0x74-0x77 */ + {0x7E, 0x46}, {0x7E, 0x66}, {0x7E, 0x3B}, {0x7E, 0x35}, /* 0x78-0x7B */ + {0x7E, 0x39}, {0x7E, 0x43}, {0x7E, 0x37}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7E, 0x32}, {0x7E, 0x3A}, {0x7E, 0x67}, {0x7E, 0x5D}, /* 0x80-0x83 */ + {0x7E, 0x56}, {0x7E, 0x5E}, {0x7E, 0x59}, {0x7E, 0x5A}, /* 0x84-0x87 */ + {0x7E, 0x79}, {0x7E, 0x6A}, {0x7E, 0x69}, {0x7E, 0x7C}, /* 0x88-0x8B */ + {0x7E, 0x7B}, {0x7E, 0x83}, {0x7D, 0xD5}, {0x7E, 0x7D}, /* 0x8C-0x8F */ + {0x8F, 0xAE}, {0x7E, 0x7F}, {0x7E, 0x88}, {0x7E, 0x89}, /* 0x90-0x93 */ + {0x7E, 0x8C}, {0x7E, 0x92}, {0x7E, 0x90}, {0x7E, 0x93}, /* 0x94-0x97 */ + {0x7E, 0x94}, {0x7E, 0x96}, {0x7E, 0x8E}, {0x7E, 0x9B}, /* 0x98-0x9B */ + {0x7E, 0x9C}, {0x7F, 0x38}, {0x7F, 0x3A}, {0x7F, 0x45}, /* 0x9C-0x9F */ + {0x7F, 0x4C}, {0x7F, 0x4D}, {0x7F, 0x4E}, {0x7F, 0x50}, /* 0xA0-0xA3 */ + {0x7F, 0x51}, {0x7F, 0x55}, {0x7F, 0x54}, {0x7F, 0x58}, /* 0xA4-0xA7 */ + {0x7F, 0x5F}, {0x7F, 0x60}, {0x7F, 0x68}, {0x7F, 0x69}, /* 0xA8-0xAB */ + {0x7F, 0x67}, {0x7F, 0x78}, {0x7F, 0x82}, {0x7F, 0x86}, /* 0xAC-0xAF */ + {0x7F, 0x83}, {0x7F, 0x88}, {0x7F, 0x87}, {0x7F, 0x8C}, /* 0xB0-0xB3 */ + {0x7F, 0x94}, {0x7F, 0x9E}, {0x7F, 0x9D}, {0x7F, 0x9A}, /* 0xB4-0xB7 */ + {0x7F, 0xA3}, {0x7F, 0xAF}, {0x7F, 0xB2}, {0x7F, 0xB9}, /* 0xB8-0xBB */ + {0x7F, 0xAE}, {0x7F, 0xB6}, {0x7F, 0xB8}, {0x8B, 0x71}, /* 0xBC-0xBF */ + {0x7F, 0xC5}, {0x7F, 0xC6}, {0x7F, 0xCA}, {0x7F, 0xD5}, /* 0xC0-0xC3 */ + {0x7F, 0xD4}, {0x7F, 0xE1}, {0x7F, 0xE6}, {0x7F, 0xE9}, /* 0xC4-0xC7 */ + {0x7F, 0xF3}, {0x7F, 0xF9}, {0x98, 0xDC}, {0x80, 0x06}, /* 0xC8-0xCB */ + {0x80, 0x04}, {0x80, 0x0B}, {0x80, 0x12}, {0x80, 0x18}, /* 0xCC-0xCF */ + {0x80, 0x19}, {0x80, 0x1C}, {0x80, 0x21}, {0x80, 0x28}, /* 0xD0-0xD3 */ + {0x80, 0x3F}, {0x80, 0x3B}, {0x80, 0x4A}, {0x80, 0x46}, /* 0xD4-0xD7 */ + {0x80, 0x52}, {0x80, 0x58}, {0x80, 0x5A}, {0x80, 0x5F}, /* 0xD8-0xDB */ + {0x80, 0x62}, {0x80, 0x68}, {0x80, 0x73}, {0x80, 0x72}, /* 0xDC-0xDF */ + {0x80, 0x70}, {0x80, 0x76}, {0x80, 0x79}, {0x80, 0x7D}, /* 0xE0-0xE3 */ + {0x80, 0x7F}, {0x80, 0x84}, {0x80, 0x86}, {0x80, 0x85}, /* 0xE4-0xE7 */ + {0x80, 0x9B}, {0x80, 0x93}, {0x80, 0x9A}, {0x80, 0xAD}, /* 0xE8-0xEB */ + {0x51, 0x90}, {0x80, 0xAC}, {0x80, 0xDB}, {0x80, 0xE5}, /* 0xEC-0xEF */ + {0x80, 0xD9}, {0x80, 0xDD}, {0x80, 0xC4}, {0x80, 0xDA}, /* 0xF0-0xF3 */ + {0x80, 0xD6}, {0x81, 0x09}, {0x80, 0xEF}, {0x80, 0xF1}, /* 0xF4-0xF7 */ + {0x81, 0x1B}, {0x81, 0x29}, {0x81, 0x23}, {0x81, 0x2F}, /* 0xF8-0xFB */ + {0x81, 0x4B}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x96, 0x8B}, {0x81, 0x46}, {0x81, 0x3E}, {0x81, 0x53}, /* 0x40-0x43 */ + {0x81, 0x51}, {0x80, 0xFC}, {0x81, 0x71}, {0x81, 0x6E}, /* 0x44-0x47 */ + {0x81, 0x65}, {0x81, 0x66}, {0x81, 0x74}, {0x81, 0x83}, /* 0x48-0x4B */ + {0x81, 0x88}, {0x81, 0x8A}, {0x81, 0x80}, {0x81, 0x82}, /* 0x4C-0x4F */ + {0x81, 0xA0}, {0x81, 0x95}, {0x81, 0xA4}, {0x81, 0xA3}, /* 0x50-0x53 */ + {0x81, 0x5F}, {0x81, 0x93}, {0x81, 0xA9}, {0x81, 0xB0}, /* 0x54-0x57 */ + {0x81, 0xB5}, {0x81, 0xBE}, {0x81, 0xB8}, {0x81, 0xBD}, /* 0x58-0x5B */ + {0x81, 0xC0}, {0x81, 0xC2}, {0x81, 0xBA}, {0x81, 0xC9}, /* 0x5C-0x5F */ + {0x81, 0xCD}, {0x81, 0xD1}, {0x81, 0xD9}, {0x81, 0xD8}, /* 0x60-0x63 */ + {0x81, 0xC8}, {0x81, 0xDA}, {0x81, 0xDF}, {0x81, 0xE0}, /* 0x64-0x67 */ + {0x81, 0xE7}, {0x81, 0xFA}, {0x81, 0xFB}, {0x81, 0xFE}, /* 0x68-0x6B */ + {0x82, 0x01}, {0x82, 0x02}, {0x82, 0x05}, {0x82, 0x07}, /* 0x6C-0x6F */ + {0x82, 0x0A}, {0x82, 0x0D}, {0x82, 0x10}, {0x82, 0x16}, /* 0x70-0x73 */ + {0x82, 0x29}, {0x82, 0x2B}, {0x82, 0x38}, {0x82, 0x33}, /* 0x74-0x77 */ + {0x82, 0x40}, {0x82, 0x59}, {0x82, 0x58}, {0x82, 0x5D}, /* 0x78-0x7B */ + {0x82, 0x5A}, {0x82, 0x5F}, {0x82, 0x64}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x82, 0x62}, {0x82, 0x68}, {0x82, 0x6A}, {0x82, 0x6B}, /* 0x80-0x83 */ + {0x82, 0x2E}, {0x82, 0x71}, {0x82, 0x77}, {0x82, 0x78}, /* 0x84-0x87 */ + {0x82, 0x7E}, {0x82, 0x8D}, {0x82, 0x92}, {0x82, 0xAB}, /* 0x88-0x8B */ + {0x82, 0x9F}, {0x82, 0xBB}, {0x82, 0xAC}, {0x82, 0xE1}, /* 0x8C-0x8F */ + {0x82, 0xE3}, {0x82, 0xDF}, {0x82, 0xD2}, {0x82, 0xF4}, /* 0x90-0x93 */ + {0x82, 0xF3}, {0x82, 0xFA}, {0x83, 0x93}, {0x83, 0x03}, /* 0x94-0x97 */ + {0x82, 0xFB}, {0x82, 0xF9}, {0x82, 0xDE}, {0x83, 0x06}, /* 0x98-0x9B */ + {0x82, 0xDC}, {0x83, 0x09}, {0x82, 0xD9}, {0x83, 0x35}, /* 0x9C-0x9F */ + {0x83, 0x34}, {0x83, 0x16}, {0x83, 0x32}, {0x83, 0x31}, /* 0xA0-0xA3 */ + {0x83, 0x40}, {0x83, 0x39}, {0x83, 0x50}, {0x83, 0x45}, /* 0xA4-0xA7 */ + {0x83, 0x2F}, {0x83, 0x2B}, {0x83, 0x17}, {0x83, 0x18}, /* 0xA8-0xAB */ + {0x83, 0x85}, {0x83, 0x9A}, {0x83, 0xAA}, {0x83, 0x9F}, /* 0xAC-0xAF */ + {0x83, 0xA2}, {0x83, 0x96}, {0x83, 0x23}, {0x83, 0x8E}, /* 0xB0-0xB3 */ + {0x83, 0x87}, {0x83, 0x8A}, {0x83, 0x7C}, {0x83, 0xB5}, /* 0xB4-0xB7 */ + {0x83, 0x73}, {0x83, 0x75}, {0x83, 0xA0}, {0x83, 0x89}, /* 0xB8-0xBB */ + {0x83, 0xA8}, {0x83, 0xF4}, {0x84, 0x13}, {0x83, 0xEB}, /* 0xBC-0xBF */ + {0x83, 0xCE}, {0x83, 0xFD}, {0x84, 0x03}, {0x83, 0xD8}, /* 0xC0-0xC3 */ + {0x84, 0x0B}, {0x83, 0xC1}, {0x83, 0xF7}, {0x84, 0x07}, /* 0xC4-0xC7 */ + {0x83, 0xE0}, {0x83, 0xF2}, {0x84, 0x0D}, {0x84, 0x22}, /* 0xC8-0xCB */ + {0x84, 0x20}, {0x83, 0xBD}, {0x84, 0x38}, {0x85, 0x06}, /* 0xCC-0xCF */ + {0x83, 0xFB}, {0x84, 0x6D}, {0x84, 0x2A}, {0x84, 0x3C}, /* 0xD0-0xD3 */ + {0x85, 0x5A}, {0x84, 0x84}, {0x84, 0x77}, {0x84, 0x6B}, /* 0xD4-0xD7 */ + {0x84, 0xAD}, {0x84, 0x6E}, {0x84, 0x82}, {0x84, 0x69}, /* 0xD8-0xDB */ + {0x84, 0x46}, {0x84, 0x2C}, {0x84, 0x6F}, {0x84, 0x79}, /* 0xDC-0xDF */ + {0x84, 0x35}, {0x84, 0xCA}, {0x84, 0x62}, {0x84, 0xB9}, /* 0xE0-0xE3 */ + {0x84, 0xBF}, {0x84, 0x9F}, {0x84, 0xD9}, {0x84, 0xCD}, /* 0xE4-0xE7 */ + {0x84, 0xBB}, {0x84, 0xDA}, {0x84, 0xD0}, {0x84, 0xC1}, /* 0xE8-0xEB */ + {0x84, 0xC6}, {0x84, 0xD6}, {0x84, 0xA1}, {0x85, 0x21}, /* 0xEC-0xEF */ + {0x84, 0xFF}, {0x84, 0xF4}, {0x85, 0x17}, {0x85, 0x18}, /* 0xF0-0xF3 */ + {0x85, 0x2C}, {0x85, 0x1F}, {0x85, 0x15}, {0x85, 0x14}, /* 0xF4-0xF7 */ + {0x84, 0xFC}, {0x85, 0x40}, {0x85, 0x63}, {0x85, 0x58}, /* 0xF8-0xFB */ + {0x85, 0x48}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x85, 0x41}, {0x86, 0x02}, {0x85, 0x4B}, {0x85, 0x55}, /* 0x40-0x43 */ + {0x85, 0x80}, {0x85, 0xA4}, {0x85, 0x88}, {0x85, 0x91}, /* 0x44-0x47 */ + {0x85, 0x8A}, {0x85, 0xA8}, {0x85, 0x6D}, {0x85, 0x94}, /* 0x48-0x4B */ + {0x85, 0x9B}, {0x85, 0xEA}, {0x85, 0x87}, {0x85, 0x9C}, /* 0x4C-0x4F */ + {0x85, 0x77}, {0x85, 0x7E}, {0x85, 0x90}, {0x85, 0xC9}, /* 0x50-0x53 */ + {0x85, 0xBA}, {0x85, 0xCF}, {0x85, 0xB9}, {0x85, 0xD0}, /* 0x54-0x57 */ + {0x85, 0xD5}, {0x85, 0xDD}, {0x85, 0xE5}, {0x85, 0xDC}, /* 0x58-0x5B */ + {0x85, 0xF9}, {0x86, 0x0A}, {0x86, 0x13}, {0x86, 0x0B}, /* 0x5C-0x5F */ + {0x85, 0xFE}, {0x85, 0xFA}, {0x86, 0x06}, {0x86, 0x22}, /* 0x60-0x63 */ + {0x86, 0x1A}, {0x86, 0x30}, {0x86, 0x3F}, {0x86, 0x4D}, /* 0x64-0x67 */ + {0x4E, 0x55}, {0x86, 0x54}, {0x86, 0x5F}, {0x86, 0x67}, /* 0x68-0x6B */ + {0x86, 0x71}, {0x86, 0x93}, {0x86, 0xA3}, {0x86, 0xA9}, /* 0x6C-0x6F */ + {0x86, 0xAA}, {0x86, 0x8B}, {0x86, 0x8C}, {0x86, 0xB6}, /* 0x70-0x73 */ + {0x86, 0xAF}, {0x86, 0xC4}, {0x86, 0xC6}, {0x86, 0xB0}, /* 0x74-0x77 */ + {0x86, 0xC9}, {0x88, 0x23}, {0x86, 0xAB}, {0x86, 0xD4}, /* 0x78-0x7B */ + {0x86, 0xDE}, {0x86, 0xE9}, {0x86, 0xEC}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x86, 0xDF}, {0x86, 0xDB}, {0x86, 0xEF}, {0x87, 0x12}, /* 0x80-0x83 */ + {0x87, 0x06}, {0x87, 0x08}, {0x87, 0x00}, {0x87, 0x03}, /* 0x84-0x87 */ + {0x86, 0xFB}, {0x87, 0x11}, {0x87, 0x09}, {0x87, 0x0D}, /* 0x88-0x8B */ + {0x86, 0xF9}, {0x87, 0x0A}, {0x87, 0x34}, {0x87, 0x3F}, /* 0x8C-0x8F */ + {0x87, 0x37}, {0x87, 0x3B}, {0x87, 0x25}, {0x87, 0x29}, /* 0x90-0x93 */ + {0x87, 0x1A}, {0x87, 0x60}, {0x87, 0x5F}, {0x87, 0x78}, /* 0x94-0x97 */ + {0x87, 0x4C}, {0x87, 0x4E}, {0x87, 0x74}, {0x87, 0x57}, /* 0x98-0x9B */ + {0x87, 0x68}, {0x87, 0x6E}, {0x87, 0x59}, {0x87, 0x53}, /* 0x9C-0x9F */ + {0x87, 0x63}, {0x87, 0x6A}, {0x88, 0x05}, {0x87, 0xA2}, /* 0xA0-0xA3 */ + {0x87, 0x9F}, {0x87, 0x82}, {0x87, 0xAF}, {0x87, 0xCB}, /* 0xA4-0xA7 */ + {0x87, 0xBD}, {0x87, 0xC0}, {0x87, 0xD0}, {0x96, 0xD6}, /* 0xA8-0xAB */ + {0x87, 0xAB}, {0x87, 0xC4}, {0x87, 0xB3}, {0x87, 0xC7}, /* 0xAC-0xAF */ + {0x87, 0xC6}, {0x87, 0xBB}, {0x87, 0xEF}, {0x87, 0xF2}, /* 0xB0-0xB3 */ + {0x87, 0xE0}, {0x88, 0x0F}, {0x88, 0x0D}, {0x87, 0xFE}, /* 0xB4-0xB7 */ + {0x87, 0xF6}, {0x87, 0xF7}, {0x88, 0x0E}, {0x87, 0xD2}, /* 0xB8-0xBB */ + {0x88, 0x11}, {0x88, 0x16}, {0x88, 0x15}, {0x88, 0x22}, /* 0xBC-0xBF */ + {0x88, 0x21}, {0x88, 0x31}, {0x88, 0x36}, {0x88, 0x39}, /* 0xC0-0xC3 */ + {0x88, 0x27}, {0x88, 0x3B}, {0x88, 0x44}, {0x88, 0x42}, /* 0xC4-0xC7 */ + {0x88, 0x52}, {0x88, 0x59}, {0x88, 0x5E}, {0x88, 0x62}, /* 0xC8-0xCB */ + {0x88, 0x6B}, {0x88, 0x81}, {0x88, 0x7E}, {0x88, 0x9E}, /* 0xCC-0xCF */ + {0x88, 0x75}, {0x88, 0x7D}, {0x88, 0xB5}, {0x88, 0x72}, /* 0xD0-0xD3 */ + {0x88, 0x82}, {0x88, 0x97}, {0x88, 0x92}, {0x88, 0xAE}, /* 0xD4-0xD7 */ + {0x88, 0x99}, {0x88, 0xA2}, {0x88, 0x8D}, {0x88, 0xA4}, /* 0xD8-0xDB */ + {0x88, 0xB0}, {0x88, 0xBF}, {0x88, 0xB1}, {0x88, 0xC3}, /* 0xDC-0xDF */ + {0x88, 0xC4}, {0x88, 0xD4}, {0x88, 0xD8}, {0x88, 0xD9}, /* 0xE0-0xE3 */ + {0x88, 0xDD}, {0x88, 0xF9}, {0x89, 0x02}, {0x88, 0xFC}, /* 0xE4-0xE7 */ + {0x88, 0xF4}, {0x88, 0xE8}, {0x88, 0xF2}, {0x89, 0x04}, /* 0xE8-0xEB */ + {0x89, 0x0C}, {0x89, 0x0A}, {0x89, 0x13}, {0x89, 0x43}, /* 0xEC-0xEF */ + {0x89, 0x1E}, {0x89, 0x25}, {0x89, 0x2A}, {0x89, 0x2B}, /* 0xF0-0xF3 */ + {0x89, 0x41}, {0x89, 0x44}, {0x89, 0x3B}, {0x89, 0x36}, /* 0xF4-0xF7 */ + {0x89, 0x38}, {0x89, 0x4C}, {0x89, 0x1D}, {0x89, 0x60}, /* 0xF8-0xFB */ + {0x89, 0x5E}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x89, 0x66}, {0x89, 0x64}, {0x89, 0x6D}, {0x89, 0x6A}, /* 0x40-0x43 */ + {0x89, 0x6F}, {0x89, 0x74}, {0x89, 0x77}, {0x89, 0x7E}, /* 0x44-0x47 */ + {0x89, 0x83}, {0x89, 0x88}, {0x89, 0x8A}, {0x89, 0x93}, /* 0x48-0x4B */ + {0x89, 0x98}, {0x89, 0xA1}, {0x89, 0xA9}, {0x89, 0xA6}, /* 0x4C-0x4F */ + {0x89, 0xAC}, {0x89, 0xAF}, {0x89, 0xB2}, {0x89, 0xBA}, /* 0x50-0x53 */ + {0x89, 0xBD}, {0x89, 0xBF}, {0x89, 0xC0}, {0x89, 0xDA}, /* 0x54-0x57 */ + {0x89, 0xDC}, {0x89, 0xDD}, {0x89, 0xE7}, {0x89, 0xF4}, /* 0x58-0x5B */ + {0x89, 0xF8}, {0x8A, 0x03}, {0x8A, 0x16}, {0x8A, 0x10}, /* 0x5C-0x5F */ + {0x8A, 0x0C}, {0x8A, 0x1B}, {0x8A, 0x1D}, {0x8A, 0x25}, /* 0x60-0x63 */ + {0x8A, 0x36}, {0x8A, 0x41}, {0x8A, 0x5B}, {0x8A, 0x52}, /* 0x64-0x67 */ + {0x8A, 0x46}, {0x8A, 0x48}, {0x8A, 0x7C}, {0x8A, 0x6D}, /* 0x68-0x6B */ + {0x8A, 0x6C}, {0x8A, 0x62}, {0x8A, 0x85}, {0x8A, 0x82}, /* 0x6C-0x6F */ + {0x8A, 0x84}, {0x8A, 0xA8}, {0x8A, 0xA1}, {0x8A, 0x91}, /* 0x70-0x73 */ + {0x8A, 0xA5}, {0x8A, 0xA6}, {0x8A, 0x9A}, {0x8A, 0xA3}, /* 0x74-0x77 */ + {0x8A, 0xC4}, {0x8A, 0xCD}, {0x8A, 0xC2}, {0x8A, 0xDA}, /* 0x78-0x7B */ + {0x8A, 0xEB}, {0x8A, 0xF3}, {0x8A, 0xE7}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8A, 0xE4}, {0x8A, 0xF1}, {0x8B, 0x14}, {0x8A, 0xE0}, /* 0x80-0x83 */ + {0x8A, 0xE2}, {0x8A, 0xF7}, {0x8A, 0xDE}, {0x8A, 0xDB}, /* 0x84-0x87 */ + {0x8B, 0x0C}, {0x8B, 0x07}, {0x8B, 0x1A}, {0x8A, 0xE1}, /* 0x88-0x8B */ + {0x8B, 0x16}, {0x8B, 0x10}, {0x8B, 0x17}, {0x8B, 0x20}, /* 0x8C-0x8F */ + {0x8B, 0x33}, {0x97, 0xAB}, {0x8B, 0x26}, {0x8B, 0x2B}, /* 0x90-0x93 */ + {0x8B, 0x3E}, {0x8B, 0x28}, {0x8B, 0x41}, {0x8B, 0x4C}, /* 0x94-0x97 */ + {0x8B, 0x4F}, {0x8B, 0x4E}, {0x8B, 0x49}, {0x8B, 0x56}, /* 0x98-0x9B */ + {0x8B, 0x5B}, {0x8B, 0x5A}, {0x8B, 0x6B}, {0x8B, 0x5F}, /* 0x9C-0x9F */ + {0x8B, 0x6C}, {0x8B, 0x6F}, {0x8B, 0x74}, {0x8B, 0x7D}, /* 0xA0-0xA3 */ + {0x8B, 0x80}, {0x8B, 0x8C}, {0x8B, 0x8E}, {0x8B, 0x92}, /* 0xA4-0xA7 */ + {0x8B, 0x93}, {0x8B, 0x96}, {0x8B, 0x99}, {0x8B, 0x9A}, /* 0xA8-0xAB */ + {0x8C, 0x3A}, {0x8C, 0x41}, {0x8C, 0x3F}, {0x8C, 0x48}, /* 0xAC-0xAF */ + {0x8C, 0x4C}, {0x8C, 0x4E}, {0x8C, 0x50}, {0x8C, 0x55}, /* 0xB0-0xB3 */ + {0x8C, 0x62}, {0x8C, 0x6C}, {0x8C, 0x78}, {0x8C, 0x7A}, /* 0xB4-0xB7 */ + {0x8C, 0x82}, {0x8C, 0x89}, {0x8C, 0x85}, {0x8C, 0x8A}, /* 0xB8-0xBB */ + {0x8C, 0x8D}, {0x8C, 0x8E}, {0x8C, 0x94}, {0x8C, 0x7C}, /* 0xBC-0xBF */ + {0x8C, 0x98}, {0x62, 0x1D}, {0x8C, 0xAD}, {0x8C, 0xAA}, /* 0xC0-0xC3 */ + {0x8C, 0xBD}, {0x8C, 0xB2}, {0x8C, 0xB3}, {0x8C, 0xAE}, /* 0xC4-0xC7 */ + {0x8C, 0xB6}, {0x8C, 0xC8}, {0x8C, 0xC1}, {0x8C, 0xE4}, /* 0xC8-0xCB */ + {0x8C, 0xE3}, {0x8C, 0xDA}, {0x8C, 0xFD}, {0x8C, 0xFA}, /* 0xCC-0xCF */ + {0x8C, 0xFB}, {0x8D, 0x04}, {0x8D, 0x05}, {0x8D, 0x0A}, /* 0xD0-0xD3 */ + {0x8D, 0x07}, {0x8D, 0x0F}, {0x8D, 0x0D}, {0x8D, 0x10}, /* 0xD4-0xD7 */ + {0x9F, 0x4E}, {0x8D, 0x13}, {0x8C, 0xCD}, {0x8D, 0x14}, /* 0xD8-0xDB */ + {0x8D, 0x16}, {0x8D, 0x67}, {0x8D, 0x6D}, {0x8D, 0x71}, /* 0xDC-0xDF */ + {0x8D, 0x73}, {0x8D, 0x81}, {0x8D, 0x99}, {0x8D, 0xC2}, /* 0xE0-0xE3 */ + {0x8D, 0xBE}, {0x8D, 0xBA}, {0x8D, 0xCF}, {0x8D, 0xDA}, /* 0xE4-0xE7 */ + {0x8D, 0xD6}, {0x8D, 0xCC}, {0x8D, 0xDB}, {0x8D, 0xCB}, /* 0xE8-0xEB */ + {0x8D, 0xEA}, {0x8D, 0xEB}, {0x8D, 0xDF}, {0x8D, 0xE3}, /* 0xEC-0xEF */ + {0x8D, 0xFC}, {0x8E, 0x08}, {0x8E, 0x09}, {0x8D, 0xFF}, /* 0xF0-0xF3 */ + {0x8E, 0x1D}, {0x8E, 0x1E}, {0x8E, 0x10}, {0x8E, 0x1F}, /* 0xF4-0xF7 */ + {0x8E, 0x42}, {0x8E, 0x35}, {0x8E, 0x30}, {0x8E, 0x34}, /* 0xF8-0xFB */ + {0x8E, 0x4A}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8E, 0x47}, {0x8E, 0x49}, {0x8E, 0x4C}, {0x8E, 0x50}, /* 0x40-0x43 */ + {0x8E, 0x48}, {0x8E, 0x59}, {0x8E, 0x64}, {0x8E, 0x60}, /* 0x44-0x47 */ + {0x8E, 0x2A}, {0x8E, 0x63}, {0x8E, 0x55}, {0x8E, 0x76}, /* 0x48-0x4B */ + {0x8E, 0x72}, {0x8E, 0x7C}, {0x8E, 0x81}, {0x8E, 0x87}, /* 0x4C-0x4F */ + {0x8E, 0x85}, {0x8E, 0x84}, {0x8E, 0x8B}, {0x8E, 0x8A}, /* 0x50-0x53 */ + {0x8E, 0x93}, {0x8E, 0x91}, {0x8E, 0x94}, {0x8E, 0x99}, /* 0x54-0x57 */ + {0x8E, 0xAA}, {0x8E, 0xA1}, {0x8E, 0xAC}, {0x8E, 0xB0}, /* 0x58-0x5B */ + {0x8E, 0xC6}, {0x8E, 0xB1}, {0x8E, 0xBE}, {0x8E, 0xC5}, /* 0x5C-0x5F */ + {0x8E, 0xC8}, {0x8E, 0xCB}, {0x8E, 0xDB}, {0x8E, 0xE3}, /* 0x60-0x63 */ + {0x8E, 0xFC}, {0x8E, 0xFB}, {0x8E, 0xEB}, {0x8E, 0xFE}, /* 0x64-0x67 */ + {0x8F, 0x0A}, {0x8F, 0x05}, {0x8F, 0x15}, {0x8F, 0x12}, /* 0x68-0x6B */ + {0x8F, 0x19}, {0x8F, 0x13}, {0x8F, 0x1C}, {0x8F, 0x1F}, /* 0x6C-0x6F */ + {0x8F, 0x1B}, {0x8F, 0x0C}, {0x8F, 0x26}, {0x8F, 0x33}, /* 0x70-0x73 */ + {0x8F, 0x3B}, {0x8F, 0x39}, {0x8F, 0x45}, {0x8F, 0x42}, /* 0x74-0x77 */ + {0x8F, 0x3E}, {0x8F, 0x4C}, {0x8F, 0x49}, {0x8F, 0x46}, /* 0x78-0x7B */ + {0x8F, 0x4E}, {0x8F, 0x57}, {0x8F, 0x5C}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8F, 0x62}, {0x8F, 0x63}, {0x8F, 0x64}, {0x8F, 0x9C}, /* 0x80-0x83 */ + {0x8F, 0x9F}, {0x8F, 0xA3}, {0x8F, 0xAD}, {0x8F, 0xAF}, /* 0x84-0x87 */ + {0x8F, 0xB7}, {0x8F, 0xDA}, {0x8F, 0xE5}, {0x8F, 0xE2}, /* 0x88-0x8B */ + {0x8F, 0xEA}, {0x8F, 0xEF}, {0x90, 0x87}, {0x8F, 0xF4}, /* 0x8C-0x8F */ + {0x90, 0x05}, {0x8F, 0xF9}, {0x8F, 0xFA}, {0x90, 0x11}, /* 0x90-0x93 */ + {0x90, 0x15}, {0x90, 0x21}, {0x90, 0x0D}, {0x90, 0x1E}, /* 0x94-0x97 */ + {0x90, 0x16}, {0x90, 0x0B}, {0x90, 0x27}, {0x90, 0x36}, /* 0x98-0x9B */ + {0x90, 0x35}, {0x90, 0x39}, {0x8F, 0xF8}, {0x90, 0x4F}, /* 0x9C-0x9F */ + {0x90, 0x50}, {0x90, 0x51}, {0x90, 0x52}, {0x90, 0x0E}, /* 0xA0-0xA3 */ + {0x90, 0x49}, {0x90, 0x3E}, {0x90, 0x56}, {0x90, 0x58}, /* 0xA4-0xA7 */ + {0x90, 0x5E}, {0x90, 0x68}, {0x90, 0x6F}, {0x90, 0x76}, /* 0xA8-0xAB */ + {0x96, 0xA8}, {0x90, 0x72}, {0x90, 0x82}, {0x90, 0x7D}, /* 0xAC-0xAF */ + {0x90, 0x81}, {0x90, 0x80}, {0x90, 0x8A}, {0x90, 0x89}, /* 0xB0-0xB3 */ + {0x90, 0x8F}, {0x90, 0xA8}, {0x90, 0xAF}, {0x90, 0xB1}, /* 0xB4-0xB7 */ + {0x90, 0xB5}, {0x90, 0xE2}, {0x90, 0xE4}, {0x62, 0x48}, /* 0xB8-0xBB */ + {0x90, 0xDB}, {0x91, 0x02}, {0x91, 0x12}, {0x91, 0x19}, /* 0xBC-0xBF */ + {0x91, 0x32}, {0x91, 0x30}, {0x91, 0x4A}, {0x91, 0x56}, /* 0xC0-0xC3 */ + {0x91, 0x58}, {0x91, 0x63}, {0x91, 0x65}, {0x91, 0x69}, /* 0xC4-0xC7 */ + {0x91, 0x73}, {0x91, 0x72}, {0x91, 0x8B}, {0x91, 0x89}, /* 0xC8-0xCB */ + {0x91, 0x82}, {0x91, 0xA2}, {0x91, 0xAB}, {0x91, 0xAF}, /* 0xCC-0xCF */ + {0x91, 0xAA}, {0x91, 0xB5}, {0x91, 0xB4}, {0x91, 0xBA}, /* 0xD0-0xD3 */ + {0x91, 0xC0}, {0x91, 0xC1}, {0x91, 0xC9}, {0x91, 0xCB}, /* 0xD4-0xD7 */ + {0x91, 0xD0}, {0x91, 0xD6}, {0x91, 0xDF}, {0x91, 0xE1}, /* 0xD8-0xDB */ + {0x91, 0xDB}, {0x91, 0xFC}, {0x91, 0xF5}, {0x91, 0xF6}, /* 0xDC-0xDF */ + {0x92, 0x1E}, {0x91, 0xFF}, {0x92, 0x14}, {0x92, 0x2C}, /* 0xE0-0xE3 */ + {0x92, 0x15}, {0x92, 0x11}, {0x92, 0x5E}, {0x92, 0x57}, /* 0xE4-0xE7 */ + {0x92, 0x45}, {0x92, 0x49}, {0x92, 0x64}, {0x92, 0x48}, /* 0xE8-0xEB */ + {0x92, 0x95}, {0x92, 0x3F}, {0x92, 0x4B}, {0x92, 0x50}, /* 0xEC-0xEF */ + {0x92, 0x9C}, {0x92, 0x96}, {0x92, 0x93}, {0x92, 0x9B}, /* 0xF0-0xF3 */ + {0x92, 0x5A}, {0x92, 0xCF}, {0x92, 0xB9}, {0x92, 0xB7}, /* 0xF4-0xF7 */ + {0x92, 0xE9}, {0x93, 0x0F}, {0x92, 0xFA}, {0x93, 0x44}, /* 0xF8-0xFB */ + {0x93, 0x2E}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x93, 0x19}, {0x93, 0x22}, {0x93, 0x1A}, {0x93, 0x23}, /* 0x40-0x43 */ + {0x93, 0x3A}, {0x93, 0x35}, {0x93, 0x3B}, {0x93, 0x5C}, /* 0x44-0x47 */ + {0x93, 0x60}, {0x93, 0x7C}, {0x93, 0x6E}, {0x93, 0x56}, /* 0x48-0x4B */ + {0x93, 0xB0}, {0x93, 0xAC}, {0x93, 0xAD}, {0x93, 0x94}, /* 0x4C-0x4F */ + {0x93, 0xB9}, {0x93, 0xD6}, {0x93, 0xD7}, {0x93, 0xE8}, /* 0x50-0x53 */ + {0x93, 0xE5}, {0x93, 0xD8}, {0x93, 0xC3}, {0x93, 0xDD}, /* 0x54-0x57 */ + {0x93, 0xD0}, {0x93, 0xC8}, {0x93, 0xE4}, {0x94, 0x1A}, /* 0x58-0x5B */ + {0x94, 0x14}, {0x94, 0x13}, {0x94, 0x03}, {0x94, 0x07}, /* 0x5C-0x5F */ + {0x94, 0x10}, {0x94, 0x36}, {0x94, 0x2B}, {0x94, 0x35}, /* 0x60-0x63 */ + {0x94, 0x21}, {0x94, 0x3A}, {0x94, 0x41}, {0x94, 0x52}, /* 0x64-0x67 */ + {0x94, 0x44}, {0x94, 0x5B}, {0x94, 0x60}, {0x94, 0x62}, /* 0x68-0x6B */ + {0x94, 0x5E}, {0x94, 0x6A}, {0x92, 0x29}, {0x94, 0x70}, /* 0x6C-0x6F */ + {0x94, 0x75}, {0x94, 0x77}, {0x94, 0x7D}, {0x94, 0x5A}, /* 0x70-0x73 */ + {0x94, 0x7C}, {0x94, 0x7E}, {0x94, 0x81}, {0x94, 0x7F}, /* 0x74-0x77 */ + {0x95, 0x82}, {0x95, 0x87}, {0x95, 0x8A}, {0x95, 0x94}, /* 0x78-0x7B */ + {0x95, 0x96}, {0x95, 0x98}, {0x95, 0x99}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x95, 0xA0}, {0x95, 0xA8}, {0x95, 0xA7}, {0x95, 0xAD}, /* 0x80-0x83 */ + {0x95, 0xBC}, {0x95, 0xBB}, {0x95, 0xB9}, {0x95, 0xBE}, /* 0x84-0x87 */ + {0x95, 0xCA}, {0x6F, 0xF6}, {0x95, 0xC3}, {0x95, 0xCD}, /* 0x88-0x8B */ + {0x95, 0xCC}, {0x95, 0xD5}, {0x95, 0xD4}, {0x95, 0xD6}, /* 0x8C-0x8F */ + {0x95, 0xDC}, {0x95, 0xE1}, {0x95, 0xE5}, {0x95, 0xE2}, /* 0x90-0x93 */ + {0x96, 0x21}, {0x96, 0x28}, {0x96, 0x2E}, {0x96, 0x2F}, /* 0x94-0x97 */ + {0x96, 0x42}, {0x96, 0x4C}, {0x96, 0x4F}, {0x96, 0x4B}, /* 0x98-0x9B */ + {0x96, 0x77}, {0x96, 0x5C}, {0x96, 0x5E}, {0x96, 0x5D}, /* 0x9C-0x9F */ + {0x96, 0x5F}, {0x96, 0x66}, {0x96, 0x72}, {0x96, 0x6C}, /* 0xA0-0xA3 */ + {0x96, 0x8D}, {0x96, 0x98}, {0x96, 0x95}, {0x96, 0x97}, /* 0xA4-0xA7 */ + {0x96, 0xAA}, {0x96, 0xA7}, {0x96, 0xB1}, {0x96, 0xB2}, /* 0xA8-0xAB */ + {0x96, 0xB0}, {0x96, 0xB4}, {0x96, 0xB6}, {0x96, 0xB8}, /* 0xAC-0xAF */ + {0x96, 0xB9}, {0x96, 0xCE}, {0x96, 0xCB}, {0x96, 0xC9}, /* 0xB0-0xB3 */ + {0x96, 0xCD}, {0x89, 0x4D}, {0x96, 0xDC}, {0x97, 0x0D}, /* 0xB4-0xB7 */ + {0x96, 0xD5}, {0x96, 0xF9}, {0x97, 0x04}, {0x97, 0x06}, /* 0xB8-0xBB */ + {0x97, 0x08}, {0x97, 0x13}, {0x97, 0x0E}, {0x97, 0x11}, /* 0xBC-0xBF */ + {0x97, 0x0F}, {0x97, 0x16}, {0x97, 0x19}, {0x97, 0x24}, /* 0xC0-0xC3 */ + {0x97, 0x2A}, {0x97, 0x30}, {0x97, 0x39}, {0x97, 0x3D}, /* 0xC4-0xC7 */ + {0x97, 0x3E}, {0x97, 0x44}, {0x97, 0x46}, {0x97, 0x48}, /* 0xC8-0xCB */ + {0x97, 0x42}, {0x97, 0x49}, {0x97, 0x5C}, {0x97, 0x60}, /* 0xCC-0xCF */ + {0x97, 0x64}, {0x97, 0x66}, {0x97, 0x68}, {0x52, 0xD2}, /* 0xD0-0xD3 */ + {0x97, 0x6B}, {0x97, 0x71}, {0x97, 0x79}, {0x97, 0x85}, /* 0xD4-0xD7 */ + {0x97, 0x7C}, {0x97, 0x81}, {0x97, 0x7A}, {0x97, 0x86}, /* 0xD8-0xDB */ + {0x97, 0x8B}, {0x97, 0x8F}, {0x97, 0x90}, {0x97, 0x9C}, /* 0xDC-0xDF */ + {0x97, 0xA8}, {0x97, 0xA6}, {0x97, 0xA3}, {0x97, 0xB3}, /* 0xE0-0xE3 */ + {0x97, 0xB4}, {0x97, 0xC3}, {0x97, 0xC6}, {0x97, 0xC8}, /* 0xE4-0xE7 */ + {0x97, 0xCB}, {0x97, 0xDC}, {0x97, 0xED}, {0x9F, 0x4F}, /* 0xE8-0xEB */ + {0x97, 0xF2}, {0x7A, 0xDF}, {0x97, 0xF6}, {0x97, 0xF5}, /* 0xEC-0xEF */ + {0x98, 0x0F}, {0x98, 0x0C}, {0x98, 0x38}, {0x98, 0x24}, /* 0xF0-0xF3 */ + {0x98, 0x21}, {0x98, 0x37}, {0x98, 0x3D}, {0x98, 0x46}, /* 0xF4-0xF7 */ + {0x98, 0x4F}, {0x98, 0x4B}, {0x98, 0x6B}, {0x98, 0x6F}, /* 0xF8-0xFB */ + {0x98, 0x70}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x98, 0x71}, {0x98, 0x74}, {0x98, 0x73}, {0x98, 0xAA}, /* 0x40-0x43 */ + {0x98, 0xAF}, {0x98, 0xB1}, {0x98, 0xB6}, {0x98, 0xC4}, /* 0x44-0x47 */ + {0x98, 0xC3}, {0x98, 0xC6}, {0x98, 0xE9}, {0x98, 0xEB}, /* 0x48-0x4B */ + {0x99, 0x03}, {0x99, 0x09}, {0x99, 0x12}, {0x99, 0x14}, /* 0x4C-0x4F */ + {0x99, 0x18}, {0x99, 0x21}, {0x99, 0x1D}, {0x99, 0x1E}, /* 0x50-0x53 */ + {0x99, 0x24}, {0x99, 0x20}, {0x99, 0x2C}, {0x99, 0x2E}, /* 0x54-0x57 */ + {0x99, 0x3D}, {0x99, 0x3E}, {0x99, 0x42}, {0x99, 0x49}, /* 0x58-0x5B */ + {0x99, 0x45}, {0x99, 0x50}, {0x99, 0x4B}, {0x99, 0x51}, /* 0x5C-0x5F */ + {0x99, 0x52}, {0x99, 0x4C}, {0x99, 0x55}, {0x99, 0x97}, /* 0x60-0x63 */ + {0x99, 0x98}, {0x99, 0xA5}, {0x99, 0xAD}, {0x99, 0xAE}, /* 0x64-0x67 */ + {0x99, 0xBC}, {0x99, 0xDF}, {0x99, 0xDB}, {0x99, 0xDD}, /* 0x68-0x6B */ + {0x99, 0xD8}, {0x99, 0xD1}, {0x99, 0xED}, {0x99, 0xEE}, /* 0x6C-0x6F */ + {0x99, 0xF1}, {0x99, 0xF2}, {0x99, 0xFB}, {0x99, 0xF8}, /* 0x70-0x73 */ + {0x9A, 0x01}, {0x9A, 0x0F}, {0x9A, 0x05}, {0x99, 0xE2}, /* 0x74-0x77 */ + {0x9A, 0x19}, {0x9A, 0x2B}, {0x9A, 0x37}, {0x9A, 0x45}, /* 0x78-0x7B */ + {0x9A, 0x42}, {0x9A, 0x40}, {0x9A, 0x43}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9A, 0x3E}, {0x9A, 0x55}, {0x9A, 0x4D}, {0x9A, 0x5B}, /* 0x80-0x83 */ + {0x9A, 0x57}, {0x9A, 0x5F}, {0x9A, 0x62}, {0x9A, 0x65}, /* 0x84-0x87 */ + {0x9A, 0x64}, {0x9A, 0x69}, {0x9A, 0x6B}, {0x9A, 0x6A}, /* 0x88-0x8B */ + {0x9A, 0xAD}, {0x9A, 0xB0}, {0x9A, 0xBC}, {0x9A, 0xC0}, /* 0x8C-0x8F */ + {0x9A, 0xCF}, {0x9A, 0xD1}, {0x9A, 0xD3}, {0x9A, 0xD4}, /* 0x90-0x93 */ + {0x9A, 0xDE}, {0x9A, 0xDF}, {0x9A, 0xE2}, {0x9A, 0xE3}, /* 0x94-0x97 */ + {0x9A, 0xE6}, {0x9A, 0xEF}, {0x9A, 0xEB}, {0x9A, 0xEE}, /* 0x98-0x9B */ + {0x9A, 0xF4}, {0x9A, 0xF1}, {0x9A, 0xF7}, {0x9A, 0xFB}, /* 0x9C-0x9F */ + {0x9B, 0x06}, {0x9B, 0x18}, {0x9B, 0x1A}, {0x9B, 0x1F}, /* 0xA0-0xA3 */ + {0x9B, 0x22}, {0x9B, 0x23}, {0x9B, 0x25}, {0x9B, 0x27}, /* 0xA4-0xA7 */ + {0x9B, 0x28}, {0x9B, 0x29}, {0x9B, 0x2A}, {0x9B, 0x2E}, /* 0xA8-0xAB */ + {0x9B, 0x2F}, {0x9B, 0x32}, {0x9B, 0x44}, {0x9B, 0x43}, /* 0xAC-0xAF */ + {0x9B, 0x4F}, {0x9B, 0x4D}, {0x9B, 0x4E}, {0x9B, 0x51}, /* 0xB0-0xB3 */ + {0x9B, 0x58}, {0x9B, 0x74}, {0x9B, 0x93}, {0x9B, 0x83}, /* 0xB4-0xB7 */ + {0x9B, 0x91}, {0x9B, 0x96}, {0x9B, 0x97}, {0x9B, 0x9F}, /* 0xB8-0xBB */ + {0x9B, 0xA0}, {0x9B, 0xA8}, {0x9B, 0xB4}, {0x9B, 0xC0}, /* 0xBC-0xBF */ + {0x9B, 0xCA}, {0x9B, 0xB9}, {0x9B, 0xC6}, {0x9B, 0xCF}, /* 0xC0-0xC3 */ + {0x9B, 0xD1}, {0x9B, 0xD2}, {0x9B, 0xE3}, {0x9B, 0xE2}, /* 0xC4-0xC7 */ + {0x9B, 0xE4}, {0x9B, 0xD4}, {0x9B, 0xE1}, {0x9C, 0x3A}, /* 0xC8-0xCB */ + {0x9B, 0xF2}, {0x9B, 0xF1}, {0x9B, 0xF0}, {0x9C, 0x15}, /* 0xCC-0xCF */ + {0x9C, 0x14}, {0x9C, 0x09}, {0x9C, 0x13}, {0x9C, 0x0C}, /* 0xD0-0xD3 */ + {0x9C, 0x06}, {0x9C, 0x08}, {0x9C, 0x12}, {0x9C, 0x0A}, /* 0xD4-0xD7 */ + {0x9C, 0x04}, {0x9C, 0x2E}, {0x9C, 0x1B}, {0x9C, 0x25}, /* 0xD8-0xDB */ + {0x9C, 0x24}, {0x9C, 0x21}, {0x9C, 0x30}, {0x9C, 0x47}, /* 0xDC-0xDF */ + {0x9C, 0x32}, {0x9C, 0x46}, {0x9C, 0x3E}, {0x9C, 0x5A}, /* 0xE0-0xE3 */ + {0x9C, 0x60}, {0x9C, 0x67}, {0x9C, 0x76}, {0x9C, 0x78}, /* 0xE4-0xE7 */ + {0x9C, 0xE7}, {0x9C, 0xEC}, {0x9C, 0xF0}, {0x9D, 0x09}, /* 0xE8-0xEB */ + {0x9D, 0x08}, {0x9C, 0xEB}, {0x9D, 0x03}, {0x9D, 0x06}, /* 0xEC-0xEF */ + {0x9D, 0x2A}, {0x9D, 0x26}, {0x9D, 0xAF}, {0x9D, 0x23}, /* 0xF0-0xF3 */ + {0x9D, 0x1F}, {0x9D, 0x44}, {0x9D, 0x15}, {0x9D, 0x12}, /* 0xF4-0xF7 */ + {0x9D, 0x41}, {0x9D, 0x3F}, {0x9D, 0x3E}, {0x9D, 0x46}, /* 0xF8-0xFB */ + {0x9D, 0x48}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9D, 0x5D}, {0x9D, 0x5E}, {0x9D, 0x64}, {0x9D, 0x51}, /* 0x40-0x43 */ + {0x9D, 0x50}, {0x9D, 0x59}, {0x9D, 0x72}, {0x9D, 0x89}, /* 0x44-0x47 */ + {0x9D, 0x87}, {0x9D, 0xAB}, {0x9D, 0x6F}, {0x9D, 0x7A}, /* 0x48-0x4B */ + {0x9D, 0x9A}, {0x9D, 0xA4}, {0x9D, 0xA9}, {0x9D, 0xB2}, /* 0x4C-0x4F */ + {0x9D, 0xC4}, {0x9D, 0xC1}, {0x9D, 0xBB}, {0x9D, 0xB8}, /* 0x50-0x53 */ + {0x9D, 0xBA}, {0x9D, 0xC6}, {0x9D, 0xCF}, {0x9D, 0xC2}, /* 0x54-0x57 */ + {0x9D, 0xD9}, {0x9D, 0xD3}, {0x9D, 0xF8}, {0x9D, 0xE6}, /* 0x58-0x5B */ + {0x9D, 0xED}, {0x9D, 0xEF}, {0x9D, 0xFD}, {0x9E, 0x1A}, /* 0x5C-0x5F */ + {0x9E, 0x1B}, {0x9E, 0x1E}, {0x9E, 0x75}, {0x9E, 0x79}, /* 0x60-0x63 */ + {0x9E, 0x7D}, {0x9E, 0x81}, {0x9E, 0x88}, {0x9E, 0x8B}, /* 0x64-0x67 */ + {0x9E, 0x8C}, {0x9E, 0x92}, {0x9E, 0x95}, {0x9E, 0x91}, /* 0x68-0x6B */ + {0x9E, 0x9D}, {0x9E, 0xA5}, {0x9E, 0xA9}, {0x9E, 0xB8}, /* 0x6C-0x6F */ + {0x9E, 0xAA}, {0x9E, 0xAD}, {0x97, 0x61}, {0x9E, 0xCC}, /* 0x70-0x73 */ + {0x9E, 0xCE}, {0x9E, 0xCF}, {0x9E, 0xD0}, {0x9E, 0xD4}, /* 0x74-0x77 */ + {0x9E, 0xDC}, {0x9E, 0xDE}, {0x9E, 0xDD}, {0x9E, 0xE0}, /* 0x78-0x7B */ + {0x9E, 0xE5}, {0x9E, 0xE8}, {0x9E, 0xEF}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9E, 0xF4}, {0x9E, 0xF6}, {0x9E, 0xF7}, {0x9E, 0xF9}, /* 0x80-0x83 */ + {0x9E, 0xFB}, {0x9E, 0xFC}, {0x9E, 0xFD}, {0x9F, 0x07}, /* 0x84-0x87 */ + {0x9F, 0x08}, {0x76, 0xB7}, {0x9F, 0x15}, {0x9F, 0x21}, /* 0x88-0x8B */ + {0x9F, 0x2C}, {0x9F, 0x3E}, {0x9F, 0x4A}, {0x9F, 0x52}, /* 0x8C-0x8F */ + {0x9F, 0x54}, {0x9F, 0x63}, {0x9F, 0x5F}, {0x9F, 0x60}, /* 0x90-0x93 */ + {0x9F, 0x61}, {0x9F, 0x66}, {0x9F, 0x67}, {0x9F, 0x6C}, /* 0x94-0x97 */ + {0x9F, 0x6A}, {0x9F, 0x77}, {0x9F, 0x72}, {0x9F, 0x76}, /* 0x98-0x9B */ + {0x9F, 0x95}, {0x9F, 0x9C}, {0x9F, 0xA0}, {0x58, 0x2F}, /* 0x9C-0x9F */ + {0x69, 0xC7}, {0x90, 0x59}, {0x74, 0x64}, {0x51, 0xDC}, /* 0xA0-0xA3 */ + {0x71, 0x99}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_ED[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7E, 0x8A}, {0x89, 0x1C}, {0x93, 0x48}, {0x92, 0x88}, /* 0x40-0x43 */ + {0x84, 0xDC}, {0x4F, 0xC9}, {0x70, 0xBB}, {0x66, 0x31}, /* 0x44-0x47 */ + {0x68, 0xC8}, {0x92, 0xF9}, {0x66, 0xFB}, {0x5F, 0x45}, /* 0x48-0x4B */ + {0x4E, 0x28}, {0x4E, 0xE1}, {0x4E, 0xFC}, {0x4F, 0x00}, /* 0x4C-0x4F */ + {0x4F, 0x03}, {0x4F, 0x39}, {0x4F, 0x56}, {0x4F, 0x92}, /* 0x50-0x53 */ + {0x4F, 0x8A}, {0x4F, 0x9A}, {0x4F, 0x94}, {0x4F, 0xCD}, /* 0x54-0x57 */ + {0x50, 0x40}, {0x50, 0x22}, {0x4F, 0xFF}, {0x50, 0x1E}, /* 0x58-0x5B */ + {0x50, 0x46}, {0x50, 0x70}, {0x50, 0x42}, {0x50, 0x94}, /* 0x5C-0x5F */ + {0x50, 0xF4}, {0x50, 0xD8}, {0x51, 0x4A}, {0x51, 0x64}, /* 0x60-0x63 */ + {0x51, 0x9D}, {0x51, 0xBE}, {0x51, 0xEC}, {0x52, 0x15}, /* 0x64-0x67 */ + {0x52, 0x9C}, {0x52, 0xA6}, {0x52, 0xC0}, {0x52, 0xDB}, /* 0x68-0x6B */ + {0x53, 0x00}, {0x53, 0x07}, {0x53, 0x24}, {0x53, 0x72}, /* 0x6C-0x6F */ + {0x53, 0x93}, {0x53, 0xB2}, {0x53, 0xDD}, {0xFA, 0x0E}, /* 0x70-0x73 */ + {0x54, 0x9C}, {0x54, 0x8A}, {0x54, 0xA9}, {0x54, 0xFF}, /* 0x74-0x77 */ + {0x55, 0x86}, {0x57, 0x59}, {0x57, 0x65}, {0x57, 0xAC}, /* 0x78-0x7B */ + {0x57, 0xC8}, {0x57, 0xC7}, {0xFA, 0x0F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0xFA, 0x10}, {0x58, 0x9E}, {0x58, 0xB2}, {0x59, 0x0B}, /* 0x80-0x83 */ + {0x59, 0x53}, {0x59, 0x5B}, {0x59, 0x5D}, {0x59, 0x63}, /* 0x84-0x87 */ + {0x59, 0xA4}, {0x59, 0xBA}, {0x5B, 0x56}, {0x5B, 0xC0}, /* 0x88-0x8B */ + {0x75, 0x2F}, {0x5B, 0xD8}, {0x5B, 0xEC}, {0x5C, 0x1E}, /* 0x8C-0x8F */ + {0x5C, 0xA6}, {0x5C, 0xBA}, {0x5C, 0xF5}, {0x5D, 0x27}, /* 0x90-0x93 */ + {0x5D, 0x53}, {0xFA, 0x11}, {0x5D, 0x42}, {0x5D, 0x6D}, /* 0x94-0x97 */ + {0x5D, 0xB8}, {0x5D, 0xB9}, {0x5D, 0xD0}, {0x5F, 0x21}, /* 0x98-0x9B */ + {0x5F, 0x34}, {0x5F, 0x67}, {0x5F, 0xB7}, {0x5F, 0xDE}, /* 0x9C-0x9F */ + {0x60, 0x5D}, {0x60, 0x85}, {0x60, 0x8A}, {0x60, 0xDE}, /* 0xA0-0xA3 */ + {0x60, 0xD5}, {0x61, 0x20}, {0x60, 0xF2}, {0x61, 0x11}, /* 0xA4-0xA7 */ + {0x61, 0x37}, {0x61, 0x30}, {0x61, 0x98}, {0x62, 0x13}, /* 0xA8-0xAB */ + {0x62, 0xA6}, {0x63, 0xF5}, {0x64, 0x60}, {0x64, 0x9D}, /* 0xAC-0xAF */ + {0x64, 0xCE}, {0x65, 0x4E}, {0x66, 0x00}, {0x66, 0x15}, /* 0xB0-0xB3 */ + {0x66, 0x3B}, {0x66, 0x09}, {0x66, 0x2E}, {0x66, 0x1E}, /* 0xB4-0xB7 */ + {0x66, 0x24}, {0x66, 0x65}, {0x66, 0x57}, {0x66, 0x59}, /* 0xB8-0xBB */ + {0xFA, 0x12}, {0x66, 0x73}, {0x66, 0x99}, {0x66, 0xA0}, /* 0xBC-0xBF */ + {0x66, 0xB2}, {0x66, 0xBF}, {0x66, 0xFA}, {0x67, 0x0E}, /* 0xC0-0xC3 */ + {0xF9, 0x29}, {0x67, 0x66}, {0x67, 0xBB}, {0x68, 0x52}, /* 0xC4-0xC7 */ + {0x67, 0xC0}, {0x68, 0x01}, {0x68, 0x44}, {0x68, 0xCF}, /* 0xC8-0xCB */ + {0xFA, 0x13}, {0x69, 0x68}, {0xFA, 0x14}, {0x69, 0x98}, /* 0xCC-0xCF */ + {0x69, 0xE2}, {0x6A, 0x30}, {0x6A, 0x6B}, {0x6A, 0x46}, /* 0xD0-0xD3 */ + {0x6A, 0x73}, {0x6A, 0x7E}, {0x6A, 0xE2}, {0x6A, 0xE4}, /* 0xD4-0xD7 */ + {0x6B, 0xD6}, {0x6C, 0x3F}, {0x6C, 0x5C}, {0x6C, 0x86}, /* 0xD8-0xDB */ + {0x6C, 0x6F}, {0x6C, 0xDA}, {0x6D, 0x04}, {0x6D, 0x87}, /* 0xDC-0xDF */ + {0x6D, 0x6F}, {0x6D, 0x96}, {0x6D, 0xAC}, {0x6D, 0xCF}, /* 0xE0-0xE3 */ + {0x6D, 0xF8}, {0x6D, 0xF2}, {0x6D, 0xFC}, {0x6E, 0x39}, /* 0xE4-0xE7 */ + {0x6E, 0x5C}, {0x6E, 0x27}, {0x6E, 0x3C}, {0x6E, 0xBF}, /* 0xE8-0xEB */ + {0x6F, 0x88}, {0x6F, 0xB5}, {0x6F, 0xF5}, {0x70, 0x05}, /* 0xEC-0xEF */ + {0x70, 0x07}, {0x70, 0x28}, {0x70, 0x85}, {0x70, 0xAB}, /* 0xF0-0xF3 */ + {0x71, 0x0F}, {0x71, 0x04}, {0x71, 0x5C}, {0x71, 0x46}, /* 0xF4-0xF7 */ + {0x71, 0x47}, {0xFA, 0x15}, {0x71, 0xC1}, {0x71, 0xFE}, /* 0xF8-0xFB */ + {0x72, 0xB1}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x72, 0xBE}, {0x73, 0x24}, {0xFA, 0x16}, {0x73, 0x77}, /* 0x40-0x43 */ + {0x73, 0xBD}, {0x73, 0xC9}, {0x73, 0xD6}, {0x73, 0xE3}, /* 0x44-0x47 */ + {0x73, 0xD2}, {0x74, 0x07}, {0x73, 0xF5}, {0x74, 0x26}, /* 0x48-0x4B */ + {0x74, 0x2A}, {0x74, 0x29}, {0x74, 0x2E}, {0x74, 0x62}, /* 0x4C-0x4F */ + {0x74, 0x89}, {0x74, 0x9F}, {0x75, 0x01}, {0x75, 0x6F}, /* 0x50-0x53 */ + {0x76, 0x82}, {0x76, 0x9C}, {0x76, 0x9E}, {0x76, 0x9B}, /* 0x54-0x57 */ + {0x76, 0xA6}, {0xFA, 0x17}, {0x77, 0x46}, {0x52, 0xAF}, /* 0x58-0x5B */ + {0x78, 0x21}, {0x78, 0x4E}, {0x78, 0x64}, {0x78, 0x7A}, /* 0x5C-0x5F */ + {0x79, 0x30}, {0xFA, 0x18}, {0xFA, 0x19}, {0xFA, 0x1A}, /* 0x60-0x63 */ + {0x79, 0x94}, {0xFA, 0x1B}, {0x79, 0x9B}, {0x7A, 0xD1}, /* 0x64-0x67 */ + {0x7A, 0xE7}, {0xFA, 0x1C}, {0x7A, 0xEB}, {0x7B, 0x9E}, /* 0x68-0x6B */ + {0xFA, 0x1D}, {0x7D, 0x48}, {0x7D, 0x5C}, {0x7D, 0xB7}, /* 0x6C-0x6F */ + {0x7D, 0xA0}, {0x7D, 0xD6}, {0x7E, 0x52}, {0x7F, 0x47}, /* 0x70-0x73 */ + {0x7F, 0xA1}, {0xFA, 0x1E}, {0x83, 0x01}, {0x83, 0x62}, /* 0x74-0x77 */ + {0x83, 0x7F}, {0x83, 0xC7}, {0x83, 0xF6}, {0x84, 0x48}, /* 0x78-0x7B */ + {0x84, 0xB4}, {0x85, 0x53}, {0x85, 0x59}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x85, 0x6B}, {0xFA, 0x1F}, {0x85, 0xB0}, {0xFA, 0x20}, /* 0x80-0x83 */ + {0xFA, 0x21}, {0x88, 0x07}, {0x88, 0xF5}, {0x8A, 0x12}, /* 0x84-0x87 */ + {0x8A, 0x37}, {0x8A, 0x79}, {0x8A, 0xA7}, {0x8A, 0xBE}, /* 0x88-0x8B */ + {0x8A, 0xDF}, {0xFA, 0x22}, {0x8A, 0xF6}, {0x8B, 0x53}, /* 0x8C-0x8F */ + {0x8B, 0x7F}, {0x8C, 0xF0}, {0x8C, 0xF4}, {0x8D, 0x12}, /* 0x90-0x93 */ + {0x8D, 0x76}, {0xFA, 0x23}, {0x8E, 0xCF}, {0xFA, 0x24}, /* 0x94-0x97 */ + {0xFA, 0x25}, {0x90, 0x67}, {0x90, 0xDE}, {0xFA, 0x26}, /* 0x98-0x9B */ + {0x91, 0x15}, {0x91, 0x27}, {0x91, 0xDA}, {0x91, 0xD7}, /* 0x9C-0x9F */ + {0x91, 0xDE}, {0x91, 0xED}, {0x91, 0xEE}, {0x91, 0xE4}, /* 0xA0-0xA3 */ + {0x91, 0xE5}, {0x92, 0x06}, {0x92, 0x10}, {0x92, 0x0A}, /* 0xA4-0xA7 */ + {0x92, 0x3A}, {0x92, 0x40}, {0x92, 0x3C}, {0x92, 0x4E}, /* 0xA8-0xAB */ + {0x92, 0x59}, {0x92, 0x51}, {0x92, 0x39}, {0x92, 0x67}, /* 0xAC-0xAF */ + {0x92, 0xA7}, {0x92, 0x77}, {0x92, 0x78}, {0x92, 0xE7}, /* 0xB0-0xB3 */ + {0x92, 0xD7}, {0x92, 0xD9}, {0x92, 0xD0}, {0xFA, 0x27}, /* 0xB4-0xB7 */ + {0x92, 0xD5}, {0x92, 0xE0}, {0x92, 0xD3}, {0x93, 0x25}, /* 0xB8-0xBB */ + {0x93, 0x21}, {0x92, 0xFB}, {0xFA, 0x28}, {0x93, 0x1E}, /* 0xBC-0xBF */ + {0x92, 0xFF}, {0x93, 0x1D}, {0x93, 0x02}, {0x93, 0x70}, /* 0xC0-0xC3 */ + {0x93, 0x57}, {0x93, 0xA4}, {0x93, 0xC6}, {0x93, 0xDE}, /* 0xC4-0xC7 */ + {0x93, 0xF8}, {0x94, 0x31}, {0x94, 0x45}, {0x94, 0x48}, /* 0xC8-0xCB */ + {0x95, 0x92}, {0xF9, 0xDC}, {0xFA, 0x29}, {0x96, 0x9D}, /* 0xCC-0xCF */ + {0x96, 0xAF}, {0x97, 0x33}, {0x97, 0x3B}, {0x97, 0x43}, /* 0xD0-0xD3 */ + {0x97, 0x4D}, {0x97, 0x4F}, {0x97, 0x51}, {0x97, 0x55}, /* 0xD4-0xD7 */ + {0x98, 0x57}, {0x98, 0x65}, {0xFA, 0x2A}, {0xFA, 0x2B}, /* 0xD8-0xDB */ + {0x99, 0x27}, {0xFA, 0x2C}, {0x99, 0x9E}, {0x9A, 0x4E}, /* 0xDC-0xDF */ + {0x9A, 0xD9}, {0x9A, 0xDC}, {0x9B, 0x75}, {0x9B, 0x72}, /* 0xE0-0xE3 */ + {0x9B, 0x8F}, {0x9B, 0xB1}, {0x9B, 0xBB}, {0x9C, 0x00}, /* 0xE4-0xE7 */ + {0x9D, 0x70}, {0x9D, 0x6B}, {0xFA, 0x2D}, {0x9E, 0x19}, /* 0xE8-0xEB */ + {0x9E, 0xD1}, {0x00, 0x3F}, {0x00, 0x3F}, {0x21, 0x70}, /* 0xEC-0xEF */ + {0x21, 0x71}, {0x21, 0x72}, {0x21, 0x73}, {0x21, 0x74}, /* 0xF0-0xF3 */ + {0x21, 0x75}, {0x21, 0x76}, {0x21, 0x77}, {0x21, 0x78}, /* 0xF4-0xF7 */ + {0x21, 0x79}, {0xFF, 0xE2}, {0xFF, 0xE4}, {0xFF, 0x07}, /* 0xF8-0xFB */ + {0xFF, 0x02}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x21, 0x70}, {0x21, 0x71}, {0x21, 0x72}, {0x21, 0x73}, /* 0x40-0x43 */ + {0x21, 0x74}, {0x21, 0x75}, {0x21, 0x76}, {0x21, 0x77}, /* 0x44-0x47 */ + {0x21, 0x78}, {0x21, 0x79}, {0x21, 0x60}, {0x21, 0x61}, /* 0x48-0x4B */ + {0x21, 0x62}, {0x21, 0x63}, {0x21, 0x64}, {0x21, 0x65}, /* 0x4C-0x4F */ + {0x21, 0x66}, {0x21, 0x67}, {0x21, 0x68}, {0x21, 0x69}, /* 0x50-0x53 */ + {0xFF, 0xE2}, {0xFF, 0xE4}, {0xFF, 0x07}, {0xFF, 0x02}, /* 0x54-0x57 */ + {0x32, 0x31}, {0x21, 0x16}, {0x21, 0x21}, {0x22, 0x35}, /* 0x58-0x5B */ + {0x7E, 0x8A}, {0x89, 0x1C}, {0x93, 0x48}, {0x92, 0x88}, /* 0x5C-0x5F */ + {0x84, 0xDC}, {0x4F, 0xC9}, {0x70, 0xBB}, {0x66, 0x31}, /* 0x60-0x63 */ + {0x68, 0xC8}, {0x92, 0xF9}, {0x66, 0xFB}, {0x5F, 0x45}, /* 0x64-0x67 */ + {0x4E, 0x28}, {0x4E, 0xE1}, {0x4E, 0xFC}, {0x4F, 0x00}, /* 0x68-0x6B */ + {0x4F, 0x03}, {0x4F, 0x39}, {0x4F, 0x56}, {0x4F, 0x92}, /* 0x6C-0x6F */ + {0x4F, 0x8A}, {0x4F, 0x9A}, {0x4F, 0x94}, {0x4F, 0xCD}, /* 0x70-0x73 */ + {0x50, 0x40}, {0x50, 0x22}, {0x4F, 0xFF}, {0x50, 0x1E}, /* 0x74-0x77 */ + {0x50, 0x46}, {0x50, 0x70}, {0x50, 0x42}, {0x50, 0x94}, /* 0x78-0x7B */ + {0x50, 0xF4}, {0x50, 0xD8}, {0x51, 0x4A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x51, 0x64}, {0x51, 0x9D}, {0x51, 0xBE}, {0x51, 0xEC}, /* 0x80-0x83 */ + {0x52, 0x15}, {0x52, 0x9C}, {0x52, 0xA6}, {0x52, 0xC0}, /* 0x84-0x87 */ + {0x52, 0xDB}, {0x53, 0x00}, {0x53, 0x07}, {0x53, 0x24}, /* 0x88-0x8B */ + {0x53, 0x72}, {0x53, 0x93}, {0x53, 0xB2}, {0x53, 0xDD}, /* 0x8C-0x8F */ + {0xFA, 0x0E}, {0x54, 0x9C}, {0x54, 0x8A}, {0x54, 0xA9}, /* 0x90-0x93 */ + {0x54, 0xFF}, {0x55, 0x86}, {0x57, 0x59}, {0x57, 0x65}, /* 0x94-0x97 */ + {0x57, 0xAC}, {0x57, 0xC8}, {0x57, 0xC7}, {0xFA, 0x0F}, /* 0x98-0x9B */ + {0xFA, 0x10}, {0x58, 0x9E}, {0x58, 0xB2}, {0x59, 0x0B}, /* 0x9C-0x9F */ + {0x59, 0x53}, {0x59, 0x5B}, {0x59, 0x5D}, {0x59, 0x63}, /* 0xA0-0xA3 */ + {0x59, 0xA4}, {0x59, 0xBA}, {0x5B, 0x56}, {0x5B, 0xC0}, /* 0xA4-0xA7 */ + {0x75, 0x2F}, {0x5B, 0xD8}, {0x5B, 0xEC}, {0x5C, 0x1E}, /* 0xA8-0xAB */ + {0x5C, 0xA6}, {0x5C, 0xBA}, {0x5C, 0xF5}, {0x5D, 0x27}, /* 0xAC-0xAF */ + {0x5D, 0x53}, {0xFA, 0x11}, {0x5D, 0x42}, {0x5D, 0x6D}, /* 0xB0-0xB3 */ + {0x5D, 0xB8}, {0x5D, 0xB9}, {0x5D, 0xD0}, {0x5F, 0x21}, /* 0xB4-0xB7 */ + {0x5F, 0x34}, {0x5F, 0x67}, {0x5F, 0xB7}, {0x5F, 0xDE}, /* 0xB8-0xBB */ + {0x60, 0x5D}, {0x60, 0x85}, {0x60, 0x8A}, {0x60, 0xDE}, /* 0xBC-0xBF */ + {0x60, 0xD5}, {0x61, 0x20}, {0x60, 0xF2}, {0x61, 0x11}, /* 0xC0-0xC3 */ + {0x61, 0x37}, {0x61, 0x30}, {0x61, 0x98}, {0x62, 0x13}, /* 0xC4-0xC7 */ + {0x62, 0xA6}, {0x63, 0xF5}, {0x64, 0x60}, {0x64, 0x9D}, /* 0xC8-0xCB */ + {0x64, 0xCE}, {0x65, 0x4E}, {0x66, 0x00}, {0x66, 0x15}, /* 0xCC-0xCF */ + {0x66, 0x3B}, {0x66, 0x09}, {0x66, 0x2E}, {0x66, 0x1E}, /* 0xD0-0xD3 */ + {0x66, 0x24}, {0x66, 0x65}, {0x66, 0x57}, {0x66, 0x59}, /* 0xD4-0xD7 */ + {0xFA, 0x12}, {0x66, 0x73}, {0x66, 0x99}, {0x66, 0xA0}, /* 0xD8-0xDB */ + {0x66, 0xB2}, {0x66, 0xBF}, {0x66, 0xFA}, {0x67, 0x0E}, /* 0xDC-0xDF */ + {0xF9, 0x29}, {0x67, 0x66}, {0x67, 0xBB}, {0x68, 0x52}, /* 0xE0-0xE3 */ + {0x67, 0xC0}, {0x68, 0x01}, {0x68, 0x44}, {0x68, 0xCF}, /* 0xE4-0xE7 */ + {0xFA, 0x13}, {0x69, 0x68}, {0xFA, 0x14}, {0x69, 0x98}, /* 0xE8-0xEB */ + {0x69, 0xE2}, {0x6A, 0x30}, {0x6A, 0x6B}, {0x6A, 0x46}, /* 0xEC-0xEF */ + {0x6A, 0x73}, {0x6A, 0x7E}, {0x6A, 0xE2}, {0x6A, 0xE4}, /* 0xF0-0xF3 */ + {0x6B, 0xD6}, {0x6C, 0x3F}, {0x6C, 0x5C}, {0x6C, 0x86}, /* 0xF4-0xF7 */ + {0x6C, 0x6F}, {0x6C, 0xDA}, {0x6D, 0x04}, {0x6D, 0x87}, /* 0xF8-0xFB */ + {0x6D, 0x6F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6D, 0x96}, {0x6D, 0xAC}, {0x6D, 0xCF}, {0x6D, 0xF8}, /* 0x40-0x43 */ + {0x6D, 0xF2}, {0x6D, 0xFC}, {0x6E, 0x39}, {0x6E, 0x5C}, /* 0x44-0x47 */ + {0x6E, 0x27}, {0x6E, 0x3C}, {0x6E, 0xBF}, {0x6F, 0x88}, /* 0x48-0x4B */ + {0x6F, 0xB5}, {0x6F, 0xF5}, {0x70, 0x05}, {0x70, 0x07}, /* 0x4C-0x4F */ + {0x70, 0x28}, {0x70, 0x85}, {0x70, 0xAB}, {0x71, 0x0F}, /* 0x50-0x53 */ + {0x71, 0x04}, {0x71, 0x5C}, {0x71, 0x46}, {0x71, 0x47}, /* 0x54-0x57 */ + {0xFA, 0x15}, {0x71, 0xC1}, {0x71, 0xFE}, {0x72, 0xB1}, /* 0x58-0x5B */ + {0x72, 0xBE}, {0x73, 0x24}, {0xFA, 0x16}, {0x73, 0x77}, /* 0x5C-0x5F */ + {0x73, 0xBD}, {0x73, 0xC9}, {0x73, 0xD6}, {0x73, 0xE3}, /* 0x60-0x63 */ + {0x73, 0xD2}, {0x74, 0x07}, {0x73, 0xF5}, {0x74, 0x26}, /* 0x64-0x67 */ + {0x74, 0x2A}, {0x74, 0x29}, {0x74, 0x2E}, {0x74, 0x62}, /* 0x68-0x6B */ + {0x74, 0x89}, {0x74, 0x9F}, {0x75, 0x01}, {0x75, 0x6F}, /* 0x6C-0x6F */ + {0x76, 0x82}, {0x76, 0x9C}, {0x76, 0x9E}, {0x76, 0x9B}, /* 0x70-0x73 */ + {0x76, 0xA6}, {0xFA, 0x17}, {0x77, 0x46}, {0x52, 0xAF}, /* 0x74-0x77 */ + {0x78, 0x21}, {0x78, 0x4E}, {0x78, 0x64}, {0x78, 0x7A}, /* 0x78-0x7B */ + {0x79, 0x30}, {0xFA, 0x18}, {0xFA, 0x19}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0xFA, 0x1A}, {0x79, 0x94}, {0xFA, 0x1B}, {0x79, 0x9B}, /* 0x80-0x83 */ + {0x7A, 0xD1}, {0x7A, 0xE7}, {0xFA, 0x1C}, {0x7A, 0xEB}, /* 0x84-0x87 */ + {0x7B, 0x9E}, {0xFA, 0x1D}, {0x7D, 0x48}, {0x7D, 0x5C}, /* 0x88-0x8B */ + {0x7D, 0xB7}, {0x7D, 0xA0}, {0x7D, 0xD6}, {0x7E, 0x52}, /* 0x8C-0x8F */ + {0x7F, 0x47}, {0x7F, 0xA1}, {0xFA, 0x1E}, {0x83, 0x01}, /* 0x90-0x93 */ + {0x83, 0x62}, {0x83, 0x7F}, {0x83, 0xC7}, {0x83, 0xF6}, /* 0x94-0x97 */ + {0x84, 0x48}, {0x84, 0xB4}, {0x85, 0x53}, {0x85, 0x59}, /* 0x98-0x9B */ + {0x85, 0x6B}, {0xFA, 0x1F}, {0x85, 0xB0}, {0xFA, 0x20}, /* 0x9C-0x9F */ + {0xFA, 0x21}, {0x88, 0x07}, {0x88, 0xF5}, {0x8A, 0x12}, /* 0xA0-0xA3 */ + {0x8A, 0x37}, {0x8A, 0x79}, {0x8A, 0xA7}, {0x8A, 0xBE}, /* 0xA4-0xA7 */ + {0x8A, 0xDF}, {0xFA, 0x22}, {0x8A, 0xF6}, {0x8B, 0x53}, /* 0xA8-0xAB */ + {0x8B, 0x7F}, {0x8C, 0xF0}, {0x8C, 0xF4}, {0x8D, 0x12}, /* 0xAC-0xAF */ + {0x8D, 0x76}, {0xFA, 0x23}, {0x8E, 0xCF}, {0xFA, 0x24}, /* 0xB0-0xB3 */ + {0xFA, 0x25}, {0x90, 0x67}, {0x90, 0xDE}, {0xFA, 0x26}, /* 0xB4-0xB7 */ + {0x91, 0x15}, {0x91, 0x27}, {0x91, 0xDA}, {0x91, 0xD7}, /* 0xB8-0xBB */ + {0x91, 0xDE}, {0x91, 0xED}, {0x91, 0xEE}, {0x91, 0xE4}, /* 0xBC-0xBF */ + {0x91, 0xE5}, {0x92, 0x06}, {0x92, 0x10}, {0x92, 0x0A}, /* 0xC0-0xC3 */ + {0x92, 0x3A}, {0x92, 0x40}, {0x92, 0x3C}, {0x92, 0x4E}, /* 0xC4-0xC7 */ + {0x92, 0x59}, {0x92, 0x51}, {0x92, 0x39}, {0x92, 0x67}, /* 0xC8-0xCB */ + {0x92, 0xA7}, {0x92, 0x77}, {0x92, 0x78}, {0x92, 0xE7}, /* 0xCC-0xCF */ + {0x92, 0xD7}, {0x92, 0xD9}, {0x92, 0xD0}, {0xFA, 0x27}, /* 0xD0-0xD3 */ + {0x92, 0xD5}, {0x92, 0xE0}, {0x92, 0xD3}, {0x93, 0x25}, /* 0xD4-0xD7 */ + {0x93, 0x21}, {0x92, 0xFB}, {0xFA, 0x28}, {0x93, 0x1E}, /* 0xD8-0xDB */ + {0x92, 0xFF}, {0x93, 0x1D}, {0x93, 0x02}, {0x93, 0x70}, /* 0xDC-0xDF */ + {0x93, 0x57}, {0x93, 0xA4}, {0x93, 0xC6}, {0x93, 0xDE}, /* 0xE0-0xE3 */ + {0x93, 0xF8}, {0x94, 0x31}, {0x94, 0x45}, {0x94, 0x48}, /* 0xE4-0xE7 */ + {0x95, 0x92}, {0xF9, 0xDC}, {0xFA, 0x29}, {0x96, 0x9D}, /* 0xE8-0xEB */ + {0x96, 0xAF}, {0x97, 0x33}, {0x97, 0x3B}, {0x97, 0x43}, /* 0xEC-0xEF */ + {0x97, 0x4D}, {0x97, 0x4F}, {0x97, 0x51}, {0x97, 0x55}, /* 0xF0-0xF3 */ + {0x98, 0x57}, {0x98, 0x65}, {0xFA, 0x2A}, {0xFA, 0x2B}, /* 0xF4-0xF7 */ + {0x99, 0x27}, {0xFA, 0x2C}, {0x99, 0x9E}, {0x9A, 0x4E}, /* 0xF8-0xFB */ + {0x9A, 0xD9}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9A, 0xDC}, {0x9B, 0x75}, {0x9B, 0x72}, {0x9B, 0x8F}, /* 0x40-0x43 */ + {0x9B, 0xB1}, {0x9B, 0xBB}, {0x9C, 0x00}, {0x9D, 0x70}, /* 0x44-0x47 */ + {0x9D, 0x6B}, {0xFA, 0x2D}, {0x9E, 0x19}, {0x9E, 0xD1}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode *page_charset2uni[256] = { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, c2u_81, c2u_82, c2u_83, c2u_84, NULL, NULL, c2u_87, + c2u_88, c2u_89, c2u_8A, c2u_8B, c2u_8C, c2u_8D, c2u_8E, c2u_8F, + c2u_90, c2u_91, c2u_92, c2u_93, c2u_94, c2u_95, c2u_96, c2u_97, + c2u_98, c2u_99, c2u_9A, c2u_9B, c2u_9C, c2u_9D, c2u_9E, c2u_9F, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + c2u_E0, c2u_E1, c2u_E2, c2u_E3, c2u_E4, c2u_E5, c2u_E6, c2u_E7, + c2u_E8, c2u_E9, c2u_EA, NULL, NULL, c2u_ED, c2u_EE, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, c2u_FA, c2u_FB, c2u_FC, NULL, NULL, NULL, +}; + +static unsigned char u2c_03[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x83, 0x9F, 0x83, 0x00, 0x83, 0x00, /* 0x90-0x93 */ + 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0x94-0x97 */ + 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0x98-0x9B */ + 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0x9C-0x9F */ + 0x83, 0x00, 0x83, 0x00, 0x3F, 0x3F, 0x83, 0x00, /* 0xA0-0xA3 */ + 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xA4-0xA7 */ + 0x83, 0x00, 0x83, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xB0-0xB3 */ + 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xB4-0xB7 */ + 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xB8-0xBB */ + 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xBC-0xBF */ + 0x83, 0x00, 0x83, 0x00, 0x3F, 0x3F, 0x83, 0x00, /* 0xC0-0xC3 */ + 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, /* 0xC4-0xC7 */ + 0x83, 0x00, 0x83, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_04[512] = { + 0x3F, 0x3F, 0x84, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x84, 0x40, 0x84, 0x41, 0x84, 0x42, 0x84, 0x43, /* 0x10-0x13 */ + 0x84, 0x44, 0x84, 0x45, 0x84, 0x47, 0x84, 0x48, /* 0x14-0x17 */ + 0x84, 0x49, 0x84, 0x4A, 0x84, 0x4B, 0x84, 0x4C, /* 0x18-0x1B */ + 0x84, 0x4D, 0x84, 0x4E, 0x84, 0x4F, 0x84, 0x50, /* 0x1C-0x1F */ + 0x84, 0x51, 0x84, 0x52, 0x84, 0x53, 0x84, 0x54, /* 0x20-0x23 */ + 0x84, 0x55, 0x84, 0x56, 0x84, 0x57, 0x84, 0x58, /* 0x24-0x27 */ + 0x84, 0x59, 0x84, 0x5A, 0x84, 0x5B, 0x84, 0x5C, /* 0x28-0x2B */ + 0x84, 0x5D, 0x84, 0x5E, 0x84, 0x5F, 0x84, 0x60, /* 0x2C-0x2F */ + 0x84, 0x70, 0x84, 0x71, 0x84, 0x72, 0x84, 0x73, /* 0x30-0x33 */ + 0x84, 0x74, 0x84, 0x75, 0x84, 0x77, 0x84, 0x78, /* 0x34-0x37 */ + 0x84, 0x79, 0x84, 0x7A, 0x84, 0x7B, 0x84, 0x7C, /* 0x38-0x3B */ + 0x84, 0x7D, 0x84, 0x7E, 0x84, 0x80, 0x84, 0x81, /* 0x3C-0x3F */ + 0x84, 0x82, 0x84, 0x83, 0x84, 0x84, 0x84, 0x85, /* 0x40-0x43 */ + 0x84, 0x86, 0x84, 0x87, 0x84, 0x88, 0x84, 0x89, /* 0x44-0x47 */ + 0x84, 0x8A, 0x84, 0x8B, 0x84, 0x8C, 0x84, 0x8D, /* 0x48-0x4B */ + 0x84, 0x8E, 0x84, 0x8F, 0x84, 0x90, 0x84, 0x91, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x84, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_20[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x81, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x81, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x81, 0x65, 0x81, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x81, 0x67, 0x81, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x81, 0x00, 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x81, 0x64, 0x81, 0x63, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x81, 0x00, 0x3F, 0x3F, 0x81, 0x8C, 0x81, 0x8D, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_21[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x8E, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x59, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, /* 0x60-0x63 */ + 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x51, /* 0x64-0x67 */ + 0x00, 0x52, 0x00, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, /* 0x70-0x73 */ + 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, /* 0x74-0x77 */ + 0x00, 0x48, 0x00, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_22[512] = { + 0x81, 0x00, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0x04-0x07 */ + 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x87, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x95, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x87, 0x87, 0x98, /* 0x1C-0x1F */ + 0x87, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x81, 0x61, 0x3F, 0x3F, 0x81, 0x00, /* 0x24-0x27 */ + 0x81, 0x00, 0x87, 0x9B, 0x87, 0x9C, 0x87, 0x92, /* 0x28-0x2B */ + 0x81, 0x00, 0x3F, 0x3F, 0x87, 0x93, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x81, 0x88, 0x00, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x90, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x81, 0x82, 0x87, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x85, 0x81, 0x86, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x87, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x99, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_23[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_24[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x87, 0x40, 0x87, 0x41, 0x87, 0x42, 0x87, 0x43, /* 0x60-0x63 */ + 0x87, 0x44, 0x87, 0x45, 0x87, 0x46, 0x87, 0x47, /* 0x64-0x67 */ + 0x87, 0x48, 0x87, 0x49, 0x87, 0x4A, 0x87, 0x4B, /* 0x68-0x6B */ + 0x87, 0x4C, 0x87, 0x4D, 0x87, 0x4E, 0x87, 0x4F, /* 0x6C-0x6F */ + 0x87, 0x50, 0x87, 0x51, 0x87, 0x52, 0x87, 0x53, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_25[512] = { + 0x84, 0x9F, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x0C-0x0F */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x10-0x13 */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x14-0x17 */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x18-0x1B */ + 0x84, 0x00, 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x20-0x23 */ + 0x84, 0x00, 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x28-0x2B */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x2C-0x2F */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x30-0x33 */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x34-0x37 */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x38-0x3B */ + 0x84, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x84, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x81, 0x00, 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x81, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x81, 0x00, 0x81, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x9F, 0x81, 0x9E, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x9B, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x9D, 0x81, 0x9C, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_26[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x81, 0x9A, 0x81, 0x99, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x81, 0x8A, 0x3F, 0x3F, 0x81, 0x89, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x81, 0x00, 0x3F, 0x3F, 0x81, 0x00, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_30[512] = { + 0x81, 0x40, 0x81, 0x41, 0x81, 0x42, 0x81, 0x56, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x81, 0x58, 0x81, 0x59, 0x81, 0x5A, /* 0x04-0x07 */ + 0x81, 0x71, 0x81, 0x72, 0x81, 0x73, 0x81, 0x74, /* 0x08-0x0B */ + 0x81, 0x75, 0x81, 0x76, 0x81, 0x77, 0x81, 0x78, /* 0x0C-0x0F */ + 0x81, 0x79, 0x81, 0x7A, 0x81, 0x00, 0x81, 0x00, /* 0x10-0x13 */ + 0x81, 0x6B, 0x81, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x87, 0x80, 0x3F, 0x3F, 0x87, 0x81, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x82, 0x9F, 0x82, 0x00, 0x82, 0x00, /* 0x40-0x43 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x44-0x47 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x48-0x4B */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x4C-0x4F */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x50-0x53 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x54-0x57 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x58-0x5B */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x5C-0x5F */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x60-0x63 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x64-0x67 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x68-0x6B */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x6C-0x6F */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x70-0x73 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x74-0x77 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x78-0x7B */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x7C-0x7F */ + + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x80-0x83 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x84-0x87 */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x88-0x8B */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x8C-0x8F */ + 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x4A, /* 0x98-0x9B */ + 0x81, 0x4B, 0x81, 0x54, 0x81, 0x55, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x83, 0x40, 0x83, 0x41, 0x83, 0x42, /* 0xA0-0xA3 */ + 0x83, 0x43, 0x83, 0x44, 0x83, 0x45, 0x83, 0x46, /* 0xA4-0xA7 */ + 0x83, 0x47, 0x83, 0x48, 0x83, 0x49, 0x83, 0x4A, /* 0xA8-0xAB */ + 0x83, 0x4B, 0x83, 0x4C, 0x83, 0x4D, 0x83, 0x4E, /* 0xAC-0xAF */ + 0x83, 0x4F, 0x83, 0x50, 0x83, 0x51, 0x83, 0x52, /* 0xB0-0xB3 */ + 0x83, 0x53, 0x83, 0x54, 0x83, 0x55, 0x83, 0x56, /* 0xB4-0xB7 */ + 0x83, 0x57, 0x83, 0x58, 0x83, 0x59, 0x83, 0x5A, /* 0xB8-0xBB */ + 0x83, 0x5B, 0x83, 0x5C, 0x83, 0x5D, 0x83, 0x5E, /* 0xBC-0xBF */ + 0x83, 0x5F, 0x83, 0x60, 0x83, 0x61, 0x83, 0x62, /* 0xC0-0xC3 */ + 0x83, 0x63, 0x83, 0x64, 0x83, 0x65, 0x83, 0x66, /* 0xC4-0xC7 */ + 0x83, 0x67, 0x83, 0x68, 0x83, 0x69, 0x83, 0x6A, /* 0xC8-0xCB */ + 0x83, 0x6B, 0x83, 0x6C, 0x83, 0x6D, 0x83, 0x6E, /* 0xCC-0xCF */ + 0x83, 0x6F, 0x83, 0x70, 0x83, 0x71, 0x83, 0x72, /* 0xD0-0xD3 */ + 0x83, 0x73, 0x83, 0x74, 0x83, 0x75, 0x83, 0x76, /* 0xD4-0xD7 */ + 0x83, 0x77, 0x83, 0x78, 0x83, 0x79, 0x83, 0x7A, /* 0xD8-0xDB */ + 0x83, 0x7B, 0x83, 0x7C, 0x83, 0x7D, 0x83, 0x7E, /* 0xDC-0xDF */ + 0x83, 0x80, 0x83, 0x81, 0x83, 0x82, 0x83, 0x83, /* 0xE0-0xE3 */ + 0x83, 0x84, 0x83, 0x85, 0x83, 0x86, 0x83, 0x87, /* 0xE4-0xE7 */ + 0x83, 0x88, 0x83, 0x89, 0x83, 0x8A, 0x83, 0x8B, /* 0xE8-0xEB */ + 0x83, 0x8C, 0x83, 0x8D, 0x83, 0x8E, 0x83, 0x8F, /* 0xEC-0xEF */ + 0x83, 0x90, 0x83, 0x91, 0x83, 0x92, 0x83, 0x93, /* 0xF0-0xF3 */ + 0x83, 0x94, 0x83, 0x95, 0x83, 0x96, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81, 0x45, /* 0xF8-0xFB */ + 0x81, 0x5B, 0x81, 0x52, 0x81, 0x53, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_32[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x00, 0x58, 0x87, 0x8B, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x87, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x87, 0x85, 0x87, 0x86, 0x87, 0x87, 0x87, 0x88, /* 0xA4-0xA7 */ + 0x87, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_33[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x65, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x87, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x87, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x87, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x61, 0x87, 0x6B, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x6A, 0x87, 0x64, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x6C, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x66, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x6E, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x87, 0x5F, 0x87, 0x6D, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x87, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x87, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x68, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x7E, /* 0x78-0x7B */ + 0x87, 0x8F, 0x87, 0x8E, 0x87, 0x8D, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x87, 0x72, 0x87, 0x73, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x87, 0x6F, 0x87, 0x70, 0x87, 0x71, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x87, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x87, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x87, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_4E[512] = { + 0x88, 0x00, 0x92, 0x9A, 0x3F, 0x3F, 0x8E, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x9C, /* 0x04-0x07 */ + 0x8F, 0x00, 0x8E, 0x4F, 0x8F, 0x00, 0x89, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x95, 0x73, 0x97, 0x5E, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x98, 0x00, 0x89, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x8A, 0x8E, 0x98, 0x00, 0x90, 0x00, 0x99, 0x00, /* 0x14-0x17 */ + 0x8B, 0x75, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x00, 0x68, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x92, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x98, 0x00, 0x8B, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x8A, 0x00, 0x92, 0x4F, 0x3F, 0x3F, 0x8E, 0x00, /* 0x38-0x3B */ + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x94, 0x54, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x8B, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x56, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x93, 0x00, 0x8C, 0x00, 0x96, 0x52, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x68, 0x98, 0x00, 0x8F, 0x00, /* 0x54-0x57 */ + 0x98, 0x00, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x8B, 0x00, 0x8C, 0x00, 0x96, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x97, 0x90, 0x3F, 0x3F, 0x93, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x8B, 0x54, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x98, 0x00, 0x97, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x97, 0x5C, 0x91, 0x88, 0x98, 0x00, 0x8E, 0x96, /* 0x88-0x8B */ + 0x93, 0x00, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x89, 0x5D, 0x8C, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x8C, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x98, 0x6A, 0x98, 0x69, 0x3F, 0x3F, 0x8D, 0x00, /* 0x98-0x9B */ + 0x88, 0x9F, 0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, /* 0x9C-0x9F */ + 0x98, 0x00, 0x96, 0x53, 0x98, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x8C, 0x00, 0x88, 0x00, 0x96, 0x92, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x8B, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x9D, /* 0xA8-0xAB */ + 0x8B, 0x9E, 0x92, 0x00, 0x97, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x6C, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x8F, 0x59, 0x90, 0x6D, 0x98, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x98, 0x00, 0x3F, 0x3F, 0x98, 0x00, 0x8B, 0x77, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x89, 0x00, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, 0x95, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x8E, 0x65, 0x8E, 0x64, 0x91, 0x00, 0x98, 0x00, /* 0xD4-0xD7 */ + 0x95, 0x74, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x81, 0x57, 0x98, 0x00, 0x98, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x00, 0x69, 0x3F, 0x3F, 0x91, 0x00, /* 0xE0-0xE3 */ + 0x97, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x98, 0x00, 0x89, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x8B, 0x00, 0x3F, 0x3F, 0x92, 0x87, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x8F, 0x98, 0x00, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x43, /* 0xF8-0xFB */ + 0x00, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_4F[512] = { + 0x00, 0x6B, 0x8A, 0x00, 0x3F, 0x3F, 0x00, 0x6C, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x98, 0x00, 0x88, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x8C, 0x00, 0x8A, 0x00, 0x95, 0x9A, /* 0x0C-0x0F */ + 0x94, 0x00, 0x8B, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x98, 0x00, 0x93, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x8C, /* 0x2C-0x2F */ + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x94, 0x00, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x90, 0x4C, 0x00, 0x6D, 0x8E, 0x66, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x8E, 0x97, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x41, 0x98, 0x00, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x88, 0x00, 0x92, 0x00, 0x8F, 0x5A, /* 0x4C-0x4F */ + 0x8D, 0x00, 0x97, 0x43, 0x3F, 0x3F, 0x91, 0x00, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x89, 0x00, 0x00, 0x6E, 0x98, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x97, 0x5D, 0x98, 0x00, 0x98, 0x00, /* 0x58-0x5B */ + 0x8D, 0x00, 0x98, 0x00, 0x9B, 0x43, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0x6C-0x6F */ + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x95, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0x78-0x7B */ + 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x67, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x98, 0x00, 0x3F, 0x3F, 0x00, 0x70, 0x97, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x8E, 0x98, 0x3F, 0x3F, 0x98, 0x00, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x98, 0x00, 0x00, 0x6F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x00, 0x72, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x98, 0x00, 0x3F, 0x3F, 0x00, 0x71, 0x8B, 0x9F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x8B, 0x00, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x44, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x96, 0x99, 0x95, 0x8E, 0x8C, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x90, 0x4E, 0x97, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x57, 0x91, 0x00, /* 0xC0-0xC3 */ + 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x00, 0x61, 0x8F, 0x72, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x00, 0x73, 0x98, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x98, 0x00, 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xD4-0xD7 */ + 0x98, 0x00, 0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x98, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x90, 0x4D, 0x3F, 0x3F, 0x96, 0x93, /* 0xE0-0xE3 */ + 0x98, 0x00, 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x43, 0x98, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x6F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x95, 0x55, 0x98, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x95, 0x00, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x00, 0x76, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_50[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x91, 0x71, 0x3F, 0x3F, 0x8C, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x94, 0x7B, 0x3F, 0x3F, 0x00, 0x00, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x98, 0x00, 0x93, 0x7C, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x98, 0x00, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x77, 0x8E, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x98, 0x00, 0x00, 0x75, 0x95, 0x00, /* 0x20-0x23 */ + 0x92, 0x6C, 0x98, 0x00, 0x8C, 0x91, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x98, 0x00, 0x98, 0x00, 0x98, 0x00, 0x97, 0x00, /* 0x28-0x2B */ + 0x98, 0x00, 0x98, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x8C, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x00, 0x74, 0x3F, 0x3F, 0x00, 0x7A, 0x98, 0x00, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x78, 0x98, 0x00, /* 0x44-0x47 */ + 0x98, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x4C-0x4F */ + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x98, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x8C, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x00, 0x79, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x91, 0x00, 0x92, 0x00, 0x8B, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x8B, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x96, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x8C, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x00, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x8E, 0x50, 0x94, 0x00, 0x98, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x8D, 0x00, 0x97, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, 0x99, 0x42, /* 0xB0-0xB3 */ + 0x98, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x8F, 0x9D, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x58, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x43, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x99, 0x40, 0x99, 0x41, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x91, 0x9C, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x96, 0x6C, 0x99, 0x44, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x7D, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x45, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x48, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x99, 0x46, 0x3F, 0x3F, 0x91, 0x6D, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x99, 0x47, 0x99, 0x49, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x7C, 0x99, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x99, 0x4A, 0x3F, 0x3F, 0x95, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_51[512] = { + 0x8B, 0x56, 0x99, 0x4D, 0x99, 0x4E, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x99, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x99, 0x51, 0x99, 0x50, 0x99, 0x4F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x98, 0x00, 0x3F, 0x3F, 0x99, 0x52, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x9E, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x99, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x44, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x55, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x54, 0x99, 0x57, /* 0x38-0x3B */ + 0x99, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x58, /* 0x3C-0x3F */ + 0x99, 0x59, 0x88, 0x00, 0x3F, 0x3F, 0x8C, 0x00, /* 0x40-0x43 */ + 0x8C, 0x5A, 0x8F, 0x5B, 0x92, 0x9B, 0x8B, 0x00, /* 0x44-0x47 */ + 0x90, 0x00, 0x8C, 0x00, 0x00, 0x7E, 0x8D, 0x8E, /* 0x48-0x4B */ + 0x99, 0x5B, 0x96, 0x00, 0x93, 0x65, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x8E, 0x99, 0x3F, 0x3F, 0x99, 0x5A, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x99, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x7D, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x8A, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x5D, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x80, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x91, 0x53, 0x99, 0x5F, 0x99, 0x60, 0x94, 0x00, /* 0x68-0x6B */ + 0x8C, 0x00, 0x98, 0x5A, 0x99, 0x61, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x95, 0x00, 0x91, 0x00, 0x8B, 0x00, /* 0x74-0x77 */ + 0x93, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x8C, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x99, 0x62, 0x3F, 0x3F, 0x99, 0x63, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x93, 0x00, 0x89, 0x7E, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x99, 0x66, 0x8D, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x99, 0x65, 0x8D, 0x00, 0x3F, 0x3F, 0x99, 0x67, /* 0x8C-0x8F */ + 0x00, 0x00, 0x99, 0x68, 0x96, 0x60, 0x99, 0x69, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x99, 0x6A, 0x99, 0x6B, 0x8F, 0x00, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x8A, 0x00, 0x3F, 0x3F, 0x99, 0x6E, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x99, 0x6C, 0x96, 0x00, 0x99, 0x6D, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x95, 0x79, 0x99, 0x6F, 0x99, 0x70, 0x99, 0x71, /* 0xA8-0xAB */ + 0x93, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x99, 0x75, 0x99, 0x73, 0x99, 0x74, 0x99, 0x72, /* 0xB0-0xB3 */ + 0x8D, 0x00, 0x99, 0x76, 0x96, 0x00, 0x97, 0x00, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x99, 0x77, 0x00, 0x82, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x90, 0x00, 0x99, 0x78, 0x8F, 0x79, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x99, 0x79, 0x3F, 0x3F, 0x92, 0x9C, /* 0xC8-0xCB */ + 0x97, 0x00, 0x93, 0x80, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x7A, /* 0xD8-0xDB */ + 0x00, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x99, 0x7B, 0x96, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x88, 0x91, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x99, 0x7D, 0x93, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x00, 0x83, 0x99, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x99, 0x80, 0x8A, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x99, 0x81, 0x8B, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x93, 0x00, 0x89, 0x9A, 0x8F, 0x6F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x94, 0x9F, 0x99, 0x82, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_52[512] = { + 0x93, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x6E, /* 0x00-0x03 */ + 0x99, 0x83, 0x3F, 0x3F, 0x95, 0x00, 0x90, 0x00, /* 0x04-0x07 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x8A, 0x00, 0x99, 0x84, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x86, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x8C, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x99, 0x85, 0x00, 0x84, 0x3F, 0x3F, 0x97, 0x00, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x8F, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x94, 0x00, 0x95, 0x00, 0x3F, 0x3F, 0x99, 0x87, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x97, 0x98, 0x99, 0x88, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x89, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x93, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x8A, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x8D, 0x00, /* 0x34-0x37 */ + 0x8C, 0x94, 0x99, 0x8B, 0x8E, 0x68, 0x8D, 0x8F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x40-0x43 */ + 0x99, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x99, 0x8E, /* 0x48-0x4B */ + 0x99, 0x8F, 0x91, 0x4F, 0x3F, 0x3F, 0x99, 0x8C, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x99, 0x91, 0x3F, 0x3F, 0x96, 0x55, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x84, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x90, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x95, /* 0x60-0x63 */ + 0x8D, 0x00, 0x94, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x99, 0x94, 0x99, 0x92, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x9B, /* 0x6C-0x6F */ + 0x8F, 0x00, 0x99, 0x9B, 0x8A, 0x84, 0x99, 0x95, /* 0x70-0x73 */ + 0x99, 0x93, 0x91, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x99, 0x97, 0x3F, 0x3F, 0x99, 0x96, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x63, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x80, /* 0x84-0x87 */ + 0x99, 0x9C, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x99, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x99, 0x9D, 0x99, 0x9A, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x99, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x98-0x9B */ + 0x00, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x9C-0x9F */ + 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x86, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x8F, 0x95, 0x93, 0x77, 0x8D, 0x85, /* 0xA8-0xAB */ + 0x99, 0x00, 0x99, 0x00, 0x3F, 0x3F, 0x00, 0x77, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x98, 0x4A, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x99, 0x00, 0x3F, 0x3F, 0x8A, 0x4E, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x00, 0x87, 0x99, 0x00, 0x3F, 0x3F, 0x96, 0x75, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x97, 0x45, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x99, 0x00, /* 0xD4-0xD7 */ + 0x8A, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x00, 0x88, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x8F, 0x9F, 0x99, 0x00, 0x95, 0x00, /* 0xDC-0xDF */ + 0x99, 0x00, 0x3F, 0x3F, 0x90, 0x00, 0x99, 0x00, /* 0xE0-0xE3 */ + 0x8B, 0x00, 0x3F, 0x3F, 0x99, 0x00, 0x8A, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x4D, 0x99, 0x00, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x99, 0x00, 0x99, 0x00, 0x8E, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x96, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_53[512] = { + 0x00, 0x89, 0x96, 0x00, 0x93, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x95, 0x00, 0x99, 0x00, 0x00, 0x8A, /* 0x04-0x07 */ + 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x99, 0x00, /* 0x0C-0x0F */ + 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x99, 0x00, 0x89, 0x00, 0x96, 0x6B, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x8D, 0x00, 0x99, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x91, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x8F, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x99, 0x00, /* 0x20-0x23 */ + 0x00, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x99, 0x00, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x99, 0x00, 0x95, 0x43, 0x8B, 0x00, 0x88, 0x00, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x3C-0x3F */ + 0x99, 0x00, 0x8F, 0x5C, 0x3F, 0x3F, 0x90, 0x00, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x99, 0x00, 0x99, 0x00, 0x8F, 0x00, /* 0x44-0x47 */ + 0x8C, 0x00, 0x99, 0x00, 0x94, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x94, 0x00, 0x91, 0x00, 0x91, 0x00, /* 0x50-0x53 */ + 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x54-0x57 */ + 0x92, 0x50, 0x3F, 0x3F, 0x94, 0x8E, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x96, 0x6D, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x54, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x89, 0x4B, /* 0x6C-0x6F */ + 0x88, 0x00, 0x8A, 0x00, 0x00, 0x8C, 0x91, 0x00, /* 0x70-0x73 */ + 0x8B, 0x70, 0x97, 0x91, 0x3F, 0x3F, 0x99, 0x00, /* 0x74-0x77 */ + 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8D, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x97, 0x00, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x9C-0x9F */ + 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x99, 0x00, 0x99, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x90, 0x7E, 0x89, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x89, 0x7D, 0x99, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x99, 0x00, 0x3F, 0x3F, 0x00, 0x8E, 0x8C, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x8E, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x51, 0x99, 0x00, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x96, 0x94, 0x8D, 0x00, 0x8B, 0x79, 0x97, 0x46, /* 0xC8-0xCB */ + 0x91, 0x6F, 0x94, 0x00, 0x8E, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x8F, 0x66, 0x3F, 0x3F, 0x8E, 0x00, 0x8E, 0x00, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x8F, 0x96, 0x3F, 0x3F, 0x94, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x00, 0x8F, 0x3F, 0x3F, 0x99, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x89, 0x62, 0x91, 0x70, 0x8C, 0x00, /* 0xE0-0xE3 */ + 0x8C, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x99, 0x00, 0x92, 0x40, 0x91, 0x00, 0x8B, 0x00, /* 0xE8-0xEB */ + 0x8F, 0x00, 0x99, 0x00, 0x99, 0x00, 0x89, 0x00, /* 0xEC-0xEF */ + 0x91, 0x00, 0x8E, 0x00, 0x8E, 0x6A, 0x89, 0x45, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x90, 0x8D, 0x86, /* 0xF4-0xF7 */ + 0x8E, 0x69, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_54[512] = { + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x8B, 0x68, /* 0x00-0x03 */ + 0x8A, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x8D, 0x87, 0x8B, 0x67, 0x92, 0x00, 0x89, 0x44, /* 0x08-0x0B */ + 0x93, 0x00, 0x96, 0x00, 0x8D, 0x40, 0x97, 0x99, /* 0x0C-0x0F */ + 0x93, 0x66, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x4E, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x8B, 0x00, /* 0x1C-0x1F */ + 0x96, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x8A, 0x00, /* 0x28-0x2B */ + 0x99, 0x00, 0x99, 0x00, 0x99, 0x00, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x8B, 0x7A, 0x90, 0x81, 0x3F, 0x3F, 0x95, 0x00, /* 0x38-0x3B */ + 0x99, 0x00, 0x99, 0x00, 0x8C, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x99, 0x00, 0x3F, 0x3F, 0x98, 0x43, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x92, 0x00, 0x8C, 0x00, 0x8D, 0x90, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x8E, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x99, 0x00, 0x99, 0x00, 0x3F, 0x3F, 0x96, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x99, 0x00, 0x99, 0x00, 0x99, 0x00, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0x78-0x7B */ + 0x8C, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x99, 0x00, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x92, 0x8D, 0x00, /* 0x88-0x8B */ + 0x98, 0x61, 0x3F, 0x3F, 0x99, 0x00, 0x99, 0x00, /* 0x8C-0x8F */ + 0x99, 0x00, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x00, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x9A, 0x42, 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x99, 0x00, 0x00, 0x93, 0x3F, 0x3F, 0x9A, 0x40, /* 0xA8-0xAB */ + 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x5D, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x8A, 0x50, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x9A, 0x44, 0x88, 0x00, 0x9A, 0x43, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x88, 0x00, 0x95, 0x69, 0x9A, 0x41, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x99, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x00, /* 0xC4-0xC7 */ + 0x99, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x9A, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x88, 0x00, 0x9A, 0x4E, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x9A, 0x46, 0x9A, 0x47, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x8F, 0x00, 0x96, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x9A, 0x4C, 0x9A, 0x4B, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x4E, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x4D, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x9A, 0x4A, 0x3F, 0x3F, 0x00, 0x94, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_55[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x89, 0x53, 0x3F, 0x3F, 0x8D, 0x00, 0x90, 0x4F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x48, /* 0x0C-0x0F */ + 0x93, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x9A, 0x49, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x53, 0x97, 0x42, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x9A, 0x59, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x9A, 0x58, 0x9A, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x9A, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x91, 0x00, 0x9A, 0x55, 0x8F, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x9A, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x5B, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x56, 0x9A, 0x57, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x9A, 0x54, 0x9A, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x51, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x60, /* 0x78-0x7B */ + 0x9A, 0x65, 0x3F, 0x3F, 0x9A, 0x61, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x9A, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x66, /* 0x80-0x83 */ + 0x91, 0x50, 0x3F, 0x3F, 0x00, 0x95, 0x9A, 0x68, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x8D, 0x41, 0x9A, 0x5E, 0x92, 0x9D, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x9A, 0x62, 0x9A, 0x5B, 0x8A, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x8A, 0x00, 0x8A, 0x85, 0x9A, 0x63, 0x9A, 0x5F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x96, /* 0xA4-0xA7 */ + 0x9A, 0x69, 0x9A, 0x67, 0x91, 0x72, 0x8B, 0x69, /* 0xA8-0xAB */ + 0x8B, 0x00, 0x3F, 0x3F, 0x9A, 0x64, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x63, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x9A, 0x6D, 0x9A, 0x6B, 0x3F, 0x3F, 0x9A, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x9A, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x6A, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x9A, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x6C, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x6B, /* 0xE0-0xE3 */ + 0x9A, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x72, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x9A, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x9A, 0x75, 0x9A, 0x74, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_56[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x51, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x9A, 0x71, 0x3F, 0x3F, 0x9A, 0x73, 0x8F, 0x00, /* 0x14-0x17 */ + 0x89, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x76, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x82, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8F, 0x00, 0x9A, 0x7D, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x9A, 0x7B, 0x3F, 0x3F, 0x9A, 0x7C, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x9A, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x5C, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x91, 0x58, 0x3F, 0x3F, 0x9A, 0x78, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x9A, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x9A, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x9A, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x9A, 0x84, 0x9A, 0x80, /* 0x68-0x6B */ + 0x9A, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x93, 0x00, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x9A, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x85, 0x8A, 0x64, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x87, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x8A, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x9A, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x9A, 0x88, 0x3F, 0x3F, 0x94, 0x58, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x9A, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x8C, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x9A, 0x8E, 0x3F, 0x3F, 0x9A, 0x8D, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x9A, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x9A, 0x93, 0x9A, 0x91, 0x9A, 0x8F, 0x9A, 0x92, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x9A, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x95, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x9A, 0x96, 0x3F, 0x3F, 0x9A, 0x97, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x98, /* 0xD4-0xD7 */ + 0x99, 0x64, 0x3F, 0x3F, 0x8E, 0x00, 0x8E, 0x6C, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x63, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x99, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x8D, 0x00, 0x3F, 0x3F, 0x88, 0x00, 0x90, 0x7D, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x9A, 0x9A, 0x8C, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x8D, 0x91, 0x3F, 0x3F, 0x9A, 0x9C, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_57[512] = { + 0x9A, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x00-0x03 */ + 0x9A, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x9A, 0x9F, 0x9A, 0x9E, 0x3F, 0x3F, 0x9A, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x8C, 0x97, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x80, 0x9A, 0x00, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x79, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x88, 0x00, /* 0x24-0x27 */ + 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x8C, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x92, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0x34-0x37 */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x9A, 0x00, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x56, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, /* 0x4C-0x4F */ + 0x8D, 0x00, 0x8D, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x8D, 0x00, 0x00, 0x97, 0x92, 0x52, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x9A, 0x00, 0x92, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x82, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x9A, 0x00, 0x9A, 0x00, 0x3F, 0x3F, 0x8C, 0x5E, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x9A, 0x00, 0x3F, 0x3F, 0x8D, 0x43, 0x8A, 0x5F, /* 0xA0-0xA3 */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x00, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x00, 0x9A, /* 0xC4-0xC7 */ + 0x00, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x84, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, /* 0xD0-0xD3 */ + 0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x94, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xDC-0xDF */ + 0x95, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x94, 0x7C, 0x8A, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_58[512] = { + 0x96, 0x78, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x8C, 0x98, 0x91, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, /* 0x2C-0x2F */ + 0x89, 0x81, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x8F, 0x00, 0x93, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x95, 0x00, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x9A, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x91, 0x59, 0x9A, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x93, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x68, /* 0x54-0x57 */ + 0x93, 0x84, 0x94, 0x00, 0x92, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x89, 0x96, 0x3F, 0x3F, 0x93, 0x55, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x90, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x6D, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x9D, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x92, 0x00, 0x3F, 0x3F, 0x00, 0x9D, 0x9A, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x96, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9E, 0x95, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x9A, 0x00, 0x9A, 0x00, 0x9A, 0x00, 0x9A, 0x00, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x92, 0x64, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x8D, 0x88, 0x3F, 0x3F, 0x9A, 0x00, /* 0xD4-0xD7 */ + 0x9A, 0x00, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x9A, 0x00, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x6D, /* 0xE8-0xEB */ + 0x90, 0x70, 0x3F, 0x3F, 0x91, 0x73, 0x9A, 0x00, /* 0xEC-0xEF */ + 0x90, 0x00, 0x88, 0x00, 0x94, 0x84, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x9A, 0x00, 0x9A, 0x00, 0x9A, 0x00, /* 0xF8-0xFB */ + 0x9A, 0x00, 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_59[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x95, 0x00, 0x9A, 0x00, 0x00, 0x9F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x0C-0x0F */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x97, 0x5B, 0x8A, 0x4F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x99, 0x00, 0x8F, 0x67, 0x91, 0x00, 0x9A, 0x00, /* 0x18-0x1B */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, 0x91, 0x00, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x93, 0x56, 0x91, 0x00, 0x95, 0x76, /* 0x28-0x2B */ + 0x9A, 0x00, 0x9A, 0x00, 0x89, 0x9B, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8E, 0x00, 0x9A, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x34-0x37 */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x89, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x44-0x47 */ + 0x93, 0x00, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x91, 0x74, /* 0x4C-0x4F */ + 0x9A, 0x00, 0x8C, 0x5F, 0x3F, 0x3F, 0x00, 0x00, /* 0x50-0x53 */ + 0x96, 0x7A, 0x9A, 0x00, 0x3F, 0x3F, 0x93, 0x85, /* 0x54-0x57 */ + 0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x00, 0x00, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x9A, 0x00, 0x3F, 0x3F, 0x9A, 0x00, 0x00, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x89, 0x9C, 0x3F, 0x3F, 0x9A, 0x00, /* 0x64-0x67 */ + 0x8F, 0x00, 0x9A, 0x00, 0x92, 0x44, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x9A, 0x00, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x97, /* 0x70-0x73 */ + 0x93, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x9B, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x8D, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x9B, 0x41, 0x94, 0x40, 0x94, 0x00, /* 0x80-0x83 */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x44, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x9B, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x57, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x64, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x9B, 0x00, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x9B, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x45, /* 0xA0-0xA3 */ + 0x00, 0x00, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x96, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x93, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x46, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x96, 0x85, 0x00, 0x00, 0x8D, 0x00, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x47, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x8E, 0x6F, 0x3F, 0x3F, 0x8E, 0x6E, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x88, 0x00, 0x8C, 0x00, 0x3F, 0x3F, 0x90, 0x00, /* 0xD0-0xD3 */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x9B, 0x4B, 0x9B, 0x4C, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x9B, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x89, 0x57, 0x8A, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x9B, 0x48, 0x3F, 0x3F, 0x96, 0x00, 0x95, 0x50, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x70, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5A[512] = { + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x88, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x9B, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x9B, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x96, 0x00, 0x3F, 0x3F, 0x9B, 0x52, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x9B, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x4E, /* 0x1C-0x1F */ + 0x90, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x9B, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x9B, 0x56, 0x9B, 0x57, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x9B, 0x53, 0x98, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x6B, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x9B, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x58, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x77, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x59, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x9B, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x7D, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x5A, 0x95, 0x51, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x9B, 0x5B, 0x9B, 0x5F, 0x9B, 0x5C, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x89, 0x00, 0x9B, 0x5E, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x9B, 0x5D, /* 0xC8-0xCB */ + 0x8C, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x9B, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x64, 0x9B, 0x61, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x92, 0x84, 0x3F, 0x3F, 0x9B, 0x60, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x62, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x9B, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x65, 0x9B, 0x66, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5B[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x9B, 0x68, /* 0x08-0x0B */ + 0x9B, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x69, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x6C, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x89, 0x64, 0x3F, 0x3F, 0x9B, 0x6A, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x6D, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x6E, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x9B, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x6F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x9B, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x8E, 0x71, 0x9B, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x8D, 0x45, 0x9B, 0x73, 0x00, 0x00, 0x8E, 0x9A, /* 0x54-0x57 */ + 0x91, 0x00, 0x3F, 0x3F, 0x9B, 0x74, 0x9B, 0x75, /* 0x58-0x5B */ + 0x8E, 0x79, 0x8D, 0x46, 0x3F, 0x3F, 0x96, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x47, /* 0x60-0x63 */ + 0x8C, 0x00, 0x9B, 0x76, 0x8A, 0x77, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x9B, 0x77, 0x3F, 0x3F, 0x91, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x9B, 0x78, 0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x79, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x9B, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x9B, 0x7B, 0x3F, 0x3F, 0x9B, 0x7D, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x9B, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x80, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x89, 0x46, /* 0x84-0x87 */ + 0x8E, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x91, 0x76, /* 0x88-0x8B */ + 0x8A, 0x00, 0x8E, 0x00, 0x3F, 0x3F, 0x8D, 0x47, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x93, 0x86, 0x3F, 0x3F, 0x8F, 0x40, /* 0x94-0x97 */ + 0x8A, 0x00, 0x92, 0x88, 0x92, 0x00, 0x88, 0x00, /* 0x98-0x9B */ + 0x8B, 0x58, 0x95, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x71, 0x90, 0x00, /* 0xA0-0xA3 */ + 0x8E, 0x00, 0x97, 0x47, 0x9B, 0x81, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x7B, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x51, /* 0xB0-0xB3 */ + 0x89, 0x83, 0x8F, 0x00, 0x89, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x9B, 0x82, 0x97, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x68, /* 0xBC-0xBF */ + 0x00, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x9B, 0x83, /* 0xC0-0xC3 */ + 0x8A, 0x00, 0x93, 0x00, 0x96, 0x00, 0x9B, 0x84, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x9B, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x95, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x9B, 0x87, 0x3F, 0x3F, 0x8A, 0x00, 0x8B, 0x00, /* 0xD0-0xD3 */ + 0x9B, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x90, 0x51, 0x9B, 0x8B, 0x8E, 0x40, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x89, 0x00, 0x9B, 0x8A, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x9B, 0x88, 0x9B, 0x8C, 0x9B, 0x89, 0x94, 0x4A, /* 0xE4-0xE7 */ + 0x9E, 0x00, 0x90, 0x52, 0x3F, 0x3F, 0x9B, 0x8D, /* 0xE8-0xEB */ + 0x00, 0x00, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x9B, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x90, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x92, 0x9E, 0x9B, 0x8F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x90, 0x00, 0x3F, 0x3F, 0x8E, 0x9B, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x8E, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5C[512] = { + 0x3F, 0x3F, 0x95, 0x95, 0x90, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x8E, 0x00, 0x9B, 0x91, 0x8F, 0x00, 0x9B, 0x92, /* 0x04-0x07 */ + 0x9B, 0x93, 0x88, 0x00, 0x91, 0x00, 0x90, 0x71, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x9B, 0x94, 0x93, 0x00, 0x8F, 0x00, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x9B, 0x95, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x9B, 0x96, 0x3F, 0x3F, 0x9B, 0x97, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x9B, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8F, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x9B, 0x99, 0x9B, 0x9A, 0x8E, 0x00, 0x90, 0x4B, /* 0x38-0x3B */ + 0x93, 0x00, 0x90, 0x73, 0x94, 0x00, 0x94, 0x41, /* 0x3C-0x3F */ + 0x8B, 0x00, 0x9B, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x8B, 0x8F, 0x9B, 0x9C, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x8B, 0x00, 0x3F, 0x3F, 0x93, 0x00, 0x89, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x8E, 0x72, 0x9B, 0x9D, 0x9B, 0x00, /* 0x4C-0x4F */ + 0x9B, 0x9F, 0x8B, 0x00, 0x3F, 0x3F, 0x9B, 0x9E, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x93, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x93, 0x6A, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x91, 0x77, 0x97, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x93, 0x00, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x8E, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x8A, 0x00, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x91, 0x5A, 0x8A, 0x00, 0x3F, 0x3F, 0x9B, 0x00, /* 0xA8-0xAB */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x8A, 0x78, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, /* 0xB4-0xB7 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x9B, 0x00, /* 0xB8-0xBB */ + 0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x93, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x89, 0x00, 0x9B, 0x00, 0x9B, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x95, 0x00, /* 0xEC-0xEF */ + 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x93, 0x87, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x8F, 0x73, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5D[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x92, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x9B, 0x00, 0x9B, 0x00, 0x8A, 0x52, 0x9B, 0x00, /* 0x14-0x17 */ + 0x9B, 0x00, 0x9B, 0x00, 0x9B, 0x00, 0x9B, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x48-0x4B */ + 0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x97, 0x92, 0x3F, 0x3F, 0x9B, 0x00, 0x00, 0x00, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x90, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x9B, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x00, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x88, /* 0x88-0x8B */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x9B, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0xB4-0xB7 */ + 0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x9B, 0x00, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x8A, 0x00, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x00, 0x00, 0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x90, 0x00, 0x8F, 0x42, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x8F, 0x84, 0x3F, 0x3F, 0x91, 0x83, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x8D, 0x48, 0x8D, 0x00, 0x8D, 0x49, /* 0xE4-0xE7 */ + 0x8B, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x8C, 0x00, 0x9B, 0x00, 0x96, 0x00, /* 0xF0-0xF3 */ + 0x94, 0x62, 0x9B, 0x00, 0x3F, 0x3F, 0x8D, 0x4A, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x92, 0x46, 0x8B, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x73, 0x95, 0x7A, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x08-0x0B */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x9F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, 0x9B, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x90, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x74, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x91, 0x00, /* 0x2C-0x2F */ + 0x8B, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, /* 0x34-0x37 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x96, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x40-0x43 */ + 0x9B, 0x00, 0x95, 0x9D, 0x3F, 0x3F, 0x9B, 0x00, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x96, 0x79, 0x3F, 0x3F, 0x9B, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x9B, 0x00, 0x96, 0x8B, 0x3F, 0x3F, 0x9B, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x94, 0x00, 0x9B, 0x00, 0x95, 0x00, /* 0x60-0x63 */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x95, 0x00, /* 0x70-0x73 */ + 0x94, 0x4E, 0x9B, 0x00, 0x9B, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x8D, 0x4B, 0x8A, 0x00, 0x9B, 0x00, 0x8C, 0x00, /* 0x78-0x7B */ + 0x97, 0x63, 0x97, 0x48, 0x8A, 0x00, 0x9B, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x8D, 0x4C, /* 0x80-0x83 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x98, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x92, 0x00, 0x95, 0x00, 0x93, 0x58, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x4D, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x95, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x78, 0x8D, 0x00, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x88, 0x00, 0x8F, 0x8E, 0x8D, 0x4E, /* 0xB4-0xB7 */ + 0x97, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x9B, 0x00, 0x9B, 0x00, 0x94, 0x70, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x9B, 0x00, 0x97, 0x00, 0x98, 0x4C, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9B, 0x00, /* 0xCC-0xCF */ + 0x9B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x66, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x40, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x43, 0x9C, 0x44, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x9C, 0x42, 0x3F, 0x3F, 0x95, 0x5F, /* 0xDC-0xDF */ + 0x8F, 0x00, 0x9C, 0x46, 0x9C, 0x45, 0x9C, 0x41, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x9C, 0x47, 0x9C, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x9C, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x9C, 0x4C, 0x9C, 0x4A, 0x3F, 0x3F, 0x9C, 0x4B, /* 0xF0-0xF3 */ + 0x9C, 0x4D, 0x3F, 0x3F, 0x89, 0x84, 0x92, 0x00, /* 0xF4-0xF7 */ + 0x9C, 0x4E, 0x3F, 0x3F, 0x8C, 0x9A, 0x89, 0x00, /* 0xF8-0xFB */ + 0x94, 0x55, 0x3F, 0x3F, 0x9C, 0x4F, 0x93, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5F[512] = { + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x9C, 0x50, /* 0x00-0x03 */ + 0x98, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x9C, 0x51, 0x95, 0x00, 0x9C, 0x54, /* 0x08-0x0B */ + 0x98, 0x9F, 0x98, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0x0C-0x0F */ + 0x93, 0x00, 0x9C, 0x55, 0x3F, 0x3F, 0x8B, 0x7C, /* 0x10-0x13 */ + 0x92, 0x00, 0x88, 0x00, 0x9C, 0x56, 0x95, 0x00, /* 0x14-0x17 */ + 0x8D, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x6F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x96, 0x00, 0x8C, 0x00, 0x8C, 0x00, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x9C, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x9C, 0x58, 0x3F, 0x3F, 0x9C, 0x5E, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x00, 0x00, 0x92, 0x00, 0x3F, 0x3F, 0x8B, 0x00, /* 0x34-0x37 */ + 0x9C, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x95, 0x4A, 0x3F, 0x3F, 0x92, 0x65, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x9C, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x00, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x9C, 0x5B, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x9C, 0x5C, 0x3F, 0x3F, 0x9C, 0x5D, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x9C, 0x5F, 0x3F, 0x3F, 0x93, 0x96, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x60, 0x9C, 0x61, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x9C, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x9C, 0x53, 0x9C, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x9C, 0x63, 0x8C, 0x60, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x46, 0x00, 0x00, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x8D, 0x00, 0x95, 0x56, 0x92, 0x00, /* 0x68-0x6B */ + 0x95, 0x6A, 0x9C, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x8F, 0x00, 0x89, 0x65, 0x3F, 0x3F, 0x9C, 0x65, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x66, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x69, /* 0x7C-0x7F */ + + 0x89, 0x9D, 0x90, 0x00, 0x9C, 0x68, 0x9C, 0x67, /* 0x80-0x83 */ + 0x8C, 0x61, 0x91, 0x00, 0x3F, 0x3F, 0x9C, 0x6D, /* 0x84-0x87 */ + 0x9C, 0x6B, 0x3F, 0x3F, 0x9C, 0x6A, 0x97, 0x00, /* 0x88-0x8B */ + 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x8F, 0x99, 0x9C, 0x6C, 0x93, 0x6B, 0x8F, 0x5D, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x94-0x97 */ + 0x9C, 0x70, 0x9C, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x6E, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x9C, 0x71, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x9C, 0x72, 0x95, 0x9C, 0x8F, 0x7A, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x9C, 0x73, 0x94, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xB0-0xB3 */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x93, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x9C, 0x74, 0x8B, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x53, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x95, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x8A, 0x00, 0x94, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x75, 0x8E, 0x75, /* 0xD4-0xD7 */ + 0x96, 0x59, 0x96, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x89, 0x9E, 0x9C, 0x7A, 0x00, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x92, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x9C, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x9C, 0x00, 0x9C, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x94, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x9C, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x76, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x8D, 0x9A, 0x3F, 0x3F, 0x9C, 0x7C, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_60[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x83, 0x9C, 0x89, /* 0x0C-0x0F */ + 0x9C, 0x81, 0x3F, 0x3F, 0x93, 0x7B, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x9C, 0x86, 0x95, 0x7C, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x9C, 0x80, 0x3F, 0x3F, 0x9C, 0x85, /* 0x18-0x1B */ + 0x97, 0x00, 0x8E, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x91, 0x00, 0x9C, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x8B, 0x7D, 0x9C, 0x88, 0x90, 0x00, /* 0x24-0x27 */ + 0x89, 0x85, 0x9C, 0x82, 0x89, 0x00, 0x9C, 0x87, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x9C, 0x84, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x8A, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x9C, 0x8C, 0x9C, 0x96, 0x9C, 0x94, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x91, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x90, 0x97, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x9C, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x8B, 0x00, 0x3F, 0x3F, 0x8D, 0x50, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x8F, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x9C, 0x99, 0x9C, 0x8B, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x9C, 0x8F, /* 0x5C-0x5F */ + 0x9C, 0x7E, 0x3F, 0x3F, 0x89, 0x00, 0x9C, 0x93, /* 0x60-0x63 */ + 0x9C, 0x95, 0x92, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x8D, 0x00, 0x89, 0x00, 0x9C, 0x8D, 0x9C, 0x98, /* 0x68-0x6B */ + 0x9C, 0x97, 0x8B, 0x00, 0x3F, 0x3F, 0x91, 0x00, /* 0x6C-0x6F */ + 0x8A, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x8C, 0x62, 0x3F, 0x3F, 0x9C, 0x8E, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x9C, 0x9A, 0x3F, 0x3F, 0x9C, 0x9D, /* 0x80-0x83 */ + 0x9C, 0x9F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x00, 0x9C, 0x00, /* 0x88-0x8B */ + 0x92, 0x00, 0x9C, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x89, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x9C, 0x00, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x9E, 0x9C, 0x00, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x9C-0x9F */ + 0x97, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x78, 0x9C, 0x00, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x94, 0x59, 0x88, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x9C, 0x7B, /* 0xB0-0xB3 */ + 0x9C, 0x00, 0x9C, 0x00, 0x96, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x93, 0x89, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x8F, 0x00, 0x9C, 0x00, 0x93, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x98, 0x66, 0x3F, 0x3F, 0x9C, 0x00, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x8D, 0x9B, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x90, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x88, 0x00, /* 0xDC-0xDF */ + 0x9C, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x91, 0x79, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x9C, /* 0xE4-0xE7 */ + 0x8E, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x91, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x91, 0x7A, /* 0xF0-0xF3 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x9C, 0x00, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x8E, 0x00, 0x9C, 0x00, 0x9C, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_61[512] = { + 0x9C, 0x00, 0x8F, 0x44, 0x3F, 0x3F, 0x9C, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x96, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x9C, 0x00, 0x9C, 0x00, 0x88, 0x00, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x88, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x1C-0x1F */ + 0x00, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x24-0x27 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x44-0x47 */ + 0x8E, 0x9C, 0x3F, 0x3F, 0x9C, 0x00, 0x91, 0x00, /* 0x48-0x4B */ + 0x8D, 0x51, 0x9C, 0x00, 0x90, 0x54, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x9D, 0x8A, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, 0x8C, 0x64, /* 0x64-0x67 */ + 0x8A, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x9C, 0x00, /* 0x6C-0x6F */ + 0x88, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, /* 0x70-0x73 */ + 0x9C, 0x00, 0x9C, 0x00, 0x8C, 0x63, 0x9C, 0x00, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x7C, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x4A, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x9E, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x97, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x00, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x8C, 0x65, 0x3F, 0x3F, 0x9C, 0x00, /* 0xA8-0xAB */ + 0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x9B, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x8D, 0x00, /* 0xC4-0xC7 */ + 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, /* 0xC8-0xCB */ + 0x9C, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x9C, 0x00, 0x9C, 0x00, /* 0xF4-0xF7 */ + 0x8C, 0x9C, 0x3F, 0x3F, 0x9C, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x9C, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_62[512] = { + 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x9C, 0x00, 0x9C, 0x00, 0x95, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x9C, 0x00, 0x9C, 0x00, 0x8F, 0x5E, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x90, 0x00, 0x89, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x10-0x13 */ + 0x9C, 0x00, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x9C, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x00, 0x00, 0x9D, 0x40, 0x8C, 0x81, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x9D, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x42, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x43, 0x8B, 0x59, /* 0x2C-0x2F */ + 0x9D, 0x44, 0x3F, 0x3F, 0x9D, 0x45, 0x9D, 0x46, /* 0x30-0x33 */ + 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x5B, /* 0x3C-0x3F */ + 0x8F, 0x8A, 0x9D, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0x44-0x47 */ + 0x00, 0x00, 0x94, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x8D, 0x00, 0x9D, 0x48, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x4B, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x49, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x9D, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x4A, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x9D, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x7D, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x9D, 0x4E, 0x3F, 0x3F, 0x9D, 0x51, 0x8F, 0x00, /* 0x7C-0x7F */ + + 0x8B, 0x5A, 0x3F, 0x3F, 0x9D, 0x4F, 0x9D, 0x56, /* 0x80-0x83 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x9D, 0x50, 0x94, 0x63, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x97, 0x7D, 0x9D, 0x52, 0x9D, 0x53, /* 0x90-0x93 */ + 0x9D, 0x57, 0x93, 0x8A, 0x9D, 0x54, 0x8D, 0x52, /* 0x94-0x97 */ + 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x65, /* 0x98-0x9B */ + 0x94, 0x00, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xA8-0xAB */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x96, 0x95, 0x3F, 0x3F, 0x9D, 0x5A, /* 0xB8-0xBB */ + 0x89, 0x9F, 0x92, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x63, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x92, 0x53, 0x9D, 0x5D, 0x9D, 0x64, /* 0xC4-0xC7 */ + 0x9D, 0x5F, 0x9D, 0x66, 0x9D, 0x62, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x9D, 0x61, 0x94, 0x8F, 0x3F, 0x3F, 0x9D, 0x5B, /* 0xCC-0xCF */ + 0x89, 0x00, 0x9D, 0x59, 0x8B, 0x91, 0x91, 0x00, /* 0xD0-0xD3 */ + 0x9D, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x58, /* 0xD4-0xD7 */ + 0x8D, 0x53, 0x90, 0x00, 0x3F, 0x3F, 0x8F, 0x00, /* 0xD8-0xDB */ + 0x9D, 0x60, 0x94, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x8B, 0x92, 0x8A, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x8A, 0x87, 0x90, 0x40, 0x9D, 0x68, 0x9D, 0x6D, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x9D, 0x69, 0x3F, 0x3F, 0x8C, 0x9D, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x9D, 0x6E, 0x8E, 0x41, 0x8D, 0x89, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x45, 0x9D, 0x5C, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_63[512] = { + 0x3F, 0x3F, 0x8E, 0x9D, 0x9D, 0x6B, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x77, /* 0x04-0x07 */ + 0x9D, 0x6C, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x9D, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x8B, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x6A, /* 0x24-0x27 */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x55, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x94, 0x00, 0x9D, 0x70, 0x91, 0x7D, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x8E, 0x4A, 0x9D, 0x71, 0x3F, 0x3F, 0x9D, 0x73, /* 0x4C-0x4F */ + 0x9D, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x92, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x91, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x64-0x67 */ + 0x8E, 0x00, 0x9D, 0x80, 0x3F, 0x3F, 0x9D, 0x7E, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x98, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x9E, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x78, 0x8F, 0x00, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x94, 0x50, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x9D, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x7C, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x8E, 0x00, 0x9D, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x8F, 0x00, 0x3F, 0x3F, 0x9D, 0x75, 0x9D, 0x7A, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x72, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x74, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x8C, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x7C, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x7C, /* 0x9C-0x9F */ + 0x97, 0x00, 0x8D, 0x00, 0x92, 0x54, 0x9D, 0x79, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x8D, 0x54, /* 0xA4-0xA7 */ + 0x90, 0x84, 0x89, 0x86, 0x91, 0x5B, 0x9D, 0x77, /* 0xA8-0xAB */ + 0x8B, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x66, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x92, 0x00, 0x9D, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x7E, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x81, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x9D, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xC0-0xC3 */ + 0x9D, 0x89, 0x3F, 0x3F, 0x9D, 0x84, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x9D, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x60, /* 0xCC-0xCF */ + 0x92, 0x00, 0x3F, 0x3F, 0x9D, 0x87, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x4B, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x67, 0x8A, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x9D, 0x85, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x9D, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x89, 0x87, 0x00, 0x00, 0x9D, 0x88, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x68, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_64[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x8C, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x9D, 0x93, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x8D, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x8A, 0x9D, 0x91, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x9D, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x8E, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x9D, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x94, 0x00, 0x93, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x9D, 0x8B, 0x3F, 0x3F, 0x9D, 0x8F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x67, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x97, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x93, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x94, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x96, 0x80, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x95, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x96, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x96, 0x00, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x82, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x9D, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x54, 0x9D, 0x9A, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x9D, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x51, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x00, 0x00, 0x93, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x93, 0x50, 0x9D, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x9D, 0x9C, 0x3F, 0x3F, 0x95, 0x8F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x94, 0x64, 0x8E, 0x42, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x90, 0x00, 0x3F, 0x3F, 0x96, 0x6F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x8A, 0x68, 0x3F, 0x3F, 0x9D, 0x00, /* 0xB8-0xBB */ + 0x9D, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x97, 0x69, 0x9D, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x91, 0x80, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x9D, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x9F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x9D, 0x00, 0x9D, 0x00, 0x93, 0x46, 0x9D, 0x00, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x43, 0x9D, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x8B, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x9D, 0x00, 0x8F, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_65[512] = { + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x9D, 0x00, 0x9D, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0x20-0x23 */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x98, 0x9D, 0x00, /* 0x28-0x2B */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x78, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x9D, 0x00, 0x9D, 0x00, 0x9D, 0x00, 0x9D, 0x00, /* 0x34-0x37 */ + 0x9D, 0x00, 0x89, 0x00, 0x3F, 0x3F, 0x8D, 0x55, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x90, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x9D, 0x00, 0x00, 0x00, 0x95, 0x71, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x8B, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, 0x94, 0x73, /* 0x54-0x57 */ + 0x9D, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x8E, 0x55, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x8C, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x90, 0x94, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x90, 0x00, 0x93, 0x47, 0x3F, 0x3F, 0x95, 0x7E, /* 0x74-0x77 */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x84-0x87 */ + 0x9B, 0x7C, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x95, 0x6B, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x94, 0x00, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x6C, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0x98-0x9B */ + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x8B, 0x00, 0x90, 0x00, 0x3F, 0x3F, 0x95, 0x80, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0xA8-0xAB */ + 0x8E, 0x61, 0x92, 0x66, 0x3F, 0x3F, 0x8E, 0x7A, /* 0xAC-0xAF */ + 0x90, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x89, 0x97, 0x8E, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0xC0-0xC3 */ + 0x9D, 0x00, 0x97, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0xC8-0xCB */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x9D, 0x00, 0x9D, 0x00, 0x8A, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x93, 0x00, 0x92, 0x55, 0x8B, 0x8C, /* 0xE4-0xE7 */ + 0x8E, 0x7C, 0x91, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x8F, 0x7B, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x9D, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_66[512] = { + 0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x56, 0x9D, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x8F, 0x00, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x00, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x8F, 0x00, 0x3F, 0x3F, 0x96, 0x00, 0x8D, 0x00, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x10-0x13 */ + 0x90, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x9D, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x00, /* 0x1C-0x1F */ + 0x89, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x00, 0x00, 0x8F, 0x74, 0x3F, 0x3F, 0x96, 0x86, /* 0x24-0x27 */ + 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x90, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x00, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x9D, 0x00, 0x9D, 0x00, 0x9D, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */ + 0x92, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x45, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x9D, 0x00, 0x8E, 0x9E, 0x8D, 0x57, /* 0x40-0x43 */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x90, 0x57, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x4E, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x9D, 0x00, 0x9D, 0x00, 0x9D, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x9D, 0x00, 0x00, 0x00, 0x8A, 0x41, 0x9D, 0x00, /* 0x64-0x67 */ + 0x9D, 0x00, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x81, 0x8C, 0x69, /* 0x6C-0x6F */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x70-0x73 */ + 0x90, 0x00, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x71, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x9D, 0x00, /* 0x80-0x83 */ + 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x84-0x87 */ + 0x9D, 0x00, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x8F, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x67, 0x88, 0x00, /* 0x94-0x97 */ + 0x9D, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x00, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x62, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x96, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x9E, 0x41, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x9D, 0x00, 0x3F, 0x3F, 0x9D, 0x00, 0x00, 0x00, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x9E, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x42, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x8F, 0x8C, 0x9E, 0x43, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x97, 0x6A, 0x94, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x9E, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x46, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x9E, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x9E, 0x48, 0x3F, 0x3F, 0x8B, 0x00, 0x89, 0x67, /* 0xF0-0xF3 */ + 0x8D, 0x58, 0x9E, 0x49, 0x3F, 0x3F, 0x9E, 0x4A, /* 0xF4-0xF7 */ + 0x8F, 0x91, 0x91, 0x82, 0x00, 0x00, 0x00, 0x66, /* 0xF8-0xFB */ + 0x99, 0x00, 0x91, 0x5D, 0x91, 0x5C, 0x91, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_67[512] = { + 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x8C, 0x8E, 0x97, 0x4C, 0x3F, 0x3F, 0x95, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x95, 0x9E, 0x00, 0x00, 0x9E, 0x4B, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x8D, 0x00, 0x92, 0x00, 0x9E, 0x4C, 0x98, 0x4E, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x5D, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x92, 0x00, 0x9E, 0x4D, 0x8A, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x4E, 0x9E, 0x4F, /* 0x24-0x27 */ + 0x96, 0x00, 0x3F, 0x3F, 0x96, 0x00, 0x96, 0x96, /* 0x28-0x2B */ + 0x96, 0x7B, 0x8E, 0x44, 0x9E, 0x51, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x96, 0x70, 0x3F, 0x3F, 0x9E, 0x53, 0x9E, 0x56, /* 0x34-0x37 */ + 0x9E, 0x55, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x8B, 0x80, 0x3F, 0x3F, 0x9E, 0x52, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x9E, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x57, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x90, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x9B, 0x88, 0x00, /* 0x4C-0x4F */ + 0x8D, 0x00, 0x91, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x9E, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x93, 0x6D, 0x3F, 0x3F, 0x9E, 0x58, 0x91, 0x00, /* 0x5C-0x5F */ + 0x9E, 0x59, 0x8F, 0x00, 0x96, 0x00, 0x9E, 0x5B, /* 0x60-0x63 */ + 0x9E, 0x5C, 0x97, 0x88, 0x00, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x61, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x8D, 0x59, 0x3F, 0x3F, 0x94, 0x74, /* 0x6C-0x6F */ + 0x9E, 0x5E, 0x93, 0x8C, 0x9D, 0x00, 0x9D, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x8B, 0x6E, 0x3F, 0x3F, 0x94, 0x66, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x9E, 0x60, 0x3F, 0x3F, 0x8F, 0x00, 0x94, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x9E, 0x66, 0x3F, 0x3F, 0x94, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x9E, 0x5D, 0x3F, 0x3F, 0x9E, 0x63, /* 0x88-0x8B */ + 0x9E, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x96, 0x8D, 0x3F, 0x3F, 0x97, 0x00, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x87, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x89, 0x00, 0x8E, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x98, 0x67, 0x9E, 0x65, 0x90, 0x95, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x64, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x9E, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x6B, /* 0xB0-0xB3 */ + 0x9E, 0x69, 0x3F, 0x3F, 0x89, 0x00, 0x9E, 0x67, /* 0xB4-0xB7 */ + 0x9E, 0x6D, 0x9E, 0x73, 0x3F, 0x3F, 0x00, 0x00, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x00, 0x00, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x95, 0x00, 0x3F, 0x3F, 0x9E, 0x75, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x41, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x74, 0x94, 0x90, /* 0xCC-0xCF */ + 0x96, 0x5E, 0x8A, 0x00, 0x3F, 0x3F, 0x90, 0x00, /* 0xD0-0xD3 */ + 0x8F, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x92, 0x00, 0x3F, 0x3F, 0x97, 0x4D, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x9E, 0x70, 0x9E, 0x6F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x71, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x9E, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x76, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x9E, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x9E, 0x6A, 0x3F, 0x3F, 0x9E, 0x72, 0x9E, 0x68, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x92, 0x8C, 0x3F, 0x3F, 0x96, 0x00, /* 0xF0-0xF3 */ + 0x8E, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x8F, 0x8A, 0x60, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_68[512] = { + 0x3F, 0x3F, 0x00, 0x00, 0x92, 0x00, 0x93, 0x00, /* 0x00-0x03 */ + 0x89, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x8C, 0x49, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x78, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x8D, 0x5A, 0x8A, 0x9C, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x9E, 0x7A, 0x8A, 0x94, 0x9E, 0x81, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x7D, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x8A, 0x6A, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x8A, 0x69, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x9E, 0x7B, 0x8C, 0x85, 0x8C, 0x6A, 0x93, 0x8D, /* 0x40-0x43 */ + 0x00, 0x00, 0x3F, 0x3F, 0x9E, 0x79, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x9E, 0x7C, 0x9E, 0x7E, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x8B, 0x00, 0x8C, 0x4B, 0x00, 0x00, 0x8A, 0x00, /* 0x50-0x53 */ + 0x8B, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x9E, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x8D, 0x00, 0x96, 0x91, 0x3F, 0x3F, 0x8E, 0x56, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x83, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x4F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x9E, 0x8F, 0x3F, 0x3F, 0x89, 0x00, 0x9E, 0x84, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x95, 0x9E, 0x85, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x9E, 0x8C, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x94, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x9E, 0x94, 0x3F, 0x3F, 0x9E, 0x87, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x90-0x93 */ + 0x9E, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x5B, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x8B, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x9E, 0x8A, 0x3F, 0x3F, 0x9E, 0x86, /* 0x9C-0x9F */ + 0x9E, 0x91, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x00, 0x8C, 0x00, /* 0xA4-0xA7 */ + 0x97, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x9E, 0x88, 0x3F, 0x3F, 0x92, 0x00, /* 0xAC-0xAF */ + 0x8A, 0x42, 0x8D, 0x00, 0x3F, 0x3F, 0x9E, 0x80, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x9E, 0x90, 0x8A, 0x81, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x9E, 0x8E, 0x9E, 0x92, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x93, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x00, 0x64, 0x96, 0x00, 0x9E, 0x97, 0x8A, 0x00, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x9E, 0x9E, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x5F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x9E, 0x9F, 0x9E, 0x00, 0x3F, 0x3F, 0x9E, 0x00, /* 0xD4-0xD7 */ + 0x9E, 0x99, 0x3F, 0x3F, 0x92, 0x49, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x8F, /* 0xDC-0xDF */ + 0x9E, 0x00, 0x9E, 0x9C, 0x3F, 0x3F, 0x9E, 0x00, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x58, 0x9E, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x9E, 0x00, 0x8A, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_69[512] = { + 0x98, 0x6F, 0x9E, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x9E, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x9E, 0x98, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x08-0x0B */ + 0x9E, 0x9D, 0x90, 0x41, 0x92, 0x00, 0x9E, 0x93, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x90, 0x9A, 0x9E, 0x00, 0x8A, 0x91, /* 0x18-0x1B */ + 0x8C, 0x9F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x9A, 0x9E, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x9B, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x9E, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x93, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x92, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x6B, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x96, /* 0x50-0x53 */ + 0x9E, 0x00, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x9E, 0x00, 0x91, 0x5E, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x9E, 0x00, 0x9E, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x93, 0x00, 0x9E, 0x00, 0x93, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x00, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x8B, 0x00, 0x9E, 0x00, 0x8F, 0x7C, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x80, /* 0x70-0x73 */ + 0x9E, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x9E, 0x00, /* 0x74-0x77 */ + 0x9E, 0x00, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x98, 0x4F, 0x8A, 0x79, 0x9E, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x9E, 0x00, 0x8A, 0x54, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x7C, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x98, 0x50, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x59, /* 0x98-0x9B */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x9E, 0x00, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x8D, 0x5C, /* 0xC8-0xCB */ + 0x92, 0x00, 0x91, 0x84, 0x9E, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x97, 0x6C, 0x96, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xE4-0xE7 */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x92, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x91, 0x85, 0x3F, 0x3F, 0x9E, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6A[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x94, 0x00, /* 0x08-0x0B */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, /* 0x10-0x13 */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x94, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x95, 0x57, 0x3F, 0x3F, 0x9E, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x8F, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x96, 0x00, 0x9E, 0x00, 0x9E, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x89, 0x00, 0x8A, 0x7E, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x8F, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x9E, 0x00, 0x8E, 0x00, 0x8A, 0x92, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x92, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x9E, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x9E, 0x00, /* 0x44-0x47 */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x8B, 0x6B, 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x40, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x93, 0x00, 0x9E, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x00, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8A, 0x80, /* 0x7C-0x7F */ + + 0x92, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x9E, 0x00, 0x8C, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x9E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x40, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x9E, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x9E, 0x00, 0x3F, 0x3F, 0x9E, 0x00, 0x9E, 0x00, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x4B, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x9F, 0x47, 0x3F, 0x3F, 0x9E, 0x8D, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x46, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x9F, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x42, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x9E, 0x00, 0x9F, 0x44, 0x9F, 0x43, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x9F, 0x49, 0x3F, 0x3F, 0x98, 0x45, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x4C, 0x8B, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x48, 0x9F, 0x4A, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x94, 0x00, 0x3F, 0x3F, 0x9F, 0x4D, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x51, 0x9F, 0x4E, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6B[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x97, 0x93, 0x9F, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9E, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x52, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x53, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x89, 0x54, 0x3F, 0x3F, 0x9F, 0x55, /* 0x1C-0x1F */ + 0x8C, 0x87, 0x8E, 0x9F, 0x3F, 0x3F, 0x8B, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x7E, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x57, /* 0x34-0x37 */ + 0x9F, 0x56, 0x9F, 0x59, 0x8B, 0x5C, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x8B, 0x00, 0x8A, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x5C, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x5B, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x9F, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x89, 0x00, 0x3F, 0x3F, 0x92, 0x56, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x9F, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x50-0x53 */ + 0x9F, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x9F, 0x5F, 0x3F, 0x3F, 0x9F, 0x61, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x62, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x9F, 0x63, 0x8E, 0x7E, 0x90, 0x00, /* 0x60-0x63 */ + 0x8D, 0x9F, 0x3F, 0x3F, 0x95, 0x90, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x95, 0x00, 0x98, 0x63, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x95, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, /* 0x70-0x73 */ + 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x9F, 0x64, 0x9F, 0x65, 0x3F, 0x3F, 0x8E, 0x80, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x66, /* 0x7C-0x7F */ + + 0x9F, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x69, /* 0x80-0x83 */ + 0x9F, 0x68, 0x3F, 0x3F, 0x96, 0x77, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x8F, 0x7D, 0x8E, 0x00, 0x8E, 0x63, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x9F, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x9F, 0x6C, 0x90, 0x42, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x9F, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x6D, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x9F, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x6F, 0x9F, 0x70, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x71, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x9F, 0x73, 0x9F, 0x72, 0x9F, 0x74, /* 0xB0-0xB3 */ + 0x89, 0x00, 0x92, 0x69, 0x3F, 0x3F, 0x9F, 0x75, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x45, 0x8A, 0x6B, /* 0xB8-0xBB */ + 0x9F, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x61, /* 0xBC-0xBF */ + 0x9A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x8B, 0x42, 0x9F, 0x77, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x78, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x95, 0x00, 0x96, 0x88, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x9F, 0x79, /* 0xD0-0xD3 */ + 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x7A, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x7C, /* 0xE8-0xEB */ + 0x9F, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x7E, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x7D, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6C[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x9F, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x81, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x9F, 0x82, /* 0x10-0x13 */ + 0x9F, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x43, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x84, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x86, /* 0x20-0x23 */ + 0x9F, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x90, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x58, /* 0x34-0x37 */ + 0x89, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x00, 0x00, /* 0x3C-0x3F */ + 0x92, 0x00, 0x8F, 0x60, 0x8B, 0x81, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x9F, 0x88, 0x3F, 0x3F, 0x8A, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x98, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x00, 0x00, 0x93, 0x00, 0x9F, 0x87, 0x8D, 0x5D, /* 0x5C-0x5F */ + 0x92, 0x72, 0x3F, 0x3F, 0x9F, 0x89, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x9F, 0x91, 0x3F, 0x3F, 0x9F, 0x8A, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x6C-0x6F */ + 0x91, 0x00, 0x3F, 0x3F, 0x8B, 0x82, 0x9F, 0x92, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x88, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x8B, 0x44, 0x9F, 0x90, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x9F, 0x8E, 0x9F, 0x8B, 0x97, 0x80, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x93, 0x00, 0x9F, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x9F, 0x94, 0x3F, 0x3F, 0x9F, 0x93, 0x8C, 0x42, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x8D, 0x00, 0x9F, 0x8D, 0x9F, 0x8F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x96, 0x76, 0x91, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x97, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x9C, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x9F, 0x9D, 0x3F, 0x3F, 0x89, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x95, 0x00, 0x96, 0x00, 0x9F, 0x9F, 0x8E, 0x00, /* 0xB8-0xBB */ + 0x8F, 0x00, 0x9F, 0x98, 0x9F, 0x9E, 0x89, 0x88, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x9F, 0x95, 0x9F, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x90, 0x00, 0x94, 0x91, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x97, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x96, 0x40, 0x3F, 0x3F, 0x9F, 0x99, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x00, 0x00, 0x9F, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x9F, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x96, 0x41, 0x94, 0x67, 0x8B, 0x83, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x93, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x92, 0x8D, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0xEC-0xEF */ + 0x91, 0x00, 0x9F, 0x96, 0x3F, 0x3F, 0x89, 0x6A, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6D[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x6D, /* 0x08-0x0B */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x97, 0x8C, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x9F, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x89, 0x6B, 0x8D, 0x5E, 0x9F, 0x00, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x46, 0x9F, 0x00, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x88, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x9F, 0x00, 0x94, 0x68, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x8F, 0x00, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x95, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x60-0x63 */ + 0x9F, 0x00, 0x3F, 0x3F, 0x89, 0x59, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x8D, 0x5F, 0x98, 0x51, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x8A, 0x5C, 0x3F, 0x3F, 0x95, 0x82, 0x00, 0x00, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x97, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x43, /* 0x74-0x77 */ + 0x90, 0x5A, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x84-0x87 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x97, 0x4F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x00, 0x40, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x93, 0x93, /* 0x98-0x9B */ + 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x00, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x55, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x74, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x97, 0x84, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x9F, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xC8-0xCB */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x42, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x8F, 0x69, 0x9F, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x93, 0x91, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x92, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x9F, 0x00, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x9F, 0x00, 0x3F, 0x3F, 0x9F, 0x00, 0x88, 0x00, /* 0xE8-0xEB */ + 0x9F, 0x00, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x90, 0x5B, 0x00, 0x44, 0x8F, 0x7E, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x8D, 0x00, /* 0xF4-0xF7 */ + 0x00, 0x43, 0x9F, 0x00, 0x9F, 0x00, 0x93, 0x59, /* 0xF8-0xFB */ + 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x8A, 0x89, /* 0x04-0x07 */ + 0x8D, 0x00, 0x8F, 0x00, 0x9F, 0x00, 0x8F, 0x61, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x6B, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x8F, 0x8D, 0x8C, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x9F, 0x00, /* 0x1C-0x1F */ + 0x8B, 0x94, 0x93, 0x6E, 0x3F, 0x3F, 0x9F, 0x00, /* 0x20-0x23 */ + 0x9F, 0x00, 0x88, 0x00, 0x89, 0x51, 0x00, 0x48, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x9F, 0x00, /* 0x28-0x2B */ + 0x91, 0x00, 0x9F, 0x00, 0x9F, 0x00, 0x8D, 0x60, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x9F, 0x00, 0x00, 0x46, 0x9F, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x00, 0x49, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x58, /* 0x58-0x5B */ + 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x4E, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x93, 0x92, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x70, 0x8E, 0x00, /* 0x7C-0x7F */ + + 0x96, 0x9E, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0x8C-0x8F */ + 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x80, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x97, 0x00, 0x8D, 0x61, 0x3F, 0x3F, 0x9F, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x6E, 0x9F, 0x00, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x4D, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x00, 0x4A, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x9F, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x8E, 0x00, /* 0xC8-0xCB */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x8A, 0x8A, 0x3F, 0x3F, 0x9F, 0x00, /* 0xD0-0xD3 */ + 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x91, 0x00, 0x91, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x93, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x42, /* 0xF4-0xF7 */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6F[512] = { + 0x3F, 0x3F, 0x8B, 0x99, 0x95, 0x59, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x8D, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x52, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x00, 0x41, /* 0x10-0x13 */ + 0x89, 0x89, 0x91, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x94, 0x99, 0x3F, 0x3F, 0x8A, 0x00, 0x97, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x9F, /* 0x28-0x2B */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x9F, 0x00, 0x9F, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x91, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x40, 0x9F, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x8C, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x49, /* 0x58-0x5B */ + 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x83, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x8F, 0x81, 0x3F, 0x3F, 0x00, 0x52, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x00, 0x4B, 0x92, 0x00, 0x00, 0x48, /* 0x6C-0x6F */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x00, 0x45, 0x3F, 0x3F, 0x00, 0x44, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x00, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x00, 0x47, 0x00, 0x46, 0x00, 0x4C, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x90, 0x9F, 0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x00, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x00, 0x55, 0x3F, 0x3F, 0x00, 0x54, /* 0xA0-0xA3 */ + 0x00, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x59, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x93, 0x62, 0x3F, 0x3F, 0x00, 0x53, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x00, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x8C, 0x83, 0x91, 0x00, 0x00, 0x51, 0x94, 0x5A, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x5D, 0x00, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x61, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5A, /* 0xDC-0xDF */ + 0x8D, 0x8A, 0x94, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x94, /* 0xE8-0xEB */ + 0x00, 0x5C, 0x3F, 0x3F, 0x00, 0x60, 0x91, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x00, 0x5F, 0x3F, 0x3F, 0x00, 0x4A, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x00, 0x4D, 0x00, 0x89, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x68, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_70[512] = { + 0x3F, 0x3F, 0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x00, 0x4E, 0x3F, 0x3F, 0x00, 0x4F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, 0x00, 0x63, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x67, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x95, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x00, 0x6D, 0x3F, 0x3F, 0x00, 0x6A, 0x00, 0x69, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x00, 0x6C, 0x93, 0x00, 0x00, 0x6E, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x95, 0x91, 0x00, /* 0x24-0x27 */ + 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x6F, 0x3F, 0x3F, 0x00, 0x71, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x70, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x94, /* 0x6C-0x6F */ + 0x8A, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x8B, 0x84, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x8E, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x00, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x98, 0x46, 0x90, 0x86, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x8A, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x75, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x00, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x52, /* 0xA8-0xAB */ + 0x00, 0x78, 0x92, 0x59, 0x00, 0x7B, 0x00, 0x76, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7A, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x00, 0x79, 0x93, 0x5F, 0x88, 0x00, 0x00, 0x62, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7D, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x47, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x00, 0x80, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x00, 0x7E, 0x3F, 0x3F, 0x00, 0x7C, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x96, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x00, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_71[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x89, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x00, 0x84, 0x95, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x00, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x52, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x56, 0x00, 0x57, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x00, 0x8A, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x86, 0x00, 0x8B, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x89, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x00, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x94, 0x81, 0x00, 0x85, 0x00, 0x88, 0x8F, 0x00, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x00, 0x8C, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x00, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x00, 0x87, 0x3F, 0x3F, 0x8C, 0x46, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8D, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x97, 0x6F, 0x00, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x6E, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x00, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x00, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x94, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x95, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x00, 0x59, 0x3F, 0x3F, 0x94, 0x52, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x93, 0x95, 0x00, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x99, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x97, 0x00, 0x3F, 0x3F, 0x00, 0x96, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x98, 0x89, 0x8D, 0x3F, 0x3F, 0x00, 0x93, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x7A, /* 0xDC-0xDF */ + 0x00, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x91, 0x87, 0x8E, 0x57, 0x00, 0x9C, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x00, 0x9B, 0x90, 0x43, 0x99, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x00, 0x9F, 0x3F, 0x3F, 0x00, 0x8E, /* 0xF8-0xFB */ + 0x00, 0x9E, 0x3F, 0x3F, 0x00, 0x5A, 0x00, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_72[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x9A, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x00, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x8E, 0x00, 0x95, 0x83, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x00, 0x00, /* 0x38-0x3B */ + 0x00, 0x00, 0x91, 0x75, 0x8E, 0x00, 0x00, 0x00, /* 0x3C-0x3F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x95, 0x00, /* 0x44-0x47 */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x48-0x4B */ + 0x94, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x00, 0x89, 0x00, 0x3F, 0x3F, 0x8B, 0x8D, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x96, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x89, 0x00, 0x98, 0x53, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x71, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x8B, 0x5D, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x00, 0x5B, 0x00, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x00, 0x00, /* 0xC0-0xC3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x8C, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x91, 0x5F, 0x3F, 0x3F, 0x8D, 0x9D, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x93, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF4-0xF7 */ + 0x92, 0x4B, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x98, 0x54, 0x94, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_73[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x18-0x1B */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x97, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x00, 0x5D, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x00, 0x00, 0x92, 0x96, 0x94, 0x4C, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x00, 0x00, 0x3F, 0x3F, 0x97, 0x50, 0x97, 0x51, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x89, 0x8E, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x8D, 0x96, 0x8E, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x62, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x00, 0x00, 0x3F, 0x3F, 0x8A, 0x6C, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x5F, /* 0x74-0x77 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x89, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x00, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x00, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x00, 0x00, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x00, 0x00, 0x00, 0x61, 0x8E, 0x58, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x92, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x63, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x5D, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x94, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_74[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x85, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x00, 0x00, 0x97, 0x9D, 0x00, 0x65, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x67, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x00, 0x69, 0x00, 0x68, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6A, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x97, 0x00, /* 0x30-0x33 */ + 0x8B, 0x00, 0x94, 0x00, 0x94, 0x69, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x00, 0x8C, 0x00, 0x89, 0x6C, /* 0x58-0x5B */ + 0x00, 0x00, 0x3F, 0x3F, 0x90, 0x90, 0x00, 0x00, /* 0x5C-0x5F */ + 0x97, 0x00, 0x3F, 0x3F, 0x00, 0x6B, 0x00, 0x00, /* 0x60-0x63 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x6C-0x6F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x9E, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x6D, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x89, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x00, 0x40, 0x3F, 0x3F, 0x95, 0x5A, 0x00, 0x41, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x00, 0x42, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x44, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x00, 0x46, 0x00, 0x47, 0x00, 0x45, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x72, 0x00, 0x49, /* 0xF4-0xF7 */ + 0x00, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_75[512] = { + 0x3F, 0x3F, 0x00, 0x6E, 0x3F, 0x3F, 0x00, 0x4B, /* 0x00-0x03 */ + 0x00, 0x4A, 0x00, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x00, 0x4D, 0x00, 0x4F, 0x00, 0x4E, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x8D, 0x99, 0x3F, 0x3F, 0x00, 0x51, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x90, 0x72, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x93, 0x5B, 0x3F, 0x3F, 0x00, 0x52, 0x90, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x59, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x89, 0x99, 0x00, 0x53, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x97, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x28-0x2B */ + 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x2C-0x2F */ + 0x93, 0x63, 0x97, 0x52, 0x8D, 0x62, 0x90, 0x5C, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x6A, /* 0x34-0x37 */ + 0x99, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x89, 0x00, /* 0x38-0x3B */ + 0x00, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x00, 0x56, 0x3F, 0x3F, 0x00, 0x5B, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x00, 0x59, 0x00, 0x58, 0x9D, 0x00, /* 0x48-0x4B */ + 0x8A, 0x45, 0x00, 0x57, 0x3F, 0x3F, 0x88, 0x00, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x97, 0x00, 0x00, 0x5C, 0x00, 0x5A, /* 0x58-0x5B */ + 0x92, 0x7B, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x94, 0x00, 0x3F, 0x3F, 0x95, 0x4C, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x5E, 0x97, 0x00, 0x8C, 0x6C, 0x00, 0x5F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x00, 0x5D, 0x94, 0x00, 0x00, 0x60, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x00, 0x61, 0x3F, 0x3F, 0x00, 0x6F, /* 0x6C-0x6F */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, /* 0x70-0x73 */ + 0x00, 0x66, 0x3F, 0x3F, 0x00, 0x63, 0x93, 0x00, /* 0x74-0x77 */ + 0x00, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x45, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x69, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x64, 0x00, 0x65, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x00, 0x68, 0x00, 0x67, 0x95, 0x44, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x61, 0x91, 0x60, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x8B, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x00, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6B, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6E, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x00, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x75, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x00, 0x76, 0x94, 0x00, 0x00, 0x70, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x00, 0x74, 0x90, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x00, 0x75, 0x00, 0x73, 0x8E, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6F, 0x00, 0x71, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x95, 0x61, 0x3F, 0x3F, 0x8F, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x78, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x8E, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x93, 0x97, 0x00, 0x7A, 0x3F, 0x3F, 0x92, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7C, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x9F, 0x00, 0x7B, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x91, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x00, 0x82, 0x3F, 0x3F, 0x00, 0x84, 0x00, 0x85, /* 0xF0-0xF3 */ + 0x92, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x83, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x00, 0x80, 0x3F, 0x3F, 0x00, 0x7D, 0x00, 0x7E, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_76[512] = { + 0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x00, 0x88, 0x3F, 0x3F, 0x00, 0x86, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, /* 0x1C-0x1F */ + 0x00, 0x8B, 0x00, 0x8C, 0x00, 0x8D, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x00, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8A, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x00, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x91, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x94, 0x00, 0x92, /* 0x44-0x47 */ + 0x00, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x00, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x00, 0x97, 0x00, 0x98, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9C, /* 0x64-0x67 */ + 0x00, 0x99, 0x00, 0x9A, 0x00, 0x9B, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x00, 0x9E, 0x3F, 0x3F, 0x00, 0x9F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, 0x93, 0x6F, /* 0x78-0x7B */ + 0x00, 0x00, 0x94, 0x92, 0x95, 0x53, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x70, 0x00, 0x00, /* 0x80-0x83 */ + 0x93, 0x49, 0x3F, 0x3F, 0x8A, 0x46, 0x8D, 0x63, /* 0x84-0x87 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x8E, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, /* 0x98-0x9B */ + 0x00, 0x71, 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x74, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, /* 0xB4-0xB7 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x4D, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x94, 0x75, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x7E, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x89, 0x6D, 0x3F, 0x3F, 0x89, 0x76, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x93, 0x90, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0xD8-0xDB */ + 0x9F, 0x58, 0x3F, 0x3F, 0x00, 0x00, 0x96, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x8A, 0x00, /* 0xE0-0xE3 */ + 0x94, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x91, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x82, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_77[512] = { + 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */ + 0x00, 0x00, 0x94, 0x00, 0x3F, 0x3F, 0x8A, 0x00, /* 0x08-0x0B */ + 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x5E, /* 0x1C-0x1F */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x34-0x37 */ + 0x00, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x92, 0x85, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x76, 0x00, 0x00, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x90, 0x87, 0x3F, 0x3F, 0x93, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x00, 0x00, 0x96, 0x72, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x8F, 0x75, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xB8-0xBB */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x96, 0x00, /* 0xD8-0xDB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x00, 0x00, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x92, 0x6D, 0x3F, 0x3F, 0x94, 0x8A, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x92, 0x5A, 0x00, 0x00, 0x8B, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_78[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x8C, 0x00, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x00, 0x00, 0x00, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x93, 0x75, 0x8D, 0x00, 0x8B, 0x6D, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x43, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x94, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x76, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x7B, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x68-0x6B */ + 0x8D, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7B, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x92, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x00, 0x00, 0x8A, 0x56, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x89, 0x4F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, 0x98, 0x71, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x90, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x6D, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x94, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x41, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x40, /* 0xE4-0xE7 */ + 0x96, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x00, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_79[512] = { + 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x44, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x62, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x00, 0x46, 0x00, 0x45, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x49, /* 0x28-0x2B */ + 0x00, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x97, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x00, 0x4A, 0x8C, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x5F, /* 0x44-0x47 */ + 0x8B, 0x46, 0x8E, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x97, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x50, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x4F, 0x91, 0x63, 0x00, 0x4C, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4E, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x8F, 0x6A, 0x90, 0x5F, 0x00, 0x4D, /* 0x5C-0x5F */ + 0x00, 0x4B, 0x3F, 0x3F, 0x94, 0x49, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x95, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x98, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x51, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x52, /* 0x7C-0x7F */ + + 0x00, 0x68, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x98, 0x5C, 0x91, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x89, 0x00, 0x92, 0x00, 0x95, 0x9F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x83, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x9A, 0x00, 0x55, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x94, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x59, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x5A, 0x00, 0x5B, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x8B, 0x00, 0x89, 0x00, 0x93, 0x00, /* 0xBC-0xBF */ + 0x8F, 0x47, 0x8E, 0x84, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, 0x8F, 0x48, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x89, 0x00, 0x95, 0x62, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x00, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x64, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x00, 0x60, 0x3F, 0x3F, 0x00, 0x61, /* 0xE0-0xE3 */ + 0x94, 0x89, 0x3F, 0x3F, 0x90, 0x60, 0x00, 0x5E, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x92, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x00, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7A[512] = { + 0x8B, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x00, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x63, 0x90, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x42, /* 0x14-0x17 */ + 0x00, 0x64, 0x00, 0x65, 0x92, 0x74, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x67, /* 0x1C-0x1F */ + 0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x00, 0x69, 0x88, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6C, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6A, /* 0x38-0x3B */ + 0x89, 0x00, 0x8C, 0x6D, 0x00, 0x6B, 0x8D, 0x65, /* 0x3C-0x3F */ + 0x8D, 0x92, 0x3F, 0x3F, 0x95, 0x00, 0x00, 0x6D, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x73, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x00, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x90, 0x00, 0x89, 0x6E, 0x89, 0x00, /* 0x4C-0x4F */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6E, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x00, 0x70, 0x00, 0x71, 0x8F, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, 0x8A, 0x6E, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x00, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x8C, 0x8A, 0x3F, 0x3F, 0x8B, 0x86, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x00, 0x75, 0x8B, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x00, 0x76, 0x3F, 0x3F, 0x90, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x90, 0x00, /* 0x80-0x83 */ + 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x82, 0x91, 0x8B, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x00, 0x79, 0x00, 0x7B, 0x00, 0x78, /* 0x94-0x97 */ + 0x00, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x41, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x00, 0x7C, 0x8C, 0x45, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x87, 0x97, 0x71, /* 0xAC-0xAF */ + 0x00, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x80, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x4D, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x83, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x96, /* 0xC0-0xC3 */ + 0x00, 0x82, 0x00, 0x81, 0x3F, 0x3F, 0x00, 0x85, /* 0xC4-0xC7 */ + 0x00, 0x7D, 0x3F, 0x3F, 0x00, 0x86, 0x97, 0x00, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x00, 0x87, 0x3F, 0x3F, 0x00, 0x88, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x00, 0x84, 0x9A, 0x00, 0x00, 0x8A, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x00, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x00, 0x8B, 0x00, 0x8C, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x97, 0x00, 0x00, 0x8D, 0x3F, 0x3F, 0x00, 0x00, /* 0xDC-0xDF */ + 0x8F, 0x00, 0x00, 0x8E, 0x00, 0x8F, 0x8F, 0x76, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x93, 0x00, 0x00, 0x90, 0x00, 0x85, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x47, 0x00, 0x87, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x00, 0x91, 0x3F, 0x3F, 0x92, 0x5B, /* 0xEC-0xEF */ + 0x00, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x99, 0x5E, 0x92, 0x7C, 0x8E, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7B[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x93, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x96, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x8B, 0x88, 0x3F, 0x3F, 0x00, 0x95, 0x00, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x94, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x00, 0x98, 0x00, 0x99, 0x3F, 0x3F, 0x93, 0x4A, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9A, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x8A, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x90, 0x79, 0x95, 0x84, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x00, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x97, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x00, 0x9B, 0x00, 0x9D, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x00, 0x00, 0x95, 0x4D, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x94, 0x00, 0x93, 0x99, 0x3F, 0x3F, 0x8B, 0x00, /* 0x48-0x4B */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, /* 0x4C-0x4F */ + 0x00, 0x9E, 0x92, 0x7D, 0x93, 0x9B, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x93, 0x9A, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x89, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x94, 0x93, 0x96, 0x00, 0x3F, 0x3F, 0x8E, 0x5A, /* 0x94-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x5C, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x90, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x95, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x92, 0x7A, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x98, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7C[512] = { + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, /* 0x10-0x13 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x34-0x37 */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x00, 0x00, 0x97, 0x00, 0x95, 0x00, /* 0x3C-0x3F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x00, 0x00, 0x90, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x4C-0x4F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x5C-0x5F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x8B, 0x00, 0x8C, 0x48, 0x00, 0x00, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x90, 0x88, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x00, 0x00, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x94, 0x94, 0x3F, 0x3F, 0x91, 0x65, /* 0x94-0x97 */ + 0x94, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x6C, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x00, 0x00, 0x8A, 0x9F, 0x3F, 0x3F, 0x8F, 0x00, /* 0xA4-0xA7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x57, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x9C, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x00, 0x3F, 0x3F, 0x95, 0x00, 0x91, 0x8C, /* 0xDC-0xDF */ + 0x8D, 0x66, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x8E, 0x85, 0x3F, 0x3F, 0x00, 0x00, 0x8C, 0x6E, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x8A, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7D[512] = { + 0x8B, 0x49, 0x3F, 0x3F, 0x00, 0x40, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x96, 0x00, 0x8D, 0x67, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x43, 0x96, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x94, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x95, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x8F, 0x83, 0x00, 0x42, 0x3F, 0x3F, 0x8E, 0x00, /* 0x14-0x17 */ + 0x8D, 0x68, 0x8E, 0x86, 0x8B, 0x89, 0x95, 0x00, /* 0x18-0x1B */ + 0x00, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x91, 0x66, 0x96, 0x61, 0x8D, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x87, /* 0x28-0x2B */ + 0x92, 0x00, 0x3F, 0x3F, 0x00, 0x46, 0x97, 0x00, /* 0x2C-0x2F */ + 0x8D, 0x00, 0x3F, 0x3F, 0x00, 0x47, 0x90, 0x61, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x00, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x8F, 0x00, 0x8D, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x49, 0x8C, 0x00, /* 0x40-0x43 */ + 0x91, 0x67, 0x00, 0x44, 0x00, 0x4A, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x45, /* 0x48-0x4B */ + 0x8C, 0x6F, 0x3F, 0x3F, 0x00, 0x4D, 0x00, 0x51, /* 0x4C-0x4F */ + 0x8C, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4C, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x55, /* 0x58-0x5B */ + 0x00, 0x8B, 0x3F, 0x3F, 0x8D, 0x69, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x97, 0x8D, 0x88, 0x00, 0x00, 0x52, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x8B, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x00, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x50, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x93, 0x9D, 0x00, 0x4E, 0x00, 0x4B, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x8A, 0x47, 0x90, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x56, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x8C, 0x70, 0x91, 0x00, 0x00, 0x58, /* 0x98-0x9B */ + 0x91, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x65, /* 0x9C-0x9F */ + 0x00, 0x8D, 0x3F, 0x3F, 0x00, 0x61, 0x00, 0x5B, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5F, /* 0xA8-0xAB */ + 0x8E, 0x00, 0x88, 0x00, 0x00, 0x5A, 0x00, 0x62, /* 0xAC-0xAF */ + 0x00, 0x66, 0x8D, 0x6A, 0x96, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x92, 0x00, 0x00, 0x5C, 0x3F, 0x3F, 0x00, 0x8C, /* 0xB4-0xB7 */ + 0x00, 0x64, 0x3F, 0x3F, 0x00, 0x59, 0x92, 0x5D, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x00, 0x5E, 0x88, 0x00, 0x96, 0x00, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5D, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x94, 0x00, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x8D, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x97, 0x00, 0x8F, 0x8F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x00, 0x8E, 0x00, 0x8E, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x67, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x63, 0x00, 0x68, 0x00, 0x6A, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x92, 0x00, 0x00, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x00, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x95, 0x00, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6B, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7E[512] = { + 0x3F, 0x3F, 0x89, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x93, 0x00, 0x00, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x76, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x9B, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x74, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x71, 0x00, 0x77, 0x00, 0x70, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x63, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x44, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x6B, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x00, 0x73, 0x00, 0x80, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x00, 0x7B, 0x3F, 0x3F, 0x00, 0x7E, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x00, 0x7C, 0x00, 0x81, 0x00, 0x7A, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x00, 0x60, 0x90, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x7D, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x78, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x40, 0x8C, 0x71, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x8F, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x90, 0x44, 0x91, 0x55, 0x00, 0x84, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x86, 0x00, 0x87, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x00, 0x83, 0x00, 0x85, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, 0x00, 0x82, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x00, 0x8A, 0x00, 0x89, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x96, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x8C, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x00, 0x88, 0x3F, 0x3F, 0x00, 0x8C, /* 0x78-0x7B */ + 0x00, 0x8B, 0x00, 0x8F, 0x3F, 0x3F, 0x00, 0x91, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x5B, 0x00, 0x8D, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x00, 0x92, 0x00, 0x93, 0x00, 0x5C, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x00, 0x94, 0x3F, 0x3F, 0x00, 0x9A, 0x93, 0x5A, /* 0x8C-0x8F */ + 0x00, 0x96, 0x3F, 0x3F, 0x00, 0x95, 0x00, 0x97, /* 0x90-0x93 */ + 0x00, 0x98, 0x3F, 0x3F, 0x00, 0x99, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9B, /* 0x98-0x9B */ + 0x00, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7F[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x00, 0x9D, 0x3F, 0x3F, 0x00, 0x9E, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x00, 0x9F, 0x3F, 0x3F, 0x00, 0x90, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x5C-0x5F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x64-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x8C, 0x72, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x75, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x94, 0x00, 0x3F, 0x3F, 0x8F, 0x90, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x94, 0x6C, 0x3F, 0x3F, 0x94, 0x00, /* 0x74-0x77 */ + 0x00, 0x00, 0x9C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x97, 0x85, 0x00, 0x00, 0x00, 0x00, /* 0x84-0x87 */ + 0x00, 0x00, 0x3F, 0x3F, 0x97, 0x72, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x00, 0x91, 0x3F, 0x3F, 0x00, 0x00, /* 0xA0-0xA3 */ + 0x8C, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x91, 0x41, 0x8B, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x89, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x97, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x4B, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x90, 0x89, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x8A, 0x00, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x96, 0x7C, /* 0xF8-0xFB */ + 0x97, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_80[512] = { + 0x97, 0x73, 0x98, 0x56, 0x3F, 0x3F, 0x8D, 0x6C, /* 0x00-0x03 */ + 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x08-0x0B */ + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x91, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x8D, 0x6B, 0x3F, 0x3F, 0x96, 0x00, /* 0x14-0x17 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x92, 0x5E, 0x3F, 0x3F, 0x00, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x00, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x91, 0x8F, 0x00, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x6C-0x6F */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x73 */ + 0x92, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x45, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x00, 0x00, 0x98, 0x57, 0x00, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x98, 0x5D, /* 0x88-0x8B */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x95, 0x49, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x8C, 0x00, 0x8E, 0x88, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x96, 0x62, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x6D, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x8D, 0x6E, 0x88, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x78, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xC0-0xC3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x92, 0x5F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x94, 0x77, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x00, 0x00, 0x96, 0x45, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x88, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x00, 0x45, 0x94, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_81[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x89, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x8B, 0x00, 0x90, 0x00, 0x98, 0x65, /* 0x04-0x07 */ + 0x96, 0x00, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x72, 0x00, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x92, 0x45, 0x3F, 0x3F, 0x94, 0x5D, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x42, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x41, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x74, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x95, 0x85, 0x00, 0x44, 0x3F, 0x3F, 0x00, 0x43, /* 0x50-0x53 */ + 0x8D, 0x6F, 0x98, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x54, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x00, 0x48, 0x00, 0x49, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x47, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x8D, 0x98, 0x00, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x92, 0x00, 0x95, 0x00, 0x91, 0x42, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0x7C-0x7F */ + + 0x00, 0x4E, 0x3F, 0x3F, 0x00, 0x4F, 0x00, 0x4B, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x00, 0x4C, 0x3F, 0x3F, 0x00, 0x4D, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x70, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x55, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x00, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x86, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x96, 0x8C, 0x95, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, /* 0xA0-0xA3 */ + 0x00, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x96, 0x63, 0x00, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x56, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x00, 0x5A, 0x3F, 0x3F, 0x00, 0x5E, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x00, 0x5B, 0x00, 0x59, 0x94, 0x5E, /* 0xBC-0xBF */ + 0x00, 0x5C, 0x3F, 0x3F, 0x00, 0x5D, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x00, 0x64, 0x00, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x00, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x00, 0x61, 0x3F, 0x3F, 0x91, 0x9F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x63, 0x00, 0x62, 0x00, 0x65, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x66, /* 0xDC-0xDF */ + 0x00, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x62, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x00, 0x68, /* 0xE4-0xE7 */ + 0x97, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x8F, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8A, /* 0xF0-0xF3 */ + 0x92, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x69, 0x00, 0x6A, /* 0xF8-0xFB */ + 0x89, 0x50, 0x3F, 0x3F, 0x00, 0x6B, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_82[512] = { + 0x3F, 0x3F, 0x00, 0x6C, 0x00, 0x6D, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x00, 0x6E, 0x3F, 0x3F, 0x00, 0x6F, /* 0x04-0x07 */ + 0x8B, 0x00, 0x9D, 0x00, 0x00, 0x70, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x90, 0x00, 0x00, 0x71, 0x8E, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x00, 0x72, 0x3F, 0x3F, 0x98, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, 0x95, 0x00, /* 0x14-0x17 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x43, /* 0x18-0x1B */ + 0x8F, 0x77, 0x3F, 0x3F, 0x95, 0x91, 0x8F, 0x4D, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x00, 0x74, 0x8D, 0x71, 0x00, 0x75, /* 0x28-0x2B */ + 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x84, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x77, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x91, 0x00, 0x94, 0x95, 0x8C, 0x00, /* 0x34-0x37 */ + 0x00, 0x76, 0x91, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x00, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x7A, 0x00, 0x79, 0x00, 0x7C, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x00, 0x7B, 0x3F, 0x3F, 0x00, 0x7D, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x80, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x7E, 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x00, 0x81, 0x3F, 0x3F, 0x00, 0x82, 0x00, 0x83, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x00, 0x97, 0x00, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x00, 0x85, 0x90, 0x46, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x90, 0x00, 0x86, /* 0x74-0x77 */ + 0x00, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x88, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x00, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8A, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x95, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x00, 0x8C, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x8A, 0x48, 0x88, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8B, /* 0xA8-0xAB */ + 0x00, 0x8E, 0x94, 0x6D, 0x3F, 0x3F, 0x90, 0x63, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x96, 0x46, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x8C, 0x7C, 0x8B, 0x00, 0x3F, 0x3F, 0x00, 0x8D, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x89, 0x91, 0x00, 0x92, 0x97, 0x00, /* 0xD0-0xD3 */ + 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x63, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x00, 0x9E, 0x3F, 0x3F, 0x89, 0x00, /* 0xD8-0xDB */ + 0x00, 0x9C, 0x3F, 0x3F, 0x00, 0x9A, 0x00, 0x91, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x00, 0x8F, 0x3F, 0x3F, 0x00, 0x90, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x8E, 0x00, 0x8B, 0x00, 0x92, 0x97, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x89, 0x70, 0x3F, 0x3F, 0x00, 0x94, /* 0xF0-0xF3 */ + 0x00, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x00, 0x99, 0x00, 0x95, 0x00, 0x98, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_83[512] = { + 0x3F, 0x3F, 0x00, 0x93, 0x96, 0x00, 0x00, 0x97, /* 0x00-0x03 */ + 0x89, 0x00, 0x8A, 0x9D, 0x00, 0x9B, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x73, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x14-0x17 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x00, 0x00, 0x00, 0x9F, 0x92, 0x83, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x91, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x91, 0x90, 0x8C, 0x74, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x60, /* 0x4C-0x4F */ + 0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x72, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x91, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x89, 0x00, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0x78-0x7B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x95, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x96, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, 0x00, 0x00, /* 0x9C-0x9F */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x94, 0x9C, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x97, 0x89, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x90, 0x9B, 0x3F, 0x3F, 0x00, 0x96, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x65, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x8B, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x8D, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x70, /* 0xDC-0xDF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0xEC-0xEF */ + 0x8C, 0x00, 0x95, 0x48, 0x00, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x97, 0x00, 0x00, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_84[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x00-0x03 */ + 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x08-0x0B */ + 0x96, 0x47, 0x00, 0x00, 0x88, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x94, 0x8B, 0x00, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8A, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x00, 0x00, 0x97, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x98, 0x97, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x98, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x8B, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x95, 0x92, 0x00, 0x00, 0x93, 0x9F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */ + 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x94, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x00, 0x00, 0x95, 0x98, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x8F, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x95, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x97, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x00, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x8F, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xB8-0xBB */ + 0x91, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x92, 0x7E, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x97, 0x75, 0x00, 0x00, 0x8A, 0x57, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x00, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x96, 0x48, 0x3F, 0x3F, 0x98, 0x40, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_85[512] = { + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x96, 0x00, /* 0x10-0x13 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x14-0x17 */ + 0x00, 0x00, 0x3F, 0x3F, 0x89, 0x55, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x00, 0x00, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x00, 0x00, 0x00, 0x40, 0x3F, 0x3F, 0x94, 0x00, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x00, 0x8F, 0x00, 0x8E, 0x00, 0x00, 0x42, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9A, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, 0x95, 0x99, /* 0x54-0x57 */ + 0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x98, 0x6E, 0x93, 0x00, 0x95, 0x93, 0x00, 0x9C, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x00, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x50, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x51, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x00, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x94, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4E, /* 0x84-0x87 */ + 0x00, 0x46, 0x3F, 0x3F, 0x00, 0x48, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x00, 0x52, 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x00, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x92, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x00, 0x4C, /* 0x98-0x9B */ + 0x00, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x00, 0x45, 0x3F, 0x3F, 0x91, 0x45, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x00, 0x49, 0x8E, 0x46, 0x90, 0x64, 0x8C, 0x4F, /* 0xA8-0xAB */ + 0x96, 0x00, 0x3F, 0x3F, 0x96, 0x00, 0x8F, 0x92, /* 0xAC-0xAF */ + 0x00, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x56, 0x00, 0x54, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x98, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x00, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x97, 0x95, 0x3F, 0x3F, 0x00, 0x55, /* 0xCC-0xCF */ + 0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x5B, 0x00, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x93, 0x00, 0x00, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x94, 0x00, 0x00, 0x4D, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x93, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x00, 0x5C, 0x00, 0x61, 0x91, 0x94, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x60, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_86[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x41, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x62, 0x91, 0x68, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5D, 0x00, 0x5F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5E, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9F, 0x50, 0x9F, 0x41, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x63, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x97, 0x96, 0x3F, 0x3F, 0x00, 0x00, /* 0x2C-0x2F */ + 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x66, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x00, 0x67, 0x8C, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x8B, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x00, 0x69, 0x99, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x95, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x97, 0x00, 0x3F, 0x3F, 0x8B, 0x00, 0x00, 0x6A, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6B, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x8E, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x88, 0x00, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x00, 0x71, /* 0x88-0x8B */ + 0x00, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6D, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x8E, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6E, /* 0xA0-0xA3 */ + 0x94, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x7A, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x74, /* 0xAC-0xAF */ + 0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x00, 0x75, 0x3F, 0x3F, 0x00, 0x76, 0x8E, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x00, 0x78, 0x3F, 0x3F, 0x92, 0x60, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x8C, 0x75, 0x8A, 0x61, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x8A, 0x5E, 0x3F, 0x3F, 0x00, 0x81, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7C, 0x00, 0x80, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x00, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x00, 0x7E, 0x95, 0x67, 0x94, 0x00, 0x00, 0x82, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x91, 0x00, 0x00, 0x8C, 0x3F, 0x3F, 0x00, 0x88, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_87[512] = { + 0x00, 0x86, 0x3F, 0x3F, 0x96, 0x49, 0x00, 0x87, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x84, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x00, 0x85, 0x00, 0x8A, 0x00, 0x8D, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x00, 0x89, 0x00, 0x83, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x92, 0x77, 0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x00, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x00, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x00, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x90, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x91, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x98, 0x58, /* 0x48-0x4B */ + 0x00, 0x98, 0x3F, 0x3F, 0x00, 0x99, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x90, 0x49, 0x3F, 0x3F, 0x00, 0x9B, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x96, /* 0x5C-0x5F */ + 0x00, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x00, 0x9C, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9D, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x9A, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x00, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x88, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x97, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x86, 0x00, 0x00, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x8A, 0x49, 0x3F, 0x3F, 0x8B, 0x61, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_88[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x8C, 0x8C, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x00, 0x00, 0x3F, 0x3F, 0x8F, 0x4F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x8D, 0x73, 0x9F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8F, 0x70, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x58, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x89, 0x71, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x8D, 0x74, 0x00, 0x00, 0x88, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x95, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x90, 0x8A, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x92, 0x8F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x8C, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x00, 0x00, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x8C, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x88, 0x00, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x8D, 0x00, 0x97, 0x00, 0x00, 0x00, /* 0xC0-0xC3 */ + 0x00, 0x00, 0x91, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x00, 0x97, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x95, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x8D, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8F, 0x00, /* 0xF0-0xF3 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x97, 0x87, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x00, 0x00, 0x90, 0x00, 0x90, 0x9E, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_89[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x8A, 0x8C, 0x3F, 0x3F, 0x96, 0x4A, 0x00, 0x00, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x40-0x43 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8B, 0x00, /* 0x5C-0x5F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x41, 0x3F, 0x3F, 0x00, 0x40, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x00, 0x42, 0x3F, 0x3F, 0x00, 0x44, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x50, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x46, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x47, 0x90, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x97, 0x76, 0x3F, 0x3F, 0x00, 0x48, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x94, 0x65, /* 0x84-0x87 */ + 0x00, 0x49, 0x3F, 0x3F, 0x00, 0x4A, 0x8C, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x4B, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4B, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8B, 0x94, 0x60, /* 0x94-0x97 */ + 0x00, 0x4C, 0x3F, 0x3F, 0x8A, 0x6F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x00, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4F, 0x97, 0x97, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x00, 0x4E, 0x90, 0x65, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x51, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x52, 0x8A, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x00, 0x54, 0x3F, 0x3F, 0x00, 0x55, /* 0xBC-0xBF */ + 0x00, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x70, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x58, 0x00, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x47, 0x00, 0x5A, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x00, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8A[512] = { + 0x8C, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x00, 0x5D, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x8C, 0x76, 0x3F, 0x3F, 0x90, 0x75, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x00, 0x60, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x00, 0x5F, 0x3F, 0x3F, 0x00, 0x00, 0x8C, 0x50, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5E, 0x91, 0x00, /* 0x14-0x17 */ + 0x8B, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x61, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, 0x8F, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x8D, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x00, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x4B, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8B, 0x96, 0x3F, 0x3F, 0x96, 0x00, /* 0x30-0x33 */ + 0x91, 0x69, 0x3F, 0x3F, 0x00, 0x64, 0x00, 0x00, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x66, 0x92, 0x90, /* 0x38-0x3B */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x68, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x8D, 0x00, 0x91, 0x00, 0x00, 0x67, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x8F, 0x00, 0x95, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x66, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8C, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x89, 0x72, 0x3F, 0x3F, 0x00, 0x6D, 0x8C, 0x77, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8E, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x8E, 0x8D, 0x3F, 0x3F, 0x98, 0x6C, /* 0x68-0x6B */ + 0x00, 0x6C, 0x00, 0x6B, 0x91, 0x46, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x8B, 0x6C, 0x98, 0x62, 0x8A, 0x59, 0x8F, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x00, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x00, 0x70, 0x00, 0x6E, 0x3F, 0x3F, 0x8C, 0x00, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x97, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x8E, 0x8F, 0x94, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x00, 0x73, 0x3F, 0x3F, 0x90, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x92, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x97, 0x55, 0x3F, 0x3F, 0x00, 0x76, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x90, 0x00, 0x00, 0x72, 0x3F, 0x3F, 0x00, 0x77, /* 0xA0-0xA3 */ + 0x8C, 0x00, 0x00, 0x74, 0x00, 0x75, 0x00, 0x00, /* 0xA4-0xA7 */ + 0x00, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x90, 0x00, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x92, 0x4E, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x8B, 0x62, 0x3F, 0x3F, 0x00, 0x00, 0x92, 0x00, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7A, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x00, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x6B, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0xC8-0xCB */ + 0x8A, 0x00, 0x00, 0x79, 0x3F, 0x3F, 0x90, 0x7A, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x5F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7B, 0x00, 0x87, /* 0xD8-0xDB */ + 0x92, 0x00, 0x3F, 0x3F, 0x00, 0x86, 0x00, 0x00, /* 0xDC-0xDF */ + 0x00, 0x83, 0x00, 0x8B, 0x00, 0x84, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x00, 0x80, 0x3F, 0x3F, 0x92, 0x00, 0x00, 0x7E, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7C, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x97, 0x40, 0x8E, 0x90, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x00, 0x7D, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x85, /* 0xF4-0xF7 */ + 0x8F, 0x94, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8B[512] = { + 0x96, 0x64, 0x89, 0x79, 0x88, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x00, 0x88, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x00, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x00, 0x82, 0x3F, 0x3F, 0x00, 0x8C, 0x00, 0x8E, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x8A, 0x8D, 0x75, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x00, 0x8F, 0x97, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x92, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x00, 0x95, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x93, /* 0x28-0x2B */ + 0x95, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x90, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x00, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x00, 0x9A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x00, 0x97, 0x3F, 0x3F, 0x00, 0x99, 0x00, 0x98, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9B, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x8E, 0x00, 0x3F, 0x3F, 0x00, 0x9D, 0x00, 0x9C, /* 0x58-0x5B */ + 0x95, 0x88, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x78, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9E, /* 0x68-0x6B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x6C-0x6F */ + 0x8B, 0x63, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x7C-0x7F */ + + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x5D, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x9D, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x8F, 0x51, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8C[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x4A, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x00, 0x3F, 0x3F, 0x96, 0x4C, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x8B, 0x98, 0x00, /* 0x68-0x6B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x00, 0x00, 0x95, 0x5E, 0x00, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x96, 0x65, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x8A, 0x4C, 0x92, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x95, 0x89, 0x8D, 0x00, 0x8D, 0x76, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x6E, /* 0xA4-0xA7 */ + 0x89, 0x00, 0x94, 0x00, 0x00, 0x00, 0x8A, 0x00, /* 0xA8-0xAB */ + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x99, /* 0xAC-0xAF */ + 0x96, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xB0-0xB3 */ + 0x8B, 0x4D, 0x3F, 0x3F, 0x00, 0x00, 0x94, 0x83, /* 0xB4-0xB7 */ + 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xB8-0xBB */ + 0x93, 0x5C, 0x00, 0x00, 0x3F, 0x3F, 0x96, 0x66, /* 0xBC-0xBF */ + 0x89, 0x00, 0x00, 0x00, 0x98, 0x47, 0x92, 0x00, /* 0xC0-0xC3 */ + 0x98, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x91, /* 0xC4-0xC7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x00, 0x00, 0x91, 0x47, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x95, 0x6F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x8E, 0x5E, /* 0xD8-0xDB */ + 0x8E, 0x92, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x94, 0x85, 0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x00, /* 0xE0-0xE3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x95, 0x8A, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x93, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xF8-0xFB */ + 0x8D, 0x77, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8D[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x04-0x07 */ + 0x91, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x8A, 0x00, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x0C-0x0F */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x13 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x90, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x00, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x71, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x91, 0x96, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x70-0x73 */ + 0x95, 0x8B, 0x3F, 0x3F, 0x00, 0x00, 0x8B, 0x4E, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x7A, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x90, 0x96, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x8B, 0x97, 0x3F, 0x3F, 0x00, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x8C, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x48, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x91, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x97, 0x78, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x0C-0x0F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x40, /* 0x44-0x47 */ + 0x00, 0x44, 0x00, 0x41, 0x00, 0x00, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x00, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x00, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x00, /* 0x5C-0x5F */ + 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x49, /* 0x60-0x63 */ + 0x00, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4C, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x8F, 0x52, 0x3F, 0x3F, 0x00, 0x4B, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x00, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x00, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x00, 0x51, 0x00, 0x50, 0x3F, 0x3F, 0x00, 0x4F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x53, 0x00, 0x52, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x00, 0x55, 0x3F, 0x3F, 0x00, 0x54, /* 0x90-0x93 */ + 0x00, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x00, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x58, 0x90, 0x67, /* 0xA8-0xAB */ + 0x00, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0xAC-0xAF */ + 0x00, 0x5B, 0x00, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5E, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x00, 0x5F, 0x00, 0x5C, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x00, 0x60, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x61, /* 0xC8-0xCB */ + 0x8B, 0x4F, 0x8C, 0x52, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x62, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x5D, 0x00, 0x63, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x66, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x65, /* 0xF8-0xFB */ + 0x00, 0x64, 0x8C, 0x79, 0x00, 0x67, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8F[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x72, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x00, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x8D, 0x00, 0x00, 0x68, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x00, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6B, 0x00, 0x6D, /* 0x10-0x13 */ + 0x95, 0x00, 0x00, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x00, 0x70, /* 0x18-0x1B */ + 0x00, 0x6E, 0x8B, 0x50, 0x3F, 0x3F, 0x00, 0x6F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x72, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x94, 0x79, 0x97, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x53, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x97, 0x41, 0x00, 0x75, 0x3F, 0x3F, 0x00, 0x74, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x78, 0x97, 0x60, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x77, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x8A, 0x8D, 0x00, 0x76, 0x00, 0x7B, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x00, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x00, 0x79, 0x93, 0x51, 0x00, 0x7C, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7D, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x00, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x8C, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x8C, 0x44, 0x00, 0x80, 0x00, 0x81, /* 0x60-0x63 */ + 0x00, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x68, /* 0x98-0x9B */ + 0x00, 0x83, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x84, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x85, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x9F, /* 0xA4-0xA7 */ + 0x99, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x00, 0x86, 0x00, 0x90, 0x00, 0x87, /* 0xAC-0xAF */ + 0x92, 0x43, 0x90, 0x4A, 0x94, 0x5F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x88, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, 0x92, 0x00, /* 0xB8-0xBB */ + 0x8D, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x48, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x49, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x96, 0x98, 0x90, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x7D, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x89, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8B, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x00, 0x8A, 0x89, 0x00, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x93, 0x00, 0x00, 0x8C, 0x94, 0x97, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x93, 0x52, 0x3F, 0x3F, 0x00, 0x8D, /* 0xEC-0xEF */ + 0x8F, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0xF4-0xF7 */ + 0x00, 0x9E, 0x00, 0x91, 0x00, 0x92, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_90[512] = { + 0x91, 0x00, 0x91, 0x97, 0x3F, 0x3F, 0x93, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x00, 0x90, 0x8B, 0x74, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x99, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x96, 0x00, 0x00, 0x93, 0x00, /* 0x0C-0x0F */ + 0x92, 0x80, 0x00, 0x93, 0x3F, 0x3F, 0x92, 0x00, /* 0x10-0x13 */ + 0x93, 0x72, 0x00, 0x94, 0x00, 0x98, 0x90, 0x80, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x94, 0x87, 0x92, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x90, 0x00, 0x00, 0x97, 0x91, 0x00, /* 0x1C-0x1F */ + 0x91, 0x00, 0x00, 0x95, 0x88, 0x00, 0x98, 0x41, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9A, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x8F, 0x54, 0x90, 0x69, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x00, 0x9C, 0x00, 0x9B, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x88, 0x00, 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x95, 0x4E, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x93, 0x00, 0x90, 0x8B, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x92, 0x78, 0x3F, 0x3F, 0x8B, 0x00, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x00, 0x00, 0x97, 0x56, 0x89, 0x5E, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x95, 0x00, 0x89, 0x00, 0x00, 0x9F, /* 0x4C-0x4F */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x00, /* 0x50-0x53 */ + 0x92, 0x42, 0x88, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x91, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x89, 0x93, 0x91, 0x6B, 0x3F, 0x3F, 0x8C, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x97, 0x79, 0x3F, 0x3F, 0x00, 0x00, /* 0x64-0x67 */ + 0x00, 0x00, 0x93, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x91, 0x98, 0x8E, 0x00, 0x00, 0x00, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x8F, 0x85, 0x00, 0x00, 0x91, 0x4A, /* 0x74-0x77 */ + 0x91, 0x49, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x97, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, /* 0x7C-0x7F */ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, /* 0x80-0x83 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8E, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x97, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x4D, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x93, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x78, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x59, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x8C, 0x53, 0x00, 0x00, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x95, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x8A, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x97, 0x58, 0x3F, 0x3F, 0x8B, 0x00, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x93, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_91[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x93, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x93, 0x00, 0x00, 0x00, 0x8F, 0x55, /* 0x48-0x4B */ + 0x8E, 0x00, 0x94, 0x7A, 0x92, 0x91, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x90, 0x8C, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x7C, 0x00, 0x00, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x00, 0x00, 0x97, 0x8F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x8F, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x8D, 0x79, 0x3F, 0x3F, 0x8D, 0x93, /* 0x74-0x77 */ + 0x8E, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x86, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x8C, 0x00, 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x8F, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x8D, 0x00, /* 0xC4-0xC7 */ + 0x8E, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */ + 0x97, 0x00, 0x8F, 0x64, 0x96, 0x00, 0x97, 0x00, /* 0xCC-0xCF */ + 0x00, 0x00, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xD4-0xD7 */ + 0x93, 0x42, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0xD8-0xDB */ + 0x8A, 0x98, 0x90, 0x6A, 0x00, 0x00, 0x00, 0x00, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x92, 0x00, /* 0xE0-0xE3 */ + 0x00, 0x00, 0x00, 0x00, 0x96, 0x74, 0x8B, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_92[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x93, 0x00, 0x8A, 0x62, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x00, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x3C-0x3F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x93, 0x53, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x89, 0x94, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x00, 0x3F, 0x3F, 0x8F, 0x00, 0x00, 0x00, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x8D, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x74-0x77 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x67, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x65, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x00, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x91, 0x4C, 0x3F, 0x3F, 0x00, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x96, 0x00, 0x3F, 0x3F, 0x92, 0x00, 0x00, 0x00, /* 0x98-0x9B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x91, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */ + 0x00, 0x00, 0x3F, 0x3F, 0x96, 0x4E, 0x00, 0x00, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x8F, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x95, 0x00, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x89, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x65, 0x92, 0x92, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x8B, 0x98, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, /* 0xF8-0xFB */ + 0x8D, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_93[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x4B, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x0C-0x0F */ + 0x90, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x90, 0x8E, 0x00, 0x40, 0x00, 0x42, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x8F, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x43, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x00, 0x00, 0x8B, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x95, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, /* 0x28-0x2B */ + 0x98, 0x42, 0x3F, 0x3F, 0x00, 0x00, 0x8D, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x5E, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x44, 0x00, 0x46, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x00, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x93, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x92, 0x00, 0x3F, 0x3F, 0x00, 0x4B, 0x00, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x62, /* 0x58-0x5B */ + 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x00, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x8C, 0x4C, 0x3F, 0x3F, 0x00, 0x4A, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x00, 0x49, 0x3F, 0x3F, 0x8F, 0x00, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x8A, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x00, 0x4F, 0x3F, 0x3F, 0x8D, 0x00, 0x91, 0x99, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x5A, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x00, 0x4D, 0x00, 0x4E, 0x92, 0x00, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x00, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x56, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x00, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x00, 0x58, 0x93, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x51, 0x00, 0x52, /* 0xD4-0xD7 */ + 0x00, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x00, 0x57, 0x00, 0x00, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x00, 0x5A, 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x00, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_94[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5E, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x00, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5D, /* 0x10-0x13 */ + 0x00, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x8F, 0x00, 0x93, 0x00, 0x00, 0x5B, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x62, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x00, 0x63, 0x00, 0x61, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x91, 0x00, 0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x00, 0x68, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x8A, 0x00, 0x00, 0x67, 0x96, 0x00, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x73, 0x00, 0x69, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x00, 0x6A, 0x3F, 0x3F, 0x00, 0x6B, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6D, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x00, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x00, 0x70, 0x3F, 0x3F, 0x00, 0x71, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x00, 0x74, 0x00, 0x72, 0x00, 0x75, 0x00, 0x77, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x00, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_95[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x00, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x96, 0x00, 0x3F, 0x3F, 0x00, 0x78, 0x91, 0x4D, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x95, 0x00, 0x00, 0x7A, 0x8A, 0x4A, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x5B, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x8A, 0x00, 0x00, 0x00, 0x8A, 0x00, /* 0x90-0x93 */ + 0x00, 0x7B, 0x3F, 0x3F, 0x00, 0x7C, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x00, 0x7D, 0x00, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x00, 0x80, 0x3F, 0x3F, 0x8A, 0x00, 0x8A, 0x74, /* 0xA0-0xA3 */ + 0x8D, 0x7D, 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x82, /* 0xA4-0xA7 */ + 0x00, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x00, 0x83, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x7B, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x86, 0x3F, 0x3F, 0x00, 0x85, /* 0xB8-0xBB */ + 0x00, 0x84, 0x3F, 0x3F, 0x00, 0x87, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8A, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x88, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x00, 0x8C, 0x00, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x8E, 0x00, 0x8D, 0x00, 0x8F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x00, 0x91, 0x00, 0x93, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x00, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_96[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x95, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x94, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x00, 0x95, 0x3F, 0x3F, 0x8D, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x96, 0x00, 0x97, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x68, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x6A, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, /* 0x3C-0x3F */ + 0x91, 0x00, 0x3F, 0x3F, 0x00, 0x98, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x95, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9B, /* 0x48-0x4B */ + 0x00, 0x99, 0x8D, 0x7E, 0x3F, 0x3F, 0x00, 0x9A, /* 0x4C-0x4F */ + 0x8C, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x00, /* 0x58-0x5B */ + 0x00, 0x9D, 0x00, 0x9F, 0x00, 0x9E, 0x00, 0x00, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x40, 0x90, 0x77, /* 0x60-0x63 */ + 0x8F, 0x9C, 0x8A, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x86, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x89, 0x41, 0x3F, 0x3F, 0x00, 0x00, 0x92, 0x00, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x97, 0x00, 0x93, 0x00, 0x00, 0x9C, /* 0x74-0x77 */ + 0x97, 0x00, 0x3F, 0x3F, 0x8C, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x97, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x8B, 0x00, 0x97, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x8C, 0x47, 0x3F, 0x3F, 0x91, 0x00, 0x00, 0x40, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x00, 0x00, 0x8A, 0x4B, 0x90, 0x8F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x8A, 0x75, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x94-0x97 */ + 0x00, 0x00, 0x8C, 0x84, 0x3F, 0x3F, 0x8D, 0x00, /* 0x98-0x9B */ + 0x8F, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x89, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA4-0xA7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x97, 0x00, /* 0xB4-0xB7 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x90, 0x00, /* 0xB8-0xBB */ + 0x94, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x90, 0x9D, 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x97, 0x59, 0x89, 0x00, 0x8F, 0x57, 0x8C, 0x00, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */ + 0x8E, 0x93, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x8E, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x99, 0x00, 0x3F, 0x3F, 0x90, 0x97, /* 0xD8-0xDB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x93, 0x00, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x89, 0x4A, 0x3F, 0x3F, 0x90, 0x00, 0x8E, 0x00, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x95, 0x00, 0x3F, 0x3F, 0x89, 0x5F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x97, 0x8B, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x93, 0x64, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_97[512] = { + 0x8E, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x6B, /* 0x04-0x07 */ + 0x00, 0x00, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x91, 0x9A, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x00, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x00, 0x00, 0x3F, 0x3F, 0x98, 0x49, 0x00, 0x00, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x9E, 0x50, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x43 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x00, 0x96, 0x00, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x90, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x00, 0x00, 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x00, 0x00, 0x00, 0x72, 0x96, 0x00, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x00, 0x00, 0x8A, 0x76, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x90, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x8C, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x8A, 0x93, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x8C-0x8F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x8F, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x8B, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x91, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x95, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xB0-0xB3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8A, 0x00, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x00, 0x00, 0x94, 0x42, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x89, 0x00, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x43, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_98[512] = { + 0x3F, 0x3F, 0x95, 0x00, 0x92, 0x00, 0x8D, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x8D, 0x80, 0x8F, 0x87, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x90, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x0C-0x0F */ + 0x97, 0x61, 0x8A, 0x00, 0x94, 0x00, 0x93, 0x00, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x9C, /* 0x14-0x17 */ + 0x97, 0x00, 0x3F, 0x3F, 0x8C, 0x7A, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x96, 0x6A, 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x89, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x34-0x37 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x70, /* 0x38-0x3B */ + 0x97, 0x8A, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x48-0x4B */ + 0x91, 0x00, 0x8A, 0x7A, 0x8A, 0x7B, 0x00, 0x00, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x8A, 0x00, 0x8C, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x54-0x57 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x5E, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x8C, 0x00, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x6C-0x6F */ + 0x00, 0x00, 0x00, 0x40, 0x3F, 0x3F, 0x00, 0x42, /* 0x70-0x73 */ + 0x00, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x95, 0x97, 0x3F, 0x3F, 0x00, 0x43, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x44, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x46, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, /* 0xC0-0xC3 */ + 0x00, 0x47, 0x3F, 0x3F, 0x00, 0x49, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, /* 0xD8-0xDB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x90, 0x48, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x51, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x00, 0x4A, 0x3F, 0x3F, 0x00, 0x4B, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x99, 0x00, 0x9F, 0x5A, 0x94, 0x00, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x8E, 0x94, 0x96, 0x4F, 0x8F, 0x00, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_99[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4C, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x00, 0x4D, 0x97, 0x7B, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x89, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x8E, 0x60, 0x3F, 0x3F, 0x00, 0x4E, 0x89, 0x00, /* 0x10-0x13 */ + 0x00, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x00, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x00, 0x52, 0x00, 0x53, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x00, 0x55, 0x00, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x00, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */ + 0x8A, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x00, 0x56, 0x3F, 0x3F, 0x00, 0x57, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x00, 0x58, 0x00, 0x59, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5A, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x00, 0x5B, 0x3F, 0x3F, 0x00, 0x5E, /* 0x48-0x4B */ + 0x00, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x00, 0x5D, 0x00, 0x5F, 0x00, 0x60, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, 0x8B, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x00, 0x00, 0x63, /* 0x94-0x97 */ + 0x00, 0x64, 0x8D, 0x81, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x8A, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x94, 0x6E, 0x00, 0x66, 0x00, 0x67, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x92, 0x79, /* 0xB0-0xB3 */ + 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x00, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x94, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x91, 0x00, 0x89, 0x77, 0x8B, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x8B, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x92, 0x93, 0x00, 0x6D, 0x8B, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x6A, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x00, 0x6B, 0x3F, 0x3F, 0x00, 0x69, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x77, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x00, 0x6E, 0x00, 0x6F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x00, 0x70, 0x00, 0x71, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x00, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x72, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8F, 0x78, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9A[512] = { + 0x3F, 0x3F, 0x00, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x00, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x52, 0x00, 0x75, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x9B, 0x8C, 0x00, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x00, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x91, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x79, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x93, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7A, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x80, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x00, 0x7D, 0x3F, 0x3F, 0x00, 0x7C, 0x00, 0x7E, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x00, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x00, 0x82, 0x00, 0x00, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x00, 0x81, 0x3F, 0x3F, 0x00, 0x84, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x8B, 0x00, 0x00, 0x83, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x85, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x86, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x88, 0x00, 0x87, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x00, 0x89, 0x00, 0x8B, 0x00, 0x8A, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x8D, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x00, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x00, 0x8D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x8A, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x00, 0x8E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x00, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x90, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x90, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x00, 0x91, 0x3F, 0x3F, 0x00, 0x92, /* 0xD0-0xD3 */ + 0x00, 0x93, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x8D, 0x82, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x40, 0x3F, 0x3F, 0x00, 0x94, 0x00, 0x95, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x96, 0x00, 0x97, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x98, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x94, 0x00, 0x00, 0x9A, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x95, 0x45, 0x00, 0x9B, 0x00, 0x99, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x00, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9E, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9B[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0x24-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x9F, 0x54, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x38-0x3B */ + 0x8B, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x8A, 0x40, 0x8D, 0x00, 0x00, 0x00, /* 0x40-0x43 */ + 0x00, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x96, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x00, 0x00, 0x3F, 0x3F, 0x8B, 0x9B, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x44, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x42, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x00, 0x00, 0x00, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x88, 0x00, 0x00, 0x43, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x9C-0x9F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x00, 0x00, 0x3F, 0x3F, 0x96, 0x8E, 0x8E, 0x4C, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x8D, 0x00, 0x91, 0x4E, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x00, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x45, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x8C, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x8E, 0x49, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x91, 0x00, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xE0-0xE3 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x8C, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x88, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9C[512] = { + 0x00, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x00, 0x00, 0x8A, 0x82, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x98, 0x6B, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x13 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x95, 0x68, 0x00, 0x00, 0x88, 0x00, /* 0x2C-0x2F */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x8A, 0x8F, 0x00, 0x00, 0x89, 0x56, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x44-0x47 */ + 0x92, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x90, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x97, 0x00, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x92, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x94, 0x00, 0x3F, 0x3F, 0x00, 0x00, /* 0xE8-0xEB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x96, 0x50, /* 0xF0-0xF3 */ + 0x96, 0x00, 0x3F, 0x3F, 0x93, 0x00, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9D[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x93, 0x00, /* 0x04-0x07 */ + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x00, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x89, 0x95, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x8A, 0x9B, 0x3F, 0x3F, 0x00, 0x00, 0x8E, 0x00, /* 0x28-0x2B */ + 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8D, 0x83, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x00, 0x44, 0x00, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x00, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x89, 0x4C, 0x00, 0x40, 0x00, 0x41, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x8D, 0x94, 0x96, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x00, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, /* 0x68-0x6B */ + 0x96, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4A, /* 0x6C-0x6F */ + 0x00, 0x47, 0x3F, 0x3F, 0x00, 0x46, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4B, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x48, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x00, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x7B, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4C, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x00, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x00, 0x4E, 0x3F, 0x3F, 0x00, 0x49, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x4F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x92, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x00, 0x53, 0x3F, 0x3F, 0x00, 0x54, 0x00, 0x52, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x00, 0x51, 0x00, 0x57, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x00, 0x50, 0x3F, 0x3F, 0x00, 0x55, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x56, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x59, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x00, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x5B, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x00, 0x5C, 0x3F, 0x3F, 0x00, 0x5D, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x98, 0x68, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x00, 0x5A, 0x91, 0x00, 0x8D, 0x00, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x00, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x00, 0x4A, 0x00, 0x5F, 0x00, 0x60, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x61, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x00, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x8C, 0x00, 0x00, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x00, 0x64, 0x3F, 0x3F, 0x8E, 0x00, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x00, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x00, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x67, /* 0x88-0x8B */ + 0x00, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x00, 0x6B, 0x00, 0x69, 0x98, 0x5B, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x00, 0x6A, 0x3F, 0x3F, 0x97, 0x00, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x00, 0x6C, 0x3F, 0x3F, 0x97, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x00, 0x6D, 0x94, 0x9E, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x00, 0x6E, 0x00, 0x70, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x00, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x00, 0x6F, 0x8D, 0x8D, 0x96, 0x00, 0x96, 0x83, /* 0xB8-0xBB */ + 0x9B, 0x00, 0x3F, 0x3F, 0x9F, 0x80, 0x96, 0x9B, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x89, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x00, 0x73, 0x8B, 0x6F, 0x00, 0x74, 0x00, 0x75, /* 0xCC-0xCF */ + 0x00, 0x76, 0x00, 0x4B, 0x8D, 0x95, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x00, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x00, 0x00, 0x96, 0x00, 0x3F, 0x3F, 0x91, 0x00, /* 0xD8-0xDB */ + 0x00, 0x78, 0x00, 0x7A, 0x00, 0x79, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x00, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x00, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x00, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x7E, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x00, 0x80, 0x3F, 0x3F, 0x00, 0x81, 0x00, 0x82, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x00, 0x83, 0x3F, 0x3F, 0x00, 0x84, /* 0xF8-0xFB */ + 0x00, 0x85, 0x00, 0x86, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9F[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x87, /* 0x04-0x07 */ + 0x00, 0x88, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x93, 0x43, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8C, 0x00, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x00, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x91, 0x6C, 0x00, 0x8B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x00, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x95, 0x40, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8D, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8E, 0x00, 0x56, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x8F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x00, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x92, /* 0x5C-0x5F */ + 0x00, 0x93, 0x00, 0x94, 0x97, 0x00, 0x00, 0x91, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x95, 0x00, 0x96, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x98, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x00, 0x97, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9A, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x9B, 0x00, 0x99, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x97, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x00, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x00, 0x9D, 0x00, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x00, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_F9[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FA[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x90, 0x00, 0x9B, /* 0x0C-0x0F */ + 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x13 */ + 0x00, 0x00, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x75, /* 0x14-0x17 */ + 0x00, 0x7D, 0x00, 0x7E, 0x00, 0x80, 0x00, 0x82, /* 0x18-0x1B */ + 0x00, 0x86, 0x00, 0x89, 0x00, 0x92, 0x00, 0x9D, /* 0x1C-0x1F */ + 0x00, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x23 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x24-0x27 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2B */ + 0x00, 0x00, 0x00, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FF[512] = { + 0x3F, 0x3F, 0x81, 0x49, 0x00, 0x57, 0x81, 0x94, /* 0x00-0x03 */ + 0x81, 0x90, 0x81, 0x93, 0x81, 0x95, 0x00, 0x56, /* 0x04-0x07 */ + 0x81, 0x69, 0x81, 0x6A, 0x81, 0x96, 0x81, 0x7B, /* 0x08-0x0B */ + 0x81, 0x43, 0x81, 0x7C, 0x81, 0x44, 0x81, 0x5E, /* 0x0C-0x0F */ + 0x82, 0x4F, 0x82, 0x50, 0x82, 0x51, 0x82, 0x52, /* 0x10-0x13 */ + 0x82, 0x53, 0x82, 0x54, 0x82, 0x55, 0x82, 0x56, /* 0x14-0x17 */ + 0x82, 0x57, 0x82, 0x58, 0x81, 0x46, 0x81, 0x47, /* 0x18-0x1B */ + 0x81, 0x83, 0x81, 0x81, 0x81, 0x84, 0x81, 0x48, /* 0x1C-0x1F */ + 0x81, 0x97, 0x82, 0x60, 0x82, 0x61, 0x82, 0x62, /* 0x20-0x23 */ + 0x82, 0x63, 0x82, 0x64, 0x82, 0x65, 0x82, 0x66, /* 0x24-0x27 */ + 0x82, 0x67, 0x82, 0x68, 0x82, 0x69, 0x82, 0x6A, /* 0x28-0x2B */ + 0x82, 0x6B, 0x82, 0x6C, 0x82, 0x6D, 0x82, 0x6E, /* 0x2C-0x2F */ + 0x82, 0x6F, 0x82, 0x70, 0x82, 0x71, 0x82, 0x72, /* 0x30-0x33 */ + 0x82, 0x73, 0x82, 0x74, 0x82, 0x75, 0x82, 0x76, /* 0x34-0x37 */ + 0x82, 0x77, 0x82, 0x78, 0x82, 0x79, 0x81, 0x6D, /* 0x38-0x3B */ + 0x81, 0x5F, 0x81, 0x6E, 0x81, 0x4F, 0x81, 0x51, /* 0x3C-0x3F */ + 0x81, 0x4D, 0x82, 0x81, 0x82, 0x82, 0x82, 0x83, /* 0x40-0x43 */ + 0x82, 0x84, 0x82, 0x85, 0x82, 0x86, 0x82, 0x87, /* 0x44-0x47 */ + 0x82, 0x88, 0x82, 0x89, 0x82, 0x8A, 0x82, 0x8B, /* 0x48-0x4B */ + 0x82, 0x8C, 0x82, 0x8D, 0x82, 0x8E, 0x82, 0x8F, /* 0x4C-0x4F */ + 0x82, 0x90, 0x82, 0x91, 0x82, 0x92, 0x82, 0x93, /* 0x50-0x53 */ + 0x82, 0x94, 0x82, 0x95, 0x82, 0x96, 0x82, 0x97, /* 0x54-0x57 */ + 0x82, 0x98, 0x82, 0x99, 0x82, 0x9A, 0x81, 0x6F, /* 0x58-0x5B */ + 0x81, 0x62, 0x81, 0x70, 0x81, 0x60, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x63 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x64-0x67 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6B */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x6C-0x6F */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x73 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x74-0x77 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7B */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x7C-0x7F */ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x83 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x84-0x87 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8B */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x8C-0x8F */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x93 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x94-0x97 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9B */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x81, 0x91, 0x81, 0x92, 0x00, 0x54, 0x81, 0x50, /* 0xE0-0xE3 */ + 0x00, 0x55, 0x81, 0x8F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char *page_uni2charset[256] = { + NULL, NULL, NULL, u2c_03, u2c_04, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u2c_20, u2c_21, u2c_22, u2c_23, u2c_24, u2c_25, u2c_26, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u2c_30, NULL, u2c_32, u2c_33, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u2c_4E, u2c_4F, + u2c_50, u2c_51, u2c_52, u2c_53, u2c_54, u2c_55, u2c_56, u2c_57, + u2c_58, u2c_59, u2c_5A, u2c_5B, u2c_5C, u2c_5D, u2c_5E, u2c_5F, + u2c_60, u2c_61, u2c_62, u2c_63, u2c_64, u2c_65, u2c_66, u2c_67, + u2c_68, u2c_69, u2c_6A, u2c_6B, u2c_6C, u2c_6D, u2c_6E, u2c_6F, + u2c_70, u2c_71, u2c_72, u2c_73, u2c_74, u2c_75, u2c_76, u2c_77, + u2c_78, u2c_79, u2c_7A, u2c_7B, u2c_7C, u2c_7D, u2c_7E, u2c_7F, + u2c_80, u2c_81, u2c_82, u2c_83, u2c_84, u2c_85, u2c_86, u2c_87, + u2c_88, u2c_89, u2c_8A, u2c_8B, u2c_8C, u2c_8D, u2c_8E, u2c_8F, + u2c_90, u2c_91, u2c_92, u2c_93, u2c_94, u2c_95, u2c_96, u2c_97, + u2c_98, u2c_99, u2c_9A, u2c_9B, u2c_9C, u2c_9D, u2c_9E, u2c_9F, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, u2c_F9, u2c_FA, NULL, NULL, NULL, NULL, u2c_FF, }; + +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + if (ch == 0xFF && 0x60 < cl && cl < 0xA0){ + out[0] = cl + 0x40; + *outlen = 1; + return; + } + + uni2charset = page_uni2charset[ch]; + *outlen = 0; + if (uni2charset){ + if (boundlen <= 1) + return; + out[0] = uni2charset[cl*2]; + out[1] = uni2charset[cl*2+1]; + *outlen = 1; + } else if (ch==0 && cl) + out[0] = cl; + else + out[0] = '?'; + (*outlen)++; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + unsigned char ch, cl; + struct nls_unicode *charset2uni; + + ch = rawstring[0]; + cl = rawstring[1]; + if (0xA0 < ch && ch < 0xE0){ + *uni1 = 0xFF; + *uni2 = ch - 0x40; + *offset = 1; + return; + } + + charset2uni = page_charset2uni[ch]; + if (charset2uni && cl){ + *uni1 = charset2uni[cl].uni2; + *uni2 = charset2uni[cl].uni1; + *offset = 2; + } else{ + *uni1 = ch; + *uni2 = 0x00; + *offset = 1; + } + return; +} + +static void inc_use_count(void) +{ + MOD_INC_USE_COUNT; +} + +static void dec_use_count(void) +{ + MOD_DEC_USE_COUNT; +} + +static struct nls_table table = { + "cp932", + uni2char, + char2uni, + inc_use_count, + dec_use_count, + NULL +}; + +int __init init_nls_cp932(void) +{ + return register_nls(&table); +} + +#ifdef MODULE +int init_module(void) +{ + return init_nls_cp932(); +} + + +void cleanup_module(void) +{ + unregister_nls(&table); + 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: 8 + * c-brace-imaginary-offset: 0 + * c-brace-offset: -8 + * c-argdecl-indent: 8 + * c-label-offset: -8 + * c-continued-statement-offset: 8 + * c-continued-brace-offset: 0 + * End: + */ diff -urN v2.2.15/linux/fs/nls/nls_cp936.c linux/fs/nls/nls_cp936.c --- v2.2.15/linux/fs/nls/nls_cp936.c Wed Dec 31 16:00:00 1969 +++ linux/fs/nls/nls_cp936.c Wed Jun 7 14:26:43 2000 @@ -0,0 +1,15615 @@ +/* + * linux/fs/nls_cp936.c + * + * Charset cp936 translation tables. + * Generated automatically from the Microsoft + */ + +#include +#include +#include +#include +#include + +static struct nls_unicode c2u_81[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x4E, 0x02}, {0x4E, 0x04}, {0x4E, 0x05}, {0x4E, 0x06}, /* 0x40-0x43 */ + {0x4E, 0x0F}, {0x4E, 0x12}, {0x4E, 0x17}, {0x4E, 0x1F}, /* 0x44-0x47 */ + {0x4E, 0x20}, {0x4E, 0x21}, {0x4E, 0x23}, {0x4E, 0x26}, /* 0x48-0x4B */ + {0x4E, 0x29}, {0x4E, 0x2E}, {0x4E, 0x2F}, {0x4E, 0x31}, /* 0x4C-0x4F */ + {0x4E, 0x33}, {0x4E, 0x35}, {0x4E, 0x37}, {0x4E, 0x3C}, /* 0x50-0x53 */ + {0x4E, 0x40}, {0x4E, 0x41}, {0x4E, 0x42}, {0x4E, 0x44}, /* 0x54-0x57 */ + {0x4E, 0x46}, {0x4E, 0x4A}, {0x4E, 0x51}, {0x4E, 0x55}, /* 0x58-0x5B */ + {0x4E, 0x57}, {0x4E, 0x5A}, {0x4E, 0x5B}, {0x4E, 0x62}, /* 0x5C-0x5F */ + {0x4E, 0x63}, {0x4E, 0x64}, {0x4E, 0x65}, {0x4E, 0x67}, /* 0x60-0x63 */ + {0x4E, 0x68}, {0x4E, 0x6A}, {0x4E, 0x6B}, {0x4E, 0x6C}, /* 0x64-0x67 */ + {0x4E, 0x6D}, {0x4E, 0x6E}, {0x4E, 0x6F}, {0x4E, 0x72}, /* 0x68-0x6B */ + {0x4E, 0x74}, {0x4E, 0x75}, {0x4E, 0x76}, {0x4E, 0x77}, /* 0x6C-0x6F */ + {0x4E, 0x78}, {0x4E, 0x79}, {0x4E, 0x7A}, {0x4E, 0x7B}, /* 0x70-0x73 */ + {0x4E, 0x7C}, {0x4E, 0x7D}, {0x4E, 0x7F}, {0x4E, 0x80}, /* 0x74-0x77 */ + {0x4E, 0x81}, {0x4E, 0x82}, {0x4E, 0x83}, {0x4E, 0x84}, /* 0x78-0x7B */ + {0x4E, 0x85}, {0x4E, 0x87}, {0x4E, 0x8A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x4E, 0x90}, {0x4E, 0x96}, {0x4E, 0x97}, {0x4E, 0x99}, /* 0x80-0x83 */ + {0x4E, 0x9C}, {0x4E, 0x9D}, {0x4E, 0x9E}, {0x4E, 0xA3}, /* 0x84-0x87 */ + {0x4E, 0xAA}, {0x4E, 0xAF}, {0x4E, 0xB0}, {0x4E, 0xB1}, /* 0x88-0x8B */ + {0x4E, 0xB4}, {0x4E, 0xB6}, {0x4E, 0xB7}, {0x4E, 0xB8}, /* 0x8C-0x8F */ + {0x4E, 0xB9}, {0x4E, 0xBC}, {0x4E, 0xBD}, {0x4E, 0xBE}, /* 0x90-0x93 */ + {0x4E, 0xC8}, {0x4E, 0xCC}, {0x4E, 0xCF}, {0x4E, 0xD0}, /* 0x94-0x97 */ + {0x4E, 0xD2}, {0x4E, 0xDA}, {0x4E, 0xDB}, {0x4E, 0xDC}, /* 0x98-0x9B */ + {0x4E, 0xE0}, {0x4E, 0xE2}, {0x4E, 0xE6}, {0x4E, 0xE7}, /* 0x9C-0x9F */ + {0x4E, 0xE9}, {0x4E, 0xED}, {0x4E, 0xEE}, {0x4E, 0xEF}, /* 0xA0-0xA3 */ + {0x4E, 0xF1}, {0x4E, 0xF4}, {0x4E, 0xF8}, {0x4E, 0xF9}, /* 0xA4-0xA7 */ + {0x4E, 0xFA}, {0x4E, 0xFC}, {0x4E, 0xFE}, {0x4F, 0x00}, /* 0xA8-0xAB */ + {0x4F, 0x02}, {0x4F, 0x03}, {0x4F, 0x04}, {0x4F, 0x05}, /* 0xAC-0xAF */ + {0x4F, 0x06}, {0x4F, 0x07}, {0x4F, 0x08}, {0x4F, 0x0B}, /* 0xB0-0xB3 */ + {0x4F, 0x0C}, {0x4F, 0x12}, {0x4F, 0x13}, {0x4F, 0x14}, /* 0xB4-0xB7 */ + {0x4F, 0x15}, {0x4F, 0x16}, {0x4F, 0x1C}, {0x4F, 0x1D}, /* 0xB8-0xBB */ + {0x4F, 0x21}, {0x4F, 0x23}, {0x4F, 0x28}, {0x4F, 0x29}, /* 0xBC-0xBF */ + {0x4F, 0x2C}, {0x4F, 0x2D}, {0x4F, 0x2E}, {0x4F, 0x31}, /* 0xC0-0xC3 */ + {0x4F, 0x33}, {0x4F, 0x35}, {0x4F, 0x37}, {0x4F, 0x39}, /* 0xC4-0xC7 */ + {0x4F, 0x3B}, {0x4F, 0x3E}, {0x4F, 0x3F}, {0x4F, 0x40}, /* 0xC8-0xCB */ + {0x4F, 0x41}, {0x4F, 0x42}, {0x4F, 0x44}, {0x4F, 0x45}, /* 0xCC-0xCF */ + {0x4F, 0x47}, {0x4F, 0x48}, {0x4F, 0x49}, {0x4F, 0x4A}, /* 0xD0-0xD3 */ + {0x4F, 0x4B}, {0x4F, 0x4C}, {0x4F, 0x52}, {0x4F, 0x54}, /* 0xD4-0xD7 */ + {0x4F, 0x56}, {0x4F, 0x61}, {0x4F, 0x62}, {0x4F, 0x66}, /* 0xD8-0xDB */ + {0x4F, 0x68}, {0x4F, 0x6A}, {0x4F, 0x6B}, {0x4F, 0x6D}, /* 0xDC-0xDF */ + {0x4F, 0x6E}, {0x4F, 0x71}, {0x4F, 0x72}, {0x4F, 0x75}, /* 0xE0-0xE3 */ + {0x4F, 0x77}, {0x4F, 0x78}, {0x4F, 0x79}, {0x4F, 0x7A}, /* 0xE4-0xE7 */ + {0x4F, 0x7D}, {0x4F, 0x80}, {0x4F, 0x81}, {0x4F, 0x82}, /* 0xE8-0xEB */ + {0x4F, 0x85}, {0x4F, 0x86}, {0x4F, 0x87}, {0x4F, 0x8A}, /* 0xEC-0xEF */ + {0x4F, 0x8C}, {0x4F, 0x8E}, {0x4F, 0x90}, {0x4F, 0x92}, /* 0xF0-0xF3 */ + {0x4F, 0x93}, {0x4F, 0x95}, {0x4F, 0x96}, {0x4F, 0x98}, /* 0xF4-0xF7 */ + {0x4F, 0x99}, {0x4F, 0x9A}, {0x4F, 0x9C}, {0x4F, 0x9E}, /* 0xF8-0xFB */ + {0x4F, 0x9F}, {0x4F, 0xA1}, {0x4F, 0xA2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_82[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x4F, 0xA4}, {0x4F, 0xAB}, {0x4F, 0xAD}, {0x4F, 0xB0}, /* 0x40-0x43 */ + {0x4F, 0xB1}, {0x4F, 0xB2}, {0x4F, 0xB3}, {0x4F, 0xB4}, /* 0x44-0x47 */ + {0x4F, 0xB6}, {0x4F, 0xB7}, {0x4F, 0xB8}, {0x4F, 0xB9}, /* 0x48-0x4B */ + {0x4F, 0xBA}, {0x4F, 0xBB}, {0x4F, 0xBC}, {0x4F, 0xBD}, /* 0x4C-0x4F */ + {0x4F, 0xBE}, {0x4F, 0xC0}, {0x4F, 0xC1}, {0x4F, 0xC2}, /* 0x50-0x53 */ + {0x4F, 0xC6}, {0x4F, 0xC7}, {0x4F, 0xC8}, {0x4F, 0xC9}, /* 0x54-0x57 */ + {0x4F, 0xCB}, {0x4F, 0xCC}, {0x4F, 0xCD}, {0x4F, 0xD2}, /* 0x58-0x5B */ + {0x4F, 0xD3}, {0x4F, 0xD4}, {0x4F, 0xD5}, {0x4F, 0xD6}, /* 0x5C-0x5F */ + {0x4F, 0xD9}, {0x4F, 0xDB}, {0x4F, 0xE0}, {0x4F, 0xE2}, /* 0x60-0x63 */ + {0x4F, 0xE4}, {0x4F, 0xE5}, {0x4F, 0xE7}, {0x4F, 0xEB}, /* 0x64-0x67 */ + {0x4F, 0xEC}, {0x4F, 0xF0}, {0x4F, 0xF2}, {0x4F, 0xF4}, /* 0x68-0x6B */ + {0x4F, 0xF5}, {0x4F, 0xF6}, {0x4F, 0xF7}, {0x4F, 0xF9}, /* 0x6C-0x6F */ + {0x4F, 0xFB}, {0x4F, 0xFC}, {0x4F, 0xFD}, {0x4F, 0xFF}, /* 0x70-0x73 */ + {0x50, 0x00}, {0x50, 0x01}, {0x50, 0x02}, {0x50, 0x03}, /* 0x74-0x77 */ + {0x50, 0x04}, {0x50, 0x05}, {0x50, 0x06}, {0x50, 0x07}, /* 0x78-0x7B */ + {0x50, 0x08}, {0x50, 0x09}, {0x50, 0x0A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x50, 0x0B}, {0x50, 0x0E}, {0x50, 0x10}, {0x50, 0x11}, /* 0x80-0x83 */ + {0x50, 0x13}, {0x50, 0x15}, {0x50, 0x16}, {0x50, 0x17}, /* 0x84-0x87 */ + {0x50, 0x1B}, {0x50, 0x1D}, {0x50, 0x1E}, {0x50, 0x20}, /* 0x88-0x8B */ + {0x50, 0x22}, {0x50, 0x23}, {0x50, 0x24}, {0x50, 0x27}, /* 0x8C-0x8F */ + {0x50, 0x2B}, {0x50, 0x2F}, {0x50, 0x30}, {0x50, 0x31}, /* 0x90-0x93 */ + {0x50, 0x32}, {0x50, 0x33}, {0x50, 0x34}, {0x50, 0x35}, /* 0x94-0x97 */ + {0x50, 0x36}, {0x50, 0x37}, {0x50, 0x38}, {0x50, 0x39}, /* 0x98-0x9B */ + {0x50, 0x3B}, {0x50, 0x3D}, {0x50, 0x3F}, {0x50, 0x40}, /* 0x9C-0x9F */ + {0x50, 0x41}, {0x50, 0x42}, {0x50, 0x44}, {0x50, 0x45}, /* 0xA0-0xA3 */ + {0x50, 0x46}, {0x50, 0x49}, {0x50, 0x4A}, {0x50, 0x4B}, /* 0xA4-0xA7 */ + {0x50, 0x4D}, {0x50, 0x50}, {0x50, 0x51}, {0x50, 0x52}, /* 0xA8-0xAB */ + {0x50, 0x53}, {0x50, 0x54}, {0x50, 0x56}, {0x50, 0x57}, /* 0xAC-0xAF */ + {0x50, 0x58}, {0x50, 0x59}, {0x50, 0x5B}, {0x50, 0x5D}, /* 0xB0-0xB3 */ + {0x50, 0x5E}, {0x50, 0x5F}, {0x50, 0x60}, {0x50, 0x61}, /* 0xB4-0xB7 */ + {0x50, 0x62}, {0x50, 0x63}, {0x50, 0x64}, {0x50, 0x66}, /* 0xB8-0xBB */ + {0x50, 0x67}, {0x50, 0x68}, {0x50, 0x69}, {0x50, 0x6A}, /* 0xBC-0xBF */ + {0x50, 0x6B}, {0x50, 0x6D}, {0x50, 0x6E}, {0x50, 0x6F}, /* 0xC0-0xC3 */ + {0x50, 0x70}, {0x50, 0x71}, {0x50, 0x72}, {0x50, 0x73}, /* 0xC4-0xC7 */ + {0x50, 0x74}, {0x50, 0x75}, {0x50, 0x78}, {0x50, 0x79}, /* 0xC8-0xCB */ + {0x50, 0x7A}, {0x50, 0x7C}, {0x50, 0x7D}, {0x50, 0x81}, /* 0xCC-0xCF */ + {0x50, 0x82}, {0x50, 0x83}, {0x50, 0x84}, {0x50, 0x86}, /* 0xD0-0xD3 */ + {0x50, 0x87}, {0x50, 0x89}, {0x50, 0x8A}, {0x50, 0x8B}, /* 0xD4-0xD7 */ + {0x50, 0x8C}, {0x50, 0x8E}, {0x50, 0x8F}, {0x50, 0x90}, /* 0xD8-0xDB */ + {0x50, 0x91}, {0x50, 0x92}, {0x50, 0x93}, {0x50, 0x94}, /* 0xDC-0xDF */ + {0x50, 0x95}, {0x50, 0x96}, {0x50, 0x97}, {0x50, 0x98}, /* 0xE0-0xE3 */ + {0x50, 0x99}, {0x50, 0x9A}, {0x50, 0x9B}, {0x50, 0x9C}, /* 0xE4-0xE7 */ + {0x50, 0x9D}, {0x50, 0x9E}, {0x50, 0x9F}, {0x50, 0xA0}, /* 0xE8-0xEB */ + {0x50, 0xA1}, {0x50, 0xA2}, {0x50, 0xA4}, {0x50, 0xA6}, /* 0xEC-0xEF */ + {0x50, 0xAA}, {0x50, 0xAB}, {0x50, 0xAD}, {0x50, 0xAE}, /* 0xF0-0xF3 */ + {0x50, 0xAF}, {0x50, 0xB0}, {0x50, 0xB1}, {0x50, 0xB3}, /* 0xF4-0xF7 */ + {0x50, 0xB4}, {0x50, 0xB5}, {0x50, 0xB6}, {0x50, 0xB7}, /* 0xF8-0xFB */ + {0x50, 0xB8}, {0x50, 0xB9}, {0x50, 0xBC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_83[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x50, 0xBD}, {0x50, 0xBE}, {0x50, 0xBF}, {0x50, 0xC0}, /* 0x40-0x43 */ + {0x50, 0xC1}, {0x50, 0xC2}, {0x50, 0xC3}, {0x50, 0xC4}, /* 0x44-0x47 */ + {0x50, 0xC5}, {0x50, 0xC6}, {0x50, 0xC7}, {0x50, 0xC8}, /* 0x48-0x4B */ + {0x50, 0xC9}, {0x50, 0xCA}, {0x50, 0xCB}, {0x50, 0xCC}, /* 0x4C-0x4F */ + {0x50, 0xCD}, {0x50, 0xCE}, {0x50, 0xD0}, {0x50, 0xD1}, /* 0x50-0x53 */ + {0x50, 0xD2}, {0x50, 0xD3}, {0x50, 0xD4}, {0x50, 0xD5}, /* 0x54-0x57 */ + {0x50, 0xD7}, {0x50, 0xD8}, {0x50, 0xD9}, {0x50, 0xDB}, /* 0x58-0x5B */ + {0x50, 0xDC}, {0x50, 0xDD}, {0x50, 0xDE}, {0x50, 0xDF}, /* 0x5C-0x5F */ + {0x50, 0xE0}, {0x50, 0xE1}, {0x50, 0xE2}, {0x50, 0xE3}, /* 0x60-0x63 */ + {0x50, 0xE4}, {0x50, 0xE5}, {0x50, 0xE8}, {0x50, 0xE9}, /* 0x64-0x67 */ + {0x50, 0xEA}, {0x50, 0xEB}, {0x50, 0xEF}, {0x50, 0xF0}, /* 0x68-0x6B */ + {0x50, 0xF1}, {0x50, 0xF2}, {0x50, 0xF4}, {0x50, 0xF6}, /* 0x6C-0x6F */ + {0x50, 0xF7}, {0x50, 0xF8}, {0x50, 0xF9}, {0x50, 0xFA}, /* 0x70-0x73 */ + {0x50, 0xFC}, {0x50, 0xFD}, {0x50, 0xFE}, {0x50, 0xFF}, /* 0x74-0x77 */ + {0x51, 0x00}, {0x51, 0x01}, {0x51, 0x02}, {0x51, 0x03}, /* 0x78-0x7B */ + {0x51, 0x04}, {0x51, 0x05}, {0x51, 0x08}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x51, 0x09}, {0x51, 0x0A}, {0x51, 0x0C}, {0x51, 0x0D}, /* 0x80-0x83 */ + {0x51, 0x0E}, {0x51, 0x0F}, {0x51, 0x10}, {0x51, 0x11}, /* 0x84-0x87 */ + {0x51, 0x13}, {0x51, 0x14}, {0x51, 0x15}, {0x51, 0x16}, /* 0x88-0x8B */ + {0x51, 0x17}, {0x51, 0x18}, {0x51, 0x19}, {0x51, 0x1A}, /* 0x8C-0x8F */ + {0x51, 0x1B}, {0x51, 0x1C}, {0x51, 0x1D}, {0x51, 0x1E}, /* 0x90-0x93 */ + {0x51, 0x1F}, {0x51, 0x20}, {0x51, 0x22}, {0x51, 0x23}, /* 0x94-0x97 */ + {0x51, 0x24}, {0x51, 0x25}, {0x51, 0x26}, {0x51, 0x27}, /* 0x98-0x9B */ + {0x51, 0x28}, {0x51, 0x29}, {0x51, 0x2A}, {0x51, 0x2B}, /* 0x9C-0x9F */ + {0x51, 0x2C}, {0x51, 0x2D}, {0x51, 0x2E}, {0x51, 0x2F}, /* 0xA0-0xA3 */ + {0x51, 0x30}, {0x51, 0x31}, {0x51, 0x32}, {0x51, 0x33}, /* 0xA4-0xA7 */ + {0x51, 0x34}, {0x51, 0x35}, {0x51, 0x36}, {0x51, 0x37}, /* 0xA8-0xAB */ + {0x51, 0x38}, {0x51, 0x39}, {0x51, 0x3A}, {0x51, 0x3B}, /* 0xAC-0xAF */ + {0x51, 0x3C}, {0x51, 0x3D}, {0x51, 0x3E}, {0x51, 0x42}, /* 0xB0-0xB3 */ + {0x51, 0x47}, {0x51, 0x4A}, {0x51, 0x4C}, {0x51, 0x4E}, /* 0xB4-0xB7 */ + {0x51, 0x4F}, {0x51, 0x50}, {0x51, 0x52}, {0x51, 0x53}, /* 0xB8-0xBB */ + {0x51, 0x57}, {0x51, 0x58}, {0x51, 0x59}, {0x51, 0x5B}, /* 0xBC-0xBF */ + {0x51, 0x5D}, {0x51, 0x5E}, {0x51, 0x5F}, {0x51, 0x60}, /* 0xC0-0xC3 */ + {0x51, 0x61}, {0x51, 0x63}, {0x51, 0x64}, {0x51, 0x66}, /* 0xC4-0xC7 */ + {0x51, 0x67}, {0x51, 0x69}, {0x51, 0x6A}, {0x51, 0x6F}, /* 0xC8-0xCB */ + {0x51, 0x72}, {0x51, 0x7A}, {0x51, 0x7E}, {0x51, 0x7F}, /* 0xCC-0xCF */ + {0x51, 0x83}, {0x51, 0x84}, {0x51, 0x86}, {0x51, 0x87}, /* 0xD0-0xD3 */ + {0x51, 0x8A}, {0x51, 0x8B}, {0x51, 0x8E}, {0x51, 0x8F}, /* 0xD4-0xD7 */ + {0x51, 0x90}, {0x51, 0x91}, {0x51, 0x93}, {0x51, 0x94}, /* 0xD8-0xDB */ + {0x51, 0x98}, {0x51, 0x9A}, {0x51, 0x9D}, {0x51, 0x9E}, /* 0xDC-0xDF */ + {0x51, 0x9F}, {0x51, 0xA1}, {0x51, 0xA3}, {0x51, 0xA6}, /* 0xE0-0xE3 */ + {0x51, 0xA7}, {0x51, 0xA8}, {0x51, 0xA9}, {0x51, 0xAA}, /* 0xE4-0xE7 */ + {0x51, 0xAD}, {0x51, 0xAE}, {0x51, 0xB4}, {0x51, 0xB8}, /* 0xE8-0xEB */ + {0x51, 0xB9}, {0x51, 0xBA}, {0x51, 0xBE}, {0x51, 0xBF}, /* 0xEC-0xEF */ + {0x51, 0xC1}, {0x51, 0xC2}, {0x51, 0xC3}, {0x51, 0xC5}, /* 0xF0-0xF3 */ + {0x51, 0xC8}, {0x51, 0xCA}, {0x51, 0xCD}, {0x51, 0xCE}, /* 0xF4-0xF7 */ + {0x51, 0xD0}, {0x51, 0xD2}, {0x51, 0xD3}, {0x51, 0xD4}, /* 0xF8-0xFB */ + {0x51, 0xD5}, {0x51, 0xD6}, {0x51, 0xD7}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_84[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x51, 0xD8}, {0x51, 0xD9}, {0x51, 0xDA}, {0x51, 0xDC}, /* 0x40-0x43 */ + {0x51, 0xDE}, {0x51, 0xDF}, {0x51, 0xE2}, {0x51, 0xE3}, /* 0x44-0x47 */ + {0x51, 0xE5}, {0x51, 0xE6}, {0x51, 0xE7}, {0x51, 0xE8}, /* 0x48-0x4B */ + {0x51, 0xE9}, {0x51, 0xEA}, {0x51, 0xEC}, {0x51, 0xEE}, /* 0x4C-0x4F */ + {0x51, 0xF1}, {0x51, 0xF2}, {0x51, 0xF4}, {0x51, 0xF7}, /* 0x50-0x53 */ + {0x51, 0xFE}, {0x52, 0x04}, {0x52, 0x05}, {0x52, 0x09}, /* 0x54-0x57 */ + {0x52, 0x0B}, {0x52, 0x0C}, {0x52, 0x0F}, {0x52, 0x10}, /* 0x58-0x5B */ + {0x52, 0x13}, {0x52, 0x14}, {0x52, 0x15}, {0x52, 0x1C}, /* 0x5C-0x5F */ + {0x52, 0x1E}, {0x52, 0x1F}, {0x52, 0x21}, {0x52, 0x22}, /* 0x60-0x63 */ + {0x52, 0x23}, {0x52, 0x25}, {0x52, 0x26}, {0x52, 0x27}, /* 0x64-0x67 */ + {0x52, 0x2A}, {0x52, 0x2C}, {0x52, 0x2F}, {0x52, 0x31}, /* 0x68-0x6B */ + {0x52, 0x32}, {0x52, 0x34}, {0x52, 0x35}, {0x52, 0x3C}, /* 0x6C-0x6F */ + {0x52, 0x3E}, {0x52, 0x44}, {0x52, 0x45}, {0x52, 0x46}, /* 0x70-0x73 */ + {0x52, 0x47}, {0x52, 0x48}, {0x52, 0x49}, {0x52, 0x4B}, /* 0x74-0x77 */ + {0x52, 0x4E}, {0x52, 0x4F}, {0x52, 0x52}, {0x52, 0x53}, /* 0x78-0x7B */ + {0x52, 0x55}, {0x52, 0x57}, {0x52, 0x58}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x52, 0x59}, {0x52, 0x5A}, {0x52, 0x5B}, {0x52, 0x5D}, /* 0x80-0x83 */ + {0x52, 0x5F}, {0x52, 0x60}, {0x52, 0x62}, {0x52, 0x63}, /* 0x84-0x87 */ + {0x52, 0x64}, {0x52, 0x66}, {0x52, 0x68}, {0x52, 0x6B}, /* 0x88-0x8B */ + {0x52, 0x6C}, {0x52, 0x6D}, {0x52, 0x6E}, {0x52, 0x70}, /* 0x8C-0x8F */ + {0x52, 0x71}, {0x52, 0x73}, {0x52, 0x74}, {0x52, 0x75}, /* 0x90-0x93 */ + {0x52, 0x76}, {0x52, 0x77}, {0x52, 0x78}, {0x52, 0x79}, /* 0x94-0x97 */ + {0x52, 0x7A}, {0x52, 0x7B}, {0x52, 0x7C}, {0x52, 0x7E}, /* 0x98-0x9B */ + {0x52, 0x80}, {0x52, 0x83}, {0x52, 0x84}, {0x52, 0x85}, /* 0x9C-0x9F */ + {0x52, 0x86}, {0x52, 0x87}, {0x52, 0x89}, {0x52, 0x8A}, /* 0xA0-0xA3 */ + {0x52, 0x8B}, {0x52, 0x8C}, {0x52, 0x8D}, {0x52, 0x8E}, /* 0xA4-0xA7 */ + {0x52, 0x8F}, {0x52, 0x91}, {0x52, 0x92}, {0x52, 0x94}, /* 0xA8-0xAB */ + {0x52, 0x95}, {0x52, 0x96}, {0x52, 0x97}, {0x52, 0x98}, /* 0xAC-0xAF */ + {0x52, 0x99}, {0x52, 0x9A}, {0x52, 0x9C}, {0x52, 0xA4}, /* 0xB0-0xB3 */ + {0x52, 0xA5}, {0x52, 0xA6}, {0x52, 0xA7}, {0x52, 0xAE}, /* 0xB4-0xB7 */ + {0x52, 0xAF}, {0x52, 0xB0}, {0x52, 0xB4}, {0x52, 0xB5}, /* 0xB8-0xBB */ + {0x52, 0xB6}, {0x52, 0xB7}, {0x52, 0xB8}, {0x52, 0xB9}, /* 0xBC-0xBF */ + {0x52, 0xBA}, {0x52, 0xBB}, {0x52, 0xBC}, {0x52, 0xBD}, /* 0xC0-0xC3 */ + {0x52, 0xC0}, {0x52, 0xC1}, {0x52, 0xC2}, {0x52, 0xC4}, /* 0xC4-0xC7 */ + {0x52, 0xC5}, {0x52, 0xC6}, {0x52, 0xC8}, {0x52, 0xCA}, /* 0xC8-0xCB */ + {0x52, 0xCC}, {0x52, 0xCD}, {0x52, 0xCE}, {0x52, 0xCF}, /* 0xCC-0xCF */ + {0x52, 0xD1}, {0x52, 0xD3}, {0x52, 0xD4}, {0x52, 0xD5}, /* 0xD0-0xD3 */ + {0x52, 0xD7}, {0x52, 0xD9}, {0x52, 0xDA}, {0x52, 0xDB}, /* 0xD4-0xD7 */ + {0x52, 0xDC}, {0x52, 0xDD}, {0x52, 0xDE}, {0x52, 0xE0}, /* 0xD8-0xDB */ + {0x52, 0xE1}, {0x52, 0xE2}, {0x52, 0xE3}, {0x52, 0xE5}, /* 0xDC-0xDF */ + {0x52, 0xE6}, {0x52, 0xE7}, {0x52, 0xE8}, {0x52, 0xE9}, /* 0xE0-0xE3 */ + {0x52, 0xEA}, {0x52, 0xEB}, {0x52, 0xEC}, {0x52, 0xED}, /* 0xE4-0xE7 */ + {0x52, 0xEE}, {0x52, 0xEF}, {0x52, 0xF1}, {0x52, 0xF2}, /* 0xE8-0xEB */ + {0x52, 0xF3}, {0x52, 0xF4}, {0x52, 0xF5}, {0x52, 0xF6}, /* 0xEC-0xEF */ + {0x52, 0xF7}, {0x52, 0xF8}, {0x52, 0xFB}, {0x52, 0xFC}, /* 0xF0-0xF3 */ + {0x52, 0xFD}, {0x53, 0x01}, {0x53, 0x02}, {0x53, 0x03}, /* 0xF4-0xF7 */ + {0x53, 0x04}, {0x53, 0x07}, {0x53, 0x09}, {0x53, 0x0A}, /* 0xF8-0xFB */ + {0x53, 0x0B}, {0x53, 0x0C}, {0x53, 0x0E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_85[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x53, 0x11}, {0x53, 0x12}, {0x53, 0x13}, {0x53, 0x14}, /* 0x40-0x43 */ + {0x53, 0x18}, {0x53, 0x1B}, {0x53, 0x1C}, {0x53, 0x1E}, /* 0x44-0x47 */ + {0x53, 0x1F}, {0x53, 0x22}, {0x53, 0x24}, {0x53, 0x25}, /* 0x48-0x4B */ + {0x53, 0x27}, {0x53, 0x28}, {0x53, 0x29}, {0x53, 0x2B}, /* 0x4C-0x4F */ + {0x53, 0x2C}, {0x53, 0x2D}, {0x53, 0x2F}, {0x53, 0x30}, /* 0x50-0x53 */ + {0x53, 0x31}, {0x53, 0x32}, {0x53, 0x33}, {0x53, 0x34}, /* 0x54-0x57 */ + {0x53, 0x35}, {0x53, 0x36}, {0x53, 0x37}, {0x53, 0x38}, /* 0x58-0x5B */ + {0x53, 0x3C}, {0x53, 0x3D}, {0x53, 0x40}, {0x53, 0x42}, /* 0x5C-0x5F */ + {0x53, 0x44}, {0x53, 0x46}, {0x53, 0x4B}, {0x53, 0x4C}, /* 0x60-0x63 */ + {0x53, 0x4D}, {0x53, 0x50}, {0x53, 0x54}, {0x53, 0x58}, /* 0x64-0x67 */ + {0x53, 0x59}, {0x53, 0x5B}, {0x53, 0x5D}, {0x53, 0x65}, /* 0x68-0x6B */ + {0x53, 0x68}, {0x53, 0x6A}, {0x53, 0x6C}, {0x53, 0x6D}, /* 0x6C-0x6F */ + {0x53, 0x72}, {0x53, 0x76}, {0x53, 0x79}, {0x53, 0x7B}, /* 0x70-0x73 */ + {0x53, 0x7C}, {0x53, 0x7D}, {0x53, 0x7E}, {0x53, 0x80}, /* 0x74-0x77 */ + {0x53, 0x81}, {0x53, 0x83}, {0x53, 0x87}, {0x53, 0x88}, /* 0x78-0x7B */ + {0x53, 0x8A}, {0x53, 0x8E}, {0x53, 0x8F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x53, 0x90}, {0x53, 0x91}, {0x53, 0x92}, {0x53, 0x93}, /* 0x80-0x83 */ + {0x53, 0x94}, {0x53, 0x96}, {0x53, 0x97}, {0x53, 0x99}, /* 0x84-0x87 */ + {0x53, 0x9B}, {0x53, 0x9C}, {0x53, 0x9E}, {0x53, 0xA0}, /* 0x88-0x8B */ + {0x53, 0xA1}, {0x53, 0xA4}, {0x53, 0xA7}, {0x53, 0xAA}, /* 0x8C-0x8F */ + {0x53, 0xAB}, {0x53, 0xAC}, {0x53, 0xAD}, {0x53, 0xAF}, /* 0x90-0x93 */ + {0x53, 0xB0}, {0x53, 0xB1}, {0x53, 0xB2}, {0x53, 0xB3}, /* 0x94-0x97 */ + {0x53, 0xB4}, {0x53, 0xB5}, {0x53, 0xB7}, {0x53, 0xB8}, /* 0x98-0x9B */ + {0x53, 0xB9}, {0x53, 0xBA}, {0x53, 0xBC}, {0x53, 0xBD}, /* 0x9C-0x9F */ + {0x53, 0xBE}, {0x53, 0xC0}, {0x53, 0xC3}, {0x53, 0xC4}, /* 0xA0-0xA3 */ + {0x53, 0xC5}, {0x53, 0xC6}, {0x53, 0xC7}, {0x53, 0xCE}, /* 0xA4-0xA7 */ + {0x53, 0xCF}, {0x53, 0xD0}, {0x53, 0xD2}, {0x53, 0xD3}, /* 0xA8-0xAB */ + {0x53, 0xD5}, {0x53, 0xDA}, {0x53, 0xDC}, {0x53, 0xDD}, /* 0xAC-0xAF */ + {0x53, 0xDE}, {0x53, 0xE1}, {0x53, 0xE2}, {0x53, 0xE7}, /* 0xB0-0xB3 */ + {0x53, 0xF4}, {0x53, 0xFA}, {0x53, 0xFE}, {0x53, 0xFF}, /* 0xB4-0xB7 */ + {0x54, 0x00}, {0x54, 0x02}, {0x54, 0x05}, {0x54, 0x07}, /* 0xB8-0xBB */ + {0x54, 0x0B}, {0x54, 0x14}, {0x54, 0x18}, {0x54, 0x19}, /* 0xBC-0xBF */ + {0x54, 0x1A}, {0x54, 0x1C}, {0x54, 0x22}, {0x54, 0x24}, /* 0xC0-0xC3 */ + {0x54, 0x25}, {0x54, 0x2A}, {0x54, 0x30}, {0x54, 0x33}, /* 0xC4-0xC7 */ + {0x54, 0x36}, {0x54, 0x37}, {0x54, 0x3A}, {0x54, 0x3D}, /* 0xC8-0xCB */ + {0x54, 0x3F}, {0x54, 0x41}, {0x54, 0x42}, {0x54, 0x44}, /* 0xCC-0xCF */ + {0x54, 0x45}, {0x54, 0x47}, {0x54, 0x49}, {0x54, 0x4C}, /* 0xD0-0xD3 */ + {0x54, 0x4D}, {0x54, 0x4E}, {0x54, 0x4F}, {0x54, 0x51}, /* 0xD4-0xD7 */ + {0x54, 0x5A}, {0x54, 0x5D}, {0x54, 0x5E}, {0x54, 0x5F}, /* 0xD8-0xDB */ + {0x54, 0x60}, {0x54, 0x61}, {0x54, 0x63}, {0x54, 0x65}, /* 0xDC-0xDF */ + {0x54, 0x67}, {0x54, 0x69}, {0x54, 0x6A}, {0x54, 0x6B}, /* 0xE0-0xE3 */ + {0x54, 0x6C}, {0x54, 0x6D}, {0x54, 0x6E}, {0x54, 0x6F}, /* 0xE4-0xE7 */ + {0x54, 0x70}, {0x54, 0x74}, {0x54, 0x79}, {0x54, 0x7A}, /* 0xE8-0xEB */ + {0x54, 0x7E}, {0x54, 0x7F}, {0x54, 0x81}, {0x54, 0x83}, /* 0xEC-0xEF */ + {0x54, 0x85}, {0x54, 0x87}, {0x54, 0x88}, {0x54, 0x89}, /* 0xF0-0xF3 */ + {0x54, 0x8A}, {0x54, 0x8D}, {0x54, 0x91}, {0x54, 0x93}, /* 0xF4-0xF7 */ + {0x54, 0x97}, {0x54, 0x98}, {0x54, 0x9C}, {0x54, 0x9E}, /* 0xF8-0xFB */ + {0x54, 0x9F}, {0x54, 0xA0}, {0x54, 0xA1}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_86[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x54, 0xA2}, {0x54, 0xA5}, {0x54, 0xAE}, {0x54, 0xB0}, /* 0x40-0x43 */ + {0x54, 0xB2}, {0x54, 0xB5}, {0x54, 0xB6}, {0x54, 0xB7}, /* 0x44-0x47 */ + {0x54, 0xB9}, {0x54, 0xBA}, {0x54, 0xBC}, {0x54, 0xBE}, /* 0x48-0x4B */ + {0x54, 0xC3}, {0x54, 0xC5}, {0x54, 0xCA}, {0x54, 0xCB}, /* 0x4C-0x4F */ + {0x54, 0xD6}, {0x54, 0xD8}, {0x54, 0xDB}, {0x54, 0xE0}, /* 0x50-0x53 */ + {0x54, 0xE1}, {0x54, 0xE2}, {0x54, 0xE3}, {0x54, 0xE4}, /* 0x54-0x57 */ + {0x54, 0xEB}, {0x54, 0xEC}, {0x54, 0xEF}, {0x54, 0xF0}, /* 0x58-0x5B */ + {0x54, 0xF1}, {0x54, 0xF4}, {0x54, 0xF5}, {0x54, 0xF6}, /* 0x5C-0x5F */ + {0x54, 0xF7}, {0x54, 0xF8}, {0x54, 0xF9}, {0x54, 0xFB}, /* 0x60-0x63 */ + {0x54, 0xFE}, {0x55, 0x00}, {0x55, 0x02}, {0x55, 0x03}, /* 0x64-0x67 */ + {0x55, 0x04}, {0x55, 0x05}, {0x55, 0x08}, {0x55, 0x0A}, /* 0x68-0x6B */ + {0x55, 0x0B}, {0x55, 0x0C}, {0x55, 0x0D}, {0x55, 0x0E}, /* 0x6C-0x6F */ + {0x55, 0x12}, {0x55, 0x13}, {0x55, 0x15}, {0x55, 0x16}, /* 0x70-0x73 */ + {0x55, 0x17}, {0x55, 0x18}, {0x55, 0x19}, {0x55, 0x1A}, /* 0x74-0x77 */ + {0x55, 0x1C}, {0x55, 0x1D}, {0x55, 0x1E}, {0x55, 0x1F}, /* 0x78-0x7B */ + {0x55, 0x21}, {0x55, 0x25}, {0x55, 0x26}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x55, 0x28}, {0x55, 0x29}, {0x55, 0x2B}, {0x55, 0x2D}, /* 0x80-0x83 */ + {0x55, 0x32}, {0x55, 0x34}, {0x55, 0x35}, {0x55, 0x36}, /* 0x84-0x87 */ + {0x55, 0x38}, {0x55, 0x39}, {0x55, 0x3A}, {0x55, 0x3B}, /* 0x88-0x8B */ + {0x55, 0x3D}, {0x55, 0x40}, {0x55, 0x42}, {0x55, 0x45}, /* 0x8C-0x8F */ + {0x55, 0x47}, {0x55, 0x48}, {0x55, 0x4B}, {0x55, 0x4C}, /* 0x90-0x93 */ + {0x55, 0x4D}, {0x55, 0x4E}, {0x55, 0x4F}, {0x55, 0x51}, /* 0x94-0x97 */ + {0x55, 0x52}, {0x55, 0x53}, {0x55, 0x54}, {0x55, 0x57}, /* 0x98-0x9B */ + {0x55, 0x58}, {0x55, 0x59}, {0x55, 0x5A}, {0x55, 0x5B}, /* 0x9C-0x9F */ + {0x55, 0x5D}, {0x55, 0x5E}, {0x55, 0x5F}, {0x55, 0x60}, /* 0xA0-0xA3 */ + {0x55, 0x62}, {0x55, 0x63}, {0x55, 0x68}, {0x55, 0x69}, /* 0xA4-0xA7 */ + {0x55, 0x6B}, {0x55, 0x6F}, {0x55, 0x70}, {0x55, 0x71}, /* 0xA8-0xAB */ + {0x55, 0x72}, {0x55, 0x73}, {0x55, 0x74}, {0x55, 0x79}, /* 0xAC-0xAF */ + {0x55, 0x7A}, {0x55, 0x7D}, {0x55, 0x7F}, {0x55, 0x85}, /* 0xB0-0xB3 */ + {0x55, 0x86}, {0x55, 0x8C}, {0x55, 0x8D}, {0x55, 0x8E}, /* 0xB4-0xB7 */ + {0x55, 0x90}, {0x55, 0x92}, {0x55, 0x93}, {0x55, 0x95}, /* 0xB8-0xBB */ + {0x55, 0x96}, {0x55, 0x97}, {0x55, 0x9A}, {0x55, 0x9B}, /* 0xBC-0xBF */ + {0x55, 0x9E}, {0x55, 0xA0}, {0x55, 0xA1}, {0x55, 0xA2}, /* 0xC0-0xC3 */ + {0x55, 0xA3}, {0x55, 0xA4}, {0x55, 0xA5}, {0x55, 0xA6}, /* 0xC4-0xC7 */ + {0x55, 0xA8}, {0x55, 0xA9}, {0x55, 0xAA}, {0x55, 0xAB}, /* 0xC8-0xCB */ + {0x55, 0xAC}, {0x55, 0xAD}, {0x55, 0xAE}, {0x55, 0xAF}, /* 0xCC-0xCF */ + {0x55, 0xB0}, {0x55, 0xB2}, {0x55, 0xB4}, {0x55, 0xB6}, /* 0xD0-0xD3 */ + {0x55, 0xB8}, {0x55, 0xBA}, {0x55, 0xBC}, {0x55, 0xBF}, /* 0xD4-0xD7 */ + {0x55, 0xC0}, {0x55, 0xC1}, {0x55, 0xC2}, {0x55, 0xC3}, /* 0xD8-0xDB */ + {0x55, 0xC6}, {0x55, 0xC7}, {0x55, 0xC8}, {0x55, 0xCA}, /* 0xDC-0xDF */ + {0x55, 0xCB}, {0x55, 0xCE}, {0x55, 0xCF}, {0x55, 0xD0}, /* 0xE0-0xE3 */ + {0x55, 0xD5}, {0x55, 0xD7}, {0x55, 0xD8}, {0x55, 0xD9}, /* 0xE4-0xE7 */ + {0x55, 0xDA}, {0x55, 0xDB}, {0x55, 0xDE}, {0x55, 0xE0}, /* 0xE8-0xEB */ + {0x55, 0xE2}, {0x55, 0xE7}, {0x55, 0xE9}, {0x55, 0xED}, /* 0xEC-0xEF */ + {0x55, 0xEE}, {0x55, 0xF0}, {0x55, 0xF1}, {0x55, 0xF4}, /* 0xF0-0xF3 */ + {0x55, 0xF6}, {0x55, 0xF8}, {0x55, 0xF9}, {0x55, 0xFA}, /* 0xF4-0xF7 */ + {0x55, 0xFB}, {0x55, 0xFC}, {0x55, 0xFF}, {0x56, 0x02}, /* 0xF8-0xFB */ + {0x56, 0x03}, {0x56, 0x04}, {0x56, 0x05}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_87[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x56, 0x06}, {0x56, 0x07}, {0x56, 0x0A}, {0x56, 0x0B}, /* 0x40-0x43 */ + {0x56, 0x0D}, {0x56, 0x10}, {0x56, 0x11}, {0x56, 0x12}, /* 0x44-0x47 */ + {0x56, 0x13}, {0x56, 0x14}, {0x56, 0x15}, {0x56, 0x16}, /* 0x48-0x4B */ + {0x56, 0x17}, {0x56, 0x19}, {0x56, 0x1A}, {0x56, 0x1C}, /* 0x4C-0x4F */ + {0x56, 0x1D}, {0x56, 0x20}, {0x56, 0x21}, {0x56, 0x22}, /* 0x50-0x53 */ + {0x56, 0x25}, {0x56, 0x26}, {0x56, 0x28}, {0x56, 0x29}, /* 0x54-0x57 */ + {0x56, 0x2A}, {0x56, 0x2B}, {0x56, 0x2E}, {0x56, 0x2F}, /* 0x58-0x5B */ + {0x56, 0x30}, {0x56, 0x33}, {0x56, 0x35}, {0x56, 0x37}, /* 0x5C-0x5F */ + {0x56, 0x38}, {0x56, 0x3A}, {0x56, 0x3C}, {0x56, 0x3D}, /* 0x60-0x63 */ + {0x56, 0x3E}, {0x56, 0x40}, {0x56, 0x41}, {0x56, 0x42}, /* 0x64-0x67 */ + {0x56, 0x43}, {0x56, 0x44}, {0x56, 0x45}, {0x56, 0x46}, /* 0x68-0x6B */ + {0x56, 0x47}, {0x56, 0x48}, {0x56, 0x49}, {0x56, 0x4A}, /* 0x6C-0x6F */ + {0x56, 0x4B}, {0x56, 0x4F}, {0x56, 0x50}, {0x56, 0x51}, /* 0x70-0x73 */ + {0x56, 0x52}, {0x56, 0x53}, {0x56, 0x55}, {0x56, 0x56}, /* 0x74-0x77 */ + {0x56, 0x5A}, {0x56, 0x5B}, {0x56, 0x5D}, {0x56, 0x5E}, /* 0x78-0x7B */ + {0x56, 0x5F}, {0x56, 0x60}, {0x56, 0x61}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x56, 0x63}, {0x56, 0x65}, {0x56, 0x66}, {0x56, 0x67}, /* 0x80-0x83 */ + {0x56, 0x6D}, {0x56, 0x6E}, {0x56, 0x6F}, {0x56, 0x70}, /* 0x84-0x87 */ + {0x56, 0x72}, {0x56, 0x73}, {0x56, 0x74}, {0x56, 0x75}, /* 0x88-0x8B */ + {0x56, 0x77}, {0x56, 0x78}, {0x56, 0x79}, {0x56, 0x7A}, /* 0x8C-0x8F */ + {0x56, 0x7D}, {0x56, 0x7E}, {0x56, 0x7F}, {0x56, 0x80}, /* 0x90-0x93 */ + {0x56, 0x81}, {0x56, 0x82}, {0x56, 0x83}, {0x56, 0x84}, /* 0x94-0x97 */ + {0x56, 0x87}, {0x56, 0x88}, {0x56, 0x89}, {0x56, 0x8A}, /* 0x98-0x9B */ + {0x56, 0x8B}, {0x56, 0x8C}, {0x56, 0x8D}, {0x56, 0x90}, /* 0x9C-0x9F */ + {0x56, 0x91}, {0x56, 0x92}, {0x56, 0x94}, {0x56, 0x95}, /* 0xA0-0xA3 */ + {0x56, 0x96}, {0x56, 0x97}, {0x56, 0x98}, {0x56, 0x99}, /* 0xA4-0xA7 */ + {0x56, 0x9A}, {0x56, 0x9B}, {0x56, 0x9C}, {0x56, 0x9D}, /* 0xA8-0xAB */ + {0x56, 0x9E}, {0x56, 0x9F}, {0x56, 0xA0}, {0x56, 0xA1}, /* 0xAC-0xAF */ + {0x56, 0xA2}, {0x56, 0xA4}, {0x56, 0xA5}, {0x56, 0xA6}, /* 0xB0-0xB3 */ + {0x56, 0xA7}, {0x56, 0xA8}, {0x56, 0xA9}, {0x56, 0xAA}, /* 0xB4-0xB7 */ + {0x56, 0xAB}, {0x56, 0xAC}, {0x56, 0xAD}, {0x56, 0xAE}, /* 0xB8-0xBB */ + {0x56, 0xB0}, {0x56, 0xB1}, {0x56, 0xB2}, {0x56, 0xB3}, /* 0xBC-0xBF */ + {0x56, 0xB4}, {0x56, 0xB5}, {0x56, 0xB6}, {0x56, 0xB8}, /* 0xC0-0xC3 */ + {0x56, 0xB9}, {0x56, 0xBA}, {0x56, 0xBB}, {0x56, 0xBD}, /* 0xC4-0xC7 */ + {0x56, 0xBE}, {0x56, 0xBF}, {0x56, 0xC0}, {0x56, 0xC1}, /* 0xC8-0xCB */ + {0x56, 0xC2}, {0x56, 0xC3}, {0x56, 0xC4}, {0x56, 0xC5}, /* 0xCC-0xCF */ + {0x56, 0xC6}, {0x56, 0xC7}, {0x56, 0xC8}, {0x56, 0xC9}, /* 0xD0-0xD3 */ + {0x56, 0xCB}, {0x56, 0xCC}, {0x56, 0xCD}, {0x56, 0xCE}, /* 0xD4-0xD7 */ + {0x56, 0xCF}, {0x56, 0xD0}, {0x56, 0xD1}, {0x56, 0xD2}, /* 0xD8-0xDB */ + {0x56, 0xD3}, {0x56, 0xD5}, {0x56, 0xD6}, {0x56, 0xD8}, /* 0xDC-0xDF */ + {0x56, 0xD9}, {0x56, 0xDC}, {0x56, 0xE3}, {0x56, 0xE5}, /* 0xE0-0xE3 */ + {0x56, 0xE6}, {0x56, 0xE7}, {0x56, 0xE8}, {0x56, 0xE9}, /* 0xE4-0xE7 */ + {0x56, 0xEA}, {0x56, 0xEC}, {0x56, 0xEE}, {0x56, 0xEF}, /* 0xE8-0xEB */ + {0x56, 0xF2}, {0x56, 0xF3}, {0x56, 0xF6}, {0x56, 0xF7}, /* 0xEC-0xEF */ + {0x56, 0xF8}, {0x56, 0xFB}, {0x56, 0xFC}, {0x57, 0x00}, /* 0xF0-0xF3 */ + {0x57, 0x01}, {0x57, 0x02}, {0x57, 0x05}, {0x57, 0x07}, /* 0xF4-0xF7 */ + {0x57, 0x0B}, {0x57, 0x0C}, {0x57, 0x0D}, {0x57, 0x0E}, /* 0xF8-0xFB */ + {0x57, 0x0F}, {0x57, 0x10}, {0x57, 0x11}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_88[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x57, 0x12}, {0x57, 0x13}, {0x57, 0x14}, {0x57, 0x15}, /* 0x40-0x43 */ + {0x57, 0x16}, {0x57, 0x17}, {0x57, 0x18}, {0x57, 0x19}, /* 0x44-0x47 */ + {0x57, 0x1A}, {0x57, 0x1B}, {0x57, 0x1D}, {0x57, 0x1E}, /* 0x48-0x4B */ + {0x57, 0x20}, {0x57, 0x21}, {0x57, 0x22}, {0x57, 0x24}, /* 0x4C-0x4F */ + {0x57, 0x25}, {0x57, 0x26}, {0x57, 0x27}, {0x57, 0x2B}, /* 0x50-0x53 */ + {0x57, 0x31}, {0x57, 0x32}, {0x57, 0x34}, {0x57, 0x35}, /* 0x54-0x57 */ + {0x57, 0x36}, {0x57, 0x37}, {0x57, 0x38}, {0x57, 0x3C}, /* 0x58-0x5B */ + {0x57, 0x3D}, {0x57, 0x3F}, {0x57, 0x41}, {0x57, 0x43}, /* 0x5C-0x5F */ + {0x57, 0x44}, {0x57, 0x45}, {0x57, 0x46}, {0x57, 0x48}, /* 0x60-0x63 */ + {0x57, 0x49}, {0x57, 0x4B}, {0x57, 0x52}, {0x57, 0x53}, /* 0x64-0x67 */ + {0x57, 0x54}, {0x57, 0x55}, {0x57, 0x56}, {0x57, 0x58}, /* 0x68-0x6B */ + {0x57, 0x59}, {0x57, 0x62}, {0x57, 0x63}, {0x57, 0x65}, /* 0x6C-0x6F */ + {0x57, 0x67}, {0x57, 0x6C}, {0x57, 0x6E}, {0x57, 0x70}, /* 0x70-0x73 */ + {0x57, 0x71}, {0x57, 0x72}, {0x57, 0x74}, {0x57, 0x75}, /* 0x74-0x77 */ + {0x57, 0x78}, {0x57, 0x79}, {0x57, 0x7A}, {0x57, 0x7D}, /* 0x78-0x7B */ + {0x57, 0x7E}, {0x57, 0x7F}, {0x57, 0x80}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x57, 0x81}, {0x57, 0x87}, {0x57, 0x88}, {0x57, 0x89}, /* 0x80-0x83 */ + {0x57, 0x8A}, {0x57, 0x8D}, {0x57, 0x8E}, {0x57, 0x8F}, /* 0x84-0x87 */ + {0x57, 0x90}, {0x57, 0x91}, {0x57, 0x94}, {0x57, 0x95}, /* 0x88-0x8B */ + {0x57, 0x96}, {0x57, 0x97}, {0x57, 0x98}, {0x57, 0x99}, /* 0x8C-0x8F */ + {0x57, 0x9A}, {0x57, 0x9C}, {0x57, 0x9D}, {0x57, 0x9E}, /* 0x90-0x93 */ + {0x57, 0x9F}, {0x57, 0xA5}, {0x57, 0xA8}, {0x57, 0xAA}, /* 0x94-0x97 */ + {0x57, 0xAC}, {0x57, 0xAF}, {0x57, 0xB0}, {0x57, 0xB1}, /* 0x98-0x9B */ + {0x57, 0xB3}, {0x57, 0xB5}, {0x57, 0xB6}, {0x57, 0xB7}, /* 0x9C-0x9F */ + {0x57, 0xB9}, {0x57, 0xBA}, {0x57, 0xBB}, {0x57, 0xBC}, /* 0xA0-0xA3 */ + {0x57, 0xBD}, {0x57, 0xBE}, {0x57, 0xBF}, {0x57, 0xC0}, /* 0xA4-0xA7 */ + {0x57, 0xC1}, {0x57, 0xC4}, {0x57, 0xC5}, {0x57, 0xC6}, /* 0xA8-0xAB */ + {0x57, 0xC7}, {0x57, 0xC8}, {0x57, 0xC9}, {0x57, 0xCA}, /* 0xAC-0xAF */ + {0x57, 0xCC}, {0x57, 0xCD}, {0x57, 0xD0}, {0x57, 0xD1}, /* 0xB0-0xB3 */ + {0x57, 0xD3}, {0x57, 0xD6}, {0x57, 0xD7}, {0x57, 0xDB}, /* 0xB4-0xB7 */ + {0x57, 0xDC}, {0x57, 0xDE}, {0x57, 0xE1}, {0x57, 0xE2}, /* 0xB8-0xBB */ + {0x57, 0xE3}, {0x57, 0xE5}, {0x57, 0xE6}, {0x57, 0xE7}, /* 0xBC-0xBF */ + {0x57, 0xE8}, {0x57, 0xE9}, {0x57, 0xEA}, {0x57, 0xEB}, /* 0xC0-0xC3 */ + {0x57, 0xEC}, {0x57, 0xEE}, {0x57, 0xF0}, {0x57, 0xF1}, /* 0xC4-0xC7 */ + {0x57, 0xF2}, {0x57, 0xF3}, {0x57, 0xF5}, {0x57, 0xF6}, /* 0xC8-0xCB */ + {0x57, 0xF7}, {0x57, 0xFB}, {0x57, 0xFC}, {0x57, 0xFE}, /* 0xCC-0xCF */ + {0x57, 0xFF}, {0x58, 0x01}, {0x58, 0x03}, {0x58, 0x04}, /* 0xD0-0xD3 */ + {0x58, 0x05}, {0x58, 0x08}, {0x58, 0x09}, {0x58, 0x0A}, /* 0xD4-0xD7 */ + {0x58, 0x0C}, {0x58, 0x0E}, {0x58, 0x0F}, {0x58, 0x10}, /* 0xD8-0xDB */ + {0x58, 0x12}, {0x58, 0x13}, {0x58, 0x14}, {0x58, 0x16}, /* 0xDC-0xDF */ + {0x58, 0x17}, {0x58, 0x18}, {0x58, 0x1A}, {0x58, 0x1B}, /* 0xE0-0xE3 */ + {0x58, 0x1C}, {0x58, 0x1D}, {0x58, 0x1F}, {0x58, 0x22}, /* 0xE4-0xE7 */ + {0x58, 0x23}, {0x58, 0x25}, {0x58, 0x26}, {0x58, 0x27}, /* 0xE8-0xEB */ + {0x58, 0x28}, {0x58, 0x29}, {0x58, 0x2B}, {0x58, 0x2C}, /* 0xEC-0xEF */ + {0x58, 0x2D}, {0x58, 0x2E}, {0x58, 0x2F}, {0x58, 0x31}, /* 0xF0-0xF3 */ + {0x58, 0x32}, {0x58, 0x33}, {0x58, 0x34}, {0x58, 0x36}, /* 0xF4-0xF7 */ + {0x58, 0x37}, {0x58, 0x38}, {0x58, 0x39}, {0x58, 0x3A}, /* 0xF8-0xFB */ + {0x58, 0x3B}, {0x58, 0x3C}, {0x58, 0x3D}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_89[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x58, 0x3E}, {0x58, 0x3F}, {0x58, 0x40}, {0x58, 0x41}, /* 0x40-0x43 */ + {0x58, 0x42}, {0x58, 0x43}, {0x58, 0x45}, {0x58, 0x46}, /* 0x44-0x47 */ + {0x58, 0x47}, {0x58, 0x48}, {0x58, 0x49}, {0x58, 0x4A}, /* 0x48-0x4B */ + {0x58, 0x4B}, {0x58, 0x4E}, {0x58, 0x4F}, {0x58, 0x50}, /* 0x4C-0x4F */ + {0x58, 0x52}, {0x58, 0x53}, {0x58, 0x55}, {0x58, 0x56}, /* 0x50-0x53 */ + {0x58, 0x57}, {0x58, 0x59}, {0x58, 0x5A}, {0x58, 0x5B}, /* 0x54-0x57 */ + {0x58, 0x5C}, {0x58, 0x5D}, {0x58, 0x5F}, {0x58, 0x60}, /* 0x58-0x5B */ + {0x58, 0x61}, {0x58, 0x62}, {0x58, 0x63}, {0x58, 0x64}, /* 0x5C-0x5F */ + {0x58, 0x66}, {0x58, 0x67}, {0x58, 0x68}, {0x58, 0x69}, /* 0x60-0x63 */ + {0x58, 0x6A}, {0x58, 0x6D}, {0x58, 0x6E}, {0x58, 0x6F}, /* 0x64-0x67 */ + {0x58, 0x70}, {0x58, 0x71}, {0x58, 0x72}, {0x58, 0x73}, /* 0x68-0x6B */ + {0x58, 0x74}, {0x58, 0x75}, {0x58, 0x76}, {0x58, 0x77}, /* 0x6C-0x6F */ + {0x58, 0x78}, {0x58, 0x79}, {0x58, 0x7A}, {0x58, 0x7B}, /* 0x70-0x73 */ + {0x58, 0x7C}, {0x58, 0x7D}, {0x58, 0x7F}, {0x58, 0x82}, /* 0x74-0x77 */ + {0x58, 0x84}, {0x58, 0x86}, {0x58, 0x87}, {0x58, 0x88}, /* 0x78-0x7B */ + {0x58, 0x8A}, {0x58, 0x8B}, {0x58, 0x8C}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x58, 0x8D}, {0x58, 0x8E}, {0x58, 0x8F}, {0x58, 0x90}, /* 0x80-0x83 */ + {0x58, 0x91}, {0x58, 0x94}, {0x58, 0x95}, {0x58, 0x96}, /* 0x84-0x87 */ + {0x58, 0x97}, {0x58, 0x98}, {0x58, 0x9B}, {0x58, 0x9C}, /* 0x88-0x8B */ + {0x58, 0x9D}, {0x58, 0xA0}, {0x58, 0xA1}, {0x58, 0xA2}, /* 0x8C-0x8F */ + {0x58, 0xA3}, {0x58, 0xA4}, {0x58, 0xA5}, {0x58, 0xA6}, /* 0x90-0x93 */ + {0x58, 0xA7}, {0x58, 0xAA}, {0x58, 0xAB}, {0x58, 0xAC}, /* 0x94-0x97 */ + {0x58, 0xAD}, {0x58, 0xAE}, {0x58, 0xAF}, {0x58, 0xB0}, /* 0x98-0x9B */ + {0x58, 0xB1}, {0x58, 0xB2}, {0x58, 0xB3}, {0x58, 0xB4}, /* 0x9C-0x9F */ + {0x58, 0xB5}, {0x58, 0xB6}, {0x58, 0xB7}, {0x58, 0xB8}, /* 0xA0-0xA3 */ + {0x58, 0xB9}, {0x58, 0xBA}, {0x58, 0xBB}, {0x58, 0xBD}, /* 0xA4-0xA7 */ + {0x58, 0xBE}, {0x58, 0xBF}, {0x58, 0xC0}, {0x58, 0xC2}, /* 0xA8-0xAB */ + {0x58, 0xC3}, {0x58, 0xC4}, {0x58, 0xC6}, {0x58, 0xC7}, /* 0xAC-0xAF */ + {0x58, 0xC8}, {0x58, 0xC9}, {0x58, 0xCA}, {0x58, 0xCB}, /* 0xB0-0xB3 */ + {0x58, 0xCC}, {0x58, 0xCD}, {0x58, 0xCE}, {0x58, 0xCF}, /* 0xB4-0xB7 */ + {0x58, 0xD0}, {0x58, 0xD2}, {0x58, 0xD3}, {0x58, 0xD4}, /* 0xB8-0xBB */ + {0x58, 0xD6}, {0x58, 0xD7}, {0x58, 0xD8}, {0x58, 0xD9}, /* 0xBC-0xBF */ + {0x58, 0xDA}, {0x58, 0xDB}, {0x58, 0xDC}, {0x58, 0xDD}, /* 0xC0-0xC3 */ + {0x58, 0xDE}, {0x58, 0xDF}, {0x58, 0xE0}, {0x58, 0xE1}, /* 0xC4-0xC7 */ + {0x58, 0xE2}, {0x58, 0xE3}, {0x58, 0xE5}, {0x58, 0xE6}, /* 0xC8-0xCB */ + {0x58, 0xE7}, {0x58, 0xE8}, {0x58, 0xE9}, {0x58, 0xEA}, /* 0xCC-0xCF */ + {0x58, 0xED}, {0x58, 0xEF}, {0x58, 0xF1}, {0x58, 0xF2}, /* 0xD0-0xD3 */ + {0x58, 0xF4}, {0x58, 0xF5}, {0x58, 0xF7}, {0x58, 0xF8}, /* 0xD4-0xD7 */ + {0x58, 0xFA}, {0x58, 0xFB}, {0x58, 0xFC}, {0x58, 0xFD}, /* 0xD8-0xDB */ + {0x58, 0xFE}, {0x58, 0xFF}, {0x59, 0x00}, {0x59, 0x01}, /* 0xDC-0xDF */ + {0x59, 0x03}, {0x59, 0x05}, {0x59, 0x06}, {0x59, 0x08}, /* 0xE0-0xE3 */ + {0x59, 0x09}, {0x59, 0x0A}, {0x59, 0x0B}, {0x59, 0x0C}, /* 0xE4-0xE7 */ + {0x59, 0x0E}, {0x59, 0x10}, {0x59, 0x11}, {0x59, 0x12}, /* 0xE8-0xEB */ + {0x59, 0x13}, {0x59, 0x17}, {0x59, 0x18}, {0x59, 0x1B}, /* 0xEC-0xEF */ + {0x59, 0x1D}, {0x59, 0x1E}, {0x59, 0x20}, {0x59, 0x21}, /* 0xF0-0xF3 */ + {0x59, 0x22}, {0x59, 0x23}, {0x59, 0x26}, {0x59, 0x28}, /* 0xF4-0xF7 */ + {0x59, 0x2C}, {0x59, 0x30}, {0x59, 0x32}, {0x59, 0x33}, /* 0xF8-0xFB */ + {0x59, 0x35}, {0x59, 0x36}, {0x59, 0x3B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8A[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x59, 0x3D}, {0x59, 0x3E}, {0x59, 0x3F}, {0x59, 0x40}, /* 0x40-0x43 */ + {0x59, 0x43}, {0x59, 0x45}, {0x59, 0x46}, {0x59, 0x4A}, /* 0x44-0x47 */ + {0x59, 0x4C}, {0x59, 0x4D}, {0x59, 0x50}, {0x59, 0x52}, /* 0x48-0x4B */ + {0x59, 0x53}, {0x59, 0x59}, {0x59, 0x5B}, {0x59, 0x5C}, /* 0x4C-0x4F */ + {0x59, 0x5D}, {0x59, 0x5E}, {0x59, 0x5F}, {0x59, 0x61}, /* 0x50-0x53 */ + {0x59, 0x63}, {0x59, 0x64}, {0x59, 0x66}, {0x59, 0x67}, /* 0x54-0x57 */ + {0x59, 0x68}, {0x59, 0x69}, {0x59, 0x6A}, {0x59, 0x6B}, /* 0x58-0x5B */ + {0x59, 0x6C}, {0x59, 0x6D}, {0x59, 0x6E}, {0x59, 0x6F}, /* 0x5C-0x5F */ + {0x59, 0x70}, {0x59, 0x71}, {0x59, 0x72}, {0x59, 0x75}, /* 0x60-0x63 */ + {0x59, 0x77}, {0x59, 0x7A}, {0x59, 0x7B}, {0x59, 0x7C}, /* 0x64-0x67 */ + {0x59, 0x7E}, {0x59, 0x7F}, {0x59, 0x80}, {0x59, 0x85}, /* 0x68-0x6B */ + {0x59, 0x89}, {0x59, 0x8B}, {0x59, 0x8C}, {0x59, 0x8E}, /* 0x6C-0x6F */ + {0x59, 0x8F}, {0x59, 0x90}, {0x59, 0x91}, {0x59, 0x94}, /* 0x70-0x73 */ + {0x59, 0x95}, {0x59, 0x98}, {0x59, 0x9A}, {0x59, 0x9B}, /* 0x74-0x77 */ + {0x59, 0x9C}, {0x59, 0x9D}, {0x59, 0x9F}, {0x59, 0xA0}, /* 0x78-0x7B */ + {0x59, 0xA1}, {0x59, 0xA2}, {0x59, 0xA6}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x59, 0xA7}, {0x59, 0xAC}, {0x59, 0xAD}, {0x59, 0xB0}, /* 0x80-0x83 */ + {0x59, 0xB1}, {0x59, 0xB3}, {0x59, 0xB4}, {0x59, 0xB5}, /* 0x84-0x87 */ + {0x59, 0xB6}, {0x59, 0xB7}, {0x59, 0xB8}, {0x59, 0xBA}, /* 0x88-0x8B */ + {0x59, 0xBC}, {0x59, 0xBD}, {0x59, 0xBF}, {0x59, 0xC0}, /* 0x8C-0x8F */ + {0x59, 0xC1}, {0x59, 0xC2}, {0x59, 0xC3}, {0x59, 0xC4}, /* 0x90-0x93 */ + {0x59, 0xC5}, {0x59, 0xC7}, {0x59, 0xC8}, {0x59, 0xC9}, /* 0x94-0x97 */ + {0x59, 0xCC}, {0x59, 0xCD}, {0x59, 0xCE}, {0x59, 0xCF}, /* 0x98-0x9B */ + {0x59, 0xD5}, {0x59, 0xD6}, {0x59, 0xD9}, {0x59, 0xDB}, /* 0x9C-0x9F */ + {0x59, 0xDE}, {0x59, 0xDF}, {0x59, 0xE0}, {0x59, 0xE1}, /* 0xA0-0xA3 */ + {0x59, 0xE2}, {0x59, 0xE4}, {0x59, 0xE6}, {0x59, 0xE7}, /* 0xA4-0xA7 */ + {0x59, 0xE9}, {0x59, 0xEA}, {0x59, 0xEB}, {0x59, 0xED}, /* 0xA8-0xAB */ + {0x59, 0xEE}, {0x59, 0xEF}, {0x59, 0xF0}, {0x59, 0xF1}, /* 0xAC-0xAF */ + {0x59, 0xF2}, {0x59, 0xF3}, {0x59, 0xF4}, {0x59, 0xF5}, /* 0xB0-0xB3 */ + {0x59, 0xF6}, {0x59, 0xF7}, {0x59, 0xF8}, {0x59, 0xFA}, /* 0xB4-0xB7 */ + {0x59, 0xFC}, {0x59, 0xFD}, {0x59, 0xFE}, {0x5A, 0x00}, /* 0xB8-0xBB */ + {0x5A, 0x02}, {0x5A, 0x0A}, {0x5A, 0x0B}, {0x5A, 0x0D}, /* 0xBC-0xBF */ + {0x5A, 0x0E}, {0x5A, 0x0F}, {0x5A, 0x10}, {0x5A, 0x12}, /* 0xC0-0xC3 */ + {0x5A, 0x14}, {0x5A, 0x15}, {0x5A, 0x16}, {0x5A, 0x17}, /* 0xC4-0xC7 */ + {0x5A, 0x19}, {0x5A, 0x1A}, {0x5A, 0x1B}, {0x5A, 0x1D}, /* 0xC8-0xCB */ + {0x5A, 0x1E}, {0x5A, 0x21}, {0x5A, 0x22}, {0x5A, 0x24}, /* 0xCC-0xCF */ + {0x5A, 0x26}, {0x5A, 0x27}, {0x5A, 0x28}, {0x5A, 0x2A}, /* 0xD0-0xD3 */ + {0x5A, 0x2B}, {0x5A, 0x2C}, {0x5A, 0x2D}, {0x5A, 0x2E}, /* 0xD4-0xD7 */ + {0x5A, 0x2F}, {0x5A, 0x30}, {0x5A, 0x33}, {0x5A, 0x35}, /* 0xD8-0xDB */ + {0x5A, 0x37}, {0x5A, 0x38}, {0x5A, 0x39}, {0x5A, 0x3A}, /* 0xDC-0xDF */ + {0x5A, 0x3B}, {0x5A, 0x3D}, {0x5A, 0x3E}, {0x5A, 0x3F}, /* 0xE0-0xE3 */ + {0x5A, 0x41}, {0x5A, 0x42}, {0x5A, 0x43}, {0x5A, 0x44}, /* 0xE4-0xE7 */ + {0x5A, 0x45}, {0x5A, 0x47}, {0x5A, 0x48}, {0x5A, 0x4B}, /* 0xE8-0xEB */ + {0x5A, 0x4C}, {0x5A, 0x4D}, {0x5A, 0x4E}, {0x5A, 0x4F}, /* 0xEC-0xEF */ + {0x5A, 0x50}, {0x5A, 0x51}, {0x5A, 0x52}, {0x5A, 0x53}, /* 0xF0-0xF3 */ + {0x5A, 0x54}, {0x5A, 0x56}, {0x5A, 0x57}, {0x5A, 0x58}, /* 0xF4-0xF7 */ + {0x5A, 0x59}, {0x5A, 0x5B}, {0x5A, 0x5C}, {0x5A, 0x5D}, /* 0xF8-0xFB */ + {0x5A, 0x5E}, {0x5A, 0x5F}, {0x5A, 0x60}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8B[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5A, 0x61}, {0x5A, 0x63}, {0x5A, 0x64}, {0x5A, 0x65}, /* 0x40-0x43 */ + {0x5A, 0x66}, {0x5A, 0x68}, {0x5A, 0x69}, {0x5A, 0x6B}, /* 0x44-0x47 */ + {0x5A, 0x6C}, {0x5A, 0x6D}, {0x5A, 0x6E}, {0x5A, 0x6F}, /* 0x48-0x4B */ + {0x5A, 0x70}, {0x5A, 0x71}, {0x5A, 0x72}, {0x5A, 0x73}, /* 0x4C-0x4F */ + {0x5A, 0x78}, {0x5A, 0x79}, {0x5A, 0x7B}, {0x5A, 0x7C}, /* 0x50-0x53 */ + {0x5A, 0x7D}, {0x5A, 0x7E}, {0x5A, 0x80}, {0x5A, 0x81}, /* 0x54-0x57 */ + {0x5A, 0x82}, {0x5A, 0x83}, {0x5A, 0x84}, {0x5A, 0x85}, /* 0x58-0x5B */ + {0x5A, 0x86}, {0x5A, 0x87}, {0x5A, 0x88}, {0x5A, 0x89}, /* 0x5C-0x5F */ + {0x5A, 0x8A}, {0x5A, 0x8B}, {0x5A, 0x8C}, {0x5A, 0x8D}, /* 0x60-0x63 */ + {0x5A, 0x8E}, {0x5A, 0x8F}, {0x5A, 0x90}, {0x5A, 0x91}, /* 0x64-0x67 */ + {0x5A, 0x93}, {0x5A, 0x94}, {0x5A, 0x95}, {0x5A, 0x96}, /* 0x68-0x6B */ + {0x5A, 0x97}, {0x5A, 0x98}, {0x5A, 0x99}, {0x5A, 0x9C}, /* 0x6C-0x6F */ + {0x5A, 0x9D}, {0x5A, 0x9E}, {0x5A, 0x9F}, {0x5A, 0xA0}, /* 0x70-0x73 */ + {0x5A, 0xA1}, {0x5A, 0xA2}, {0x5A, 0xA3}, {0x5A, 0xA4}, /* 0x74-0x77 */ + {0x5A, 0xA5}, {0x5A, 0xA6}, {0x5A, 0xA7}, {0x5A, 0xA8}, /* 0x78-0x7B */ + {0x5A, 0xA9}, {0x5A, 0xAB}, {0x5A, 0xAC}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x5A, 0xAD}, {0x5A, 0xAE}, {0x5A, 0xAF}, {0x5A, 0xB0}, /* 0x80-0x83 */ + {0x5A, 0xB1}, {0x5A, 0xB4}, {0x5A, 0xB6}, {0x5A, 0xB7}, /* 0x84-0x87 */ + {0x5A, 0xB9}, {0x5A, 0xBA}, {0x5A, 0xBB}, {0x5A, 0xBC}, /* 0x88-0x8B */ + {0x5A, 0xBD}, {0x5A, 0xBF}, {0x5A, 0xC0}, {0x5A, 0xC3}, /* 0x8C-0x8F */ + {0x5A, 0xC4}, {0x5A, 0xC5}, {0x5A, 0xC6}, {0x5A, 0xC7}, /* 0x90-0x93 */ + {0x5A, 0xC8}, {0x5A, 0xCA}, {0x5A, 0xCB}, {0x5A, 0xCD}, /* 0x94-0x97 */ + {0x5A, 0xCE}, {0x5A, 0xCF}, {0x5A, 0xD0}, {0x5A, 0xD1}, /* 0x98-0x9B */ + {0x5A, 0xD3}, {0x5A, 0xD5}, {0x5A, 0xD7}, {0x5A, 0xD9}, /* 0x9C-0x9F */ + {0x5A, 0xDA}, {0x5A, 0xDB}, {0x5A, 0xDD}, {0x5A, 0xDE}, /* 0xA0-0xA3 */ + {0x5A, 0xDF}, {0x5A, 0xE2}, {0x5A, 0xE4}, {0x5A, 0xE5}, /* 0xA4-0xA7 */ + {0x5A, 0xE7}, {0x5A, 0xE8}, {0x5A, 0xEA}, {0x5A, 0xEC}, /* 0xA8-0xAB */ + {0x5A, 0xED}, {0x5A, 0xEE}, {0x5A, 0xEF}, {0x5A, 0xF0}, /* 0xAC-0xAF */ + {0x5A, 0xF2}, {0x5A, 0xF3}, {0x5A, 0xF4}, {0x5A, 0xF5}, /* 0xB0-0xB3 */ + {0x5A, 0xF6}, {0x5A, 0xF7}, {0x5A, 0xF8}, {0x5A, 0xF9}, /* 0xB4-0xB7 */ + {0x5A, 0xFA}, {0x5A, 0xFB}, {0x5A, 0xFC}, {0x5A, 0xFD}, /* 0xB8-0xBB */ + {0x5A, 0xFE}, {0x5A, 0xFF}, {0x5B, 0x00}, {0x5B, 0x01}, /* 0xBC-0xBF */ + {0x5B, 0x02}, {0x5B, 0x03}, {0x5B, 0x04}, {0x5B, 0x05}, /* 0xC0-0xC3 */ + {0x5B, 0x06}, {0x5B, 0x07}, {0x5B, 0x08}, {0x5B, 0x0A}, /* 0xC4-0xC7 */ + {0x5B, 0x0B}, {0x5B, 0x0C}, {0x5B, 0x0D}, {0x5B, 0x0E}, /* 0xC8-0xCB */ + {0x5B, 0x0F}, {0x5B, 0x10}, {0x5B, 0x11}, {0x5B, 0x12}, /* 0xCC-0xCF */ + {0x5B, 0x13}, {0x5B, 0x14}, {0x5B, 0x15}, {0x5B, 0x18}, /* 0xD0-0xD3 */ + {0x5B, 0x19}, {0x5B, 0x1A}, {0x5B, 0x1B}, {0x5B, 0x1C}, /* 0xD4-0xD7 */ + {0x5B, 0x1D}, {0x5B, 0x1E}, {0x5B, 0x1F}, {0x5B, 0x20}, /* 0xD8-0xDB */ + {0x5B, 0x21}, {0x5B, 0x22}, {0x5B, 0x23}, {0x5B, 0x24}, /* 0xDC-0xDF */ + {0x5B, 0x25}, {0x5B, 0x26}, {0x5B, 0x27}, {0x5B, 0x28}, /* 0xE0-0xE3 */ + {0x5B, 0x29}, {0x5B, 0x2A}, {0x5B, 0x2B}, {0x5B, 0x2C}, /* 0xE4-0xE7 */ + {0x5B, 0x2D}, {0x5B, 0x2E}, {0x5B, 0x2F}, {0x5B, 0x30}, /* 0xE8-0xEB */ + {0x5B, 0x31}, {0x5B, 0x33}, {0x5B, 0x35}, {0x5B, 0x36}, /* 0xEC-0xEF */ + {0x5B, 0x38}, {0x5B, 0x39}, {0x5B, 0x3A}, {0x5B, 0x3B}, /* 0xF0-0xF3 */ + {0x5B, 0x3C}, {0x5B, 0x3D}, {0x5B, 0x3E}, {0x5B, 0x3F}, /* 0xF4-0xF7 */ + {0x5B, 0x41}, {0x5B, 0x42}, {0x5B, 0x43}, {0x5B, 0x44}, /* 0xF8-0xFB */ + {0x5B, 0x45}, {0x5B, 0x46}, {0x5B, 0x47}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8C[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5B, 0x48}, {0x5B, 0x49}, {0x5B, 0x4A}, {0x5B, 0x4B}, /* 0x40-0x43 */ + {0x5B, 0x4C}, {0x5B, 0x4D}, {0x5B, 0x4E}, {0x5B, 0x4F}, /* 0x44-0x47 */ + {0x5B, 0x52}, {0x5B, 0x56}, {0x5B, 0x5E}, {0x5B, 0x60}, /* 0x48-0x4B */ + {0x5B, 0x61}, {0x5B, 0x67}, {0x5B, 0x68}, {0x5B, 0x6B}, /* 0x4C-0x4F */ + {0x5B, 0x6D}, {0x5B, 0x6E}, {0x5B, 0x6F}, {0x5B, 0x72}, /* 0x50-0x53 */ + {0x5B, 0x74}, {0x5B, 0x76}, {0x5B, 0x77}, {0x5B, 0x78}, /* 0x54-0x57 */ + {0x5B, 0x79}, {0x5B, 0x7B}, {0x5B, 0x7C}, {0x5B, 0x7E}, /* 0x58-0x5B */ + {0x5B, 0x7F}, {0x5B, 0x82}, {0x5B, 0x86}, {0x5B, 0x8A}, /* 0x5C-0x5F */ + {0x5B, 0x8D}, {0x5B, 0x8E}, {0x5B, 0x90}, {0x5B, 0x91}, /* 0x60-0x63 */ + {0x5B, 0x92}, {0x5B, 0x94}, {0x5B, 0x96}, {0x5B, 0x9F}, /* 0x64-0x67 */ + {0x5B, 0xA7}, {0x5B, 0xA8}, {0x5B, 0xA9}, {0x5B, 0xAC}, /* 0x68-0x6B */ + {0x5B, 0xAD}, {0x5B, 0xAE}, {0x5B, 0xAF}, {0x5B, 0xB1}, /* 0x6C-0x6F */ + {0x5B, 0xB2}, {0x5B, 0xB7}, {0x5B, 0xBA}, {0x5B, 0xBB}, /* 0x70-0x73 */ + {0x5B, 0xBC}, {0x5B, 0xC0}, {0x5B, 0xC1}, {0x5B, 0xC3}, /* 0x74-0x77 */ + {0x5B, 0xC8}, {0x5B, 0xC9}, {0x5B, 0xCA}, {0x5B, 0xCB}, /* 0x78-0x7B */ + {0x5B, 0xCD}, {0x5B, 0xCE}, {0x5B, 0xCF}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x5B, 0xD1}, {0x5B, 0xD4}, {0x5B, 0xD5}, {0x5B, 0xD6}, /* 0x80-0x83 */ + {0x5B, 0xD7}, {0x5B, 0xD8}, {0x5B, 0xD9}, {0x5B, 0xDA}, /* 0x84-0x87 */ + {0x5B, 0xDB}, {0x5B, 0xDC}, {0x5B, 0xE0}, {0x5B, 0xE2}, /* 0x88-0x8B */ + {0x5B, 0xE3}, {0x5B, 0xE6}, {0x5B, 0xE7}, {0x5B, 0xE9}, /* 0x8C-0x8F */ + {0x5B, 0xEA}, {0x5B, 0xEB}, {0x5B, 0xEC}, {0x5B, 0xED}, /* 0x90-0x93 */ + {0x5B, 0xEF}, {0x5B, 0xF1}, {0x5B, 0xF2}, {0x5B, 0xF3}, /* 0x94-0x97 */ + {0x5B, 0xF4}, {0x5B, 0xF5}, {0x5B, 0xF6}, {0x5B, 0xF7}, /* 0x98-0x9B */ + {0x5B, 0xFD}, {0x5B, 0xFE}, {0x5C, 0x00}, {0x5C, 0x02}, /* 0x9C-0x9F */ + {0x5C, 0x03}, {0x5C, 0x05}, {0x5C, 0x07}, {0x5C, 0x08}, /* 0xA0-0xA3 */ + {0x5C, 0x0B}, {0x5C, 0x0C}, {0x5C, 0x0D}, {0x5C, 0x0E}, /* 0xA4-0xA7 */ + {0x5C, 0x10}, {0x5C, 0x12}, {0x5C, 0x13}, {0x5C, 0x17}, /* 0xA8-0xAB */ + {0x5C, 0x19}, {0x5C, 0x1B}, {0x5C, 0x1E}, {0x5C, 0x1F}, /* 0xAC-0xAF */ + {0x5C, 0x20}, {0x5C, 0x21}, {0x5C, 0x23}, {0x5C, 0x26}, /* 0xB0-0xB3 */ + {0x5C, 0x28}, {0x5C, 0x29}, {0x5C, 0x2A}, {0x5C, 0x2B}, /* 0xB4-0xB7 */ + {0x5C, 0x2D}, {0x5C, 0x2E}, {0x5C, 0x2F}, {0x5C, 0x30}, /* 0xB8-0xBB */ + {0x5C, 0x32}, {0x5C, 0x33}, {0x5C, 0x35}, {0x5C, 0x36}, /* 0xBC-0xBF */ + {0x5C, 0x37}, {0x5C, 0x43}, {0x5C, 0x44}, {0x5C, 0x46}, /* 0xC0-0xC3 */ + {0x5C, 0x47}, {0x5C, 0x4C}, {0x5C, 0x4D}, {0x5C, 0x52}, /* 0xC4-0xC7 */ + {0x5C, 0x53}, {0x5C, 0x54}, {0x5C, 0x56}, {0x5C, 0x57}, /* 0xC8-0xCB */ + {0x5C, 0x58}, {0x5C, 0x5A}, {0x5C, 0x5B}, {0x5C, 0x5C}, /* 0xCC-0xCF */ + {0x5C, 0x5D}, {0x5C, 0x5F}, {0x5C, 0x62}, {0x5C, 0x64}, /* 0xD0-0xD3 */ + {0x5C, 0x67}, {0x5C, 0x68}, {0x5C, 0x69}, {0x5C, 0x6A}, /* 0xD4-0xD7 */ + {0x5C, 0x6B}, {0x5C, 0x6C}, {0x5C, 0x6D}, {0x5C, 0x70}, /* 0xD8-0xDB */ + {0x5C, 0x72}, {0x5C, 0x73}, {0x5C, 0x74}, {0x5C, 0x75}, /* 0xDC-0xDF */ + {0x5C, 0x76}, {0x5C, 0x77}, {0x5C, 0x78}, {0x5C, 0x7B}, /* 0xE0-0xE3 */ + {0x5C, 0x7C}, {0x5C, 0x7D}, {0x5C, 0x7E}, {0x5C, 0x80}, /* 0xE4-0xE7 */ + {0x5C, 0x83}, {0x5C, 0x84}, {0x5C, 0x85}, {0x5C, 0x86}, /* 0xE8-0xEB */ + {0x5C, 0x87}, {0x5C, 0x89}, {0x5C, 0x8A}, {0x5C, 0x8B}, /* 0xEC-0xEF */ + {0x5C, 0x8E}, {0x5C, 0x8F}, {0x5C, 0x92}, {0x5C, 0x93}, /* 0xF0-0xF3 */ + {0x5C, 0x95}, {0x5C, 0x9D}, {0x5C, 0x9E}, {0x5C, 0x9F}, /* 0xF4-0xF7 */ + {0x5C, 0xA0}, {0x5C, 0xA1}, {0x5C, 0xA4}, {0x5C, 0xA5}, /* 0xF8-0xFB */ + {0x5C, 0xA6}, {0x5C, 0xA7}, {0x5C, 0xA8}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8D[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5C, 0xAA}, {0x5C, 0xAE}, {0x5C, 0xAF}, {0x5C, 0xB0}, /* 0x40-0x43 */ + {0x5C, 0xB2}, {0x5C, 0xB4}, {0x5C, 0xB6}, {0x5C, 0xB9}, /* 0x44-0x47 */ + {0x5C, 0xBA}, {0x5C, 0xBB}, {0x5C, 0xBC}, {0x5C, 0xBE}, /* 0x48-0x4B */ + {0x5C, 0xC0}, {0x5C, 0xC2}, {0x5C, 0xC3}, {0x5C, 0xC5}, /* 0x4C-0x4F */ + {0x5C, 0xC6}, {0x5C, 0xC7}, {0x5C, 0xC8}, {0x5C, 0xC9}, /* 0x50-0x53 */ + {0x5C, 0xCA}, {0x5C, 0xCC}, {0x5C, 0xCD}, {0x5C, 0xCE}, /* 0x54-0x57 */ + {0x5C, 0xCF}, {0x5C, 0xD0}, {0x5C, 0xD1}, {0x5C, 0xD3}, /* 0x58-0x5B */ + {0x5C, 0xD4}, {0x5C, 0xD5}, {0x5C, 0xD6}, {0x5C, 0xD7}, /* 0x5C-0x5F */ + {0x5C, 0xD8}, {0x5C, 0xDA}, {0x5C, 0xDB}, {0x5C, 0xDC}, /* 0x60-0x63 */ + {0x5C, 0xDD}, {0x5C, 0xDE}, {0x5C, 0xDF}, {0x5C, 0xE0}, /* 0x64-0x67 */ + {0x5C, 0xE2}, {0x5C, 0xE3}, {0x5C, 0xE7}, {0x5C, 0xE9}, /* 0x68-0x6B */ + {0x5C, 0xEB}, {0x5C, 0xEC}, {0x5C, 0xEE}, {0x5C, 0xEF}, /* 0x6C-0x6F */ + {0x5C, 0xF1}, {0x5C, 0xF2}, {0x5C, 0xF3}, {0x5C, 0xF4}, /* 0x70-0x73 */ + {0x5C, 0xF5}, {0x5C, 0xF6}, {0x5C, 0xF7}, {0x5C, 0xF8}, /* 0x74-0x77 */ + {0x5C, 0xF9}, {0x5C, 0xFA}, {0x5C, 0xFC}, {0x5C, 0xFD}, /* 0x78-0x7B */ + {0x5C, 0xFE}, {0x5C, 0xFF}, {0x5D, 0x00}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x5D, 0x01}, {0x5D, 0x04}, {0x5D, 0x05}, {0x5D, 0x08}, /* 0x80-0x83 */ + {0x5D, 0x09}, {0x5D, 0x0A}, {0x5D, 0x0B}, {0x5D, 0x0C}, /* 0x84-0x87 */ + {0x5D, 0x0D}, {0x5D, 0x0F}, {0x5D, 0x10}, {0x5D, 0x11}, /* 0x88-0x8B */ + {0x5D, 0x12}, {0x5D, 0x13}, {0x5D, 0x15}, {0x5D, 0x17}, /* 0x8C-0x8F */ + {0x5D, 0x18}, {0x5D, 0x19}, {0x5D, 0x1A}, {0x5D, 0x1C}, /* 0x90-0x93 */ + {0x5D, 0x1D}, {0x5D, 0x1F}, {0x5D, 0x20}, {0x5D, 0x21}, /* 0x94-0x97 */ + {0x5D, 0x22}, {0x5D, 0x23}, {0x5D, 0x25}, {0x5D, 0x28}, /* 0x98-0x9B */ + {0x5D, 0x2A}, {0x5D, 0x2B}, {0x5D, 0x2C}, {0x5D, 0x2F}, /* 0x9C-0x9F */ + {0x5D, 0x30}, {0x5D, 0x31}, {0x5D, 0x32}, {0x5D, 0x33}, /* 0xA0-0xA3 */ + {0x5D, 0x35}, {0x5D, 0x36}, {0x5D, 0x37}, {0x5D, 0x38}, /* 0xA4-0xA7 */ + {0x5D, 0x39}, {0x5D, 0x3A}, {0x5D, 0x3B}, {0x5D, 0x3C}, /* 0xA8-0xAB */ + {0x5D, 0x3F}, {0x5D, 0x40}, {0x5D, 0x41}, {0x5D, 0x42}, /* 0xAC-0xAF */ + {0x5D, 0x43}, {0x5D, 0x44}, {0x5D, 0x45}, {0x5D, 0x46}, /* 0xB0-0xB3 */ + {0x5D, 0x48}, {0x5D, 0x49}, {0x5D, 0x4D}, {0x5D, 0x4E}, /* 0xB4-0xB7 */ + {0x5D, 0x4F}, {0x5D, 0x50}, {0x5D, 0x51}, {0x5D, 0x52}, /* 0xB8-0xBB */ + {0x5D, 0x53}, {0x5D, 0x54}, {0x5D, 0x55}, {0x5D, 0x56}, /* 0xBC-0xBF */ + {0x5D, 0x57}, {0x5D, 0x59}, {0x5D, 0x5A}, {0x5D, 0x5C}, /* 0xC0-0xC3 */ + {0x5D, 0x5E}, {0x5D, 0x5F}, {0x5D, 0x60}, {0x5D, 0x61}, /* 0xC4-0xC7 */ + {0x5D, 0x62}, {0x5D, 0x63}, {0x5D, 0x64}, {0x5D, 0x65}, /* 0xC8-0xCB */ + {0x5D, 0x66}, {0x5D, 0x67}, {0x5D, 0x68}, {0x5D, 0x6A}, /* 0xCC-0xCF */ + {0x5D, 0x6D}, {0x5D, 0x6E}, {0x5D, 0x70}, {0x5D, 0x71}, /* 0xD0-0xD3 */ + {0x5D, 0x72}, {0x5D, 0x73}, {0x5D, 0x75}, {0x5D, 0x76}, /* 0xD4-0xD7 */ + {0x5D, 0x77}, {0x5D, 0x78}, {0x5D, 0x79}, {0x5D, 0x7A}, /* 0xD8-0xDB */ + {0x5D, 0x7B}, {0x5D, 0x7C}, {0x5D, 0x7D}, {0x5D, 0x7E}, /* 0xDC-0xDF */ + {0x5D, 0x7F}, {0x5D, 0x80}, {0x5D, 0x81}, {0x5D, 0x83}, /* 0xE0-0xE3 */ + {0x5D, 0x84}, {0x5D, 0x85}, {0x5D, 0x86}, {0x5D, 0x87}, /* 0xE4-0xE7 */ + {0x5D, 0x88}, {0x5D, 0x89}, {0x5D, 0x8A}, {0x5D, 0x8B}, /* 0xE8-0xEB */ + {0x5D, 0x8C}, {0x5D, 0x8D}, {0x5D, 0x8E}, {0x5D, 0x8F}, /* 0xEC-0xEF */ + {0x5D, 0x90}, {0x5D, 0x91}, {0x5D, 0x92}, {0x5D, 0x93}, /* 0xF0-0xF3 */ + {0x5D, 0x94}, {0x5D, 0x95}, {0x5D, 0x96}, {0x5D, 0x97}, /* 0xF4-0xF7 */ + {0x5D, 0x98}, {0x5D, 0x9A}, {0x5D, 0x9B}, {0x5D, 0x9C}, /* 0xF8-0xFB */ + {0x5D, 0x9E}, {0x5D, 0x9F}, {0x5D, 0xA0}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8E[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5D, 0xA1}, {0x5D, 0xA2}, {0x5D, 0xA3}, {0x5D, 0xA4}, /* 0x40-0x43 */ + {0x5D, 0xA5}, {0x5D, 0xA6}, {0x5D, 0xA7}, {0x5D, 0xA8}, /* 0x44-0x47 */ + {0x5D, 0xA9}, {0x5D, 0xAA}, {0x5D, 0xAB}, {0x5D, 0xAC}, /* 0x48-0x4B */ + {0x5D, 0xAD}, {0x5D, 0xAE}, {0x5D, 0xAF}, {0x5D, 0xB0}, /* 0x4C-0x4F */ + {0x5D, 0xB1}, {0x5D, 0xB2}, {0x5D, 0xB3}, {0x5D, 0xB4}, /* 0x50-0x53 */ + {0x5D, 0xB5}, {0x5D, 0xB6}, {0x5D, 0xB8}, {0x5D, 0xB9}, /* 0x54-0x57 */ + {0x5D, 0xBA}, {0x5D, 0xBB}, {0x5D, 0xBC}, {0x5D, 0xBD}, /* 0x58-0x5B */ + {0x5D, 0xBE}, {0x5D, 0xBF}, {0x5D, 0xC0}, {0x5D, 0xC1}, /* 0x5C-0x5F */ + {0x5D, 0xC2}, {0x5D, 0xC3}, {0x5D, 0xC4}, {0x5D, 0xC6}, /* 0x60-0x63 */ + {0x5D, 0xC7}, {0x5D, 0xC8}, {0x5D, 0xC9}, {0x5D, 0xCA}, /* 0x64-0x67 */ + {0x5D, 0xCB}, {0x5D, 0xCC}, {0x5D, 0xCE}, {0x5D, 0xCF}, /* 0x68-0x6B */ + {0x5D, 0xD0}, {0x5D, 0xD1}, {0x5D, 0xD2}, {0x5D, 0xD3}, /* 0x6C-0x6F */ + {0x5D, 0xD4}, {0x5D, 0xD5}, {0x5D, 0xD6}, {0x5D, 0xD7}, /* 0x70-0x73 */ + {0x5D, 0xD8}, {0x5D, 0xD9}, {0x5D, 0xDA}, {0x5D, 0xDC}, /* 0x74-0x77 */ + {0x5D, 0xDF}, {0x5D, 0xE0}, {0x5D, 0xE3}, {0x5D, 0xE4}, /* 0x78-0x7B */ + {0x5D, 0xEA}, {0x5D, 0xEC}, {0x5D, 0xED}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x5D, 0xF0}, {0x5D, 0xF5}, {0x5D, 0xF6}, {0x5D, 0xF8}, /* 0x80-0x83 */ + {0x5D, 0xF9}, {0x5D, 0xFA}, {0x5D, 0xFB}, {0x5D, 0xFC}, /* 0x84-0x87 */ + {0x5D, 0xFF}, {0x5E, 0x00}, {0x5E, 0x04}, {0x5E, 0x07}, /* 0x88-0x8B */ + {0x5E, 0x09}, {0x5E, 0x0A}, {0x5E, 0x0B}, {0x5E, 0x0D}, /* 0x8C-0x8F */ + {0x5E, 0x0E}, {0x5E, 0x12}, {0x5E, 0x13}, {0x5E, 0x17}, /* 0x90-0x93 */ + {0x5E, 0x1E}, {0x5E, 0x1F}, {0x5E, 0x20}, {0x5E, 0x21}, /* 0x94-0x97 */ + {0x5E, 0x22}, {0x5E, 0x23}, {0x5E, 0x24}, {0x5E, 0x25}, /* 0x98-0x9B */ + {0x5E, 0x28}, {0x5E, 0x29}, {0x5E, 0x2A}, {0x5E, 0x2B}, /* 0x9C-0x9F */ + {0x5E, 0x2C}, {0x5E, 0x2F}, {0x5E, 0x30}, {0x5E, 0x32}, /* 0xA0-0xA3 */ + {0x5E, 0x33}, {0x5E, 0x34}, {0x5E, 0x35}, {0x5E, 0x36}, /* 0xA4-0xA7 */ + {0x5E, 0x39}, {0x5E, 0x3A}, {0x5E, 0x3E}, {0x5E, 0x3F}, /* 0xA8-0xAB */ + {0x5E, 0x40}, {0x5E, 0x41}, {0x5E, 0x43}, {0x5E, 0x46}, /* 0xAC-0xAF */ + {0x5E, 0x47}, {0x5E, 0x48}, {0x5E, 0x49}, {0x5E, 0x4A}, /* 0xB0-0xB3 */ + {0x5E, 0x4B}, {0x5E, 0x4D}, {0x5E, 0x4E}, {0x5E, 0x4F}, /* 0xB4-0xB7 */ + {0x5E, 0x50}, {0x5E, 0x51}, {0x5E, 0x52}, {0x5E, 0x53}, /* 0xB8-0xBB */ + {0x5E, 0x56}, {0x5E, 0x57}, {0x5E, 0x58}, {0x5E, 0x59}, /* 0xBC-0xBF */ + {0x5E, 0x5A}, {0x5E, 0x5C}, {0x5E, 0x5D}, {0x5E, 0x5F}, /* 0xC0-0xC3 */ + {0x5E, 0x60}, {0x5E, 0x63}, {0x5E, 0x64}, {0x5E, 0x65}, /* 0xC4-0xC7 */ + {0x5E, 0x66}, {0x5E, 0x67}, {0x5E, 0x68}, {0x5E, 0x69}, /* 0xC8-0xCB */ + {0x5E, 0x6A}, {0x5E, 0x6B}, {0x5E, 0x6C}, {0x5E, 0x6D}, /* 0xCC-0xCF */ + {0x5E, 0x6E}, {0x5E, 0x6F}, {0x5E, 0x70}, {0x5E, 0x71}, /* 0xD0-0xD3 */ + {0x5E, 0x75}, {0x5E, 0x77}, {0x5E, 0x79}, {0x5E, 0x7E}, /* 0xD4-0xD7 */ + {0x5E, 0x81}, {0x5E, 0x82}, {0x5E, 0x83}, {0x5E, 0x85}, /* 0xD8-0xDB */ + {0x5E, 0x88}, {0x5E, 0x89}, {0x5E, 0x8C}, {0x5E, 0x8D}, /* 0xDC-0xDF */ + {0x5E, 0x8E}, {0x5E, 0x92}, {0x5E, 0x98}, {0x5E, 0x9B}, /* 0xE0-0xE3 */ + {0x5E, 0x9D}, {0x5E, 0xA1}, {0x5E, 0xA2}, {0x5E, 0xA3}, /* 0xE4-0xE7 */ + {0x5E, 0xA4}, {0x5E, 0xA8}, {0x5E, 0xA9}, {0x5E, 0xAA}, /* 0xE8-0xEB */ + {0x5E, 0xAB}, {0x5E, 0xAC}, {0x5E, 0xAE}, {0x5E, 0xAF}, /* 0xEC-0xEF */ + {0x5E, 0xB0}, {0x5E, 0xB1}, {0x5E, 0xB2}, {0x5E, 0xB4}, /* 0xF0-0xF3 */ + {0x5E, 0xBA}, {0x5E, 0xBB}, {0x5E, 0xBC}, {0x5E, 0xBD}, /* 0xF4-0xF7 */ + {0x5E, 0xBF}, {0x5E, 0xC0}, {0x5E, 0xC1}, {0x5E, 0xC2}, /* 0xF8-0xFB */ + {0x5E, 0xC3}, {0x5E, 0xC4}, {0x5E, 0xC5}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8F[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5E, 0xC6}, {0x5E, 0xC7}, {0x5E, 0xC8}, {0x5E, 0xCB}, /* 0x40-0x43 */ + {0x5E, 0xCC}, {0x5E, 0xCD}, {0x5E, 0xCE}, {0x5E, 0xCF}, /* 0x44-0x47 */ + {0x5E, 0xD0}, {0x5E, 0xD4}, {0x5E, 0xD5}, {0x5E, 0xD7}, /* 0x48-0x4B */ + {0x5E, 0xD8}, {0x5E, 0xD9}, {0x5E, 0xDA}, {0x5E, 0xDC}, /* 0x4C-0x4F */ + {0x5E, 0xDD}, {0x5E, 0xDE}, {0x5E, 0xDF}, {0x5E, 0xE0}, /* 0x50-0x53 */ + {0x5E, 0xE1}, {0x5E, 0xE2}, {0x5E, 0xE3}, {0x5E, 0xE4}, /* 0x54-0x57 */ + {0x5E, 0xE5}, {0x5E, 0xE6}, {0x5E, 0xE7}, {0x5E, 0xE9}, /* 0x58-0x5B */ + {0x5E, 0xEB}, {0x5E, 0xEC}, {0x5E, 0xED}, {0x5E, 0xEE}, /* 0x5C-0x5F */ + {0x5E, 0xEF}, {0x5E, 0xF0}, {0x5E, 0xF1}, {0x5E, 0xF2}, /* 0x60-0x63 */ + {0x5E, 0xF3}, {0x5E, 0xF5}, {0x5E, 0xF8}, {0x5E, 0xF9}, /* 0x64-0x67 */ + {0x5E, 0xFB}, {0x5E, 0xFC}, {0x5E, 0xFD}, {0x5F, 0x05}, /* 0x68-0x6B */ + {0x5F, 0x06}, {0x5F, 0x07}, {0x5F, 0x09}, {0x5F, 0x0C}, /* 0x6C-0x6F */ + {0x5F, 0x0D}, {0x5F, 0x0E}, {0x5F, 0x10}, {0x5F, 0x12}, /* 0x70-0x73 */ + {0x5F, 0x14}, {0x5F, 0x16}, {0x5F, 0x19}, {0x5F, 0x1A}, /* 0x74-0x77 */ + {0x5F, 0x1C}, {0x5F, 0x1D}, {0x5F, 0x1E}, {0x5F, 0x21}, /* 0x78-0x7B */ + {0x5F, 0x22}, {0x5F, 0x23}, {0x5F, 0x24}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x5F, 0x28}, {0x5F, 0x2B}, {0x5F, 0x2C}, {0x5F, 0x2E}, /* 0x80-0x83 */ + {0x5F, 0x30}, {0x5F, 0x32}, {0x5F, 0x33}, {0x5F, 0x34}, /* 0x84-0x87 */ + {0x5F, 0x35}, {0x5F, 0x36}, {0x5F, 0x37}, {0x5F, 0x38}, /* 0x88-0x8B */ + {0x5F, 0x3B}, {0x5F, 0x3D}, {0x5F, 0x3E}, {0x5F, 0x3F}, /* 0x8C-0x8F */ + {0x5F, 0x41}, {0x5F, 0x42}, {0x5F, 0x43}, {0x5F, 0x44}, /* 0x90-0x93 */ + {0x5F, 0x45}, {0x5F, 0x46}, {0x5F, 0x47}, {0x5F, 0x48}, /* 0x94-0x97 */ + {0x5F, 0x49}, {0x5F, 0x4A}, {0x5F, 0x4B}, {0x5F, 0x4C}, /* 0x98-0x9B */ + {0x5F, 0x4D}, {0x5F, 0x4E}, {0x5F, 0x4F}, {0x5F, 0x51}, /* 0x9C-0x9F */ + {0x5F, 0x54}, {0x5F, 0x59}, {0x5F, 0x5A}, {0x5F, 0x5B}, /* 0xA0-0xA3 */ + {0x5F, 0x5C}, {0x5F, 0x5E}, {0x5F, 0x5F}, {0x5F, 0x60}, /* 0xA4-0xA7 */ + {0x5F, 0x63}, {0x5F, 0x65}, {0x5F, 0x67}, {0x5F, 0x68}, /* 0xA8-0xAB */ + {0x5F, 0x6B}, {0x5F, 0x6E}, {0x5F, 0x6F}, {0x5F, 0x72}, /* 0xAC-0xAF */ + {0x5F, 0x74}, {0x5F, 0x75}, {0x5F, 0x76}, {0x5F, 0x78}, /* 0xB0-0xB3 */ + {0x5F, 0x7A}, {0x5F, 0x7D}, {0x5F, 0x7E}, {0x5F, 0x7F}, /* 0xB4-0xB7 */ + {0x5F, 0x83}, {0x5F, 0x86}, {0x5F, 0x8D}, {0x5F, 0x8E}, /* 0xB8-0xBB */ + {0x5F, 0x8F}, {0x5F, 0x91}, {0x5F, 0x93}, {0x5F, 0x94}, /* 0xBC-0xBF */ + {0x5F, 0x96}, {0x5F, 0x9A}, {0x5F, 0x9B}, {0x5F, 0x9D}, /* 0xC0-0xC3 */ + {0x5F, 0x9E}, {0x5F, 0x9F}, {0x5F, 0xA0}, {0x5F, 0xA2}, /* 0xC4-0xC7 */ + {0x5F, 0xA3}, {0x5F, 0xA4}, {0x5F, 0xA5}, {0x5F, 0xA6}, /* 0xC8-0xCB */ + {0x5F, 0xA7}, {0x5F, 0xA9}, {0x5F, 0xAB}, {0x5F, 0xAC}, /* 0xCC-0xCF */ + {0x5F, 0xAF}, {0x5F, 0xB0}, {0x5F, 0xB1}, {0x5F, 0xB2}, /* 0xD0-0xD3 */ + {0x5F, 0xB3}, {0x5F, 0xB4}, {0x5F, 0xB6}, {0x5F, 0xB8}, /* 0xD4-0xD7 */ + {0x5F, 0xB9}, {0x5F, 0xBA}, {0x5F, 0xBB}, {0x5F, 0xBE}, /* 0xD8-0xDB */ + {0x5F, 0xBF}, {0x5F, 0xC0}, {0x5F, 0xC1}, {0x5F, 0xC2}, /* 0xDC-0xDF */ + {0x5F, 0xC7}, {0x5F, 0xC8}, {0x5F, 0xCA}, {0x5F, 0xCB}, /* 0xE0-0xE3 */ + {0x5F, 0xCE}, {0x5F, 0xD3}, {0x5F, 0xD4}, {0x5F, 0xD5}, /* 0xE4-0xE7 */ + {0x5F, 0xDA}, {0x5F, 0xDB}, {0x5F, 0xDC}, {0x5F, 0xDE}, /* 0xE8-0xEB */ + {0x5F, 0xDF}, {0x5F, 0xE2}, {0x5F, 0xE3}, {0x5F, 0xE5}, /* 0xEC-0xEF */ + {0x5F, 0xE6}, {0x5F, 0xE8}, {0x5F, 0xE9}, {0x5F, 0xEC}, /* 0xF0-0xF3 */ + {0x5F, 0xEF}, {0x5F, 0xF0}, {0x5F, 0xF2}, {0x5F, 0xF3}, /* 0xF4-0xF7 */ + {0x5F, 0xF4}, {0x5F, 0xF6}, {0x5F, 0xF7}, {0x5F, 0xF9}, /* 0xF8-0xFB */ + {0x5F, 0xFA}, {0x5F, 0xFC}, {0x60, 0x07}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_90[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x60, 0x08}, {0x60, 0x09}, {0x60, 0x0B}, {0x60, 0x0C}, /* 0x40-0x43 */ + {0x60, 0x10}, {0x60, 0x11}, {0x60, 0x13}, {0x60, 0x17}, /* 0x44-0x47 */ + {0x60, 0x18}, {0x60, 0x1A}, {0x60, 0x1E}, {0x60, 0x1F}, /* 0x48-0x4B */ + {0x60, 0x22}, {0x60, 0x23}, {0x60, 0x24}, {0x60, 0x2C}, /* 0x4C-0x4F */ + {0x60, 0x2D}, {0x60, 0x2E}, {0x60, 0x30}, {0x60, 0x31}, /* 0x50-0x53 */ + {0x60, 0x32}, {0x60, 0x33}, {0x60, 0x34}, {0x60, 0x36}, /* 0x54-0x57 */ + {0x60, 0x37}, {0x60, 0x38}, {0x60, 0x39}, {0x60, 0x3A}, /* 0x58-0x5B */ + {0x60, 0x3D}, {0x60, 0x3E}, {0x60, 0x40}, {0x60, 0x44}, /* 0x5C-0x5F */ + {0x60, 0x45}, {0x60, 0x46}, {0x60, 0x47}, {0x60, 0x48}, /* 0x60-0x63 */ + {0x60, 0x49}, {0x60, 0x4A}, {0x60, 0x4C}, {0x60, 0x4E}, /* 0x64-0x67 */ + {0x60, 0x4F}, {0x60, 0x51}, {0x60, 0x53}, {0x60, 0x54}, /* 0x68-0x6B */ + {0x60, 0x56}, {0x60, 0x57}, {0x60, 0x58}, {0x60, 0x5B}, /* 0x6C-0x6F */ + {0x60, 0x5C}, {0x60, 0x5E}, {0x60, 0x5F}, {0x60, 0x60}, /* 0x70-0x73 */ + {0x60, 0x61}, {0x60, 0x65}, {0x60, 0x66}, {0x60, 0x6E}, /* 0x74-0x77 */ + {0x60, 0x71}, {0x60, 0x72}, {0x60, 0x74}, {0x60, 0x75}, /* 0x78-0x7B */ + {0x60, 0x77}, {0x60, 0x7E}, {0x60, 0x80}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x60, 0x81}, {0x60, 0x82}, {0x60, 0x85}, {0x60, 0x86}, /* 0x80-0x83 */ + {0x60, 0x87}, {0x60, 0x88}, {0x60, 0x8A}, {0x60, 0x8B}, /* 0x84-0x87 */ + {0x60, 0x8E}, {0x60, 0x8F}, {0x60, 0x90}, {0x60, 0x91}, /* 0x88-0x8B */ + {0x60, 0x93}, {0x60, 0x95}, {0x60, 0x97}, {0x60, 0x98}, /* 0x8C-0x8F */ + {0x60, 0x99}, {0x60, 0x9C}, {0x60, 0x9E}, {0x60, 0xA1}, /* 0x90-0x93 */ + {0x60, 0xA2}, {0x60, 0xA4}, {0x60, 0xA5}, {0x60, 0xA7}, /* 0x94-0x97 */ + {0x60, 0xA9}, {0x60, 0xAA}, {0x60, 0xAE}, {0x60, 0xB0}, /* 0x98-0x9B */ + {0x60, 0xB3}, {0x60, 0xB5}, {0x60, 0xB6}, {0x60, 0xB7}, /* 0x9C-0x9F */ + {0x60, 0xB9}, {0x60, 0xBA}, {0x60, 0xBD}, {0x60, 0xBE}, /* 0xA0-0xA3 */ + {0x60, 0xBF}, {0x60, 0xC0}, {0x60, 0xC1}, {0x60, 0xC2}, /* 0xA4-0xA7 */ + {0x60, 0xC3}, {0x60, 0xC4}, {0x60, 0xC7}, {0x60, 0xC8}, /* 0xA8-0xAB */ + {0x60, 0xC9}, {0x60, 0xCC}, {0x60, 0xCD}, {0x60, 0xCE}, /* 0xAC-0xAF */ + {0x60, 0xCF}, {0x60, 0xD0}, {0x60, 0xD2}, {0x60, 0xD3}, /* 0xB0-0xB3 */ + {0x60, 0xD4}, {0x60, 0xD6}, {0x60, 0xD7}, {0x60, 0xD9}, /* 0xB4-0xB7 */ + {0x60, 0xDB}, {0x60, 0xDE}, {0x60, 0xE1}, {0x60, 0xE2}, /* 0xB8-0xBB */ + {0x60, 0xE3}, {0x60, 0xE4}, {0x60, 0xE5}, {0x60, 0xEA}, /* 0xBC-0xBF */ + {0x60, 0xF1}, {0x60, 0xF2}, {0x60, 0xF5}, {0x60, 0xF7}, /* 0xC0-0xC3 */ + {0x60, 0xF8}, {0x60, 0xFB}, {0x60, 0xFC}, {0x60, 0xFD}, /* 0xC4-0xC7 */ + {0x60, 0xFE}, {0x60, 0xFF}, {0x61, 0x02}, {0x61, 0x03}, /* 0xC8-0xCB */ + {0x61, 0x04}, {0x61, 0x05}, {0x61, 0x07}, {0x61, 0x0A}, /* 0xCC-0xCF */ + {0x61, 0x0B}, {0x61, 0x0C}, {0x61, 0x10}, {0x61, 0x11}, /* 0xD0-0xD3 */ + {0x61, 0x12}, {0x61, 0x13}, {0x61, 0x14}, {0x61, 0x16}, /* 0xD4-0xD7 */ + {0x61, 0x17}, {0x61, 0x18}, {0x61, 0x19}, {0x61, 0x1B}, /* 0xD8-0xDB */ + {0x61, 0x1C}, {0x61, 0x1D}, {0x61, 0x1E}, {0x61, 0x21}, /* 0xDC-0xDF */ + {0x61, 0x22}, {0x61, 0x25}, {0x61, 0x28}, {0x61, 0x29}, /* 0xE0-0xE3 */ + {0x61, 0x2A}, {0x61, 0x2C}, {0x61, 0x2D}, {0x61, 0x2E}, /* 0xE4-0xE7 */ + {0x61, 0x2F}, {0x61, 0x30}, {0x61, 0x31}, {0x61, 0x32}, /* 0xE8-0xEB */ + {0x61, 0x33}, {0x61, 0x34}, {0x61, 0x35}, {0x61, 0x36}, /* 0xEC-0xEF */ + {0x61, 0x37}, {0x61, 0x38}, {0x61, 0x39}, {0x61, 0x3A}, /* 0xF0-0xF3 */ + {0x61, 0x3B}, {0x61, 0x3C}, {0x61, 0x3D}, {0x61, 0x3E}, /* 0xF4-0xF7 */ + {0x61, 0x40}, {0x61, 0x41}, {0x61, 0x42}, {0x61, 0x43}, /* 0xF8-0xFB */ + {0x61, 0x44}, {0x61, 0x45}, {0x61, 0x46}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_91[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x61, 0x47}, {0x61, 0x49}, {0x61, 0x4B}, {0x61, 0x4D}, /* 0x40-0x43 */ + {0x61, 0x4F}, {0x61, 0x50}, {0x61, 0x52}, {0x61, 0x53}, /* 0x44-0x47 */ + {0x61, 0x54}, {0x61, 0x56}, {0x61, 0x57}, {0x61, 0x58}, /* 0x48-0x4B */ + {0x61, 0x59}, {0x61, 0x5A}, {0x61, 0x5B}, {0x61, 0x5C}, /* 0x4C-0x4F */ + {0x61, 0x5E}, {0x61, 0x5F}, {0x61, 0x60}, {0x61, 0x61}, /* 0x50-0x53 */ + {0x61, 0x63}, {0x61, 0x64}, {0x61, 0x65}, {0x61, 0x66}, /* 0x54-0x57 */ + {0x61, 0x69}, {0x61, 0x6A}, {0x61, 0x6B}, {0x61, 0x6C}, /* 0x58-0x5B */ + {0x61, 0x6D}, {0x61, 0x6E}, {0x61, 0x6F}, {0x61, 0x71}, /* 0x5C-0x5F */ + {0x61, 0x72}, {0x61, 0x73}, {0x61, 0x74}, {0x61, 0x76}, /* 0x60-0x63 */ + {0x61, 0x78}, {0x61, 0x79}, {0x61, 0x7A}, {0x61, 0x7B}, /* 0x64-0x67 */ + {0x61, 0x7C}, {0x61, 0x7D}, {0x61, 0x7E}, {0x61, 0x7F}, /* 0x68-0x6B */ + {0x61, 0x80}, {0x61, 0x81}, {0x61, 0x82}, {0x61, 0x83}, /* 0x6C-0x6F */ + {0x61, 0x84}, {0x61, 0x85}, {0x61, 0x86}, {0x61, 0x87}, /* 0x70-0x73 */ + {0x61, 0x88}, {0x61, 0x89}, {0x61, 0x8A}, {0x61, 0x8C}, /* 0x74-0x77 */ + {0x61, 0x8D}, {0x61, 0x8F}, {0x61, 0x90}, {0x61, 0x91}, /* 0x78-0x7B */ + {0x61, 0x92}, {0x61, 0x93}, {0x61, 0x95}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x61, 0x96}, {0x61, 0x97}, {0x61, 0x98}, {0x61, 0x99}, /* 0x80-0x83 */ + {0x61, 0x9A}, {0x61, 0x9B}, {0x61, 0x9C}, {0x61, 0x9E}, /* 0x84-0x87 */ + {0x61, 0x9F}, {0x61, 0xA0}, {0x61, 0xA1}, {0x61, 0xA2}, /* 0x88-0x8B */ + {0x61, 0xA3}, {0x61, 0xA4}, {0x61, 0xA5}, {0x61, 0xA6}, /* 0x8C-0x8F */ + {0x61, 0xAA}, {0x61, 0xAB}, {0x61, 0xAD}, {0x61, 0xAE}, /* 0x90-0x93 */ + {0x61, 0xAF}, {0x61, 0xB0}, {0x61, 0xB1}, {0x61, 0xB2}, /* 0x94-0x97 */ + {0x61, 0xB3}, {0x61, 0xB4}, {0x61, 0xB5}, {0x61, 0xB6}, /* 0x98-0x9B */ + {0x61, 0xB8}, {0x61, 0xB9}, {0x61, 0xBA}, {0x61, 0xBB}, /* 0x9C-0x9F */ + {0x61, 0xBC}, {0x61, 0xBD}, {0x61, 0xBF}, {0x61, 0xC0}, /* 0xA0-0xA3 */ + {0x61, 0xC1}, {0x61, 0xC3}, {0x61, 0xC4}, {0x61, 0xC5}, /* 0xA4-0xA7 */ + {0x61, 0xC6}, {0x61, 0xC7}, {0x61, 0xC9}, {0x61, 0xCC}, /* 0xA8-0xAB */ + {0x61, 0xCD}, {0x61, 0xCE}, {0x61, 0xCF}, {0x61, 0xD0}, /* 0xAC-0xAF */ + {0x61, 0xD3}, {0x61, 0xD5}, {0x61, 0xD6}, {0x61, 0xD7}, /* 0xB0-0xB3 */ + {0x61, 0xD8}, {0x61, 0xD9}, {0x61, 0xDA}, {0x61, 0xDB}, /* 0xB4-0xB7 */ + {0x61, 0xDC}, {0x61, 0xDD}, {0x61, 0xDE}, {0x61, 0xDF}, /* 0xB8-0xBB */ + {0x61, 0xE0}, {0x61, 0xE1}, {0x61, 0xE2}, {0x61, 0xE3}, /* 0xBC-0xBF */ + {0x61, 0xE4}, {0x61, 0xE5}, {0x61, 0xE7}, {0x61, 0xE8}, /* 0xC0-0xC3 */ + {0x61, 0xE9}, {0x61, 0xEA}, {0x61, 0xEB}, {0x61, 0xEC}, /* 0xC4-0xC7 */ + {0x61, 0xED}, {0x61, 0xEE}, {0x61, 0xEF}, {0x61, 0xF0}, /* 0xC8-0xCB */ + {0x61, 0xF1}, {0x61, 0xF2}, {0x61, 0xF3}, {0x61, 0xF4}, /* 0xCC-0xCF */ + {0x61, 0xF6}, {0x61, 0xF7}, {0x61, 0xF8}, {0x61, 0xF9}, /* 0xD0-0xD3 */ + {0x61, 0xFA}, {0x61, 0xFB}, {0x61, 0xFC}, {0x61, 0xFD}, /* 0xD4-0xD7 */ + {0x61, 0xFE}, {0x62, 0x00}, {0x62, 0x01}, {0x62, 0x02}, /* 0xD8-0xDB */ + {0x62, 0x03}, {0x62, 0x04}, {0x62, 0x05}, {0x62, 0x07}, /* 0xDC-0xDF */ + {0x62, 0x09}, {0x62, 0x13}, {0x62, 0x14}, {0x62, 0x19}, /* 0xE0-0xE3 */ + {0x62, 0x1C}, {0x62, 0x1D}, {0x62, 0x1E}, {0x62, 0x20}, /* 0xE4-0xE7 */ + {0x62, 0x23}, {0x62, 0x26}, {0x62, 0x27}, {0x62, 0x28}, /* 0xE8-0xEB */ + {0x62, 0x29}, {0x62, 0x2B}, {0x62, 0x2D}, {0x62, 0x2F}, /* 0xEC-0xEF */ + {0x62, 0x30}, {0x62, 0x31}, {0x62, 0x32}, {0x62, 0x35}, /* 0xF0-0xF3 */ + {0x62, 0x36}, {0x62, 0x38}, {0x62, 0x39}, {0x62, 0x3A}, /* 0xF4-0xF7 */ + {0x62, 0x3B}, {0x62, 0x3C}, {0x62, 0x42}, {0x62, 0x44}, /* 0xF8-0xFB */ + {0x62, 0x45}, {0x62, 0x46}, {0x62, 0x4A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_92[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x62, 0x4F}, {0x62, 0x50}, {0x62, 0x55}, {0x62, 0x56}, /* 0x40-0x43 */ + {0x62, 0x57}, {0x62, 0x59}, {0x62, 0x5A}, {0x62, 0x5C}, /* 0x44-0x47 */ + {0x62, 0x5D}, {0x62, 0x5E}, {0x62, 0x5F}, {0x62, 0x60}, /* 0x48-0x4B */ + {0x62, 0x61}, {0x62, 0x62}, {0x62, 0x64}, {0x62, 0x65}, /* 0x4C-0x4F */ + {0x62, 0x68}, {0x62, 0x71}, {0x62, 0x72}, {0x62, 0x74}, /* 0x50-0x53 */ + {0x62, 0x75}, {0x62, 0x77}, {0x62, 0x78}, {0x62, 0x7A}, /* 0x54-0x57 */ + {0x62, 0x7B}, {0x62, 0x7D}, {0x62, 0x81}, {0x62, 0x82}, /* 0x58-0x5B */ + {0x62, 0x83}, {0x62, 0x85}, {0x62, 0x86}, {0x62, 0x87}, /* 0x5C-0x5F */ + {0x62, 0x88}, {0x62, 0x8B}, {0x62, 0x8C}, {0x62, 0x8D}, /* 0x60-0x63 */ + {0x62, 0x8E}, {0x62, 0x8F}, {0x62, 0x90}, {0x62, 0x94}, /* 0x64-0x67 */ + {0x62, 0x99}, {0x62, 0x9C}, {0x62, 0x9D}, {0x62, 0x9E}, /* 0x68-0x6B */ + {0x62, 0xA3}, {0x62, 0xA6}, {0x62, 0xA7}, {0x62, 0xA9}, /* 0x6C-0x6F */ + {0x62, 0xAA}, {0x62, 0xAD}, {0x62, 0xAE}, {0x62, 0xAF}, /* 0x70-0x73 */ + {0x62, 0xB0}, {0x62, 0xB2}, {0x62, 0xB3}, {0x62, 0xB4}, /* 0x74-0x77 */ + {0x62, 0xB6}, {0x62, 0xB7}, {0x62, 0xB8}, {0x62, 0xBA}, /* 0x78-0x7B */ + {0x62, 0xBE}, {0x62, 0xC0}, {0x62, 0xC1}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x62, 0xC3}, {0x62, 0xCB}, {0x62, 0xCF}, {0x62, 0xD1}, /* 0x80-0x83 */ + {0x62, 0xD5}, {0x62, 0xDD}, {0x62, 0xDE}, {0x62, 0xE0}, /* 0x84-0x87 */ + {0x62, 0xE1}, {0x62, 0xE4}, {0x62, 0xEA}, {0x62, 0xEB}, /* 0x88-0x8B */ + {0x62, 0xF0}, {0x62, 0xF2}, {0x62, 0xF5}, {0x62, 0xF8}, /* 0x8C-0x8F */ + {0x62, 0xF9}, {0x62, 0xFA}, {0x62, 0xFB}, {0x63, 0x00}, /* 0x90-0x93 */ + {0x63, 0x03}, {0x63, 0x04}, {0x63, 0x05}, {0x63, 0x06}, /* 0x94-0x97 */ + {0x63, 0x0A}, {0x63, 0x0B}, {0x63, 0x0C}, {0x63, 0x0D}, /* 0x98-0x9B */ + {0x63, 0x0F}, {0x63, 0x10}, {0x63, 0x12}, {0x63, 0x13}, /* 0x9C-0x9F */ + {0x63, 0x14}, {0x63, 0x15}, {0x63, 0x17}, {0x63, 0x18}, /* 0xA0-0xA3 */ + {0x63, 0x19}, {0x63, 0x1C}, {0x63, 0x26}, {0x63, 0x27}, /* 0xA4-0xA7 */ + {0x63, 0x29}, {0x63, 0x2C}, {0x63, 0x2D}, {0x63, 0x2E}, /* 0xA8-0xAB */ + {0x63, 0x30}, {0x63, 0x31}, {0x63, 0x33}, {0x63, 0x34}, /* 0xAC-0xAF */ + {0x63, 0x35}, {0x63, 0x36}, {0x63, 0x37}, {0x63, 0x38}, /* 0xB0-0xB3 */ + {0x63, 0x3B}, {0x63, 0x3C}, {0x63, 0x3E}, {0x63, 0x3F}, /* 0xB4-0xB7 */ + {0x63, 0x40}, {0x63, 0x41}, {0x63, 0x44}, {0x63, 0x47}, /* 0xB8-0xBB */ + {0x63, 0x48}, {0x63, 0x4A}, {0x63, 0x51}, {0x63, 0x52}, /* 0xBC-0xBF */ + {0x63, 0x53}, {0x63, 0x54}, {0x63, 0x56}, {0x63, 0x57}, /* 0xC0-0xC3 */ + {0x63, 0x58}, {0x63, 0x59}, {0x63, 0x5A}, {0x63, 0x5B}, /* 0xC4-0xC7 */ + {0x63, 0x5C}, {0x63, 0x5D}, {0x63, 0x60}, {0x63, 0x64}, /* 0xC8-0xCB */ + {0x63, 0x65}, {0x63, 0x66}, {0x63, 0x68}, {0x63, 0x6A}, /* 0xCC-0xCF */ + {0x63, 0x6B}, {0x63, 0x6C}, {0x63, 0x6F}, {0x63, 0x70}, /* 0xD0-0xD3 */ + {0x63, 0x72}, {0x63, 0x73}, {0x63, 0x74}, {0x63, 0x75}, /* 0xD4-0xD7 */ + {0x63, 0x78}, {0x63, 0x79}, {0x63, 0x7C}, {0x63, 0x7D}, /* 0xD8-0xDB */ + {0x63, 0x7E}, {0x63, 0x7F}, {0x63, 0x81}, {0x63, 0x83}, /* 0xDC-0xDF */ + {0x63, 0x84}, {0x63, 0x85}, {0x63, 0x86}, {0x63, 0x8B}, /* 0xE0-0xE3 */ + {0x63, 0x8D}, {0x63, 0x91}, {0x63, 0x93}, {0x63, 0x94}, /* 0xE4-0xE7 */ + {0x63, 0x95}, {0x63, 0x97}, {0x63, 0x99}, {0x63, 0x9A}, /* 0xE8-0xEB */ + {0x63, 0x9B}, {0x63, 0x9C}, {0x63, 0x9D}, {0x63, 0x9E}, /* 0xEC-0xEF */ + {0x63, 0x9F}, {0x63, 0xA1}, {0x63, 0xA4}, {0x63, 0xA6}, /* 0xF0-0xF3 */ + {0x63, 0xAB}, {0x63, 0xAF}, {0x63, 0xB1}, {0x63, 0xB2}, /* 0xF4-0xF7 */ + {0x63, 0xB5}, {0x63, 0xB6}, {0x63, 0xB9}, {0x63, 0xBB}, /* 0xF8-0xFB */ + {0x63, 0xBD}, {0x63, 0xBF}, {0x63, 0xC0}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_93[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x63, 0xC1}, {0x63, 0xC2}, {0x63, 0xC3}, {0x63, 0xC5}, /* 0x40-0x43 */ + {0x63, 0xC7}, {0x63, 0xC8}, {0x63, 0xCA}, {0x63, 0xCB}, /* 0x44-0x47 */ + {0x63, 0xCC}, {0x63, 0xD1}, {0x63, 0xD3}, {0x63, 0xD4}, /* 0x48-0x4B */ + {0x63, 0xD5}, {0x63, 0xD7}, {0x63, 0xD8}, {0x63, 0xD9}, /* 0x4C-0x4F */ + {0x63, 0xDA}, {0x63, 0xDB}, {0x63, 0xDC}, {0x63, 0xDD}, /* 0x50-0x53 */ + {0x63, 0xDF}, {0x63, 0xE2}, {0x63, 0xE4}, {0x63, 0xE5}, /* 0x54-0x57 */ + {0x63, 0xE6}, {0x63, 0xE7}, {0x63, 0xE8}, {0x63, 0xEB}, /* 0x58-0x5B */ + {0x63, 0xEC}, {0x63, 0xEE}, {0x63, 0xEF}, {0x63, 0xF0}, /* 0x5C-0x5F */ + {0x63, 0xF1}, {0x63, 0xF3}, {0x63, 0xF5}, {0x63, 0xF7}, /* 0x60-0x63 */ + {0x63, 0xF9}, {0x63, 0xFA}, {0x63, 0xFB}, {0x63, 0xFC}, /* 0x64-0x67 */ + {0x63, 0xFE}, {0x64, 0x03}, {0x64, 0x04}, {0x64, 0x06}, /* 0x68-0x6B */ + {0x64, 0x07}, {0x64, 0x08}, {0x64, 0x09}, {0x64, 0x0A}, /* 0x6C-0x6F */ + {0x64, 0x0D}, {0x64, 0x0E}, {0x64, 0x11}, {0x64, 0x12}, /* 0x70-0x73 */ + {0x64, 0x15}, {0x64, 0x16}, {0x64, 0x17}, {0x64, 0x18}, /* 0x74-0x77 */ + {0x64, 0x19}, {0x64, 0x1A}, {0x64, 0x1D}, {0x64, 0x1F}, /* 0x78-0x7B */ + {0x64, 0x22}, {0x64, 0x23}, {0x64, 0x24}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x64, 0x25}, {0x64, 0x27}, {0x64, 0x28}, {0x64, 0x29}, /* 0x80-0x83 */ + {0x64, 0x2B}, {0x64, 0x2E}, {0x64, 0x2F}, {0x64, 0x30}, /* 0x84-0x87 */ + {0x64, 0x31}, {0x64, 0x32}, {0x64, 0x33}, {0x64, 0x35}, /* 0x88-0x8B */ + {0x64, 0x36}, {0x64, 0x37}, {0x64, 0x38}, {0x64, 0x39}, /* 0x8C-0x8F */ + {0x64, 0x3B}, {0x64, 0x3C}, {0x64, 0x3E}, {0x64, 0x40}, /* 0x90-0x93 */ + {0x64, 0x42}, {0x64, 0x43}, {0x64, 0x49}, {0x64, 0x4B}, /* 0x94-0x97 */ + {0x64, 0x4C}, {0x64, 0x4D}, {0x64, 0x4E}, {0x64, 0x4F}, /* 0x98-0x9B */ + {0x64, 0x50}, {0x64, 0x51}, {0x64, 0x53}, {0x64, 0x55}, /* 0x9C-0x9F */ + {0x64, 0x56}, {0x64, 0x57}, {0x64, 0x59}, {0x64, 0x5A}, /* 0xA0-0xA3 */ + {0x64, 0x5B}, {0x64, 0x5C}, {0x64, 0x5D}, {0x64, 0x5F}, /* 0xA4-0xA7 */ + {0x64, 0x60}, {0x64, 0x61}, {0x64, 0x62}, {0x64, 0x63}, /* 0xA8-0xAB */ + {0x64, 0x64}, {0x64, 0x65}, {0x64, 0x66}, {0x64, 0x68}, /* 0xAC-0xAF */ + {0x64, 0x6A}, {0x64, 0x6B}, {0x64, 0x6C}, {0x64, 0x6E}, /* 0xB0-0xB3 */ + {0x64, 0x6F}, {0x64, 0x70}, {0x64, 0x71}, {0x64, 0x72}, /* 0xB4-0xB7 */ + {0x64, 0x73}, {0x64, 0x74}, {0x64, 0x75}, {0x64, 0x76}, /* 0xB8-0xBB */ + {0x64, 0x77}, {0x64, 0x7B}, {0x64, 0x7C}, {0x64, 0x7D}, /* 0xBC-0xBF */ + {0x64, 0x7E}, {0x64, 0x7F}, {0x64, 0x80}, {0x64, 0x81}, /* 0xC0-0xC3 */ + {0x64, 0x83}, {0x64, 0x86}, {0x64, 0x88}, {0x64, 0x89}, /* 0xC4-0xC7 */ + {0x64, 0x8A}, {0x64, 0x8B}, {0x64, 0x8C}, {0x64, 0x8D}, /* 0xC8-0xCB */ + {0x64, 0x8E}, {0x64, 0x8F}, {0x64, 0x90}, {0x64, 0x93}, /* 0xCC-0xCF */ + {0x64, 0x94}, {0x64, 0x97}, {0x64, 0x98}, {0x64, 0x9A}, /* 0xD0-0xD3 */ + {0x64, 0x9B}, {0x64, 0x9C}, {0x64, 0x9D}, {0x64, 0x9F}, /* 0xD4-0xD7 */ + {0x64, 0xA0}, {0x64, 0xA1}, {0x64, 0xA2}, {0x64, 0xA3}, /* 0xD8-0xDB */ + {0x64, 0xA5}, {0x64, 0xA6}, {0x64, 0xA7}, {0x64, 0xA8}, /* 0xDC-0xDF */ + {0x64, 0xAA}, {0x64, 0xAB}, {0x64, 0xAF}, {0x64, 0xB1}, /* 0xE0-0xE3 */ + {0x64, 0xB2}, {0x64, 0xB3}, {0x64, 0xB4}, {0x64, 0xB6}, /* 0xE4-0xE7 */ + {0x64, 0xB9}, {0x64, 0xBB}, {0x64, 0xBD}, {0x64, 0xBE}, /* 0xE8-0xEB */ + {0x64, 0xBF}, {0x64, 0xC1}, {0x64, 0xC3}, {0x64, 0xC4}, /* 0xEC-0xEF */ + {0x64, 0xC6}, {0x64, 0xC7}, {0x64, 0xC8}, {0x64, 0xC9}, /* 0xF0-0xF3 */ + {0x64, 0xCA}, {0x64, 0xCB}, {0x64, 0xCC}, {0x64, 0xCF}, /* 0xF4-0xF7 */ + {0x64, 0xD1}, {0x64, 0xD3}, {0x64, 0xD4}, {0x64, 0xD5}, /* 0xF8-0xFB */ + {0x64, 0xD6}, {0x64, 0xD9}, {0x64, 0xDA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_94[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x64, 0xDB}, {0x64, 0xDC}, {0x64, 0xDD}, {0x64, 0xDF}, /* 0x40-0x43 */ + {0x64, 0xE0}, {0x64, 0xE1}, {0x64, 0xE3}, {0x64, 0xE5}, /* 0x44-0x47 */ + {0x64, 0xE7}, {0x64, 0xE8}, {0x64, 0xE9}, {0x64, 0xEA}, /* 0x48-0x4B */ + {0x64, 0xEB}, {0x64, 0xEC}, {0x64, 0xED}, {0x64, 0xEE}, /* 0x4C-0x4F */ + {0x64, 0xEF}, {0x64, 0xF0}, {0x64, 0xF1}, {0x64, 0xF2}, /* 0x50-0x53 */ + {0x64, 0xF3}, {0x64, 0xF4}, {0x64, 0xF5}, {0x64, 0xF6}, /* 0x54-0x57 */ + {0x64, 0xF7}, {0x64, 0xF8}, {0x64, 0xF9}, {0x64, 0xFA}, /* 0x58-0x5B */ + {0x64, 0xFB}, {0x64, 0xFC}, {0x64, 0xFD}, {0x64, 0xFE}, /* 0x5C-0x5F */ + {0x64, 0xFF}, {0x65, 0x01}, {0x65, 0x02}, {0x65, 0x03}, /* 0x60-0x63 */ + {0x65, 0x04}, {0x65, 0x05}, {0x65, 0x06}, {0x65, 0x07}, /* 0x64-0x67 */ + {0x65, 0x08}, {0x65, 0x0A}, {0x65, 0x0B}, {0x65, 0x0C}, /* 0x68-0x6B */ + {0x65, 0x0D}, {0x65, 0x0E}, {0x65, 0x0F}, {0x65, 0x10}, /* 0x6C-0x6F */ + {0x65, 0x11}, {0x65, 0x13}, {0x65, 0x14}, {0x65, 0x15}, /* 0x70-0x73 */ + {0x65, 0x16}, {0x65, 0x17}, {0x65, 0x19}, {0x65, 0x1A}, /* 0x74-0x77 */ + {0x65, 0x1B}, {0x65, 0x1C}, {0x65, 0x1D}, {0x65, 0x1E}, /* 0x78-0x7B */ + {0x65, 0x1F}, {0x65, 0x20}, {0x65, 0x21}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x65, 0x22}, {0x65, 0x23}, {0x65, 0x24}, {0x65, 0x26}, /* 0x80-0x83 */ + {0x65, 0x27}, {0x65, 0x28}, {0x65, 0x29}, {0x65, 0x2A}, /* 0x84-0x87 */ + {0x65, 0x2C}, {0x65, 0x2D}, {0x65, 0x30}, {0x65, 0x31}, /* 0x88-0x8B */ + {0x65, 0x32}, {0x65, 0x33}, {0x65, 0x37}, {0x65, 0x3A}, /* 0x8C-0x8F */ + {0x65, 0x3C}, {0x65, 0x3D}, {0x65, 0x40}, {0x65, 0x41}, /* 0x90-0x93 */ + {0x65, 0x42}, {0x65, 0x43}, {0x65, 0x44}, {0x65, 0x46}, /* 0x94-0x97 */ + {0x65, 0x47}, {0x65, 0x4A}, {0x65, 0x4B}, {0x65, 0x4D}, /* 0x98-0x9B */ + {0x65, 0x4E}, {0x65, 0x50}, {0x65, 0x52}, {0x65, 0x53}, /* 0x9C-0x9F */ + {0x65, 0x54}, {0x65, 0x57}, {0x65, 0x58}, {0x65, 0x5A}, /* 0xA0-0xA3 */ + {0x65, 0x5C}, {0x65, 0x5F}, {0x65, 0x60}, {0x65, 0x61}, /* 0xA4-0xA7 */ + {0x65, 0x64}, {0x65, 0x65}, {0x65, 0x67}, {0x65, 0x68}, /* 0xA8-0xAB */ + {0x65, 0x69}, {0x65, 0x6A}, {0x65, 0x6D}, {0x65, 0x6E}, /* 0xAC-0xAF */ + {0x65, 0x6F}, {0x65, 0x71}, {0x65, 0x73}, {0x65, 0x75}, /* 0xB0-0xB3 */ + {0x65, 0x76}, {0x65, 0x78}, {0x65, 0x79}, {0x65, 0x7A}, /* 0xB4-0xB7 */ + {0x65, 0x7B}, {0x65, 0x7C}, {0x65, 0x7D}, {0x65, 0x7E}, /* 0xB8-0xBB */ + {0x65, 0x7F}, {0x65, 0x80}, {0x65, 0x81}, {0x65, 0x82}, /* 0xBC-0xBF */ + {0x65, 0x83}, {0x65, 0x84}, {0x65, 0x85}, {0x65, 0x86}, /* 0xC0-0xC3 */ + {0x65, 0x88}, {0x65, 0x89}, {0x65, 0x8A}, {0x65, 0x8D}, /* 0xC4-0xC7 */ + {0x65, 0x8E}, {0x65, 0x8F}, {0x65, 0x92}, {0x65, 0x94}, /* 0xC8-0xCB */ + {0x65, 0x95}, {0x65, 0x96}, {0x65, 0x98}, {0x65, 0x9A}, /* 0xCC-0xCF */ + {0x65, 0x9D}, {0x65, 0x9E}, {0x65, 0xA0}, {0x65, 0xA2}, /* 0xD0-0xD3 */ + {0x65, 0xA3}, {0x65, 0xA6}, {0x65, 0xA8}, {0x65, 0xAA}, /* 0xD4-0xD7 */ + {0x65, 0xAC}, {0x65, 0xAE}, {0x65, 0xB1}, {0x65, 0xB2}, /* 0xD8-0xDB */ + {0x65, 0xB3}, {0x65, 0xB4}, {0x65, 0xB5}, {0x65, 0xB6}, /* 0xDC-0xDF */ + {0x65, 0xB7}, {0x65, 0xB8}, {0x65, 0xBA}, {0x65, 0xBB}, /* 0xE0-0xE3 */ + {0x65, 0xBE}, {0x65, 0xBF}, {0x65, 0xC0}, {0x65, 0xC2}, /* 0xE4-0xE7 */ + {0x65, 0xC7}, {0x65, 0xC8}, {0x65, 0xC9}, {0x65, 0xCA}, /* 0xE8-0xEB */ + {0x65, 0xCD}, {0x65, 0xD0}, {0x65, 0xD1}, {0x65, 0xD3}, /* 0xEC-0xEF */ + {0x65, 0xD4}, {0x65, 0xD5}, {0x65, 0xD8}, {0x65, 0xD9}, /* 0xF0-0xF3 */ + {0x65, 0xDA}, {0x65, 0xDB}, {0x65, 0xDC}, {0x65, 0xDD}, /* 0xF4-0xF7 */ + {0x65, 0xDE}, {0x65, 0xDF}, {0x65, 0xE1}, {0x65, 0xE3}, /* 0xF8-0xFB */ + {0x65, 0xE4}, {0x65, 0xEA}, {0x65, 0xEB}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_95[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x65, 0xF2}, {0x65, 0xF3}, {0x65, 0xF4}, {0x65, 0xF5}, /* 0x40-0x43 */ + {0x65, 0xF8}, {0x65, 0xF9}, {0x65, 0xFB}, {0x65, 0xFC}, /* 0x44-0x47 */ + {0x65, 0xFD}, {0x65, 0xFE}, {0x65, 0xFF}, {0x66, 0x01}, /* 0x48-0x4B */ + {0x66, 0x04}, {0x66, 0x05}, {0x66, 0x07}, {0x66, 0x08}, /* 0x4C-0x4F */ + {0x66, 0x09}, {0x66, 0x0B}, {0x66, 0x0D}, {0x66, 0x10}, /* 0x50-0x53 */ + {0x66, 0x11}, {0x66, 0x12}, {0x66, 0x16}, {0x66, 0x17}, /* 0x54-0x57 */ + {0x66, 0x18}, {0x66, 0x1A}, {0x66, 0x1B}, {0x66, 0x1C}, /* 0x58-0x5B */ + {0x66, 0x1E}, {0x66, 0x21}, {0x66, 0x22}, {0x66, 0x23}, /* 0x5C-0x5F */ + {0x66, 0x24}, {0x66, 0x26}, {0x66, 0x29}, {0x66, 0x2A}, /* 0x60-0x63 */ + {0x66, 0x2B}, {0x66, 0x2C}, {0x66, 0x2E}, {0x66, 0x30}, /* 0x64-0x67 */ + {0x66, 0x32}, {0x66, 0x33}, {0x66, 0x37}, {0x66, 0x38}, /* 0x68-0x6B */ + {0x66, 0x39}, {0x66, 0x3A}, {0x66, 0x3B}, {0x66, 0x3D}, /* 0x6C-0x6F */ + {0x66, 0x3F}, {0x66, 0x40}, {0x66, 0x42}, {0x66, 0x44}, /* 0x70-0x73 */ + {0x66, 0x45}, {0x66, 0x46}, {0x66, 0x47}, {0x66, 0x48}, /* 0x74-0x77 */ + {0x66, 0x49}, {0x66, 0x4A}, {0x66, 0x4D}, {0x66, 0x4E}, /* 0x78-0x7B */ + {0x66, 0x50}, {0x66, 0x51}, {0x66, 0x58}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x66, 0x59}, {0x66, 0x5B}, {0x66, 0x5C}, {0x66, 0x5D}, /* 0x80-0x83 */ + {0x66, 0x5E}, {0x66, 0x60}, {0x66, 0x62}, {0x66, 0x63}, /* 0x84-0x87 */ + {0x66, 0x65}, {0x66, 0x67}, {0x66, 0x69}, {0x66, 0x6A}, /* 0x88-0x8B */ + {0x66, 0x6B}, {0x66, 0x6C}, {0x66, 0x6D}, {0x66, 0x71}, /* 0x8C-0x8F */ + {0x66, 0x72}, {0x66, 0x73}, {0x66, 0x75}, {0x66, 0x78}, /* 0x90-0x93 */ + {0x66, 0x79}, {0x66, 0x7B}, {0x66, 0x7C}, {0x66, 0x7D}, /* 0x94-0x97 */ + {0x66, 0x7F}, {0x66, 0x80}, {0x66, 0x81}, {0x66, 0x83}, /* 0x98-0x9B */ + {0x66, 0x85}, {0x66, 0x86}, {0x66, 0x88}, {0x66, 0x89}, /* 0x9C-0x9F */ + {0x66, 0x8A}, {0x66, 0x8B}, {0x66, 0x8D}, {0x66, 0x8E}, /* 0xA0-0xA3 */ + {0x66, 0x8F}, {0x66, 0x90}, {0x66, 0x92}, {0x66, 0x93}, /* 0xA4-0xA7 */ + {0x66, 0x94}, {0x66, 0x95}, {0x66, 0x98}, {0x66, 0x99}, /* 0xA8-0xAB */ + {0x66, 0x9A}, {0x66, 0x9B}, {0x66, 0x9C}, {0x66, 0x9E}, /* 0xAC-0xAF */ + {0x66, 0x9F}, {0x66, 0xA0}, {0x66, 0xA1}, {0x66, 0xA2}, /* 0xB0-0xB3 */ + {0x66, 0xA3}, {0x66, 0xA4}, {0x66, 0xA5}, {0x66, 0xA6}, /* 0xB4-0xB7 */ + {0x66, 0xA9}, {0x66, 0xAA}, {0x66, 0xAB}, {0x66, 0xAC}, /* 0xB8-0xBB */ + {0x66, 0xAD}, {0x66, 0xAF}, {0x66, 0xB0}, {0x66, 0xB1}, /* 0xBC-0xBF */ + {0x66, 0xB2}, {0x66, 0xB3}, {0x66, 0xB5}, {0x66, 0xB6}, /* 0xC0-0xC3 */ + {0x66, 0xB7}, {0x66, 0xB8}, {0x66, 0xBA}, {0x66, 0xBB}, /* 0xC4-0xC7 */ + {0x66, 0xBC}, {0x66, 0xBD}, {0x66, 0xBF}, {0x66, 0xC0}, /* 0xC8-0xCB */ + {0x66, 0xC1}, {0x66, 0xC2}, {0x66, 0xC3}, {0x66, 0xC4}, /* 0xCC-0xCF */ + {0x66, 0xC5}, {0x66, 0xC6}, {0x66, 0xC7}, {0x66, 0xC8}, /* 0xD0-0xD3 */ + {0x66, 0xC9}, {0x66, 0xCA}, {0x66, 0xCB}, {0x66, 0xCC}, /* 0xD4-0xD7 */ + {0x66, 0xCD}, {0x66, 0xCE}, {0x66, 0xCF}, {0x66, 0xD0}, /* 0xD8-0xDB */ + {0x66, 0xD1}, {0x66, 0xD2}, {0x66, 0xD3}, {0x66, 0xD4}, /* 0xDC-0xDF */ + {0x66, 0xD5}, {0x66, 0xD6}, {0x66, 0xD7}, {0x66, 0xD8}, /* 0xE0-0xE3 */ + {0x66, 0xDA}, {0x66, 0xDE}, {0x66, 0xDF}, {0x66, 0xE0}, /* 0xE4-0xE7 */ + {0x66, 0xE1}, {0x66, 0xE2}, {0x66, 0xE3}, {0x66, 0xE4}, /* 0xE8-0xEB */ + {0x66, 0xE5}, {0x66, 0xE7}, {0x66, 0xE8}, {0x66, 0xEA}, /* 0xEC-0xEF */ + {0x66, 0xEB}, {0x66, 0xEC}, {0x66, 0xED}, {0x66, 0xEE}, /* 0xF0-0xF3 */ + {0x66, 0xEF}, {0x66, 0xF1}, {0x66, 0xF5}, {0x66, 0xF6}, /* 0xF4-0xF7 */ + {0x66, 0xF8}, {0x66, 0xFA}, {0x66, 0xFB}, {0x66, 0xFD}, /* 0xF8-0xFB */ + {0x67, 0x01}, {0x67, 0x02}, {0x67, 0x03}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_96[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x67, 0x04}, {0x67, 0x05}, {0x67, 0x06}, {0x67, 0x07}, /* 0x40-0x43 */ + {0x67, 0x0C}, {0x67, 0x0E}, {0x67, 0x0F}, {0x67, 0x11}, /* 0x44-0x47 */ + {0x67, 0x12}, {0x67, 0x13}, {0x67, 0x16}, {0x67, 0x18}, /* 0x48-0x4B */ + {0x67, 0x19}, {0x67, 0x1A}, {0x67, 0x1C}, {0x67, 0x1E}, /* 0x4C-0x4F */ + {0x67, 0x20}, {0x67, 0x21}, {0x67, 0x22}, {0x67, 0x23}, /* 0x50-0x53 */ + {0x67, 0x24}, {0x67, 0x25}, {0x67, 0x27}, {0x67, 0x29}, /* 0x54-0x57 */ + {0x67, 0x2E}, {0x67, 0x30}, {0x67, 0x32}, {0x67, 0x33}, /* 0x58-0x5B */ + {0x67, 0x36}, {0x67, 0x37}, {0x67, 0x38}, {0x67, 0x39}, /* 0x5C-0x5F */ + {0x67, 0x3B}, {0x67, 0x3C}, {0x67, 0x3E}, {0x67, 0x3F}, /* 0x60-0x63 */ + {0x67, 0x41}, {0x67, 0x44}, {0x67, 0x45}, {0x67, 0x47}, /* 0x64-0x67 */ + {0x67, 0x4A}, {0x67, 0x4B}, {0x67, 0x4D}, {0x67, 0x52}, /* 0x68-0x6B */ + {0x67, 0x54}, {0x67, 0x55}, {0x67, 0x57}, {0x67, 0x58}, /* 0x6C-0x6F */ + {0x67, 0x59}, {0x67, 0x5A}, {0x67, 0x5B}, {0x67, 0x5D}, /* 0x70-0x73 */ + {0x67, 0x62}, {0x67, 0x63}, {0x67, 0x64}, {0x67, 0x66}, /* 0x74-0x77 */ + {0x67, 0x67}, {0x67, 0x6B}, {0x67, 0x6C}, {0x67, 0x6E}, /* 0x78-0x7B */ + {0x67, 0x71}, {0x67, 0x74}, {0x67, 0x76}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x67, 0x78}, {0x67, 0x79}, {0x67, 0x7A}, {0x67, 0x7B}, /* 0x80-0x83 */ + {0x67, 0x7D}, {0x67, 0x80}, {0x67, 0x82}, {0x67, 0x83}, /* 0x84-0x87 */ + {0x67, 0x85}, {0x67, 0x86}, {0x67, 0x88}, {0x67, 0x8A}, /* 0x88-0x8B */ + {0x67, 0x8C}, {0x67, 0x8D}, {0x67, 0x8E}, {0x67, 0x8F}, /* 0x8C-0x8F */ + {0x67, 0x91}, {0x67, 0x92}, {0x67, 0x93}, {0x67, 0x94}, /* 0x90-0x93 */ + {0x67, 0x96}, {0x67, 0x99}, {0x67, 0x9B}, {0x67, 0x9F}, /* 0x94-0x97 */ + {0x67, 0xA0}, {0x67, 0xA1}, {0x67, 0xA4}, {0x67, 0xA6}, /* 0x98-0x9B */ + {0x67, 0xA9}, {0x67, 0xAC}, {0x67, 0xAE}, {0x67, 0xB1}, /* 0x9C-0x9F */ + {0x67, 0xB2}, {0x67, 0xB4}, {0x67, 0xB9}, {0x67, 0xBA}, /* 0xA0-0xA3 */ + {0x67, 0xBB}, {0x67, 0xBC}, {0x67, 0xBD}, {0x67, 0xBE}, /* 0xA4-0xA7 */ + {0x67, 0xBF}, {0x67, 0xC0}, {0x67, 0xC2}, {0x67, 0xC5}, /* 0xA8-0xAB */ + {0x67, 0xC6}, {0x67, 0xC7}, {0x67, 0xC8}, {0x67, 0xC9}, /* 0xAC-0xAF */ + {0x67, 0xCA}, {0x67, 0xCB}, {0x67, 0xCC}, {0x67, 0xCD}, /* 0xB0-0xB3 */ + {0x67, 0xCE}, {0x67, 0xD5}, {0x67, 0xD6}, {0x67, 0xD7}, /* 0xB4-0xB7 */ + {0x67, 0xDB}, {0x67, 0xDF}, {0x67, 0xE1}, {0x67, 0xE3}, /* 0xB8-0xBB */ + {0x67, 0xE4}, {0x67, 0xE6}, {0x67, 0xE7}, {0x67, 0xE8}, /* 0xBC-0xBF */ + {0x67, 0xEA}, {0x67, 0xEB}, {0x67, 0xED}, {0x67, 0xEE}, /* 0xC0-0xC3 */ + {0x67, 0xF2}, {0x67, 0xF5}, {0x67, 0xF6}, {0x67, 0xF7}, /* 0xC4-0xC7 */ + {0x67, 0xF8}, {0x67, 0xF9}, {0x67, 0xFA}, {0x67, 0xFB}, /* 0xC8-0xCB */ + {0x67, 0xFC}, {0x67, 0xFE}, {0x68, 0x01}, {0x68, 0x02}, /* 0xCC-0xCF */ + {0x68, 0x03}, {0x68, 0x04}, {0x68, 0x06}, {0x68, 0x0D}, /* 0xD0-0xD3 */ + {0x68, 0x10}, {0x68, 0x12}, {0x68, 0x14}, {0x68, 0x15}, /* 0xD4-0xD7 */ + {0x68, 0x18}, {0x68, 0x19}, {0x68, 0x1A}, {0x68, 0x1B}, /* 0xD8-0xDB */ + {0x68, 0x1C}, {0x68, 0x1E}, {0x68, 0x1F}, {0x68, 0x20}, /* 0xDC-0xDF */ + {0x68, 0x22}, {0x68, 0x23}, {0x68, 0x24}, {0x68, 0x25}, /* 0xE0-0xE3 */ + {0x68, 0x26}, {0x68, 0x27}, {0x68, 0x28}, {0x68, 0x2B}, /* 0xE4-0xE7 */ + {0x68, 0x2C}, {0x68, 0x2D}, {0x68, 0x2E}, {0x68, 0x2F}, /* 0xE8-0xEB */ + {0x68, 0x30}, {0x68, 0x31}, {0x68, 0x34}, {0x68, 0x35}, /* 0xEC-0xEF */ + {0x68, 0x36}, {0x68, 0x3A}, {0x68, 0x3B}, {0x68, 0x3F}, /* 0xF0-0xF3 */ + {0x68, 0x47}, {0x68, 0x4B}, {0x68, 0x4D}, {0x68, 0x4F}, /* 0xF4-0xF7 */ + {0x68, 0x52}, {0x68, 0x56}, {0x68, 0x57}, {0x68, 0x58}, /* 0xF8-0xFB */ + {0x68, 0x59}, {0x68, 0x5A}, {0x68, 0x5B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_97[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x68, 0x5C}, {0x68, 0x5D}, {0x68, 0x5E}, {0x68, 0x5F}, /* 0x40-0x43 */ + {0x68, 0x6A}, {0x68, 0x6C}, {0x68, 0x6D}, {0x68, 0x6E}, /* 0x44-0x47 */ + {0x68, 0x6F}, {0x68, 0x70}, {0x68, 0x71}, {0x68, 0x72}, /* 0x48-0x4B */ + {0x68, 0x73}, {0x68, 0x75}, {0x68, 0x78}, {0x68, 0x79}, /* 0x4C-0x4F */ + {0x68, 0x7A}, {0x68, 0x7B}, {0x68, 0x7C}, {0x68, 0x7D}, /* 0x50-0x53 */ + {0x68, 0x7E}, {0x68, 0x7F}, {0x68, 0x80}, {0x68, 0x82}, /* 0x54-0x57 */ + {0x68, 0x84}, {0x68, 0x87}, {0x68, 0x88}, {0x68, 0x89}, /* 0x58-0x5B */ + {0x68, 0x8A}, {0x68, 0x8B}, {0x68, 0x8C}, {0x68, 0x8D}, /* 0x5C-0x5F */ + {0x68, 0x8E}, {0x68, 0x90}, {0x68, 0x91}, {0x68, 0x92}, /* 0x60-0x63 */ + {0x68, 0x94}, {0x68, 0x95}, {0x68, 0x96}, {0x68, 0x98}, /* 0x64-0x67 */ + {0x68, 0x99}, {0x68, 0x9A}, {0x68, 0x9B}, {0x68, 0x9C}, /* 0x68-0x6B */ + {0x68, 0x9D}, {0x68, 0x9E}, {0x68, 0x9F}, {0x68, 0xA0}, /* 0x6C-0x6F */ + {0x68, 0xA1}, {0x68, 0xA3}, {0x68, 0xA4}, {0x68, 0xA5}, /* 0x70-0x73 */ + {0x68, 0xA9}, {0x68, 0xAA}, {0x68, 0xAB}, {0x68, 0xAC}, /* 0x74-0x77 */ + {0x68, 0xAE}, {0x68, 0xB1}, {0x68, 0xB2}, {0x68, 0xB4}, /* 0x78-0x7B */ + {0x68, 0xB6}, {0x68, 0xB7}, {0x68, 0xB8}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x68, 0xB9}, {0x68, 0xBA}, {0x68, 0xBB}, {0x68, 0xBC}, /* 0x80-0x83 */ + {0x68, 0xBD}, {0x68, 0xBE}, {0x68, 0xBF}, {0x68, 0xC1}, /* 0x84-0x87 */ + {0x68, 0xC3}, {0x68, 0xC4}, {0x68, 0xC5}, {0x68, 0xC6}, /* 0x88-0x8B */ + {0x68, 0xC7}, {0x68, 0xC8}, {0x68, 0xCA}, {0x68, 0xCC}, /* 0x8C-0x8F */ + {0x68, 0xCE}, {0x68, 0xCF}, {0x68, 0xD0}, {0x68, 0xD1}, /* 0x90-0x93 */ + {0x68, 0xD3}, {0x68, 0xD4}, {0x68, 0xD6}, {0x68, 0xD7}, /* 0x94-0x97 */ + {0x68, 0xD9}, {0x68, 0xDB}, {0x68, 0xDC}, {0x68, 0xDD}, /* 0x98-0x9B */ + {0x68, 0xDE}, {0x68, 0xDF}, {0x68, 0xE1}, {0x68, 0xE2}, /* 0x9C-0x9F */ + {0x68, 0xE4}, {0x68, 0xE5}, {0x68, 0xE6}, {0x68, 0xE7}, /* 0xA0-0xA3 */ + {0x68, 0xE8}, {0x68, 0xE9}, {0x68, 0xEA}, {0x68, 0xEB}, /* 0xA4-0xA7 */ + {0x68, 0xEC}, {0x68, 0xED}, {0x68, 0xEF}, {0x68, 0xF2}, /* 0xA8-0xAB */ + {0x68, 0xF3}, {0x68, 0xF4}, {0x68, 0xF6}, {0x68, 0xF7}, /* 0xAC-0xAF */ + {0x68, 0xF8}, {0x68, 0xFB}, {0x68, 0xFD}, {0x68, 0xFE}, /* 0xB0-0xB3 */ + {0x68, 0xFF}, {0x69, 0x00}, {0x69, 0x02}, {0x69, 0x03}, /* 0xB4-0xB7 */ + {0x69, 0x04}, {0x69, 0x06}, {0x69, 0x07}, {0x69, 0x08}, /* 0xB8-0xBB */ + {0x69, 0x09}, {0x69, 0x0A}, {0x69, 0x0C}, {0x69, 0x0F}, /* 0xBC-0xBF */ + {0x69, 0x11}, {0x69, 0x13}, {0x69, 0x14}, {0x69, 0x15}, /* 0xC0-0xC3 */ + {0x69, 0x16}, {0x69, 0x17}, {0x69, 0x18}, {0x69, 0x19}, /* 0xC4-0xC7 */ + {0x69, 0x1A}, {0x69, 0x1B}, {0x69, 0x1C}, {0x69, 0x1D}, /* 0xC8-0xCB */ + {0x69, 0x1E}, {0x69, 0x21}, {0x69, 0x22}, {0x69, 0x23}, /* 0xCC-0xCF */ + {0x69, 0x25}, {0x69, 0x26}, {0x69, 0x27}, {0x69, 0x28}, /* 0xD0-0xD3 */ + {0x69, 0x29}, {0x69, 0x2A}, {0x69, 0x2B}, {0x69, 0x2C}, /* 0xD4-0xD7 */ + {0x69, 0x2E}, {0x69, 0x2F}, {0x69, 0x31}, {0x69, 0x32}, /* 0xD8-0xDB */ + {0x69, 0x33}, {0x69, 0x35}, {0x69, 0x36}, {0x69, 0x37}, /* 0xDC-0xDF */ + {0x69, 0x38}, {0x69, 0x3A}, {0x69, 0x3B}, {0x69, 0x3C}, /* 0xE0-0xE3 */ + {0x69, 0x3E}, {0x69, 0x40}, {0x69, 0x41}, {0x69, 0x43}, /* 0xE4-0xE7 */ + {0x69, 0x44}, {0x69, 0x45}, {0x69, 0x46}, {0x69, 0x47}, /* 0xE8-0xEB */ + {0x69, 0x48}, {0x69, 0x49}, {0x69, 0x4A}, {0x69, 0x4B}, /* 0xEC-0xEF */ + {0x69, 0x4C}, {0x69, 0x4D}, {0x69, 0x4E}, {0x69, 0x4F}, /* 0xF0-0xF3 */ + {0x69, 0x50}, {0x69, 0x51}, {0x69, 0x52}, {0x69, 0x53}, /* 0xF4-0xF7 */ + {0x69, 0x55}, {0x69, 0x56}, {0x69, 0x58}, {0x69, 0x59}, /* 0xF8-0xFB */ + {0x69, 0x5B}, {0x69, 0x5C}, {0x69, 0x5F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_98[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x69, 0x61}, {0x69, 0x62}, {0x69, 0x64}, {0x69, 0x65}, /* 0x40-0x43 */ + {0x69, 0x67}, {0x69, 0x68}, {0x69, 0x69}, {0x69, 0x6A}, /* 0x44-0x47 */ + {0x69, 0x6C}, {0x69, 0x6D}, {0x69, 0x6F}, {0x69, 0x70}, /* 0x48-0x4B */ + {0x69, 0x72}, {0x69, 0x73}, {0x69, 0x74}, {0x69, 0x75}, /* 0x4C-0x4F */ + {0x69, 0x76}, {0x69, 0x7A}, {0x69, 0x7B}, {0x69, 0x7D}, /* 0x50-0x53 */ + {0x69, 0x7E}, {0x69, 0x7F}, {0x69, 0x81}, {0x69, 0x83}, /* 0x54-0x57 */ + {0x69, 0x85}, {0x69, 0x8A}, {0x69, 0x8B}, {0x69, 0x8C}, /* 0x58-0x5B */ + {0x69, 0x8E}, {0x69, 0x8F}, {0x69, 0x90}, {0x69, 0x91}, /* 0x5C-0x5F */ + {0x69, 0x92}, {0x69, 0x93}, {0x69, 0x96}, {0x69, 0x97}, /* 0x60-0x63 */ + {0x69, 0x99}, {0x69, 0x9A}, {0x69, 0x9D}, {0x69, 0x9E}, /* 0x64-0x67 */ + {0x69, 0x9F}, {0x69, 0xA0}, {0x69, 0xA1}, {0x69, 0xA2}, /* 0x68-0x6B */ + {0x69, 0xA3}, {0x69, 0xA4}, {0x69, 0xA5}, {0x69, 0xA6}, /* 0x6C-0x6F */ + {0x69, 0xA9}, {0x69, 0xAA}, {0x69, 0xAC}, {0x69, 0xAE}, /* 0x70-0x73 */ + {0x69, 0xAF}, {0x69, 0xB0}, {0x69, 0xB2}, {0x69, 0xB3}, /* 0x74-0x77 */ + {0x69, 0xB5}, {0x69, 0xB6}, {0x69, 0xB8}, {0x69, 0xB9}, /* 0x78-0x7B */ + {0x69, 0xBA}, {0x69, 0xBC}, {0x69, 0xBD}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x69, 0xBE}, {0x69, 0xBF}, {0x69, 0xC0}, {0x69, 0xC2}, /* 0x80-0x83 */ + {0x69, 0xC3}, {0x69, 0xC4}, {0x69, 0xC5}, {0x69, 0xC6}, /* 0x84-0x87 */ + {0x69, 0xC7}, {0x69, 0xC8}, {0x69, 0xC9}, {0x69, 0xCB}, /* 0x88-0x8B */ + {0x69, 0xCD}, {0x69, 0xCF}, {0x69, 0xD1}, {0x69, 0xD2}, /* 0x8C-0x8F */ + {0x69, 0xD3}, {0x69, 0xD5}, {0x69, 0xD6}, {0x69, 0xD7}, /* 0x90-0x93 */ + {0x69, 0xD8}, {0x69, 0xD9}, {0x69, 0xDA}, {0x69, 0xDC}, /* 0x94-0x97 */ + {0x69, 0xDD}, {0x69, 0xDE}, {0x69, 0xE1}, {0x69, 0xE2}, /* 0x98-0x9B */ + {0x69, 0xE3}, {0x69, 0xE4}, {0x69, 0xE5}, {0x69, 0xE6}, /* 0x9C-0x9F */ + {0x69, 0xE7}, {0x69, 0xE8}, {0x69, 0xE9}, {0x69, 0xEA}, /* 0xA0-0xA3 */ + {0x69, 0xEB}, {0x69, 0xEC}, {0x69, 0xEE}, {0x69, 0xEF}, /* 0xA4-0xA7 */ + {0x69, 0xF0}, {0x69, 0xF1}, {0x69, 0xF3}, {0x69, 0xF4}, /* 0xA8-0xAB */ + {0x69, 0xF5}, {0x69, 0xF6}, {0x69, 0xF7}, {0x69, 0xF8}, /* 0xAC-0xAF */ + {0x69, 0xF9}, {0x69, 0xFA}, {0x69, 0xFB}, {0x69, 0xFC}, /* 0xB0-0xB3 */ + {0x69, 0xFE}, {0x6A, 0x00}, {0x6A, 0x01}, {0x6A, 0x02}, /* 0xB4-0xB7 */ + {0x6A, 0x03}, {0x6A, 0x04}, {0x6A, 0x05}, {0x6A, 0x06}, /* 0xB8-0xBB */ + {0x6A, 0x07}, {0x6A, 0x08}, {0x6A, 0x09}, {0x6A, 0x0B}, /* 0xBC-0xBF */ + {0x6A, 0x0C}, {0x6A, 0x0D}, {0x6A, 0x0E}, {0x6A, 0x0F}, /* 0xC0-0xC3 */ + {0x6A, 0x10}, {0x6A, 0x11}, {0x6A, 0x12}, {0x6A, 0x13}, /* 0xC4-0xC7 */ + {0x6A, 0x14}, {0x6A, 0x15}, {0x6A, 0x16}, {0x6A, 0x19}, /* 0xC8-0xCB */ + {0x6A, 0x1A}, {0x6A, 0x1B}, {0x6A, 0x1C}, {0x6A, 0x1D}, /* 0xCC-0xCF */ + {0x6A, 0x1E}, {0x6A, 0x20}, {0x6A, 0x22}, {0x6A, 0x23}, /* 0xD0-0xD3 */ + {0x6A, 0x24}, {0x6A, 0x25}, {0x6A, 0x26}, {0x6A, 0x27}, /* 0xD4-0xD7 */ + {0x6A, 0x29}, {0x6A, 0x2B}, {0x6A, 0x2C}, {0x6A, 0x2D}, /* 0xD8-0xDB */ + {0x6A, 0x2E}, {0x6A, 0x30}, {0x6A, 0x32}, {0x6A, 0x33}, /* 0xDC-0xDF */ + {0x6A, 0x34}, {0x6A, 0x36}, {0x6A, 0x37}, {0x6A, 0x38}, /* 0xE0-0xE3 */ + {0x6A, 0x39}, {0x6A, 0x3A}, {0x6A, 0x3B}, {0x6A, 0x3C}, /* 0xE4-0xE7 */ + {0x6A, 0x3F}, {0x6A, 0x40}, {0x6A, 0x41}, {0x6A, 0x42}, /* 0xE8-0xEB */ + {0x6A, 0x43}, {0x6A, 0x45}, {0x6A, 0x46}, {0x6A, 0x48}, /* 0xEC-0xEF */ + {0x6A, 0x49}, {0x6A, 0x4A}, {0x6A, 0x4B}, {0x6A, 0x4C}, /* 0xF0-0xF3 */ + {0x6A, 0x4D}, {0x6A, 0x4E}, {0x6A, 0x4F}, {0x6A, 0x51}, /* 0xF4-0xF7 */ + {0x6A, 0x52}, {0x6A, 0x53}, {0x6A, 0x54}, {0x6A, 0x55}, /* 0xF8-0xFB */ + {0x6A, 0x56}, {0x6A, 0x57}, {0x6A, 0x5A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_99[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6A, 0x5C}, {0x6A, 0x5D}, {0x6A, 0x5E}, {0x6A, 0x5F}, /* 0x40-0x43 */ + {0x6A, 0x60}, {0x6A, 0x62}, {0x6A, 0x63}, {0x6A, 0x64}, /* 0x44-0x47 */ + {0x6A, 0x66}, {0x6A, 0x67}, {0x6A, 0x68}, {0x6A, 0x69}, /* 0x48-0x4B */ + {0x6A, 0x6A}, {0x6A, 0x6B}, {0x6A, 0x6C}, {0x6A, 0x6D}, /* 0x4C-0x4F */ + {0x6A, 0x6E}, {0x6A, 0x6F}, {0x6A, 0x70}, {0x6A, 0x72}, /* 0x50-0x53 */ + {0x6A, 0x73}, {0x6A, 0x74}, {0x6A, 0x75}, {0x6A, 0x76}, /* 0x54-0x57 */ + {0x6A, 0x77}, {0x6A, 0x78}, {0x6A, 0x7A}, {0x6A, 0x7B}, /* 0x58-0x5B */ + {0x6A, 0x7D}, {0x6A, 0x7E}, {0x6A, 0x7F}, {0x6A, 0x81}, /* 0x5C-0x5F */ + {0x6A, 0x82}, {0x6A, 0x83}, {0x6A, 0x85}, {0x6A, 0x86}, /* 0x60-0x63 */ + {0x6A, 0x87}, {0x6A, 0x88}, {0x6A, 0x89}, {0x6A, 0x8A}, /* 0x64-0x67 */ + {0x6A, 0x8B}, {0x6A, 0x8C}, {0x6A, 0x8D}, {0x6A, 0x8F}, /* 0x68-0x6B */ + {0x6A, 0x92}, {0x6A, 0x93}, {0x6A, 0x94}, {0x6A, 0x95}, /* 0x6C-0x6F */ + {0x6A, 0x96}, {0x6A, 0x98}, {0x6A, 0x99}, {0x6A, 0x9A}, /* 0x70-0x73 */ + {0x6A, 0x9B}, {0x6A, 0x9C}, {0x6A, 0x9D}, {0x6A, 0x9E}, /* 0x74-0x77 */ + {0x6A, 0x9F}, {0x6A, 0xA1}, {0x6A, 0xA2}, {0x6A, 0xA3}, /* 0x78-0x7B */ + {0x6A, 0xA4}, {0x6A, 0xA5}, {0x6A, 0xA6}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6A, 0xA7}, {0x6A, 0xA8}, {0x6A, 0xAA}, {0x6A, 0xAD}, /* 0x80-0x83 */ + {0x6A, 0xAE}, {0x6A, 0xAF}, {0x6A, 0xB0}, {0x6A, 0xB1}, /* 0x84-0x87 */ + {0x6A, 0xB2}, {0x6A, 0xB3}, {0x6A, 0xB4}, {0x6A, 0xB5}, /* 0x88-0x8B */ + {0x6A, 0xB6}, {0x6A, 0xB7}, {0x6A, 0xB8}, {0x6A, 0xB9}, /* 0x8C-0x8F */ + {0x6A, 0xBA}, {0x6A, 0xBB}, {0x6A, 0xBC}, {0x6A, 0xBD}, /* 0x90-0x93 */ + {0x6A, 0xBE}, {0x6A, 0xBF}, {0x6A, 0xC0}, {0x6A, 0xC1}, /* 0x94-0x97 */ + {0x6A, 0xC2}, {0x6A, 0xC3}, {0x6A, 0xC4}, {0x6A, 0xC5}, /* 0x98-0x9B */ + {0x6A, 0xC6}, {0x6A, 0xC7}, {0x6A, 0xC8}, {0x6A, 0xC9}, /* 0x9C-0x9F */ + {0x6A, 0xCA}, {0x6A, 0xCB}, {0x6A, 0xCC}, {0x6A, 0xCD}, /* 0xA0-0xA3 */ + {0x6A, 0xCE}, {0x6A, 0xCF}, {0x6A, 0xD0}, {0x6A, 0xD1}, /* 0xA4-0xA7 */ + {0x6A, 0xD2}, {0x6A, 0xD3}, {0x6A, 0xD4}, {0x6A, 0xD5}, /* 0xA8-0xAB */ + {0x6A, 0xD6}, {0x6A, 0xD7}, {0x6A, 0xD8}, {0x6A, 0xD9}, /* 0xAC-0xAF */ + {0x6A, 0xDA}, {0x6A, 0xDB}, {0x6A, 0xDC}, {0x6A, 0xDD}, /* 0xB0-0xB3 */ + {0x6A, 0xDE}, {0x6A, 0xDF}, {0x6A, 0xE0}, {0x6A, 0xE1}, /* 0xB4-0xB7 */ + {0x6A, 0xE2}, {0x6A, 0xE3}, {0x6A, 0xE4}, {0x6A, 0xE5}, /* 0xB8-0xBB */ + {0x6A, 0xE6}, {0x6A, 0xE7}, {0x6A, 0xE8}, {0x6A, 0xE9}, /* 0xBC-0xBF */ + {0x6A, 0xEA}, {0x6A, 0xEB}, {0x6A, 0xEC}, {0x6A, 0xED}, /* 0xC0-0xC3 */ + {0x6A, 0xEE}, {0x6A, 0xEF}, {0x6A, 0xF0}, {0x6A, 0xF1}, /* 0xC4-0xC7 */ + {0x6A, 0xF2}, {0x6A, 0xF3}, {0x6A, 0xF4}, {0x6A, 0xF5}, /* 0xC8-0xCB */ + {0x6A, 0xF6}, {0x6A, 0xF7}, {0x6A, 0xF8}, {0x6A, 0xF9}, /* 0xCC-0xCF */ + {0x6A, 0xFA}, {0x6A, 0xFB}, {0x6A, 0xFC}, {0x6A, 0xFD}, /* 0xD0-0xD3 */ + {0x6A, 0xFE}, {0x6A, 0xFF}, {0x6B, 0x00}, {0x6B, 0x01}, /* 0xD4-0xD7 */ + {0x6B, 0x02}, {0x6B, 0x03}, {0x6B, 0x04}, {0x6B, 0x05}, /* 0xD8-0xDB */ + {0x6B, 0x06}, {0x6B, 0x07}, {0x6B, 0x08}, {0x6B, 0x09}, /* 0xDC-0xDF */ + {0x6B, 0x0A}, {0x6B, 0x0B}, {0x6B, 0x0C}, {0x6B, 0x0D}, /* 0xE0-0xE3 */ + {0x6B, 0x0E}, {0x6B, 0x0F}, {0x6B, 0x10}, {0x6B, 0x11}, /* 0xE4-0xE7 */ + {0x6B, 0x12}, {0x6B, 0x13}, {0x6B, 0x14}, {0x6B, 0x15}, /* 0xE8-0xEB */ + {0x6B, 0x16}, {0x6B, 0x17}, {0x6B, 0x18}, {0x6B, 0x19}, /* 0xEC-0xEF */ + {0x6B, 0x1A}, {0x6B, 0x1B}, {0x6B, 0x1C}, {0x6B, 0x1D}, /* 0xF0-0xF3 */ + {0x6B, 0x1E}, {0x6B, 0x1F}, {0x6B, 0x25}, {0x6B, 0x26}, /* 0xF4-0xF7 */ + {0x6B, 0x28}, {0x6B, 0x29}, {0x6B, 0x2A}, {0x6B, 0x2B}, /* 0xF8-0xFB */ + {0x6B, 0x2C}, {0x6B, 0x2D}, {0x6B, 0x2E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9A[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6B, 0x2F}, {0x6B, 0x30}, {0x6B, 0x31}, {0x6B, 0x33}, /* 0x40-0x43 */ + {0x6B, 0x34}, {0x6B, 0x35}, {0x6B, 0x36}, {0x6B, 0x38}, /* 0x44-0x47 */ + {0x6B, 0x3B}, {0x6B, 0x3C}, {0x6B, 0x3D}, {0x6B, 0x3F}, /* 0x48-0x4B */ + {0x6B, 0x40}, {0x6B, 0x41}, {0x6B, 0x42}, {0x6B, 0x44}, /* 0x4C-0x4F */ + {0x6B, 0x45}, {0x6B, 0x48}, {0x6B, 0x4A}, {0x6B, 0x4B}, /* 0x50-0x53 */ + {0x6B, 0x4D}, {0x6B, 0x4E}, {0x6B, 0x4F}, {0x6B, 0x50}, /* 0x54-0x57 */ + {0x6B, 0x51}, {0x6B, 0x52}, {0x6B, 0x53}, {0x6B, 0x54}, /* 0x58-0x5B */ + {0x6B, 0x55}, {0x6B, 0x56}, {0x6B, 0x57}, {0x6B, 0x58}, /* 0x5C-0x5F */ + {0x6B, 0x5A}, {0x6B, 0x5B}, {0x6B, 0x5C}, {0x6B, 0x5D}, /* 0x60-0x63 */ + {0x6B, 0x5E}, {0x6B, 0x5F}, {0x6B, 0x60}, {0x6B, 0x61}, /* 0x64-0x67 */ + {0x6B, 0x68}, {0x6B, 0x69}, {0x6B, 0x6B}, {0x6B, 0x6C}, /* 0x68-0x6B */ + {0x6B, 0x6D}, {0x6B, 0x6E}, {0x6B, 0x6F}, {0x6B, 0x70}, /* 0x6C-0x6F */ + {0x6B, 0x71}, {0x6B, 0x72}, {0x6B, 0x73}, {0x6B, 0x74}, /* 0x70-0x73 */ + {0x6B, 0x75}, {0x6B, 0x76}, {0x6B, 0x77}, {0x6B, 0x78}, /* 0x74-0x77 */ + {0x6B, 0x7A}, {0x6B, 0x7D}, {0x6B, 0x7E}, {0x6B, 0x7F}, /* 0x78-0x7B */ + {0x6B, 0x80}, {0x6B, 0x85}, {0x6B, 0x88}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6B, 0x8C}, {0x6B, 0x8E}, {0x6B, 0x8F}, {0x6B, 0x90}, /* 0x80-0x83 */ + {0x6B, 0x91}, {0x6B, 0x94}, {0x6B, 0x95}, {0x6B, 0x97}, /* 0x84-0x87 */ + {0x6B, 0x98}, {0x6B, 0x99}, {0x6B, 0x9C}, {0x6B, 0x9D}, /* 0x88-0x8B */ + {0x6B, 0x9E}, {0x6B, 0x9F}, {0x6B, 0xA0}, {0x6B, 0xA2}, /* 0x8C-0x8F */ + {0x6B, 0xA3}, {0x6B, 0xA4}, {0x6B, 0xA5}, {0x6B, 0xA6}, /* 0x90-0x93 */ + {0x6B, 0xA7}, {0x6B, 0xA8}, {0x6B, 0xA9}, {0x6B, 0xAB}, /* 0x94-0x97 */ + {0x6B, 0xAC}, {0x6B, 0xAD}, {0x6B, 0xAE}, {0x6B, 0xAF}, /* 0x98-0x9B */ + {0x6B, 0xB0}, {0x6B, 0xB1}, {0x6B, 0xB2}, {0x6B, 0xB6}, /* 0x9C-0x9F */ + {0x6B, 0xB8}, {0x6B, 0xB9}, {0x6B, 0xBA}, {0x6B, 0xBB}, /* 0xA0-0xA3 */ + {0x6B, 0xBC}, {0x6B, 0xBD}, {0x6B, 0xBE}, {0x6B, 0xC0}, /* 0xA4-0xA7 */ + {0x6B, 0xC3}, {0x6B, 0xC4}, {0x6B, 0xC6}, {0x6B, 0xC7}, /* 0xA8-0xAB */ + {0x6B, 0xC8}, {0x6B, 0xC9}, {0x6B, 0xCA}, {0x6B, 0xCC}, /* 0xAC-0xAF */ + {0x6B, 0xCE}, {0x6B, 0xD0}, {0x6B, 0xD1}, {0x6B, 0xD8}, /* 0xB0-0xB3 */ + {0x6B, 0xDA}, {0x6B, 0xDC}, {0x6B, 0xDD}, {0x6B, 0xDE}, /* 0xB4-0xB7 */ + {0x6B, 0xDF}, {0x6B, 0xE0}, {0x6B, 0xE2}, {0x6B, 0xE3}, /* 0xB8-0xBB */ + {0x6B, 0xE4}, {0x6B, 0xE5}, {0x6B, 0xE6}, {0x6B, 0xE7}, /* 0xBC-0xBF */ + {0x6B, 0xE8}, {0x6B, 0xE9}, {0x6B, 0xEC}, {0x6B, 0xED}, /* 0xC0-0xC3 */ + {0x6B, 0xEE}, {0x6B, 0xF0}, {0x6B, 0xF1}, {0x6B, 0xF2}, /* 0xC4-0xC7 */ + {0x6B, 0xF4}, {0x6B, 0xF6}, {0x6B, 0xF7}, {0x6B, 0xF8}, /* 0xC8-0xCB */ + {0x6B, 0xFA}, {0x6B, 0xFB}, {0x6B, 0xFC}, {0x6B, 0xFE}, /* 0xCC-0xCF */ + {0x6B, 0xFF}, {0x6C, 0x00}, {0x6C, 0x01}, {0x6C, 0x02}, /* 0xD0-0xD3 */ + {0x6C, 0x03}, {0x6C, 0x04}, {0x6C, 0x08}, {0x6C, 0x09}, /* 0xD4-0xD7 */ + {0x6C, 0x0A}, {0x6C, 0x0B}, {0x6C, 0x0C}, {0x6C, 0x0E}, /* 0xD8-0xDB */ + {0x6C, 0x12}, {0x6C, 0x17}, {0x6C, 0x1C}, {0x6C, 0x1D}, /* 0xDC-0xDF */ + {0x6C, 0x1E}, {0x6C, 0x20}, {0x6C, 0x23}, {0x6C, 0x25}, /* 0xE0-0xE3 */ + {0x6C, 0x2B}, {0x6C, 0x2C}, {0x6C, 0x2D}, {0x6C, 0x31}, /* 0xE4-0xE7 */ + {0x6C, 0x33}, {0x6C, 0x36}, {0x6C, 0x37}, {0x6C, 0x39}, /* 0xE8-0xEB */ + {0x6C, 0x3A}, {0x6C, 0x3B}, {0x6C, 0x3C}, {0x6C, 0x3E}, /* 0xEC-0xEF */ + {0x6C, 0x3F}, {0x6C, 0x43}, {0x6C, 0x44}, {0x6C, 0x45}, /* 0xF0-0xF3 */ + {0x6C, 0x48}, {0x6C, 0x4B}, {0x6C, 0x4C}, {0x6C, 0x4D}, /* 0xF4-0xF7 */ + {0x6C, 0x4E}, {0x6C, 0x4F}, {0x6C, 0x51}, {0x6C, 0x52}, /* 0xF8-0xFB */ + {0x6C, 0x53}, {0x6C, 0x56}, {0x6C, 0x58}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9B[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6C, 0x59}, {0x6C, 0x5A}, {0x6C, 0x62}, {0x6C, 0x63}, /* 0x40-0x43 */ + {0x6C, 0x65}, {0x6C, 0x66}, {0x6C, 0x67}, {0x6C, 0x6B}, /* 0x44-0x47 */ + {0x6C, 0x6C}, {0x6C, 0x6D}, {0x6C, 0x6E}, {0x6C, 0x6F}, /* 0x48-0x4B */ + {0x6C, 0x71}, {0x6C, 0x73}, {0x6C, 0x75}, {0x6C, 0x77}, /* 0x4C-0x4F */ + {0x6C, 0x78}, {0x6C, 0x7A}, {0x6C, 0x7B}, {0x6C, 0x7C}, /* 0x50-0x53 */ + {0x6C, 0x7F}, {0x6C, 0x80}, {0x6C, 0x84}, {0x6C, 0x87}, /* 0x54-0x57 */ + {0x6C, 0x8A}, {0x6C, 0x8B}, {0x6C, 0x8D}, {0x6C, 0x8E}, /* 0x58-0x5B */ + {0x6C, 0x91}, {0x6C, 0x92}, {0x6C, 0x95}, {0x6C, 0x96}, /* 0x5C-0x5F */ + {0x6C, 0x97}, {0x6C, 0x98}, {0x6C, 0x9A}, {0x6C, 0x9C}, /* 0x60-0x63 */ + {0x6C, 0x9D}, {0x6C, 0x9E}, {0x6C, 0xA0}, {0x6C, 0xA2}, /* 0x64-0x67 */ + {0x6C, 0xA8}, {0x6C, 0xAC}, {0x6C, 0xAF}, {0x6C, 0xB0}, /* 0x68-0x6B */ + {0x6C, 0xB4}, {0x6C, 0xB5}, {0x6C, 0xB6}, {0x6C, 0xB7}, /* 0x6C-0x6F */ + {0x6C, 0xBA}, {0x6C, 0xC0}, {0x6C, 0xC1}, {0x6C, 0xC2}, /* 0x70-0x73 */ + {0x6C, 0xC3}, {0x6C, 0xC6}, {0x6C, 0xC7}, {0x6C, 0xC8}, /* 0x74-0x77 */ + {0x6C, 0xCB}, {0x6C, 0xCD}, {0x6C, 0xCE}, {0x6C, 0xCF}, /* 0x78-0x7B */ + {0x6C, 0xD1}, {0x6C, 0xD2}, {0x6C, 0xD8}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6C, 0xD9}, {0x6C, 0xDA}, {0x6C, 0xDC}, {0x6C, 0xDD}, /* 0x80-0x83 */ + {0x6C, 0xDF}, {0x6C, 0xE4}, {0x6C, 0xE6}, {0x6C, 0xE7}, /* 0x84-0x87 */ + {0x6C, 0xE9}, {0x6C, 0xEC}, {0x6C, 0xED}, {0x6C, 0xF2}, /* 0x88-0x8B */ + {0x6C, 0xF4}, {0x6C, 0xF9}, {0x6C, 0xFF}, {0x6D, 0x00}, /* 0x8C-0x8F */ + {0x6D, 0x02}, {0x6D, 0x03}, {0x6D, 0x05}, {0x6D, 0x06}, /* 0x90-0x93 */ + {0x6D, 0x08}, {0x6D, 0x09}, {0x6D, 0x0A}, {0x6D, 0x0D}, /* 0x94-0x97 */ + {0x6D, 0x0F}, {0x6D, 0x10}, {0x6D, 0x11}, {0x6D, 0x13}, /* 0x98-0x9B */ + {0x6D, 0x14}, {0x6D, 0x15}, {0x6D, 0x16}, {0x6D, 0x18}, /* 0x9C-0x9F */ + {0x6D, 0x1C}, {0x6D, 0x1D}, {0x6D, 0x1F}, {0x6D, 0x20}, /* 0xA0-0xA3 */ + {0x6D, 0x21}, {0x6D, 0x22}, {0x6D, 0x23}, {0x6D, 0x24}, /* 0xA4-0xA7 */ + {0x6D, 0x26}, {0x6D, 0x28}, {0x6D, 0x29}, {0x6D, 0x2C}, /* 0xA8-0xAB */ + {0x6D, 0x2D}, {0x6D, 0x2F}, {0x6D, 0x30}, {0x6D, 0x34}, /* 0xAC-0xAF */ + {0x6D, 0x36}, {0x6D, 0x37}, {0x6D, 0x38}, {0x6D, 0x3A}, /* 0xB0-0xB3 */ + {0x6D, 0x3F}, {0x6D, 0x40}, {0x6D, 0x42}, {0x6D, 0x44}, /* 0xB4-0xB7 */ + {0x6D, 0x49}, {0x6D, 0x4C}, {0x6D, 0x50}, {0x6D, 0x55}, /* 0xB8-0xBB */ + {0x6D, 0x56}, {0x6D, 0x57}, {0x6D, 0x58}, {0x6D, 0x5B}, /* 0xBC-0xBF */ + {0x6D, 0x5D}, {0x6D, 0x5F}, {0x6D, 0x61}, {0x6D, 0x62}, /* 0xC0-0xC3 */ + {0x6D, 0x64}, {0x6D, 0x65}, {0x6D, 0x67}, {0x6D, 0x68}, /* 0xC4-0xC7 */ + {0x6D, 0x6B}, {0x6D, 0x6C}, {0x6D, 0x6D}, {0x6D, 0x70}, /* 0xC8-0xCB */ + {0x6D, 0x71}, {0x6D, 0x72}, {0x6D, 0x73}, {0x6D, 0x75}, /* 0xCC-0xCF */ + {0x6D, 0x76}, {0x6D, 0x79}, {0x6D, 0x7A}, {0x6D, 0x7B}, /* 0xD0-0xD3 */ + {0x6D, 0x7D}, {0x6D, 0x7E}, {0x6D, 0x7F}, {0x6D, 0x80}, /* 0xD4-0xD7 */ + {0x6D, 0x81}, {0x6D, 0x83}, {0x6D, 0x84}, {0x6D, 0x86}, /* 0xD8-0xDB */ + {0x6D, 0x87}, {0x6D, 0x8A}, {0x6D, 0x8B}, {0x6D, 0x8D}, /* 0xDC-0xDF */ + {0x6D, 0x8F}, {0x6D, 0x90}, {0x6D, 0x92}, {0x6D, 0x96}, /* 0xE0-0xE3 */ + {0x6D, 0x97}, {0x6D, 0x98}, {0x6D, 0x99}, {0x6D, 0x9A}, /* 0xE4-0xE7 */ + {0x6D, 0x9C}, {0x6D, 0xA2}, {0x6D, 0xA5}, {0x6D, 0xAC}, /* 0xE8-0xEB */ + {0x6D, 0xAD}, {0x6D, 0xB0}, {0x6D, 0xB1}, {0x6D, 0xB3}, /* 0xEC-0xEF */ + {0x6D, 0xB4}, {0x6D, 0xB6}, {0x6D, 0xB7}, {0x6D, 0xB9}, /* 0xF0-0xF3 */ + {0x6D, 0xBA}, {0x6D, 0xBB}, {0x6D, 0xBC}, {0x6D, 0xBD}, /* 0xF4-0xF7 */ + {0x6D, 0xBE}, {0x6D, 0xC1}, {0x6D, 0xC2}, {0x6D, 0xC3}, /* 0xF8-0xFB */ + {0x6D, 0xC8}, {0x6D, 0xC9}, {0x6D, 0xCA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9C[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6D, 0xCD}, {0x6D, 0xCE}, {0x6D, 0xCF}, {0x6D, 0xD0}, /* 0x40-0x43 */ + {0x6D, 0xD2}, {0x6D, 0xD3}, {0x6D, 0xD4}, {0x6D, 0xD5}, /* 0x44-0x47 */ + {0x6D, 0xD7}, {0x6D, 0xDA}, {0x6D, 0xDB}, {0x6D, 0xDC}, /* 0x48-0x4B */ + {0x6D, 0xDF}, {0x6D, 0xE2}, {0x6D, 0xE3}, {0x6D, 0xE5}, /* 0x4C-0x4F */ + {0x6D, 0xE7}, {0x6D, 0xE8}, {0x6D, 0xE9}, {0x6D, 0xEA}, /* 0x50-0x53 */ + {0x6D, 0xED}, {0x6D, 0xEF}, {0x6D, 0xF0}, {0x6D, 0xF2}, /* 0x54-0x57 */ + {0x6D, 0xF4}, {0x6D, 0xF5}, {0x6D, 0xF6}, {0x6D, 0xF8}, /* 0x58-0x5B */ + {0x6D, 0xFA}, {0x6D, 0xFD}, {0x6D, 0xFE}, {0x6D, 0xFF}, /* 0x5C-0x5F */ + {0x6E, 0x00}, {0x6E, 0x01}, {0x6E, 0x02}, {0x6E, 0x03}, /* 0x60-0x63 */ + {0x6E, 0x04}, {0x6E, 0x06}, {0x6E, 0x07}, {0x6E, 0x08}, /* 0x64-0x67 */ + {0x6E, 0x09}, {0x6E, 0x0B}, {0x6E, 0x0F}, {0x6E, 0x12}, /* 0x68-0x6B */ + {0x6E, 0x13}, {0x6E, 0x15}, {0x6E, 0x18}, {0x6E, 0x19}, /* 0x6C-0x6F */ + {0x6E, 0x1B}, {0x6E, 0x1C}, {0x6E, 0x1E}, {0x6E, 0x1F}, /* 0x70-0x73 */ + {0x6E, 0x22}, {0x6E, 0x26}, {0x6E, 0x27}, {0x6E, 0x28}, /* 0x74-0x77 */ + {0x6E, 0x2A}, {0x6E, 0x2C}, {0x6E, 0x2E}, {0x6E, 0x30}, /* 0x78-0x7B */ + {0x6E, 0x31}, {0x6E, 0x33}, {0x6E, 0x35}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6E, 0x36}, {0x6E, 0x37}, {0x6E, 0x39}, {0x6E, 0x3B}, /* 0x80-0x83 */ + {0x6E, 0x3C}, {0x6E, 0x3D}, {0x6E, 0x3E}, {0x6E, 0x3F}, /* 0x84-0x87 */ + {0x6E, 0x40}, {0x6E, 0x41}, {0x6E, 0x42}, {0x6E, 0x45}, /* 0x88-0x8B */ + {0x6E, 0x46}, {0x6E, 0x47}, {0x6E, 0x48}, {0x6E, 0x49}, /* 0x8C-0x8F */ + {0x6E, 0x4A}, {0x6E, 0x4B}, {0x6E, 0x4C}, {0x6E, 0x4F}, /* 0x90-0x93 */ + {0x6E, 0x50}, {0x6E, 0x51}, {0x6E, 0x52}, {0x6E, 0x55}, /* 0x94-0x97 */ + {0x6E, 0x57}, {0x6E, 0x59}, {0x6E, 0x5A}, {0x6E, 0x5C}, /* 0x98-0x9B */ + {0x6E, 0x5D}, {0x6E, 0x5E}, {0x6E, 0x60}, {0x6E, 0x61}, /* 0x9C-0x9F */ + {0x6E, 0x62}, {0x6E, 0x63}, {0x6E, 0x64}, {0x6E, 0x65}, /* 0xA0-0xA3 */ + {0x6E, 0x66}, {0x6E, 0x67}, {0x6E, 0x68}, {0x6E, 0x69}, /* 0xA4-0xA7 */ + {0x6E, 0x6A}, {0x6E, 0x6C}, {0x6E, 0x6D}, {0x6E, 0x6F}, /* 0xA8-0xAB */ + {0x6E, 0x70}, {0x6E, 0x71}, {0x6E, 0x72}, {0x6E, 0x73}, /* 0xAC-0xAF */ + {0x6E, 0x74}, {0x6E, 0x75}, {0x6E, 0x76}, {0x6E, 0x77}, /* 0xB0-0xB3 */ + {0x6E, 0x78}, {0x6E, 0x79}, {0x6E, 0x7A}, {0x6E, 0x7B}, /* 0xB4-0xB7 */ + {0x6E, 0x7C}, {0x6E, 0x7D}, {0x6E, 0x80}, {0x6E, 0x81}, /* 0xB8-0xBB */ + {0x6E, 0x82}, {0x6E, 0x84}, {0x6E, 0x87}, {0x6E, 0x88}, /* 0xBC-0xBF */ + {0x6E, 0x8A}, {0x6E, 0x8B}, {0x6E, 0x8C}, {0x6E, 0x8D}, /* 0xC0-0xC3 */ + {0x6E, 0x8E}, {0x6E, 0x91}, {0x6E, 0x92}, {0x6E, 0x93}, /* 0xC4-0xC7 */ + {0x6E, 0x94}, {0x6E, 0x95}, {0x6E, 0x96}, {0x6E, 0x97}, /* 0xC8-0xCB */ + {0x6E, 0x99}, {0x6E, 0x9A}, {0x6E, 0x9B}, {0x6E, 0x9D}, /* 0xCC-0xCF */ + {0x6E, 0x9E}, {0x6E, 0xA0}, {0x6E, 0xA1}, {0x6E, 0xA3}, /* 0xD0-0xD3 */ + {0x6E, 0xA4}, {0x6E, 0xA6}, {0x6E, 0xA8}, {0x6E, 0xA9}, /* 0xD4-0xD7 */ + {0x6E, 0xAB}, {0x6E, 0xAC}, {0x6E, 0xAD}, {0x6E, 0xAE}, /* 0xD8-0xDB */ + {0x6E, 0xB0}, {0x6E, 0xB3}, {0x6E, 0xB5}, {0x6E, 0xB8}, /* 0xDC-0xDF */ + {0x6E, 0xB9}, {0x6E, 0xBC}, {0x6E, 0xBE}, {0x6E, 0xBF}, /* 0xE0-0xE3 */ + {0x6E, 0xC0}, {0x6E, 0xC3}, {0x6E, 0xC4}, {0x6E, 0xC5}, /* 0xE4-0xE7 */ + {0x6E, 0xC6}, {0x6E, 0xC8}, {0x6E, 0xC9}, {0x6E, 0xCA}, /* 0xE8-0xEB */ + {0x6E, 0xCC}, {0x6E, 0xCD}, {0x6E, 0xCE}, {0x6E, 0xD0}, /* 0xEC-0xEF */ + {0x6E, 0xD2}, {0x6E, 0xD6}, {0x6E, 0xD8}, {0x6E, 0xD9}, /* 0xF0-0xF3 */ + {0x6E, 0xDB}, {0x6E, 0xDC}, {0x6E, 0xDD}, {0x6E, 0xE3}, /* 0xF4-0xF7 */ + {0x6E, 0xE7}, {0x6E, 0xEA}, {0x6E, 0xEB}, {0x6E, 0xEC}, /* 0xF8-0xFB */ + {0x6E, 0xED}, {0x6E, 0xEE}, {0x6E, 0xEF}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9D[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6E, 0xF0}, {0x6E, 0xF1}, {0x6E, 0xF2}, {0x6E, 0xF3}, /* 0x40-0x43 */ + {0x6E, 0xF5}, {0x6E, 0xF6}, {0x6E, 0xF7}, {0x6E, 0xF8}, /* 0x44-0x47 */ + {0x6E, 0xFA}, {0x6E, 0xFB}, {0x6E, 0xFC}, {0x6E, 0xFD}, /* 0x48-0x4B */ + {0x6E, 0xFE}, {0x6E, 0xFF}, {0x6F, 0x00}, {0x6F, 0x01}, /* 0x4C-0x4F */ + {0x6F, 0x03}, {0x6F, 0x04}, {0x6F, 0x05}, {0x6F, 0x07}, /* 0x50-0x53 */ + {0x6F, 0x08}, {0x6F, 0x0A}, {0x6F, 0x0B}, {0x6F, 0x0C}, /* 0x54-0x57 */ + {0x6F, 0x0D}, {0x6F, 0x0E}, {0x6F, 0x10}, {0x6F, 0x11}, /* 0x58-0x5B */ + {0x6F, 0x12}, {0x6F, 0x16}, {0x6F, 0x17}, {0x6F, 0x18}, /* 0x5C-0x5F */ + {0x6F, 0x19}, {0x6F, 0x1A}, {0x6F, 0x1B}, {0x6F, 0x1C}, /* 0x60-0x63 */ + {0x6F, 0x1D}, {0x6F, 0x1E}, {0x6F, 0x1F}, {0x6F, 0x21}, /* 0x64-0x67 */ + {0x6F, 0x22}, {0x6F, 0x23}, {0x6F, 0x25}, {0x6F, 0x26}, /* 0x68-0x6B */ + {0x6F, 0x27}, {0x6F, 0x28}, {0x6F, 0x2C}, {0x6F, 0x2E}, /* 0x6C-0x6F */ + {0x6F, 0x30}, {0x6F, 0x32}, {0x6F, 0x34}, {0x6F, 0x35}, /* 0x70-0x73 */ + {0x6F, 0x37}, {0x6F, 0x38}, {0x6F, 0x39}, {0x6F, 0x3A}, /* 0x74-0x77 */ + {0x6F, 0x3B}, {0x6F, 0x3C}, {0x6F, 0x3D}, {0x6F, 0x3F}, /* 0x78-0x7B */ + {0x6F, 0x40}, {0x6F, 0x41}, {0x6F, 0x42}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x6F, 0x43}, {0x6F, 0x44}, {0x6F, 0x45}, {0x6F, 0x48}, /* 0x80-0x83 */ + {0x6F, 0x49}, {0x6F, 0x4A}, {0x6F, 0x4C}, {0x6F, 0x4E}, /* 0x84-0x87 */ + {0x6F, 0x4F}, {0x6F, 0x50}, {0x6F, 0x51}, {0x6F, 0x52}, /* 0x88-0x8B */ + {0x6F, 0x53}, {0x6F, 0x54}, {0x6F, 0x55}, {0x6F, 0x56}, /* 0x8C-0x8F */ + {0x6F, 0x57}, {0x6F, 0x59}, {0x6F, 0x5A}, {0x6F, 0x5B}, /* 0x90-0x93 */ + {0x6F, 0x5D}, {0x6F, 0x5F}, {0x6F, 0x60}, {0x6F, 0x61}, /* 0x94-0x97 */ + {0x6F, 0x63}, {0x6F, 0x64}, {0x6F, 0x65}, {0x6F, 0x67}, /* 0x98-0x9B */ + {0x6F, 0x68}, {0x6F, 0x69}, {0x6F, 0x6A}, {0x6F, 0x6B}, /* 0x9C-0x9F */ + {0x6F, 0x6C}, {0x6F, 0x6F}, {0x6F, 0x70}, {0x6F, 0x71}, /* 0xA0-0xA3 */ + {0x6F, 0x73}, {0x6F, 0x75}, {0x6F, 0x76}, {0x6F, 0x77}, /* 0xA4-0xA7 */ + {0x6F, 0x79}, {0x6F, 0x7B}, {0x6F, 0x7D}, {0x6F, 0x7E}, /* 0xA8-0xAB */ + {0x6F, 0x7F}, {0x6F, 0x80}, {0x6F, 0x81}, {0x6F, 0x82}, /* 0xAC-0xAF */ + {0x6F, 0x83}, {0x6F, 0x85}, {0x6F, 0x86}, {0x6F, 0x87}, /* 0xB0-0xB3 */ + {0x6F, 0x8A}, {0x6F, 0x8B}, {0x6F, 0x8F}, {0x6F, 0x90}, /* 0xB4-0xB7 */ + {0x6F, 0x91}, {0x6F, 0x92}, {0x6F, 0x93}, {0x6F, 0x94}, /* 0xB8-0xBB */ + {0x6F, 0x95}, {0x6F, 0x96}, {0x6F, 0x97}, {0x6F, 0x98}, /* 0xBC-0xBF */ + {0x6F, 0x99}, {0x6F, 0x9A}, {0x6F, 0x9B}, {0x6F, 0x9D}, /* 0xC0-0xC3 */ + {0x6F, 0x9E}, {0x6F, 0x9F}, {0x6F, 0xA0}, {0x6F, 0xA2}, /* 0xC4-0xC7 */ + {0x6F, 0xA3}, {0x6F, 0xA4}, {0x6F, 0xA5}, {0x6F, 0xA6}, /* 0xC8-0xCB */ + {0x6F, 0xA8}, {0x6F, 0xA9}, {0x6F, 0xAA}, {0x6F, 0xAB}, /* 0xCC-0xCF */ + {0x6F, 0xAC}, {0x6F, 0xAD}, {0x6F, 0xAE}, {0x6F, 0xAF}, /* 0xD0-0xD3 */ + {0x6F, 0xB0}, {0x6F, 0xB1}, {0x6F, 0xB2}, {0x6F, 0xB4}, /* 0xD4-0xD7 */ + {0x6F, 0xB5}, {0x6F, 0xB7}, {0x6F, 0xB8}, {0x6F, 0xBA}, /* 0xD8-0xDB */ + {0x6F, 0xBB}, {0x6F, 0xBC}, {0x6F, 0xBD}, {0x6F, 0xBE}, /* 0xDC-0xDF */ + {0x6F, 0xBF}, {0x6F, 0xC1}, {0x6F, 0xC3}, {0x6F, 0xC4}, /* 0xE0-0xE3 */ + {0x6F, 0xC5}, {0x6F, 0xC6}, {0x6F, 0xC7}, {0x6F, 0xC8}, /* 0xE4-0xE7 */ + {0x6F, 0xCA}, {0x6F, 0xCB}, {0x6F, 0xCC}, {0x6F, 0xCD}, /* 0xE8-0xEB */ + {0x6F, 0xCE}, {0x6F, 0xCF}, {0x6F, 0xD0}, {0x6F, 0xD3}, /* 0xEC-0xEF */ + {0x6F, 0xD4}, {0x6F, 0xD5}, {0x6F, 0xD6}, {0x6F, 0xD7}, /* 0xF0-0xF3 */ + {0x6F, 0xD8}, {0x6F, 0xD9}, {0x6F, 0xDA}, {0x6F, 0xDB}, /* 0xF4-0xF7 */ + {0x6F, 0xDC}, {0x6F, 0xDD}, {0x6F, 0xDF}, {0x6F, 0xE2}, /* 0xF8-0xFB */ + {0x6F, 0xE3}, {0x6F, 0xE4}, {0x6F, 0xE5}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9E[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6F, 0xE6}, {0x6F, 0xE7}, {0x6F, 0xE8}, {0x6F, 0xE9}, /* 0x40-0x43 */ + {0x6F, 0xEA}, {0x6F, 0xEB}, {0x6F, 0xEC}, {0x6F, 0xED}, /* 0x44-0x47 */ + {0x6F, 0xF0}, {0x6F, 0xF1}, {0x6F, 0xF2}, {0x6F, 0xF3}, /* 0x48-0x4B */ + {0x6F, 0xF4}, {0x6F, 0xF5}, {0x6F, 0xF6}, {0x6F, 0xF7}, /* 0x4C-0x4F */ + {0x6F, 0xF8}, {0x6F, 0xF9}, {0x6F, 0xFA}, {0x6F, 0xFB}, /* 0x50-0x53 */ + {0x6F, 0xFC}, {0x6F, 0xFD}, {0x6F, 0xFE}, {0x6F, 0xFF}, /* 0x54-0x57 */ + {0x70, 0x00}, {0x70, 0x01}, {0x70, 0x02}, {0x70, 0x03}, /* 0x58-0x5B */ + {0x70, 0x04}, {0x70, 0x05}, {0x70, 0x06}, {0x70, 0x07}, /* 0x5C-0x5F */ + {0x70, 0x08}, {0x70, 0x09}, {0x70, 0x0A}, {0x70, 0x0B}, /* 0x60-0x63 */ + {0x70, 0x0C}, {0x70, 0x0D}, {0x70, 0x0E}, {0x70, 0x0F}, /* 0x64-0x67 */ + {0x70, 0x10}, {0x70, 0x12}, {0x70, 0x13}, {0x70, 0x14}, /* 0x68-0x6B */ + {0x70, 0x15}, {0x70, 0x16}, {0x70, 0x17}, {0x70, 0x18}, /* 0x6C-0x6F */ + {0x70, 0x19}, {0x70, 0x1C}, {0x70, 0x1D}, {0x70, 0x1E}, /* 0x70-0x73 */ + {0x70, 0x1F}, {0x70, 0x20}, {0x70, 0x21}, {0x70, 0x22}, /* 0x74-0x77 */ + {0x70, 0x24}, {0x70, 0x25}, {0x70, 0x26}, {0x70, 0x27}, /* 0x78-0x7B */ + {0x70, 0x28}, {0x70, 0x29}, {0x70, 0x2A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x70, 0x2B}, {0x70, 0x2C}, {0x70, 0x2D}, {0x70, 0x2E}, /* 0x80-0x83 */ + {0x70, 0x2F}, {0x70, 0x30}, {0x70, 0x31}, {0x70, 0x32}, /* 0x84-0x87 */ + {0x70, 0x33}, {0x70, 0x34}, {0x70, 0x36}, {0x70, 0x37}, /* 0x88-0x8B */ + {0x70, 0x38}, {0x70, 0x3A}, {0x70, 0x3B}, {0x70, 0x3C}, /* 0x8C-0x8F */ + {0x70, 0x3D}, {0x70, 0x3E}, {0x70, 0x3F}, {0x70, 0x40}, /* 0x90-0x93 */ + {0x70, 0x41}, {0x70, 0x42}, {0x70, 0x43}, {0x70, 0x44}, /* 0x94-0x97 */ + {0x70, 0x45}, {0x70, 0x46}, {0x70, 0x47}, {0x70, 0x48}, /* 0x98-0x9B */ + {0x70, 0x49}, {0x70, 0x4A}, {0x70, 0x4B}, {0x70, 0x4D}, /* 0x9C-0x9F */ + {0x70, 0x4E}, {0x70, 0x50}, {0x70, 0x51}, {0x70, 0x52}, /* 0xA0-0xA3 */ + {0x70, 0x53}, {0x70, 0x54}, {0x70, 0x55}, {0x70, 0x56}, /* 0xA4-0xA7 */ + {0x70, 0x57}, {0x70, 0x58}, {0x70, 0x59}, {0x70, 0x5A}, /* 0xA8-0xAB */ + {0x70, 0x5B}, {0x70, 0x5C}, {0x70, 0x5D}, {0x70, 0x5F}, /* 0xAC-0xAF */ + {0x70, 0x60}, {0x70, 0x61}, {0x70, 0x62}, {0x70, 0x63}, /* 0xB0-0xB3 */ + {0x70, 0x64}, {0x70, 0x65}, {0x70, 0x66}, {0x70, 0x67}, /* 0xB4-0xB7 */ + {0x70, 0x68}, {0x70, 0x69}, {0x70, 0x6A}, {0x70, 0x6E}, /* 0xB8-0xBB */ + {0x70, 0x71}, {0x70, 0x72}, {0x70, 0x73}, {0x70, 0x74}, /* 0xBC-0xBF */ + {0x70, 0x77}, {0x70, 0x79}, {0x70, 0x7A}, {0x70, 0x7B}, /* 0xC0-0xC3 */ + {0x70, 0x7D}, {0x70, 0x81}, {0x70, 0x82}, {0x70, 0x83}, /* 0xC4-0xC7 */ + {0x70, 0x84}, {0x70, 0x86}, {0x70, 0x87}, {0x70, 0x88}, /* 0xC8-0xCB */ + {0x70, 0x8B}, {0x70, 0x8C}, {0x70, 0x8D}, {0x70, 0x8F}, /* 0xCC-0xCF */ + {0x70, 0x90}, {0x70, 0x91}, {0x70, 0x93}, {0x70, 0x97}, /* 0xD0-0xD3 */ + {0x70, 0x98}, {0x70, 0x9A}, {0x70, 0x9B}, {0x70, 0x9E}, /* 0xD4-0xD7 */ + {0x70, 0x9F}, {0x70, 0xA0}, {0x70, 0xA1}, {0x70, 0xA2}, /* 0xD8-0xDB */ + {0x70, 0xA3}, {0x70, 0xA4}, {0x70, 0xA5}, {0x70, 0xA6}, /* 0xDC-0xDF */ + {0x70, 0xA7}, {0x70, 0xA8}, {0x70, 0xA9}, {0x70, 0xAA}, /* 0xE0-0xE3 */ + {0x70, 0xB0}, {0x70, 0xB2}, {0x70, 0xB4}, {0x70, 0xB5}, /* 0xE4-0xE7 */ + {0x70, 0xB6}, {0x70, 0xBA}, {0x70, 0xBE}, {0x70, 0xBF}, /* 0xE8-0xEB */ + {0x70, 0xC4}, {0x70, 0xC5}, {0x70, 0xC6}, {0x70, 0xC7}, /* 0xEC-0xEF */ + {0x70, 0xC9}, {0x70, 0xCB}, {0x70, 0xCC}, {0x70, 0xCD}, /* 0xF0-0xF3 */ + {0x70, 0xCE}, {0x70, 0xCF}, {0x70, 0xD0}, {0x70, 0xD1}, /* 0xF4-0xF7 */ + {0x70, 0xD2}, {0x70, 0xD3}, {0x70, 0xD4}, {0x70, 0xD5}, /* 0xF8-0xFB */ + {0x70, 0xD6}, {0x70, 0xD7}, {0x70, 0xDA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9F[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x70, 0xDC}, {0x70, 0xDD}, {0x70, 0xDE}, {0x70, 0xE0}, /* 0x40-0x43 */ + {0x70, 0xE1}, {0x70, 0xE2}, {0x70, 0xE3}, {0x70, 0xE5}, /* 0x44-0x47 */ + {0x70, 0xEA}, {0x70, 0xEE}, {0x70, 0xF0}, {0x70, 0xF1}, /* 0x48-0x4B */ + {0x70, 0xF2}, {0x70, 0xF3}, {0x70, 0xF4}, {0x70, 0xF5}, /* 0x4C-0x4F */ + {0x70, 0xF6}, {0x70, 0xF8}, {0x70, 0xFA}, {0x70, 0xFB}, /* 0x50-0x53 */ + {0x70, 0xFC}, {0x70, 0xFE}, {0x70, 0xFF}, {0x71, 0x00}, /* 0x54-0x57 */ + {0x71, 0x01}, {0x71, 0x02}, {0x71, 0x03}, {0x71, 0x04}, /* 0x58-0x5B */ + {0x71, 0x05}, {0x71, 0x06}, {0x71, 0x07}, {0x71, 0x08}, /* 0x5C-0x5F */ + {0x71, 0x0B}, {0x71, 0x0C}, {0x71, 0x0D}, {0x71, 0x0E}, /* 0x60-0x63 */ + {0x71, 0x0F}, {0x71, 0x11}, {0x71, 0x12}, {0x71, 0x14}, /* 0x64-0x67 */ + {0x71, 0x17}, {0x71, 0x1B}, {0x71, 0x1C}, {0x71, 0x1D}, /* 0x68-0x6B */ + {0x71, 0x1E}, {0x71, 0x1F}, {0x71, 0x20}, {0x71, 0x21}, /* 0x6C-0x6F */ + {0x71, 0x22}, {0x71, 0x23}, {0x71, 0x24}, {0x71, 0x25}, /* 0x70-0x73 */ + {0x71, 0x27}, {0x71, 0x28}, {0x71, 0x29}, {0x71, 0x2A}, /* 0x74-0x77 */ + {0x71, 0x2B}, {0x71, 0x2C}, {0x71, 0x2D}, {0x71, 0x2E}, /* 0x78-0x7B */ + {0x71, 0x32}, {0x71, 0x33}, {0x71, 0x34}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x71, 0x35}, {0x71, 0x37}, {0x71, 0x38}, {0x71, 0x39}, /* 0x80-0x83 */ + {0x71, 0x3A}, {0x71, 0x3B}, {0x71, 0x3C}, {0x71, 0x3D}, /* 0x84-0x87 */ + {0x71, 0x3E}, {0x71, 0x3F}, {0x71, 0x40}, {0x71, 0x41}, /* 0x88-0x8B */ + {0x71, 0x42}, {0x71, 0x43}, {0x71, 0x44}, {0x71, 0x46}, /* 0x8C-0x8F */ + {0x71, 0x47}, {0x71, 0x48}, {0x71, 0x49}, {0x71, 0x4B}, /* 0x90-0x93 */ + {0x71, 0x4D}, {0x71, 0x4F}, {0x71, 0x50}, {0x71, 0x51}, /* 0x94-0x97 */ + {0x71, 0x52}, {0x71, 0x53}, {0x71, 0x54}, {0x71, 0x55}, /* 0x98-0x9B */ + {0x71, 0x56}, {0x71, 0x57}, {0x71, 0x58}, {0x71, 0x59}, /* 0x9C-0x9F */ + {0x71, 0x5A}, {0x71, 0x5B}, {0x71, 0x5D}, {0x71, 0x5F}, /* 0xA0-0xA3 */ + {0x71, 0x60}, {0x71, 0x61}, {0x71, 0x62}, {0x71, 0x63}, /* 0xA4-0xA7 */ + {0x71, 0x65}, {0x71, 0x69}, {0x71, 0x6A}, {0x71, 0x6B}, /* 0xA8-0xAB */ + {0x71, 0x6C}, {0x71, 0x6D}, {0x71, 0x6F}, {0x71, 0x70}, /* 0xAC-0xAF */ + {0x71, 0x71}, {0x71, 0x74}, {0x71, 0x75}, {0x71, 0x76}, /* 0xB0-0xB3 */ + {0x71, 0x77}, {0x71, 0x79}, {0x71, 0x7B}, {0x71, 0x7C}, /* 0xB4-0xB7 */ + {0x71, 0x7E}, {0x71, 0x7F}, {0x71, 0x80}, {0x71, 0x81}, /* 0xB8-0xBB */ + {0x71, 0x82}, {0x71, 0x83}, {0x71, 0x85}, {0x71, 0x86}, /* 0xBC-0xBF */ + {0x71, 0x87}, {0x71, 0x88}, {0x71, 0x89}, {0x71, 0x8B}, /* 0xC0-0xC3 */ + {0x71, 0x8C}, {0x71, 0x8D}, {0x71, 0x8E}, {0x71, 0x90}, /* 0xC4-0xC7 */ + {0x71, 0x91}, {0x71, 0x92}, {0x71, 0x93}, {0x71, 0x95}, /* 0xC8-0xCB */ + {0x71, 0x96}, {0x71, 0x97}, {0x71, 0x9A}, {0x71, 0x9B}, /* 0xCC-0xCF */ + {0x71, 0x9C}, {0x71, 0x9D}, {0x71, 0x9E}, {0x71, 0xA1}, /* 0xD0-0xD3 */ + {0x71, 0xA2}, {0x71, 0xA3}, {0x71, 0xA4}, {0x71, 0xA5}, /* 0xD4-0xD7 */ + {0x71, 0xA6}, {0x71, 0xA7}, {0x71, 0xA9}, {0x71, 0xAA}, /* 0xD8-0xDB */ + {0x71, 0xAB}, {0x71, 0xAD}, {0x71, 0xAE}, {0x71, 0xAF}, /* 0xDC-0xDF */ + {0x71, 0xB0}, {0x71, 0xB1}, {0x71, 0xB2}, {0x71, 0xB4}, /* 0xE0-0xE3 */ + {0x71, 0xB6}, {0x71, 0xB7}, {0x71, 0xB8}, {0x71, 0xBA}, /* 0xE4-0xE7 */ + {0x71, 0xBB}, {0x71, 0xBC}, {0x71, 0xBD}, {0x71, 0xBE}, /* 0xE8-0xEB */ + {0x71, 0xBF}, {0x71, 0xC0}, {0x71, 0xC1}, {0x71, 0xC2}, /* 0xEC-0xEF */ + {0x71, 0xC4}, {0x71, 0xC5}, {0x71, 0xC6}, {0x71, 0xC7}, /* 0xF0-0xF3 */ + {0x71, 0xC8}, {0x71, 0xC9}, {0x71, 0xCA}, {0x71, 0xCB}, /* 0xF4-0xF7 */ + {0x71, 0xCC}, {0x71, 0xCD}, {0x71, 0xCF}, {0x71, 0xD0}, /* 0xF8-0xFB */ + {0x71, 0xD1}, {0x71, 0xD2}, {0x71, 0xD3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x71, 0xD6}, {0x71, 0xD7}, {0x71, 0xD8}, {0x71, 0xD9}, /* 0x40-0x43 */ + {0x71, 0xDA}, {0x71, 0xDB}, {0x71, 0xDC}, {0x71, 0xDD}, /* 0x44-0x47 */ + {0x71, 0xDE}, {0x71, 0xDF}, {0x71, 0xE1}, {0x71, 0xE2}, /* 0x48-0x4B */ + {0x71, 0xE3}, {0x71, 0xE4}, {0x71, 0xE6}, {0x71, 0xE8}, /* 0x4C-0x4F */ + {0x71, 0xE9}, {0x71, 0xEA}, {0x71, 0xEB}, {0x71, 0xEC}, /* 0x50-0x53 */ + {0x71, 0xED}, {0x71, 0xEF}, {0x71, 0xF0}, {0x71, 0xF1}, /* 0x54-0x57 */ + {0x71, 0xF2}, {0x71, 0xF3}, {0x71, 0xF4}, {0x71, 0xF5}, /* 0x58-0x5B */ + {0x71, 0xF6}, {0x71, 0xF7}, {0x71, 0xF8}, {0x71, 0xFA}, /* 0x5C-0x5F */ + {0x71, 0xFB}, {0x71, 0xFC}, {0x71, 0xFD}, {0x71, 0xFE}, /* 0x60-0x63 */ + {0x71, 0xFF}, {0x72, 0x00}, {0x72, 0x01}, {0x72, 0x02}, /* 0x64-0x67 */ + {0x72, 0x03}, {0x72, 0x04}, {0x72, 0x05}, {0x72, 0x07}, /* 0x68-0x6B */ + {0x72, 0x08}, {0x72, 0x09}, {0x72, 0x0A}, {0x72, 0x0B}, /* 0x6C-0x6F */ + {0x72, 0x0C}, {0x72, 0x0D}, {0x72, 0x0E}, {0x72, 0x0F}, /* 0x70-0x73 */ + {0x72, 0x10}, {0x72, 0x11}, {0x72, 0x12}, {0x72, 0x13}, /* 0x74-0x77 */ + {0x72, 0x14}, {0x72, 0x15}, {0x72, 0x16}, {0x72, 0x17}, /* 0x78-0x7B */ + {0x72, 0x18}, {0x72, 0x19}, {0x72, 0x1A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x72, 0x1B}, {0x72, 0x1C}, {0x72, 0x1E}, {0x72, 0x1F}, /* 0x80-0x83 */ + {0x72, 0x20}, {0x72, 0x21}, {0x72, 0x22}, {0x72, 0x23}, /* 0x84-0x87 */ + {0x72, 0x24}, {0x72, 0x25}, {0x72, 0x26}, {0x72, 0x27}, /* 0x88-0x8B */ + {0x72, 0x29}, {0x72, 0x2B}, {0x72, 0x2D}, {0x72, 0x2E}, /* 0x8C-0x8F */ + {0x72, 0x2F}, {0x72, 0x32}, {0x72, 0x33}, {0x72, 0x34}, /* 0x90-0x93 */ + {0x72, 0x3A}, {0x72, 0x3C}, {0x72, 0x3E}, {0x72, 0x40}, /* 0x94-0x97 */ + {0x72, 0x41}, {0x72, 0x42}, {0x72, 0x43}, {0x72, 0x44}, /* 0x98-0x9B */ + {0x72, 0x45}, {0x72, 0x46}, {0x72, 0x49}, {0x72, 0x4A}, /* 0x9C-0x9F */ + {0x72, 0x4B}, {0x72, 0x4E}, {0x72, 0x4F}, {0x72, 0x50}, /* 0xA0-0xA3 */ + {0x72, 0x51}, {0x72, 0x53}, {0x72, 0x54}, {0x72, 0x55}, /* 0xA4-0xA7 */ + {0x72, 0x57}, {0x72, 0x58}, {0x72, 0x5A}, {0x72, 0x5C}, /* 0xA8-0xAB */ + {0x72, 0x5E}, {0x72, 0x60}, {0x72, 0x63}, {0x72, 0x64}, /* 0xAC-0xAF */ + {0x72, 0x65}, {0x72, 0x68}, {0x72, 0x6A}, {0x72, 0x6B}, /* 0xB0-0xB3 */ + {0x72, 0x6C}, {0x72, 0x6D}, {0x72, 0x70}, {0x72, 0x71}, /* 0xB4-0xB7 */ + {0x72, 0x73}, {0x72, 0x74}, {0x72, 0x76}, {0x72, 0x77}, /* 0xB8-0xBB */ + {0x72, 0x78}, {0x72, 0x7B}, {0x72, 0x7C}, {0x72, 0x7D}, /* 0xBC-0xBF */ + {0x72, 0x82}, {0x72, 0x83}, {0x72, 0x85}, {0x72, 0x86}, /* 0xC0-0xC3 */ + {0x72, 0x87}, {0x72, 0x88}, {0x72, 0x89}, {0x72, 0x8C}, /* 0xC4-0xC7 */ + {0x72, 0x8E}, {0x72, 0x90}, {0x72, 0x91}, {0x72, 0x93}, /* 0xC8-0xCB */ + {0x72, 0x94}, {0x72, 0x95}, {0x72, 0x96}, {0x72, 0x97}, /* 0xCC-0xCF */ + {0x72, 0x98}, {0x72, 0x99}, {0x72, 0x9A}, {0x72, 0x9B}, /* 0xD0-0xD3 */ + {0x72, 0x9C}, {0x72, 0x9D}, {0x72, 0x9E}, {0x72, 0xA0}, /* 0xD4-0xD7 */ + {0x72, 0xA1}, {0x72, 0xA2}, {0x72, 0xA3}, {0x72, 0xA4}, /* 0xD8-0xDB */ + {0x72, 0xA5}, {0x72, 0xA6}, {0x72, 0xA7}, {0x72, 0xA8}, /* 0xDC-0xDF */ + {0x72, 0xA9}, {0x72, 0xAA}, {0x72, 0xAB}, {0x72, 0xAE}, /* 0xE0-0xE3 */ + {0x72, 0xB1}, {0x72, 0xB2}, {0x72, 0xB3}, {0x72, 0xB5}, /* 0xE4-0xE7 */ + {0x72, 0xBA}, {0x72, 0xBB}, {0x72, 0xBC}, {0x72, 0xBD}, /* 0xE8-0xEB */ + {0x72, 0xBE}, {0x72, 0xBF}, {0x72, 0xC0}, {0x72, 0xC5}, /* 0xEC-0xEF */ + {0x72, 0xC6}, {0x72, 0xC7}, {0x72, 0xC9}, {0x72, 0xCA}, /* 0xF0-0xF3 */ + {0x72, 0xCB}, {0x72, 0xCC}, {0x72, 0xCF}, {0x72, 0xD1}, /* 0xF4-0xF7 */ + {0x72, 0xD3}, {0x72, 0xD4}, {0x72, 0xD5}, {0x72, 0xD6}, /* 0xF8-0xFB */ + {0x72, 0xD8}, {0x72, 0xDA}, {0x72, 0xDB}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x30, 0x00}, {0x30, 0x01}, {0x30, 0x02}, /* 0xA0-0xA3 */ + {0x00, 0xB7}, {0x02, 0xC9}, {0x02, 0xC7}, {0x00, 0xA8}, /* 0xA4-0xA7 */ + {0x30, 0x03}, {0x30, 0x05}, {0x20, 0x14}, {0xFF, 0x5E}, /* 0xA8-0xAB */ + {0x20, 0x16}, {0x20, 0x26}, {0x20, 0x18}, {0x20, 0x19}, /* 0xAC-0xAF */ + {0x20, 0x1C}, {0x20, 0x1D}, {0x30, 0x14}, {0x30, 0x15}, /* 0xB0-0xB3 */ + {0x30, 0x08}, {0x30, 0x09}, {0x30, 0x0A}, {0x30, 0x0B}, /* 0xB4-0xB7 */ + {0x30, 0x0C}, {0x30, 0x0D}, {0x30, 0x0E}, {0x30, 0x0F}, /* 0xB8-0xBB */ + {0x30, 0x16}, {0x30, 0x17}, {0x30, 0x10}, {0x30, 0x11}, /* 0xBC-0xBF */ + {0x00, 0xB1}, {0x00, 0xD7}, {0x00, 0xF7}, {0x22, 0x36}, /* 0xC0-0xC3 */ + {0x22, 0x27}, {0x22, 0x28}, {0x22, 0x11}, {0x22, 0x0F}, /* 0xC4-0xC7 */ + {0x22, 0x2A}, {0x22, 0x29}, {0x22, 0x08}, {0x22, 0x37}, /* 0xC8-0xCB */ + {0x22, 0x1A}, {0x22, 0xA5}, {0x22, 0x25}, {0x22, 0x20}, /* 0xCC-0xCF */ + {0x23, 0x12}, {0x22, 0x99}, {0x22, 0x2B}, {0x22, 0x2E}, /* 0xD0-0xD3 */ + {0x22, 0x61}, {0x22, 0x4C}, {0x22, 0x48}, {0x22, 0x3D}, /* 0xD4-0xD7 */ + {0x22, 0x1D}, {0x22, 0x60}, {0x22, 0x6E}, {0x22, 0x6F}, /* 0xD8-0xDB */ + {0x22, 0x64}, {0x22, 0x65}, {0x22, 0x1E}, {0x22, 0x35}, /* 0xDC-0xDF */ + {0x22, 0x34}, {0x26, 0x42}, {0x26, 0x40}, {0x00, 0xB0}, /* 0xE0-0xE3 */ + {0x20, 0x32}, {0x20, 0x33}, {0x21, 0x03}, {0xFF, 0x04}, /* 0xE4-0xE7 */ + {0x00, 0xA4}, {0xFF, 0xE0}, {0xFF, 0xE1}, {0x20, 0x30}, /* 0xE8-0xEB */ + {0x00, 0xA7}, {0x21, 0x16}, {0x26, 0x06}, {0x26, 0x05}, /* 0xEC-0xEF */ + {0x25, 0xCB}, {0x25, 0xCF}, {0x25, 0xCE}, {0x25, 0xC7}, /* 0xF0-0xF3 */ + {0x25, 0xC6}, {0x25, 0xA1}, {0x25, 0xA0}, {0x25, 0xB3}, /* 0xF4-0xF7 */ + {0x25, 0xB2}, {0x20, 0x3B}, {0x21, 0x92}, {0x21, 0x90}, /* 0xF8-0xFB */ + {0x21, 0x91}, {0x21, 0x93}, {0x30, 0x13}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x21, 0x70}, {0x21, 0x71}, {0x21, 0x72}, /* 0xA0-0xA3 */ + {0x21, 0x73}, {0x21, 0x74}, {0x21, 0x75}, {0x21, 0x76}, /* 0xA4-0xA7 */ + {0x21, 0x77}, {0x21, 0x78}, {0x21, 0x79}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x24, 0x88}, {0x24, 0x89}, {0x24, 0x8A}, /* 0xB0-0xB3 */ + {0x24, 0x8B}, {0x24, 0x8C}, {0x24, 0x8D}, {0x24, 0x8E}, /* 0xB4-0xB7 */ + {0x24, 0x8F}, {0x24, 0x90}, {0x24, 0x91}, {0x24, 0x92}, /* 0xB8-0xBB */ + {0x24, 0x93}, {0x24, 0x94}, {0x24, 0x95}, {0x24, 0x96}, /* 0xBC-0xBF */ + {0x24, 0x97}, {0x24, 0x98}, {0x24, 0x99}, {0x24, 0x9A}, /* 0xC0-0xC3 */ + {0x24, 0x9B}, {0x24, 0x74}, {0x24, 0x75}, {0x24, 0x76}, /* 0xC4-0xC7 */ + {0x24, 0x77}, {0x24, 0x78}, {0x24, 0x79}, {0x24, 0x7A}, /* 0xC8-0xCB */ + {0x24, 0x7B}, {0x24, 0x7C}, {0x24, 0x7D}, {0x24, 0x7E}, /* 0xCC-0xCF */ + {0x24, 0x7F}, {0x24, 0x80}, {0x24, 0x81}, {0x24, 0x82}, /* 0xD0-0xD3 */ + {0x24, 0x83}, {0x24, 0x84}, {0x24, 0x85}, {0x24, 0x86}, /* 0xD4-0xD7 */ + {0x24, 0x87}, {0x24, 0x60}, {0x24, 0x61}, {0x24, 0x62}, /* 0xD8-0xDB */ + {0x24, 0x63}, {0x24, 0x64}, {0x24, 0x65}, {0x24, 0x66}, /* 0xDC-0xDF */ + {0x24, 0x67}, {0x24, 0x68}, {0x24, 0x69}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x32, 0x20}, {0x32, 0x21}, {0x32, 0x22}, /* 0xE4-0xE7 */ + {0x32, 0x23}, {0x32, 0x24}, {0x32, 0x25}, {0x32, 0x26}, /* 0xE8-0xEB */ + {0x32, 0x27}, {0x32, 0x28}, {0x32, 0x29}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x21, 0x60}, {0x21, 0x61}, {0x21, 0x62}, /* 0xF0-0xF3 */ + {0x21, 0x63}, {0x21, 0x64}, {0x21, 0x65}, {0x21, 0x66}, /* 0xF4-0xF7 */ + {0x21, 0x67}, {0x21, 0x68}, {0x21, 0x69}, {0x21, 0x6A}, /* 0xF8-0xFB */ + {0x21, 0x6B}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xFF, 0x01}, {0xFF, 0x02}, {0xFF, 0x03}, /* 0xA0-0xA3 */ + {0xFF, 0xE5}, {0xFF, 0x05}, {0xFF, 0x06}, {0xFF, 0x07}, /* 0xA4-0xA7 */ + {0xFF, 0x08}, {0xFF, 0x09}, {0xFF, 0x0A}, {0xFF, 0x0B}, /* 0xA8-0xAB */ + {0xFF, 0x0C}, {0xFF, 0x0D}, {0xFF, 0x0E}, {0xFF, 0x0F}, /* 0xAC-0xAF */ + {0xFF, 0x10}, {0xFF, 0x11}, {0xFF, 0x12}, {0xFF, 0x13}, /* 0xB0-0xB3 */ + {0xFF, 0x14}, {0xFF, 0x15}, {0xFF, 0x16}, {0xFF, 0x17}, /* 0xB4-0xB7 */ + {0xFF, 0x18}, {0xFF, 0x19}, {0xFF, 0x1A}, {0xFF, 0x1B}, /* 0xB8-0xBB */ + {0xFF, 0x1C}, {0xFF, 0x1D}, {0xFF, 0x1E}, {0xFF, 0x1F}, /* 0xBC-0xBF */ + {0xFF, 0x20}, {0xFF, 0x21}, {0xFF, 0x22}, {0xFF, 0x23}, /* 0xC0-0xC3 */ + {0xFF, 0x24}, {0xFF, 0x25}, {0xFF, 0x26}, {0xFF, 0x27}, /* 0xC4-0xC7 */ + {0xFF, 0x28}, {0xFF, 0x29}, {0xFF, 0x2A}, {0xFF, 0x2B}, /* 0xC8-0xCB */ + {0xFF, 0x2C}, {0xFF, 0x2D}, {0xFF, 0x2E}, {0xFF, 0x2F}, /* 0xCC-0xCF */ + {0xFF, 0x30}, {0xFF, 0x31}, {0xFF, 0x32}, {0xFF, 0x33}, /* 0xD0-0xD3 */ + {0xFF, 0x34}, {0xFF, 0x35}, {0xFF, 0x36}, {0xFF, 0x37}, /* 0xD4-0xD7 */ + {0xFF, 0x38}, {0xFF, 0x39}, {0xFF, 0x3A}, {0xFF, 0x3B}, /* 0xD8-0xDB */ + {0xFF, 0x3C}, {0xFF, 0x3D}, {0xFF, 0x3E}, {0xFF, 0x3F}, /* 0xDC-0xDF */ + {0xFF, 0x40}, {0xFF, 0x41}, {0xFF, 0x42}, {0xFF, 0x43}, /* 0xE0-0xE3 */ + {0xFF, 0x44}, {0xFF, 0x45}, {0xFF, 0x46}, {0xFF, 0x47}, /* 0xE4-0xE7 */ + {0xFF, 0x48}, {0xFF, 0x49}, {0xFF, 0x4A}, {0xFF, 0x4B}, /* 0xE8-0xEB */ + {0xFF, 0x4C}, {0xFF, 0x4D}, {0xFF, 0x4E}, {0xFF, 0x4F}, /* 0xEC-0xEF */ + {0xFF, 0x50}, {0xFF, 0x51}, {0xFF, 0x52}, {0xFF, 0x53}, /* 0xF0-0xF3 */ + {0xFF, 0x54}, {0xFF, 0x55}, {0xFF, 0x56}, {0xFF, 0x57}, /* 0xF4-0xF7 */ + {0xFF, 0x58}, {0xFF, 0x59}, {0xFF, 0x5A}, {0xFF, 0x5B}, /* 0xF8-0xFB */ + {0xFF, 0x5C}, {0xFF, 0x5D}, {0xFF, 0xE3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x30, 0x41}, {0x30, 0x42}, {0x30, 0x43}, /* 0xA0-0xA3 */ + {0x30, 0x44}, {0x30, 0x45}, {0x30, 0x46}, {0x30, 0x47}, /* 0xA4-0xA7 */ + {0x30, 0x48}, {0x30, 0x49}, {0x30, 0x4A}, {0x30, 0x4B}, /* 0xA8-0xAB */ + {0x30, 0x4C}, {0x30, 0x4D}, {0x30, 0x4E}, {0x30, 0x4F}, /* 0xAC-0xAF */ + {0x30, 0x50}, {0x30, 0x51}, {0x30, 0x52}, {0x30, 0x53}, /* 0xB0-0xB3 */ + {0x30, 0x54}, {0x30, 0x55}, {0x30, 0x56}, {0x30, 0x57}, /* 0xB4-0xB7 */ + {0x30, 0x58}, {0x30, 0x59}, {0x30, 0x5A}, {0x30, 0x5B}, /* 0xB8-0xBB */ + {0x30, 0x5C}, {0x30, 0x5D}, {0x30, 0x5E}, {0x30, 0x5F}, /* 0xBC-0xBF */ + {0x30, 0x60}, {0x30, 0x61}, {0x30, 0x62}, {0x30, 0x63}, /* 0xC0-0xC3 */ + {0x30, 0x64}, {0x30, 0x65}, {0x30, 0x66}, {0x30, 0x67}, /* 0xC4-0xC7 */ + {0x30, 0x68}, {0x30, 0x69}, {0x30, 0x6A}, {0x30, 0x6B}, /* 0xC8-0xCB */ + {0x30, 0x6C}, {0x30, 0x6D}, {0x30, 0x6E}, {0x30, 0x6F}, /* 0xCC-0xCF */ + {0x30, 0x70}, {0x30, 0x71}, {0x30, 0x72}, {0x30, 0x73}, /* 0xD0-0xD3 */ + {0x30, 0x74}, {0x30, 0x75}, {0x30, 0x76}, {0x30, 0x77}, /* 0xD4-0xD7 */ + {0x30, 0x78}, {0x30, 0x79}, {0x30, 0x7A}, {0x30, 0x7B}, /* 0xD8-0xDB */ + {0x30, 0x7C}, {0x30, 0x7D}, {0x30, 0x7E}, {0x30, 0x7F}, /* 0xDC-0xDF */ + {0x30, 0x80}, {0x30, 0x81}, {0x30, 0x82}, {0x30, 0x83}, /* 0xE0-0xE3 */ + {0x30, 0x84}, {0x30, 0x85}, {0x30, 0x86}, {0x30, 0x87}, /* 0xE4-0xE7 */ + {0x30, 0x88}, {0x30, 0x89}, {0x30, 0x8A}, {0x30, 0x8B}, /* 0xE8-0xEB */ + {0x30, 0x8C}, {0x30, 0x8D}, {0x30, 0x8E}, {0x30, 0x8F}, /* 0xEC-0xEF */ + {0x30, 0x90}, {0x30, 0x91}, {0x30, 0x92}, {0x30, 0x93}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x30, 0xA1}, {0x30, 0xA2}, {0x30, 0xA3}, /* 0xA0-0xA3 */ + {0x30, 0xA4}, {0x30, 0xA5}, {0x30, 0xA6}, {0x30, 0xA7}, /* 0xA4-0xA7 */ + {0x30, 0xA8}, {0x30, 0xA9}, {0x30, 0xAA}, {0x30, 0xAB}, /* 0xA8-0xAB */ + {0x30, 0xAC}, {0x30, 0xAD}, {0x30, 0xAE}, {0x30, 0xAF}, /* 0xAC-0xAF */ + {0x30, 0xB0}, {0x30, 0xB1}, {0x30, 0xB2}, {0x30, 0xB3}, /* 0xB0-0xB3 */ + {0x30, 0xB4}, {0x30, 0xB5}, {0x30, 0xB6}, {0x30, 0xB7}, /* 0xB4-0xB7 */ + {0x30, 0xB8}, {0x30, 0xB9}, {0x30, 0xBA}, {0x30, 0xBB}, /* 0xB8-0xBB */ + {0x30, 0xBC}, {0x30, 0xBD}, {0x30, 0xBE}, {0x30, 0xBF}, /* 0xBC-0xBF */ + {0x30, 0xC0}, {0x30, 0xC1}, {0x30, 0xC2}, {0x30, 0xC3}, /* 0xC0-0xC3 */ + {0x30, 0xC4}, {0x30, 0xC5}, {0x30, 0xC6}, {0x30, 0xC7}, /* 0xC4-0xC7 */ + {0x30, 0xC8}, {0x30, 0xC9}, {0x30, 0xCA}, {0x30, 0xCB}, /* 0xC8-0xCB */ + {0x30, 0xCC}, {0x30, 0xCD}, {0x30, 0xCE}, {0x30, 0xCF}, /* 0xCC-0xCF */ + {0x30, 0xD0}, {0x30, 0xD1}, {0x30, 0xD2}, {0x30, 0xD3}, /* 0xD0-0xD3 */ + {0x30, 0xD4}, {0x30, 0xD5}, {0x30, 0xD6}, {0x30, 0xD7}, /* 0xD4-0xD7 */ + {0x30, 0xD8}, {0x30, 0xD9}, {0x30, 0xDA}, {0x30, 0xDB}, /* 0xD8-0xDB */ + {0x30, 0xDC}, {0x30, 0xDD}, {0x30, 0xDE}, {0x30, 0xDF}, /* 0xDC-0xDF */ + {0x30, 0xE0}, {0x30, 0xE1}, {0x30, 0xE2}, {0x30, 0xE3}, /* 0xE0-0xE3 */ + {0x30, 0xE4}, {0x30, 0xE5}, {0x30, 0xE6}, {0x30, 0xE7}, /* 0xE4-0xE7 */ + {0x30, 0xE8}, {0x30, 0xE9}, {0x30, 0xEA}, {0x30, 0xEB}, /* 0xE8-0xEB */ + {0x30, 0xEC}, {0x30, 0xED}, {0x30, 0xEE}, {0x30, 0xEF}, /* 0xEC-0xEF */ + {0x30, 0xF0}, {0x30, 0xF1}, {0x30, 0xF2}, {0x30, 0xF3}, /* 0xF0-0xF3 */ + {0x30, 0xF4}, {0x30, 0xF5}, {0x30, 0xF6}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x03, 0x91}, {0x03, 0x92}, {0x03, 0x93}, /* 0xA0-0xA3 */ + {0x03, 0x94}, {0x03, 0x95}, {0x03, 0x96}, {0x03, 0x97}, /* 0xA4-0xA7 */ + {0x03, 0x98}, {0x03, 0x99}, {0x03, 0x9A}, {0x03, 0x9B}, /* 0xA8-0xAB */ + {0x03, 0x9C}, {0x03, 0x9D}, {0x03, 0x9E}, {0x03, 0x9F}, /* 0xAC-0xAF */ + {0x03, 0xA0}, {0x03, 0xA1}, {0x03, 0xA3}, {0x03, 0xA4}, /* 0xB0-0xB3 */ + {0x03, 0xA5}, {0x03, 0xA6}, {0x03, 0xA7}, {0x03, 0xA8}, /* 0xB4-0xB7 */ + {0x03, 0xA9}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x03, 0xB1}, {0x03, 0xB2}, {0x03, 0xB3}, /* 0xC0-0xC3 */ + {0x03, 0xB4}, {0x03, 0xB5}, {0x03, 0xB6}, {0x03, 0xB7}, /* 0xC4-0xC7 */ + {0x03, 0xB8}, {0x03, 0xB9}, {0x03, 0xBA}, {0x03, 0xBB}, /* 0xC8-0xCB */ + {0x03, 0xBC}, {0x03, 0xBD}, {0x03, 0xBE}, {0x03, 0xBF}, /* 0xCC-0xCF */ + {0x03, 0xC0}, {0x03, 0xC1}, {0x03, 0xC3}, {0x03, 0xC4}, /* 0xD0-0xD3 */ + {0x03, 0xC5}, {0x03, 0xC6}, {0x03, 0xC7}, {0x03, 0xC8}, /* 0xD4-0xD7 */ + {0x03, 0xC9}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0xFE, 0x35}, {0xFE, 0x36}, {0xFE, 0x39}, {0xFE, 0x3A}, /* 0xE0-0xE3 */ + {0xFE, 0x3F}, {0xFE, 0x40}, {0xFE, 0x3D}, {0xFE, 0x3E}, /* 0xE4-0xE7 */ + {0xFE, 0x41}, {0xFE, 0x42}, {0xFE, 0x43}, {0xFE, 0x44}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0xFE, 0x3B}, {0xFE, 0x3C}, /* 0xEC-0xEF */ + {0xFE, 0x37}, {0xFE, 0x38}, {0xFE, 0x31}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0xFE, 0x33}, {0xFE, 0x34}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x04, 0x10}, {0x04, 0x11}, {0x04, 0x12}, /* 0xA0-0xA3 */ + {0x04, 0x13}, {0x04, 0x14}, {0x04, 0x15}, {0x04, 0x01}, /* 0xA4-0xA7 */ + {0x04, 0x16}, {0x04, 0x17}, {0x04, 0x18}, {0x04, 0x19}, /* 0xA8-0xAB */ + {0x04, 0x1A}, {0x04, 0x1B}, {0x04, 0x1C}, {0x04, 0x1D}, /* 0xAC-0xAF */ + {0x04, 0x1E}, {0x04, 0x1F}, {0x04, 0x20}, {0x04, 0x21}, /* 0xB0-0xB3 */ + {0x04, 0x22}, {0x04, 0x23}, {0x04, 0x24}, {0x04, 0x25}, /* 0xB4-0xB7 */ + {0x04, 0x26}, {0x04, 0x27}, {0x04, 0x28}, {0x04, 0x29}, /* 0xB8-0xBB */ + {0x04, 0x2A}, {0x04, 0x2B}, {0x04, 0x2C}, {0x04, 0x2D}, /* 0xBC-0xBF */ + {0x04, 0x2E}, {0x04, 0x2F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x04, 0x30}, {0x04, 0x31}, {0x04, 0x32}, /* 0xD0-0xD3 */ + {0x04, 0x33}, {0x04, 0x34}, {0x04, 0x35}, {0x04, 0x51}, /* 0xD4-0xD7 */ + {0x04, 0x36}, {0x04, 0x37}, {0x04, 0x38}, {0x04, 0x39}, /* 0xD8-0xDB */ + {0x04, 0x3A}, {0x04, 0x3B}, {0x04, 0x3C}, {0x04, 0x3D}, /* 0xDC-0xDF */ + {0x04, 0x3E}, {0x04, 0x3F}, {0x04, 0x40}, {0x04, 0x41}, /* 0xE0-0xE3 */ + {0x04, 0x42}, {0x04, 0x43}, {0x04, 0x44}, {0x04, 0x45}, /* 0xE4-0xE7 */ + {0x04, 0x46}, {0x04, 0x47}, {0x04, 0x48}, {0x04, 0x49}, /* 0xE8-0xEB */ + {0x04, 0x4A}, {0x04, 0x4B}, {0x04, 0x4C}, {0x04, 0x4D}, /* 0xEC-0xEF */ + {0x04, 0x4E}, {0x04, 0x4F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x02, 0xCA}, {0x02, 0xCB}, {0x02, 0xD9}, {0x20, 0x13}, /* 0x40-0x43 */ + {0x20, 0x15}, {0x20, 0x25}, {0x20, 0x35}, {0x21, 0x05}, /* 0x44-0x47 */ + {0x21, 0x09}, {0x21, 0x96}, {0x21, 0x97}, {0x21, 0x98}, /* 0x48-0x4B */ + {0x21, 0x99}, {0x22, 0x15}, {0x22, 0x1F}, {0x22, 0x23}, /* 0x4C-0x4F */ + {0x22, 0x52}, {0x22, 0x66}, {0x22, 0x67}, {0x22, 0xBF}, /* 0x50-0x53 */ + {0x25, 0x50}, {0x25, 0x51}, {0x25, 0x52}, {0x25, 0x53}, /* 0x54-0x57 */ + {0x25, 0x54}, {0x25, 0x55}, {0x25, 0x56}, {0x25, 0x57}, /* 0x58-0x5B */ + {0x25, 0x58}, {0x25, 0x59}, {0x25, 0x5A}, {0x25, 0x5B}, /* 0x5C-0x5F */ + {0x25, 0x5C}, {0x25, 0x5D}, {0x25, 0x5E}, {0x25, 0x5F}, /* 0x60-0x63 */ + {0x25, 0x60}, {0x25, 0x61}, {0x25, 0x62}, {0x25, 0x63}, /* 0x64-0x67 */ + {0x25, 0x64}, {0x25, 0x65}, {0x25, 0x66}, {0x25, 0x67}, /* 0x68-0x6B */ + {0x25, 0x68}, {0x25, 0x69}, {0x25, 0x6A}, {0x25, 0x6B}, /* 0x6C-0x6F */ + {0x25, 0x6C}, {0x25, 0x6D}, {0x25, 0x6E}, {0x25, 0x6F}, /* 0x70-0x73 */ + {0x25, 0x70}, {0x25, 0x71}, {0x25, 0x72}, {0x25, 0x73}, /* 0x74-0x77 */ + {0x25, 0x81}, {0x25, 0x82}, {0x25, 0x83}, {0x25, 0x84}, /* 0x78-0x7B */ + {0x25, 0x85}, {0x25, 0x86}, {0x25, 0x87}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x25, 0x88}, {0x25, 0x89}, {0x25, 0x8A}, {0x25, 0x8B}, /* 0x80-0x83 */ + {0x25, 0x8C}, {0x25, 0x8D}, {0x25, 0x8E}, {0x25, 0x8F}, /* 0x84-0x87 */ + {0x25, 0x93}, {0x25, 0x94}, {0x25, 0x95}, {0x25, 0xBC}, /* 0x88-0x8B */ + {0x25, 0xBD}, {0x25, 0xE2}, {0x25, 0xE3}, {0x25, 0xE4}, /* 0x8C-0x8F */ + {0x25, 0xE5}, {0x26, 0x09}, {0x22, 0x95}, {0x30, 0x12}, /* 0x90-0x93 */ + {0x30, 0x1D}, {0x30, 0x1E}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x01, 0x01}, {0x00, 0xE1}, {0x01, 0xCE}, /* 0xA0-0xA3 */ + {0x00, 0xE0}, {0x01, 0x13}, {0x00, 0xE9}, {0x01, 0x1B}, /* 0xA4-0xA7 */ + {0x00, 0xE8}, {0x01, 0x2B}, {0x00, 0xED}, {0x01, 0xD0}, /* 0xA8-0xAB */ + {0x00, 0xEC}, {0x01, 0x4D}, {0x00, 0xF3}, {0x01, 0xD2}, /* 0xAC-0xAF */ + {0x00, 0xF2}, {0x01, 0x6B}, {0x00, 0xFA}, {0x01, 0xD4}, /* 0xB0-0xB3 */ + {0x00, 0xF9}, {0x01, 0xD6}, {0x01, 0xD8}, {0x01, 0xDA}, /* 0xB4-0xB7 */ + {0x01, 0xDC}, {0x00, 0xFC}, {0x00, 0xEA}, {0x02, 0x51}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x01, 0x44}, {0x01, 0x48}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x02, 0x61}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x31, 0x05}, {0x31, 0x06}, {0x31, 0x07}, /* 0xC4-0xC7 */ + {0x31, 0x08}, {0x31, 0x09}, {0x31, 0x0A}, {0x31, 0x0B}, /* 0xC8-0xCB */ + {0x31, 0x0C}, {0x31, 0x0D}, {0x31, 0x0E}, {0x31, 0x0F}, /* 0xCC-0xCF */ + {0x31, 0x10}, {0x31, 0x11}, {0x31, 0x12}, {0x31, 0x13}, /* 0xD0-0xD3 */ + {0x31, 0x14}, {0x31, 0x15}, {0x31, 0x16}, {0x31, 0x17}, /* 0xD4-0xD7 */ + {0x31, 0x18}, {0x31, 0x19}, {0x31, 0x1A}, {0x31, 0x1B}, /* 0xD8-0xDB */ + {0x31, 0x1C}, {0x31, 0x1D}, {0x31, 0x1E}, {0x31, 0x1F}, /* 0xDC-0xDF */ + {0x31, 0x20}, {0x31, 0x21}, {0x31, 0x22}, {0x31, 0x23}, /* 0xE0-0xE3 */ + {0x31, 0x24}, {0x31, 0x25}, {0x31, 0x26}, {0x31, 0x27}, /* 0xE4-0xE7 */ + {0x31, 0x28}, {0x31, 0x29}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x30, 0x21}, {0x30, 0x22}, {0x30, 0x23}, {0x30, 0x24}, /* 0x40-0x43 */ + {0x30, 0x25}, {0x30, 0x26}, {0x30, 0x27}, {0x30, 0x28}, /* 0x44-0x47 */ + {0x30, 0x29}, {0x32, 0xA3}, {0x33, 0x8E}, {0x33, 0x8F}, /* 0x48-0x4B */ + {0x33, 0x9C}, {0x33, 0x9D}, {0x33, 0x9E}, {0x33, 0xA1}, /* 0x4C-0x4F */ + {0x33, 0xC4}, {0x33, 0xCE}, {0x33, 0xD1}, {0x33, 0xD2}, /* 0x50-0x53 */ + {0x33, 0xD5}, {0xFE, 0x30}, {0xFF, 0xE2}, {0xFF, 0xE4}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x21, 0x21}, {0x32, 0x31}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x20, 0x10}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x30, 0xFC}, {0x30, 0x9B}, {0x30, 0x9C}, {0x30, 0xFD}, /* 0x60-0x63 */ + {0x30, 0xFE}, {0x30, 0x06}, {0x30, 0x9D}, {0x30, 0x9E}, /* 0x64-0x67 */ + {0xFE, 0x49}, {0xFE, 0x4A}, {0xFE, 0x4B}, {0xFE, 0x4C}, /* 0x68-0x6B */ + {0xFE, 0x4D}, {0xFE, 0x4E}, {0xFE, 0x4F}, {0xFE, 0x50}, /* 0x6C-0x6F */ + {0xFE, 0x51}, {0xFE, 0x52}, {0xFE, 0x54}, {0xFE, 0x55}, /* 0x70-0x73 */ + {0xFE, 0x56}, {0xFE, 0x57}, {0xFE, 0x59}, {0xFE, 0x5A}, /* 0x74-0x77 */ + {0xFE, 0x5B}, {0xFE, 0x5C}, {0xFE, 0x5D}, {0xFE, 0x5E}, /* 0x78-0x7B */ + {0xFE, 0x5F}, {0xFE, 0x60}, {0xFE, 0x61}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0xFE, 0x62}, {0xFE, 0x63}, {0xFE, 0x64}, {0xFE, 0x65}, /* 0x80-0x83 */ + {0xFE, 0x66}, {0xFE, 0x68}, {0xFE, 0x69}, {0xFE, 0x6A}, /* 0x84-0x87 */ + {0xFE, 0x6B}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x30, 0x07}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x25, 0x00}, {0x25, 0x01}, {0x25, 0x02}, {0x25, 0x03}, /* 0xA4-0xA7 */ + {0x25, 0x04}, {0x25, 0x05}, {0x25, 0x06}, {0x25, 0x07}, /* 0xA8-0xAB */ + {0x25, 0x08}, {0x25, 0x09}, {0x25, 0x0A}, {0x25, 0x0B}, /* 0xAC-0xAF */ + {0x25, 0x0C}, {0x25, 0x0D}, {0x25, 0x0E}, {0x25, 0x0F}, /* 0xB0-0xB3 */ + {0x25, 0x10}, {0x25, 0x11}, {0x25, 0x12}, {0x25, 0x13}, /* 0xB4-0xB7 */ + {0x25, 0x14}, {0x25, 0x15}, {0x25, 0x16}, {0x25, 0x17}, /* 0xB8-0xBB */ + {0x25, 0x18}, {0x25, 0x19}, {0x25, 0x1A}, {0x25, 0x1B}, /* 0xBC-0xBF */ + {0x25, 0x1C}, {0x25, 0x1D}, {0x25, 0x1E}, {0x25, 0x1F}, /* 0xC0-0xC3 */ + {0x25, 0x20}, {0x25, 0x21}, {0x25, 0x22}, {0x25, 0x23}, /* 0xC4-0xC7 */ + {0x25, 0x24}, {0x25, 0x25}, {0x25, 0x26}, {0x25, 0x27}, /* 0xC8-0xCB */ + {0x25, 0x28}, {0x25, 0x29}, {0x25, 0x2A}, {0x25, 0x2B}, /* 0xCC-0xCF */ + {0x25, 0x2C}, {0x25, 0x2D}, {0x25, 0x2E}, {0x25, 0x2F}, /* 0xD0-0xD3 */ + {0x25, 0x30}, {0x25, 0x31}, {0x25, 0x32}, {0x25, 0x33}, /* 0xD4-0xD7 */ + {0x25, 0x34}, {0x25, 0x35}, {0x25, 0x36}, {0x25, 0x37}, /* 0xD8-0xDB */ + {0x25, 0x38}, {0x25, 0x39}, {0x25, 0x3A}, {0x25, 0x3B}, /* 0xDC-0xDF */ + {0x25, 0x3C}, {0x25, 0x3D}, {0x25, 0x3E}, {0x25, 0x3F}, /* 0xE0-0xE3 */ + {0x25, 0x40}, {0x25, 0x41}, {0x25, 0x42}, {0x25, 0x43}, /* 0xE4-0xE7 */ + {0x25, 0x44}, {0x25, 0x45}, {0x25, 0x46}, {0x25, 0x47}, /* 0xE8-0xEB */ + {0x25, 0x48}, {0x25, 0x49}, {0x25, 0x4A}, {0x25, 0x4B}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x72, 0xDC}, {0x72, 0xDD}, {0x72, 0xDF}, {0x72, 0xE2}, /* 0x40-0x43 */ + {0x72, 0xE3}, {0x72, 0xE4}, {0x72, 0xE5}, {0x72, 0xE6}, /* 0x44-0x47 */ + {0x72, 0xE7}, {0x72, 0xEA}, {0x72, 0xEB}, {0x72, 0xF5}, /* 0x48-0x4B */ + {0x72, 0xF6}, {0x72, 0xF9}, {0x72, 0xFD}, {0x72, 0xFE}, /* 0x4C-0x4F */ + {0x72, 0xFF}, {0x73, 0x00}, {0x73, 0x02}, {0x73, 0x04}, /* 0x50-0x53 */ + {0x73, 0x05}, {0x73, 0x06}, {0x73, 0x07}, {0x73, 0x08}, /* 0x54-0x57 */ + {0x73, 0x09}, {0x73, 0x0B}, {0x73, 0x0C}, {0x73, 0x0D}, /* 0x58-0x5B */ + {0x73, 0x0F}, {0x73, 0x10}, {0x73, 0x11}, {0x73, 0x12}, /* 0x5C-0x5F */ + {0x73, 0x14}, {0x73, 0x18}, {0x73, 0x19}, {0x73, 0x1A}, /* 0x60-0x63 */ + {0x73, 0x1F}, {0x73, 0x20}, {0x73, 0x23}, {0x73, 0x24}, /* 0x64-0x67 */ + {0x73, 0x26}, {0x73, 0x27}, {0x73, 0x28}, {0x73, 0x2D}, /* 0x68-0x6B */ + {0x73, 0x2F}, {0x73, 0x30}, {0x73, 0x32}, {0x73, 0x33}, /* 0x6C-0x6F */ + {0x73, 0x35}, {0x73, 0x36}, {0x73, 0x3A}, {0x73, 0x3B}, /* 0x70-0x73 */ + {0x73, 0x3C}, {0x73, 0x3D}, {0x73, 0x40}, {0x73, 0x41}, /* 0x74-0x77 */ + {0x73, 0x42}, {0x73, 0x43}, {0x73, 0x44}, {0x73, 0x45}, /* 0x78-0x7B */ + {0x73, 0x46}, {0x73, 0x47}, {0x73, 0x48}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x73, 0x49}, {0x73, 0x4A}, {0x73, 0x4B}, {0x73, 0x4C}, /* 0x80-0x83 */ + {0x73, 0x4E}, {0x73, 0x4F}, {0x73, 0x51}, {0x73, 0x53}, /* 0x84-0x87 */ + {0x73, 0x54}, {0x73, 0x55}, {0x73, 0x56}, {0x73, 0x58}, /* 0x88-0x8B */ + {0x73, 0x59}, {0x73, 0x5A}, {0x73, 0x5B}, {0x73, 0x5C}, /* 0x8C-0x8F */ + {0x73, 0x5D}, {0x73, 0x5E}, {0x73, 0x5F}, {0x73, 0x61}, /* 0x90-0x93 */ + {0x73, 0x62}, {0x73, 0x63}, {0x73, 0x64}, {0x73, 0x65}, /* 0x94-0x97 */ + {0x73, 0x66}, {0x73, 0x67}, {0x73, 0x68}, {0x73, 0x69}, /* 0x98-0x9B */ + {0x73, 0x6A}, {0x73, 0x6B}, {0x73, 0x6E}, {0x73, 0x70}, /* 0x9C-0x9F */ + {0x73, 0x71}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x73, 0x72}, {0x73, 0x73}, {0x73, 0x74}, {0x73, 0x75}, /* 0x40-0x43 */ + {0x73, 0x76}, {0x73, 0x77}, {0x73, 0x78}, {0x73, 0x79}, /* 0x44-0x47 */ + {0x73, 0x7A}, {0x73, 0x7B}, {0x73, 0x7C}, {0x73, 0x7D}, /* 0x48-0x4B */ + {0x73, 0x7F}, {0x73, 0x80}, {0x73, 0x81}, {0x73, 0x82}, /* 0x4C-0x4F */ + {0x73, 0x83}, {0x73, 0x85}, {0x73, 0x86}, {0x73, 0x88}, /* 0x50-0x53 */ + {0x73, 0x8A}, {0x73, 0x8C}, {0x73, 0x8D}, {0x73, 0x8F}, /* 0x54-0x57 */ + {0x73, 0x90}, {0x73, 0x92}, {0x73, 0x93}, {0x73, 0x94}, /* 0x58-0x5B */ + {0x73, 0x95}, {0x73, 0x97}, {0x73, 0x98}, {0x73, 0x99}, /* 0x5C-0x5F */ + {0x73, 0x9A}, {0x73, 0x9C}, {0x73, 0x9D}, {0x73, 0x9E}, /* 0x60-0x63 */ + {0x73, 0xA0}, {0x73, 0xA1}, {0x73, 0xA3}, {0x73, 0xA4}, /* 0x64-0x67 */ + {0x73, 0xA5}, {0x73, 0xA6}, {0x73, 0xA7}, {0x73, 0xA8}, /* 0x68-0x6B */ + {0x73, 0xAA}, {0x73, 0xAC}, {0x73, 0xAD}, {0x73, 0xB1}, /* 0x6C-0x6F */ + {0x73, 0xB4}, {0x73, 0xB5}, {0x73, 0xB6}, {0x73, 0xB8}, /* 0x70-0x73 */ + {0x73, 0xB9}, {0x73, 0xBC}, {0x73, 0xBD}, {0x73, 0xBE}, /* 0x74-0x77 */ + {0x73, 0xBF}, {0x73, 0xC1}, {0x73, 0xC3}, {0x73, 0xC4}, /* 0x78-0x7B */ + {0x73, 0xC5}, {0x73, 0xC6}, {0x73, 0xC7}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x73, 0xCB}, {0x73, 0xCC}, {0x73, 0xCE}, {0x73, 0xD2}, /* 0x80-0x83 */ + {0x73, 0xD3}, {0x73, 0xD4}, {0x73, 0xD5}, {0x73, 0xD6}, /* 0x84-0x87 */ + {0x73, 0xD7}, {0x73, 0xD8}, {0x73, 0xDA}, {0x73, 0xDB}, /* 0x88-0x8B */ + {0x73, 0xDC}, {0x73, 0xDD}, {0x73, 0xDF}, {0x73, 0xE1}, /* 0x8C-0x8F */ + {0x73, 0xE2}, {0x73, 0xE3}, {0x73, 0xE4}, {0x73, 0xE6}, /* 0x90-0x93 */ + {0x73, 0xE8}, {0x73, 0xEA}, {0x73, 0xEB}, {0x73, 0xEC}, /* 0x94-0x97 */ + {0x73, 0xEE}, {0x73, 0xEF}, {0x73, 0xF0}, {0x73, 0xF1}, /* 0x98-0x9B */ + {0x73, 0xF3}, {0x73, 0xF4}, {0x73, 0xF5}, {0x73, 0xF6}, /* 0x9C-0x9F */ + {0x73, 0xF7}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x73, 0xF8}, {0x73, 0xF9}, {0x73, 0xFA}, {0x73, 0xFB}, /* 0x40-0x43 */ + {0x73, 0xFC}, {0x73, 0xFD}, {0x73, 0xFE}, {0x73, 0xFF}, /* 0x44-0x47 */ + {0x74, 0x00}, {0x74, 0x01}, {0x74, 0x02}, {0x74, 0x04}, /* 0x48-0x4B */ + {0x74, 0x07}, {0x74, 0x08}, {0x74, 0x0B}, {0x74, 0x0C}, /* 0x4C-0x4F */ + {0x74, 0x0D}, {0x74, 0x0E}, {0x74, 0x11}, {0x74, 0x12}, /* 0x50-0x53 */ + {0x74, 0x13}, {0x74, 0x14}, {0x74, 0x15}, {0x74, 0x16}, /* 0x54-0x57 */ + {0x74, 0x17}, {0x74, 0x18}, {0x74, 0x19}, {0x74, 0x1C}, /* 0x58-0x5B */ + {0x74, 0x1D}, {0x74, 0x1E}, {0x74, 0x1F}, {0x74, 0x20}, /* 0x5C-0x5F */ + {0x74, 0x21}, {0x74, 0x23}, {0x74, 0x24}, {0x74, 0x27}, /* 0x60-0x63 */ + {0x74, 0x29}, {0x74, 0x2B}, {0x74, 0x2D}, {0x74, 0x2F}, /* 0x64-0x67 */ + {0x74, 0x31}, {0x74, 0x32}, {0x74, 0x37}, {0x74, 0x38}, /* 0x68-0x6B */ + {0x74, 0x39}, {0x74, 0x3A}, {0x74, 0x3B}, {0x74, 0x3D}, /* 0x6C-0x6F */ + {0x74, 0x3E}, {0x74, 0x3F}, {0x74, 0x40}, {0x74, 0x42}, /* 0x70-0x73 */ + {0x74, 0x43}, {0x74, 0x44}, {0x74, 0x45}, {0x74, 0x46}, /* 0x74-0x77 */ + {0x74, 0x47}, {0x74, 0x48}, {0x74, 0x49}, {0x74, 0x4A}, /* 0x78-0x7B */ + {0x74, 0x4B}, {0x74, 0x4C}, {0x74, 0x4D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x74, 0x4E}, {0x74, 0x4F}, {0x74, 0x50}, {0x74, 0x51}, /* 0x80-0x83 */ + {0x74, 0x52}, {0x74, 0x53}, {0x74, 0x54}, {0x74, 0x56}, /* 0x84-0x87 */ + {0x74, 0x58}, {0x74, 0x5D}, {0x74, 0x60}, {0x74, 0x61}, /* 0x88-0x8B */ + {0x74, 0x62}, {0x74, 0x63}, {0x74, 0x64}, {0x74, 0x65}, /* 0x8C-0x8F */ + {0x74, 0x66}, {0x74, 0x67}, {0x74, 0x68}, {0x74, 0x69}, /* 0x90-0x93 */ + {0x74, 0x6A}, {0x74, 0x6B}, {0x74, 0x6C}, {0x74, 0x6E}, /* 0x94-0x97 */ + {0x74, 0x6F}, {0x74, 0x71}, {0x74, 0x72}, {0x74, 0x73}, /* 0x98-0x9B */ + {0x74, 0x74}, {0x74, 0x75}, {0x74, 0x78}, {0x74, 0x79}, /* 0x9C-0x9F */ + {0x74, 0x7A}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x74, 0x7B}, {0x74, 0x7C}, {0x74, 0x7D}, {0x74, 0x7F}, /* 0x40-0x43 */ + {0x74, 0x82}, {0x74, 0x84}, {0x74, 0x85}, {0x74, 0x86}, /* 0x44-0x47 */ + {0x74, 0x88}, {0x74, 0x89}, {0x74, 0x8A}, {0x74, 0x8C}, /* 0x48-0x4B */ + {0x74, 0x8D}, {0x74, 0x8F}, {0x74, 0x91}, {0x74, 0x92}, /* 0x4C-0x4F */ + {0x74, 0x93}, {0x74, 0x94}, {0x74, 0x95}, {0x74, 0x96}, /* 0x50-0x53 */ + {0x74, 0x97}, {0x74, 0x98}, {0x74, 0x99}, {0x74, 0x9A}, /* 0x54-0x57 */ + {0x74, 0x9B}, {0x74, 0x9D}, {0x74, 0x9F}, {0x74, 0xA0}, /* 0x58-0x5B */ + {0x74, 0xA1}, {0x74, 0xA2}, {0x74, 0xA3}, {0x74, 0xA4}, /* 0x5C-0x5F */ + {0x74, 0xA5}, {0x74, 0xA6}, {0x74, 0xAA}, {0x74, 0xAB}, /* 0x60-0x63 */ + {0x74, 0xAC}, {0x74, 0xAD}, {0x74, 0xAE}, {0x74, 0xAF}, /* 0x64-0x67 */ + {0x74, 0xB0}, {0x74, 0xB1}, {0x74, 0xB2}, {0x74, 0xB3}, /* 0x68-0x6B */ + {0x74, 0xB4}, {0x74, 0xB5}, {0x74, 0xB6}, {0x74, 0xB7}, /* 0x6C-0x6F */ + {0x74, 0xB8}, {0x74, 0xB9}, {0x74, 0xBB}, {0x74, 0xBC}, /* 0x70-0x73 */ + {0x74, 0xBD}, {0x74, 0xBE}, {0x74, 0xBF}, {0x74, 0xC0}, /* 0x74-0x77 */ + {0x74, 0xC1}, {0x74, 0xC2}, {0x74, 0xC3}, {0x74, 0xC4}, /* 0x78-0x7B */ + {0x74, 0xC5}, {0x74, 0xC6}, {0x74, 0xC7}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x74, 0xC8}, {0x74, 0xC9}, {0x74, 0xCA}, {0x74, 0xCB}, /* 0x80-0x83 */ + {0x74, 0xCC}, {0x74, 0xCD}, {0x74, 0xCE}, {0x74, 0xCF}, /* 0x84-0x87 */ + {0x74, 0xD0}, {0x74, 0xD1}, {0x74, 0xD3}, {0x74, 0xD4}, /* 0x88-0x8B */ + {0x74, 0xD5}, {0x74, 0xD6}, {0x74, 0xD7}, {0x74, 0xD8}, /* 0x8C-0x8F */ + {0x74, 0xD9}, {0x74, 0xDA}, {0x74, 0xDB}, {0x74, 0xDD}, /* 0x90-0x93 */ + {0x74, 0xDF}, {0x74, 0xE1}, {0x74, 0xE5}, {0x74, 0xE7}, /* 0x94-0x97 */ + {0x74, 0xE8}, {0x74, 0xE9}, {0x74, 0xEA}, {0x74, 0xEB}, /* 0x98-0x9B */ + {0x74, 0xEC}, {0x74, 0xED}, {0x74, 0xF0}, {0x74, 0xF1}, /* 0x9C-0x9F */ + {0x74, 0xF2}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x74, 0xF3}, {0x74, 0xF5}, {0x74, 0xF8}, {0x74, 0xF9}, /* 0x40-0x43 */ + {0x74, 0xFA}, {0x74, 0xFB}, {0x74, 0xFC}, {0x74, 0xFD}, /* 0x44-0x47 */ + {0x74, 0xFE}, {0x75, 0x00}, {0x75, 0x01}, {0x75, 0x02}, /* 0x48-0x4B */ + {0x75, 0x03}, {0x75, 0x05}, {0x75, 0x06}, {0x75, 0x07}, /* 0x4C-0x4F */ + {0x75, 0x08}, {0x75, 0x09}, {0x75, 0x0A}, {0x75, 0x0B}, /* 0x50-0x53 */ + {0x75, 0x0C}, {0x75, 0x0E}, {0x75, 0x10}, {0x75, 0x12}, /* 0x54-0x57 */ + {0x75, 0x14}, {0x75, 0x15}, {0x75, 0x16}, {0x75, 0x17}, /* 0x58-0x5B */ + {0x75, 0x1B}, {0x75, 0x1D}, {0x75, 0x1E}, {0x75, 0x20}, /* 0x5C-0x5F */ + {0x75, 0x21}, {0x75, 0x22}, {0x75, 0x23}, {0x75, 0x24}, /* 0x60-0x63 */ + {0x75, 0x26}, {0x75, 0x27}, {0x75, 0x2A}, {0x75, 0x2E}, /* 0x64-0x67 */ + {0x75, 0x34}, {0x75, 0x36}, {0x75, 0x39}, {0x75, 0x3C}, /* 0x68-0x6B */ + {0x75, 0x3D}, {0x75, 0x3F}, {0x75, 0x41}, {0x75, 0x42}, /* 0x6C-0x6F */ + {0x75, 0x43}, {0x75, 0x44}, {0x75, 0x46}, {0x75, 0x47}, /* 0x70-0x73 */ + {0x75, 0x49}, {0x75, 0x4A}, {0x75, 0x4D}, {0x75, 0x50}, /* 0x74-0x77 */ + {0x75, 0x51}, {0x75, 0x52}, {0x75, 0x53}, {0x75, 0x55}, /* 0x78-0x7B */ + {0x75, 0x56}, {0x75, 0x57}, {0x75, 0x58}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x75, 0x5D}, {0x75, 0x5E}, {0x75, 0x5F}, {0x75, 0x60}, /* 0x80-0x83 */ + {0x75, 0x61}, {0x75, 0x62}, {0x75, 0x63}, {0x75, 0x64}, /* 0x84-0x87 */ + {0x75, 0x67}, {0x75, 0x68}, {0x75, 0x69}, {0x75, 0x6B}, /* 0x88-0x8B */ + {0x75, 0x6C}, {0x75, 0x6D}, {0x75, 0x6E}, {0x75, 0x6F}, /* 0x8C-0x8F */ + {0x75, 0x70}, {0x75, 0x71}, {0x75, 0x73}, {0x75, 0x75}, /* 0x90-0x93 */ + {0x75, 0x76}, {0x75, 0x77}, {0x75, 0x7A}, {0x75, 0x7B}, /* 0x94-0x97 */ + {0x75, 0x7C}, {0x75, 0x7D}, {0x75, 0x7E}, {0x75, 0x80}, /* 0x98-0x9B */ + {0x75, 0x81}, {0x75, 0x82}, {0x75, 0x84}, {0x75, 0x85}, /* 0x9C-0x9F */ + {0x75, 0x87}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x75, 0x88}, {0x75, 0x89}, {0x75, 0x8A}, {0x75, 0x8C}, /* 0x40-0x43 */ + {0x75, 0x8D}, {0x75, 0x8E}, {0x75, 0x90}, {0x75, 0x93}, /* 0x44-0x47 */ + {0x75, 0x95}, {0x75, 0x98}, {0x75, 0x9B}, {0x75, 0x9C}, /* 0x48-0x4B */ + {0x75, 0x9E}, {0x75, 0xA2}, {0x75, 0xA6}, {0x75, 0xA7}, /* 0x4C-0x4F */ + {0x75, 0xA8}, {0x75, 0xA9}, {0x75, 0xAA}, {0x75, 0xAD}, /* 0x50-0x53 */ + {0x75, 0xB6}, {0x75, 0xB7}, {0x75, 0xBA}, {0x75, 0xBB}, /* 0x54-0x57 */ + {0x75, 0xBF}, {0x75, 0xC0}, {0x75, 0xC1}, {0x75, 0xC6}, /* 0x58-0x5B */ + {0x75, 0xCB}, {0x75, 0xCC}, {0x75, 0xCE}, {0x75, 0xCF}, /* 0x5C-0x5F */ + {0x75, 0xD0}, {0x75, 0xD1}, {0x75, 0xD3}, {0x75, 0xD7}, /* 0x60-0x63 */ + {0x75, 0xD9}, {0x75, 0xDA}, {0x75, 0xDC}, {0x75, 0xDD}, /* 0x64-0x67 */ + {0x75, 0xDF}, {0x75, 0xE0}, {0x75, 0xE1}, {0x75, 0xE5}, /* 0x68-0x6B */ + {0x75, 0xE9}, {0x75, 0xEC}, {0x75, 0xED}, {0x75, 0xEE}, /* 0x6C-0x6F */ + {0x75, 0xEF}, {0x75, 0xF2}, {0x75, 0xF3}, {0x75, 0xF5}, /* 0x70-0x73 */ + {0x75, 0xF6}, {0x75, 0xF7}, {0x75, 0xF8}, {0x75, 0xFA}, /* 0x74-0x77 */ + {0x75, 0xFB}, {0x75, 0xFD}, {0x75, 0xFE}, {0x76, 0x02}, /* 0x78-0x7B */ + {0x76, 0x04}, {0x76, 0x06}, {0x76, 0x07}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x76, 0x08}, {0x76, 0x09}, {0x76, 0x0B}, {0x76, 0x0D}, /* 0x80-0x83 */ + {0x76, 0x0E}, {0x76, 0x0F}, {0x76, 0x11}, {0x76, 0x12}, /* 0x84-0x87 */ + {0x76, 0x13}, {0x76, 0x14}, {0x76, 0x16}, {0x76, 0x1A}, /* 0x88-0x8B */ + {0x76, 0x1C}, {0x76, 0x1D}, {0x76, 0x1E}, {0x76, 0x21}, /* 0x8C-0x8F */ + {0x76, 0x23}, {0x76, 0x27}, {0x76, 0x28}, {0x76, 0x2C}, /* 0x90-0x93 */ + {0x76, 0x2E}, {0x76, 0x2F}, {0x76, 0x31}, {0x76, 0x32}, /* 0x94-0x97 */ + {0x76, 0x36}, {0x76, 0x37}, {0x76, 0x39}, {0x76, 0x3A}, /* 0x98-0x9B */ + {0x76, 0x3B}, {0x76, 0x3D}, {0x76, 0x41}, {0x76, 0x42}, /* 0x9C-0x9F */ + {0x76, 0x44}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x76, 0x45}, {0x76, 0x46}, {0x76, 0x47}, {0x76, 0x48}, /* 0x40-0x43 */ + {0x76, 0x49}, {0x76, 0x4A}, {0x76, 0x4B}, {0x76, 0x4E}, /* 0x44-0x47 */ + {0x76, 0x4F}, {0x76, 0x50}, {0x76, 0x51}, {0x76, 0x52}, /* 0x48-0x4B */ + {0x76, 0x53}, {0x76, 0x55}, {0x76, 0x57}, {0x76, 0x58}, /* 0x4C-0x4F */ + {0x76, 0x59}, {0x76, 0x5A}, {0x76, 0x5B}, {0x76, 0x5D}, /* 0x50-0x53 */ + {0x76, 0x5F}, {0x76, 0x60}, {0x76, 0x61}, {0x76, 0x62}, /* 0x54-0x57 */ + {0x76, 0x64}, {0x76, 0x65}, {0x76, 0x66}, {0x76, 0x67}, /* 0x58-0x5B */ + {0x76, 0x68}, {0x76, 0x69}, {0x76, 0x6A}, {0x76, 0x6C}, /* 0x5C-0x5F */ + {0x76, 0x6D}, {0x76, 0x6E}, {0x76, 0x70}, {0x76, 0x71}, /* 0x60-0x63 */ + {0x76, 0x72}, {0x76, 0x73}, {0x76, 0x74}, {0x76, 0x75}, /* 0x64-0x67 */ + {0x76, 0x76}, {0x76, 0x77}, {0x76, 0x79}, {0x76, 0x7A}, /* 0x68-0x6B */ + {0x76, 0x7C}, {0x76, 0x7F}, {0x76, 0x80}, {0x76, 0x81}, /* 0x6C-0x6F */ + {0x76, 0x83}, {0x76, 0x85}, {0x76, 0x89}, {0x76, 0x8A}, /* 0x70-0x73 */ + {0x76, 0x8C}, {0x76, 0x8D}, {0x76, 0x8F}, {0x76, 0x90}, /* 0x74-0x77 */ + {0x76, 0x92}, {0x76, 0x94}, {0x76, 0x95}, {0x76, 0x97}, /* 0x78-0x7B */ + {0x76, 0x98}, {0x76, 0x9A}, {0x76, 0x9B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x76, 0x9C}, {0x76, 0x9D}, {0x76, 0x9E}, {0x76, 0x9F}, /* 0x80-0x83 */ + {0x76, 0xA0}, {0x76, 0xA1}, {0x76, 0xA2}, {0x76, 0xA3}, /* 0x84-0x87 */ + {0x76, 0xA5}, {0x76, 0xA6}, {0x76, 0xA7}, {0x76, 0xA8}, /* 0x88-0x8B */ + {0x76, 0xA9}, {0x76, 0xAA}, {0x76, 0xAB}, {0x76, 0xAC}, /* 0x8C-0x8F */ + {0x76, 0xAD}, {0x76, 0xAF}, {0x76, 0xB0}, {0x76, 0xB3}, /* 0x90-0x93 */ + {0x76, 0xB5}, {0x76, 0xB6}, {0x76, 0xB7}, {0x76, 0xB8}, /* 0x94-0x97 */ + {0x76, 0xB9}, {0x76, 0xBA}, {0x76, 0xBB}, {0x76, 0xBC}, /* 0x98-0x9B */ + {0x76, 0xBD}, {0x76, 0xBE}, {0x76, 0xC0}, {0x76, 0xC1}, /* 0x9C-0x9F */ + {0x76, 0xC3}, {0x55, 0x4A}, {0x96, 0x3F}, {0x57, 0xC3}, /* 0xA0-0xA3 */ + {0x63, 0x28}, {0x54, 0xCE}, {0x55, 0x09}, {0x54, 0xC0}, /* 0xA4-0xA7 */ + {0x76, 0x91}, {0x76, 0x4C}, {0x85, 0x3C}, {0x77, 0xEE}, /* 0xA8-0xAB */ + {0x82, 0x7E}, {0x78, 0x8D}, {0x72, 0x31}, {0x96, 0x98}, /* 0xAC-0xAF */ + {0x97, 0x8D}, {0x6C, 0x28}, {0x5B, 0x89}, {0x4F, 0xFA}, /* 0xB0-0xB3 */ + {0x63, 0x09}, {0x66, 0x97}, {0x5C, 0xB8}, {0x80, 0xFA}, /* 0xB4-0xB7 */ + {0x68, 0x48}, {0x80, 0xAE}, {0x66, 0x02}, {0x76, 0xCE}, /* 0xB8-0xBB */ + {0x51, 0xF9}, {0x65, 0x56}, {0x71, 0xAC}, {0x7F, 0xF1}, /* 0xBC-0xBF */ + {0x88, 0x84}, {0x50, 0xB2}, {0x59, 0x65}, {0x61, 0xCA}, /* 0xC0-0xC3 */ + {0x6F, 0xB3}, {0x82, 0xAD}, {0x63, 0x4C}, {0x62, 0x52}, /* 0xC4-0xC7 */ + {0x53, 0xED}, {0x54, 0x27}, {0x7B, 0x06}, {0x51, 0x6B}, /* 0xC8-0xCB */ + {0x75, 0xA4}, {0x5D, 0xF4}, {0x62, 0xD4}, {0x8D, 0xCB}, /* 0xCC-0xCF */ + {0x97, 0x76}, {0x62, 0x8A}, {0x80, 0x19}, {0x57, 0x5D}, /* 0xD0-0xD3 */ + {0x97, 0x38}, {0x7F, 0x62}, {0x72, 0x38}, {0x76, 0x7D}, /* 0xD4-0xD7 */ + {0x67, 0xCF}, {0x76, 0x7E}, {0x64, 0x46}, {0x4F, 0x70}, /* 0xD8-0xDB */ + {0x8D, 0x25}, {0x62, 0xDC}, {0x7A, 0x17}, {0x65, 0x91}, /* 0xDC-0xDF */ + {0x73, 0xED}, {0x64, 0x2C}, {0x62, 0x73}, {0x82, 0x2C}, /* 0xE0-0xE3 */ + {0x98, 0x81}, {0x67, 0x7F}, {0x72, 0x48}, {0x62, 0x6E}, /* 0xE4-0xE7 */ + {0x62, 0xCC}, {0x4F, 0x34}, {0x74, 0xE3}, {0x53, 0x4A}, /* 0xE8-0xEB */ + {0x52, 0x9E}, {0x7E, 0xCA}, {0x90, 0xA6}, {0x5E, 0x2E}, /* 0xEC-0xEF */ + {0x68, 0x86}, {0x69, 0x9C}, {0x81, 0x80}, {0x7E, 0xD1}, /* 0xF0-0xF3 */ + {0x68, 0xD2}, {0x78, 0xC5}, {0x86, 0x8C}, {0x95, 0x51}, /* 0xF4-0xF7 */ + {0x50, 0x8D}, {0x8C, 0x24}, {0x82, 0xDE}, {0x80, 0xDE}, /* 0xF8-0xFB */ + {0x53, 0x05}, {0x89, 0x12}, {0x52, 0x65}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x76, 0xC4}, {0x76, 0xC7}, {0x76, 0xC9}, {0x76, 0xCB}, /* 0x40-0x43 */ + {0x76, 0xCC}, {0x76, 0xD3}, {0x76, 0xD5}, {0x76, 0xD9}, /* 0x44-0x47 */ + {0x76, 0xDA}, {0x76, 0xDC}, {0x76, 0xDD}, {0x76, 0xDE}, /* 0x48-0x4B */ + {0x76, 0xE0}, {0x76, 0xE1}, {0x76, 0xE2}, {0x76, 0xE3}, /* 0x4C-0x4F */ + {0x76, 0xE4}, {0x76, 0xE6}, {0x76, 0xE7}, {0x76, 0xE8}, /* 0x50-0x53 */ + {0x76, 0xE9}, {0x76, 0xEA}, {0x76, 0xEB}, {0x76, 0xEC}, /* 0x54-0x57 */ + {0x76, 0xED}, {0x76, 0xF0}, {0x76, 0xF3}, {0x76, 0xF5}, /* 0x58-0x5B */ + {0x76, 0xF6}, {0x76, 0xF7}, {0x76, 0xFA}, {0x76, 0xFB}, /* 0x5C-0x5F */ + {0x76, 0xFD}, {0x76, 0xFF}, {0x77, 0x00}, {0x77, 0x02}, /* 0x60-0x63 */ + {0x77, 0x03}, {0x77, 0x05}, {0x77, 0x06}, {0x77, 0x0A}, /* 0x64-0x67 */ + {0x77, 0x0C}, {0x77, 0x0E}, {0x77, 0x0F}, {0x77, 0x10}, /* 0x68-0x6B */ + {0x77, 0x11}, {0x77, 0x12}, {0x77, 0x13}, {0x77, 0x14}, /* 0x6C-0x6F */ + {0x77, 0x15}, {0x77, 0x16}, {0x77, 0x17}, {0x77, 0x18}, /* 0x70-0x73 */ + {0x77, 0x1B}, {0x77, 0x1C}, {0x77, 0x1D}, {0x77, 0x1E}, /* 0x74-0x77 */ + {0x77, 0x21}, {0x77, 0x23}, {0x77, 0x24}, {0x77, 0x25}, /* 0x78-0x7B */ + {0x77, 0x27}, {0x77, 0x2A}, {0x77, 0x2B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x77, 0x2C}, {0x77, 0x2E}, {0x77, 0x30}, {0x77, 0x31}, /* 0x80-0x83 */ + {0x77, 0x32}, {0x77, 0x33}, {0x77, 0x34}, {0x77, 0x39}, /* 0x84-0x87 */ + {0x77, 0x3B}, {0x77, 0x3D}, {0x77, 0x3E}, {0x77, 0x3F}, /* 0x88-0x8B */ + {0x77, 0x42}, {0x77, 0x44}, {0x77, 0x45}, {0x77, 0x46}, /* 0x8C-0x8F */ + {0x77, 0x48}, {0x77, 0x49}, {0x77, 0x4A}, {0x77, 0x4B}, /* 0x90-0x93 */ + {0x77, 0x4C}, {0x77, 0x4D}, {0x77, 0x4E}, {0x77, 0x4F}, /* 0x94-0x97 */ + {0x77, 0x52}, {0x77, 0x53}, {0x77, 0x54}, {0x77, 0x55}, /* 0x98-0x9B */ + {0x77, 0x56}, {0x77, 0x57}, {0x77, 0x58}, {0x77, 0x59}, /* 0x9C-0x9F */ + {0x77, 0x5C}, {0x85, 0x84}, {0x96, 0xF9}, {0x4F, 0xDD}, /* 0xA0-0xA3 */ + {0x58, 0x21}, {0x99, 0x71}, {0x5B, 0x9D}, {0x62, 0xB1}, /* 0xA4-0xA7 */ + {0x62, 0xA5}, {0x66, 0xB4}, {0x8C, 0x79}, {0x9C, 0x8D}, /* 0xA8-0xAB */ + {0x72, 0x06}, {0x67, 0x6F}, {0x78, 0x91}, {0x60, 0xB2}, /* 0xAC-0xAF */ + {0x53, 0x51}, {0x53, 0x17}, {0x8F, 0x88}, {0x80, 0xCC}, /* 0xB0-0xB3 */ + {0x8D, 0x1D}, {0x94, 0xA1}, {0x50, 0x0D}, {0x72, 0xC8}, /* 0xB4-0xB7 */ + {0x59, 0x07}, {0x60, 0xEB}, {0x71, 0x19}, {0x88, 0xAB}, /* 0xB8-0xBB */ + {0x59, 0x54}, {0x82, 0xEF}, {0x67, 0x2C}, {0x7B, 0x28}, /* 0xBC-0xBF */ + {0x5D, 0x29}, {0x7E, 0xF7}, {0x75, 0x2D}, {0x6C, 0xF5}, /* 0xC0-0xC3 */ + {0x8E, 0x66}, {0x8F, 0xF8}, {0x90, 0x3C}, {0x9F, 0x3B}, /* 0xC4-0xC7 */ + {0x6B, 0xD4}, {0x91, 0x19}, {0x7B, 0x14}, {0x5F, 0x7C}, /* 0xC8-0xCB */ + {0x78, 0xA7}, {0x84, 0xD6}, {0x85, 0x3D}, {0x6B, 0xD5}, /* 0xCC-0xCF */ + {0x6B, 0xD9}, {0x6B, 0xD6}, {0x5E, 0x01}, {0x5E, 0x87}, /* 0xD0-0xD3 */ + {0x75, 0xF9}, {0x95, 0xED}, {0x65, 0x5D}, {0x5F, 0x0A}, /* 0xD4-0xD7 */ + {0x5F, 0xC5}, {0x8F, 0x9F}, {0x58, 0xC1}, {0x81, 0xC2}, /* 0xD8-0xDB */ + {0x90, 0x7F}, {0x96, 0x5B}, {0x97, 0xAD}, {0x8F, 0xB9}, /* 0xDC-0xDF */ + {0x7F, 0x16}, {0x8D, 0x2C}, {0x62, 0x41}, {0x4F, 0xBF}, /* 0xE0-0xE3 */ + {0x53, 0xD8}, {0x53, 0x5E}, {0x8F, 0xA8}, {0x8F, 0xA9}, /* 0xE4-0xE7 */ + {0x8F, 0xAB}, {0x90, 0x4D}, {0x68, 0x07}, {0x5F, 0x6A}, /* 0xE8-0xEB */ + {0x81, 0x98}, {0x88, 0x68}, {0x9C, 0xD6}, {0x61, 0x8B}, /* 0xEC-0xEF */ + {0x52, 0x2B}, {0x76, 0x2A}, {0x5F, 0x6C}, {0x65, 0x8C}, /* 0xF0-0xF3 */ + {0x6F, 0xD2}, {0x6E, 0xE8}, {0x5B, 0xBE}, {0x64, 0x48}, /* 0xF4-0xF7 */ + {0x51, 0x75}, {0x51, 0xB0}, {0x67, 0xC4}, {0x4E, 0x19}, /* 0xF8-0xFB */ + {0x79, 0xC9}, {0x99, 0x7C}, {0x70, 0xB3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x77, 0x5D}, {0x77, 0x5E}, {0x77, 0x5F}, {0x77, 0x60}, /* 0x40-0x43 */ + {0x77, 0x64}, {0x77, 0x67}, {0x77, 0x69}, {0x77, 0x6A}, /* 0x44-0x47 */ + {0x77, 0x6D}, {0x77, 0x6E}, {0x77, 0x6F}, {0x77, 0x70}, /* 0x48-0x4B */ + {0x77, 0x71}, {0x77, 0x72}, {0x77, 0x73}, {0x77, 0x74}, /* 0x4C-0x4F */ + {0x77, 0x75}, {0x77, 0x76}, {0x77, 0x77}, {0x77, 0x78}, /* 0x50-0x53 */ + {0x77, 0x7A}, {0x77, 0x7B}, {0x77, 0x7C}, {0x77, 0x81}, /* 0x54-0x57 */ + {0x77, 0x82}, {0x77, 0x83}, {0x77, 0x86}, {0x77, 0x87}, /* 0x58-0x5B */ + {0x77, 0x88}, {0x77, 0x89}, {0x77, 0x8A}, {0x77, 0x8B}, /* 0x5C-0x5F */ + {0x77, 0x8F}, {0x77, 0x90}, {0x77, 0x93}, {0x77, 0x94}, /* 0x60-0x63 */ + {0x77, 0x95}, {0x77, 0x96}, {0x77, 0x97}, {0x77, 0x98}, /* 0x64-0x67 */ + {0x77, 0x99}, {0x77, 0x9A}, {0x77, 0x9B}, {0x77, 0x9C}, /* 0x68-0x6B */ + {0x77, 0x9D}, {0x77, 0x9E}, {0x77, 0xA1}, {0x77, 0xA3}, /* 0x6C-0x6F */ + {0x77, 0xA4}, {0x77, 0xA6}, {0x77, 0xA8}, {0x77, 0xAB}, /* 0x70-0x73 */ + {0x77, 0xAD}, {0x77, 0xAE}, {0x77, 0xAF}, {0x77, 0xB1}, /* 0x74-0x77 */ + {0x77, 0xB2}, {0x77, 0xB4}, {0x77, 0xB6}, {0x77, 0xB7}, /* 0x78-0x7B */ + {0x77, 0xB8}, {0x77, 0xB9}, {0x77, 0xBA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x77, 0xBC}, {0x77, 0xBE}, {0x77, 0xC0}, {0x77, 0xC1}, /* 0x80-0x83 */ + {0x77, 0xC2}, {0x77, 0xC3}, {0x77, 0xC4}, {0x77, 0xC5}, /* 0x84-0x87 */ + {0x77, 0xC6}, {0x77, 0xC7}, {0x77, 0xC8}, {0x77, 0xC9}, /* 0x88-0x8B */ + {0x77, 0xCA}, {0x77, 0xCB}, {0x77, 0xCC}, {0x77, 0xCE}, /* 0x8C-0x8F */ + {0x77, 0xCF}, {0x77, 0xD0}, {0x77, 0xD1}, {0x77, 0xD2}, /* 0x90-0x93 */ + {0x77, 0xD3}, {0x77, 0xD4}, {0x77, 0xD5}, {0x77, 0xD6}, /* 0x94-0x97 */ + {0x77, 0xD8}, {0x77, 0xD9}, {0x77, 0xDA}, {0x77, 0xDD}, /* 0x98-0x9B */ + {0x77, 0xDE}, {0x77, 0xDF}, {0x77, 0xE0}, {0x77, 0xE1}, /* 0x9C-0x9F */ + {0x77, 0xE4}, {0x75, 0xC5}, {0x5E, 0x76}, {0x73, 0xBB}, /* 0xA0-0xA3 */ + {0x83, 0xE0}, {0x64, 0xAD}, {0x62, 0xE8}, {0x94, 0xB5}, /* 0xA4-0xA7 */ + {0x6C, 0xE2}, {0x53, 0x5A}, {0x52, 0xC3}, {0x64, 0x0F}, /* 0xA8-0xAB */ + {0x94, 0xC2}, {0x7B, 0x94}, {0x4F, 0x2F}, {0x5E, 0x1B}, /* 0xAC-0xAF */ + {0x82, 0x36}, {0x81, 0x16}, {0x81, 0x8A}, {0x6E, 0x24}, /* 0xB0-0xB3 */ + {0x6C, 0xCA}, {0x9A, 0x73}, {0x63, 0x55}, {0x53, 0x5C}, /* 0xB4-0xB7 */ + {0x54, 0xFA}, {0x88, 0x65}, {0x57, 0xE0}, {0x4E, 0x0D}, /* 0xB8-0xBB */ + {0x5E, 0x03}, {0x6B, 0x65}, {0x7C, 0x3F}, {0x90, 0xE8}, /* 0xBC-0xBF */ + {0x60, 0x16}, {0x64, 0xE6}, {0x73, 0x1C}, {0x88, 0xC1}, /* 0xC0-0xC3 */ + {0x67, 0x50}, {0x62, 0x4D}, {0x8D, 0x22}, {0x77, 0x6C}, /* 0xC4-0xC7 */ + {0x8E, 0x29}, {0x91, 0xC7}, {0x5F, 0x69}, {0x83, 0xDC}, /* 0xC8-0xCB */ + {0x85, 0x21}, {0x99, 0x10}, {0x53, 0xC2}, {0x86, 0x95}, /* 0xCC-0xCF */ + {0x6B, 0x8B}, {0x60, 0xED}, {0x60, 0xE8}, {0x70, 0x7F}, /* 0xD0-0xD3 */ + {0x82, 0xCD}, {0x82, 0x31}, {0x4E, 0xD3}, {0x6C, 0xA7}, /* 0xD4-0xD7 */ + {0x85, 0xCF}, {0x64, 0xCD}, {0x7C, 0xD9}, {0x69, 0xFD}, /* 0xD8-0xDB */ + {0x66, 0xF9}, {0x83, 0x49}, {0x53, 0x95}, {0x7B, 0x56}, /* 0xDC-0xDF */ + {0x4F, 0xA7}, {0x51, 0x8C}, {0x6D, 0x4B}, {0x5C, 0x42}, /* 0xE0-0xE3 */ + {0x8E, 0x6D}, {0x63, 0xD2}, {0x53, 0xC9}, {0x83, 0x2C}, /* 0xE4-0xE7 */ + {0x83, 0x36}, {0x67, 0xE5}, {0x78, 0xB4}, {0x64, 0x3D}, /* 0xE8-0xEB */ + {0x5B, 0xDF}, {0x5C, 0x94}, {0x5D, 0xEE}, {0x8B, 0xE7}, /* 0xEC-0xEF */ + {0x62, 0xC6}, {0x67, 0xF4}, {0x8C, 0x7A}, {0x64, 0x00}, /* 0xF0-0xF3 */ + {0x63, 0xBA}, {0x87, 0x49}, {0x99, 0x8B}, {0x8C, 0x17}, /* 0xF4-0xF7 */ + {0x7F, 0x20}, {0x94, 0xF2}, {0x4E, 0xA7}, {0x96, 0x10}, /* 0xF8-0xFB */ + {0x98, 0xA4}, {0x66, 0x0C}, {0x73, 0x16}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x77, 0xE6}, {0x77, 0xE8}, {0x77, 0xEA}, {0x77, 0xEF}, /* 0x40-0x43 */ + {0x77, 0xF0}, {0x77, 0xF1}, {0x77, 0xF2}, {0x77, 0xF4}, /* 0x44-0x47 */ + {0x77, 0xF5}, {0x77, 0xF7}, {0x77, 0xF9}, {0x77, 0xFA}, /* 0x48-0x4B */ + {0x77, 0xFB}, {0x77, 0xFC}, {0x78, 0x03}, {0x78, 0x04}, /* 0x4C-0x4F */ + {0x78, 0x05}, {0x78, 0x06}, {0x78, 0x07}, {0x78, 0x08}, /* 0x50-0x53 */ + {0x78, 0x0A}, {0x78, 0x0B}, {0x78, 0x0E}, {0x78, 0x0F}, /* 0x54-0x57 */ + {0x78, 0x10}, {0x78, 0x13}, {0x78, 0x15}, {0x78, 0x19}, /* 0x58-0x5B */ + {0x78, 0x1B}, {0x78, 0x1E}, {0x78, 0x20}, {0x78, 0x21}, /* 0x5C-0x5F */ + {0x78, 0x22}, {0x78, 0x24}, {0x78, 0x28}, {0x78, 0x2A}, /* 0x60-0x63 */ + {0x78, 0x2B}, {0x78, 0x2E}, {0x78, 0x2F}, {0x78, 0x31}, /* 0x64-0x67 */ + {0x78, 0x32}, {0x78, 0x33}, {0x78, 0x35}, {0x78, 0x36}, /* 0x68-0x6B */ + {0x78, 0x3D}, {0x78, 0x3F}, {0x78, 0x41}, {0x78, 0x42}, /* 0x6C-0x6F */ + {0x78, 0x43}, {0x78, 0x44}, {0x78, 0x46}, {0x78, 0x48}, /* 0x70-0x73 */ + {0x78, 0x49}, {0x78, 0x4A}, {0x78, 0x4B}, {0x78, 0x4D}, /* 0x74-0x77 */ + {0x78, 0x4F}, {0x78, 0x51}, {0x78, 0x53}, {0x78, 0x54}, /* 0x78-0x7B */ + {0x78, 0x58}, {0x78, 0x59}, {0x78, 0x5A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x78, 0x5B}, {0x78, 0x5C}, {0x78, 0x5E}, {0x78, 0x5F}, /* 0x80-0x83 */ + {0x78, 0x60}, {0x78, 0x61}, {0x78, 0x62}, {0x78, 0x63}, /* 0x84-0x87 */ + {0x78, 0x64}, {0x78, 0x65}, {0x78, 0x66}, {0x78, 0x67}, /* 0x88-0x8B */ + {0x78, 0x68}, {0x78, 0x69}, {0x78, 0x6F}, {0x78, 0x70}, /* 0x8C-0x8F */ + {0x78, 0x71}, {0x78, 0x72}, {0x78, 0x73}, {0x78, 0x74}, /* 0x90-0x93 */ + {0x78, 0x75}, {0x78, 0x76}, {0x78, 0x78}, {0x78, 0x79}, /* 0x94-0x97 */ + {0x78, 0x7A}, {0x78, 0x7B}, {0x78, 0x7D}, {0x78, 0x7E}, /* 0x98-0x9B */ + {0x78, 0x7F}, {0x78, 0x80}, {0x78, 0x81}, {0x78, 0x82}, /* 0x9C-0x9F */ + {0x78, 0x83}, {0x57, 0x3A}, {0x5C, 0x1D}, {0x5E, 0x38}, /* 0xA0-0xA3 */ + {0x95, 0x7F}, {0x50, 0x7F}, {0x80, 0xA0}, {0x53, 0x82}, /* 0xA4-0xA7 */ + {0x65, 0x5E}, {0x75, 0x45}, {0x55, 0x31}, {0x50, 0x21}, /* 0xA8-0xAB */ + {0x8D, 0x85}, {0x62, 0x84}, {0x94, 0x9E}, {0x67, 0x1D}, /* 0xAC-0xAF */ + {0x56, 0x32}, {0x6F, 0x6E}, {0x5D, 0xE2}, {0x54, 0x35}, /* 0xB0-0xB3 */ + {0x70, 0x92}, {0x8F, 0x66}, {0x62, 0x6F}, {0x64, 0xA4}, /* 0xB4-0xB7 */ + {0x63, 0xA3}, {0x5F, 0x7B}, {0x6F, 0x88}, {0x90, 0xF4}, /* 0xB8-0xBB */ + {0x81, 0xE3}, {0x8F, 0xB0}, {0x5C, 0x18}, {0x66, 0x68}, /* 0xBC-0xBF */ + {0x5F, 0xF1}, {0x6C, 0x89}, {0x96, 0x48}, {0x8D, 0x81}, /* 0xC0-0xC3 */ + {0x88, 0x6C}, {0x64, 0x91}, {0x79, 0xF0}, {0x57, 0xCE}, /* 0xC4-0xC7 */ + {0x6A, 0x59}, {0x62, 0x10}, {0x54, 0x48}, {0x4E, 0x58}, /* 0xC8-0xCB */ + {0x7A, 0x0B}, {0x60, 0xE9}, {0x6F, 0x84}, {0x8B, 0xDA}, /* 0xCC-0xCF */ + {0x62, 0x7F}, {0x90, 0x1E}, {0x9A, 0x8B}, {0x79, 0xE4}, /* 0xD0-0xD3 */ + {0x54, 0x03}, {0x75, 0xF4}, {0x63, 0x01}, {0x53, 0x19}, /* 0xD4-0xD7 */ + {0x6C, 0x60}, {0x8F, 0xDF}, {0x5F, 0x1B}, {0x9A, 0x70}, /* 0xD8-0xDB */ + {0x80, 0x3B}, {0x9F, 0x7F}, {0x4F, 0x88}, {0x5C, 0x3A}, /* 0xDC-0xDF */ + {0x8D, 0x64}, {0x7F, 0xC5}, {0x65, 0xA5}, {0x70, 0xBD}, /* 0xE0-0xE3 */ + {0x51, 0x45}, {0x51, 0xB2}, {0x86, 0x6B}, {0x5D, 0x07}, /* 0xE4-0xE7 */ + {0x5B, 0xA0}, {0x62, 0xBD}, {0x91, 0x6C}, {0x75, 0x74}, /* 0xE8-0xEB */ + {0x8E, 0x0C}, {0x7A, 0x20}, {0x61, 0x01}, {0x7B, 0x79}, /* 0xEC-0xEF */ + {0x4E, 0xC7}, {0x7E, 0xF8}, {0x77, 0x85}, {0x4E, 0x11}, /* 0xF0-0xF3 */ + {0x81, 0xED}, {0x52, 0x1D}, {0x51, 0xFA}, {0x6A, 0x71}, /* 0xF4-0xF7 */ + {0x53, 0xA8}, {0x8E, 0x87}, {0x95, 0x04}, {0x96, 0xCF}, /* 0xF8-0xFB */ + {0x6E, 0xC1}, {0x96, 0x64}, {0x69, 0x5A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x78, 0x84}, {0x78, 0x85}, {0x78, 0x86}, {0x78, 0x88}, /* 0x40-0x43 */ + {0x78, 0x8A}, {0x78, 0x8B}, {0x78, 0x8F}, {0x78, 0x90}, /* 0x44-0x47 */ + {0x78, 0x92}, {0x78, 0x94}, {0x78, 0x95}, {0x78, 0x96}, /* 0x48-0x4B */ + {0x78, 0x99}, {0x78, 0x9D}, {0x78, 0x9E}, {0x78, 0xA0}, /* 0x4C-0x4F */ + {0x78, 0xA2}, {0x78, 0xA4}, {0x78, 0xA6}, {0x78, 0xA8}, /* 0x50-0x53 */ + {0x78, 0xA9}, {0x78, 0xAA}, {0x78, 0xAB}, {0x78, 0xAC}, /* 0x54-0x57 */ + {0x78, 0xAD}, {0x78, 0xAE}, {0x78, 0xAF}, {0x78, 0xB5}, /* 0x58-0x5B */ + {0x78, 0xB6}, {0x78, 0xB7}, {0x78, 0xB8}, {0x78, 0xBA}, /* 0x5C-0x5F */ + {0x78, 0xBB}, {0x78, 0xBC}, {0x78, 0xBD}, {0x78, 0xBF}, /* 0x60-0x63 */ + {0x78, 0xC0}, {0x78, 0xC2}, {0x78, 0xC3}, {0x78, 0xC4}, /* 0x64-0x67 */ + {0x78, 0xC6}, {0x78, 0xC7}, {0x78, 0xC8}, {0x78, 0xCC}, /* 0x68-0x6B */ + {0x78, 0xCD}, {0x78, 0xCE}, {0x78, 0xCF}, {0x78, 0xD1}, /* 0x6C-0x6F */ + {0x78, 0xD2}, {0x78, 0xD3}, {0x78, 0xD6}, {0x78, 0xD7}, /* 0x70-0x73 */ + {0x78, 0xD8}, {0x78, 0xDA}, {0x78, 0xDB}, {0x78, 0xDC}, /* 0x74-0x77 */ + {0x78, 0xDD}, {0x78, 0xDE}, {0x78, 0xDF}, {0x78, 0xE0}, /* 0x78-0x7B */ + {0x78, 0xE1}, {0x78, 0xE2}, {0x78, 0xE3}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x78, 0xE4}, {0x78, 0xE5}, {0x78, 0xE6}, {0x78, 0xE7}, /* 0x80-0x83 */ + {0x78, 0xE9}, {0x78, 0xEA}, {0x78, 0xEB}, {0x78, 0xED}, /* 0x84-0x87 */ + {0x78, 0xEE}, {0x78, 0xEF}, {0x78, 0xF0}, {0x78, 0xF1}, /* 0x88-0x8B */ + {0x78, 0xF3}, {0x78, 0xF5}, {0x78, 0xF6}, {0x78, 0xF8}, /* 0x8C-0x8F */ + {0x78, 0xF9}, {0x78, 0xFB}, {0x78, 0xFC}, {0x78, 0xFD}, /* 0x90-0x93 */ + {0x78, 0xFE}, {0x78, 0xFF}, {0x79, 0x00}, {0x79, 0x02}, /* 0x94-0x97 */ + {0x79, 0x03}, {0x79, 0x04}, {0x79, 0x06}, {0x79, 0x07}, /* 0x98-0x9B */ + {0x79, 0x08}, {0x79, 0x09}, {0x79, 0x0A}, {0x79, 0x0B}, /* 0x9C-0x9F */ + {0x79, 0x0C}, {0x78, 0x40}, {0x50, 0xA8}, {0x77, 0xD7}, /* 0xA0-0xA3 */ + {0x64, 0x10}, {0x89, 0xE6}, {0x59, 0x04}, {0x63, 0xE3}, /* 0xA4-0xA7 */ + {0x5D, 0xDD}, {0x7A, 0x7F}, {0x69, 0x3D}, {0x4F, 0x20}, /* 0xA8-0xAB */ + {0x82, 0x39}, {0x55, 0x98}, {0x4E, 0x32}, {0x75, 0xAE}, /* 0xAC-0xAF */ + {0x7A, 0x97}, {0x5E, 0x62}, {0x5E, 0x8A}, {0x95, 0xEF}, /* 0xB0-0xB3 */ + {0x52, 0x1B}, {0x54, 0x39}, {0x70, 0x8A}, {0x63, 0x76}, /* 0xB4-0xB7 */ + {0x95, 0x24}, {0x57, 0x82}, {0x66, 0x25}, {0x69, 0x3F}, /* 0xB8-0xBB */ + {0x91, 0x87}, {0x55, 0x07}, {0x6D, 0xF3}, {0x7E, 0xAF}, /* 0xBC-0xBF */ + {0x88, 0x22}, {0x62, 0x33}, {0x7E, 0xF0}, {0x75, 0xB5}, /* 0xC0-0xC3 */ + {0x83, 0x28}, {0x78, 0xC1}, {0x96, 0xCC}, {0x8F, 0x9E}, /* 0xC4-0xC7 */ + {0x61, 0x48}, {0x74, 0xF7}, {0x8B, 0xCD}, {0x6B, 0x64}, /* 0xC8-0xCB */ + {0x52, 0x3A}, {0x8D, 0x50}, {0x6B, 0x21}, {0x80, 0x6A}, /* 0xCC-0xCF */ + {0x84, 0x71}, {0x56, 0xF1}, {0x53, 0x06}, {0x4E, 0xCE}, /* 0xD0-0xD3 */ + {0x4E, 0x1B}, {0x51, 0xD1}, {0x7C, 0x97}, {0x91, 0x8B}, /* 0xD4-0xD7 */ + {0x7C, 0x07}, {0x4F, 0xC3}, {0x8E, 0x7F}, {0x7B, 0xE1}, /* 0xD8-0xDB */ + {0x7A, 0x9C}, {0x64, 0x67}, {0x5D, 0x14}, {0x50, 0xAC}, /* 0xDC-0xDF */ + {0x81, 0x06}, {0x76, 0x01}, {0x7C, 0xB9}, {0x6D, 0xEC}, /* 0xE0-0xE3 */ + {0x7F, 0xE0}, {0x67, 0x51}, {0x5B, 0x58}, {0x5B, 0xF8}, /* 0xE4-0xE7 */ + {0x78, 0xCB}, {0x64, 0xAE}, {0x64, 0x13}, {0x63, 0xAA}, /* 0xE8-0xEB */ + {0x63, 0x2B}, {0x95, 0x19}, {0x64, 0x2D}, {0x8F, 0xBE}, /* 0xEC-0xEF */ + {0x7B, 0x54}, {0x76, 0x29}, {0x62, 0x53}, {0x59, 0x27}, /* 0xF0-0xF3 */ + {0x54, 0x46}, {0x6B, 0x79}, {0x50, 0xA3}, {0x62, 0x34}, /* 0xF4-0xF7 */ + {0x5E, 0x26}, {0x6B, 0x86}, {0x4E, 0xE3}, {0x8D, 0x37}, /* 0xF8-0xFB */ + {0x88, 0x8B}, {0x5F, 0x85}, {0x90, 0x2E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x79, 0x0D}, {0x79, 0x0E}, {0x79, 0x0F}, {0x79, 0x10}, /* 0x40-0x43 */ + {0x79, 0x11}, {0x79, 0x12}, {0x79, 0x14}, {0x79, 0x15}, /* 0x44-0x47 */ + {0x79, 0x16}, {0x79, 0x17}, {0x79, 0x18}, {0x79, 0x19}, /* 0x48-0x4B */ + {0x79, 0x1A}, {0x79, 0x1B}, {0x79, 0x1C}, {0x79, 0x1D}, /* 0x4C-0x4F */ + {0x79, 0x1F}, {0x79, 0x20}, {0x79, 0x21}, {0x79, 0x22}, /* 0x50-0x53 */ + {0x79, 0x23}, {0x79, 0x25}, {0x79, 0x26}, {0x79, 0x27}, /* 0x54-0x57 */ + {0x79, 0x28}, {0x79, 0x29}, {0x79, 0x2A}, {0x79, 0x2B}, /* 0x58-0x5B */ + {0x79, 0x2C}, {0x79, 0x2D}, {0x79, 0x2E}, {0x79, 0x2F}, /* 0x5C-0x5F */ + {0x79, 0x30}, {0x79, 0x31}, {0x79, 0x32}, {0x79, 0x33}, /* 0x60-0x63 */ + {0x79, 0x35}, {0x79, 0x36}, {0x79, 0x37}, {0x79, 0x38}, /* 0x64-0x67 */ + {0x79, 0x39}, {0x79, 0x3D}, {0x79, 0x3F}, {0x79, 0x42}, /* 0x68-0x6B */ + {0x79, 0x43}, {0x79, 0x44}, {0x79, 0x45}, {0x79, 0x47}, /* 0x6C-0x6F */ + {0x79, 0x4A}, {0x79, 0x4B}, {0x79, 0x4C}, {0x79, 0x4D}, /* 0x70-0x73 */ + {0x79, 0x4E}, {0x79, 0x4F}, {0x79, 0x50}, {0x79, 0x51}, /* 0x74-0x77 */ + {0x79, 0x52}, {0x79, 0x54}, {0x79, 0x55}, {0x79, 0x58}, /* 0x78-0x7B */ + {0x79, 0x59}, {0x79, 0x61}, {0x79, 0x63}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x79, 0x64}, {0x79, 0x66}, {0x79, 0x69}, {0x79, 0x6A}, /* 0x80-0x83 */ + {0x79, 0x6B}, {0x79, 0x6C}, {0x79, 0x6E}, {0x79, 0x70}, /* 0x84-0x87 */ + {0x79, 0x71}, {0x79, 0x72}, {0x79, 0x73}, {0x79, 0x74}, /* 0x88-0x8B */ + {0x79, 0x75}, {0x79, 0x76}, {0x79, 0x79}, {0x79, 0x7B}, /* 0x8C-0x8F */ + {0x79, 0x7C}, {0x79, 0x7D}, {0x79, 0x7E}, {0x79, 0x7F}, /* 0x90-0x93 */ + {0x79, 0x82}, {0x79, 0x83}, {0x79, 0x86}, {0x79, 0x87}, /* 0x94-0x97 */ + {0x79, 0x88}, {0x79, 0x89}, {0x79, 0x8B}, {0x79, 0x8C}, /* 0x98-0x9B */ + {0x79, 0x8D}, {0x79, 0x8E}, {0x79, 0x90}, {0x79, 0x91}, /* 0x9C-0x9F */ + {0x79, 0x92}, {0x60, 0x20}, {0x80, 0x3D}, {0x62, 0xC5}, /* 0xA0-0xA3 */ + {0x4E, 0x39}, {0x53, 0x55}, {0x90, 0xF8}, {0x63, 0xB8}, /* 0xA4-0xA7 */ + {0x80, 0xC6}, {0x65, 0xE6}, {0x6C, 0x2E}, {0x4F, 0x46}, /* 0xA8-0xAB */ + {0x60, 0xEE}, {0x6D, 0xE1}, {0x8B, 0xDE}, {0x5F, 0x39}, /* 0xAC-0xAF */ + {0x86, 0xCB}, {0x5F, 0x53}, {0x63, 0x21}, {0x51, 0x5A}, /* 0xB0-0xB3 */ + {0x83, 0x61}, {0x68, 0x63}, {0x52, 0x00}, {0x63, 0x63}, /* 0xB4-0xB7 */ + {0x8E, 0x48}, {0x50, 0x12}, {0x5C, 0x9B}, {0x79, 0x77}, /* 0xB8-0xBB */ + {0x5B, 0xFC}, {0x52, 0x30}, {0x7A, 0x3B}, {0x60, 0xBC}, /* 0xBC-0xBF */ + {0x90, 0x53}, {0x76, 0xD7}, {0x5F, 0xB7}, {0x5F, 0x97}, /* 0xC0-0xC3 */ + {0x76, 0x84}, {0x8E, 0x6C}, {0x70, 0x6F}, {0x76, 0x7B}, /* 0xC4-0xC7 */ + {0x7B, 0x49}, {0x77, 0xAA}, {0x51, 0xF3}, {0x90, 0x93}, /* 0xC8-0xCB */ + {0x58, 0x24}, {0x4F, 0x4E}, {0x6E, 0xF4}, {0x8F, 0xEA}, /* 0xCC-0xCF */ + {0x65, 0x4C}, {0x7B, 0x1B}, {0x72, 0xC4}, {0x6D, 0xA4}, /* 0xD0-0xD3 */ + {0x7F, 0xDF}, {0x5A, 0xE1}, {0x62, 0xB5}, {0x5E, 0x95}, /* 0xD4-0xD7 */ + {0x57, 0x30}, {0x84, 0x82}, {0x7B, 0x2C}, {0x5E, 0x1D}, /* 0xD8-0xDB */ + {0x5F, 0x1F}, {0x90, 0x12}, {0x7F, 0x14}, {0x98, 0xA0}, /* 0xDC-0xDF */ + {0x63, 0x82}, {0x6E, 0xC7}, {0x78, 0x98}, {0x70, 0xB9}, /* 0xE0-0xE3 */ + {0x51, 0x78}, {0x97, 0x5B}, {0x57, 0xAB}, {0x75, 0x35}, /* 0xE4-0xE7 */ + {0x4F, 0x43}, {0x75, 0x38}, {0x5E, 0x97}, {0x60, 0xE6}, /* 0xE8-0xEB */ + {0x59, 0x60}, {0x6D, 0xC0}, {0x6B, 0xBF}, {0x78, 0x89}, /* 0xEC-0xEF */ + {0x53, 0xFC}, {0x96, 0xD5}, {0x51, 0xCB}, {0x52, 0x01}, /* 0xF0-0xF3 */ + {0x63, 0x89}, {0x54, 0x0A}, {0x94, 0x93}, {0x8C, 0x03}, /* 0xF4-0xF7 */ + {0x8D, 0xCC}, {0x72, 0x39}, {0x78, 0x9F}, {0x87, 0x76}, /* 0xF8-0xFB */ + {0x8F, 0xED}, {0x8C, 0x0D}, {0x53, 0xE0}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x79, 0x93}, {0x79, 0x94}, {0x79, 0x95}, {0x79, 0x96}, /* 0x40-0x43 */ + {0x79, 0x97}, {0x79, 0x98}, {0x79, 0x99}, {0x79, 0x9B}, /* 0x44-0x47 */ + {0x79, 0x9C}, {0x79, 0x9D}, {0x79, 0x9E}, {0x79, 0x9F}, /* 0x48-0x4B */ + {0x79, 0xA0}, {0x79, 0xA1}, {0x79, 0xA2}, {0x79, 0xA3}, /* 0x4C-0x4F */ + {0x79, 0xA4}, {0x79, 0xA5}, {0x79, 0xA6}, {0x79, 0xA8}, /* 0x50-0x53 */ + {0x79, 0xA9}, {0x79, 0xAA}, {0x79, 0xAB}, {0x79, 0xAC}, /* 0x54-0x57 */ + {0x79, 0xAD}, {0x79, 0xAE}, {0x79, 0xAF}, {0x79, 0xB0}, /* 0x58-0x5B */ + {0x79, 0xB1}, {0x79, 0xB2}, {0x79, 0xB4}, {0x79, 0xB5}, /* 0x5C-0x5F */ + {0x79, 0xB6}, {0x79, 0xB7}, {0x79, 0xB8}, {0x79, 0xBC}, /* 0x60-0x63 */ + {0x79, 0xBF}, {0x79, 0xC2}, {0x79, 0xC4}, {0x79, 0xC5}, /* 0x64-0x67 */ + {0x79, 0xC7}, {0x79, 0xC8}, {0x79, 0xCA}, {0x79, 0xCC}, /* 0x68-0x6B */ + {0x79, 0xCE}, {0x79, 0xCF}, {0x79, 0xD0}, {0x79, 0xD3}, /* 0x6C-0x6F */ + {0x79, 0xD4}, {0x79, 0xD6}, {0x79, 0xD7}, {0x79, 0xD9}, /* 0x70-0x73 */ + {0x79, 0xDA}, {0x79, 0xDB}, {0x79, 0xDC}, {0x79, 0xDD}, /* 0x74-0x77 */ + {0x79, 0xDE}, {0x79, 0xE0}, {0x79, 0xE1}, {0x79, 0xE2}, /* 0x78-0x7B */ + {0x79, 0xE5}, {0x79, 0xE8}, {0x79, 0xEA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x79, 0xEC}, {0x79, 0xEE}, {0x79, 0xF1}, {0x79, 0xF2}, /* 0x80-0x83 */ + {0x79, 0xF3}, {0x79, 0xF4}, {0x79, 0xF5}, {0x79, 0xF6}, /* 0x84-0x87 */ + {0x79, 0xF7}, {0x79, 0xF9}, {0x79, 0xFA}, {0x79, 0xFC}, /* 0x88-0x8B */ + {0x79, 0xFE}, {0x79, 0xFF}, {0x7A, 0x01}, {0x7A, 0x04}, /* 0x8C-0x8F */ + {0x7A, 0x05}, {0x7A, 0x07}, {0x7A, 0x08}, {0x7A, 0x09}, /* 0x90-0x93 */ + {0x7A, 0x0A}, {0x7A, 0x0C}, {0x7A, 0x0F}, {0x7A, 0x10}, /* 0x94-0x97 */ + {0x7A, 0x11}, {0x7A, 0x12}, {0x7A, 0x13}, {0x7A, 0x15}, /* 0x98-0x9B */ + {0x7A, 0x16}, {0x7A, 0x18}, {0x7A, 0x19}, {0x7A, 0x1B}, /* 0x9C-0x9F */ + {0x7A, 0x1C}, {0x4E, 0x01}, {0x76, 0xEF}, {0x53, 0xEE}, /* 0xA0-0xA3 */ + {0x94, 0x89}, {0x98, 0x76}, {0x9F, 0x0E}, {0x95, 0x2D}, /* 0xA4-0xA7 */ + {0x5B, 0x9A}, {0x8B, 0xA2}, {0x4E, 0x22}, {0x4E, 0x1C}, /* 0xA8-0xAB */ + {0x51, 0xAC}, {0x84, 0x63}, {0x61, 0xC2}, {0x52, 0xA8}, /* 0xAC-0xAF */ + {0x68, 0x0B}, {0x4F, 0x97}, {0x60, 0x6B}, {0x51, 0xBB}, /* 0xB0-0xB3 */ + {0x6D, 0x1E}, {0x51, 0x5C}, {0x62, 0x96}, {0x65, 0x97}, /* 0xB4-0xB7 */ + {0x96, 0x61}, {0x8C, 0x46}, {0x90, 0x17}, {0x75, 0xD8}, /* 0xB8-0xBB */ + {0x90, 0xFD}, {0x77, 0x63}, {0x6B, 0xD2}, {0x72, 0x8A}, /* 0xBC-0xBF */ + {0x72, 0xEC}, {0x8B, 0xFB}, {0x58, 0x35}, {0x77, 0x79}, /* 0xC0-0xC3 */ + {0x8D, 0x4C}, {0x67, 0x5C}, {0x95, 0x40}, {0x80, 0x9A}, /* 0xC4-0xC7 */ + {0x5E, 0xA6}, {0x6E, 0x21}, {0x59, 0x92}, {0x7A, 0xEF}, /* 0xC8-0xCB */ + {0x77, 0xED}, {0x95, 0x3B}, {0x6B, 0xB5}, {0x65, 0xAD}, /* 0xCC-0xCF */ + {0x7F, 0x0E}, {0x58, 0x06}, {0x51, 0x51}, {0x96, 0x1F}, /* 0xD0-0xD3 */ + {0x5B, 0xF9}, {0x58, 0xA9}, {0x54, 0x28}, {0x8E, 0x72}, /* 0xD4-0xD7 */ + {0x65, 0x66}, {0x98, 0x7F}, {0x56, 0xE4}, {0x94, 0x9D}, /* 0xD8-0xDB */ + {0x76, 0xFE}, {0x90, 0x41}, {0x63, 0x87}, {0x54, 0xC6}, /* 0xDC-0xDF */ + {0x59, 0x1A}, {0x59, 0x3A}, {0x57, 0x9B}, {0x8E, 0xB2}, /* 0xE0-0xE3 */ + {0x67, 0x35}, {0x8D, 0xFA}, {0x82, 0x35}, {0x52, 0x41}, /* 0xE4-0xE7 */ + {0x60, 0xF0}, {0x58, 0x15}, {0x86, 0xFE}, {0x5C, 0xE8}, /* 0xE8-0xEB */ + {0x9E, 0x45}, {0x4F, 0xC4}, {0x98, 0x9D}, {0x8B, 0xB9}, /* 0xEC-0xEF */ + {0x5A, 0x25}, {0x60, 0x76}, {0x53, 0x84}, {0x62, 0x7C}, /* 0xF0-0xF3 */ + {0x90, 0x4F}, {0x91, 0x02}, {0x99, 0x7F}, {0x60, 0x69}, /* 0xF4-0xF7 */ + {0x80, 0x0C}, {0x51, 0x3F}, {0x80, 0x33}, {0x5C, 0x14}, /* 0xF8-0xFB */ + {0x99, 0x75}, {0x6D, 0x31}, {0x4E, 0x8C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7A, 0x1D}, {0x7A, 0x1F}, {0x7A, 0x21}, {0x7A, 0x22}, /* 0x40-0x43 */ + {0x7A, 0x24}, {0x7A, 0x25}, {0x7A, 0x26}, {0x7A, 0x27}, /* 0x44-0x47 */ + {0x7A, 0x28}, {0x7A, 0x29}, {0x7A, 0x2A}, {0x7A, 0x2B}, /* 0x48-0x4B */ + {0x7A, 0x2C}, {0x7A, 0x2D}, {0x7A, 0x2E}, {0x7A, 0x2F}, /* 0x4C-0x4F */ + {0x7A, 0x30}, {0x7A, 0x31}, {0x7A, 0x32}, {0x7A, 0x34}, /* 0x50-0x53 */ + {0x7A, 0x35}, {0x7A, 0x36}, {0x7A, 0x38}, {0x7A, 0x3A}, /* 0x54-0x57 */ + {0x7A, 0x3E}, {0x7A, 0x40}, {0x7A, 0x41}, {0x7A, 0x42}, /* 0x58-0x5B */ + {0x7A, 0x43}, {0x7A, 0x44}, {0x7A, 0x45}, {0x7A, 0x47}, /* 0x5C-0x5F */ + {0x7A, 0x48}, {0x7A, 0x49}, {0x7A, 0x4A}, {0x7A, 0x4B}, /* 0x60-0x63 */ + {0x7A, 0x4C}, {0x7A, 0x4D}, {0x7A, 0x4E}, {0x7A, 0x4F}, /* 0x64-0x67 */ + {0x7A, 0x50}, {0x7A, 0x52}, {0x7A, 0x53}, {0x7A, 0x54}, /* 0x68-0x6B */ + {0x7A, 0x55}, {0x7A, 0x56}, {0x7A, 0x58}, {0x7A, 0x59}, /* 0x6C-0x6F */ + {0x7A, 0x5A}, {0x7A, 0x5B}, {0x7A, 0x5C}, {0x7A, 0x5D}, /* 0x70-0x73 */ + {0x7A, 0x5E}, {0x7A, 0x5F}, {0x7A, 0x60}, {0x7A, 0x61}, /* 0x74-0x77 */ + {0x7A, 0x62}, {0x7A, 0x63}, {0x7A, 0x64}, {0x7A, 0x65}, /* 0x78-0x7B */ + {0x7A, 0x66}, {0x7A, 0x67}, {0x7A, 0x68}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7A, 0x69}, {0x7A, 0x6A}, {0x7A, 0x6B}, {0x7A, 0x6C}, /* 0x80-0x83 */ + {0x7A, 0x6D}, {0x7A, 0x6E}, {0x7A, 0x6F}, {0x7A, 0x71}, /* 0x84-0x87 */ + {0x7A, 0x72}, {0x7A, 0x73}, {0x7A, 0x75}, {0x7A, 0x7B}, /* 0x88-0x8B */ + {0x7A, 0x7C}, {0x7A, 0x7D}, {0x7A, 0x7E}, {0x7A, 0x82}, /* 0x8C-0x8F */ + {0x7A, 0x85}, {0x7A, 0x87}, {0x7A, 0x89}, {0x7A, 0x8A}, /* 0x90-0x93 */ + {0x7A, 0x8B}, {0x7A, 0x8C}, {0x7A, 0x8E}, {0x7A, 0x8F}, /* 0x94-0x97 */ + {0x7A, 0x90}, {0x7A, 0x93}, {0x7A, 0x94}, {0x7A, 0x99}, /* 0x98-0x9B */ + {0x7A, 0x9A}, {0x7A, 0x9B}, {0x7A, 0x9E}, {0x7A, 0xA1}, /* 0x9C-0x9F */ + {0x7A, 0xA2}, {0x8D, 0x30}, {0x53, 0xD1}, {0x7F, 0x5A}, /* 0xA0-0xA3 */ + {0x7B, 0x4F}, {0x4F, 0x10}, {0x4E, 0x4F}, {0x96, 0x00}, /* 0xA4-0xA7 */ + {0x6C, 0xD5}, {0x73, 0xD0}, {0x85, 0xE9}, {0x5E, 0x06}, /* 0xA8-0xAB */ + {0x75, 0x6A}, {0x7F, 0xFB}, {0x6A, 0x0A}, {0x77, 0xFE}, /* 0xAC-0xAF */ + {0x94, 0x92}, {0x7E, 0x41}, {0x51, 0xE1}, {0x70, 0xE6}, /* 0xB0-0xB3 */ + {0x53, 0xCD}, {0x8F, 0xD4}, {0x83, 0x03}, {0x8D, 0x29}, /* 0xB4-0xB7 */ + {0x72, 0xAF}, {0x99, 0x6D}, {0x6C, 0xDB}, {0x57, 0x4A}, /* 0xB8-0xBB */ + {0x82, 0xB3}, {0x65, 0xB9}, {0x80, 0xAA}, {0x62, 0x3F}, /* 0xBC-0xBF */ + {0x96, 0x32}, {0x59, 0xA8}, {0x4E, 0xFF}, {0x8B, 0xBF}, /* 0xC0-0xC3 */ + {0x7E, 0xBA}, {0x65, 0x3E}, {0x83, 0xF2}, {0x97, 0x5E}, /* 0xC4-0xC7 */ + {0x55, 0x61}, {0x98, 0xDE}, {0x80, 0xA5}, {0x53, 0x2A}, /* 0xC8-0xCB */ + {0x8B, 0xFD}, {0x54, 0x20}, {0x80, 0xBA}, {0x5E, 0x9F}, /* 0xCC-0xCF */ + {0x6C, 0xB8}, {0x8D, 0x39}, {0x82, 0xAC}, {0x91, 0x5A}, /* 0xD0-0xD3 */ + {0x54, 0x29}, {0x6C, 0x1B}, {0x52, 0x06}, {0x7E, 0xB7}, /* 0xD4-0xD7 */ + {0x57, 0x5F}, {0x71, 0x1A}, {0x6C, 0x7E}, {0x7C, 0x89}, /* 0xD8-0xDB */ + {0x59, 0x4B}, {0x4E, 0xFD}, {0x5F, 0xFF}, {0x61, 0x24}, /* 0xDC-0xDF */ + {0x7C, 0xAA}, {0x4E, 0x30}, {0x5C, 0x01}, {0x67, 0xAB}, /* 0xE0-0xE3 */ + {0x87, 0x02}, {0x5C, 0xF0}, {0x95, 0x0B}, {0x98, 0xCE}, /* 0xE4-0xE7 */ + {0x75, 0xAF}, {0x70, 0xFD}, {0x90, 0x22}, {0x51, 0xAF}, /* 0xE8-0xEB */ + {0x7F, 0x1D}, {0x8B, 0xBD}, {0x59, 0x49}, {0x51, 0xE4}, /* 0xEC-0xEF */ + {0x4F, 0x5B}, {0x54, 0x26}, {0x59, 0x2B}, {0x65, 0x77}, /* 0xF0-0xF3 */ + {0x80, 0xA4}, {0x5B, 0x75}, {0x62, 0x76}, {0x62, 0xC2}, /* 0xF4-0xF7 */ + {0x8F, 0x90}, {0x5E, 0x45}, {0x6C, 0x1F}, {0x7B, 0x26}, /* 0xF8-0xFB */ + {0x4F, 0x0F}, {0x4F, 0xD8}, {0x67, 0x0D}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7A, 0xA3}, {0x7A, 0xA4}, {0x7A, 0xA7}, {0x7A, 0xA9}, /* 0x40-0x43 */ + {0x7A, 0xAA}, {0x7A, 0xAB}, {0x7A, 0xAE}, {0x7A, 0xAF}, /* 0x44-0x47 */ + {0x7A, 0xB0}, {0x7A, 0xB1}, {0x7A, 0xB2}, {0x7A, 0xB4}, /* 0x48-0x4B */ + {0x7A, 0xB5}, {0x7A, 0xB6}, {0x7A, 0xB7}, {0x7A, 0xB8}, /* 0x4C-0x4F */ + {0x7A, 0xB9}, {0x7A, 0xBA}, {0x7A, 0xBB}, {0x7A, 0xBC}, /* 0x50-0x53 */ + {0x7A, 0xBD}, {0x7A, 0xBE}, {0x7A, 0xC0}, {0x7A, 0xC1}, /* 0x54-0x57 */ + {0x7A, 0xC2}, {0x7A, 0xC3}, {0x7A, 0xC4}, {0x7A, 0xC5}, /* 0x58-0x5B */ + {0x7A, 0xC6}, {0x7A, 0xC7}, {0x7A, 0xC8}, {0x7A, 0xC9}, /* 0x5C-0x5F */ + {0x7A, 0xCA}, {0x7A, 0xCC}, {0x7A, 0xCD}, {0x7A, 0xCE}, /* 0x60-0x63 */ + {0x7A, 0xCF}, {0x7A, 0xD0}, {0x7A, 0xD1}, {0x7A, 0xD2}, /* 0x64-0x67 */ + {0x7A, 0xD3}, {0x7A, 0xD4}, {0x7A, 0xD5}, {0x7A, 0xD7}, /* 0x68-0x6B */ + {0x7A, 0xD8}, {0x7A, 0xDA}, {0x7A, 0xDB}, {0x7A, 0xDC}, /* 0x6C-0x6F */ + {0x7A, 0xDD}, {0x7A, 0xE1}, {0x7A, 0xE2}, {0x7A, 0xE4}, /* 0x70-0x73 */ + {0x7A, 0xE7}, {0x7A, 0xE8}, {0x7A, 0xE9}, {0x7A, 0xEA}, /* 0x74-0x77 */ + {0x7A, 0xEB}, {0x7A, 0xEC}, {0x7A, 0xEE}, {0x7A, 0xF0}, /* 0x78-0x7B */ + {0x7A, 0xF1}, {0x7A, 0xF2}, {0x7A, 0xF3}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7A, 0xF4}, {0x7A, 0xF5}, {0x7A, 0xF6}, {0x7A, 0xF7}, /* 0x80-0x83 */ + {0x7A, 0xF8}, {0x7A, 0xFB}, {0x7A, 0xFC}, {0x7A, 0xFE}, /* 0x84-0x87 */ + {0x7B, 0x00}, {0x7B, 0x01}, {0x7B, 0x02}, {0x7B, 0x05}, /* 0x88-0x8B */ + {0x7B, 0x07}, {0x7B, 0x09}, {0x7B, 0x0C}, {0x7B, 0x0D}, /* 0x8C-0x8F */ + {0x7B, 0x0E}, {0x7B, 0x10}, {0x7B, 0x12}, {0x7B, 0x13}, /* 0x90-0x93 */ + {0x7B, 0x16}, {0x7B, 0x17}, {0x7B, 0x18}, {0x7B, 0x1A}, /* 0x94-0x97 */ + {0x7B, 0x1C}, {0x7B, 0x1D}, {0x7B, 0x1F}, {0x7B, 0x21}, /* 0x98-0x9B */ + {0x7B, 0x22}, {0x7B, 0x23}, {0x7B, 0x27}, {0x7B, 0x29}, /* 0x9C-0x9F */ + {0x7B, 0x2D}, {0x6D, 0x6E}, {0x6D, 0xAA}, {0x79, 0x8F}, /* 0xA0-0xA3 */ + {0x88, 0xB1}, {0x5F, 0x17}, {0x75, 0x2B}, {0x62, 0x9A}, /* 0xA4-0xA7 */ + {0x8F, 0x85}, {0x4F, 0xEF}, {0x91, 0xDC}, {0x65, 0xA7}, /* 0xA8-0xAB */ + {0x81, 0x2F}, {0x81, 0x51}, {0x5E, 0x9C}, {0x81, 0x50}, /* 0xAC-0xAF */ + {0x8D, 0x74}, {0x52, 0x6F}, {0x89, 0x86}, {0x8D, 0x4B}, /* 0xB0-0xB3 */ + {0x59, 0x0D}, {0x50, 0x85}, {0x4E, 0xD8}, {0x96, 0x1C}, /* 0xB4-0xB7 */ + {0x72, 0x36}, {0x81, 0x79}, {0x8D, 0x1F}, {0x5B, 0xCC}, /* 0xB8-0xBB */ + {0x8B, 0xA3}, {0x96, 0x44}, {0x59, 0x87}, {0x7F, 0x1A}, /* 0xBC-0xBF */ + {0x54, 0x90}, {0x56, 0x76}, {0x56, 0x0E}, {0x8B, 0xE5}, /* 0xC0-0xC3 */ + {0x65, 0x39}, {0x69, 0x82}, {0x94, 0x99}, {0x76, 0xD6}, /* 0xC4-0xC7 */ + {0x6E, 0x89}, {0x5E, 0x72}, {0x75, 0x18}, {0x67, 0x46}, /* 0xC8-0xCB */ + {0x67, 0xD1}, {0x7A, 0xFF}, {0x80, 0x9D}, {0x8D, 0x76}, /* 0xCC-0xCF */ + {0x61, 0x1F}, {0x79, 0xC6}, {0x65, 0x62}, {0x8D, 0x63}, /* 0xD0-0xD3 */ + {0x51, 0x88}, {0x52, 0x1A}, {0x94, 0xA2}, {0x7F, 0x38}, /* 0xD4-0xD7 */ + {0x80, 0x9B}, {0x7E, 0xB2}, {0x5C, 0x97}, {0x6E, 0x2F}, /* 0xD8-0xDB */ + {0x67, 0x60}, {0x7B, 0xD9}, {0x76, 0x8B}, {0x9A, 0xD8}, /* 0xDC-0xDF */ + {0x81, 0x8F}, {0x7F, 0x94}, {0x7C, 0xD5}, {0x64, 0x1E}, /* 0xE0-0xE3 */ + {0x95, 0x50}, {0x7A, 0x3F}, {0x54, 0x4A}, {0x54, 0xE5}, /* 0xE4-0xE7 */ + {0x6B, 0x4C}, {0x64, 0x01}, {0x62, 0x08}, {0x9E, 0x3D}, /* 0xE8-0xEB */ + {0x80, 0xF3}, {0x75, 0x99}, {0x52, 0x72}, {0x97, 0x69}, /* 0xEC-0xEF */ + {0x84, 0x5B}, {0x68, 0x3C}, {0x86, 0xE4}, {0x96, 0x01}, /* 0xF0-0xF3 */ + {0x96, 0x94}, {0x94, 0xEC}, {0x4E, 0x2A}, {0x54, 0x04}, /* 0xF4-0xF7 */ + {0x7E, 0xD9}, {0x68, 0x39}, {0x8D, 0xDF}, {0x80, 0x15}, /* 0xF8-0xFB */ + {0x66, 0xF4}, {0x5E, 0x9A}, {0x7F, 0xB9}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7B, 0x2F}, {0x7B, 0x30}, {0x7B, 0x32}, {0x7B, 0x34}, /* 0x40-0x43 */ + {0x7B, 0x35}, {0x7B, 0x36}, {0x7B, 0x37}, {0x7B, 0x39}, /* 0x44-0x47 */ + {0x7B, 0x3B}, {0x7B, 0x3D}, {0x7B, 0x3F}, {0x7B, 0x40}, /* 0x48-0x4B */ + {0x7B, 0x41}, {0x7B, 0x42}, {0x7B, 0x43}, {0x7B, 0x44}, /* 0x4C-0x4F */ + {0x7B, 0x46}, {0x7B, 0x48}, {0x7B, 0x4A}, {0x7B, 0x4D}, /* 0x50-0x53 */ + {0x7B, 0x4E}, {0x7B, 0x53}, {0x7B, 0x55}, {0x7B, 0x57}, /* 0x54-0x57 */ + {0x7B, 0x59}, {0x7B, 0x5C}, {0x7B, 0x5E}, {0x7B, 0x5F}, /* 0x58-0x5B */ + {0x7B, 0x61}, {0x7B, 0x63}, {0x7B, 0x64}, {0x7B, 0x65}, /* 0x5C-0x5F */ + {0x7B, 0x66}, {0x7B, 0x67}, {0x7B, 0x68}, {0x7B, 0x69}, /* 0x60-0x63 */ + {0x7B, 0x6A}, {0x7B, 0x6B}, {0x7B, 0x6C}, {0x7B, 0x6D}, /* 0x64-0x67 */ + {0x7B, 0x6F}, {0x7B, 0x70}, {0x7B, 0x73}, {0x7B, 0x74}, /* 0x68-0x6B */ + {0x7B, 0x76}, {0x7B, 0x78}, {0x7B, 0x7A}, {0x7B, 0x7C}, /* 0x6C-0x6F */ + {0x7B, 0x7D}, {0x7B, 0x7F}, {0x7B, 0x81}, {0x7B, 0x82}, /* 0x70-0x73 */ + {0x7B, 0x83}, {0x7B, 0x84}, {0x7B, 0x86}, {0x7B, 0x87}, /* 0x74-0x77 */ + {0x7B, 0x88}, {0x7B, 0x89}, {0x7B, 0x8A}, {0x7B, 0x8B}, /* 0x78-0x7B */ + {0x7B, 0x8C}, {0x7B, 0x8E}, {0x7B, 0x8F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7B, 0x91}, {0x7B, 0x92}, {0x7B, 0x93}, {0x7B, 0x96}, /* 0x80-0x83 */ + {0x7B, 0x98}, {0x7B, 0x99}, {0x7B, 0x9A}, {0x7B, 0x9B}, /* 0x84-0x87 */ + {0x7B, 0x9E}, {0x7B, 0x9F}, {0x7B, 0xA0}, {0x7B, 0xA3}, /* 0x88-0x8B */ + {0x7B, 0xA4}, {0x7B, 0xA5}, {0x7B, 0xAE}, {0x7B, 0xAF}, /* 0x8C-0x8F */ + {0x7B, 0xB0}, {0x7B, 0xB2}, {0x7B, 0xB3}, {0x7B, 0xB5}, /* 0x90-0x93 */ + {0x7B, 0xB6}, {0x7B, 0xB7}, {0x7B, 0xB9}, {0x7B, 0xBA}, /* 0x94-0x97 */ + {0x7B, 0xBB}, {0x7B, 0xBC}, {0x7B, 0xBD}, {0x7B, 0xBE}, /* 0x98-0x9B */ + {0x7B, 0xBF}, {0x7B, 0xC0}, {0x7B, 0xC2}, {0x7B, 0xC3}, /* 0x9C-0x9F */ + {0x7B, 0xC4}, {0x57, 0xC2}, {0x80, 0x3F}, {0x68, 0x97}, /* 0xA0-0xA3 */ + {0x5D, 0xE5}, {0x65, 0x3B}, {0x52, 0x9F}, {0x60, 0x6D}, /* 0xA4-0xA7 */ + {0x9F, 0x9A}, {0x4F, 0x9B}, {0x8E, 0xAC}, {0x51, 0x6C}, /* 0xA8-0xAB */ + {0x5B, 0xAB}, {0x5F, 0x13}, {0x5D, 0xE9}, {0x6C, 0x5E}, /* 0xAC-0xAF */ + {0x62, 0xF1}, {0x8D, 0x21}, {0x51, 0x71}, {0x94, 0xA9}, /* 0xB0-0xB3 */ + {0x52, 0xFE}, {0x6C, 0x9F}, {0x82, 0xDF}, {0x72, 0xD7}, /* 0xB4-0xB7 */ + {0x57, 0xA2}, {0x67, 0x84}, {0x8D, 0x2D}, {0x59, 0x1F}, /* 0xB8-0xBB */ + {0x8F, 0x9C}, {0x83, 0xC7}, {0x54, 0x95}, {0x7B, 0x8D}, /* 0xBC-0xBF */ + {0x4F, 0x30}, {0x6C, 0xBD}, {0x5B, 0x64}, {0x59, 0xD1}, /* 0xC0-0xC3 */ + {0x9F, 0x13}, {0x53, 0xE4}, {0x86, 0xCA}, {0x9A, 0xA8}, /* 0xC4-0xC7 */ + {0x8C, 0x37}, {0x80, 0xA1}, {0x65, 0x45}, {0x98, 0x7E}, /* 0xC8-0xCB */ + {0x56, 0xFA}, {0x96, 0xC7}, {0x52, 0x2E}, {0x74, 0xDC}, /* 0xCC-0xCF */ + {0x52, 0x50}, {0x5B, 0xE1}, {0x63, 0x02}, {0x89, 0x02}, /* 0xD0-0xD3 */ + {0x4E, 0x56}, {0x62, 0xD0}, {0x60, 0x2A}, {0x68, 0xFA}, /* 0xD4-0xD7 */ + {0x51, 0x73}, {0x5B, 0x98}, {0x51, 0xA0}, {0x89, 0xC2}, /* 0xD8-0xDB */ + {0x7B, 0xA1}, {0x99, 0x86}, {0x7F, 0x50}, {0x60, 0xEF}, /* 0xDC-0xDF */ + {0x70, 0x4C}, {0x8D, 0x2F}, {0x51, 0x49}, {0x5E, 0x7F}, /* 0xE0-0xE3 */ + {0x90, 0x1B}, {0x74, 0x70}, {0x89, 0xC4}, {0x57, 0x2D}, /* 0xE4-0xE7 */ + {0x78, 0x45}, {0x5F, 0x52}, {0x9F, 0x9F}, {0x95, 0xFA}, /* 0xE8-0xEB */ + {0x8F, 0x68}, {0x9B, 0x3C}, {0x8B, 0xE1}, {0x76, 0x78}, /* 0xEC-0xEF */ + {0x68, 0x42}, {0x67, 0xDC}, {0x8D, 0xEA}, {0x8D, 0x35}, /* 0xF0-0xF3 */ + {0x52, 0x3D}, {0x8F, 0x8A}, {0x6E, 0xDA}, {0x68, 0xCD}, /* 0xF4-0xF7 */ + {0x95, 0x05}, {0x90, 0xED}, {0x56, 0xFD}, {0x67, 0x9C}, /* 0xF8-0xFB */ + {0x88, 0xF9}, {0x8F, 0xC7}, {0x54, 0xC8}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7B, 0xC5}, {0x7B, 0xC8}, {0x7B, 0xC9}, {0x7B, 0xCA}, /* 0x40-0x43 */ + {0x7B, 0xCB}, {0x7B, 0xCD}, {0x7B, 0xCE}, {0x7B, 0xCF}, /* 0x44-0x47 */ + {0x7B, 0xD0}, {0x7B, 0xD2}, {0x7B, 0xD4}, {0x7B, 0xD5}, /* 0x48-0x4B */ + {0x7B, 0xD6}, {0x7B, 0xD7}, {0x7B, 0xD8}, {0x7B, 0xDB}, /* 0x4C-0x4F */ + {0x7B, 0xDC}, {0x7B, 0xDE}, {0x7B, 0xDF}, {0x7B, 0xE0}, /* 0x50-0x53 */ + {0x7B, 0xE2}, {0x7B, 0xE3}, {0x7B, 0xE4}, {0x7B, 0xE7}, /* 0x54-0x57 */ + {0x7B, 0xE8}, {0x7B, 0xE9}, {0x7B, 0xEB}, {0x7B, 0xEC}, /* 0x58-0x5B */ + {0x7B, 0xED}, {0x7B, 0xEF}, {0x7B, 0xF0}, {0x7B, 0xF2}, /* 0x5C-0x5F */ + {0x7B, 0xF3}, {0x7B, 0xF4}, {0x7B, 0xF5}, {0x7B, 0xF6}, /* 0x60-0x63 */ + {0x7B, 0xF8}, {0x7B, 0xF9}, {0x7B, 0xFA}, {0x7B, 0xFB}, /* 0x64-0x67 */ + {0x7B, 0xFD}, {0x7B, 0xFF}, {0x7C, 0x00}, {0x7C, 0x01}, /* 0x68-0x6B */ + {0x7C, 0x02}, {0x7C, 0x03}, {0x7C, 0x04}, {0x7C, 0x05}, /* 0x6C-0x6F */ + {0x7C, 0x06}, {0x7C, 0x08}, {0x7C, 0x09}, {0x7C, 0x0A}, /* 0x70-0x73 */ + {0x7C, 0x0D}, {0x7C, 0x0E}, {0x7C, 0x10}, {0x7C, 0x11}, /* 0x74-0x77 */ + {0x7C, 0x12}, {0x7C, 0x13}, {0x7C, 0x14}, {0x7C, 0x15}, /* 0x78-0x7B */ + {0x7C, 0x17}, {0x7C, 0x18}, {0x7C, 0x19}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7C, 0x1A}, {0x7C, 0x1B}, {0x7C, 0x1C}, {0x7C, 0x1D}, /* 0x80-0x83 */ + {0x7C, 0x1E}, {0x7C, 0x20}, {0x7C, 0x21}, {0x7C, 0x22}, /* 0x84-0x87 */ + {0x7C, 0x23}, {0x7C, 0x24}, {0x7C, 0x25}, {0x7C, 0x28}, /* 0x88-0x8B */ + {0x7C, 0x29}, {0x7C, 0x2B}, {0x7C, 0x2C}, {0x7C, 0x2D}, /* 0x8C-0x8F */ + {0x7C, 0x2E}, {0x7C, 0x2F}, {0x7C, 0x30}, {0x7C, 0x31}, /* 0x90-0x93 */ + {0x7C, 0x32}, {0x7C, 0x33}, {0x7C, 0x34}, {0x7C, 0x35}, /* 0x94-0x97 */ + {0x7C, 0x36}, {0x7C, 0x37}, {0x7C, 0x39}, {0x7C, 0x3A}, /* 0x98-0x9B */ + {0x7C, 0x3B}, {0x7C, 0x3C}, {0x7C, 0x3D}, {0x7C, 0x3E}, /* 0x9C-0x9F */ + {0x7C, 0x42}, {0x9A, 0xB8}, {0x5B, 0x69}, {0x6D, 0x77}, /* 0xA0-0xA3 */ + {0x6C, 0x26}, {0x4E, 0xA5}, {0x5B, 0xB3}, {0x9A, 0x87}, /* 0xA4-0xA7 */ + {0x91, 0x63}, {0x61, 0xA8}, {0x90, 0xAF}, {0x97, 0xE9}, /* 0xA8-0xAB */ + {0x54, 0x2B}, {0x6D, 0xB5}, {0x5B, 0xD2}, {0x51, 0xFD}, /* 0xAC-0xAF */ + {0x55, 0x8A}, {0x7F, 0x55}, {0x7F, 0xF0}, {0x64, 0xBC}, /* 0xB0-0xB3 */ + {0x63, 0x4D}, {0x65, 0xF1}, {0x61, 0xBE}, {0x60, 0x8D}, /* 0xB4-0xB7 */ + {0x71, 0x0A}, {0x6C, 0x57}, {0x6C, 0x49}, {0x59, 0x2F}, /* 0xB8-0xBB */ + {0x67, 0x6D}, {0x82, 0x2A}, {0x58, 0xD5}, {0x56, 0x8E}, /* 0xBC-0xBF */ + {0x8C, 0x6A}, {0x6B, 0xEB}, {0x90, 0xDD}, {0x59, 0x7D}, /* 0xC0-0xC3 */ + {0x80, 0x17}, {0x53, 0xF7}, {0x6D, 0x69}, {0x54, 0x75}, /* 0xC4-0xC7 */ + {0x55, 0x9D}, {0x83, 0x77}, {0x83, 0xCF}, {0x68, 0x38}, /* 0xC8-0xCB */ + {0x79, 0xBE}, {0x54, 0x8C}, {0x4F, 0x55}, {0x54, 0x08}, /* 0xCC-0xCF */ + {0x76, 0xD2}, {0x8C, 0x89}, {0x96, 0x02}, {0x6C, 0xB3}, /* 0xD0-0xD3 */ + {0x6D, 0xB8}, {0x8D, 0x6B}, {0x89, 0x10}, {0x9E, 0x64}, /* 0xD4-0xD7 */ + {0x8D, 0x3A}, {0x56, 0x3F}, {0x9E, 0xD1}, {0x75, 0xD5}, /* 0xD8-0xDB */ + {0x5F, 0x88}, {0x72, 0xE0}, {0x60, 0x68}, {0x54, 0xFC}, /* 0xDC-0xDF */ + {0x4E, 0xA8}, {0x6A, 0x2A}, {0x88, 0x61}, {0x60, 0x52}, /* 0xE0-0xE3 */ + {0x8F, 0x70}, {0x54, 0xC4}, {0x70, 0xD8}, {0x86, 0x79}, /* 0xE4-0xE7 */ + {0x9E, 0x3F}, {0x6D, 0x2A}, {0x5B, 0x8F}, {0x5F, 0x18}, /* 0xE8-0xEB */ + {0x7E, 0xA2}, {0x55, 0x89}, {0x4F, 0xAF}, {0x73, 0x34}, /* 0xEC-0xEF */ + {0x54, 0x3C}, {0x53, 0x9A}, {0x50, 0x19}, {0x54, 0x0E}, /* 0xF0-0xF3 */ + {0x54, 0x7C}, {0x4E, 0x4E}, {0x5F, 0xFD}, {0x74, 0x5A}, /* 0xF4-0xF7 */ + {0x58, 0xF6}, {0x84, 0x6B}, {0x80, 0xE1}, {0x87, 0x74}, /* 0xF8-0xFB */ + {0x72, 0xD0}, {0x7C, 0xCA}, {0x6E, 0x56}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7C, 0x43}, {0x7C, 0x44}, {0x7C, 0x45}, {0x7C, 0x46}, /* 0x40-0x43 */ + {0x7C, 0x47}, {0x7C, 0x48}, {0x7C, 0x49}, {0x7C, 0x4A}, /* 0x44-0x47 */ + {0x7C, 0x4B}, {0x7C, 0x4C}, {0x7C, 0x4E}, {0x7C, 0x4F}, /* 0x48-0x4B */ + {0x7C, 0x50}, {0x7C, 0x51}, {0x7C, 0x52}, {0x7C, 0x53}, /* 0x4C-0x4F */ + {0x7C, 0x54}, {0x7C, 0x55}, {0x7C, 0x56}, {0x7C, 0x57}, /* 0x50-0x53 */ + {0x7C, 0x58}, {0x7C, 0x59}, {0x7C, 0x5A}, {0x7C, 0x5B}, /* 0x54-0x57 */ + {0x7C, 0x5C}, {0x7C, 0x5D}, {0x7C, 0x5E}, {0x7C, 0x5F}, /* 0x58-0x5B */ + {0x7C, 0x60}, {0x7C, 0x61}, {0x7C, 0x62}, {0x7C, 0x63}, /* 0x5C-0x5F */ + {0x7C, 0x64}, {0x7C, 0x65}, {0x7C, 0x66}, {0x7C, 0x67}, /* 0x60-0x63 */ + {0x7C, 0x68}, {0x7C, 0x69}, {0x7C, 0x6A}, {0x7C, 0x6B}, /* 0x64-0x67 */ + {0x7C, 0x6C}, {0x7C, 0x6D}, {0x7C, 0x6E}, {0x7C, 0x6F}, /* 0x68-0x6B */ + {0x7C, 0x70}, {0x7C, 0x71}, {0x7C, 0x72}, {0x7C, 0x75}, /* 0x6C-0x6F */ + {0x7C, 0x76}, {0x7C, 0x77}, {0x7C, 0x78}, {0x7C, 0x79}, /* 0x70-0x73 */ + {0x7C, 0x7A}, {0x7C, 0x7E}, {0x7C, 0x7F}, {0x7C, 0x80}, /* 0x74-0x77 */ + {0x7C, 0x81}, {0x7C, 0x82}, {0x7C, 0x83}, {0x7C, 0x84}, /* 0x78-0x7B */ + {0x7C, 0x85}, {0x7C, 0x86}, {0x7C, 0x87}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7C, 0x88}, {0x7C, 0x8A}, {0x7C, 0x8B}, {0x7C, 0x8C}, /* 0x80-0x83 */ + {0x7C, 0x8D}, {0x7C, 0x8E}, {0x7C, 0x8F}, {0x7C, 0x90}, /* 0x84-0x87 */ + {0x7C, 0x93}, {0x7C, 0x94}, {0x7C, 0x96}, {0x7C, 0x99}, /* 0x88-0x8B */ + {0x7C, 0x9A}, {0x7C, 0x9B}, {0x7C, 0xA0}, {0x7C, 0xA1}, /* 0x8C-0x8F */ + {0x7C, 0xA3}, {0x7C, 0xA6}, {0x7C, 0xA7}, {0x7C, 0xA8}, /* 0x90-0x93 */ + {0x7C, 0xA9}, {0x7C, 0xAB}, {0x7C, 0xAC}, {0x7C, 0xAD}, /* 0x94-0x97 */ + {0x7C, 0xAF}, {0x7C, 0xB0}, {0x7C, 0xB4}, {0x7C, 0xB5}, /* 0x98-0x9B */ + {0x7C, 0xB6}, {0x7C, 0xB7}, {0x7C, 0xB8}, {0x7C, 0xBA}, /* 0x9C-0x9F */ + {0x7C, 0xBB}, {0x5F, 0x27}, {0x86, 0x4E}, {0x55, 0x2C}, /* 0xA0-0xA3 */ + {0x62, 0xA4}, {0x4E, 0x92}, {0x6C, 0xAA}, {0x62, 0x37}, /* 0xA4-0xA7 */ + {0x82, 0xB1}, {0x54, 0xD7}, {0x53, 0x4E}, {0x73, 0x3E}, /* 0xA8-0xAB */ + {0x6E, 0xD1}, {0x75, 0x3B}, {0x52, 0x12}, {0x53, 0x16}, /* 0xAC-0xAF */ + {0x8B, 0xDD}, {0x69, 0xD0}, {0x5F, 0x8A}, {0x60, 0x00}, /* 0xB0-0xB3 */ + {0x6D, 0xEE}, {0x57, 0x4F}, {0x6B, 0x22}, {0x73, 0xAF}, /* 0xB4-0xB7 */ + {0x68, 0x53}, {0x8F, 0xD8}, {0x7F, 0x13}, {0x63, 0x62}, /* 0xB8-0xBB */ + {0x60, 0xA3}, {0x55, 0x24}, {0x75, 0xEA}, {0x8C, 0x62}, /* 0xBC-0xBF */ + {0x71, 0x15}, {0x6D, 0xA3}, {0x5B, 0xA6}, {0x5E, 0x7B}, /* 0xC0-0xC3 */ + {0x83, 0x52}, {0x61, 0x4C}, {0x9E, 0xC4}, {0x78, 0xFA}, /* 0xC4-0xC7 */ + {0x87, 0x57}, {0x7C, 0x27}, {0x76, 0x87}, {0x51, 0xF0}, /* 0xC8-0xCB */ + {0x60, 0xF6}, {0x71, 0x4C}, {0x66, 0x43}, {0x5E, 0x4C}, /* 0xCC-0xCF */ + {0x60, 0x4D}, {0x8C, 0x0E}, {0x70, 0x70}, {0x63, 0x25}, /* 0xD0-0xD3 */ + {0x8F, 0x89}, {0x5F, 0xBD}, {0x60, 0x62}, {0x86, 0xD4}, /* 0xD4-0xD7 */ + {0x56, 0xDE}, {0x6B, 0xC1}, {0x60, 0x94}, {0x61, 0x67}, /* 0xD8-0xDB */ + {0x53, 0x49}, {0x60, 0xE0}, {0x66, 0x66}, {0x8D, 0x3F}, /* 0xDC-0xDF */ + {0x79, 0xFD}, {0x4F, 0x1A}, {0x70, 0xE9}, {0x6C, 0x47}, /* 0xE0-0xE3 */ + {0x8B, 0xB3}, {0x8B, 0xF2}, {0x7E, 0xD8}, {0x83, 0x64}, /* 0xE4-0xE7 */ + {0x66, 0x0F}, {0x5A, 0x5A}, {0x9B, 0x42}, {0x6D, 0x51}, /* 0xE8-0xEB */ + {0x6D, 0xF7}, {0x8C, 0x41}, {0x6D, 0x3B}, {0x4F, 0x19}, /* 0xEC-0xEF */ + {0x70, 0x6B}, {0x83, 0xB7}, {0x62, 0x16}, {0x60, 0xD1}, /* 0xF0-0xF3 */ + {0x97, 0x0D}, {0x8D, 0x27}, {0x79, 0x78}, {0x51, 0xFB}, /* 0xF4-0xF7 */ + {0x57, 0x3E}, {0x57, 0xFA}, {0x67, 0x3A}, {0x75, 0x78}, /* 0xF8-0xFB */ + {0x7A, 0x3D}, {0x79, 0xEF}, {0x7B, 0x95}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7C, 0xBF}, {0x7C, 0xC0}, {0x7C, 0xC2}, {0x7C, 0xC3}, /* 0x40-0x43 */ + {0x7C, 0xC4}, {0x7C, 0xC6}, {0x7C, 0xC9}, {0x7C, 0xCB}, /* 0x44-0x47 */ + {0x7C, 0xCE}, {0x7C, 0xCF}, {0x7C, 0xD0}, {0x7C, 0xD1}, /* 0x48-0x4B */ + {0x7C, 0xD2}, {0x7C, 0xD3}, {0x7C, 0xD4}, {0x7C, 0xD8}, /* 0x4C-0x4F */ + {0x7C, 0xDA}, {0x7C, 0xDB}, {0x7C, 0xDD}, {0x7C, 0xDE}, /* 0x50-0x53 */ + {0x7C, 0xE1}, {0x7C, 0xE2}, {0x7C, 0xE3}, {0x7C, 0xE4}, /* 0x54-0x57 */ + {0x7C, 0xE5}, {0x7C, 0xE6}, {0x7C, 0xE7}, {0x7C, 0xE9}, /* 0x58-0x5B */ + {0x7C, 0xEA}, {0x7C, 0xEB}, {0x7C, 0xEC}, {0x7C, 0xED}, /* 0x5C-0x5F */ + {0x7C, 0xEE}, {0x7C, 0xF0}, {0x7C, 0xF1}, {0x7C, 0xF2}, /* 0x60-0x63 */ + {0x7C, 0xF3}, {0x7C, 0xF4}, {0x7C, 0xF5}, {0x7C, 0xF6}, /* 0x64-0x67 */ + {0x7C, 0xF7}, {0x7C, 0xF9}, {0x7C, 0xFA}, {0x7C, 0xFC}, /* 0x68-0x6B */ + {0x7C, 0xFD}, {0x7C, 0xFE}, {0x7C, 0xFF}, {0x7D, 0x00}, /* 0x6C-0x6F */ + {0x7D, 0x01}, {0x7D, 0x02}, {0x7D, 0x03}, {0x7D, 0x04}, /* 0x70-0x73 */ + {0x7D, 0x05}, {0x7D, 0x06}, {0x7D, 0x07}, {0x7D, 0x08}, /* 0x74-0x77 */ + {0x7D, 0x09}, {0x7D, 0x0B}, {0x7D, 0x0C}, {0x7D, 0x0D}, /* 0x78-0x7B */ + {0x7D, 0x0E}, {0x7D, 0x0F}, {0x7D, 0x10}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7D, 0x11}, {0x7D, 0x12}, {0x7D, 0x13}, {0x7D, 0x14}, /* 0x80-0x83 */ + {0x7D, 0x15}, {0x7D, 0x16}, {0x7D, 0x17}, {0x7D, 0x18}, /* 0x84-0x87 */ + {0x7D, 0x19}, {0x7D, 0x1A}, {0x7D, 0x1B}, {0x7D, 0x1C}, /* 0x88-0x8B */ + {0x7D, 0x1D}, {0x7D, 0x1E}, {0x7D, 0x1F}, {0x7D, 0x21}, /* 0x8C-0x8F */ + {0x7D, 0x23}, {0x7D, 0x24}, {0x7D, 0x25}, {0x7D, 0x26}, /* 0x90-0x93 */ + {0x7D, 0x28}, {0x7D, 0x29}, {0x7D, 0x2A}, {0x7D, 0x2C}, /* 0x94-0x97 */ + {0x7D, 0x2D}, {0x7D, 0x2E}, {0x7D, 0x30}, {0x7D, 0x31}, /* 0x98-0x9B */ + {0x7D, 0x32}, {0x7D, 0x33}, {0x7D, 0x34}, {0x7D, 0x35}, /* 0x9C-0x9F */ + {0x7D, 0x36}, {0x80, 0x8C}, {0x99, 0x65}, {0x8F, 0xF9}, /* 0xA0-0xA3 */ + {0x6F, 0xC0}, {0x8B, 0xA5}, {0x9E, 0x21}, {0x59, 0xEC}, /* 0xA4-0xA7 */ + {0x7E, 0xE9}, {0x7F, 0x09}, {0x54, 0x09}, {0x67, 0x81}, /* 0xA8-0xAB */ + {0x68, 0xD8}, {0x8F, 0x91}, {0x7C, 0x4D}, {0x96, 0xC6}, /* 0xAC-0xAF */ + {0x53, 0xCA}, {0x60, 0x25}, {0x75, 0xBE}, {0x6C, 0x72}, /* 0xB0-0xB3 */ + {0x53, 0x73}, {0x5A, 0xC9}, {0x7E, 0xA7}, {0x63, 0x24}, /* 0xB4-0xB7 */ + {0x51, 0xE0}, {0x81, 0x0A}, {0x5D, 0xF1}, {0x84, 0xDF}, /* 0xB8-0xBB */ + {0x62, 0x80}, {0x51, 0x80}, {0x5B, 0x63}, {0x4F, 0x0E}, /* 0xBC-0xBF */ + {0x79, 0x6D}, {0x52, 0x42}, {0x60, 0xB8}, {0x6D, 0x4E}, /* 0xC0-0xC3 */ + {0x5B, 0xC4}, {0x5B, 0xC2}, {0x8B, 0xA1}, {0x8B, 0xB0}, /* 0xC4-0xC7 */ + {0x65, 0xE2}, {0x5F, 0xCC}, {0x96, 0x45}, {0x59, 0x93}, /* 0xC8-0xCB */ + {0x7E, 0xE7}, {0x7E, 0xAA}, {0x56, 0x09}, {0x67, 0xB7}, /* 0xCC-0xCF */ + {0x59, 0x39}, {0x4F, 0x73}, {0x5B, 0xB6}, {0x52, 0xA0}, /* 0xD0-0xD3 */ + {0x83, 0x5A}, {0x98, 0x8A}, {0x8D, 0x3E}, {0x75, 0x32}, /* 0xD4-0xD7 */ + {0x94, 0xBE}, {0x50, 0x47}, {0x7A, 0x3C}, {0x4E, 0xF7}, /* 0xD8-0xDB */ + {0x67, 0xB6}, {0x9A, 0x7E}, {0x5A, 0xC1}, {0x6B, 0x7C}, /* 0xDC-0xDF */ + {0x76, 0xD1}, {0x57, 0x5A}, {0x5C, 0x16}, {0x7B, 0x3A}, /* 0xE0-0xE3 */ + {0x95, 0xF4}, {0x71, 0x4E}, {0x51, 0x7C}, {0x80, 0xA9}, /* 0xE4-0xE7 */ + {0x82, 0x70}, {0x59, 0x78}, {0x7F, 0x04}, {0x83, 0x27}, /* 0xE8-0xEB */ + {0x68, 0xC0}, {0x67, 0xEC}, {0x78, 0xB1}, {0x78, 0x77}, /* 0xEC-0xEF */ + {0x62, 0xE3}, {0x63, 0x61}, {0x7B, 0x80}, {0x4F, 0xED}, /* 0xF0-0xF3 */ + {0x52, 0x6A}, {0x51, 0xCF}, {0x83, 0x50}, {0x69, 0xDB}, /* 0xF4-0xF7 */ + {0x92, 0x74}, {0x8D, 0xF5}, {0x8D, 0x31}, {0x89, 0xC1}, /* 0xF8-0xFB */ + {0x95, 0x2E}, {0x7B, 0xAD}, {0x4E, 0xF6}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7D, 0x37}, {0x7D, 0x38}, {0x7D, 0x39}, {0x7D, 0x3A}, /* 0x40-0x43 */ + {0x7D, 0x3B}, {0x7D, 0x3C}, {0x7D, 0x3D}, {0x7D, 0x3E}, /* 0x44-0x47 */ + {0x7D, 0x3F}, {0x7D, 0x40}, {0x7D, 0x41}, {0x7D, 0x42}, /* 0x48-0x4B */ + {0x7D, 0x43}, {0x7D, 0x44}, {0x7D, 0x45}, {0x7D, 0x46}, /* 0x4C-0x4F */ + {0x7D, 0x47}, {0x7D, 0x48}, {0x7D, 0x49}, {0x7D, 0x4A}, /* 0x50-0x53 */ + {0x7D, 0x4B}, {0x7D, 0x4C}, {0x7D, 0x4D}, {0x7D, 0x4E}, /* 0x54-0x57 */ + {0x7D, 0x4F}, {0x7D, 0x50}, {0x7D, 0x51}, {0x7D, 0x52}, /* 0x58-0x5B */ + {0x7D, 0x53}, {0x7D, 0x54}, {0x7D, 0x55}, {0x7D, 0x56}, /* 0x5C-0x5F */ + {0x7D, 0x57}, {0x7D, 0x58}, {0x7D, 0x59}, {0x7D, 0x5A}, /* 0x60-0x63 */ + {0x7D, 0x5B}, {0x7D, 0x5C}, {0x7D, 0x5D}, {0x7D, 0x5E}, /* 0x64-0x67 */ + {0x7D, 0x5F}, {0x7D, 0x60}, {0x7D, 0x61}, {0x7D, 0x62}, /* 0x68-0x6B */ + {0x7D, 0x63}, {0x7D, 0x64}, {0x7D, 0x65}, {0x7D, 0x66}, /* 0x6C-0x6F */ + {0x7D, 0x67}, {0x7D, 0x68}, {0x7D, 0x69}, {0x7D, 0x6A}, /* 0x70-0x73 */ + {0x7D, 0x6B}, {0x7D, 0x6C}, {0x7D, 0x6D}, {0x7D, 0x6F}, /* 0x74-0x77 */ + {0x7D, 0x70}, {0x7D, 0x71}, {0x7D, 0x72}, {0x7D, 0x73}, /* 0x78-0x7B */ + {0x7D, 0x74}, {0x7D, 0x75}, {0x7D, 0x76}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7D, 0x78}, {0x7D, 0x79}, {0x7D, 0x7A}, {0x7D, 0x7B}, /* 0x80-0x83 */ + {0x7D, 0x7C}, {0x7D, 0x7D}, {0x7D, 0x7E}, {0x7D, 0x7F}, /* 0x84-0x87 */ + {0x7D, 0x80}, {0x7D, 0x81}, {0x7D, 0x82}, {0x7D, 0x83}, /* 0x88-0x8B */ + {0x7D, 0x84}, {0x7D, 0x85}, {0x7D, 0x86}, {0x7D, 0x87}, /* 0x8C-0x8F */ + {0x7D, 0x88}, {0x7D, 0x89}, {0x7D, 0x8A}, {0x7D, 0x8B}, /* 0x90-0x93 */ + {0x7D, 0x8C}, {0x7D, 0x8D}, {0x7D, 0x8E}, {0x7D, 0x8F}, /* 0x94-0x97 */ + {0x7D, 0x90}, {0x7D, 0x91}, {0x7D, 0x92}, {0x7D, 0x93}, /* 0x98-0x9B */ + {0x7D, 0x94}, {0x7D, 0x95}, {0x7D, 0x96}, {0x7D, 0x97}, /* 0x9C-0x9F */ + {0x7D, 0x98}, {0x50, 0x65}, {0x82, 0x30}, {0x52, 0x51}, /* 0xA0-0xA3 */ + {0x99, 0x6F}, {0x6E, 0x10}, {0x6E, 0x85}, {0x6D, 0xA7}, /* 0xA4-0xA7 */ + {0x5E, 0xFA}, {0x50, 0xF5}, {0x59, 0xDC}, {0x5C, 0x06}, /* 0xA8-0xAB */ + {0x6D, 0x46}, {0x6C, 0x5F}, {0x75, 0x86}, {0x84, 0x8B}, /* 0xAC-0xAF */ + {0x68, 0x68}, {0x59, 0x56}, {0x8B, 0xB2}, {0x53, 0x20}, /* 0xB0-0xB3 */ + {0x91, 0x71}, {0x96, 0x4D}, {0x85, 0x49}, {0x69, 0x12}, /* 0xB4-0xB7 */ + {0x79, 0x01}, {0x71, 0x26}, {0x80, 0xF6}, {0x4E, 0xA4}, /* 0xB8-0xBB */ + {0x90, 0xCA}, {0x6D, 0x47}, {0x9A, 0x84}, {0x5A, 0x07}, /* 0xBC-0xBF */ + {0x56, 0xBC}, {0x64, 0x05}, {0x94, 0xF0}, {0x77, 0xEB}, /* 0xC0-0xC3 */ + {0x4F, 0xA5}, {0x81, 0x1A}, {0x72, 0xE1}, {0x89, 0xD2}, /* 0xC4-0xC7 */ + {0x99, 0x7A}, {0x7F, 0x34}, {0x7E, 0xDE}, {0x52, 0x7F}, /* 0xC8-0xCB */ + {0x65, 0x59}, {0x91, 0x75}, {0x8F, 0x7F}, {0x8F, 0x83}, /* 0xCC-0xCF */ + {0x53, 0xEB}, {0x7A, 0x96}, {0x63, 0xED}, {0x63, 0xA5}, /* 0xD0-0xD3 */ + {0x76, 0x86}, {0x79, 0xF8}, {0x88, 0x57}, {0x96, 0x36}, /* 0xD4-0xD7 */ + {0x62, 0x2A}, {0x52, 0xAB}, {0x82, 0x82}, {0x68, 0x54}, /* 0xD8-0xDB */ + {0x67, 0x70}, {0x63, 0x77}, {0x77, 0x6B}, {0x7A, 0xED}, /* 0xDC-0xDF */ + {0x6D, 0x01}, {0x7E, 0xD3}, {0x89, 0xE3}, {0x59, 0xD0}, /* 0xE0-0xE3 */ + {0x62, 0x12}, {0x85, 0xC9}, {0x82, 0xA5}, {0x75, 0x4C}, /* 0xE4-0xE7 */ + {0x50, 0x1F}, {0x4E, 0xCB}, {0x75, 0xA5}, {0x8B, 0xEB}, /* 0xE8-0xEB */ + {0x5C, 0x4A}, {0x5D, 0xFE}, {0x7B, 0x4B}, {0x65, 0xA4}, /* 0xEC-0xEF */ + {0x91, 0xD1}, {0x4E, 0xCA}, {0x6D, 0x25}, {0x89, 0x5F}, /* 0xF0-0xF3 */ + {0x7D, 0x27}, {0x95, 0x26}, {0x4E, 0xC5}, {0x8C, 0x28}, /* 0xF4-0xF7 */ + {0x8F, 0xDB}, {0x97, 0x73}, {0x66, 0x4B}, {0x79, 0x81}, /* 0xF8-0xFB */ + {0x8F, 0xD1}, {0x70, 0xEC}, {0x6D, 0x78}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7D, 0x99}, {0x7D, 0x9A}, {0x7D, 0x9B}, {0x7D, 0x9C}, /* 0x40-0x43 */ + {0x7D, 0x9D}, {0x7D, 0x9E}, {0x7D, 0x9F}, {0x7D, 0xA0}, /* 0x44-0x47 */ + {0x7D, 0xA1}, {0x7D, 0xA2}, {0x7D, 0xA3}, {0x7D, 0xA4}, /* 0x48-0x4B */ + {0x7D, 0xA5}, {0x7D, 0xA7}, {0x7D, 0xA8}, {0x7D, 0xA9}, /* 0x4C-0x4F */ + {0x7D, 0xAA}, {0x7D, 0xAB}, {0x7D, 0xAC}, {0x7D, 0xAD}, /* 0x50-0x53 */ + {0x7D, 0xAF}, {0x7D, 0xB0}, {0x7D, 0xB1}, {0x7D, 0xB2}, /* 0x54-0x57 */ + {0x7D, 0xB3}, {0x7D, 0xB4}, {0x7D, 0xB5}, {0x7D, 0xB6}, /* 0x58-0x5B */ + {0x7D, 0xB7}, {0x7D, 0xB8}, {0x7D, 0xB9}, {0x7D, 0xBA}, /* 0x5C-0x5F */ + {0x7D, 0xBB}, {0x7D, 0xBC}, {0x7D, 0xBD}, {0x7D, 0xBE}, /* 0x60-0x63 */ + {0x7D, 0xBF}, {0x7D, 0xC0}, {0x7D, 0xC1}, {0x7D, 0xC2}, /* 0x64-0x67 */ + {0x7D, 0xC3}, {0x7D, 0xC4}, {0x7D, 0xC5}, {0x7D, 0xC6}, /* 0x68-0x6B */ + {0x7D, 0xC7}, {0x7D, 0xC8}, {0x7D, 0xC9}, {0x7D, 0xCA}, /* 0x6C-0x6F */ + {0x7D, 0xCB}, {0x7D, 0xCC}, {0x7D, 0xCD}, {0x7D, 0xCE}, /* 0x70-0x73 */ + {0x7D, 0xCF}, {0x7D, 0xD0}, {0x7D, 0xD1}, {0x7D, 0xD2}, /* 0x74-0x77 */ + {0x7D, 0xD3}, {0x7D, 0xD4}, {0x7D, 0xD5}, {0x7D, 0xD6}, /* 0x78-0x7B */ + {0x7D, 0xD7}, {0x7D, 0xD8}, {0x7D, 0xD9}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7D, 0xDA}, {0x7D, 0xDB}, {0x7D, 0xDC}, {0x7D, 0xDD}, /* 0x80-0x83 */ + {0x7D, 0xDE}, {0x7D, 0xDF}, {0x7D, 0xE0}, {0x7D, 0xE1}, /* 0x84-0x87 */ + {0x7D, 0xE2}, {0x7D, 0xE3}, {0x7D, 0xE4}, {0x7D, 0xE5}, /* 0x88-0x8B */ + {0x7D, 0xE6}, {0x7D, 0xE7}, {0x7D, 0xE8}, {0x7D, 0xE9}, /* 0x8C-0x8F */ + {0x7D, 0xEA}, {0x7D, 0xEB}, {0x7D, 0xEC}, {0x7D, 0xED}, /* 0x90-0x93 */ + {0x7D, 0xEE}, {0x7D, 0xEF}, {0x7D, 0xF0}, {0x7D, 0xF1}, /* 0x94-0x97 */ + {0x7D, 0xF2}, {0x7D, 0xF3}, {0x7D, 0xF4}, {0x7D, 0xF5}, /* 0x98-0x9B */ + {0x7D, 0xF6}, {0x7D, 0xF7}, {0x7D, 0xF8}, {0x7D, 0xF9}, /* 0x9C-0x9F */ + {0x7D, 0xFA}, {0x5C, 0x3D}, {0x52, 0xB2}, {0x83, 0x46}, /* 0xA0-0xA3 */ + {0x51, 0x62}, {0x83, 0x0E}, {0x77, 0x5B}, {0x66, 0x76}, /* 0xA4-0xA7 */ + {0x9C, 0xB8}, {0x4E, 0xAC}, {0x60, 0xCA}, {0x7C, 0xBE}, /* 0xA8-0xAB */ + {0x7C, 0xB3}, {0x7E, 0xCF}, {0x4E, 0x95}, {0x8B, 0x66}, /* 0xAC-0xAF */ + {0x66, 0x6F}, {0x98, 0x88}, {0x97, 0x59}, {0x58, 0x83}, /* 0xB0-0xB3 */ + {0x65, 0x6C}, {0x95, 0x5C}, {0x5F, 0x84}, {0x75, 0xC9}, /* 0xB4-0xB7 */ + {0x97, 0x56}, {0x7A, 0xDF}, {0x7A, 0xDE}, {0x51, 0xC0}, /* 0xB8-0xBB */ + {0x70, 0xAF}, {0x7A, 0x98}, {0x63, 0xEA}, {0x7A, 0x76}, /* 0xBC-0xBF */ + {0x7E, 0xA0}, {0x73, 0x96}, {0x97, 0xED}, {0x4E, 0x45}, /* 0xC0-0xC3 */ + {0x70, 0x78}, {0x4E, 0x5D}, {0x91, 0x52}, {0x53, 0xA9}, /* 0xC4-0xC7 */ + {0x65, 0x51}, {0x65, 0xE7}, {0x81, 0xFC}, {0x82, 0x05}, /* 0xC8-0xCB */ + {0x54, 0x8E}, {0x5C, 0x31}, {0x75, 0x9A}, {0x97, 0xA0}, /* 0xCC-0xCF */ + {0x62, 0xD8}, {0x72, 0xD9}, {0x75, 0xBD}, {0x5C, 0x45}, /* 0xD0-0xD3 */ + {0x9A, 0x79}, {0x83, 0xCA}, {0x5C, 0x40}, {0x54, 0x80}, /* 0xD4-0xD7 */ + {0x77, 0xE9}, {0x4E, 0x3E}, {0x6C, 0xAE}, {0x80, 0x5A}, /* 0xD8-0xDB */ + {0x62, 0xD2}, {0x63, 0x6E}, {0x5D, 0xE8}, {0x51, 0x77}, /* 0xDC-0xDF */ + {0x8D, 0xDD}, {0x8E, 0x1E}, {0x95, 0x2F}, {0x4F, 0xF1}, /* 0xE0-0xE3 */ + {0x53, 0xE5}, {0x60, 0xE7}, {0x70, 0xAC}, {0x52, 0x67}, /* 0xE4-0xE7 */ + {0x63, 0x50}, {0x9E, 0x43}, {0x5A, 0x1F}, {0x50, 0x26}, /* 0xE8-0xEB */ + {0x77, 0x37}, {0x53, 0x77}, {0x7E, 0xE2}, {0x64, 0x85}, /* 0xEC-0xEF */ + {0x65, 0x2B}, {0x62, 0x89}, {0x63, 0x98}, {0x50, 0x14}, /* 0xF0-0xF3 */ + {0x72, 0x35}, {0x89, 0xC9}, {0x51, 0xB3}, {0x8B, 0xC0}, /* 0xF4-0xF7 */ + {0x7E, 0xDD}, {0x57, 0x47}, {0x83, 0xCC}, {0x94, 0xA7}, /* 0xF8-0xFB */ + {0x51, 0x9B}, {0x54, 0x1B}, {0x5C, 0xFB}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7D, 0xFB}, {0x7D, 0xFC}, {0x7D, 0xFD}, {0x7D, 0xFE}, /* 0x40-0x43 */ + {0x7D, 0xFF}, {0x7E, 0x00}, {0x7E, 0x01}, {0x7E, 0x02}, /* 0x44-0x47 */ + {0x7E, 0x03}, {0x7E, 0x04}, {0x7E, 0x05}, {0x7E, 0x06}, /* 0x48-0x4B */ + {0x7E, 0x07}, {0x7E, 0x08}, {0x7E, 0x09}, {0x7E, 0x0A}, /* 0x4C-0x4F */ + {0x7E, 0x0B}, {0x7E, 0x0C}, {0x7E, 0x0D}, {0x7E, 0x0E}, /* 0x50-0x53 */ + {0x7E, 0x0F}, {0x7E, 0x10}, {0x7E, 0x11}, {0x7E, 0x12}, /* 0x54-0x57 */ + {0x7E, 0x13}, {0x7E, 0x14}, {0x7E, 0x15}, {0x7E, 0x16}, /* 0x58-0x5B */ + {0x7E, 0x17}, {0x7E, 0x18}, {0x7E, 0x19}, {0x7E, 0x1A}, /* 0x5C-0x5F */ + {0x7E, 0x1B}, {0x7E, 0x1C}, {0x7E, 0x1D}, {0x7E, 0x1E}, /* 0x60-0x63 */ + {0x7E, 0x1F}, {0x7E, 0x20}, {0x7E, 0x21}, {0x7E, 0x22}, /* 0x64-0x67 */ + {0x7E, 0x23}, {0x7E, 0x24}, {0x7E, 0x25}, {0x7E, 0x26}, /* 0x68-0x6B */ + {0x7E, 0x27}, {0x7E, 0x28}, {0x7E, 0x29}, {0x7E, 0x2A}, /* 0x6C-0x6F */ + {0x7E, 0x2B}, {0x7E, 0x2C}, {0x7E, 0x2D}, {0x7E, 0x2E}, /* 0x70-0x73 */ + {0x7E, 0x2F}, {0x7E, 0x30}, {0x7E, 0x31}, {0x7E, 0x32}, /* 0x74-0x77 */ + {0x7E, 0x33}, {0x7E, 0x34}, {0x7E, 0x35}, {0x7E, 0x36}, /* 0x78-0x7B */ + {0x7E, 0x37}, {0x7E, 0x38}, {0x7E, 0x39}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7E, 0x3A}, {0x7E, 0x3C}, {0x7E, 0x3D}, {0x7E, 0x3E}, /* 0x80-0x83 */ + {0x7E, 0x3F}, {0x7E, 0x40}, {0x7E, 0x42}, {0x7E, 0x43}, /* 0x84-0x87 */ + {0x7E, 0x44}, {0x7E, 0x45}, {0x7E, 0x46}, {0x7E, 0x48}, /* 0x88-0x8B */ + {0x7E, 0x49}, {0x7E, 0x4A}, {0x7E, 0x4B}, {0x7E, 0x4C}, /* 0x8C-0x8F */ + {0x7E, 0x4D}, {0x7E, 0x4E}, {0x7E, 0x4F}, {0x7E, 0x50}, /* 0x90-0x93 */ + {0x7E, 0x51}, {0x7E, 0x52}, {0x7E, 0x53}, {0x7E, 0x54}, /* 0x94-0x97 */ + {0x7E, 0x55}, {0x7E, 0x56}, {0x7E, 0x57}, {0x7E, 0x58}, /* 0x98-0x9B */ + {0x7E, 0x59}, {0x7E, 0x5A}, {0x7E, 0x5B}, {0x7E, 0x5C}, /* 0x9C-0x9F */ + {0x7E, 0x5D}, {0x4F, 0xCA}, {0x7A, 0xE3}, {0x6D, 0x5A}, /* 0xA0-0xA3 */ + {0x90, 0xE1}, {0x9A, 0x8F}, {0x55, 0x80}, {0x54, 0x96}, /* 0xA4-0xA7 */ + {0x53, 0x61}, {0x54, 0xAF}, {0x5F, 0x00}, {0x63, 0xE9}, /* 0xA8-0xAB */ + {0x69, 0x77}, {0x51, 0xEF}, {0x61, 0x68}, {0x52, 0x0A}, /* 0xAC-0xAF */ + {0x58, 0x2A}, {0x52, 0xD8}, {0x57, 0x4E}, {0x78, 0x0D}, /* 0xB0-0xB3 */ + {0x77, 0x0B}, {0x5E, 0xB7}, {0x61, 0x77}, {0x7C, 0xE0}, /* 0xB4-0xB7 */ + {0x62, 0x5B}, {0x62, 0x97}, {0x4E, 0xA2}, {0x70, 0x95}, /* 0xB8-0xBB */ + {0x80, 0x03}, {0x62, 0xF7}, {0x70, 0xE4}, {0x97, 0x60}, /* 0xBC-0xBF */ + {0x57, 0x77}, {0x82, 0xDB}, {0x67, 0xEF}, {0x68, 0xF5}, /* 0xC0-0xC3 */ + {0x78, 0xD5}, {0x98, 0x97}, {0x79, 0xD1}, {0x58, 0xF3}, /* 0xC4-0xC7 */ + {0x54, 0xB3}, {0x53, 0xEF}, {0x6E, 0x34}, {0x51, 0x4B}, /* 0xC8-0xCB */ + {0x52, 0x3B}, {0x5B, 0xA2}, {0x8B, 0xFE}, {0x80, 0xAF}, /* 0xCC-0xCF */ + {0x55, 0x43}, {0x57, 0xA6}, {0x60, 0x73}, {0x57, 0x51}, /* 0xD0-0xD3 */ + {0x54, 0x2D}, {0x7A, 0x7A}, {0x60, 0x50}, {0x5B, 0x54}, /* 0xD4-0xD7 */ + {0x63, 0xA7}, {0x62, 0xA0}, {0x53, 0xE3}, {0x62, 0x63}, /* 0xD8-0xDB */ + {0x5B, 0xC7}, {0x67, 0xAF}, {0x54, 0xED}, {0x7A, 0x9F}, /* 0xDC-0xDF */ + {0x82, 0xE6}, {0x91, 0x77}, {0x5E, 0x93}, {0x88, 0xE4}, /* 0xE0-0xE3 */ + {0x59, 0x38}, {0x57, 0xAE}, {0x63, 0x0E}, {0x8D, 0xE8}, /* 0xE4-0xE7 */ + {0x80, 0xEF}, {0x57, 0x57}, {0x7B, 0x77}, {0x4F, 0xA9}, /* 0xE8-0xEB */ + {0x5F, 0xEB}, {0x5B, 0xBD}, {0x6B, 0x3E}, {0x53, 0x21}, /* 0xEC-0xEF */ + {0x7B, 0x50}, {0x72, 0xC2}, {0x68, 0x46}, {0x77, 0xFF}, /* 0xF0-0xF3 */ + {0x77, 0x36}, {0x65, 0xF7}, {0x51, 0xB5}, {0x4E, 0x8F}, /* 0xF4-0xF7 */ + {0x76, 0xD4}, {0x5C, 0xBF}, {0x7A, 0xA5}, {0x84, 0x75}, /* 0xF8-0xFB */ + {0x59, 0x4E}, {0x9B, 0x41}, {0x50, 0x80}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7E, 0x5E}, {0x7E, 0x5F}, {0x7E, 0x60}, {0x7E, 0x61}, /* 0x40-0x43 */ + {0x7E, 0x62}, {0x7E, 0x63}, {0x7E, 0x64}, {0x7E, 0x65}, /* 0x44-0x47 */ + {0x7E, 0x66}, {0x7E, 0x67}, {0x7E, 0x68}, {0x7E, 0x69}, /* 0x48-0x4B */ + {0x7E, 0x6A}, {0x7E, 0x6B}, {0x7E, 0x6C}, {0x7E, 0x6D}, /* 0x4C-0x4F */ + {0x7E, 0x6E}, {0x7E, 0x6F}, {0x7E, 0x70}, {0x7E, 0x71}, /* 0x50-0x53 */ + {0x7E, 0x72}, {0x7E, 0x73}, {0x7E, 0x74}, {0x7E, 0x75}, /* 0x54-0x57 */ + {0x7E, 0x76}, {0x7E, 0x77}, {0x7E, 0x78}, {0x7E, 0x79}, /* 0x58-0x5B */ + {0x7E, 0x7A}, {0x7E, 0x7B}, {0x7E, 0x7C}, {0x7E, 0x7D}, /* 0x5C-0x5F */ + {0x7E, 0x7E}, {0x7E, 0x7F}, {0x7E, 0x80}, {0x7E, 0x81}, /* 0x60-0x63 */ + {0x7E, 0x83}, {0x7E, 0x84}, {0x7E, 0x85}, {0x7E, 0x86}, /* 0x64-0x67 */ + {0x7E, 0x87}, {0x7E, 0x88}, {0x7E, 0x89}, {0x7E, 0x8A}, /* 0x68-0x6B */ + {0x7E, 0x8B}, {0x7E, 0x8C}, {0x7E, 0x8D}, {0x7E, 0x8E}, /* 0x6C-0x6F */ + {0x7E, 0x8F}, {0x7E, 0x90}, {0x7E, 0x91}, {0x7E, 0x92}, /* 0x70-0x73 */ + {0x7E, 0x93}, {0x7E, 0x94}, {0x7E, 0x95}, {0x7E, 0x96}, /* 0x74-0x77 */ + {0x7E, 0x97}, {0x7E, 0x98}, {0x7E, 0x99}, {0x7E, 0x9A}, /* 0x78-0x7B */ + {0x7E, 0x9C}, {0x7E, 0x9D}, {0x7E, 0x9E}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7E, 0xAE}, {0x7E, 0xB4}, {0x7E, 0xBB}, {0x7E, 0xBC}, /* 0x80-0x83 */ + {0x7E, 0xD6}, {0x7E, 0xE4}, {0x7E, 0xEC}, {0x7E, 0xF9}, /* 0x84-0x87 */ + {0x7F, 0x0A}, {0x7F, 0x10}, {0x7F, 0x1E}, {0x7F, 0x37}, /* 0x88-0x8B */ + {0x7F, 0x39}, {0x7F, 0x3B}, {0x7F, 0x3C}, {0x7F, 0x3D}, /* 0x8C-0x8F */ + {0x7F, 0x3E}, {0x7F, 0x3F}, {0x7F, 0x40}, {0x7F, 0x41}, /* 0x90-0x93 */ + {0x7F, 0x43}, {0x7F, 0x46}, {0x7F, 0x47}, {0x7F, 0x48}, /* 0x94-0x97 */ + {0x7F, 0x49}, {0x7F, 0x4A}, {0x7F, 0x4B}, {0x7F, 0x4C}, /* 0x98-0x9B */ + {0x7F, 0x4D}, {0x7F, 0x4E}, {0x7F, 0x4F}, {0x7F, 0x52}, /* 0x9C-0x9F */ + {0x7F, 0x53}, {0x99, 0x88}, {0x61, 0x27}, {0x6E, 0x83}, /* 0xA0-0xA3 */ + {0x57, 0x64}, {0x66, 0x06}, {0x63, 0x46}, {0x56, 0xF0}, /* 0xA4-0xA7 */ + {0x62, 0xEC}, {0x62, 0x69}, {0x5E, 0xD3}, {0x96, 0x14}, /* 0xA8-0xAB */ + {0x57, 0x83}, {0x62, 0xC9}, {0x55, 0x87}, {0x87, 0x21}, /* 0xAC-0xAF */ + {0x81, 0x4A}, {0x8F, 0xA3}, {0x55, 0x66}, {0x83, 0xB1}, /* 0xB0-0xB3 */ + {0x67, 0x65}, {0x8D, 0x56}, {0x84, 0xDD}, {0x5A, 0x6A}, /* 0xB4-0xB7 */ + {0x68, 0x0F}, {0x62, 0xE6}, {0x7B, 0xEE}, {0x96, 0x11}, /* 0xB8-0xBB */ + {0x51, 0x70}, {0x6F, 0x9C}, {0x8C, 0x30}, {0x63, 0xFD}, /* 0xBC-0xBF */ + {0x89, 0xC8}, {0x61, 0xD2}, {0x7F, 0x06}, {0x70, 0xC2}, /* 0xC0-0xC3 */ + {0x6E, 0xE5}, {0x74, 0x05}, {0x69, 0x94}, {0x72, 0xFC}, /* 0xC4-0xC7 */ + {0x5E, 0xCA}, {0x90, 0xCE}, {0x67, 0x17}, {0x6D, 0x6A}, /* 0xC8-0xCB */ + {0x63, 0x5E}, {0x52, 0xB3}, {0x72, 0x62}, {0x80, 0x01}, /* 0xCC-0xCF */ + {0x4F, 0x6C}, {0x59, 0xE5}, {0x91, 0x6A}, {0x70, 0xD9}, /* 0xD0-0xD3 */ + {0x6D, 0x9D}, {0x52, 0xD2}, {0x4E, 0x50}, {0x96, 0xF7}, /* 0xD4-0xD7 */ + {0x95, 0x6D}, {0x85, 0x7E}, {0x78, 0xCA}, {0x7D, 0x2F}, /* 0xD8-0xDB */ + {0x51, 0x21}, {0x57, 0x92}, {0x64, 0xC2}, {0x80, 0x8B}, /* 0xDC-0xDF */ + {0x7C, 0x7B}, {0x6C, 0xEA}, {0x68, 0xF1}, {0x69, 0x5E}, /* 0xE0-0xE3 */ + {0x51, 0xB7}, {0x53, 0x98}, {0x68, 0xA8}, {0x72, 0x81}, /* 0xE4-0xE7 */ + {0x9E, 0xCE}, {0x7B, 0xF1}, {0x72, 0xF8}, {0x79, 0xBB}, /* 0xE8-0xEB */ + {0x6F, 0x13}, {0x74, 0x06}, {0x67, 0x4E}, {0x91, 0xCC}, /* 0xEC-0xEF */ + {0x9C, 0xA4}, {0x79, 0x3C}, {0x83, 0x89}, {0x83, 0x54}, /* 0xF0-0xF3 */ + {0x54, 0x0F}, {0x68, 0x17}, {0x4E, 0x3D}, {0x53, 0x89}, /* 0xF4-0xF7 */ + {0x52, 0xB1}, {0x78, 0x3E}, {0x53, 0x86}, {0x52, 0x29}, /* 0xF8-0xFB */ + {0x50, 0x88}, {0x4F, 0x8B}, {0x4F, 0xD0}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7F, 0x56}, {0x7F, 0x59}, {0x7F, 0x5B}, {0x7F, 0x5C}, /* 0x40-0x43 */ + {0x7F, 0x5D}, {0x7F, 0x5E}, {0x7F, 0x60}, {0x7F, 0x63}, /* 0x44-0x47 */ + {0x7F, 0x64}, {0x7F, 0x65}, {0x7F, 0x66}, {0x7F, 0x67}, /* 0x48-0x4B */ + {0x7F, 0x6B}, {0x7F, 0x6C}, {0x7F, 0x6D}, {0x7F, 0x6F}, /* 0x4C-0x4F */ + {0x7F, 0x70}, {0x7F, 0x73}, {0x7F, 0x75}, {0x7F, 0x76}, /* 0x50-0x53 */ + {0x7F, 0x77}, {0x7F, 0x78}, {0x7F, 0x7A}, {0x7F, 0x7B}, /* 0x54-0x57 */ + {0x7F, 0x7C}, {0x7F, 0x7D}, {0x7F, 0x7F}, {0x7F, 0x80}, /* 0x58-0x5B */ + {0x7F, 0x82}, {0x7F, 0x83}, {0x7F, 0x84}, {0x7F, 0x85}, /* 0x5C-0x5F */ + {0x7F, 0x86}, {0x7F, 0x87}, {0x7F, 0x88}, {0x7F, 0x89}, /* 0x60-0x63 */ + {0x7F, 0x8B}, {0x7F, 0x8D}, {0x7F, 0x8F}, {0x7F, 0x90}, /* 0x64-0x67 */ + {0x7F, 0x91}, {0x7F, 0x92}, {0x7F, 0x93}, {0x7F, 0x95}, /* 0x68-0x6B */ + {0x7F, 0x96}, {0x7F, 0x97}, {0x7F, 0x98}, {0x7F, 0x99}, /* 0x6C-0x6F */ + {0x7F, 0x9B}, {0x7F, 0x9C}, {0x7F, 0xA0}, {0x7F, 0xA2}, /* 0x70-0x73 */ + {0x7F, 0xA3}, {0x7F, 0xA5}, {0x7F, 0xA6}, {0x7F, 0xA8}, /* 0x74-0x77 */ + {0x7F, 0xA9}, {0x7F, 0xAA}, {0x7F, 0xAB}, {0x7F, 0xAC}, /* 0x78-0x7B */ + {0x7F, 0xAD}, {0x7F, 0xAE}, {0x7F, 0xB1}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x7F, 0xB3}, {0x7F, 0xB4}, {0x7F, 0xB5}, {0x7F, 0xB6}, /* 0x80-0x83 */ + {0x7F, 0xB7}, {0x7F, 0xBA}, {0x7F, 0xBB}, {0x7F, 0xBE}, /* 0x84-0x87 */ + {0x7F, 0xC0}, {0x7F, 0xC2}, {0x7F, 0xC3}, {0x7F, 0xC4}, /* 0x88-0x8B */ + {0x7F, 0xC6}, {0x7F, 0xC7}, {0x7F, 0xC8}, {0x7F, 0xC9}, /* 0x8C-0x8F */ + {0x7F, 0xCB}, {0x7F, 0xCD}, {0x7F, 0xCF}, {0x7F, 0xD0}, /* 0x90-0x93 */ + {0x7F, 0xD1}, {0x7F, 0xD2}, {0x7F, 0xD3}, {0x7F, 0xD6}, /* 0x94-0x97 */ + {0x7F, 0xD7}, {0x7F, 0xD9}, {0x7F, 0xDA}, {0x7F, 0xDB}, /* 0x98-0x9B */ + {0x7F, 0xDC}, {0x7F, 0xDD}, {0x7F, 0xDE}, {0x7F, 0xE2}, /* 0x9C-0x9F */ + {0x7F, 0xE3}, {0x75, 0xE2}, {0x7A, 0xCB}, {0x7C, 0x92}, /* 0xA0-0xA3 */ + {0x6C, 0xA5}, {0x96, 0xB6}, {0x52, 0x9B}, {0x74, 0x83}, /* 0xA4-0xA7 */ + {0x54, 0xE9}, {0x4F, 0xE9}, {0x80, 0x54}, {0x83, 0xB2}, /* 0xA8-0xAB */ + {0x8F, 0xDE}, {0x95, 0x70}, {0x5E, 0xC9}, {0x60, 0x1C}, /* 0xAC-0xAF */ + {0x6D, 0x9F}, {0x5E, 0x18}, {0x65, 0x5B}, {0x81, 0x38}, /* 0xB0-0xB3 */ + {0x94, 0xFE}, {0x60, 0x4B}, {0x70, 0xBC}, {0x7E, 0xC3}, /* 0xB4-0xB7 */ + {0x7C, 0xAE}, {0x51, 0xC9}, {0x68, 0x81}, {0x7C, 0xB1}, /* 0xB8-0xBB */ + {0x82, 0x6F}, {0x4E, 0x24}, {0x8F, 0x86}, {0x91, 0xCF}, /* 0xBC-0xBF */ + {0x66, 0x7E}, {0x4E, 0xAE}, {0x8C, 0x05}, {0x64, 0xA9}, /* 0xC0-0xC3 */ + {0x80, 0x4A}, {0x50, 0xDA}, {0x75, 0x97}, {0x71, 0xCE}, /* 0xC4-0xC7 */ + {0x5B, 0xE5}, {0x8F, 0xBD}, {0x6F, 0x66}, {0x4E, 0x86}, /* 0xC8-0xCB */ + {0x64, 0x82}, {0x95, 0x63}, {0x5E, 0xD6}, {0x65, 0x99}, /* 0xCC-0xCF */ + {0x52, 0x17}, {0x88, 0xC2}, {0x70, 0xC8}, {0x52, 0xA3}, /* 0xD0-0xD3 */ + {0x73, 0x0E}, {0x74, 0x33}, {0x67, 0x97}, {0x78, 0xF7}, /* 0xD4-0xD7 */ + {0x97, 0x16}, {0x4E, 0x34}, {0x90, 0xBB}, {0x9C, 0xDE}, /* 0xD8-0xDB */ + {0x6D, 0xCB}, {0x51, 0xDB}, {0x8D, 0x41}, {0x54, 0x1D}, /* 0xDC-0xDF */ + {0x62, 0xCE}, {0x73, 0xB2}, {0x83, 0xF1}, {0x96, 0xF6}, /* 0xE0-0xE3 */ + {0x9F, 0x84}, {0x94, 0xC3}, {0x4F, 0x36}, {0x7F, 0x9A}, /* 0xE4-0xE7 */ + {0x51, 0xCC}, {0x70, 0x75}, {0x96, 0x75}, {0x5C, 0xAD}, /* 0xE8-0xEB */ + {0x98, 0x86}, {0x53, 0xE6}, {0x4E, 0xE4}, {0x6E, 0x9C}, /* 0xEC-0xEF */ + {0x74, 0x09}, {0x69, 0xB4}, {0x78, 0x6B}, {0x99, 0x8F}, /* 0xF0-0xF3 */ + {0x75, 0x59}, {0x52, 0x18}, {0x76, 0x24}, {0x6D, 0x41}, /* 0xF4-0xF7 */ + {0x67, 0xF3}, {0x51, 0x6D}, {0x9F, 0x99}, {0x80, 0x4B}, /* 0xF8-0xFB */ + {0x54, 0x99}, {0x7B, 0x3C}, {0x7A, 0xBF}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7F, 0xE4}, {0x7F, 0xE7}, {0x7F, 0xE8}, {0x7F, 0xEA}, /* 0x40-0x43 */ + {0x7F, 0xEB}, {0x7F, 0xEC}, {0x7F, 0xED}, {0x7F, 0xEF}, /* 0x44-0x47 */ + {0x7F, 0xF2}, {0x7F, 0xF4}, {0x7F, 0xF5}, {0x7F, 0xF6}, /* 0x48-0x4B */ + {0x7F, 0xF7}, {0x7F, 0xF8}, {0x7F, 0xF9}, {0x7F, 0xFA}, /* 0x4C-0x4F */ + {0x7F, 0xFD}, {0x7F, 0xFE}, {0x7F, 0xFF}, {0x80, 0x02}, /* 0x50-0x53 */ + {0x80, 0x07}, {0x80, 0x08}, {0x80, 0x09}, {0x80, 0x0A}, /* 0x54-0x57 */ + {0x80, 0x0E}, {0x80, 0x0F}, {0x80, 0x11}, {0x80, 0x13}, /* 0x58-0x5B */ + {0x80, 0x1A}, {0x80, 0x1B}, {0x80, 0x1D}, {0x80, 0x1E}, /* 0x5C-0x5F */ + {0x80, 0x1F}, {0x80, 0x21}, {0x80, 0x23}, {0x80, 0x24}, /* 0x60-0x63 */ + {0x80, 0x2B}, {0x80, 0x2C}, {0x80, 0x2D}, {0x80, 0x2E}, /* 0x64-0x67 */ + {0x80, 0x2F}, {0x80, 0x30}, {0x80, 0x32}, {0x80, 0x34}, /* 0x68-0x6B */ + {0x80, 0x39}, {0x80, 0x3A}, {0x80, 0x3C}, {0x80, 0x3E}, /* 0x6C-0x6F */ + {0x80, 0x40}, {0x80, 0x41}, {0x80, 0x44}, {0x80, 0x45}, /* 0x70-0x73 */ + {0x80, 0x47}, {0x80, 0x48}, {0x80, 0x49}, {0x80, 0x4E}, /* 0x74-0x77 */ + {0x80, 0x4F}, {0x80, 0x50}, {0x80, 0x51}, {0x80, 0x53}, /* 0x78-0x7B */ + {0x80, 0x55}, {0x80, 0x56}, {0x80, 0x57}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x80, 0x59}, {0x80, 0x5B}, {0x80, 0x5C}, {0x80, 0x5D}, /* 0x80-0x83 */ + {0x80, 0x5E}, {0x80, 0x5F}, {0x80, 0x60}, {0x80, 0x61}, /* 0x84-0x87 */ + {0x80, 0x62}, {0x80, 0x63}, {0x80, 0x64}, {0x80, 0x65}, /* 0x88-0x8B */ + {0x80, 0x66}, {0x80, 0x67}, {0x80, 0x68}, {0x80, 0x6B}, /* 0x8C-0x8F */ + {0x80, 0x6C}, {0x80, 0x6D}, {0x80, 0x6E}, {0x80, 0x6F}, /* 0x90-0x93 */ + {0x80, 0x70}, {0x80, 0x72}, {0x80, 0x73}, {0x80, 0x74}, /* 0x94-0x97 */ + {0x80, 0x75}, {0x80, 0x76}, {0x80, 0x77}, {0x80, 0x78}, /* 0x98-0x9B */ + {0x80, 0x79}, {0x80, 0x7A}, {0x80, 0x7B}, {0x80, 0x7C}, /* 0x9C-0x9F */ + {0x80, 0x7D}, {0x96, 0x86}, {0x57, 0x84}, {0x62, 0xE2}, /* 0xA0-0xA3 */ + {0x96, 0x47}, {0x69, 0x7C}, {0x5A, 0x04}, {0x64, 0x02}, /* 0xA4-0xA7 */ + {0x7B, 0xD3}, {0x6F, 0x0F}, {0x96, 0x4B}, {0x82, 0xA6}, /* 0xA8-0xAB */ + {0x53, 0x62}, {0x98, 0x85}, {0x5E, 0x90}, {0x70, 0x89}, /* 0xAC-0xAF */ + {0x63, 0xB3}, {0x53, 0x64}, {0x86, 0x4F}, {0x9C, 0x81}, /* 0xB0-0xB3 */ + {0x9E, 0x93}, {0x78, 0x8C}, {0x97, 0x32}, {0x8D, 0xEF}, /* 0xB4-0xB7 */ + {0x8D, 0x42}, {0x9E, 0x7F}, {0x6F, 0x5E}, {0x79, 0x84}, /* 0xB8-0xBB */ + {0x5F, 0x55}, {0x96, 0x46}, {0x62, 0x2E}, {0x9A, 0x74}, /* 0xBC-0xBF */ + {0x54, 0x15}, {0x94, 0xDD}, {0x4F, 0xA3}, {0x65, 0xC5}, /* 0xC0-0xC3 */ + {0x5C, 0x65}, {0x5C, 0x61}, {0x7F, 0x15}, {0x86, 0x51}, /* 0xC4-0xC7 */ + {0x6C, 0x2F}, {0x5F, 0x8B}, {0x73, 0x87}, {0x6E, 0xE4}, /* 0xC8-0xCB */ + {0x7E, 0xFF}, {0x5C, 0xE6}, {0x63, 0x1B}, {0x5B, 0x6A}, /* 0xCC-0xCF */ + {0x6E, 0xE6}, {0x53, 0x75}, {0x4E, 0x71}, {0x63, 0xA0}, /* 0xD0-0xD3 */ + {0x75, 0x65}, {0x62, 0xA1}, {0x8F, 0x6E}, {0x4F, 0x26}, /* 0xD4-0xD7 */ + {0x4E, 0xD1}, {0x6C, 0xA6}, {0x7E, 0xB6}, {0x8B, 0xBA}, /* 0xD8-0xDB */ + {0x84, 0x1D}, {0x87, 0xBA}, {0x7F, 0x57}, {0x90, 0x3B}, /* 0xDC-0xDF */ + {0x95, 0x23}, {0x7B, 0xA9}, {0x9A, 0xA1}, {0x88, 0xF8}, /* 0xE0-0xE3 */ + {0x84, 0x3D}, {0x6D, 0x1B}, {0x9A, 0x86}, {0x7E, 0xDC}, /* 0xE4-0xE7 */ + {0x59, 0x88}, {0x9E, 0xBB}, {0x73, 0x9B}, {0x78, 0x01}, /* 0xE8-0xEB */ + {0x86, 0x82}, {0x9A, 0x6C}, {0x9A, 0x82}, {0x56, 0x1B}, /* 0xEC-0xEF */ + {0x54, 0x17}, {0x57, 0xCB}, {0x4E, 0x70}, {0x9E, 0xA6}, /* 0xF0-0xF3 */ + {0x53, 0x56}, {0x8F, 0xC8}, {0x81, 0x09}, {0x77, 0x92}, /* 0xF4-0xF7 */ + {0x99, 0x92}, {0x86, 0xEE}, {0x6E, 0xE1}, {0x85, 0x13}, /* 0xF8-0xFB */ + {0x66, 0xFC}, {0x61, 0x62}, {0x6F, 0x2B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x80, 0x7E}, {0x80, 0x81}, {0x80, 0x82}, {0x80, 0x85}, /* 0x40-0x43 */ + {0x80, 0x88}, {0x80, 0x8A}, {0x80, 0x8D}, {0x80, 0x8E}, /* 0x44-0x47 */ + {0x80, 0x8F}, {0x80, 0x90}, {0x80, 0x91}, {0x80, 0x92}, /* 0x48-0x4B */ + {0x80, 0x94}, {0x80, 0x95}, {0x80, 0x97}, {0x80, 0x99}, /* 0x4C-0x4F */ + {0x80, 0x9E}, {0x80, 0xA3}, {0x80, 0xA6}, {0x80, 0xA7}, /* 0x50-0x53 */ + {0x80, 0xA8}, {0x80, 0xAC}, {0x80, 0xB0}, {0x80, 0xB3}, /* 0x54-0x57 */ + {0x80, 0xB5}, {0x80, 0xB6}, {0x80, 0xB8}, {0x80, 0xB9}, /* 0x58-0x5B */ + {0x80, 0xBB}, {0x80, 0xC5}, {0x80, 0xC7}, {0x80, 0xC8}, /* 0x5C-0x5F */ + {0x80, 0xC9}, {0x80, 0xCA}, {0x80, 0xCB}, {0x80, 0xCF}, /* 0x60-0x63 */ + {0x80, 0xD0}, {0x80, 0xD1}, {0x80, 0xD2}, {0x80, 0xD3}, /* 0x64-0x67 */ + {0x80, 0xD4}, {0x80, 0xD5}, {0x80, 0xD8}, {0x80, 0xDF}, /* 0x68-0x6B */ + {0x80, 0xE0}, {0x80, 0xE2}, {0x80, 0xE3}, {0x80, 0xE6}, /* 0x6C-0x6F */ + {0x80, 0xEE}, {0x80, 0xF5}, {0x80, 0xF7}, {0x80, 0xF9}, /* 0x70-0x73 */ + {0x80, 0xFB}, {0x80, 0xFE}, {0x80, 0xFF}, {0x81, 0x00}, /* 0x74-0x77 */ + {0x81, 0x01}, {0x81, 0x03}, {0x81, 0x04}, {0x81, 0x05}, /* 0x78-0x7B */ + {0x81, 0x07}, {0x81, 0x08}, {0x81, 0x0B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x81, 0x0C}, {0x81, 0x15}, {0x81, 0x17}, {0x81, 0x19}, /* 0x80-0x83 */ + {0x81, 0x1B}, {0x81, 0x1C}, {0x81, 0x1D}, {0x81, 0x1F}, /* 0x84-0x87 */ + {0x81, 0x20}, {0x81, 0x21}, {0x81, 0x22}, {0x81, 0x23}, /* 0x88-0x8B */ + {0x81, 0x24}, {0x81, 0x25}, {0x81, 0x26}, {0x81, 0x27}, /* 0x8C-0x8F */ + {0x81, 0x28}, {0x81, 0x29}, {0x81, 0x2A}, {0x81, 0x2B}, /* 0x90-0x93 */ + {0x81, 0x2D}, {0x81, 0x2E}, {0x81, 0x30}, {0x81, 0x33}, /* 0x94-0x97 */ + {0x81, 0x34}, {0x81, 0x35}, {0x81, 0x37}, {0x81, 0x39}, /* 0x98-0x9B */ + {0x81, 0x3A}, {0x81, 0x3B}, {0x81, 0x3C}, {0x81, 0x3D}, /* 0x9C-0x9F */ + {0x81, 0x3F}, {0x8C, 0x29}, {0x82, 0x92}, {0x83, 0x2B}, /* 0xA0-0xA3 */ + {0x76, 0xF2}, {0x6C, 0x13}, {0x5F, 0xD9}, {0x83, 0xBD}, /* 0xA4-0xA7 */ + {0x73, 0x2B}, {0x83, 0x05}, {0x95, 0x1A}, {0x6B, 0xDB}, /* 0xA8-0xAB */ + {0x77, 0xDB}, {0x94, 0xC6}, {0x53, 0x6F}, {0x83, 0x02}, /* 0xAC-0xAF */ + {0x51, 0x92}, {0x5E, 0x3D}, {0x8C, 0x8C}, {0x8D, 0x38}, /* 0xB0-0xB3 */ + {0x4E, 0x48}, {0x73, 0xAB}, {0x67, 0x9A}, {0x68, 0x85}, /* 0xB4-0xB7 */ + {0x91, 0x76}, {0x97, 0x09}, {0x71, 0x64}, {0x6C, 0xA1}, /* 0xB8-0xBB */ + {0x77, 0x09}, {0x5A, 0x92}, {0x95, 0x41}, {0x6B, 0xCF}, /* 0xBC-0xBF */ + {0x7F, 0x8E}, {0x66, 0x27}, {0x5B, 0xD0}, {0x59, 0xB9}, /* 0xC0-0xC3 */ + {0x5A, 0x9A}, {0x95, 0xE8}, {0x95, 0xF7}, {0x4E, 0xEC}, /* 0xC4-0xC7 */ + {0x84, 0x0C}, {0x84, 0x99}, {0x6A, 0xAC}, {0x76, 0xDF}, /* 0xC8-0xCB */ + {0x95, 0x30}, {0x73, 0x1B}, {0x68, 0xA6}, {0x5B, 0x5F}, /* 0xCC-0xCF */ + {0x77, 0x2F}, {0x91, 0x9A}, {0x97, 0x61}, {0x7C, 0xDC}, /* 0xD0-0xD3 */ + {0x8F, 0xF7}, {0x8C, 0x1C}, {0x5F, 0x25}, {0x7C, 0x73}, /* 0xD4-0xD7 */ + {0x79, 0xD8}, {0x89, 0xC5}, {0x6C, 0xCC}, {0x87, 0x1C}, /* 0xD8-0xDB */ + {0x5B, 0xC6}, {0x5E, 0x42}, {0x68, 0xC9}, {0x77, 0x20}, /* 0xDC-0xDF */ + {0x7E, 0xF5}, {0x51, 0x95}, {0x51, 0x4D}, {0x52, 0xC9}, /* 0xE0-0xE3 */ + {0x5A, 0x29}, {0x7F, 0x05}, {0x97, 0x62}, {0x82, 0xD7}, /* 0xE4-0xE7 */ + {0x63, 0xCF}, {0x77, 0x84}, {0x85, 0xD0}, {0x79, 0xD2}, /* 0xE8-0xEB */ + {0x6E, 0x3A}, {0x5E, 0x99}, {0x59, 0x99}, {0x85, 0x11}, /* 0xEC-0xEF */ + {0x70, 0x6D}, {0x6C, 0x11}, {0x62, 0xBF}, {0x76, 0xBF}, /* 0xF0-0xF3 */ + {0x65, 0x4F}, {0x60, 0xAF}, {0x95, 0xFD}, {0x66, 0x0E}, /* 0xF4-0xF7 */ + {0x87, 0x9F}, {0x9E, 0x23}, {0x94, 0xED}, {0x54, 0x0D}, /* 0xF8-0xFB */ + {0x54, 0x7D}, {0x8C, 0x2C}, {0x64, 0x78}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x81, 0x40}, {0x81, 0x41}, {0x81, 0x42}, {0x81, 0x43}, /* 0x40-0x43 */ + {0x81, 0x44}, {0x81, 0x45}, {0x81, 0x47}, {0x81, 0x49}, /* 0x44-0x47 */ + {0x81, 0x4D}, {0x81, 0x4E}, {0x81, 0x4F}, {0x81, 0x52}, /* 0x48-0x4B */ + {0x81, 0x56}, {0x81, 0x57}, {0x81, 0x58}, {0x81, 0x5B}, /* 0x4C-0x4F */ + {0x81, 0x5C}, {0x81, 0x5D}, {0x81, 0x5E}, {0x81, 0x5F}, /* 0x50-0x53 */ + {0x81, 0x61}, {0x81, 0x62}, {0x81, 0x63}, {0x81, 0x64}, /* 0x54-0x57 */ + {0x81, 0x66}, {0x81, 0x68}, {0x81, 0x6A}, {0x81, 0x6B}, /* 0x58-0x5B */ + {0x81, 0x6C}, {0x81, 0x6F}, {0x81, 0x72}, {0x81, 0x73}, /* 0x5C-0x5F */ + {0x81, 0x75}, {0x81, 0x76}, {0x81, 0x77}, {0x81, 0x78}, /* 0x60-0x63 */ + {0x81, 0x81}, {0x81, 0x83}, {0x81, 0x84}, {0x81, 0x85}, /* 0x64-0x67 */ + {0x81, 0x86}, {0x81, 0x87}, {0x81, 0x89}, {0x81, 0x8B}, /* 0x68-0x6B */ + {0x81, 0x8C}, {0x81, 0x8D}, {0x81, 0x8E}, {0x81, 0x90}, /* 0x6C-0x6F */ + {0x81, 0x92}, {0x81, 0x93}, {0x81, 0x94}, {0x81, 0x95}, /* 0x70-0x73 */ + {0x81, 0x96}, {0x81, 0x97}, {0x81, 0x99}, {0x81, 0x9A}, /* 0x74-0x77 */ + {0x81, 0x9E}, {0x81, 0x9F}, {0x81, 0xA0}, {0x81, 0xA1}, /* 0x78-0x7B */ + {0x81, 0xA2}, {0x81, 0xA4}, {0x81, 0xA5}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x81, 0xA7}, {0x81, 0xA9}, {0x81, 0xAB}, {0x81, 0xAC}, /* 0x80-0x83 */ + {0x81, 0xAD}, {0x81, 0xAE}, {0x81, 0xAF}, {0x81, 0xB0}, /* 0x84-0x87 */ + {0x81, 0xB1}, {0x81, 0xB2}, {0x81, 0xB4}, {0x81, 0xB5}, /* 0x88-0x8B */ + {0x81, 0xB6}, {0x81, 0xB7}, {0x81, 0xB8}, {0x81, 0xB9}, /* 0x8C-0x8F */ + {0x81, 0xBC}, {0x81, 0xBD}, {0x81, 0xBE}, {0x81, 0xBF}, /* 0x90-0x93 */ + {0x81, 0xC4}, {0x81, 0xC5}, {0x81, 0xC7}, {0x81, 0xC8}, /* 0x94-0x97 */ + {0x81, 0xC9}, {0x81, 0xCB}, {0x81, 0xCD}, {0x81, 0xCE}, /* 0x98-0x9B */ + {0x81, 0xCF}, {0x81, 0xD0}, {0x81, 0xD1}, {0x81, 0xD2}, /* 0x9C-0x9F */ + {0x81, 0xD3}, {0x64, 0x79}, {0x86, 0x11}, {0x6A, 0x21}, /* 0xA0-0xA3 */ + {0x81, 0x9C}, {0x78, 0xE8}, {0x64, 0x69}, {0x9B, 0x54}, /* 0xA4-0xA7 */ + {0x62, 0xB9}, {0x67, 0x2B}, {0x83, 0xAB}, {0x58, 0xA8}, /* 0xA8-0xAB */ + {0x9E, 0xD8}, {0x6C, 0xAB}, {0x6F, 0x20}, {0x5B, 0xDE}, /* 0xAC-0xAF */ + {0x96, 0x4C}, {0x8C, 0x0B}, {0x72, 0x5F}, {0x67, 0xD0}, /* 0xB0-0xB3 */ + {0x62, 0xC7}, {0x72, 0x61}, {0x4E, 0xA9}, {0x59, 0xC6}, /* 0xB4-0xB7 */ + {0x6B, 0xCD}, {0x58, 0x93}, {0x66, 0xAE}, {0x5E, 0x55}, /* 0xB8-0xBB */ + {0x52, 0xDF}, {0x61, 0x55}, {0x67, 0x28}, {0x76, 0xEE}, /* 0xBC-0xBF */ + {0x77, 0x66}, {0x72, 0x67}, {0x7A, 0x46}, {0x62, 0xFF}, /* 0xC0-0xC3 */ + {0x54, 0xEA}, {0x54, 0x50}, {0x94, 0xA0}, {0x90, 0xA3}, /* 0xC4-0xC7 */ + {0x5A, 0x1C}, {0x7E, 0xB3}, {0x6C, 0x16}, {0x4E, 0x43}, /* 0xC8-0xCB */ + {0x59, 0x76}, {0x80, 0x10}, {0x59, 0x48}, {0x53, 0x57}, /* 0xCC-0xCF */ + {0x75, 0x37}, {0x96, 0xBE}, {0x56, 0xCA}, {0x63, 0x20}, /* 0xD0-0xD3 */ + {0x81, 0x11}, {0x60, 0x7C}, {0x95, 0xF9}, {0x6D, 0xD6}, /* 0xD4-0xD7 */ + {0x54, 0x62}, {0x99, 0x81}, {0x51, 0x85}, {0x5A, 0xE9}, /* 0xD8-0xDB */ + {0x80, 0xFD}, {0x59, 0xAE}, {0x97, 0x13}, {0x50, 0x2A}, /* 0xDC-0xDF */ + {0x6C, 0xE5}, {0x5C, 0x3C}, {0x62, 0xDF}, {0x4F, 0x60}, /* 0xE0-0xE3 */ + {0x53, 0x3F}, {0x81, 0x7B}, {0x90, 0x06}, {0x6E, 0xBA}, /* 0xE4-0xE7 */ + {0x85, 0x2B}, {0x62, 0xC8}, {0x5E, 0x74}, {0x78, 0xBE}, /* 0xE8-0xEB */ + {0x64, 0xB5}, {0x63, 0x7B}, {0x5F, 0xF5}, {0x5A, 0x18}, /* 0xEC-0xEF */ + {0x91, 0x7F}, {0x9E, 0x1F}, {0x5C, 0x3F}, {0x63, 0x4F}, /* 0xF0-0xF3 */ + {0x80, 0x42}, {0x5B, 0x7D}, {0x55, 0x6E}, {0x95, 0x4A}, /* 0xF4-0xF7 */ + {0x95, 0x4D}, {0x6D, 0x85}, {0x60, 0xA8}, {0x67, 0xE0}, /* 0xF8-0xFB */ + {0x72, 0xDE}, {0x51, 0xDD}, {0x5B, 0x81}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x81, 0xD4}, {0x81, 0xD5}, {0x81, 0xD6}, {0x81, 0xD7}, /* 0x40-0x43 */ + {0x81, 0xD8}, {0x81, 0xD9}, {0x81, 0xDA}, {0x81, 0xDB}, /* 0x44-0x47 */ + {0x81, 0xDC}, {0x81, 0xDD}, {0x81, 0xDE}, {0x81, 0xDF}, /* 0x48-0x4B */ + {0x81, 0xE0}, {0x81, 0xE1}, {0x81, 0xE2}, {0x81, 0xE4}, /* 0x4C-0x4F */ + {0x81, 0xE5}, {0x81, 0xE6}, {0x81, 0xE8}, {0x81, 0xE9}, /* 0x50-0x53 */ + {0x81, 0xEB}, {0x81, 0xEE}, {0x81, 0xEF}, {0x81, 0xF0}, /* 0x54-0x57 */ + {0x81, 0xF1}, {0x81, 0xF2}, {0x81, 0xF5}, {0x81, 0xF6}, /* 0x58-0x5B */ + {0x81, 0xF7}, {0x81, 0xF8}, {0x81, 0xF9}, {0x81, 0xFA}, /* 0x5C-0x5F */ + {0x81, 0xFD}, {0x81, 0xFF}, {0x82, 0x03}, {0x82, 0x07}, /* 0x60-0x63 */ + {0x82, 0x08}, {0x82, 0x09}, {0x82, 0x0A}, {0x82, 0x0B}, /* 0x64-0x67 */ + {0x82, 0x0E}, {0x82, 0x0F}, {0x82, 0x11}, {0x82, 0x13}, /* 0x68-0x6B */ + {0x82, 0x15}, {0x82, 0x16}, {0x82, 0x17}, {0x82, 0x18}, /* 0x6C-0x6F */ + {0x82, 0x19}, {0x82, 0x1A}, {0x82, 0x1D}, {0x82, 0x20}, /* 0x70-0x73 */ + {0x82, 0x24}, {0x82, 0x25}, {0x82, 0x26}, {0x82, 0x27}, /* 0x74-0x77 */ + {0x82, 0x29}, {0x82, 0x2E}, {0x82, 0x32}, {0x82, 0x3A}, /* 0x78-0x7B */ + {0x82, 0x3C}, {0x82, 0x3D}, {0x82, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x82, 0x40}, {0x82, 0x41}, {0x82, 0x42}, {0x82, 0x43}, /* 0x80-0x83 */ + {0x82, 0x45}, {0x82, 0x46}, {0x82, 0x48}, {0x82, 0x4A}, /* 0x84-0x87 */ + {0x82, 0x4C}, {0x82, 0x4D}, {0x82, 0x4E}, {0x82, 0x50}, /* 0x88-0x8B */ + {0x82, 0x51}, {0x82, 0x52}, {0x82, 0x53}, {0x82, 0x54}, /* 0x8C-0x8F */ + {0x82, 0x55}, {0x82, 0x56}, {0x82, 0x57}, {0x82, 0x59}, /* 0x90-0x93 */ + {0x82, 0x5B}, {0x82, 0x5C}, {0x82, 0x5D}, {0x82, 0x5E}, /* 0x94-0x97 */ + {0x82, 0x60}, {0x82, 0x61}, {0x82, 0x62}, {0x82, 0x63}, /* 0x98-0x9B */ + {0x82, 0x64}, {0x82, 0x65}, {0x82, 0x66}, {0x82, 0x67}, /* 0x9C-0x9F */ + {0x82, 0x69}, {0x62, 0xE7}, {0x6C, 0xDE}, {0x72, 0x5B}, /* 0xA0-0xA3 */ + {0x62, 0x6D}, {0x94, 0xAE}, {0x7E, 0xBD}, {0x81, 0x13}, /* 0xA4-0xA7 */ + {0x6D, 0x53}, {0x51, 0x9C}, {0x5F, 0x04}, {0x59, 0x74}, /* 0xA8-0xAB */ + {0x52, 0xAA}, {0x60, 0x12}, {0x59, 0x73}, {0x66, 0x96}, /* 0xAC-0xAF */ + {0x86, 0x50}, {0x75, 0x9F}, {0x63, 0x2A}, {0x61, 0xE6}, /* 0xB0-0xB3 */ + {0x7C, 0xEF}, {0x8B, 0xFA}, {0x54, 0xE6}, {0x6B, 0x27}, /* 0xB4-0xB7 */ + {0x9E, 0x25}, {0x6B, 0xB4}, {0x85, 0xD5}, {0x54, 0x55}, /* 0xB8-0xBB */ + {0x50, 0x76}, {0x6C, 0xA4}, {0x55, 0x6A}, {0x8D, 0xB4}, /* 0xBC-0xBF */ + {0x72, 0x2C}, {0x5E, 0x15}, {0x60, 0x15}, {0x74, 0x36}, /* 0xC0-0xC3 */ + {0x62, 0xCD}, {0x63, 0x92}, {0x72, 0x4C}, {0x5F, 0x98}, /* 0xC4-0xC7 */ + {0x6E, 0x43}, {0x6D, 0x3E}, {0x65, 0x00}, {0x6F, 0x58}, /* 0xC8-0xCB */ + {0x76, 0xD8}, {0x78, 0xD0}, {0x76, 0xFC}, {0x75, 0x54}, /* 0xCC-0xCF */ + {0x52, 0x24}, {0x53, 0xDB}, {0x4E, 0x53}, {0x5E, 0x9E}, /* 0xD0-0xD3 */ + {0x65, 0xC1}, {0x80, 0x2A}, {0x80, 0xD6}, {0x62, 0x9B}, /* 0xD4-0xD7 */ + {0x54, 0x86}, {0x52, 0x28}, {0x70, 0xAE}, {0x88, 0x8D}, /* 0xD8-0xDB */ + {0x8D, 0xD1}, {0x6C, 0xE1}, {0x54, 0x78}, {0x80, 0xDA}, /* 0xDC-0xDF */ + {0x57, 0xF9}, {0x88, 0xF4}, {0x8D, 0x54}, {0x96, 0x6A}, /* 0xE0-0xE3 */ + {0x91, 0x4D}, {0x4F, 0x69}, {0x6C, 0x9B}, {0x55, 0xB7}, /* 0xE4-0xE7 */ + {0x76, 0xC6}, {0x78, 0x30}, {0x62, 0xA8}, {0x70, 0xF9}, /* 0xE8-0xEB */ + {0x6F, 0x8E}, {0x5F, 0x6D}, {0x84, 0xEC}, {0x68, 0xDA}, /* 0xEC-0xEF */ + {0x78, 0x7C}, {0x7B, 0xF7}, {0x81, 0xA8}, {0x67, 0x0B}, /* 0xF0-0xF3 */ + {0x9E, 0x4F}, {0x63, 0x67}, {0x78, 0xB0}, {0x57, 0x6F}, /* 0xF4-0xF7 */ + {0x78, 0x12}, {0x97, 0x39}, {0x62, 0x79}, {0x62, 0xAB}, /* 0xF8-0xFB */ + {0x52, 0x88}, {0x74, 0x35}, {0x6B, 0xD7}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x82, 0x6A}, {0x82, 0x6B}, {0x82, 0x6C}, {0x82, 0x6D}, /* 0x40-0x43 */ + {0x82, 0x71}, {0x82, 0x75}, {0x82, 0x76}, {0x82, 0x77}, /* 0x44-0x47 */ + {0x82, 0x78}, {0x82, 0x7B}, {0x82, 0x7C}, {0x82, 0x80}, /* 0x48-0x4B */ + {0x82, 0x81}, {0x82, 0x83}, {0x82, 0x85}, {0x82, 0x86}, /* 0x4C-0x4F */ + {0x82, 0x87}, {0x82, 0x89}, {0x82, 0x8C}, {0x82, 0x90}, /* 0x50-0x53 */ + {0x82, 0x93}, {0x82, 0x94}, {0x82, 0x95}, {0x82, 0x96}, /* 0x54-0x57 */ + {0x82, 0x9A}, {0x82, 0x9B}, {0x82, 0x9E}, {0x82, 0xA0}, /* 0x58-0x5B */ + {0x82, 0xA2}, {0x82, 0xA3}, {0x82, 0xA7}, {0x82, 0xB2}, /* 0x5C-0x5F */ + {0x82, 0xB5}, {0x82, 0xB6}, {0x82, 0xBA}, {0x82, 0xBB}, /* 0x60-0x63 */ + {0x82, 0xBC}, {0x82, 0xBF}, {0x82, 0xC0}, {0x82, 0xC2}, /* 0x64-0x67 */ + {0x82, 0xC3}, {0x82, 0xC5}, {0x82, 0xC6}, {0x82, 0xC9}, /* 0x68-0x6B */ + {0x82, 0xD0}, {0x82, 0xD6}, {0x82, 0xD9}, {0x82, 0xDA}, /* 0x6C-0x6F */ + {0x82, 0xDD}, {0x82, 0xE2}, {0x82, 0xE7}, {0x82, 0xE8}, /* 0x70-0x73 */ + {0x82, 0xE9}, {0x82, 0xEA}, {0x82, 0xEC}, {0x82, 0xED}, /* 0x74-0x77 */ + {0x82, 0xEE}, {0x82, 0xF0}, {0x82, 0xF2}, {0x82, 0xF3}, /* 0x78-0x7B */ + {0x82, 0xF5}, {0x82, 0xF6}, {0x82, 0xF8}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x82, 0xFA}, {0x82, 0xFC}, {0x82, 0xFD}, {0x82, 0xFE}, /* 0x80-0x83 */ + {0x82, 0xFF}, {0x83, 0x00}, {0x83, 0x0A}, {0x83, 0x0B}, /* 0x84-0x87 */ + {0x83, 0x0D}, {0x83, 0x10}, {0x83, 0x12}, {0x83, 0x13}, /* 0x88-0x8B */ + {0x83, 0x16}, {0x83, 0x18}, {0x83, 0x19}, {0x83, 0x1D}, /* 0x8C-0x8F */ + {0x83, 0x1E}, {0x83, 0x1F}, {0x83, 0x20}, {0x83, 0x21}, /* 0x90-0x93 */ + {0x83, 0x22}, {0x83, 0x23}, {0x83, 0x24}, {0x83, 0x25}, /* 0x94-0x97 */ + {0x83, 0x26}, {0x83, 0x29}, {0x83, 0x2A}, {0x83, 0x2E}, /* 0x98-0x9B */ + {0x83, 0x30}, {0x83, 0x32}, {0x83, 0x37}, {0x83, 0x3B}, /* 0x9C-0x9F */ + {0x83, 0x3D}, {0x55, 0x64}, {0x81, 0x3E}, {0x75, 0xB2}, /* 0xA0-0xA3 */ + {0x76, 0xAE}, {0x53, 0x39}, {0x75, 0xDE}, {0x50, 0xFB}, /* 0xA4-0xA7 */ + {0x5C, 0x41}, {0x8B, 0x6C}, {0x7B, 0xC7}, {0x50, 0x4F}, /* 0xA8-0xAB */ + {0x72, 0x47}, {0x9A, 0x97}, {0x98, 0xD8}, {0x6F, 0x02}, /* 0xAC-0xAF */ + {0x74, 0xE2}, {0x79, 0x68}, {0x64, 0x87}, {0x77, 0xA5}, /* 0xB0-0xB3 */ + {0x62, 0xFC}, {0x98, 0x91}, {0x8D, 0x2B}, {0x54, 0xC1}, /* 0xB4-0xB7 */ + {0x80, 0x58}, {0x4E, 0x52}, {0x57, 0x6A}, {0x82, 0xF9}, /* 0xB8-0xBB */ + {0x84, 0x0D}, {0x5E, 0x73}, {0x51, 0xED}, {0x74, 0xF6}, /* 0xBC-0xBF */ + {0x8B, 0xC4}, {0x5C, 0x4F}, {0x57, 0x61}, {0x6C, 0xFC}, /* 0xC0-0xC3 */ + {0x98, 0x87}, {0x5A, 0x46}, {0x78, 0x34}, {0x9B, 0x44}, /* 0xC4-0xC7 */ + {0x8F, 0xEB}, {0x7C, 0x95}, {0x52, 0x56}, {0x62, 0x51}, /* 0xC8-0xCB */ + {0x94, 0xFA}, {0x4E, 0xC6}, {0x83, 0x86}, {0x84, 0x61}, /* 0xCC-0xCF */ + {0x83, 0xE9}, {0x84, 0xB2}, {0x57, 0xD4}, {0x67, 0x34}, /* 0xD0-0xD3 */ + {0x57, 0x03}, {0x66, 0x6E}, {0x6D, 0x66}, {0x8C, 0x31}, /* 0xD4-0xD7 */ + {0x66, 0xDD}, {0x70, 0x11}, {0x67, 0x1F}, {0x6B, 0x3A}, /* 0xD8-0xDB */ + {0x68, 0x16}, {0x62, 0x1A}, {0x59, 0xBB}, {0x4E, 0x03}, /* 0xDC-0xDF */ + {0x51, 0xC4}, {0x6F, 0x06}, {0x67, 0xD2}, {0x6C, 0x8F}, /* 0xE0-0xE3 */ + {0x51, 0x76}, {0x68, 0xCB}, {0x59, 0x47}, {0x6B, 0x67}, /* 0xE4-0xE7 */ + {0x75, 0x66}, {0x5D, 0x0E}, {0x81, 0x10}, {0x9F, 0x50}, /* 0xE8-0xEB */ + {0x65, 0xD7}, {0x79, 0x48}, {0x79, 0x41}, {0x9A, 0x91}, /* 0xEC-0xEF */ + {0x8D, 0x77}, {0x5C, 0x82}, {0x4E, 0x5E}, {0x4F, 0x01}, /* 0xF0-0xF3 */ + {0x54, 0x2F}, {0x59, 0x51}, {0x78, 0x0C}, {0x56, 0x68}, /* 0xF4-0xF7 */ + {0x6C, 0x14}, {0x8F, 0xC4}, {0x5F, 0x03}, {0x6C, 0x7D}, /* 0xF8-0xFB */ + {0x6C, 0xE3}, {0x8B, 0xAB}, {0x63, 0x90}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x83, 0x3E}, {0x83, 0x3F}, {0x83, 0x41}, {0x83, 0x42}, /* 0x40-0x43 */ + {0x83, 0x44}, {0x83, 0x45}, {0x83, 0x48}, {0x83, 0x4A}, /* 0x44-0x47 */ + {0x83, 0x4B}, {0x83, 0x4C}, {0x83, 0x4D}, {0x83, 0x4E}, /* 0x48-0x4B */ + {0x83, 0x53}, {0x83, 0x55}, {0x83, 0x56}, {0x83, 0x57}, /* 0x4C-0x4F */ + {0x83, 0x58}, {0x83, 0x59}, {0x83, 0x5D}, {0x83, 0x62}, /* 0x50-0x53 */ + {0x83, 0x70}, {0x83, 0x71}, {0x83, 0x72}, {0x83, 0x73}, /* 0x54-0x57 */ + {0x83, 0x74}, {0x83, 0x75}, {0x83, 0x76}, {0x83, 0x79}, /* 0x58-0x5B */ + {0x83, 0x7A}, {0x83, 0x7E}, {0x83, 0x7F}, {0x83, 0x80}, /* 0x5C-0x5F */ + {0x83, 0x81}, {0x83, 0x82}, {0x83, 0x83}, {0x83, 0x84}, /* 0x60-0x63 */ + {0x83, 0x87}, {0x83, 0x88}, {0x83, 0x8A}, {0x83, 0x8B}, /* 0x64-0x67 */ + {0x83, 0x8C}, {0x83, 0x8D}, {0x83, 0x8F}, {0x83, 0x90}, /* 0x68-0x6B */ + {0x83, 0x91}, {0x83, 0x94}, {0x83, 0x95}, {0x83, 0x96}, /* 0x6C-0x6F */ + {0x83, 0x97}, {0x83, 0x99}, {0x83, 0x9A}, {0x83, 0x9D}, /* 0x70-0x73 */ + {0x83, 0x9F}, {0x83, 0xA1}, {0x83, 0xA2}, {0x83, 0xA3}, /* 0x74-0x77 */ + {0x83, 0xA4}, {0x83, 0xA5}, {0x83, 0xA6}, {0x83, 0xA7}, /* 0x78-0x7B */ + {0x83, 0xAC}, {0x83, 0xAD}, {0x83, 0xAE}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x83, 0xAF}, {0x83, 0xB5}, {0x83, 0xBB}, {0x83, 0xBE}, /* 0x80-0x83 */ + {0x83, 0xBF}, {0x83, 0xC2}, {0x83, 0xC3}, {0x83, 0xC4}, /* 0x84-0x87 */ + {0x83, 0xC6}, {0x83, 0xC8}, {0x83, 0xC9}, {0x83, 0xCB}, /* 0x88-0x8B */ + {0x83, 0xCD}, {0x83, 0xCE}, {0x83, 0xD0}, {0x83, 0xD1}, /* 0x8C-0x8F */ + {0x83, 0xD2}, {0x83, 0xD3}, {0x83, 0xD5}, {0x83, 0xD7}, /* 0x90-0x93 */ + {0x83, 0xD9}, {0x83, 0xDA}, {0x83, 0xDB}, {0x83, 0xDE}, /* 0x94-0x97 */ + {0x83, 0xE2}, {0x83, 0xE3}, {0x83, 0xE4}, {0x83, 0xE6}, /* 0x98-0x9B */ + {0x83, 0xE7}, {0x83, 0xE8}, {0x83, 0xEB}, {0x83, 0xEC}, /* 0x9C-0x9F */ + {0x83, 0xED}, {0x60, 0x70}, {0x6D, 0x3D}, {0x72, 0x75}, /* 0xA0-0xA3 */ + {0x62, 0x66}, {0x94, 0x8E}, {0x94, 0xC5}, {0x53, 0x43}, /* 0xA4-0xA7 */ + {0x8F, 0xC1}, {0x7B, 0x7E}, {0x4E, 0xDF}, {0x8C, 0x26}, /* 0xA8-0xAB */ + {0x4E, 0x7E}, {0x9E, 0xD4}, {0x94, 0xB1}, {0x94, 0xB3}, /* 0xAC-0xAF */ + {0x52, 0x4D}, {0x6F, 0x5C}, {0x90, 0x63}, {0x6D, 0x45}, /* 0xB0-0xB3 */ + {0x8C, 0x34}, {0x58, 0x11}, {0x5D, 0x4C}, {0x6B, 0x20}, /* 0xB4-0xB7 */ + {0x6B, 0x49}, {0x67, 0xAA}, {0x54, 0x5B}, {0x81, 0x54}, /* 0xB8-0xBB */ + {0x7F, 0x8C}, {0x58, 0x99}, {0x85, 0x37}, {0x5F, 0x3A}, /* 0xBC-0xBF */ + {0x62, 0xA2}, {0x6A, 0x47}, {0x95, 0x39}, {0x65, 0x72}, /* 0xC0-0xC3 */ + {0x60, 0x84}, {0x68, 0x65}, {0x77, 0xA7}, {0x4E, 0x54}, /* 0xC4-0xC7 */ + {0x4F, 0xA8}, {0x5D, 0xE7}, {0x97, 0x98}, {0x64, 0xAC}, /* 0xC8-0xCB */ + {0x7F, 0xD8}, {0x5C, 0xED}, {0x4F, 0xCF}, {0x7A, 0x8D}, /* 0xCC-0xCF */ + {0x52, 0x07}, {0x83, 0x04}, {0x4E, 0x14}, {0x60, 0x2F}, /* 0xD0-0xD3 */ + {0x7A, 0x83}, {0x94, 0xA6}, {0x4F, 0xB5}, {0x4E, 0xB2}, /* 0xD4-0xD7 */ + {0x79, 0xE6}, {0x74, 0x34}, {0x52, 0xE4}, {0x82, 0xB9}, /* 0xD8-0xDB */ + {0x64, 0xD2}, {0x79, 0xBD}, {0x5B, 0xDD}, {0x6C, 0x81}, /* 0xDC-0xDF */ + {0x97, 0x52}, {0x8F, 0x7B}, {0x6C, 0x22}, {0x50, 0x3E}, /* 0xE0-0xE3 */ + {0x53, 0x7F}, {0x6E, 0x05}, {0x64, 0xCE}, {0x66, 0x74}, /* 0xE4-0xE7 */ + {0x6C, 0x30}, {0x60, 0xC5}, {0x98, 0x77}, {0x8B, 0xF7}, /* 0xE8-0xEB */ + {0x5E, 0x86}, {0x74, 0x3C}, {0x7A, 0x77}, {0x79, 0xCB}, /* 0xEC-0xEF */ + {0x4E, 0x18}, {0x90, 0xB1}, {0x74, 0x03}, {0x6C, 0x42}, /* 0xF0-0xF3 */ + {0x56, 0xDA}, {0x91, 0x4B}, {0x6C, 0xC5}, {0x8D, 0x8B}, /* 0xF4-0xF7 */ + {0x53, 0x3A}, {0x86, 0xC6}, {0x66, 0xF2}, {0x8E, 0xAF}, /* 0xF8-0xFB */ + {0x5C, 0x48}, {0x9A, 0x71}, {0x6E, 0x20}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x83, 0xEE}, {0x83, 0xEF}, {0x83, 0xF3}, {0x83, 0xF4}, /* 0x40-0x43 */ + {0x83, 0xF5}, {0x83, 0xF6}, {0x83, 0xF7}, {0x83, 0xFA}, /* 0x44-0x47 */ + {0x83, 0xFB}, {0x83, 0xFC}, {0x83, 0xFE}, {0x83, 0xFF}, /* 0x48-0x4B */ + {0x84, 0x00}, {0x84, 0x02}, {0x84, 0x05}, {0x84, 0x07}, /* 0x4C-0x4F */ + {0x84, 0x08}, {0x84, 0x09}, {0x84, 0x0A}, {0x84, 0x10}, /* 0x50-0x53 */ + {0x84, 0x12}, {0x84, 0x13}, {0x84, 0x14}, {0x84, 0x15}, /* 0x54-0x57 */ + {0x84, 0x16}, {0x84, 0x17}, {0x84, 0x19}, {0x84, 0x1A}, /* 0x58-0x5B */ + {0x84, 0x1B}, {0x84, 0x1E}, {0x84, 0x1F}, {0x84, 0x20}, /* 0x5C-0x5F */ + {0x84, 0x21}, {0x84, 0x22}, {0x84, 0x23}, {0x84, 0x29}, /* 0x60-0x63 */ + {0x84, 0x2A}, {0x84, 0x2B}, {0x84, 0x2C}, {0x84, 0x2D}, /* 0x64-0x67 */ + {0x84, 0x2E}, {0x84, 0x2F}, {0x84, 0x30}, {0x84, 0x32}, /* 0x68-0x6B */ + {0x84, 0x33}, {0x84, 0x34}, {0x84, 0x35}, {0x84, 0x36}, /* 0x6C-0x6F */ + {0x84, 0x37}, {0x84, 0x39}, {0x84, 0x3A}, {0x84, 0x3B}, /* 0x70-0x73 */ + {0x84, 0x3E}, {0x84, 0x3F}, {0x84, 0x40}, {0x84, 0x41}, /* 0x74-0x77 */ + {0x84, 0x42}, {0x84, 0x43}, {0x84, 0x44}, {0x84, 0x45}, /* 0x78-0x7B */ + {0x84, 0x47}, {0x84, 0x48}, {0x84, 0x49}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x84, 0x4A}, {0x84, 0x4B}, {0x84, 0x4C}, {0x84, 0x4D}, /* 0x80-0x83 */ + {0x84, 0x4E}, {0x84, 0x4F}, {0x84, 0x50}, {0x84, 0x52}, /* 0x84-0x87 */ + {0x84, 0x53}, {0x84, 0x54}, {0x84, 0x55}, {0x84, 0x56}, /* 0x88-0x8B */ + {0x84, 0x58}, {0x84, 0x5D}, {0x84, 0x5E}, {0x84, 0x5F}, /* 0x8C-0x8F */ + {0x84, 0x60}, {0x84, 0x62}, {0x84, 0x64}, {0x84, 0x65}, /* 0x90-0x93 */ + {0x84, 0x66}, {0x84, 0x67}, {0x84, 0x68}, {0x84, 0x6A}, /* 0x94-0x97 */ + {0x84, 0x6E}, {0x84, 0x6F}, {0x84, 0x70}, {0x84, 0x72}, /* 0x98-0x9B */ + {0x84, 0x74}, {0x84, 0x77}, {0x84, 0x79}, {0x84, 0x7B}, /* 0x9C-0x9F */ + {0x84, 0x7C}, {0x53, 0xD6}, {0x5A, 0x36}, {0x9F, 0x8B}, /* 0xA0-0xA3 */ + {0x8D, 0xA3}, {0x53, 0xBB}, {0x57, 0x08}, {0x98, 0xA7}, /* 0xA4-0xA7 */ + {0x67, 0x43}, {0x91, 0x9B}, {0x6C, 0xC9}, {0x51, 0x68}, /* 0xA8-0xAB */ + {0x75, 0xCA}, {0x62, 0xF3}, {0x72, 0xAC}, {0x52, 0x38}, /* 0xAC-0xAF */ + {0x52, 0x9D}, {0x7F, 0x3A}, {0x70, 0x94}, {0x76, 0x38}, /* 0xB0-0xB3 */ + {0x53, 0x74}, {0x9E, 0x4A}, {0x69, 0xB7}, {0x78, 0x6E}, /* 0xB4-0xB7 */ + {0x96, 0xC0}, {0x88, 0xD9}, {0x7F, 0xA4}, {0x71, 0x36}, /* 0xB8-0xBB */ + {0x71, 0xC3}, {0x51, 0x89}, {0x67, 0xD3}, {0x74, 0xE4}, /* 0xBC-0xBF */ + {0x58, 0xE4}, {0x65, 0x18}, {0x56, 0xB7}, {0x8B, 0xA9}, /* 0xC0-0xC3 */ + {0x99, 0x76}, {0x62, 0x70}, {0x7E, 0xD5}, {0x60, 0xF9}, /* 0xC4-0xC7 */ + {0x70, 0xED}, {0x58, 0xEC}, {0x4E, 0xC1}, {0x4E, 0xBA}, /* 0xC8-0xCB */ + {0x5F, 0xCD}, {0x97, 0xE7}, {0x4E, 0xFB}, {0x8B, 0xA4}, /* 0xCC-0xCF */ + {0x52, 0x03}, {0x59, 0x8A}, {0x7E, 0xAB}, {0x62, 0x54}, /* 0xD0-0xD3 */ + {0x4E, 0xCD}, {0x65, 0xE5}, {0x62, 0x0E}, {0x83, 0x38}, /* 0xD4-0xD7 */ + {0x84, 0xC9}, {0x83, 0x63}, {0x87, 0x8D}, {0x71, 0x94}, /* 0xD8-0xDB */ + {0x6E, 0xB6}, {0x5B, 0xB9}, {0x7E, 0xD2}, {0x51, 0x97}, /* 0xDC-0xDF */ + {0x63, 0xC9}, {0x67, 0xD4}, {0x80, 0x89}, {0x83, 0x39}, /* 0xE0-0xE3 */ + {0x88, 0x15}, {0x51, 0x12}, {0x5B, 0x7A}, {0x59, 0x82}, /* 0xE4-0xE7 */ + {0x8F, 0xB1}, {0x4E, 0x73}, {0x6C, 0x5D}, {0x51, 0x65}, /* 0xE8-0xEB */ + {0x89, 0x25}, {0x8F, 0x6F}, {0x96, 0x2E}, {0x85, 0x4A}, /* 0xEC-0xEF */ + {0x74, 0x5E}, {0x95, 0x10}, {0x95, 0xF0}, {0x6D, 0xA6}, /* 0xF0-0xF3 */ + {0x82, 0xE5}, {0x5F, 0x31}, {0x64, 0x92}, {0x6D, 0x12}, /* 0xF4-0xF7 */ + {0x84, 0x28}, {0x81, 0x6E}, {0x9C, 0xC3}, {0x58, 0x5E}, /* 0xF8-0xFB */ + {0x8D, 0x5B}, {0x4E, 0x09}, {0x53, 0xC1}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x84, 0x7D}, {0x84, 0x7E}, {0x84, 0x7F}, {0x84, 0x80}, /* 0x40-0x43 */ + {0x84, 0x81}, {0x84, 0x83}, {0x84, 0x84}, {0x84, 0x85}, /* 0x44-0x47 */ + {0x84, 0x86}, {0x84, 0x8A}, {0x84, 0x8D}, {0x84, 0x8F}, /* 0x48-0x4B */ + {0x84, 0x90}, {0x84, 0x91}, {0x84, 0x92}, {0x84, 0x93}, /* 0x4C-0x4F */ + {0x84, 0x94}, {0x84, 0x95}, {0x84, 0x96}, {0x84, 0x98}, /* 0x50-0x53 */ + {0x84, 0x9A}, {0x84, 0x9B}, {0x84, 0x9D}, {0x84, 0x9E}, /* 0x54-0x57 */ + {0x84, 0x9F}, {0x84, 0xA0}, {0x84, 0xA2}, {0x84, 0xA3}, /* 0x58-0x5B */ + {0x84, 0xA4}, {0x84, 0xA5}, {0x84, 0xA6}, {0x84, 0xA7}, /* 0x5C-0x5F */ + {0x84, 0xA8}, {0x84, 0xA9}, {0x84, 0xAA}, {0x84, 0xAB}, /* 0x60-0x63 */ + {0x84, 0xAC}, {0x84, 0xAD}, {0x84, 0xAE}, {0x84, 0xB0}, /* 0x64-0x67 */ + {0x84, 0xB1}, {0x84, 0xB3}, {0x84, 0xB5}, {0x84, 0xB6}, /* 0x68-0x6B */ + {0x84, 0xB7}, {0x84, 0xBB}, {0x84, 0xBC}, {0x84, 0xBE}, /* 0x6C-0x6F */ + {0x84, 0xC0}, {0x84, 0xC2}, {0x84, 0xC3}, {0x84, 0xC5}, /* 0x70-0x73 */ + {0x84, 0xC6}, {0x84, 0xC7}, {0x84, 0xC8}, {0x84, 0xCB}, /* 0x74-0x77 */ + {0x84, 0xCC}, {0x84, 0xCE}, {0x84, 0xCF}, {0x84, 0xD2}, /* 0x78-0x7B */ + {0x84, 0xD4}, {0x84, 0xD5}, {0x84, 0xD7}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x84, 0xD8}, {0x84, 0xD9}, {0x84, 0xDA}, {0x84, 0xDB}, /* 0x80-0x83 */ + {0x84, 0xDC}, {0x84, 0xDE}, {0x84, 0xE1}, {0x84, 0xE2}, /* 0x84-0x87 */ + {0x84, 0xE4}, {0x84, 0xE7}, {0x84, 0xE8}, {0x84, 0xE9}, /* 0x88-0x8B */ + {0x84, 0xEA}, {0x84, 0xEB}, {0x84, 0xED}, {0x84, 0xEE}, /* 0x8C-0x8F */ + {0x84, 0xEF}, {0x84, 0xF1}, {0x84, 0xF2}, {0x84, 0xF3}, /* 0x90-0x93 */ + {0x84, 0xF4}, {0x84, 0xF5}, {0x84, 0xF6}, {0x84, 0xF7}, /* 0x94-0x97 */ + {0x84, 0xF8}, {0x84, 0xF9}, {0x84, 0xFA}, {0x84, 0xFB}, /* 0x98-0x9B */ + {0x84, 0xFD}, {0x84, 0xFE}, {0x85, 0x00}, {0x85, 0x01}, /* 0x9C-0x9F */ + {0x85, 0x02}, {0x4F, 0x1E}, {0x65, 0x63}, {0x68, 0x51}, /* 0xA0-0xA3 */ + {0x55, 0xD3}, {0x4E, 0x27}, {0x64, 0x14}, {0x9A, 0x9A}, /* 0xA4-0xA7 */ + {0x62, 0x6B}, {0x5A, 0xC2}, {0x74, 0x5F}, {0x82, 0x72}, /* 0xA8-0xAB */ + {0x6D, 0xA9}, {0x68, 0xEE}, {0x50, 0xE7}, {0x83, 0x8E}, /* 0xAC-0xAF */ + {0x78, 0x02}, {0x67, 0x40}, {0x52, 0x39}, {0x6C, 0x99}, /* 0xB0-0xB3 */ + {0x7E, 0xB1}, {0x50, 0xBB}, {0x55, 0x65}, {0x71, 0x5E}, /* 0xB4-0xB7 */ + {0x7B, 0x5B}, {0x66, 0x52}, {0x73, 0xCA}, {0x82, 0xEB}, /* 0xB8-0xBB */ + {0x67, 0x49}, {0x5C, 0x71}, {0x52, 0x20}, {0x71, 0x7D}, /* 0xBC-0xBF */ + {0x88, 0x6B}, {0x95, 0xEA}, {0x96, 0x55}, {0x64, 0xC5}, /* 0xC0-0xC3 */ + {0x8D, 0x61}, {0x81, 0xB3}, {0x55, 0x84}, {0x6C, 0x55}, /* 0xC4-0xC7 */ + {0x62, 0x47}, {0x7F, 0x2E}, {0x58, 0x92}, {0x4F, 0x24}, /* 0xC8-0xCB */ + {0x55, 0x46}, {0x8D, 0x4F}, {0x66, 0x4C}, {0x4E, 0x0A}, /* 0xCC-0xCF */ + {0x5C, 0x1A}, {0x88, 0xF3}, {0x68, 0xA2}, {0x63, 0x4E}, /* 0xD0-0xD3 */ + {0x7A, 0x0D}, {0x70, 0xE7}, {0x82, 0x8D}, {0x52, 0xFA}, /* 0xD4-0xD7 */ + {0x97, 0xF6}, {0x5C, 0x11}, {0x54, 0xE8}, {0x90, 0xB5}, /* 0xD8-0xDB */ + {0x7E, 0xCD}, {0x59, 0x62}, {0x8D, 0x4A}, {0x86, 0xC7}, /* 0xDC-0xDF */ + {0x82, 0x0C}, {0x82, 0x0D}, {0x8D, 0x66}, {0x64, 0x44}, /* 0xE0-0xE3 */ + {0x5C, 0x04}, {0x61, 0x51}, {0x6D, 0x89}, {0x79, 0x3E}, /* 0xE4-0xE7 */ + {0x8B, 0xBE}, {0x78, 0x37}, {0x75, 0x33}, {0x54, 0x7B}, /* 0xE8-0xEB */ + {0x4F, 0x38}, {0x8E, 0xAB}, {0x6D, 0xF1}, {0x5A, 0x20}, /* 0xEC-0xEF */ + {0x7E, 0xC5}, {0x79, 0x5E}, {0x6C, 0x88}, {0x5B, 0xA1}, /* 0xF0-0xF3 */ + {0x5A, 0x76}, {0x75, 0x1A}, {0x80, 0xBE}, {0x61, 0x4E}, /* 0xF4-0xF7 */ + {0x6E, 0x17}, {0x58, 0xF0}, {0x75, 0x1F}, {0x75, 0x25}, /* 0xF8-0xFB */ + {0x72, 0x72}, {0x53, 0x47}, {0x7E, 0xF3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x85, 0x03}, {0x85, 0x04}, {0x85, 0x05}, {0x85, 0x06}, /* 0x40-0x43 */ + {0x85, 0x07}, {0x85, 0x08}, {0x85, 0x09}, {0x85, 0x0A}, /* 0x44-0x47 */ + {0x85, 0x0B}, {0x85, 0x0D}, {0x85, 0x0E}, {0x85, 0x0F}, /* 0x48-0x4B */ + {0x85, 0x10}, {0x85, 0x12}, {0x85, 0x14}, {0x85, 0x15}, /* 0x4C-0x4F */ + {0x85, 0x16}, {0x85, 0x18}, {0x85, 0x19}, {0x85, 0x1B}, /* 0x50-0x53 */ + {0x85, 0x1C}, {0x85, 0x1D}, {0x85, 0x1E}, {0x85, 0x20}, /* 0x54-0x57 */ + {0x85, 0x22}, {0x85, 0x23}, {0x85, 0x24}, {0x85, 0x25}, /* 0x58-0x5B */ + {0x85, 0x26}, {0x85, 0x27}, {0x85, 0x28}, {0x85, 0x29}, /* 0x5C-0x5F */ + {0x85, 0x2A}, {0x85, 0x2D}, {0x85, 0x2E}, {0x85, 0x2F}, /* 0x60-0x63 */ + {0x85, 0x30}, {0x85, 0x31}, {0x85, 0x32}, {0x85, 0x33}, /* 0x64-0x67 */ + {0x85, 0x34}, {0x85, 0x35}, {0x85, 0x36}, {0x85, 0x3E}, /* 0x68-0x6B */ + {0x85, 0x3F}, {0x85, 0x40}, {0x85, 0x41}, {0x85, 0x42}, /* 0x6C-0x6F */ + {0x85, 0x44}, {0x85, 0x45}, {0x85, 0x46}, {0x85, 0x47}, /* 0x70-0x73 */ + {0x85, 0x4B}, {0x85, 0x4C}, {0x85, 0x4D}, {0x85, 0x4E}, /* 0x74-0x77 */ + {0x85, 0x4F}, {0x85, 0x50}, {0x85, 0x51}, {0x85, 0x52}, /* 0x78-0x7B */ + {0x85, 0x53}, {0x85, 0x54}, {0x85, 0x55}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x85, 0x57}, {0x85, 0x58}, {0x85, 0x5A}, {0x85, 0x5B}, /* 0x80-0x83 */ + {0x85, 0x5C}, {0x85, 0x5D}, {0x85, 0x5F}, {0x85, 0x60}, /* 0x84-0x87 */ + {0x85, 0x61}, {0x85, 0x62}, {0x85, 0x63}, {0x85, 0x65}, /* 0x88-0x8B */ + {0x85, 0x66}, {0x85, 0x67}, {0x85, 0x69}, {0x85, 0x6A}, /* 0x8C-0x8F */ + {0x85, 0x6B}, {0x85, 0x6C}, {0x85, 0x6D}, {0x85, 0x6E}, /* 0x90-0x93 */ + {0x85, 0x6F}, {0x85, 0x70}, {0x85, 0x71}, {0x85, 0x73}, /* 0x94-0x97 */ + {0x85, 0x75}, {0x85, 0x76}, {0x85, 0x77}, {0x85, 0x78}, /* 0x98-0x9B */ + {0x85, 0x7C}, {0x85, 0x7D}, {0x85, 0x7F}, {0x85, 0x80}, /* 0x9C-0x9F */ + {0x85, 0x81}, {0x77, 0x01}, {0x76, 0xDB}, {0x52, 0x69}, /* 0xA0-0xA3 */ + {0x80, 0xDC}, {0x57, 0x23}, {0x5E, 0x08}, {0x59, 0x31}, /* 0xA4-0xA7 */ + {0x72, 0xEE}, {0x65, 0xBD}, {0x6E, 0x7F}, {0x8B, 0xD7}, /* 0xA8-0xAB */ + {0x5C, 0x38}, {0x86, 0x71}, {0x53, 0x41}, {0x77, 0xF3}, /* 0xAC-0xAF */ + {0x62, 0xFE}, {0x65, 0xF6}, {0x4E, 0xC0}, {0x98, 0xDF}, /* 0xB0-0xB3 */ + {0x86, 0x80}, {0x5B, 0x9E}, {0x8B, 0xC6}, {0x53, 0xF2}, /* 0xB4-0xB7 */ + {0x77, 0xE2}, {0x4F, 0x7F}, {0x5C, 0x4E}, {0x9A, 0x76}, /* 0xB8-0xBB */ + {0x59, 0xCB}, {0x5F, 0x0F}, {0x79, 0x3A}, {0x58, 0xEB}, /* 0xBC-0xBF */ + {0x4E, 0x16}, {0x67, 0xFF}, {0x4E, 0x8B}, {0x62, 0xED}, /* 0xC0-0xC3 */ + {0x8A, 0x93}, {0x90, 0x1D}, {0x52, 0xBF}, {0x66, 0x2F}, /* 0xC4-0xC7 */ + {0x55, 0xDC}, {0x56, 0x6C}, {0x90, 0x02}, {0x4E, 0xD5}, /* 0xC8-0xCB */ + {0x4F, 0x8D}, {0x91, 0xCA}, {0x99, 0x70}, {0x6C, 0x0F}, /* 0xCC-0xCF */ + {0x5E, 0x02}, {0x60, 0x43}, {0x5B, 0xA4}, {0x89, 0xC6}, /* 0xD0-0xD3 */ + {0x8B, 0xD5}, {0x65, 0x36}, {0x62, 0x4B}, {0x99, 0x96}, /* 0xD4-0xD7 */ + {0x5B, 0x88}, {0x5B, 0xFF}, {0x63, 0x88}, {0x55, 0x2E}, /* 0xD8-0xDB */ + {0x53, 0xD7}, {0x76, 0x26}, {0x51, 0x7D}, {0x85, 0x2C}, /* 0xDC-0xDF */ + {0x67, 0xA2}, {0x68, 0xB3}, {0x6B, 0x8A}, {0x62, 0x92}, /* 0xE0-0xE3 */ + {0x8F, 0x93}, {0x53, 0xD4}, {0x82, 0x12}, {0x6D, 0xD1}, /* 0xE4-0xE7 */ + {0x75, 0x8F}, {0x4E, 0x66}, {0x8D, 0x4E}, {0x5B, 0x70}, /* 0xE8-0xEB */ + {0x71, 0x9F}, {0x85, 0xAF}, {0x66, 0x91}, {0x66, 0xD9}, /* 0xEC-0xEF */ + {0x7F, 0x72}, {0x87, 0x00}, {0x9E, 0xCD}, {0x9F, 0x20}, /* 0xF0-0xF3 */ + {0x5C, 0x5E}, {0x67, 0x2F}, {0x8F, 0xF0}, {0x68, 0x11}, /* 0xF4-0xF7 */ + {0x67, 0x5F}, {0x62, 0x0D}, {0x7A, 0xD6}, {0x58, 0x85}, /* 0xF8-0xFB */ + {0x5E, 0xB6}, {0x65, 0x70}, {0x6F, 0x31}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x85, 0x82}, {0x85, 0x83}, {0x85, 0x86}, {0x85, 0x88}, /* 0x40-0x43 */ + {0x85, 0x89}, {0x85, 0x8A}, {0x85, 0x8B}, {0x85, 0x8C}, /* 0x44-0x47 */ + {0x85, 0x8D}, {0x85, 0x8E}, {0x85, 0x90}, {0x85, 0x91}, /* 0x48-0x4B */ + {0x85, 0x92}, {0x85, 0x93}, {0x85, 0x94}, {0x85, 0x95}, /* 0x4C-0x4F */ + {0x85, 0x96}, {0x85, 0x97}, {0x85, 0x98}, {0x85, 0x99}, /* 0x50-0x53 */ + {0x85, 0x9A}, {0x85, 0x9D}, {0x85, 0x9E}, {0x85, 0x9F}, /* 0x54-0x57 */ + {0x85, 0xA0}, {0x85, 0xA1}, {0x85, 0xA2}, {0x85, 0xA3}, /* 0x58-0x5B */ + {0x85, 0xA5}, {0x85, 0xA6}, {0x85, 0xA7}, {0x85, 0xA9}, /* 0x5C-0x5F */ + {0x85, 0xAB}, {0x85, 0xAC}, {0x85, 0xAD}, {0x85, 0xB1}, /* 0x60-0x63 */ + {0x85, 0xB2}, {0x85, 0xB3}, {0x85, 0xB4}, {0x85, 0xB5}, /* 0x64-0x67 */ + {0x85, 0xB6}, {0x85, 0xB8}, {0x85, 0xBA}, {0x85, 0xBB}, /* 0x68-0x6B */ + {0x85, 0xBC}, {0x85, 0xBD}, {0x85, 0xBE}, {0x85, 0xBF}, /* 0x6C-0x6F */ + {0x85, 0xC0}, {0x85, 0xC2}, {0x85, 0xC3}, {0x85, 0xC4}, /* 0x70-0x73 */ + {0x85, 0xC5}, {0x85, 0xC6}, {0x85, 0xC7}, {0x85, 0xC8}, /* 0x74-0x77 */ + {0x85, 0xCA}, {0x85, 0xCB}, {0x85, 0xCC}, {0x85, 0xCD}, /* 0x78-0x7B */ + {0x85, 0xCE}, {0x85, 0xD1}, {0x85, 0xD2}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x85, 0xD4}, {0x85, 0xD6}, {0x85, 0xD7}, {0x85, 0xD8}, /* 0x80-0x83 */ + {0x85, 0xD9}, {0x85, 0xDA}, {0x85, 0xDB}, {0x85, 0xDD}, /* 0x84-0x87 */ + {0x85, 0xDE}, {0x85, 0xDF}, {0x85, 0xE0}, {0x85, 0xE1}, /* 0x88-0x8B */ + {0x85, 0xE2}, {0x85, 0xE3}, {0x85, 0xE5}, {0x85, 0xE6}, /* 0x8C-0x8F */ + {0x85, 0xE7}, {0x85, 0xE8}, {0x85, 0xEA}, {0x85, 0xEB}, /* 0x90-0x93 */ + {0x85, 0xEC}, {0x85, 0xED}, {0x85, 0xEE}, {0x85, 0xEF}, /* 0x94-0x97 */ + {0x85, 0xF0}, {0x85, 0xF1}, {0x85, 0xF2}, {0x85, 0xF3}, /* 0x98-0x9B */ + {0x85, 0xF4}, {0x85, 0xF5}, {0x85, 0xF6}, {0x85, 0xF7}, /* 0x9C-0x9F */ + {0x85, 0xF8}, {0x60, 0x55}, {0x52, 0x37}, {0x80, 0x0D}, /* 0xA0-0xA3 */ + {0x64, 0x54}, {0x88, 0x70}, {0x75, 0x29}, {0x5E, 0x05}, /* 0xA4-0xA7 */ + {0x68, 0x13}, {0x62, 0xF4}, {0x97, 0x1C}, {0x53, 0xCC}, /* 0xA8-0xAB */ + {0x72, 0x3D}, {0x8C, 0x01}, {0x6C, 0x34}, {0x77, 0x61}, /* 0xAC-0xAF */ + {0x7A, 0x0E}, {0x54, 0x2E}, {0x77, 0xAC}, {0x98, 0x7A}, /* 0xB0-0xB3 */ + {0x82, 0x1C}, {0x8B, 0xF4}, {0x78, 0x55}, {0x67, 0x14}, /* 0xB4-0xB7 */ + {0x70, 0xC1}, {0x65, 0xAF}, {0x64, 0x95}, {0x56, 0x36}, /* 0xB8-0xBB */ + {0x60, 0x1D}, {0x79, 0xC1}, {0x53, 0xF8}, {0x4E, 0x1D}, /* 0xBC-0xBF */ + {0x6B, 0x7B}, {0x80, 0x86}, {0x5B, 0xFA}, {0x55, 0xE3}, /* 0xC0-0xC3 */ + {0x56, 0xDB}, {0x4F, 0x3A}, {0x4F, 0x3C}, {0x99, 0x72}, /* 0xC4-0xC7 */ + {0x5D, 0xF3}, {0x67, 0x7E}, {0x80, 0x38}, {0x60, 0x02}, /* 0xC8-0xCB */ + {0x98, 0x82}, {0x90, 0x01}, {0x5B, 0x8B}, {0x8B, 0xBC}, /* 0xCC-0xCF */ + {0x8B, 0xF5}, {0x64, 0x1C}, {0x82, 0x58}, {0x64, 0xDE}, /* 0xD0-0xD3 */ + {0x55, 0xFD}, {0x82, 0xCF}, {0x91, 0x65}, {0x4F, 0xD7}, /* 0xD4-0xD7 */ + {0x7D, 0x20}, {0x90, 0x1F}, {0x7C, 0x9F}, {0x50, 0xF3}, /* 0xD8-0xDB */ + {0x58, 0x51}, {0x6E, 0xAF}, {0x5B, 0xBF}, {0x8B, 0xC9}, /* 0xDC-0xDF */ + {0x80, 0x83}, {0x91, 0x78}, {0x84, 0x9C}, {0x7B, 0x97}, /* 0xE0-0xE3 */ + {0x86, 0x7D}, {0x96, 0x8B}, {0x96, 0x8F}, {0x7E, 0xE5}, /* 0xE4-0xE7 */ + {0x9A, 0xD3}, {0x78, 0x8E}, {0x5C, 0x81}, {0x7A, 0x57}, /* 0xE8-0xEB */ + {0x90, 0x42}, {0x96, 0xA7}, {0x79, 0x5F}, {0x5B, 0x59}, /* 0xEC-0xEF */ + {0x63, 0x5F}, {0x7B, 0x0B}, {0x84, 0xD1}, {0x68, 0xAD}, /* 0xF0-0xF3 */ + {0x55, 0x06}, {0x7F, 0x29}, {0x74, 0x10}, {0x7D, 0x22}, /* 0xF4-0xF7 */ + {0x95, 0x01}, {0x62, 0x40}, {0x58, 0x4C}, {0x4E, 0xD6}, /* 0xF8-0xFB */ + {0x5B, 0x83}, {0x59, 0x79}, {0x58, 0x54}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x85, 0xF9}, {0x85, 0xFA}, {0x85, 0xFC}, {0x85, 0xFD}, /* 0x40-0x43 */ + {0x85, 0xFE}, {0x86, 0x00}, {0x86, 0x01}, {0x86, 0x02}, /* 0x44-0x47 */ + {0x86, 0x03}, {0x86, 0x04}, {0x86, 0x06}, {0x86, 0x07}, /* 0x48-0x4B */ + {0x86, 0x08}, {0x86, 0x09}, {0x86, 0x0A}, {0x86, 0x0B}, /* 0x4C-0x4F */ + {0x86, 0x0C}, {0x86, 0x0D}, {0x86, 0x0E}, {0x86, 0x0F}, /* 0x50-0x53 */ + {0x86, 0x10}, {0x86, 0x12}, {0x86, 0x13}, {0x86, 0x14}, /* 0x54-0x57 */ + {0x86, 0x15}, {0x86, 0x17}, {0x86, 0x18}, {0x86, 0x19}, /* 0x58-0x5B */ + {0x86, 0x1A}, {0x86, 0x1B}, {0x86, 0x1C}, {0x86, 0x1D}, /* 0x5C-0x5F */ + {0x86, 0x1E}, {0x86, 0x1F}, {0x86, 0x20}, {0x86, 0x21}, /* 0x60-0x63 */ + {0x86, 0x22}, {0x86, 0x23}, {0x86, 0x24}, {0x86, 0x25}, /* 0x64-0x67 */ + {0x86, 0x26}, {0x86, 0x28}, {0x86, 0x2A}, {0x86, 0x2B}, /* 0x68-0x6B */ + {0x86, 0x2C}, {0x86, 0x2D}, {0x86, 0x2E}, {0x86, 0x2F}, /* 0x6C-0x6F */ + {0x86, 0x30}, {0x86, 0x31}, {0x86, 0x32}, {0x86, 0x33}, /* 0x70-0x73 */ + {0x86, 0x34}, {0x86, 0x35}, {0x86, 0x36}, {0x86, 0x37}, /* 0x74-0x77 */ + {0x86, 0x39}, {0x86, 0x3A}, {0x86, 0x3B}, {0x86, 0x3D}, /* 0x78-0x7B */ + {0x86, 0x3E}, {0x86, 0x3F}, {0x86, 0x40}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x86, 0x41}, {0x86, 0x42}, {0x86, 0x43}, {0x86, 0x44}, /* 0x80-0x83 */ + {0x86, 0x45}, {0x86, 0x46}, {0x86, 0x47}, {0x86, 0x48}, /* 0x84-0x87 */ + {0x86, 0x49}, {0x86, 0x4A}, {0x86, 0x4B}, {0x86, 0x4C}, /* 0x88-0x8B */ + {0x86, 0x52}, {0x86, 0x53}, {0x86, 0x55}, {0x86, 0x56}, /* 0x8C-0x8F */ + {0x86, 0x57}, {0x86, 0x58}, {0x86, 0x59}, {0x86, 0x5B}, /* 0x90-0x93 */ + {0x86, 0x5C}, {0x86, 0x5D}, {0x86, 0x5F}, {0x86, 0x60}, /* 0x94-0x97 */ + {0x86, 0x61}, {0x86, 0x63}, {0x86, 0x64}, {0x86, 0x65}, /* 0x98-0x9B */ + {0x86, 0x66}, {0x86, 0x67}, {0x86, 0x68}, {0x86, 0x69}, /* 0x9C-0x9F */ + {0x86, 0x6A}, {0x73, 0x6D}, {0x63, 0x1E}, {0x8E, 0x4B}, /* 0xA0-0xA3 */ + {0x8E, 0x0F}, {0x80, 0xCE}, {0x82, 0xD4}, {0x62, 0xAC}, /* 0xA4-0xA7 */ + {0x53, 0xF0}, {0x6C, 0xF0}, {0x91, 0x5E}, {0x59, 0x2A}, /* 0xA8-0xAB */ + {0x60, 0x01}, {0x6C, 0x70}, {0x57, 0x4D}, {0x64, 0x4A}, /* 0xAC-0xAF */ + {0x8D, 0x2A}, {0x76, 0x2B}, {0x6E, 0xE9}, {0x57, 0x5B}, /* 0xB0-0xB3 */ + {0x6A, 0x80}, {0x75, 0xF0}, {0x6F, 0x6D}, {0x8C, 0x2D}, /* 0xB4-0xB7 */ + {0x8C, 0x08}, {0x57, 0x66}, {0x6B, 0xEF}, {0x88, 0x92}, /* 0xB8-0xBB */ + {0x78, 0xB3}, {0x63, 0xA2}, {0x53, 0xF9}, {0x70, 0xAD}, /* 0xBC-0xBF */ + {0x6C, 0x64}, {0x58, 0x58}, {0x64, 0x2A}, {0x58, 0x02}, /* 0xC0-0xC3 */ + {0x68, 0xE0}, {0x81, 0x9B}, {0x55, 0x10}, {0x7C, 0xD6}, /* 0xC4-0xC7 */ + {0x50, 0x18}, {0x8E, 0xBA}, {0x6D, 0xCC}, {0x8D, 0x9F}, /* 0xC8-0xCB */ + {0x70, 0xEB}, {0x63, 0x8F}, {0x6D, 0x9B}, {0x6E, 0xD4}, /* 0xCC-0xCF */ + {0x7E, 0xE6}, {0x84, 0x04}, {0x68, 0x43}, {0x90, 0x03}, /* 0xD0-0xD3 */ + {0x6D, 0xD8}, {0x96, 0x76}, {0x8B, 0xA8}, {0x59, 0x57}, /* 0xD4-0xD7 */ + {0x72, 0x79}, {0x85, 0xE4}, {0x81, 0x7E}, {0x75, 0xBC}, /* 0xD8-0xDB */ + {0x8A, 0x8A}, {0x68, 0xAF}, {0x52, 0x54}, {0x8E, 0x22}, /* 0xDC-0xDF */ + {0x95, 0x11}, {0x63, 0xD0}, {0x98, 0x98}, {0x8E, 0x44}, /* 0xE0-0xE3 */ + {0x55, 0x7C}, {0x4F, 0x53}, {0x66, 0xFF}, {0x56, 0x8F}, /* 0xE4-0xE7 */ + {0x60, 0xD5}, {0x6D, 0x95}, {0x52, 0x43}, {0x5C, 0x49}, /* 0xE8-0xEB */ + {0x59, 0x29}, {0x6D, 0xFB}, {0x58, 0x6B}, {0x75, 0x30}, /* 0xEC-0xEF */ + {0x75, 0x1C}, {0x60, 0x6C}, {0x82, 0x14}, {0x81, 0x46}, /* 0xF0-0xF3 */ + {0x63, 0x11}, {0x67, 0x61}, {0x8F, 0xE2}, {0x77, 0x3A}, /* 0xF4-0xF7 */ + {0x8D, 0xF3}, {0x8D, 0x34}, {0x94, 0xC1}, {0x5E, 0x16}, /* 0xF8-0xFB */ + {0x53, 0x85}, {0x54, 0x2C}, {0x70, 0xC3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x86, 0x6D}, {0x86, 0x6F}, {0x86, 0x70}, {0x86, 0x72}, /* 0x40-0x43 */ + {0x86, 0x73}, {0x86, 0x74}, {0x86, 0x75}, {0x86, 0x76}, /* 0x44-0x47 */ + {0x86, 0x77}, {0x86, 0x78}, {0x86, 0x83}, {0x86, 0x84}, /* 0x48-0x4B */ + {0x86, 0x85}, {0x86, 0x86}, {0x86, 0x87}, {0x86, 0x88}, /* 0x4C-0x4F */ + {0x86, 0x89}, {0x86, 0x8E}, {0x86, 0x8F}, {0x86, 0x90}, /* 0x50-0x53 */ + {0x86, 0x91}, {0x86, 0x92}, {0x86, 0x94}, {0x86, 0x96}, /* 0x54-0x57 */ + {0x86, 0x97}, {0x86, 0x98}, {0x86, 0x99}, {0x86, 0x9A}, /* 0x58-0x5B */ + {0x86, 0x9B}, {0x86, 0x9E}, {0x86, 0x9F}, {0x86, 0xA0}, /* 0x5C-0x5F */ + {0x86, 0xA1}, {0x86, 0xA2}, {0x86, 0xA5}, {0x86, 0xA6}, /* 0x60-0x63 */ + {0x86, 0xAB}, {0x86, 0xAD}, {0x86, 0xAE}, {0x86, 0xB2}, /* 0x64-0x67 */ + {0x86, 0xB3}, {0x86, 0xB7}, {0x86, 0xB8}, {0x86, 0xB9}, /* 0x68-0x6B */ + {0x86, 0xBB}, {0x86, 0xBC}, {0x86, 0xBD}, {0x86, 0xBE}, /* 0x6C-0x6F */ + {0x86, 0xBF}, {0x86, 0xC1}, {0x86, 0xC2}, {0x86, 0xC3}, /* 0x70-0x73 */ + {0x86, 0xC5}, {0x86, 0xC8}, {0x86, 0xCC}, {0x86, 0xCD}, /* 0x74-0x77 */ + {0x86, 0xD2}, {0x86, 0xD3}, {0x86, 0xD5}, {0x86, 0xD6}, /* 0x78-0x7B */ + {0x86, 0xD7}, {0x86, 0xDA}, {0x86, 0xDC}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x86, 0xDD}, {0x86, 0xE0}, {0x86, 0xE1}, {0x86, 0xE2}, /* 0x80-0x83 */ + {0x86, 0xE3}, {0x86, 0xE5}, {0x86, 0xE6}, {0x86, 0xE7}, /* 0x84-0x87 */ + {0x86, 0xE8}, {0x86, 0xEA}, {0x86, 0xEB}, {0x86, 0xEC}, /* 0x88-0x8B */ + {0x86, 0xEF}, {0x86, 0xF5}, {0x86, 0xF6}, {0x86, 0xF7}, /* 0x8C-0x8F */ + {0x86, 0xFA}, {0x86, 0xFB}, {0x86, 0xFC}, {0x86, 0xFD}, /* 0x90-0x93 */ + {0x86, 0xFF}, {0x87, 0x01}, {0x87, 0x04}, {0x87, 0x05}, /* 0x94-0x97 */ + {0x87, 0x06}, {0x87, 0x0B}, {0x87, 0x0C}, {0x87, 0x0E}, /* 0x98-0x9B */ + {0x87, 0x0F}, {0x87, 0x10}, {0x87, 0x11}, {0x87, 0x14}, /* 0x9C-0x9F */ + {0x87, 0x16}, {0x6C, 0x40}, {0x5E, 0xF7}, {0x50, 0x5C}, /* 0xA0-0xA3 */ + {0x4E, 0xAD}, {0x5E, 0xAD}, {0x63, 0x3A}, {0x82, 0x47}, /* 0xA4-0xA7 */ + {0x90, 0x1A}, {0x68, 0x50}, {0x91, 0x6E}, {0x77, 0xB3}, /* 0xA8-0xAB */ + {0x54, 0x0C}, {0x94, 0xDC}, {0x5F, 0x64}, {0x7A, 0xE5}, /* 0xAC-0xAF */ + {0x68, 0x76}, {0x63, 0x45}, {0x7B, 0x52}, {0x7E, 0xDF}, /* 0xB0-0xB3 */ + {0x75, 0xDB}, {0x50, 0x77}, {0x62, 0x95}, {0x59, 0x34}, /* 0xB4-0xB7 */ + {0x90, 0x0F}, {0x51, 0xF8}, {0x79, 0xC3}, {0x7A, 0x81}, /* 0xB8-0xBB */ + {0x56, 0xFE}, {0x5F, 0x92}, {0x90, 0x14}, {0x6D, 0x82}, /* 0xBC-0xBF */ + {0x5C, 0x60}, {0x57, 0x1F}, {0x54, 0x10}, {0x51, 0x54}, /* 0xC0-0xC3 */ + {0x6E, 0x4D}, {0x56, 0xE2}, {0x63, 0xA8}, {0x98, 0x93}, /* 0xC4-0xC7 */ + {0x81, 0x7F}, {0x87, 0x15}, {0x89, 0x2A}, {0x90, 0x00}, /* 0xC8-0xCB */ + {0x54, 0x1E}, {0x5C, 0x6F}, {0x81, 0xC0}, {0x62, 0xD6}, /* 0xCC-0xCF */ + {0x62, 0x58}, {0x81, 0x31}, {0x9E, 0x35}, {0x96, 0x40}, /* 0xD0-0xD3 */ + {0x9A, 0x6E}, {0x9A, 0x7C}, {0x69, 0x2D}, {0x59, 0xA5}, /* 0xD4-0xD7 */ + {0x62, 0xD3}, {0x55, 0x3E}, {0x63, 0x16}, {0x54, 0xC7}, /* 0xD8-0xDB */ + {0x86, 0xD9}, {0x6D, 0x3C}, {0x5A, 0x03}, {0x74, 0xE6}, /* 0xDC-0xDF */ + {0x88, 0x9C}, {0x6B, 0x6A}, {0x59, 0x16}, {0x8C, 0x4C}, /* 0xE0-0xE3 */ + {0x5F, 0x2F}, {0x6E, 0x7E}, {0x73, 0xA9}, {0x98, 0x7D}, /* 0xE4-0xE7 */ + {0x4E, 0x38}, {0x70, 0xF7}, {0x5B, 0x8C}, {0x78, 0x97}, /* 0xE8-0xEB */ + {0x63, 0x3D}, {0x66, 0x5A}, {0x76, 0x96}, {0x60, 0xCB}, /* 0xEC-0xEF */ + {0x5B, 0x9B}, {0x5A, 0x49}, {0x4E, 0x07}, {0x81, 0x55}, /* 0xF0-0xF3 */ + {0x6C, 0x6A}, {0x73, 0x8B}, {0x4E, 0xA1}, {0x67, 0x89}, /* 0xF4-0xF7 */ + {0x7F, 0x51}, {0x5F, 0x80}, {0x65, 0xFA}, {0x67, 0x1B}, /* 0xF8-0xFB */ + {0x5F, 0xD8}, {0x59, 0x84}, {0x5A, 0x01}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x87, 0x19}, {0x87, 0x1B}, {0x87, 0x1D}, {0x87, 0x1F}, /* 0x40-0x43 */ + {0x87, 0x20}, {0x87, 0x24}, {0x87, 0x26}, {0x87, 0x27}, /* 0x44-0x47 */ + {0x87, 0x28}, {0x87, 0x2A}, {0x87, 0x2B}, {0x87, 0x2C}, /* 0x48-0x4B */ + {0x87, 0x2D}, {0x87, 0x2F}, {0x87, 0x30}, {0x87, 0x32}, /* 0x4C-0x4F */ + {0x87, 0x33}, {0x87, 0x35}, {0x87, 0x36}, {0x87, 0x38}, /* 0x50-0x53 */ + {0x87, 0x39}, {0x87, 0x3A}, {0x87, 0x3C}, {0x87, 0x3D}, /* 0x54-0x57 */ + {0x87, 0x40}, {0x87, 0x41}, {0x87, 0x42}, {0x87, 0x43}, /* 0x58-0x5B */ + {0x87, 0x44}, {0x87, 0x45}, {0x87, 0x46}, {0x87, 0x4A}, /* 0x5C-0x5F */ + {0x87, 0x4B}, {0x87, 0x4D}, {0x87, 0x4F}, {0x87, 0x50}, /* 0x60-0x63 */ + {0x87, 0x51}, {0x87, 0x52}, {0x87, 0x54}, {0x87, 0x55}, /* 0x64-0x67 */ + {0x87, 0x56}, {0x87, 0x58}, {0x87, 0x5A}, {0x87, 0x5B}, /* 0x68-0x6B */ + {0x87, 0x5C}, {0x87, 0x5D}, {0x87, 0x5E}, {0x87, 0x5F}, /* 0x6C-0x6F */ + {0x87, 0x61}, {0x87, 0x62}, {0x87, 0x66}, {0x87, 0x67}, /* 0x70-0x73 */ + {0x87, 0x68}, {0x87, 0x69}, {0x87, 0x6A}, {0x87, 0x6B}, /* 0x74-0x77 */ + {0x87, 0x6C}, {0x87, 0x6D}, {0x87, 0x6F}, {0x87, 0x71}, /* 0x78-0x7B */ + {0x87, 0x72}, {0x87, 0x73}, {0x87, 0x75}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x87, 0x77}, {0x87, 0x78}, {0x87, 0x79}, {0x87, 0x7A}, /* 0x80-0x83 */ + {0x87, 0x7F}, {0x87, 0x80}, {0x87, 0x81}, {0x87, 0x84}, /* 0x84-0x87 */ + {0x87, 0x86}, {0x87, 0x87}, {0x87, 0x89}, {0x87, 0x8A}, /* 0x88-0x8B */ + {0x87, 0x8C}, {0x87, 0x8E}, {0x87, 0x8F}, {0x87, 0x90}, /* 0x8C-0x8F */ + {0x87, 0x91}, {0x87, 0x92}, {0x87, 0x94}, {0x87, 0x95}, /* 0x90-0x93 */ + {0x87, 0x96}, {0x87, 0x98}, {0x87, 0x99}, {0x87, 0x9A}, /* 0x94-0x97 */ + {0x87, 0x9B}, {0x87, 0x9C}, {0x87, 0x9D}, {0x87, 0x9E}, /* 0x98-0x9B */ + {0x87, 0xA0}, {0x87, 0xA1}, {0x87, 0xA2}, {0x87, 0xA3}, /* 0x9C-0x9F */ + {0x87, 0xA4}, {0x5D, 0xCD}, {0x5F, 0xAE}, {0x53, 0x71}, /* 0xA0-0xA3 */ + {0x97, 0xE6}, {0x8F, 0xDD}, {0x68, 0x45}, {0x56, 0xF4}, /* 0xA4-0xA7 */ + {0x55, 0x2F}, {0x60, 0xDF}, {0x4E, 0x3A}, {0x6F, 0x4D}, /* 0xA8-0xAB */ + {0x7E, 0xF4}, {0x82, 0xC7}, {0x84, 0x0E}, {0x59, 0xD4}, /* 0xAC-0xAF */ + {0x4F, 0x1F}, {0x4F, 0x2A}, {0x5C, 0x3E}, {0x7E, 0xAC}, /* 0xB0-0xB3 */ + {0x67, 0x2A}, {0x85, 0x1A}, {0x54, 0x73}, {0x75, 0x4F}, /* 0xB4-0xB7 */ + {0x80, 0xC3}, {0x55, 0x82}, {0x9B, 0x4F}, {0x4F, 0x4D}, /* 0xB8-0xBB */ + {0x6E, 0x2D}, {0x8C, 0x13}, {0x5C, 0x09}, {0x61, 0x70}, /* 0xBC-0xBF */ + {0x53, 0x6B}, {0x76, 0x1F}, {0x6E, 0x29}, {0x86, 0x8A}, /* 0xC0-0xC3 */ + {0x65, 0x87}, {0x95, 0xFB}, {0x7E, 0xB9}, {0x54, 0x3B}, /* 0xC4-0xC7 */ + {0x7A, 0x33}, {0x7D, 0x0A}, {0x95, 0xEE}, {0x55, 0xE1}, /* 0xC8-0xCB */ + {0x7F, 0xC1}, {0x74, 0xEE}, {0x63, 0x1D}, {0x87, 0x17}, /* 0xCC-0xCF */ + {0x6D, 0xA1}, {0x7A, 0x9D}, {0x62, 0x11}, {0x65, 0xA1}, /* 0xD0-0xD3 */ + {0x53, 0x67}, {0x63, 0xE1}, {0x6C, 0x83}, {0x5D, 0xEB}, /* 0xD4-0xD7 */ + {0x54, 0x5C}, {0x94, 0xA8}, {0x4E, 0x4C}, {0x6C, 0x61}, /* 0xD8-0xDB */ + {0x8B, 0xEC}, {0x5C, 0x4B}, {0x65, 0xE0}, {0x82, 0x9C}, /* 0xDC-0xDF */ + {0x68, 0xA7}, {0x54, 0x3E}, {0x54, 0x34}, {0x6B, 0xCB}, /* 0xE0-0xE3 */ + {0x6B, 0x66}, {0x4E, 0x94}, {0x63, 0x42}, {0x53, 0x48}, /* 0xE4-0xE7 */ + {0x82, 0x1E}, {0x4F, 0x0D}, {0x4F, 0xAE}, {0x57, 0x5E}, /* 0xE8-0xEB */ + {0x62, 0x0A}, {0x96, 0xFE}, {0x66, 0x64}, {0x72, 0x69}, /* 0xEC-0xEF */ + {0x52, 0xFF}, {0x52, 0xA1}, {0x60, 0x9F}, {0x8B, 0xEF}, /* 0xF0-0xF3 */ + {0x66, 0x14}, {0x71, 0x99}, {0x67, 0x90}, {0x89, 0x7F}, /* 0xF4-0xF7 */ + {0x78, 0x52}, {0x77, 0xFD}, {0x66, 0x70}, {0x56, 0x3B}, /* 0xF8-0xFB */ + {0x54, 0x38}, {0x95, 0x21}, {0x72, 0x7A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x87, 0xA5}, {0x87, 0xA6}, {0x87, 0xA7}, {0x87, 0xA9}, /* 0x40-0x43 */ + {0x87, 0xAA}, {0x87, 0xAE}, {0x87, 0xB0}, {0x87, 0xB1}, /* 0x44-0x47 */ + {0x87, 0xB2}, {0x87, 0xB4}, {0x87, 0xB6}, {0x87, 0xB7}, /* 0x48-0x4B */ + {0x87, 0xB8}, {0x87, 0xB9}, {0x87, 0xBB}, {0x87, 0xBC}, /* 0x4C-0x4F */ + {0x87, 0xBE}, {0x87, 0xBF}, {0x87, 0xC1}, {0x87, 0xC2}, /* 0x50-0x53 */ + {0x87, 0xC3}, {0x87, 0xC4}, {0x87, 0xC5}, {0x87, 0xC7}, /* 0x54-0x57 */ + {0x87, 0xC8}, {0x87, 0xC9}, {0x87, 0xCC}, {0x87, 0xCD}, /* 0x58-0x5B */ + {0x87, 0xCE}, {0x87, 0xCF}, {0x87, 0xD0}, {0x87, 0xD4}, /* 0x5C-0x5F */ + {0x87, 0xD5}, {0x87, 0xD6}, {0x87, 0xD7}, {0x87, 0xD8}, /* 0x60-0x63 */ + {0x87, 0xD9}, {0x87, 0xDA}, {0x87, 0xDC}, {0x87, 0xDD}, /* 0x64-0x67 */ + {0x87, 0xDE}, {0x87, 0xDF}, {0x87, 0xE1}, {0x87, 0xE2}, /* 0x68-0x6B */ + {0x87, 0xE3}, {0x87, 0xE4}, {0x87, 0xE6}, {0x87, 0xE7}, /* 0x6C-0x6F */ + {0x87, 0xE8}, {0x87, 0xE9}, {0x87, 0xEB}, {0x87, 0xEC}, /* 0x70-0x73 */ + {0x87, 0xED}, {0x87, 0xEF}, {0x87, 0xF0}, {0x87, 0xF1}, /* 0x74-0x77 */ + {0x87, 0xF2}, {0x87, 0xF3}, {0x87, 0xF4}, {0x87, 0xF5}, /* 0x78-0x7B */ + {0x87, 0xF6}, {0x87, 0xF7}, {0x87, 0xF8}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x87, 0xFA}, {0x87, 0xFB}, {0x87, 0xFC}, {0x87, 0xFD}, /* 0x80-0x83 */ + {0x87, 0xFF}, {0x88, 0x00}, {0x88, 0x01}, {0x88, 0x02}, /* 0x84-0x87 */ + {0x88, 0x04}, {0x88, 0x05}, {0x88, 0x06}, {0x88, 0x07}, /* 0x88-0x8B */ + {0x88, 0x08}, {0x88, 0x09}, {0x88, 0x0B}, {0x88, 0x0C}, /* 0x8C-0x8F */ + {0x88, 0x0D}, {0x88, 0x0E}, {0x88, 0x0F}, {0x88, 0x10}, /* 0x90-0x93 */ + {0x88, 0x11}, {0x88, 0x12}, {0x88, 0x14}, {0x88, 0x17}, /* 0x94-0x97 */ + {0x88, 0x18}, {0x88, 0x19}, {0x88, 0x1A}, {0x88, 0x1C}, /* 0x98-0x9B */ + {0x88, 0x1D}, {0x88, 0x1E}, {0x88, 0x1F}, {0x88, 0x20}, /* 0x9C-0x9F */ + {0x88, 0x23}, {0x7A, 0x00}, {0x60, 0x6F}, {0x5E, 0x0C}, /* 0xA0-0xA3 */ + {0x60, 0x89}, {0x81, 0x9D}, {0x59, 0x15}, {0x60, 0xDC}, /* 0xA4-0xA7 */ + {0x71, 0x84}, {0x70, 0xEF}, {0x6E, 0xAA}, {0x6C, 0x50}, /* 0xA8-0xAB */ + {0x72, 0x80}, {0x6A, 0x84}, {0x88, 0xAD}, {0x5E, 0x2D}, /* 0xAC-0xAF */ + {0x4E, 0x60}, {0x5A, 0xB3}, {0x55, 0x9C}, {0x94, 0xE3}, /* 0xB0-0xB3 */ + {0x6D, 0x17}, {0x7C, 0xFB}, {0x96, 0x99}, {0x62, 0x0F}, /* 0xB4-0xB7 */ + {0x7E, 0xC6}, {0x77, 0x8E}, {0x86, 0x7E}, {0x53, 0x23}, /* 0xB8-0xBB */ + {0x97, 0x1E}, {0x8F, 0x96}, {0x66, 0x87}, {0x5C, 0xE1}, /* 0xBC-0xBF */ + {0x4F, 0xA0}, {0x72, 0xED}, {0x4E, 0x0B}, {0x53, 0xA6}, /* 0xC0-0xC3 */ + {0x59, 0x0F}, {0x54, 0x13}, {0x63, 0x80}, {0x95, 0x28}, /* 0xC4-0xC7 */ + {0x51, 0x48}, {0x4E, 0xD9}, {0x9C, 0x9C}, {0x7E, 0xA4}, /* 0xC8-0xCB */ + {0x54, 0xB8}, {0x8D, 0x24}, {0x88, 0x54}, {0x82, 0x37}, /* 0xCC-0xCF */ + {0x95, 0xF2}, {0x6D, 0x8E}, {0x5F, 0x26}, {0x5A, 0xCC}, /* 0xD0-0xD3 */ + {0x66, 0x3E}, {0x96, 0x69}, {0x73, 0xB0}, {0x73, 0x2E}, /* 0xD4-0xD7 */ + {0x53, 0xBF}, {0x81, 0x7A}, {0x99, 0x85}, {0x7F, 0xA1}, /* 0xD8-0xDB */ + {0x5B, 0xAA}, {0x96, 0x77}, {0x96, 0x50}, {0x7E, 0xBF}, /* 0xDC-0xDF */ + {0x76, 0xF8}, {0x53, 0xA2}, {0x95, 0x76}, {0x99, 0x99}, /* 0xE0-0xE3 */ + {0x7B, 0xB1}, {0x89, 0x44}, {0x6E, 0x58}, {0x4E, 0x61}, /* 0xE4-0xE7 */ + {0x7F, 0xD4}, {0x79, 0x65}, {0x8B, 0xE6}, {0x60, 0xF3}, /* 0xE8-0xEB */ + {0x54, 0xCD}, {0x4E, 0xAB}, {0x98, 0x79}, {0x5D, 0xF7}, /* 0xEC-0xEF */ + {0x6A, 0x61}, {0x50, 0xCF}, {0x54, 0x11}, {0x8C, 0x61}, /* 0xF0-0xF3 */ + {0x84, 0x27}, {0x78, 0x5D}, {0x97, 0x04}, {0x52, 0x4A}, /* 0xF4-0xF7 */ + {0x54, 0xEE}, {0x56, 0xA3}, {0x95, 0x00}, {0x6D, 0x88}, /* 0xF8-0xFB */ + {0x5B, 0xB5}, {0x6D, 0xC6}, {0x66, 0x53}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x88, 0x24}, {0x88, 0x25}, {0x88, 0x26}, {0x88, 0x27}, /* 0x40-0x43 */ + {0x88, 0x28}, {0x88, 0x29}, {0x88, 0x2A}, {0x88, 0x2B}, /* 0x44-0x47 */ + {0x88, 0x2C}, {0x88, 0x2D}, {0x88, 0x2E}, {0x88, 0x2F}, /* 0x48-0x4B */ + {0x88, 0x30}, {0x88, 0x31}, {0x88, 0x33}, {0x88, 0x34}, /* 0x4C-0x4F */ + {0x88, 0x35}, {0x88, 0x36}, {0x88, 0x37}, {0x88, 0x38}, /* 0x50-0x53 */ + {0x88, 0x3A}, {0x88, 0x3B}, {0x88, 0x3D}, {0x88, 0x3E}, /* 0x54-0x57 */ + {0x88, 0x3F}, {0x88, 0x41}, {0x88, 0x42}, {0x88, 0x43}, /* 0x58-0x5B */ + {0x88, 0x46}, {0x88, 0x47}, {0x88, 0x48}, {0x88, 0x49}, /* 0x5C-0x5F */ + {0x88, 0x4A}, {0x88, 0x4B}, {0x88, 0x4E}, {0x88, 0x4F}, /* 0x60-0x63 */ + {0x88, 0x50}, {0x88, 0x51}, {0x88, 0x52}, {0x88, 0x53}, /* 0x64-0x67 */ + {0x88, 0x55}, {0x88, 0x56}, {0x88, 0x58}, {0x88, 0x5A}, /* 0x68-0x6B */ + {0x88, 0x5B}, {0x88, 0x5C}, {0x88, 0x5D}, {0x88, 0x5E}, /* 0x6C-0x6F */ + {0x88, 0x5F}, {0x88, 0x60}, {0x88, 0x66}, {0x88, 0x67}, /* 0x70-0x73 */ + {0x88, 0x6A}, {0x88, 0x6D}, {0x88, 0x6F}, {0x88, 0x71}, /* 0x74-0x77 */ + {0x88, 0x73}, {0x88, 0x74}, {0x88, 0x75}, {0x88, 0x76}, /* 0x78-0x7B */ + {0x88, 0x78}, {0x88, 0x79}, {0x88, 0x7A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x88, 0x7B}, {0x88, 0x7C}, {0x88, 0x80}, {0x88, 0x83}, /* 0x80-0x83 */ + {0x88, 0x86}, {0x88, 0x87}, {0x88, 0x89}, {0x88, 0x8A}, /* 0x84-0x87 */ + {0x88, 0x8C}, {0x88, 0x8E}, {0x88, 0x8F}, {0x88, 0x90}, /* 0x88-0x8B */ + {0x88, 0x91}, {0x88, 0x93}, {0x88, 0x94}, {0x88, 0x95}, /* 0x8C-0x8F */ + {0x88, 0x97}, {0x88, 0x98}, {0x88, 0x99}, {0x88, 0x9A}, /* 0x90-0x93 */ + {0x88, 0x9B}, {0x88, 0x9D}, {0x88, 0x9E}, {0x88, 0x9F}, /* 0x94-0x97 */ + {0x88, 0xA0}, {0x88, 0xA1}, {0x88, 0xA3}, {0x88, 0xA5}, /* 0x98-0x9B */ + {0x88, 0xA6}, {0x88, 0xA7}, {0x88, 0xA8}, {0x88, 0xA9}, /* 0x9C-0x9F */ + {0x88, 0xAA}, {0x5C, 0x0F}, {0x5B, 0x5D}, {0x68, 0x21}, /* 0xA0-0xA3 */ + {0x80, 0x96}, {0x55, 0x78}, {0x7B, 0x11}, {0x65, 0x48}, /* 0xA4-0xA7 */ + {0x69, 0x54}, {0x4E, 0x9B}, {0x6B, 0x47}, {0x87, 0x4E}, /* 0xA8-0xAB */ + {0x97, 0x8B}, {0x53, 0x4F}, {0x63, 0x1F}, {0x64, 0x3A}, /* 0xAC-0xAF */ + {0x90, 0xAA}, {0x65, 0x9C}, {0x80, 0xC1}, {0x8C, 0x10}, /* 0xB0-0xB3 */ + {0x51, 0x99}, {0x68, 0xB0}, {0x53, 0x78}, {0x87, 0xF9}, /* 0xB4-0xB7 */ + {0x61, 0xC8}, {0x6C, 0xC4}, {0x6C, 0xFB}, {0x8C, 0x22}, /* 0xB8-0xBB */ + {0x5C, 0x51}, {0x85, 0xAA}, {0x82, 0xAF}, {0x95, 0x0C}, /* 0xBC-0xBF */ + {0x6B, 0x23}, {0x8F, 0x9B}, {0x65, 0xB0}, {0x5F, 0xFB}, /* 0xC0-0xC3 */ + {0x5F, 0xC3}, {0x4F, 0xE1}, {0x88, 0x45}, {0x66, 0x1F}, /* 0xC4-0xC7 */ + {0x81, 0x65}, {0x73, 0x29}, {0x60, 0xFA}, {0x51, 0x74}, /* 0xC8-0xCB */ + {0x52, 0x11}, {0x57, 0x8B}, {0x5F, 0x62}, {0x90, 0xA2}, /* 0xCC-0xCF */ + {0x88, 0x4C}, {0x91, 0x92}, {0x5E, 0x78}, {0x67, 0x4F}, /* 0xD0-0xD3 */ + {0x60, 0x27}, {0x59, 0xD3}, {0x51, 0x44}, {0x51, 0xF6}, /* 0xD4-0xD7 */ + {0x80, 0xF8}, {0x53, 0x08}, {0x6C, 0x79}, {0x96, 0xC4}, /* 0xD8-0xDB */ + {0x71, 0x8A}, {0x4F, 0x11}, {0x4F, 0xEE}, {0x7F, 0x9E}, /* 0xDC-0xDF */ + {0x67, 0x3D}, {0x55, 0xC5}, {0x95, 0x08}, {0x79, 0xC0}, /* 0xE0-0xE3 */ + {0x88, 0x96}, {0x7E, 0xE3}, {0x58, 0x9F}, {0x62, 0x0C}, /* 0xE4-0xE7 */ + {0x97, 0x00}, {0x86, 0x5A}, {0x56, 0x18}, {0x98, 0x7B}, /* 0xE8-0xEB */ + {0x5F, 0x90}, {0x8B, 0xB8}, {0x84, 0xC4}, {0x91, 0x57}, /* 0xEC-0xEF */ + {0x53, 0xD9}, {0x65, 0xED}, {0x5E, 0x8F}, {0x75, 0x5C}, /* 0xF0-0xF3 */ + {0x60, 0x64}, {0x7D, 0x6E}, {0x5A, 0x7F}, {0x7E, 0xEA}, /* 0xF4-0xF7 */ + {0x7E, 0xED}, {0x8F, 0x69}, {0x55, 0xA7}, {0x5B, 0xA3}, /* 0xF8-0xFB */ + {0x60, 0xAC}, {0x65, 0xCB}, {0x73, 0x84}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x88, 0xAC}, {0x88, 0xAE}, {0x88, 0xAF}, {0x88, 0xB0}, /* 0x40-0x43 */ + {0x88, 0xB2}, {0x88, 0xB3}, {0x88, 0xB4}, {0x88, 0xB5}, /* 0x44-0x47 */ + {0x88, 0xB6}, {0x88, 0xB8}, {0x88, 0xB9}, {0x88, 0xBA}, /* 0x48-0x4B */ + {0x88, 0xBB}, {0x88, 0xBD}, {0x88, 0xBE}, {0x88, 0xBF}, /* 0x4C-0x4F */ + {0x88, 0xC0}, {0x88, 0xC3}, {0x88, 0xC4}, {0x88, 0xC7}, /* 0x50-0x53 */ + {0x88, 0xC8}, {0x88, 0xCA}, {0x88, 0xCB}, {0x88, 0xCC}, /* 0x54-0x57 */ + {0x88, 0xCD}, {0x88, 0xCF}, {0x88, 0xD0}, {0x88, 0xD1}, /* 0x58-0x5B */ + {0x88, 0xD3}, {0x88, 0xD6}, {0x88, 0xD7}, {0x88, 0xDA}, /* 0x5C-0x5F */ + {0x88, 0xDB}, {0x88, 0xDC}, {0x88, 0xDD}, {0x88, 0xDE}, /* 0x60-0x63 */ + {0x88, 0xE0}, {0x88, 0xE1}, {0x88, 0xE6}, {0x88, 0xE7}, /* 0x64-0x67 */ + {0x88, 0xE9}, {0x88, 0xEA}, {0x88, 0xEB}, {0x88, 0xEC}, /* 0x68-0x6B */ + {0x88, 0xED}, {0x88, 0xEE}, {0x88, 0xEF}, {0x88, 0xF2}, /* 0x6C-0x6F */ + {0x88, 0xF5}, {0x88, 0xF6}, {0x88, 0xF7}, {0x88, 0xFA}, /* 0x70-0x73 */ + {0x88, 0xFB}, {0x88, 0xFD}, {0x88, 0xFF}, {0x89, 0x00}, /* 0x74-0x77 */ + {0x89, 0x01}, {0x89, 0x03}, {0x89, 0x04}, {0x89, 0x05}, /* 0x78-0x7B */ + {0x89, 0x06}, {0x89, 0x07}, {0x89, 0x08}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x89, 0x09}, {0x89, 0x0B}, {0x89, 0x0C}, {0x89, 0x0D}, /* 0x80-0x83 */ + {0x89, 0x0E}, {0x89, 0x0F}, {0x89, 0x11}, {0x89, 0x14}, /* 0x84-0x87 */ + {0x89, 0x15}, {0x89, 0x16}, {0x89, 0x17}, {0x89, 0x18}, /* 0x88-0x8B */ + {0x89, 0x1C}, {0x89, 0x1D}, {0x89, 0x1E}, {0x89, 0x1F}, /* 0x8C-0x8F */ + {0x89, 0x20}, {0x89, 0x22}, {0x89, 0x23}, {0x89, 0x24}, /* 0x90-0x93 */ + {0x89, 0x26}, {0x89, 0x27}, {0x89, 0x28}, {0x89, 0x29}, /* 0x94-0x97 */ + {0x89, 0x2C}, {0x89, 0x2D}, {0x89, 0x2E}, {0x89, 0x2F}, /* 0x98-0x9B */ + {0x89, 0x31}, {0x89, 0x32}, {0x89, 0x33}, {0x89, 0x35}, /* 0x9C-0x9F */ + {0x89, 0x37}, {0x90, 0x09}, {0x76, 0x63}, {0x77, 0x29}, /* 0xA0-0xA3 */ + {0x7E, 0xDA}, {0x97, 0x74}, {0x85, 0x9B}, {0x5B, 0x66}, /* 0xA4-0xA7 */ + {0x7A, 0x74}, {0x96, 0xEA}, {0x88, 0x40}, {0x52, 0xCB}, /* 0xA8-0xAB */ + {0x71, 0x8F}, {0x5F, 0xAA}, {0x65, 0xEC}, {0x8B, 0xE2}, /* 0xAC-0xAF */ + {0x5B, 0xFB}, {0x9A, 0x6F}, {0x5D, 0xE1}, {0x6B, 0x89}, /* 0xB0-0xB3 */ + {0x6C, 0x5B}, {0x8B, 0xAD}, {0x8B, 0xAF}, {0x90, 0x0A}, /* 0xB4-0xB7 */ + {0x8F, 0xC5}, {0x53, 0x8B}, {0x62, 0xBC}, {0x9E, 0x26}, /* 0xB8-0xBB */ + {0x9E, 0x2D}, {0x54, 0x40}, {0x4E, 0x2B}, {0x82, 0xBD}, /* 0xBC-0xBF */ + {0x72, 0x59}, {0x86, 0x9C}, {0x5D, 0x16}, {0x88, 0x59}, /* 0xC0-0xC3 */ + {0x6D, 0xAF}, {0x96, 0xC5}, {0x54, 0xD1}, {0x4E, 0x9A}, /* 0xC4-0xC7 */ + {0x8B, 0xB6}, {0x71, 0x09}, {0x54, 0xBD}, {0x96, 0x09}, /* 0xC8-0xCB */ + {0x70, 0xDF}, {0x6D, 0xF9}, {0x76, 0xD0}, {0x4E, 0x25}, /* 0xCC-0xCF */ + {0x78, 0x14}, {0x87, 0x12}, {0x5C, 0xA9}, {0x5E, 0xF6}, /* 0xD0-0xD3 */ + {0x8A, 0x00}, {0x98, 0x9C}, {0x96, 0x0E}, {0x70, 0x8E}, /* 0xD4-0xD7 */ + {0x6C, 0xBF}, {0x59, 0x44}, {0x63, 0xA9}, {0x77, 0x3C}, /* 0xD8-0xDB */ + {0x88, 0x4D}, {0x6F, 0x14}, {0x82, 0x73}, {0x58, 0x30}, /* 0xDC-0xDF */ + {0x71, 0xD5}, {0x53, 0x8C}, {0x78, 0x1A}, {0x96, 0xC1}, /* 0xE0-0xE3 */ + {0x55, 0x01}, {0x5F, 0x66}, {0x71, 0x30}, {0x5B, 0xB4}, /* 0xE4-0xE7 */ + {0x8C, 0x1A}, {0x9A, 0x8C}, {0x6B, 0x83}, {0x59, 0x2E}, /* 0xE8-0xEB */ + {0x9E, 0x2F}, {0x79, 0xE7}, {0x67, 0x68}, {0x62, 0x6C}, /* 0xEC-0xEF */ + {0x4F, 0x6F}, {0x75, 0xA1}, {0x7F, 0x8A}, {0x6D, 0x0B}, /* 0xF0-0xF3 */ + {0x96, 0x33}, {0x6C, 0x27}, {0x4E, 0xF0}, {0x75, 0xD2}, /* 0xF4-0xF7 */ + {0x51, 0x7B}, {0x68, 0x37}, {0x6F, 0x3E}, {0x90, 0x80}, /* 0xF8-0xFB */ + {0x81, 0x70}, {0x59, 0x96}, {0x74, 0x76}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x89, 0x38}, {0x89, 0x39}, {0x89, 0x3A}, {0x89, 0x3B}, /* 0x40-0x43 */ + {0x89, 0x3C}, {0x89, 0x3D}, {0x89, 0x3E}, {0x89, 0x3F}, /* 0x44-0x47 */ + {0x89, 0x40}, {0x89, 0x42}, {0x89, 0x43}, {0x89, 0x45}, /* 0x48-0x4B */ + {0x89, 0x46}, {0x89, 0x47}, {0x89, 0x48}, {0x89, 0x49}, /* 0x4C-0x4F */ + {0x89, 0x4A}, {0x89, 0x4B}, {0x89, 0x4C}, {0x89, 0x4D}, /* 0x50-0x53 */ + {0x89, 0x4E}, {0x89, 0x4F}, {0x89, 0x50}, {0x89, 0x51}, /* 0x54-0x57 */ + {0x89, 0x52}, {0x89, 0x53}, {0x89, 0x54}, {0x89, 0x55}, /* 0x58-0x5B */ + {0x89, 0x56}, {0x89, 0x57}, {0x89, 0x58}, {0x89, 0x59}, /* 0x5C-0x5F */ + {0x89, 0x5A}, {0x89, 0x5B}, {0x89, 0x5C}, {0x89, 0x5D}, /* 0x60-0x63 */ + {0x89, 0x60}, {0x89, 0x61}, {0x89, 0x62}, {0x89, 0x63}, /* 0x64-0x67 */ + {0x89, 0x64}, {0x89, 0x65}, {0x89, 0x67}, {0x89, 0x68}, /* 0x68-0x6B */ + {0x89, 0x69}, {0x89, 0x6A}, {0x89, 0x6B}, {0x89, 0x6C}, /* 0x6C-0x6F */ + {0x89, 0x6D}, {0x89, 0x6E}, {0x89, 0x6F}, {0x89, 0x70}, /* 0x70-0x73 */ + {0x89, 0x71}, {0x89, 0x72}, {0x89, 0x73}, {0x89, 0x74}, /* 0x74-0x77 */ + {0x89, 0x75}, {0x89, 0x76}, {0x89, 0x77}, {0x89, 0x78}, /* 0x78-0x7B */ + {0x89, 0x79}, {0x89, 0x7A}, {0x89, 0x7C}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x89, 0x7D}, {0x89, 0x7E}, {0x89, 0x80}, {0x89, 0x82}, /* 0x80-0x83 */ + {0x89, 0x84}, {0x89, 0x85}, {0x89, 0x87}, {0x89, 0x88}, /* 0x84-0x87 */ + {0x89, 0x89}, {0x89, 0x8A}, {0x89, 0x8B}, {0x89, 0x8C}, /* 0x88-0x8B */ + {0x89, 0x8D}, {0x89, 0x8E}, {0x89, 0x8F}, {0x89, 0x90}, /* 0x8C-0x8F */ + {0x89, 0x91}, {0x89, 0x92}, {0x89, 0x93}, {0x89, 0x94}, /* 0x90-0x93 */ + {0x89, 0x95}, {0x89, 0x96}, {0x89, 0x97}, {0x89, 0x98}, /* 0x94-0x97 */ + {0x89, 0x99}, {0x89, 0x9A}, {0x89, 0x9B}, {0x89, 0x9C}, /* 0x98-0x9B */ + {0x89, 0x9D}, {0x89, 0x9E}, {0x89, 0x9F}, {0x89, 0xA0}, /* 0x9C-0x9F */ + {0x89, 0xA1}, {0x64, 0x47}, {0x5C, 0x27}, {0x90, 0x65}, /* 0xA0-0xA3 */ + {0x7A, 0x91}, {0x8C, 0x23}, {0x59, 0xDA}, {0x54, 0xAC}, /* 0xA4-0xA7 */ + {0x82, 0x00}, {0x83, 0x6F}, {0x89, 0x81}, {0x80, 0x00}, /* 0xA8-0xAB */ + {0x69, 0x30}, {0x56, 0x4E}, {0x80, 0x36}, {0x72, 0x37}, /* 0xAC-0xAF */ + {0x91, 0xCE}, {0x51, 0xB6}, {0x4E, 0x5F}, {0x98, 0x75}, /* 0xB0-0xB3 */ + {0x63, 0x96}, {0x4E, 0x1A}, {0x53, 0xF6}, {0x66, 0xF3}, /* 0xB4-0xB7 */ + {0x81, 0x4B}, {0x59, 0x1C}, {0x6D, 0xB2}, {0x4E, 0x00}, /* 0xB8-0xBB */ + {0x58, 0xF9}, {0x53, 0x3B}, {0x63, 0xD6}, {0x94, 0xF1}, /* 0xBC-0xBF */ + {0x4F, 0x9D}, {0x4F, 0x0A}, {0x88, 0x63}, {0x98, 0x90}, /* 0xC0-0xC3 */ + {0x59, 0x37}, {0x90, 0x57}, {0x79, 0xFB}, {0x4E, 0xEA}, /* 0xC4-0xC7 */ + {0x80, 0xF0}, {0x75, 0x91}, {0x6C, 0x82}, {0x5B, 0x9C}, /* 0xC8-0xCB */ + {0x59, 0xE8}, {0x5F, 0x5D}, {0x69, 0x05}, {0x86, 0x81}, /* 0xCC-0xCF */ + {0x50, 0x1A}, {0x5D, 0xF2}, {0x4E, 0x59}, {0x77, 0xE3}, /* 0xD0-0xD3 */ + {0x4E, 0xE5}, {0x82, 0x7A}, {0x62, 0x91}, {0x66, 0x13}, /* 0xD4-0xD7 */ + {0x90, 0x91}, {0x5C, 0x79}, {0x4E, 0xBF}, {0x5F, 0x79}, /* 0xD8-0xDB */ + {0x81, 0xC6}, {0x90, 0x38}, {0x80, 0x84}, {0x75, 0xAB}, /* 0xDC-0xDF */ + {0x4E, 0xA6}, {0x88, 0xD4}, {0x61, 0x0F}, {0x6B, 0xC5}, /* 0xE0-0xE3 */ + {0x5F, 0xC6}, {0x4E, 0x49}, {0x76, 0xCA}, {0x6E, 0xA2}, /* 0xE4-0xE7 */ + {0x8B, 0xE3}, {0x8B, 0xAE}, {0x8C, 0x0A}, {0x8B, 0xD1}, /* 0xE8-0xEB */ + {0x5F, 0x02}, {0x7F, 0xFC}, {0x7F, 0xCC}, {0x7E, 0xCE}, /* 0xEC-0xEF */ + {0x83, 0x35}, {0x83, 0x6B}, {0x56, 0xE0}, {0x6B, 0xB7}, /* 0xF0-0xF3 */ + {0x97, 0xF3}, {0x96, 0x34}, {0x59, 0xFB}, {0x54, 0x1F}, /* 0xF4-0xF7 */ + {0x94, 0xF6}, {0x6D, 0xEB}, {0x5B, 0xC5}, {0x99, 0x6E}, /* 0xF8-0xFB */ + {0x5C, 0x39}, {0x5F, 0x15}, {0x96, 0x90}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x89, 0xA2}, {0x89, 0xA3}, {0x89, 0xA4}, {0x89, 0xA5}, /* 0x40-0x43 */ + {0x89, 0xA6}, {0x89, 0xA7}, {0x89, 0xA8}, {0x89, 0xA9}, /* 0x44-0x47 */ + {0x89, 0xAA}, {0x89, 0xAB}, {0x89, 0xAC}, {0x89, 0xAD}, /* 0x48-0x4B */ + {0x89, 0xAE}, {0x89, 0xAF}, {0x89, 0xB0}, {0x89, 0xB1}, /* 0x4C-0x4F */ + {0x89, 0xB2}, {0x89, 0xB3}, {0x89, 0xB4}, {0x89, 0xB5}, /* 0x50-0x53 */ + {0x89, 0xB6}, {0x89, 0xB7}, {0x89, 0xB8}, {0x89, 0xB9}, /* 0x54-0x57 */ + {0x89, 0xBA}, {0x89, 0xBB}, {0x89, 0xBC}, {0x89, 0xBD}, /* 0x58-0x5B */ + {0x89, 0xBE}, {0x89, 0xBF}, {0x89, 0xC0}, {0x89, 0xC3}, /* 0x5C-0x5F */ + {0x89, 0xCD}, {0x89, 0xD3}, {0x89, 0xD4}, {0x89, 0xD5}, /* 0x60-0x63 */ + {0x89, 0xD7}, {0x89, 0xD8}, {0x89, 0xD9}, {0x89, 0xDB}, /* 0x64-0x67 */ + {0x89, 0xDD}, {0x89, 0xDF}, {0x89, 0xE0}, {0x89, 0xE1}, /* 0x68-0x6B */ + {0x89, 0xE2}, {0x89, 0xE4}, {0x89, 0xE7}, {0x89, 0xE8}, /* 0x6C-0x6F */ + {0x89, 0xE9}, {0x89, 0xEA}, {0x89, 0xEC}, {0x89, 0xED}, /* 0x70-0x73 */ + {0x89, 0xEE}, {0x89, 0xF0}, {0x89, 0xF1}, {0x89, 0xF2}, /* 0x74-0x77 */ + {0x89, 0xF4}, {0x89, 0xF5}, {0x89, 0xF6}, {0x89, 0xF7}, /* 0x78-0x7B */ + {0x89, 0xF8}, {0x89, 0xF9}, {0x89, 0xFA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x89, 0xFB}, {0x89, 0xFC}, {0x89, 0xFD}, {0x89, 0xFE}, /* 0x80-0x83 */ + {0x89, 0xFF}, {0x8A, 0x01}, {0x8A, 0x02}, {0x8A, 0x03}, /* 0x84-0x87 */ + {0x8A, 0x04}, {0x8A, 0x05}, {0x8A, 0x06}, {0x8A, 0x08}, /* 0x88-0x8B */ + {0x8A, 0x09}, {0x8A, 0x0A}, {0x8A, 0x0B}, {0x8A, 0x0C}, /* 0x8C-0x8F */ + {0x8A, 0x0D}, {0x8A, 0x0E}, {0x8A, 0x0F}, {0x8A, 0x10}, /* 0x90-0x93 */ + {0x8A, 0x11}, {0x8A, 0x12}, {0x8A, 0x13}, {0x8A, 0x14}, /* 0x94-0x97 */ + {0x8A, 0x15}, {0x8A, 0x16}, {0x8A, 0x17}, {0x8A, 0x18}, /* 0x98-0x9B */ + {0x8A, 0x19}, {0x8A, 0x1A}, {0x8A, 0x1B}, {0x8A, 0x1C}, /* 0x9C-0x9F */ + {0x8A, 0x1D}, {0x53, 0x70}, {0x82, 0xF1}, {0x6A, 0x31}, /* 0xA0-0xA3 */ + {0x5A, 0x74}, {0x9E, 0x70}, {0x5E, 0x94}, {0x7F, 0x28}, /* 0xA4-0xA7 */ + {0x83, 0xB9}, {0x84, 0x24}, {0x84, 0x25}, {0x83, 0x67}, /* 0xA8-0xAB */ + {0x87, 0x47}, {0x8F, 0xCE}, {0x8D, 0x62}, {0x76, 0xC8}, /* 0xAC-0xAF */ + {0x5F, 0x71}, {0x98, 0x96}, {0x78, 0x6C}, {0x66, 0x20}, /* 0xB0-0xB3 */ + {0x54, 0xDF}, {0x62, 0xE5}, {0x4F, 0x63}, {0x81, 0xC3}, /* 0xB4-0xB7 */ + {0x75, 0xC8}, {0x5E, 0xB8}, {0x96, 0xCD}, {0x8E, 0x0A}, /* 0xB8-0xBB */ + {0x86, 0xF9}, {0x54, 0x8F}, {0x6C, 0xF3}, {0x6D, 0x8C}, /* 0xBC-0xBF */ + {0x6C, 0x38}, {0x60, 0x7F}, {0x52, 0xC7}, {0x75, 0x28}, /* 0xC0-0xC3 */ + {0x5E, 0x7D}, {0x4F, 0x18}, {0x60, 0xA0}, {0x5F, 0xE7}, /* 0xC4-0xC7 */ + {0x5C, 0x24}, {0x75, 0x31}, {0x90, 0xAE}, {0x94, 0xC0}, /* 0xC8-0xCB */ + {0x72, 0xB9}, {0x6C, 0xB9}, {0x6E, 0x38}, {0x91, 0x49}, /* 0xCC-0xCF */ + {0x67, 0x09}, {0x53, 0xCB}, {0x53, 0xF3}, {0x4F, 0x51}, /* 0xD0-0xD3 */ + {0x91, 0xC9}, {0x8B, 0xF1}, {0x53, 0xC8}, {0x5E, 0x7C}, /* 0xD4-0xD7 */ + {0x8F, 0xC2}, {0x6D, 0xE4}, {0x4E, 0x8E}, {0x76, 0xC2}, /* 0xD8-0xDB */ + {0x69, 0x86}, {0x86, 0x5E}, {0x61, 0x1A}, {0x82, 0x06}, /* 0xDC-0xDF */ + {0x4F, 0x59}, {0x4F, 0xDE}, {0x90, 0x3E}, {0x9C, 0x7C}, /* 0xE0-0xE3 */ + {0x61, 0x09}, {0x6E, 0x1D}, {0x6E, 0x14}, {0x96, 0x85}, /* 0xE4-0xE7 */ + {0x4E, 0x88}, {0x5A, 0x31}, {0x96, 0xE8}, {0x4E, 0x0E}, /* 0xE8-0xEB */ + {0x5C, 0x7F}, {0x79, 0xB9}, {0x5B, 0x87}, {0x8B, 0xED}, /* 0xEC-0xEF */ + {0x7F, 0xBD}, {0x73, 0x89}, {0x57, 0xDF}, {0x82, 0x8B}, /* 0xF0-0xF3 */ + {0x90, 0xC1}, {0x54, 0x01}, {0x90, 0x47}, {0x55, 0xBB}, /* 0xF4-0xF7 */ + {0x5C, 0xEA}, {0x5F, 0xA1}, {0x61, 0x08}, {0x6B, 0x32}, /* 0xF8-0xFB */ + {0x72, 0xF1}, {0x80, 0xB2}, {0x8A, 0x89}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8A, 0x1E}, {0x8A, 0x1F}, {0x8A, 0x20}, {0x8A, 0x21}, /* 0x40-0x43 */ + {0x8A, 0x22}, {0x8A, 0x23}, {0x8A, 0x24}, {0x8A, 0x25}, /* 0x44-0x47 */ + {0x8A, 0x26}, {0x8A, 0x27}, {0x8A, 0x28}, {0x8A, 0x29}, /* 0x48-0x4B */ + {0x8A, 0x2A}, {0x8A, 0x2B}, {0x8A, 0x2C}, {0x8A, 0x2D}, /* 0x4C-0x4F */ + {0x8A, 0x2E}, {0x8A, 0x2F}, {0x8A, 0x30}, {0x8A, 0x31}, /* 0x50-0x53 */ + {0x8A, 0x32}, {0x8A, 0x33}, {0x8A, 0x34}, {0x8A, 0x35}, /* 0x54-0x57 */ + {0x8A, 0x36}, {0x8A, 0x37}, {0x8A, 0x38}, {0x8A, 0x39}, /* 0x58-0x5B */ + {0x8A, 0x3A}, {0x8A, 0x3B}, {0x8A, 0x3C}, {0x8A, 0x3D}, /* 0x5C-0x5F */ + {0x8A, 0x3F}, {0x8A, 0x40}, {0x8A, 0x41}, {0x8A, 0x42}, /* 0x60-0x63 */ + {0x8A, 0x43}, {0x8A, 0x44}, {0x8A, 0x45}, {0x8A, 0x46}, /* 0x64-0x67 */ + {0x8A, 0x47}, {0x8A, 0x49}, {0x8A, 0x4A}, {0x8A, 0x4B}, /* 0x68-0x6B */ + {0x8A, 0x4C}, {0x8A, 0x4D}, {0x8A, 0x4E}, {0x8A, 0x4F}, /* 0x6C-0x6F */ + {0x8A, 0x50}, {0x8A, 0x51}, {0x8A, 0x52}, {0x8A, 0x53}, /* 0x70-0x73 */ + {0x8A, 0x54}, {0x8A, 0x55}, {0x8A, 0x56}, {0x8A, 0x57}, /* 0x74-0x77 */ + {0x8A, 0x58}, {0x8A, 0x59}, {0x8A, 0x5A}, {0x8A, 0x5B}, /* 0x78-0x7B */ + {0x8A, 0x5C}, {0x8A, 0x5D}, {0x8A, 0x5E}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8A, 0x5F}, {0x8A, 0x60}, {0x8A, 0x61}, {0x8A, 0x62}, /* 0x80-0x83 */ + {0x8A, 0x63}, {0x8A, 0x64}, {0x8A, 0x65}, {0x8A, 0x66}, /* 0x84-0x87 */ + {0x8A, 0x67}, {0x8A, 0x68}, {0x8A, 0x69}, {0x8A, 0x6A}, /* 0x88-0x8B */ + {0x8A, 0x6B}, {0x8A, 0x6C}, {0x8A, 0x6D}, {0x8A, 0x6E}, /* 0x8C-0x8F */ + {0x8A, 0x6F}, {0x8A, 0x70}, {0x8A, 0x71}, {0x8A, 0x72}, /* 0x90-0x93 */ + {0x8A, 0x73}, {0x8A, 0x74}, {0x8A, 0x75}, {0x8A, 0x76}, /* 0x94-0x97 */ + {0x8A, 0x77}, {0x8A, 0x78}, {0x8A, 0x7A}, {0x8A, 0x7B}, /* 0x98-0x9B */ + {0x8A, 0x7C}, {0x8A, 0x7D}, {0x8A, 0x7E}, {0x8A, 0x7F}, /* 0x9C-0x9F */ + {0x8A, 0x80}, {0x6D, 0x74}, {0x5B, 0xD3}, {0x88, 0xD5}, /* 0xA0-0xA3 */ + {0x98, 0x84}, {0x8C, 0x6B}, {0x9A, 0x6D}, {0x9E, 0x33}, /* 0xA4-0xA7 */ + {0x6E, 0x0A}, {0x51, 0xA4}, {0x51, 0x43}, {0x57, 0xA3}, /* 0xA8-0xAB */ + {0x88, 0x81}, {0x53, 0x9F}, {0x63, 0xF4}, {0x8F, 0x95}, /* 0xAC-0xAF */ + {0x56, 0xED}, {0x54, 0x58}, {0x57, 0x06}, {0x73, 0x3F}, /* 0xB0-0xB3 */ + {0x6E, 0x90}, {0x7F, 0x18}, {0x8F, 0xDC}, {0x82, 0xD1}, /* 0xB4-0xB7 */ + {0x61, 0x3F}, {0x60, 0x28}, {0x96, 0x62}, {0x66, 0xF0}, /* 0xB8-0xBB */ + {0x7E, 0xA6}, {0x8D, 0x8A}, {0x8D, 0xC3}, {0x94, 0xA5}, /* 0xBC-0xBF */ + {0x5C, 0xB3}, {0x7C, 0xA4}, {0x67, 0x08}, {0x60, 0xA6}, /* 0xC0-0xC3 */ + {0x96, 0x05}, {0x80, 0x18}, {0x4E, 0x91}, {0x90, 0xE7}, /* 0xC4-0xC7 */ + {0x53, 0x00}, {0x96, 0x68}, {0x51, 0x41}, {0x8F, 0xD0}, /* 0xC8-0xCB */ + {0x85, 0x74}, {0x91, 0x5D}, {0x66, 0x55}, {0x97, 0xF5}, /* 0xCC-0xCF */ + {0x5B, 0x55}, {0x53, 0x1D}, {0x78, 0x38}, {0x67, 0x42}, /* 0xD0-0xD3 */ + {0x68, 0x3D}, {0x54, 0xC9}, {0x70, 0x7E}, {0x5B, 0xB0}, /* 0xD4-0xD7 */ + {0x8F, 0x7D}, {0x51, 0x8D}, {0x57, 0x28}, {0x54, 0xB1}, /* 0xD8-0xDB */ + {0x65, 0x12}, {0x66, 0x82}, {0x8D, 0x5E}, {0x8D, 0x43}, /* 0xDC-0xDF */ + {0x81, 0x0F}, {0x84, 0x6C}, {0x90, 0x6D}, {0x7C, 0xDF}, /* 0xE0-0xE3 */ + {0x51, 0xFF}, {0x85, 0xFB}, {0x67, 0xA3}, {0x65, 0xE9}, /* 0xE4-0xE7 */ + {0x6F, 0xA1}, {0x86, 0xA4}, {0x8E, 0x81}, {0x56, 0x6A}, /* 0xE8-0xEB */ + {0x90, 0x20}, {0x76, 0x82}, {0x70, 0x76}, {0x71, 0xE5}, /* 0xEC-0xEF */ + {0x8D, 0x23}, {0x62, 0xE9}, {0x52, 0x19}, {0x6C, 0xFD}, /* 0xF0-0xF3 */ + {0x8D, 0x3C}, {0x60, 0x0E}, {0x58, 0x9E}, {0x61, 0x8E}, /* 0xF4-0xF7 */ + {0x66, 0xFE}, {0x8D, 0x60}, {0x62, 0x4E}, {0x55, 0xB3}, /* 0xF8-0xFB */ + {0x6E, 0x23}, {0x67, 0x2D}, {0x8F, 0x67}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8A, 0x81}, {0x8A, 0x82}, {0x8A, 0x83}, {0x8A, 0x84}, /* 0x40-0x43 */ + {0x8A, 0x85}, {0x8A, 0x86}, {0x8A, 0x87}, {0x8A, 0x88}, /* 0x44-0x47 */ + {0x8A, 0x8B}, {0x8A, 0x8C}, {0x8A, 0x8D}, {0x8A, 0x8E}, /* 0x48-0x4B */ + {0x8A, 0x8F}, {0x8A, 0x90}, {0x8A, 0x91}, {0x8A, 0x92}, /* 0x4C-0x4F */ + {0x8A, 0x94}, {0x8A, 0x95}, {0x8A, 0x96}, {0x8A, 0x97}, /* 0x50-0x53 */ + {0x8A, 0x98}, {0x8A, 0x99}, {0x8A, 0x9A}, {0x8A, 0x9B}, /* 0x54-0x57 */ + {0x8A, 0x9C}, {0x8A, 0x9D}, {0x8A, 0x9E}, {0x8A, 0x9F}, /* 0x58-0x5B */ + {0x8A, 0xA0}, {0x8A, 0xA1}, {0x8A, 0xA2}, {0x8A, 0xA3}, /* 0x5C-0x5F */ + {0x8A, 0xA4}, {0x8A, 0xA5}, {0x8A, 0xA6}, {0x8A, 0xA7}, /* 0x60-0x63 */ + {0x8A, 0xA8}, {0x8A, 0xA9}, {0x8A, 0xAA}, {0x8A, 0xAB}, /* 0x64-0x67 */ + {0x8A, 0xAC}, {0x8A, 0xAD}, {0x8A, 0xAE}, {0x8A, 0xAF}, /* 0x68-0x6B */ + {0x8A, 0xB0}, {0x8A, 0xB1}, {0x8A, 0xB2}, {0x8A, 0xB3}, /* 0x6C-0x6F */ + {0x8A, 0xB4}, {0x8A, 0xB5}, {0x8A, 0xB6}, {0x8A, 0xB7}, /* 0x70-0x73 */ + {0x8A, 0xB8}, {0x8A, 0xB9}, {0x8A, 0xBA}, {0x8A, 0xBB}, /* 0x74-0x77 */ + {0x8A, 0xBC}, {0x8A, 0xBD}, {0x8A, 0xBE}, {0x8A, 0xBF}, /* 0x78-0x7B */ + {0x8A, 0xC0}, {0x8A, 0xC1}, {0x8A, 0xC2}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8A, 0xC3}, {0x8A, 0xC4}, {0x8A, 0xC5}, {0x8A, 0xC6}, /* 0x80-0x83 */ + {0x8A, 0xC7}, {0x8A, 0xC8}, {0x8A, 0xC9}, {0x8A, 0xCA}, /* 0x84-0x87 */ + {0x8A, 0xCB}, {0x8A, 0xCC}, {0x8A, 0xCD}, {0x8A, 0xCE}, /* 0x88-0x8B */ + {0x8A, 0xCF}, {0x8A, 0xD0}, {0x8A, 0xD1}, {0x8A, 0xD2}, /* 0x8C-0x8F */ + {0x8A, 0xD3}, {0x8A, 0xD4}, {0x8A, 0xD5}, {0x8A, 0xD6}, /* 0x90-0x93 */ + {0x8A, 0xD7}, {0x8A, 0xD8}, {0x8A, 0xD9}, {0x8A, 0xDA}, /* 0x94-0x97 */ + {0x8A, 0xDB}, {0x8A, 0xDC}, {0x8A, 0xDD}, {0x8A, 0xDE}, /* 0x98-0x9B */ + {0x8A, 0xDF}, {0x8A, 0xE0}, {0x8A, 0xE1}, {0x8A, 0xE2}, /* 0x9C-0x9F */ + {0x8A, 0xE3}, {0x94, 0xE1}, {0x95, 0xF8}, {0x77, 0x28}, /* 0xA0-0xA3 */ + {0x68, 0x05}, {0x69, 0xA8}, {0x54, 0x8B}, {0x4E, 0x4D}, /* 0xA4-0xA7 */ + {0x70, 0xB8}, {0x8B, 0xC8}, {0x64, 0x58}, {0x65, 0x8B}, /* 0xA8-0xAB */ + {0x5B, 0x85}, {0x7A, 0x84}, {0x50, 0x3A}, {0x5B, 0xE8}, /* 0xAC-0xAF */ + {0x77, 0xBB}, {0x6B, 0xE1}, {0x8A, 0x79}, {0x7C, 0x98}, /* 0xB0-0xB3 */ + {0x6C, 0xBE}, {0x76, 0xCF}, {0x65, 0xA9}, {0x8F, 0x97}, /* 0xB4-0xB7 */ + {0x5D, 0x2D}, {0x5C, 0x55}, {0x86, 0x38}, {0x68, 0x08}, /* 0xB8-0xBB */ + {0x53, 0x60}, {0x62, 0x18}, {0x7A, 0xD9}, {0x6E, 0x5B}, /* 0xBC-0xBF */ + {0x7E, 0xFD}, {0x6A, 0x1F}, {0x7A, 0xE0}, {0x5F, 0x70}, /* 0xC0-0xC3 */ + {0x6F, 0x33}, {0x5F, 0x20}, {0x63, 0x8C}, {0x6D, 0xA8}, /* 0xC4-0xC7 */ + {0x67, 0x56}, {0x4E, 0x08}, {0x5E, 0x10}, {0x8D, 0x26}, /* 0xC8-0xCB */ + {0x4E, 0xD7}, {0x80, 0xC0}, {0x76, 0x34}, {0x96, 0x9C}, /* 0xCC-0xCF */ + {0x62, 0xDB}, {0x66, 0x2D}, {0x62, 0x7E}, {0x6C, 0xBC}, /* 0xD0-0xD3 */ + {0x8D, 0x75}, {0x71, 0x67}, {0x7F, 0x69}, {0x51, 0x46}, /* 0xD4-0xD7 */ + {0x80, 0x87}, {0x53, 0xEC}, {0x90, 0x6E}, {0x62, 0x98}, /* 0xD8-0xDB */ + {0x54, 0xF2}, {0x86, 0xF0}, {0x8F, 0x99}, {0x80, 0x05}, /* 0xDC-0xDF */ + {0x95, 0x17}, {0x85, 0x17}, {0x8F, 0xD9}, {0x6D, 0x59}, /* 0xE0-0xE3 */ + {0x73, 0xCD}, {0x65, 0x9F}, {0x77, 0x1F}, {0x75, 0x04}, /* 0xE4-0xE7 */ + {0x78, 0x27}, {0x81, 0xFB}, {0x8D, 0x1E}, {0x94, 0x88}, /* 0xE8-0xEB */ + {0x4F, 0xA6}, {0x67, 0x95}, {0x75, 0xB9}, {0x8B, 0xCA}, /* 0xEC-0xEF */ + {0x97, 0x07}, {0x63, 0x2F}, {0x95, 0x47}, {0x96, 0x35}, /* 0xF0-0xF3 */ + {0x84, 0xB8}, {0x63, 0x23}, {0x77, 0x41}, {0x5F, 0x81}, /* 0xF4-0xF7 */ + {0x72, 0xF0}, {0x4E, 0x89}, {0x60, 0x14}, {0x65, 0x74}, /* 0xF8-0xFB */ + {0x62, 0xEF}, {0x6B, 0x63}, {0x65, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8A, 0xE4}, {0x8A, 0xE5}, {0x8A, 0xE6}, {0x8A, 0xE7}, /* 0x40-0x43 */ + {0x8A, 0xE8}, {0x8A, 0xE9}, {0x8A, 0xEA}, {0x8A, 0xEB}, /* 0x44-0x47 */ + {0x8A, 0xEC}, {0x8A, 0xED}, {0x8A, 0xEE}, {0x8A, 0xEF}, /* 0x48-0x4B */ + {0x8A, 0xF0}, {0x8A, 0xF1}, {0x8A, 0xF2}, {0x8A, 0xF3}, /* 0x4C-0x4F */ + {0x8A, 0xF4}, {0x8A, 0xF5}, {0x8A, 0xF6}, {0x8A, 0xF7}, /* 0x50-0x53 */ + {0x8A, 0xF8}, {0x8A, 0xF9}, {0x8A, 0xFA}, {0x8A, 0xFB}, /* 0x54-0x57 */ + {0x8A, 0xFC}, {0x8A, 0xFD}, {0x8A, 0xFE}, {0x8A, 0xFF}, /* 0x58-0x5B */ + {0x8B, 0x00}, {0x8B, 0x01}, {0x8B, 0x02}, {0x8B, 0x03}, /* 0x5C-0x5F */ + {0x8B, 0x04}, {0x8B, 0x05}, {0x8B, 0x06}, {0x8B, 0x08}, /* 0x60-0x63 */ + {0x8B, 0x09}, {0x8B, 0x0A}, {0x8B, 0x0B}, {0x8B, 0x0C}, /* 0x64-0x67 */ + {0x8B, 0x0D}, {0x8B, 0x0E}, {0x8B, 0x0F}, {0x8B, 0x10}, /* 0x68-0x6B */ + {0x8B, 0x11}, {0x8B, 0x12}, {0x8B, 0x13}, {0x8B, 0x14}, /* 0x6C-0x6F */ + {0x8B, 0x15}, {0x8B, 0x16}, {0x8B, 0x17}, {0x8B, 0x18}, /* 0x70-0x73 */ + {0x8B, 0x19}, {0x8B, 0x1A}, {0x8B, 0x1B}, {0x8B, 0x1C}, /* 0x74-0x77 */ + {0x8B, 0x1D}, {0x8B, 0x1E}, {0x8B, 0x1F}, {0x8B, 0x20}, /* 0x78-0x7B */ + {0x8B, 0x21}, {0x8B, 0x22}, {0x8B, 0x23}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8B, 0x24}, {0x8B, 0x25}, {0x8B, 0x27}, {0x8B, 0x28}, /* 0x80-0x83 */ + {0x8B, 0x29}, {0x8B, 0x2A}, {0x8B, 0x2B}, {0x8B, 0x2C}, /* 0x84-0x87 */ + {0x8B, 0x2D}, {0x8B, 0x2E}, {0x8B, 0x2F}, {0x8B, 0x30}, /* 0x88-0x8B */ + {0x8B, 0x31}, {0x8B, 0x32}, {0x8B, 0x33}, {0x8B, 0x34}, /* 0x8C-0x8F */ + {0x8B, 0x35}, {0x8B, 0x36}, {0x8B, 0x37}, {0x8B, 0x38}, /* 0x90-0x93 */ + {0x8B, 0x39}, {0x8B, 0x3A}, {0x8B, 0x3B}, {0x8B, 0x3C}, /* 0x94-0x97 */ + {0x8B, 0x3D}, {0x8B, 0x3E}, {0x8B, 0x3F}, {0x8B, 0x40}, /* 0x98-0x9B */ + {0x8B, 0x41}, {0x8B, 0x42}, {0x8B, 0x43}, {0x8B, 0x44}, /* 0x9C-0x9F */ + {0x8B, 0x45}, {0x5E, 0x27}, {0x75, 0xC7}, {0x90, 0xD1}, /* 0xA0-0xA3 */ + {0x8B, 0xC1}, {0x82, 0x9D}, {0x67, 0x9D}, {0x65, 0x2F}, /* 0xA4-0xA7 */ + {0x54, 0x31}, {0x87, 0x18}, {0x77, 0xE5}, {0x80, 0xA2}, /* 0xA8-0xAB */ + {0x81, 0x02}, {0x6C, 0x41}, {0x4E, 0x4B}, {0x7E, 0xC7}, /* 0xAC-0xAF */ + {0x80, 0x4C}, {0x76, 0xF4}, {0x69, 0x0D}, {0x6B, 0x96}, /* 0xB0-0xB3 */ + {0x62, 0x67}, {0x50, 0x3C}, {0x4F, 0x84}, {0x57, 0x40}, /* 0xB4-0xB7 */ + {0x63, 0x07}, {0x6B, 0x62}, {0x8D, 0xBE}, {0x53, 0xEA}, /* 0xB8-0xBB */ + {0x65, 0xE8}, {0x7E, 0xB8}, {0x5F, 0xD7}, {0x63, 0x1A}, /* 0xBC-0xBF */ + {0x63, 0xB7}, {0x81, 0xF3}, {0x81, 0xF4}, {0x7F, 0x6E}, /* 0xC0-0xC3 */ + {0x5E, 0x1C}, {0x5C, 0xD9}, {0x52, 0x36}, {0x66, 0x7A}, /* 0xC4-0xC7 */ + {0x79, 0xE9}, {0x7A, 0x1A}, {0x8D, 0x28}, {0x70, 0x99}, /* 0xC8-0xCB */ + {0x75, 0xD4}, {0x6E, 0xDE}, {0x6C, 0xBB}, {0x7A, 0x92}, /* 0xCC-0xCF */ + {0x4E, 0x2D}, {0x76, 0xC5}, {0x5F, 0xE0}, {0x94, 0x9F}, /* 0xD0-0xD3 */ + {0x88, 0x77}, {0x7E, 0xC8}, {0x79, 0xCD}, {0x80, 0xBF}, /* 0xD4-0xD7 */ + {0x91, 0xCD}, {0x4E, 0xF2}, {0x4F, 0x17}, {0x82, 0x1F}, /* 0xD8-0xDB */ + {0x54, 0x68}, {0x5D, 0xDE}, {0x6D, 0x32}, {0x8B, 0xCC}, /* 0xDC-0xDF */ + {0x7C, 0xA5}, {0x8F, 0x74}, {0x80, 0x98}, {0x5E, 0x1A}, /* 0xE0-0xE3 */ + {0x54, 0x92}, {0x76, 0xB1}, {0x5B, 0x99}, {0x66, 0x3C}, /* 0xE4-0xE7 */ + {0x9A, 0xA4}, {0x73, 0xE0}, {0x68, 0x2A}, {0x86, 0xDB}, /* 0xE8-0xEB */ + {0x67, 0x31}, {0x73, 0x2A}, {0x8B, 0xF8}, {0x8B, 0xDB}, /* 0xEC-0xEF */ + {0x90, 0x10}, {0x7A, 0xF9}, {0x70, 0xDB}, {0x71, 0x6E}, /* 0xF0-0xF3 */ + {0x62, 0xC4}, {0x77, 0xA9}, {0x56, 0x31}, {0x4E, 0x3B}, /* 0xF4-0xF7 */ + {0x84, 0x57}, {0x67, 0xF1}, {0x52, 0xA9}, {0x86, 0xC0}, /* 0xF8-0xFB */ + {0x8D, 0x2E}, {0x94, 0xF8}, {0x7B, 0x51}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8B, 0x46}, {0x8B, 0x47}, {0x8B, 0x48}, {0x8B, 0x49}, /* 0x40-0x43 */ + {0x8B, 0x4A}, {0x8B, 0x4B}, {0x8B, 0x4C}, {0x8B, 0x4D}, /* 0x44-0x47 */ + {0x8B, 0x4E}, {0x8B, 0x4F}, {0x8B, 0x50}, {0x8B, 0x51}, /* 0x48-0x4B */ + {0x8B, 0x52}, {0x8B, 0x53}, {0x8B, 0x54}, {0x8B, 0x55}, /* 0x4C-0x4F */ + {0x8B, 0x56}, {0x8B, 0x57}, {0x8B, 0x58}, {0x8B, 0x59}, /* 0x50-0x53 */ + {0x8B, 0x5A}, {0x8B, 0x5B}, {0x8B, 0x5C}, {0x8B, 0x5D}, /* 0x54-0x57 */ + {0x8B, 0x5E}, {0x8B, 0x5F}, {0x8B, 0x60}, {0x8B, 0x61}, /* 0x58-0x5B */ + {0x8B, 0x62}, {0x8B, 0x63}, {0x8B, 0x64}, {0x8B, 0x65}, /* 0x5C-0x5F */ + {0x8B, 0x67}, {0x8B, 0x68}, {0x8B, 0x69}, {0x8B, 0x6A}, /* 0x60-0x63 */ + {0x8B, 0x6B}, {0x8B, 0x6D}, {0x8B, 0x6E}, {0x8B, 0x6F}, /* 0x64-0x67 */ + {0x8B, 0x70}, {0x8B, 0x71}, {0x8B, 0x72}, {0x8B, 0x73}, /* 0x68-0x6B */ + {0x8B, 0x74}, {0x8B, 0x75}, {0x8B, 0x76}, {0x8B, 0x77}, /* 0x6C-0x6F */ + {0x8B, 0x78}, {0x8B, 0x79}, {0x8B, 0x7A}, {0x8B, 0x7B}, /* 0x70-0x73 */ + {0x8B, 0x7C}, {0x8B, 0x7D}, {0x8B, 0x7E}, {0x8B, 0x7F}, /* 0x74-0x77 */ + {0x8B, 0x80}, {0x8B, 0x81}, {0x8B, 0x82}, {0x8B, 0x83}, /* 0x78-0x7B */ + {0x8B, 0x84}, {0x8B, 0x85}, {0x8B, 0x86}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8B, 0x87}, {0x8B, 0x88}, {0x8B, 0x89}, {0x8B, 0x8A}, /* 0x80-0x83 */ + {0x8B, 0x8B}, {0x8B, 0x8C}, {0x8B, 0x8D}, {0x8B, 0x8E}, /* 0x84-0x87 */ + {0x8B, 0x8F}, {0x8B, 0x90}, {0x8B, 0x91}, {0x8B, 0x92}, /* 0x88-0x8B */ + {0x8B, 0x93}, {0x8B, 0x94}, {0x8B, 0x95}, {0x8B, 0x96}, /* 0x8C-0x8F */ + {0x8B, 0x97}, {0x8B, 0x98}, {0x8B, 0x99}, {0x8B, 0x9A}, /* 0x90-0x93 */ + {0x8B, 0x9B}, {0x8B, 0x9C}, {0x8B, 0x9D}, {0x8B, 0x9E}, /* 0x94-0x97 */ + {0x8B, 0x9F}, {0x8B, 0xAC}, {0x8B, 0xB1}, {0x8B, 0xBB}, /* 0x98-0x9B */ + {0x8B, 0xC7}, {0x8B, 0xD0}, {0x8B, 0xEA}, {0x8C, 0x09}, /* 0x9C-0x9F */ + {0x8C, 0x1E}, {0x4F, 0x4F}, {0x6C, 0xE8}, {0x79, 0x5D}, /* 0xA0-0xA3 */ + {0x9A, 0x7B}, {0x62, 0x93}, {0x72, 0x2A}, {0x62, 0xFD}, /* 0xA4-0xA7 */ + {0x4E, 0x13}, {0x78, 0x16}, {0x8F, 0x6C}, {0x64, 0xB0}, /* 0xA8-0xAB */ + {0x8D, 0x5A}, {0x7B, 0xC6}, {0x68, 0x69}, {0x5E, 0x84}, /* 0xAC-0xAF */ + {0x88, 0xC5}, {0x59, 0x86}, {0x64, 0x9E}, {0x58, 0xEE}, /* 0xB0-0xB3 */ + {0x72, 0xB6}, {0x69, 0x0E}, {0x95, 0x25}, {0x8F, 0xFD}, /* 0xB4-0xB7 */ + {0x8D, 0x58}, {0x57, 0x60}, {0x7F, 0x00}, {0x8C, 0x06}, /* 0xB8-0xBB */ + {0x51, 0xC6}, {0x63, 0x49}, {0x62, 0xD9}, {0x53, 0x53}, /* 0xBC-0xBF */ + {0x68, 0x4C}, {0x74, 0x22}, {0x83, 0x01}, {0x91, 0x4C}, /* 0xC0-0xC3 */ + {0x55, 0x44}, {0x77, 0x40}, {0x70, 0x7C}, {0x6D, 0x4A}, /* 0xC4-0xC7 */ + {0x51, 0x79}, {0x54, 0xA8}, {0x8D, 0x44}, {0x59, 0xFF}, /* 0xC8-0xCB */ + {0x6E, 0xCB}, {0x6D, 0xC4}, {0x5B, 0x5C}, {0x7D, 0x2B}, /* 0xCC-0xCF */ + {0x4E, 0xD4}, {0x7C, 0x7D}, {0x6E, 0xD3}, {0x5B, 0x50}, /* 0xD0-0xD3 */ + {0x81, 0xEA}, {0x6E, 0x0D}, {0x5B, 0x57}, {0x9B, 0x03}, /* 0xD4-0xD7 */ + {0x68, 0xD5}, {0x8E, 0x2A}, {0x5B, 0x97}, {0x7E, 0xFC}, /* 0xD8-0xDB */ + {0x60, 0x3B}, {0x7E, 0xB5}, {0x90, 0xB9}, {0x8D, 0x70}, /* 0xDC-0xDF */ + {0x59, 0x4F}, {0x63, 0xCD}, {0x79, 0xDF}, {0x8D, 0xB3}, /* 0xE0-0xE3 */ + {0x53, 0x52}, {0x65, 0xCF}, {0x79, 0x56}, {0x8B, 0xC5}, /* 0xE4-0xE7 */ + {0x96, 0x3B}, {0x7E, 0xC4}, {0x94, 0xBB}, {0x7E, 0x82}, /* 0xE8-0xEB */ + {0x56, 0x34}, {0x91, 0x89}, {0x67, 0x00}, {0x7F, 0x6A}, /* 0xEC-0xEF */ + {0x5C, 0x0A}, {0x90, 0x75}, {0x66, 0x28}, {0x5D, 0xE6}, /* 0xF0-0xF3 */ + {0x4F, 0x50}, {0x67, 0xDE}, {0x50, 0x5A}, {0x4F, 0x5C}, /* 0xF4-0xF7 */ + {0x57, 0x50}, {0x5E, 0xA7}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8C, 0x38}, {0x8C, 0x39}, {0x8C, 0x3A}, {0x8C, 0x3B}, /* 0x40-0x43 */ + {0x8C, 0x3C}, {0x8C, 0x3D}, {0x8C, 0x3E}, {0x8C, 0x3F}, /* 0x44-0x47 */ + {0x8C, 0x40}, {0x8C, 0x42}, {0x8C, 0x43}, {0x8C, 0x44}, /* 0x48-0x4B */ + {0x8C, 0x45}, {0x8C, 0x48}, {0x8C, 0x4A}, {0x8C, 0x4B}, /* 0x4C-0x4F */ + {0x8C, 0x4D}, {0x8C, 0x4E}, {0x8C, 0x4F}, {0x8C, 0x50}, /* 0x50-0x53 */ + {0x8C, 0x51}, {0x8C, 0x52}, {0x8C, 0x53}, {0x8C, 0x54}, /* 0x54-0x57 */ + {0x8C, 0x56}, {0x8C, 0x57}, {0x8C, 0x58}, {0x8C, 0x59}, /* 0x58-0x5B */ + {0x8C, 0x5B}, {0x8C, 0x5C}, {0x8C, 0x5D}, {0x8C, 0x5E}, /* 0x5C-0x5F */ + {0x8C, 0x5F}, {0x8C, 0x60}, {0x8C, 0x63}, {0x8C, 0x64}, /* 0x60-0x63 */ + {0x8C, 0x65}, {0x8C, 0x66}, {0x8C, 0x67}, {0x8C, 0x68}, /* 0x64-0x67 */ + {0x8C, 0x69}, {0x8C, 0x6C}, {0x8C, 0x6D}, {0x8C, 0x6E}, /* 0x68-0x6B */ + {0x8C, 0x6F}, {0x8C, 0x70}, {0x8C, 0x71}, {0x8C, 0x72}, /* 0x6C-0x6F */ + {0x8C, 0x74}, {0x8C, 0x75}, {0x8C, 0x76}, {0x8C, 0x77}, /* 0x70-0x73 */ + {0x8C, 0x7B}, {0x8C, 0x7C}, {0x8C, 0x7D}, {0x8C, 0x7E}, /* 0x74-0x77 */ + {0x8C, 0x7F}, {0x8C, 0x80}, {0x8C, 0x81}, {0x8C, 0x83}, /* 0x78-0x7B */ + {0x8C, 0x84}, {0x8C, 0x86}, {0x8C, 0x87}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8C, 0x88}, {0x8C, 0x8B}, {0x8C, 0x8D}, {0x8C, 0x8E}, /* 0x80-0x83 */ + {0x8C, 0x8F}, {0x8C, 0x90}, {0x8C, 0x91}, {0x8C, 0x92}, /* 0x84-0x87 */ + {0x8C, 0x93}, {0x8C, 0x95}, {0x8C, 0x96}, {0x8C, 0x97}, /* 0x88-0x8B */ + {0x8C, 0x99}, {0x8C, 0x9A}, {0x8C, 0x9B}, {0x8C, 0x9C}, /* 0x8C-0x8F */ + {0x8C, 0x9D}, {0x8C, 0x9E}, {0x8C, 0x9F}, {0x8C, 0xA0}, /* 0x90-0x93 */ + {0x8C, 0xA1}, {0x8C, 0xA2}, {0x8C, 0xA3}, {0x8C, 0xA4}, /* 0x94-0x97 */ + {0x8C, 0xA5}, {0x8C, 0xA6}, {0x8C, 0xA7}, {0x8C, 0xA8}, /* 0x98-0x9B */ + {0x8C, 0xA9}, {0x8C, 0xAA}, {0x8C, 0xAB}, {0x8C, 0xAC}, /* 0x9C-0x9F */ + {0x8C, 0xAD}, {0x4E, 0x8D}, {0x4E, 0x0C}, {0x51, 0x40}, /* 0xA0-0xA3 */ + {0x4E, 0x10}, {0x5E, 0xFF}, {0x53, 0x45}, {0x4E, 0x15}, /* 0xA4-0xA7 */ + {0x4E, 0x98}, {0x4E, 0x1E}, {0x9B, 0x32}, {0x5B, 0x6C}, /* 0xA8-0xAB */ + {0x56, 0x69}, {0x4E, 0x28}, {0x79, 0xBA}, {0x4E, 0x3F}, /* 0xAC-0xAF */ + {0x53, 0x15}, {0x4E, 0x47}, {0x59, 0x2D}, {0x72, 0x3B}, /* 0xB0-0xB3 */ + {0x53, 0x6E}, {0x6C, 0x10}, {0x56, 0xDF}, {0x80, 0xE4}, /* 0xB4-0xB7 */ + {0x99, 0x97}, {0x6B, 0xD3}, {0x77, 0x7E}, {0x9F, 0x17}, /* 0xB8-0xBB */ + {0x4E, 0x36}, {0x4E, 0x9F}, {0x9F, 0x10}, {0x4E, 0x5C}, /* 0xBC-0xBF */ + {0x4E, 0x69}, {0x4E, 0x93}, {0x82, 0x88}, {0x5B, 0x5B}, /* 0xC0-0xC3 */ + {0x55, 0x6C}, {0x56, 0x0F}, {0x4E, 0xC4}, {0x53, 0x8D}, /* 0xC4-0xC7 */ + {0x53, 0x9D}, {0x53, 0xA3}, {0x53, 0xA5}, {0x53, 0xAE}, /* 0xC8-0xCB */ + {0x97, 0x65}, {0x8D, 0x5D}, {0x53, 0x1A}, {0x53, 0xF5}, /* 0xCC-0xCF */ + {0x53, 0x26}, {0x53, 0x2E}, {0x53, 0x3E}, {0x8D, 0x5C}, /* 0xD0-0xD3 */ + {0x53, 0x66}, {0x53, 0x63}, {0x52, 0x02}, {0x52, 0x08}, /* 0xD4-0xD7 */ + {0x52, 0x0E}, {0x52, 0x2D}, {0x52, 0x33}, {0x52, 0x3F}, /* 0xD8-0xDB */ + {0x52, 0x40}, {0x52, 0x4C}, {0x52, 0x5E}, {0x52, 0x61}, /* 0xDC-0xDF */ + {0x52, 0x5C}, {0x84, 0xAF}, {0x52, 0x7D}, {0x52, 0x82}, /* 0xE0-0xE3 */ + {0x52, 0x81}, {0x52, 0x90}, {0x52, 0x93}, {0x51, 0x82}, /* 0xE4-0xE7 */ + {0x7F, 0x54}, {0x4E, 0xBB}, {0x4E, 0xC3}, {0x4E, 0xC9}, /* 0xE8-0xEB */ + {0x4E, 0xC2}, {0x4E, 0xE8}, {0x4E, 0xE1}, {0x4E, 0xEB}, /* 0xEC-0xEF */ + {0x4E, 0xDE}, {0x4F, 0x1B}, {0x4E, 0xF3}, {0x4F, 0x22}, /* 0xF0-0xF3 */ + {0x4F, 0x64}, {0x4E, 0xF5}, {0x4F, 0x25}, {0x4F, 0x27}, /* 0xF4-0xF7 */ + {0x4F, 0x09}, {0x4F, 0x2B}, {0x4F, 0x5E}, {0x4F, 0x67}, /* 0xF8-0xFB */ + {0x65, 0x38}, {0x4F, 0x5A}, {0x4F, 0x5D}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8C, 0xAE}, {0x8C, 0xAF}, {0x8C, 0xB0}, {0x8C, 0xB1}, /* 0x40-0x43 */ + {0x8C, 0xB2}, {0x8C, 0xB3}, {0x8C, 0xB4}, {0x8C, 0xB5}, /* 0x44-0x47 */ + {0x8C, 0xB6}, {0x8C, 0xB7}, {0x8C, 0xB8}, {0x8C, 0xB9}, /* 0x48-0x4B */ + {0x8C, 0xBA}, {0x8C, 0xBB}, {0x8C, 0xBC}, {0x8C, 0xBD}, /* 0x4C-0x4F */ + {0x8C, 0xBE}, {0x8C, 0xBF}, {0x8C, 0xC0}, {0x8C, 0xC1}, /* 0x50-0x53 */ + {0x8C, 0xC2}, {0x8C, 0xC3}, {0x8C, 0xC4}, {0x8C, 0xC5}, /* 0x54-0x57 */ + {0x8C, 0xC6}, {0x8C, 0xC7}, {0x8C, 0xC8}, {0x8C, 0xC9}, /* 0x58-0x5B */ + {0x8C, 0xCA}, {0x8C, 0xCB}, {0x8C, 0xCC}, {0x8C, 0xCD}, /* 0x5C-0x5F */ + {0x8C, 0xCE}, {0x8C, 0xCF}, {0x8C, 0xD0}, {0x8C, 0xD1}, /* 0x60-0x63 */ + {0x8C, 0xD2}, {0x8C, 0xD3}, {0x8C, 0xD4}, {0x8C, 0xD5}, /* 0x64-0x67 */ + {0x8C, 0xD6}, {0x8C, 0xD7}, {0x8C, 0xD8}, {0x8C, 0xD9}, /* 0x68-0x6B */ + {0x8C, 0xDA}, {0x8C, 0xDB}, {0x8C, 0xDC}, {0x8C, 0xDD}, /* 0x6C-0x6F */ + {0x8C, 0xDE}, {0x8C, 0xDF}, {0x8C, 0xE0}, {0x8C, 0xE1}, /* 0x70-0x73 */ + {0x8C, 0xE2}, {0x8C, 0xE3}, {0x8C, 0xE4}, {0x8C, 0xE5}, /* 0x74-0x77 */ + {0x8C, 0xE6}, {0x8C, 0xE7}, {0x8C, 0xE8}, {0x8C, 0xE9}, /* 0x78-0x7B */ + {0x8C, 0xEA}, {0x8C, 0xEB}, {0x8C, 0xEC}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8C, 0xED}, {0x8C, 0xEE}, {0x8C, 0xEF}, {0x8C, 0xF0}, /* 0x80-0x83 */ + {0x8C, 0xF1}, {0x8C, 0xF2}, {0x8C, 0xF3}, {0x8C, 0xF4}, /* 0x84-0x87 */ + {0x8C, 0xF5}, {0x8C, 0xF6}, {0x8C, 0xF7}, {0x8C, 0xF8}, /* 0x88-0x8B */ + {0x8C, 0xF9}, {0x8C, 0xFA}, {0x8C, 0xFB}, {0x8C, 0xFC}, /* 0x8C-0x8F */ + {0x8C, 0xFD}, {0x8C, 0xFE}, {0x8C, 0xFF}, {0x8D, 0x00}, /* 0x90-0x93 */ + {0x8D, 0x01}, {0x8D, 0x02}, {0x8D, 0x03}, {0x8D, 0x04}, /* 0x94-0x97 */ + {0x8D, 0x05}, {0x8D, 0x06}, {0x8D, 0x07}, {0x8D, 0x08}, /* 0x98-0x9B */ + {0x8D, 0x09}, {0x8D, 0x0A}, {0x8D, 0x0B}, {0x8D, 0x0C}, /* 0x9C-0x9F */ + {0x8D, 0x0D}, {0x4F, 0x5F}, {0x4F, 0x57}, {0x4F, 0x32}, /* 0xA0-0xA3 */ + {0x4F, 0x3D}, {0x4F, 0x76}, {0x4F, 0x74}, {0x4F, 0x91}, /* 0xA4-0xA7 */ + {0x4F, 0x89}, {0x4F, 0x83}, {0x4F, 0x8F}, {0x4F, 0x7E}, /* 0xA8-0xAB */ + {0x4F, 0x7B}, {0x4F, 0xAA}, {0x4F, 0x7C}, {0x4F, 0xAC}, /* 0xAC-0xAF */ + {0x4F, 0x94}, {0x4F, 0xE6}, {0x4F, 0xE8}, {0x4F, 0xEA}, /* 0xB0-0xB3 */ + {0x4F, 0xC5}, {0x4F, 0xDA}, {0x4F, 0xE3}, {0x4F, 0xDC}, /* 0xB4-0xB7 */ + {0x4F, 0xD1}, {0x4F, 0xDF}, {0x4F, 0xF8}, {0x50, 0x29}, /* 0xB8-0xBB */ + {0x50, 0x4C}, {0x4F, 0xF3}, {0x50, 0x2C}, {0x50, 0x0F}, /* 0xBC-0xBF */ + {0x50, 0x2E}, {0x50, 0x2D}, {0x4F, 0xFE}, {0x50, 0x1C}, /* 0xC0-0xC3 */ + {0x50, 0x0C}, {0x50, 0x25}, {0x50, 0x28}, {0x50, 0x7E}, /* 0xC4-0xC7 */ + {0x50, 0x43}, {0x50, 0x55}, {0x50, 0x48}, {0x50, 0x4E}, /* 0xC8-0xCB */ + {0x50, 0x6C}, {0x50, 0x7B}, {0x50, 0xA5}, {0x50, 0xA7}, /* 0xCC-0xCF */ + {0x50, 0xA9}, {0x50, 0xBA}, {0x50, 0xD6}, {0x51, 0x06}, /* 0xD0-0xD3 */ + {0x50, 0xED}, {0x50, 0xEC}, {0x50, 0xE6}, {0x50, 0xEE}, /* 0xD4-0xD7 */ + {0x51, 0x07}, {0x51, 0x0B}, {0x4E, 0xDD}, {0x6C, 0x3D}, /* 0xD8-0xDB */ + {0x4F, 0x58}, {0x4F, 0x65}, {0x4F, 0xCE}, {0x9F, 0xA0}, /* 0xDC-0xDF */ + {0x6C, 0x46}, {0x7C, 0x74}, {0x51, 0x6E}, {0x5D, 0xFD}, /* 0xE0-0xE3 */ + {0x9E, 0xC9}, {0x99, 0x98}, {0x51, 0x81}, {0x59, 0x14}, /* 0xE4-0xE7 */ + {0x52, 0xF9}, {0x53, 0x0D}, {0x8A, 0x07}, {0x53, 0x10}, /* 0xE8-0xEB */ + {0x51, 0xEB}, {0x59, 0x19}, {0x51, 0x55}, {0x4E, 0xA0}, /* 0xEC-0xEF */ + {0x51, 0x56}, {0x4E, 0xB3}, {0x88, 0x6E}, {0x88, 0xA4}, /* 0xF0-0xF3 */ + {0x4E, 0xB5}, {0x81, 0x14}, {0x88, 0xD2}, {0x79, 0x80}, /* 0xF4-0xF7 */ + {0x5B, 0x34}, {0x88, 0x03}, {0x7F, 0xB8}, {0x51, 0xAB}, /* 0xF8-0xFB */ + {0x51, 0xB1}, {0x51, 0xBD}, {0x51, 0xBC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8D, 0x0E}, {0x8D, 0x0F}, {0x8D, 0x10}, {0x8D, 0x11}, /* 0x40-0x43 */ + {0x8D, 0x12}, {0x8D, 0x13}, {0x8D, 0x14}, {0x8D, 0x15}, /* 0x44-0x47 */ + {0x8D, 0x16}, {0x8D, 0x17}, {0x8D, 0x18}, {0x8D, 0x19}, /* 0x48-0x4B */ + {0x8D, 0x1A}, {0x8D, 0x1B}, {0x8D, 0x1C}, {0x8D, 0x20}, /* 0x4C-0x4F */ + {0x8D, 0x51}, {0x8D, 0x52}, {0x8D, 0x57}, {0x8D, 0x5F}, /* 0x50-0x53 */ + {0x8D, 0x65}, {0x8D, 0x68}, {0x8D, 0x69}, {0x8D, 0x6A}, /* 0x54-0x57 */ + {0x8D, 0x6C}, {0x8D, 0x6E}, {0x8D, 0x6F}, {0x8D, 0x71}, /* 0x58-0x5B */ + {0x8D, 0x72}, {0x8D, 0x78}, {0x8D, 0x79}, {0x8D, 0x7A}, /* 0x5C-0x5F */ + {0x8D, 0x7B}, {0x8D, 0x7C}, {0x8D, 0x7D}, {0x8D, 0x7E}, /* 0x60-0x63 */ + {0x8D, 0x7F}, {0x8D, 0x80}, {0x8D, 0x82}, {0x8D, 0x83}, /* 0x64-0x67 */ + {0x8D, 0x86}, {0x8D, 0x87}, {0x8D, 0x88}, {0x8D, 0x89}, /* 0x68-0x6B */ + {0x8D, 0x8C}, {0x8D, 0x8D}, {0x8D, 0x8E}, {0x8D, 0x8F}, /* 0x6C-0x6F */ + {0x8D, 0x90}, {0x8D, 0x92}, {0x8D, 0x93}, {0x8D, 0x95}, /* 0x70-0x73 */ + {0x8D, 0x96}, {0x8D, 0x97}, {0x8D, 0x98}, {0x8D, 0x99}, /* 0x74-0x77 */ + {0x8D, 0x9A}, {0x8D, 0x9B}, {0x8D, 0x9C}, {0x8D, 0x9D}, /* 0x78-0x7B */ + {0x8D, 0x9E}, {0x8D, 0xA0}, {0x8D, 0xA1}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8D, 0xA2}, {0x8D, 0xA4}, {0x8D, 0xA5}, {0x8D, 0xA6}, /* 0x80-0x83 */ + {0x8D, 0xA7}, {0x8D, 0xA8}, {0x8D, 0xA9}, {0x8D, 0xAA}, /* 0x84-0x87 */ + {0x8D, 0xAB}, {0x8D, 0xAC}, {0x8D, 0xAD}, {0x8D, 0xAE}, /* 0x88-0x8B */ + {0x8D, 0xAF}, {0x8D, 0xB0}, {0x8D, 0xB2}, {0x8D, 0xB6}, /* 0x8C-0x8F */ + {0x8D, 0xB7}, {0x8D, 0xB9}, {0x8D, 0xBB}, {0x8D, 0xBD}, /* 0x90-0x93 */ + {0x8D, 0xC0}, {0x8D, 0xC1}, {0x8D, 0xC2}, {0x8D, 0xC5}, /* 0x94-0x97 */ + {0x8D, 0xC7}, {0x8D, 0xC8}, {0x8D, 0xC9}, {0x8D, 0xCA}, /* 0x98-0x9B */ + {0x8D, 0xCD}, {0x8D, 0xD0}, {0x8D, 0xD2}, {0x8D, 0xD3}, /* 0x9C-0x9F */ + {0x8D, 0xD4}, {0x51, 0xC7}, {0x51, 0x96}, {0x51, 0xA2}, /* 0xA0-0xA3 */ + {0x51, 0xA5}, {0x8B, 0xA0}, {0x8B, 0xA6}, {0x8B, 0xA7}, /* 0xA4-0xA7 */ + {0x8B, 0xAA}, {0x8B, 0xB4}, {0x8B, 0xB5}, {0x8B, 0xB7}, /* 0xA8-0xAB */ + {0x8B, 0xC2}, {0x8B, 0xC3}, {0x8B, 0xCB}, {0x8B, 0xCF}, /* 0xAC-0xAF */ + {0x8B, 0xCE}, {0x8B, 0xD2}, {0x8B, 0xD3}, {0x8B, 0xD4}, /* 0xB0-0xB3 */ + {0x8B, 0xD6}, {0x8B, 0xD8}, {0x8B, 0xD9}, {0x8B, 0xDC}, /* 0xB4-0xB7 */ + {0x8B, 0xDF}, {0x8B, 0xE0}, {0x8B, 0xE4}, {0x8B, 0xE8}, /* 0xB8-0xBB */ + {0x8B, 0xE9}, {0x8B, 0xEE}, {0x8B, 0xF0}, {0x8B, 0xF3}, /* 0xBC-0xBF */ + {0x8B, 0xF6}, {0x8B, 0xF9}, {0x8B, 0xFC}, {0x8B, 0xFF}, /* 0xC0-0xC3 */ + {0x8C, 0x00}, {0x8C, 0x02}, {0x8C, 0x04}, {0x8C, 0x07}, /* 0xC4-0xC7 */ + {0x8C, 0x0C}, {0x8C, 0x0F}, {0x8C, 0x11}, {0x8C, 0x12}, /* 0xC8-0xCB */ + {0x8C, 0x14}, {0x8C, 0x15}, {0x8C, 0x16}, {0x8C, 0x19}, /* 0xCC-0xCF */ + {0x8C, 0x1B}, {0x8C, 0x18}, {0x8C, 0x1D}, {0x8C, 0x1F}, /* 0xD0-0xD3 */ + {0x8C, 0x20}, {0x8C, 0x21}, {0x8C, 0x25}, {0x8C, 0x27}, /* 0xD4-0xD7 */ + {0x8C, 0x2A}, {0x8C, 0x2B}, {0x8C, 0x2E}, {0x8C, 0x2F}, /* 0xD8-0xDB */ + {0x8C, 0x32}, {0x8C, 0x33}, {0x8C, 0x35}, {0x8C, 0x36}, /* 0xDC-0xDF */ + {0x53, 0x69}, {0x53, 0x7A}, {0x96, 0x1D}, {0x96, 0x22}, /* 0xE0-0xE3 */ + {0x96, 0x21}, {0x96, 0x31}, {0x96, 0x2A}, {0x96, 0x3D}, /* 0xE4-0xE7 */ + {0x96, 0x3C}, {0x96, 0x42}, {0x96, 0x49}, {0x96, 0x54}, /* 0xE8-0xEB */ + {0x96, 0x5F}, {0x96, 0x67}, {0x96, 0x6C}, {0x96, 0x72}, /* 0xEC-0xEF */ + {0x96, 0x74}, {0x96, 0x88}, {0x96, 0x8D}, {0x96, 0x97}, /* 0xF0-0xF3 */ + {0x96, 0xB0}, {0x90, 0x97}, {0x90, 0x9B}, {0x90, 0x9D}, /* 0xF4-0xF7 */ + {0x90, 0x99}, {0x90, 0xAC}, {0x90, 0xA1}, {0x90, 0xB4}, /* 0xF8-0xFB */ + {0x90, 0xB3}, {0x90, 0xB6}, {0x90, 0xBA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8D, 0xD5}, {0x8D, 0xD8}, {0x8D, 0xD9}, {0x8D, 0xDC}, /* 0x40-0x43 */ + {0x8D, 0xE0}, {0x8D, 0xE1}, {0x8D, 0xE2}, {0x8D, 0xE5}, /* 0x44-0x47 */ + {0x8D, 0xE6}, {0x8D, 0xE7}, {0x8D, 0xE9}, {0x8D, 0xED}, /* 0x48-0x4B */ + {0x8D, 0xEE}, {0x8D, 0xF0}, {0x8D, 0xF1}, {0x8D, 0xF2}, /* 0x4C-0x4F */ + {0x8D, 0xF4}, {0x8D, 0xF6}, {0x8D, 0xFC}, {0x8D, 0xFE}, /* 0x50-0x53 */ + {0x8D, 0xFF}, {0x8E, 0x00}, {0x8E, 0x01}, {0x8E, 0x02}, /* 0x54-0x57 */ + {0x8E, 0x03}, {0x8E, 0x04}, {0x8E, 0x06}, {0x8E, 0x07}, /* 0x58-0x5B */ + {0x8E, 0x08}, {0x8E, 0x0B}, {0x8E, 0x0D}, {0x8E, 0x0E}, /* 0x5C-0x5F */ + {0x8E, 0x10}, {0x8E, 0x11}, {0x8E, 0x12}, {0x8E, 0x13}, /* 0x60-0x63 */ + {0x8E, 0x15}, {0x8E, 0x16}, {0x8E, 0x17}, {0x8E, 0x18}, /* 0x64-0x67 */ + {0x8E, 0x19}, {0x8E, 0x1A}, {0x8E, 0x1B}, {0x8E, 0x1C}, /* 0x68-0x6B */ + {0x8E, 0x20}, {0x8E, 0x21}, {0x8E, 0x24}, {0x8E, 0x25}, /* 0x6C-0x6F */ + {0x8E, 0x26}, {0x8E, 0x27}, {0x8E, 0x28}, {0x8E, 0x2B}, /* 0x70-0x73 */ + {0x8E, 0x2D}, {0x8E, 0x30}, {0x8E, 0x32}, {0x8E, 0x33}, /* 0x74-0x77 */ + {0x8E, 0x34}, {0x8E, 0x36}, {0x8E, 0x37}, {0x8E, 0x38}, /* 0x78-0x7B */ + {0x8E, 0x3B}, {0x8E, 0x3C}, {0x8E, 0x3E}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8E, 0x3F}, {0x8E, 0x43}, {0x8E, 0x45}, {0x8E, 0x46}, /* 0x80-0x83 */ + {0x8E, 0x4C}, {0x8E, 0x4D}, {0x8E, 0x4E}, {0x8E, 0x4F}, /* 0x84-0x87 */ + {0x8E, 0x50}, {0x8E, 0x53}, {0x8E, 0x54}, {0x8E, 0x55}, /* 0x88-0x8B */ + {0x8E, 0x56}, {0x8E, 0x57}, {0x8E, 0x58}, {0x8E, 0x5A}, /* 0x8C-0x8F */ + {0x8E, 0x5B}, {0x8E, 0x5C}, {0x8E, 0x5D}, {0x8E, 0x5E}, /* 0x90-0x93 */ + {0x8E, 0x5F}, {0x8E, 0x60}, {0x8E, 0x61}, {0x8E, 0x62}, /* 0x94-0x97 */ + {0x8E, 0x63}, {0x8E, 0x64}, {0x8E, 0x65}, {0x8E, 0x67}, /* 0x98-0x9B */ + {0x8E, 0x68}, {0x8E, 0x6A}, {0x8E, 0x6B}, {0x8E, 0x6E}, /* 0x9C-0x9F */ + {0x8E, 0x71}, {0x90, 0xB8}, {0x90, 0xB0}, {0x90, 0xCF}, /* 0xA0-0xA3 */ + {0x90, 0xC5}, {0x90, 0xBE}, {0x90, 0xD0}, {0x90, 0xC4}, /* 0xA4-0xA7 */ + {0x90, 0xC7}, {0x90, 0xD3}, {0x90, 0xE6}, {0x90, 0xE2}, /* 0xA8-0xAB */ + {0x90, 0xDC}, {0x90, 0xD7}, {0x90, 0xDB}, {0x90, 0xEB}, /* 0xAC-0xAF */ + {0x90, 0xEF}, {0x90, 0xFE}, {0x91, 0x04}, {0x91, 0x22}, /* 0xB0-0xB3 */ + {0x91, 0x1E}, {0x91, 0x23}, {0x91, 0x31}, {0x91, 0x2F}, /* 0xB4-0xB7 */ + {0x91, 0x39}, {0x91, 0x43}, {0x91, 0x46}, {0x52, 0x0D}, /* 0xB8-0xBB */ + {0x59, 0x42}, {0x52, 0xA2}, {0x52, 0xAC}, {0x52, 0xAD}, /* 0xBC-0xBF */ + {0x52, 0xBE}, {0x54, 0xFF}, {0x52, 0xD0}, {0x52, 0xD6}, /* 0xC0-0xC3 */ + {0x52, 0xF0}, {0x53, 0xDF}, {0x71, 0xEE}, {0x77, 0xCD}, /* 0xC4-0xC7 */ + {0x5E, 0xF4}, {0x51, 0xF5}, {0x51, 0xFC}, {0x9B, 0x2F}, /* 0xC8-0xCB */ + {0x53, 0xB6}, {0x5F, 0x01}, {0x75, 0x5A}, {0x5D, 0xEF}, /* 0xCC-0xCF */ + {0x57, 0x4C}, {0x57, 0xA9}, {0x57, 0xA1}, {0x58, 0x7E}, /* 0xD0-0xD3 */ + {0x58, 0xBC}, {0x58, 0xC5}, {0x58, 0xD1}, {0x57, 0x29}, /* 0xD4-0xD7 */ + {0x57, 0x2C}, {0x57, 0x2A}, {0x57, 0x33}, {0x57, 0x39}, /* 0xD8-0xDB */ + {0x57, 0x2E}, {0x57, 0x2F}, {0x57, 0x5C}, {0x57, 0x3B}, /* 0xDC-0xDF */ + {0x57, 0x42}, {0x57, 0x69}, {0x57, 0x85}, {0x57, 0x6B}, /* 0xE0-0xE3 */ + {0x57, 0x86}, {0x57, 0x7C}, {0x57, 0x7B}, {0x57, 0x68}, /* 0xE4-0xE7 */ + {0x57, 0x6D}, {0x57, 0x76}, {0x57, 0x73}, {0x57, 0xAD}, /* 0xE8-0xEB */ + {0x57, 0xA4}, {0x57, 0x8C}, {0x57, 0xB2}, {0x57, 0xCF}, /* 0xEC-0xEF */ + {0x57, 0xA7}, {0x57, 0xB4}, {0x57, 0x93}, {0x57, 0xA0}, /* 0xF0-0xF3 */ + {0x57, 0xD5}, {0x57, 0xD8}, {0x57, 0xDA}, {0x57, 0xD9}, /* 0xF4-0xF7 */ + {0x57, 0xD2}, {0x57, 0xB8}, {0x57, 0xF4}, {0x57, 0xEF}, /* 0xF8-0xFB */ + {0x57, 0xF8}, {0x57, 0xE4}, {0x57, 0xDD}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8E, 0x73}, {0x8E, 0x75}, {0x8E, 0x77}, {0x8E, 0x78}, /* 0x40-0x43 */ + {0x8E, 0x79}, {0x8E, 0x7A}, {0x8E, 0x7B}, {0x8E, 0x7D}, /* 0x44-0x47 */ + {0x8E, 0x7E}, {0x8E, 0x80}, {0x8E, 0x82}, {0x8E, 0x83}, /* 0x48-0x4B */ + {0x8E, 0x84}, {0x8E, 0x86}, {0x8E, 0x88}, {0x8E, 0x89}, /* 0x4C-0x4F */ + {0x8E, 0x8A}, {0x8E, 0x8B}, {0x8E, 0x8C}, {0x8E, 0x8D}, /* 0x50-0x53 */ + {0x8E, 0x8E}, {0x8E, 0x91}, {0x8E, 0x92}, {0x8E, 0x93}, /* 0x54-0x57 */ + {0x8E, 0x95}, {0x8E, 0x96}, {0x8E, 0x97}, {0x8E, 0x98}, /* 0x58-0x5B */ + {0x8E, 0x99}, {0x8E, 0x9A}, {0x8E, 0x9B}, {0x8E, 0x9D}, /* 0x5C-0x5F */ + {0x8E, 0x9F}, {0x8E, 0xA0}, {0x8E, 0xA1}, {0x8E, 0xA2}, /* 0x60-0x63 */ + {0x8E, 0xA3}, {0x8E, 0xA4}, {0x8E, 0xA5}, {0x8E, 0xA6}, /* 0x64-0x67 */ + {0x8E, 0xA7}, {0x8E, 0xA8}, {0x8E, 0xA9}, {0x8E, 0xAA}, /* 0x68-0x6B */ + {0x8E, 0xAD}, {0x8E, 0xAE}, {0x8E, 0xB0}, {0x8E, 0xB1}, /* 0x6C-0x6F */ + {0x8E, 0xB3}, {0x8E, 0xB4}, {0x8E, 0xB5}, {0x8E, 0xB6}, /* 0x70-0x73 */ + {0x8E, 0xB7}, {0x8E, 0xB8}, {0x8E, 0xB9}, {0x8E, 0xBB}, /* 0x74-0x77 */ + {0x8E, 0xBC}, {0x8E, 0xBD}, {0x8E, 0xBE}, {0x8E, 0xBF}, /* 0x78-0x7B */ + {0x8E, 0xC0}, {0x8E, 0xC1}, {0x8E, 0xC2}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8E, 0xC3}, {0x8E, 0xC4}, {0x8E, 0xC5}, {0x8E, 0xC6}, /* 0x80-0x83 */ + {0x8E, 0xC7}, {0x8E, 0xC8}, {0x8E, 0xC9}, {0x8E, 0xCA}, /* 0x84-0x87 */ + {0x8E, 0xCB}, {0x8E, 0xCC}, {0x8E, 0xCD}, {0x8E, 0xCF}, /* 0x88-0x8B */ + {0x8E, 0xD0}, {0x8E, 0xD1}, {0x8E, 0xD2}, {0x8E, 0xD3}, /* 0x8C-0x8F */ + {0x8E, 0xD4}, {0x8E, 0xD5}, {0x8E, 0xD6}, {0x8E, 0xD7}, /* 0x90-0x93 */ + {0x8E, 0xD8}, {0x8E, 0xD9}, {0x8E, 0xDA}, {0x8E, 0xDB}, /* 0x94-0x97 */ + {0x8E, 0xDC}, {0x8E, 0xDD}, {0x8E, 0xDE}, {0x8E, 0xDF}, /* 0x98-0x9B */ + {0x8E, 0xE0}, {0x8E, 0xE1}, {0x8E, 0xE2}, {0x8E, 0xE3}, /* 0x9C-0x9F */ + {0x8E, 0xE4}, {0x58, 0x0B}, {0x58, 0x0D}, {0x57, 0xFD}, /* 0xA0-0xA3 */ + {0x57, 0xED}, {0x58, 0x00}, {0x58, 0x1E}, {0x58, 0x19}, /* 0xA4-0xA7 */ + {0x58, 0x44}, {0x58, 0x20}, {0x58, 0x65}, {0x58, 0x6C}, /* 0xA8-0xAB */ + {0x58, 0x81}, {0x58, 0x89}, {0x58, 0x9A}, {0x58, 0x80}, /* 0xAC-0xAF */ + {0x99, 0xA8}, {0x9F, 0x19}, {0x61, 0xFF}, {0x82, 0x79}, /* 0xB0-0xB3 */ + {0x82, 0x7D}, {0x82, 0x7F}, {0x82, 0x8F}, {0x82, 0x8A}, /* 0xB4-0xB7 */ + {0x82, 0xA8}, {0x82, 0x84}, {0x82, 0x8E}, {0x82, 0x91}, /* 0xB8-0xBB */ + {0x82, 0x97}, {0x82, 0x99}, {0x82, 0xAB}, {0x82, 0xB8}, /* 0xBC-0xBF */ + {0x82, 0xBE}, {0x82, 0xB0}, {0x82, 0xC8}, {0x82, 0xCA}, /* 0xC0-0xC3 */ + {0x82, 0xE3}, {0x82, 0x98}, {0x82, 0xB7}, {0x82, 0xAE}, /* 0xC4-0xC7 */ + {0x82, 0xCB}, {0x82, 0xCC}, {0x82, 0xC1}, {0x82, 0xA9}, /* 0xC8-0xCB */ + {0x82, 0xB4}, {0x82, 0xA1}, {0x82, 0xAA}, {0x82, 0x9F}, /* 0xCC-0xCF */ + {0x82, 0xC4}, {0x82, 0xCE}, {0x82, 0xA4}, {0x82, 0xE1}, /* 0xD0-0xD3 */ + {0x83, 0x09}, {0x82, 0xF7}, {0x82, 0xE4}, {0x83, 0x0F}, /* 0xD4-0xD7 */ + {0x83, 0x07}, {0x82, 0xDC}, {0x82, 0xF4}, {0x82, 0xD2}, /* 0xD8-0xDB */ + {0x82, 0xD8}, {0x83, 0x0C}, {0x82, 0xFB}, {0x82, 0xD3}, /* 0xDC-0xDF */ + {0x83, 0x11}, {0x83, 0x1A}, {0x83, 0x06}, {0x83, 0x14}, /* 0xE0-0xE3 */ + {0x83, 0x15}, {0x82, 0xE0}, {0x82, 0xD5}, {0x83, 0x1C}, /* 0xE4-0xE7 */ + {0x83, 0x51}, {0x83, 0x5B}, {0x83, 0x5C}, {0x83, 0x08}, /* 0xE8-0xEB */ + {0x83, 0x92}, {0x83, 0x3C}, {0x83, 0x34}, {0x83, 0x31}, /* 0xEC-0xEF */ + {0x83, 0x9B}, {0x83, 0x5E}, {0x83, 0x2F}, {0x83, 0x4F}, /* 0xF0-0xF3 */ + {0x83, 0x47}, {0x83, 0x43}, {0x83, 0x5F}, {0x83, 0x40}, /* 0xF4-0xF7 */ + {0x83, 0x17}, {0x83, 0x60}, {0x83, 0x2D}, {0x83, 0x3A}, /* 0xF8-0xFB */ + {0x83, 0x33}, {0x83, 0x66}, {0x83, 0x65}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8E, 0xE5}, {0x8E, 0xE6}, {0x8E, 0xE7}, {0x8E, 0xE8}, /* 0x40-0x43 */ + {0x8E, 0xE9}, {0x8E, 0xEA}, {0x8E, 0xEB}, {0x8E, 0xEC}, /* 0x44-0x47 */ + {0x8E, 0xED}, {0x8E, 0xEE}, {0x8E, 0xEF}, {0x8E, 0xF0}, /* 0x48-0x4B */ + {0x8E, 0xF1}, {0x8E, 0xF2}, {0x8E, 0xF3}, {0x8E, 0xF4}, /* 0x4C-0x4F */ + {0x8E, 0xF5}, {0x8E, 0xF6}, {0x8E, 0xF7}, {0x8E, 0xF8}, /* 0x50-0x53 */ + {0x8E, 0xF9}, {0x8E, 0xFA}, {0x8E, 0xFB}, {0x8E, 0xFC}, /* 0x54-0x57 */ + {0x8E, 0xFD}, {0x8E, 0xFE}, {0x8E, 0xFF}, {0x8F, 0x00}, /* 0x58-0x5B */ + {0x8F, 0x01}, {0x8F, 0x02}, {0x8F, 0x03}, {0x8F, 0x04}, /* 0x5C-0x5F */ + {0x8F, 0x05}, {0x8F, 0x06}, {0x8F, 0x07}, {0x8F, 0x08}, /* 0x60-0x63 */ + {0x8F, 0x09}, {0x8F, 0x0A}, {0x8F, 0x0B}, {0x8F, 0x0C}, /* 0x64-0x67 */ + {0x8F, 0x0D}, {0x8F, 0x0E}, {0x8F, 0x0F}, {0x8F, 0x10}, /* 0x68-0x6B */ + {0x8F, 0x11}, {0x8F, 0x12}, {0x8F, 0x13}, {0x8F, 0x14}, /* 0x6C-0x6F */ + {0x8F, 0x15}, {0x8F, 0x16}, {0x8F, 0x17}, {0x8F, 0x18}, /* 0x70-0x73 */ + {0x8F, 0x19}, {0x8F, 0x1A}, {0x8F, 0x1B}, {0x8F, 0x1C}, /* 0x74-0x77 */ + {0x8F, 0x1D}, {0x8F, 0x1E}, {0x8F, 0x1F}, {0x8F, 0x20}, /* 0x78-0x7B */ + {0x8F, 0x21}, {0x8F, 0x22}, {0x8F, 0x23}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8F, 0x24}, {0x8F, 0x25}, {0x8F, 0x26}, {0x8F, 0x27}, /* 0x80-0x83 */ + {0x8F, 0x28}, {0x8F, 0x29}, {0x8F, 0x2A}, {0x8F, 0x2B}, /* 0x84-0x87 */ + {0x8F, 0x2C}, {0x8F, 0x2D}, {0x8F, 0x2E}, {0x8F, 0x2F}, /* 0x88-0x8B */ + {0x8F, 0x30}, {0x8F, 0x31}, {0x8F, 0x32}, {0x8F, 0x33}, /* 0x8C-0x8F */ + {0x8F, 0x34}, {0x8F, 0x35}, {0x8F, 0x36}, {0x8F, 0x37}, /* 0x90-0x93 */ + {0x8F, 0x38}, {0x8F, 0x39}, {0x8F, 0x3A}, {0x8F, 0x3B}, /* 0x94-0x97 */ + {0x8F, 0x3C}, {0x8F, 0x3D}, {0x8F, 0x3E}, {0x8F, 0x3F}, /* 0x98-0x9B */ + {0x8F, 0x40}, {0x8F, 0x41}, {0x8F, 0x42}, {0x8F, 0x43}, /* 0x9C-0x9F */ + {0x8F, 0x44}, {0x83, 0x68}, {0x83, 0x1B}, {0x83, 0x69}, /* 0xA0-0xA3 */ + {0x83, 0x6C}, {0x83, 0x6A}, {0x83, 0x6D}, {0x83, 0x6E}, /* 0xA4-0xA7 */ + {0x83, 0xB0}, {0x83, 0x78}, {0x83, 0xB3}, {0x83, 0xB4}, /* 0xA8-0xAB */ + {0x83, 0xA0}, {0x83, 0xAA}, {0x83, 0x93}, {0x83, 0x9C}, /* 0xAC-0xAF */ + {0x83, 0x85}, {0x83, 0x7C}, {0x83, 0xB6}, {0x83, 0xA9}, /* 0xB0-0xB3 */ + {0x83, 0x7D}, {0x83, 0xB8}, {0x83, 0x7B}, {0x83, 0x98}, /* 0xB4-0xB7 */ + {0x83, 0x9E}, {0x83, 0xA8}, {0x83, 0xBA}, {0x83, 0xBC}, /* 0xB8-0xBB */ + {0x83, 0xC1}, {0x84, 0x01}, {0x83, 0xE5}, {0x83, 0xD8}, /* 0xBC-0xBF */ + {0x58, 0x07}, {0x84, 0x18}, {0x84, 0x0B}, {0x83, 0xDD}, /* 0xC0-0xC3 */ + {0x83, 0xFD}, {0x83, 0xD6}, {0x84, 0x1C}, {0x84, 0x38}, /* 0xC4-0xC7 */ + {0x84, 0x11}, {0x84, 0x06}, {0x83, 0xD4}, {0x83, 0xDF}, /* 0xC8-0xCB */ + {0x84, 0x0F}, {0x84, 0x03}, {0x83, 0xF8}, {0x83, 0xF9}, /* 0xCC-0xCF */ + {0x83, 0xEA}, {0x83, 0xC5}, {0x83, 0xC0}, {0x84, 0x26}, /* 0xD0-0xD3 */ + {0x83, 0xF0}, {0x83, 0xE1}, {0x84, 0x5C}, {0x84, 0x51}, /* 0xD4-0xD7 */ + {0x84, 0x5A}, {0x84, 0x59}, {0x84, 0x73}, {0x84, 0x87}, /* 0xD8-0xDB */ + {0x84, 0x88}, {0x84, 0x7A}, {0x84, 0x89}, {0x84, 0x78}, /* 0xDC-0xDF */ + {0x84, 0x3C}, {0x84, 0x46}, {0x84, 0x69}, {0x84, 0x76}, /* 0xE0-0xE3 */ + {0x84, 0x8C}, {0x84, 0x8E}, {0x84, 0x31}, {0x84, 0x6D}, /* 0xE4-0xE7 */ + {0x84, 0xC1}, {0x84, 0xCD}, {0x84, 0xD0}, {0x84, 0xE6}, /* 0xE8-0xEB */ + {0x84, 0xBD}, {0x84, 0xD3}, {0x84, 0xCA}, {0x84, 0xBF}, /* 0xEC-0xEF */ + {0x84, 0xBA}, {0x84, 0xE0}, {0x84, 0xA1}, {0x84, 0xB9}, /* 0xF0-0xF3 */ + {0x84, 0xB4}, {0x84, 0x97}, {0x84, 0xE5}, {0x84, 0xE3}, /* 0xF4-0xF7 */ + {0x85, 0x0C}, {0x75, 0x0D}, {0x85, 0x38}, {0x84, 0xF0}, /* 0xF8-0xFB */ + {0x85, 0x39}, {0x85, 0x1F}, {0x85, 0x3A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8F, 0x45}, {0x8F, 0x46}, {0x8F, 0x47}, {0x8F, 0x48}, /* 0x40-0x43 */ + {0x8F, 0x49}, {0x8F, 0x4A}, {0x8F, 0x4B}, {0x8F, 0x4C}, /* 0x44-0x47 */ + {0x8F, 0x4D}, {0x8F, 0x4E}, {0x8F, 0x4F}, {0x8F, 0x50}, /* 0x48-0x4B */ + {0x8F, 0x51}, {0x8F, 0x52}, {0x8F, 0x53}, {0x8F, 0x54}, /* 0x4C-0x4F */ + {0x8F, 0x55}, {0x8F, 0x56}, {0x8F, 0x57}, {0x8F, 0x58}, /* 0x50-0x53 */ + {0x8F, 0x59}, {0x8F, 0x5A}, {0x8F, 0x5B}, {0x8F, 0x5C}, /* 0x54-0x57 */ + {0x8F, 0x5D}, {0x8F, 0x5E}, {0x8F, 0x5F}, {0x8F, 0x60}, /* 0x58-0x5B */ + {0x8F, 0x61}, {0x8F, 0x62}, {0x8F, 0x63}, {0x8F, 0x64}, /* 0x5C-0x5F */ + {0x8F, 0x65}, {0x8F, 0x6A}, {0x8F, 0x80}, {0x8F, 0x8C}, /* 0x60-0x63 */ + {0x8F, 0x92}, {0x8F, 0x9D}, {0x8F, 0xA0}, {0x8F, 0xA1}, /* 0x64-0x67 */ + {0x8F, 0xA2}, {0x8F, 0xA4}, {0x8F, 0xA5}, {0x8F, 0xA6}, /* 0x68-0x6B */ + {0x8F, 0xA7}, {0x8F, 0xAA}, {0x8F, 0xAC}, {0x8F, 0xAD}, /* 0x6C-0x6F */ + {0x8F, 0xAE}, {0x8F, 0xAF}, {0x8F, 0xB2}, {0x8F, 0xB3}, /* 0x70-0x73 */ + {0x8F, 0xB4}, {0x8F, 0xB5}, {0x8F, 0xB7}, {0x8F, 0xB8}, /* 0x74-0x77 */ + {0x8F, 0xBA}, {0x8F, 0xBB}, {0x8F, 0xBC}, {0x8F, 0xBF}, /* 0x78-0x7B */ + {0x8F, 0xC0}, {0x8F, 0xC3}, {0x8F, 0xC6}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x8F, 0xC9}, {0x8F, 0xCA}, {0x8F, 0xCB}, {0x8F, 0xCC}, /* 0x80-0x83 */ + {0x8F, 0xCD}, {0x8F, 0xCF}, {0x8F, 0xD2}, {0x8F, 0xD6}, /* 0x84-0x87 */ + {0x8F, 0xD7}, {0x8F, 0xDA}, {0x8F, 0xE0}, {0x8F, 0xE1}, /* 0x88-0x8B */ + {0x8F, 0xE3}, {0x8F, 0xE7}, {0x8F, 0xEC}, {0x8F, 0xEF}, /* 0x8C-0x8F */ + {0x8F, 0xF1}, {0x8F, 0xF2}, {0x8F, 0xF4}, {0x8F, 0xF5}, /* 0x90-0x93 */ + {0x8F, 0xF6}, {0x8F, 0xFA}, {0x8F, 0xFB}, {0x8F, 0xFC}, /* 0x94-0x97 */ + {0x8F, 0xFE}, {0x8F, 0xFF}, {0x90, 0x07}, {0x90, 0x08}, /* 0x98-0x9B */ + {0x90, 0x0C}, {0x90, 0x0E}, {0x90, 0x13}, {0x90, 0x15}, /* 0x9C-0x9F */ + {0x90, 0x18}, {0x85, 0x56}, {0x85, 0x3B}, {0x84, 0xFF}, /* 0xA0-0xA3 */ + {0x84, 0xFC}, {0x85, 0x59}, {0x85, 0x48}, {0x85, 0x68}, /* 0xA4-0xA7 */ + {0x85, 0x64}, {0x85, 0x5E}, {0x85, 0x7A}, {0x77, 0xA2}, /* 0xA8-0xAB */ + {0x85, 0x43}, {0x85, 0x72}, {0x85, 0x7B}, {0x85, 0xA4}, /* 0xAC-0xAF */ + {0x85, 0xA8}, {0x85, 0x87}, {0x85, 0x8F}, {0x85, 0x79}, /* 0xB0-0xB3 */ + {0x85, 0xAE}, {0x85, 0x9C}, {0x85, 0x85}, {0x85, 0xB9}, /* 0xB4-0xB7 */ + {0x85, 0xB7}, {0x85, 0xB0}, {0x85, 0xD3}, {0x85, 0xC1}, /* 0xB8-0xBB */ + {0x85, 0xDC}, {0x85, 0xFF}, {0x86, 0x27}, {0x86, 0x05}, /* 0xBC-0xBF */ + {0x86, 0x29}, {0x86, 0x16}, {0x86, 0x3C}, {0x5E, 0xFE}, /* 0xC0-0xC3 */ + {0x5F, 0x08}, {0x59, 0x3C}, {0x59, 0x41}, {0x80, 0x37}, /* 0xC4-0xC7 */ + {0x59, 0x55}, {0x59, 0x5A}, {0x59, 0x58}, {0x53, 0x0F}, /* 0xC8-0xCB */ + {0x5C, 0x22}, {0x5C, 0x25}, {0x5C, 0x2C}, {0x5C, 0x34}, /* 0xCC-0xCF */ + {0x62, 0x4C}, {0x62, 0x6A}, {0x62, 0x9F}, {0x62, 0xBB}, /* 0xD0-0xD3 */ + {0x62, 0xCA}, {0x62, 0xDA}, {0x62, 0xD7}, {0x62, 0xEE}, /* 0xD4-0xD7 */ + {0x63, 0x22}, {0x62, 0xF6}, {0x63, 0x39}, {0x63, 0x4B}, /* 0xD8-0xDB */ + {0x63, 0x43}, {0x63, 0xAD}, {0x63, 0xF6}, {0x63, 0x71}, /* 0xDC-0xDF */ + {0x63, 0x7A}, {0x63, 0x8E}, {0x63, 0xB4}, {0x63, 0x6D}, /* 0xE0-0xE3 */ + {0x63, 0xAC}, {0x63, 0x8A}, {0x63, 0x69}, {0x63, 0xAE}, /* 0xE4-0xE7 */ + {0x63, 0xBC}, {0x63, 0xF2}, {0x63, 0xF8}, {0x63, 0xE0}, /* 0xE8-0xEB */ + {0x63, 0xFF}, {0x63, 0xC4}, {0x63, 0xDE}, {0x63, 0xCE}, /* 0xEC-0xEF */ + {0x64, 0x52}, {0x63, 0xC6}, {0x63, 0xBE}, {0x64, 0x45}, /* 0xF0-0xF3 */ + {0x64, 0x41}, {0x64, 0x0B}, {0x64, 0x1B}, {0x64, 0x20}, /* 0xF4-0xF7 */ + {0x64, 0x0C}, {0x64, 0x26}, {0x64, 0x21}, {0x64, 0x5E}, /* 0xF8-0xFB */ + {0x64, 0x84}, {0x64, 0x6D}, {0x64, 0x96}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x90, 0x19}, {0x90, 0x1C}, {0x90, 0x23}, {0x90, 0x24}, /* 0x40-0x43 */ + {0x90, 0x25}, {0x90, 0x27}, {0x90, 0x28}, {0x90, 0x29}, /* 0x44-0x47 */ + {0x90, 0x2A}, {0x90, 0x2B}, {0x90, 0x2C}, {0x90, 0x30}, /* 0x48-0x4B */ + {0x90, 0x31}, {0x90, 0x32}, {0x90, 0x33}, {0x90, 0x34}, /* 0x4C-0x4F */ + {0x90, 0x37}, {0x90, 0x39}, {0x90, 0x3A}, {0x90, 0x3D}, /* 0x50-0x53 */ + {0x90, 0x3F}, {0x90, 0x40}, {0x90, 0x43}, {0x90, 0x45}, /* 0x54-0x57 */ + {0x90, 0x46}, {0x90, 0x48}, {0x90, 0x49}, {0x90, 0x4A}, /* 0x58-0x5B */ + {0x90, 0x4B}, {0x90, 0x4C}, {0x90, 0x4E}, {0x90, 0x54}, /* 0x5C-0x5F */ + {0x90, 0x55}, {0x90, 0x56}, {0x90, 0x59}, {0x90, 0x5A}, /* 0x60-0x63 */ + {0x90, 0x5C}, {0x90, 0x5D}, {0x90, 0x5E}, {0x90, 0x5F}, /* 0x64-0x67 */ + {0x90, 0x60}, {0x90, 0x61}, {0x90, 0x64}, {0x90, 0x66}, /* 0x68-0x6B */ + {0x90, 0x67}, {0x90, 0x69}, {0x90, 0x6A}, {0x90, 0x6B}, /* 0x6C-0x6F */ + {0x90, 0x6C}, {0x90, 0x6F}, {0x90, 0x70}, {0x90, 0x71}, /* 0x70-0x73 */ + {0x90, 0x72}, {0x90, 0x73}, {0x90, 0x76}, {0x90, 0x77}, /* 0x74-0x77 */ + {0x90, 0x78}, {0x90, 0x79}, {0x90, 0x7A}, {0x90, 0x7B}, /* 0x78-0x7B */ + {0x90, 0x7C}, {0x90, 0x7E}, {0x90, 0x81}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x90, 0x84}, {0x90, 0x85}, {0x90, 0x86}, {0x90, 0x87}, /* 0x80-0x83 */ + {0x90, 0x89}, {0x90, 0x8A}, {0x90, 0x8C}, {0x90, 0x8D}, /* 0x84-0x87 */ + {0x90, 0x8E}, {0x90, 0x8F}, {0x90, 0x90}, {0x90, 0x92}, /* 0x88-0x8B */ + {0x90, 0x94}, {0x90, 0x96}, {0x90, 0x98}, {0x90, 0x9A}, /* 0x8C-0x8F */ + {0x90, 0x9C}, {0x90, 0x9E}, {0x90, 0x9F}, {0x90, 0xA0}, /* 0x90-0x93 */ + {0x90, 0xA4}, {0x90, 0xA5}, {0x90, 0xA7}, {0x90, 0xA8}, /* 0x94-0x97 */ + {0x90, 0xA9}, {0x90, 0xAB}, {0x90, 0xAD}, {0x90, 0xB2}, /* 0x98-0x9B */ + {0x90, 0xB7}, {0x90, 0xBC}, {0x90, 0xBD}, {0x90, 0xBF}, /* 0x9C-0x9F */ + {0x90, 0xC0}, {0x64, 0x7A}, {0x64, 0xB7}, {0x64, 0xB8}, /* 0xA0-0xA3 */ + {0x64, 0x99}, {0x64, 0xBA}, {0x64, 0xC0}, {0x64, 0xD0}, /* 0xA4-0xA7 */ + {0x64, 0xD7}, {0x64, 0xE4}, {0x64, 0xE2}, {0x65, 0x09}, /* 0xA8-0xAB */ + {0x65, 0x25}, {0x65, 0x2E}, {0x5F, 0x0B}, {0x5F, 0xD2}, /* 0xAC-0xAF */ + {0x75, 0x19}, {0x5F, 0x11}, {0x53, 0x5F}, {0x53, 0xF1}, /* 0xB0-0xB3 */ + {0x53, 0xFD}, {0x53, 0xE9}, {0x53, 0xE8}, {0x53, 0xFB}, /* 0xB4-0xB7 */ + {0x54, 0x12}, {0x54, 0x16}, {0x54, 0x06}, {0x54, 0x4B}, /* 0xB8-0xBB */ + {0x54, 0x52}, {0x54, 0x53}, {0x54, 0x54}, {0x54, 0x56}, /* 0xBC-0xBF */ + {0x54, 0x43}, {0x54, 0x21}, {0x54, 0x57}, {0x54, 0x59}, /* 0xC0-0xC3 */ + {0x54, 0x23}, {0x54, 0x32}, {0x54, 0x82}, {0x54, 0x94}, /* 0xC4-0xC7 */ + {0x54, 0x77}, {0x54, 0x71}, {0x54, 0x64}, {0x54, 0x9A}, /* 0xC8-0xCB */ + {0x54, 0x9B}, {0x54, 0x84}, {0x54, 0x76}, {0x54, 0x66}, /* 0xCC-0xCF */ + {0x54, 0x9D}, {0x54, 0xD0}, {0x54, 0xAD}, {0x54, 0xC2}, /* 0xD0-0xD3 */ + {0x54, 0xB4}, {0x54, 0xD2}, {0x54, 0xA7}, {0x54, 0xA6}, /* 0xD4-0xD7 */ + {0x54, 0xD3}, {0x54, 0xD4}, {0x54, 0x72}, {0x54, 0xA3}, /* 0xD8-0xDB */ + {0x54, 0xD5}, {0x54, 0xBB}, {0x54, 0xBF}, {0x54, 0xCC}, /* 0xDC-0xDF */ + {0x54, 0xD9}, {0x54, 0xDA}, {0x54, 0xDC}, {0x54, 0xA9}, /* 0xE0-0xE3 */ + {0x54, 0xAA}, {0x54, 0xA4}, {0x54, 0xDD}, {0x54, 0xCF}, /* 0xE4-0xE7 */ + {0x54, 0xDE}, {0x55, 0x1B}, {0x54, 0xE7}, {0x55, 0x20}, /* 0xE8-0xEB */ + {0x54, 0xFD}, {0x55, 0x14}, {0x54, 0xF3}, {0x55, 0x22}, /* 0xEC-0xEF */ + {0x55, 0x23}, {0x55, 0x0F}, {0x55, 0x11}, {0x55, 0x27}, /* 0xF0-0xF3 */ + {0x55, 0x2A}, {0x55, 0x67}, {0x55, 0x8F}, {0x55, 0xB5}, /* 0xF4-0xF7 */ + {0x55, 0x49}, {0x55, 0x6D}, {0x55, 0x41}, {0x55, 0x55}, /* 0xF8-0xFB */ + {0x55, 0x3F}, {0x55, 0x50}, {0x55, 0x3C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x90, 0xC2}, {0x90, 0xC3}, {0x90, 0xC6}, {0x90, 0xC8}, /* 0x40-0x43 */ + {0x90, 0xC9}, {0x90, 0xCB}, {0x90, 0xCC}, {0x90, 0xCD}, /* 0x44-0x47 */ + {0x90, 0xD2}, {0x90, 0xD4}, {0x90, 0xD5}, {0x90, 0xD6}, /* 0x48-0x4B */ + {0x90, 0xD8}, {0x90, 0xD9}, {0x90, 0xDA}, {0x90, 0xDE}, /* 0x4C-0x4F */ + {0x90, 0xDF}, {0x90, 0xE0}, {0x90, 0xE3}, {0x90, 0xE4}, /* 0x50-0x53 */ + {0x90, 0xE5}, {0x90, 0xE9}, {0x90, 0xEA}, {0x90, 0xEC}, /* 0x54-0x57 */ + {0x90, 0xEE}, {0x90, 0xF0}, {0x90, 0xF1}, {0x90, 0xF2}, /* 0x58-0x5B */ + {0x90, 0xF3}, {0x90, 0xF5}, {0x90, 0xF6}, {0x90, 0xF7}, /* 0x5C-0x5F */ + {0x90, 0xF9}, {0x90, 0xFA}, {0x90, 0xFB}, {0x90, 0xFC}, /* 0x60-0x63 */ + {0x90, 0xFF}, {0x91, 0x00}, {0x91, 0x01}, {0x91, 0x03}, /* 0x64-0x67 */ + {0x91, 0x05}, {0x91, 0x06}, {0x91, 0x07}, {0x91, 0x08}, /* 0x68-0x6B */ + {0x91, 0x09}, {0x91, 0x0A}, {0x91, 0x0B}, {0x91, 0x0C}, /* 0x6C-0x6F */ + {0x91, 0x0D}, {0x91, 0x0E}, {0x91, 0x0F}, {0x91, 0x10}, /* 0x70-0x73 */ + {0x91, 0x11}, {0x91, 0x12}, {0x91, 0x13}, {0x91, 0x14}, /* 0x74-0x77 */ + {0x91, 0x15}, {0x91, 0x16}, {0x91, 0x17}, {0x91, 0x18}, /* 0x78-0x7B */ + {0x91, 0x1A}, {0x91, 0x1B}, {0x91, 0x1C}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x91, 0x1D}, {0x91, 0x1F}, {0x91, 0x20}, {0x91, 0x21}, /* 0x80-0x83 */ + {0x91, 0x24}, {0x91, 0x25}, {0x91, 0x26}, {0x91, 0x27}, /* 0x84-0x87 */ + {0x91, 0x28}, {0x91, 0x29}, {0x91, 0x2A}, {0x91, 0x2B}, /* 0x88-0x8B */ + {0x91, 0x2C}, {0x91, 0x2D}, {0x91, 0x2E}, {0x91, 0x30}, /* 0x8C-0x8F */ + {0x91, 0x32}, {0x91, 0x33}, {0x91, 0x34}, {0x91, 0x35}, /* 0x90-0x93 */ + {0x91, 0x36}, {0x91, 0x37}, {0x91, 0x38}, {0x91, 0x3A}, /* 0x94-0x97 */ + {0x91, 0x3B}, {0x91, 0x3C}, {0x91, 0x3D}, {0x91, 0x3E}, /* 0x98-0x9B */ + {0x91, 0x3F}, {0x91, 0x40}, {0x91, 0x41}, {0x91, 0x42}, /* 0x9C-0x9F */ + {0x91, 0x44}, {0x55, 0x37}, {0x55, 0x56}, {0x55, 0x75}, /* 0xA0-0xA3 */ + {0x55, 0x76}, {0x55, 0x77}, {0x55, 0x33}, {0x55, 0x30}, /* 0xA4-0xA7 */ + {0x55, 0x5C}, {0x55, 0x8B}, {0x55, 0xD2}, {0x55, 0x83}, /* 0xA8-0xAB */ + {0x55, 0xB1}, {0x55, 0xB9}, {0x55, 0x88}, {0x55, 0x81}, /* 0xAC-0xAF */ + {0x55, 0x9F}, {0x55, 0x7E}, {0x55, 0xD6}, {0x55, 0x91}, /* 0xB0-0xB3 */ + {0x55, 0x7B}, {0x55, 0xDF}, {0x55, 0xBD}, {0x55, 0xBE}, /* 0xB4-0xB7 */ + {0x55, 0x94}, {0x55, 0x99}, {0x55, 0xEA}, {0x55, 0xF7}, /* 0xB8-0xBB */ + {0x55, 0xC9}, {0x56, 0x1F}, {0x55, 0xD1}, {0x55, 0xEB}, /* 0xBC-0xBF */ + {0x55, 0xEC}, {0x55, 0xD4}, {0x55, 0xE6}, {0x55, 0xDD}, /* 0xC0-0xC3 */ + {0x55, 0xC4}, {0x55, 0xEF}, {0x55, 0xE5}, {0x55, 0xF2}, /* 0xC4-0xC7 */ + {0x55, 0xF3}, {0x55, 0xCC}, {0x55, 0xCD}, {0x55, 0xE8}, /* 0xC8-0xCB */ + {0x55, 0xF5}, {0x55, 0xE4}, {0x8F, 0x94}, {0x56, 0x1E}, /* 0xCC-0xCF */ + {0x56, 0x08}, {0x56, 0x0C}, {0x56, 0x01}, {0x56, 0x24}, /* 0xD0-0xD3 */ + {0x56, 0x23}, {0x55, 0xFE}, {0x56, 0x00}, {0x56, 0x27}, /* 0xD4-0xD7 */ + {0x56, 0x2D}, {0x56, 0x58}, {0x56, 0x39}, {0x56, 0x57}, /* 0xD8-0xDB */ + {0x56, 0x2C}, {0x56, 0x4D}, {0x56, 0x62}, {0x56, 0x59}, /* 0xDC-0xDF */ + {0x56, 0x5C}, {0x56, 0x4C}, {0x56, 0x54}, {0x56, 0x86}, /* 0xE0-0xE3 */ + {0x56, 0x64}, {0x56, 0x71}, {0x56, 0x6B}, {0x56, 0x7B}, /* 0xE4-0xE7 */ + {0x56, 0x7C}, {0x56, 0x85}, {0x56, 0x93}, {0x56, 0xAF}, /* 0xE8-0xEB */ + {0x56, 0xD4}, {0x56, 0xD7}, {0x56, 0xDD}, {0x56, 0xE1}, /* 0xEC-0xEF */ + {0x56, 0xF5}, {0x56, 0xEB}, {0x56, 0xF9}, {0x56, 0xFF}, /* 0xF0-0xF3 */ + {0x57, 0x04}, {0x57, 0x0A}, {0x57, 0x09}, {0x57, 0x1C}, /* 0xF4-0xF7 */ + {0x5E, 0x0F}, {0x5E, 0x19}, {0x5E, 0x14}, {0x5E, 0x11}, /* 0xF8-0xFB */ + {0x5E, 0x31}, {0x5E, 0x3B}, {0x5E, 0x3C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x91, 0x45}, {0x91, 0x47}, {0x91, 0x48}, {0x91, 0x51}, /* 0x40-0x43 */ + {0x91, 0x53}, {0x91, 0x54}, {0x91, 0x55}, {0x91, 0x56}, /* 0x44-0x47 */ + {0x91, 0x58}, {0x91, 0x59}, {0x91, 0x5B}, {0x91, 0x5C}, /* 0x48-0x4B */ + {0x91, 0x5F}, {0x91, 0x60}, {0x91, 0x66}, {0x91, 0x67}, /* 0x4C-0x4F */ + {0x91, 0x68}, {0x91, 0x6B}, {0x91, 0x6D}, {0x91, 0x73}, /* 0x50-0x53 */ + {0x91, 0x7A}, {0x91, 0x7B}, {0x91, 0x7C}, {0x91, 0x80}, /* 0x54-0x57 */ + {0x91, 0x81}, {0x91, 0x82}, {0x91, 0x83}, {0x91, 0x84}, /* 0x58-0x5B */ + {0x91, 0x86}, {0x91, 0x88}, {0x91, 0x8A}, {0x91, 0x8E}, /* 0x5C-0x5F */ + {0x91, 0x8F}, {0x91, 0x93}, {0x91, 0x94}, {0x91, 0x95}, /* 0x60-0x63 */ + {0x91, 0x96}, {0x91, 0x97}, {0x91, 0x98}, {0x91, 0x99}, /* 0x64-0x67 */ + {0x91, 0x9C}, {0x91, 0x9D}, {0x91, 0x9E}, {0x91, 0x9F}, /* 0x68-0x6B */ + {0x91, 0xA0}, {0x91, 0xA1}, {0x91, 0xA4}, {0x91, 0xA5}, /* 0x6C-0x6F */ + {0x91, 0xA6}, {0x91, 0xA7}, {0x91, 0xA8}, {0x91, 0xA9}, /* 0x70-0x73 */ + {0x91, 0xAB}, {0x91, 0xAC}, {0x91, 0xB0}, {0x91, 0xB1}, /* 0x74-0x77 */ + {0x91, 0xB2}, {0x91, 0xB3}, {0x91, 0xB6}, {0x91, 0xB7}, /* 0x78-0x7B */ + {0x91, 0xB8}, {0x91, 0xB9}, {0x91, 0xBB}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x91, 0xBC}, {0x91, 0xBD}, {0x91, 0xBE}, {0x91, 0xBF}, /* 0x80-0x83 */ + {0x91, 0xC0}, {0x91, 0xC1}, {0x91, 0xC2}, {0x91, 0xC3}, /* 0x84-0x87 */ + {0x91, 0xC4}, {0x91, 0xC5}, {0x91, 0xC6}, {0x91, 0xC8}, /* 0x88-0x8B */ + {0x91, 0xCB}, {0x91, 0xD0}, {0x91, 0xD2}, {0x91, 0xD3}, /* 0x8C-0x8F */ + {0x91, 0xD4}, {0x91, 0xD5}, {0x91, 0xD6}, {0x91, 0xD7}, /* 0x90-0x93 */ + {0x91, 0xD8}, {0x91, 0xD9}, {0x91, 0xDA}, {0x91, 0xDB}, /* 0x94-0x97 */ + {0x91, 0xDD}, {0x91, 0xDE}, {0x91, 0xDF}, {0x91, 0xE0}, /* 0x98-0x9B */ + {0x91, 0xE1}, {0x91, 0xE2}, {0x91, 0xE3}, {0x91, 0xE4}, /* 0x9C-0x9F */ + {0x91, 0xE5}, {0x5E, 0x37}, {0x5E, 0x44}, {0x5E, 0x54}, /* 0xA0-0xA3 */ + {0x5E, 0x5B}, {0x5E, 0x5E}, {0x5E, 0x61}, {0x5C, 0x8C}, /* 0xA4-0xA7 */ + {0x5C, 0x7A}, {0x5C, 0x8D}, {0x5C, 0x90}, {0x5C, 0x96}, /* 0xA8-0xAB */ + {0x5C, 0x88}, {0x5C, 0x98}, {0x5C, 0x99}, {0x5C, 0x91}, /* 0xAC-0xAF */ + {0x5C, 0x9A}, {0x5C, 0x9C}, {0x5C, 0xB5}, {0x5C, 0xA2}, /* 0xB0-0xB3 */ + {0x5C, 0xBD}, {0x5C, 0xAC}, {0x5C, 0xAB}, {0x5C, 0xB1}, /* 0xB4-0xB7 */ + {0x5C, 0xA3}, {0x5C, 0xC1}, {0x5C, 0xB7}, {0x5C, 0xC4}, /* 0xB8-0xBB */ + {0x5C, 0xD2}, {0x5C, 0xE4}, {0x5C, 0xCB}, {0x5C, 0xE5}, /* 0xBC-0xBF */ + {0x5D, 0x02}, {0x5D, 0x03}, {0x5D, 0x27}, {0x5D, 0x26}, /* 0xC0-0xC3 */ + {0x5D, 0x2E}, {0x5D, 0x24}, {0x5D, 0x1E}, {0x5D, 0x06}, /* 0xC4-0xC7 */ + {0x5D, 0x1B}, {0x5D, 0x58}, {0x5D, 0x3E}, {0x5D, 0x34}, /* 0xC8-0xCB */ + {0x5D, 0x3D}, {0x5D, 0x6C}, {0x5D, 0x5B}, {0x5D, 0x6F}, /* 0xCC-0xCF */ + {0x5D, 0x5D}, {0x5D, 0x6B}, {0x5D, 0x4B}, {0x5D, 0x4A}, /* 0xD0-0xD3 */ + {0x5D, 0x69}, {0x5D, 0x74}, {0x5D, 0x82}, {0x5D, 0x99}, /* 0xD4-0xD7 */ + {0x5D, 0x9D}, {0x8C, 0x73}, {0x5D, 0xB7}, {0x5D, 0xC5}, /* 0xD8-0xDB */ + {0x5F, 0x73}, {0x5F, 0x77}, {0x5F, 0x82}, {0x5F, 0x87}, /* 0xDC-0xDF */ + {0x5F, 0x89}, {0x5F, 0x8C}, {0x5F, 0x95}, {0x5F, 0x99}, /* 0xE0-0xE3 */ + {0x5F, 0x9C}, {0x5F, 0xA8}, {0x5F, 0xAD}, {0x5F, 0xB5}, /* 0xE4-0xE7 */ + {0x5F, 0xBC}, {0x88, 0x62}, {0x5F, 0x61}, {0x72, 0xAD}, /* 0xE8-0xEB */ + {0x72, 0xB0}, {0x72, 0xB4}, {0x72, 0xB7}, {0x72, 0xB8}, /* 0xEC-0xEF */ + {0x72, 0xC3}, {0x72, 0xC1}, {0x72, 0xCE}, {0x72, 0xCD}, /* 0xF0-0xF3 */ + {0x72, 0xD2}, {0x72, 0xE8}, {0x72, 0xEF}, {0x72, 0xE9}, /* 0xF4-0xF7 */ + {0x72, 0xF2}, {0x72, 0xF4}, {0x72, 0xF7}, {0x73, 0x01}, /* 0xF8-0xFB */ + {0x72, 0xF3}, {0x73, 0x03}, {0x72, 0xFA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x91, 0xE6}, {0x91, 0xE7}, {0x91, 0xE8}, {0x91, 0xE9}, /* 0x40-0x43 */ + {0x91, 0xEA}, {0x91, 0xEB}, {0x91, 0xEC}, {0x91, 0xED}, /* 0x44-0x47 */ + {0x91, 0xEE}, {0x91, 0xEF}, {0x91, 0xF0}, {0x91, 0xF1}, /* 0x48-0x4B */ + {0x91, 0xF2}, {0x91, 0xF3}, {0x91, 0xF4}, {0x91, 0xF5}, /* 0x4C-0x4F */ + {0x91, 0xF6}, {0x91, 0xF7}, {0x91, 0xF8}, {0x91, 0xF9}, /* 0x50-0x53 */ + {0x91, 0xFA}, {0x91, 0xFB}, {0x91, 0xFC}, {0x91, 0xFD}, /* 0x54-0x57 */ + {0x91, 0xFE}, {0x91, 0xFF}, {0x92, 0x00}, {0x92, 0x01}, /* 0x58-0x5B */ + {0x92, 0x02}, {0x92, 0x03}, {0x92, 0x04}, {0x92, 0x05}, /* 0x5C-0x5F */ + {0x92, 0x06}, {0x92, 0x07}, {0x92, 0x08}, {0x92, 0x09}, /* 0x60-0x63 */ + {0x92, 0x0A}, {0x92, 0x0B}, {0x92, 0x0C}, {0x92, 0x0D}, /* 0x64-0x67 */ + {0x92, 0x0E}, {0x92, 0x0F}, {0x92, 0x10}, {0x92, 0x11}, /* 0x68-0x6B */ + {0x92, 0x12}, {0x92, 0x13}, {0x92, 0x14}, {0x92, 0x15}, /* 0x6C-0x6F */ + {0x92, 0x16}, {0x92, 0x17}, {0x92, 0x18}, {0x92, 0x19}, /* 0x70-0x73 */ + {0x92, 0x1A}, {0x92, 0x1B}, {0x92, 0x1C}, {0x92, 0x1D}, /* 0x74-0x77 */ + {0x92, 0x1E}, {0x92, 0x1F}, {0x92, 0x20}, {0x92, 0x21}, /* 0x78-0x7B */ + {0x92, 0x22}, {0x92, 0x23}, {0x92, 0x24}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x92, 0x25}, {0x92, 0x26}, {0x92, 0x27}, {0x92, 0x28}, /* 0x80-0x83 */ + {0x92, 0x29}, {0x92, 0x2A}, {0x92, 0x2B}, {0x92, 0x2C}, /* 0x84-0x87 */ + {0x92, 0x2D}, {0x92, 0x2E}, {0x92, 0x2F}, {0x92, 0x30}, /* 0x88-0x8B */ + {0x92, 0x31}, {0x92, 0x32}, {0x92, 0x33}, {0x92, 0x34}, /* 0x8C-0x8F */ + {0x92, 0x35}, {0x92, 0x36}, {0x92, 0x37}, {0x92, 0x38}, /* 0x90-0x93 */ + {0x92, 0x39}, {0x92, 0x3A}, {0x92, 0x3B}, {0x92, 0x3C}, /* 0x94-0x97 */ + {0x92, 0x3D}, {0x92, 0x3E}, {0x92, 0x3F}, {0x92, 0x40}, /* 0x98-0x9B */ + {0x92, 0x41}, {0x92, 0x42}, {0x92, 0x43}, {0x92, 0x44}, /* 0x9C-0x9F */ + {0x92, 0x45}, {0x72, 0xFB}, {0x73, 0x17}, {0x73, 0x13}, /* 0xA0-0xA3 */ + {0x73, 0x21}, {0x73, 0x0A}, {0x73, 0x1E}, {0x73, 0x1D}, /* 0xA4-0xA7 */ + {0x73, 0x15}, {0x73, 0x22}, {0x73, 0x39}, {0x73, 0x25}, /* 0xA8-0xAB */ + {0x73, 0x2C}, {0x73, 0x38}, {0x73, 0x31}, {0x73, 0x50}, /* 0xAC-0xAF */ + {0x73, 0x4D}, {0x73, 0x57}, {0x73, 0x60}, {0x73, 0x6C}, /* 0xB0-0xB3 */ + {0x73, 0x6F}, {0x73, 0x7E}, {0x82, 0x1B}, {0x59, 0x25}, /* 0xB4-0xB7 */ + {0x98, 0xE7}, {0x59, 0x24}, {0x59, 0x02}, {0x99, 0x63}, /* 0xB8-0xBB */ + {0x99, 0x67}, {0x99, 0x68}, {0x99, 0x69}, {0x99, 0x6A}, /* 0xBC-0xBF */ + {0x99, 0x6B}, {0x99, 0x6C}, {0x99, 0x74}, {0x99, 0x77}, /* 0xC0-0xC3 */ + {0x99, 0x7D}, {0x99, 0x80}, {0x99, 0x84}, {0x99, 0x87}, /* 0xC4-0xC7 */ + {0x99, 0x8A}, {0x99, 0x8D}, {0x99, 0x90}, {0x99, 0x91}, /* 0xC8-0xCB */ + {0x99, 0x93}, {0x99, 0x94}, {0x99, 0x95}, {0x5E, 0x80}, /* 0xCC-0xCF */ + {0x5E, 0x91}, {0x5E, 0x8B}, {0x5E, 0x96}, {0x5E, 0xA5}, /* 0xD0-0xD3 */ + {0x5E, 0xA0}, {0x5E, 0xB9}, {0x5E, 0xB5}, {0x5E, 0xBE}, /* 0xD4-0xD7 */ + {0x5E, 0xB3}, {0x8D, 0x53}, {0x5E, 0xD2}, {0x5E, 0xD1}, /* 0xD8-0xDB */ + {0x5E, 0xDB}, {0x5E, 0xE8}, {0x5E, 0xEA}, {0x81, 0xBA}, /* 0xDC-0xDF */ + {0x5F, 0xC4}, {0x5F, 0xC9}, {0x5F, 0xD6}, {0x5F, 0xCF}, /* 0xE0-0xE3 */ + {0x60, 0x03}, {0x5F, 0xEE}, {0x60, 0x04}, {0x5F, 0xE1}, /* 0xE4-0xE7 */ + {0x5F, 0xE4}, {0x5F, 0xFE}, {0x60, 0x05}, {0x60, 0x06}, /* 0xE8-0xEB */ + {0x5F, 0xEA}, {0x5F, 0xED}, {0x5F, 0xF8}, {0x60, 0x19}, /* 0xEC-0xEF */ + {0x60, 0x35}, {0x60, 0x26}, {0x60, 0x1B}, {0x60, 0x0F}, /* 0xF0-0xF3 */ + {0x60, 0x0D}, {0x60, 0x29}, {0x60, 0x2B}, {0x60, 0x0A}, /* 0xF4-0xF7 */ + {0x60, 0x3F}, {0x60, 0x21}, {0x60, 0x78}, {0x60, 0x79}, /* 0xF8-0xFB */ + {0x60, 0x7B}, {0x60, 0x7A}, {0x60, 0x42}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x92, 0x46}, {0x92, 0x47}, {0x92, 0x48}, {0x92, 0x49}, /* 0x40-0x43 */ + {0x92, 0x4A}, {0x92, 0x4B}, {0x92, 0x4C}, {0x92, 0x4D}, /* 0x44-0x47 */ + {0x92, 0x4E}, {0x92, 0x4F}, {0x92, 0x50}, {0x92, 0x51}, /* 0x48-0x4B */ + {0x92, 0x52}, {0x92, 0x53}, {0x92, 0x54}, {0x92, 0x55}, /* 0x4C-0x4F */ + {0x92, 0x56}, {0x92, 0x57}, {0x92, 0x58}, {0x92, 0x59}, /* 0x50-0x53 */ + {0x92, 0x5A}, {0x92, 0x5B}, {0x92, 0x5C}, {0x92, 0x5D}, /* 0x54-0x57 */ + {0x92, 0x5E}, {0x92, 0x5F}, {0x92, 0x60}, {0x92, 0x61}, /* 0x58-0x5B */ + {0x92, 0x62}, {0x92, 0x63}, {0x92, 0x64}, {0x92, 0x65}, /* 0x5C-0x5F */ + {0x92, 0x66}, {0x92, 0x67}, {0x92, 0x68}, {0x92, 0x69}, /* 0x60-0x63 */ + {0x92, 0x6A}, {0x92, 0x6B}, {0x92, 0x6C}, {0x92, 0x6D}, /* 0x64-0x67 */ + {0x92, 0x6E}, {0x92, 0x6F}, {0x92, 0x70}, {0x92, 0x71}, /* 0x68-0x6B */ + {0x92, 0x72}, {0x92, 0x73}, {0x92, 0x75}, {0x92, 0x76}, /* 0x6C-0x6F */ + {0x92, 0x77}, {0x92, 0x78}, {0x92, 0x79}, {0x92, 0x7A}, /* 0x70-0x73 */ + {0x92, 0x7B}, {0x92, 0x7C}, {0x92, 0x7D}, {0x92, 0x7E}, /* 0x74-0x77 */ + {0x92, 0x7F}, {0x92, 0x80}, {0x92, 0x81}, {0x92, 0x82}, /* 0x78-0x7B */ + {0x92, 0x83}, {0x92, 0x84}, {0x92, 0x85}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x92, 0x86}, {0x92, 0x87}, {0x92, 0x88}, {0x92, 0x89}, /* 0x80-0x83 */ + {0x92, 0x8A}, {0x92, 0x8B}, {0x92, 0x8C}, {0x92, 0x8D}, /* 0x84-0x87 */ + {0x92, 0x8F}, {0x92, 0x90}, {0x92, 0x91}, {0x92, 0x92}, /* 0x88-0x8B */ + {0x92, 0x93}, {0x92, 0x94}, {0x92, 0x95}, {0x92, 0x96}, /* 0x8C-0x8F */ + {0x92, 0x97}, {0x92, 0x98}, {0x92, 0x99}, {0x92, 0x9A}, /* 0x90-0x93 */ + {0x92, 0x9B}, {0x92, 0x9C}, {0x92, 0x9D}, {0x92, 0x9E}, /* 0x94-0x97 */ + {0x92, 0x9F}, {0x92, 0xA0}, {0x92, 0xA1}, {0x92, 0xA2}, /* 0x98-0x9B */ + {0x92, 0xA3}, {0x92, 0xA4}, {0x92, 0xA5}, {0x92, 0xA6}, /* 0x9C-0x9F */ + {0x92, 0xA7}, {0x60, 0x6A}, {0x60, 0x7D}, {0x60, 0x96}, /* 0xA0-0xA3 */ + {0x60, 0x9A}, {0x60, 0xAD}, {0x60, 0x9D}, {0x60, 0x83}, /* 0xA4-0xA7 */ + {0x60, 0x92}, {0x60, 0x8C}, {0x60, 0x9B}, {0x60, 0xEC}, /* 0xA8-0xAB */ + {0x60, 0xBB}, {0x60, 0xB1}, {0x60, 0xDD}, {0x60, 0xD8}, /* 0xAC-0xAF */ + {0x60, 0xC6}, {0x60, 0xDA}, {0x60, 0xB4}, {0x61, 0x20}, /* 0xB0-0xB3 */ + {0x61, 0x26}, {0x61, 0x15}, {0x61, 0x23}, {0x60, 0xF4}, /* 0xB4-0xB7 */ + {0x61, 0x00}, {0x61, 0x0E}, {0x61, 0x2B}, {0x61, 0x4A}, /* 0xB8-0xBB */ + {0x61, 0x75}, {0x61, 0xAC}, {0x61, 0x94}, {0x61, 0xA7}, /* 0xBC-0xBF */ + {0x61, 0xB7}, {0x61, 0xD4}, {0x61, 0xF5}, {0x5F, 0xDD}, /* 0xC0-0xC3 */ + {0x96, 0xB3}, {0x95, 0xE9}, {0x95, 0xEB}, {0x95, 0xF1}, /* 0xC4-0xC7 */ + {0x95, 0xF3}, {0x95, 0xF5}, {0x95, 0xF6}, {0x95, 0xFC}, /* 0xC8-0xCB */ + {0x95, 0xFE}, {0x96, 0x03}, {0x96, 0x04}, {0x96, 0x06}, /* 0xCC-0xCF */ + {0x96, 0x08}, {0x96, 0x0A}, {0x96, 0x0B}, {0x96, 0x0C}, /* 0xD0-0xD3 */ + {0x96, 0x0D}, {0x96, 0x0F}, {0x96, 0x12}, {0x96, 0x15}, /* 0xD4-0xD7 */ + {0x96, 0x16}, {0x96, 0x17}, {0x96, 0x19}, {0x96, 0x1A}, /* 0xD8-0xDB */ + {0x4E, 0x2C}, {0x72, 0x3F}, {0x62, 0x15}, {0x6C, 0x35}, /* 0xDC-0xDF */ + {0x6C, 0x54}, {0x6C, 0x5C}, {0x6C, 0x4A}, {0x6C, 0xA3}, /* 0xE0-0xE3 */ + {0x6C, 0x85}, {0x6C, 0x90}, {0x6C, 0x94}, {0x6C, 0x8C}, /* 0xE4-0xE7 */ + {0x6C, 0x68}, {0x6C, 0x69}, {0x6C, 0x74}, {0x6C, 0x76}, /* 0xE8-0xEB */ + {0x6C, 0x86}, {0x6C, 0xA9}, {0x6C, 0xD0}, {0x6C, 0xD4}, /* 0xEC-0xEF */ + {0x6C, 0xAD}, {0x6C, 0xF7}, {0x6C, 0xF8}, {0x6C, 0xF1}, /* 0xF0-0xF3 */ + {0x6C, 0xD7}, {0x6C, 0xB2}, {0x6C, 0xE0}, {0x6C, 0xD6}, /* 0xF4-0xF7 */ + {0x6C, 0xFA}, {0x6C, 0xEB}, {0x6C, 0xEE}, {0x6C, 0xB1}, /* 0xF8-0xFB */ + {0x6C, 0xD3}, {0x6C, 0xEF}, {0x6C, 0xFE}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x92, 0xA8}, {0x92, 0xA9}, {0x92, 0xAA}, {0x92, 0xAB}, /* 0x40-0x43 */ + {0x92, 0xAC}, {0x92, 0xAD}, {0x92, 0xAF}, {0x92, 0xB0}, /* 0x44-0x47 */ + {0x92, 0xB1}, {0x92, 0xB2}, {0x92, 0xB3}, {0x92, 0xB4}, /* 0x48-0x4B */ + {0x92, 0xB5}, {0x92, 0xB6}, {0x92, 0xB7}, {0x92, 0xB8}, /* 0x4C-0x4F */ + {0x92, 0xB9}, {0x92, 0xBA}, {0x92, 0xBB}, {0x92, 0xBC}, /* 0x50-0x53 */ + {0x92, 0xBD}, {0x92, 0xBE}, {0x92, 0xBF}, {0x92, 0xC0}, /* 0x54-0x57 */ + {0x92, 0xC1}, {0x92, 0xC2}, {0x92, 0xC3}, {0x92, 0xC4}, /* 0x58-0x5B */ + {0x92, 0xC5}, {0x92, 0xC6}, {0x92, 0xC7}, {0x92, 0xC9}, /* 0x5C-0x5F */ + {0x92, 0xCA}, {0x92, 0xCB}, {0x92, 0xCC}, {0x92, 0xCD}, /* 0x60-0x63 */ + {0x92, 0xCE}, {0x92, 0xCF}, {0x92, 0xD0}, {0x92, 0xD1}, /* 0x64-0x67 */ + {0x92, 0xD2}, {0x92, 0xD3}, {0x92, 0xD4}, {0x92, 0xD5}, /* 0x68-0x6B */ + {0x92, 0xD6}, {0x92, 0xD7}, {0x92, 0xD8}, {0x92, 0xD9}, /* 0x6C-0x6F */ + {0x92, 0xDA}, {0x92, 0xDB}, {0x92, 0xDC}, {0x92, 0xDD}, /* 0x70-0x73 */ + {0x92, 0xDE}, {0x92, 0xDF}, {0x92, 0xE0}, {0x92, 0xE1}, /* 0x74-0x77 */ + {0x92, 0xE2}, {0x92, 0xE3}, {0x92, 0xE4}, {0x92, 0xE5}, /* 0x78-0x7B */ + {0x92, 0xE6}, {0x92, 0xE7}, {0x92, 0xE8}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x92, 0xE9}, {0x92, 0xEA}, {0x92, 0xEB}, {0x92, 0xEC}, /* 0x80-0x83 */ + {0x92, 0xED}, {0x92, 0xEE}, {0x92, 0xEF}, {0x92, 0xF0}, /* 0x84-0x87 */ + {0x92, 0xF1}, {0x92, 0xF2}, {0x92, 0xF3}, {0x92, 0xF4}, /* 0x88-0x8B */ + {0x92, 0xF5}, {0x92, 0xF6}, {0x92, 0xF7}, {0x92, 0xF8}, /* 0x8C-0x8F */ + {0x92, 0xF9}, {0x92, 0xFA}, {0x92, 0xFB}, {0x92, 0xFC}, /* 0x90-0x93 */ + {0x92, 0xFD}, {0x92, 0xFE}, {0x92, 0xFF}, {0x93, 0x00}, /* 0x94-0x97 */ + {0x93, 0x01}, {0x93, 0x02}, {0x93, 0x03}, {0x93, 0x04}, /* 0x98-0x9B */ + {0x93, 0x05}, {0x93, 0x06}, {0x93, 0x07}, {0x93, 0x08}, /* 0x9C-0x9F */ + {0x93, 0x09}, {0x6D, 0x39}, {0x6D, 0x27}, {0x6D, 0x0C}, /* 0xA0-0xA3 */ + {0x6D, 0x43}, {0x6D, 0x48}, {0x6D, 0x07}, {0x6D, 0x04}, /* 0xA4-0xA7 */ + {0x6D, 0x19}, {0x6D, 0x0E}, {0x6D, 0x2B}, {0x6D, 0x4D}, /* 0xA8-0xAB */ + {0x6D, 0x2E}, {0x6D, 0x35}, {0x6D, 0x1A}, {0x6D, 0x4F}, /* 0xAC-0xAF */ + {0x6D, 0x52}, {0x6D, 0x54}, {0x6D, 0x33}, {0x6D, 0x91}, /* 0xB0-0xB3 */ + {0x6D, 0x6F}, {0x6D, 0x9E}, {0x6D, 0xA0}, {0x6D, 0x5E}, /* 0xB4-0xB7 */ + {0x6D, 0x93}, {0x6D, 0x94}, {0x6D, 0x5C}, {0x6D, 0x60}, /* 0xB8-0xBB */ + {0x6D, 0x7C}, {0x6D, 0x63}, {0x6E, 0x1A}, {0x6D, 0xC7}, /* 0xBC-0xBF */ + {0x6D, 0xC5}, {0x6D, 0xDE}, {0x6E, 0x0E}, {0x6D, 0xBF}, /* 0xC0-0xC3 */ + {0x6D, 0xE0}, {0x6E, 0x11}, {0x6D, 0xE6}, {0x6D, 0xDD}, /* 0xC4-0xC7 */ + {0x6D, 0xD9}, {0x6E, 0x16}, {0x6D, 0xAB}, {0x6E, 0x0C}, /* 0xC8-0xCB */ + {0x6D, 0xAE}, {0x6E, 0x2B}, {0x6E, 0x6E}, {0x6E, 0x4E}, /* 0xCC-0xCF */ + {0x6E, 0x6B}, {0x6E, 0xB2}, {0x6E, 0x5F}, {0x6E, 0x86}, /* 0xD0-0xD3 */ + {0x6E, 0x53}, {0x6E, 0x54}, {0x6E, 0x32}, {0x6E, 0x25}, /* 0xD4-0xD7 */ + {0x6E, 0x44}, {0x6E, 0xDF}, {0x6E, 0xB1}, {0x6E, 0x98}, /* 0xD8-0xDB */ + {0x6E, 0xE0}, {0x6F, 0x2D}, {0x6E, 0xE2}, {0x6E, 0xA5}, /* 0xDC-0xDF */ + {0x6E, 0xA7}, {0x6E, 0xBD}, {0x6E, 0xBB}, {0x6E, 0xB7}, /* 0xE0-0xE3 */ + {0x6E, 0xD7}, {0x6E, 0xB4}, {0x6E, 0xCF}, {0x6E, 0x8F}, /* 0xE4-0xE7 */ + {0x6E, 0xC2}, {0x6E, 0x9F}, {0x6F, 0x62}, {0x6F, 0x46}, /* 0xE8-0xEB */ + {0x6F, 0x47}, {0x6F, 0x24}, {0x6F, 0x15}, {0x6E, 0xF9}, /* 0xEC-0xEF */ + {0x6F, 0x2F}, {0x6F, 0x36}, {0x6F, 0x4B}, {0x6F, 0x74}, /* 0xF0-0xF3 */ + {0x6F, 0x2A}, {0x6F, 0x09}, {0x6F, 0x29}, {0x6F, 0x89}, /* 0xF4-0xF7 */ + {0x6F, 0x8D}, {0x6F, 0x8C}, {0x6F, 0x78}, {0x6F, 0x72}, /* 0xF8-0xFB */ + {0x6F, 0x7C}, {0x6F, 0x7A}, {0x6F, 0xD1}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x93, 0x0A}, {0x93, 0x0B}, {0x93, 0x0C}, {0x93, 0x0D}, /* 0x40-0x43 */ + {0x93, 0x0E}, {0x93, 0x0F}, {0x93, 0x10}, {0x93, 0x11}, /* 0x44-0x47 */ + {0x93, 0x12}, {0x93, 0x13}, {0x93, 0x14}, {0x93, 0x15}, /* 0x48-0x4B */ + {0x93, 0x16}, {0x93, 0x17}, {0x93, 0x18}, {0x93, 0x19}, /* 0x4C-0x4F */ + {0x93, 0x1A}, {0x93, 0x1B}, {0x93, 0x1C}, {0x93, 0x1D}, /* 0x50-0x53 */ + {0x93, 0x1E}, {0x93, 0x1F}, {0x93, 0x20}, {0x93, 0x21}, /* 0x54-0x57 */ + {0x93, 0x22}, {0x93, 0x23}, {0x93, 0x24}, {0x93, 0x25}, /* 0x58-0x5B */ + {0x93, 0x26}, {0x93, 0x27}, {0x93, 0x28}, {0x93, 0x29}, /* 0x5C-0x5F */ + {0x93, 0x2A}, {0x93, 0x2B}, {0x93, 0x2C}, {0x93, 0x2D}, /* 0x60-0x63 */ + {0x93, 0x2E}, {0x93, 0x2F}, {0x93, 0x30}, {0x93, 0x31}, /* 0x64-0x67 */ + {0x93, 0x32}, {0x93, 0x33}, {0x93, 0x34}, {0x93, 0x35}, /* 0x68-0x6B */ + {0x93, 0x36}, {0x93, 0x37}, {0x93, 0x38}, {0x93, 0x39}, /* 0x6C-0x6F */ + {0x93, 0x3A}, {0x93, 0x3B}, {0x93, 0x3C}, {0x93, 0x3D}, /* 0x70-0x73 */ + {0x93, 0x3F}, {0x93, 0x40}, {0x93, 0x41}, {0x93, 0x42}, /* 0x74-0x77 */ + {0x93, 0x43}, {0x93, 0x44}, {0x93, 0x45}, {0x93, 0x46}, /* 0x78-0x7B */ + {0x93, 0x47}, {0x93, 0x48}, {0x93, 0x49}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x93, 0x4A}, {0x93, 0x4B}, {0x93, 0x4C}, {0x93, 0x4D}, /* 0x80-0x83 */ + {0x93, 0x4E}, {0x93, 0x4F}, {0x93, 0x50}, {0x93, 0x51}, /* 0x84-0x87 */ + {0x93, 0x52}, {0x93, 0x53}, {0x93, 0x54}, {0x93, 0x55}, /* 0x88-0x8B */ + {0x93, 0x56}, {0x93, 0x57}, {0x93, 0x58}, {0x93, 0x59}, /* 0x8C-0x8F */ + {0x93, 0x5A}, {0x93, 0x5B}, {0x93, 0x5C}, {0x93, 0x5D}, /* 0x90-0x93 */ + {0x93, 0x5E}, {0x93, 0x5F}, {0x93, 0x60}, {0x93, 0x61}, /* 0x94-0x97 */ + {0x93, 0x62}, {0x93, 0x63}, {0x93, 0x64}, {0x93, 0x65}, /* 0x98-0x9B */ + {0x93, 0x66}, {0x93, 0x67}, {0x93, 0x68}, {0x93, 0x69}, /* 0x9C-0x9F */ + {0x93, 0x6B}, {0x6F, 0xC9}, {0x6F, 0xA7}, {0x6F, 0xB9}, /* 0xA0-0xA3 */ + {0x6F, 0xB6}, {0x6F, 0xC2}, {0x6F, 0xE1}, {0x6F, 0xEE}, /* 0xA4-0xA7 */ + {0x6F, 0xDE}, {0x6F, 0xE0}, {0x6F, 0xEF}, {0x70, 0x1A}, /* 0xA8-0xAB */ + {0x70, 0x23}, {0x70, 0x1B}, {0x70, 0x39}, {0x70, 0x35}, /* 0xAC-0xAF */ + {0x70, 0x4F}, {0x70, 0x5E}, {0x5B, 0x80}, {0x5B, 0x84}, /* 0xB0-0xB3 */ + {0x5B, 0x95}, {0x5B, 0x93}, {0x5B, 0xA5}, {0x5B, 0xB8}, /* 0xB4-0xB7 */ + {0x75, 0x2F}, {0x9A, 0x9E}, {0x64, 0x34}, {0x5B, 0xE4}, /* 0xB8-0xBB */ + {0x5B, 0xEE}, {0x89, 0x30}, {0x5B, 0xF0}, {0x8E, 0x47}, /* 0xBC-0xBF */ + {0x8B, 0x07}, {0x8F, 0xB6}, {0x8F, 0xD3}, {0x8F, 0xD5}, /* 0xC0-0xC3 */ + {0x8F, 0xE5}, {0x8F, 0xEE}, {0x8F, 0xE4}, {0x8F, 0xE9}, /* 0xC4-0xC7 */ + {0x8F, 0xE6}, {0x8F, 0xF3}, {0x8F, 0xE8}, {0x90, 0x05}, /* 0xC8-0xCB */ + {0x90, 0x04}, {0x90, 0x0B}, {0x90, 0x26}, {0x90, 0x11}, /* 0xCC-0xCF */ + {0x90, 0x0D}, {0x90, 0x16}, {0x90, 0x21}, {0x90, 0x35}, /* 0xD0-0xD3 */ + {0x90, 0x36}, {0x90, 0x2D}, {0x90, 0x2F}, {0x90, 0x44}, /* 0xD4-0xD7 */ + {0x90, 0x51}, {0x90, 0x52}, {0x90, 0x50}, {0x90, 0x68}, /* 0xD8-0xDB */ + {0x90, 0x58}, {0x90, 0x62}, {0x90, 0x5B}, {0x66, 0xB9}, /* 0xDC-0xDF */ + {0x90, 0x74}, {0x90, 0x7D}, {0x90, 0x82}, {0x90, 0x88}, /* 0xE0-0xE3 */ + {0x90, 0x83}, {0x90, 0x8B}, {0x5F, 0x50}, {0x5F, 0x57}, /* 0xE4-0xE7 */ + {0x5F, 0x56}, {0x5F, 0x58}, {0x5C, 0x3B}, {0x54, 0xAB}, /* 0xE8-0xEB */ + {0x5C, 0x50}, {0x5C, 0x59}, {0x5B, 0x71}, {0x5C, 0x63}, /* 0xEC-0xEF */ + {0x5C, 0x66}, {0x7F, 0xBC}, {0x5F, 0x2A}, {0x5F, 0x29}, /* 0xF0-0xF3 */ + {0x5F, 0x2D}, {0x82, 0x74}, {0x5F, 0x3C}, {0x9B, 0x3B}, /* 0xF4-0xF7 */ + {0x5C, 0x6E}, {0x59, 0x81}, {0x59, 0x83}, {0x59, 0x8D}, /* 0xF8-0xFB */ + {0x59, 0xA9}, {0x59, 0xAA}, {0x59, 0xA3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x93, 0x6C}, {0x93, 0x6D}, {0x93, 0x6E}, {0x93, 0x6F}, /* 0x40-0x43 */ + {0x93, 0x70}, {0x93, 0x71}, {0x93, 0x72}, {0x93, 0x73}, /* 0x44-0x47 */ + {0x93, 0x74}, {0x93, 0x75}, {0x93, 0x76}, {0x93, 0x77}, /* 0x48-0x4B */ + {0x93, 0x78}, {0x93, 0x79}, {0x93, 0x7A}, {0x93, 0x7B}, /* 0x4C-0x4F */ + {0x93, 0x7C}, {0x93, 0x7D}, {0x93, 0x7E}, {0x93, 0x7F}, /* 0x50-0x53 */ + {0x93, 0x80}, {0x93, 0x81}, {0x93, 0x82}, {0x93, 0x83}, /* 0x54-0x57 */ + {0x93, 0x84}, {0x93, 0x85}, {0x93, 0x86}, {0x93, 0x87}, /* 0x58-0x5B */ + {0x93, 0x88}, {0x93, 0x89}, {0x93, 0x8A}, {0x93, 0x8B}, /* 0x5C-0x5F */ + {0x93, 0x8C}, {0x93, 0x8D}, {0x93, 0x8E}, {0x93, 0x90}, /* 0x60-0x63 */ + {0x93, 0x91}, {0x93, 0x92}, {0x93, 0x93}, {0x93, 0x94}, /* 0x64-0x67 */ + {0x93, 0x95}, {0x93, 0x96}, {0x93, 0x97}, {0x93, 0x98}, /* 0x68-0x6B */ + {0x93, 0x99}, {0x93, 0x9A}, {0x93, 0x9B}, {0x93, 0x9C}, /* 0x6C-0x6F */ + {0x93, 0x9D}, {0x93, 0x9E}, {0x93, 0x9F}, {0x93, 0xA0}, /* 0x70-0x73 */ + {0x93, 0xA1}, {0x93, 0xA2}, {0x93, 0xA3}, {0x93, 0xA4}, /* 0x74-0x77 */ + {0x93, 0xA5}, {0x93, 0xA6}, {0x93, 0xA7}, {0x93, 0xA8}, /* 0x78-0x7B */ + {0x93, 0xA9}, {0x93, 0xAA}, {0x93, 0xAB}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x93, 0xAC}, {0x93, 0xAD}, {0x93, 0xAE}, {0x93, 0xAF}, /* 0x80-0x83 */ + {0x93, 0xB0}, {0x93, 0xB1}, {0x93, 0xB2}, {0x93, 0xB3}, /* 0x84-0x87 */ + {0x93, 0xB4}, {0x93, 0xB5}, {0x93, 0xB6}, {0x93, 0xB7}, /* 0x88-0x8B */ + {0x93, 0xB8}, {0x93, 0xB9}, {0x93, 0xBA}, {0x93, 0xBB}, /* 0x8C-0x8F */ + {0x93, 0xBC}, {0x93, 0xBD}, {0x93, 0xBE}, {0x93, 0xBF}, /* 0x90-0x93 */ + {0x93, 0xC0}, {0x93, 0xC1}, {0x93, 0xC2}, {0x93, 0xC3}, /* 0x94-0x97 */ + {0x93, 0xC4}, {0x93, 0xC5}, {0x93, 0xC6}, {0x93, 0xC7}, /* 0x98-0x9B */ + {0x93, 0xC8}, {0x93, 0xC9}, {0x93, 0xCB}, {0x93, 0xCC}, /* 0x9C-0x9F */ + {0x93, 0xCD}, {0x59, 0x97}, {0x59, 0xCA}, {0x59, 0xAB}, /* 0xA0-0xA3 */ + {0x59, 0x9E}, {0x59, 0xA4}, {0x59, 0xD2}, {0x59, 0xB2}, /* 0xA4-0xA7 */ + {0x59, 0xAF}, {0x59, 0xD7}, {0x59, 0xBE}, {0x5A, 0x05}, /* 0xA8-0xAB */ + {0x5A, 0x06}, {0x59, 0xDD}, {0x5A, 0x08}, {0x59, 0xE3}, /* 0xAC-0xAF */ + {0x59, 0xD8}, {0x59, 0xF9}, {0x5A, 0x0C}, {0x5A, 0x09}, /* 0xB0-0xB3 */ + {0x5A, 0x32}, {0x5A, 0x34}, {0x5A, 0x11}, {0x5A, 0x23}, /* 0xB4-0xB7 */ + {0x5A, 0x13}, {0x5A, 0x40}, {0x5A, 0x67}, {0x5A, 0x4A}, /* 0xB8-0xBB */ + {0x5A, 0x55}, {0x5A, 0x3C}, {0x5A, 0x62}, {0x5A, 0x75}, /* 0xBC-0xBF */ + {0x80, 0xEC}, {0x5A, 0xAA}, {0x5A, 0x9B}, {0x5A, 0x77}, /* 0xC0-0xC3 */ + {0x5A, 0x7A}, {0x5A, 0xBE}, {0x5A, 0xEB}, {0x5A, 0xB2}, /* 0xC4-0xC7 */ + {0x5A, 0xD2}, {0x5A, 0xD4}, {0x5A, 0xB8}, {0x5A, 0xE0}, /* 0xC8-0xCB */ + {0x5A, 0xE3}, {0x5A, 0xF1}, {0x5A, 0xD6}, {0x5A, 0xE6}, /* 0xCC-0xCF */ + {0x5A, 0xD8}, {0x5A, 0xDC}, {0x5B, 0x09}, {0x5B, 0x17}, /* 0xD0-0xD3 */ + {0x5B, 0x16}, {0x5B, 0x32}, {0x5B, 0x37}, {0x5B, 0x40}, /* 0xD4-0xD7 */ + {0x5C, 0x15}, {0x5C, 0x1C}, {0x5B, 0x5A}, {0x5B, 0x65}, /* 0xD8-0xDB */ + {0x5B, 0x73}, {0x5B, 0x51}, {0x5B, 0x53}, {0x5B, 0x62}, /* 0xDC-0xDF */ + {0x9A, 0x75}, {0x9A, 0x77}, {0x9A, 0x78}, {0x9A, 0x7A}, /* 0xE0-0xE3 */ + {0x9A, 0x7F}, {0x9A, 0x7D}, {0x9A, 0x80}, {0x9A, 0x81}, /* 0xE4-0xE7 */ + {0x9A, 0x85}, {0x9A, 0x88}, {0x9A, 0x8A}, {0x9A, 0x90}, /* 0xE8-0xEB */ + {0x9A, 0x92}, {0x9A, 0x93}, {0x9A, 0x96}, {0x9A, 0x98}, /* 0xEC-0xEF */ + {0x9A, 0x9B}, {0x9A, 0x9C}, {0x9A, 0x9D}, {0x9A, 0x9F}, /* 0xF0-0xF3 */ + {0x9A, 0xA0}, {0x9A, 0xA2}, {0x9A, 0xA3}, {0x9A, 0xA5}, /* 0xF4-0xF7 */ + {0x9A, 0xA7}, {0x7E, 0x9F}, {0x7E, 0xA1}, {0x7E, 0xA3}, /* 0xF8-0xFB */ + {0x7E, 0xA5}, {0x7E, 0xA8}, {0x7E, 0xA9}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x93, 0xCE}, {0x93, 0xCF}, {0x93, 0xD0}, {0x93, 0xD1}, /* 0x40-0x43 */ + {0x93, 0xD2}, {0x93, 0xD3}, {0x93, 0xD4}, {0x93, 0xD5}, /* 0x44-0x47 */ + {0x93, 0xD7}, {0x93, 0xD8}, {0x93, 0xD9}, {0x93, 0xDA}, /* 0x48-0x4B */ + {0x93, 0xDB}, {0x93, 0xDC}, {0x93, 0xDD}, {0x93, 0xDE}, /* 0x4C-0x4F */ + {0x93, 0xDF}, {0x93, 0xE0}, {0x93, 0xE1}, {0x93, 0xE2}, /* 0x50-0x53 */ + {0x93, 0xE3}, {0x93, 0xE4}, {0x93, 0xE5}, {0x93, 0xE6}, /* 0x54-0x57 */ + {0x93, 0xE7}, {0x93, 0xE8}, {0x93, 0xE9}, {0x93, 0xEA}, /* 0x58-0x5B */ + {0x93, 0xEB}, {0x93, 0xEC}, {0x93, 0xED}, {0x93, 0xEE}, /* 0x5C-0x5F */ + {0x93, 0xEF}, {0x93, 0xF0}, {0x93, 0xF1}, {0x93, 0xF2}, /* 0x60-0x63 */ + {0x93, 0xF3}, {0x93, 0xF4}, {0x93, 0xF5}, {0x93, 0xF6}, /* 0x64-0x67 */ + {0x93, 0xF7}, {0x93, 0xF8}, {0x93, 0xF9}, {0x93, 0xFA}, /* 0x68-0x6B */ + {0x93, 0xFB}, {0x93, 0xFC}, {0x93, 0xFD}, {0x93, 0xFE}, /* 0x6C-0x6F */ + {0x93, 0xFF}, {0x94, 0x00}, {0x94, 0x01}, {0x94, 0x02}, /* 0x70-0x73 */ + {0x94, 0x03}, {0x94, 0x04}, {0x94, 0x05}, {0x94, 0x06}, /* 0x74-0x77 */ + {0x94, 0x07}, {0x94, 0x08}, {0x94, 0x09}, {0x94, 0x0A}, /* 0x78-0x7B */ + {0x94, 0x0B}, {0x94, 0x0C}, {0x94, 0x0D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x94, 0x0E}, {0x94, 0x0F}, {0x94, 0x10}, {0x94, 0x11}, /* 0x80-0x83 */ + {0x94, 0x12}, {0x94, 0x13}, {0x94, 0x14}, {0x94, 0x15}, /* 0x84-0x87 */ + {0x94, 0x16}, {0x94, 0x17}, {0x94, 0x18}, {0x94, 0x19}, /* 0x88-0x8B */ + {0x94, 0x1A}, {0x94, 0x1B}, {0x94, 0x1C}, {0x94, 0x1D}, /* 0x8C-0x8F */ + {0x94, 0x1E}, {0x94, 0x1F}, {0x94, 0x20}, {0x94, 0x21}, /* 0x90-0x93 */ + {0x94, 0x22}, {0x94, 0x23}, {0x94, 0x24}, {0x94, 0x25}, /* 0x94-0x97 */ + {0x94, 0x26}, {0x94, 0x27}, {0x94, 0x28}, {0x94, 0x29}, /* 0x98-0x9B */ + {0x94, 0x2A}, {0x94, 0x2B}, {0x94, 0x2C}, {0x94, 0x2D}, /* 0x9C-0x9F */ + {0x94, 0x2E}, {0x7E, 0xAD}, {0x7E, 0xB0}, {0x7E, 0xBE}, /* 0xA0-0xA3 */ + {0x7E, 0xC0}, {0x7E, 0xC1}, {0x7E, 0xC2}, {0x7E, 0xC9}, /* 0xA4-0xA7 */ + {0x7E, 0xCB}, {0x7E, 0xCC}, {0x7E, 0xD0}, {0x7E, 0xD4}, /* 0xA8-0xAB */ + {0x7E, 0xD7}, {0x7E, 0xDB}, {0x7E, 0xE0}, {0x7E, 0xE1}, /* 0xAC-0xAF */ + {0x7E, 0xE8}, {0x7E, 0xEB}, {0x7E, 0xEE}, {0x7E, 0xEF}, /* 0xB0-0xB3 */ + {0x7E, 0xF1}, {0x7E, 0xF2}, {0x7F, 0x0D}, {0x7E, 0xF6}, /* 0xB4-0xB7 */ + {0x7E, 0xFA}, {0x7E, 0xFB}, {0x7E, 0xFE}, {0x7F, 0x01}, /* 0xB8-0xBB */ + {0x7F, 0x02}, {0x7F, 0x03}, {0x7F, 0x07}, {0x7F, 0x08}, /* 0xBC-0xBF */ + {0x7F, 0x0B}, {0x7F, 0x0C}, {0x7F, 0x0F}, {0x7F, 0x11}, /* 0xC0-0xC3 */ + {0x7F, 0x12}, {0x7F, 0x17}, {0x7F, 0x19}, {0x7F, 0x1C}, /* 0xC4-0xC7 */ + {0x7F, 0x1B}, {0x7F, 0x1F}, {0x7F, 0x21}, {0x7F, 0x22}, /* 0xC8-0xCB */ + {0x7F, 0x23}, {0x7F, 0x24}, {0x7F, 0x25}, {0x7F, 0x26}, /* 0xCC-0xCF */ + {0x7F, 0x27}, {0x7F, 0x2A}, {0x7F, 0x2B}, {0x7F, 0x2C}, /* 0xD0-0xD3 */ + {0x7F, 0x2D}, {0x7F, 0x2F}, {0x7F, 0x30}, {0x7F, 0x31}, /* 0xD4-0xD7 */ + {0x7F, 0x32}, {0x7F, 0x33}, {0x7F, 0x35}, {0x5E, 0x7A}, /* 0xD8-0xDB */ + {0x75, 0x7F}, {0x5D, 0xDB}, {0x75, 0x3E}, {0x90, 0x95}, /* 0xDC-0xDF */ + {0x73, 0x8E}, {0x73, 0x91}, {0x73, 0xAE}, {0x73, 0xA2}, /* 0xE0-0xE3 */ + {0x73, 0x9F}, {0x73, 0xCF}, {0x73, 0xC2}, {0x73, 0xD1}, /* 0xE4-0xE7 */ + {0x73, 0xB7}, {0x73, 0xB3}, {0x73, 0xC0}, {0x73, 0xC9}, /* 0xE8-0xEB */ + {0x73, 0xC8}, {0x73, 0xE5}, {0x73, 0xD9}, {0x98, 0x7C}, /* 0xEC-0xEF */ + {0x74, 0x0A}, {0x73, 0xE9}, {0x73, 0xE7}, {0x73, 0xDE}, /* 0xF0-0xF3 */ + {0x73, 0xBA}, {0x73, 0xF2}, {0x74, 0x0F}, {0x74, 0x2A}, /* 0xF4-0xF7 */ + {0x74, 0x5B}, {0x74, 0x26}, {0x74, 0x25}, {0x74, 0x28}, /* 0xF8-0xFB */ + {0x74, 0x30}, {0x74, 0x2E}, {0x74, 0x2C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x94, 0x2F}, {0x94, 0x30}, {0x94, 0x31}, {0x94, 0x32}, /* 0x40-0x43 */ + {0x94, 0x33}, {0x94, 0x34}, {0x94, 0x35}, {0x94, 0x36}, /* 0x44-0x47 */ + {0x94, 0x37}, {0x94, 0x38}, {0x94, 0x39}, {0x94, 0x3A}, /* 0x48-0x4B */ + {0x94, 0x3B}, {0x94, 0x3C}, {0x94, 0x3D}, {0x94, 0x3F}, /* 0x4C-0x4F */ + {0x94, 0x40}, {0x94, 0x41}, {0x94, 0x42}, {0x94, 0x43}, /* 0x50-0x53 */ + {0x94, 0x44}, {0x94, 0x45}, {0x94, 0x46}, {0x94, 0x47}, /* 0x54-0x57 */ + {0x94, 0x48}, {0x94, 0x49}, {0x94, 0x4A}, {0x94, 0x4B}, /* 0x58-0x5B */ + {0x94, 0x4C}, {0x94, 0x4D}, {0x94, 0x4E}, {0x94, 0x4F}, /* 0x5C-0x5F */ + {0x94, 0x50}, {0x94, 0x51}, {0x94, 0x52}, {0x94, 0x53}, /* 0x60-0x63 */ + {0x94, 0x54}, {0x94, 0x55}, {0x94, 0x56}, {0x94, 0x57}, /* 0x64-0x67 */ + {0x94, 0x58}, {0x94, 0x59}, {0x94, 0x5A}, {0x94, 0x5B}, /* 0x68-0x6B */ + {0x94, 0x5C}, {0x94, 0x5D}, {0x94, 0x5E}, {0x94, 0x5F}, /* 0x6C-0x6F */ + {0x94, 0x60}, {0x94, 0x61}, {0x94, 0x62}, {0x94, 0x63}, /* 0x70-0x73 */ + {0x94, 0x64}, {0x94, 0x65}, {0x94, 0x66}, {0x94, 0x67}, /* 0x74-0x77 */ + {0x94, 0x68}, {0x94, 0x69}, {0x94, 0x6A}, {0x94, 0x6C}, /* 0x78-0x7B */ + {0x94, 0x6D}, {0x94, 0x6E}, {0x94, 0x6F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x94, 0x70}, {0x94, 0x71}, {0x94, 0x72}, {0x94, 0x73}, /* 0x80-0x83 */ + {0x94, 0x74}, {0x94, 0x75}, {0x94, 0x76}, {0x94, 0x77}, /* 0x84-0x87 */ + {0x94, 0x78}, {0x94, 0x79}, {0x94, 0x7A}, {0x94, 0x7B}, /* 0x88-0x8B */ + {0x94, 0x7C}, {0x94, 0x7D}, {0x94, 0x7E}, {0x94, 0x7F}, /* 0x8C-0x8F */ + {0x94, 0x80}, {0x94, 0x81}, {0x94, 0x82}, {0x94, 0x83}, /* 0x90-0x93 */ + {0x94, 0x84}, {0x94, 0x91}, {0x94, 0x96}, {0x94, 0x98}, /* 0x94-0x97 */ + {0x94, 0xC7}, {0x94, 0xCF}, {0x94, 0xD3}, {0x94, 0xD4}, /* 0x98-0x9B */ + {0x94, 0xDA}, {0x94, 0xE6}, {0x94, 0xFB}, {0x95, 0x1C}, /* 0x9C-0x9F */ + {0x95, 0x20}, {0x74, 0x1B}, {0x74, 0x1A}, {0x74, 0x41}, /* 0xA0-0xA3 */ + {0x74, 0x5C}, {0x74, 0x57}, {0x74, 0x55}, {0x74, 0x59}, /* 0xA4-0xA7 */ + {0x74, 0x77}, {0x74, 0x6D}, {0x74, 0x7E}, {0x74, 0x9C}, /* 0xA8-0xAB */ + {0x74, 0x8E}, {0x74, 0x80}, {0x74, 0x81}, {0x74, 0x87}, /* 0xAC-0xAF */ + {0x74, 0x8B}, {0x74, 0x9E}, {0x74, 0xA8}, {0x74, 0xA9}, /* 0xB0-0xB3 */ + {0x74, 0x90}, {0x74, 0xA7}, {0x74, 0xD2}, {0x74, 0xBA}, /* 0xB4-0xB7 */ + {0x97, 0xEA}, {0x97, 0xEB}, {0x97, 0xEC}, {0x67, 0x4C}, /* 0xB8-0xBB */ + {0x67, 0x53}, {0x67, 0x5E}, {0x67, 0x48}, {0x67, 0x69}, /* 0xBC-0xBF */ + {0x67, 0xA5}, {0x67, 0x87}, {0x67, 0x6A}, {0x67, 0x73}, /* 0xC0-0xC3 */ + {0x67, 0x98}, {0x67, 0xA7}, {0x67, 0x75}, {0x67, 0xA8}, /* 0xC4-0xC7 */ + {0x67, 0x9E}, {0x67, 0xAD}, {0x67, 0x8B}, {0x67, 0x77}, /* 0xC8-0xCB */ + {0x67, 0x7C}, {0x67, 0xF0}, {0x68, 0x09}, {0x67, 0xD8}, /* 0xCC-0xCF */ + {0x68, 0x0A}, {0x67, 0xE9}, {0x67, 0xB0}, {0x68, 0x0C}, /* 0xD0-0xD3 */ + {0x67, 0xD9}, {0x67, 0xB5}, {0x67, 0xDA}, {0x67, 0xB3}, /* 0xD4-0xD7 */ + {0x67, 0xDD}, {0x68, 0x00}, {0x67, 0xC3}, {0x67, 0xB8}, /* 0xD8-0xDB */ + {0x67, 0xE2}, {0x68, 0x0E}, {0x67, 0xC1}, {0x67, 0xFD}, /* 0xDC-0xDF */ + {0x68, 0x32}, {0x68, 0x33}, {0x68, 0x60}, {0x68, 0x61}, /* 0xE0-0xE3 */ + {0x68, 0x4E}, {0x68, 0x62}, {0x68, 0x44}, {0x68, 0x64}, /* 0xE4-0xE7 */ + {0x68, 0x83}, {0x68, 0x1D}, {0x68, 0x55}, {0x68, 0x66}, /* 0xE8-0xEB */ + {0x68, 0x41}, {0x68, 0x67}, {0x68, 0x40}, {0x68, 0x3E}, /* 0xEC-0xEF */ + {0x68, 0x4A}, {0x68, 0x49}, {0x68, 0x29}, {0x68, 0xB5}, /* 0xF0-0xF3 */ + {0x68, 0x8F}, {0x68, 0x74}, {0x68, 0x77}, {0x68, 0x93}, /* 0xF4-0xF7 */ + {0x68, 0x6B}, {0x68, 0xC2}, {0x69, 0x6E}, {0x68, 0xFC}, /* 0xF8-0xFB */ + {0x69, 0x1F}, {0x69, 0x20}, {0x68, 0xF9}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x95, 0x27}, {0x95, 0x33}, {0x95, 0x3D}, {0x95, 0x43}, /* 0x40-0x43 */ + {0x95, 0x48}, {0x95, 0x4B}, {0x95, 0x55}, {0x95, 0x5A}, /* 0x44-0x47 */ + {0x95, 0x60}, {0x95, 0x6E}, {0x95, 0x74}, {0x95, 0x75}, /* 0x48-0x4B */ + {0x95, 0x77}, {0x95, 0x78}, {0x95, 0x79}, {0x95, 0x7A}, /* 0x4C-0x4F */ + {0x95, 0x7B}, {0x95, 0x7C}, {0x95, 0x7D}, {0x95, 0x7E}, /* 0x50-0x53 */ + {0x95, 0x80}, {0x95, 0x81}, {0x95, 0x82}, {0x95, 0x83}, /* 0x54-0x57 */ + {0x95, 0x84}, {0x95, 0x85}, {0x95, 0x86}, {0x95, 0x87}, /* 0x58-0x5B */ + {0x95, 0x88}, {0x95, 0x89}, {0x95, 0x8A}, {0x95, 0x8B}, /* 0x5C-0x5F */ + {0x95, 0x8C}, {0x95, 0x8D}, {0x95, 0x8E}, {0x95, 0x8F}, /* 0x60-0x63 */ + {0x95, 0x90}, {0x95, 0x91}, {0x95, 0x92}, {0x95, 0x93}, /* 0x64-0x67 */ + {0x95, 0x94}, {0x95, 0x95}, {0x95, 0x96}, {0x95, 0x97}, /* 0x68-0x6B */ + {0x95, 0x98}, {0x95, 0x99}, {0x95, 0x9A}, {0x95, 0x9B}, /* 0x6C-0x6F */ + {0x95, 0x9C}, {0x95, 0x9D}, {0x95, 0x9E}, {0x95, 0x9F}, /* 0x70-0x73 */ + {0x95, 0xA0}, {0x95, 0xA1}, {0x95, 0xA2}, {0x95, 0xA3}, /* 0x74-0x77 */ + {0x95, 0xA4}, {0x95, 0xA5}, {0x95, 0xA6}, {0x95, 0xA7}, /* 0x78-0x7B */ + {0x95, 0xA8}, {0x95, 0xA9}, {0x95, 0xAA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x95, 0xAB}, {0x95, 0xAC}, {0x95, 0xAD}, {0x95, 0xAE}, /* 0x80-0x83 */ + {0x95, 0xAF}, {0x95, 0xB0}, {0x95, 0xB1}, {0x95, 0xB2}, /* 0x84-0x87 */ + {0x95, 0xB3}, {0x95, 0xB4}, {0x95, 0xB5}, {0x95, 0xB6}, /* 0x88-0x8B */ + {0x95, 0xB7}, {0x95, 0xB8}, {0x95, 0xB9}, {0x95, 0xBA}, /* 0x8C-0x8F */ + {0x95, 0xBB}, {0x95, 0xBC}, {0x95, 0xBD}, {0x95, 0xBE}, /* 0x90-0x93 */ + {0x95, 0xBF}, {0x95, 0xC0}, {0x95, 0xC1}, {0x95, 0xC2}, /* 0x94-0x97 */ + {0x95, 0xC3}, {0x95, 0xC4}, {0x95, 0xC5}, {0x95, 0xC6}, /* 0x98-0x9B */ + {0x95, 0xC7}, {0x95, 0xC8}, {0x95, 0xC9}, {0x95, 0xCA}, /* 0x9C-0x9F */ + {0x95, 0xCB}, {0x69, 0x24}, {0x68, 0xF0}, {0x69, 0x0B}, /* 0xA0-0xA3 */ + {0x69, 0x01}, {0x69, 0x57}, {0x68, 0xE3}, {0x69, 0x10}, /* 0xA4-0xA7 */ + {0x69, 0x71}, {0x69, 0x39}, {0x69, 0x60}, {0x69, 0x42}, /* 0xA8-0xAB */ + {0x69, 0x5D}, {0x69, 0x84}, {0x69, 0x6B}, {0x69, 0x80}, /* 0xAC-0xAF */ + {0x69, 0x98}, {0x69, 0x78}, {0x69, 0x34}, {0x69, 0xCC}, /* 0xB0-0xB3 */ + {0x69, 0x87}, {0x69, 0x88}, {0x69, 0xCE}, {0x69, 0x89}, /* 0xB4-0xB7 */ + {0x69, 0x66}, {0x69, 0x63}, {0x69, 0x79}, {0x69, 0x9B}, /* 0xB8-0xBB */ + {0x69, 0xA7}, {0x69, 0xBB}, {0x69, 0xAB}, {0x69, 0xAD}, /* 0xBC-0xBF */ + {0x69, 0xD4}, {0x69, 0xB1}, {0x69, 0xC1}, {0x69, 0xCA}, /* 0xC0-0xC3 */ + {0x69, 0xDF}, {0x69, 0x95}, {0x69, 0xE0}, {0x69, 0x8D}, /* 0xC4-0xC7 */ + {0x69, 0xFF}, {0x6A, 0x2F}, {0x69, 0xED}, {0x6A, 0x17}, /* 0xC8-0xCB */ + {0x6A, 0x18}, {0x6A, 0x65}, {0x69, 0xF2}, {0x6A, 0x44}, /* 0xCC-0xCF */ + {0x6A, 0x3E}, {0x6A, 0xA0}, {0x6A, 0x50}, {0x6A, 0x5B}, /* 0xD0-0xD3 */ + {0x6A, 0x35}, {0x6A, 0x8E}, {0x6A, 0x79}, {0x6A, 0x3D}, /* 0xD4-0xD7 */ + {0x6A, 0x28}, {0x6A, 0x58}, {0x6A, 0x7C}, {0x6A, 0x91}, /* 0xD8-0xDB */ + {0x6A, 0x90}, {0x6A, 0xA9}, {0x6A, 0x97}, {0x6A, 0xAB}, /* 0xDC-0xDF */ + {0x73, 0x37}, {0x73, 0x52}, {0x6B, 0x81}, {0x6B, 0x82}, /* 0xE0-0xE3 */ + {0x6B, 0x87}, {0x6B, 0x84}, {0x6B, 0x92}, {0x6B, 0x93}, /* 0xE4-0xE7 */ + {0x6B, 0x8D}, {0x6B, 0x9A}, {0x6B, 0x9B}, {0x6B, 0xA1}, /* 0xE8-0xEB */ + {0x6B, 0xAA}, {0x8F, 0x6B}, {0x8F, 0x6D}, {0x8F, 0x71}, /* 0xEC-0xEF */ + {0x8F, 0x72}, {0x8F, 0x73}, {0x8F, 0x75}, {0x8F, 0x76}, /* 0xF0-0xF3 */ + {0x8F, 0x78}, {0x8F, 0x77}, {0x8F, 0x79}, {0x8F, 0x7A}, /* 0xF4-0xF7 */ + {0x8F, 0x7C}, {0x8F, 0x7E}, {0x8F, 0x81}, {0x8F, 0x82}, /* 0xF8-0xFB */ + {0x8F, 0x84}, {0x8F, 0x87}, {0x8F, 0x8B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x95, 0xCC}, {0x95, 0xCD}, {0x95, 0xCE}, {0x95, 0xCF}, /* 0x40-0x43 */ + {0x95, 0xD0}, {0x95, 0xD1}, {0x95, 0xD2}, {0x95, 0xD3}, /* 0x44-0x47 */ + {0x95, 0xD4}, {0x95, 0xD5}, {0x95, 0xD6}, {0x95, 0xD7}, /* 0x48-0x4B */ + {0x95, 0xD8}, {0x95, 0xD9}, {0x95, 0xDA}, {0x95, 0xDB}, /* 0x4C-0x4F */ + {0x95, 0xDC}, {0x95, 0xDD}, {0x95, 0xDE}, {0x95, 0xDF}, /* 0x50-0x53 */ + {0x95, 0xE0}, {0x95, 0xE1}, {0x95, 0xE2}, {0x95, 0xE3}, /* 0x54-0x57 */ + {0x95, 0xE4}, {0x95, 0xE5}, {0x95, 0xE6}, {0x95, 0xE7}, /* 0x58-0x5B */ + {0x95, 0xEC}, {0x95, 0xFF}, {0x96, 0x07}, {0x96, 0x13}, /* 0x5C-0x5F */ + {0x96, 0x18}, {0x96, 0x1B}, {0x96, 0x1E}, {0x96, 0x20}, /* 0x60-0x63 */ + {0x96, 0x23}, {0x96, 0x24}, {0x96, 0x25}, {0x96, 0x26}, /* 0x64-0x67 */ + {0x96, 0x27}, {0x96, 0x28}, {0x96, 0x29}, {0x96, 0x2B}, /* 0x68-0x6B */ + {0x96, 0x2C}, {0x96, 0x2D}, {0x96, 0x2F}, {0x96, 0x30}, /* 0x6C-0x6F */ + {0x96, 0x37}, {0x96, 0x38}, {0x96, 0x39}, {0x96, 0x3A}, /* 0x70-0x73 */ + {0x96, 0x3E}, {0x96, 0x41}, {0x96, 0x43}, {0x96, 0x4A}, /* 0x74-0x77 */ + {0x96, 0x4E}, {0x96, 0x4F}, {0x96, 0x51}, {0x96, 0x52}, /* 0x78-0x7B */ + {0x96, 0x53}, {0x96, 0x56}, {0x96, 0x57}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x96, 0x58}, {0x96, 0x59}, {0x96, 0x5A}, {0x96, 0x5C}, /* 0x80-0x83 */ + {0x96, 0x5D}, {0x96, 0x5E}, {0x96, 0x60}, {0x96, 0x63}, /* 0x84-0x87 */ + {0x96, 0x65}, {0x96, 0x66}, {0x96, 0x6B}, {0x96, 0x6D}, /* 0x88-0x8B */ + {0x96, 0x6E}, {0x96, 0x6F}, {0x96, 0x70}, {0x96, 0x71}, /* 0x8C-0x8F */ + {0x96, 0x73}, {0x96, 0x78}, {0x96, 0x79}, {0x96, 0x7A}, /* 0x90-0x93 */ + {0x96, 0x7B}, {0x96, 0x7C}, {0x96, 0x7D}, {0x96, 0x7E}, /* 0x94-0x97 */ + {0x96, 0x7F}, {0x96, 0x80}, {0x96, 0x81}, {0x96, 0x82}, /* 0x98-0x9B */ + {0x96, 0x83}, {0x96, 0x84}, {0x96, 0x87}, {0x96, 0x89}, /* 0x9C-0x9F */ + {0x96, 0x8A}, {0x8F, 0x8D}, {0x8F, 0x8E}, {0x8F, 0x8F}, /* 0xA0-0xA3 */ + {0x8F, 0x98}, {0x8F, 0x9A}, {0x8E, 0xCE}, {0x62, 0x0B}, /* 0xA4-0xA7 */ + {0x62, 0x17}, {0x62, 0x1B}, {0x62, 0x1F}, {0x62, 0x22}, /* 0xA8-0xAB */ + {0x62, 0x21}, {0x62, 0x25}, {0x62, 0x24}, {0x62, 0x2C}, /* 0xAC-0xAF */ + {0x81, 0xE7}, {0x74, 0xEF}, {0x74, 0xF4}, {0x74, 0xFF}, /* 0xB0-0xB3 */ + {0x75, 0x0F}, {0x75, 0x11}, {0x75, 0x13}, {0x65, 0x34}, /* 0xB4-0xB7 */ + {0x65, 0xEE}, {0x65, 0xEF}, {0x65, 0xF0}, {0x66, 0x0A}, /* 0xB8-0xBB */ + {0x66, 0x19}, {0x67, 0x72}, {0x66, 0x03}, {0x66, 0x15}, /* 0xBC-0xBF */ + {0x66, 0x00}, {0x70, 0x85}, {0x66, 0xF7}, {0x66, 0x1D}, /* 0xC0-0xC3 */ + {0x66, 0x34}, {0x66, 0x31}, {0x66, 0x36}, {0x66, 0x35}, /* 0xC4-0xC7 */ + {0x80, 0x06}, {0x66, 0x5F}, {0x66, 0x54}, {0x66, 0x41}, /* 0xC8-0xCB */ + {0x66, 0x4F}, {0x66, 0x56}, {0x66, 0x61}, {0x66, 0x57}, /* 0xCC-0xCF */ + {0x66, 0x77}, {0x66, 0x84}, {0x66, 0x8C}, {0x66, 0xA7}, /* 0xD0-0xD3 */ + {0x66, 0x9D}, {0x66, 0xBE}, {0x66, 0xDB}, {0x66, 0xDC}, /* 0xD4-0xD7 */ + {0x66, 0xE6}, {0x66, 0xE9}, {0x8D, 0x32}, {0x8D, 0x33}, /* 0xD8-0xDB */ + {0x8D, 0x36}, {0x8D, 0x3B}, {0x8D, 0x3D}, {0x8D, 0x40}, /* 0xDC-0xDF */ + {0x8D, 0x45}, {0x8D, 0x46}, {0x8D, 0x48}, {0x8D, 0x49}, /* 0xE0-0xE3 */ + {0x8D, 0x47}, {0x8D, 0x4D}, {0x8D, 0x55}, {0x8D, 0x59}, /* 0xE4-0xE7 */ + {0x89, 0xC7}, {0x89, 0xCA}, {0x89, 0xCB}, {0x89, 0xCC}, /* 0xE8-0xEB */ + {0x89, 0xCE}, {0x89, 0xCF}, {0x89, 0xD0}, {0x89, 0xD1}, /* 0xEC-0xEF */ + {0x72, 0x6E}, {0x72, 0x9F}, {0x72, 0x5D}, {0x72, 0x66}, /* 0xF0-0xF3 */ + {0x72, 0x6F}, {0x72, 0x7E}, {0x72, 0x7F}, {0x72, 0x84}, /* 0xF4-0xF7 */ + {0x72, 0x8B}, {0x72, 0x8D}, {0x72, 0x8F}, {0x72, 0x92}, /* 0xF8-0xFB */ + {0x63, 0x08}, {0x63, 0x32}, {0x63, 0xB0}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x96, 0x8C}, {0x96, 0x8E}, {0x96, 0x91}, {0x96, 0x92}, /* 0x40-0x43 */ + {0x96, 0x93}, {0x96, 0x95}, {0x96, 0x96}, {0x96, 0x9A}, /* 0x44-0x47 */ + {0x96, 0x9B}, {0x96, 0x9D}, {0x96, 0x9E}, {0x96, 0x9F}, /* 0x48-0x4B */ + {0x96, 0xA0}, {0x96, 0xA1}, {0x96, 0xA2}, {0x96, 0xA3}, /* 0x4C-0x4F */ + {0x96, 0xA4}, {0x96, 0xA5}, {0x96, 0xA6}, {0x96, 0xA8}, /* 0x50-0x53 */ + {0x96, 0xA9}, {0x96, 0xAA}, {0x96, 0xAB}, {0x96, 0xAC}, /* 0x54-0x57 */ + {0x96, 0xAD}, {0x96, 0xAE}, {0x96, 0xAF}, {0x96, 0xB1}, /* 0x58-0x5B */ + {0x96, 0xB2}, {0x96, 0xB4}, {0x96, 0xB5}, {0x96, 0xB7}, /* 0x5C-0x5F */ + {0x96, 0xB8}, {0x96, 0xBA}, {0x96, 0xBB}, {0x96, 0xBF}, /* 0x60-0x63 */ + {0x96, 0xC2}, {0x96, 0xC3}, {0x96, 0xC8}, {0x96, 0xCA}, /* 0x64-0x67 */ + {0x96, 0xCB}, {0x96, 0xD0}, {0x96, 0xD1}, {0x96, 0xD3}, /* 0x68-0x6B */ + {0x96, 0xD4}, {0x96, 0xD6}, {0x96, 0xD7}, {0x96, 0xD8}, /* 0x6C-0x6F */ + {0x96, 0xD9}, {0x96, 0xDA}, {0x96, 0xDB}, {0x96, 0xDC}, /* 0x70-0x73 */ + {0x96, 0xDD}, {0x96, 0xDE}, {0x96, 0xDF}, {0x96, 0xE1}, /* 0x74-0x77 */ + {0x96, 0xE2}, {0x96, 0xE3}, {0x96, 0xE4}, {0x96, 0xE5}, /* 0x78-0x7B */ + {0x96, 0xE6}, {0x96, 0xE7}, {0x96, 0xEB}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x96, 0xEC}, {0x96, 0xED}, {0x96, 0xEE}, {0x96, 0xF0}, /* 0x80-0x83 */ + {0x96, 0xF1}, {0x96, 0xF2}, {0x96, 0xF4}, {0x96, 0xF5}, /* 0x84-0x87 */ + {0x96, 0xF8}, {0x96, 0xFA}, {0x96, 0xFB}, {0x96, 0xFC}, /* 0x88-0x8B */ + {0x96, 0xFD}, {0x96, 0xFF}, {0x97, 0x02}, {0x97, 0x03}, /* 0x8C-0x8F */ + {0x97, 0x05}, {0x97, 0x0A}, {0x97, 0x0B}, {0x97, 0x0C}, /* 0x90-0x93 */ + {0x97, 0x10}, {0x97, 0x11}, {0x97, 0x12}, {0x97, 0x14}, /* 0x94-0x97 */ + {0x97, 0x15}, {0x97, 0x17}, {0x97, 0x18}, {0x97, 0x19}, /* 0x98-0x9B */ + {0x97, 0x1A}, {0x97, 0x1B}, {0x97, 0x1D}, {0x97, 0x1F}, /* 0x9C-0x9F */ + {0x97, 0x20}, {0x64, 0x3F}, {0x64, 0xD8}, {0x80, 0x04}, /* 0xA0-0xA3 */ + {0x6B, 0xEA}, {0x6B, 0xF3}, {0x6B, 0xFD}, {0x6B, 0xF5}, /* 0xA4-0xA7 */ + {0x6B, 0xF9}, {0x6C, 0x05}, {0x6C, 0x07}, {0x6C, 0x06}, /* 0xA8-0xAB */ + {0x6C, 0x0D}, {0x6C, 0x15}, {0x6C, 0x18}, {0x6C, 0x19}, /* 0xAC-0xAF */ + {0x6C, 0x1A}, {0x6C, 0x21}, {0x6C, 0x29}, {0x6C, 0x24}, /* 0xB0-0xB3 */ + {0x6C, 0x2A}, {0x6C, 0x32}, {0x65, 0x35}, {0x65, 0x55}, /* 0xB4-0xB7 */ + {0x65, 0x6B}, {0x72, 0x4D}, {0x72, 0x52}, {0x72, 0x56}, /* 0xB8-0xBB */ + {0x72, 0x30}, {0x86, 0x62}, {0x52, 0x16}, {0x80, 0x9F}, /* 0xBC-0xBF */ + {0x80, 0x9C}, {0x80, 0x93}, {0x80, 0xBC}, {0x67, 0x0A}, /* 0xC0-0xC3 */ + {0x80, 0xBD}, {0x80, 0xB1}, {0x80, 0xAB}, {0x80, 0xAD}, /* 0xC4-0xC7 */ + {0x80, 0xB4}, {0x80, 0xB7}, {0x80, 0xE7}, {0x80, 0xE8}, /* 0xC8-0xCB */ + {0x80, 0xE9}, {0x80, 0xEA}, {0x80, 0xDB}, {0x80, 0xC2}, /* 0xCC-0xCF */ + {0x80, 0xC4}, {0x80, 0xD9}, {0x80, 0xCD}, {0x80, 0xD7}, /* 0xD0-0xD3 */ + {0x67, 0x10}, {0x80, 0xDD}, {0x80, 0xEB}, {0x80, 0xF1}, /* 0xD4-0xD7 */ + {0x80, 0xF4}, {0x80, 0xED}, {0x81, 0x0D}, {0x81, 0x0E}, /* 0xD8-0xDB */ + {0x80, 0xF2}, {0x80, 0xFC}, {0x67, 0x15}, {0x81, 0x12}, /* 0xDC-0xDF */ + {0x8C, 0x5A}, {0x81, 0x36}, {0x81, 0x1E}, {0x81, 0x2C}, /* 0xE0-0xE3 */ + {0x81, 0x18}, {0x81, 0x32}, {0x81, 0x48}, {0x81, 0x4C}, /* 0xE4-0xE7 */ + {0x81, 0x53}, {0x81, 0x74}, {0x81, 0x59}, {0x81, 0x5A}, /* 0xE8-0xEB */ + {0x81, 0x71}, {0x81, 0x60}, {0x81, 0x69}, {0x81, 0x7C}, /* 0xEC-0xEF */ + {0x81, 0x7D}, {0x81, 0x6D}, {0x81, 0x67}, {0x58, 0x4D}, /* 0xF0-0xF3 */ + {0x5A, 0xB5}, {0x81, 0x88}, {0x81, 0x82}, {0x81, 0x91}, /* 0xF4-0xF7 */ + {0x6E, 0xD5}, {0x81, 0xA3}, {0x81, 0xAA}, {0x81, 0xCC}, /* 0xF8-0xFB */ + {0x67, 0x26}, {0x81, 0xCA}, {0x81, 0xBB}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x97, 0x21}, {0x97, 0x22}, {0x97, 0x23}, {0x97, 0x24}, /* 0x40-0x43 */ + {0x97, 0x25}, {0x97, 0x26}, {0x97, 0x27}, {0x97, 0x28}, /* 0x44-0x47 */ + {0x97, 0x29}, {0x97, 0x2B}, {0x97, 0x2C}, {0x97, 0x2E}, /* 0x48-0x4B */ + {0x97, 0x2F}, {0x97, 0x31}, {0x97, 0x33}, {0x97, 0x34}, /* 0x4C-0x4F */ + {0x97, 0x35}, {0x97, 0x36}, {0x97, 0x37}, {0x97, 0x3A}, /* 0x50-0x53 */ + {0x97, 0x3B}, {0x97, 0x3C}, {0x97, 0x3D}, {0x97, 0x3F}, /* 0x54-0x57 */ + {0x97, 0x40}, {0x97, 0x41}, {0x97, 0x42}, {0x97, 0x43}, /* 0x58-0x5B */ + {0x97, 0x44}, {0x97, 0x45}, {0x97, 0x46}, {0x97, 0x47}, /* 0x5C-0x5F */ + {0x97, 0x48}, {0x97, 0x49}, {0x97, 0x4A}, {0x97, 0x4B}, /* 0x60-0x63 */ + {0x97, 0x4C}, {0x97, 0x4D}, {0x97, 0x4E}, {0x97, 0x4F}, /* 0x64-0x67 */ + {0x97, 0x50}, {0x97, 0x51}, {0x97, 0x54}, {0x97, 0x55}, /* 0x68-0x6B */ + {0x97, 0x57}, {0x97, 0x58}, {0x97, 0x5A}, {0x97, 0x5C}, /* 0x6C-0x6F */ + {0x97, 0x5D}, {0x97, 0x5F}, {0x97, 0x63}, {0x97, 0x64}, /* 0x70-0x73 */ + {0x97, 0x66}, {0x97, 0x67}, {0x97, 0x68}, {0x97, 0x6A}, /* 0x74-0x77 */ + {0x97, 0x6B}, {0x97, 0x6C}, {0x97, 0x6D}, {0x97, 0x6E}, /* 0x78-0x7B */ + {0x97, 0x6F}, {0x97, 0x70}, {0x97, 0x71}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x97, 0x72}, {0x97, 0x75}, {0x97, 0x77}, {0x97, 0x78}, /* 0x80-0x83 */ + {0x97, 0x79}, {0x97, 0x7A}, {0x97, 0x7B}, {0x97, 0x7D}, /* 0x84-0x87 */ + {0x97, 0x7E}, {0x97, 0x7F}, {0x97, 0x80}, {0x97, 0x81}, /* 0x88-0x8B */ + {0x97, 0x82}, {0x97, 0x83}, {0x97, 0x84}, {0x97, 0x86}, /* 0x8C-0x8F */ + {0x97, 0x87}, {0x97, 0x88}, {0x97, 0x89}, {0x97, 0x8A}, /* 0x90-0x93 */ + {0x97, 0x8C}, {0x97, 0x8E}, {0x97, 0x8F}, {0x97, 0x90}, /* 0x94-0x97 */ + {0x97, 0x93}, {0x97, 0x95}, {0x97, 0x96}, {0x97, 0x97}, /* 0x98-0x9B */ + {0x97, 0x99}, {0x97, 0x9A}, {0x97, 0x9B}, {0x97, 0x9C}, /* 0x9C-0x9F */ + {0x97, 0x9D}, {0x81, 0xC1}, {0x81, 0xA6}, {0x6B, 0x24}, /* 0xA0-0xA3 */ + {0x6B, 0x37}, {0x6B, 0x39}, {0x6B, 0x43}, {0x6B, 0x46}, /* 0xA4-0xA7 */ + {0x6B, 0x59}, {0x98, 0xD1}, {0x98, 0xD2}, {0x98, 0xD3}, /* 0xA8-0xAB */ + {0x98, 0xD5}, {0x98, 0xD9}, {0x98, 0xDA}, {0x6B, 0xB3}, /* 0xAC-0xAF */ + {0x5F, 0x40}, {0x6B, 0xC2}, {0x89, 0xF3}, {0x65, 0x90}, /* 0xB0-0xB3 */ + {0x9F, 0x51}, {0x65, 0x93}, {0x65, 0xBC}, {0x65, 0xC6}, /* 0xB4-0xB7 */ + {0x65, 0xC4}, {0x65, 0xC3}, {0x65, 0xCC}, {0x65, 0xCE}, /* 0xB8-0xBB */ + {0x65, 0xD2}, {0x65, 0xD6}, {0x70, 0x80}, {0x70, 0x9C}, /* 0xBC-0xBF */ + {0x70, 0x96}, {0x70, 0x9D}, {0x70, 0xBB}, {0x70, 0xC0}, /* 0xC0-0xC3 */ + {0x70, 0xB7}, {0x70, 0xAB}, {0x70, 0xB1}, {0x70, 0xE8}, /* 0xC4-0xC7 */ + {0x70, 0xCA}, {0x71, 0x10}, {0x71, 0x13}, {0x71, 0x16}, /* 0xC8-0xCB */ + {0x71, 0x2F}, {0x71, 0x31}, {0x71, 0x73}, {0x71, 0x5C}, /* 0xCC-0xCF */ + {0x71, 0x68}, {0x71, 0x45}, {0x71, 0x72}, {0x71, 0x4A}, /* 0xD0-0xD3 */ + {0x71, 0x78}, {0x71, 0x7A}, {0x71, 0x98}, {0x71, 0xB3}, /* 0xD4-0xD7 */ + {0x71, 0xB5}, {0x71, 0xA8}, {0x71, 0xA0}, {0x71, 0xE0}, /* 0xD8-0xDB */ + {0x71, 0xD4}, {0x71, 0xE7}, {0x71, 0xF9}, {0x72, 0x1D}, /* 0xDC-0xDF */ + {0x72, 0x28}, {0x70, 0x6C}, {0x71, 0x18}, {0x71, 0x66}, /* 0xE0-0xE3 */ + {0x71, 0xB9}, {0x62, 0x3E}, {0x62, 0x3D}, {0x62, 0x43}, /* 0xE4-0xE7 */ + {0x62, 0x48}, {0x62, 0x49}, {0x79, 0x3B}, {0x79, 0x40}, /* 0xE8-0xEB */ + {0x79, 0x46}, {0x79, 0x49}, {0x79, 0x5B}, {0x79, 0x5C}, /* 0xEC-0xEF */ + {0x79, 0x53}, {0x79, 0x5A}, {0x79, 0x62}, {0x79, 0x57}, /* 0xF0-0xF3 */ + {0x79, 0x60}, {0x79, 0x6F}, {0x79, 0x67}, {0x79, 0x7A}, /* 0xF4-0xF7 */ + {0x79, 0x85}, {0x79, 0x8A}, {0x79, 0x9A}, {0x79, 0xA7}, /* 0xF8-0xFB */ + {0x79, 0xB3}, {0x5F, 0xD1}, {0x5F, 0xD0}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_ED[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x97, 0x9E}, {0x97, 0x9F}, {0x97, 0xA1}, {0x97, 0xA2}, /* 0x40-0x43 */ + {0x97, 0xA4}, {0x97, 0xA5}, {0x97, 0xA6}, {0x97, 0xA7}, /* 0x44-0x47 */ + {0x97, 0xA8}, {0x97, 0xA9}, {0x97, 0xAA}, {0x97, 0xAC}, /* 0x48-0x4B */ + {0x97, 0xAE}, {0x97, 0xB0}, {0x97, 0xB1}, {0x97, 0xB3}, /* 0x4C-0x4F */ + {0x97, 0xB5}, {0x97, 0xB6}, {0x97, 0xB7}, {0x97, 0xB8}, /* 0x50-0x53 */ + {0x97, 0xB9}, {0x97, 0xBA}, {0x97, 0xBB}, {0x97, 0xBC}, /* 0x54-0x57 */ + {0x97, 0xBD}, {0x97, 0xBE}, {0x97, 0xBF}, {0x97, 0xC0}, /* 0x58-0x5B */ + {0x97, 0xC1}, {0x97, 0xC2}, {0x97, 0xC3}, {0x97, 0xC4}, /* 0x5C-0x5F */ + {0x97, 0xC5}, {0x97, 0xC6}, {0x97, 0xC7}, {0x97, 0xC8}, /* 0x60-0x63 */ + {0x97, 0xC9}, {0x97, 0xCA}, {0x97, 0xCB}, {0x97, 0xCC}, /* 0x64-0x67 */ + {0x97, 0xCD}, {0x97, 0xCE}, {0x97, 0xCF}, {0x97, 0xD0}, /* 0x68-0x6B */ + {0x97, 0xD1}, {0x97, 0xD2}, {0x97, 0xD3}, {0x97, 0xD4}, /* 0x6C-0x6F */ + {0x97, 0xD5}, {0x97, 0xD6}, {0x97, 0xD7}, {0x97, 0xD8}, /* 0x70-0x73 */ + {0x97, 0xD9}, {0x97, 0xDA}, {0x97, 0xDB}, {0x97, 0xDC}, /* 0x74-0x77 */ + {0x97, 0xDD}, {0x97, 0xDE}, {0x97, 0xDF}, {0x97, 0xE0}, /* 0x78-0x7B */ + {0x97, 0xE1}, {0x97, 0xE2}, {0x97, 0xE3}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x97, 0xE4}, {0x97, 0xE5}, {0x97, 0xE8}, {0x97, 0xEE}, /* 0x80-0x83 */ + {0x97, 0xEF}, {0x97, 0xF0}, {0x97, 0xF1}, {0x97, 0xF2}, /* 0x84-0x87 */ + {0x97, 0xF4}, {0x97, 0xF7}, {0x97, 0xF8}, {0x97, 0xF9}, /* 0x88-0x8B */ + {0x97, 0xFA}, {0x97, 0xFB}, {0x97, 0xFC}, {0x97, 0xFD}, /* 0x8C-0x8F */ + {0x97, 0xFE}, {0x97, 0xFF}, {0x98, 0x00}, {0x98, 0x01}, /* 0x90-0x93 */ + {0x98, 0x02}, {0x98, 0x03}, {0x98, 0x04}, {0x98, 0x05}, /* 0x94-0x97 */ + {0x98, 0x06}, {0x98, 0x07}, {0x98, 0x08}, {0x98, 0x09}, /* 0x98-0x9B */ + {0x98, 0x0A}, {0x98, 0x0B}, {0x98, 0x0C}, {0x98, 0x0D}, /* 0x9C-0x9F */ + {0x98, 0x0E}, {0x60, 0x3C}, {0x60, 0x5D}, {0x60, 0x5A}, /* 0xA0-0xA3 */ + {0x60, 0x67}, {0x60, 0x41}, {0x60, 0x59}, {0x60, 0x63}, /* 0xA4-0xA7 */ + {0x60, 0xAB}, {0x61, 0x06}, {0x61, 0x0D}, {0x61, 0x5D}, /* 0xA8-0xAB */ + {0x61, 0xA9}, {0x61, 0x9D}, {0x61, 0xCB}, {0x61, 0xD1}, /* 0xAC-0xAF */ + {0x62, 0x06}, {0x80, 0x80}, {0x80, 0x7F}, {0x6C, 0x93}, /* 0xB0-0xB3 */ + {0x6C, 0xF6}, {0x6D, 0xFC}, {0x77, 0xF6}, {0x77, 0xF8}, /* 0xB4-0xB7 */ + {0x78, 0x00}, {0x78, 0x09}, {0x78, 0x17}, {0x78, 0x18}, /* 0xB8-0xBB */ + {0x78, 0x11}, {0x65, 0xAB}, {0x78, 0x2D}, {0x78, 0x1C}, /* 0xBC-0xBF */ + {0x78, 0x1D}, {0x78, 0x39}, {0x78, 0x3A}, {0x78, 0x3B}, /* 0xC0-0xC3 */ + {0x78, 0x1F}, {0x78, 0x3C}, {0x78, 0x25}, {0x78, 0x2C}, /* 0xC4-0xC7 */ + {0x78, 0x23}, {0x78, 0x29}, {0x78, 0x4E}, {0x78, 0x6D}, /* 0xC8-0xCB */ + {0x78, 0x56}, {0x78, 0x57}, {0x78, 0x26}, {0x78, 0x50}, /* 0xCC-0xCF */ + {0x78, 0x47}, {0x78, 0x4C}, {0x78, 0x6A}, {0x78, 0x9B}, /* 0xD0-0xD3 */ + {0x78, 0x93}, {0x78, 0x9A}, {0x78, 0x87}, {0x78, 0x9C}, /* 0xD4-0xD7 */ + {0x78, 0xA1}, {0x78, 0xA3}, {0x78, 0xB2}, {0x78, 0xB9}, /* 0xD8-0xDB */ + {0x78, 0xA5}, {0x78, 0xD4}, {0x78, 0xD9}, {0x78, 0xC9}, /* 0xDC-0xDF */ + {0x78, 0xEC}, {0x78, 0xF2}, {0x79, 0x05}, {0x78, 0xF4}, /* 0xE0-0xE3 */ + {0x79, 0x13}, {0x79, 0x24}, {0x79, 0x1E}, {0x79, 0x34}, /* 0xE4-0xE7 */ + {0x9F, 0x9B}, {0x9E, 0xF9}, {0x9E, 0xFB}, {0x9E, 0xFC}, /* 0xE8-0xEB */ + {0x76, 0xF1}, {0x77, 0x04}, {0x77, 0x0D}, {0x76, 0xF9}, /* 0xEC-0xEF */ + {0x77, 0x07}, {0x77, 0x08}, {0x77, 0x1A}, {0x77, 0x22}, /* 0xF0-0xF3 */ + {0x77, 0x19}, {0x77, 0x2D}, {0x77, 0x26}, {0x77, 0x35}, /* 0xF4-0xF7 */ + {0x77, 0x38}, {0x77, 0x50}, {0x77, 0x51}, {0x77, 0x47}, /* 0xF8-0xFB */ + {0x77, 0x43}, {0x77, 0x5A}, {0x77, 0x68}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x98, 0x0F}, {0x98, 0x10}, {0x98, 0x11}, {0x98, 0x12}, /* 0x40-0x43 */ + {0x98, 0x13}, {0x98, 0x14}, {0x98, 0x15}, {0x98, 0x16}, /* 0x44-0x47 */ + {0x98, 0x17}, {0x98, 0x18}, {0x98, 0x19}, {0x98, 0x1A}, /* 0x48-0x4B */ + {0x98, 0x1B}, {0x98, 0x1C}, {0x98, 0x1D}, {0x98, 0x1E}, /* 0x4C-0x4F */ + {0x98, 0x1F}, {0x98, 0x20}, {0x98, 0x21}, {0x98, 0x22}, /* 0x50-0x53 */ + {0x98, 0x23}, {0x98, 0x24}, {0x98, 0x25}, {0x98, 0x26}, /* 0x54-0x57 */ + {0x98, 0x27}, {0x98, 0x28}, {0x98, 0x29}, {0x98, 0x2A}, /* 0x58-0x5B */ + {0x98, 0x2B}, {0x98, 0x2C}, {0x98, 0x2D}, {0x98, 0x2E}, /* 0x5C-0x5F */ + {0x98, 0x2F}, {0x98, 0x30}, {0x98, 0x31}, {0x98, 0x32}, /* 0x60-0x63 */ + {0x98, 0x33}, {0x98, 0x34}, {0x98, 0x35}, {0x98, 0x36}, /* 0x64-0x67 */ + {0x98, 0x37}, {0x98, 0x38}, {0x98, 0x39}, {0x98, 0x3A}, /* 0x68-0x6B */ + {0x98, 0x3B}, {0x98, 0x3C}, {0x98, 0x3D}, {0x98, 0x3E}, /* 0x6C-0x6F */ + {0x98, 0x3F}, {0x98, 0x40}, {0x98, 0x41}, {0x98, 0x42}, /* 0x70-0x73 */ + {0x98, 0x43}, {0x98, 0x44}, {0x98, 0x45}, {0x98, 0x46}, /* 0x74-0x77 */ + {0x98, 0x47}, {0x98, 0x48}, {0x98, 0x49}, {0x98, 0x4A}, /* 0x78-0x7B */ + {0x98, 0x4B}, {0x98, 0x4C}, {0x98, 0x4D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x98, 0x4E}, {0x98, 0x4F}, {0x98, 0x50}, {0x98, 0x51}, /* 0x80-0x83 */ + {0x98, 0x52}, {0x98, 0x53}, {0x98, 0x54}, {0x98, 0x55}, /* 0x84-0x87 */ + {0x98, 0x56}, {0x98, 0x57}, {0x98, 0x58}, {0x98, 0x59}, /* 0x88-0x8B */ + {0x98, 0x5A}, {0x98, 0x5B}, {0x98, 0x5C}, {0x98, 0x5D}, /* 0x8C-0x8F */ + {0x98, 0x5E}, {0x98, 0x5F}, {0x98, 0x60}, {0x98, 0x61}, /* 0x90-0x93 */ + {0x98, 0x62}, {0x98, 0x63}, {0x98, 0x64}, {0x98, 0x65}, /* 0x94-0x97 */ + {0x98, 0x66}, {0x98, 0x67}, {0x98, 0x68}, {0x98, 0x69}, /* 0x98-0x9B */ + {0x98, 0x6A}, {0x98, 0x6B}, {0x98, 0x6C}, {0x98, 0x6D}, /* 0x9C-0x9F */ + {0x98, 0x6E}, {0x77, 0x62}, {0x77, 0x65}, {0x77, 0x7F}, /* 0xA0-0xA3 */ + {0x77, 0x8D}, {0x77, 0x7D}, {0x77, 0x80}, {0x77, 0x8C}, /* 0xA4-0xA7 */ + {0x77, 0x91}, {0x77, 0x9F}, {0x77, 0xA0}, {0x77, 0xB0}, /* 0xA8-0xAB */ + {0x77, 0xB5}, {0x77, 0xBD}, {0x75, 0x3A}, {0x75, 0x40}, /* 0xAC-0xAF */ + {0x75, 0x4E}, {0x75, 0x4B}, {0x75, 0x48}, {0x75, 0x5B}, /* 0xB0-0xB3 */ + {0x75, 0x72}, {0x75, 0x79}, {0x75, 0x83}, {0x7F, 0x58}, /* 0xB4-0xB7 */ + {0x7F, 0x61}, {0x7F, 0x5F}, {0x8A, 0x48}, {0x7F, 0x68}, /* 0xB8-0xBB */ + {0x7F, 0x74}, {0x7F, 0x71}, {0x7F, 0x79}, {0x7F, 0x81}, /* 0xBC-0xBF */ + {0x7F, 0x7E}, {0x76, 0xCD}, {0x76, 0xE5}, {0x88, 0x32}, /* 0xC0-0xC3 */ + {0x94, 0x85}, {0x94, 0x86}, {0x94, 0x87}, {0x94, 0x8B}, /* 0xC4-0xC7 */ + {0x94, 0x8A}, {0x94, 0x8C}, {0x94, 0x8D}, {0x94, 0x8F}, /* 0xC8-0xCB */ + {0x94, 0x90}, {0x94, 0x94}, {0x94, 0x97}, {0x94, 0x95}, /* 0xCC-0xCF */ + {0x94, 0x9A}, {0x94, 0x9B}, {0x94, 0x9C}, {0x94, 0xA3}, /* 0xD0-0xD3 */ + {0x94, 0xA4}, {0x94, 0xAB}, {0x94, 0xAA}, {0x94, 0xAD}, /* 0xD4-0xD7 */ + {0x94, 0xAC}, {0x94, 0xAF}, {0x94, 0xB0}, {0x94, 0xB2}, /* 0xD8-0xDB */ + {0x94, 0xB4}, {0x94, 0xB6}, {0x94, 0xB7}, {0x94, 0xB8}, /* 0xDC-0xDF */ + {0x94, 0xB9}, {0x94, 0xBA}, {0x94, 0xBC}, {0x94, 0xBD}, /* 0xE0-0xE3 */ + {0x94, 0xBF}, {0x94, 0xC4}, {0x94, 0xC8}, {0x94, 0xC9}, /* 0xE4-0xE7 */ + {0x94, 0xCA}, {0x94, 0xCB}, {0x94, 0xCC}, {0x94, 0xCD}, /* 0xE8-0xEB */ + {0x94, 0xCE}, {0x94, 0xD0}, {0x94, 0xD1}, {0x94, 0xD2}, /* 0xEC-0xEF */ + {0x94, 0xD5}, {0x94, 0xD6}, {0x94, 0xD7}, {0x94, 0xD9}, /* 0xF0-0xF3 */ + {0x94, 0xD8}, {0x94, 0xDB}, {0x94, 0xDE}, {0x94, 0xDF}, /* 0xF4-0xF7 */ + {0x94, 0xE0}, {0x94, 0xE2}, {0x94, 0xE4}, {0x94, 0xE5}, /* 0xF8-0xFB */ + {0x94, 0xE7}, {0x94, 0xE8}, {0x94, 0xEA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x98, 0x6F}, {0x98, 0x70}, {0x98, 0x71}, {0x98, 0x72}, /* 0x40-0x43 */ + {0x98, 0x73}, {0x98, 0x74}, {0x98, 0x8B}, {0x98, 0x8E}, /* 0x44-0x47 */ + {0x98, 0x92}, {0x98, 0x95}, {0x98, 0x99}, {0x98, 0xA3}, /* 0x48-0x4B */ + {0x98, 0xA8}, {0x98, 0xA9}, {0x98, 0xAA}, {0x98, 0xAB}, /* 0x4C-0x4F */ + {0x98, 0xAC}, {0x98, 0xAD}, {0x98, 0xAE}, {0x98, 0xAF}, /* 0x50-0x53 */ + {0x98, 0xB0}, {0x98, 0xB1}, {0x98, 0xB2}, {0x98, 0xB3}, /* 0x54-0x57 */ + {0x98, 0xB4}, {0x98, 0xB5}, {0x98, 0xB6}, {0x98, 0xB7}, /* 0x58-0x5B */ + {0x98, 0xB8}, {0x98, 0xB9}, {0x98, 0xBA}, {0x98, 0xBB}, /* 0x5C-0x5F */ + {0x98, 0xBC}, {0x98, 0xBD}, {0x98, 0xBE}, {0x98, 0xBF}, /* 0x60-0x63 */ + {0x98, 0xC0}, {0x98, 0xC1}, {0x98, 0xC2}, {0x98, 0xC3}, /* 0x64-0x67 */ + {0x98, 0xC4}, {0x98, 0xC5}, {0x98, 0xC6}, {0x98, 0xC7}, /* 0x68-0x6B */ + {0x98, 0xC8}, {0x98, 0xC9}, {0x98, 0xCA}, {0x98, 0xCB}, /* 0x6C-0x6F */ + {0x98, 0xCC}, {0x98, 0xCD}, {0x98, 0xCF}, {0x98, 0xD0}, /* 0x70-0x73 */ + {0x98, 0xD4}, {0x98, 0xD6}, {0x98, 0xD7}, {0x98, 0xDB}, /* 0x74-0x77 */ + {0x98, 0xDC}, {0x98, 0xDD}, {0x98, 0xE0}, {0x98, 0xE1}, /* 0x78-0x7B */ + {0x98, 0xE2}, {0x98, 0xE3}, {0x98, 0xE4}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x98, 0xE5}, {0x98, 0xE6}, {0x98, 0xE9}, {0x98, 0xEA}, /* 0x80-0x83 */ + {0x98, 0xEB}, {0x98, 0xEC}, {0x98, 0xED}, {0x98, 0xEE}, /* 0x84-0x87 */ + {0x98, 0xEF}, {0x98, 0xF0}, {0x98, 0xF1}, {0x98, 0xF2}, /* 0x88-0x8B */ + {0x98, 0xF3}, {0x98, 0xF4}, {0x98, 0xF5}, {0x98, 0xF6}, /* 0x8C-0x8F */ + {0x98, 0xF7}, {0x98, 0xF8}, {0x98, 0xF9}, {0x98, 0xFA}, /* 0x90-0x93 */ + {0x98, 0xFB}, {0x98, 0xFC}, {0x98, 0xFD}, {0x98, 0xFE}, /* 0x94-0x97 */ + {0x98, 0xFF}, {0x99, 0x00}, {0x99, 0x01}, {0x99, 0x02}, /* 0x98-0x9B */ + {0x99, 0x03}, {0x99, 0x04}, {0x99, 0x05}, {0x99, 0x06}, /* 0x9C-0x9F */ + {0x99, 0x07}, {0x94, 0xE9}, {0x94, 0xEB}, {0x94, 0xEE}, /* 0xA0-0xA3 */ + {0x94, 0xEF}, {0x94, 0xF3}, {0x94, 0xF4}, {0x94, 0xF5}, /* 0xA4-0xA7 */ + {0x94, 0xF7}, {0x94, 0xF9}, {0x94, 0xFC}, {0x94, 0xFD}, /* 0xA8-0xAB */ + {0x94, 0xFF}, {0x95, 0x03}, {0x95, 0x02}, {0x95, 0x06}, /* 0xAC-0xAF */ + {0x95, 0x07}, {0x95, 0x09}, {0x95, 0x0A}, {0x95, 0x0D}, /* 0xB0-0xB3 */ + {0x95, 0x0E}, {0x95, 0x0F}, {0x95, 0x12}, {0x95, 0x13}, /* 0xB4-0xB7 */ + {0x95, 0x14}, {0x95, 0x15}, {0x95, 0x16}, {0x95, 0x18}, /* 0xB8-0xBB */ + {0x95, 0x1B}, {0x95, 0x1D}, {0x95, 0x1E}, {0x95, 0x1F}, /* 0xBC-0xBF */ + {0x95, 0x22}, {0x95, 0x2A}, {0x95, 0x2B}, {0x95, 0x29}, /* 0xC0-0xC3 */ + {0x95, 0x2C}, {0x95, 0x31}, {0x95, 0x32}, {0x95, 0x34}, /* 0xC4-0xC7 */ + {0x95, 0x36}, {0x95, 0x37}, {0x95, 0x38}, {0x95, 0x3C}, /* 0xC8-0xCB */ + {0x95, 0x3E}, {0x95, 0x3F}, {0x95, 0x42}, {0x95, 0x35}, /* 0xCC-0xCF */ + {0x95, 0x44}, {0x95, 0x45}, {0x95, 0x46}, {0x95, 0x49}, /* 0xD0-0xD3 */ + {0x95, 0x4C}, {0x95, 0x4E}, {0x95, 0x4F}, {0x95, 0x52}, /* 0xD4-0xD7 */ + {0x95, 0x53}, {0x95, 0x54}, {0x95, 0x56}, {0x95, 0x57}, /* 0xD8-0xDB */ + {0x95, 0x58}, {0x95, 0x59}, {0x95, 0x5B}, {0x95, 0x5E}, /* 0xDC-0xDF */ + {0x95, 0x5F}, {0x95, 0x5D}, {0x95, 0x61}, {0x95, 0x62}, /* 0xE0-0xE3 */ + {0x95, 0x64}, {0x95, 0x65}, {0x95, 0x66}, {0x95, 0x67}, /* 0xE4-0xE7 */ + {0x95, 0x68}, {0x95, 0x69}, {0x95, 0x6A}, {0x95, 0x6B}, /* 0xE8-0xEB */ + {0x95, 0x6C}, {0x95, 0x6F}, {0x95, 0x71}, {0x95, 0x72}, /* 0xEC-0xEF */ + {0x95, 0x73}, {0x95, 0x3A}, {0x77, 0xE7}, {0x77, 0xEC}, /* 0xF0-0xF3 */ + {0x96, 0xC9}, {0x79, 0xD5}, {0x79, 0xED}, {0x79, 0xE3}, /* 0xF4-0xF7 */ + {0x79, 0xEB}, {0x7A, 0x06}, {0x5D, 0x47}, {0x7A, 0x03}, /* 0xF8-0xFB */ + {0x7A, 0x02}, {0x7A, 0x1E}, {0x7A, 0x14}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x99, 0x08}, {0x99, 0x09}, {0x99, 0x0A}, {0x99, 0x0B}, /* 0x40-0x43 */ + {0x99, 0x0C}, {0x99, 0x0E}, {0x99, 0x0F}, {0x99, 0x11}, /* 0x44-0x47 */ + {0x99, 0x12}, {0x99, 0x13}, {0x99, 0x14}, {0x99, 0x15}, /* 0x48-0x4B */ + {0x99, 0x16}, {0x99, 0x17}, {0x99, 0x18}, {0x99, 0x19}, /* 0x4C-0x4F */ + {0x99, 0x1A}, {0x99, 0x1B}, {0x99, 0x1C}, {0x99, 0x1D}, /* 0x50-0x53 */ + {0x99, 0x1E}, {0x99, 0x1F}, {0x99, 0x20}, {0x99, 0x21}, /* 0x54-0x57 */ + {0x99, 0x22}, {0x99, 0x23}, {0x99, 0x24}, {0x99, 0x25}, /* 0x58-0x5B */ + {0x99, 0x26}, {0x99, 0x27}, {0x99, 0x28}, {0x99, 0x29}, /* 0x5C-0x5F */ + {0x99, 0x2A}, {0x99, 0x2B}, {0x99, 0x2C}, {0x99, 0x2D}, /* 0x60-0x63 */ + {0x99, 0x2F}, {0x99, 0x30}, {0x99, 0x31}, {0x99, 0x32}, /* 0x64-0x67 */ + {0x99, 0x33}, {0x99, 0x34}, {0x99, 0x35}, {0x99, 0x36}, /* 0x68-0x6B */ + {0x99, 0x37}, {0x99, 0x38}, {0x99, 0x39}, {0x99, 0x3A}, /* 0x6C-0x6F */ + {0x99, 0x3B}, {0x99, 0x3C}, {0x99, 0x3D}, {0x99, 0x3E}, /* 0x70-0x73 */ + {0x99, 0x3F}, {0x99, 0x40}, {0x99, 0x41}, {0x99, 0x42}, /* 0x74-0x77 */ + {0x99, 0x43}, {0x99, 0x44}, {0x99, 0x45}, {0x99, 0x46}, /* 0x78-0x7B */ + {0x99, 0x47}, {0x99, 0x48}, {0x99, 0x49}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x99, 0x4A}, {0x99, 0x4B}, {0x99, 0x4C}, {0x99, 0x4D}, /* 0x80-0x83 */ + {0x99, 0x4E}, {0x99, 0x4F}, {0x99, 0x50}, {0x99, 0x51}, /* 0x84-0x87 */ + {0x99, 0x52}, {0x99, 0x53}, {0x99, 0x56}, {0x99, 0x57}, /* 0x88-0x8B */ + {0x99, 0x58}, {0x99, 0x59}, {0x99, 0x5A}, {0x99, 0x5B}, /* 0x8C-0x8F */ + {0x99, 0x5C}, {0x99, 0x5D}, {0x99, 0x5E}, {0x99, 0x5F}, /* 0x90-0x93 */ + {0x99, 0x60}, {0x99, 0x61}, {0x99, 0x62}, {0x99, 0x64}, /* 0x94-0x97 */ + {0x99, 0x66}, {0x99, 0x73}, {0x99, 0x78}, {0x99, 0x79}, /* 0x98-0x9B */ + {0x99, 0x7B}, {0x99, 0x7E}, {0x99, 0x82}, {0x99, 0x83}, /* 0x9C-0x9F */ + {0x99, 0x89}, {0x7A, 0x39}, {0x7A, 0x37}, {0x7A, 0x51}, /* 0xA0-0xA3 */ + {0x9E, 0xCF}, {0x99, 0xA5}, {0x7A, 0x70}, {0x76, 0x88}, /* 0xA4-0xA7 */ + {0x76, 0x8E}, {0x76, 0x93}, {0x76, 0x99}, {0x76, 0xA4}, /* 0xA8-0xAB */ + {0x74, 0xDE}, {0x74, 0xE0}, {0x75, 0x2C}, {0x9E, 0x20}, /* 0xAC-0xAF */ + {0x9E, 0x22}, {0x9E, 0x28}, {0x9E, 0x29}, {0x9E, 0x2A}, /* 0xB0-0xB3 */ + {0x9E, 0x2B}, {0x9E, 0x2C}, {0x9E, 0x32}, {0x9E, 0x31}, /* 0xB4-0xB7 */ + {0x9E, 0x36}, {0x9E, 0x38}, {0x9E, 0x37}, {0x9E, 0x39}, /* 0xB8-0xBB */ + {0x9E, 0x3A}, {0x9E, 0x3E}, {0x9E, 0x41}, {0x9E, 0x42}, /* 0xBC-0xBF */ + {0x9E, 0x44}, {0x9E, 0x46}, {0x9E, 0x47}, {0x9E, 0x48}, /* 0xC0-0xC3 */ + {0x9E, 0x49}, {0x9E, 0x4B}, {0x9E, 0x4C}, {0x9E, 0x4E}, /* 0xC4-0xC7 */ + {0x9E, 0x51}, {0x9E, 0x55}, {0x9E, 0x57}, {0x9E, 0x5A}, /* 0xC8-0xCB */ + {0x9E, 0x5B}, {0x9E, 0x5C}, {0x9E, 0x5E}, {0x9E, 0x63}, /* 0xCC-0xCF */ + {0x9E, 0x66}, {0x9E, 0x67}, {0x9E, 0x68}, {0x9E, 0x69}, /* 0xD0-0xD3 */ + {0x9E, 0x6A}, {0x9E, 0x6B}, {0x9E, 0x6C}, {0x9E, 0x71}, /* 0xD4-0xD7 */ + {0x9E, 0x6D}, {0x9E, 0x73}, {0x75, 0x92}, {0x75, 0x94}, /* 0xD8-0xDB */ + {0x75, 0x96}, {0x75, 0xA0}, {0x75, 0x9D}, {0x75, 0xAC}, /* 0xDC-0xDF */ + {0x75, 0xA3}, {0x75, 0xB3}, {0x75, 0xB4}, {0x75, 0xB8}, /* 0xE0-0xE3 */ + {0x75, 0xC4}, {0x75, 0xB1}, {0x75, 0xB0}, {0x75, 0xC3}, /* 0xE4-0xE7 */ + {0x75, 0xC2}, {0x75, 0xD6}, {0x75, 0xCD}, {0x75, 0xE3}, /* 0xE8-0xEB */ + {0x75, 0xE8}, {0x75, 0xE6}, {0x75, 0xE4}, {0x75, 0xEB}, /* 0xEC-0xEF */ + {0x75, 0xE7}, {0x76, 0x03}, {0x75, 0xF1}, {0x75, 0xFC}, /* 0xF0-0xF3 */ + {0x75, 0xFF}, {0x76, 0x10}, {0x76, 0x00}, {0x76, 0x05}, /* 0xF4-0xF7 */ + {0x76, 0x0C}, {0x76, 0x17}, {0x76, 0x0A}, {0x76, 0x25}, /* 0xF8-0xFB */ + {0x76, 0x18}, {0x76, 0x15}, {0x76, 0x19}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x99, 0x8C}, {0x99, 0x8E}, {0x99, 0x9A}, {0x99, 0x9B}, /* 0x40-0x43 */ + {0x99, 0x9C}, {0x99, 0x9D}, {0x99, 0x9E}, {0x99, 0x9F}, /* 0x44-0x47 */ + {0x99, 0xA0}, {0x99, 0xA1}, {0x99, 0xA2}, {0x99, 0xA3}, /* 0x48-0x4B */ + {0x99, 0xA4}, {0x99, 0xA6}, {0x99, 0xA7}, {0x99, 0xA9}, /* 0x4C-0x4F */ + {0x99, 0xAA}, {0x99, 0xAB}, {0x99, 0xAC}, {0x99, 0xAD}, /* 0x50-0x53 */ + {0x99, 0xAE}, {0x99, 0xAF}, {0x99, 0xB0}, {0x99, 0xB1}, /* 0x54-0x57 */ + {0x99, 0xB2}, {0x99, 0xB3}, {0x99, 0xB4}, {0x99, 0xB5}, /* 0x58-0x5B */ + {0x99, 0xB6}, {0x99, 0xB7}, {0x99, 0xB8}, {0x99, 0xB9}, /* 0x5C-0x5F */ + {0x99, 0xBA}, {0x99, 0xBB}, {0x99, 0xBC}, {0x99, 0xBD}, /* 0x60-0x63 */ + {0x99, 0xBE}, {0x99, 0xBF}, {0x99, 0xC0}, {0x99, 0xC1}, /* 0x64-0x67 */ + {0x99, 0xC2}, {0x99, 0xC3}, {0x99, 0xC4}, {0x99, 0xC5}, /* 0x68-0x6B */ + {0x99, 0xC6}, {0x99, 0xC7}, {0x99, 0xC8}, {0x99, 0xC9}, /* 0x6C-0x6F */ + {0x99, 0xCA}, {0x99, 0xCB}, {0x99, 0xCC}, {0x99, 0xCD}, /* 0x70-0x73 */ + {0x99, 0xCE}, {0x99, 0xCF}, {0x99, 0xD0}, {0x99, 0xD1}, /* 0x74-0x77 */ + {0x99, 0xD2}, {0x99, 0xD3}, {0x99, 0xD4}, {0x99, 0xD5}, /* 0x78-0x7B */ + {0x99, 0xD6}, {0x99, 0xD7}, {0x99, 0xD8}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x99, 0xD9}, {0x99, 0xDA}, {0x99, 0xDB}, {0x99, 0xDC}, /* 0x80-0x83 */ + {0x99, 0xDD}, {0x99, 0xDE}, {0x99, 0xDF}, {0x99, 0xE0}, /* 0x84-0x87 */ + {0x99, 0xE1}, {0x99, 0xE2}, {0x99, 0xE3}, {0x99, 0xE4}, /* 0x88-0x8B */ + {0x99, 0xE5}, {0x99, 0xE6}, {0x99, 0xE7}, {0x99, 0xE8}, /* 0x8C-0x8F */ + {0x99, 0xE9}, {0x99, 0xEA}, {0x99, 0xEB}, {0x99, 0xEC}, /* 0x90-0x93 */ + {0x99, 0xED}, {0x99, 0xEE}, {0x99, 0xEF}, {0x99, 0xF0}, /* 0x94-0x97 */ + {0x99, 0xF1}, {0x99, 0xF2}, {0x99, 0xF3}, {0x99, 0xF4}, /* 0x98-0x9B */ + {0x99, 0xF5}, {0x99, 0xF6}, {0x99, 0xF7}, {0x99, 0xF8}, /* 0x9C-0x9F */ + {0x99, 0xF9}, {0x76, 0x1B}, {0x76, 0x3C}, {0x76, 0x22}, /* 0xA0-0xA3 */ + {0x76, 0x20}, {0x76, 0x40}, {0x76, 0x2D}, {0x76, 0x30}, /* 0xA4-0xA7 */ + {0x76, 0x3F}, {0x76, 0x35}, {0x76, 0x43}, {0x76, 0x3E}, /* 0xA8-0xAB */ + {0x76, 0x33}, {0x76, 0x4D}, {0x76, 0x5E}, {0x76, 0x54}, /* 0xAC-0xAF */ + {0x76, 0x5C}, {0x76, 0x56}, {0x76, 0x6B}, {0x76, 0x6F}, /* 0xB0-0xB3 */ + {0x7F, 0xCA}, {0x7A, 0xE6}, {0x7A, 0x78}, {0x7A, 0x79}, /* 0xB4-0xB7 */ + {0x7A, 0x80}, {0x7A, 0x86}, {0x7A, 0x88}, {0x7A, 0x95}, /* 0xB8-0xBB */ + {0x7A, 0xA6}, {0x7A, 0xA0}, {0x7A, 0xAC}, {0x7A, 0xA8}, /* 0xBC-0xBF */ + {0x7A, 0xAD}, {0x7A, 0xB3}, {0x88, 0x64}, {0x88, 0x69}, /* 0xC0-0xC3 */ + {0x88, 0x72}, {0x88, 0x7D}, {0x88, 0x7F}, {0x88, 0x82}, /* 0xC4-0xC7 */ + {0x88, 0xA2}, {0x88, 0xC6}, {0x88, 0xB7}, {0x88, 0xBC}, /* 0xC8-0xCB */ + {0x88, 0xC9}, {0x88, 0xE2}, {0x88, 0xCE}, {0x88, 0xE3}, /* 0xCC-0xCF */ + {0x88, 0xE5}, {0x88, 0xF1}, {0x89, 0x1A}, {0x88, 0xFC}, /* 0xD0-0xD3 */ + {0x88, 0xE8}, {0x88, 0xFE}, {0x88, 0xF0}, {0x89, 0x21}, /* 0xD4-0xD7 */ + {0x89, 0x19}, {0x89, 0x13}, {0x89, 0x1B}, {0x89, 0x0A}, /* 0xD8-0xDB */ + {0x89, 0x34}, {0x89, 0x2B}, {0x89, 0x36}, {0x89, 0x41}, /* 0xDC-0xDF */ + {0x89, 0x66}, {0x89, 0x7B}, {0x75, 0x8B}, {0x80, 0xE5}, /* 0xE0-0xE3 */ + {0x76, 0xB2}, {0x76, 0xB4}, {0x77, 0xDC}, {0x80, 0x12}, /* 0xE4-0xE7 */ + {0x80, 0x14}, {0x80, 0x16}, {0x80, 0x1C}, {0x80, 0x20}, /* 0xE8-0xEB */ + {0x80, 0x22}, {0x80, 0x25}, {0x80, 0x26}, {0x80, 0x27}, /* 0xEC-0xEF */ + {0x80, 0x29}, {0x80, 0x28}, {0x80, 0x31}, {0x80, 0x0B}, /* 0xF0-0xF3 */ + {0x80, 0x35}, {0x80, 0x43}, {0x80, 0x46}, {0x80, 0x4D}, /* 0xF4-0xF7 */ + {0x80, 0x52}, {0x80, 0x69}, {0x80, 0x71}, {0x89, 0x83}, /* 0xF8-0xFB */ + {0x98, 0x78}, {0x98, 0x80}, {0x98, 0x83}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x99, 0xFA}, {0x99, 0xFB}, {0x99, 0xFC}, {0x99, 0xFD}, /* 0x40-0x43 */ + {0x99, 0xFE}, {0x99, 0xFF}, {0x9A, 0x00}, {0x9A, 0x01}, /* 0x44-0x47 */ + {0x9A, 0x02}, {0x9A, 0x03}, {0x9A, 0x04}, {0x9A, 0x05}, /* 0x48-0x4B */ + {0x9A, 0x06}, {0x9A, 0x07}, {0x9A, 0x08}, {0x9A, 0x09}, /* 0x4C-0x4F */ + {0x9A, 0x0A}, {0x9A, 0x0B}, {0x9A, 0x0C}, {0x9A, 0x0D}, /* 0x50-0x53 */ + {0x9A, 0x0E}, {0x9A, 0x0F}, {0x9A, 0x10}, {0x9A, 0x11}, /* 0x54-0x57 */ + {0x9A, 0x12}, {0x9A, 0x13}, {0x9A, 0x14}, {0x9A, 0x15}, /* 0x58-0x5B */ + {0x9A, 0x16}, {0x9A, 0x17}, {0x9A, 0x18}, {0x9A, 0x19}, /* 0x5C-0x5F */ + {0x9A, 0x1A}, {0x9A, 0x1B}, {0x9A, 0x1C}, {0x9A, 0x1D}, /* 0x60-0x63 */ + {0x9A, 0x1E}, {0x9A, 0x1F}, {0x9A, 0x20}, {0x9A, 0x21}, /* 0x64-0x67 */ + {0x9A, 0x22}, {0x9A, 0x23}, {0x9A, 0x24}, {0x9A, 0x25}, /* 0x68-0x6B */ + {0x9A, 0x26}, {0x9A, 0x27}, {0x9A, 0x28}, {0x9A, 0x29}, /* 0x6C-0x6F */ + {0x9A, 0x2A}, {0x9A, 0x2B}, {0x9A, 0x2C}, {0x9A, 0x2D}, /* 0x70-0x73 */ + {0x9A, 0x2E}, {0x9A, 0x2F}, {0x9A, 0x30}, {0x9A, 0x31}, /* 0x74-0x77 */ + {0x9A, 0x32}, {0x9A, 0x33}, {0x9A, 0x34}, {0x9A, 0x35}, /* 0x78-0x7B */ + {0x9A, 0x36}, {0x9A, 0x37}, {0x9A, 0x38}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9A, 0x39}, {0x9A, 0x3A}, {0x9A, 0x3B}, {0x9A, 0x3C}, /* 0x80-0x83 */ + {0x9A, 0x3D}, {0x9A, 0x3E}, {0x9A, 0x3F}, {0x9A, 0x40}, /* 0x84-0x87 */ + {0x9A, 0x41}, {0x9A, 0x42}, {0x9A, 0x43}, {0x9A, 0x44}, /* 0x88-0x8B */ + {0x9A, 0x45}, {0x9A, 0x46}, {0x9A, 0x47}, {0x9A, 0x48}, /* 0x8C-0x8F */ + {0x9A, 0x49}, {0x9A, 0x4A}, {0x9A, 0x4B}, {0x9A, 0x4C}, /* 0x90-0x93 */ + {0x9A, 0x4D}, {0x9A, 0x4E}, {0x9A, 0x4F}, {0x9A, 0x50}, /* 0x94-0x97 */ + {0x9A, 0x51}, {0x9A, 0x52}, {0x9A, 0x53}, {0x9A, 0x54}, /* 0x98-0x9B */ + {0x9A, 0x55}, {0x9A, 0x56}, {0x9A, 0x57}, {0x9A, 0x58}, /* 0x9C-0x9F */ + {0x9A, 0x59}, {0x98, 0x89}, {0x98, 0x8C}, {0x98, 0x8D}, /* 0xA0-0xA3 */ + {0x98, 0x8F}, {0x98, 0x94}, {0x98, 0x9A}, {0x98, 0x9B}, /* 0xA4-0xA7 */ + {0x98, 0x9E}, {0x98, 0x9F}, {0x98, 0xA1}, {0x98, 0xA2}, /* 0xA8-0xAB */ + {0x98, 0xA5}, {0x98, 0xA6}, {0x86, 0x4D}, {0x86, 0x54}, /* 0xAC-0xAF */ + {0x86, 0x6C}, {0x86, 0x6E}, {0x86, 0x7F}, {0x86, 0x7A}, /* 0xB0-0xB3 */ + {0x86, 0x7C}, {0x86, 0x7B}, {0x86, 0xA8}, {0x86, 0x8D}, /* 0xB4-0xB7 */ + {0x86, 0x8B}, {0x86, 0xAC}, {0x86, 0x9D}, {0x86, 0xA7}, /* 0xB8-0xBB */ + {0x86, 0xA3}, {0x86, 0xAA}, {0x86, 0x93}, {0x86, 0xA9}, /* 0xBC-0xBF */ + {0x86, 0xB6}, {0x86, 0xC4}, {0x86, 0xB5}, {0x86, 0xCE}, /* 0xC0-0xC3 */ + {0x86, 0xB0}, {0x86, 0xBA}, {0x86, 0xB1}, {0x86, 0xAF}, /* 0xC4-0xC7 */ + {0x86, 0xC9}, {0x86, 0xCF}, {0x86, 0xB4}, {0x86, 0xE9}, /* 0xC8-0xCB */ + {0x86, 0xF1}, {0x86, 0xF2}, {0x86, 0xED}, {0x86, 0xF3}, /* 0xCC-0xCF */ + {0x86, 0xD0}, {0x87, 0x13}, {0x86, 0xDE}, {0x86, 0xF4}, /* 0xD0-0xD3 */ + {0x86, 0xDF}, {0x86, 0xD8}, {0x86, 0xD1}, {0x87, 0x03}, /* 0xD4-0xD7 */ + {0x87, 0x07}, {0x86, 0xF8}, {0x87, 0x08}, {0x87, 0x0A}, /* 0xD8-0xDB */ + {0x87, 0x0D}, {0x87, 0x09}, {0x87, 0x23}, {0x87, 0x3B}, /* 0xDC-0xDF */ + {0x87, 0x1E}, {0x87, 0x25}, {0x87, 0x2E}, {0x87, 0x1A}, /* 0xE0-0xE3 */ + {0x87, 0x3E}, {0x87, 0x48}, {0x87, 0x34}, {0x87, 0x31}, /* 0xE4-0xE7 */ + {0x87, 0x29}, {0x87, 0x37}, {0x87, 0x3F}, {0x87, 0x82}, /* 0xE8-0xEB */ + {0x87, 0x22}, {0x87, 0x7D}, {0x87, 0x7E}, {0x87, 0x7B}, /* 0xEC-0xEF */ + {0x87, 0x60}, {0x87, 0x70}, {0x87, 0x4C}, {0x87, 0x6E}, /* 0xF0-0xF3 */ + {0x87, 0x8B}, {0x87, 0x53}, {0x87, 0x63}, {0x87, 0x7C}, /* 0xF4-0xF7 */ + {0x87, 0x64}, {0x87, 0x59}, {0x87, 0x65}, {0x87, 0x93}, /* 0xF8-0xFB */ + {0x87, 0xAF}, {0x87, 0xA8}, {0x87, 0xD2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9A, 0x5A}, {0x9A, 0x5B}, {0x9A, 0x5C}, {0x9A, 0x5D}, /* 0x40-0x43 */ + {0x9A, 0x5E}, {0x9A, 0x5F}, {0x9A, 0x60}, {0x9A, 0x61}, /* 0x44-0x47 */ + {0x9A, 0x62}, {0x9A, 0x63}, {0x9A, 0x64}, {0x9A, 0x65}, /* 0x48-0x4B */ + {0x9A, 0x66}, {0x9A, 0x67}, {0x9A, 0x68}, {0x9A, 0x69}, /* 0x4C-0x4F */ + {0x9A, 0x6A}, {0x9A, 0x6B}, {0x9A, 0x72}, {0x9A, 0x83}, /* 0x50-0x53 */ + {0x9A, 0x89}, {0x9A, 0x8D}, {0x9A, 0x8E}, {0x9A, 0x94}, /* 0x54-0x57 */ + {0x9A, 0x95}, {0x9A, 0x99}, {0x9A, 0xA6}, {0x9A, 0xA9}, /* 0x58-0x5B */ + {0x9A, 0xAA}, {0x9A, 0xAB}, {0x9A, 0xAC}, {0x9A, 0xAD}, /* 0x5C-0x5F */ + {0x9A, 0xAE}, {0x9A, 0xAF}, {0x9A, 0xB2}, {0x9A, 0xB3}, /* 0x60-0x63 */ + {0x9A, 0xB4}, {0x9A, 0xB5}, {0x9A, 0xB9}, {0x9A, 0xBB}, /* 0x64-0x67 */ + {0x9A, 0xBD}, {0x9A, 0xBE}, {0x9A, 0xBF}, {0x9A, 0xC3}, /* 0x68-0x6B */ + {0x9A, 0xC4}, {0x9A, 0xC6}, {0x9A, 0xC7}, {0x9A, 0xC8}, /* 0x6C-0x6F */ + {0x9A, 0xC9}, {0x9A, 0xCA}, {0x9A, 0xCD}, {0x9A, 0xCE}, /* 0x70-0x73 */ + {0x9A, 0xCF}, {0x9A, 0xD0}, {0x9A, 0xD2}, {0x9A, 0xD4}, /* 0x74-0x77 */ + {0x9A, 0xD5}, {0x9A, 0xD6}, {0x9A, 0xD7}, {0x9A, 0xD9}, /* 0x78-0x7B */ + {0x9A, 0xDA}, {0x9A, 0xDB}, {0x9A, 0xDC}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9A, 0xDD}, {0x9A, 0xDE}, {0x9A, 0xE0}, {0x9A, 0xE2}, /* 0x80-0x83 */ + {0x9A, 0xE3}, {0x9A, 0xE4}, {0x9A, 0xE5}, {0x9A, 0xE7}, /* 0x84-0x87 */ + {0x9A, 0xE8}, {0x9A, 0xE9}, {0x9A, 0xEA}, {0x9A, 0xEC}, /* 0x88-0x8B */ + {0x9A, 0xEE}, {0x9A, 0xF0}, {0x9A, 0xF1}, {0x9A, 0xF2}, /* 0x8C-0x8F */ + {0x9A, 0xF3}, {0x9A, 0xF4}, {0x9A, 0xF5}, {0x9A, 0xF6}, /* 0x90-0x93 */ + {0x9A, 0xF7}, {0x9A, 0xF8}, {0x9A, 0xFA}, {0x9A, 0xFC}, /* 0x94-0x97 */ + {0x9A, 0xFD}, {0x9A, 0xFE}, {0x9A, 0xFF}, {0x9B, 0x00}, /* 0x98-0x9B */ + {0x9B, 0x01}, {0x9B, 0x02}, {0x9B, 0x04}, {0x9B, 0x05}, /* 0x9C-0x9F */ + {0x9B, 0x06}, {0x87, 0xC6}, {0x87, 0x88}, {0x87, 0x85}, /* 0xA0-0xA3 */ + {0x87, 0xAD}, {0x87, 0x97}, {0x87, 0x83}, {0x87, 0xAB}, /* 0xA4-0xA7 */ + {0x87, 0xE5}, {0x87, 0xAC}, {0x87, 0xB5}, {0x87, 0xB3}, /* 0xA8-0xAB */ + {0x87, 0xCB}, {0x87, 0xD3}, {0x87, 0xBD}, {0x87, 0xD1}, /* 0xAC-0xAF */ + {0x87, 0xC0}, {0x87, 0xCA}, {0x87, 0xDB}, {0x87, 0xEA}, /* 0xB0-0xB3 */ + {0x87, 0xE0}, {0x87, 0xEE}, {0x88, 0x16}, {0x88, 0x13}, /* 0xB4-0xB7 */ + {0x87, 0xFE}, {0x88, 0x0A}, {0x88, 0x1B}, {0x88, 0x21}, /* 0xB8-0xBB */ + {0x88, 0x39}, {0x88, 0x3C}, {0x7F, 0x36}, {0x7F, 0x42}, /* 0xBC-0xBF */ + {0x7F, 0x44}, {0x7F, 0x45}, {0x82, 0x10}, {0x7A, 0xFA}, /* 0xC0-0xC3 */ + {0x7A, 0xFD}, {0x7B, 0x08}, {0x7B, 0x03}, {0x7B, 0x04}, /* 0xC4-0xC7 */ + {0x7B, 0x15}, {0x7B, 0x0A}, {0x7B, 0x2B}, {0x7B, 0x0F}, /* 0xC8-0xCB */ + {0x7B, 0x47}, {0x7B, 0x38}, {0x7B, 0x2A}, {0x7B, 0x19}, /* 0xCC-0xCF */ + {0x7B, 0x2E}, {0x7B, 0x31}, {0x7B, 0x20}, {0x7B, 0x25}, /* 0xD0-0xD3 */ + {0x7B, 0x24}, {0x7B, 0x33}, {0x7B, 0x3E}, {0x7B, 0x1E}, /* 0xD4-0xD7 */ + {0x7B, 0x58}, {0x7B, 0x5A}, {0x7B, 0x45}, {0x7B, 0x75}, /* 0xD8-0xDB */ + {0x7B, 0x4C}, {0x7B, 0x5D}, {0x7B, 0x60}, {0x7B, 0x6E}, /* 0xDC-0xDF */ + {0x7B, 0x7B}, {0x7B, 0x62}, {0x7B, 0x72}, {0x7B, 0x71}, /* 0xE0-0xE3 */ + {0x7B, 0x90}, {0x7B, 0xA6}, {0x7B, 0xA7}, {0x7B, 0xB8}, /* 0xE4-0xE7 */ + {0x7B, 0xAC}, {0x7B, 0x9D}, {0x7B, 0xA8}, {0x7B, 0x85}, /* 0xE8-0xEB */ + {0x7B, 0xAA}, {0x7B, 0x9C}, {0x7B, 0xA2}, {0x7B, 0xAB}, /* 0xEC-0xEF */ + {0x7B, 0xB4}, {0x7B, 0xD1}, {0x7B, 0xC1}, {0x7B, 0xCC}, /* 0xF0-0xF3 */ + {0x7B, 0xDD}, {0x7B, 0xDA}, {0x7B, 0xE5}, {0x7B, 0xE6}, /* 0xF4-0xF7 */ + {0x7B, 0xEA}, {0x7C, 0x0C}, {0x7B, 0xFE}, {0x7B, 0xFC}, /* 0xF8-0xFB */ + {0x7C, 0x0F}, {0x7C, 0x16}, {0x7C, 0x0B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9B, 0x07}, {0x9B, 0x09}, {0x9B, 0x0A}, {0x9B, 0x0B}, /* 0x40-0x43 */ + {0x9B, 0x0C}, {0x9B, 0x0D}, {0x9B, 0x0E}, {0x9B, 0x10}, /* 0x44-0x47 */ + {0x9B, 0x11}, {0x9B, 0x12}, {0x9B, 0x14}, {0x9B, 0x15}, /* 0x48-0x4B */ + {0x9B, 0x16}, {0x9B, 0x17}, {0x9B, 0x18}, {0x9B, 0x19}, /* 0x4C-0x4F */ + {0x9B, 0x1A}, {0x9B, 0x1B}, {0x9B, 0x1C}, {0x9B, 0x1D}, /* 0x50-0x53 */ + {0x9B, 0x1E}, {0x9B, 0x20}, {0x9B, 0x21}, {0x9B, 0x22}, /* 0x54-0x57 */ + {0x9B, 0x24}, {0x9B, 0x25}, {0x9B, 0x26}, {0x9B, 0x27}, /* 0x58-0x5B */ + {0x9B, 0x28}, {0x9B, 0x29}, {0x9B, 0x2A}, {0x9B, 0x2B}, /* 0x5C-0x5F */ + {0x9B, 0x2C}, {0x9B, 0x2D}, {0x9B, 0x2E}, {0x9B, 0x30}, /* 0x60-0x63 */ + {0x9B, 0x31}, {0x9B, 0x33}, {0x9B, 0x34}, {0x9B, 0x35}, /* 0x64-0x67 */ + {0x9B, 0x36}, {0x9B, 0x37}, {0x9B, 0x38}, {0x9B, 0x39}, /* 0x68-0x6B */ + {0x9B, 0x3A}, {0x9B, 0x3D}, {0x9B, 0x3E}, {0x9B, 0x3F}, /* 0x6C-0x6F */ + {0x9B, 0x40}, {0x9B, 0x46}, {0x9B, 0x4A}, {0x9B, 0x4B}, /* 0x70-0x73 */ + {0x9B, 0x4C}, {0x9B, 0x4E}, {0x9B, 0x50}, {0x9B, 0x52}, /* 0x74-0x77 */ + {0x9B, 0x53}, {0x9B, 0x55}, {0x9B, 0x56}, {0x9B, 0x57}, /* 0x78-0x7B */ + {0x9B, 0x58}, {0x9B, 0x59}, {0x9B, 0x5A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9B, 0x5B}, {0x9B, 0x5C}, {0x9B, 0x5D}, {0x9B, 0x5E}, /* 0x80-0x83 */ + {0x9B, 0x5F}, {0x9B, 0x60}, {0x9B, 0x61}, {0x9B, 0x62}, /* 0x84-0x87 */ + {0x9B, 0x63}, {0x9B, 0x64}, {0x9B, 0x65}, {0x9B, 0x66}, /* 0x88-0x8B */ + {0x9B, 0x67}, {0x9B, 0x68}, {0x9B, 0x69}, {0x9B, 0x6A}, /* 0x8C-0x8F */ + {0x9B, 0x6B}, {0x9B, 0x6C}, {0x9B, 0x6D}, {0x9B, 0x6E}, /* 0x90-0x93 */ + {0x9B, 0x6F}, {0x9B, 0x70}, {0x9B, 0x71}, {0x9B, 0x72}, /* 0x94-0x97 */ + {0x9B, 0x73}, {0x9B, 0x74}, {0x9B, 0x75}, {0x9B, 0x76}, /* 0x98-0x9B */ + {0x9B, 0x77}, {0x9B, 0x78}, {0x9B, 0x79}, {0x9B, 0x7A}, /* 0x9C-0x9F */ + {0x9B, 0x7B}, {0x7C, 0x1F}, {0x7C, 0x2A}, {0x7C, 0x26}, /* 0xA0-0xA3 */ + {0x7C, 0x38}, {0x7C, 0x41}, {0x7C, 0x40}, {0x81, 0xFE}, /* 0xA4-0xA7 */ + {0x82, 0x01}, {0x82, 0x02}, {0x82, 0x04}, {0x81, 0xEC}, /* 0xA8-0xAB */ + {0x88, 0x44}, {0x82, 0x21}, {0x82, 0x22}, {0x82, 0x23}, /* 0xAC-0xAF */ + {0x82, 0x2D}, {0x82, 0x2F}, {0x82, 0x28}, {0x82, 0x2B}, /* 0xB0-0xB3 */ + {0x82, 0x38}, {0x82, 0x3B}, {0x82, 0x33}, {0x82, 0x34}, /* 0xB4-0xB7 */ + {0x82, 0x3E}, {0x82, 0x44}, {0x82, 0x49}, {0x82, 0x4B}, /* 0xB8-0xBB */ + {0x82, 0x4F}, {0x82, 0x5A}, {0x82, 0x5F}, {0x82, 0x68}, /* 0xBC-0xBF */ + {0x88, 0x7E}, {0x88, 0x85}, {0x88, 0x88}, {0x88, 0xD8}, /* 0xC0-0xC3 */ + {0x88, 0xDF}, {0x89, 0x5E}, {0x7F, 0x9D}, {0x7F, 0x9F}, /* 0xC4-0xC7 */ + {0x7F, 0xA7}, {0x7F, 0xAF}, {0x7F, 0xB0}, {0x7F, 0xB2}, /* 0xC8-0xCB */ + {0x7C, 0x7C}, {0x65, 0x49}, {0x7C, 0x91}, {0x7C, 0x9D}, /* 0xCC-0xCF */ + {0x7C, 0x9C}, {0x7C, 0x9E}, {0x7C, 0xA2}, {0x7C, 0xB2}, /* 0xD0-0xD3 */ + {0x7C, 0xBC}, {0x7C, 0xBD}, {0x7C, 0xC1}, {0x7C, 0xC7}, /* 0xD4-0xD7 */ + {0x7C, 0xCC}, {0x7C, 0xCD}, {0x7C, 0xC8}, {0x7C, 0xC5}, /* 0xD8-0xDB */ + {0x7C, 0xD7}, {0x7C, 0xE8}, {0x82, 0x6E}, {0x66, 0xA8}, /* 0xDC-0xDF */ + {0x7F, 0xBF}, {0x7F, 0xCE}, {0x7F, 0xD5}, {0x7F, 0xE5}, /* 0xE0-0xE3 */ + {0x7F, 0xE1}, {0x7F, 0xE6}, {0x7F, 0xE9}, {0x7F, 0xEE}, /* 0xE4-0xE7 */ + {0x7F, 0xF3}, {0x7C, 0xF8}, {0x7D, 0x77}, {0x7D, 0xA6}, /* 0xE8-0xEB */ + {0x7D, 0xAE}, {0x7E, 0x47}, {0x7E, 0x9B}, {0x9E, 0xB8}, /* 0xEC-0xEF */ + {0x9E, 0xB4}, {0x8D, 0x73}, {0x8D, 0x84}, {0x8D, 0x94}, /* 0xF0-0xF3 */ + {0x8D, 0x91}, {0x8D, 0xB1}, {0x8D, 0x67}, {0x8D, 0x6D}, /* 0xF4-0xF7 */ + {0x8C, 0x47}, {0x8C, 0x49}, {0x91, 0x4A}, {0x91, 0x50}, /* 0xF8-0xFB */ + {0x91, 0x4E}, {0x91, 0x4F}, {0x91, 0x64}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9B, 0x7C}, {0x9B, 0x7D}, {0x9B, 0x7E}, {0x9B, 0x7F}, /* 0x40-0x43 */ + {0x9B, 0x80}, {0x9B, 0x81}, {0x9B, 0x82}, {0x9B, 0x83}, /* 0x44-0x47 */ + {0x9B, 0x84}, {0x9B, 0x85}, {0x9B, 0x86}, {0x9B, 0x87}, /* 0x48-0x4B */ + {0x9B, 0x88}, {0x9B, 0x89}, {0x9B, 0x8A}, {0x9B, 0x8B}, /* 0x4C-0x4F */ + {0x9B, 0x8C}, {0x9B, 0x8D}, {0x9B, 0x8E}, {0x9B, 0x8F}, /* 0x50-0x53 */ + {0x9B, 0x90}, {0x9B, 0x91}, {0x9B, 0x92}, {0x9B, 0x93}, /* 0x54-0x57 */ + {0x9B, 0x94}, {0x9B, 0x95}, {0x9B, 0x96}, {0x9B, 0x97}, /* 0x58-0x5B */ + {0x9B, 0x98}, {0x9B, 0x99}, {0x9B, 0x9A}, {0x9B, 0x9B}, /* 0x5C-0x5F */ + {0x9B, 0x9C}, {0x9B, 0x9D}, {0x9B, 0x9E}, {0x9B, 0x9F}, /* 0x60-0x63 */ + {0x9B, 0xA0}, {0x9B, 0xA1}, {0x9B, 0xA2}, {0x9B, 0xA3}, /* 0x64-0x67 */ + {0x9B, 0xA4}, {0x9B, 0xA5}, {0x9B, 0xA6}, {0x9B, 0xA7}, /* 0x68-0x6B */ + {0x9B, 0xA8}, {0x9B, 0xA9}, {0x9B, 0xAA}, {0x9B, 0xAB}, /* 0x6C-0x6F */ + {0x9B, 0xAC}, {0x9B, 0xAD}, {0x9B, 0xAE}, {0x9B, 0xAF}, /* 0x70-0x73 */ + {0x9B, 0xB0}, {0x9B, 0xB1}, {0x9B, 0xB2}, {0x9B, 0xB3}, /* 0x74-0x77 */ + {0x9B, 0xB4}, {0x9B, 0xB5}, {0x9B, 0xB6}, {0x9B, 0xB7}, /* 0x78-0x7B */ + {0x9B, 0xB8}, {0x9B, 0xB9}, {0x9B, 0xBA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9B, 0xBB}, {0x9B, 0xBC}, {0x9B, 0xBD}, {0x9B, 0xBE}, /* 0x80-0x83 */ + {0x9B, 0xBF}, {0x9B, 0xC0}, {0x9B, 0xC1}, {0x9B, 0xC2}, /* 0x84-0x87 */ + {0x9B, 0xC3}, {0x9B, 0xC4}, {0x9B, 0xC5}, {0x9B, 0xC6}, /* 0x88-0x8B */ + {0x9B, 0xC7}, {0x9B, 0xC8}, {0x9B, 0xC9}, {0x9B, 0xCA}, /* 0x8C-0x8F */ + {0x9B, 0xCB}, {0x9B, 0xCC}, {0x9B, 0xCD}, {0x9B, 0xCE}, /* 0x90-0x93 */ + {0x9B, 0xCF}, {0x9B, 0xD0}, {0x9B, 0xD1}, {0x9B, 0xD2}, /* 0x94-0x97 */ + {0x9B, 0xD3}, {0x9B, 0xD4}, {0x9B, 0xD5}, {0x9B, 0xD6}, /* 0x98-0x9B */ + {0x9B, 0xD7}, {0x9B, 0xD8}, {0x9B, 0xD9}, {0x9B, 0xDA}, /* 0x9C-0x9F */ + {0x9B, 0xDB}, {0x91, 0x62}, {0x91, 0x61}, {0x91, 0x70}, /* 0xA0-0xA3 */ + {0x91, 0x69}, {0x91, 0x6F}, {0x91, 0x7D}, {0x91, 0x7E}, /* 0xA4-0xA7 */ + {0x91, 0x72}, {0x91, 0x74}, {0x91, 0x79}, {0x91, 0x8C}, /* 0xA8-0xAB */ + {0x91, 0x85}, {0x91, 0x90}, {0x91, 0x8D}, {0x91, 0x91}, /* 0xAC-0xAF */ + {0x91, 0xA2}, {0x91, 0xA3}, {0x91, 0xAA}, {0x91, 0xAD}, /* 0xB0-0xB3 */ + {0x91, 0xAE}, {0x91, 0xAF}, {0x91, 0xB5}, {0x91, 0xB4}, /* 0xB4-0xB7 */ + {0x91, 0xBA}, {0x8C, 0x55}, {0x9E, 0x7E}, {0x8D, 0xB8}, /* 0xB8-0xBB */ + {0x8D, 0xEB}, {0x8E, 0x05}, {0x8E, 0x59}, {0x8E, 0x69}, /* 0xBC-0xBF */ + {0x8D, 0xB5}, {0x8D, 0xBF}, {0x8D, 0xBC}, {0x8D, 0xBA}, /* 0xC0-0xC3 */ + {0x8D, 0xC4}, {0x8D, 0xD6}, {0x8D, 0xD7}, {0x8D, 0xDA}, /* 0xC4-0xC7 */ + {0x8D, 0xDE}, {0x8D, 0xCE}, {0x8D, 0xCF}, {0x8D, 0xDB}, /* 0xC8-0xCB */ + {0x8D, 0xC6}, {0x8D, 0xEC}, {0x8D, 0xF7}, {0x8D, 0xF8}, /* 0xCC-0xCF */ + {0x8D, 0xE3}, {0x8D, 0xF9}, {0x8D, 0xFB}, {0x8D, 0xE4}, /* 0xD0-0xD3 */ + {0x8E, 0x09}, {0x8D, 0xFD}, {0x8E, 0x14}, {0x8E, 0x1D}, /* 0xD4-0xD7 */ + {0x8E, 0x1F}, {0x8E, 0x2C}, {0x8E, 0x2E}, {0x8E, 0x23}, /* 0xD8-0xDB */ + {0x8E, 0x2F}, {0x8E, 0x3A}, {0x8E, 0x40}, {0x8E, 0x39}, /* 0xDC-0xDF */ + {0x8E, 0x35}, {0x8E, 0x3D}, {0x8E, 0x31}, {0x8E, 0x49}, /* 0xE0-0xE3 */ + {0x8E, 0x41}, {0x8E, 0x42}, {0x8E, 0x51}, {0x8E, 0x52}, /* 0xE4-0xE7 */ + {0x8E, 0x4A}, {0x8E, 0x70}, {0x8E, 0x76}, {0x8E, 0x7C}, /* 0xE8-0xEB */ + {0x8E, 0x6F}, {0x8E, 0x74}, {0x8E, 0x85}, {0x8E, 0x8F}, /* 0xEC-0xEF */ + {0x8E, 0x94}, {0x8E, 0x90}, {0x8E, 0x9C}, {0x8E, 0x9E}, /* 0xF0-0xF3 */ + {0x8C, 0x78}, {0x8C, 0x82}, {0x8C, 0x8A}, {0x8C, 0x85}, /* 0xF4-0xF7 */ + {0x8C, 0x98}, {0x8C, 0x94}, {0x65, 0x9B}, {0x89, 0xD6}, /* 0xF8-0xFB */ + {0x89, 0xDE}, {0x89, 0xDA}, {0x89, 0xDC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9B, 0xDC}, {0x9B, 0xDD}, {0x9B, 0xDE}, {0x9B, 0xDF}, /* 0x40-0x43 */ + {0x9B, 0xE0}, {0x9B, 0xE1}, {0x9B, 0xE2}, {0x9B, 0xE3}, /* 0x44-0x47 */ + {0x9B, 0xE4}, {0x9B, 0xE5}, {0x9B, 0xE6}, {0x9B, 0xE7}, /* 0x48-0x4B */ + {0x9B, 0xE8}, {0x9B, 0xE9}, {0x9B, 0xEA}, {0x9B, 0xEB}, /* 0x4C-0x4F */ + {0x9B, 0xEC}, {0x9B, 0xED}, {0x9B, 0xEE}, {0x9B, 0xEF}, /* 0x50-0x53 */ + {0x9B, 0xF0}, {0x9B, 0xF1}, {0x9B, 0xF2}, {0x9B, 0xF3}, /* 0x54-0x57 */ + {0x9B, 0xF4}, {0x9B, 0xF5}, {0x9B, 0xF6}, {0x9B, 0xF7}, /* 0x58-0x5B */ + {0x9B, 0xF8}, {0x9B, 0xF9}, {0x9B, 0xFA}, {0x9B, 0xFB}, /* 0x5C-0x5F */ + {0x9B, 0xFC}, {0x9B, 0xFD}, {0x9B, 0xFE}, {0x9B, 0xFF}, /* 0x60-0x63 */ + {0x9C, 0x00}, {0x9C, 0x01}, {0x9C, 0x02}, {0x9C, 0x03}, /* 0x64-0x67 */ + {0x9C, 0x04}, {0x9C, 0x05}, {0x9C, 0x06}, {0x9C, 0x07}, /* 0x68-0x6B */ + {0x9C, 0x08}, {0x9C, 0x09}, {0x9C, 0x0A}, {0x9C, 0x0B}, /* 0x6C-0x6F */ + {0x9C, 0x0C}, {0x9C, 0x0D}, {0x9C, 0x0E}, {0x9C, 0x0F}, /* 0x70-0x73 */ + {0x9C, 0x10}, {0x9C, 0x11}, {0x9C, 0x12}, {0x9C, 0x13}, /* 0x74-0x77 */ + {0x9C, 0x14}, {0x9C, 0x15}, {0x9C, 0x16}, {0x9C, 0x17}, /* 0x78-0x7B */ + {0x9C, 0x18}, {0x9C, 0x19}, {0x9C, 0x1A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9C, 0x1B}, {0x9C, 0x1C}, {0x9C, 0x1D}, {0x9C, 0x1E}, /* 0x80-0x83 */ + {0x9C, 0x1F}, {0x9C, 0x20}, {0x9C, 0x21}, {0x9C, 0x22}, /* 0x84-0x87 */ + {0x9C, 0x23}, {0x9C, 0x24}, {0x9C, 0x25}, {0x9C, 0x26}, /* 0x88-0x8B */ + {0x9C, 0x27}, {0x9C, 0x28}, {0x9C, 0x29}, {0x9C, 0x2A}, /* 0x8C-0x8F */ + {0x9C, 0x2B}, {0x9C, 0x2C}, {0x9C, 0x2D}, {0x9C, 0x2E}, /* 0x90-0x93 */ + {0x9C, 0x2F}, {0x9C, 0x30}, {0x9C, 0x31}, {0x9C, 0x32}, /* 0x94-0x97 */ + {0x9C, 0x33}, {0x9C, 0x34}, {0x9C, 0x35}, {0x9C, 0x36}, /* 0x98-0x9B */ + {0x9C, 0x37}, {0x9C, 0x38}, {0x9C, 0x39}, {0x9C, 0x3A}, /* 0x9C-0x9F */ + {0x9C, 0x3B}, {0x89, 0xE5}, {0x89, 0xEB}, {0x89, 0xEF}, /* 0xA0-0xA3 */ + {0x8A, 0x3E}, {0x8B, 0x26}, {0x97, 0x53}, {0x96, 0xE9}, /* 0xA4-0xA7 */ + {0x96, 0xF3}, {0x96, 0xEF}, {0x97, 0x06}, {0x97, 0x01}, /* 0xA8-0xAB */ + {0x97, 0x08}, {0x97, 0x0F}, {0x97, 0x0E}, {0x97, 0x2A}, /* 0xAC-0xAF */ + {0x97, 0x2D}, {0x97, 0x30}, {0x97, 0x3E}, {0x9F, 0x80}, /* 0xB0-0xB3 */ + {0x9F, 0x83}, {0x9F, 0x85}, {0x9F, 0x86}, {0x9F, 0x87}, /* 0xB4-0xB7 */ + {0x9F, 0x88}, {0x9F, 0x89}, {0x9F, 0x8A}, {0x9F, 0x8C}, /* 0xB8-0xBB */ + {0x9E, 0xFE}, {0x9F, 0x0B}, {0x9F, 0x0D}, {0x96, 0xB9}, /* 0xBC-0xBF */ + {0x96, 0xBC}, {0x96, 0xBD}, {0x96, 0xCE}, {0x96, 0xD2}, /* 0xC0-0xC3 */ + {0x77, 0xBF}, {0x96, 0xE0}, {0x92, 0x8E}, {0x92, 0xAE}, /* 0xC4-0xC7 */ + {0x92, 0xC8}, {0x93, 0x3E}, {0x93, 0x6A}, {0x93, 0xCA}, /* 0xC8-0xCB */ + {0x93, 0x8F}, {0x94, 0x3E}, {0x94, 0x6B}, {0x9C, 0x7F}, /* 0xCC-0xCF */ + {0x9C, 0x82}, {0x9C, 0x85}, {0x9C, 0x86}, {0x9C, 0x87}, /* 0xD0-0xD3 */ + {0x9C, 0x88}, {0x7A, 0x23}, {0x9C, 0x8B}, {0x9C, 0x8E}, /* 0xD4-0xD7 */ + {0x9C, 0x90}, {0x9C, 0x91}, {0x9C, 0x92}, {0x9C, 0x94}, /* 0xD8-0xDB */ + {0x9C, 0x95}, {0x9C, 0x9A}, {0x9C, 0x9B}, {0x9C, 0x9E}, /* 0xDC-0xDF */ + {0x9C, 0x9F}, {0x9C, 0xA0}, {0x9C, 0xA1}, {0x9C, 0xA2}, /* 0xE0-0xE3 */ + {0x9C, 0xA3}, {0x9C, 0xA5}, {0x9C, 0xA6}, {0x9C, 0xA7}, /* 0xE4-0xE7 */ + {0x9C, 0xA8}, {0x9C, 0xA9}, {0x9C, 0xAB}, {0x9C, 0xAD}, /* 0xE8-0xEB */ + {0x9C, 0xAE}, {0x9C, 0xB0}, {0x9C, 0xB1}, {0x9C, 0xB2}, /* 0xEC-0xEF */ + {0x9C, 0xB3}, {0x9C, 0xB4}, {0x9C, 0xB5}, {0x9C, 0xB6}, /* 0xF0-0xF3 */ + {0x9C, 0xB7}, {0x9C, 0xBA}, {0x9C, 0xBB}, {0x9C, 0xBC}, /* 0xF4-0xF7 */ + {0x9C, 0xBD}, {0x9C, 0xC4}, {0x9C, 0xC5}, {0x9C, 0xC6}, /* 0xF8-0xFB */ + {0x9C, 0xC7}, {0x9C, 0xCA}, {0x9C, 0xCB}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9C, 0x3C}, {0x9C, 0x3D}, {0x9C, 0x3E}, {0x9C, 0x3F}, /* 0x40-0x43 */ + {0x9C, 0x40}, {0x9C, 0x41}, {0x9C, 0x42}, {0x9C, 0x43}, /* 0x44-0x47 */ + {0x9C, 0x44}, {0x9C, 0x45}, {0x9C, 0x46}, {0x9C, 0x47}, /* 0x48-0x4B */ + {0x9C, 0x48}, {0x9C, 0x49}, {0x9C, 0x4A}, {0x9C, 0x4B}, /* 0x4C-0x4F */ + {0x9C, 0x4C}, {0x9C, 0x4D}, {0x9C, 0x4E}, {0x9C, 0x4F}, /* 0x50-0x53 */ + {0x9C, 0x50}, {0x9C, 0x51}, {0x9C, 0x52}, {0x9C, 0x53}, /* 0x54-0x57 */ + {0x9C, 0x54}, {0x9C, 0x55}, {0x9C, 0x56}, {0x9C, 0x57}, /* 0x58-0x5B */ + {0x9C, 0x58}, {0x9C, 0x59}, {0x9C, 0x5A}, {0x9C, 0x5B}, /* 0x5C-0x5F */ + {0x9C, 0x5C}, {0x9C, 0x5D}, {0x9C, 0x5E}, {0x9C, 0x5F}, /* 0x60-0x63 */ + {0x9C, 0x60}, {0x9C, 0x61}, {0x9C, 0x62}, {0x9C, 0x63}, /* 0x64-0x67 */ + {0x9C, 0x64}, {0x9C, 0x65}, {0x9C, 0x66}, {0x9C, 0x67}, /* 0x68-0x6B */ + {0x9C, 0x68}, {0x9C, 0x69}, {0x9C, 0x6A}, {0x9C, 0x6B}, /* 0x6C-0x6F */ + {0x9C, 0x6C}, {0x9C, 0x6D}, {0x9C, 0x6E}, {0x9C, 0x6F}, /* 0x70-0x73 */ + {0x9C, 0x70}, {0x9C, 0x71}, {0x9C, 0x72}, {0x9C, 0x73}, /* 0x74-0x77 */ + {0x9C, 0x74}, {0x9C, 0x75}, {0x9C, 0x76}, {0x9C, 0x77}, /* 0x78-0x7B */ + {0x9C, 0x78}, {0x9C, 0x79}, {0x9C, 0x7A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9C, 0x7B}, {0x9C, 0x7D}, {0x9C, 0x7E}, {0x9C, 0x80}, /* 0x80-0x83 */ + {0x9C, 0x83}, {0x9C, 0x84}, {0x9C, 0x89}, {0x9C, 0x8A}, /* 0x84-0x87 */ + {0x9C, 0x8C}, {0x9C, 0x8F}, {0x9C, 0x93}, {0x9C, 0x96}, /* 0x88-0x8B */ + {0x9C, 0x97}, {0x9C, 0x98}, {0x9C, 0x99}, {0x9C, 0x9D}, /* 0x8C-0x8F */ + {0x9C, 0xAA}, {0x9C, 0xAC}, {0x9C, 0xAF}, {0x9C, 0xB9}, /* 0x90-0x93 */ + {0x9C, 0xBE}, {0x9C, 0xBF}, {0x9C, 0xC0}, {0x9C, 0xC1}, /* 0x94-0x97 */ + {0x9C, 0xC2}, {0x9C, 0xC8}, {0x9C, 0xC9}, {0x9C, 0xD1}, /* 0x98-0x9B */ + {0x9C, 0xD2}, {0x9C, 0xDA}, {0x9C, 0xDB}, {0x9C, 0xE0}, /* 0x9C-0x9F */ + {0x9C, 0xE1}, {0x9C, 0xCC}, {0x9C, 0xCD}, {0x9C, 0xCE}, /* 0xA0-0xA3 */ + {0x9C, 0xCF}, {0x9C, 0xD0}, {0x9C, 0xD3}, {0x9C, 0xD4}, /* 0xA4-0xA7 */ + {0x9C, 0xD5}, {0x9C, 0xD7}, {0x9C, 0xD8}, {0x9C, 0xD9}, /* 0xA8-0xAB */ + {0x9C, 0xDC}, {0x9C, 0xDD}, {0x9C, 0xDF}, {0x9C, 0xE2}, /* 0xAC-0xAF */ + {0x97, 0x7C}, {0x97, 0x85}, {0x97, 0x91}, {0x97, 0x92}, /* 0xB0-0xB3 */ + {0x97, 0x94}, {0x97, 0xAF}, {0x97, 0xAB}, {0x97, 0xA3}, /* 0xB4-0xB7 */ + {0x97, 0xB2}, {0x97, 0xB4}, {0x9A, 0xB1}, {0x9A, 0xB0}, /* 0xB8-0xBB */ + {0x9A, 0xB7}, {0x9E, 0x58}, {0x9A, 0xB6}, {0x9A, 0xBA}, /* 0xBC-0xBF */ + {0x9A, 0xBC}, {0x9A, 0xC1}, {0x9A, 0xC0}, {0x9A, 0xC5}, /* 0xC0-0xC3 */ + {0x9A, 0xC2}, {0x9A, 0xCB}, {0x9A, 0xCC}, {0x9A, 0xD1}, /* 0xC4-0xC7 */ + {0x9B, 0x45}, {0x9B, 0x43}, {0x9B, 0x47}, {0x9B, 0x49}, /* 0xC8-0xCB */ + {0x9B, 0x48}, {0x9B, 0x4D}, {0x9B, 0x51}, {0x98, 0xE8}, /* 0xCC-0xCF */ + {0x99, 0x0D}, {0x99, 0x2E}, {0x99, 0x55}, {0x99, 0x54}, /* 0xD0-0xD3 */ + {0x9A, 0xDF}, {0x9A, 0xE1}, {0x9A, 0xE6}, {0x9A, 0xEF}, /* 0xD4-0xD7 */ + {0x9A, 0xEB}, {0x9A, 0xFB}, {0x9A, 0xED}, {0x9A, 0xF9}, /* 0xD8-0xDB */ + {0x9B, 0x08}, {0x9B, 0x0F}, {0x9B, 0x13}, {0x9B, 0x1F}, /* 0xDC-0xDF */ + {0x9B, 0x23}, {0x9E, 0xBD}, {0x9E, 0xBE}, {0x7E, 0x3B}, /* 0xE0-0xE3 */ + {0x9E, 0x82}, {0x9E, 0x87}, {0x9E, 0x88}, {0x9E, 0x8B}, /* 0xE4-0xE7 */ + {0x9E, 0x92}, {0x93, 0xD6}, {0x9E, 0x9D}, {0x9E, 0x9F}, /* 0xE8-0xEB */ + {0x9E, 0xDB}, {0x9E, 0xDC}, {0x9E, 0xDD}, {0x9E, 0xE0}, /* 0xEC-0xEF */ + {0x9E, 0xDF}, {0x9E, 0xE2}, {0x9E, 0xE9}, {0x9E, 0xE7}, /* 0xF0-0xF3 */ + {0x9E, 0xE5}, {0x9E, 0xEA}, {0x9E, 0xEF}, {0x9F, 0x22}, /* 0xF4-0xF7 */ + {0x9F, 0x2C}, {0x9F, 0x2F}, {0x9F, 0x39}, {0x9F, 0x37}, /* 0xF8-0xFB */ + {0x9F, 0x3D}, {0x9F, 0x3E}, {0x9F, 0x44}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9C, 0xE3}, {0x9C, 0xE4}, {0x9C, 0xE5}, {0x9C, 0xE6}, /* 0x40-0x43 */ + {0x9C, 0xE7}, {0x9C, 0xE8}, {0x9C, 0xE9}, {0x9C, 0xEA}, /* 0x44-0x47 */ + {0x9C, 0xEB}, {0x9C, 0xEC}, {0x9C, 0xED}, {0x9C, 0xEE}, /* 0x48-0x4B */ + {0x9C, 0xEF}, {0x9C, 0xF0}, {0x9C, 0xF1}, {0x9C, 0xF2}, /* 0x4C-0x4F */ + {0x9C, 0xF3}, {0x9C, 0xF4}, {0x9C, 0xF5}, {0x9C, 0xF6}, /* 0x50-0x53 */ + {0x9C, 0xF7}, {0x9C, 0xF8}, {0x9C, 0xF9}, {0x9C, 0xFA}, /* 0x54-0x57 */ + {0x9C, 0xFB}, {0x9C, 0xFC}, {0x9C, 0xFD}, {0x9C, 0xFE}, /* 0x58-0x5B */ + {0x9C, 0xFF}, {0x9D, 0x00}, {0x9D, 0x01}, {0x9D, 0x02}, /* 0x5C-0x5F */ + {0x9D, 0x03}, {0x9D, 0x04}, {0x9D, 0x05}, {0x9D, 0x06}, /* 0x60-0x63 */ + {0x9D, 0x07}, {0x9D, 0x08}, {0x9D, 0x09}, {0x9D, 0x0A}, /* 0x64-0x67 */ + {0x9D, 0x0B}, {0x9D, 0x0C}, {0x9D, 0x0D}, {0x9D, 0x0E}, /* 0x68-0x6B */ + {0x9D, 0x0F}, {0x9D, 0x10}, {0x9D, 0x11}, {0x9D, 0x12}, /* 0x6C-0x6F */ + {0x9D, 0x13}, {0x9D, 0x14}, {0x9D, 0x15}, {0x9D, 0x16}, /* 0x70-0x73 */ + {0x9D, 0x17}, {0x9D, 0x18}, {0x9D, 0x19}, {0x9D, 0x1A}, /* 0x74-0x77 */ + {0x9D, 0x1B}, {0x9D, 0x1C}, {0x9D, 0x1D}, {0x9D, 0x1E}, /* 0x78-0x7B */ + {0x9D, 0x1F}, {0x9D, 0x20}, {0x9D, 0x21}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9D, 0x22}, {0x9D, 0x23}, {0x9D, 0x24}, {0x9D, 0x25}, /* 0x80-0x83 */ + {0x9D, 0x26}, {0x9D, 0x27}, {0x9D, 0x28}, {0x9D, 0x29}, /* 0x84-0x87 */ + {0x9D, 0x2A}, {0x9D, 0x2B}, {0x9D, 0x2C}, {0x9D, 0x2D}, /* 0x88-0x8B */ + {0x9D, 0x2E}, {0x9D, 0x2F}, {0x9D, 0x30}, {0x9D, 0x31}, /* 0x8C-0x8F */ + {0x9D, 0x32}, {0x9D, 0x33}, {0x9D, 0x34}, {0x9D, 0x35}, /* 0x90-0x93 */ + {0x9D, 0x36}, {0x9D, 0x37}, {0x9D, 0x38}, {0x9D, 0x39}, /* 0x94-0x97 */ + {0x9D, 0x3A}, {0x9D, 0x3B}, {0x9D, 0x3C}, {0x9D, 0x3D}, /* 0x98-0x9B */ + {0x9D, 0x3E}, {0x9D, 0x3F}, {0x9D, 0x40}, {0x9D, 0x41}, /* 0x9C-0x9F */ + {0x9D, 0x42}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9D, 0x43}, {0x9D, 0x44}, {0x9D, 0x45}, {0x9D, 0x46}, /* 0x40-0x43 */ + {0x9D, 0x47}, {0x9D, 0x48}, {0x9D, 0x49}, {0x9D, 0x4A}, /* 0x44-0x47 */ + {0x9D, 0x4B}, {0x9D, 0x4C}, {0x9D, 0x4D}, {0x9D, 0x4E}, /* 0x48-0x4B */ + {0x9D, 0x4F}, {0x9D, 0x50}, {0x9D, 0x51}, {0x9D, 0x52}, /* 0x4C-0x4F */ + {0x9D, 0x53}, {0x9D, 0x54}, {0x9D, 0x55}, {0x9D, 0x56}, /* 0x50-0x53 */ + {0x9D, 0x57}, {0x9D, 0x58}, {0x9D, 0x59}, {0x9D, 0x5A}, /* 0x54-0x57 */ + {0x9D, 0x5B}, {0x9D, 0x5C}, {0x9D, 0x5D}, {0x9D, 0x5E}, /* 0x58-0x5B */ + {0x9D, 0x5F}, {0x9D, 0x60}, {0x9D, 0x61}, {0x9D, 0x62}, /* 0x5C-0x5F */ + {0x9D, 0x63}, {0x9D, 0x64}, {0x9D, 0x65}, {0x9D, 0x66}, /* 0x60-0x63 */ + {0x9D, 0x67}, {0x9D, 0x68}, {0x9D, 0x69}, {0x9D, 0x6A}, /* 0x64-0x67 */ + {0x9D, 0x6B}, {0x9D, 0x6C}, {0x9D, 0x6D}, {0x9D, 0x6E}, /* 0x68-0x6B */ + {0x9D, 0x6F}, {0x9D, 0x70}, {0x9D, 0x71}, {0x9D, 0x72}, /* 0x6C-0x6F */ + {0x9D, 0x73}, {0x9D, 0x74}, {0x9D, 0x75}, {0x9D, 0x76}, /* 0x70-0x73 */ + {0x9D, 0x77}, {0x9D, 0x78}, {0x9D, 0x79}, {0x9D, 0x7A}, /* 0x74-0x77 */ + {0x9D, 0x7B}, {0x9D, 0x7C}, {0x9D, 0x7D}, {0x9D, 0x7E}, /* 0x78-0x7B */ + {0x9D, 0x7F}, {0x9D, 0x80}, {0x9D, 0x81}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9D, 0x82}, {0x9D, 0x83}, {0x9D, 0x84}, {0x9D, 0x85}, /* 0x80-0x83 */ + {0x9D, 0x86}, {0x9D, 0x87}, {0x9D, 0x88}, {0x9D, 0x89}, /* 0x84-0x87 */ + {0x9D, 0x8A}, {0x9D, 0x8B}, {0x9D, 0x8C}, {0x9D, 0x8D}, /* 0x88-0x8B */ + {0x9D, 0x8E}, {0x9D, 0x8F}, {0x9D, 0x90}, {0x9D, 0x91}, /* 0x8C-0x8F */ + {0x9D, 0x92}, {0x9D, 0x93}, {0x9D, 0x94}, {0x9D, 0x95}, /* 0x90-0x93 */ + {0x9D, 0x96}, {0x9D, 0x97}, {0x9D, 0x98}, {0x9D, 0x99}, /* 0x94-0x97 */ + {0x9D, 0x9A}, {0x9D, 0x9B}, {0x9D, 0x9C}, {0x9D, 0x9D}, /* 0x98-0x9B */ + {0x9D, 0x9E}, {0x9D, 0x9F}, {0x9D, 0xA0}, {0x9D, 0xA1}, /* 0x9C-0x9F */ + {0x9D, 0xA2}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9D, 0xA3}, {0x9D, 0xA4}, {0x9D, 0xA5}, {0x9D, 0xA6}, /* 0x40-0x43 */ + {0x9D, 0xA7}, {0x9D, 0xA8}, {0x9D, 0xA9}, {0x9D, 0xAA}, /* 0x44-0x47 */ + {0x9D, 0xAB}, {0x9D, 0xAC}, {0x9D, 0xAD}, {0x9D, 0xAE}, /* 0x48-0x4B */ + {0x9D, 0xAF}, {0x9D, 0xB0}, {0x9D, 0xB1}, {0x9D, 0xB2}, /* 0x4C-0x4F */ + {0x9D, 0xB3}, {0x9D, 0xB4}, {0x9D, 0xB5}, {0x9D, 0xB6}, /* 0x50-0x53 */ + {0x9D, 0xB7}, {0x9D, 0xB8}, {0x9D, 0xB9}, {0x9D, 0xBA}, /* 0x54-0x57 */ + {0x9D, 0xBB}, {0x9D, 0xBC}, {0x9D, 0xBD}, {0x9D, 0xBE}, /* 0x58-0x5B */ + {0x9D, 0xBF}, {0x9D, 0xC0}, {0x9D, 0xC1}, {0x9D, 0xC2}, /* 0x5C-0x5F */ + {0x9D, 0xC3}, {0x9D, 0xC4}, {0x9D, 0xC5}, {0x9D, 0xC6}, /* 0x60-0x63 */ + {0x9D, 0xC7}, {0x9D, 0xC8}, {0x9D, 0xC9}, {0x9D, 0xCA}, /* 0x64-0x67 */ + {0x9D, 0xCB}, {0x9D, 0xCC}, {0x9D, 0xCD}, {0x9D, 0xCE}, /* 0x68-0x6B */ + {0x9D, 0xCF}, {0x9D, 0xD0}, {0x9D, 0xD1}, {0x9D, 0xD2}, /* 0x6C-0x6F */ + {0x9D, 0xD3}, {0x9D, 0xD4}, {0x9D, 0xD5}, {0x9D, 0xD6}, /* 0x70-0x73 */ + {0x9D, 0xD7}, {0x9D, 0xD8}, {0x9D, 0xD9}, {0x9D, 0xDA}, /* 0x74-0x77 */ + {0x9D, 0xDB}, {0x9D, 0xDC}, {0x9D, 0xDD}, {0x9D, 0xDE}, /* 0x78-0x7B */ + {0x9D, 0xDF}, {0x9D, 0xE0}, {0x9D, 0xE1}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9D, 0xE2}, {0x9D, 0xE3}, {0x9D, 0xE4}, {0x9D, 0xE5}, /* 0x80-0x83 */ + {0x9D, 0xE6}, {0x9D, 0xE7}, {0x9D, 0xE8}, {0x9D, 0xE9}, /* 0x84-0x87 */ + {0x9D, 0xEA}, {0x9D, 0xEB}, {0x9D, 0xEC}, {0x9D, 0xED}, /* 0x88-0x8B */ + {0x9D, 0xEE}, {0x9D, 0xEF}, {0x9D, 0xF0}, {0x9D, 0xF1}, /* 0x8C-0x8F */ + {0x9D, 0xF2}, {0x9D, 0xF3}, {0x9D, 0xF4}, {0x9D, 0xF5}, /* 0x90-0x93 */ + {0x9D, 0xF6}, {0x9D, 0xF7}, {0x9D, 0xF8}, {0x9D, 0xF9}, /* 0x94-0x97 */ + {0x9D, 0xFA}, {0x9D, 0xFB}, {0x9D, 0xFC}, {0x9D, 0xFD}, /* 0x98-0x9B */ + {0x9D, 0xFE}, {0x9D, 0xFF}, {0x9E, 0x00}, {0x9E, 0x01}, /* 0x9C-0x9F */ + {0x9E, 0x02}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9E, 0x03}, {0x9E, 0x04}, {0x9E, 0x05}, {0x9E, 0x06}, /* 0x40-0x43 */ + {0x9E, 0x07}, {0x9E, 0x08}, {0x9E, 0x09}, {0x9E, 0x0A}, /* 0x44-0x47 */ + {0x9E, 0x0B}, {0x9E, 0x0C}, {0x9E, 0x0D}, {0x9E, 0x0E}, /* 0x48-0x4B */ + {0x9E, 0x0F}, {0x9E, 0x10}, {0x9E, 0x11}, {0x9E, 0x12}, /* 0x4C-0x4F */ + {0x9E, 0x13}, {0x9E, 0x14}, {0x9E, 0x15}, {0x9E, 0x16}, /* 0x50-0x53 */ + {0x9E, 0x17}, {0x9E, 0x18}, {0x9E, 0x19}, {0x9E, 0x1A}, /* 0x54-0x57 */ + {0x9E, 0x1B}, {0x9E, 0x1C}, {0x9E, 0x1D}, {0x9E, 0x1E}, /* 0x58-0x5B */ + {0x9E, 0x24}, {0x9E, 0x27}, {0x9E, 0x2E}, {0x9E, 0x30}, /* 0x5C-0x5F */ + {0x9E, 0x34}, {0x9E, 0x3B}, {0x9E, 0x3C}, {0x9E, 0x40}, /* 0x60-0x63 */ + {0x9E, 0x4D}, {0x9E, 0x50}, {0x9E, 0x52}, {0x9E, 0x53}, /* 0x64-0x67 */ + {0x9E, 0x54}, {0x9E, 0x56}, {0x9E, 0x59}, {0x9E, 0x5D}, /* 0x68-0x6B */ + {0x9E, 0x5F}, {0x9E, 0x60}, {0x9E, 0x61}, {0x9E, 0x62}, /* 0x6C-0x6F */ + {0x9E, 0x65}, {0x9E, 0x6E}, {0x9E, 0x6F}, {0x9E, 0x72}, /* 0x70-0x73 */ + {0x9E, 0x74}, {0x9E, 0x75}, {0x9E, 0x76}, {0x9E, 0x77}, /* 0x74-0x77 */ + {0x9E, 0x78}, {0x9E, 0x79}, {0x9E, 0x7A}, {0x9E, 0x7B}, /* 0x78-0x7B */ + {0x9E, 0x7C}, {0x9E, 0x7D}, {0x9E, 0x80}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9E, 0x81}, {0x9E, 0x83}, {0x9E, 0x84}, {0x9E, 0x85}, /* 0x80-0x83 */ + {0x9E, 0x86}, {0x9E, 0x89}, {0x9E, 0x8A}, {0x9E, 0x8C}, /* 0x84-0x87 */ + {0x9E, 0x8D}, {0x9E, 0x8E}, {0x9E, 0x8F}, {0x9E, 0x90}, /* 0x88-0x8B */ + {0x9E, 0x91}, {0x9E, 0x94}, {0x9E, 0x95}, {0x9E, 0x96}, /* 0x8C-0x8F */ + {0x9E, 0x97}, {0x9E, 0x98}, {0x9E, 0x99}, {0x9E, 0x9A}, /* 0x90-0x93 */ + {0x9E, 0x9B}, {0x9E, 0x9C}, {0x9E, 0x9E}, {0x9E, 0xA0}, /* 0x94-0x97 */ + {0x9E, 0xA1}, {0x9E, 0xA2}, {0x9E, 0xA3}, {0x9E, 0xA4}, /* 0x98-0x9B */ + {0x9E, 0xA5}, {0x9E, 0xA7}, {0x9E, 0xA8}, {0x9E, 0xA9}, /* 0x9C-0x9F */ + {0x9E, 0xAA}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9E, 0xAB}, {0x9E, 0xAC}, {0x9E, 0xAD}, {0x9E, 0xAE}, /* 0x40-0x43 */ + {0x9E, 0xAF}, {0x9E, 0xB0}, {0x9E, 0xB1}, {0x9E, 0xB2}, /* 0x44-0x47 */ + {0x9E, 0xB3}, {0x9E, 0xB5}, {0x9E, 0xB6}, {0x9E, 0xB7}, /* 0x48-0x4B */ + {0x9E, 0xB9}, {0x9E, 0xBA}, {0x9E, 0xBC}, {0x9E, 0xBF}, /* 0x4C-0x4F */ + {0x9E, 0xC0}, {0x9E, 0xC1}, {0x9E, 0xC2}, {0x9E, 0xC3}, /* 0x50-0x53 */ + {0x9E, 0xC5}, {0x9E, 0xC6}, {0x9E, 0xC7}, {0x9E, 0xC8}, /* 0x54-0x57 */ + {0x9E, 0xCA}, {0x9E, 0xCB}, {0x9E, 0xCC}, {0x9E, 0xD0}, /* 0x58-0x5B */ + {0x9E, 0xD2}, {0x9E, 0xD3}, {0x9E, 0xD5}, {0x9E, 0xD6}, /* 0x5C-0x5F */ + {0x9E, 0xD7}, {0x9E, 0xD9}, {0x9E, 0xDA}, {0x9E, 0xDE}, /* 0x60-0x63 */ + {0x9E, 0xE1}, {0x9E, 0xE3}, {0x9E, 0xE4}, {0x9E, 0xE6}, /* 0x64-0x67 */ + {0x9E, 0xE8}, {0x9E, 0xEB}, {0x9E, 0xEC}, {0x9E, 0xED}, /* 0x68-0x6B */ + {0x9E, 0xEE}, {0x9E, 0xF0}, {0x9E, 0xF1}, {0x9E, 0xF2}, /* 0x6C-0x6F */ + {0x9E, 0xF3}, {0x9E, 0xF4}, {0x9E, 0xF5}, {0x9E, 0xF6}, /* 0x70-0x73 */ + {0x9E, 0xF7}, {0x9E, 0xF8}, {0x9E, 0xFA}, {0x9E, 0xFD}, /* 0x74-0x77 */ + {0x9E, 0xFF}, {0x9F, 0x00}, {0x9F, 0x01}, {0x9F, 0x02}, /* 0x78-0x7B */ + {0x9F, 0x03}, {0x9F, 0x04}, {0x9F, 0x05}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9F, 0x06}, {0x9F, 0x07}, {0x9F, 0x08}, {0x9F, 0x09}, /* 0x80-0x83 */ + {0x9F, 0x0A}, {0x9F, 0x0C}, {0x9F, 0x0F}, {0x9F, 0x11}, /* 0x84-0x87 */ + {0x9F, 0x12}, {0x9F, 0x14}, {0x9F, 0x15}, {0x9F, 0x16}, /* 0x88-0x8B */ + {0x9F, 0x18}, {0x9F, 0x1A}, {0x9F, 0x1B}, {0x9F, 0x1C}, /* 0x8C-0x8F */ + {0x9F, 0x1D}, {0x9F, 0x1E}, {0x9F, 0x1F}, {0x9F, 0x21}, /* 0x90-0x93 */ + {0x9F, 0x23}, {0x9F, 0x24}, {0x9F, 0x25}, {0x9F, 0x26}, /* 0x94-0x97 */ + {0x9F, 0x27}, {0x9F, 0x28}, {0x9F, 0x29}, {0x9F, 0x2A}, /* 0x98-0x9B */ + {0x9F, 0x2B}, {0x9F, 0x2D}, {0x9F, 0x2E}, {0x9F, 0x30}, /* 0x9C-0x9F */ + {0x9F, 0x31}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x9F, 0x32}, {0x9F, 0x33}, {0x9F, 0x34}, {0x9F, 0x35}, /* 0x40-0x43 */ + {0x9F, 0x36}, {0x9F, 0x38}, {0x9F, 0x3A}, {0x9F, 0x3C}, /* 0x44-0x47 */ + {0x9F, 0x3F}, {0x9F, 0x40}, {0x9F, 0x41}, {0x9F, 0x42}, /* 0x48-0x4B */ + {0x9F, 0x43}, {0x9F, 0x45}, {0x9F, 0x46}, {0x9F, 0x47}, /* 0x4C-0x4F */ + {0x9F, 0x48}, {0x9F, 0x49}, {0x9F, 0x4A}, {0x9F, 0x4B}, /* 0x50-0x53 */ + {0x9F, 0x4C}, {0x9F, 0x4D}, {0x9F, 0x4E}, {0x9F, 0x4F}, /* 0x54-0x57 */ + {0x9F, 0x52}, {0x9F, 0x53}, {0x9F, 0x54}, {0x9F, 0x55}, /* 0x58-0x5B */ + {0x9F, 0x56}, {0x9F, 0x57}, {0x9F, 0x58}, {0x9F, 0x59}, /* 0x5C-0x5F */ + {0x9F, 0x5A}, {0x9F, 0x5B}, {0x9F, 0x5C}, {0x9F, 0x5D}, /* 0x60-0x63 */ + {0x9F, 0x5E}, {0x9F, 0x5F}, {0x9F, 0x60}, {0x9F, 0x61}, /* 0x64-0x67 */ + {0x9F, 0x62}, {0x9F, 0x63}, {0x9F, 0x64}, {0x9F, 0x65}, /* 0x68-0x6B */ + {0x9F, 0x66}, {0x9F, 0x67}, {0x9F, 0x68}, {0x9F, 0x69}, /* 0x6C-0x6F */ + {0x9F, 0x6A}, {0x9F, 0x6B}, {0x9F, 0x6C}, {0x9F, 0x6D}, /* 0x70-0x73 */ + {0x9F, 0x6E}, {0x9F, 0x6F}, {0x9F, 0x70}, {0x9F, 0x71}, /* 0x74-0x77 */ + {0x9F, 0x72}, {0x9F, 0x73}, {0x9F, 0x74}, {0x9F, 0x75}, /* 0x78-0x7B */ + {0x9F, 0x76}, {0x9F, 0x77}, {0x9F, 0x78}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x9F, 0x79}, {0x9F, 0x7A}, {0x9F, 0x7B}, {0x9F, 0x7C}, /* 0x80-0x83 */ + {0x9F, 0x7D}, {0x9F, 0x7E}, {0x9F, 0x81}, {0x9F, 0x82}, /* 0x84-0x87 */ + {0x9F, 0x8D}, {0x9F, 0x8E}, {0x9F, 0x8F}, {0x9F, 0x90}, /* 0x88-0x8B */ + {0x9F, 0x91}, {0x9F, 0x92}, {0x9F, 0x93}, {0x9F, 0x94}, /* 0x8C-0x8F */ + {0x9F, 0x95}, {0x9F, 0x96}, {0x9F, 0x97}, {0x9F, 0x98}, /* 0x90-0x93 */ + {0x9F, 0x9C}, {0x9F, 0x9D}, {0x9F, 0x9E}, {0x9F, 0xA1}, /* 0x94-0x97 */ + {0x9F, 0xA2}, {0x9F, 0xA3}, {0x9F, 0xA4}, {0x9F, 0xA5}, /* 0x98-0x9B */ + {0xF9, 0x2C}, {0xF9, 0x79}, {0xF9, 0x95}, {0xF9, 0xE7}, /* 0x9C-0x9F */ + {0xF9, 0xF1}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0xFA, 0x0C}, {0xFA, 0x0D}, {0xFA, 0x0E}, {0xFA, 0x0F}, /* 0x40-0x43 */ + {0xFA, 0x11}, {0xFA, 0x13}, {0xFA, 0x14}, {0xFA, 0x18}, /* 0x44-0x47 */ + {0xFA, 0x1F}, {0xFA, 0x20}, {0xFA, 0x21}, {0xFA, 0x23}, /* 0x48-0x4B */ + {0xFA, 0x24}, {0xFA, 0x27}, {0xFA, 0x28}, {0xFA, 0x29}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode *page_charset2uni[256] = { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, c2u_81, c2u_82, c2u_83, c2u_84, c2u_85, c2u_86, c2u_87, + c2u_88, c2u_89, c2u_8A, c2u_8B, c2u_8C, c2u_8D, c2u_8E, c2u_8F, + c2u_90, c2u_91, c2u_92, c2u_93, c2u_94, c2u_95, c2u_96, c2u_97, + c2u_98, c2u_99, c2u_9A, c2u_9B, c2u_9C, c2u_9D, c2u_9E, c2u_9F, + c2u_A0, c2u_A1, c2u_A2, c2u_A3, c2u_A4, c2u_A5, c2u_A6, c2u_A7, + c2u_A8, c2u_A9, c2u_AA, c2u_AB, c2u_AC, c2u_AD, c2u_AE, c2u_AF, + c2u_B0, c2u_B1, c2u_B2, c2u_B3, c2u_B4, c2u_B5, c2u_B6, c2u_B7, + c2u_B8, c2u_B9, c2u_BA, c2u_BB, c2u_BC, c2u_BD, c2u_BE, c2u_BF, + c2u_C0, c2u_C1, c2u_C2, c2u_C3, c2u_C4, c2u_C5, c2u_C6, c2u_C7, + c2u_C8, c2u_C9, c2u_CA, c2u_CB, c2u_CC, c2u_CD, c2u_CE, c2u_CF, + c2u_D0, c2u_D1, c2u_D2, c2u_D3, c2u_D4, c2u_D5, c2u_D6, c2u_D7, + c2u_D8, c2u_D9, c2u_DA, c2u_DB, c2u_DC, c2u_DD, c2u_DE, c2u_DF, + c2u_E0, c2u_E1, c2u_E2, c2u_E3, c2u_E4, c2u_E5, c2u_E6, c2u_E7, + c2u_E8, c2u_E9, c2u_EA, c2u_EB, c2u_EC, c2u_ED, c2u_EE, c2u_EF, + c2u_F0, c2u_F1, c2u_F2, c2u_F3, c2u_F4, c2u_F5, c2u_F6, c2u_F7, + c2u_F8, c2u_F9, c2u_FA, c2u_FB, c2u_FC, c2u_FD, c2u_FE, NULL, +}; + +static unsigned char u2c_01[512] = { + 0x3F, 0x3F, 0xA8, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA5, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA7, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA9, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xA8, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xA8, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xA8, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xB1, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA3, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xA8, 0xAB, 0x3F, 0x3F, 0xA8, 0xAF, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xA8, 0xB3, 0x3F, 0x3F, 0xA8, 0xB5, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xA8, 0xB6, 0x3F, 0x3F, 0xA8, 0xB7, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xA8, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_02[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xA8, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xA8, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xA6, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xA1, 0xA5, 0xA8, 0x40, 0xA8, 0x41, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xA8, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_03[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xA6, 0xA1, 0xA6, 0xA2, 0xA6, 0xA3, /* 0x90-0x93 */ + 0xA6, 0xA4, 0xA6, 0xA5, 0xA6, 0xA6, 0xA6, 0xA7, /* 0x94-0x97 */ + 0xA6, 0xA8, 0xA6, 0xA9, 0xA6, 0xAA, 0xA6, 0xAB, /* 0x98-0x9B */ + 0xA6, 0xAC, 0xA6, 0xAD, 0xA6, 0xAE, 0xA6, 0xAF, /* 0x9C-0x9F */ + 0xA6, 0xB0, 0xA6, 0xB1, 0x3F, 0x3F, 0xA6, 0xB2, /* 0xA0-0xA3 */ + 0xA6, 0xB3, 0xA6, 0xB4, 0xA6, 0xB5, 0xA6, 0xB6, /* 0xA4-0xA7 */ + 0xA6, 0xB7, 0xA6, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xA6, 0xC1, 0xA6, 0xC2, 0xA6, 0xC3, /* 0xB0-0xB3 */ + 0xA6, 0xC4, 0xA6, 0xC5, 0xA6, 0xC6, 0xA6, 0xC7, /* 0xB4-0xB7 */ + 0xA6, 0xC8, 0xA6, 0xC9, 0xA6, 0xCA, 0xA6, 0xCB, /* 0xB8-0xBB */ + 0xA6, 0xCC, 0xA6, 0xCD, 0xA6, 0xCE, 0xA6, 0xCF, /* 0xBC-0xBF */ + 0xA6, 0xD0, 0xA6, 0xD1, 0x3F, 0x3F, 0xA6, 0xD2, /* 0xC0-0xC3 */ + 0xA6, 0xD3, 0xA6, 0xD4, 0xA6, 0xD5, 0xA6, 0xD6, /* 0xC4-0xC7 */ + 0xA6, 0xD7, 0xA6, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_04[512] = { + 0x3F, 0x3F, 0xA7, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xA7, 0xA1, 0xA7, 0xA2, 0xA7, 0xA3, 0xA7, 0xA4, /* 0x10-0x13 */ + 0xA7, 0xA5, 0xA7, 0xA6, 0xA7, 0xA8, 0xA7, 0xA9, /* 0x14-0x17 */ + 0xA7, 0xAA, 0xA7, 0xAB, 0xA7, 0xAC, 0xA7, 0xAD, /* 0x18-0x1B */ + 0xA7, 0xAE, 0xA7, 0xAF, 0xA7, 0xB0, 0xA7, 0xB1, /* 0x1C-0x1F */ + 0xA7, 0xB2, 0xA7, 0xB3, 0xA7, 0xB4, 0xA7, 0xB5, /* 0x20-0x23 */ + 0xA7, 0xB6, 0xA7, 0xB7, 0xA7, 0xB8, 0xA7, 0xB9, /* 0x24-0x27 */ + 0xA7, 0xBA, 0xA7, 0xBB, 0xA7, 0xBC, 0xA7, 0xBD, /* 0x28-0x2B */ + 0xA7, 0xBE, 0xA7, 0xBF, 0xA7, 0xC0, 0xA7, 0xC1, /* 0x2C-0x2F */ + 0xA7, 0xD1, 0xA7, 0xD2, 0xA7, 0xD3, 0xA7, 0xD4, /* 0x30-0x33 */ + 0xA7, 0xD5, 0xA7, 0xD6, 0xA7, 0xD8, 0xA7, 0xD9, /* 0x34-0x37 */ + 0xA7, 0xDA, 0xA7, 0xDB, 0xA7, 0xDC, 0xA7, 0xDD, /* 0x38-0x3B */ + 0xA7, 0xDE, 0xA7, 0xDF, 0xA7, 0xE0, 0xA7, 0xE1, /* 0x3C-0x3F */ + 0xA7, 0xE2, 0xA7, 0xE3, 0xA7, 0xE4, 0xA7, 0xE5, /* 0x40-0x43 */ + 0xA7, 0xE6, 0xA7, 0xE7, 0xA7, 0xE8, 0xA7, 0xE9, /* 0x44-0x47 */ + 0xA7, 0xEA, 0xA7, 0xEB, 0xA7, 0xEC, 0xA7, 0xED, /* 0x48-0x4B */ + 0xA7, 0xEE, 0xA7, 0xEF, 0xA7, 0xF0, 0xA7, 0xF1, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xA7, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_20[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xA9, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x43, /* 0x10-0x13 */ + 0xA1, 0xAA, 0xA8, 0x44, 0xA1, 0xAC, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xA1, 0xAE, 0xA1, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xA1, 0xB0, 0xA1, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xA8, 0x45, 0xA1, 0xAD, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xA1, 0xEB, 0x3F, 0x3F, 0xA1, 0xE4, 0xA1, 0xE5, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xA8, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF9, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_21[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xE6, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA8, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xA8, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xED, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xA9, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA2, 0xF1, 0xA2, 0xF2, 0xA2, 0xF3, 0xA2, 0xF4, /* 0x60-0x63 */ + 0xA2, 0xF5, 0xA2, 0xF6, 0xA2, 0xF7, 0xA2, 0xF8, /* 0x64-0x67 */ + 0xA2, 0xF9, 0xA2, 0xFA, 0xA2, 0xFB, 0xA2, 0xFC, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xA2, 0xA1, 0xA2, 0xA2, 0xA2, 0xA3, 0xA2, 0xA4, /* 0x70-0x73 */ + 0xA2, 0xA5, 0xA2, 0xA6, 0xA2, 0xA7, 0xA2, 0xA8, /* 0x74-0x77 */ + 0xA2, 0xA9, 0xA2, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xA1, 0xFB, 0xA1, 0xFC, 0xA1, 0xFA, 0xA1, 0xFD, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x49, 0xA8, 0x4A, /* 0x94-0x97 */ + 0xA8, 0x4B, 0xA8, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_22[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xA1, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xC7, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xA1, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xA8, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xCC, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xA1, 0xD8, 0xA1, 0xDE, 0xA8, 0x4E, /* 0x1C-0x1F */ + 0xA1, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x4F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xA1, 0xCE, 0x3F, 0x3F, 0xA1, 0xC4, /* 0x24-0x27 */ + 0xA1, 0xC5, 0xA1, 0xC9, 0xA1, 0xC8, 0xA1, 0xD2, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD3, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xA1, 0xE0, 0xA1, 0xDF, 0xA1, 0xC3, 0xA1, 0xCB, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xA1, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xA1, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xA1, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x50, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA1, 0xD9, 0xA1, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xA1, 0xDC, 0xA1, 0xDD, 0xA8, 0x51, 0xA8, 0x52, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xDA, 0xA1, 0xDB, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xA8, 0x92, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xA1, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xA1, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x53, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_23[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD0, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_24[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA2, 0xD9, 0xA2, 0xDA, 0xA2, 0xDB, 0xA2, 0xDC, /* 0x60-0x63 */ + 0xA2, 0xDD, 0xA2, 0xDE, 0xA2, 0xDF, 0xA2, 0xE0, /* 0x64-0x67 */ + 0xA2, 0xE1, 0xA2, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xA2, 0xC5, 0xA2, 0xC6, 0xA2, 0xC7, 0xA2, 0xC8, /* 0x74-0x77 */ + 0xA2, 0xC9, 0xA2, 0xCA, 0xA2, 0xCB, 0xA2, 0xCC, /* 0x78-0x7B */ + 0xA2, 0xCD, 0xA2, 0xCE, 0xA2, 0xCF, 0xA2, 0xD0, /* 0x7C-0x7F */ + + 0xA2, 0xD1, 0xA2, 0xD2, 0xA2, 0xD3, 0xA2, 0xD4, /* 0x80-0x83 */ + 0xA2, 0xD5, 0xA2, 0xD6, 0xA2, 0xD7, 0xA2, 0xD8, /* 0x84-0x87 */ + 0xA2, 0xB1, 0xA2, 0xB2, 0xA2, 0xB3, 0xA2, 0xB4, /* 0x88-0x8B */ + 0xA2, 0xB5, 0xA2, 0xB6, 0xA2, 0xB7, 0xA2, 0xB8, /* 0x8C-0x8F */ + 0xA2, 0xB9, 0xA2, 0xBA, 0xA2, 0xBB, 0xA2, 0xBC, /* 0x90-0x93 */ + 0xA2, 0xBD, 0xA2, 0xBE, 0xA2, 0xBF, 0xA2, 0xC0, /* 0x94-0x97 */ + 0xA2, 0xC1, 0xA2, 0xC2, 0xA2, 0xC3, 0xA2, 0xC4, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_25[512] = { + 0xA9, 0xA4, 0xA9, 0xA5, 0xA9, 0xA6, 0xA9, 0xA7, /* 0x00-0x03 */ + 0xA9, 0xA8, 0xA9, 0xA9, 0xA9, 0xAA, 0xA9, 0xAB, /* 0x04-0x07 */ + 0xA9, 0xAC, 0xA9, 0xAD, 0xA9, 0xAE, 0xA9, 0xAF, /* 0x08-0x0B */ + 0xA9, 0xB0, 0xA9, 0xB1, 0xA9, 0xB2, 0xA9, 0xB3, /* 0x0C-0x0F */ + 0xA9, 0xB4, 0xA9, 0xB5, 0xA9, 0xB6, 0xA9, 0xB7, /* 0x10-0x13 */ + 0xA9, 0xB8, 0xA9, 0xB9, 0xA9, 0xBA, 0xA9, 0xBB, /* 0x14-0x17 */ + 0xA9, 0xBC, 0xA9, 0xBD, 0xA9, 0xBE, 0xA9, 0xBF, /* 0x18-0x1B */ + 0xA9, 0xC0, 0xA9, 0xC1, 0xA9, 0xC2, 0xA9, 0xC3, /* 0x1C-0x1F */ + 0xA9, 0xC4, 0xA9, 0xC5, 0xA9, 0xC6, 0xA9, 0xC7, /* 0x20-0x23 */ + 0xA9, 0xC8, 0xA9, 0xC9, 0xA9, 0xCA, 0xA9, 0xCB, /* 0x24-0x27 */ + 0xA9, 0xCC, 0xA9, 0xCD, 0xA9, 0xCE, 0xA9, 0xCF, /* 0x28-0x2B */ + 0xA9, 0xD0, 0xA9, 0xD1, 0xA9, 0xD2, 0xA9, 0xD3, /* 0x2C-0x2F */ + 0xA9, 0xD4, 0xA9, 0xD5, 0xA9, 0xD6, 0xA9, 0xD7, /* 0x30-0x33 */ + 0xA9, 0xD8, 0xA9, 0xD9, 0xA9, 0xDA, 0xA9, 0xDB, /* 0x34-0x37 */ + 0xA9, 0xDC, 0xA9, 0xDD, 0xA9, 0xDE, 0xA9, 0xDF, /* 0x38-0x3B */ + 0xA9, 0xE0, 0xA9, 0xE1, 0xA9, 0xE2, 0xA9, 0xE3, /* 0x3C-0x3F */ + 0xA9, 0xE4, 0xA9, 0xE5, 0xA9, 0xE6, 0xA9, 0xE7, /* 0x40-0x43 */ + 0xA9, 0xE8, 0xA9, 0xE9, 0xA9, 0xEA, 0xA9, 0xEB, /* 0x44-0x47 */ + 0xA9, 0xEC, 0xA9, 0xED, 0xA9, 0xEE, 0xA9, 0xEF, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xA8, 0x54, 0xA8, 0x55, 0xA8, 0x56, 0xA8, 0x57, /* 0x50-0x53 */ + 0xA8, 0x58, 0xA8, 0x59, 0xA8, 0x5A, 0xA8, 0x5B, /* 0x54-0x57 */ + 0xA8, 0x5C, 0xA8, 0x5D, 0xA8, 0x5E, 0xA8, 0x5F, /* 0x58-0x5B */ + 0xA8, 0x60, 0xA8, 0x61, 0xA8, 0x62, 0xA8, 0x63, /* 0x5C-0x5F */ + 0xA8, 0x64, 0xA8, 0x65, 0xA8, 0x66, 0xA8, 0x67, /* 0x60-0x63 */ + 0xA8, 0x68, 0xA8, 0x69, 0xA8, 0x6A, 0xA8, 0x6B, /* 0x64-0x67 */ + 0xA8, 0x6C, 0xA8, 0x6D, 0xA8, 0x6E, 0xA8, 0x6F, /* 0x68-0x6B */ + 0xA8, 0x70, 0xA8, 0x71, 0xA8, 0x72, 0xA8, 0x73, /* 0x6C-0x6F */ + 0xA8, 0x74, 0xA8, 0x75, 0xA8, 0x76, 0xA8, 0x77, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xA8, 0x78, 0xA8, 0x79, 0xA8, 0x7A, /* 0x80-0x83 */ + 0xA8, 0x7B, 0xA8, 0x7C, 0xA8, 0x7D, 0xA8, 0x7E, /* 0x84-0x87 */ + 0xA8, 0x80, 0xA8, 0x81, 0xA8, 0x82, 0xA8, 0x83, /* 0x88-0x8B */ + 0xA8, 0x84, 0xA8, 0x85, 0xA8, 0x86, 0xA8, 0x87, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x88, /* 0x90-0x93 */ + 0xA8, 0x89, 0xA8, 0x8A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xA1, 0xF6, 0xA1, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF8, 0xA1, 0xF7, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xA8, 0x8B, 0xA8, 0x8C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF4, 0xA1, 0xF3, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF0, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF2, 0xA1, 0xF1, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x8D, 0xA8, 0x8E, /* 0xE0-0xE3 */ + 0xA8, 0x8F, 0xA8, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_26[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA1, 0xEF, 0xA1, 0xEE, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xA8, 0x91, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xA1, 0xE2, 0x3F, 0x3F, 0xA1, 0xE1, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_30[512] = { + 0xA1, 0xA1, 0xA1, 0xA2, 0xA1, 0xA3, 0xA1, 0xA8, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA1, 0xA9, 0xA9, 0x65, 0xA9, 0x96, /* 0x04-0x07 */ + 0xA1, 0xB4, 0xA1, 0xB5, 0xA1, 0xB6, 0xA1, 0xB7, /* 0x08-0x0B */ + 0xA1, 0xB8, 0xA1, 0xB9, 0xA1, 0xBA, 0xA1, 0xBB, /* 0x0C-0x0F */ + 0xA1, 0xBE, 0xA1, 0xBF, 0xA8, 0x93, 0xA1, 0xFE, /* 0x10-0x13 */ + 0xA1, 0xB2, 0xA1, 0xB3, 0xA1, 0xBC, 0xA1, 0xBD, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xA8, 0x94, 0xA8, 0x95, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xA9, 0x40, 0xA9, 0x41, 0xA9, 0x42, /* 0x20-0x23 */ + 0xA9, 0x43, 0xA9, 0x44, 0xA9, 0x45, 0xA9, 0x46, /* 0x24-0x27 */ + 0xA9, 0x47, 0xA9, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xA4, 0xA1, 0xA4, 0xA2, 0xA4, 0xA3, /* 0x40-0x43 */ + 0xA4, 0xA4, 0xA4, 0xA5, 0xA4, 0xA6, 0xA4, 0xA7, /* 0x44-0x47 */ + 0xA4, 0xA8, 0xA4, 0xA9, 0xA4, 0xAA, 0xA4, 0xAB, /* 0x48-0x4B */ + 0xA4, 0xAC, 0xA4, 0xAD, 0xA4, 0xAE, 0xA4, 0xAF, /* 0x4C-0x4F */ + 0xA4, 0xB0, 0xA4, 0xB1, 0xA4, 0xB2, 0xA4, 0xB3, /* 0x50-0x53 */ + 0xA4, 0xB4, 0xA4, 0xB5, 0xA4, 0xB6, 0xA4, 0xB7, /* 0x54-0x57 */ + 0xA4, 0xB8, 0xA4, 0xB9, 0xA4, 0xBA, 0xA4, 0xBB, /* 0x58-0x5B */ + 0xA4, 0xBC, 0xA4, 0xBD, 0xA4, 0xBE, 0xA4, 0xBF, /* 0x5C-0x5F */ + 0xA4, 0xC0, 0xA4, 0xC1, 0xA4, 0xC2, 0xA4, 0xC3, /* 0x60-0x63 */ + 0xA4, 0xC4, 0xA4, 0xC5, 0xA4, 0xC6, 0xA4, 0xC7, /* 0x64-0x67 */ + 0xA4, 0xC8, 0xA4, 0xC9, 0xA4, 0xCA, 0xA4, 0xCB, /* 0x68-0x6B */ + 0xA4, 0xCC, 0xA4, 0xCD, 0xA4, 0xCE, 0xA4, 0xCF, /* 0x6C-0x6F */ + 0xA4, 0xD0, 0xA4, 0xD1, 0xA4, 0xD2, 0xA4, 0xD3, /* 0x70-0x73 */ + 0xA4, 0xD4, 0xA4, 0xD5, 0xA4, 0xD6, 0xA4, 0xD7, /* 0x74-0x77 */ + 0xA4, 0xD8, 0xA4, 0xD9, 0xA4, 0xDA, 0xA4, 0xDB, /* 0x78-0x7B */ + 0xA4, 0xDC, 0xA4, 0xDD, 0xA4, 0xDE, 0xA4, 0xDF, /* 0x7C-0x7F */ + + 0xA4, 0xE0, 0xA4, 0xE1, 0xA4, 0xE2, 0xA4, 0xE3, /* 0x80-0x83 */ + 0xA4, 0xE4, 0xA4, 0xE5, 0xA4, 0xE6, 0xA4, 0xE7, /* 0x84-0x87 */ + 0xA4, 0xE8, 0xA4, 0xE9, 0xA4, 0xEA, 0xA4, 0xEB, /* 0x88-0x8B */ + 0xA4, 0xEC, 0xA4, 0xED, 0xA4, 0xEE, 0xA4, 0xEF, /* 0x8C-0x8F */ + 0xA4, 0xF0, 0xA4, 0xF1, 0xA4, 0xF2, 0xA4, 0xF3, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0x61, /* 0x98-0x9B */ + 0xA9, 0x62, 0xA9, 0x66, 0xA9, 0x67, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xA5, 0xA1, 0xA5, 0xA2, 0xA5, 0xA3, /* 0xA0-0xA3 */ + 0xA5, 0xA4, 0xA5, 0xA5, 0xA5, 0xA6, 0xA5, 0xA7, /* 0xA4-0xA7 */ + 0xA5, 0xA8, 0xA5, 0xA9, 0xA5, 0xAA, 0xA5, 0xAB, /* 0xA8-0xAB */ + 0xA5, 0xAC, 0xA5, 0xAD, 0xA5, 0xAE, 0xA5, 0xAF, /* 0xAC-0xAF */ + 0xA5, 0xB0, 0xA5, 0xB1, 0xA5, 0xB2, 0xA5, 0xB3, /* 0xB0-0xB3 */ + 0xA5, 0xB4, 0xA5, 0xB5, 0xA5, 0xB6, 0xA5, 0xB7, /* 0xB4-0xB7 */ + 0xA5, 0xB8, 0xA5, 0xB9, 0xA5, 0xBA, 0xA5, 0xBB, /* 0xB8-0xBB */ + 0xA5, 0xBC, 0xA5, 0xBD, 0xA5, 0xBE, 0xA5, 0xBF, /* 0xBC-0xBF */ + 0xA5, 0xC0, 0xA5, 0xC1, 0xA5, 0xC2, 0xA5, 0xC3, /* 0xC0-0xC3 */ + 0xA5, 0xC4, 0xA5, 0xC5, 0xA5, 0xC6, 0xA5, 0xC7, /* 0xC4-0xC7 */ + 0xA5, 0xC8, 0xA5, 0xC9, 0xA5, 0xCA, 0xA5, 0xCB, /* 0xC8-0xCB */ + 0xA5, 0xCC, 0xA5, 0xCD, 0xA5, 0xCE, 0xA5, 0xCF, /* 0xCC-0xCF */ + 0xA5, 0xD0, 0xA5, 0xD1, 0xA5, 0xD2, 0xA5, 0xD3, /* 0xD0-0xD3 */ + 0xA5, 0xD4, 0xA5, 0xD5, 0xA5, 0xD6, 0xA5, 0xD7, /* 0xD4-0xD7 */ + 0xA5, 0xD8, 0xA5, 0xD9, 0xA5, 0xDA, 0xA5, 0xDB, /* 0xD8-0xDB */ + 0xA5, 0xDC, 0xA5, 0xDD, 0xA5, 0xDE, 0xA5, 0xDF, /* 0xDC-0xDF */ + 0xA5, 0xE0, 0xA5, 0xE1, 0xA5, 0xE2, 0xA5, 0xE3, /* 0xE0-0xE3 */ + 0xA5, 0xE4, 0xA5, 0xE5, 0xA5, 0xE6, 0xA5, 0xE7, /* 0xE4-0xE7 */ + 0xA5, 0xE8, 0xA5, 0xE9, 0xA5, 0xEA, 0xA5, 0xEB, /* 0xE8-0xEB */ + 0xA5, 0xEC, 0xA5, 0xED, 0xA5, 0xEE, 0xA5, 0xEF, /* 0xEC-0xEF */ + 0xA5, 0xF0, 0xA5, 0xF1, 0xA5, 0xF2, 0xA5, 0xF3, /* 0xF0-0xF3 */ + 0xA5, 0xF4, 0xA5, 0xF5, 0xA5, 0xF6, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xA9, 0x60, 0xA9, 0x63, 0xA9, 0x64, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_31[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA8, 0xC5, 0xA8, 0xC6, 0xA8, 0xC7, /* 0x04-0x07 */ + 0xA8, 0xC8, 0xA8, 0xC9, 0xA8, 0xCA, 0xA8, 0xCB, /* 0x08-0x0B */ + 0xA8, 0xCC, 0xA8, 0xCD, 0xA8, 0xCE, 0xA8, 0xCF, /* 0x0C-0x0F */ + 0xA8, 0xD0, 0xA8, 0xD1, 0xA8, 0xD2, 0xA8, 0xD3, /* 0x10-0x13 */ + 0xA8, 0xD4, 0xA8, 0xD5, 0xA8, 0xD6, 0xA8, 0xD7, /* 0x14-0x17 */ + 0xA8, 0xD8, 0xA8, 0xD9, 0xA8, 0xDA, 0xA8, 0xDB, /* 0x18-0x1B */ + 0xA8, 0xDC, 0xA8, 0xDD, 0xA8, 0xDE, 0xA8, 0xDF, /* 0x1C-0x1F */ + 0xA8, 0xE0, 0xA8, 0xE1, 0xA8, 0xE2, 0xA8, 0xE3, /* 0x20-0x23 */ + 0xA8, 0xE4, 0xA8, 0xE5, 0xA8, 0xE6, 0xA8, 0xE7, /* 0x24-0x27 */ + 0xA8, 0xE8, 0xA8, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_32[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xA2, 0xE5, 0xA2, 0xE6, 0xA2, 0xE7, 0xA2, 0xE8, /* 0x20-0x23 */ + 0xA2, 0xE9, 0xA2, 0xEA, 0xA2, 0xEB, 0xA2, 0xEC, /* 0x24-0x27 */ + 0xA2, 0xED, 0xA2, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xA9, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0x49, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_33[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0x4A, 0xA9, 0x4B, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xA9, 0x4C, 0xA9, 0x4D, 0xA9, 0x4E, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xA9, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xA9, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0x51, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xA9, 0x52, 0xA9, 0x53, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xA9, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_4E[512] = { + 0xD2, 0xBB, 0xB6, 0xA1, 0x81, 0x40, 0xC6, 0xDF, /* 0x00-0x03 */ + 0x81, 0x41, 0x81, 0x42, 0x81, 0x43, 0xCD, 0xF2, /* 0x04-0x07 */ + 0xD5, 0xC9, 0xC8, 0xFD, 0xC9, 0xCF, 0xCF, 0xC2, /* 0x08-0x0B */ + 0xD8, 0xA2, 0xB2, 0xBB, 0xD3, 0xEB, 0x81, 0x44, /* 0x0C-0x0F */ + 0xD8, 0xA4, 0xB3, 0xF3, 0x81, 0x45, 0xD7, 0xA8, /* 0x10-0x13 */ + 0xC7, 0xD2, 0xD8, 0xA7, 0xCA, 0xC0, 0x81, 0x46, /* 0x14-0x17 */ + 0xC7, 0xF0, 0xB1, 0xFB, 0xD2, 0xB5, 0xB4, 0xD4, /* 0x18-0x1B */ + 0xB6, 0xAB, 0xCB, 0xBF, 0xD8, 0xA9, 0x81, 0x47, /* 0x1C-0x1F */ + 0x81, 0x48, 0x81, 0x49, 0xB6, 0xAA, 0x81, 0x4A, /* 0x20-0x23 */ + 0xC1, 0xBD, 0xD1, 0xCF, 0x81, 0x4B, 0xC9, 0xA5, /* 0x24-0x27 */ + 0xD8, 0xAD, 0x81, 0x4C, 0xB8, 0xF6, 0xD1, 0xBE, /* 0x28-0x2B */ + 0xE3, 0xDC, 0xD6, 0xD0, 0x81, 0x4D, 0x81, 0x4E, /* 0x2C-0x2F */ + 0xB7, 0xE1, 0x81, 0x4F, 0xB4, 0xAE, 0x81, 0x50, /* 0x30-0x33 */ + 0xC1, 0xD9, 0x81, 0x51, 0xD8, 0xBC, 0x81, 0x52, /* 0x34-0x37 */ + 0xCD, 0xE8, 0xB5, 0xA4, 0xCE, 0xAA, 0xD6, 0xF7, /* 0x38-0x3B */ + 0x81, 0x53, 0xC0, 0xF6, 0xBE, 0xD9, 0xD8, 0xAF, /* 0x3C-0x3F */ + 0x81, 0x54, 0x81, 0x55, 0x81, 0x56, 0xC4, 0xCB, /* 0x40-0x43 */ + 0x81, 0x57, 0xBE, 0xC3, 0x81, 0x58, 0xD8, 0xB1, /* 0x44-0x47 */ + 0xC3, 0xB4, 0xD2, 0xE5, 0x81, 0x59, 0xD6, 0xAE, /* 0x48-0x4B */ + 0xCE, 0xDA, 0xD5, 0xA7, 0xBA, 0xF5, 0xB7, 0xA6, /* 0x4C-0x4F */ + 0xC0, 0xD6, 0x81, 0x5A, 0xC6, 0xB9, 0xC5, 0xD2, /* 0x50-0x53 */ + 0xC7, 0xC7, 0x81, 0x5B, 0xB9, 0xD4, 0x81, 0x5C, /* 0x54-0x57 */ + 0xB3, 0xCB, 0xD2, 0xD2, 0x81, 0x5D, 0x81, 0x5E, /* 0x58-0x5B */ + 0xD8, 0xBF, 0xBE, 0xC5, 0xC6, 0xF2, 0xD2, 0xB2, /* 0x5C-0x5F */ + 0xCF, 0xB0, 0xCF, 0xE7, 0x81, 0x5F, 0x81, 0x60, /* 0x60-0x63 */ + 0x81, 0x61, 0x81, 0x62, 0xCA, 0xE9, 0x81, 0x63, /* 0x64-0x67 */ + 0x81, 0x64, 0xD8, 0xC0, 0x81, 0x65, 0x81, 0x66, /* 0x68-0x6B */ + 0x81, 0x67, 0x81, 0x68, 0x81, 0x69, 0x81, 0x6A, /* 0x6C-0x6F */ + 0xC2, 0xF2, 0xC2, 0xD2, 0x81, 0x6B, 0xC8, 0xE9, /* 0x70-0x73 */ + 0x81, 0x6C, 0x81, 0x6D, 0x81, 0x6E, 0x81, 0x6F, /* 0x74-0x77 */ + 0x81, 0x70, 0x81, 0x71, 0x81, 0x72, 0x81, 0x73, /* 0x78-0x7B */ + 0x81, 0x74, 0x81, 0x75, 0xC7, 0xAC, 0x81, 0x76, /* 0x7C-0x7F */ + + 0x81, 0x77, 0x81, 0x78, 0x81, 0x79, 0x81, 0x7A, /* 0x80-0x83 */ + 0x81, 0x7B, 0x81, 0x7C, 0xC1, 0xCB, 0x81, 0x7D, /* 0x84-0x87 */ + 0xD3, 0xE8, 0xD5, 0xF9, 0x81, 0x7E, 0xCA, 0xC2, /* 0x88-0x8B */ + 0xB6, 0xFE, 0xD8, 0xA1, 0xD3, 0xDA, 0xBF, 0xF7, /* 0x8C-0x8F */ + 0x81, 0x80, 0xD4, 0xC6, 0xBB, 0xA5, 0xD8, 0xC1, /* 0x90-0x93 */ + 0xCE, 0xE5, 0xBE, 0xAE, 0x81, 0x81, 0x81, 0x82, /* 0x94-0x97 */ + 0xD8, 0xA8, 0x81, 0x83, 0xD1, 0xC7, 0xD0, 0xA9, /* 0x98-0x9B */ + 0x81, 0x84, 0x81, 0x85, 0x81, 0x86, 0xD8, 0xBD, /* 0x9C-0x9F */ + 0xD9, 0xEF, 0xCD, 0xF6, 0xBF, 0xBA, 0x81, 0x87, /* 0xA0-0xA3 */ + 0xBD, 0xBB, 0xBA, 0xA5, 0xD2, 0xE0, 0xB2, 0xFA, /* 0xA4-0xA7 */ + 0xBA, 0xE0, 0xC4, 0xB6, 0x81, 0x88, 0xCF, 0xED, /* 0xA8-0xAB */ + 0xBE, 0xA9, 0xCD, 0xA4, 0xC1, 0xC1, 0x81, 0x89, /* 0xAC-0xAF */ + 0x81, 0x8A, 0x81, 0x8B, 0xC7, 0xD7, 0xD9, 0xF1, /* 0xB0-0xB3 */ + 0x81, 0x8C, 0xD9, 0xF4, 0x81, 0x8D, 0x81, 0x8E, /* 0xB4-0xB7 */ + 0x81, 0x8F, 0x81, 0x90, 0xC8, 0xCB, 0xD8, 0xE9, /* 0xB8-0xBB */ + 0x81, 0x91, 0x81, 0x92, 0x81, 0x93, 0xD2, 0xDA, /* 0xBC-0xBF */ + 0xCA, 0xB2, 0xC8, 0xCA, 0xD8, 0xEC, 0xD8, 0xEA, /* 0xC0-0xC3 */ + 0xD8, 0xC6, 0xBD, 0xF6, 0xC6, 0xCD, 0xB3, 0xF0, /* 0xC4-0xC7 */ + 0x81, 0x94, 0xD8, 0xEB, 0xBD, 0xF1, 0xBD, 0xE9, /* 0xC8-0xCB */ + 0x81, 0x95, 0xC8, 0xD4, 0xB4, 0xD3, 0x81, 0x96, /* 0xCC-0xCF */ + 0x81, 0x97, 0xC2, 0xD8, 0x81, 0x98, 0xB2, 0xD6, /* 0xD0-0xD3 */ + 0xD7, 0xD0, 0xCA, 0xCB, 0xCB, 0xFB, 0xD5, 0xCC, /* 0xD4-0xD7 */ + 0xB8, 0xB6, 0xCF, 0xC9, 0x81, 0x99, 0x81, 0x9A, /* 0xD8-0xDB */ + 0x81, 0x9B, 0xD9, 0xDA, 0xD8, 0xF0, 0xC7, 0xAA, /* 0xDC-0xDF */ + 0x81, 0x9C, 0xD8, 0xEE, 0x81, 0x9D, 0xB4, 0xFA, /* 0xE0-0xE3 */ + 0xC1, 0xEE, 0xD2, 0xD4, 0x81, 0x9E, 0x81, 0x9F, /* 0xE4-0xE7 */ + 0xD8, 0xED, 0x81, 0xA0, 0xD2, 0xC7, 0xD8, 0xEF, /* 0xE8-0xEB */ + 0xC3, 0xC7, 0x81, 0xA1, 0x81, 0xA2, 0x81, 0xA3, /* 0xEC-0xEF */ + 0xD1, 0xF6, 0x81, 0xA4, 0xD6, 0xD9, 0xD8, 0xF2, /* 0xF0-0xF3 */ + 0x81, 0xA5, 0xD8, 0xF5, 0xBC, 0xFE, 0xBC, 0xDB, /* 0xF4-0xF7 */ + 0x81, 0xA6, 0x81, 0xA7, 0x81, 0xA8, 0xC8, 0xCE, /* 0xF8-0xFB */ + 0x81, 0xA9, 0xB7, 0xDD, 0x81, 0xAA, 0xB7, 0xC2, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_4F[512] = { + 0x81, 0xAB, 0xC6, 0xF3, 0x81, 0xAC, 0x81, 0xAD, /* 0x00-0x03 */ + 0x81, 0xAE, 0x81, 0xAF, 0x81, 0xB0, 0x81, 0xB1, /* 0x04-0x07 */ + 0x81, 0xB2, 0xD8, 0xF8, 0xD2, 0xC1, 0x81, 0xB3, /* 0x08-0x0B */ + 0x81, 0xB4, 0xCE, 0xE9, 0xBC, 0xBF, 0xB7, 0xFC, /* 0x0C-0x0F */ + 0xB7, 0xA5, 0xD0, 0xDD, 0x81, 0xB5, 0x81, 0xB6, /* 0x10-0x13 */ + 0x81, 0xB7, 0x81, 0xB8, 0x81, 0xB9, 0xD6, 0xDA, /* 0x14-0x17 */ + 0xD3, 0xC5, 0xBB, 0xEF, 0xBB, 0xE1, 0xD8, 0xF1, /* 0x18-0x1B */ + 0x81, 0xBA, 0x81, 0xBB, 0xC9, 0xA1, 0xCE, 0xB0, /* 0x1C-0x1F */ + 0xB4, 0xAB, 0x81, 0xBC, 0xD8, 0xF3, 0x81, 0xBD, /* 0x20-0x23 */ + 0xC9, 0xCB, 0xD8, 0xF6, 0xC2, 0xD7, 0xD8, 0xF7, /* 0x24-0x27 */ + 0x81, 0xBE, 0x81, 0xBF, 0xCE, 0xB1, 0xD8, 0xF9, /* 0x28-0x2B */ + 0x81, 0xC0, 0x81, 0xC1, 0x81, 0xC2, 0xB2, 0xAE, /* 0x2C-0x2F */ + 0xB9, 0xC0, 0x81, 0xC3, 0xD9, 0xA3, 0x81, 0xC4, /* 0x30-0x33 */ + 0xB0, 0xE9, 0x81, 0xC5, 0xC1, 0xE6, 0x81, 0xC6, /* 0x34-0x37 */ + 0xC9, 0xEC, 0x81, 0xC7, 0xCB, 0xC5, 0x81, 0xC8, /* 0x38-0x3B */ + 0xCB, 0xC6, 0xD9, 0xA4, 0x81, 0xC9, 0x81, 0xCA, /* 0x3C-0x3F */ + 0x81, 0xCB, 0x81, 0xCC, 0x81, 0xCD, 0xB5, 0xE8, /* 0x40-0x43 */ + 0x81, 0xCE, 0x81, 0xCF, 0xB5, 0xAB, 0x81, 0xD0, /* 0x44-0x47 */ + 0x81, 0xD1, 0x81, 0xD2, 0x81, 0xD3, 0x81, 0xD4, /* 0x48-0x4B */ + 0x81, 0xD5, 0xCE, 0xBB, 0xB5, 0xCD, 0xD7, 0xA1, /* 0x4C-0x4F */ + 0xD7, 0xF4, 0xD3, 0xD3, 0x81, 0xD6, 0xCC, 0xE5, /* 0x50-0x53 */ + 0x81, 0xD7, 0xBA, 0xCE, 0x81, 0xD8, 0xD9, 0xA2, /* 0x54-0x57 */ + 0xD9, 0xDC, 0xD3, 0xE0, 0xD8, 0xFD, 0xB7, 0xF0, /* 0x58-0x5B */ + 0xD7, 0xF7, 0xD8, 0xFE, 0xD8, 0xFA, 0xD9, 0xA1, /* 0x5C-0x5F */ + 0xC4, 0xE3, 0x81, 0xD9, 0x81, 0xDA, 0xD3, 0xB6, /* 0x60-0x63 */ + 0xD8, 0xF4, 0xD9, 0xDD, 0x81, 0xDB, 0xD8, 0xFB, /* 0x64-0x67 */ + 0x81, 0xDC, 0xC5, 0xE5, 0x81, 0xDD, 0x81, 0xDE, /* 0x68-0x6B */ + 0xC0, 0xD0, 0x81, 0xDF, 0x81, 0xE0, 0xD1, 0xF0, /* 0x6C-0x6F */ + 0xB0, 0xDB, 0x81, 0xE1, 0x81, 0xE2, 0xBC, 0xD1, /* 0x70-0x73 */ + 0xD9, 0xA6, 0x81, 0xE3, 0xD9, 0xA5, 0x81, 0xE4, /* 0x74-0x77 */ + 0x81, 0xE5, 0x81, 0xE6, 0x81, 0xE7, 0xD9, 0xAC, /* 0x78-0x7B */ + 0xD9, 0xAE, 0x81, 0xE8, 0xD9, 0xAB, 0xCA, 0xB9, /* 0x7C-0x7F */ + + 0x81, 0xE9, 0x81, 0xEA, 0x81, 0xEB, 0xD9, 0xA9, /* 0x80-0x83 */ + 0xD6, 0xB6, 0x81, 0xEC, 0x81, 0xED, 0x81, 0xEE, /* 0x84-0x87 */ + 0xB3, 0xDE, 0xD9, 0xA8, 0x81, 0xEF, 0xC0, 0xFD, /* 0x88-0x8B */ + 0x81, 0xF0, 0xCA, 0xCC, 0x81, 0xF1, 0xD9, 0xAA, /* 0x8C-0x8F */ + 0x81, 0xF2, 0xD9, 0xA7, 0x81, 0xF3, 0x81, 0xF4, /* 0x90-0x93 */ + 0xD9, 0xB0, 0x81, 0xF5, 0x81, 0xF6, 0xB6, 0xB1, /* 0x94-0x97 */ + 0x81, 0xF7, 0x81, 0xF8, 0x81, 0xF9, 0xB9, 0xA9, /* 0x98-0x9B */ + 0x81, 0xFA, 0xD2, 0xC0, 0x81, 0xFB, 0x81, 0xFC, /* 0x9C-0x9F */ + 0xCF, 0xC0, 0x81, 0xFD, 0x81, 0xFE, 0xC2, 0xC2, /* 0xA0-0xA3 */ + 0x82, 0x40, 0xBD, 0xC4, 0xD5, 0xEC, 0xB2, 0xE0, /* 0xA4-0xA7 */ + 0xC7, 0xC8, 0xBF, 0xEB, 0xD9, 0xAD, 0x82, 0x41, /* 0xA8-0xAB */ + 0xD9, 0xAF, 0x82, 0x42, 0xCE, 0xEA, 0xBA, 0xEE, /* 0xAC-0xAF */ + 0x82, 0x43, 0x82, 0x44, 0x82, 0x45, 0x82, 0x46, /* 0xB0-0xB3 */ + 0x82, 0x47, 0xC7, 0xD6, 0x82, 0x48, 0x82, 0x49, /* 0xB4-0xB7 */ + 0x82, 0x4A, 0x82, 0x4B, 0x82, 0x4C, 0x82, 0x4D, /* 0xB8-0xBB */ + 0x82, 0x4E, 0x82, 0x4F, 0x82, 0x50, 0xB1, 0xE3, /* 0xBC-0xBF */ + 0x82, 0x51, 0x82, 0x52, 0x82, 0x53, 0xB4, 0xD9, /* 0xC0-0xC3 */ + 0xB6, 0xED, 0xD9, 0xB4, 0x82, 0x54, 0x82, 0x55, /* 0xC4-0xC7 */ + 0x82, 0x56, 0x82, 0x57, 0xBF, 0xA1, 0x82, 0x58, /* 0xC8-0xCB */ + 0x82, 0x59, 0x82, 0x5A, 0xD9, 0xDE, 0xC7, 0xCE, /* 0xCC-0xCF */ + 0xC0, 0xFE, 0xD9, 0xB8, 0x82, 0x5B, 0x82, 0x5C, /* 0xD0-0xD3 */ + 0x82, 0x5D, 0x82, 0x5E, 0x82, 0x5F, 0xCB, 0xD7, /* 0xD4-0xD7 */ + 0xB7, 0xFD, 0x82, 0x60, 0xD9, 0xB5, 0x82, 0x61, /* 0xD8-0xDB */ + 0xD9, 0xB7, 0xB1, 0xA3, 0xD3, 0xE1, 0xD9, 0xB9, /* 0xDC-0xDF */ + 0x82, 0x62, 0xD0, 0xC5, 0x82, 0x63, 0xD9, 0xB6, /* 0xE0-0xE3 */ + 0x82, 0x64, 0x82, 0x65, 0xD9, 0xB1, 0x82, 0x66, /* 0xE4-0xE7 */ + 0xD9, 0xB2, 0xC1, 0xA9, 0xD9, 0xB3, 0x82, 0x67, /* 0xE8-0xEB */ + 0x82, 0x68, 0xBC, 0xF3, 0xD0, 0xDE, 0xB8, 0xA9, /* 0xEC-0xEF */ + 0x82, 0x69, 0xBE, 0xE3, 0x82, 0x6A, 0xD9, 0xBD, /* 0xF0-0xF3 */ + 0x82, 0x6B, 0x82, 0x6C, 0x82, 0x6D, 0x82, 0x6E, /* 0xF4-0xF7 */ + 0xD9, 0xBA, 0x82, 0x6F, 0xB0, 0xB3, 0x82, 0x70, /* 0xF8-0xFB */ + 0x82, 0x71, 0x82, 0x72, 0xD9, 0xC2, 0x82, 0x73, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_50[512] = { + 0x82, 0x74, 0x82, 0x75, 0x82, 0x76, 0x82, 0x77, /* 0x00-0x03 */ + 0x82, 0x78, 0x82, 0x79, 0x82, 0x7A, 0x82, 0x7B, /* 0x04-0x07 */ + 0x82, 0x7C, 0x82, 0x7D, 0x82, 0x7E, 0x82, 0x80, /* 0x08-0x0B */ + 0xD9, 0xC4, 0xB1, 0xB6, 0x82, 0x81, 0xD9, 0xBF, /* 0x0C-0x0F */ + 0x82, 0x82, 0x82, 0x83, 0xB5, 0xB9, 0x82, 0x84, /* 0x10-0x13 */ + 0xBE, 0xF3, 0x82, 0x85, 0x82, 0x86, 0x82, 0x87, /* 0x14-0x17 */ + 0xCC, 0xC8, 0xBA, 0xF2, 0xD2, 0xD0, 0x82, 0x88, /* 0x18-0x1B */ + 0xD9, 0xC3, 0x82, 0x89, 0x82, 0x8A, 0xBD, 0xE8, /* 0x1C-0x1F */ + 0x82, 0x8B, 0xB3, 0xAB, 0x82, 0x8C, 0x82, 0x8D, /* 0x20-0x23 */ + 0x82, 0x8E, 0xD9, 0xC5, 0xBE, 0xEB, 0x82, 0x8F, /* 0x24-0x27 */ + 0xD9, 0xC6, 0xD9, 0xBB, 0xC4, 0xDF, 0x82, 0x90, /* 0x28-0x2B */ + 0xD9, 0xBE, 0xD9, 0xC1, 0xD9, 0xC0, 0x82, 0x91, /* 0x2C-0x2F */ + 0x82, 0x92, 0x82, 0x93, 0x82, 0x94, 0x82, 0x95, /* 0x30-0x33 */ + 0x82, 0x96, 0x82, 0x97, 0x82, 0x98, 0x82, 0x99, /* 0x34-0x37 */ + 0x82, 0x9A, 0x82, 0x9B, 0xD5, 0xAE, 0x82, 0x9C, /* 0x38-0x3B */ + 0xD6, 0xB5, 0x82, 0x9D, 0xC7, 0xE3, 0x82, 0x9E, /* 0x3C-0x3F */ + 0x82, 0x9F, 0x82, 0xA0, 0x82, 0xA1, 0xD9, 0xC8, /* 0x40-0x43 */ + 0x82, 0xA2, 0x82, 0xA3, 0x82, 0xA4, 0xBC, 0xD9, /* 0x44-0x47 */ + 0xD9, 0xCA, 0x82, 0xA5, 0x82, 0xA6, 0x82, 0xA7, /* 0x48-0x4B */ + 0xD9, 0xBC, 0x82, 0xA8, 0xD9, 0xCB, 0xC6, 0xAB, /* 0x4C-0x4F */ + 0x82, 0xA9, 0x82, 0xAA, 0x82, 0xAB, 0x82, 0xAC, /* 0x50-0x53 */ + 0x82, 0xAD, 0xD9, 0xC9, 0x82, 0xAE, 0x82, 0xAF, /* 0x54-0x57 */ + 0x82, 0xB0, 0x82, 0xB1, 0xD7, 0xF6, 0x82, 0xB2, /* 0x58-0x5B */ + 0xCD, 0xA3, 0x82, 0xB3, 0x82, 0xB4, 0x82, 0xB5, /* 0x5C-0x5F */ + 0x82, 0xB6, 0x82, 0xB7, 0x82, 0xB8, 0x82, 0xB9, /* 0x60-0x63 */ + 0x82, 0xBA, 0xBD, 0xA1, 0x82, 0xBB, 0x82, 0xBC, /* 0x64-0x67 */ + 0x82, 0xBD, 0x82, 0xBE, 0x82, 0xBF, 0x82, 0xC0, /* 0x68-0x6B */ + 0xD9, 0xCC, 0x82, 0xC1, 0x82, 0xC2, 0x82, 0xC3, /* 0x6C-0x6F */ + 0x82, 0xC4, 0x82, 0xC5, 0x82, 0xC6, 0x82, 0xC7, /* 0x70-0x73 */ + 0x82, 0xC8, 0x82, 0xC9, 0xC5, 0xBC, 0xCD, 0xB5, /* 0x74-0x77 */ + 0x82, 0xCA, 0x82, 0xCB, 0x82, 0xCC, 0xD9, 0xCD, /* 0x78-0x7B */ + 0x82, 0xCD, 0x82, 0xCE, 0xD9, 0xC7, 0xB3, 0xA5, /* 0x7C-0x7F */ + + 0xBF, 0xFE, 0x82, 0xCF, 0x82, 0xD0, 0x82, 0xD1, /* 0x80-0x83 */ + 0x82, 0xD2, 0xB8, 0xB5, 0x82, 0xD3, 0x82, 0xD4, /* 0x84-0x87 */ + 0xC0, 0xFC, 0x82, 0xD5, 0x82, 0xD6, 0x82, 0xD7, /* 0x88-0x8B */ + 0x82, 0xD8, 0xB0, 0xF8, 0x82, 0xD9, 0x82, 0xDA, /* 0x8C-0x8F */ + 0x82, 0xDB, 0x82, 0xDC, 0x82, 0xDD, 0x82, 0xDE, /* 0x90-0x93 */ + 0x82, 0xDF, 0x82, 0xE0, 0x82, 0xE1, 0x82, 0xE2, /* 0x94-0x97 */ + 0x82, 0xE3, 0x82, 0xE4, 0x82, 0xE5, 0x82, 0xE6, /* 0x98-0x9B */ + 0x82, 0xE7, 0x82, 0xE8, 0x82, 0xE9, 0x82, 0xEA, /* 0x9C-0x9F */ + 0x82, 0xEB, 0x82, 0xEC, 0x82, 0xED, 0xB4, 0xF6, /* 0xA0-0xA3 */ + 0x82, 0xEE, 0xD9, 0xCE, 0x82, 0xEF, 0xD9, 0xCF, /* 0xA4-0xA7 */ + 0xB4, 0xA2, 0xD9, 0xD0, 0x82, 0xF0, 0x82, 0xF1, /* 0xA8-0xAB */ + 0xB4, 0xDF, 0x82, 0xF2, 0x82, 0xF3, 0x82, 0xF4, /* 0xAC-0xAF */ + 0x82, 0xF5, 0x82, 0xF6, 0xB0, 0xC1, 0x82, 0xF7, /* 0xB0-0xB3 */ + 0x82, 0xF8, 0x82, 0xF9, 0x82, 0xFA, 0x82, 0xFB, /* 0xB4-0xB7 */ + 0x82, 0xFC, 0x82, 0xFD, 0xD9, 0xD1, 0xC9, 0xB5, /* 0xB8-0xBB */ + 0x82, 0xFE, 0x83, 0x40, 0x83, 0x41, 0x83, 0x42, /* 0xBC-0xBF */ + 0x83, 0x43, 0x83, 0x44, 0x83, 0x45, 0x83, 0x46, /* 0xC0-0xC3 */ + 0x83, 0x47, 0x83, 0x48, 0x83, 0x49, 0x83, 0x4A, /* 0xC4-0xC7 */ + 0x83, 0x4B, 0x83, 0x4C, 0x83, 0x4D, 0x83, 0x4E, /* 0xC8-0xCB */ + 0x83, 0x4F, 0x83, 0x50, 0x83, 0x51, 0xCF, 0xF1, /* 0xCC-0xCF */ + 0x83, 0x52, 0x83, 0x53, 0x83, 0x54, 0x83, 0x55, /* 0xD0-0xD3 */ + 0x83, 0x56, 0x83, 0x57, 0xD9, 0xD2, 0x83, 0x58, /* 0xD4-0xD7 */ + 0x83, 0x59, 0x83, 0x5A, 0xC1, 0xC5, 0x83, 0x5B, /* 0xD8-0xDB */ + 0x83, 0x5C, 0x83, 0x5D, 0x83, 0x5E, 0x83, 0x5F, /* 0xDC-0xDF */ + 0x83, 0x60, 0x83, 0x61, 0x83, 0x62, 0x83, 0x63, /* 0xE0-0xE3 */ + 0x83, 0x64, 0x83, 0x65, 0xD9, 0xD6, 0xC9, 0xAE, /* 0xE4-0xE7 */ + 0x83, 0x66, 0x83, 0x67, 0x83, 0x68, 0x83, 0x69, /* 0xE8-0xEB */ + 0xD9, 0xD5, 0xD9, 0xD4, 0xD9, 0xD7, 0x83, 0x6A, /* 0xEC-0xEF */ + 0x83, 0x6B, 0x83, 0x6C, 0x83, 0x6D, 0xCB, 0xDB, /* 0xF0-0xF3 */ + 0x83, 0x6E, 0xBD, 0xA9, 0x83, 0x6F, 0x83, 0x70, /* 0xF4-0xF7 */ + 0x83, 0x71, 0x83, 0x72, 0x83, 0x73, 0xC6, 0xA7, /* 0xF8-0xFB */ + 0x83, 0x74, 0x83, 0x75, 0x83, 0x76, 0x83, 0x77, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_51[512] = { + 0x83, 0x78, 0x83, 0x79, 0x83, 0x7A, 0x83, 0x7B, /* 0x00-0x03 */ + 0x83, 0x7C, 0x83, 0x7D, 0xD9, 0xD3, 0xD9, 0xD8, /* 0x04-0x07 */ + 0x83, 0x7E, 0x83, 0x80, 0x83, 0x81, 0xD9, 0xD9, /* 0x08-0x0B */ + 0x83, 0x82, 0x83, 0x83, 0x83, 0x84, 0x83, 0x85, /* 0x0C-0x0F */ + 0x83, 0x86, 0x83, 0x87, 0xC8, 0xE5, 0x83, 0x88, /* 0x10-0x13 */ + 0x83, 0x89, 0x83, 0x8A, 0x83, 0x8B, 0x83, 0x8C, /* 0x14-0x17 */ + 0x83, 0x8D, 0x83, 0x8E, 0x83, 0x8F, 0x83, 0x90, /* 0x18-0x1B */ + 0x83, 0x91, 0x83, 0x92, 0x83, 0x93, 0x83, 0x94, /* 0x1C-0x1F */ + 0x83, 0x95, 0xC0, 0xDC, 0x83, 0x96, 0x83, 0x97, /* 0x20-0x23 */ + 0x83, 0x98, 0x83, 0x99, 0x83, 0x9A, 0x83, 0x9B, /* 0x24-0x27 */ + 0x83, 0x9C, 0x83, 0x9D, 0x83, 0x9E, 0x83, 0x9F, /* 0x28-0x2B */ + 0x83, 0xA0, 0x83, 0xA1, 0x83, 0xA2, 0x83, 0xA3, /* 0x2C-0x2F */ + 0x83, 0xA4, 0x83, 0xA5, 0x83, 0xA6, 0x83, 0xA7, /* 0x30-0x33 */ + 0x83, 0xA8, 0x83, 0xA9, 0x83, 0xAA, 0x83, 0xAB, /* 0x34-0x37 */ + 0x83, 0xAC, 0x83, 0xAD, 0x83, 0xAE, 0x83, 0xAF, /* 0x38-0x3B */ + 0x83, 0xB0, 0x83, 0xB1, 0x83, 0xB2, 0xB6, 0xF9, /* 0x3C-0x3F */ + 0xD8, 0xA3, 0xD4, 0xCA, 0x83, 0xB3, 0xD4, 0xAA, /* 0x40-0x43 */ + 0xD0, 0xD6, 0xB3, 0xE4, 0xD5, 0xD7, 0x83, 0xB4, /* 0x44-0x47 */ + 0xCF, 0xC8, 0xB9, 0xE2, 0x83, 0xB5, 0xBF, 0xCB, /* 0x48-0x4B */ + 0x83, 0xB6, 0xC3, 0xE2, 0x83, 0xB7, 0x83, 0xB8, /* 0x4C-0x4F */ + 0x83, 0xB9, 0xB6, 0xD2, 0x83, 0xBA, 0x83, 0xBB, /* 0x50-0x53 */ + 0xCD, 0xC3, 0xD9, 0xEE, 0xD9, 0xF0, 0x83, 0xBC, /* 0x54-0x57 */ + 0x83, 0xBD, 0x83, 0xBE, 0xB5, 0xB3, 0x83, 0xBF, /* 0x58-0x5B */ + 0xB6, 0xB5, 0x83, 0xC0, 0x83, 0xC1, 0x83, 0xC2, /* 0x5C-0x5F */ + 0x83, 0xC3, 0x83, 0xC4, 0xBE, 0xA4, 0x83, 0xC5, /* 0x60-0x63 */ + 0x83, 0xC6, 0xC8, 0xEB, 0x83, 0xC7, 0x83, 0xC8, /* 0x64-0x67 */ + 0xC8, 0xAB, 0x83, 0xC9, 0x83, 0xCA, 0xB0, 0xCB, /* 0x68-0x6B */ + 0xB9, 0xAB, 0xC1, 0xF9, 0xD9, 0xE2, 0x83, 0xCB, /* 0x6C-0x6F */ + 0xC0, 0xBC, 0xB9, 0xB2, 0x83, 0xCC, 0xB9, 0xD8, /* 0x70-0x73 */ + 0xD0, 0xCB, 0xB1, 0xF8, 0xC6, 0xE4, 0xBE, 0xDF, /* 0x74-0x77 */ + 0xB5, 0xE4, 0xD7, 0xC8, 0x83, 0xCD, 0xD1, 0xF8, /* 0x78-0x7B */ + 0xBC, 0xE6, 0xCA, 0xDE, 0x83, 0xCE, 0x83, 0xCF, /* 0x7C-0x7F */ + + 0xBC, 0xBD, 0xD9, 0xE6, 0xD8, 0xE7, 0x83, 0xD0, /* 0x80-0x83 */ + 0x83, 0xD1, 0xC4, 0xDA, 0x83, 0xD2, 0x83, 0xD3, /* 0x84-0x87 */ + 0xB8, 0xD4, 0xC8, 0xBD, 0x83, 0xD4, 0x83, 0xD5, /* 0x88-0x8B */ + 0xB2, 0xE1, 0xD4, 0xD9, 0x83, 0xD6, 0x83, 0xD7, /* 0x8C-0x8F */ + 0x83, 0xD8, 0x83, 0xD9, 0xC3, 0xB0, 0x83, 0xDA, /* 0x90-0x93 */ + 0x83, 0xDB, 0xC3, 0xE1, 0xDA, 0xA2, 0xC8, 0xDF, /* 0x94-0x97 */ + 0x83, 0xDC, 0xD0, 0xB4, 0x83, 0xDD, 0xBE, 0xFC, /* 0x98-0x9B */ + 0xC5, 0xA9, 0x83, 0xDE, 0x83, 0xDF, 0x83, 0xE0, /* 0x9C-0x9F */ + 0xB9, 0xDA, 0x83, 0xE1, 0xDA, 0xA3, 0x83, 0xE2, /* 0xA0-0xA3 */ + 0xD4, 0xA9, 0xDA, 0xA4, 0x83, 0xE3, 0x83, 0xE4, /* 0xA4-0xA7 */ + 0x83, 0xE5, 0x83, 0xE6, 0x83, 0xE7, 0xD9, 0xFB, /* 0xA8-0xAB */ + 0xB6, 0xAC, 0x83, 0xE8, 0x83, 0xE9, 0xB7, 0xEB, /* 0xAC-0xAF */ + 0xB1, 0xF9, 0xD9, 0xFC, 0xB3, 0xE5, 0xBE, 0xF6, /* 0xB0-0xB3 */ + 0x83, 0xEA, 0xBF, 0xF6, 0xD2, 0xB1, 0xC0, 0xE4, /* 0xB4-0xB7 */ + 0x83, 0xEB, 0x83, 0xEC, 0x83, 0xED, 0xB6, 0xB3, /* 0xB8-0xBB */ + 0xD9, 0xFE, 0xD9, 0xFD, 0x83, 0xEE, 0x83, 0xEF, /* 0xBC-0xBF */ + 0xBE, 0xBB, 0x83, 0xF0, 0x83, 0xF1, 0x83, 0xF2, /* 0xC0-0xC3 */ + 0xC6, 0xE0, 0x83, 0xF3, 0xD7, 0xBC, 0xDA, 0xA1, /* 0xC4-0xC7 */ + 0x83, 0xF4, 0xC1, 0xB9, 0x83, 0xF5, 0xB5, 0xF2, /* 0xC8-0xCB */ + 0xC1, 0xE8, 0x83, 0xF6, 0x83, 0xF7, 0xBC, 0xF5, /* 0xCC-0xCF */ + 0x83, 0xF8, 0xB4, 0xD5, 0x83, 0xF9, 0x83, 0xFA, /* 0xD0-0xD3 */ + 0x83, 0xFB, 0x83, 0xFC, 0x83, 0xFD, 0x83, 0xFE, /* 0xD4-0xD7 */ + 0x84, 0x40, 0x84, 0x41, 0x84, 0x42, 0xC1, 0xDD, /* 0xD8-0xDB */ + 0x84, 0x43, 0xC4, 0xFD, 0x84, 0x44, 0x84, 0x45, /* 0xDC-0xDF */ + 0xBC, 0xB8, 0xB7, 0xB2, 0x84, 0x46, 0x84, 0x47, /* 0xE0-0xE3 */ + 0xB7, 0xEF, 0x84, 0x48, 0x84, 0x49, 0x84, 0x4A, /* 0xE4-0xE7 */ + 0x84, 0x4B, 0x84, 0x4C, 0x84, 0x4D, 0xD9, 0xEC, /* 0xE8-0xEB */ + 0x84, 0x4E, 0xC6, 0xBE, 0x84, 0x4F, 0xBF, 0xAD, /* 0xEC-0xEF */ + 0xBB, 0xCB, 0x84, 0x50, 0x84, 0x51, 0xB5, 0xCA, /* 0xF0-0xF3 */ + 0x84, 0x52, 0xDB, 0xC9, 0xD0, 0xD7, 0x84, 0x53, /* 0xF4-0xF7 */ + 0xCD, 0xB9, 0xB0, 0xBC, 0xB3, 0xF6, 0xBB, 0xF7, /* 0xF8-0xFB */ + 0xDB, 0xCA, 0xBA, 0xAF, 0x84, 0x54, 0xD4, 0xE4, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_52[512] = { + 0xB5, 0xB6, 0xB5, 0xF3, 0xD8, 0xD6, 0xC8, 0xD0, /* 0x00-0x03 */ + 0x84, 0x55, 0x84, 0x56, 0xB7, 0xD6, 0xC7, 0xD0, /* 0x04-0x07 */ + 0xD8, 0xD7, 0x84, 0x57, 0xBF, 0xAF, 0x84, 0x58, /* 0x08-0x0B */ + 0x84, 0x59, 0xDB, 0xBB, 0xD8, 0xD8, 0x84, 0x5A, /* 0x0C-0x0F */ + 0x84, 0x5B, 0xD0, 0xCC, 0xBB, 0xAE, 0x84, 0x5C, /* 0x10-0x13 */ + 0x84, 0x5D, 0x84, 0x5E, 0xEB, 0xBE, 0xC1, 0xD0, /* 0x14-0x17 */ + 0xC1, 0xF5, 0xD4, 0xF2, 0xB8, 0xD5, 0xB4, 0xB4, /* 0x18-0x1B */ + 0x84, 0x5F, 0xB3, 0xF5, 0x84, 0x60, 0x84, 0x61, /* 0x1C-0x1F */ + 0xC9, 0xBE, 0x84, 0x62, 0x84, 0x63, 0x84, 0x64, /* 0x20-0x23 */ + 0xC5, 0xD0, 0x84, 0x65, 0x84, 0x66, 0x84, 0x67, /* 0x24-0x27 */ + 0xC5, 0xD9, 0xC0, 0xFB, 0x84, 0x68, 0xB1, 0xF0, /* 0x28-0x2B */ + 0x84, 0x69, 0xD8, 0xD9, 0xB9, 0xCE, 0x84, 0x6A, /* 0x2C-0x2F */ + 0xB5, 0xBD, 0x84, 0x6B, 0x84, 0x6C, 0xD8, 0xDA, /* 0x30-0x33 */ + 0x84, 0x6D, 0x84, 0x6E, 0xD6, 0xC6, 0xCB, 0xA2, /* 0x34-0x37 */ + 0xC8, 0xAF, 0xC9, 0xB2, 0xB4, 0xCC, 0xBF, 0xCC, /* 0x38-0x3B */ + 0x84, 0x6F, 0xB9, 0xF4, 0x84, 0x70, 0xD8, 0xDB, /* 0x3C-0x3F */ + 0xD8, 0xDC, 0xB6, 0xE7, 0xBC, 0xC1, 0xCC, 0xEA, /* 0x40-0x43 */ + 0x84, 0x71, 0x84, 0x72, 0x84, 0x73, 0x84, 0x74, /* 0x44-0x47 */ + 0x84, 0x75, 0x84, 0x76, 0xCF, 0xF7, 0x84, 0x77, /* 0x48-0x4B */ + 0xD8, 0xDD, 0xC7, 0xB0, 0x84, 0x78, 0x84, 0x79, /* 0x4C-0x4F */ + 0xB9, 0xD0, 0xBD, 0xA3, 0x84, 0x7A, 0x84, 0x7B, /* 0x50-0x53 */ + 0xCC, 0xDE, 0x84, 0x7C, 0xC6, 0xCA, 0x84, 0x7D, /* 0x54-0x57 */ + 0x84, 0x7E, 0x84, 0x80, 0x84, 0x81, 0x84, 0x82, /* 0x58-0x5B */ + 0xD8, 0xE0, 0x84, 0x83, 0xD8, 0xDE, 0x84, 0x84, /* 0x5C-0x5F */ + 0x84, 0x85, 0xD8, 0xDF, 0x84, 0x86, 0x84, 0x87, /* 0x60-0x63 */ + 0x84, 0x88, 0xB0, 0xFE, 0x84, 0x89, 0xBE, 0xE7, /* 0x64-0x67 */ + 0x84, 0x8A, 0xCA, 0xA3, 0xBC, 0xF4, 0x84, 0x8B, /* 0x68-0x6B */ + 0x84, 0x8C, 0x84, 0x8D, 0x84, 0x8E, 0xB8, 0xB1, /* 0x6C-0x6F */ + 0x84, 0x8F, 0x84, 0x90, 0xB8, 0xEE, 0x84, 0x91, /* 0x70-0x73 */ + 0x84, 0x92, 0x84, 0x93, 0x84, 0x94, 0x84, 0x95, /* 0x74-0x77 */ + 0x84, 0x96, 0x84, 0x97, 0x84, 0x98, 0x84, 0x99, /* 0x78-0x7B */ + 0x84, 0x9A, 0xD8, 0xE2, 0x84, 0x9B, 0xBD, 0xCB, /* 0x7C-0x7F */ + + 0x84, 0x9C, 0xD8, 0xE4, 0xD8, 0xE3, 0x84, 0x9D, /* 0x80-0x83 */ + 0x84, 0x9E, 0x84, 0x9F, 0x84, 0xA0, 0x84, 0xA1, /* 0x84-0x87 */ + 0xC5, 0xFC, 0x84, 0xA2, 0x84, 0xA3, 0x84, 0xA4, /* 0x88-0x8B */ + 0x84, 0xA5, 0x84, 0xA6, 0x84, 0xA7, 0x84, 0xA8, /* 0x8C-0x8F */ + 0xD8, 0xE5, 0x84, 0xA9, 0x84, 0xAA, 0xD8, 0xE6, /* 0x90-0x93 */ + 0x84, 0xAB, 0x84, 0xAC, 0x84, 0xAD, 0x84, 0xAE, /* 0x94-0x97 */ + 0x84, 0xAF, 0x84, 0xB0, 0x84, 0xB1, 0xC1, 0xA6, /* 0x98-0x9B */ + 0x84, 0xB2, 0xC8, 0xB0, 0xB0, 0xEC, 0xB9, 0xA6, /* 0x9C-0x9F */ + 0xBC, 0xD3, 0xCE, 0xF1, 0xDB, 0xBD, 0xC1, 0xD3, /* 0xA0-0xA3 */ + 0x84, 0xB3, 0x84, 0xB4, 0x84, 0xB5, 0x84, 0xB6, /* 0xA4-0xA7 */ + 0xB6, 0xAF, 0xD6, 0xFA, 0xC5, 0xAC, 0xBD, 0xD9, /* 0xA8-0xAB */ + 0xDB, 0xBE, 0xDB, 0xBF, 0x84, 0xB7, 0x84, 0xB8, /* 0xAC-0xAF */ + 0x84, 0xB9, 0xC0, 0xF8, 0xBE, 0xA2, 0xC0, 0xCD, /* 0xB0-0xB3 */ + 0x84, 0xBA, 0x84, 0xBB, 0x84, 0xBC, 0x84, 0xBD, /* 0xB4-0xB7 */ + 0x84, 0xBE, 0x84, 0xBF, 0x84, 0xC0, 0x84, 0xC1, /* 0xB8-0xBB */ + 0x84, 0xC2, 0x84, 0xC3, 0xDB, 0xC0, 0xCA, 0xC6, /* 0xBC-0xBF */ + 0x84, 0xC4, 0x84, 0xC5, 0x84, 0xC6, 0xB2, 0xAA, /* 0xC0-0xC3 */ + 0x84, 0xC7, 0x84, 0xC8, 0x84, 0xC9, 0xD3, 0xC2, /* 0xC4-0xC7 */ + 0x84, 0xCA, 0xC3, 0xE3, 0x84, 0xCB, 0xD1, 0xAB, /* 0xC8-0xCB */ + 0x84, 0xCC, 0x84, 0xCD, 0x84, 0xCE, 0x84, 0xCF, /* 0xCC-0xCF */ + 0xDB, 0xC2, 0x84, 0xD0, 0xC0, 0xD5, 0x84, 0xD1, /* 0xD0-0xD3 */ + 0x84, 0xD2, 0x84, 0xD3, 0xDB, 0xC3, 0x84, 0xD4, /* 0xD4-0xD7 */ + 0xBF, 0xB1, 0x84, 0xD5, 0x84, 0xD6, 0x84, 0xD7, /* 0xD8-0xDB */ + 0x84, 0xD8, 0x84, 0xD9, 0x84, 0xDA, 0xC4, 0xBC, /* 0xDC-0xDF */ + 0x84, 0xDB, 0x84, 0xDC, 0x84, 0xDD, 0x84, 0xDE, /* 0xE0-0xE3 */ + 0xC7, 0xDA, 0x84, 0xDF, 0x84, 0xE0, 0x84, 0xE1, /* 0xE4-0xE7 */ + 0x84, 0xE2, 0x84, 0xE3, 0x84, 0xE4, 0x84, 0xE5, /* 0xE8-0xEB */ + 0x84, 0xE6, 0x84, 0xE7, 0x84, 0xE8, 0x84, 0xE9, /* 0xEC-0xEF */ + 0xDB, 0xC4, 0x84, 0xEA, 0x84, 0xEB, 0x84, 0xEC, /* 0xF0-0xF3 */ + 0x84, 0xED, 0x84, 0xEE, 0x84, 0xEF, 0x84, 0xF0, /* 0xF4-0xF7 */ + 0x84, 0xF1, 0xD9, 0xE8, 0xC9, 0xD7, 0x84, 0xF2, /* 0xF8-0xFB */ + 0x84, 0xF3, 0x84, 0xF4, 0xB9, 0xB4, 0xCE, 0xF0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_53[512] = { + 0xD4, 0xC8, 0x84, 0xF5, 0x84, 0xF6, 0x84, 0xF7, /* 0x00-0x03 */ + 0x84, 0xF8, 0xB0, 0xFC, 0xB4, 0xD2, 0x84, 0xF9, /* 0x04-0x07 */ + 0xD0, 0xD9, 0x84, 0xFA, 0x84, 0xFB, 0x84, 0xFC, /* 0x08-0x0B */ + 0x84, 0xFD, 0xD9, 0xE9, 0x84, 0xFE, 0xDE, 0xCB, /* 0x0C-0x0F */ + 0xD9, 0xEB, 0x85, 0x40, 0x85, 0x41, 0x85, 0x42, /* 0x10-0x13 */ + 0x85, 0x43, 0xD8, 0xB0, 0xBB, 0xAF, 0xB1, 0xB1, /* 0x14-0x17 */ + 0x85, 0x44, 0xB3, 0xD7, 0xD8, 0xCE, 0x85, 0x45, /* 0x18-0x1B */ + 0x85, 0x46, 0xD4, 0xD1, 0x85, 0x47, 0x85, 0x48, /* 0x1C-0x1F */ + 0xBD, 0xB3, 0xBF, 0xEF, 0x85, 0x49, 0xCF, 0xBB, /* 0x20-0x23 */ + 0x85, 0x4A, 0x85, 0x4B, 0xD8, 0xD0, 0x85, 0x4C, /* 0x24-0x27 */ + 0x85, 0x4D, 0x85, 0x4E, 0xB7, 0xCB, 0x85, 0x4F, /* 0x28-0x2B */ + 0x85, 0x50, 0x85, 0x51, 0xD8, 0xD1, 0x85, 0x52, /* 0x2C-0x2F */ + 0x85, 0x53, 0x85, 0x54, 0x85, 0x55, 0x85, 0x56, /* 0x30-0x33 */ + 0x85, 0x57, 0x85, 0x58, 0x85, 0x59, 0x85, 0x5A, /* 0x34-0x37 */ + 0x85, 0x5B, 0xC6, 0xA5, 0xC7, 0xF8, 0xD2, 0xBD, /* 0x38-0x3B */ + 0x85, 0x5C, 0x85, 0x5D, 0xD8, 0xD2, 0xC4, 0xE4, /* 0x3C-0x3F */ + 0x85, 0x5E, 0xCA, 0xAE, 0x85, 0x5F, 0xC7, 0xA7, /* 0x40-0x43 */ + 0x85, 0x60, 0xD8, 0xA6, 0x85, 0x61, 0xC9, 0xFD, /* 0x44-0x47 */ + 0xCE, 0xE7, 0xBB, 0xDC, 0xB0, 0xEB, 0x85, 0x62, /* 0x48-0x4B */ + 0x85, 0x63, 0x85, 0x64, 0xBB, 0xAA, 0xD0, 0xAD, /* 0x4C-0x4F */ + 0x85, 0x65, 0xB1, 0xB0, 0xD7, 0xE4, 0xD7, 0xBF, /* 0x50-0x53 */ + 0x85, 0x66, 0xB5, 0xA5, 0xC2, 0xF4, 0xC4, 0xCF, /* 0x54-0x57 */ + 0x85, 0x67, 0x85, 0x68, 0xB2, 0xA9, 0x85, 0x69, /* 0x58-0x5B */ + 0xB2, 0xB7, 0x85, 0x6A, 0xB1, 0xE5, 0xDF, 0xB2, /* 0x5C-0x5F */ + 0xD5, 0xBC, 0xBF, 0xA8, 0xC2, 0xAC, 0xD8, 0xD5, /* 0x60-0x63 */ + 0xC2, 0xB1, 0x85, 0x6B, 0xD8, 0xD4, 0xCE, 0xD4, /* 0x64-0x67 */ + 0x85, 0x6C, 0xDA, 0xE0, 0x85, 0x6D, 0xCE, 0xC0, /* 0x68-0x6B */ + 0x85, 0x6E, 0x85, 0x6F, 0xD8, 0xB4, 0xC3, 0xAE, /* 0x6C-0x6F */ + 0xD3, 0xA1, 0xCE, 0xA3, 0x85, 0x70, 0xBC, 0xB4, /* 0x70-0x73 */ + 0xC8, 0xB4, 0xC2, 0xD1, 0x85, 0x71, 0xBE, 0xED, /* 0x74-0x77 */ + 0xD0, 0xB6, 0x85, 0x72, 0xDA, 0xE1, 0x85, 0x73, /* 0x78-0x7B */ + 0x85, 0x74, 0x85, 0x75, 0x85, 0x76, 0xC7, 0xE4, /* 0x7C-0x7F */ + + 0x85, 0x77, 0x85, 0x78, 0xB3, 0xA7, 0x85, 0x79, /* 0x80-0x83 */ + 0xB6, 0xF2, 0xCC, 0xFC, 0xC0, 0xFA, 0x85, 0x7A, /* 0x84-0x87 */ + 0x85, 0x7B, 0xC0, 0xF7, 0x85, 0x7C, 0xD1, 0xB9, /* 0x88-0x8B */ + 0xD1, 0xE1, 0xD8, 0xC7, 0x85, 0x7D, 0x85, 0x7E, /* 0x8C-0x8F */ + 0x85, 0x80, 0x85, 0x81, 0x85, 0x82, 0x85, 0x83, /* 0x90-0x93 */ + 0x85, 0x84, 0xB2, 0xDE, 0x85, 0x85, 0x85, 0x86, /* 0x94-0x97 */ + 0xC0, 0xE5, 0x85, 0x87, 0xBA, 0xF1, 0x85, 0x88, /* 0x98-0x9B */ + 0x85, 0x89, 0xD8, 0xC8, 0x85, 0x8A, 0xD4, 0xAD, /* 0x9C-0x9F */ + 0x85, 0x8B, 0x85, 0x8C, 0xCF, 0xE1, 0xD8, 0xC9, /* 0xA0-0xA3 */ + 0x85, 0x8D, 0xD8, 0xCA, 0xCF, 0xC3, 0x85, 0x8E, /* 0xA4-0xA7 */ + 0xB3, 0xF8, 0xBE, 0xC7, 0x85, 0x8F, 0x85, 0x90, /* 0xA8-0xAB */ + 0x85, 0x91, 0x85, 0x92, 0xD8, 0xCB, 0x85, 0x93, /* 0xAC-0xAF */ + 0x85, 0x94, 0x85, 0x95, 0x85, 0x96, 0x85, 0x97, /* 0xB0-0xB3 */ + 0x85, 0x98, 0x85, 0x99, 0xDB, 0xCC, 0x85, 0x9A, /* 0xB4-0xB7 */ + 0x85, 0x9B, 0x85, 0x9C, 0x85, 0x9D, 0xC8, 0xA5, /* 0xB8-0xBB */ + 0x85, 0x9E, 0x85, 0x9F, 0x85, 0xA0, 0xCF, 0xD8, /* 0xBC-0xBF */ + 0x85, 0xA1, 0xC8, 0xFE, 0xB2, 0xCE, 0x85, 0xA2, /* 0xC0-0xC3 */ + 0x85, 0xA3, 0x85, 0xA4, 0x85, 0xA5, 0x85, 0xA6, /* 0xC4-0xC7 */ + 0xD3, 0xD6, 0xB2, 0xE6, 0xBC, 0xB0, 0xD3, 0xD1, /* 0xC8-0xCB */ + 0xCB, 0xAB, 0xB7, 0xB4, 0x85, 0xA7, 0x85, 0xA8, /* 0xCC-0xCF */ + 0x85, 0xA9, 0xB7, 0xA2, 0x85, 0xAA, 0x85, 0xAB, /* 0xD0-0xD3 */ + 0xCA, 0xE5, 0x85, 0xAC, 0xC8, 0xA1, 0xCA, 0xDC, /* 0xD4-0xD7 */ + 0xB1, 0xE4, 0xD0, 0xF0, 0x85, 0xAD, 0xC5, 0xD1, /* 0xD8-0xDB */ + 0x85, 0xAE, 0x85, 0xAF, 0x85, 0xB0, 0xDB, 0xC5, /* 0xDC-0xDF */ + 0xB5, 0xFE, 0x85, 0xB1, 0x85, 0xB2, 0xBF, 0xDA, /* 0xE0-0xE3 */ + 0xB9, 0xC5, 0xBE, 0xE4, 0xC1, 0xED, 0x85, 0xB3, /* 0xE4-0xE7 */ + 0xDF, 0xB6, 0xDF, 0xB5, 0xD6, 0xBB, 0xBD, 0xD0, /* 0xE8-0xEB */ + 0xD5, 0xD9, 0xB0, 0xC8, 0xB6, 0xA3, 0xBF, 0xC9, /* 0xEC-0xEF */ + 0xCC, 0xA8, 0xDF, 0xB3, 0xCA, 0xB7, 0xD3, 0xD2, /* 0xF0-0xF3 */ + 0x85, 0xB4, 0xD8, 0xCF, 0xD2, 0xB6, 0xBA, 0xC5, /* 0xF4-0xF7 */ + 0xCB, 0xBE, 0xCC, 0xBE, 0x85, 0xB5, 0xDF, 0xB7, /* 0xF8-0xFB */ + 0xB5, 0xF0, 0xDF, 0xB4, 0x85, 0xB6, 0x85, 0xB7, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_54[512] = { + 0x85, 0xB8, 0xD3, 0xF5, 0x85, 0xB9, 0xB3, 0xD4, /* 0x00-0x03 */ + 0xB8, 0xF7, 0x85, 0xBA, 0xDF, 0xBA, 0x85, 0xBB, /* 0x04-0x07 */ + 0xBA, 0xCF, 0xBC, 0xAA, 0xB5, 0xF5, 0x85, 0xBC, /* 0x08-0x0B */ + 0xCD, 0xAC, 0xC3, 0xFB, 0xBA, 0xF3, 0xC0, 0xF4, /* 0x0C-0x0F */ + 0xCD, 0xC2, 0xCF, 0xF2, 0xDF, 0xB8, 0xCF, 0xC5, /* 0x10-0x13 */ + 0x85, 0xBD, 0xC2, 0xC0, 0xDF, 0xB9, 0xC2, 0xF0, /* 0x14-0x17 */ + 0x85, 0xBE, 0x85, 0xBF, 0x85, 0xC0, 0xBE, 0xFD, /* 0x18-0x1B */ + 0x85, 0xC1, 0xC1, 0xDF, 0xCD, 0xCC, 0xD2, 0xF7, /* 0x1C-0x1F */ + 0xB7, 0xCD, 0xDF, 0xC1, 0x85, 0xC2, 0xDF, 0xC4, /* 0x20-0x23 */ + 0x85, 0xC3, 0x85, 0xC4, 0xB7, 0xF1, 0xB0, 0xC9, /* 0x24-0x27 */ + 0xB6, 0xD6, 0xB7, 0xD4, 0x85, 0xC5, 0xBA, 0xAC, /* 0x28-0x2B */ + 0xCC, 0xFD, 0xBF, 0xD4, 0xCB, 0xB1, 0xC6, 0xF4, /* 0x2C-0x2F */ + 0x85, 0xC6, 0xD6, 0xA8, 0xDF, 0xC5, 0x85, 0xC7, /* 0x30-0x33 */ + 0xCE, 0xE2, 0xB3, 0xB3, 0x85, 0xC8, 0x85, 0xC9, /* 0x34-0x37 */ + 0xCE, 0xFC, 0xB4, 0xB5, 0x85, 0xCA, 0xCE, 0xC7, /* 0x38-0x3B */ + 0xBA, 0xF0, 0x85, 0xCB, 0xCE, 0xE1, 0x85, 0xCC, /* 0x3C-0x3F */ + 0xD1, 0xBD, 0x85, 0xCD, 0x85, 0xCE, 0xDF, 0xC0, /* 0x40-0x43 */ + 0x85, 0xCF, 0x85, 0xD0, 0xB4, 0xF4, 0x85, 0xD1, /* 0x44-0x47 */ + 0xB3, 0xCA, 0x85, 0xD2, 0xB8, 0xE6, 0xDF, 0xBB, /* 0x48-0x4B */ + 0x85, 0xD3, 0x85, 0xD4, 0x85, 0xD5, 0x85, 0xD6, /* 0x4C-0x4F */ + 0xC4, 0xC5, 0x85, 0xD7, 0xDF, 0xBC, 0xDF, 0xBD, /* 0x50-0x53 */ + 0xDF, 0xBE, 0xC5, 0xBB, 0xDF, 0xBF, 0xDF, 0xC2, /* 0x54-0x57 */ + 0xD4, 0xB1, 0xDF, 0xC3, 0x85, 0xD8, 0xC7, 0xBA, /* 0x58-0x5B */ + 0xCE, 0xD8, 0x85, 0xD9, 0x85, 0xDA, 0x85, 0xDB, /* 0x5C-0x5F */ + 0x85, 0xDC, 0x85, 0xDD, 0xC4, 0xD8, 0x85, 0xDE, /* 0x60-0x63 */ + 0xDF, 0xCA, 0x85, 0xDF, 0xDF, 0xCF, 0x85, 0xE0, /* 0x64-0x67 */ + 0xD6, 0xDC, 0x85, 0xE1, 0x85, 0xE2, 0x85, 0xE3, /* 0x68-0x6B */ + 0x85, 0xE4, 0x85, 0xE5, 0x85, 0xE6, 0x85, 0xE7, /* 0x6C-0x6F */ + 0x85, 0xE8, 0xDF, 0xC9, 0xDF, 0xDA, 0xCE, 0xB6, /* 0x70-0x73 */ + 0x85, 0xE9, 0xBA, 0xC7, 0xDF, 0xCE, 0xDF, 0xC8, /* 0x74-0x77 */ + 0xC5, 0xDE, 0x85, 0xEA, 0x85, 0xEB, 0xC9, 0xEB, /* 0x78-0x7B */ + 0xBA, 0xF4, 0xC3, 0xFC, 0x85, 0xEC, 0x85, 0xED, /* 0x7C-0x7F */ + + 0xBE, 0xD7, 0x85, 0xEE, 0xDF, 0xC6, 0x85, 0xEF, /* 0x80-0x83 */ + 0xDF, 0xCD, 0x85, 0xF0, 0xC5, 0xD8, 0x85, 0xF1, /* 0x84-0x87 */ + 0x85, 0xF2, 0x85, 0xF3, 0x85, 0xF4, 0xD5, 0xA6, /* 0x88-0x8B */ + 0xBA, 0xCD, 0x85, 0xF5, 0xBE, 0xCC, 0xD3, 0xBD, /* 0x8C-0x8F */ + 0xB8, 0xC0, 0x85, 0xF6, 0xD6, 0xE4, 0x85, 0xF7, /* 0x90-0x93 */ + 0xDF, 0xC7, 0xB9, 0xBE, 0xBF, 0xA7, 0x85, 0xF8, /* 0x94-0x97 */ + 0x85, 0xF9, 0xC1, 0xFC, 0xDF, 0xCB, 0xDF, 0xCC, /* 0x98-0x9B */ + 0x85, 0xFA, 0xDF, 0xD0, 0x85, 0xFB, 0x85, 0xFC, /* 0x9C-0x9F */ + 0x85, 0xFD, 0x85, 0xFE, 0x86, 0x40, 0xDF, 0xDB, /* 0xA0-0xA3 */ + 0xDF, 0xE5, 0x86, 0x41, 0xDF, 0xD7, 0xDF, 0xD6, /* 0xA4-0xA7 */ + 0xD7, 0xC9, 0xDF, 0xE3, 0xDF, 0xE4, 0xE5, 0xEB, /* 0xA8-0xAB */ + 0xD2, 0xA7, 0xDF, 0xD2, 0x86, 0x42, 0xBF, 0xA9, /* 0xAC-0xAF */ + 0x86, 0x43, 0xD4, 0xDB, 0x86, 0x44, 0xBF, 0xC8, /* 0xB0-0xB3 */ + 0xDF, 0xD4, 0x86, 0x45, 0x86, 0x46, 0x86, 0x47, /* 0xB4-0xB7 */ + 0xCF, 0xCC, 0x86, 0x48, 0x86, 0x49, 0xDF, 0xDD, /* 0xB8-0xBB */ + 0x86, 0x4A, 0xD1, 0xCA, 0x86, 0x4B, 0xDF, 0xDE, /* 0xBC-0xBF */ + 0xB0, 0xA7, 0xC6, 0xB7, 0xDF, 0xD3, 0x86, 0x4C, /* 0xC0-0xC3 */ + 0xBA, 0xE5, 0x86, 0x4D, 0xB6, 0xDF, 0xCD, 0xDB, /* 0xC4-0xC7 */ + 0xB9, 0xFE, 0xD4, 0xD5, 0x86, 0x4E, 0x86, 0x4F, /* 0xC8-0xCB */ + 0xDF, 0xDF, 0xCF, 0xEC, 0xB0, 0xA5, 0xDF, 0xE7, /* 0xCC-0xCF */ + 0xDF, 0xD1, 0xD1, 0xC6, 0xDF, 0xD5, 0xDF, 0xD8, /* 0xD0-0xD3 */ + 0xDF, 0xD9, 0xDF, 0xDC, 0x86, 0x50, 0xBB, 0xA9, /* 0xD4-0xD7 */ + 0x86, 0x51, 0xDF, 0xE0, 0xDF, 0xE1, 0x86, 0x52, /* 0xD8-0xDB */ + 0xDF, 0xE2, 0xDF, 0xE6, 0xDF, 0xE8, 0xD3, 0xB4, /* 0xDC-0xDF */ + 0x86, 0x53, 0x86, 0x54, 0x86, 0x55, 0x86, 0x56, /* 0xE0-0xE3 */ + 0x86, 0x57, 0xB8, 0xE7, 0xC5, 0xB6, 0xDF, 0xEA, /* 0xE4-0xE7 */ + 0xC9, 0xDA, 0xC1, 0xA8, 0xC4, 0xC4, 0x86, 0x58, /* 0xE8-0xEB */ + 0x86, 0x59, 0xBF, 0xDE, 0xCF, 0xF8, 0x86, 0x5A, /* 0xEC-0xEF */ + 0x86, 0x5B, 0x86, 0x5C, 0xD5, 0xDC, 0xDF, 0xEE, /* 0xF0-0xF3 */ + 0x86, 0x5D, 0x86, 0x5E, 0x86, 0x5F, 0x86, 0x60, /* 0xF4-0xF7 */ + 0x86, 0x61, 0x86, 0x62, 0xB2, 0xB8, 0x86, 0x63, /* 0xF8-0xFB */ + 0xBA, 0xDF, 0xDF, 0xEC, 0x86, 0x64, 0xDB, 0xC1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_55[512] = { + 0x86, 0x65, 0xD1, 0xE4, 0x86, 0x66, 0x86, 0x67, /* 0x00-0x03 */ + 0x86, 0x68, 0x86, 0x69, 0xCB, 0xF4, 0xB4, 0xBD, /* 0x04-0x07 */ + 0x86, 0x6A, 0xB0, 0xA6, 0x86, 0x6B, 0x86, 0x6C, /* 0x08-0x0B */ + 0x86, 0x6D, 0x86, 0x6E, 0x86, 0x6F, 0xDF, 0xF1, /* 0x0C-0x0F */ + 0xCC, 0xC6, 0xDF, 0xF2, 0x86, 0x70, 0x86, 0x71, /* 0x10-0x13 */ + 0xDF, 0xED, 0x86, 0x72, 0x86, 0x73, 0x86, 0x74, /* 0x14-0x17 */ + 0x86, 0x75, 0x86, 0x76, 0x86, 0x77, 0xDF, 0xE9, /* 0x18-0x1B */ + 0x86, 0x78, 0x86, 0x79, 0x86, 0x7A, 0x86, 0x7B, /* 0x1C-0x1F */ + 0xDF, 0xEB, 0x86, 0x7C, 0xDF, 0xEF, 0xDF, 0xF0, /* 0x20-0x23 */ + 0xBB, 0xBD, 0x86, 0x7D, 0x86, 0x7E, 0xDF, 0xF3, /* 0x24-0x27 */ + 0x86, 0x80, 0x86, 0x81, 0xDF, 0xF4, 0x86, 0x82, /* 0x28-0x2B */ + 0xBB, 0xA3, 0x86, 0x83, 0xCA, 0xDB, 0xCE, 0xA8, /* 0x2C-0x2F */ + 0xE0, 0xA7, 0xB3, 0xAA, 0x86, 0x84, 0xE0, 0xA6, /* 0x30-0x33 */ + 0x86, 0x85, 0x86, 0x86, 0x86, 0x87, 0xE0, 0xA1, /* 0x34-0x37 */ + 0x86, 0x88, 0x86, 0x89, 0x86, 0x8A, 0x86, 0x8B, /* 0x38-0x3B */ + 0xDF, 0xFE, 0x86, 0x8C, 0xCD, 0xD9, 0xDF, 0xFC, /* 0x3C-0x3F */ + 0x86, 0x8D, 0xDF, 0xFA, 0x86, 0x8E, 0xBF, 0xD0, /* 0x40-0x43 */ + 0xD7, 0xC4, 0x86, 0x8F, 0xC9, 0xCC, 0x86, 0x90, /* 0x44-0x47 */ + 0x86, 0x91, 0xDF, 0xF8, 0xB0, 0xA1, 0x86, 0x92, /* 0x48-0x4B */ + 0x86, 0x93, 0x86, 0x94, 0x86, 0x95, 0x86, 0x96, /* 0x4C-0x4F */ + 0xDF, 0xFD, 0x86, 0x97, 0x86, 0x98, 0x86, 0x99, /* 0x50-0x53 */ + 0x86, 0x9A, 0xDF, 0xFB, 0xE0, 0xA2, 0x86, 0x9B, /* 0x54-0x57 */ + 0x86, 0x9C, 0x86, 0x9D, 0x86, 0x9E, 0x86, 0x9F, /* 0x58-0x5B */ + 0xE0, 0xA8, 0x86, 0xA0, 0x86, 0xA1, 0x86, 0xA2, /* 0x5C-0x5F */ + 0x86, 0xA3, 0xB7, 0xC8, 0x86, 0xA4, 0x86, 0xA5, /* 0x60-0x63 */ + 0xC6, 0xA1, 0xC9, 0xB6, 0xC0, 0xB2, 0xDF, 0xF5, /* 0x64-0x67 */ + 0x86, 0xA6, 0x86, 0xA7, 0xC5, 0xBE, 0x86, 0xA8, /* 0x68-0x6B */ + 0xD8, 0xC4, 0xDF, 0xF9, 0xC4, 0xF6, 0x86, 0xA9, /* 0x6C-0x6F */ + 0x86, 0xAA, 0x86, 0xAB, 0x86, 0xAC, 0x86, 0xAD, /* 0x70-0x73 */ + 0x86, 0xAE, 0xE0, 0xA3, 0xE0, 0xA4, 0xE0, 0xA5, /* 0x74-0x77 */ + 0xD0, 0xA5, 0x86, 0xAF, 0x86, 0xB0, 0xE0, 0xB4, /* 0x78-0x7B */ + 0xCC, 0xE4, 0x86, 0xB1, 0xE0, 0xB1, 0x86, 0xB2, /* 0x7C-0x7F */ + + 0xBF, 0xA6, 0xE0, 0xAF, 0xCE, 0xB9, 0xE0, 0xAB, /* 0x80-0x83 */ + 0xC9, 0xC6, 0x86, 0xB3, 0x86, 0xB4, 0xC0, 0xAE, /* 0x84-0x87 */ + 0xE0, 0xAE, 0xBA, 0xED, 0xBA, 0xB0, 0xE0, 0xA9, /* 0x88-0x8B */ + 0x86, 0xB5, 0x86, 0xB6, 0x86, 0xB7, 0xDF, 0xF6, /* 0x8C-0x8F */ + 0x86, 0xB8, 0xE0, 0xB3, 0x86, 0xB9, 0x86, 0xBA, /* 0x90-0x93 */ + 0xE0, 0xB8, 0x86, 0xBB, 0x86, 0xBC, 0x86, 0xBD, /* 0x94-0x97 */ + 0xB4, 0xAD, 0xE0, 0xB9, 0x86, 0xBE, 0x86, 0xBF, /* 0x98-0x9B */ + 0xCF, 0xB2, 0xBA, 0xC8, 0x86, 0xC0, 0xE0, 0xB0, /* 0x9C-0x9F */ + 0x86, 0xC1, 0x86, 0xC2, 0x86, 0xC3, 0x86, 0xC4, /* 0xA0-0xA3 */ + 0x86, 0xC5, 0x86, 0xC6, 0x86, 0xC7, 0xD0, 0xFA, /* 0xA4-0xA7 */ + 0x86, 0xC8, 0x86, 0xC9, 0x86, 0xCA, 0x86, 0xCB, /* 0xA8-0xAB */ + 0x86, 0xCC, 0x86, 0xCD, 0x86, 0xCE, 0x86, 0xCF, /* 0xAC-0xAF */ + 0x86, 0xD0, 0xE0, 0xAC, 0x86, 0xD1, 0xD4, 0xFB, /* 0xB0-0xB3 */ + 0x86, 0xD2, 0xDF, 0xF7, 0x86, 0xD3, 0xC5, 0xE7, /* 0xB4-0xB7 */ + 0x86, 0xD4, 0xE0, 0xAD, 0x86, 0xD5, 0xD3, 0xF7, /* 0xB8-0xBB */ + 0x86, 0xD6, 0xE0, 0xB6, 0xE0, 0xB7, 0x86, 0xD7, /* 0xBC-0xBF */ + 0x86, 0xD8, 0x86, 0xD9, 0x86, 0xDA, 0x86, 0xDB, /* 0xC0-0xC3 */ + 0xE0, 0xC4, 0xD0, 0xE1, 0x86, 0xDC, 0x86, 0xDD, /* 0xC4-0xC7 */ + 0x86, 0xDE, 0xE0, 0xBC, 0x86, 0xDF, 0x86, 0xE0, /* 0xC8-0xCB */ + 0xE0, 0xC9, 0xE0, 0xCA, 0x86, 0xE1, 0x86, 0xE2, /* 0xCC-0xCF */ + 0x86, 0xE3, 0xE0, 0xBE, 0xE0, 0xAA, 0xC9, 0xA4, /* 0xD0-0xD3 */ + 0xE0, 0xC1, 0x86, 0xE4, 0xE0, 0xB2, 0x86, 0xE5, /* 0xD4-0xD7 */ + 0x86, 0xE6, 0x86, 0xE7, 0x86, 0xE8, 0x86, 0xE9, /* 0xD8-0xDB */ + 0xCA, 0xC8, 0xE0, 0xC3, 0x86, 0xEA, 0xE0, 0xB5, /* 0xDC-0xDF */ + 0x86, 0xEB, 0xCE, 0xCB, 0x86, 0xEC, 0xCB, 0xC3, /* 0xE0-0xE3 */ + 0xE0, 0xCD, 0xE0, 0xC6, 0xE0, 0xC2, 0x86, 0xED, /* 0xE4-0xE7 */ + 0xE0, 0xCB, 0x86, 0xEE, 0xE0, 0xBA, 0xE0, 0xBF, /* 0xE8-0xEB */ + 0xE0, 0xC0, 0x86, 0xEF, 0x86, 0xF0, 0xE0, 0xC5, /* 0xEC-0xEF */ + 0x86, 0xF1, 0x86, 0xF2, 0xE0, 0xC7, 0xE0, 0xC8, /* 0xF0-0xF3 */ + 0x86, 0xF3, 0xE0, 0xCC, 0x86, 0xF4, 0xE0, 0xBB, /* 0xF4-0xF7 */ + 0x86, 0xF5, 0x86, 0xF6, 0x86, 0xF7, 0x86, 0xF8, /* 0xF8-0xFB */ + 0x86, 0xF9, 0xCB, 0xD4, 0xE0, 0xD5, 0x86, 0xFA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_56[512] = { + 0xE0, 0xD6, 0xE0, 0xD2, 0x86, 0xFB, 0x86, 0xFC, /* 0x00-0x03 */ + 0x86, 0xFD, 0x86, 0xFE, 0x87, 0x40, 0x87, 0x41, /* 0x04-0x07 */ + 0xE0, 0xD0, 0xBC, 0xCE, 0x87, 0x42, 0x87, 0x43, /* 0x08-0x0B */ + 0xE0, 0xD1, 0x87, 0x44, 0xB8, 0xC2, 0xD8, 0xC5, /* 0x0C-0x0F */ + 0x87, 0x45, 0x87, 0x46, 0x87, 0x47, 0x87, 0x48, /* 0x10-0x13 */ + 0x87, 0x49, 0x87, 0x4A, 0x87, 0x4B, 0x87, 0x4C, /* 0x14-0x17 */ + 0xD0, 0xEA, 0x87, 0x4D, 0x87, 0x4E, 0xC2, 0xEF, /* 0x18-0x1B */ + 0x87, 0x4F, 0x87, 0x50, 0xE0, 0xCF, 0xE0, 0xBD, /* 0x1C-0x1F */ + 0x87, 0x51, 0x87, 0x52, 0x87, 0x53, 0xE0, 0xD4, /* 0x20-0x23 */ + 0xE0, 0xD3, 0x87, 0x54, 0x87, 0x55, 0xE0, 0xD7, /* 0x24-0x27 */ + 0x87, 0x56, 0x87, 0x57, 0x87, 0x58, 0x87, 0x59, /* 0x28-0x2B */ + 0xE0, 0xDC, 0xE0, 0xD8, 0x87, 0x5A, 0x87, 0x5B, /* 0x2C-0x2F */ + 0x87, 0x5C, 0xD6, 0xF6, 0xB3, 0xB0, 0x87, 0x5D, /* 0x30-0x33 */ + 0xD7, 0xEC, 0x87, 0x5E, 0xCB, 0xBB, 0x87, 0x5F, /* 0x34-0x37 */ + 0x87, 0x60, 0xE0, 0xDA, 0x87, 0x61, 0xCE, 0xFB, /* 0x38-0x3B */ + 0x87, 0x62, 0x87, 0x63, 0x87, 0x64, 0xBA, 0xD9, /* 0x3C-0x3F */ + 0x87, 0x65, 0x87, 0x66, 0x87, 0x67, 0x87, 0x68, /* 0x40-0x43 */ + 0x87, 0x69, 0x87, 0x6A, 0x87, 0x6B, 0x87, 0x6C, /* 0x44-0x47 */ + 0x87, 0x6D, 0x87, 0x6E, 0x87, 0x6F, 0x87, 0x70, /* 0x48-0x4B */ + 0xE0, 0xE1, 0xE0, 0xDD, 0xD2, 0xAD, 0x87, 0x71, /* 0x4C-0x4F */ + 0x87, 0x72, 0x87, 0x73, 0x87, 0x74, 0x87, 0x75, /* 0x50-0x53 */ + 0xE0, 0xE2, 0x87, 0x76, 0x87, 0x77, 0xE0, 0xDB, /* 0x54-0x57 */ + 0xE0, 0xD9, 0xE0, 0xDF, 0x87, 0x78, 0x87, 0x79, /* 0x58-0x5B */ + 0xE0, 0xE0, 0x87, 0x7A, 0x87, 0x7B, 0x87, 0x7C, /* 0x5C-0x5F */ + 0x87, 0x7D, 0x87, 0x7E, 0xE0, 0xDE, 0x87, 0x80, /* 0x60-0x63 */ + 0xE0, 0xE4, 0x87, 0x81, 0x87, 0x82, 0x87, 0x83, /* 0x64-0x67 */ + 0xC6, 0xF7, 0xD8, 0xAC, 0xD4, 0xEB, 0xE0, 0xE6, /* 0x68-0x6B */ + 0xCA, 0xC9, 0x87, 0x84, 0x87, 0x85, 0x87, 0x86, /* 0x6C-0x6F */ + 0x87, 0x87, 0xE0, 0xE5, 0x87, 0x88, 0x87, 0x89, /* 0x70-0x73 */ + 0x87, 0x8A, 0x87, 0x8B, 0xB8, 0xC1, 0x87, 0x8C, /* 0x74-0x77 */ + 0x87, 0x8D, 0x87, 0x8E, 0x87, 0x8F, 0xE0, 0xE7, /* 0x78-0x7B */ + 0xE0, 0xE8, 0x87, 0x90, 0x87, 0x91, 0x87, 0x92, /* 0x7C-0x7F */ + + 0x87, 0x93, 0x87, 0x94, 0x87, 0x95, 0x87, 0x96, /* 0x80-0x83 */ + 0x87, 0x97, 0xE0, 0xE9, 0xE0, 0xE3, 0x87, 0x98, /* 0x84-0x87 */ + 0x87, 0x99, 0x87, 0x9A, 0x87, 0x9B, 0x87, 0x9C, /* 0x88-0x8B */ + 0x87, 0x9D, 0x87, 0x9E, 0xBA, 0xBF, 0xCC, 0xE7, /* 0x8C-0x8F */ + 0x87, 0x9F, 0x87, 0xA0, 0x87, 0xA1, 0xE0, 0xEA, /* 0x90-0x93 */ + 0x87, 0xA2, 0x87, 0xA3, 0x87, 0xA4, 0x87, 0xA5, /* 0x94-0x97 */ + 0x87, 0xA6, 0x87, 0xA7, 0x87, 0xA8, 0x87, 0xA9, /* 0x98-0x9B */ + 0x87, 0xAA, 0x87, 0xAB, 0x87, 0xAC, 0x87, 0xAD, /* 0x9C-0x9F */ + 0x87, 0xAE, 0x87, 0xAF, 0x87, 0xB0, 0xCF, 0xF9, /* 0xA0-0xA3 */ + 0x87, 0xB1, 0x87, 0xB2, 0x87, 0xB3, 0x87, 0xB4, /* 0xA4-0xA7 */ + 0x87, 0xB5, 0x87, 0xB6, 0x87, 0xB7, 0x87, 0xB8, /* 0xA8-0xAB */ + 0x87, 0xB9, 0x87, 0xBA, 0x87, 0xBB, 0xE0, 0xEB, /* 0xAC-0xAF */ + 0x87, 0xBC, 0x87, 0xBD, 0x87, 0xBE, 0x87, 0xBF, /* 0xB0-0xB3 */ + 0x87, 0xC0, 0x87, 0xC1, 0x87, 0xC2, 0xC8, 0xC2, /* 0xB4-0xB7 */ + 0x87, 0xC3, 0x87, 0xC4, 0x87, 0xC5, 0x87, 0xC6, /* 0xB8-0xBB */ + 0xBD, 0xC0, 0x87, 0xC7, 0x87, 0xC8, 0x87, 0xC9, /* 0xBC-0xBF */ + 0x87, 0xCA, 0x87, 0xCB, 0x87, 0xCC, 0x87, 0xCD, /* 0xC0-0xC3 */ + 0x87, 0xCE, 0x87, 0xCF, 0x87, 0xD0, 0x87, 0xD1, /* 0xC4-0xC7 */ + 0x87, 0xD2, 0x87, 0xD3, 0xC4, 0xD2, 0x87, 0xD4, /* 0xC8-0xCB */ + 0x87, 0xD5, 0x87, 0xD6, 0x87, 0xD7, 0x87, 0xD8, /* 0xCC-0xCF */ + 0x87, 0xD9, 0x87, 0xDA, 0x87, 0xDB, 0x87, 0xDC, /* 0xD0-0xD3 */ + 0xE0, 0xEC, 0x87, 0xDD, 0x87, 0xDE, 0xE0, 0xED, /* 0xD4-0xD7 */ + 0x87, 0xDF, 0x87, 0xE0, 0xC7, 0xF4, 0xCB, 0xC4, /* 0xD8-0xDB */ + 0x87, 0xE1, 0xE0, 0xEE, 0xBB, 0xD8, 0xD8, 0xB6, /* 0xDC-0xDF */ + 0xD2, 0xF2, 0xE0, 0xEF, 0xCD, 0xC5, 0x87, 0xE2, /* 0xE0-0xE3 */ + 0xB6, 0xDA, 0x87, 0xE3, 0x87, 0xE4, 0x87, 0xE5, /* 0xE4-0xE7 */ + 0x87, 0xE6, 0x87, 0xE7, 0x87, 0xE8, 0xE0, 0xF1, /* 0xE8-0xEB */ + 0x87, 0xE9, 0xD4, 0xB0, 0x87, 0xEA, 0x87, 0xEB, /* 0xEC-0xEF */ + 0xC0, 0xA7, 0xB4, 0xD1, 0x87, 0xEC, 0x87, 0xED, /* 0xF0-0xF3 */ + 0xCE, 0xA7, 0xE0, 0xF0, 0x87, 0xEE, 0x87, 0xEF, /* 0xF4-0xF7 */ + 0x87, 0xF0, 0xE0, 0xF2, 0xB9, 0xCC, 0x87, 0xF1, /* 0xF8-0xFB */ + 0x87, 0xF2, 0xB9, 0xFA, 0xCD, 0xBC, 0xE0, 0xF3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_57[512] = { + 0x87, 0xF3, 0x87, 0xF4, 0x87, 0xF5, 0xC6, 0xD4, /* 0x00-0x03 */ + 0xE0, 0xF4, 0x87, 0xF6, 0xD4, 0xB2, 0x87, 0xF7, /* 0x04-0x07 */ + 0xC8, 0xA6, 0xE0, 0xF6, 0xE0, 0xF5, 0x87, 0xF8, /* 0x08-0x0B */ + 0x87, 0xF9, 0x87, 0xFA, 0x87, 0xFB, 0x87, 0xFC, /* 0x0C-0x0F */ + 0x87, 0xFD, 0x87, 0xFE, 0x88, 0x40, 0x88, 0x41, /* 0x10-0x13 */ + 0x88, 0x42, 0x88, 0x43, 0x88, 0x44, 0x88, 0x45, /* 0x14-0x17 */ + 0x88, 0x46, 0x88, 0x47, 0x88, 0x48, 0x88, 0x49, /* 0x18-0x1B */ + 0xE0, 0xF7, 0x88, 0x4A, 0x88, 0x4B, 0xCD, 0xC1, /* 0x1C-0x1F */ + 0x88, 0x4C, 0x88, 0x4D, 0x88, 0x4E, 0xCA, 0xA5, /* 0x20-0x23 */ + 0x88, 0x4F, 0x88, 0x50, 0x88, 0x51, 0x88, 0x52, /* 0x24-0x27 */ + 0xD4, 0xDA, 0xDB, 0xD7, 0xDB, 0xD9, 0x88, 0x53, /* 0x28-0x2B */ + 0xDB, 0xD8, 0xB9, 0xE7, 0xDB, 0xDC, 0xDB, 0xDD, /* 0x2C-0x2F */ + 0xB5, 0xD8, 0x88, 0x54, 0x88, 0x55, 0xDB, 0xDA, /* 0x30-0x33 */ + 0x88, 0x56, 0x88, 0x57, 0x88, 0x58, 0x88, 0x59, /* 0x34-0x37 */ + 0x88, 0x5A, 0xDB, 0xDB, 0xB3, 0xA1, 0xDB, 0xDF, /* 0x38-0x3B */ + 0x88, 0x5B, 0x88, 0x5C, 0xBB, 0xF8, 0x88, 0x5D, /* 0x3C-0x3F */ + 0xD6, 0xB7, 0x88, 0x5E, 0xDB, 0xE0, 0x88, 0x5F, /* 0x40-0x43 */ + 0x88, 0x60, 0x88, 0x61, 0x88, 0x62, 0xBE, 0xF9, /* 0x44-0x47 */ + 0x88, 0x63, 0x88, 0x64, 0xB7, 0xBB, 0x88, 0x65, /* 0x48-0x4B */ + 0xDB, 0xD0, 0xCC, 0xAE, 0xBF, 0xB2, 0xBB, 0xB5, /* 0x4C-0x4F */ + 0xD7, 0xF8, 0xBF, 0xD3, 0x88, 0x66, 0x88, 0x67, /* 0x50-0x53 */ + 0x88, 0x68, 0x88, 0x69, 0x88, 0x6A, 0xBF, 0xE9, /* 0x54-0x57 */ + 0x88, 0x6B, 0x88, 0x6C, 0xBC, 0xE1, 0xCC, 0xB3, /* 0x58-0x5B */ + 0xDB, 0xDE, 0xB0, 0xD3, 0xCE, 0xEB, 0xB7, 0xD8, /* 0x5C-0x5F */ + 0xD7, 0xB9, 0xC6, 0xC2, 0x88, 0x6D, 0x88, 0x6E, /* 0x60-0x63 */ + 0xC0, 0xA4, 0x88, 0x6F, 0xCC, 0xB9, 0x88, 0x70, /* 0x64-0x67 */ + 0xDB, 0xE7, 0xDB, 0xE1, 0xC6, 0xBA, 0xDB, 0xE3, /* 0x68-0x6B */ + 0x88, 0x71, 0xDB, 0xE8, 0x88, 0x72, 0xC5, 0xF7, /* 0x6C-0x6F */ + 0x88, 0x73, 0x88, 0x74, 0x88, 0x75, 0xDB, 0xEA, /* 0x70-0x73 */ + 0x88, 0x76, 0x88, 0x77, 0xDB, 0xE9, 0xBF, 0xC0, /* 0x74-0x77 */ + 0x88, 0x78, 0x88, 0x79, 0x88, 0x7A, 0xDB, 0xE6, /* 0x78-0x7B */ + 0xDB, 0xE5, 0x88, 0x7B, 0x88, 0x7C, 0x88, 0x7D, /* 0x7C-0x7F */ + + 0x88, 0x7E, 0x88, 0x80, 0xB4, 0xB9, 0xC0, 0xAC, /* 0x80-0x83 */ + 0xC2, 0xA2, 0xDB, 0xE2, 0xDB, 0xE4, 0x88, 0x81, /* 0x84-0x87 */ + 0x88, 0x82, 0x88, 0x83, 0x88, 0x84, 0xD0, 0xCD, /* 0x88-0x8B */ + 0xDB, 0xED, 0x88, 0x85, 0x88, 0x86, 0x88, 0x87, /* 0x8C-0x8F */ + 0x88, 0x88, 0x88, 0x89, 0xC0, 0xDD, 0xDB, 0xF2, /* 0x90-0x93 */ + 0x88, 0x8A, 0x88, 0x8B, 0x88, 0x8C, 0x88, 0x8D, /* 0x94-0x97 */ + 0x88, 0x8E, 0x88, 0x8F, 0x88, 0x90, 0xB6, 0xE2, /* 0x98-0x9B */ + 0x88, 0x91, 0x88, 0x92, 0x88, 0x93, 0x88, 0x94, /* 0x9C-0x9F */ + 0xDB, 0xF3, 0xDB, 0xD2, 0xB9, 0xB8, 0xD4, 0xAB, /* 0xA0-0xA3 */ + 0xDB, 0xEC, 0x88, 0x95, 0xBF, 0xD1, 0xDB, 0xF0, /* 0xA4-0xA7 */ + 0x88, 0x96, 0xDB, 0xD1, 0x88, 0x97, 0xB5, 0xE6, /* 0xA8-0xAB */ + 0x88, 0x98, 0xDB, 0xEB, 0xBF, 0xE5, 0x88, 0x99, /* 0xAC-0xAF */ + 0x88, 0x9A, 0x88, 0x9B, 0xDB, 0xEE, 0x88, 0x9C, /* 0xB0-0xB3 */ + 0xDB, 0xF1, 0x88, 0x9D, 0x88, 0x9E, 0x88, 0x9F, /* 0xB4-0xB7 */ + 0xDB, 0xF9, 0x88, 0xA0, 0x88, 0xA1, 0x88, 0xA2, /* 0xB8-0xBB */ + 0x88, 0xA3, 0x88, 0xA4, 0x88, 0xA5, 0x88, 0xA6, /* 0xBC-0xBF */ + 0x88, 0xA7, 0x88, 0xA8, 0xB9, 0xA1, 0xB0, 0xA3, /* 0xC0-0xC3 */ + 0x88, 0xA9, 0x88, 0xAA, 0x88, 0xAB, 0x88, 0xAC, /* 0xC4-0xC7 */ + 0x88, 0xAD, 0x88, 0xAE, 0x88, 0xAF, 0xC2, 0xF1, /* 0xC8-0xCB */ + 0x88, 0xB0, 0x88, 0xB1, 0xB3, 0xC7, 0xDB, 0xEF, /* 0xCC-0xCF */ + 0x88, 0xB2, 0x88, 0xB3, 0xDB, 0xF8, 0x88, 0xB4, /* 0xD0-0xD3 */ + 0xC6, 0xD2, 0xDB, 0xF4, 0x88, 0xB5, 0x88, 0xB6, /* 0xD4-0xD7 */ + 0xDB, 0xF5, 0xDB, 0xF7, 0xDB, 0xF6, 0x88, 0xB7, /* 0xD8-0xDB */ + 0x88, 0xB8, 0xDB, 0xFE, 0x88, 0xB9, 0xD3, 0xF2, /* 0xDC-0xDF */ + 0xB2, 0xBA, 0x88, 0xBA, 0x88, 0xBB, 0x88, 0xBC, /* 0xE0-0xE3 */ + 0xDB, 0xFD, 0x88, 0xBD, 0x88, 0xBE, 0x88, 0xBF, /* 0xE4-0xE7 */ + 0x88, 0xC0, 0x88, 0xC1, 0x88, 0xC2, 0x88, 0xC3, /* 0xE8-0xEB */ + 0x88, 0xC4, 0xDC, 0xA4, 0x88, 0xC5, 0xDB, 0xFB, /* 0xEC-0xEF */ + 0x88, 0xC6, 0x88, 0xC7, 0x88, 0xC8, 0x88, 0xC9, /* 0xF0-0xF3 */ + 0xDB, 0xFA, 0x88, 0xCA, 0x88, 0xCB, 0x88, 0xCC, /* 0xF4-0xF7 */ + 0xDB, 0xFC, 0xC5, 0xE0, 0xBB, 0xF9, 0x88, 0xCD, /* 0xF8-0xFB */ + 0x88, 0xCE, 0xDC, 0xA3, 0x88, 0xCF, 0x88, 0xD0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_58[512] = { + 0xDC, 0xA5, 0x88, 0xD1, 0xCC, 0xC3, 0x88, 0xD2, /* 0x00-0x03 */ + 0x88, 0xD3, 0x88, 0xD4, 0xB6, 0xD1, 0xDD, 0xC0, /* 0x04-0x07 */ + 0x88, 0xD5, 0x88, 0xD6, 0x88, 0xD7, 0xDC, 0xA1, /* 0x08-0x0B */ + 0x88, 0xD8, 0xDC, 0xA2, 0x88, 0xD9, 0x88, 0xDA, /* 0x0C-0x0F */ + 0x88, 0xDB, 0xC7, 0xB5, 0x88, 0xDC, 0x88, 0xDD, /* 0x10-0x13 */ + 0x88, 0xDE, 0xB6, 0xE9, 0x88, 0xDF, 0x88, 0xE0, /* 0x14-0x17 */ + 0x88, 0xE1, 0xDC, 0xA7, 0x88, 0xE2, 0x88, 0xE3, /* 0x18-0x1B */ + 0x88, 0xE4, 0x88, 0xE5, 0xDC, 0xA6, 0x88, 0xE6, /* 0x1C-0x1F */ + 0xDC, 0xA9, 0xB1, 0xA4, 0x88, 0xE7, 0x88, 0xE8, /* 0x20-0x23 */ + 0xB5, 0xCC, 0x88, 0xE9, 0x88, 0xEA, 0x88, 0xEB, /* 0x24-0x27 */ + 0x88, 0xEC, 0x88, 0xED, 0xBF, 0xB0, 0x88, 0xEE, /* 0x28-0x2B */ + 0x88, 0xEF, 0x88, 0xF0, 0x88, 0xF1, 0x88, 0xF2, /* 0x2C-0x2F */ + 0xD1, 0xDF, 0x88, 0xF3, 0x88, 0xF4, 0x88, 0xF5, /* 0x30-0x33 */ + 0x88, 0xF6, 0xB6, 0xC2, 0x88, 0xF7, 0x88, 0xF8, /* 0x34-0x37 */ + 0x88, 0xF9, 0x88, 0xFA, 0x88, 0xFB, 0x88, 0xFC, /* 0x38-0x3B */ + 0x88, 0xFD, 0x88, 0xFE, 0x89, 0x40, 0x89, 0x41, /* 0x3C-0x3F */ + 0x89, 0x42, 0x89, 0x43, 0x89, 0x44, 0x89, 0x45, /* 0x40-0x43 */ + 0xDC, 0xA8, 0x89, 0x46, 0x89, 0x47, 0x89, 0x48, /* 0x44-0x47 */ + 0x89, 0x49, 0x89, 0x4A, 0x89, 0x4B, 0x89, 0x4C, /* 0x48-0x4B */ + 0xCB, 0xFA, 0xEB, 0xF3, 0x89, 0x4D, 0x89, 0x4E, /* 0x4C-0x4F */ + 0x89, 0x4F, 0xCB, 0xDC, 0x89, 0x50, 0x89, 0x51, /* 0x50-0x53 */ + 0xCB, 0xFE, 0x89, 0x52, 0x89, 0x53, 0x89, 0x54, /* 0x54-0x57 */ + 0xCC, 0xC1, 0x89, 0x55, 0x89, 0x56, 0x89, 0x57, /* 0x58-0x5B */ + 0x89, 0x58, 0x89, 0x59, 0xC8, 0xFB, 0x89, 0x5A, /* 0x5C-0x5F */ + 0x89, 0x5B, 0x89, 0x5C, 0x89, 0x5D, 0x89, 0x5E, /* 0x60-0x63 */ + 0x89, 0x5F, 0xDC, 0xAA, 0x89, 0x60, 0x89, 0x61, /* 0x64-0x67 */ + 0x89, 0x62, 0x89, 0x63, 0x89, 0x64, 0xCC, 0xEE, /* 0x68-0x6B */ + 0xDC, 0xAB, 0x89, 0x65, 0x89, 0x66, 0x89, 0x67, /* 0x6C-0x6F */ + 0x89, 0x68, 0x89, 0x69, 0x89, 0x6A, 0x89, 0x6B, /* 0x70-0x73 */ + 0x89, 0x6C, 0x89, 0x6D, 0x89, 0x6E, 0x89, 0x6F, /* 0x74-0x77 */ + 0x89, 0x70, 0x89, 0x71, 0x89, 0x72, 0x89, 0x73, /* 0x78-0x7B */ + 0x89, 0x74, 0x89, 0x75, 0xDB, 0xD3, 0x89, 0x76, /* 0x7C-0x7F */ + + 0xDC, 0xAF, 0xDC, 0xAC, 0x89, 0x77, 0xBE, 0xB3, /* 0x80-0x83 */ + 0x89, 0x78, 0xCA, 0xFB, 0x89, 0x79, 0x89, 0x7A, /* 0x84-0x87 */ + 0x89, 0x7B, 0xDC, 0xAD, 0x89, 0x7C, 0x89, 0x7D, /* 0x88-0x8B */ + 0x89, 0x7E, 0x89, 0x80, 0x89, 0x81, 0x89, 0x82, /* 0x8C-0x8F */ + 0x89, 0x83, 0x89, 0x84, 0xC9, 0xCA, 0xC4, 0xB9, /* 0x90-0x93 */ + 0x89, 0x85, 0x89, 0x86, 0x89, 0x87, 0x89, 0x88, /* 0x94-0x97 */ + 0x89, 0x89, 0xC7, 0xBD, 0xDC, 0xAE, 0x89, 0x8A, /* 0x98-0x9B */ + 0x89, 0x8B, 0x89, 0x8C, 0xD4, 0xF6, 0xD0, 0xE6, /* 0x9C-0x9F */ + 0x89, 0x8D, 0x89, 0x8E, 0x89, 0x8F, 0x89, 0x90, /* 0xA0-0xA3 */ + 0x89, 0x91, 0x89, 0x92, 0x89, 0x93, 0x89, 0x94, /* 0xA4-0xA7 */ + 0xC4, 0xAB, 0xB6, 0xD5, 0x89, 0x95, 0x89, 0x96, /* 0xA8-0xAB */ + 0x89, 0x97, 0x89, 0x98, 0x89, 0x99, 0x89, 0x9A, /* 0xAC-0xAF */ + 0x89, 0x9B, 0x89, 0x9C, 0x89, 0x9D, 0x89, 0x9E, /* 0xB0-0xB3 */ + 0x89, 0x9F, 0x89, 0xA0, 0x89, 0xA1, 0x89, 0xA2, /* 0xB4-0xB7 */ + 0x89, 0xA3, 0x89, 0xA4, 0x89, 0xA5, 0x89, 0xA6, /* 0xB8-0xBB */ + 0xDB, 0xD4, 0x89, 0xA7, 0x89, 0xA8, 0x89, 0xA9, /* 0xBC-0xBF */ + 0x89, 0xAA, 0xB1, 0xDA, 0x89, 0xAB, 0x89, 0xAC, /* 0xC0-0xC3 */ + 0x89, 0xAD, 0xDB, 0xD5, 0x89, 0xAE, 0x89, 0xAF, /* 0xC4-0xC7 */ + 0x89, 0xB0, 0x89, 0xB1, 0x89, 0xB2, 0x89, 0xB3, /* 0xC8-0xCB */ + 0x89, 0xB4, 0x89, 0xB5, 0x89, 0xB6, 0x89, 0xB7, /* 0xCC-0xCF */ + 0x89, 0xB8, 0xDB, 0xD6, 0x89, 0xB9, 0x89, 0xBA, /* 0xD0-0xD3 */ + 0x89, 0xBB, 0xBA, 0xBE, 0x89, 0xBC, 0x89, 0xBD, /* 0xD4-0xD7 */ + 0x89, 0xBE, 0x89, 0xBF, 0x89, 0xC0, 0x89, 0xC1, /* 0xD8-0xDB */ + 0x89, 0xC2, 0x89, 0xC3, 0x89, 0xC4, 0x89, 0xC5, /* 0xDC-0xDF */ + 0x89, 0xC6, 0x89, 0xC7, 0x89, 0xC8, 0x89, 0xC9, /* 0xE0-0xE3 */ + 0xC8, 0xC0, 0x89, 0xCA, 0x89, 0xCB, 0x89, 0xCC, /* 0xE4-0xE7 */ + 0x89, 0xCD, 0x89, 0xCE, 0x89, 0xCF, 0xCA, 0xBF, /* 0xE8-0xEB */ + 0xC8, 0xC9, 0x89, 0xD0, 0xD7, 0xB3, 0x89, 0xD1, /* 0xEC-0xEF */ + 0xC9, 0xF9, 0x89, 0xD2, 0x89, 0xD3, 0xBF, 0xC7, /* 0xF0-0xF3 */ + 0x89, 0xD4, 0x89, 0xD5, 0xBA, 0xF8, 0x89, 0xD6, /* 0xF4-0xF7 */ + 0x89, 0xD7, 0xD2, 0xBC, 0x89, 0xD8, 0x89, 0xD9, /* 0xF8-0xFB */ + 0x89, 0xDA, 0x89, 0xDB, 0x89, 0xDC, 0x89, 0xDD, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_59[512] = { + 0x89, 0xDE, 0x89, 0xDF, 0xE2, 0xBA, 0x89, 0xE0, /* 0x00-0x03 */ + 0xB4, 0xA6, 0x89, 0xE1, 0x89, 0xE2, 0xB1, 0xB8, /* 0x04-0x07 */ + 0x89, 0xE3, 0x89, 0xE4, 0x89, 0xE5, 0x89, 0xE6, /* 0x08-0x0B */ + 0x89, 0xE7, 0xB8, 0xB4, 0x89, 0xE8, 0xCF, 0xC4, /* 0x0C-0x0F */ + 0x89, 0xE9, 0x89, 0xEA, 0x89, 0xEB, 0x89, 0xEC, /* 0x10-0x13 */ + 0xD9, 0xE7, 0xCF, 0xA6, 0xCD, 0xE2, 0x89, 0xED, /* 0x14-0x17 */ + 0x89, 0xEE, 0xD9, 0xED, 0xB6, 0xE0, 0x89, 0xEF, /* 0x18-0x1B */ + 0xD2, 0xB9, 0x89, 0xF0, 0x89, 0xF1, 0xB9, 0xBB, /* 0x1C-0x1F */ + 0x89, 0xF2, 0x89, 0xF3, 0x89, 0xF4, 0x89, 0xF5, /* 0x20-0x23 */ + 0xE2, 0xB9, 0xE2, 0xB7, 0x89, 0xF6, 0xB4, 0xF3, /* 0x24-0x27 */ + 0x89, 0xF7, 0xCC, 0xEC, 0xCC, 0xAB, 0xB7, 0xF2, /* 0x28-0x2B */ + 0x89, 0xF8, 0xD8, 0xB2, 0xD1, 0xEB, 0xBA, 0xBB, /* 0x2C-0x2F */ + 0x89, 0xF9, 0xCA, 0xA7, 0x89, 0xFA, 0x89, 0xFB, /* 0x30-0x33 */ + 0xCD, 0xB7, 0x89, 0xFC, 0x89, 0xFD, 0xD2, 0xC4, /* 0x34-0x37 */ + 0xBF, 0xE4, 0xBC, 0xD0, 0xB6, 0xE1, 0x89, 0xFE, /* 0x38-0x3B */ + 0xDE, 0xC5, 0x8A, 0x40, 0x8A, 0x41, 0x8A, 0x42, /* 0x3C-0x3F */ + 0x8A, 0x43, 0xDE, 0xC6, 0xDB, 0xBC, 0x8A, 0x44, /* 0x40-0x43 */ + 0xD1, 0xD9, 0x8A, 0x45, 0x8A, 0x46, 0xC6, 0xE6, /* 0x44-0x47 */ + 0xC4, 0xCE, 0xB7, 0xEE, 0x8A, 0x47, 0xB7, 0xDC, /* 0x48-0x4B */ + 0x8A, 0x48, 0x8A, 0x49, 0xBF, 0xFC, 0xD7, 0xE0, /* 0x4C-0x4F */ + 0x8A, 0x4A, 0xC6, 0xF5, 0x8A, 0x4B, 0x8A, 0x4C, /* 0x50-0x53 */ + 0xB1, 0xBC, 0xDE, 0xC8, 0xBD, 0xB1, 0xCC, 0xD7, /* 0x54-0x57 */ + 0xDE, 0xCA, 0x8A, 0x4D, 0xDE, 0xC9, 0x8A, 0x4E, /* 0x58-0x5B */ + 0x8A, 0x4F, 0x8A, 0x50, 0x8A, 0x51, 0x8A, 0x52, /* 0x5C-0x5F */ + 0xB5, 0xEC, 0x8A, 0x53, 0xC9, 0xDD, 0x8A, 0x54, /* 0x60-0x63 */ + 0x8A, 0x55, 0xB0, 0xC2, 0x8A, 0x56, 0x8A, 0x57, /* 0x64-0x67 */ + 0x8A, 0x58, 0x8A, 0x59, 0x8A, 0x5A, 0x8A, 0x5B, /* 0x68-0x6B */ + 0x8A, 0x5C, 0x8A, 0x5D, 0x8A, 0x5E, 0x8A, 0x5F, /* 0x6C-0x6F */ + 0x8A, 0x60, 0x8A, 0x61, 0x8A, 0x62, 0xC5, 0xAE, /* 0x70-0x73 */ + 0xC5, 0xAB, 0x8A, 0x63, 0xC4, 0xCC, 0x8A, 0x64, /* 0x74-0x77 */ + 0xBC, 0xE9, 0xCB, 0xFD, 0x8A, 0x65, 0x8A, 0x66, /* 0x78-0x7B */ + 0x8A, 0x67, 0xBA, 0xC3, 0x8A, 0x68, 0x8A, 0x69, /* 0x7C-0x7F */ + + 0x8A, 0x6A, 0xE5, 0xF9, 0xC8, 0xE7, 0xE5, 0xFA, /* 0x80-0x83 */ + 0xCD, 0xFD, 0x8A, 0x6B, 0xD7, 0xB1, 0xB8, 0xBE, /* 0x84-0x87 */ + 0xC2, 0xE8, 0x8A, 0x6C, 0xC8, 0xD1, 0x8A, 0x6D, /* 0x88-0x8B */ + 0x8A, 0x6E, 0xE5, 0xFB, 0x8A, 0x6F, 0x8A, 0x70, /* 0x8C-0x8F */ + 0x8A, 0x71, 0x8A, 0x72, 0xB6, 0xCA, 0xBC, 0xCB, /* 0x90-0x93 */ + 0x8A, 0x73, 0x8A, 0x74, 0xD1, 0xFD, 0xE6, 0xA1, /* 0x94-0x97 */ + 0x8A, 0x75, 0xC3, 0xEE, 0x8A, 0x76, 0x8A, 0x77, /* 0x98-0x9B */ + 0x8A, 0x78, 0x8A, 0x79, 0xE6, 0xA4, 0x8A, 0x7A, /* 0x9C-0x9F */ + 0x8A, 0x7B, 0x8A, 0x7C, 0x8A, 0x7D, 0xE5, 0xFE, /* 0xA0-0xA3 */ + 0xE6, 0xA5, 0xCD, 0xD7, 0x8A, 0x7E, 0x8A, 0x80, /* 0xA4-0xA7 */ + 0xB7, 0xC1, 0xE5, 0xFC, 0xE5, 0xFD, 0xE6, 0xA3, /* 0xA8-0xAB */ + 0x8A, 0x81, 0x8A, 0x82, 0xC4, 0xDD, 0xE6, 0xA8, /* 0xAC-0xAF */ + 0x8A, 0x83, 0x8A, 0x84, 0xE6, 0xA7, 0x8A, 0x85, /* 0xB0-0xB3 */ + 0x8A, 0x86, 0x8A, 0x87, 0x8A, 0x88, 0x8A, 0x89, /* 0xB4-0xB7 */ + 0x8A, 0x8A, 0xC3, 0xC3, 0x8A, 0x8B, 0xC6, 0xDE, /* 0xB8-0xBB */ + 0x8A, 0x8C, 0x8A, 0x8D, 0xE6, 0xAA, 0x8A, 0x8E, /* 0xBC-0xBF */ + 0x8A, 0x8F, 0x8A, 0x90, 0x8A, 0x91, 0x8A, 0x92, /* 0xC0-0xC3 */ + 0x8A, 0x93, 0x8A, 0x94, 0xC4, 0xB7, 0x8A, 0x95, /* 0xC4-0xC7 */ + 0x8A, 0x96, 0x8A, 0x97, 0xE6, 0xA2, 0xCA, 0xBC, /* 0xC8-0xCB */ + 0x8A, 0x98, 0x8A, 0x99, 0x8A, 0x9A, 0x8A, 0x9B, /* 0xCC-0xCF */ + 0xBD, 0xE3, 0xB9, 0xC3, 0xE6, 0xA6, 0xD0, 0xD5, /* 0xD0-0xD3 */ + 0xCE, 0xAF, 0x8A, 0x9C, 0x8A, 0x9D, 0xE6, 0xA9, /* 0xD4-0xD7 */ + 0xE6, 0xB0, 0x8A, 0x9E, 0xD2, 0xA6, 0x8A, 0x9F, /* 0xD8-0xDB */ + 0xBD, 0xAA, 0xE6, 0xAD, 0x8A, 0xA0, 0x8A, 0xA1, /* 0xDC-0xDF */ + 0x8A, 0xA2, 0x8A, 0xA3, 0x8A, 0xA4, 0xE6, 0xAF, /* 0xE0-0xE3 */ + 0x8A, 0xA5, 0xC0, 0xD1, 0x8A, 0xA6, 0x8A, 0xA7, /* 0xE4-0xE7 */ + 0xD2, 0xCC, 0x8A, 0xA8, 0x8A, 0xA9, 0x8A, 0xAA, /* 0xE8-0xEB */ + 0xBC, 0xA7, 0x8A, 0xAB, 0x8A, 0xAC, 0x8A, 0xAD, /* 0xEC-0xEF */ + 0x8A, 0xAE, 0x8A, 0xAF, 0x8A, 0xB0, 0x8A, 0xB1, /* 0xF0-0xF3 */ + 0x8A, 0xB2, 0x8A, 0xB3, 0x8A, 0xB4, 0x8A, 0xB5, /* 0xF4-0xF7 */ + 0x8A, 0xB6, 0xE6, 0xB1, 0x8A, 0xB7, 0xD2, 0xF6, /* 0xF8-0xFB */ + 0x8A, 0xB8, 0x8A, 0xB9, 0x8A, 0xBA, 0xD7, 0xCB, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5A[512] = { + 0x8A, 0xBB, 0xCD, 0xFE, 0x8A, 0xBC, 0xCD, 0xDE, /* 0x00-0x03 */ + 0xC2, 0xA6, 0xE6, 0xAB, 0xE6, 0xAC, 0xBD, 0xBF, /* 0x04-0x07 */ + 0xE6, 0xAE, 0xE6, 0xB3, 0x8A, 0xBD, 0x8A, 0xBE, /* 0x08-0x0B */ + 0xE6, 0xB2, 0x8A, 0xBF, 0x8A, 0xC0, 0x8A, 0xC1, /* 0x0C-0x0F */ + 0x8A, 0xC2, 0xE6, 0xB6, 0x8A, 0xC3, 0xE6, 0xB8, /* 0x10-0x13 */ + 0x8A, 0xC4, 0x8A, 0xC5, 0x8A, 0xC6, 0x8A, 0xC7, /* 0x14-0x17 */ + 0xC4, 0xEF, 0x8A, 0xC8, 0x8A, 0xC9, 0x8A, 0xCA, /* 0x18-0x1B */ + 0xC4, 0xC8, 0x8A, 0xCB, 0x8A, 0xCC, 0xBE, 0xEA, /* 0x1C-0x1F */ + 0xC9, 0xEF, 0x8A, 0xCD, 0x8A, 0xCE, 0xE6, 0xB7, /* 0x20-0x23 */ + 0x8A, 0xCF, 0xB6, 0xF0, 0x8A, 0xD0, 0x8A, 0xD1, /* 0x24-0x27 */ + 0x8A, 0xD2, 0xC3, 0xE4, 0x8A, 0xD3, 0x8A, 0xD4, /* 0x28-0x2B */ + 0x8A, 0xD5, 0x8A, 0xD6, 0x8A, 0xD7, 0x8A, 0xD8, /* 0x2C-0x2F */ + 0x8A, 0xD9, 0xD3, 0xE9, 0xE6, 0xB4, 0x8A, 0xDA, /* 0x30-0x33 */ + 0xE6, 0xB5, 0x8A, 0xDB, 0xC8, 0xA2, 0x8A, 0xDC, /* 0x34-0x37 */ + 0x8A, 0xDD, 0x8A, 0xDE, 0x8A, 0xDF, 0x8A, 0xE0, /* 0x38-0x3B */ + 0xE6, 0xBD, 0x8A, 0xE1, 0x8A, 0xE2, 0x8A, 0xE3, /* 0x3C-0x3F */ + 0xE6, 0xB9, 0x8A, 0xE4, 0x8A, 0xE5, 0x8A, 0xE6, /* 0x40-0x43 */ + 0x8A, 0xE7, 0x8A, 0xE8, 0xC6, 0xC5, 0x8A, 0xE9, /* 0x44-0x47 */ + 0x8A, 0xEA, 0xCD, 0xF1, 0xE6, 0xBB, 0x8A, 0xEB, /* 0x48-0x4B */ + 0x8A, 0xEC, 0x8A, 0xED, 0x8A, 0xEE, 0x8A, 0xEF, /* 0x4C-0x4F */ + 0x8A, 0xF0, 0x8A, 0xF1, 0x8A, 0xF2, 0x8A, 0xF3, /* 0x50-0x53 */ + 0x8A, 0xF4, 0xE6, 0xBC, 0x8A, 0xF5, 0x8A, 0xF6, /* 0x54-0x57 */ + 0x8A, 0xF7, 0x8A, 0xF8, 0xBB, 0xE9, 0x8A, 0xF9, /* 0x58-0x5B */ + 0x8A, 0xFA, 0x8A, 0xFB, 0x8A, 0xFC, 0x8A, 0xFD, /* 0x5C-0x5F */ + 0x8A, 0xFE, 0x8B, 0x40, 0xE6, 0xBE, 0x8B, 0x41, /* 0x60-0x63 */ + 0x8B, 0x42, 0x8B, 0x43, 0x8B, 0x44, 0xE6, 0xBA, /* 0x64-0x67 */ + 0x8B, 0x45, 0x8B, 0x46, 0xC0, 0xB7, 0x8B, 0x47, /* 0x68-0x6B */ + 0x8B, 0x48, 0x8B, 0x49, 0x8B, 0x4A, 0x8B, 0x4B, /* 0x6C-0x6F */ + 0x8B, 0x4C, 0x8B, 0x4D, 0x8B, 0x4E, 0x8B, 0x4F, /* 0x70-0x73 */ + 0xD3, 0xA4, 0xE6, 0xBF, 0xC9, 0xF4, 0xE6, 0xC3, /* 0x74-0x77 */ + 0x8B, 0x50, 0x8B, 0x51, 0xE6, 0xC4, 0x8B, 0x52, /* 0x78-0x7B */ + 0x8B, 0x53, 0x8B, 0x54, 0x8B, 0x55, 0xD0, 0xF6, /* 0x7C-0x7F */ + + 0x8B, 0x56, 0x8B, 0x57, 0x8B, 0x58, 0x8B, 0x59, /* 0x80-0x83 */ + 0x8B, 0x5A, 0x8B, 0x5B, 0x8B, 0x5C, 0x8B, 0x5D, /* 0x84-0x87 */ + 0x8B, 0x5E, 0x8B, 0x5F, 0x8B, 0x60, 0x8B, 0x61, /* 0x88-0x8B */ + 0x8B, 0x62, 0x8B, 0x63, 0x8B, 0x64, 0x8B, 0x65, /* 0x8C-0x8F */ + 0x8B, 0x66, 0x8B, 0x67, 0xC3, 0xBD, 0x8B, 0x68, /* 0x90-0x93 */ + 0x8B, 0x69, 0x8B, 0x6A, 0x8B, 0x6B, 0x8B, 0x6C, /* 0x94-0x97 */ + 0x8B, 0x6D, 0x8B, 0x6E, 0xC3, 0xC4, 0xE6, 0xC2, /* 0x98-0x9B */ + 0x8B, 0x6F, 0x8B, 0x70, 0x8B, 0x71, 0x8B, 0x72, /* 0x9C-0x9F */ + 0x8B, 0x73, 0x8B, 0x74, 0x8B, 0x75, 0x8B, 0x76, /* 0xA0-0xA3 */ + 0x8B, 0x77, 0x8B, 0x78, 0x8B, 0x79, 0x8B, 0x7A, /* 0xA4-0xA7 */ + 0x8B, 0x7B, 0x8B, 0x7C, 0xE6, 0xC1, 0x8B, 0x7D, /* 0xA8-0xAB */ + 0x8B, 0x7E, 0x8B, 0x80, 0x8B, 0x81, 0x8B, 0x82, /* 0xAC-0xAF */ + 0x8B, 0x83, 0x8B, 0x84, 0xE6, 0xC7, 0xCF, 0xB1, /* 0xB0-0xB3 */ + 0x8B, 0x85, 0xEB, 0xF4, 0x8B, 0x86, 0x8B, 0x87, /* 0xB4-0xB7 */ + 0xE6, 0xCA, 0x8B, 0x88, 0x8B, 0x89, 0x8B, 0x8A, /* 0xB8-0xBB */ + 0x8B, 0x8B, 0x8B, 0x8C, 0xE6, 0xC5, 0x8B, 0x8D, /* 0xBC-0xBF */ + 0x8B, 0x8E, 0xBC, 0xDE, 0xC9, 0xA9, 0x8B, 0x8F, /* 0xC0-0xC3 */ + 0x8B, 0x90, 0x8B, 0x91, 0x8B, 0x92, 0x8B, 0x93, /* 0xC4-0xC7 */ + 0x8B, 0x94, 0xBC, 0xB5, 0x8B, 0x95, 0x8B, 0x96, /* 0xC8-0xCB */ + 0xCF, 0xD3, 0x8B, 0x97, 0x8B, 0x98, 0x8B, 0x99, /* 0xCC-0xCF */ + 0x8B, 0x9A, 0x8B, 0x9B, 0xE6, 0xC8, 0x8B, 0x9C, /* 0xD0-0xD3 */ + 0xE6, 0xC9, 0x8B, 0x9D, 0xE6, 0xCE, 0x8B, 0x9E, /* 0xD4-0xD7 */ + 0xE6, 0xD0, 0x8B, 0x9F, 0x8B, 0xA0, 0x8B, 0xA1, /* 0xD8-0xDB */ + 0xE6, 0xD1, 0x8B, 0xA2, 0x8B, 0xA3, 0x8B, 0xA4, /* 0xDC-0xDF */ + 0xE6, 0xCB, 0xB5, 0xD5, 0x8B, 0xA5, 0xE6, 0xCC, /* 0xE0-0xE3 */ + 0x8B, 0xA6, 0x8B, 0xA7, 0xE6, 0xCF, 0x8B, 0xA8, /* 0xE4-0xE7 */ + 0x8B, 0xA9, 0xC4, 0xDB, 0x8B, 0xAA, 0xE6, 0xC6, /* 0xE8-0xEB */ + 0x8B, 0xAB, 0x8B, 0xAC, 0x8B, 0xAD, 0x8B, 0xAE, /* 0xEC-0xEF */ + 0x8B, 0xAF, 0xE6, 0xCD, 0x8B, 0xB0, 0x8B, 0xB1, /* 0xF0-0xF3 */ + 0x8B, 0xB2, 0x8B, 0xB3, 0x8B, 0xB4, 0x8B, 0xB5, /* 0xF4-0xF7 */ + 0x8B, 0xB6, 0x8B, 0xB7, 0x8B, 0xB8, 0x8B, 0xB9, /* 0xF8-0xFB */ + 0x8B, 0xBA, 0x8B, 0xBB, 0x8B, 0xBC, 0x8B, 0xBD, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5B[512] = { + 0x8B, 0xBE, 0x8B, 0xBF, 0x8B, 0xC0, 0x8B, 0xC1, /* 0x00-0x03 */ + 0x8B, 0xC2, 0x8B, 0xC3, 0x8B, 0xC4, 0x8B, 0xC5, /* 0x04-0x07 */ + 0x8B, 0xC6, 0xE6, 0xD2, 0x8B, 0xC7, 0x8B, 0xC8, /* 0x08-0x0B */ + 0x8B, 0xC9, 0x8B, 0xCA, 0x8B, 0xCB, 0x8B, 0xCC, /* 0x0C-0x0F */ + 0x8B, 0xCD, 0x8B, 0xCE, 0x8B, 0xCF, 0x8B, 0xD0, /* 0x10-0x13 */ + 0x8B, 0xD1, 0x8B, 0xD2, 0xE6, 0xD4, 0xE6, 0xD3, /* 0x14-0x17 */ + 0x8B, 0xD3, 0x8B, 0xD4, 0x8B, 0xD5, 0x8B, 0xD6, /* 0x18-0x1B */ + 0x8B, 0xD7, 0x8B, 0xD8, 0x8B, 0xD9, 0x8B, 0xDA, /* 0x1C-0x1F */ + 0x8B, 0xDB, 0x8B, 0xDC, 0x8B, 0xDD, 0x8B, 0xDE, /* 0x20-0x23 */ + 0x8B, 0xDF, 0x8B, 0xE0, 0x8B, 0xE1, 0x8B, 0xE2, /* 0x24-0x27 */ + 0x8B, 0xE3, 0x8B, 0xE4, 0x8B, 0xE5, 0x8B, 0xE6, /* 0x28-0x2B */ + 0x8B, 0xE7, 0x8B, 0xE8, 0x8B, 0xE9, 0x8B, 0xEA, /* 0x2C-0x2F */ + 0x8B, 0xEB, 0x8B, 0xEC, 0xE6, 0xD5, 0x8B, 0xED, /* 0x30-0x33 */ + 0xD9, 0xF8, 0x8B, 0xEE, 0x8B, 0xEF, 0xE6, 0xD6, /* 0x34-0x37 */ + 0x8B, 0xF0, 0x8B, 0xF1, 0x8B, 0xF2, 0x8B, 0xF3, /* 0x38-0x3B */ + 0x8B, 0xF4, 0x8B, 0xF5, 0x8B, 0xF6, 0x8B, 0xF7, /* 0x3C-0x3F */ + 0xE6, 0xD7, 0x8B, 0xF8, 0x8B, 0xF9, 0x8B, 0xFA, /* 0x40-0x43 */ + 0x8B, 0xFB, 0x8B, 0xFC, 0x8B, 0xFD, 0x8B, 0xFE, /* 0x44-0x47 */ + 0x8C, 0x40, 0x8C, 0x41, 0x8C, 0x42, 0x8C, 0x43, /* 0x48-0x4B */ + 0x8C, 0x44, 0x8C, 0x45, 0x8C, 0x46, 0x8C, 0x47, /* 0x4C-0x4F */ + 0xD7, 0xD3, 0xE6, 0xDD, 0x8C, 0x48, 0xE6, 0xDE, /* 0x50-0x53 */ + 0xBF, 0xD7, 0xD4, 0xD0, 0x8C, 0x49, 0xD7, 0xD6, /* 0x54-0x57 */ + 0xB4, 0xE6, 0xCB, 0xEF, 0xE6, 0xDA, 0xD8, 0xC3, /* 0x58-0x5B */ + 0xD7, 0xCE, 0xD0, 0xA2, 0x8C, 0x4A, 0xC3, 0xCF, /* 0x5C-0x5F */ + 0x8C, 0x4B, 0x8C, 0x4C, 0xE6, 0xDF, 0xBC, 0xBE, /* 0x60-0x63 */ + 0xB9, 0xC2, 0xE6, 0xDB, 0xD1, 0xA7, 0x8C, 0x4D, /* 0x64-0x67 */ + 0x8C, 0x4E, 0xBA, 0xA2, 0xC2, 0xCF, 0x8C, 0x4F, /* 0x68-0x6B */ + 0xD8, 0xAB, 0x8C, 0x50, 0x8C, 0x51, 0x8C, 0x52, /* 0x6C-0x6F */ + 0xCA, 0xEB, 0xE5, 0xEE, 0x8C, 0x53, 0xE6, 0xDC, /* 0x70-0x73 */ + 0x8C, 0x54, 0xB7, 0xF5, 0x8C, 0x55, 0x8C, 0x56, /* 0x74-0x77 */ + 0x8C, 0x57, 0x8C, 0x58, 0xC8, 0xE6, 0x8C, 0x59, /* 0x78-0x7B */ + 0x8C, 0x5A, 0xC4, 0xF5, 0x8C, 0x5B, 0x8C, 0x5C, /* 0x7C-0x7F */ + + 0xE5, 0xB2, 0xC4, 0xFE, 0x8C, 0x5D, 0xCB, 0xFC, /* 0x80-0x83 */ + 0xE5, 0xB3, 0xD5, 0xAC, 0x8C, 0x5E, 0xD3, 0xEE, /* 0x84-0x87 */ + 0xCA, 0xD8, 0xB0, 0xB2, 0x8C, 0x5F, 0xCB, 0xCE, /* 0x88-0x8B */ + 0xCD, 0xEA, 0x8C, 0x60, 0x8C, 0x61, 0xBA, 0xEA, /* 0x8C-0x8F */ + 0x8C, 0x62, 0x8C, 0x63, 0x8C, 0x64, 0xE5, 0xB5, /* 0x90-0x93 */ + 0x8C, 0x65, 0xE5, 0xB4, 0x8C, 0x66, 0xD7, 0xDA, /* 0x94-0x97 */ + 0xB9, 0xD9, 0xD6, 0xE6, 0xB6, 0xA8, 0xCD, 0xF0, /* 0x98-0x9B */ + 0xD2, 0xCB, 0xB1, 0xA6, 0xCA, 0xB5, 0x8C, 0x67, /* 0x9C-0x9F */ + 0xB3, 0xE8, 0xC9, 0xF3, 0xBF, 0xCD, 0xD0, 0xFB, /* 0xA0-0xA3 */ + 0xCA, 0xD2, 0xE5, 0xB6, 0xBB, 0xC2, 0x8C, 0x68, /* 0xA4-0xA7 */ + 0x8C, 0x69, 0x8C, 0x6A, 0xCF, 0xDC, 0xB9, 0xAC, /* 0xA8-0xAB */ + 0x8C, 0x6B, 0x8C, 0x6C, 0x8C, 0x6D, 0x8C, 0x6E, /* 0xAC-0xAF */ + 0xD4, 0xD7, 0x8C, 0x6F, 0x8C, 0x70, 0xBA, 0xA6, /* 0xB0-0xB3 */ + 0xD1, 0xE7, 0xCF, 0xFC, 0xBC, 0xD2, 0x8C, 0x71, /* 0xB4-0xB7 */ + 0xE5, 0xB7, 0xC8, 0xDD, 0x8C, 0x72, 0x8C, 0x73, /* 0xB8-0xBB */ + 0x8C, 0x74, 0xBF, 0xED, 0xB1, 0xF6, 0xCB, 0xDE, /* 0xBC-0xBF */ + 0x8C, 0x75, 0x8C, 0x76, 0xBC, 0xC5, 0x8C, 0x77, /* 0xC0-0xC3 */ + 0xBC, 0xC4, 0xD2, 0xFA, 0xC3, 0xDC, 0xBF, 0xDC, /* 0xC4-0xC7 */ + 0x8C, 0x78, 0x8C, 0x79, 0x8C, 0x7A, 0x8C, 0x7B, /* 0xC8-0xCB */ + 0xB8, 0xBB, 0x8C, 0x7C, 0x8C, 0x7D, 0x8C, 0x7E, /* 0xCC-0xCF */ + 0xC3, 0xC2, 0x8C, 0x80, 0xBA, 0xAE, 0xD4, 0xA2, /* 0xD0-0xD3 */ + 0x8C, 0x81, 0x8C, 0x82, 0x8C, 0x83, 0x8C, 0x84, /* 0xD4-0xD7 */ + 0x8C, 0x85, 0x8C, 0x86, 0x8C, 0x87, 0x8C, 0x88, /* 0xD8-0xDB */ + 0x8C, 0x89, 0xC7, 0xDE, 0xC4, 0xAF, 0xB2, 0xEC, /* 0xDC-0xDF */ + 0x8C, 0x8A, 0xB9, 0xD1, 0x8C, 0x8B, 0x8C, 0x8C, /* 0xE0-0xE3 */ + 0xE5, 0xBB, 0xC1, 0xC8, 0x8C, 0x8D, 0x8C, 0x8E, /* 0xE4-0xE7 */ + 0xD5, 0xAF, 0x8C, 0x8F, 0x8C, 0x90, 0x8C, 0x91, /* 0xE8-0xEB */ + 0x8C, 0x92, 0x8C, 0x93, 0xE5, 0xBC, 0x8C, 0x94, /* 0xEC-0xEF */ + 0xE5, 0xBE, 0x8C, 0x95, 0x8C, 0x96, 0x8C, 0x97, /* 0xF0-0xF3 */ + 0x8C, 0x98, 0x8C, 0x99, 0x8C, 0x9A, 0x8C, 0x9B, /* 0xF4-0xF7 */ + 0xB4, 0xE7, 0xB6, 0xD4, 0xCB, 0xC2, 0xD1, 0xB0, /* 0xF8-0xFB */ + 0xB5, 0xBC, 0x8C, 0x9C, 0x8C, 0x9D, 0xCA, 0xD9, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5C[512] = { + 0x8C, 0x9E, 0xB7, 0xE2, 0x8C, 0x9F, 0x8C, 0xA0, /* 0x00-0x03 */ + 0xC9, 0xE4, 0x8C, 0xA1, 0xBD, 0xAB, 0x8C, 0xA2, /* 0x04-0x07 */ + 0x8C, 0xA3, 0xCE, 0xBE, 0xD7, 0xF0, 0x8C, 0xA4, /* 0x08-0x0B */ + 0x8C, 0xA5, 0x8C, 0xA6, 0x8C, 0xA7, 0xD0, 0xA1, /* 0x0C-0x0F */ + 0x8C, 0xA8, 0xC9, 0xD9, 0x8C, 0xA9, 0x8C, 0xAA, /* 0x10-0x13 */ + 0xB6, 0xFB, 0xE6, 0xD8, 0xBC, 0xE2, 0x8C, 0xAB, /* 0x14-0x17 */ + 0xB3, 0xBE, 0x8C, 0xAC, 0xC9, 0xD0, 0x8C, 0xAD, /* 0x18-0x1B */ + 0xE6, 0xD9, 0xB3, 0xA2, 0x8C, 0xAE, 0x8C, 0xAF, /* 0x1C-0x1F */ + 0x8C, 0xB0, 0x8C, 0xB1, 0xDE, 0xCC, 0x8C, 0xB2, /* 0x20-0x23 */ + 0xD3, 0xC8, 0xDE, 0xCD, 0x8C, 0xB3, 0xD2, 0xA2, /* 0x24-0x27 */ + 0x8C, 0xB4, 0x8C, 0xB5, 0x8C, 0xB6, 0x8C, 0xB7, /* 0x28-0x2B */ + 0xDE, 0xCE, 0x8C, 0xB8, 0x8C, 0xB9, 0x8C, 0xBA, /* 0x2C-0x2F */ + 0x8C, 0xBB, 0xBE, 0xCD, 0x8C, 0xBC, 0x8C, 0xBD, /* 0x30-0x33 */ + 0xDE, 0xCF, 0x8C, 0xBE, 0x8C, 0xBF, 0x8C, 0xC0, /* 0x34-0x37 */ + 0xCA, 0xAC, 0xD2, 0xFC, 0xB3, 0xDF, 0xE5, 0xEA, /* 0x38-0x3B */ + 0xC4, 0xE1, 0xBE, 0xA1, 0xCE, 0xB2, 0xC4, 0xF2, /* 0x3C-0x3F */ + 0xBE, 0xD6, 0xC6, 0xA8, 0xB2, 0xE3, 0x8C, 0xC1, /* 0x40-0x43 */ + 0x8C, 0xC2, 0xBE, 0xD3, 0x8C, 0xC3, 0x8C, 0xC4, /* 0x44-0x47 */ + 0xC7, 0xFC, 0xCC, 0xEB, 0xBD, 0xEC, 0xCE, 0xDD, /* 0x48-0x4B */ + 0x8C, 0xC5, 0x8C, 0xC6, 0xCA, 0xBA, 0xC6, 0xC1, /* 0x4C-0x4F */ + 0xE5, 0xEC, 0xD0, 0xBC, 0x8C, 0xC7, 0x8C, 0xC8, /* 0x50-0x53 */ + 0x8C, 0xC9, 0xD5, 0xB9, 0x8C, 0xCA, 0x8C, 0xCB, /* 0x54-0x57 */ + 0x8C, 0xCC, 0xE5, 0xED, 0x8C, 0xCD, 0x8C, 0xCE, /* 0x58-0x5B */ + 0x8C, 0xCF, 0x8C, 0xD0, 0xCA, 0xF4, 0x8C, 0xD1, /* 0x5C-0x5F */ + 0xCD, 0xC0, 0xC2, 0xC5, 0x8C, 0xD2, 0xE5, 0xEF, /* 0x60-0x63 */ + 0x8C, 0xD3, 0xC2, 0xC4, 0xE5, 0xF0, 0x8C, 0xD4, /* 0x64-0x67 */ + 0x8C, 0xD5, 0x8C, 0xD6, 0x8C, 0xD7, 0x8C, 0xD8, /* 0x68-0x6B */ + 0x8C, 0xD9, 0x8C, 0xDA, 0xE5, 0xF8, 0xCD, 0xCD, /* 0x6C-0x6F */ + 0x8C, 0xDB, 0xC9, 0xBD, 0x8C, 0xDC, 0x8C, 0xDD, /* 0x70-0x73 */ + 0x8C, 0xDE, 0x8C, 0xDF, 0x8C, 0xE0, 0x8C, 0xE1, /* 0x74-0x77 */ + 0x8C, 0xE2, 0xD2, 0xD9, 0xE1, 0xA8, 0x8C, 0xE3, /* 0x78-0x7B */ + 0x8C, 0xE4, 0x8C, 0xE5, 0x8C, 0xE6, 0xD3, 0xEC, /* 0x7C-0x7F */ + + 0x8C, 0xE7, 0xCB, 0xEA, 0xC6, 0xF1, 0x8C, 0xE8, /* 0x80-0x83 */ + 0x8C, 0xE9, 0x8C, 0xEA, 0x8C, 0xEB, 0x8C, 0xEC, /* 0x84-0x87 */ + 0xE1, 0xAC, 0x8C, 0xED, 0x8C, 0xEE, 0x8C, 0xEF, /* 0x88-0x8B */ + 0xE1, 0xA7, 0xE1, 0xA9, 0x8C, 0xF0, 0x8C, 0xF1, /* 0x8C-0x8F */ + 0xE1, 0xAA, 0xE1, 0xAF, 0x8C, 0xF2, 0x8C, 0xF3, /* 0x90-0x93 */ + 0xB2, 0xED, 0x8C, 0xF4, 0xE1, 0xAB, 0xB8, 0xDA, /* 0x94-0x97 */ + 0xE1, 0xAD, 0xE1, 0xAE, 0xE1, 0xB0, 0xB5, 0xBA, /* 0x98-0x9B */ + 0xE1, 0xB1, 0x8C, 0xF5, 0x8C, 0xF6, 0x8C, 0xF7, /* 0x9C-0x9F */ + 0x8C, 0xF8, 0x8C, 0xF9, 0xE1, 0xB3, 0xE1, 0xB8, /* 0xA0-0xA3 */ + 0x8C, 0xFA, 0x8C, 0xFB, 0x8C, 0xFC, 0x8C, 0xFD, /* 0xA4-0xA7 */ + 0x8C, 0xFE, 0xD1, 0xD2, 0x8D, 0x40, 0xE1, 0xB6, /* 0xA8-0xAB */ + 0xE1, 0xB5, 0xC1, 0xEB, 0x8D, 0x41, 0x8D, 0x42, /* 0xAC-0xAF */ + 0x8D, 0x43, 0xE1, 0xB7, 0x8D, 0x44, 0xD4, 0xC0, /* 0xB0-0xB3 */ + 0x8D, 0x45, 0xE1, 0xB2, 0x8D, 0x46, 0xE1, 0xBA, /* 0xB4-0xB7 */ + 0xB0, 0xB6, 0x8D, 0x47, 0x8D, 0x48, 0x8D, 0x49, /* 0xB8-0xBB */ + 0x8D, 0x4A, 0xE1, 0xB4, 0x8D, 0x4B, 0xBF, 0xF9, /* 0xBC-0xBF */ + 0x8D, 0x4C, 0xE1, 0xB9, 0x8D, 0x4D, 0x8D, 0x4E, /* 0xC0-0xC3 */ + 0xE1, 0xBB, 0x8D, 0x4F, 0x8D, 0x50, 0x8D, 0x51, /* 0xC4-0xC7 */ + 0x8D, 0x52, 0x8D, 0x53, 0x8D, 0x54, 0xE1, 0xBE, /* 0xC8-0xCB */ + 0x8D, 0x55, 0x8D, 0x56, 0x8D, 0x57, 0x8D, 0x58, /* 0xCC-0xCF */ + 0x8D, 0x59, 0x8D, 0x5A, 0xE1, 0xBC, 0x8D, 0x5B, /* 0xD0-0xD3 */ + 0x8D, 0x5C, 0x8D, 0x5D, 0x8D, 0x5E, 0x8D, 0x5F, /* 0xD4-0xD7 */ + 0x8D, 0x60, 0xD6, 0xC5, 0x8D, 0x61, 0x8D, 0x62, /* 0xD8-0xDB */ + 0x8D, 0x63, 0x8D, 0x64, 0x8D, 0x65, 0x8D, 0x66, /* 0xDC-0xDF */ + 0x8D, 0x67, 0xCF, 0xBF, 0x8D, 0x68, 0x8D, 0x69, /* 0xE0-0xE3 */ + 0xE1, 0xBD, 0xE1, 0xBF, 0xC2, 0xCD, 0x8D, 0x6A, /* 0xE4-0xE7 */ + 0xB6, 0xEB, 0x8D, 0x6B, 0xD3, 0xF8, 0x8D, 0x6C, /* 0xE8-0xEB */ + 0x8D, 0x6D, 0xC7, 0xCD, 0x8D, 0x6E, 0x8D, 0x6F, /* 0xEC-0xEF */ + 0xB7, 0xE5, 0x8D, 0x70, 0x8D, 0x71, 0x8D, 0x72, /* 0xF0-0xF3 */ + 0x8D, 0x73, 0x8D, 0x74, 0x8D, 0x75, 0x8D, 0x76, /* 0xF4-0xF7 */ + 0x8D, 0x77, 0x8D, 0x78, 0x8D, 0x79, 0xBE, 0xFE, /* 0xF8-0xFB */ + 0x8D, 0x7A, 0x8D, 0x7B, 0x8D, 0x7C, 0x8D, 0x7D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5D[512] = { + 0x8D, 0x7E, 0x8D, 0x80, 0xE1, 0xC0, 0xE1, 0xC1, /* 0x00-0x03 */ + 0x8D, 0x81, 0x8D, 0x82, 0xE1, 0xC7, 0xB3, 0xE7, /* 0x04-0x07 */ + 0x8D, 0x83, 0x8D, 0x84, 0x8D, 0x85, 0x8D, 0x86, /* 0x08-0x0B */ + 0x8D, 0x87, 0x8D, 0x88, 0xC6, 0xE9, 0x8D, 0x89, /* 0x0C-0x0F */ + 0x8D, 0x8A, 0x8D, 0x8B, 0x8D, 0x8C, 0x8D, 0x8D, /* 0x10-0x13 */ + 0xB4, 0xDE, 0x8D, 0x8E, 0xD1, 0xC2, 0x8D, 0x8F, /* 0x14-0x17 */ + 0x8D, 0x90, 0x8D, 0x91, 0x8D, 0x92, 0xE1, 0xC8, /* 0x18-0x1B */ + 0x8D, 0x93, 0x8D, 0x94, 0xE1, 0xC6, 0x8D, 0x95, /* 0x1C-0x1F */ + 0x8D, 0x96, 0x8D, 0x97, 0x8D, 0x98, 0x8D, 0x99, /* 0x20-0x23 */ + 0xE1, 0xC5, 0x8D, 0x9A, 0xE1, 0xC3, 0xE1, 0xC2, /* 0x24-0x27 */ + 0x8D, 0x9B, 0xB1, 0xC0, 0x8D, 0x9C, 0x8D, 0x9D, /* 0x28-0x2B */ + 0x8D, 0x9E, 0xD5, 0xB8, 0xE1, 0xC4, 0x8D, 0x9F, /* 0x2C-0x2F */ + 0x8D, 0xA0, 0x8D, 0xA1, 0x8D, 0xA2, 0x8D, 0xA3, /* 0x30-0x33 */ + 0xE1, 0xCB, 0x8D, 0xA4, 0x8D, 0xA5, 0x8D, 0xA6, /* 0x34-0x37 */ + 0x8D, 0xA7, 0x8D, 0xA8, 0x8D, 0xA9, 0x8D, 0xAA, /* 0x38-0x3B */ + 0x8D, 0xAB, 0xE1, 0xCC, 0xE1, 0xCA, 0x8D, 0xAC, /* 0x3C-0x3F */ + 0x8D, 0xAD, 0x8D, 0xAE, 0x8D, 0xAF, 0x8D, 0xB0, /* 0x40-0x43 */ + 0x8D, 0xB1, 0x8D, 0xB2, 0x8D, 0xB3, 0xEF, 0xFA, /* 0x44-0x47 */ + 0x8D, 0xB4, 0x8D, 0xB5, 0xE1, 0xD3, 0xE1, 0xD2, /* 0x48-0x4B */ + 0xC7, 0xB6, 0x8D, 0xB6, 0x8D, 0xB7, 0x8D, 0xB8, /* 0x4C-0x4F */ + 0x8D, 0xB9, 0x8D, 0xBA, 0x8D, 0xBB, 0x8D, 0xBC, /* 0x50-0x53 */ + 0x8D, 0xBD, 0x8D, 0xBE, 0x8D, 0xBF, 0x8D, 0xC0, /* 0x54-0x57 */ + 0xE1, 0xC9, 0x8D, 0xC1, 0x8D, 0xC2, 0xE1, 0xCE, /* 0x58-0x5B */ + 0x8D, 0xC3, 0xE1, 0xD0, 0x8D, 0xC4, 0x8D, 0xC5, /* 0x5C-0x5F */ + 0x8D, 0xC6, 0x8D, 0xC7, 0x8D, 0xC8, 0x8D, 0xC9, /* 0x60-0x63 */ + 0x8D, 0xCA, 0x8D, 0xCB, 0x8D, 0xCC, 0x8D, 0xCD, /* 0x64-0x67 */ + 0x8D, 0xCE, 0xE1, 0xD4, 0x8D, 0xCF, 0xE1, 0xD1, /* 0x68-0x6B */ + 0xE1, 0xCD, 0x8D, 0xD0, 0x8D, 0xD1, 0xE1, 0xCF, /* 0x6C-0x6F */ + 0x8D, 0xD2, 0x8D, 0xD3, 0x8D, 0xD4, 0x8D, 0xD5, /* 0x70-0x73 */ + 0xE1, 0xD5, 0x8D, 0xD6, 0x8D, 0xD7, 0x8D, 0xD8, /* 0x74-0x77 */ + 0x8D, 0xD9, 0x8D, 0xDA, 0x8D, 0xDB, 0x8D, 0xDC, /* 0x78-0x7B */ + 0x8D, 0xDD, 0x8D, 0xDE, 0x8D, 0xDF, 0x8D, 0xE0, /* 0x7C-0x7F */ + + 0x8D, 0xE1, 0x8D, 0xE2, 0xE1, 0xD6, 0x8D, 0xE3, /* 0x80-0x83 */ + 0x8D, 0xE4, 0x8D, 0xE5, 0x8D, 0xE6, 0x8D, 0xE7, /* 0x84-0x87 */ + 0x8D, 0xE8, 0x8D, 0xE9, 0x8D, 0xEA, 0x8D, 0xEB, /* 0x88-0x8B */ + 0x8D, 0xEC, 0x8D, 0xED, 0x8D, 0xEE, 0x8D, 0xEF, /* 0x8C-0x8F */ + 0x8D, 0xF0, 0x8D, 0xF1, 0x8D, 0xF2, 0x8D, 0xF3, /* 0x90-0x93 */ + 0x8D, 0xF4, 0x8D, 0xF5, 0x8D, 0xF6, 0x8D, 0xF7, /* 0x94-0x97 */ + 0x8D, 0xF8, 0xE1, 0xD7, 0x8D, 0xF9, 0x8D, 0xFA, /* 0x98-0x9B */ + 0x8D, 0xFB, 0xE1, 0xD8, 0x8D, 0xFC, 0x8D, 0xFD, /* 0x9C-0x9F */ + 0x8D, 0xFE, 0x8E, 0x40, 0x8E, 0x41, 0x8E, 0x42, /* 0xA0-0xA3 */ + 0x8E, 0x43, 0x8E, 0x44, 0x8E, 0x45, 0x8E, 0x46, /* 0xA4-0xA7 */ + 0x8E, 0x47, 0x8E, 0x48, 0x8E, 0x49, 0x8E, 0x4A, /* 0xA8-0xAB */ + 0x8E, 0x4B, 0x8E, 0x4C, 0x8E, 0x4D, 0x8E, 0x4E, /* 0xAC-0xAF */ + 0x8E, 0x4F, 0x8E, 0x50, 0x8E, 0x51, 0x8E, 0x52, /* 0xB0-0xB3 */ + 0x8E, 0x53, 0x8E, 0x54, 0x8E, 0x55, 0xE1, 0xDA, /* 0xB4-0xB7 */ + 0x8E, 0x56, 0x8E, 0x57, 0x8E, 0x58, 0x8E, 0x59, /* 0xB8-0xBB */ + 0x8E, 0x5A, 0x8E, 0x5B, 0x8E, 0x5C, 0x8E, 0x5D, /* 0xBC-0xBF */ + 0x8E, 0x5E, 0x8E, 0x5F, 0x8E, 0x60, 0x8E, 0x61, /* 0xC0-0xC3 */ + 0x8E, 0x62, 0xE1, 0xDB, 0x8E, 0x63, 0x8E, 0x64, /* 0xC4-0xC7 */ + 0x8E, 0x65, 0x8E, 0x66, 0x8E, 0x67, 0x8E, 0x68, /* 0xC8-0xCB */ + 0x8E, 0x69, 0xCE, 0xA1, 0x8E, 0x6A, 0x8E, 0x6B, /* 0xCC-0xCF */ + 0x8E, 0x6C, 0x8E, 0x6D, 0x8E, 0x6E, 0x8E, 0x6F, /* 0xD0-0xD3 */ + 0x8E, 0x70, 0x8E, 0x71, 0x8E, 0x72, 0x8E, 0x73, /* 0xD4-0xD7 */ + 0x8E, 0x74, 0x8E, 0x75, 0x8E, 0x76, 0xE7, 0xDD, /* 0xD8-0xDB */ + 0x8E, 0x77, 0xB4, 0xA8, 0xD6, 0xDD, 0x8E, 0x78, /* 0xDC-0xDF */ + 0x8E, 0x79, 0xD1, 0xB2, 0xB3, 0xB2, 0x8E, 0x7A, /* 0xE0-0xE3 */ + 0x8E, 0x7B, 0xB9, 0xA4, 0xD7, 0xF3, 0xC7, 0xC9, /* 0xE4-0xE7 */ + 0xBE, 0xDE, 0xB9, 0xAE, 0x8E, 0x7C, 0xCE, 0xD7, /* 0xE8-0xEB */ + 0x8E, 0x7D, 0x8E, 0x7E, 0xB2, 0xEE, 0xDB, 0xCF, /* 0xEC-0xEF */ + 0x8E, 0x80, 0xBC, 0xBA, 0xD2, 0xD1, 0xCB, 0xC8, /* 0xF0-0xF3 */ + 0xB0, 0xCD, 0x8E, 0x81, 0x8E, 0x82, 0xCF, 0xEF, /* 0xF4-0xF7 */ + 0x8E, 0x83, 0x8E, 0x84, 0x8E, 0x85, 0x8E, 0x86, /* 0xF8-0xFB */ + 0x8E, 0x87, 0xD9, 0xE3, 0xBD, 0xED, 0x8E, 0x88, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5E[512] = { + 0x8E, 0x89, 0xB1, 0xD2, 0xCA, 0xD0, 0xB2, 0xBC, /* 0x00-0x03 */ + 0x8E, 0x8A, 0xCB, 0xA7, 0xB7, 0xAB, 0x8E, 0x8B, /* 0x04-0x07 */ + 0xCA, 0xA6, 0x8E, 0x8C, 0x8E, 0x8D, 0x8E, 0x8E, /* 0x08-0x0B */ + 0xCF, 0xA3, 0x8E, 0x8F, 0x8E, 0x90, 0xE0, 0xF8, /* 0x0C-0x0F */ + 0xD5, 0xCA, 0xE0, 0xFB, 0x8E, 0x91, 0x8E, 0x92, /* 0x10-0x13 */ + 0xE0, 0xFA, 0xC5, 0xC1, 0xCC, 0xFB, 0x8E, 0x93, /* 0x14-0x17 */ + 0xC1, 0xB1, 0xE0, 0xF9, 0xD6, 0xE3, 0xB2, 0xAF, /* 0x18-0x1B */ + 0xD6, 0xC4, 0xB5, 0xDB, 0x8E, 0x94, 0x8E, 0x95, /* 0x1C-0x1F */ + 0x8E, 0x96, 0x8E, 0x97, 0x8E, 0x98, 0x8E, 0x99, /* 0x20-0x23 */ + 0x8E, 0x9A, 0x8E, 0x9B, 0xB4, 0xF8, 0xD6, 0xA1, /* 0x24-0x27 */ + 0x8E, 0x9C, 0x8E, 0x9D, 0x8E, 0x9E, 0x8E, 0x9F, /* 0x28-0x2B */ + 0x8E, 0xA0, 0xCF, 0xAF, 0xB0, 0xEF, 0x8E, 0xA1, /* 0x2C-0x2F */ + 0x8E, 0xA2, 0xE0, 0xFC, 0x8E, 0xA3, 0x8E, 0xA4, /* 0x30-0x33 */ + 0x8E, 0xA5, 0x8E, 0xA6, 0x8E, 0xA7, 0xE1, 0xA1, /* 0x34-0x37 */ + 0xB3, 0xA3, 0x8E, 0xA8, 0x8E, 0xA9, 0xE0, 0xFD, /* 0x38-0x3B */ + 0xE0, 0xFE, 0xC3, 0xB1, 0x8E, 0xAA, 0x8E, 0xAB, /* 0x3C-0x3F */ + 0x8E, 0xAC, 0x8E, 0xAD, 0xC3, 0xDD, 0x8E, 0xAE, /* 0x40-0x43 */ + 0xE1, 0xA2, 0xB7, 0xF9, 0x8E, 0xAF, 0x8E, 0xB0, /* 0x44-0x47 */ + 0x8E, 0xB1, 0x8E, 0xB2, 0x8E, 0xB3, 0x8E, 0xB4, /* 0x48-0x4B */ + 0xBB, 0xCF, 0x8E, 0xB5, 0x8E, 0xB6, 0x8E, 0xB7, /* 0x4C-0x4F */ + 0x8E, 0xB8, 0x8E, 0xB9, 0x8E, 0xBA, 0x8E, 0xBB, /* 0x50-0x53 */ + 0xE1, 0xA3, 0xC4, 0xBB, 0x8E, 0xBC, 0x8E, 0xBD, /* 0x54-0x57 */ + 0x8E, 0xBE, 0x8E, 0xBF, 0x8E, 0xC0, 0xE1, 0xA4, /* 0x58-0x5B */ + 0x8E, 0xC1, 0x8E, 0xC2, 0xE1, 0xA5, 0x8E, 0xC3, /* 0x5C-0x5F */ + 0x8E, 0xC4, 0xE1, 0xA6, 0xB4, 0xB1, 0x8E, 0xC5, /* 0x60-0x63 */ + 0x8E, 0xC6, 0x8E, 0xC7, 0x8E, 0xC8, 0x8E, 0xC9, /* 0x64-0x67 */ + 0x8E, 0xCA, 0x8E, 0xCB, 0x8E, 0xCC, 0x8E, 0xCD, /* 0x68-0x6B */ + 0x8E, 0xCE, 0x8E, 0xCF, 0x8E, 0xD0, 0x8E, 0xD1, /* 0x6C-0x6F */ + 0x8E, 0xD2, 0x8E, 0xD3, 0xB8, 0xC9, 0xC6, 0xBD, /* 0x70-0x73 */ + 0xC4, 0xEA, 0x8E, 0xD4, 0xB2, 0xA2, 0x8E, 0xD5, /* 0x74-0x77 */ + 0xD0, 0xD2, 0x8E, 0xD6, 0xE7, 0xDB, 0xBB, 0xC3, /* 0x78-0x7B */ + 0xD3, 0xD7, 0xD3, 0xC4, 0x8E, 0xD7, 0xB9, 0xE3, /* 0x7C-0x7F */ + + 0xE2, 0xCF, 0x8E, 0xD8, 0x8E, 0xD9, 0x8E, 0xDA, /* 0x80-0x83 */ + 0xD7, 0xAF, 0x8E, 0xDB, 0xC7, 0xEC, 0xB1, 0xD3, /* 0x84-0x87 */ + 0x8E, 0xDC, 0x8E, 0xDD, 0xB4, 0xB2, 0xE2, 0xD1, /* 0x88-0x8B */ + 0x8E, 0xDE, 0x8E, 0xDF, 0x8E, 0xE0, 0xD0, 0xF2, /* 0x8C-0x8F */ + 0xC2, 0xAE, 0xE2, 0xD0, 0x8E, 0xE1, 0xBF, 0xE2, /* 0x90-0x93 */ + 0xD3, 0xA6, 0xB5, 0xD7, 0xE2, 0xD2, 0xB5, 0xEA, /* 0x94-0x97 */ + 0x8E, 0xE2, 0xC3, 0xED, 0xB8, 0xFD, 0x8E, 0xE3, /* 0x98-0x9B */ + 0xB8, 0xAE, 0x8E, 0xE4, 0xC5, 0xD3, 0xB7, 0xCF, /* 0x9C-0x9F */ + 0xE2, 0xD4, 0x8E, 0xE5, 0x8E, 0xE6, 0x8E, 0xE7, /* 0xA0-0xA3 */ + 0x8E, 0xE8, 0xE2, 0xD3, 0xB6, 0xC8, 0xD7, 0xF9, /* 0xA4-0xA7 */ + 0x8E, 0xE9, 0x8E, 0xEA, 0x8E, 0xEB, 0x8E, 0xEC, /* 0xA8-0xAB */ + 0x8E, 0xED, 0xCD, 0xA5, 0x8E, 0xEE, 0x8E, 0xEF, /* 0xAC-0xAF */ + 0x8E, 0xF0, 0x8E, 0xF1, 0x8E, 0xF2, 0xE2, 0xD8, /* 0xB0-0xB3 */ + 0x8E, 0xF3, 0xE2, 0xD6, 0xCA, 0xFC, 0xBF, 0xB5, /* 0xB4-0xB7 */ + 0xD3, 0xB9, 0xE2, 0xD5, 0x8E, 0xF4, 0x8E, 0xF5, /* 0xB8-0xBB */ + 0x8E, 0xF6, 0x8E, 0xF7, 0xE2, 0xD7, 0x8E, 0xF8, /* 0xBC-0xBF */ + 0x8E, 0xF9, 0x8E, 0xFA, 0x8E, 0xFB, 0x8E, 0xFC, /* 0xC0-0xC3 */ + 0x8E, 0xFD, 0x8E, 0xFE, 0x8F, 0x40, 0x8F, 0x41, /* 0xC4-0xC7 */ + 0x8F, 0x42, 0xC1, 0xAE, 0xC0, 0xC8, 0x8F, 0x43, /* 0xC8-0xCB */ + 0x8F, 0x44, 0x8F, 0x45, 0x8F, 0x46, 0x8F, 0x47, /* 0xCC-0xCF */ + 0x8F, 0x48, 0xE2, 0xDB, 0xE2, 0xDA, 0xC0, 0xAA, /* 0xD0-0xD3 */ + 0x8F, 0x49, 0x8F, 0x4A, 0xC1, 0xCE, 0x8F, 0x4B, /* 0xD4-0xD7 */ + 0x8F, 0x4C, 0x8F, 0x4D, 0x8F, 0x4E, 0xE2, 0xDC, /* 0xD8-0xDB */ + 0x8F, 0x4F, 0x8F, 0x50, 0x8F, 0x51, 0x8F, 0x52, /* 0xDC-0xDF */ + 0x8F, 0x53, 0x8F, 0x54, 0x8F, 0x55, 0x8F, 0x56, /* 0xE0-0xE3 */ + 0x8F, 0x57, 0x8F, 0x58, 0x8F, 0x59, 0x8F, 0x5A, /* 0xE4-0xE7 */ + 0xE2, 0xDD, 0x8F, 0x5B, 0xE2, 0xDE, 0x8F, 0x5C, /* 0xE8-0xEB */ + 0x8F, 0x5D, 0x8F, 0x5E, 0x8F, 0x5F, 0x8F, 0x60, /* 0xEC-0xEF */ + 0x8F, 0x61, 0x8F, 0x62, 0x8F, 0x63, 0x8F, 0x64, /* 0xF0-0xF3 */ + 0xDB, 0xC8, 0x8F, 0x65, 0xD1, 0xD3, 0xCD, 0xA2, /* 0xF4-0xF7 */ + 0x8F, 0x66, 0x8F, 0x67, 0xBD, 0xA8, 0x8F, 0x68, /* 0xF8-0xFB */ + 0x8F, 0x69, 0x8F, 0x6A, 0xDE, 0xC3, 0xD8, 0xA5, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5F[512] = { + 0xBF, 0xAA, 0xDB, 0xCD, 0xD2, 0xEC, 0xC6, 0xFA, /* 0x00-0x03 */ + 0xC5, 0xAA, 0x8F, 0x6B, 0x8F, 0x6C, 0x8F, 0x6D, /* 0x04-0x07 */ + 0xDE, 0xC4, 0x8F, 0x6E, 0xB1, 0xD7, 0xDF, 0xAE, /* 0x08-0x0B */ + 0x8F, 0x6F, 0x8F, 0x70, 0x8F, 0x71, 0xCA, 0xBD, /* 0x0C-0x0F */ + 0x8F, 0x72, 0xDF, 0xB1, 0x8F, 0x73, 0xB9, 0xAD, /* 0x10-0x13 */ + 0x8F, 0x74, 0xD2, 0xFD, 0x8F, 0x75, 0xB8, 0xA5, /* 0x14-0x17 */ + 0xBA, 0xEB, 0x8F, 0x76, 0x8F, 0x77, 0xB3, 0xDA, /* 0x18-0x1B */ + 0x8F, 0x78, 0x8F, 0x79, 0x8F, 0x7A, 0xB5, 0xDC, /* 0x1C-0x1F */ + 0xD5, 0xC5, 0x8F, 0x7B, 0x8F, 0x7C, 0x8F, 0x7D, /* 0x20-0x23 */ + 0x8F, 0x7E, 0xC3, 0xD6, 0xCF, 0xD2, 0xBB, 0xA1, /* 0x24-0x27 */ + 0x8F, 0x80, 0xE5, 0xF3, 0xE5, 0xF2, 0x8F, 0x81, /* 0x28-0x2B */ + 0x8F, 0x82, 0xE5, 0xF4, 0x8F, 0x83, 0xCD, 0xE4, /* 0x2C-0x2F */ + 0x8F, 0x84, 0xC8, 0xF5, 0x8F, 0x85, 0x8F, 0x86, /* 0x30-0x33 */ + 0x8F, 0x87, 0x8F, 0x88, 0x8F, 0x89, 0x8F, 0x8A, /* 0x34-0x37 */ + 0x8F, 0x8B, 0xB5, 0xAF, 0xC7, 0xBF, 0x8F, 0x8C, /* 0x38-0x3B */ + 0xE5, 0xF6, 0x8F, 0x8D, 0x8F, 0x8E, 0x8F, 0x8F, /* 0x3C-0x3F */ + 0xEC, 0xB0, 0x8F, 0x90, 0x8F, 0x91, 0x8F, 0x92, /* 0x40-0x43 */ + 0x8F, 0x93, 0x8F, 0x94, 0x8F, 0x95, 0x8F, 0x96, /* 0x44-0x47 */ + 0x8F, 0x97, 0x8F, 0x98, 0x8F, 0x99, 0x8F, 0x9A, /* 0x48-0x4B */ + 0x8F, 0x9B, 0x8F, 0x9C, 0x8F, 0x9D, 0x8F, 0x9E, /* 0x4C-0x4F */ + 0xE5, 0xE6, 0x8F, 0x9F, 0xB9, 0xE9, 0xB5, 0xB1, /* 0x50-0x53 */ + 0x8F, 0xA0, 0xC2, 0xBC, 0xE5, 0xE8, 0xE5, 0xE7, /* 0x54-0x57 */ + 0xE5, 0xE9, 0x8F, 0xA1, 0x8F, 0xA2, 0x8F, 0xA3, /* 0x58-0x5B */ + 0x8F, 0xA4, 0xD2, 0xCD, 0x8F, 0xA5, 0x8F, 0xA6, /* 0x5C-0x5F */ + 0x8F, 0xA7, 0xE1, 0xEA, 0xD0, 0xCE, 0x8F, 0xA8, /* 0x60-0x63 */ + 0xCD, 0xAE, 0x8F, 0xA9, 0xD1, 0xE5, 0x8F, 0xAA, /* 0x64-0x67 */ + 0x8F, 0xAB, 0xB2, 0xCA, 0xB1, 0xEB, 0x8F, 0xAC, /* 0x68-0x6B */ + 0xB1, 0xF2, 0xC5, 0xED, 0x8F, 0xAD, 0x8F, 0xAE, /* 0x6C-0x6F */ + 0xD5, 0xC3, 0xD3, 0xB0, 0x8F, 0xAF, 0xE1, 0xDC, /* 0x70-0x73 */ + 0x8F, 0xB0, 0x8F, 0xB1, 0x8F, 0xB2, 0xE1, 0xDD, /* 0x74-0x77 */ + 0x8F, 0xB3, 0xD2, 0xDB, 0x8F, 0xB4, 0xB3, 0xB9, /* 0x78-0x7B */ + 0xB1, 0xCB, 0x8F, 0xB5, 0x8F, 0xB6, 0x8F, 0xB7, /* 0x7C-0x7F */ + + 0xCD, 0xF9, 0xD5, 0xF7, 0xE1, 0xDE, 0x8F, 0xB8, /* 0x80-0x83 */ + 0xBE, 0xB6, 0xB4, 0xFD, 0x8F, 0xB9, 0xE1, 0xDF, /* 0x84-0x87 */ + 0xBA, 0xDC, 0xE1, 0xE0, 0xBB, 0xB2, 0xC2, 0xC9, /* 0x88-0x8B */ + 0xE1, 0xE1, 0x8F, 0xBA, 0x8F, 0xBB, 0x8F, 0xBC, /* 0x8C-0x8F */ + 0xD0, 0xEC, 0x8F, 0xBD, 0xCD, 0xBD, 0x8F, 0xBE, /* 0x90-0x93 */ + 0x8F, 0xBF, 0xE1, 0xE2, 0x8F, 0xC0, 0xB5, 0xC3, /* 0x94-0x97 */ + 0xC5, 0xC7, 0xE1, 0xE3, 0x8F, 0xC1, 0x8F, 0xC2, /* 0x98-0x9B */ + 0xE1, 0xE4, 0x8F, 0xC3, 0x8F, 0xC4, 0x8F, 0xC5, /* 0x9C-0x9F */ + 0x8F, 0xC6, 0xD3, 0xF9, 0x8F, 0xC7, 0x8F, 0xC8, /* 0xA0-0xA3 */ + 0x8F, 0xC9, 0x8F, 0xCA, 0x8F, 0xCB, 0x8F, 0xCC, /* 0xA4-0xA7 */ + 0xE1, 0xE5, 0x8F, 0xCD, 0xD1, 0xAD, 0x8F, 0xCE, /* 0xA8-0xAB */ + 0x8F, 0xCF, 0xE1, 0xE6, 0xCE, 0xA2, 0x8F, 0xD0, /* 0xAC-0xAF */ + 0x8F, 0xD1, 0x8F, 0xD2, 0x8F, 0xD3, 0x8F, 0xD4, /* 0xB0-0xB3 */ + 0x8F, 0xD5, 0xE1, 0xE7, 0x8F, 0xD6, 0xB5, 0xC2, /* 0xB4-0xB7 */ + 0x8F, 0xD7, 0x8F, 0xD8, 0x8F, 0xD9, 0x8F, 0xDA, /* 0xB8-0xBB */ + 0xE1, 0xE8, 0xBB, 0xD5, 0x8F, 0xDB, 0x8F, 0xDC, /* 0xBC-0xBF */ + 0x8F, 0xDD, 0x8F, 0xDE, 0x8F, 0xDF, 0xD0, 0xC4, /* 0xC0-0xC3 */ + 0xE2, 0xE0, 0xB1, 0xD8, 0xD2, 0xE4, 0x8F, 0xE0, /* 0xC4-0xC7 */ + 0x8F, 0xE1, 0xE2, 0xE1, 0x8F, 0xE2, 0x8F, 0xE3, /* 0xC8-0xCB */ + 0xBC, 0xC9, 0xC8, 0xCC, 0x8F, 0xE4, 0xE2, 0xE3, /* 0xCC-0xCF */ + 0xEC, 0xFE, 0xEC, 0xFD, 0xDF, 0xAF, 0x8F, 0xE5, /* 0xD0-0xD3 */ + 0x8F, 0xE6, 0x8F, 0xE7, 0xE2, 0xE2, 0xD6, 0xBE, /* 0xD4-0xD7 */ + 0xCD, 0xFC, 0xC3, 0xA6, 0x8F, 0xE8, 0x8F, 0xE9, /* 0xD8-0xDB */ + 0x8F, 0xEA, 0xE3, 0xC3, 0x8F, 0xEB, 0x8F, 0xEC, /* 0xDC-0xDF */ + 0xD6, 0xD2, 0xE2, 0xE7, 0x8F, 0xED, 0x8F, 0xEE, /* 0xE0-0xE3 */ + 0xE2, 0xE8, 0x8F, 0xEF, 0x8F, 0xF0, 0xD3, 0xC7, /* 0xE4-0xE7 */ + 0x8F, 0xF1, 0x8F, 0xF2, 0xE2, 0xEC, 0xBF, 0xEC, /* 0xE8-0xEB */ + 0x8F, 0xF3, 0xE2, 0xED, 0xE2, 0xE5, 0x8F, 0xF4, /* 0xEC-0xEF */ + 0x8F, 0xF5, 0xB3, 0xC0, 0x8F, 0xF6, 0x8F, 0xF7, /* 0xF0-0xF3 */ + 0x8F, 0xF8, 0xC4, 0xEE, 0x8F, 0xF9, 0x8F, 0xFA, /* 0xF4-0xF7 */ + 0xE2, 0xEE, 0x8F, 0xFB, 0x8F, 0xFC, 0xD0, 0xC3, /* 0xF8-0xFB */ + 0x8F, 0xFD, 0xBA, 0xF6, 0xE2, 0xE9, 0xB7, 0xDE, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_60[512] = { + 0xBB, 0xB3, 0xCC, 0xAC, 0xCB, 0xCB, 0xE2, 0xE4, /* 0x00-0x03 */ + 0xE2, 0xE6, 0xE2, 0xEA, 0xE2, 0xEB, 0x8F, 0xFE, /* 0x04-0x07 */ + 0x90, 0x40, 0x90, 0x41, 0xE2, 0xF7, 0x90, 0x42, /* 0x08-0x0B */ + 0x90, 0x43, 0xE2, 0xF4, 0xD4, 0xF5, 0xE2, 0xF3, /* 0x0C-0x0F */ + 0x90, 0x44, 0x90, 0x45, 0xC5, 0xAD, 0x90, 0x46, /* 0x10-0x13 */ + 0xD5, 0xFA, 0xC5, 0xC2, 0xB2, 0xC0, 0x90, 0x47, /* 0x14-0x17 */ + 0x90, 0x48, 0xE2, 0xEF, 0x90, 0x49, 0xE2, 0xF2, /* 0x18-0x1B */ + 0xC1, 0xAF, 0xCB, 0xBC, 0x90, 0x4A, 0x90, 0x4B, /* 0x1C-0x1F */ + 0xB5, 0xA1, 0xE2, 0xF9, 0x90, 0x4C, 0x90, 0x4D, /* 0x20-0x23 */ + 0x90, 0x4E, 0xBC, 0xB1, 0xE2, 0xF1, 0xD0, 0xD4, /* 0x24-0x27 */ + 0xD4, 0xB9, 0xE2, 0xF5, 0xB9, 0xD6, 0xE2, 0xF6, /* 0x28-0x2B */ + 0x90, 0x4F, 0x90, 0x50, 0x90, 0x51, 0xC7, 0xD3, /* 0x2C-0x2F */ + 0x90, 0x52, 0x90, 0x53, 0x90, 0x54, 0x90, 0x55, /* 0x30-0x33 */ + 0x90, 0x56, 0xE2, 0xF0, 0x90, 0x57, 0x90, 0x58, /* 0x34-0x37 */ + 0x90, 0x59, 0x90, 0x5A, 0x90, 0x5B, 0xD7, 0xDC, /* 0x38-0x3B */ + 0xED, 0xA1, 0x90, 0x5C, 0x90, 0x5D, 0xE2, 0xF8, /* 0x3C-0x3F */ + 0x90, 0x5E, 0xED, 0xA5, 0xE2, 0xFE, 0xCA, 0xD1, /* 0x40-0x43 */ + 0x90, 0x5F, 0x90, 0x60, 0x90, 0x61, 0x90, 0x62, /* 0x44-0x47 */ + 0x90, 0x63, 0x90, 0x64, 0x90, 0x65, 0xC1, 0xB5, /* 0x48-0x4B */ + 0x90, 0x66, 0xBB, 0xD0, 0x90, 0x67, 0x90, 0x68, /* 0x4C-0x4F */ + 0xBF, 0xD6, 0x90, 0x69, 0xBA, 0xE3, 0x90, 0x6A, /* 0x50-0x53 */ + 0x90, 0x6B, 0xCB, 0xA1, 0x90, 0x6C, 0x90, 0x6D, /* 0x54-0x57 */ + 0x90, 0x6E, 0xED, 0xA6, 0xED, 0xA3, 0x90, 0x6F, /* 0x58-0x5B */ + 0x90, 0x70, 0xED, 0xA2, 0x90, 0x71, 0x90, 0x72, /* 0x5C-0x5F */ + 0x90, 0x73, 0x90, 0x74, 0xBB, 0xD6, 0xED, 0xA7, /* 0x60-0x63 */ + 0xD0, 0xF4, 0x90, 0x75, 0x90, 0x76, 0xED, 0xA4, /* 0x64-0x67 */ + 0xBA, 0xDE, 0xB6, 0xF7, 0xE3, 0xA1, 0xB6, 0xB2, /* 0x68-0x6B */ + 0xCC, 0xF1, 0xB9, 0xA7, 0x90, 0x77, 0xCF, 0xA2, /* 0x6C-0x6F */ + 0xC7, 0xA1, 0x90, 0x78, 0x90, 0x79, 0xBF, 0xD2, /* 0x70-0x73 */ + 0x90, 0x7A, 0x90, 0x7B, 0xB6, 0xF1, 0x90, 0x7C, /* 0x74-0x77 */ + 0xE2, 0xFA, 0xE2, 0xFB, 0xE2, 0xFD, 0xE2, 0xFC, /* 0x78-0x7B */ + 0xC4, 0xD5, 0xE3, 0xA2, 0x90, 0x7D, 0xD3, 0xC1, /* 0x7C-0x7F */ + + 0x90, 0x7E, 0x90, 0x80, 0x90, 0x81, 0xE3, 0xA7, /* 0x80-0x83 */ + 0xC7, 0xC4, 0x90, 0x82, 0x90, 0x83, 0x90, 0x84, /* 0x84-0x87 */ + 0x90, 0x85, 0xCF, 0xA4, 0x90, 0x86, 0x90, 0x87, /* 0x88-0x8B */ + 0xE3, 0xA9, 0xBA, 0xB7, 0x90, 0x88, 0x90, 0x89, /* 0x8C-0x8F */ + 0x90, 0x8A, 0x90, 0x8B, 0xE3, 0xA8, 0x90, 0x8C, /* 0x90-0x93 */ + 0xBB, 0xDA, 0x90, 0x8D, 0xE3, 0xA3, 0x90, 0x8E, /* 0x94-0x97 */ + 0x90, 0x8F, 0x90, 0x90, 0xE3, 0xA4, 0xE3, 0xAA, /* 0x98-0x9B */ + 0x90, 0x91, 0xE3, 0xA6, 0x90, 0x92, 0xCE, 0xF2, /* 0x9C-0x9F */ + 0xD3, 0xC6, 0x90, 0x93, 0x90, 0x94, 0xBB, 0xBC, /* 0xA0-0xA3 */ + 0x90, 0x95, 0x90, 0x96, 0xD4, 0xC3, 0x90, 0x97, /* 0xA4-0xA7 */ + 0xC4, 0xFA, 0x90, 0x98, 0x90, 0x99, 0xED, 0xA8, /* 0xA8-0xAB */ + 0xD0, 0xFC, 0xE3, 0xA5, 0x90, 0x9A, 0xC3, 0xF5, /* 0xAC-0xAF */ + 0x90, 0x9B, 0xE3, 0xAD, 0xB1, 0xAF, 0x90, 0x9C, /* 0xB0-0xB3 */ + 0xE3, 0xB2, 0x90, 0x9D, 0x90, 0x9E, 0x90, 0x9F, /* 0xB4-0xB7 */ + 0xBC, 0xC2, 0x90, 0xA0, 0x90, 0xA1, 0xE3, 0xAC, /* 0xB8-0xBB */ + 0xB5, 0xBF, 0x90, 0xA2, 0x90, 0xA3, 0x90, 0xA4, /* 0xBC-0xBF */ + 0x90, 0xA5, 0x90, 0xA6, 0x90, 0xA7, 0x90, 0xA8, /* 0xC0-0xC3 */ + 0x90, 0xA9, 0xC7, 0xE9, 0xE3, 0xB0, 0x90, 0xAA, /* 0xC4-0xC7 */ + 0x90, 0xAB, 0x90, 0xAC, 0xBE, 0xAA, 0xCD, 0xEF, /* 0xC8-0xCB */ + 0x90, 0xAD, 0x90, 0xAE, 0x90, 0xAF, 0x90, 0xB0, /* 0xCC-0xCF */ + 0x90, 0xB1, 0xBB, 0xF3, 0x90, 0xB2, 0x90, 0xB3, /* 0xD0-0xD3 */ + 0x90, 0xB4, 0xCC, 0xE8, 0x90, 0xB5, 0x90, 0xB6, /* 0xD4-0xD7 */ + 0xE3, 0xAF, 0x90, 0xB7, 0xE3, 0xB1, 0x90, 0xB8, /* 0xD8-0xDB */ + 0xCF, 0xA7, 0xE3, 0xAE, 0x90, 0xB9, 0xCE, 0xA9, /* 0xDC-0xDF */ + 0xBB, 0xDD, 0x90, 0xBA, 0x90, 0xBB, 0x90, 0xBC, /* 0xE0-0xE3 */ + 0x90, 0xBD, 0x90, 0xBE, 0xB5, 0xEB, 0xBE, 0xE5, /* 0xE4-0xE7 */ + 0xB2, 0xD2, 0xB3, 0xCD, 0x90, 0xBF, 0xB1, 0xB9, /* 0xE8-0xEB */ + 0xE3, 0xAB, 0xB2, 0xD1, 0xB5, 0xAC, 0xB9, 0xDF, /* 0xEC-0xEF */ + 0xB6, 0xE8, 0x90, 0xC0, 0x90, 0xC1, 0xCF, 0xEB, /* 0xF0-0xF3 */ + 0xE3, 0xB7, 0x90, 0xC2, 0xBB, 0xCC, 0x90, 0xC3, /* 0xF4-0xF7 */ + 0x90, 0xC4, 0xC8, 0xC7, 0xD0, 0xCA, 0x90, 0xC5, /* 0xF8-0xFB */ + 0x90, 0xC6, 0x90, 0xC7, 0x90, 0xC8, 0x90, 0xC9, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_61[512] = { + 0xE3, 0xB8, 0xB3, 0xEE, 0x90, 0xCA, 0x90, 0xCB, /* 0x00-0x03 */ + 0x90, 0xCC, 0x90, 0xCD, 0xED, 0xA9, 0x90, 0xCE, /* 0x04-0x07 */ + 0xD3, 0xFA, 0xD3, 0xE4, 0x90, 0xCF, 0x90, 0xD0, /* 0x08-0x0B */ + 0x90, 0xD1, 0xED, 0xAA, 0xE3, 0xB9, 0xD2, 0xE2, /* 0x0C-0x0F */ + 0x90, 0xD2, 0x90, 0xD3, 0x90, 0xD4, 0x90, 0xD5, /* 0x10-0x13 */ + 0x90, 0xD6, 0xE3, 0xB5, 0x90, 0xD7, 0x90, 0xD8, /* 0x14-0x17 */ + 0x90, 0xD9, 0x90, 0xDA, 0xD3, 0xDE, 0x90, 0xDB, /* 0x18-0x1B */ + 0x90, 0xDC, 0x90, 0xDD, 0x90, 0xDE, 0xB8, 0xD0, /* 0x1C-0x1F */ + 0xE3, 0xB3, 0x90, 0xDF, 0x90, 0xE0, 0xE3, 0xB6, /* 0x20-0x23 */ + 0xB7, 0xDF, 0x90, 0xE1, 0xE3, 0xB4, 0xC0, 0xA2, /* 0x24-0x27 */ + 0x90, 0xE2, 0x90, 0xE3, 0x90, 0xE4, 0xE3, 0xBA, /* 0x28-0x2B */ + 0x90, 0xE5, 0x90, 0xE6, 0x90, 0xE7, 0x90, 0xE8, /* 0x2C-0x2F */ + 0x90, 0xE9, 0x90, 0xEA, 0x90, 0xEB, 0x90, 0xEC, /* 0x30-0x33 */ + 0x90, 0xED, 0x90, 0xEE, 0x90, 0xEF, 0x90, 0xF0, /* 0x34-0x37 */ + 0x90, 0xF1, 0x90, 0xF2, 0x90, 0xF3, 0x90, 0xF4, /* 0x38-0x3B */ + 0x90, 0xF5, 0x90, 0xF6, 0x90, 0xF7, 0xD4, 0xB8, /* 0x3C-0x3F */ + 0x90, 0xF8, 0x90, 0xF9, 0x90, 0xFA, 0x90, 0xFB, /* 0x40-0x43 */ + 0x90, 0xFC, 0x90, 0xFD, 0x90, 0xFE, 0x91, 0x40, /* 0x44-0x47 */ + 0xB4, 0xC8, 0x91, 0x41, 0xE3, 0xBB, 0x91, 0x42, /* 0x48-0x4B */ + 0xBB, 0xC5, 0x91, 0x43, 0xC9, 0xF7, 0x91, 0x44, /* 0x4C-0x4F */ + 0x91, 0x45, 0xC9, 0xE5, 0x91, 0x46, 0x91, 0x47, /* 0x50-0x53 */ + 0x91, 0x48, 0xC4, 0xBD, 0x91, 0x49, 0x91, 0x4A, /* 0x54-0x57 */ + 0x91, 0x4B, 0x91, 0x4C, 0x91, 0x4D, 0x91, 0x4E, /* 0x58-0x5B */ + 0x91, 0x4F, 0xED, 0xAB, 0x91, 0x50, 0x91, 0x51, /* 0x5C-0x5F */ + 0x91, 0x52, 0x91, 0x53, 0xC2, 0xFD, 0x91, 0x54, /* 0x60-0x63 */ + 0x91, 0x55, 0x91, 0x56, 0x91, 0x57, 0xBB, 0xDB, /* 0x64-0x67 */ + 0xBF, 0xAE, 0x91, 0x58, 0x91, 0x59, 0x91, 0x5A, /* 0x68-0x6B */ + 0x91, 0x5B, 0x91, 0x5C, 0x91, 0x5D, 0x91, 0x5E, /* 0x6C-0x6F */ + 0xCE, 0xBF, 0x91, 0x5F, 0x91, 0x60, 0x91, 0x61, /* 0x70-0x73 */ + 0x91, 0x62, 0xE3, 0xBC, 0x91, 0x63, 0xBF, 0xB6, /* 0x74-0x77 */ + 0x91, 0x64, 0x91, 0x65, 0x91, 0x66, 0x91, 0x67, /* 0x78-0x7B */ + 0x91, 0x68, 0x91, 0x69, 0x91, 0x6A, 0x91, 0x6B, /* 0x7C-0x7F */ + + 0x91, 0x6C, 0x91, 0x6D, 0x91, 0x6E, 0x91, 0x6F, /* 0x80-0x83 */ + 0x91, 0x70, 0x91, 0x71, 0x91, 0x72, 0x91, 0x73, /* 0x84-0x87 */ + 0x91, 0x74, 0x91, 0x75, 0x91, 0x76, 0xB1, 0xEF, /* 0x88-0x8B */ + 0x91, 0x77, 0x91, 0x78, 0xD4, 0xF7, 0x91, 0x79, /* 0x8C-0x8F */ + 0x91, 0x7A, 0x91, 0x7B, 0x91, 0x7C, 0x91, 0x7D, /* 0x90-0x93 */ + 0xE3, 0xBE, 0x91, 0x7E, 0x91, 0x80, 0x91, 0x81, /* 0x94-0x97 */ + 0x91, 0x82, 0x91, 0x83, 0x91, 0x84, 0x91, 0x85, /* 0x98-0x9B */ + 0x91, 0x86, 0xED, 0xAD, 0x91, 0x87, 0x91, 0x88, /* 0x9C-0x9F */ + 0x91, 0x89, 0x91, 0x8A, 0x91, 0x8B, 0x91, 0x8C, /* 0xA0-0xA3 */ + 0x91, 0x8D, 0x91, 0x8E, 0x91, 0x8F, 0xE3, 0xBF, /* 0xA4-0xA7 */ + 0xBA, 0xA9, 0xED, 0xAC, 0x91, 0x90, 0x91, 0x91, /* 0xA8-0xAB */ + 0xE3, 0xBD, 0x91, 0x92, 0x91, 0x93, 0x91, 0x94, /* 0xAC-0xAF */ + 0x91, 0x95, 0x91, 0x96, 0x91, 0x97, 0x91, 0x98, /* 0xB0-0xB3 */ + 0x91, 0x99, 0x91, 0x9A, 0x91, 0x9B, 0xE3, 0xC0, /* 0xB4-0xB7 */ + 0x91, 0x9C, 0x91, 0x9D, 0x91, 0x9E, 0x91, 0x9F, /* 0xB8-0xBB */ + 0x91, 0xA0, 0x91, 0xA1, 0xBA, 0xB6, 0x91, 0xA2, /* 0xBC-0xBF */ + 0x91, 0xA3, 0x91, 0xA4, 0xB6, 0xAE, 0x91, 0xA5, /* 0xC0-0xC3 */ + 0x91, 0xA6, 0x91, 0xA7, 0x91, 0xA8, 0x91, 0xA9, /* 0xC4-0xC7 */ + 0xD0, 0xB8, 0x91, 0xAA, 0xB0, 0xC3, 0xED, 0xAE, /* 0xC8-0xCB */ + 0x91, 0xAB, 0x91, 0xAC, 0x91, 0xAD, 0x91, 0xAE, /* 0xCC-0xCF */ + 0x91, 0xAF, 0xED, 0xAF, 0xC0, 0xC1, 0x91, 0xB0, /* 0xD0-0xD3 */ + 0xE3, 0xC1, 0x91, 0xB1, 0x91, 0xB2, 0x91, 0xB3, /* 0xD4-0xD7 */ + 0x91, 0xB4, 0x91, 0xB5, 0x91, 0xB6, 0x91, 0xB7, /* 0xD8-0xDB */ + 0x91, 0xB8, 0x91, 0xB9, 0x91, 0xBA, 0x91, 0xBB, /* 0xDC-0xDF */ + 0x91, 0xBC, 0x91, 0xBD, 0x91, 0xBE, 0x91, 0xBF, /* 0xE0-0xE3 */ + 0x91, 0xC0, 0x91, 0xC1, 0xC5, 0xB3, 0x91, 0xC2, /* 0xE4-0xE7 */ + 0x91, 0xC3, 0x91, 0xC4, 0x91, 0xC5, 0x91, 0xC6, /* 0xE8-0xEB */ + 0x91, 0xC7, 0x91, 0xC8, 0x91, 0xC9, 0x91, 0xCA, /* 0xEC-0xEF */ + 0x91, 0xCB, 0x91, 0xCC, 0x91, 0xCD, 0x91, 0xCE, /* 0xF0-0xF3 */ + 0x91, 0xCF, 0xE3, 0xC2, 0x91, 0xD0, 0x91, 0xD1, /* 0xF4-0xF7 */ + 0x91, 0xD2, 0x91, 0xD3, 0x91, 0xD4, 0x91, 0xD5, /* 0xF8-0xFB */ + 0x91, 0xD6, 0x91, 0xD7, 0x91, 0xD8, 0xDC, 0xB2, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_62[512] = { + 0x91, 0xD9, 0x91, 0xDA, 0x91, 0xDB, 0x91, 0xDC, /* 0x00-0x03 */ + 0x91, 0xDD, 0x91, 0xDE, 0xED, 0xB0, 0x91, 0xDF, /* 0x04-0x07 */ + 0xB8, 0xEA, 0x91, 0xE0, 0xCE, 0xEC, 0xEA, 0xA7, /* 0x08-0x0B */ + 0xD0, 0xE7, 0xCA, 0xF9, 0xC8, 0xD6, 0xCF, 0xB7, /* 0x0C-0x0F */ + 0xB3, 0xC9, 0xCE, 0xD2, 0xBD, 0xE4, 0x91, 0xE1, /* 0x10-0x13 */ + 0x91, 0xE2, 0xE3, 0xDE, 0xBB, 0xF2, 0xEA, 0xA8, /* 0x14-0x17 */ + 0xD5, 0xBD, 0x91, 0xE3, 0xC6, 0xDD, 0xEA, 0xA9, /* 0x18-0x1B */ + 0x91, 0xE4, 0x91, 0xE5, 0x91, 0xE6, 0xEA, 0xAA, /* 0x1C-0x1F */ + 0x91, 0xE7, 0xEA, 0xAC, 0xEA, 0xAB, 0x91, 0xE8, /* 0x20-0x23 */ + 0xEA, 0xAE, 0xEA, 0xAD, 0x91, 0xE9, 0x91, 0xEA, /* 0x24-0x27 */ + 0x91, 0xEB, 0x91, 0xEC, 0xBD, 0xD8, 0x91, 0xED, /* 0x28-0x2B */ + 0xEA, 0xAF, 0x91, 0xEE, 0xC2, 0xBE, 0x91, 0xEF, /* 0x2C-0x2F */ + 0x91, 0xF0, 0x91, 0xF1, 0x91, 0xF2, 0xB4, 0xC1, /* 0x30-0x33 */ + 0xB4, 0xF7, 0x91, 0xF3, 0x91, 0xF4, 0xBB, 0xA7, /* 0x34-0x37 */ + 0x91, 0xF5, 0x91, 0xF6, 0x91, 0xF7, 0x91, 0xF8, /* 0x38-0x3B */ + 0x91, 0xF9, 0xEC, 0xE6, 0xEC, 0xE5, 0xB7, 0xBF, /* 0x3C-0x3F */ + 0xCB, 0xF9, 0xB1, 0xE2, 0x91, 0xFA, 0xEC, 0xE7, /* 0x40-0x43 */ + 0x91, 0xFB, 0x91, 0xFC, 0x91, 0xFD, 0xC9, 0xC8, /* 0x44-0x47 */ + 0xEC, 0xE8, 0xEC, 0xE9, 0x91, 0xFE, 0xCA, 0xD6, /* 0x48-0x4B */ + 0xDE, 0xD0, 0xB2, 0xC5, 0xD4, 0xFA, 0x92, 0x40, /* 0x4C-0x4F */ + 0x92, 0x41, 0xC6, 0xCB, 0xB0, 0xC7, 0xB4, 0xF2, /* 0x50-0x53 */ + 0xC8, 0xD3, 0x92, 0x42, 0x92, 0x43, 0x92, 0x44, /* 0x54-0x57 */ + 0xCD, 0xD0, 0x92, 0x45, 0x92, 0x46, 0xBF, 0xB8, /* 0x58-0x5B */ + 0x92, 0x47, 0x92, 0x48, 0x92, 0x49, 0x92, 0x4A, /* 0x5C-0x5F */ + 0x92, 0x4B, 0x92, 0x4C, 0x92, 0x4D, 0xBF, 0xDB, /* 0x60-0x63 */ + 0x92, 0x4E, 0x92, 0x4F, 0xC7, 0xA4, 0xD6, 0xB4, /* 0x64-0x67 */ + 0x92, 0x50, 0xC0, 0xA9, 0xDE, 0xD1, 0xC9, 0xA8, /* 0x68-0x6B */ + 0xD1, 0xEF, 0xC5, 0xA4, 0xB0, 0xE7, 0xB3, 0xB6, /* 0x6C-0x6F */ + 0xC8, 0xC5, 0x92, 0x51, 0x92, 0x52, 0xB0, 0xE2, /* 0x70-0x73 */ + 0x92, 0x53, 0x92, 0x54, 0xB7, 0xF6, 0x92, 0x55, /* 0x74-0x77 */ + 0x92, 0x56, 0xC5, 0xFA, 0x92, 0x57, 0x92, 0x58, /* 0x78-0x7B */ + 0xB6, 0xF3, 0x92, 0x59, 0xD5, 0xD2, 0xB3, 0xD0, /* 0x7C-0x7F */ + + 0xBC, 0xBC, 0x92, 0x5A, 0x92, 0x5B, 0x92, 0x5C, /* 0x80-0x83 */ + 0xB3, 0xAD, 0x92, 0x5D, 0x92, 0x5E, 0x92, 0x5F, /* 0x84-0x87 */ + 0x92, 0x60, 0xBE, 0xF1, 0xB0, 0xD1, 0x92, 0x61, /* 0x88-0x8B */ + 0x92, 0x62, 0x92, 0x63, 0x92, 0x64, 0x92, 0x65, /* 0x8C-0x8F */ + 0x92, 0x66, 0xD2, 0xD6, 0xCA, 0xE3, 0xD7, 0xA5, /* 0x90-0x93 */ + 0x92, 0x67, 0xCD, 0xB6, 0xB6, 0xB6, 0xBF, 0xB9, /* 0x94-0x97 */ + 0xD5, 0xDB, 0x92, 0x68, 0xB8, 0xA7, 0xC5, 0xD7, /* 0x98-0x9B */ + 0x92, 0x69, 0x92, 0x6A, 0x92, 0x6B, 0xDE, 0xD2, /* 0x9C-0x9F */ + 0xBF, 0xD9, 0xC2, 0xD5, 0xC7, 0xC0, 0x92, 0x6C, /* 0xA0-0xA3 */ + 0xBB, 0xA4, 0xB1, 0xA8, 0x92, 0x6D, 0x92, 0x6E, /* 0xA4-0xA7 */ + 0xC5, 0xEA, 0x92, 0x6F, 0x92, 0x70, 0xC5, 0xFB, /* 0xA8-0xAB */ + 0xCC, 0xA7, 0x92, 0x71, 0x92, 0x72, 0x92, 0x73, /* 0xAC-0xAF */ + 0x92, 0x74, 0xB1, 0xA7, 0x92, 0x75, 0x92, 0x76, /* 0xB0-0xB3 */ + 0x92, 0x77, 0xB5, 0xD6, 0x92, 0x78, 0x92, 0x79, /* 0xB4-0xB7 */ + 0x92, 0x7A, 0xC4, 0xA8, 0x92, 0x7B, 0xDE, 0xD3, /* 0xB8-0xBB */ + 0xD1, 0xBA, 0xB3, 0xE9, 0x92, 0x7C, 0xC3, 0xF2, /* 0xBC-0xBF */ + 0x92, 0x7D, 0x92, 0x7E, 0xB7, 0xF7, 0x92, 0x80, /* 0xC0-0xC3 */ + 0xD6, 0xF4, 0xB5, 0xA3, 0xB2, 0xF0, 0xC4, 0xB4, /* 0xC4-0xC7 */ + 0xC4, 0xE9, 0xC0, 0xAD, 0xDE, 0xD4, 0x92, 0x81, /* 0xC8-0xCB */ + 0xB0, 0xE8, 0xC5, 0xC4, 0xC1, 0xE0, 0x92, 0x82, /* 0xCC-0xCF */ + 0xB9, 0xD5, 0x92, 0x83, 0xBE, 0xDC, 0xCD, 0xD8, /* 0xD0-0xD3 */ + 0xB0, 0xCE, 0x92, 0x84, 0xCD, 0xCF, 0xDE, 0xD6, /* 0xD4-0xD7 */ + 0xBE, 0xD0, 0xD7, 0xBE, 0xDE, 0xD5, 0xD5, 0xD0, /* 0xD8-0xDB */ + 0xB0, 0xDD, 0x92, 0x85, 0x92, 0x86, 0xC4, 0xE2, /* 0xDC-0xDF */ + 0x92, 0x87, 0x92, 0x88, 0xC2, 0xA3, 0xBC, 0xF0, /* 0xE0-0xE3 */ + 0x92, 0x89, 0xD3, 0xB5, 0xC0, 0xB9, 0xC5, 0xA1, /* 0xE4-0xE7 */ + 0xB2, 0xA6, 0xD4, 0xF1, 0x92, 0x8A, 0x92, 0x8B, /* 0xE8-0xEB */ + 0xC0, 0xA8, 0xCA, 0xC3, 0xDE, 0xD7, 0xD5, 0xFC, /* 0xEC-0xEF */ + 0x92, 0x8C, 0xB9, 0xB0, 0x92, 0x8D, 0xC8, 0xAD, /* 0xF0-0xF3 */ + 0xCB, 0xA9, 0x92, 0x8E, 0xDE, 0xD9, 0xBF, 0xBD, /* 0xF4-0xF7 */ + 0x92, 0x8F, 0x92, 0x90, 0x92, 0x91, 0x92, 0x92, /* 0xF8-0xFB */ + 0xC6, 0xB4, 0xD7, 0xA7, 0xCA, 0xB0, 0xC4, 0xC3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_63[512] = { + 0x92, 0x93, 0xB3, 0xD6, 0xB9, 0xD2, 0x92, 0x94, /* 0x00-0x03 */ + 0x92, 0x95, 0x92, 0x96, 0x92, 0x97, 0xD6, 0xB8, /* 0x04-0x07 */ + 0xEA, 0xFC, 0xB0, 0xB4, 0x92, 0x98, 0x92, 0x99, /* 0x08-0x0B */ + 0x92, 0x9A, 0x92, 0x9B, 0xBF, 0xE6, 0x92, 0x9C, /* 0x0C-0x0F */ + 0x92, 0x9D, 0xCC, 0xF4, 0x92, 0x9E, 0x92, 0x9F, /* 0x10-0x13 */ + 0x92, 0xA0, 0x92, 0xA1, 0xCD, 0xDA, 0x92, 0xA2, /* 0x14-0x17 */ + 0x92, 0xA3, 0x92, 0xA4, 0xD6, 0xBF, 0xC2, 0xCE, /* 0x18-0x1B */ + 0x92, 0xA5, 0xCE, 0xCE, 0xCC, 0xA2, 0xD0, 0xAE, /* 0x1C-0x1F */ + 0xC4, 0xD3, 0xB5, 0xB2, 0xDE, 0xD8, 0xD5, 0xF5, /* 0x20-0x23 */ + 0xBC, 0xB7, 0xBB, 0xD3, 0x92, 0xA6, 0x92, 0xA7, /* 0x24-0x27 */ + 0xB0, 0xA4, 0x92, 0xA8, 0xC5, 0xB2, 0xB4, 0xEC, /* 0x28-0x2B */ + 0x92, 0xA9, 0x92, 0xAA, 0x92, 0xAB, 0xD5, 0xF1, /* 0x2C-0x2F */ + 0x92, 0xAC, 0x92, 0xAD, 0xEA, 0xFD, 0x92, 0xAE, /* 0x30-0x33 */ + 0x92, 0xAF, 0x92, 0xB0, 0x92, 0xB1, 0x92, 0xB2, /* 0x34-0x37 */ + 0x92, 0xB3, 0xDE, 0xDA, 0xCD, 0xA6, 0x92, 0xB4, /* 0x38-0x3B */ + 0x92, 0xB5, 0xCD, 0xEC, 0x92, 0xB6, 0x92, 0xB7, /* 0x3C-0x3F */ + 0x92, 0xB8, 0x92, 0xB9, 0xCE, 0xE6, 0xDE, 0xDC, /* 0x40-0x43 */ + 0x92, 0xBA, 0xCD, 0xB1, 0xC0, 0xA6, 0x92, 0xBB, /* 0x44-0x47 */ + 0x92, 0xBC, 0xD7, 0xBD, 0x92, 0xBD, 0xDE, 0xDB, /* 0x48-0x4B */ + 0xB0, 0xC6, 0xBA, 0xB4, 0xC9, 0xD3, 0xC4, 0xF3, /* 0x4C-0x4F */ + 0xBE, 0xE8, 0x92, 0xBE, 0x92, 0xBF, 0x92, 0xC0, /* 0x50-0x53 */ + 0x92, 0xC1, 0xB2, 0xB6, 0x92, 0xC2, 0x92, 0xC3, /* 0x54-0x57 */ + 0x92, 0xC4, 0x92, 0xC5, 0x92, 0xC6, 0x92, 0xC7, /* 0x58-0x5B */ + 0x92, 0xC8, 0x92, 0xC9, 0xC0, 0xCC, 0xCB, 0xF0, /* 0x5C-0x5F */ + 0x92, 0xCA, 0xBC, 0xF1, 0xBB, 0xBB, 0xB5, 0xB7, /* 0x60-0x63 */ + 0x92, 0xCB, 0x92, 0xCC, 0x92, 0xCD, 0xC5, 0xF5, /* 0x64-0x67 */ + 0x92, 0xCE, 0xDE, 0xE6, 0x92, 0xCF, 0x92, 0xD0, /* 0x68-0x6B */ + 0x92, 0xD1, 0xDE, 0xE3, 0xBE, 0xDD, 0x92, 0xD2, /* 0x6C-0x6F */ + 0x92, 0xD3, 0xDE, 0xDF, 0x92, 0xD4, 0x92, 0xD5, /* 0x70-0x73 */ + 0x92, 0xD6, 0x92, 0xD7, 0xB4, 0xB7, 0xBD, 0xDD, /* 0x74-0x77 */ + 0x92, 0xD8, 0x92, 0xD9, 0xDE, 0xE0, 0xC4, 0xED, /* 0x78-0x7B */ + 0x92, 0xDA, 0x92, 0xDB, 0x92, 0xDC, 0x92, 0xDD, /* 0x7C-0x7F */ + + 0xCF, 0xC6, 0x92, 0xDE, 0xB5, 0xE0, 0x92, 0xDF, /* 0x80-0x83 */ + 0x92, 0xE0, 0x92, 0xE1, 0x92, 0xE2, 0xB6, 0xDE, /* 0x84-0x87 */ + 0xCA, 0xDA, 0xB5, 0xF4, 0xDE, 0xE5, 0x92, 0xE3, /* 0x88-0x8B */ + 0xD5, 0xC6, 0x92, 0xE4, 0xDE, 0xE1, 0xCC, 0xCD, /* 0x8C-0x8F */ + 0xC6, 0xFE, 0x92, 0xE5, 0xC5, 0xC5, 0x92, 0xE6, /* 0x90-0x93 */ + 0x92, 0xE7, 0x92, 0xE8, 0xD2, 0xB4, 0x92, 0xE9, /* 0x94-0x97 */ + 0xBE, 0xF2, 0x92, 0xEA, 0x92, 0xEB, 0x92, 0xEC, /* 0x98-0x9B */ + 0x92, 0xED, 0x92, 0xEE, 0x92, 0xEF, 0x92, 0xF0, /* 0x9C-0x9F */ + 0xC2, 0xD3, 0x92, 0xF1, 0xCC, 0xBD, 0xB3, 0xB8, /* 0xA0-0xA3 */ + 0x92, 0xF2, 0xBD, 0xD3, 0x92, 0xF3, 0xBF, 0xD8, /* 0xA4-0xA7 */ + 0xCD, 0xC6, 0xD1, 0xDA, 0xB4, 0xEB, 0x92, 0xF4, /* 0xA8-0xAB */ + 0xDE, 0xE4, 0xDE, 0xDD, 0xDE, 0xE7, 0x92, 0xF5, /* 0xAC-0xAF */ + 0xEA, 0xFE, 0x92, 0xF6, 0x92, 0xF7, 0xC2, 0xB0, /* 0xB0-0xB3 */ + 0xDE, 0xE2, 0x92, 0xF8, 0x92, 0xF9, 0xD6, 0xC0, /* 0xB4-0xB7 */ + 0xB5, 0xA7, 0x92, 0xFA, 0xB2, 0xF4, 0x92, 0xFB, /* 0xB8-0xBB */ + 0xDE, 0xE8, 0x92, 0xFC, 0xDE, 0xF2, 0x92, 0xFD, /* 0xBC-0xBF */ + 0x92, 0xFE, 0x93, 0x40, 0x93, 0x41, 0x93, 0x42, /* 0xC0-0xC3 */ + 0xDE, 0xED, 0x93, 0x43, 0xDE, 0xF1, 0x93, 0x44, /* 0xC4-0xC7 */ + 0x93, 0x45, 0xC8, 0xE0, 0x93, 0x46, 0x93, 0x47, /* 0xC8-0xCB */ + 0x93, 0x48, 0xD7, 0xE1, 0xDE, 0xEF, 0xC3, 0xE8, /* 0xCC-0xCF */ + 0xCC, 0xE1, 0x93, 0x49, 0xB2, 0xE5, 0x93, 0x4A, /* 0xD0-0xD3 */ + 0x93, 0x4B, 0x93, 0x4C, 0xD2, 0xBE, 0x93, 0x4D, /* 0xD4-0xD7 */ + 0x93, 0x4E, 0x93, 0x4F, 0x93, 0x50, 0x93, 0x51, /* 0xD8-0xDB */ + 0x93, 0x52, 0x93, 0x53, 0xDE, 0xEE, 0x93, 0x54, /* 0xDC-0xDF */ + 0xDE, 0xEB, 0xCE, 0xD5, 0x93, 0x55, 0xB4, 0xA7, /* 0xE0-0xE3 */ + 0x93, 0x56, 0x93, 0x57, 0x93, 0x58, 0x93, 0x59, /* 0xE4-0xE7 */ + 0x93, 0x5A, 0xBF, 0xAB, 0xBE, 0xBE, 0x93, 0x5B, /* 0xE8-0xEB */ + 0x93, 0x5C, 0xBD, 0xD2, 0x93, 0x5D, 0x93, 0x5E, /* 0xEC-0xEF */ + 0x93, 0x5F, 0x93, 0x60, 0xDE, 0xE9, 0x93, 0x61, /* 0xF0-0xF3 */ + 0xD4, 0xAE, 0x93, 0x62, 0xDE, 0xDE, 0x93, 0x63, /* 0xF4-0xF7 */ + 0xDE, 0xEA, 0x93, 0x64, 0x93, 0x65, 0x93, 0x66, /* 0xF8-0xFB */ + 0x93, 0x67, 0xC0, 0xBF, 0x93, 0x68, 0xDE, 0xEC, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_64[512] = { + 0xB2, 0xF3, 0xB8, 0xE9, 0xC2, 0xA7, 0x93, 0x69, /* 0x00-0x03 */ + 0x93, 0x6A, 0xBD, 0xC1, 0x93, 0x6B, 0x93, 0x6C, /* 0x04-0x07 */ + 0x93, 0x6D, 0x93, 0x6E, 0x93, 0x6F, 0xDE, 0xF5, /* 0x08-0x0B */ + 0xDE, 0xF8, 0x93, 0x70, 0x93, 0x71, 0xB2, 0xAB, /* 0x0C-0x0F */ + 0xB4, 0xA4, 0x93, 0x72, 0x93, 0x73, 0xB4, 0xEA, /* 0x10-0x13 */ + 0xC9, 0xA6, 0x93, 0x74, 0x93, 0x75, 0x93, 0x76, /* 0x14-0x17 */ + 0x93, 0x77, 0x93, 0x78, 0x93, 0x79, 0xDE, 0xF6, /* 0x18-0x1B */ + 0xCB, 0xD1, 0x93, 0x7A, 0xB8, 0xE3, 0x93, 0x7B, /* 0x1C-0x1F */ + 0xDE, 0xF7, 0xDE, 0xFA, 0x93, 0x7C, 0x93, 0x7D, /* 0x20-0x23 */ + 0x93, 0x7E, 0x93, 0x80, 0xDE, 0xF9, 0x93, 0x81, /* 0x24-0x27 */ + 0x93, 0x82, 0x93, 0x83, 0xCC, 0xC2, 0x93, 0x84, /* 0x28-0x2B */ + 0xB0, 0xE1, 0xB4, 0xEE, 0x93, 0x85, 0x93, 0x86, /* 0x2C-0x2F */ + 0x93, 0x87, 0x93, 0x88, 0x93, 0x89, 0x93, 0x8A, /* 0x30-0x33 */ + 0xE5, 0xBA, 0x93, 0x8B, 0x93, 0x8C, 0x93, 0x8D, /* 0x34-0x37 */ + 0x93, 0x8E, 0x93, 0x8F, 0xD0, 0xAF, 0x93, 0x90, /* 0x38-0x3B */ + 0x93, 0x91, 0xB2, 0xEB, 0x93, 0x92, 0xEB, 0xA1, /* 0x3C-0x3F */ + 0x93, 0x93, 0xDE, 0xF4, 0x93, 0x94, 0x93, 0x95, /* 0x40-0x43 */ + 0xC9, 0xE3, 0xDE, 0xF3, 0xB0, 0xDA, 0xD2, 0xA1, /* 0x44-0x47 */ + 0xB1, 0xF7, 0x93, 0x96, 0xCC, 0xAF, 0x93, 0x97, /* 0x48-0x4B */ + 0x93, 0x98, 0x93, 0x99, 0x93, 0x9A, 0x93, 0x9B, /* 0x4C-0x4F */ + 0x93, 0x9C, 0x93, 0x9D, 0xDE, 0xF0, 0x93, 0x9E, /* 0x50-0x53 */ + 0xCB, 0xA4, 0x93, 0x9F, 0x93, 0xA0, 0x93, 0xA1, /* 0x54-0x57 */ + 0xD5, 0xAA, 0x93, 0xA2, 0x93, 0xA3, 0x93, 0xA4, /* 0x58-0x5B */ + 0x93, 0xA5, 0x93, 0xA6, 0xDE, 0xFB, 0x93, 0xA7, /* 0x5C-0x5F */ + 0x93, 0xA8, 0x93, 0xA9, 0x93, 0xAA, 0x93, 0xAB, /* 0x60-0x63 */ + 0x93, 0xAC, 0x93, 0xAD, 0x93, 0xAE, 0xB4, 0xDD, /* 0x64-0x67 */ + 0x93, 0xAF, 0xC4, 0xA6, 0x93, 0xB0, 0x93, 0xB1, /* 0x68-0x6B */ + 0x93, 0xB2, 0xDE, 0xFD, 0x93, 0xB3, 0x93, 0xB4, /* 0x6C-0x6F */ + 0x93, 0xB5, 0x93, 0xB6, 0x93, 0xB7, 0x93, 0xB8, /* 0x70-0x73 */ + 0x93, 0xB9, 0x93, 0xBA, 0x93, 0xBB, 0x93, 0xBC, /* 0x74-0x77 */ + 0xC3, 0xFE, 0xC4, 0xA1, 0xDF, 0xA1, 0x93, 0xBD, /* 0x78-0x7B */ + 0x93, 0xBE, 0x93, 0xBF, 0x93, 0xC0, 0x93, 0xC1, /* 0x7C-0x7F */ + + 0x93, 0xC2, 0x93, 0xC3, 0xC1, 0xCC, 0x93, 0xC4, /* 0x80-0x83 */ + 0xDE, 0xFC, 0xBE, 0xEF, 0x93, 0xC5, 0xC6, 0xB2, /* 0x84-0x87 */ + 0x93, 0xC6, 0x93, 0xC7, 0x93, 0xC8, 0x93, 0xC9, /* 0x88-0x8B */ + 0x93, 0xCA, 0x93, 0xCB, 0x93, 0xCC, 0x93, 0xCD, /* 0x8C-0x8F */ + 0x93, 0xCE, 0xB3, 0xC5, 0xC8, 0xF6, 0x93, 0xCF, /* 0x90-0x93 */ + 0x93, 0xD0, 0xCB, 0xBA, 0xDE, 0xFE, 0x93, 0xD1, /* 0x94-0x97 */ + 0x93, 0xD2, 0xDF, 0xA4, 0x93, 0xD3, 0x93, 0xD4, /* 0x98-0x9B */ + 0x93, 0xD5, 0x93, 0xD6, 0xD7, 0xB2, 0x93, 0xD7, /* 0x9C-0x9F */ + 0x93, 0xD8, 0x93, 0xD9, 0x93, 0xDA, 0x93, 0xDB, /* 0xA0-0xA3 */ + 0xB3, 0xB7, 0x93, 0xDC, 0x93, 0xDD, 0x93, 0xDE, /* 0xA4-0xA7 */ + 0x93, 0xDF, 0xC1, 0xC3, 0x93, 0xE0, 0x93, 0xE1, /* 0xA8-0xAB */ + 0xC7, 0xCB, 0xB2, 0xA5, 0xB4, 0xE9, 0x93, 0xE2, /* 0xAC-0xAF */ + 0xD7, 0xAB, 0x93, 0xE3, 0x93, 0xE4, 0x93, 0xE5, /* 0xB0-0xB3 */ + 0x93, 0xE6, 0xC4, 0xEC, 0x93, 0xE7, 0xDF, 0xA2, /* 0xB4-0xB7 */ + 0xDF, 0xA3, 0x93, 0xE8, 0xDF, 0xA5, 0x93, 0xE9, /* 0xB8-0xBB */ + 0xBA, 0xB3, 0x93, 0xEA, 0x93, 0xEB, 0x93, 0xEC, /* 0xBC-0xBF */ + 0xDF, 0xA6, 0x93, 0xED, 0xC0, 0xDE, 0x93, 0xEE, /* 0xC0-0xC3 */ + 0x93, 0xEF, 0xC9, 0xC3, 0x93, 0xF0, 0x93, 0xF1, /* 0xC4-0xC7 */ + 0x93, 0xF2, 0x93, 0xF3, 0x93, 0xF4, 0x93, 0xF5, /* 0xC8-0xCB */ + 0x93, 0xF6, 0xB2, 0xD9, 0xC7, 0xE6, 0x93, 0xF7, /* 0xCC-0xCF */ + 0xDF, 0xA7, 0x93, 0xF8, 0xC7, 0xDC, 0x93, 0xF9, /* 0xD0-0xD3 */ + 0x93, 0xFA, 0x93, 0xFB, 0x93, 0xFC, 0xDF, 0xA8, /* 0xD4-0xD7 */ + 0xEB, 0xA2, 0x93, 0xFD, 0x93, 0xFE, 0x94, 0x40, /* 0xD8-0xDB */ + 0x94, 0x41, 0x94, 0x42, 0xCB, 0xD3, 0x94, 0x43, /* 0xDC-0xDF */ + 0x94, 0x44, 0x94, 0x45, 0xDF, 0xAA, 0x94, 0x46, /* 0xE0-0xE3 */ + 0xDF, 0xA9, 0x94, 0x47, 0xB2, 0xC1, 0x94, 0x48, /* 0xE4-0xE7 */ + 0x94, 0x49, 0x94, 0x4A, 0x94, 0x4B, 0x94, 0x4C, /* 0xE8-0xEB */ + 0x94, 0x4D, 0x94, 0x4E, 0x94, 0x4F, 0x94, 0x50, /* 0xEC-0xEF */ + 0x94, 0x51, 0x94, 0x52, 0x94, 0x53, 0x94, 0x54, /* 0xF0-0xF3 */ + 0x94, 0x55, 0x94, 0x56, 0x94, 0x57, 0x94, 0x58, /* 0xF4-0xF7 */ + 0x94, 0x59, 0x94, 0x5A, 0x94, 0x5B, 0x94, 0x5C, /* 0xF8-0xFB */ + 0x94, 0x5D, 0x94, 0x5E, 0x94, 0x5F, 0x94, 0x60, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_65[512] = { + 0xC5, 0xCA, 0x94, 0x61, 0x94, 0x62, 0x94, 0x63, /* 0x00-0x03 */ + 0x94, 0x64, 0x94, 0x65, 0x94, 0x66, 0x94, 0x67, /* 0x04-0x07 */ + 0x94, 0x68, 0xDF, 0xAB, 0x94, 0x69, 0x94, 0x6A, /* 0x08-0x0B */ + 0x94, 0x6B, 0x94, 0x6C, 0x94, 0x6D, 0x94, 0x6E, /* 0x0C-0x0F */ + 0x94, 0x6F, 0x94, 0x70, 0xD4, 0xDC, 0x94, 0x71, /* 0x10-0x13 */ + 0x94, 0x72, 0x94, 0x73, 0x94, 0x74, 0x94, 0x75, /* 0x14-0x17 */ + 0xC8, 0xC1, 0x94, 0x76, 0x94, 0x77, 0x94, 0x78, /* 0x18-0x1B */ + 0x94, 0x79, 0x94, 0x7A, 0x94, 0x7B, 0x94, 0x7C, /* 0x1C-0x1F */ + 0x94, 0x7D, 0x94, 0x7E, 0x94, 0x80, 0x94, 0x81, /* 0x20-0x23 */ + 0x94, 0x82, 0xDF, 0xAC, 0x94, 0x83, 0x94, 0x84, /* 0x24-0x27 */ + 0x94, 0x85, 0x94, 0x86, 0x94, 0x87, 0xBE, 0xF0, /* 0x28-0x2B */ + 0x94, 0x88, 0x94, 0x89, 0xDF, 0xAD, 0xD6, 0xA7, /* 0x2C-0x2F */ + 0x94, 0x8A, 0x94, 0x8B, 0x94, 0x8C, 0x94, 0x8D, /* 0x30-0x33 */ + 0xEA, 0xB7, 0xEB, 0xB6, 0xCA, 0xD5, 0x94, 0x8E, /* 0x34-0x37 */ + 0xD8, 0xFC, 0xB8, 0xC4, 0x94, 0x8F, 0xB9, 0xA5, /* 0x38-0x3B */ + 0x94, 0x90, 0x94, 0x91, 0xB7, 0xC5, 0xD5, 0xFE, /* 0x3C-0x3F */ + 0x94, 0x92, 0x94, 0x93, 0x94, 0x94, 0x94, 0x95, /* 0x40-0x43 */ + 0x94, 0x96, 0xB9, 0xCA, 0x94, 0x97, 0x94, 0x98, /* 0x44-0x47 */ + 0xD0, 0xA7, 0xF4, 0xCD, 0x94, 0x99, 0x94, 0x9A, /* 0x48-0x4B */ + 0xB5, 0xD0, 0x94, 0x9B, 0x94, 0x9C, 0xC3, 0xF4, /* 0x4C-0x4F */ + 0x94, 0x9D, 0xBE, 0xC8, 0x94, 0x9E, 0x94, 0x9F, /* 0x50-0x53 */ + 0x94, 0xA0, 0xEB, 0xB7, 0xB0, 0xBD, 0x94, 0xA1, /* 0x54-0x57 */ + 0x94, 0xA2, 0xBD, 0xCC, 0x94, 0xA3, 0xC1, 0xB2, /* 0x58-0x5B */ + 0x94, 0xA4, 0xB1, 0xD6, 0xB3, 0xA8, 0x94, 0xA5, /* 0x5C-0x5F */ + 0x94, 0xA6, 0x94, 0xA7, 0xB8, 0xD2, 0xC9, 0xA2, /* 0x60-0x63 */ + 0x94, 0xA8, 0x94, 0xA9, 0xB6, 0xD8, 0x94, 0xAA, /* 0x64-0x67 */ + 0x94, 0xAB, 0x94, 0xAC, 0x94, 0xAD, 0xEB, 0xB8, /* 0x68-0x6B */ + 0xBE, 0xB4, 0x94, 0xAE, 0x94, 0xAF, 0x94, 0xB0, /* 0x6C-0x6F */ + 0xCA, 0xFD, 0x94, 0xB1, 0xC7, 0xC3, 0x94, 0xB2, /* 0x70-0x73 */ + 0xD5, 0xFB, 0x94, 0xB3, 0x94, 0xB4, 0xB7, 0xF3, /* 0x74-0x77 */ + 0x94, 0xB5, 0x94, 0xB6, 0x94, 0xB7, 0x94, 0xB8, /* 0x78-0x7B */ + 0x94, 0xB9, 0x94, 0xBA, 0x94, 0xBB, 0x94, 0xBC, /* 0x7C-0x7F */ + + 0x94, 0xBD, 0x94, 0xBE, 0x94, 0xBF, 0x94, 0xC0, /* 0x80-0x83 */ + 0x94, 0xC1, 0x94, 0xC2, 0x94, 0xC3, 0xCE, 0xC4, /* 0x84-0x87 */ + 0x94, 0xC4, 0x94, 0xC5, 0x94, 0xC6, 0xD5, 0xAB, /* 0x88-0x8B */ + 0xB1, 0xF3, 0x94, 0xC7, 0x94, 0xC8, 0x94, 0xC9, /* 0x8C-0x8F */ + 0xEC, 0xB3, 0xB0, 0xDF, 0x94, 0xCA, 0xEC, 0xB5, /* 0x90-0x93 */ + 0x94, 0xCB, 0x94, 0xCC, 0x94, 0xCD, 0xB6, 0xB7, /* 0x94-0x97 */ + 0x94, 0xCE, 0xC1, 0xCF, 0x94, 0xCF, 0xF5, 0xFA, /* 0x98-0x9B */ + 0xD0, 0xB1, 0x94, 0xD0, 0x94, 0xD1, 0xD5, 0xE5, /* 0x9C-0x9F */ + 0x94, 0xD2, 0xCE, 0xD3, 0x94, 0xD3, 0x94, 0xD4, /* 0xA0-0xA3 */ + 0xBD, 0xEF, 0xB3, 0xE2, 0x94, 0xD5, 0xB8, 0xAB, /* 0xA4-0xA7 */ + 0x94, 0xD6, 0xD5, 0xB6, 0x94, 0xD7, 0xED, 0xBD, /* 0xA8-0xAB */ + 0x94, 0xD8, 0xB6, 0xCF, 0x94, 0xD9, 0xCB, 0xB9, /* 0xAC-0xAF */ + 0xD0, 0xC2, 0x94, 0xDA, 0x94, 0xDB, 0x94, 0xDC, /* 0xB0-0xB3 */ + 0x94, 0xDD, 0x94, 0xDE, 0x94, 0xDF, 0x94, 0xE0, /* 0xB4-0xB7 */ + 0x94, 0xE1, 0xB7, 0xBD, 0x94, 0xE2, 0x94, 0xE3, /* 0xB8-0xBB */ + 0xEC, 0xB6, 0xCA, 0xA9, 0x94, 0xE4, 0x94, 0xE5, /* 0xBC-0xBF */ + 0x94, 0xE6, 0xC5, 0xD4, 0x94, 0xE7, 0xEC, 0xB9, /* 0xC0-0xC3 */ + 0xEC, 0xB8, 0xC2, 0xC3, 0xEC, 0xB7, 0x94, 0xE8, /* 0xC4-0xC7 */ + 0x94, 0xE9, 0x94, 0xEA, 0x94, 0xEB, 0xD0, 0xFD, /* 0xC8-0xCB */ + 0xEC, 0xBA, 0x94, 0xEC, 0xEC, 0xBB, 0xD7, 0xE5, /* 0xCC-0xCF */ + 0x94, 0xED, 0x94, 0xEE, 0xEC, 0xBC, 0x94, 0xEF, /* 0xD0-0xD3 */ + 0x94, 0xF0, 0x94, 0xF1, 0xEC, 0xBD, 0xC6, 0xEC, /* 0xD4-0xD7 */ + 0x94, 0xF2, 0x94, 0xF3, 0x94, 0xF4, 0x94, 0xF5, /* 0xD8-0xDB */ + 0x94, 0xF6, 0x94, 0xF7, 0x94, 0xF8, 0x94, 0xF9, /* 0xDC-0xDF */ + 0xCE, 0xDE, 0x94, 0xFA, 0xBC, 0xC8, 0x94, 0xFB, /* 0xE0-0xE3 */ + 0x94, 0xFC, 0xC8, 0xD5, 0xB5, 0xA9, 0xBE, 0xC9, /* 0xE4-0xE7 */ + 0xD6, 0xBC, 0xD4, 0xE7, 0x94, 0xFD, 0x94, 0xFE, /* 0xE8-0xEB */ + 0xD1, 0xAE, 0xD0, 0xF1, 0xEA, 0xB8, 0xEA, 0xB9, /* 0xEC-0xEF */ + 0xEA, 0xBA, 0xBA, 0xB5, 0x95, 0x40, 0x95, 0x41, /* 0xF0-0xF3 */ + 0x95, 0x42, 0x95, 0x43, 0xCA, 0xB1, 0xBF, 0xF5, /* 0xF4-0xF7 */ + 0x95, 0x44, 0x95, 0x45, 0xCD, 0xFA, 0x95, 0x46, /* 0xF8-0xFB */ + 0x95, 0x47, 0x95, 0x48, 0x95, 0x49, 0x95, 0x4A, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_66[512] = { + 0xEA, 0xC0, 0x95, 0x4B, 0xB0, 0xBA, 0xEA, 0xBE, /* 0x00-0x03 */ + 0x95, 0x4C, 0x95, 0x4D, 0xC0, 0xA5, 0x95, 0x4E, /* 0x04-0x07 */ + 0x95, 0x4F, 0x95, 0x50, 0xEA, 0xBB, 0x95, 0x51, /* 0x08-0x0B */ + 0xB2, 0xFD, 0x95, 0x52, 0xC3, 0xF7, 0xBB, 0xE8, /* 0x0C-0x0F */ + 0x95, 0x53, 0x95, 0x54, 0x95, 0x55, 0xD2, 0xD7, /* 0x10-0x13 */ + 0xCE, 0xF4, 0xEA, 0xBF, 0x95, 0x56, 0x95, 0x57, /* 0x14-0x17 */ + 0x95, 0x58, 0xEA, 0xBC, 0x95, 0x59, 0x95, 0x5A, /* 0x18-0x1B */ + 0x95, 0x5B, 0xEA, 0xC3, 0x95, 0x5C, 0xD0, 0xC7, /* 0x1C-0x1F */ + 0xD3, 0xB3, 0x95, 0x5D, 0x95, 0x5E, 0x95, 0x5F, /* 0x20-0x23 */ + 0x95, 0x60, 0xB4, 0xBA, 0x95, 0x61, 0xC3, 0xC1, /* 0x24-0x27 */ + 0xD7, 0xF2, 0x95, 0x62, 0x95, 0x63, 0x95, 0x64, /* 0x28-0x2B */ + 0x95, 0x65, 0xD5, 0xD1, 0x95, 0x66, 0xCA, 0xC7, /* 0x2C-0x2F */ + 0x95, 0x67, 0xEA, 0xC5, 0x95, 0x68, 0x95, 0x69, /* 0x30-0x33 */ + 0xEA, 0xC4, 0xEA, 0xC7, 0xEA, 0xC6, 0x95, 0x6A, /* 0x34-0x37 */ + 0x95, 0x6B, 0x95, 0x6C, 0x95, 0x6D, 0x95, 0x6E, /* 0x38-0x3B */ + 0xD6, 0xE7, 0x95, 0x6F, 0xCF, 0xD4, 0x95, 0x70, /* 0x3C-0x3F */ + 0x95, 0x71, 0xEA, 0xCB, 0x95, 0x72, 0xBB, 0xCE, /* 0x40-0x43 */ + 0x95, 0x73, 0x95, 0x74, 0x95, 0x75, 0x95, 0x76, /* 0x44-0x47 */ + 0x95, 0x77, 0x95, 0x78, 0x95, 0x79, 0xBD, 0xFA, /* 0x48-0x4B */ + 0xC9, 0xCE, 0x95, 0x7A, 0x95, 0x7B, 0xEA, 0xCC, /* 0x4C-0x4F */ + 0x95, 0x7C, 0x95, 0x7D, 0xC9, 0xB9, 0xCF, 0xFE, /* 0x50-0x53 */ + 0xEA, 0xCA, 0xD4, 0xCE, 0xEA, 0xCD, 0xEA, 0xCF, /* 0x54-0x57 */ + 0x95, 0x7E, 0x95, 0x80, 0xCD, 0xED, 0x95, 0x81, /* 0x58-0x5B */ + 0x95, 0x82, 0x95, 0x83, 0x95, 0x84, 0xEA, 0xC9, /* 0x5C-0x5F */ + 0x95, 0x85, 0xEA, 0xCE, 0x95, 0x86, 0x95, 0x87, /* 0x60-0x63 */ + 0xCE, 0xEE, 0x95, 0x88, 0xBB, 0xDE, 0x95, 0x89, /* 0x64-0x67 */ + 0xB3, 0xBF, 0x95, 0x8A, 0x95, 0x8B, 0x95, 0x8C, /* 0x68-0x6B */ + 0x95, 0x8D, 0x95, 0x8E, 0xC6, 0xD5, 0xBE, 0xB0, /* 0x6C-0x6F */ + 0xCE, 0xFA, 0x95, 0x8F, 0x95, 0x90, 0x95, 0x91, /* 0x70-0x73 */ + 0xC7, 0xE7, 0x95, 0x92, 0xBE, 0xA7, 0xEA, 0xD0, /* 0x74-0x77 */ + 0x95, 0x93, 0x95, 0x94, 0xD6, 0xC7, 0x95, 0x95, /* 0x78-0x7B */ + 0x95, 0x96, 0x95, 0x97, 0xC1, 0xC0, 0x95, 0x98, /* 0x7C-0x7F */ + + 0x95, 0x99, 0x95, 0x9A, 0xD4, 0xDD, 0x95, 0x9B, /* 0x80-0x83 */ + 0xEA, 0xD1, 0x95, 0x9C, 0x95, 0x9D, 0xCF, 0xBE, /* 0x84-0x87 */ + 0x95, 0x9E, 0x95, 0x9F, 0x95, 0xA0, 0x95, 0xA1, /* 0x88-0x8B */ + 0xEA, 0xD2, 0x95, 0xA2, 0x95, 0xA3, 0x95, 0xA4, /* 0x8C-0x8F */ + 0x95, 0xA5, 0xCA, 0xEE, 0x95, 0xA6, 0x95, 0xA7, /* 0x90-0x93 */ + 0x95, 0xA8, 0x95, 0xA9, 0xC5, 0xAF, 0xB0, 0xB5, /* 0x94-0x97 */ + 0x95, 0xAA, 0x95, 0xAB, 0x95, 0xAC, 0x95, 0xAD, /* 0x98-0x9B */ + 0x95, 0xAE, 0xEA, 0xD4, 0x95, 0xAF, 0x95, 0xB0, /* 0x9C-0x9F */ + 0x95, 0xB1, 0x95, 0xB2, 0x95, 0xB3, 0x95, 0xB4, /* 0xA0-0xA3 */ + 0x95, 0xB5, 0x95, 0xB6, 0x95, 0xB7, 0xEA, 0xD3, /* 0xA4-0xA7 */ + 0xF4, 0xDF, 0x95, 0xB8, 0x95, 0xB9, 0x95, 0xBA, /* 0xA8-0xAB */ + 0x95, 0xBB, 0x95, 0xBC, 0xC4, 0xBA, 0x95, 0xBD, /* 0xAC-0xAF */ + 0x95, 0xBE, 0x95, 0xBF, 0x95, 0xC0, 0x95, 0xC1, /* 0xB0-0xB3 */ + 0xB1, 0xA9, 0x95, 0xC2, 0x95, 0xC3, 0x95, 0xC4, /* 0xB4-0xB7 */ + 0x95, 0xC5, 0xE5, 0xDF, 0x95, 0xC6, 0x95, 0xC7, /* 0xB8-0xBB */ + 0x95, 0xC8, 0x95, 0xC9, 0xEA, 0xD5, 0x95, 0xCA, /* 0xBC-0xBF */ + 0x95, 0xCB, 0x95, 0xCC, 0x95, 0xCD, 0x95, 0xCE, /* 0xC0-0xC3 */ + 0x95, 0xCF, 0x95, 0xD0, 0x95, 0xD1, 0x95, 0xD2, /* 0xC4-0xC7 */ + 0x95, 0xD3, 0x95, 0xD4, 0x95, 0xD5, 0x95, 0xD6, /* 0xC8-0xCB */ + 0x95, 0xD7, 0x95, 0xD8, 0x95, 0xD9, 0x95, 0xDA, /* 0xCC-0xCF */ + 0x95, 0xDB, 0x95, 0xDC, 0x95, 0xDD, 0x95, 0xDE, /* 0xD0-0xD3 */ + 0x95, 0xDF, 0x95, 0xE0, 0x95, 0xE1, 0x95, 0xE2, /* 0xD4-0xD7 */ + 0x95, 0xE3, 0xCA, 0xEF, 0x95, 0xE4, 0xEA, 0xD6, /* 0xD8-0xDB */ + 0xEA, 0xD7, 0xC6, 0xD8, 0x95, 0xE5, 0x95, 0xE6, /* 0xDC-0xDF */ + 0x95, 0xE7, 0x95, 0xE8, 0x95, 0xE9, 0x95, 0xEA, /* 0xE0-0xE3 */ + 0x95, 0xEB, 0x95, 0xEC, 0xEA, 0xD8, 0x95, 0xED, /* 0xE4-0xE7 */ + 0x95, 0xEE, 0xEA, 0xD9, 0x95, 0xEF, 0x95, 0xF0, /* 0xE8-0xEB */ + 0x95, 0xF1, 0x95, 0xF2, 0x95, 0xF3, 0x95, 0xF4, /* 0xEC-0xEF */ + 0xD4, 0xBB, 0x95, 0xF5, 0xC7, 0xFA, 0xD2, 0xB7, /* 0xF0-0xF3 */ + 0xB8, 0xFC, 0x95, 0xF6, 0x95, 0xF7, 0xEA, 0xC2, /* 0xF4-0xF7 */ + 0x95, 0xF8, 0xB2, 0xDC, 0x95, 0xF9, 0x95, 0xFA, /* 0xF8-0xFB */ + 0xC2, 0xFC, 0x95, 0xFB, 0xD4, 0xF8, 0xCC, 0xE6, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_67[512] = { + 0xD7, 0xEE, 0x95, 0xFC, 0x95, 0xFD, 0x95, 0xFE, /* 0x00-0x03 */ + 0x96, 0x40, 0x96, 0x41, 0x96, 0x42, 0x96, 0x43, /* 0x04-0x07 */ + 0xD4, 0xC2, 0xD3, 0xD0, 0xEB, 0xC3, 0xC5, 0xF3, /* 0x08-0x0B */ + 0x96, 0x44, 0xB7, 0xFE, 0x96, 0x45, 0x96, 0x46, /* 0x0C-0x0F */ + 0xEB, 0xD4, 0x96, 0x47, 0x96, 0x48, 0x96, 0x49, /* 0x10-0x13 */ + 0xCB, 0xB7, 0xEB, 0xDE, 0x96, 0x4A, 0xC0, 0xCA, /* 0x14-0x17 */ + 0x96, 0x4B, 0x96, 0x4C, 0x96, 0x4D, 0xCD, 0xFB, /* 0x18-0x1B */ + 0x96, 0x4E, 0xB3, 0xAF, 0x96, 0x4F, 0xC6, 0xDA, /* 0x1C-0x1F */ + 0x96, 0x50, 0x96, 0x51, 0x96, 0x52, 0x96, 0x53, /* 0x20-0x23 */ + 0x96, 0x54, 0x96, 0x55, 0xEB, 0xFC, 0x96, 0x56, /* 0x24-0x27 */ + 0xC4, 0xBE, 0x96, 0x57, 0xCE, 0xB4, 0xC4, 0xA9, /* 0x28-0x2B */ + 0xB1, 0xBE, 0xD4, 0xFD, 0x96, 0x58, 0xCA, 0xF5, /* 0x2C-0x2F */ + 0x96, 0x59, 0xD6, 0xEC, 0x96, 0x5A, 0x96, 0x5B, /* 0x30-0x33 */ + 0xC6, 0xD3, 0xB6, 0xE4, 0x96, 0x5C, 0x96, 0x5D, /* 0x34-0x37 */ + 0x96, 0x5E, 0x96, 0x5F, 0xBB, 0xFA, 0x96, 0x60, /* 0x38-0x3B */ + 0x96, 0x61, 0xD0, 0xE0, 0x96, 0x62, 0x96, 0x63, /* 0x3C-0x3F */ + 0xC9, 0xB1, 0x96, 0x64, 0xD4, 0xD3, 0xC8, 0xA8, /* 0x40-0x43 */ + 0x96, 0x65, 0x96, 0x66, 0xB8, 0xCB, 0x96, 0x67, /* 0x44-0x47 */ + 0xE8, 0xBE, 0xC9, 0xBC, 0x96, 0x68, 0x96, 0x69, /* 0x48-0x4B */ + 0xE8, 0xBB, 0x96, 0x6A, 0xC0, 0xEE, 0xD0, 0xD3, /* 0x4C-0x4F */ + 0xB2, 0xC4, 0xB4, 0xE5, 0x96, 0x6B, 0xE8, 0xBC, /* 0x50-0x53 */ + 0x96, 0x6C, 0x96, 0x6D, 0xD5, 0xC8, 0x96, 0x6E, /* 0x54-0x57 */ + 0x96, 0x6F, 0x96, 0x70, 0x96, 0x71, 0x96, 0x72, /* 0x58-0x5B */ + 0xB6, 0xC5, 0x96, 0x73, 0xE8, 0xBD, 0xCA, 0xF8, /* 0x5C-0x5F */ + 0xB8, 0xDC, 0xCC, 0xF5, 0x96, 0x74, 0x96, 0x75, /* 0x60-0x63 */ + 0x96, 0x76, 0xC0, 0xB4, 0x96, 0x77, 0x96, 0x78, /* 0x64-0x67 */ + 0xD1, 0xEE, 0xE8, 0xBF, 0xE8, 0xC2, 0x96, 0x79, /* 0x68-0x6B */ + 0x96, 0x7A, 0xBA, 0xBC, 0x96, 0x7B, 0xB1, 0xAD, /* 0x6C-0x6F */ + 0xBD, 0xDC, 0x96, 0x7C, 0xEA, 0xBD, 0xE8, 0xC3, /* 0x70-0x73 */ + 0x96, 0x7D, 0xE8, 0xC6, 0x96, 0x7E, 0xE8, 0xCB, /* 0x74-0x77 */ + 0x96, 0x80, 0x96, 0x81, 0x96, 0x82, 0x96, 0x83, /* 0x78-0x7B */ + 0xE8, 0xCC, 0x96, 0x84, 0xCB, 0xC9, 0xB0, 0xE5, /* 0x7C-0x7F */ + + 0x96, 0x85, 0xBC, 0xAB, 0x96, 0x86, 0x96, 0x87, /* 0x80-0x83 */ + 0xB9, 0xB9, 0x96, 0x88, 0x96, 0x89, 0xE8, 0xC1, /* 0x84-0x87 */ + 0x96, 0x8A, 0xCD, 0xF7, 0x96, 0x8B, 0xE8, 0xCA, /* 0x88-0x8B */ + 0x96, 0x8C, 0x96, 0x8D, 0x96, 0x8E, 0x96, 0x8F, /* 0x8C-0x8F */ + 0xCE, 0xF6, 0x96, 0x90, 0x96, 0x91, 0x96, 0x92, /* 0x90-0x93 */ + 0x96, 0x93, 0xD5, 0xED, 0x96, 0x94, 0xC1, 0xD6, /* 0x94-0x97 */ + 0xE8, 0xC4, 0x96, 0x95, 0xC3, 0xB6, 0x96, 0x96, /* 0x98-0x9B */ + 0xB9, 0xFB, 0xD6, 0xA6, 0xE8, 0xC8, 0x96, 0x97, /* 0x9C-0x9F */ + 0x96, 0x98, 0x96, 0x99, 0xCA, 0xE0, 0xD4, 0xE6, /* 0xA0-0xA3 */ + 0x96, 0x9A, 0xE8, 0xC0, 0x96, 0x9B, 0xE8, 0xC5, /* 0xA4-0xA7 */ + 0xE8, 0xC7, 0x96, 0x9C, 0xC7, 0xB9, 0xB7, 0xE3, /* 0xA8-0xAB */ + 0x96, 0x9D, 0xE8, 0xC9, 0x96, 0x9E, 0xBF, 0xDD, /* 0xAC-0xAF */ + 0xE8, 0xD2, 0x96, 0x9F, 0x96, 0xA0, 0xE8, 0xD7, /* 0xB0-0xB3 */ + 0x96, 0xA1, 0xE8, 0xD5, 0xBC, 0xDC, 0xBC, 0xCF, /* 0xB4-0xB7 */ + 0xE8, 0xDB, 0x96, 0xA2, 0x96, 0xA3, 0x96, 0xA4, /* 0xB8-0xBB */ + 0x96, 0xA5, 0x96, 0xA6, 0x96, 0xA7, 0x96, 0xA8, /* 0xBC-0xBF */ + 0x96, 0xA9, 0xE8, 0xDE, 0x96, 0xAA, 0xE8, 0xDA, /* 0xC0-0xC3 */ + 0xB1, 0xFA, 0x96, 0xAB, 0x96, 0xAC, 0x96, 0xAD, /* 0xC4-0xC7 */ + 0x96, 0xAE, 0x96, 0xAF, 0x96, 0xB0, 0x96, 0xB1, /* 0xC8-0xCB */ + 0x96, 0xB2, 0x96, 0xB3, 0x96, 0xB4, 0xB0, 0xD8, /* 0xCC-0xCF */ + 0xC4, 0xB3, 0xB8, 0xCC, 0xC6, 0xE2, 0xC8, 0xBE, /* 0xD0-0xD3 */ + 0xC8, 0xE1, 0x96, 0xB5, 0x96, 0xB6, 0x96, 0xB7, /* 0xD4-0xD7 */ + 0xE8, 0xCF, 0xE8, 0xD4, 0xE8, 0xD6, 0x96, 0xB8, /* 0xD8-0xDB */ + 0xB9, 0xF1, 0xE8, 0xD8, 0xD7, 0xF5, 0x96, 0xB9, /* 0xDC-0xDF */ + 0xC4, 0xFB, 0x96, 0xBA, 0xE8, 0xDC, 0x96, 0xBB, /* 0xE0-0xE3 */ + 0x96, 0xBC, 0xB2, 0xE9, 0x96, 0xBD, 0x96, 0xBE, /* 0xE4-0xE7 */ + 0x96, 0xBF, 0xE8, 0xD1, 0x96, 0xC0, 0x96, 0xC1, /* 0xE8-0xEB */ + 0xBC, 0xED, 0x96, 0xC2, 0x96, 0xC3, 0xBF, 0xC2, /* 0xEC-0xEF */ + 0xE8, 0xCD, 0xD6, 0xF9, 0x96, 0xC4, 0xC1, 0xF8, /* 0xF0-0xF3 */ + 0xB2, 0xF1, 0x96, 0xC5, 0x96, 0xC6, 0x96, 0xC7, /* 0xF4-0xF7 */ + 0x96, 0xC8, 0x96, 0xC9, 0x96, 0xCA, 0x96, 0xCB, /* 0xF8-0xFB */ + 0x96, 0xCC, 0xE8, 0xDF, 0x96, 0xCD, 0xCA, 0xC1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_68[512] = { + 0xE8, 0xD9, 0x96, 0xCE, 0x96, 0xCF, 0x96, 0xD0, /* 0x00-0x03 */ + 0x96, 0xD1, 0xD5, 0xA4, 0x96, 0xD2, 0xB1, 0xEA, /* 0x04-0x07 */ + 0xD5, 0xBB, 0xE8, 0xCE, 0xE8, 0xD0, 0xB6, 0xB0, /* 0x08-0x0B */ + 0xE8, 0xD3, 0x96, 0xD3, 0xE8, 0xDD, 0xC0, 0xB8, /* 0x0C-0x0F */ + 0x96, 0xD4, 0xCA, 0xF7, 0x96, 0xD5, 0xCB, 0xA8, /* 0x10-0x13 */ + 0x96, 0xD6, 0x96, 0xD7, 0xC6, 0xDC, 0xC0, 0xF5, /* 0x14-0x17 */ + 0x96, 0xD8, 0x96, 0xD9, 0x96, 0xDA, 0x96, 0xDB, /* 0x18-0x1B */ + 0x96, 0xDC, 0xE8, 0xE9, 0x96, 0xDD, 0x96, 0xDE, /* 0x1C-0x1F */ + 0x96, 0xDF, 0xD0, 0xA3, 0x96, 0xE0, 0x96, 0xE1, /* 0x20-0x23 */ + 0x96, 0xE2, 0x96, 0xE3, 0x96, 0xE4, 0x96, 0xE5, /* 0x24-0x27 */ + 0x96, 0xE6, 0xE8, 0xF2, 0xD6, 0xEA, 0x96, 0xE7, /* 0x28-0x2B */ + 0x96, 0xE8, 0x96, 0xE9, 0x96, 0xEA, 0x96, 0xEB, /* 0x2C-0x2F */ + 0x96, 0xEC, 0x96, 0xED, 0xE8, 0xE0, 0xE8, 0xE1, /* 0x30-0x33 */ + 0x96, 0xEE, 0x96, 0xEF, 0x96, 0xF0, 0xD1, 0xF9, /* 0x34-0x37 */ + 0xBA, 0xCB, 0xB8, 0xF9, 0x96, 0xF1, 0x96, 0xF2, /* 0x38-0x3B */ + 0xB8, 0xF1, 0xD4, 0xD4, 0xE8, 0xEF, 0x96, 0xF3, /* 0x3C-0x3F */ + 0xE8, 0xEE, 0xE8, 0xEC, 0xB9, 0xF0, 0xCC, 0xD2, /* 0x40-0x43 */ + 0xE8, 0xE6, 0xCE, 0xA6, 0xBF, 0xF2, 0x96, 0xF4, /* 0x44-0x47 */ + 0xB0, 0xB8, 0xE8, 0xF1, 0xE8, 0xF0, 0x96, 0xF5, /* 0x48-0x4B */ + 0xD7, 0xC0, 0x96, 0xF6, 0xE8, 0xE4, 0x96, 0xF7, /* 0x4C-0x4F */ + 0xCD, 0xA9, 0xC9, 0xA3, 0x96, 0xF8, 0xBB, 0xB8, /* 0x50-0x53 */ + 0xBD, 0xDB, 0xE8, 0xEA, 0x96, 0xF9, 0x96, 0xFA, /* 0x54-0x57 */ + 0x96, 0xFB, 0x96, 0xFC, 0x96, 0xFD, 0x96, 0xFE, /* 0x58-0x5B */ + 0x97, 0x40, 0x97, 0x41, 0x97, 0x42, 0x97, 0x43, /* 0x5C-0x5F */ + 0xE8, 0xE2, 0xE8, 0xE3, 0xE8, 0xE5, 0xB5, 0xB5, /* 0x60-0x63 */ + 0xE8, 0xE7, 0xC7, 0xC5, 0xE8, 0xEB, 0xE8, 0xED, /* 0x64-0x67 */ + 0xBD, 0xB0, 0xD7, 0xAE, 0x97, 0x44, 0xE8, 0xF8, /* 0x68-0x6B */ + 0x97, 0x45, 0x97, 0x46, 0x97, 0x47, 0x97, 0x48, /* 0x6C-0x6F */ + 0x97, 0x49, 0x97, 0x4A, 0x97, 0x4B, 0x97, 0x4C, /* 0x70-0x73 */ + 0xE8, 0xF5, 0x97, 0x4D, 0xCD, 0xB0, 0xE8, 0xF6, /* 0x74-0x77 */ + 0x97, 0x4E, 0x97, 0x4F, 0x97, 0x50, 0x97, 0x51, /* 0x78-0x7B */ + 0x97, 0x52, 0x97, 0x53, 0x97, 0x54, 0x97, 0x55, /* 0x7C-0x7F */ + + 0x97, 0x56, 0xC1, 0xBA, 0x97, 0x57, 0xE8, 0xE8, /* 0x80-0x83 */ + 0x97, 0x58, 0xC3, 0xB7, 0xB0, 0xF0, 0x97, 0x59, /* 0x84-0x87 */ + 0x97, 0x5A, 0x97, 0x5B, 0x97, 0x5C, 0x97, 0x5D, /* 0x88-0x8B */ + 0x97, 0x5E, 0x97, 0x5F, 0x97, 0x60, 0xE8, 0xF4, /* 0x8C-0x8F */ + 0x97, 0x61, 0x97, 0x62, 0x97, 0x63, 0xE8, 0xF7, /* 0x90-0x93 */ + 0x97, 0x64, 0x97, 0x65, 0x97, 0x66, 0xB9, 0xA3, /* 0x94-0x97 */ + 0x97, 0x67, 0x97, 0x68, 0x97, 0x69, 0x97, 0x6A, /* 0x98-0x9B */ + 0x97, 0x6B, 0x97, 0x6C, 0x97, 0x6D, 0x97, 0x6E, /* 0x9C-0x9F */ + 0x97, 0x6F, 0x97, 0x70, 0xC9, 0xD2, 0x97, 0x71, /* 0xA0-0xA3 */ + 0x97, 0x72, 0x97, 0x73, 0xC3, 0xCE, 0xCE, 0xE0, /* 0xA4-0xA7 */ + 0xC0, 0xE6, 0x97, 0x74, 0x97, 0x75, 0x97, 0x76, /* 0xA8-0xAB */ + 0x97, 0x77, 0xCB, 0xF3, 0x97, 0x78, 0xCC, 0xDD, /* 0xAC-0xAF */ + 0xD0, 0xB5, 0x97, 0x79, 0x97, 0x7A, 0xCA, 0xE1, /* 0xB0-0xB3 */ + 0x97, 0x7B, 0xE8, 0xF3, 0x97, 0x7C, 0x97, 0x7D, /* 0xB4-0xB7 */ + 0x97, 0x7E, 0x97, 0x80, 0x97, 0x81, 0x97, 0x82, /* 0xB8-0xBB */ + 0x97, 0x83, 0x97, 0x84, 0x97, 0x85, 0x97, 0x86, /* 0xBC-0xBF */ + 0xBC, 0xEC, 0x97, 0x87, 0xE8, 0xF9, 0x97, 0x88, /* 0xC0-0xC3 */ + 0x97, 0x89, 0x97, 0x8A, 0x97, 0x8B, 0x97, 0x8C, /* 0xC4-0xC7 */ + 0x97, 0x8D, 0xC3, 0xDE, 0x97, 0x8E, 0xC6, 0xE5, /* 0xC8-0xCB */ + 0x97, 0x8F, 0xB9, 0xF7, 0x97, 0x90, 0x97, 0x91, /* 0xCC-0xCF */ + 0x97, 0x92, 0x97, 0x93, 0xB0, 0xF4, 0x97, 0x94, /* 0xD0-0xD3 */ + 0x97, 0x95, 0xD7, 0xD8, 0x97, 0x96, 0x97, 0x97, /* 0xD4-0xD7 */ + 0xBC, 0xAC, 0x97, 0x98, 0xC5, 0xEF, 0x97, 0x99, /* 0xD8-0xDB */ + 0x97, 0x9A, 0x97, 0x9B, 0x97, 0x9C, 0x97, 0x9D, /* 0xDC-0xDF */ + 0xCC, 0xC4, 0x97, 0x9E, 0x97, 0x9F, 0xE9, 0xA6, /* 0xE0-0xE3 */ + 0x97, 0xA0, 0x97, 0xA1, 0x97, 0xA2, 0x97, 0xA3, /* 0xE4-0xE7 */ + 0x97, 0xA4, 0x97, 0xA5, 0x97, 0xA6, 0x97, 0xA7, /* 0xE8-0xEB */ + 0x97, 0xA8, 0x97, 0xA9, 0xC9, 0xAD, 0x97, 0xAA, /* 0xEC-0xEF */ + 0xE9, 0xA2, 0xC0, 0xE2, 0x97, 0xAB, 0x97, 0xAC, /* 0xF0-0xF3 */ + 0x97, 0xAD, 0xBF, 0xC3, 0x97, 0xAE, 0x97, 0xAF, /* 0xF4-0xF7 */ + 0x97, 0xB0, 0xE8, 0xFE, 0xB9, 0xD7, 0x97, 0xB1, /* 0xF8-0xFB */ + 0xE8, 0xFB, 0x97, 0xB2, 0x97, 0xB3, 0x97, 0xB4, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_69[512] = { + 0x97, 0xB5, 0xE9, 0xA4, 0x97, 0xB6, 0x97, 0xB7, /* 0x00-0x03 */ + 0x97, 0xB8, 0xD2, 0xCE, 0x97, 0xB9, 0x97, 0xBA, /* 0x04-0x07 */ + 0x97, 0xBB, 0x97, 0xBC, 0x97, 0xBD, 0xE9, 0xA3, /* 0x08-0x0B */ + 0x97, 0xBE, 0xD6, 0xB2, 0xD7, 0xB5, 0x97, 0xBF, /* 0x0C-0x0F */ + 0xE9, 0xA7, 0x97, 0xC0, 0xBD, 0xB7, 0x97, 0xC1, /* 0x10-0x13 */ + 0x97, 0xC2, 0x97, 0xC3, 0x97, 0xC4, 0x97, 0xC5, /* 0x14-0x17 */ + 0x97, 0xC6, 0x97, 0xC7, 0x97, 0xC8, 0x97, 0xC9, /* 0x18-0x1B */ + 0x97, 0xCA, 0x97, 0xCB, 0x97, 0xCC, 0xE8, 0xFC, /* 0x1C-0x1F */ + 0xE8, 0xFD, 0x97, 0xCD, 0x97, 0xCE, 0x97, 0xCF, /* 0x20-0x23 */ + 0xE9, 0xA1, 0x97, 0xD0, 0x97, 0xD1, 0x97, 0xD2, /* 0x24-0x27 */ + 0x97, 0xD3, 0x97, 0xD4, 0x97, 0xD5, 0x97, 0xD6, /* 0x28-0x2B */ + 0x97, 0xD7, 0xCD, 0xD6, 0x97, 0xD8, 0x97, 0xD9, /* 0x2C-0x2F */ + 0xD2, 0xAC, 0x97, 0xDA, 0x97, 0xDB, 0x97, 0xDC, /* 0x30-0x33 */ + 0xE9, 0xB2, 0x97, 0xDD, 0x97, 0xDE, 0x97, 0xDF, /* 0x34-0x37 */ + 0x97, 0xE0, 0xE9, 0xA9, 0x97, 0xE1, 0x97, 0xE2, /* 0x38-0x3B */ + 0x97, 0xE3, 0xB4, 0xAA, 0x97, 0xE4, 0xB4, 0xBB, /* 0x3C-0x3F */ + 0x97, 0xE5, 0x97, 0xE6, 0xE9, 0xAB, 0x97, 0xE7, /* 0x40-0x43 */ + 0x97, 0xE8, 0x97, 0xE9, 0x97, 0xEA, 0x97, 0xEB, /* 0x44-0x47 */ + 0x97, 0xEC, 0x97, 0xED, 0x97, 0xEE, 0x97, 0xEF, /* 0x48-0x4B */ + 0x97, 0xF0, 0x97, 0xF1, 0x97, 0xF2, 0x97, 0xF3, /* 0x4C-0x4F */ + 0x97, 0xF4, 0x97, 0xF5, 0x97, 0xF6, 0x97, 0xF7, /* 0x50-0x53 */ + 0xD0, 0xA8, 0x97, 0xF8, 0x97, 0xF9, 0xE9, 0xA5, /* 0x54-0x57 */ + 0x97, 0xFA, 0x97, 0xFB, 0xB3, 0xFE, 0x97, 0xFC, /* 0x58-0x5B */ + 0x97, 0xFD, 0xE9, 0xAC, 0xC0, 0xE3, 0x97, 0xFE, /* 0x5C-0x5F */ + 0xE9, 0xAA, 0x98, 0x40, 0x98, 0x41, 0xE9, 0xB9, /* 0x60-0x63 */ + 0x98, 0x42, 0x98, 0x43, 0xE9, 0xB8, 0x98, 0x44, /* 0x64-0x67 */ + 0x98, 0x45, 0x98, 0x46, 0x98, 0x47, 0xE9, 0xAE, /* 0x68-0x6B */ + 0x98, 0x48, 0x98, 0x49, 0xE8, 0xFA, 0x98, 0x4A, /* 0x6C-0x6F */ + 0x98, 0x4B, 0xE9, 0xA8, 0x98, 0x4C, 0x98, 0x4D, /* 0x70-0x73 */ + 0x98, 0x4E, 0x98, 0x4F, 0x98, 0x50, 0xBF, 0xAC, /* 0x74-0x77 */ + 0xE9, 0xB1, 0xE9, 0xBA, 0x98, 0x51, 0x98, 0x52, /* 0x78-0x7B */ + 0xC2, 0xA5, 0x98, 0x53, 0x98, 0x54, 0x98, 0x55, /* 0x7C-0x7F */ + + 0xE9, 0xAF, 0x98, 0x56, 0xB8, 0xC5, 0x98, 0x57, /* 0x80-0x83 */ + 0xE9, 0xAD, 0x98, 0x58, 0xD3, 0xDC, 0xE9, 0xB4, /* 0x84-0x87 */ + 0xE9, 0xB5, 0xE9, 0xB7, 0x98, 0x59, 0x98, 0x5A, /* 0x88-0x8B */ + 0x98, 0x5B, 0xE9, 0xC7, 0x98, 0x5C, 0x98, 0x5D, /* 0x8C-0x8F */ + 0x98, 0x5E, 0x98, 0x5F, 0x98, 0x60, 0x98, 0x61, /* 0x90-0x93 */ + 0xC0, 0xC6, 0xE9, 0xC5, 0x98, 0x62, 0x98, 0x63, /* 0x94-0x97 */ + 0xE9, 0xB0, 0x98, 0x64, 0x98, 0x65, 0xE9, 0xBB, /* 0x98-0x9B */ + 0xB0, 0xF1, 0x98, 0x66, 0x98, 0x67, 0x98, 0x68, /* 0x9C-0x9F */ + 0x98, 0x69, 0x98, 0x6A, 0x98, 0x6B, 0x98, 0x6C, /* 0xA0-0xA3 */ + 0x98, 0x6D, 0x98, 0x6E, 0x98, 0x6F, 0xE9, 0xBC, /* 0xA4-0xA7 */ + 0xD5, 0xA5, 0x98, 0x70, 0x98, 0x71, 0xE9, 0xBE, /* 0xA8-0xAB */ + 0x98, 0x72, 0xE9, 0xBF, 0x98, 0x73, 0x98, 0x74, /* 0xAC-0xAF */ + 0x98, 0x75, 0xE9, 0xC1, 0x98, 0x76, 0x98, 0x77, /* 0xB0-0xB3 */ + 0xC1, 0xF1, 0x98, 0x78, 0x98, 0x79, 0xC8, 0xB6, /* 0xB4-0xB7 */ + 0x98, 0x7A, 0x98, 0x7B, 0x98, 0x7C, 0xE9, 0xBD, /* 0xB8-0xBB */ + 0x98, 0x7D, 0x98, 0x7E, 0x98, 0x80, 0x98, 0x81, /* 0xBC-0xBF */ + 0x98, 0x82, 0xE9, 0xC2, 0x98, 0x83, 0x98, 0x84, /* 0xC0-0xC3 */ + 0x98, 0x85, 0x98, 0x86, 0x98, 0x87, 0x98, 0x88, /* 0xC4-0xC7 */ + 0x98, 0x89, 0x98, 0x8A, 0xE9, 0xC3, 0x98, 0x8B, /* 0xC8-0xCB */ + 0xE9, 0xB3, 0x98, 0x8C, 0xE9, 0xB6, 0x98, 0x8D, /* 0xCC-0xCF */ + 0xBB, 0xB1, 0x98, 0x8E, 0x98, 0x8F, 0x98, 0x90, /* 0xD0-0xD3 */ + 0xE9, 0xC0, 0x98, 0x91, 0x98, 0x92, 0x98, 0x93, /* 0xD4-0xD7 */ + 0x98, 0x94, 0x98, 0x95, 0x98, 0x96, 0xBC, 0xF7, /* 0xD8-0xDB */ + 0x98, 0x97, 0x98, 0x98, 0x98, 0x99, 0xE9, 0xC4, /* 0xDC-0xDF */ + 0xE9, 0xC6, 0x98, 0x9A, 0x98, 0x9B, 0x98, 0x9C, /* 0xE0-0xE3 */ + 0x98, 0x9D, 0x98, 0x9E, 0x98, 0x9F, 0x98, 0xA0, /* 0xE4-0xE7 */ + 0x98, 0xA1, 0x98, 0xA2, 0x98, 0xA3, 0x98, 0xA4, /* 0xE8-0xEB */ + 0x98, 0xA5, 0xE9, 0xCA, 0x98, 0xA6, 0x98, 0xA7, /* 0xEC-0xEF */ + 0x98, 0xA8, 0x98, 0xA9, 0xE9, 0xCE, 0x98, 0xAA, /* 0xF0-0xF3 */ + 0x98, 0xAB, 0x98, 0xAC, 0x98, 0xAD, 0x98, 0xAE, /* 0xF4-0xF7 */ + 0x98, 0xAF, 0x98, 0xB0, 0x98, 0xB1, 0x98, 0xB2, /* 0xF8-0xFB */ + 0x98, 0xB3, 0xB2, 0xDB, 0x98, 0xB4, 0xE9, 0xC8, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6A[512] = { + 0x98, 0xB5, 0x98, 0xB6, 0x98, 0xB7, 0x98, 0xB8, /* 0x00-0x03 */ + 0x98, 0xB9, 0x98, 0xBA, 0x98, 0xBB, 0x98, 0xBC, /* 0x04-0x07 */ + 0x98, 0xBD, 0x98, 0xBE, 0xB7, 0xAE, 0x98, 0xBF, /* 0x08-0x0B */ + 0x98, 0xC0, 0x98, 0xC1, 0x98, 0xC2, 0x98, 0xC3, /* 0x0C-0x0F */ + 0x98, 0xC4, 0x98, 0xC5, 0x98, 0xC6, 0x98, 0xC7, /* 0x10-0x13 */ + 0x98, 0xC8, 0x98, 0xC9, 0x98, 0xCA, 0xE9, 0xCB, /* 0x14-0x17 */ + 0xE9, 0xCC, 0x98, 0xCB, 0x98, 0xCC, 0x98, 0xCD, /* 0x18-0x1B */ + 0x98, 0xCE, 0x98, 0xCF, 0x98, 0xD0, 0xD5, 0xC1, /* 0x1C-0x1F */ + 0x98, 0xD1, 0xC4, 0xA3, 0x98, 0xD2, 0x98, 0xD3, /* 0x20-0x23 */ + 0x98, 0xD4, 0x98, 0xD5, 0x98, 0xD6, 0x98, 0xD7, /* 0x24-0x27 */ + 0xE9, 0xD8, 0x98, 0xD8, 0xBA, 0xE1, 0x98, 0xD9, /* 0x28-0x2B */ + 0x98, 0xDA, 0x98, 0xDB, 0x98, 0xDC, 0xE9, 0xC9, /* 0x2C-0x2F */ + 0x98, 0xDD, 0xD3, 0xA3, 0x98, 0xDE, 0x98, 0xDF, /* 0x30-0x33 */ + 0x98, 0xE0, 0xE9, 0xD4, 0x98, 0xE1, 0x98, 0xE2, /* 0x34-0x37 */ + 0x98, 0xE3, 0x98, 0xE4, 0x98, 0xE5, 0x98, 0xE6, /* 0x38-0x3B */ + 0x98, 0xE7, 0xE9, 0xD7, 0xE9, 0xD0, 0x98, 0xE8, /* 0x3C-0x3F */ + 0x98, 0xE9, 0x98, 0xEA, 0x98, 0xEB, 0x98, 0xEC, /* 0x40-0x43 */ + 0xE9, 0xCF, 0x98, 0xED, 0x98, 0xEE, 0xC7, 0xC1, /* 0x44-0x47 */ + 0x98, 0xEF, 0x98, 0xF0, 0x98, 0xF1, 0x98, 0xF2, /* 0x48-0x4B */ + 0x98, 0xF3, 0x98, 0xF4, 0x98, 0xF5, 0x98, 0xF6, /* 0x4C-0x4F */ + 0xE9, 0xD2, 0x98, 0xF7, 0x98, 0xF8, 0x98, 0xF9, /* 0x50-0x53 */ + 0x98, 0xFA, 0x98, 0xFB, 0x98, 0xFC, 0x98, 0xFD, /* 0x54-0x57 */ + 0xE9, 0xD9, 0xB3, 0xC8, 0x98, 0xFE, 0xE9, 0xD3, /* 0x58-0x5B */ + 0x99, 0x40, 0x99, 0x41, 0x99, 0x42, 0x99, 0x43, /* 0x5C-0x5F */ + 0x99, 0x44, 0xCF, 0xF0, 0x99, 0x45, 0x99, 0x46, /* 0x60-0x63 */ + 0x99, 0x47, 0xE9, 0xCD, 0x99, 0x48, 0x99, 0x49, /* 0x64-0x67 */ + 0x99, 0x4A, 0x99, 0x4B, 0x99, 0x4C, 0x99, 0x4D, /* 0x68-0x6B */ + 0x99, 0x4E, 0x99, 0x4F, 0x99, 0x50, 0x99, 0x51, /* 0x6C-0x6F */ + 0x99, 0x52, 0xB3, 0xF7, 0x99, 0x53, 0x99, 0x54, /* 0x70-0x73 */ + 0x99, 0x55, 0x99, 0x56, 0x99, 0x57, 0x99, 0x58, /* 0x74-0x77 */ + 0x99, 0x59, 0xE9, 0xD6, 0x99, 0x5A, 0x99, 0x5B, /* 0x78-0x7B */ + 0xE9, 0xDA, 0x99, 0x5C, 0x99, 0x5D, 0x99, 0x5E, /* 0x7C-0x7F */ + + 0xCC, 0xB4, 0x99, 0x5F, 0x99, 0x60, 0x99, 0x61, /* 0x80-0x83 */ + 0xCF, 0xAD, 0x99, 0x62, 0x99, 0x63, 0x99, 0x64, /* 0x84-0x87 */ + 0x99, 0x65, 0x99, 0x66, 0x99, 0x67, 0x99, 0x68, /* 0x88-0x8B */ + 0x99, 0x69, 0x99, 0x6A, 0xE9, 0xD5, 0x99, 0x6B, /* 0x8C-0x8F */ + 0xE9, 0xDC, 0xE9, 0xDB, 0x99, 0x6C, 0x99, 0x6D, /* 0x90-0x93 */ + 0x99, 0x6E, 0x99, 0x6F, 0x99, 0x70, 0xE9, 0xDE, /* 0x94-0x97 */ + 0x99, 0x71, 0x99, 0x72, 0x99, 0x73, 0x99, 0x74, /* 0x98-0x9B */ + 0x99, 0x75, 0x99, 0x76, 0x99, 0x77, 0x99, 0x78, /* 0x9C-0x9F */ + 0xE9, 0xD1, 0x99, 0x79, 0x99, 0x7A, 0x99, 0x7B, /* 0xA0-0xA3 */ + 0x99, 0x7C, 0x99, 0x7D, 0x99, 0x7E, 0x99, 0x80, /* 0xA4-0xA7 */ + 0x99, 0x81, 0xE9, 0xDD, 0x99, 0x82, 0xE9, 0xDF, /* 0xA8-0xAB */ + 0xC3, 0xCA, 0x99, 0x83, 0x99, 0x84, 0x99, 0x85, /* 0xAC-0xAF */ + 0x99, 0x86, 0x99, 0x87, 0x99, 0x88, 0x99, 0x89, /* 0xB0-0xB3 */ + 0x99, 0x8A, 0x99, 0x8B, 0x99, 0x8C, 0x99, 0x8D, /* 0xB4-0xB7 */ + 0x99, 0x8E, 0x99, 0x8F, 0x99, 0x90, 0x99, 0x91, /* 0xB8-0xBB */ + 0x99, 0x92, 0x99, 0x93, 0x99, 0x94, 0x99, 0x95, /* 0xBC-0xBF */ + 0x99, 0x96, 0x99, 0x97, 0x99, 0x98, 0x99, 0x99, /* 0xC0-0xC3 */ + 0x99, 0x9A, 0x99, 0x9B, 0x99, 0x9C, 0x99, 0x9D, /* 0xC4-0xC7 */ + 0x99, 0x9E, 0x99, 0x9F, 0x99, 0xA0, 0x99, 0xA1, /* 0xC8-0xCB */ + 0x99, 0xA2, 0x99, 0xA3, 0x99, 0xA4, 0x99, 0xA5, /* 0xCC-0xCF */ + 0x99, 0xA6, 0x99, 0xA7, 0x99, 0xA8, 0x99, 0xA9, /* 0xD0-0xD3 */ + 0x99, 0xAA, 0x99, 0xAB, 0x99, 0xAC, 0x99, 0xAD, /* 0xD4-0xD7 */ + 0x99, 0xAE, 0x99, 0xAF, 0x99, 0xB0, 0x99, 0xB1, /* 0xD8-0xDB */ + 0x99, 0xB2, 0x99, 0xB3, 0x99, 0xB4, 0x99, 0xB5, /* 0xDC-0xDF */ + 0x99, 0xB6, 0x99, 0xB7, 0x99, 0xB8, 0x99, 0xB9, /* 0xE0-0xE3 */ + 0x99, 0xBA, 0x99, 0xBB, 0x99, 0xBC, 0x99, 0xBD, /* 0xE4-0xE7 */ + 0x99, 0xBE, 0x99, 0xBF, 0x99, 0xC0, 0x99, 0xC1, /* 0xE8-0xEB */ + 0x99, 0xC2, 0x99, 0xC3, 0x99, 0xC4, 0x99, 0xC5, /* 0xEC-0xEF */ + 0x99, 0xC6, 0x99, 0xC7, 0x99, 0xC8, 0x99, 0xC9, /* 0xF0-0xF3 */ + 0x99, 0xCA, 0x99, 0xCB, 0x99, 0xCC, 0x99, 0xCD, /* 0xF4-0xF7 */ + 0x99, 0xCE, 0x99, 0xCF, 0x99, 0xD0, 0x99, 0xD1, /* 0xF8-0xFB */ + 0x99, 0xD2, 0x99, 0xD3, 0x99, 0xD4, 0x99, 0xD5, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6B[512] = { + 0x99, 0xD6, 0x99, 0xD7, 0x99, 0xD8, 0x99, 0xD9, /* 0x00-0x03 */ + 0x99, 0xDA, 0x99, 0xDB, 0x99, 0xDC, 0x99, 0xDD, /* 0x04-0x07 */ + 0x99, 0xDE, 0x99, 0xDF, 0x99, 0xE0, 0x99, 0xE1, /* 0x08-0x0B */ + 0x99, 0xE2, 0x99, 0xE3, 0x99, 0xE4, 0x99, 0xE5, /* 0x0C-0x0F */ + 0x99, 0xE6, 0x99, 0xE7, 0x99, 0xE8, 0x99, 0xE9, /* 0x10-0x13 */ + 0x99, 0xEA, 0x99, 0xEB, 0x99, 0xEC, 0x99, 0xED, /* 0x14-0x17 */ + 0x99, 0xEE, 0x99, 0xEF, 0x99, 0xF0, 0x99, 0xF1, /* 0x18-0x1B */ + 0x99, 0xF2, 0x99, 0xF3, 0x99, 0xF4, 0x99, 0xF5, /* 0x1C-0x1F */ + 0xC7, 0xB7, 0xB4, 0xCE, 0xBB, 0xB6, 0xD0, 0xC0, /* 0x20-0x23 */ + 0xEC, 0xA3, 0x99, 0xF6, 0x99, 0xF7, 0xC5, 0xB7, /* 0x24-0x27 */ + 0x99, 0xF8, 0x99, 0xF9, 0x99, 0xFA, 0x99, 0xFB, /* 0x28-0x2B */ + 0x99, 0xFC, 0x99, 0xFD, 0x99, 0xFE, 0x9A, 0x40, /* 0x2C-0x2F */ + 0x9A, 0x41, 0x9A, 0x42, 0xD3, 0xFB, 0x9A, 0x43, /* 0x30-0x33 */ + 0x9A, 0x44, 0x9A, 0x45, 0x9A, 0x46, 0xEC, 0xA4, /* 0x34-0x37 */ + 0x9A, 0x47, 0xEC, 0xA5, 0xC6, 0xDB, 0x9A, 0x48, /* 0x38-0x3B */ + 0x9A, 0x49, 0x9A, 0x4A, 0xBF, 0xEE, 0x9A, 0x4B, /* 0x3C-0x3F */ + 0x9A, 0x4C, 0x9A, 0x4D, 0x9A, 0x4E, 0xEC, 0xA6, /* 0x40-0x43 */ + 0x9A, 0x4F, 0x9A, 0x50, 0xEC, 0xA7, 0xD0, 0xAA, /* 0x44-0x47 */ + 0x9A, 0x51, 0xC7, 0xB8, 0x9A, 0x52, 0x9A, 0x53, /* 0x48-0x4B */ + 0xB8, 0xE8, 0x9A, 0x54, 0x9A, 0x55, 0x9A, 0x56, /* 0x4C-0x4F */ + 0x9A, 0x57, 0x9A, 0x58, 0x9A, 0x59, 0x9A, 0x5A, /* 0x50-0x53 */ + 0x9A, 0x5B, 0x9A, 0x5C, 0x9A, 0x5D, 0x9A, 0x5E, /* 0x54-0x57 */ + 0x9A, 0x5F, 0xEC, 0xA8, 0x9A, 0x60, 0x9A, 0x61, /* 0x58-0x5B */ + 0x9A, 0x62, 0x9A, 0x63, 0x9A, 0x64, 0x9A, 0x65, /* 0x5C-0x5F */ + 0x9A, 0x66, 0x9A, 0x67, 0xD6, 0xB9, 0xD5, 0xFD, /* 0x60-0x63 */ + 0xB4, 0xCB, 0xB2, 0xBD, 0xCE, 0xE4, 0xC6, 0xE7, /* 0x64-0x67 */ + 0x9A, 0x68, 0x9A, 0x69, 0xCD, 0xE1, 0x9A, 0x6A, /* 0x68-0x6B */ + 0x9A, 0x6B, 0x9A, 0x6C, 0x9A, 0x6D, 0x9A, 0x6E, /* 0x6C-0x6F */ + 0x9A, 0x6F, 0x9A, 0x70, 0x9A, 0x71, 0x9A, 0x72, /* 0x70-0x73 */ + 0x9A, 0x73, 0x9A, 0x74, 0x9A, 0x75, 0x9A, 0x76, /* 0x74-0x77 */ + 0x9A, 0x77, 0xB4, 0xF5, 0x9A, 0x78, 0xCB, 0xC0, /* 0x78-0x7B */ + 0xBC, 0xDF, 0x9A, 0x79, 0x9A, 0x7A, 0x9A, 0x7B, /* 0x7C-0x7F */ + + 0x9A, 0x7C, 0xE9, 0xE2, 0xE9, 0xE3, 0xD1, 0xEA, /* 0x80-0x83 */ + 0xE9, 0xE5, 0x9A, 0x7D, 0xB4, 0xF9, 0xE9, 0xE4, /* 0x84-0x87 */ + 0x9A, 0x7E, 0xD1, 0xB3, 0xCA, 0xE2, 0xB2, 0xD0, /* 0x88-0x8B */ + 0x9A, 0x80, 0xE9, 0xE8, 0x9A, 0x81, 0x9A, 0x82, /* 0x8C-0x8F */ + 0x9A, 0x83, 0x9A, 0x84, 0xE9, 0xE6, 0xE9, 0xE7, /* 0x90-0x93 */ + 0x9A, 0x85, 0x9A, 0x86, 0xD6, 0xB3, 0x9A, 0x87, /* 0x94-0x97 */ + 0x9A, 0x88, 0x9A, 0x89, 0xE9, 0xE9, 0xE9, 0xEA, /* 0x98-0x9B */ + 0x9A, 0x8A, 0x9A, 0x8B, 0x9A, 0x8C, 0x9A, 0x8D, /* 0x9C-0x9F */ + 0x9A, 0x8E, 0xE9, 0xEB, 0x9A, 0x8F, 0x9A, 0x90, /* 0xA0-0xA3 */ + 0x9A, 0x91, 0x9A, 0x92, 0x9A, 0x93, 0x9A, 0x94, /* 0xA4-0xA7 */ + 0x9A, 0x95, 0x9A, 0x96, 0xE9, 0xEC, 0x9A, 0x97, /* 0xA8-0xAB */ + 0x9A, 0x98, 0x9A, 0x99, 0x9A, 0x9A, 0x9A, 0x9B, /* 0xAC-0xAF */ + 0x9A, 0x9C, 0x9A, 0x9D, 0x9A, 0x9E, 0xEC, 0xAF, /* 0xB0-0xB3 */ + 0xC5, 0xB9, 0xB6, 0xCE, 0x9A, 0x9F, 0xD2, 0xF3, /* 0xB4-0xB7 */ + 0x9A, 0xA0, 0x9A, 0xA1, 0x9A, 0xA2, 0x9A, 0xA3, /* 0xB8-0xBB */ + 0x9A, 0xA4, 0x9A, 0xA5, 0x9A, 0xA6, 0xB5, 0xEE, /* 0xBC-0xBF */ + 0x9A, 0xA7, 0xBB, 0xD9, 0xEC, 0xB1, 0x9A, 0xA8, /* 0xC0-0xC3 */ + 0x9A, 0xA9, 0xD2, 0xE3, 0x9A, 0xAA, 0x9A, 0xAB, /* 0xC4-0xC7 */ + 0x9A, 0xAC, 0x9A, 0xAD, 0x9A, 0xAE, 0xCE, 0xE3, /* 0xC8-0xCB */ + 0x9A, 0xAF, 0xC4, 0xB8, 0x9A, 0xB0, 0xC3, 0xBF, /* 0xCC-0xCF */ + 0x9A, 0xB1, 0x9A, 0xB2, 0xB6, 0xBE, 0xD8, 0xB9, /* 0xD0-0xD3 */ + 0xB1, 0xC8, 0xB1, 0xCF, 0xB1, 0xD1, 0xC5, 0xFE, /* 0xD4-0xD7 */ + 0x9A, 0xB3, 0xB1, 0xD0, 0x9A, 0xB4, 0xC3, 0xAB, /* 0xD8-0xDB */ + 0x9A, 0xB5, 0x9A, 0xB6, 0x9A, 0xB7, 0x9A, 0xB8, /* 0xDC-0xDF */ + 0x9A, 0xB9, 0xD5, 0xB1, 0x9A, 0xBA, 0x9A, 0xBB, /* 0xE0-0xE3 */ + 0x9A, 0xBC, 0x9A, 0xBD, 0x9A, 0xBE, 0x9A, 0xBF, /* 0xE4-0xE7 */ + 0x9A, 0xC0, 0x9A, 0xC1, 0xEB, 0xA4, 0xBA, 0xC1, /* 0xE8-0xEB */ + 0x9A, 0xC2, 0x9A, 0xC3, 0x9A, 0xC4, 0xCC, 0xBA, /* 0xEC-0xEF */ + 0x9A, 0xC5, 0x9A, 0xC6, 0x9A, 0xC7, 0xEB, 0xA5, /* 0xF0-0xF3 */ + 0x9A, 0xC8, 0xEB, 0xA7, 0x9A, 0xC9, 0x9A, 0xCA, /* 0xF4-0xF7 */ + 0x9A, 0xCB, 0xEB, 0xA8, 0x9A, 0xCC, 0x9A, 0xCD, /* 0xF8-0xFB */ + 0x9A, 0xCE, 0xEB, 0xA6, 0x9A, 0xCF, 0x9A, 0xD0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6C[512] = { + 0x9A, 0xD1, 0x9A, 0xD2, 0x9A, 0xD3, 0x9A, 0xD4, /* 0x00-0x03 */ + 0x9A, 0xD5, 0xEB, 0xA9, 0xEB, 0xAB, 0xEB, 0xAA, /* 0x04-0x07 */ + 0x9A, 0xD6, 0x9A, 0xD7, 0x9A, 0xD8, 0x9A, 0xD9, /* 0x08-0x0B */ + 0x9A, 0xDA, 0xEB, 0xAC, 0x9A, 0xDB, 0xCA, 0xCF, /* 0x0C-0x0F */ + 0xD8, 0xB5, 0xC3, 0xF1, 0x9A, 0xDC, 0xC3, 0xA5, /* 0x10-0x13 */ + 0xC6, 0xF8, 0xEB, 0xAD, 0xC4, 0xCA, 0x9A, 0xDD, /* 0x14-0x17 */ + 0xEB, 0xAE, 0xEB, 0xAF, 0xEB, 0xB0, 0xB7, 0xD5, /* 0x18-0x1B */ + 0x9A, 0xDE, 0x9A, 0xDF, 0x9A, 0xE0, 0xB7, 0xFA, /* 0x1C-0x1F */ + 0x9A, 0xE1, 0xEB, 0xB1, 0xC7, 0xE2, 0x9A, 0xE2, /* 0x20-0x23 */ + 0xEB, 0xB3, 0x9A, 0xE3, 0xBA, 0xA4, 0xD1, 0xF5, /* 0x24-0x27 */ + 0xB0, 0xB1, 0xEB, 0xB2, 0xEB, 0xB4, 0x9A, 0xE4, /* 0x28-0x2B */ + 0x9A, 0xE5, 0x9A, 0xE6, 0xB5, 0xAA, 0xC2, 0xC8, /* 0x2C-0x2F */ + 0xC7, 0xE8, 0x9A, 0xE7, 0xEB, 0xB5, 0x9A, 0xE8, /* 0x30-0x33 */ + 0xCB, 0xAE, 0xE3, 0xDF, 0x9A, 0xE9, 0x9A, 0xEA, /* 0x34-0x37 */ + 0xD3, 0xC0, 0x9A, 0xEB, 0x9A, 0xEC, 0x9A, 0xED, /* 0x38-0x3B */ + 0x9A, 0xEE, 0xD9, 0xDB, 0x9A, 0xEF, 0x9A, 0xF0, /* 0x3C-0x3F */ + 0xCD, 0xA1, 0xD6, 0xAD, 0xC7, 0xF3, 0x9A, 0xF1, /* 0x40-0x43 */ + 0x9A, 0xF2, 0x9A, 0xF3, 0xD9, 0xE0, 0xBB, 0xE3, /* 0x44-0x47 */ + 0x9A, 0xF4, 0xBA, 0xBA, 0xE3, 0xE2, 0x9A, 0xF5, /* 0x48-0x4B */ + 0x9A, 0xF6, 0x9A, 0xF7, 0x9A, 0xF8, 0x9A, 0xF9, /* 0x4C-0x4F */ + 0xCF, 0xAB, 0x9A, 0xFA, 0x9A, 0xFB, 0x9A, 0xFC, /* 0x50-0x53 */ + 0xE3, 0xE0, 0xC9, 0xC7, 0x9A, 0xFD, 0xBA, 0xB9, /* 0x54-0x57 */ + 0x9A, 0xFE, 0x9B, 0x40, 0x9B, 0x41, 0xD1, 0xB4, /* 0x58-0x5B */ + 0xE3, 0xE1, 0xC8, 0xEA, 0xB9, 0xAF, 0xBD, 0xAD, /* 0x5C-0x5F */ + 0xB3, 0xD8, 0xCE, 0xDB, 0x9B, 0x42, 0x9B, 0x43, /* 0x60-0x63 */ + 0xCC, 0xC0, 0x9B, 0x44, 0x9B, 0x45, 0x9B, 0x46, /* 0x64-0x67 */ + 0xE3, 0xE8, 0xE3, 0xE9, 0xCD, 0xF4, 0x9B, 0x47, /* 0x68-0x6B */ + 0x9B, 0x48, 0x9B, 0x49, 0x9B, 0x4A, 0x9B, 0x4B, /* 0x6C-0x6F */ + 0xCC, 0xAD, 0x9B, 0x4C, 0xBC, 0xB3, 0x9B, 0x4D, /* 0x70-0x73 */ + 0xE3, 0xEA, 0x9B, 0x4E, 0xE3, 0xEB, 0x9B, 0x4F, /* 0x74-0x77 */ + 0x9B, 0x50, 0xD0, 0xDA, 0x9B, 0x51, 0x9B, 0x52, /* 0x78-0x7B */ + 0x9B, 0x53, 0xC6, 0xFB, 0xB7, 0xDA, 0x9B, 0x54, /* 0x7C-0x7F */ + + 0x9B, 0x55, 0xC7, 0xDF, 0xD2, 0xCA, 0xCE, 0xD6, /* 0x80-0x83 */ + 0x9B, 0x56, 0xE3, 0xE4, 0xE3, 0xEC, 0x9B, 0x57, /* 0x84-0x87 */ + 0xC9, 0xF2, 0xB3, 0xC1, 0x9B, 0x58, 0x9B, 0x59, /* 0x88-0x8B */ + 0xE3, 0xE7, 0x9B, 0x5A, 0x9B, 0x5B, 0xC6, 0xE3, /* 0x8C-0x8F */ + 0xE3, 0xE5, 0x9B, 0x5C, 0x9B, 0x5D, 0xED, 0xB3, /* 0x90-0x93 */ + 0xE3, 0xE6, 0x9B, 0x5E, 0x9B, 0x5F, 0x9B, 0x60, /* 0x94-0x97 */ + 0x9B, 0x61, 0xC9, 0xB3, 0x9B, 0x62, 0xC5, 0xE6, /* 0x98-0x9B */ + 0x9B, 0x63, 0x9B, 0x64, 0x9B, 0x65, 0xB9, 0xB5, /* 0x9C-0x9F */ + 0x9B, 0x66, 0xC3, 0xBB, 0x9B, 0x67, 0xE3, 0xE3, /* 0xA0-0xA3 */ + 0xC5, 0xBD, 0xC1, 0xA4, 0xC2, 0xD9, 0xB2, 0xD7, /* 0xA4-0xA7 */ + 0x9B, 0x68, 0xE3, 0xED, 0xBB, 0xA6, 0xC4, 0xAD, /* 0xA8-0xAB */ + 0x9B, 0x69, 0xE3, 0xF0, 0xBE, 0xDA, 0x9B, 0x6A, /* 0xAC-0xAF */ + 0x9B, 0x6B, 0xE3, 0xFB, 0xE3, 0xF5, 0xBA, 0xD3, /* 0xB0-0xB3 */ + 0x9B, 0x6C, 0x9B, 0x6D, 0x9B, 0x6E, 0x9B, 0x6F, /* 0xB4-0xB7 */ + 0xB7, 0xD0, 0xD3, 0xCD, 0x9B, 0x70, 0xD6, 0xCE, /* 0xB8-0xBB */ + 0xD5, 0xD3, 0xB9, 0xC1, 0xD5, 0xB4, 0xD1, 0xD8, /* 0xBC-0xBF */ + 0x9B, 0x71, 0x9B, 0x72, 0x9B, 0x73, 0x9B, 0x74, /* 0xC0-0xC3 */ + 0xD0, 0xB9, 0xC7, 0xF6, 0x9B, 0x75, 0x9B, 0x76, /* 0xC4-0xC7 */ + 0x9B, 0x77, 0xC8, 0xAA, 0xB2, 0xB4, 0x9B, 0x78, /* 0xC8-0xCB */ + 0xC3, 0xDA, 0x9B, 0x79, 0x9B, 0x7A, 0x9B, 0x7B, /* 0xCC-0xCF */ + 0xE3, 0xEE, 0x9B, 0x7C, 0x9B, 0x7D, 0xE3, 0xFC, /* 0xD0-0xD3 */ + 0xE3, 0xEF, 0xB7, 0xA8, 0xE3, 0xF7, 0xE3, 0xF4, /* 0xD4-0xD7 */ + 0x9B, 0x7E, 0x9B, 0x80, 0x9B, 0x81, 0xB7, 0xBA, /* 0xD8-0xDB */ + 0x9B, 0x82, 0x9B, 0x83, 0xC5, 0xA2, 0x9B, 0x84, /* 0xDC-0xDF */ + 0xE3, 0xF6, 0xC5, 0xDD, 0xB2, 0xA8, 0xC6, 0xFC, /* 0xE0-0xE3 */ + 0x9B, 0x85, 0xC4, 0xE0, 0x9B, 0x86, 0x9B, 0x87, /* 0xE4-0xE7 */ + 0xD7, 0xA2, 0x9B, 0x88, 0xC0, 0xE1, 0xE3, 0xF9, /* 0xE8-0xEB */ + 0x9B, 0x89, 0x9B, 0x8A, 0xE3, 0xFA, 0xE3, 0xFD, /* 0xEC-0xEF */ + 0xCC, 0xA9, 0xE3, 0xF3, 0x9B, 0x8B, 0xD3, 0xBE, /* 0xF0-0xF3 */ + 0x9B, 0x8C, 0xB1, 0xC3, 0xED, 0xB4, 0xE3, 0xF1, /* 0xF4-0xF7 */ + 0xE3, 0xF2, 0x9B, 0x8D, 0xE3, 0xF8, 0xD0, 0xBA, /* 0xF8-0xFB */ + 0xC6, 0xC3, 0xD4, 0xF3, 0xE3, 0xFE, 0x9B, 0x8E, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6D[512] = { + 0x9B, 0x8F, 0xBD, 0xE0, 0x9B, 0x90, 0x9B, 0x91, /* 0x00-0x03 */ + 0xE4, 0xA7, 0x9B, 0x92, 0x9B, 0x93, 0xE4, 0xA6, /* 0x04-0x07 */ + 0x9B, 0x94, 0x9B, 0x95, 0x9B, 0x96, 0xD1, 0xF3, /* 0x08-0x0B */ + 0xE4, 0xA3, 0x9B, 0x97, 0xE4, 0xA9, 0x9B, 0x98, /* 0x0C-0x0F */ + 0x9B, 0x99, 0x9B, 0x9A, 0xC8, 0xF7, 0x9B, 0x9B, /* 0x10-0x13 */ + 0x9B, 0x9C, 0x9B, 0x9D, 0x9B, 0x9E, 0xCF, 0xB4, /* 0x14-0x17 */ + 0x9B, 0x9F, 0xE4, 0xA8, 0xE4, 0xAE, 0xC2, 0xE5, /* 0x18-0x1B */ + 0x9B, 0xA0, 0x9B, 0xA1, 0xB6, 0xB4, 0x9B, 0xA2, /* 0x1C-0x1F */ + 0x9B, 0xA3, 0x9B, 0xA4, 0x9B, 0xA5, 0x9B, 0xA6, /* 0x20-0x23 */ + 0x9B, 0xA7, 0xBD, 0xF2, 0x9B, 0xA8, 0xE4, 0xA2, /* 0x24-0x27 */ + 0x9B, 0xA9, 0x9B, 0xAA, 0xBA, 0xE9, 0xE4, 0xAA, /* 0x28-0x2B */ + 0x9B, 0xAB, 0x9B, 0xAC, 0xE4, 0xAC, 0x9B, 0xAD, /* 0x2C-0x2F */ + 0x9B, 0xAE, 0xB6, 0xFD, 0xD6, 0xDE, 0xE4, 0xB2, /* 0x30-0x33 */ + 0x9B, 0xAF, 0xE4, 0xAD, 0x9B, 0xB0, 0x9B, 0xB1, /* 0x34-0x37 */ + 0x9B, 0xB2, 0xE4, 0xA1, 0x9B, 0xB3, 0xBB, 0xEE, /* 0x38-0x3B */ + 0xCD, 0xDD, 0xC7, 0xA2, 0xC5, 0xC9, 0x9B, 0xB4, /* 0x3C-0x3F */ + 0x9B, 0xB5, 0xC1, 0xF7, 0x9B, 0xB6, 0xE4, 0xA4, /* 0x40-0x43 */ + 0x9B, 0xB7, 0xC7, 0xB3, 0xBD, 0xAC, 0xBD, 0xBD, /* 0x44-0x47 */ + 0xE4, 0xA5, 0x9B, 0xB8, 0xD7, 0xC7, 0xB2, 0xE2, /* 0x48-0x4B */ + 0x9B, 0xB9, 0xE4, 0xAB, 0xBC, 0xC3, 0xE4, 0xAF, /* 0x4C-0x4F */ + 0x9B, 0xBA, 0xBB, 0xEB, 0xE4, 0xB0, 0xC5, 0xA8, /* 0x50-0x53 */ + 0xE4, 0xB1, 0x9B, 0xBB, 0x9B, 0xBC, 0x9B, 0xBD, /* 0x54-0x57 */ + 0x9B, 0xBE, 0xD5, 0xE3, 0xBF, 0xA3, 0x9B, 0xBF, /* 0x58-0x5B */ + 0xE4, 0xBA, 0x9B, 0xC0, 0xE4, 0xB7, 0x9B, 0xC1, /* 0x5C-0x5F */ + 0xE4, 0xBB, 0x9B, 0xC2, 0x9B, 0xC3, 0xE4, 0xBD, /* 0x60-0x63 */ + 0x9B, 0xC4, 0x9B, 0xC5, 0xC6, 0xD6, 0x9B, 0xC6, /* 0x64-0x67 */ + 0x9B, 0xC7, 0xBA, 0xC6, 0xC0, 0xCB, 0x9B, 0xC8, /* 0x68-0x6B */ + 0x9B, 0xC9, 0x9B, 0xCA, 0xB8, 0xA1, 0xE4, 0xB4, /* 0x6C-0x6F */ + 0x9B, 0xCB, 0x9B, 0xCC, 0x9B, 0xCD, 0x9B, 0xCE, /* 0x70-0x73 */ + 0xD4, 0xA1, 0x9B, 0xCF, 0x9B, 0xD0, 0xBA, 0xA3, /* 0x74-0x77 */ + 0xBD, 0xFE, 0x9B, 0xD1, 0x9B, 0xD2, 0x9B, 0xD3, /* 0x78-0x7B */ + 0xE4, 0xBC, 0x9B, 0xD4, 0x9B, 0xD5, 0x9B, 0xD6, /* 0x7C-0x7F */ + + 0x9B, 0xD7, 0x9B, 0xD8, 0xCD, 0xBF, 0x9B, 0xD9, /* 0x80-0x83 */ + 0x9B, 0xDA, 0xC4, 0xF9, 0x9B, 0xDB, 0x9B, 0xDC, /* 0x84-0x87 */ + 0xCF, 0xFB, 0xC9, 0xE6, 0x9B, 0xDD, 0x9B, 0xDE, /* 0x88-0x8B */ + 0xD3, 0xBF, 0x9B, 0xDF, 0xCF, 0xD1, 0x9B, 0xE0, /* 0x8C-0x8F */ + 0x9B, 0xE1, 0xE4, 0xB3, 0x9B, 0xE2, 0xE4, 0xB8, /* 0x90-0x93 */ + 0xE4, 0xB9, 0xCC, 0xE9, 0x9B, 0xE3, 0x9B, 0xE4, /* 0x94-0x97 */ + 0x9B, 0xE5, 0x9B, 0xE6, 0x9B, 0xE7, 0xCC, 0xCE, /* 0x98-0x9B */ + 0x9B, 0xE8, 0xC0, 0xD4, 0xE4, 0xB5, 0xC1, 0xB0, /* 0x9C-0x9F */ + 0xE4, 0xB6, 0xCE, 0xD0, 0x9B, 0xE9, 0xBB, 0xC1, /* 0xA0-0xA3 */ + 0xB5, 0xD3, 0x9B, 0xEA, 0xC8, 0xF3, 0xBD, 0xA7, /* 0xA4-0xA7 */ + 0xD5, 0xC7, 0xC9, 0xAC, 0xB8, 0xA2, 0xE4, 0xCA, /* 0xA8-0xAB */ + 0x9B, 0xEB, 0x9B, 0xEC, 0xE4, 0xCC, 0xD1, 0xC4, /* 0xAC-0xAF */ + 0x9B, 0xED, 0x9B, 0xEE, 0xD2, 0xBA, 0x9B, 0xEF, /* 0xB0-0xB3 */ + 0x9B, 0xF0, 0xBA, 0xAD, 0x9B, 0xF1, 0x9B, 0xF2, /* 0xB4-0xB7 */ + 0xBA, 0xD4, 0x9B, 0xF3, 0x9B, 0xF4, 0x9B, 0xF5, /* 0xB8-0xBB */ + 0x9B, 0xF6, 0x9B, 0xF7, 0x9B, 0xF8, 0xE4, 0xC3, /* 0xBC-0xBF */ + 0xB5, 0xED, 0x9B, 0xF9, 0x9B, 0xFA, 0x9B, 0xFB, /* 0xC0-0xC3 */ + 0xD7, 0xCD, 0xE4, 0xC0, 0xCF, 0xFD, 0xE4, 0xBF, /* 0xC4-0xC7 */ + 0x9B, 0xFC, 0x9B, 0xFD, 0x9B, 0xFE, 0xC1, 0xDC, /* 0xC8-0xCB */ + 0xCC, 0xCA, 0x9C, 0x40, 0x9C, 0x41, 0x9C, 0x42, /* 0xCC-0xCF */ + 0x9C, 0x43, 0xCA, 0xE7, 0x9C, 0x44, 0x9C, 0x45, /* 0xD0-0xD3 */ + 0x9C, 0x46, 0x9C, 0x47, 0xC4, 0xD7, 0x9C, 0x48, /* 0xD4-0xD7 */ + 0xCC, 0xD4, 0xE4, 0xC8, 0x9C, 0x49, 0x9C, 0x4A, /* 0xD8-0xDB */ + 0x9C, 0x4B, 0xE4, 0xC7, 0xE4, 0xC1, 0x9C, 0x4C, /* 0xDC-0xDF */ + 0xE4, 0xC4, 0xB5, 0xAD, 0x9C, 0x4D, 0x9C, 0x4E, /* 0xE0-0xE3 */ + 0xD3, 0xD9, 0x9C, 0x4F, 0xE4, 0xC6, 0x9C, 0x50, /* 0xE4-0xE7 */ + 0x9C, 0x51, 0x9C, 0x52, 0x9C, 0x53, 0xD2, 0xF9, /* 0xE8-0xEB */ + 0xB4, 0xE3, 0x9C, 0x54, 0xBB, 0xB4, 0x9C, 0x55, /* 0xEC-0xEF */ + 0x9C, 0x56, 0xC9, 0xEE, 0x9C, 0x57, 0xB4, 0xBE, /* 0xF0-0xF3 */ + 0x9C, 0x58, 0x9C, 0x59, 0x9C, 0x5A, 0xBB, 0xEC, /* 0xF4-0xF7 */ + 0x9C, 0x5B, 0xD1, 0xCD, 0x9C, 0x5C, 0xCC, 0xED, /* 0xF8-0xFB */ + 0xED, 0xB5, 0x9C, 0x5D, 0x9C, 0x5E, 0x9C, 0x5F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6E[512] = { + 0x9C, 0x60, 0x9C, 0x61, 0x9C, 0x62, 0x9C, 0x63, /* 0x00-0x03 */ + 0x9C, 0x64, 0xC7, 0xE5, 0x9C, 0x65, 0x9C, 0x66, /* 0x04-0x07 */ + 0x9C, 0x67, 0x9C, 0x68, 0xD4, 0xA8, 0x9C, 0x69, /* 0x08-0x0B */ + 0xE4, 0xCB, 0xD7, 0xD5, 0xE4, 0xC2, 0x9C, 0x6A, /* 0x0C-0x0F */ + 0xBD, 0xA5, 0xE4, 0xC5, 0x9C, 0x6B, 0x9C, 0x6C, /* 0x10-0x13 */ + 0xD3, 0xE6, 0x9C, 0x6D, 0xE4, 0xC9, 0xC9, 0xF8, /* 0x14-0x17 */ + 0x9C, 0x6E, 0x9C, 0x6F, 0xE4, 0xBE, 0x9C, 0x70, /* 0x18-0x1B */ + 0x9C, 0x71, 0xD3, 0xE5, 0x9C, 0x72, 0x9C, 0x73, /* 0x1C-0x1F */ + 0xC7, 0xFE, 0xB6, 0xC9, 0x9C, 0x74, 0xD4, 0xFC, /* 0x20-0x23 */ + 0xB2, 0xB3, 0xE4, 0xD7, 0x9C, 0x75, 0x9C, 0x76, /* 0x24-0x27 */ + 0x9C, 0x77, 0xCE, 0xC2, 0x9C, 0x78, 0xE4, 0xCD, /* 0x28-0x2B */ + 0x9C, 0x79, 0xCE, 0xBC, 0x9C, 0x7A, 0xB8, 0xDB, /* 0x2C-0x2F */ + 0x9C, 0x7B, 0x9C, 0x7C, 0xE4, 0xD6, 0x9C, 0x7D, /* 0x30-0x33 */ + 0xBF, 0xCA, 0x9C, 0x7E, 0x9C, 0x80, 0x9C, 0x81, /* 0x34-0x37 */ + 0xD3, 0xCE, 0x9C, 0x82, 0xC3, 0xEC, 0x9C, 0x83, /* 0x38-0x3B */ + 0x9C, 0x84, 0x9C, 0x85, 0x9C, 0x86, 0x9C, 0x87, /* 0x3C-0x3F */ + 0x9C, 0x88, 0x9C, 0x89, 0x9C, 0x8A, 0xC5, 0xC8, /* 0x40-0x43 */ + 0xE4, 0xD8, 0x9C, 0x8B, 0x9C, 0x8C, 0x9C, 0x8D, /* 0x44-0x47 */ + 0x9C, 0x8E, 0x9C, 0x8F, 0x9C, 0x90, 0x9C, 0x91, /* 0x48-0x4B */ + 0x9C, 0x92, 0xCD, 0xC4, 0xE4, 0xCF, 0x9C, 0x93, /* 0x4C-0x4F */ + 0x9C, 0x94, 0x9C, 0x95, 0x9C, 0x96, 0xE4, 0xD4, /* 0x50-0x53 */ + 0xE4, 0xD5, 0x9C, 0x97, 0xBA, 0xFE, 0x9C, 0x98, /* 0x54-0x57 */ + 0xCF, 0xE6, 0x9C, 0x99, 0x9C, 0x9A, 0xD5, 0xBF, /* 0x58-0x5B */ + 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9D, 0xE4, 0xD2, /* 0x5C-0x5F */ + 0x9C, 0x9E, 0x9C, 0x9F, 0x9C, 0xA0, 0x9C, 0xA1, /* 0x60-0x63 */ + 0x9C, 0xA2, 0x9C, 0xA3, 0x9C, 0xA4, 0x9C, 0xA5, /* 0x64-0x67 */ + 0x9C, 0xA6, 0x9C, 0xA7, 0x9C, 0xA8, 0xE4, 0xD0, /* 0x68-0x6B */ + 0x9C, 0xA9, 0x9C, 0xAA, 0xE4, 0xCE, 0x9C, 0xAB, /* 0x6C-0x6F */ + 0x9C, 0xAC, 0x9C, 0xAD, 0x9C, 0xAE, 0x9C, 0xAF, /* 0x70-0x73 */ + 0x9C, 0xB0, 0x9C, 0xB1, 0x9C, 0xB2, 0x9C, 0xB3, /* 0x74-0x77 */ + 0x9C, 0xB4, 0x9C, 0xB5, 0x9C, 0xB6, 0x9C, 0xB7, /* 0x78-0x7B */ + 0x9C, 0xB8, 0x9C, 0xB9, 0xCD, 0xE5, 0xCA, 0xAA, /* 0x7C-0x7F */ + + 0x9C, 0xBA, 0x9C, 0xBB, 0x9C, 0xBC, 0xC0, 0xA3, /* 0x80-0x83 */ + 0x9C, 0xBD, 0xBD, 0xA6, 0xE4, 0xD3, 0x9C, 0xBE, /* 0x84-0x87 */ + 0x9C, 0xBF, 0xB8, 0xC8, 0x9C, 0xC0, 0x9C, 0xC1, /* 0x88-0x8B */ + 0x9C, 0xC2, 0x9C, 0xC3, 0x9C, 0xC4, 0xE4, 0xE7, /* 0x8C-0x8F */ + 0xD4, 0xB4, 0x9C, 0xC5, 0x9C, 0xC6, 0x9C, 0xC7, /* 0x90-0x93 */ + 0x9C, 0xC8, 0x9C, 0xC9, 0x9C, 0xCA, 0x9C, 0xCB, /* 0x94-0x97 */ + 0xE4, 0xDB, 0x9C, 0xCC, 0x9C, 0xCD, 0x9C, 0xCE, /* 0x98-0x9B */ + 0xC1, 0xEF, 0x9C, 0xCF, 0x9C, 0xD0, 0xE4, 0xE9, /* 0x9C-0x9F */ + 0x9C, 0xD1, 0x9C, 0xD2, 0xD2, 0xE7, 0x9C, 0xD3, /* 0xA0-0xA3 */ + 0x9C, 0xD4, 0xE4, 0xDF, 0x9C, 0xD5, 0xE4, 0xE0, /* 0xA4-0xA7 */ + 0x9C, 0xD6, 0x9C, 0xD7, 0xCF, 0xAA, 0x9C, 0xD8, /* 0xA8-0xAB */ + 0x9C, 0xD9, 0x9C, 0xDA, 0x9C, 0xDB, 0xCB, 0xDD, /* 0xAC-0xAF */ + 0x9C, 0xDC, 0xE4, 0xDA, 0xE4, 0xD1, 0x9C, 0xDD, /* 0xB0-0xB3 */ + 0xE4, 0xE5, 0x9C, 0xDE, 0xC8, 0xDC, 0xE4, 0xE3, /* 0xB4-0xB7 */ + 0x9C, 0xDF, 0x9C, 0xE0, 0xC4, 0xE7, 0xE4, 0xE2, /* 0xB8-0xBB */ + 0x9C, 0xE1, 0xE4, 0xE1, 0x9C, 0xE2, 0x9C, 0xE3, /* 0xBC-0xBF */ + 0x9C, 0xE4, 0xB3, 0xFC, 0xE4, 0xE8, 0x9C, 0xE5, /* 0xC0-0xC3 */ + 0x9C, 0xE6, 0x9C, 0xE7, 0x9C, 0xE8, 0xB5, 0xE1, /* 0xC4-0xC7 */ + 0x9C, 0xE9, 0x9C, 0xEA, 0x9C, 0xEB, 0xD7, 0xCC, /* 0xC8-0xCB */ + 0x9C, 0xEC, 0x9C, 0xED, 0x9C, 0xEE, 0xE4, 0xE6, /* 0xCC-0xCF */ + 0x9C, 0xEF, 0xBB, 0xAC, 0x9C, 0xF0, 0xD7, 0xD2, /* 0xD0-0xD3 */ + 0xCC, 0xCF, 0xEB, 0xF8, 0x9C, 0xF1, 0xE4, 0xE4, /* 0xD4-0xD7 */ + 0x9C, 0xF2, 0x9C, 0xF3, 0xB9, 0xF6, 0x9C, 0xF4, /* 0xD8-0xDB */ + 0x9C, 0xF5, 0x9C, 0xF6, 0xD6, 0xCD, 0xE4, 0xD9, /* 0xDC-0xDF */ + 0xE4, 0xDC, 0xC2, 0xFA, 0xE4, 0xDE, 0x9C, 0xF7, /* 0xE0-0xE3 */ + 0xC2, 0xCB, 0xC0, 0xC4, 0xC2, 0xD0, 0x9C, 0xF8, /* 0xE4-0xE7 */ + 0xB1, 0xF5, 0xCC, 0xB2, 0x9C, 0xF9, 0x9C, 0xFA, /* 0xE8-0xEB */ + 0x9C, 0xFB, 0x9C, 0xFC, 0x9C, 0xFD, 0x9C, 0xFE, /* 0xEC-0xEF */ + 0x9D, 0x40, 0x9D, 0x41, 0x9D, 0x42, 0x9D, 0x43, /* 0xF0-0xF3 */ + 0xB5, 0xCE, 0x9D, 0x44, 0x9D, 0x45, 0x9D, 0x46, /* 0xF4-0xF7 */ + 0x9D, 0x47, 0xE4, 0xEF, 0x9D, 0x48, 0x9D, 0x49, /* 0xF8-0xFB */ + 0x9D, 0x4A, 0x9D, 0x4B, 0x9D, 0x4C, 0x9D, 0x4D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6F[512] = { + 0x9D, 0x4E, 0x9D, 0x4F, 0xC6, 0xAF, 0x9D, 0x50, /* 0x00-0x03 */ + 0x9D, 0x51, 0x9D, 0x52, 0xC6, 0xE1, 0x9D, 0x53, /* 0x04-0x07 */ + 0x9D, 0x54, 0xE4, 0xF5, 0x9D, 0x55, 0x9D, 0x56, /* 0x08-0x0B */ + 0x9D, 0x57, 0x9D, 0x58, 0x9D, 0x59, 0xC2, 0xA9, /* 0x0C-0x0F */ + 0x9D, 0x5A, 0x9D, 0x5B, 0x9D, 0x5C, 0xC0, 0xEC, /* 0x10-0x13 */ + 0xD1, 0xDD, 0xE4, 0xEE, 0x9D, 0x5D, 0x9D, 0x5E, /* 0x14-0x17 */ + 0x9D, 0x5F, 0x9D, 0x60, 0x9D, 0x61, 0x9D, 0x62, /* 0x18-0x1B */ + 0x9D, 0x63, 0x9D, 0x64, 0x9D, 0x65, 0x9D, 0x66, /* 0x1C-0x1F */ + 0xC4, 0xAE, 0x9D, 0x67, 0x9D, 0x68, 0x9D, 0x69, /* 0x20-0x23 */ + 0xE4, 0xED, 0x9D, 0x6A, 0x9D, 0x6B, 0x9D, 0x6C, /* 0x24-0x27 */ + 0x9D, 0x6D, 0xE4, 0xF6, 0xE4, 0xF4, 0xC2, 0xFE, /* 0x28-0x2B */ + 0x9D, 0x6E, 0xE4, 0xDD, 0x9D, 0x6F, 0xE4, 0xF0, /* 0x2C-0x2F */ + 0x9D, 0x70, 0xCA, 0xFE, 0x9D, 0x71, 0xD5, 0xC4, /* 0x30-0x33 */ + 0x9D, 0x72, 0x9D, 0x73, 0xE4, 0xF1, 0x9D, 0x74, /* 0x34-0x37 */ + 0x9D, 0x75, 0x9D, 0x76, 0x9D, 0x77, 0x9D, 0x78, /* 0x38-0x3B */ + 0x9D, 0x79, 0x9D, 0x7A, 0xD1, 0xFA, 0x9D, 0x7B, /* 0x3C-0x3F */ + 0x9D, 0x7C, 0x9D, 0x7D, 0x9D, 0x7E, 0x9D, 0x80, /* 0x40-0x43 */ + 0x9D, 0x81, 0x9D, 0x82, 0xE4, 0xEB, 0xE4, 0xEC, /* 0x44-0x47 */ + 0x9D, 0x83, 0x9D, 0x84, 0x9D, 0x85, 0xE4, 0xF2, /* 0x48-0x4B */ + 0x9D, 0x86, 0xCE, 0xAB, 0x9D, 0x87, 0x9D, 0x88, /* 0x4C-0x4F */ + 0x9D, 0x89, 0x9D, 0x8A, 0x9D, 0x8B, 0x9D, 0x8C, /* 0x50-0x53 */ + 0x9D, 0x8D, 0x9D, 0x8E, 0x9D, 0x8F, 0x9D, 0x90, /* 0x54-0x57 */ + 0xC5, 0xCB, 0x9D, 0x91, 0x9D, 0x92, 0x9D, 0x93, /* 0x58-0x5B */ + 0xC7, 0xB1, 0x9D, 0x94, 0xC2, 0xBA, 0x9D, 0x95, /* 0x5C-0x5F */ + 0x9D, 0x96, 0x9D, 0x97, 0xE4, 0xEA, 0x9D, 0x98, /* 0x60-0x63 */ + 0x9D, 0x99, 0x9D, 0x9A, 0xC1, 0xCA, 0x9D, 0x9B, /* 0x64-0x67 */ + 0x9D, 0x9C, 0x9D, 0x9D, 0x9D, 0x9E, 0x9D, 0x9F, /* 0x68-0x6B */ + 0x9D, 0xA0, 0xCC, 0xB6, 0xB3, 0xB1, 0x9D, 0xA1, /* 0x6C-0x6F */ + 0x9D, 0xA2, 0x9D, 0xA3, 0xE4, 0xFB, 0x9D, 0xA4, /* 0x70-0x73 */ + 0xE4, 0xF3, 0x9D, 0xA5, 0x9D, 0xA6, 0x9D, 0xA7, /* 0x74-0x77 */ + 0xE4, 0xFA, 0x9D, 0xA8, 0xE4, 0xFD, 0x9D, 0xA9, /* 0x78-0x7B */ + 0xE4, 0xFC, 0x9D, 0xAA, 0x9D, 0xAB, 0x9D, 0xAC, /* 0x7C-0x7F */ + + 0x9D, 0xAD, 0x9D, 0xAE, 0x9D, 0xAF, 0x9D, 0xB0, /* 0x80-0x83 */ + 0xB3, 0xCE, 0x9D, 0xB1, 0x9D, 0xB2, 0x9D, 0xB3, /* 0x84-0x87 */ + 0xB3, 0xBA, 0xE4, 0xF7, 0x9D, 0xB4, 0x9D, 0xB5, /* 0x88-0x8B */ + 0xE4, 0xF9, 0xE4, 0xF8, 0xC5, 0xEC, 0x9D, 0xB6, /* 0x8C-0x8F */ + 0x9D, 0xB7, 0x9D, 0xB8, 0x9D, 0xB9, 0x9D, 0xBA, /* 0x90-0x93 */ + 0x9D, 0xBB, 0x9D, 0xBC, 0x9D, 0xBD, 0x9D, 0xBE, /* 0x94-0x97 */ + 0x9D, 0xBF, 0x9D, 0xC0, 0x9D, 0xC1, 0x9D, 0xC2, /* 0x98-0x9B */ + 0xC0, 0xBD, 0x9D, 0xC3, 0x9D, 0xC4, 0x9D, 0xC5, /* 0x9C-0x9F */ + 0x9D, 0xC6, 0xD4, 0xE8, 0x9D, 0xC7, 0x9D, 0xC8, /* 0xA0-0xA3 */ + 0x9D, 0xC9, 0x9D, 0xCA, 0x9D, 0xCB, 0xE5, 0xA2, /* 0xA4-0xA7 */ + 0x9D, 0xCC, 0x9D, 0xCD, 0x9D, 0xCE, 0x9D, 0xCF, /* 0xA8-0xAB */ + 0x9D, 0xD0, 0x9D, 0xD1, 0x9D, 0xD2, 0x9D, 0xD3, /* 0xAC-0xAF */ + 0x9D, 0xD4, 0x9D, 0xD5, 0x9D, 0xD6, 0xB0, 0xC4, /* 0xB0-0xB3 */ + 0x9D, 0xD7, 0x9D, 0xD8, 0xE5, 0xA4, 0x9D, 0xD9, /* 0xB4-0xB7 */ + 0x9D, 0xDA, 0xE5, 0xA3, 0x9D, 0xDB, 0x9D, 0xDC, /* 0xB8-0xBB */ + 0x9D, 0xDD, 0x9D, 0xDE, 0x9D, 0xDF, 0x9D, 0xE0, /* 0xBC-0xBF */ + 0xBC, 0xA4, 0x9D, 0xE1, 0xE5, 0xA5, 0x9D, 0xE2, /* 0xC0-0xC3 */ + 0x9D, 0xE3, 0x9D, 0xE4, 0x9D, 0xE5, 0x9D, 0xE6, /* 0xC4-0xC7 */ + 0x9D, 0xE7, 0xE5, 0xA1, 0x9D, 0xE8, 0x9D, 0xE9, /* 0xC8-0xCB */ + 0x9D, 0xEA, 0x9D, 0xEB, 0x9D, 0xEC, 0x9D, 0xED, /* 0xCC-0xCF */ + 0x9D, 0xEE, 0xE4, 0xFE, 0xB1, 0xF4, 0x9D, 0xEF, /* 0xD0-0xD3 */ + 0x9D, 0xF0, 0x9D, 0xF1, 0x9D, 0xF2, 0x9D, 0xF3, /* 0xD4-0xD7 */ + 0x9D, 0xF4, 0x9D, 0xF5, 0x9D, 0xF6, 0x9D, 0xF7, /* 0xD8-0xDB */ + 0x9D, 0xF8, 0x9D, 0xF9, 0xE5, 0xA8, 0x9D, 0xFA, /* 0xDC-0xDF */ + 0xE5, 0xA9, 0xE5, 0xA6, 0x9D, 0xFB, 0x9D, 0xFC, /* 0xE0-0xE3 */ + 0x9D, 0xFD, 0x9D, 0xFE, 0x9E, 0x40, 0x9E, 0x41, /* 0xE4-0xE7 */ + 0x9E, 0x42, 0x9E, 0x43, 0x9E, 0x44, 0x9E, 0x45, /* 0xE8-0xEB */ + 0x9E, 0x46, 0x9E, 0x47, 0xE5, 0xA7, 0xE5, 0xAA, /* 0xEC-0xEF */ + 0x9E, 0x48, 0x9E, 0x49, 0x9E, 0x4A, 0x9E, 0x4B, /* 0xF0-0xF3 */ + 0x9E, 0x4C, 0x9E, 0x4D, 0x9E, 0x4E, 0x9E, 0x4F, /* 0xF4-0xF7 */ + 0x9E, 0x50, 0x9E, 0x51, 0x9E, 0x52, 0x9E, 0x53, /* 0xF8-0xFB */ + 0x9E, 0x54, 0x9E, 0x55, 0x9E, 0x56, 0x9E, 0x57, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_70[512] = { + 0x9E, 0x58, 0x9E, 0x59, 0x9E, 0x5A, 0x9E, 0x5B, /* 0x00-0x03 */ + 0x9E, 0x5C, 0x9E, 0x5D, 0x9E, 0x5E, 0x9E, 0x5F, /* 0x04-0x07 */ + 0x9E, 0x60, 0x9E, 0x61, 0x9E, 0x62, 0x9E, 0x63, /* 0x08-0x0B */ + 0x9E, 0x64, 0x9E, 0x65, 0x9E, 0x66, 0x9E, 0x67, /* 0x0C-0x0F */ + 0x9E, 0x68, 0xC6, 0xD9, 0x9E, 0x69, 0x9E, 0x6A, /* 0x10-0x13 */ + 0x9E, 0x6B, 0x9E, 0x6C, 0x9E, 0x6D, 0x9E, 0x6E, /* 0x14-0x17 */ + 0x9E, 0x6F, 0x9E, 0x70, 0xE5, 0xAB, 0xE5, 0xAD, /* 0x18-0x1B */ + 0x9E, 0x71, 0x9E, 0x72, 0x9E, 0x73, 0x9E, 0x74, /* 0x1C-0x1F */ + 0x9E, 0x75, 0x9E, 0x76, 0x9E, 0x77, 0xE5, 0xAC, /* 0x20-0x23 */ + 0x9E, 0x78, 0x9E, 0x79, 0x9E, 0x7A, 0x9E, 0x7B, /* 0x24-0x27 */ + 0x9E, 0x7C, 0x9E, 0x7D, 0x9E, 0x7E, 0x9E, 0x80, /* 0x28-0x2B */ + 0x9E, 0x81, 0x9E, 0x82, 0x9E, 0x83, 0x9E, 0x84, /* 0x2C-0x2F */ + 0x9E, 0x85, 0x9E, 0x86, 0x9E, 0x87, 0x9E, 0x88, /* 0x30-0x33 */ + 0x9E, 0x89, 0xE5, 0xAF, 0x9E, 0x8A, 0x9E, 0x8B, /* 0x34-0x37 */ + 0x9E, 0x8C, 0xE5, 0xAE, 0x9E, 0x8D, 0x9E, 0x8E, /* 0x38-0x3B */ + 0x9E, 0x8F, 0x9E, 0x90, 0x9E, 0x91, 0x9E, 0x92, /* 0x3C-0x3F */ + 0x9E, 0x93, 0x9E, 0x94, 0x9E, 0x95, 0x9E, 0x96, /* 0x40-0x43 */ + 0x9E, 0x97, 0x9E, 0x98, 0x9E, 0x99, 0x9E, 0x9A, /* 0x44-0x47 */ + 0x9E, 0x9B, 0x9E, 0x9C, 0x9E, 0x9D, 0x9E, 0x9E, /* 0x48-0x4B */ + 0xB9, 0xE0, 0x9E, 0x9F, 0x9E, 0xA0, 0xE5, 0xB0, /* 0x4C-0x4F */ + 0x9E, 0xA1, 0x9E, 0xA2, 0x9E, 0xA3, 0x9E, 0xA4, /* 0x50-0x53 */ + 0x9E, 0xA5, 0x9E, 0xA6, 0x9E, 0xA7, 0x9E, 0xA8, /* 0x54-0x57 */ + 0x9E, 0xA9, 0x9E, 0xAA, 0x9E, 0xAB, 0x9E, 0xAC, /* 0x58-0x5B */ + 0x9E, 0xAD, 0x9E, 0xAE, 0xE5, 0xB1, 0x9E, 0xAF, /* 0x5C-0x5F */ + 0x9E, 0xB0, 0x9E, 0xB1, 0x9E, 0xB2, 0x9E, 0xB3, /* 0x60-0x63 */ + 0x9E, 0xB4, 0x9E, 0xB5, 0x9E, 0xB6, 0x9E, 0xB7, /* 0x64-0x67 */ + 0x9E, 0xB8, 0x9E, 0xB9, 0x9E, 0xBA, 0xBB, 0xF0, /* 0x68-0x6B */ + 0xEC, 0xE1, 0xC3, 0xF0, 0x9E, 0xBB, 0xB5, 0xC6, /* 0x6C-0x6F */ + 0xBB, 0xD2, 0x9E, 0xBC, 0x9E, 0xBD, 0x9E, 0xBE, /* 0x70-0x73 */ + 0x9E, 0xBF, 0xC1, 0xE9, 0xD4, 0xEE, 0x9E, 0xC0, /* 0x74-0x77 */ + 0xBE, 0xC4, 0x9E, 0xC1, 0x9E, 0xC2, 0x9E, 0xC3, /* 0x78-0x7B */ + 0xD7, 0xC6, 0x9E, 0xC4, 0xD4, 0xD6, 0xB2, 0xD3, /* 0x7C-0x7F */ + + 0xEC, 0xBE, 0x9E, 0xC5, 0x9E, 0xC6, 0x9E, 0xC7, /* 0x80-0x83 */ + 0x9E, 0xC8, 0xEA, 0xC1, 0x9E, 0xC9, 0x9E, 0xCA, /* 0x84-0x87 */ + 0x9E, 0xCB, 0xC2, 0xAF, 0xB4, 0xB6, 0x9E, 0xCC, /* 0x88-0x8B */ + 0x9E, 0xCD, 0x9E, 0xCE, 0xD1, 0xD7, 0x9E, 0xCF, /* 0x8C-0x8F */ + 0x9E, 0xD0, 0x9E, 0xD1, 0xB3, 0xB4, 0x9E, 0xD2, /* 0x90-0x93 */ + 0xC8, 0xB2, 0xBF, 0xBB, 0xEC, 0xC0, 0x9E, 0xD3, /* 0x94-0x97 */ + 0x9E, 0xD4, 0xD6, 0xCB, 0x9E, 0xD5, 0x9E, 0xD6, /* 0x98-0x9B */ + 0xEC, 0xBF, 0xEC, 0xC1, 0x9E, 0xD7, 0x9E, 0xD8, /* 0x9C-0x9F */ + 0x9E, 0xD9, 0x9E, 0xDA, 0x9E, 0xDB, 0x9E, 0xDC, /* 0xA0-0xA3 */ + 0x9E, 0xDD, 0x9E, 0xDE, 0x9E, 0xDF, 0x9E, 0xE0, /* 0xA4-0xA7 */ + 0x9E, 0xE1, 0x9E, 0xE2, 0x9E, 0xE3, 0xEC, 0xC5, /* 0xA8-0xAB */ + 0xBE, 0xE6, 0xCC, 0xBF, 0xC5, 0xDA, 0xBE, 0xBC, /* 0xAC-0xAF */ + 0x9E, 0xE4, 0xEC, 0xC6, 0x9E, 0xE5, 0xB1, 0xFE, /* 0xB0-0xB3 */ + 0x9E, 0xE6, 0x9E, 0xE7, 0x9E, 0xE8, 0xEC, 0xC4, /* 0xB4-0xB7 */ + 0xD5, 0xA8, 0xB5, 0xE3, 0x9E, 0xE9, 0xEC, 0xC2, /* 0xB8-0xBB */ + 0xC1, 0xB6, 0xB3, 0xE3, 0x9E, 0xEA, 0x9E, 0xEB, /* 0xBC-0xBF */ + 0xEC, 0xC3, 0xCB, 0xB8, 0xC0, 0xC3, 0xCC, 0xFE, /* 0xC0-0xC3 */ + 0x9E, 0xEC, 0x9E, 0xED, 0x9E, 0xEE, 0x9E, 0xEF, /* 0xC4-0xC7 */ + 0xC1, 0xD2, 0x9E, 0xF0, 0xEC, 0xC8, 0x9E, 0xF1, /* 0xC8-0xCB */ + 0x9E, 0xF2, 0x9E, 0xF3, 0x9E, 0xF4, 0x9E, 0xF5, /* 0xCC-0xCF */ + 0x9E, 0xF6, 0x9E, 0xF7, 0x9E, 0xF8, 0x9E, 0xF9, /* 0xD0-0xD3 */ + 0x9E, 0xFA, 0x9E, 0xFB, 0x9E, 0xFC, 0x9E, 0xFD, /* 0xD4-0xD7 */ + 0xBA, 0xE6, 0xC0, 0xD3, 0x9E, 0xFE, 0xD6, 0xF2, /* 0xD8-0xDB */ + 0x9F, 0x40, 0x9F, 0x41, 0x9F, 0x42, 0xD1, 0xCC, /* 0xDC-0xDF */ + 0x9F, 0x43, 0x9F, 0x44, 0x9F, 0x45, 0x9F, 0x46, /* 0xE0-0xE3 */ + 0xBF, 0xBE, 0x9F, 0x47, 0xB7, 0xB3, 0xC9, 0xD5, /* 0xE4-0xE7 */ + 0xEC, 0xC7, 0xBB, 0xE2, 0x9F, 0x48, 0xCC, 0xCC, /* 0xE8-0xEB */ + 0xBD, 0xFD, 0xC8, 0xC8, 0x9F, 0x49, 0xCF, 0xA9, /* 0xEC-0xEF */ + 0x9F, 0x4A, 0x9F, 0x4B, 0x9F, 0x4C, 0x9F, 0x4D, /* 0xF0-0xF3 */ + 0x9F, 0x4E, 0x9F, 0x4F, 0x9F, 0x50, 0xCD, 0xE9, /* 0xF4-0xF7 */ + 0x9F, 0x51, 0xC5, 0xEB, 0x9F, 0x52, 0x9F, 0x53, /* 0xF8-0xFB */ + 0x9F, 0x54, 0xB7, 0xE9, 0x9F, 0x55, 0x9F, 0x56, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_71[512] = { + 0x9F, 0x57, 0x9F, 0x58, 0x9F, 0x59, 0x9F, 0x5A, /* 0x00-0x03 */ + 0x9F, 0x5B, 0x9F, 0x5C, 0x9F, 0x5D, 0x9F, 0x5E, /* 0x04-0x07 */ + 0x9F, 0x5F, 0xD1, 0xC9, 0xBA, 0xB8, 0x9F, 0x60, /* 0x08-0x0B */ + 0x9F, 0x61, 0x9F, 0x62, 0x9F, 0x63, 0x9F, 0x64, /* 0x0C-0x0F */ + 0xEC, 0xC9, 0x9F, 0x65, 0x9F, 0x66, 0xEC, 0xCA, /* 0x10-0x13 */ + 0x9F, 0x67, 0xBB, 0xC0, 0xEC, 0xCB, 0x9F, 0x68, /* 0x14-0x17 */ + 0xEC, 0xE2, 0xB1, 0xBA, 0xB7, 0xD9, 0x9F, 0x69, /* 0x18-0x1B */ + 0x9F, 0x6A, 0x9F, 0x6B, 0x9F, 0x6C, 0x9F, 0x6D, /* 0x1C-0x1F */ + 0x9F, 0x6E, 0x9F, 0x6F, 0x9F, 0x70, 0x9F, 0x71, /* 0x20-0x23 */ + 0x9F, 0x72, 0x9F, 0x73, 0xBD, 0xB9, 0x9F, 0x74, /* 0x24-0x27 */ + 0x9F, 0x75, 0x9F, 0x76, 0x9F, 0x77, 0x9F, 0x78, /* 0x28-0x2B */ + 0x9F, 0x79, 0x9F, 0x7A, 0x9F, 0x7B, 0xEC, 0xCC, /* 0x2C-0x2F */ + 0xD1, 0xE6, 0xEC, 0xCD, 0x9F, 0x7C, 0x9F, 0x7D, /* 0x30-0x33 */ + 0x9F, 0x7E, 0x9F, 0x80, 0xC8, 0xBB, 0x9F, 0x81, /* 0x34-0x37 */ + 0x9F, 0x82, 0x9F, 0x83, 0x9F, 0x84, 0x9F, 0x85, /* 0x38-0x3B */ + 0x9F, 0x86, 0x9F, 0x87, 0x9F, 0x88, 0x9F, 0x89, /* 0x3C-0x3F */ + 0x9F, 0x8A, 0x9F, 0x8B, 0x9F, 0x8C, 0x9F, 0x8D, /* 0x40-0x43 */ + 0x9F, 0x8E, 0xEC, 0xD1, 0x9F, 0x8F, 0x9F, 0x90, /* 0x44-0x47 */ + 0x9F, 0x91, 0x9F, 0x92, 0xEC, 0xD3, 0x9F, 0x93, /* 0x48-0x4B */ + 0xBB, 0xCD, 0x9F, 0x94, 0xBC, 0xE5, 0x9F, 0x95, /* 0x4C-0x4F */ + 0x9F, 0x96, 0x9F, 0x97, 0x9F, 0x98, 0x9F, 0x99, /* 0x50-0x53 */ + 0x9F, 0x9A, 0x9F, 0x9B, 0x9F, 0x9C, 0x9F, 0x9D, /* 0x54-0x57 */ + 0x9F, 0x9E, 0x9F, 0x9F, 0x9F, 0xA0, 0x9F, 0xA1, /* 0x58-0x5B */ + 0xEC, 0xCF, 0x9F, 0xA2, 0xC9, 0xB7, 0x9F, 0xA3, /* 0x5C-0x5F */ + 0x9F, 0xA4, 0x9F, 0xA5, 0x9F, 0xA6, 0x9F, 0xA7, /* 0x60-0x63 */ + 0xC3, 0xBA, 0x9F, 0xA8, 0xEC, 0xE3, 0xD5, 0xD5, /* 0x64-0x67 */ + 0xEC, 0xD0, 0x9F, 0xA9, 0x9F, 0xAA, 0x9F, 0xAB, /* 0x68-0x6B */ + 0x9F, 0xAC, 0x9F, 0xAD, 0xD6, 0xF3, 0x9F, 0xAE, /* 0x6C-0x6F */ + 0x9F, 0xAF, 0x9F, 0xB0, 0xEC, 0xD2, 0xEC, 0xCE, /* 0x70-0x73 */ + 0x9F, 0xB1, 0x9F, 0xB2, 0x9F, 0xB3, 0x9F, 0xB4, /* 0x74-0x77 */ + 0xEC, 0xD4, 0x9F, 0xB5, 0xEC, 0xD5, 0x9F, 0xB6, /* 0x78-0x7B */ + 0x9F, 0xB7, 0xC9, 0xBF, 0x9F, 0xB8, 0x9F, 0xB9, /* 0x7C-0x7F */ + + 0x9F, 0xBA, 0x9F, 0xBB, 0x9F, 0xBC, 0x9F, 0xBD, /* 0x80-0x83 */ + 0xCF, 0xA8, 0x9F, 0xBE, 0x9F, 0xBF, 0x9F, 0xC0, /* 0x84-0x87 */ + 0x9F, 0xC1, 0x9F, 0xC2, 0xD0, 0xDC, 0x9F, 0xC3, /* 0x88-0x8B */ + 0x9F, 0xC4, 0x9F, 0xC5, 0x9F, 0xC6, 0xD1, 0xAC, /* 0x8C-0x8F */ + 0x9F, 0xC7, 0x9F, 0xC8, 0x9F, 0xC9, 0x9F, 0xCA, /* 0x90-0x93 */ + 0xC8, 0xDB, 0x9F, 0xCB, 0x9F, 0xCC, 0x9F, 0xCD, /* 0x94-0x97 */ + 0xEC, 0xD6, 0xCE, 0xF5, 0x9F, 0xCE, 0x9F, 0xCF, /* 0x98-0x9B */ + 0x9F, 0xD0, 0x9F, 0xD1, 0x9F, 0xD2, 0xCA, 0xEC, /* 0x9C-0x9F */ + 0xEC, 0xDA, 0x9F, 0xD3, 0x9F, 0xD4, 0x9F, 0xD5, /* 0xA0-0xA3 */ + 0x9F, 0xD6, 0x9F, 0xD7, 0x9F, 0xD8, 0x9F, 0xD9, /* 0xA4-0xA7 */ + 0xEC, 0xD9, 0x9F, 0xDA, 0x9F, 0xDB, 0x9F, 0xDC, /* 0xA8-0xAB */ + 0xB0, 0xBE, 0x9F, 0xDD, 0x9F, 0xDE, 0x9F, 0xDF, /* 0xAC-0xAF */ + 0x9F, 0xE0, 0x9F, 0xE1, 0x9F, 0xE2, 0xEC, 0xD7, /* 0xB0-0xB3 */ + 0x9F, 0xE3, 0xEC, 0xD8, 0x9F, 0xE4, 0x9F, 0xE5, /* 0xB4-0xB7 */ + 0x9F, 0xE6, 0xEC, 0xE4, 0x9F, 0xE7, 0x9F, 0xE8, /* 0xB8-0xBB */ + 0x9F, 0xE9, 0x9F, 0xEA, 0x9F, 0xEB, 0x9F, 0xEC, /* 0xBC-0xBF */ + 0x9F, 0xED, 0x9F, 0xEE, 0x9F, 0xEF, 0xC8, 0xBC, /* 0xC0-0xC3 */ + 0x9F, 0xF0, 0x9F, 0xF1, 0x9F, 0xF2, 0x9F, 0xF3, /* 0xC4-0xC7 */ + 0x9F, 0xF4, 0x9F, 0xF5, 0x9F, 0xF6, 0x9F, 0xF7, /* 0xC8-0xCB */ + 0x9F, 0xF8, 0x9F, 0xF9, 0xC1, 0xC7, 0x9F, 0xFA, /* 0xCC-0xCF */ + 0x9F, 0xFB, 0x9F, 0xFC, 0x9F, 0xFD, 0x9F, 0xFE, /* 0xD0-0xD3 */ + 0xEC, 0xDC, 0xD1, 0xE0, 0xA0, 0x40, 0xA0, 0x41, /* 0xD4-0xD7 */ + 0xA0, 0x42, 0xA0, 0x43, 0xA0, 0x44, 0xA0, 0x45, /* 0xD8-0xDB */ + 0xA0, 0x46, 0xA0, 0x47, 0xA0, 0x48, 0xA0, 0x49, /* 0xDC-0xDF */ + 0xEC, 0xDB, 0xA0, 0x4A, 0xA0, 0x4B, 0xA0, 0x4C, /* 0xE0-0xE3 */ + 0xA0, 0x4D, 0xD4, 0xEF, 0xA0, 0x4E, 0xEC, 0xDD, /* 0xE4-0xE7 */ + 0xA0, 0x4F, 0xA0, 0x50, 0xA0, 0x51, 0xA0, 0x52, /* 0xE8-0xEB */ + 0xA0, 0x53, 0xA0, 0x54, 0xDB, 0xC6, 0xA0, 0x55, /* 0xEC-0xEF */ + 0xA0, 0x56, 0xA0, 0x57, 0xA0, 0x58, 0xA0, 0x59, /* 0xF0-0xF3 */ + 0xA0, 0x5A, 0xA0, 0x5B, 0xA0, 0x5C, 0xA0, 0x5D, /* 0xF4-0xF7 */ + 0xA0, 0x5E, 0xEC, 0xDE, 0xA0, 0x5F, 0xA0, 0x60, /* 0xF8-0xFB */ + 0xA0, 0x61, 0xA0, 0x62, 0xA0, 0x63, 0xA0, 0x64, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_72[512] = { + 0xA0, 0x65, 0xA0, 0x66, 0xA0, 0x67, 0xA0, 0x68, /* 0x00-0x03 */ + 0xA0, 0x69, 0xA0, 0x6A, 0xB1, 0xAC, 0xA0, 0x6B, /* 0x04-0x07 */ + 0xA0, 0x6C, 0xA0, 0x6D, 0xA0, 0x6E, 0xA0, 0x6F, /* 0x08-0x0B */ + 0xA0, 0x70, 0xA0, 0x71, 0xA0, 0x72, 0xA0, 0x73, /* 0x0C-0x0F */ + 0xA0, 0x74, 0xA0, 0x75, 0xA0, 0x76, 0xA0, 0x77, /* 0x10-0x13 */ + 0xA0, 0x78, 0xA0, 0x79, 0xA0, 0x7A, 0xA0, 0x7B, /* 0x14-0x17 */ + 0xA0, 0x7C, 0xA0, 0x7D, 0xA0, 0x7E, 0xA0, 0x80, /* 0x18-0x1B */ + 0xA0, 0x81, 0xEC, 0xDF, 0xA0, 0x82, 0xA0, 0x83, /* 0x1C-0x1F */ + 0xA0, 0x84, 0xA0, 0x85, 0xA0, 0x86, 0xA0, 0x87, /* 0x20-0x23 */ + 0xA0, 0x88, 0xA0, 0x89, 0xA0, 0x8A, 0xA0, 0x8B, /* 0x24-0x27 */ + 0xEC, 0xE0, 0xA0, 0x8C, 0xD7, 0xA6, 0xA0, 0x8D, /* 0x28-0x2B */ + 0xC5, 0xC0, 0xA0, 0x8E, 0xA0, 0x8F, 0xA0, 0x90, /* 0x2C-0x2F */ + 0xEB, 0xBC, 0xB0, 0xAE, 0xA0, 0x91, 0xA0, 0x92, /* 0x30-0x33 */ + 0xA0, 0x93, 0xBE, 0xF4, 0xB8, 0xB8, 0xD2, 0xAF, /* 0x34-0x37 */ + 0xB0, 0xD6, 0xB5, 0xF9, 0xA0, 0x94, 0xD8, 0xB3, /* 0x38-0x3B */ + 0xA0, 0x95, 0xCB, 0xAC, 0xA0, 0x96, 0xE3, 0xDD, /* 0x3C-0x3F */ + 0xA0, 0x97, 0xA0, 0x98, 0xA0, 0x99, 0xA0, 0x9A, /* 0x40-0x43 */ + 0xA0, 0x9B, 0xA0, 0x9C, 0xA0, 0x9D, 0xC6, 0xAC, /* 0x44-0x47 */ + 0xB0, 0xE6, 0xA0, 0x9E, 0xA0, 0x9F, 0xA0, 0xA0, /* 0x48-0x4B */ + 0xC5, 0xC6, 0xEB, 0xB9, 0xA0, 0xA1, 0xA0, 0xA2, /* 0x4C-0x4F */ + 0xA0, 0xA3, 0xA0, 0xA4, 0xEB, 0xBA, 0xA0, 0xA5, /* 0x50-0x53 */ + 0xA0, 0xA6, 0xA0, 0xA7, 0xEB, 0xBB, 0xA0, 0xA8, /* 0x54-0x57 */ + 0xA0, 0xA9, 0xD1, 0xC0, 0xA0, 0xAA, 0xC5, 0xA3, /* 0x58-0x5B */ + 0xA0, 0xAB, 0xEA, 0xF2, 0xA0, 0xAC, 0xC4, 0xB2, /* 0x5C-0x5F */ + 0xA0, 0xAD, 0xC4, 0xB5, 0xC0, 0xCE, 0xA0, 0xAE, /* 0x60-0x63 */ + 0xA0, 0xAF, 0xA0, 0xB0, 0xEA, 0xF3, 0xC4, 0xC1, /* 0x64-0x67 */ + 0xA0, 0xB1, 0xCE, 0xEF, 0xA0, 0xB2, 0xA0, 0xB3, /* 0x68-0x6B */ + 0xA0, 0xB4, 0xA0, 0xB5, 0xEA, 0xF0, 0xEA, 0xF4, /* 0x6C-0x6F */ + 0xA0, 0xB6, 0xA0, 0xB7, 0xC9, 0xFC, 0xA0, 0xB8, /* 0x70-0x73 */ + 0xA0, 0xB9, 0xC7, 0xA3, 0xA0, 0xBA, 0xA0, 0xBB, /* 0x74-0x77 */ + 0xA0, 0xBC, 0xCC, 0xD8, 0xCE, 0xFE, 0xA0, 0xBD, /* 0x78-0x7B */ + 0xA0, 0xBE, 0xA0, 0xBF, 0xEA, 0xF5, 0xEA, 0xF6, /* 0x7C-0x7F */ + + 0xCF, 0xAC, 0xC0, 0xE7, 0xA0, 0xC0, 0xA0, 0xC1, /* 0x80-0x83 */ + 0xEA, 0xF7, 0xA0, 0xC2, 0xA0, 0xC3, 0xA0, 0xC4, /* 0x84-0x87 */ + 0xA0, 0xC5, 0xA0, 0xC6, 0xB6, 0xBF, 0xEA, 0xF8, /* 0x88-0x8B */ + 0xA0, 0xC7, 0xEA, 0xF9, 0xA0, 0xC8, 0xEA, 0xFA, /* 0x8C-0x8F */ + 0xA0, 0xC9, 0xA0, 0xCA, 0xEA, 0xFB, 0xA0, 0xCB, /* 0x90-0x93 */ + 0xA0, 0xCC, 0xA0, 0xCD, 0xA0, 0xCE, 0xA0, 0xCF, /* 0x94-0x97 */ + 0xA0, 0xD0, 0xA0, 0xD1, 0xA0, 0xD2, 0xA0, 0xD3, /* 0x98-0x9B */ + 0xA0, 0xD4, 0xA0, 0xD5, 0xA0, 0xD6, 0xEA, 0xF1, /* 0x9C-0x9F */ + 0xA0, 0xD7, 0xA0, 0xD8, 0xA0, 0xD9, 0xA0, 0xDA, /* 0xA0-0xA3 */ + 0xA0, 0xDB, 0xA0, 0xDC, 0xA0, 0xDD, 0xA0, 0xDE, /* 0xA4-0xA7 */ + 0xA0, 0xDF, 0xA0, 0xE0, 0xA0, 0xE1, 0xA0, 0xE2, /* 0xA8-0xAB */ + 0xC8, 0xAE, 0xE1, 0xEB, 0xA0, 0xE3, 0xB7, 0xB8, /* 0xAC-0xAF */ + 0xE1, 0xEC, 0xA0, 0xE4, 0xA0, 0xE5, 0xA0, 0xE6, /* 0xB0-0xB3 */ + 0xE1, 0xED, 0xA0, 0xE7, 0xD7, 0xB4, 0xE1, 0xEE, /* 0xB4-0xB7 */ + 0xE1, 0xEF, 0xD3, 0xCC, 0xA0, 0xE8, 0xA0, 0xE9, /* 0xB8-0xBB */ + 0xA0, 0xEA, 0xA0, 0xEB, 0xA0, 0xEC, 0xA0, 0xED, /* 0xBC-0xBF */ + 0xA0, 0xEE, 0xE1, 0xF1, 0xBF, 0xF1, 0xE1, 0xF0, /* 0xC0-0xC3 */ + 0xB5, 0xD2, 0xA0, 0xEF, 0xA0, 0xF0, 0xA0, 0xF1, /* 0xC4-0xC7 */ + 0xB1, 0xB7, 0xA0, 0xF2, 0xA0, 0xF3, 0xA0, 0xF4, /* 0xC8-0xCB */ + 0xA0, 0xF5, 0xE1, 0xF3, 0xE1, 0xF2, 0xA0, 0xF6, /* 0xCC-0xCF */ + 0xBA, 0xFC, 0xA0, 0xF7, 0xE1, 0xF4, 0xA0, 0xF8, /* 0xD0-0xD3 */ + 0xA0, 0xF9, 0xA0, 0xFA, 0xA0, 0xFB, 0xB9, 0xB7, /* 0xD4-0xD7 */ + 0xA0, 0xFC, 0xBE, 0xD1, 0xA0, 0xFD, 0xA0, 0xFE, /* 0xD8-0xDB */ + 0xAA, 0x40, 0xAA, 0x41, 0xC4, 0xFC, 0xAA, 0x42, /* 0xDC-0xDF */ + 0xBA, 0xDD, 0xBD, 0xC6, 0xAA, 0x43, 0xAA, 0x44, /* 0xE0-0xE3 */ + 0xAA, 0x45, 0xAA, 0x46, 0xAA, 0x47, 0xAA, 0x48, /* 0xE4-0xE7 */ + 0xE1, 0xF5, 0xE1, 0xF7, 0xAA, 0x49, 0xAA, 0x4A, /* 0xE8-0xEB */ + 0xB6, 0xC0, 0xCF, 0xC1, 0xCA, 0xA8, 0xE1, 0xF6, /* 0xEC-0xEF */ + 0xD5, 0xF8, 0xD3, 0xFC, 0xE1, 0xF8, 0xE1, 0xFC, /* 0xF0-0xF3 */ + 0xE1, 0xF9, 0xAA, 0x4B, 0xAA, 0x4C, 0xE1, 0xFA, /* 0xF4-0xF7 */ + 0xC0, 0xEA, 0xAA, 0x4D, 0xE1, 0xFE, 0xE2, 0xA1, /* 0xF8-0xFB */ + 0xC0, 0xC7, 0xAA, 0x4E, 0xAA, 0x4F, 0xAA, 0x50, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_73[512] = { + 0xAA, 0x51, 0xE1, 0xFB, 0xAA, 0x52, 0xE1, 0xFD, /* 0x00-0x03 */ + 0xAA, 0x53, 0xAA, 0x54, 0xAA, 0x55, 0xAA, 0x56, /* 0x04-0x07 */ + 0xAA, 0x57, 0xAA, 0x58, 0xE2, 0xA5, 0xAA, 0x59, /* 0x08-0x0B */ + 0xAA, 0x5A, 0xAA, 0x5B, 0xC1, 0xD4, 0xAA, 0x5C, /* 0x0C-0x0F */ + 0xAA, 0x5D, 0xAA, 0x5E, 0xAA, 0x5F, 0xE2, 0xA3, /* 0x10-0x13 */ + 0xAA, 0x60, 0xE2, 0xA8, 0xB2, 0xFE, 0xE2, 0xA2, /* 0x14-0x17 */ + 0xAA, 0x61, 0xAA, 0x62, 0xAA, 0x63, 0xC3, 0xCD, /* 0x18-0x1B */ + 0xB2, 0xC2, 0xE2, 0xA7, 0xE2, 0xA6, 0xAA, 0x64, /* 0x1C-0x1F */ + 0xAA, 0x65, 0xE2, 0xA4, 0xE2, 0xA9, 0xAA, 0x66, /* 0x20-0x23 */ + 0xAA, 0x67, 0xE2, 0xAB, 0xAA, 0x68, 0xAA, 0x69, /* 0x24-0x27 */ + 0xAA, 0x6A, 0xD0, 0xC9, 0xD6, 0xED, 0xC3, 0xA8, /* 0x28-0x2B */ + 0xE2, 0xAC, 0xAA, 0x6B, 0xCF, 0xD7, 0xAA, 0x6C, /* 0x2C-0x2F */ + 0xAA, 0x6D, 0xE2, 0xAE, 0xAA, 0x6E, 0xAA, 0x6F, /* 0x30-0x33 */ + 0xBA, 0xEF, 0xAA, 0x70, 0xAA, 0x71, 0xE9, 0xE0, /* 0x34-0x37 */ + 0xE2, 0xAD, 0xE2, 0xAA, 0xAA, 0x72, 0xAA, 0x73, /* 0x38-0x3B */ + 0xAA, 0x74, 0xAA, 0x75, 0xBB, 0xAB, 0xD4, 0xB3, /* 0x3C-0x3F */ + 0xAA, 0x76, 0xAA, 0x77, 0xAA, 0x78, 0xAA, 0x79, /* 0x40-0x43 */ + 0xAA, 0x7A, 0xAA, 0x7B, 0xAA, 0x7C, 0xAA, 0x7D, /* 0x44-0x47 */ + 0xAA, 0x7E, 0xAA, 0x80, 0xAA, 0x81, 0xAA, 0x82, /* 0x48-0x4B */ + 0xAA, 0x83, 0xE2, 0xB0, 0xAA, 0x84, 0xAA, 0x85, /* 0x4C-0x4F */ + 0xE2, 0xAF, 0xAA, 0x86, 0xE9, 0xE1, 0xAA, 0x87, /* 0x50-0x53 */ + 0xAA, 0x88, 0xAA, 0x89, 0xAA, 0x8A, 0xE2, 0xB1, /* 0x54-0x57 */ + 0xAA, 0x8B, 0xAA, 0x8C, 0xAA, 0x8D, 0xAA, 0x8E, /* 0x58-0x5B */ + 0xAA, 0x8F, 0xAA, 0x90, 0xAA, 0x91, 0xAA, 0x92, /* 0x5C-0x5F */ + 0xE2, 0xB2, 0xAA, 0x93, 0xAA, 0x94, 0xAA, 0x95, /* 0x60-0x63 */ + 0xAA, 0x96, 0xAA, 0x97, 0xAA, 0x98, 0xAA, 0x99, /* 0x64-0x67 */ + 0xAA, 0x9A, 0xAA, 0x9B, 0xAA, 0x9C, 0xAA, 0x9D, /* 0x68-0x6B */ + 0xE2, 0xB3, 0xCC, 0xA1, 0xAA, 0x9E, 0xE2, 0xB4, /* 0x6C-0x6F */ + 0xAA, 0x9F, 0xAA, 0xA0, 0xAB, 0x40, 0xAB, 0x41, /* 0x70-0x73 */ + 0xAB, 0x42, 0xAB, 0x43, 0xAB, 0x44, 0xAB, 0x45, /* 0x74-0x77 */ + 0xAB, 0x46, 0xAB, 0x47, 0xAB, 0x48, 0xAB, 0x49, /* 0x78-0x7B */ + 0xAB, 0x4A, 0xAB, 0x4B, 0xE2, 0xB5, 0xAB, 0x4C, /* 0x7C-0x7F */ + + 0xAB, 0x4D, 0xAB, 0x4E, 0xAB, 0x4F, 0xAB, 0x50, /* 0x80-0x83 */ + 0xD0, 0xFE, 0xAB, 0x51, 0xAB, 0x52, 0xC2, 0xCA, /* 0x84-0x87 */ + 0xAB, 0x53, 0xD3, 0xF1, 0xAB, 0x54, 0xCD, 0xF5, /* 0x88-0x8B */ + 0xAB, 0x55, 0xAB, 0x56, 0xE7, 0xE0, 0xAB, 0x57, /* 0x8C-0x8F */ + 0xAB, 0x58, 0xE7, 0xE1, 0xAB, 0x59, 0xAB, 0x5A, /* 0x90-0x93 */ + 0xAB, 0x5B, 0xAB, 0x5C, 0xBE, 0xC1, 0xAB, 0x5D, /* 0x94-0x97 */ + 0xAB, 0x5E, 0xAB, 0x5F, 0xAB, 0x60, 0xC2, 0xEA, /* 0x98-0x9B */ + 0xAB, 0x61, 0xAB, 0x62, 0xAB, 0x63, 0xE7, 0xE4, /* 0x9C-0x9F */ + 0xAB, 0x64, 0xAB, 0x65, 0xE7, 0xE3, 0xAB, 0x66, /* 0xA0-0xA3 */ + 0xAB, 0x67, 0xAB, 0x68, 0xAB, 0x69, 0xAB, 0x6A, /* 0xA4-0xA7 */ + 0xAB, 0x6B, 0xCD, 0xE6, 0xAB, 0x6C, 0xC3, 0xB5, /* 0xA8-0xAB */ + 0xAB, 0x6D, 0xAB, 0x6E, 0xE7, 0xE2, 0xBB, 0xB7, /* 0xAC-0xAF */ + 0xCF, 0xD6, 0xAB, 0x6F, 0xC1, 0xE1, 0xE7, 0xE9, /* 0xB0-0xB3 */ + 0xAB, 0x70, 0xAB, 0x71, 0xAB, 0x72, 0xE7, 0xE8, /* 0xB4-0xB7 */ + 0xAB, 0x73, 0xAB, 0x74, 0xE7, 0xF4, 0xB2, 0xA3, /* 0xB8-0xBB */ + 0xAB, 0x75, 0xAB, 0x76, 0xAB, 0x77, 0xAB, 0x78, /* 0xBC-0xBF */ + 0xE7, 0xEA, 0xAB, 0x79, 0xE7, 0xE6, 0xAB, 0x7A, /* 0xC0-0xC3 */ + 0xAB, 0x7B, 0xAB, 0x7C, 0xAB, 0x7D, 0xAB, 0x7E, /* 0xC4-0xC7 */ + 0xE7, 0xEC, 0xE7, 0xEB, 0xC9, 0xBA, 0xAB, 0x80, /* 0xC8-0xCB */ + 0xAB, 0x81, 0xD5, 0xE4, 0xAB, 0x82, 0xE7, 0xE5, /* 0xCC-0xCF */ + 0xB7, 0xA9, 0xE7, 0xE7, 0xAB, 0x83, 0xAB, 0x84, /* 0xD0-0xD3 */ + 0xAB, 0x85, 0xAB, 0x86, 0xAB, 0x87, 0xAB, 0x88, /* 0xD4-0xD7 */ + 0xAB, 0x89, 0xE7, 0xEE, 0xAB, 0x8A, 0xAB, 0x8B, /* 0xD8-0xDB */ + 0xAB, 0x8C, 0xAB, 0x8D, 0xE7, 0xF3, 0xAB, 0x8E, /* 0xDC-0xDF */ + 0xD6, 0xE9, 0xAB, 0x8F, 0xAB, 0x90, 0xAB, 0x91, /* 0xE0-0xE3 */ + 0xAB, 0x92, 0xE7, 0xED, 0xAB, 0x93, 0xE7, 0xF2, /* 0xE4-0xE7 */ + 0xAB, 0x94, 0xE7, 0xF1, 0xAB, 0x95, 0xAB, 0x96, /* 0xE8-0xEB */ + 0xAB, 0x97, 0xB0, 0xE0, 0xAB, 0x98, 0xAB, 0x99, /* 0xEC-0xEF */ + 0xAB, 0x9A, 0xAB, 0x9B, 0xE7, 0xF5, 0xAB, 0x9C, /* 0xF0-0xF3 */ + 0xAB, 0x9D, 0xAB, 0x9E, 0xAB, 0x9F, 0xAB, 0xA0, /* 0xF4-0xF7 */ + 0xAC, 0x40, 0xAC, 0x41, 0xAC, 0x42, 0xAC, 0x43, /* 0xF8-0xFB */ + 0xAC, 0x44, 0xAC, 0x45, 0xAC, 0x46, 0xAC, 0x47, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_74[512] = { + 0xAC, 0x48, 0xAC, 0x49, 0xAC, 0x4A, 0xC7, 0xF2, /* 0x00-0x03 */ + 0xAC, 0x4B, 0xC0, 0xC5, 0xC0, 0xED, 0xAC, 0x4C, /* 0x04-0x07 */ + 0xAC, 0x4D, 0xC1, 0xF0, 0xE7, 0xF0, 0xAC, 0x4E, /* 0x08-0x0B */ + 0xAC, 0x4F, 0xAC, 0x50, 0xAC, 0x51, 0xE7, 0xF6, /* 0x0C-0x0F */ + 0xCB, 0xF6, 0xAC, 0x52, 0xAC, 0x53, 0xAC, 0x54, /* 0x10-0x13 */ + 0xAC, 0x55, 0xAC, 0x56, 0xAC, 0x57, 0xAC, 0x58, /* 0x14-0x17 */ + 0xAC, 0x59, 0xAC, 0x5A, 0xE8, 0xA2, 0xE8, 0xA1, /* 0x18-0x1B */ + 0xAC, 0x5B, 0xAC, 0x5C, 0xAC, 0x5D, 0xAC, 0x5E, /* 0x1C-0x1F */ + 0xAC, 0x5F, 0xAC, 0x60, 0xD7, 0xC1, 0xAC, 0x61, /* 0x20-0x23 */ + 0xAC, 0x62, 0xE7, 0xFA, 0xE7, 0xF9, 0xAC, 0x63, /* 0x24-0x27 */ + 0xE7, 0xFB, 0xAC, 0x64, 0xE7, 0xF7, 0xAC, 0x65, /* 0x28-0x2B */ + 0xE7, 0xFE, 0xAC, 0x66, 0xE7, 0xFD, 0xAC, 0x67, /* 0x2C-0x2F */ + 0xE7, 0xFC, 0xAC, 0x68, 0xAC, 0x69, 0xC1, 0xD5, /* 0x30-0x33 */ + 0xC7, 0xD9, 0xC5, 0xFD, 0xC5, 0xC3, 0xAC, 0x6A, /* 0x34-0x37 */ + 0xAC, 0x6B, 0xAC, 0x6C, 0xAC, 0x6D, 0xAC, 0x6E, /* 0x38-0x3B */ + 0xC7, 0xED, 0xAC, 0x6F, 0xAC, 0x70, 0xAC, 0x71, /* 0x3C-0x3F */ + 0xAC, 0x72, 0xE8, 0xA3, 0xAC, 0x73, 0xAC, 0x74, /* 0x40-0x43 */ + 0xAC, 0x75, 0xAC, 0x76, 0xAC, 0x77, 0xAC, 0x78, /* 0x44-0x47 */ + 0xAC, 0x79, 0xAC, 0x7A, 0xAC, 0x7B, 0xAC, 0x7C, /* 0x48-0x4B */ + 0xAC, 0x7D, 0xAC, 0x7E, 0xAC, 0x80, 0xAC, 0x81, /* 0x4C-0x4F */ + 0xAC, 0x82, 0xAC, 0x83, 0xAC, 0x84, 0xAC, 0x85, /* 0x50-0x53 */ + 0xAC, 0x86, 0xE8, 0xA6, 0xAC, 0x87, 0xE8, 0xA5, /* 0x54-0x57 */ + 0xAC, 0x88, 0xE8, 0xA7, 0xBA, 0xF7, 0xE7, 0xF8, /* 0x58-0x5B */ + 0xE8, 0xA4, 0xAC, 0x89, 0xC8, 0xF0, 0xC9, 0xAA, /* 0x5C-0x5F */ + 0xAC, 0x8A, 0xAC, 0x8B, 0xAC, 0x8C, 0xAC, 0x8D, /* 0x60-0x63 */ + 0xAC, 0x8E, 0xAC, 0x8F, 0xAC, 0x90, 0xAC, 0x91, /* 0x64-0x67 */ + 0xAC, 0x92, 0xAC, 0x93, 0xAC, 0x94, 0xAC, 0x95, /* 0x68-0x6B */ + 0xAC, 0x96, 0xE8, 0xA9, 0xAC, 0x97, 0xAC, 0x98, /* 0x6C-0x6F */ + 0xB9, 0xE5, 0xAC, 0x99, 0xAC, 0x9A, 0xAC, 0x9B, /* 0x70-0x73 */ + 0xAC, 0x9C, 0xAC, 0x9D, 0xD1, 0xFE, 0xE8, 0xA8, /* 0x74-0x77 */ + 0xAC, 0x9E, 0xAC, 0x9F, 0xAC, 0xA0, 0xAD, 0x40, /* 0x78-0x7B */ + 0xAD, 0x41, 0xAD, 0x42, 0xE8, 0xAA, 0xAD, 0x43, /* 0x7C-0x7F */ + + 0xE8, 0xAD, 0xE8, 0xAE, 0xAD, 0x44, 0xC1, 0xA7, /* 0x80-0x83 */ + 0xAD, 0x45, 0xAD, 0x46, 0xAD, 0x47, 0xE8, 0xAF, /* 0x84-0x87 */ + 0xAD, 0x48, 0xAD, 0x49, 0xAD, 0x4A, 0xE8, 0xB0, /* 0x88-0x8B */ + 0xAD, 0x4B, 0xAD, 0x4C, 0xE8, 0xAC, 0xAD, 0x4D, /* 0x8C-0x8F */ + 0xE8, 0xB4, 0xAD, 0x4E, 0xAD, 0x4F, 0xAD, 0x50, /* 0x90-0x93 */ + 0xAD, 0x51, 0xAD, 0x52, 0xAD, 0x53, 0xAD, 0x54, /* 0x94-0x97 */ + 0xAD, 0x55, 0xAD, 0x56, 0xAD, 0x57, 0xAD, 0x58, /* 0x98-0x9B */ + 0xE8, 0xAB, 0xAD, 0x59, 0xE8, 0xB1, 0xAD, 0x5A, /* 0x9C-0x9F */ + 0xAD, 0x5B, 0xAD, 0x5C, 0xAD, 0x5D, 0xAD, 0x5E, /* 0xA0-0xA3 */ + 0xAD, 0x5F, 0xAD, 0x60, 0xAD, 0x61, 0xE8, 0xB5, /* 0xA4-0xA7 */ + 0xE8, 0xB2, 0xE8, 0xB3, 0xAD, 0x62, 0xAD, 0x63, /* 0xA8-0xAB */ + 0xAD, 0x64, 0xAD, 0x65, 0xAD, 0x66, 0xAD, 0x67, /* 0xAC-0xAF */ + 0xAD, 0x68, 0xAD, 0x69, 0xAD, 0x6A, 0xAD, 0x6B, /* 0xB0-0xB3 */ + 0xAD, 0x6C, 0xAD, 0x6D, 0xAD, 0x6E, 0xAD, 0x6F, /* 0xB4-0xB7 */ + 0xAD, 0x70, 0xAD, 0x71, 0xE8, 0xB7, 0xAD, 0x72, /* 0xB8-0xBB */ + 0xAD, 0x73, 0xAD, 0x74, 0xAD, 0x75, 0xAD, 0x76, /* 0xBC-0xBF */ + 0xAD, 0x77, 0xAD, 0x78, 0xAD, 0x79, 0xAD, 0x7A, /* 0xC0-0xC3 */ + 0xAD, 0x7B, 0xAD, 0x7C, 0xAD, 0x7D, 0xAD, 0x7E, /* 0xC4-0xC7 */ + 0xAD, 0x80, 0xAD, 0x81, 0xAD, 0x82, 0xAD, 0x83, /* 0xC8-0xCB */ + 0xAD, 0x84, 0xAD, 0x85, 0xAD, 0x86, 0xAD, 0x87, /* 0xCC-0xCF */ + 0xAD, 0x88, 0xAD, 0x89, 0xE8, 0xB6, 0xAD, 0x8A, /* 0xD0-0xD3 */ + 0xAD, 0x8B, 0xAD, 0x8C, 0xAD, 0x8D, 0xAD, 0x8E, /* 0xD4-0xD7 */ + 0xAD, 0x8F, 0xAD, 0x90, 0xAD, 0x91, 0xAD, 0x92, /* 0xD8-0xDB */ + 0xB9, 0xCF, 0xAD, 0x93, 0xF0, 0xAC, 0xAD, 0x94, /* 0xDC-0xDF */ + 0xF0, 0xAD, 0xAD, 0x95, 0xC6, 0xB0, 0xB0, 0xEA, /* 0xE0-0xE3 */ + 0xC8, 0xBF, 0xAD, 0x96, 0xCD, 0xDF, 0xAD, 0x97, /* 0xE4-0xE7 */ + 0xAD, 0x98, 0xAD, 0x99, 0xAD, 0x9A, 0xAD, 0x9B, /* 0xE8-0xEB */ + 0xAD, 0x9C, 0xAD, 0x9D, 0xCE, 0xCD, 0xEA, 0xB1, /* 0xEC-0xEF */ + 0xAD, 0x9E, 0xAD, 0x9F, 0xAD, 0xA0, 0xAE, 0x40, /* 0xF0-0xF3 */ + 0xEA, 0xB2, 0xAE, 0x41, 0xC6, 0xBF, 0xB4, 0xC9, /* 0xF4-0xF7 */ + 0xAE, 0x42, 0xAE, 0x43, 0xAE, 0x44, 0xAE, 0x45, /* 0xF8-0xFB */ + 0xAE, 0x46, 0xAE, 0x47, 0xAE, 0x48, 0xEA, 0xB3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_75[512] = { + 0xAE, 0x49, 0xAE, 0x4A, 0xAE, 0x4B, 0xAE, 0x4C, /* 0x00-0x03 */ + 0xD5, 0xE7, 0xAE, 0x4D, 0xAE, 0x4E, 0xAE, 0x4F, /* 0x04-0x07 */ + 0xAE, 0x50, 0xAE, 0x51, 0xAE, 0x52, 0xAE, 0x53, /* 0x08-0x0B */ + 0xAE, 0x54, 0xDD, 0xF9, 0xAE, 0x55, 0xEA, 0xB4, /* 0x0C-0x0F */ + 0xAE, 0x56, 0xEA, 0xB5, 0xAE, 0x57, 0xEA, 0xB6, /* 0x10-0x13 */ + 0xAE, 0x58, 0xAE, 0x59, 0xAE, 0x5A, 0xAE, 0x5B, /* 0x14-0x17 */ + 0xB8, 0xCA, 0xDF, 0xB0, 0xC9, 0xF5, 0xAE, 0x5C, /* 0x18-0x1B */ + 0xCC, 0xF0, 0xAE, 0x5D, 0xAE, 0x5E, 0xC9, 0xFA, /* 0x1C-0x1F */ + 0xAE, 0x5F, 0xAE, 0x60, 0xAE, 0x61, 0xAE, 0x62, /* 0x20-0x23 */ + 0xAE, 0x63, 0xC9, 0xFB, 0xAE, 0x64, 0xAE, 0x65, /* 0x24-0x27 */ + 0xD3, 0xC3, 0xCB, 0xA6, 0xAE, 0x66, 0xB8, 0xA6, /* 0x28-0x2B */ + 0xF0, 0xAE, 0xB1, 0xC2, 0xAE, 0x67, 0xE5, 0xB8, /* 0x2C-0x2F */ + 0xCC, 0xEF, 0xD3, 0xC9, 0xBC, 0xD7, 0xC9, 0xEA, /* 0x30-0x33 */ + 0xAE, 0x68, 0xB5, 0xE7, 0xAE, 0x69, 0xC4, 0xD0, /* 0x34-0x37 */ + 0xB5, 0xE9, 0xAE, 0x6A, 0xEE, 0xAE, 0xBB, 0xAD, /* 0x38-0x3B */ + 0xAE, 0x6B, 0xAE, 0x6C, 0xE7, 0xDE, 0xAE, 0x6D, /* 0x3C-0x3F */ + 0xEE, 0xAF, 0xAE, 0x6E, 0xAE, 0x6F, 0xAE, 0x70, /* 0x40-0x43 */ + 0xAE, 0x71, 0xB3, 0xA9, 0xAE, 0x72, 0xAE, 0x73, /* 0x44-0x47 */ + 0xEE, 0xB2, 0xAE, 0x74, 0xAE, 0x75, 0xEE, 0xB1, /* 0x48-0x4B */ + 0xBD, 0xE7, 0xAE, 0x76, 0xEE, 0xB0, 0xCE, 0xB7, /* 0x4C-0x4F */ + 0xAE, 0x77, 0xAE, 0x78, 0xAE, 0x79, 0xAE, 0x7A, /* 0x50-0x53 */ + 0xC5, 0xCF, 0xAE, 0x7B, 0xAE, 0x7C, 0xAE, 0x7D, /* 0x54-0x57 */ + 0xAE, 0x7E, 0xC1, 0xF4, 0xDB, 0xCE, 0xEE, 0xB3, /* 0x58-0x5B */ + 0xD0, 0xF3, 0xAE, 0x80, 0xAE, 0x81, 0xAE, 0x82, /* 0x5C-0x5F */ + 0xAE, 0x83, 0xAE, 0x84, 0xAE, 0x85, 0xAE, 0x86, /* 0x60-0x63 */ + 0xAE, 0x87, 0xC2, 0xD4, 0xC6, 0xE8, 0xAE, 0x88, /* 0x64-0x67 */ + 0xAE, 0x89, 0xAE, 0x8A, 0xB7, 0xAC, 0xAE, 0x8B, /* 0x68-0x6B */ + 0xAE, 0x8C, 0xAE, 0x8D, 0xAE, 0x8E, 0xAE, 0x8F, /* 0x6C-0x6F */ + 0xAE, 0x90, 0xAE, 0x91, 0xEE, 0xB4, 0xAE, 0x92, /* 0x70-0x73 */ + 0xB3, 0xEB, 0xAE, 0x93, 0xAE, 0x94, 0xAE, 0x95, /* 0x74-0x77 */ + 0xBB, 0xFB, 0xEE, 0xB5, 0xAE, 0x96, 0xAE, 0x97, /* 0x78-0x7B */ + 0xAE, 0x98, 0xAE, 0x99, 0xAE, 0x9A, 0xE7, 0xDC, /* 0x7C-0x7F */ + + 0xAE, 0x9B, 0xAE, 0x9C, 0xAE, 0x9D, 0xEE, 0xB6, /* 0x80-0x83 */ + 0xAE, 0x9E, 0xAE, 0x9F, 0xBD, 0xAE, 0xAE, 0xA0, /* 0x84-0x87 */ + 0xAF, 0x40, 0xAF, 0x41, 0xAF, 0x42, 0xF1, 0xE2, /* 0x88-0x8B */ + 0xAF, 0x43, 0xAF, 0x44, 0xAF, 0x45, 0xCA, 0xE8, /* 0x8C-0x8F */ + 0xAF, 0x46, 0xD2, 0xC9, 0xF0, 0xDA, 0xAF, 0x47, /* 0x90-0x93 */ + 0xF0, 0xDB, 0xAF, 0x48, 0xF0, 0xDC, 0xC1, 0xC6, /* 0x94-0x97 */ + 0xAF, 0x49, 0xB8, 0xED, 0xBE, 0xCE, 0xAF, 0x4A, /* 0x98-0x9B */ + 0xAF, 0x4B, 0xF0, 0xDE, 0xAF, 0x4C, 0xC5, 0xB1, /* 0x9C-0x9F */ + 0xF0, 0xDD, 0xD1, 0xF1, 0xAF, 0x4D, 0xF0, 0xE0, /* 0xA0-0xA3 */ + 0xB0, 0xCC, 0xBD, 0xEA, 0xAF, 0x4E, 0xAF, 0x4F, /* 0xA4-0xA7 */ + 0xAF, 0x50, 0xAF, 0x51, 0xAF, 0x52, 0xD2, 0xDF, /* 0xA8-0xAB */ + 0xF0, 0xDF, 0xAF, 0x53, 0xB4, 0xAF, 0xB7, 0xE8, /* 0xAC-0xAF */ + 0xF0, 0xE6, 0xF0, 0xE5, 0xC6, 0xA3, 0xF0, 0xE1, /* 0xB0-0xB3 */ + 0xF0, 0xE2, 0xB4, 0xC3, 0xAF, 0x54, 0xAF, 0x55, /* 0xB4-0xB7 */ + 0xF0, 0xE3, 0xD5, 0xEE, 0xAF, 0x56, 0xAF, 0x57, /* 0xB8-0xBB */ + 0xCC, 0xDB, 0xBE, 0xD2, 0xBC, 0xB2, 0xAF, 0x58, /* 0xBC-0xBF */ + 0xAF, 0x59, 0xAF, 0x5A, 0xF0, 0xE8, 0xF0, 0xE7, /* 0xC0-0xC3 */ + 0xF0, 0xE4, 0xB2, 0xA1, 0xAF, 0x5B, 0xD6, 0xA2, /* 0xC4-0xC7 */ + 0xD3, 0xB8, 0xBE, 0xB7, 0xC8, 0xAC, 0xAF, 0x5C, /* 0xC8-0xCB */ + 0xAF, 0x5D, 0xF0, 0xEA, 0xAF, 0x5E, 0xAF, 0x5F, /* 0xCC-0xCF */ + 0xAF, 0x60, 0xAF, 0x61, 0xD1, 0xF7, 0xAF, 0x62, /* 0xD0-0xD3 */ + 0xD6, 0xCC, 0xBA, 0xDB, 0xF0, 0xE9, 0xAF, 0x63, /* 0xD4-0xD7 */ + 0xB6, 0xBB, 0xAF, 0x64, 0xAF, 0x65, 0xCD, 0xB4, /* 0xD8-0xDB */ + 0xAF, 0x66, 0xAF, 0x67, 0xC6, 0xA6, 0xAF, 0x68, /* 0xDC-0xDF */ + 0xAF, 0x69, 0xAF, 0x6A, 0xC1, 0xA1, 0xF0, 0xEB, /* 0xE0-0xE3 */ + 0xF0, 0xEE, 0xAF, 0x6B, 0xF0, 0xED, 0xF0, 0xF0, /* 0xE4-0xE7 */ + 0xF0, 0xEC, 0xAF, 0x6C, 0xBB, 0xBE, 0xF0, 0xEF, /* 0xE8-0xEB */ + 0xAF, 0x6D, 0xAF, 0x6E, 0xAF, 0x6F, 0xAF, 0x70, /* 0xEC-0xEF */ + 0xCC, 0xB5, 0xF0, 0xF2, 0xAF, 0x71, 0xAF, 0x72, /* 0xF0-0xF3 */ + 0xB3, 0xD5, 0xAF, 0x73, 0xAF, 0x74, 0xAF, 0x75, /* 0xF4-0xF7 */ + 0xAF, 0x76, 0xB1, 0xD4, 0xAF, 0x77, 0xAF, 0x78, /* 0xF8-0xFB */ + 0xF0, 0xF3, 0xAF, 0x79, 0xAF, 0x7A, 0xF0, 0xF4, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_76[512] = { + 0xF0, 0xF6, 0xB4, 0xE1, 0xAF, 0x7B, 0xF0, 0xF1, /* 0x00-0x03 */ + 0xAF, 0x7C, 0xF0, 0xF7, 0xAF, 0x7D, 0xAF, 0x7E, /* 0x04-0x07 */ + 0xAF, 0x80, 0xAF, 0x81, 0xF0, 0xFA, 0xAF, 0x82, /* 0x08-0x0B */ + 0xF0, 0xF8, 0xAF, 0x83, 0xAF, 0x84, 0xAF, 0x85, /* 0x0C-0x0F */ + 0xF0, 0xF5, 0xAF, 0x86, 0xAF, 0x87, 0xAF, 0x88, /* 0x10-0x13 */ + 0xAF, 0x89, 0xF0, 0xFD, 0xAF, 0x8A, 0xF0, 0xF9, /* 0x14-0x17 */ + 0xF0, 0xFC, 0xF0, 0xFE, 0xAF, 0x8B, 0xF1, 0xA1, /* 0x18-0x1B */ + 0xAF, 0x8C, 0xAF, 0x8D, 0xAF, 0x8E, 0xCE, 0xC1, /* 0x1C-0x1F */ + 0xF1, 0xA4, 0xAF, 0x8F, 0xF1, 0xA3, 0xAF, 0x90, /* 0x20-0x23 */ + 0xC1, 0xF6, 0xF0, 0xFB, 0xCA, 0xDD, 0xAF, 0x91, /* 0x24-0x27 */ + 0xAF, 0x92, 0xB4, 0xF1, 0xB1, 0xF1, 0xCC, 0xB1, /* 0x28-0x2B */ + 0xAF, 0x93, 0xF1, 0xA6, 0xAF, 0x94, 0xAF, 0x95, /* 0x2C-0x2F */ + 0xF1, 0xA7, 0xAF, 0x96, 0xAF, 0x97, 0xF1, 0xAC, /* 0x30-0x33 */ + 0xD5, 0xCE, 0xF1, 0xA9, 0xAF, 0x98, 0xAF, 0x99, /* 0x34-0x37 */ + 0xC8, 0xB3, 0xAF, 0x9A, 0xAF, 0x9B, 0xAF, 0x9C, /* 0x38-0x3B */ + 0xF1, 0xA2, 0xAF, 0x9D, 0xF1, 0xAB, 0xF1, 0xA8, /* 0x3C-0x3F */ + 0xF1, 0xA5, 0xAF, 0x9E, 0xAF, 0x9F, 0xF1, 0xAA, /* 0x40-0x43 */ + 0xAF, 0xA0, 0xB0, 0x40, 0xB0, 0x41, 0xB0, 0x42, /* 0x44-0x47 */ + 0xB0, 0x43, 0xB0, 0x44, 0xB0, 0x45, 0xB0, 0x46, /* 0x48-0x4B */ + 0xB0, 0xA9, 0xF1, 0xAD, 0xB0, 0x47, 0xB0, 0x48, /* 0x4C-0x4F */ + 0xB0, 0x49, 0xB0, 0x4A, 0xB0, 0x4B, 0xB0, 0x4C, /* 0x50-0x53 */ + 0xF1, 0xAF, 0xB0, 0x4D, 0xF1, 0xB1, 0xB0, 0x4E, /* 0x54-0x57 */ + 0xB0, 0x4F, 0xB0, 0x50, 0xB0, 0x51, 0xB0, 0x52, /* 0x58-0x5B */ + 0xF1, 0xB0, 0xB0, 0x53, 0xF1, 0xAE, 0xB0, 0x54, /* 0x5C-0x5F */ + 0xB0, 0x55, 0xB0, 0x56, 0xB0, 0x57, 0xD1, 0xA2, /* 0x60-0x63 */ + 0xB0, 0x58, 0xB0, 0x59, 0xB0, 0x5A, 0xB0, 0x5B, /* 0x64-0x67 */ + 0xB0, 0x5C, 0xB0, 0x5D, 0xB0, 0x5E, 0xF1, 0xB2, /* 0x68-0x6B */ + 0xB0, 0x5F, 0xB0, 0x60, 0xB0, 0x61, 0xF1, 0xB3, /* 0x6C-0x6F */ + 0xB0, 0x62, 0xB0, 0x63, 0xB0, 0x64, 0xB0, 0x65, /* 0x70-0x73 */ + 0xB0, 0x66, 0xB0, 0x67, 0xB0, 0x68, 0xB0, 0x69, /* 0x74-0x77 */ + 0xB9, 0xEF, 0xB0, 0x6A, 0xB0, 0x6B, 0xB5, 0xC7, /* 0x78-0x7B */ + 0xB0, 0x6C, 0xB0, 0xD7, 0xB0, 0xD9, 0xB0, 0x6D, /* 0x7C-0x7F */ + + 0xB0, 0x6E, 0xB0, 0x6F, 0xD4, 0xED, 0xB0, 0x70, /* 0x80-0x83 */ + 0xB5, 0xC4, 0xB0, 0x71, 0xBD, 0xD4, 0xBB, 0xCA, /* 0x84-0x87 */ + 0xF0, 0xA7, 0xB0, 0x72, 0xB0, 0x73, 0xB8, 0xDE, /* 0x88-0x8B */ + 0xB0, 0x74, 0xB0, 0x75, 0xF0, 0xA8, 0xB0, 0x76, /* 0x8C-0x8F */ + 0xB0, 0x77, 0xB0, 0xA8, 0xB0, 0x78, 0xF0, 0xA9, /* 0x90-0x93 */ + 0xB0, 0x79, 0xB0, 0x7A, 0xCD, 0xEE, 0xB0, 0x7B, /* 0x94-0x97 */ + 0xB0, 0x7C, 0xF0, 0xAA, 0xB0, 0x7D, 0xB0, 0x7E, /* 0x98-0x9B */ + 0xB0, 0x80, 0xB0, 0x81, 0xB0, 0x82, 0xB0, 0x83, /* 0x9C-0x9F */ + 0xB0, 0x84, 0xB0, 0x85, 0xB0, 0x86, 0xB0, 0x87, /* 0xA0-0xA3 */ + 0xF0, 0xAB, 0xB0, 0x88, 0xB0, 0x89, 0xB0, 0x8A, /* 0xA4-0xA7 */ + 0xB0, 0x8B, 0xB0, 0x8C, 0xB0, 0x8D, 0xB0, 0x8E, /* 0xA8-0xAB */ + 0xB0, 0x8F, 0xB0, 0x90, 0xC6, 0xA4, 0xB0, 0x91, /* 0xAC-0xAF */ + 0xB0, 0x92, 0xD6, 0xE5, 0xF1, 0xE4, 0xB0, 0x93, /* 0xB0-0xB3 */ + 0xF1, 0xE5, 0xB0, 0x94, 0xB0, 0x95, 0xB0, 0x96, /* 0xB4-0xB7 */ + 0xB0, 0x97, 0xB0, 0x98, 0xB0, 0x99, 0xB0, 0x9A, /* 0xB8-0xBB */ + 0xB0, 0x9B, 0xB0, 0x9C, 0xB0, 0x9D, 0xC3, 0xF3, /* 0xBC-0xBF */ + 0xB0, 0x9E, 0xB0, 0x9F, 0xD3, 0xDB, 0xB0, 0xA0, /* 0xC0-0xC3 */ + 0xB1, 0x40, 0xD6, 0xD1, 0xC5, 0xE8, 0xB1, 0x41, /* 0xC4-0xC7 */ + 0xD3, 0xAF, 0xB1, 0x42, 0xD2, 0xE6, 0xB1, 0x43, /* 0xC8-0xCB */ + 0xB1, 0x44, 0xEE, 0xC1, 0xB0, 0xBB, 0xD5, 0xB5, /* 0xCC-0xCF */ + 0xD1, 0xCE, 0xBC, 0xE0, 0xBA, 0xD0, 0xB1, 0x45, /* 0xD0-0xD3 */ + 0xBF, 0xF8, 0xB1, 0x46, 0xB8, 0xC7, 0xB5, 0xC1, /* 0xD4-0xD7 */ + 0xC5, 0xCC, 0xB1, 0x47, 0xB1, 0x48, 0xCA, 0xA2, /* 0xD8-0xDB */ + 0xB1, 0x49, 0xB1, 0x4A, 0xB1, 0x4B, 0xC3, 0xCB, /* 0xDC-0xDF */ + 0xB1, 0x4C, 0xB1, 0x4D, 0xB1, 0x4E, 0xB1, 0x4F, /* 0xE0-0xE3 */ + 0xB1, 0x50, 0xEE, 0xC2, 0xB1, 0x51, 0xB1, 0x52, /* 0xE4-0xE7 */ + 0xB1, 0x53, 0xB1, 0x54, 0xB1, 0x55, 0xB1, 0x56, /* 0xE8-0xEB */ + 0xB1, 0x57, 0xB1, 0x58, 0xC4, 0xBF, 0xB6, 0xA2, /* 0xEC-0xEF */ + 0xB1, 0x59, 0xED, 0xEC, 0xC3, 0xA4, 0xB1, 0x5A, /* 0xF0-0xF3 */ + 0xD6, 0xB1, 0xB1, 0x5B, 0xB1, 0x5C, 0xB1, 0x5D, /* 0xF4-0xF7 */ + 0xCF, 0xE0, 0xED, 0xEF, 0xB1, 0x5E, 0xB1, 0x5F, /* 0xF8-0xFB */ + 0xC5, 0xCE, 0xB1, 0x60, 0xB6, 0xDC, 0xB1, 0x61, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_77[512] = { + 0xB1, 0x62, 0xCA, 0xA1, 0xB1, 0x63, 0xB1, 0x64, /* 0x00-0x03 */ + 0xED, 0xED, 0xB1, 0x65, 0xB1, 0x66, 0xED, 0xF0, /* 0x04-0x07 */ + 0xED, 0xF1, 0xC3, 0xBC, 0xB1, 0x67, 0xBF, 0xB4, /* 0x08-0x0B */ + 0xB1, 0x68, 0xED, 0xEE, 0xB1, 0x69, 0xB1, 0x6A, /* 0x0C-0x0F */ + 0xB1, 0x6B, 0xB1, 0x6C, 0xB1, 0x6D, 0xB1, 0x6E, /* 0x10-0x13 */ + 0xB1, 0x6F, 0xB1, 0x70, 0xB1, 0x71, 0xB1, 0x72, /* 0x14-0x17 */ + 0xB1, 0x73, 0xED, 0xF4, 0xED, 0xF2, 0xB1, 0x74, /* 0x18-0x1B */ + 0xB1, 0x75, 0xB1, 0x76, 0xB1, 0x77, 0xD5, 0xE6, /* 0x1C-0x1F */ + 0xC3, 0xDF, 0xB1, 0x78, 0xED, 0xF3, 0xB1, 0x79, /* 0x20-0x23 */ + 0xB1, 0x7A, 0xB1, 0x7B, 0xED, 0xF6, 0xB1, 0x7C, /* 0x24-0x27 */ + 0xD5, 0xA3, 0xD1, 0xA3, 0xB1, 0x7D, 0xB1, 0x7E, /* 0x28-0x2B */ + 0xB1, 0x80, 0xED, 0xF5, 0xB1, 0x81, 0xC3, 0xD0, /* 0x2C-0x2F */ + 0xB1, 0x82, 0xB1, 0x83, 0xB1, 0x84, 0xB1, 0x85, /* 0x30-0x33 */ + 0xB1, 0x86, 0xED, 0xF7, 0xBF, 0xF4, 0xBE, 0xEC, /* 0x34-0x37 */ + 0xED, 0xF8, 0xB1, 0x87, 0xCC, 0xF7, 0xB1, 0x88, /* 0x38-0x3B */ + 0xD1, 0xDB, 0xB1, 0x89, 0xB1, 0x8A, 0xB1, 0x8B, /* 0x3C-0x3F */ + 0xD7, 0xC5, 0xD5, 0xF6, 0xB1, 0x8C, 0xED, 0xFC, /* 0x40-0x43 */ + 0xB1, 0x8D, 0xB1, 0x8E, 0xB1, 0x8F, 0xED, 0xFB, /* 0x44-0x47 */ + 0xB1, 0x90, 0xB1, 0x91, 0xB1, 0x92, 0xB1, 0x93, /* 0x48-0x4B */ + 0xB1, 0x94, 0xB1, 0x95, 0xB1, 0x96, 0xB1, 0x97, /* 0x4C-0x4F */ + 0xED, 0xF9, 0xED, 0xFA, 0xB1, 0x98, 0xB1, 0x99, /* 0x50-0x53 */ + 0xB1, 0x9A, 0xB1, 0x9B, 0xB1, 0x9C, 0xB1, 0x9D, /* 0x54-0x57 */ + 0xB1, 0x9E, 0xB1, 0x9F, 0xED, 0xFD, 0xBE, 0xA6, /* 0x58-0x5B */ + 0xB1, 0xA0, 0xB2, 0x40, 0xB2, 0x41, 0xB2, 0x42, /* 0x5C-0x5F */ + 0xB2, 0x43, 0xCB, 0xAF, 0xEE, 0xA1, 0xB6, 0xBD, /* 0x60-0x63 */ + 0xB2, 0x44, 0xEE, 0xA2, 0xC4, 0xC0, 0xB2, 0x45, /* 0x64-0x67 */ + 0xED, 0xFE, 0xB2, 0x46, 0xB2, 0x47, 0xBD, 0xDE, /* 0x68-0x6B */ + 0xB2, 0xC7, 0xB2, 0x48, 0xB2, 0x49, 0xB2, 0x4A, /* 0x6C-0x6F */ + 0xB2, 0x4B, 0xB2, 0x4C, 0xB2, 0x4D, 0xB2, 0x4E, /* 0x70-0x73 */ + 0xB2, 0x4F, 0xB2, 0x50, 0xB2, 0x51, 0xB2, 0x52, /* 0x74-0x77 */ + 0xB2, 0x53, 0xB6, 0xC3, 0xB2, 0x54, 0xB2, 0x55, /* 0x78-0x7B */ + 0xB2, 0x56, 0xEE, 0xA5, 0xD8, 0xBA, 0xEE, 0xA3, /* 0x7C-0x7F */ + + 0xEE, 0xA6, 0xB2, 0x57, 0xB2, 0x58, 0xB2, 0x59, /* 0x80-0x83 */ + 0xC3, 0xE9, 0xB3, 0xF2, 0xB2, 0x5A, 0xB2, 0x5B, /* 0x84-0x87 */ + 0xB2, 0x5C, 0xB2, 0x5D, 0xB2, 0x5E, 0xB2, 0x5F, /* 0x88-0x8B */ + 0xEE, 0xA7, 0xEE, 0xA4, 0xCF, 0xB9, 0xB2, 0x60, /* 0x8C-0x8F */ + 0xB2, 0x61, 0xEE, 0xA8, 0xC2, 0xF7, 0xB2, 0x62, /* 0x90-0x93 */ + 0xB2, 0x63, 0xB2, 0x64, 0xB2, 0x65, 0xB2, 0x66, /* 0x94-0x97 */ + 0xB2, 0x67, 0xB2, 0x68, 0xB2, 0x69, 0xB2, 0x6A, /* 0x98-0x9B */ + 0xB2, 0x6B, 0xB2, 0x6C, 0xB2, 0x6D, 0xEE, 0xA9, /* 0x9C-0x9F */ + 0xEE, 0xAA, 0xB2, 0x6E, 0xDE, 0xAB, 0xB2, 0x6F, /* 0xA0-0xA3 */ + 0xB2, 0x70, 0xC6, 0xB3, 0xB2, 0x71, 0xC7, 0xC6, /* 0xA4-0xA7 */ + 0xB2, 0x72, 0xD6, 0xF5, 0xB5, 0xC9, 0xB2, 0x73, /* 0xA8-0xAB */ + 0xCB, 0xB2, 0xB2, 0x74, 0xB2, 0x75, 0xB2, 0x76, /* 0xAC-0xAF */ + 0xEE, 0xAB, 0xB2, 0x77, 0xB2, 0x78, 0xCD, 0xAB, /* 0xB0-0xB3 */ + 0xB2, 0x79, 0xEE, 0xAC, 0xB2, 0x7A, 0xB2, 0x7B, /* 0xB4-0xB7 */ + 0xB2, 0x7C, 0xB2, 0x7D, 0xB2, 0x7E, 0xD5, 0xB0, /* 0xB8-0xBB */ + 0xB2, 0x80, 0xEE, 0xAD, 0xB2, 0x81, 0xF6, 0xC4, /* 0xBC-0xBF */ + 0xB2, 0x82, 0xB2, 0x83, 0xB2, 0x84, 0xB2, 0x85, /* 0xC0-0xC3 */ + 0xB2, 0x86, 0xB2, 0x87, 0xB2, 0x88, 0xB2, 0x89, /* 0xC4-0xC7 */ + 0xB2, 0x8A, 0xB2, 0x8B, 0xB2, 0x8C, 0xB2, 0x8D, /* 0xC8-0xCB */ + 0xB2, 0x8E, 0xDB, 0xC7, 0xB2, 0x8F, 0xB2, 0x90, /* 0xCC-0xCF */ + 0xB2, 0x91, 0xB2, 0x92, 0xB2, 0x93, 0xB2, 0x94, /* 0xD0-0xD3 */ + 0xB2, 0x95, 0xB2, 0x96, 0xB2, 0x97, 0xB4, 0xA3, /* 0xD4-0xD7 */ + 0xB2, 0x98, 0xB2, 0x99, 0xB2, 0x9A, 0xC3, 0xAC, /* 0xD8-0xDB */ + 0xF1, 0xE6, 0xB2, 0x9B, 0xB2, 0x9C, 0xB2, 0x9D, /* 0xDC-0xDF */ + 0xB2, 0x9E, 0xB2, 0x9F, 0xCA, 0xB8, 0xD2, 0xD3, /* 0xE0-0xE3 */ + 0xB2, 0xA0, 0xD6, 0xAA, 0xB3, 0x40, 0xEF, 0xF2, /* 0xE4-0xE7 */ + 0xB3, 0x41, 0xBE, 0xD8, 0xB3, 0x42, 0xBD, 0xC3, /* 0xE8-0xEB */ + 0xEF, 0xF3, 0xB6, 0xCC, 0xB0, 0xAB, 0xB3, 0x43, /* 0xEC-0xEF */ + 0xB3, 0x44, 0xB3, 0x45, 0xB3, 0x46, 0xCA, 0xAF, /* 0xF0-0xF3 */ + 0xB3, 0x47, 0xB3, 0x48, 0xED, 0xB6, 0xB3, 0x49, /* 0xF4-0xF7 */ + 0xED, 0xB7, 0xB3, 0x4A, 0xB3, 0x4B, 0xB3, 0x4C, /* 0xF8-0xFB */ + 0xB3, 0x4D, 0xCE, 0xF9, 0xB7, 0xAF, 0xBF, 0xF3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_78[512] = { + 0xED, 0xB8, 0xC2, 0xEB, 0xC9, 0xB0, 0xB3, 0x4E, /* 0x00-0x03 */ + 0xB3, 0x4F, 0xB3, 0x50, 0xB3, 0x51, 0xB3, 0x52, /* 0x04-0x07 */ + 0xB3, 0x53, 0xED, 0xB9, 0xB3, 0x54, 0xB3, 0x55, /* 0x08-0x0B */ + 0xC6, 0xF6, 0xBF, 0xB3, 0xB3, 0x56, 0xB3, 0x57, /* 0x0C-0x0F */ + 0xB3, 0x58, 0xED, 0xBC, 0xC5, 0xF8, 0xB3, 0x59, /* 0x10-0x13 */ + 0xD1, 0xD0, 0xB3, 0x5A, 0xD7, 0xA9, 0xED, 0xBA, /* 0x14-0x17 */ + 0xED, 0xBB, 0xB3, 0x5B, 0xD1, 0xE2, 0xB3, 0x5C, /* 0x18-0x1B */ + 0xED, 0xBF, 0xED, 0xC0, 0xB3, 0x5D, 0xED, 0xC4, /* 0x1C-0x1F */ + 0xB3, 0x5E, 0xB3, 0x5F, 0xB3, 0x60, 0xED, 0xC8, /* 0x20-0x23 */ + 0xB3, 0x61, 0xED, 0xC6, 0xED, 0xCE, 0xD5, 0xE8, /* 0x24-0x27 */ + 0xB3, 0x62, 0xED, 0xC9, 0xB3, 0x63, 0xB3, 0x64, /* 0x28-0x2B */ + 0xED, 0xC7, 0xED, 0xBE, 0xB3, 0x65, 0xB3, 0x66, /* 0x2C-0x2F */ + 0xC5, 0xE9, 0xB3, 0x67, 0xB3, 0x68, 0xB3, 0x69, /* 0x30-0x33 */ + 0xC6, 0xC6, 0xB3, 0x6A, 0xB3, 0x6B, 0xC9, 0xE9, /* 0x34-0x37 */ + 0xD4, 0xD2, 0xED, 0xC1, 0xED, 0xC2, 0xED, 0xC3, /* 0x38-0x3B */ + 0xED, 0xC5, 0xB3, 0x6C, 0xC0, 0xF9, 0xB3, 0x6D, /* 0x3C-0x3F */ + 0xB4, 0xA1, 0xB3, 0x6E, 0xB3, 0x6F, 0xB3, 0x70, /* 0x40-0x43 */ + 0xB3, 0x71, 0xB9, 0xE8, 0xB3, 0x72, 0xED, 0xD0, /* 0x44-0x47 */ + 0xB3, 0x73, 0xB3, 0x74, 0xB3, 0x75, 0xB3, 0x76, /* 0x48-0x4B */ + 0xED, 0xD1, 0xB3, 0x77, 0xED, 0xCA, 0xB3, 0x78, /* 0x4C-0x4F */ + 0xED, 0xCF, 0xB3, 0x79, 0xCE, 0xF8, 0xB3, 0x7A, /* 0x50-0x53 */ + 0xB3, 0x7B, 0xCB, 0xB6, 0xED, 0xCC, 0xED, 0xCD, /* 0x54-0x57 */ + 0xB3, 0x7C, 0xB3, 0x7D, 0xB3, 0x7E, 0xB3, 0x80, /* 0x58-0x5B */ + 0xB3, 0x81, 0xCF, 0xF5, 0xB3, 0x82, 0xB3, 0x83, /* 0x5C-0x5F */ + 0xB3, 0x84, 0xB3, 0x85, 0xB3, 0x86, 0xB3, 0x87, /* 0x60-0x63 */ + 0xB3, 0x88, 0xB3, 0x89, 0xB3, 0x8A, 0xB3, 0x8B, /* 0x64-0x67 */ + 0xB3, 0x8C, 0xB3, 0x8D, 0xED, 0xD2, 0xC1, 0xF2, /* 0x68-0x6B */ + 0xD3, 0xB2, 0xED, 0xCB, 0xC8, 0xB7, 0xB3, 0x8E, /* 0x6C-0x6F */ + 0xB3, 0x8F, 0xB3, 0x90, 0xB3, 0x91, 0xB3, 0x92, /* 0x70-0x73 */ + 0xB3, 0x93, 0xB3, 0x94, 0xB3, 0x95, 0xBC, 0xEF, /* 0x74-0x77 */ + 0xB3, 0x96, 0xB3, 0x97, 0xB3, 0x98, 0xB3, 0x99, /* 0x78-0x7B */ + 0xC5, 0xF0, 0xB3, 0x9A, 0xB3, 0x9B, 0xB3, 0x9C, /* 0x7C-0x7F */ + + 0xB3, 0x9D, 0xB3, 0x9E, 0xB3, 0x9F, 0xB3, 0xA0, /* 0x80-0x83 */ + 0xB4, 0x40, 0xB4, 0x41, 0xB4, 0x42, 0xED, 0xD6, /* 0x84-0x87 */ + 0xB4, 0x43, 0xB5, 0xEF, 0xB4, 0x44, 0xB4, 0x45, /* 0x88-0x8B */ + 0xC2, 0xB5, 0xB0, 0xAD, 0xCB, 0xE9, 0xB4, 0x46, /* 0x8C-0x8F */ + 0xB4, 0x47, 0xB1, 0xAE, 0xB4, 0x48, 0xED, 0xD4, /* 0x90-0x93 */ + 0xB4, 0x49, 0xB4, 0x4A, 0xB4, 0x4B, 0xCD, 0xEB, /* 0x94-0x97 */ + 0xB5, 0xE2, 0xB4, 0x4C, 0xED, 0xD5, 0xED, 0xD3, /* 0x98-0x9B */ + 0xED, 0xD7, 0xB4, 0x4D, 0xB4, 0x4E, 0xB5, 0xFA, /* 0x9C-0x9F */ + 0xB4, 0x4F, 0xED, 0xD8, 0xB4, 0x50, 0xED, 0xD9, /* 0xA0-0xA3 */ + 0xB4, 0x51, 0xED, 0xDC, 0xB4, 0x52, 0xB1, 0xCC, /* 0xA4-0xA7 */ + 0xB4, 0x53, 0xB4, 0x54, 0xB4, 0x55, 0xB4, 0x56, /* 0xA8-0xAB */ + 0xB4, 0x57, 0xB4, 0x58, 0xB4, 0x59, 0xB4, 0x5A, /* 0xAC-0xAF */ + 0xC5, 0xF6, 0xBC, 0xEE, 0xED, 0xDA, 0xCC, 0xBC, /* 0xB0-0xB3 */ + 0xB2, 0xEA, 0xB4, 0x5B, 0xB4, 0x5C, 0xB4, 0x5D, /* 0xB4-0xB7 */ + 0xB4, 0x5E, 0xED, 0xDB, 0xB4, 0x5F, 0xB4, 0x60, /* 0xB8-0xBB */ + 0xB4, 0x61, 0xB4, 0x62, 0xC4, 0xEB, 0xB4, 0x63, /* 0xBC-0xBF */ + 0xB4, 0x64, 0xB4, 0xC5, 0xB4, 0x65, 0xB4, 0x66, /* 0xC0-0xC3 */ + 0xB4, 0x67, 0xB0, 0xF5, 0xB4, 0x68, 0xB4, 0x69, /* 0xC4-0xC7 */ + 0xB4, 0x6A, 0xED, 0xDF, 0xC0, 0xDA, 0xB4, 0xE8, /* 0xC8-0xCB */ + 0xB4, 0x6B, 0xB4, 0x6C, 0xB4, 0x6D, 0xB4, 0x6E, /* 0xCC-0xCF */ + 0xC5, 0xCD, 0xB4, 0x6F, 0xB4, 0x70, 0xB4, 0x71, /* 0xD0-0xD3 */ + 0xED, 0xDD, 0xBF, 0xC4, 0xB4, 0x72, 0xB4, 0x73, /* 0xD4-0xD7 */ + 0xB4, 0x74, 0xED, 0xDE, 0xB4, 0x75, 0xB4, 0x76, /* 0xD8-0xDB */ + 0xB4, 0x77, 0xB4, 0x78, 0xB4, 0x79, 0xB4, 0x7A, /* 0xDC-0xDF */ + 0xB4, 0x7B, 0xB4, 0x7C, 0xB4, 0x7D, 0xB4, 0x7E, /* 0xE0-0xE3 */ + 0xB4, 0x80, 0xB4, 0x81, 0xB4, 0x82, 0xB4, 0x83, /* 0xE4-0xE7 */ + 0xC4, 0xA5, 0xB4, 0x84, 0xB4, 0x85, 0xB4, 0x86, /* 0xE8-0xEB */ + 0xED, 0xE0, 0xB4, 0x87, 0xB4, 0x88, 0xB4, 0x89, /* 0xEC-0xEF */ + 0xB4, 0x8A, 0xB4, 0x8B, 0xED, 0xE1, 0xB4, 0x8C, /* 0xF0-0xF3 */ + 0xED, 0xE3, 0xB4, 0x8D, 0xB4, 0x8E, 0xC1, 0xD7, /* 0xF4-0xF7 */ + 0xB4, 0x8F, 0xB4, 0x90, 0xBB, 0xC7, 0xB4, 0x91, /* 0xF8-0xFB */ + 0xB4, 0x92, 0xB4, 0x93, 0xB4, 0x94, 0xB4, 0x95, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_79[512] = { + 0xB4, 0x96, 0xBD, 0xB8, 0xB4, 0x97, 0xB4, 0x98, /* 0x00-0x03 */ + 0xB4, 0x99, 0xED, 0xE2, 0xB4, 0x9A, 0xB4, 0x9B, /* 0x04-0x07 */ + 0xB4, 0x9C, 0xB4, 0x9D, 0xB4, 0x9E, 0xB4, 0x9F, /* 0x08-0x0B */ + 0xB4, 0xA0, 0xB5, 0x40, 0xB5, 0x41, 0xB5, 0x42, /* 0x0C-0x0F */ + 0xB5, 0x43, 0xB5, 0x44, 0xB5, 0x45, 0xED, 0xE4, /* 0x10-0x13 */ + 0xB5, 0x46, 0xB5, 0x47, 0xB5, 0x48, 0xB5, 0x49, /* 0x14-0x17 */ + 0xB5, 0x4A, 0xB5, 0x4B, 0xB5, 0x4C, 0xB5, 0x4D, /* 0x18-0x1B */ + 0xB5, 0x4E, 0xB5, 0x4F, 0xED, 0xE6, 0xB5, 0x50, /* 0x1C-0x1F */ + 0xB5, 0x51, 0xB5, 0x52, 0xB5, 0x53, 0xB5, 0x54, /* 0x20-0x23 */ + 0xED, 0xE5, 0xB5, 0x55, 0xB5, 0x56, 0xB5, 0x57, /* 0x24-0x27 */ + 0xB5, 0x58, 0xB5, 0x59, 0xB5, 0x5A, 0xB5, 0x5B, /* 0x28-0x2B */ + 0xB5, 0x5C, 0xB5, 0x5D, 0xB5, 0x5E, 0xB5, 0x5F, /* 0x2C-0x2F */ + 0xB5, 0x60, 0xB5, 0x61, 0xB5, 0x62, 0xB5, 0x63, /* 0x30-0x33 */ + 0xED, 0xE7, 0xB5, 0x64, 0xB5, 0x65, 0xB5, 0x66, /* 0x34-0x37 */ + 0xB5, 0x67, 0xB5, 0x68, 0xCA, 0xBE, 0xEC, 0xEA, /* 0x38-0x3B */ + 0xC0, 0xF1, 0xB5, 0x69, 0xC9, 0xE7, 0xB5, 0x6A, /* 0x3C-0x3F */ + 0xEC, 0xEB, 0xC6, 0xEE, 0xB5, 0x6B, 0xB5, 0x6C, /* 0x40-0x43 */ + 0xB5, 0x6D, 0xB5, 0x6E, 0xEC, 0xEC, 0xB5, 0x6F, /* 0x44-0x47 */ + 0xC6, 0xED, 0xEC, 0xED, 0xB5, 0x70, 0xB5, 0x71, /* 0x48-0x4B */ + 0xB5, 0x72, 0xB5, 0x73, 0xB5, 0x74, 0xB5, 0x75, /* 0x4C-0x4F */ + 0xB5, 0x76, 0xB5, 0x77, 0xB5, 0x78, 0xEC, 0xF0, /* 0x50-0x53 */ + 0xB5, 0x79, 0xB5, 0x7A, 0xD7, 0xE6, 0xEC, 0xF3, /* 0x54-0x57 */ + 0xB5, 0x7B, 0xB5, 0x7C, 0xEC, 0xF1, 0xEC, 0xEE, /* 0x58-0x5B */ + 0xEC, 0xEF, 0xD7, 0xA3, 0xC9, 0xF1, 0xCB, 0xEE, /* 0x5C-0x5F */ + 0xEC, 0xF4, 0xB5, 0x7D, 0xEC, 0xF2, 0xB5, 0x7E, /* 0x60-0x63 */ + 0xB5, 0x80, 0xCF, 0xE9, 0xB5, 0x81, 0xEC, 0xF6, /* 0x64-0x67 */ + 0xC6, 0xB1, 0xB5, 0x82, 0xB5, 0x83, 0xB5, 0x84, /* 0x68-0x6B */ + 0xB5, 0x85, 0xBC, 0xC0, 0xB5, 0x86, 0xEC, 0xF5, /* 0x6C-0x6F */ + 0xB5, 0x87, 0xB5, 0x88, 0xB5, 0x89, 0xB5, 0x8A, /* 0x70-0x73 */ + 0xB5, 0x8B, 0xB5, 0x8C, 0xB5, 0x8D, 0xB5, 0xBB, /* 0x74-0x77 */ + 0xBB, 0xF6, 0xB5, 0x8E, 0xEC, 0xF7, 0xB5, 0x8F, /* 0x78-0x7B */ + 0xB5, 0x90, 0xB5, 0x91, 0xB5, 0x92, 0xB5, 0x93, /* 0x7C-0x7F */ + + 0xD9, 0xF7, 0xBD, 0xFB, 0xB5, 0x94, 0xB5, 0x95, /* 0x80-0x83 */ + 0xC2, 0xBB, 0xEC, 0xF8, 0xB5, 0x96, 0xB5, 0x97, /* 0x84-0x87 */ + 0xB5, 0x98, 0xB5, 0x99, 0xEC, 0xF9, 0xB5, 0x9A, /* 0x88-0x8B */ + 0xB5, 0x9B, 0xB5, 0x9C, 0xB5, 0x9D, 0xB8, 0xA3, /* 0x8C-0x8F */ + 0xB5, 0x9E, 0xB5, 0x9F, 0xB5, 0xA0, 0xB6, 0x40, /* 0x90-0x93 */ + 0xB6, 0x41, 0xB6, 0x42, 0xB6, 0x43, 0xB6, 0x44, /* 0x94-0x97 */ + 0xB6, 0x45, 0xB6, 0x46, 0xEC, 0xFA, 0xB6, 0x47, /* 0x98-0x9B */ + 0xB6, 0x48, 0xB6, 0x49, 0xB6, 0x4A, 0xB6, 0x4B, /* 0x9C-0x9F */ + 0xB6, 0x4C, 0xB6, 0x4D, 0xB6, 0x4E, 0xB6, 0x4F, /* 0xA0-0xA3 */ + 0xB6, 0x50, 0xB6, 0x51, 0xB6, 0x52, 0xEC, 0xFB, /* 0xA4-0xA7 */ + 0xB6, 0x53, 0xB6, 0x54, 0xB6, 0x55, 0xB6, 0x56, /* 0xA8-0xAB */ + 0xB6, 0x57, 0xB6, 0x58, 0xB6, 0x59, 0xB6, 0x5A, /* 0xAC-0xAF */ + 0xB6, 0x5B, 0xB6, 0x5C, 0xB6, 0x5D, 0xEC, 0xFC, /* 0xB0-0xB3 */ + 0xB6, 0x5E, 0xB6, 0x5F, 0xB6, 0x60, 0xB6, 0x61, /* 0xB4-0xB7 */ + 0xB6, 0x62, 0xD3, 0xED, 0xD8, 0xAE, 0xC0, 0xEB, /* 0xB8-0xBB */ + 0xB6, 0x63, 0xC7, 0xDD, 0xBA, 0xCC, 0xB6, 0x64, /* 0xBC-0xBF */ + 0xD0, 0xE3, 0xCB, 0xBD, 0xB6, 0x65, 0xCD, 0xBA, /* 0xC0-0xC3 */ + 0xB6, 0x66, 0xB6, 0x67, 0xB8, 0xD1, 0xB6, 0x68, /* 0xC4-0xC7 */ + 0xB6, 0x69, 0xB1, 0xFC, 0xB6, 0x6A, 0xC7, 0xEF, /* 0xC8-0xCB */ + 0xB6, 0x6B, 0xD6, 0xD6, 0xB6, 0x6C, 0xB6, 0x6D, /* 0xCC-0xCF */ + 0xB6, 0x6E, 0xBF, 0xC6, 0xC3, 0xEB, 0xB6, 0x6F, /* 0xD0-0xD3 */ + 0xB6, 0x70, 0xEF, 0xF5, 0xB6, 0x71, 0xB6, 0x72, /* 0xD4-0xD7 */ + 0xC3, 0xD8, 0xB6, 0x73, 0xB6, 0x74, 0xB6, 0x75, /* 0xD8-0xDB */ + 0xB6, 0x76, 0xB6, 0x77, 0xB6, 0x78, 0xD7, 0xE2, /* 0xDC-0xDF */ + 0xB6, 0x79, 0xB6, 0x7A, 0xB6, 0x7B, 0xEF, 0xF7, /* 0xE0-0xE3 */ + 0xB3, 0xD3, 0xB6, 0x7C, 0xC7, 0xD8, 0xD1, 0xED, /* 0xE4-0xE7 */ + 0xB6, 0x7D, 0xD6, 0xC8, 0xB6, 0x7E, 0xEF, 0xF8, /* 0xE8-0xEB */ + 0xB6, 0x80, 0xEF, 0xF6, 0xB6, 0x81, 0xBB, 0xFD, /* 0xEC-0xEF */ + 0xB3, 0xC6, 0xB6, 0x82, 0xB6, 0x83, 0xB6, 0x84, /* 0xF0-0xF3 */ + 0xB6, 0x85, 0xB6, 0x86, 0xB6, 0x87, 0xB6, 0x88, /* 0xF4-0xF7 */ + 0xBD, 0xD5, 0xB6, 0x89, 0xB6, 0x8A, 0xD2, 0xC6, /* 0xF8-0xFB */ + 0xB6, 0x8B, 0xBB, 0xE0, 0xB6, 0x8C, 0xB6, 0x8D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7A[512] = { + 0xCF, 0xA1, 0xB6, 0x8E, 0xEF, 0xFC, 0xEF, 0xFB, /* 0x00-0x03 */ + 0xB6, 0x8F, 0xB6, 0x90, 0xEF, 0xF9, 0xB6, 0x91, /* 0x04-0x07 */ + 0xB6, 0x92, 0xB6, 0x93, 0xB6, 0x94, 0xB3, 0xCC, /* 0x08-0x0B */ + 0xB6, 0x95, 0xC9, 0xD4, 0xCB, 0xB0, 0xB6, 0x96, /* 0x0C-0x0F */ + 0xB6, 0x97, 0xB6, 0x98, 0xB6, 0x99, 0xB6, 0x9A, /* 0x10-0x13 */ + 0xEF, 0xFE, 0xB6, 0x9B, 0xB6, 0x9C, 0xB0, 0xDE, /* 0x14-0x17 */ + 0xB6, 0x9D, 0xB6, 0x9E, 0xD6, 0xC9, 0xB6, 0x9F, /* 0x18-0x1B */ + 0xB6, 0xA0, 0xB7, 0x40, 0xEF, 0xFD, 0xB7, 0x41, /* 0x1C-0x1F */ + 0xB3, 0xED, 0xB7, 0x42, 0xB7, 0x43, 0xF6, 0xD5, /* 0x20-0x23 */ + 0xB7, 0x44, 0xB7, 0x45, 0xB7, 0x46, 0xB7, 0x47, /* 0x24-0x27 */ + 0xB7, 0x48, 0xB7, 0x49, 0xB7, 0x4A, 0xB7, 0x4B, /* 0x28-0x2B */ + 0xB7, 0x4C, 0xB7, 0x4D, 0xB7, 0x4E, 0xB7, 0x4F, /* 0x2C-0x2F */ + 0xB7, 0x50, 0xB7, 0x51, 0xB7, 0x52, 0xCE, 0xC8, /* 0x30-0x33 */ + 0xB7, 0x53, 0xB7, 0x54, 0xB7, 0x55, 0xF0, 0xA2, /* 0x34-0x37 */ + 0xB7, 0x56, 0xF0, 0xA1, 0xB7, 0x57, 0xB5, 0xBE, /* 0x38-0x3B */ + 0xBC, 0xDA, 0xBB, 0xFC, 0xB7, 0x58, 0xB8, 0xE5, /* 0x3C-0x3F */ + 0xB7, 0x59, 0xB7, 0x5A, 0xB7, 0x5B, 0xB7, 0x5C, /* 0x40-0x43 */ + 0xB7, 0x5D, 0xB7, 0x5E, 0xC4, 0xC2, 0xB7, 0x5F, /* 0x44-0x47 */ + 0xB7, 0x60, 0xB7, 0x61, 0xB7, 0x62, 0xB7, 0x63, /* 0x48-0x4B */ + 0xB7, 0x64, 0xB7, 0x65, 0xB7, 0x66, 0xB7, 0x67, /* 0x4C-0x4F */ + 0xB7, 0x68, 0xF0, 0xA3, 0xB7, 0x69, 0xB7, 0x6A, /* 0x50-0x53 */ + 0xB7, 0x6B, 0xB7, 0x6C, 0xB7, 0x6D, 0xCB, 0xEB, /* 0x54-0x57 */ + 0xB7, 0x6E, 0xB7, 0x6F, 0xB7, 0x70, 0xB7, 0x71, /* 0x58-0x5B */ + 0xB7, 0x72, 0xB7, 0x73, 0xB7, 0x74, 0xB7, 0x75, /* 0x5C-0x5F */ + 0xB7, 0x76, 0xB7, 0x77, 0xB7, 0x78, 0xB7, 0x79, /* 0x60-0x63 */ + 0xB7, 0x7A, 0xB7, 0x7B, 0xB7, 0x7C, 0xB7, 0x7D, /* 0x64-0x67 */ + 0xB7, 0x7E, 0xB7, 0x80, 0xB7, 0x81, 0xB7, 0x82, /* 0x68-0x6B */ + 0xB7, 0x83, 0xB7, 0x84, 0xB7, 0x85, 0xB7, 0x86, /* 0x6C-0x6F */ + 0xF0, 0xA6, 0xB7, 0x87, 0xB7, 0x88, 0xB7, 0x89, /* 0x70-0x73 */ + 0xD1, 0xA8, 0xB7, 0x8A, 0xBE, 0xBF, 0xC7, 0xEE, /* 0x74-0x77 */ + 0xF1, 0xB6, 0xF1, 0xB7, 0xBF, 0xD5, 0xB7, 0x8B, /* 0x78-0x7B */ + 0xB7, 0x8C, 0xB7, 0x8D, 0xB7, 0x8E, 0xB4, 0xA9, /* 0x7C-0x7F */ + + 0xF1, 0xB8, 0xCD, 0xBB, 0xB7, 0x8F, 0xC7, 0xD4, /* 0x80-0x83 */ + 0xD5, 0xAD, 0xB7, 0x90, 0xF1, 0xB9, 0xB7, 0x91, /* 0x84-0x87 */ + 0xF1, 0xBA, 0xB7, 0x92, 0xB7, 0x93, 0xB7, 0x94, /* 0x88-0x8B */ + 0xB7, 0x95, 0xC7, 0xCF, 0xB7, 0x96, 0xB7, 0x97, /* 0x8C-0x8F */ + 0xB7, 0x98, 0xD2, 0xA4, 0xD6, 0xCF, 0xB7, 0x99, /* 0x90-0x93 */ + 0xB7, 0x9A, 0xF1, 0xBB, 0xBD, 0xD1, 0xB4, 0xB0, /* 0x94-0x97 */ + 0xBE, 0xBD, 0xB7, 0x9B, 0xB7, 0x9C, 0xB7, 0x9D, /* 0x98-0x9B */ + 0xB4, 0xDC, 0xCE, 0xD1, 0xB7, 0x9E, 0xBF, 0xDF, /* 0x9C-0x9F */ + 0xF1, 0xBD, 0xB7, 0x9F, 0xB7, 0xA0, 0xB8, 0x40, /* 0xA0-0xA3 */ + 0xB8, 0x41, 0xBF, 0xFA, 0xF1, 0xBC, 0xB8, 0x42, /* 0xA4-0xA7 */ + 0xF1, 0xBF, 0xB8, 0x43, 0xB8, 0x44, 0xB8, 0x45, /* 0xA8-0xAB */ + 0xF1, 0xBE, 0xF1, 0xC0, 0xB8, 0x46, 0xB8, 0x47, /* 0xAC-0xAF */ + 0xB8, 0x48, 0xB8, 0x49, 0xB8, 0x4A, 0xF1, 0xC1, /* 0xB0-0xB3 */ + 0xB8, 0x4B, 0xB8, 0x4C, 0xB8, 0x4D, 0xB8, 0x4E, /* 0xB4-0xB7 */ + 0xB8, 0x4F, 0xB8, 0x50, 0xB8, 0x51, 0xB8, 0x52, /* 0xB8-0xBB */ + 0xB8, 0x53, 0xB8, 0x54, 0xB8, 0x55, 0xC1, 0xFE, /* 0xBC-0xBF */ + 0xB8, 0x56, 0xB8, 0x57, 0xB8, 0x58, 0xB8, 0x59, /* 0xC0-0xC3 */ + 0xB8, 0x5A, 0xB8, 0x5B, 0xB8, 0x5C, 0xB8, 0x5D, /* 0xC4-0xC7 */ + 0xB8, 0x5E, 0xB8, 0x5F, 0xB8, 0x60, 0xC1, 0xA2, /* 0xC8-0xCB */ + 0xB8, 0x61, 0xB8, 0x62, 0xB8, 0x63, 0xB8, 0x64, /* 0xCC-0xCF */ + 0xB8, 0x65, 0xB8, 0x66, 0xB8, 0x67, 0xB8, 0x68, /* 0xD0-0xD3 */ + 0xB8, 0x69, 0xB8, 0x6A, 0xCA, 0xFA, 0xB8, 0x6B, /* 0xD4-0xD7 */ + 0xB8, 0x6C, 0xD5, 0xBE, 0xB8, 0x6D, 0xB8, 0x6E, /* 0xD8-0xDB */ + 0xB8, 0x6F, 0xB8, 0x70, 0xBE, 0xBA, 0xBE, 0xB9, /* 0xDC-0xDF */ + 0xD5, 0xC2, 0xB8, 0x71, 0xB8, 0x72, 0xBF, 0xA2, /* 0xE0-0xE3 */ + 0xB8, 0x73, 0xCD, 0xAF, 0xF1, 0xB5, 0xB8, 0x74, /* 0xE4-0xE7 */ + 0xB8, 0x75, 0xB8, 0x76, 0xB8, 0x77, 0xB8, 0x78, /* 0xE8-0xEB */ + 0xB8, 0x79, 0xBD, 0xDF, 0xB8, 0x7A, 0xB6, 0xCB, /* 0xEC-0xEF */ + 0xB8, 0x7B, 0xB8, 0x7C, 0xB8, 0x7D, 0xB8, 0x7E, /* 0xF0-0xF3 */ + 0xB8, 0x80, 0xB8, 0x81, 0xB8, 0x82, 0xB8, 0x83, /* 0xF4-0xF7 */ + 0xB8, 0x84, 0xD6, 0xF1, 0xF3, 0xC3, 0xB8, 0x85, /* 0xF8-0xFB */ + 0xB8, 0x86, 0xF3, 0xC4, 0xB8, 0x87, 0xB8, 0xCD, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7B[512] = { + 0xB8, 0x88, 0xB8, 0x89, 0xB8, 0x8A, 0xF3, 0xC6, /* 0x00-0x03 */ + 0xF3, 0xC7, 0xB8, 0x8B, 0xB0, 0xCA, 0xB8, 0x8C, /* 0x04-0x07 */ + 0xF3, 0xC5, 0xB8, 0x8D, 0xF3, 0xC9, 0xCB, 0xF1, /* 0x08-0x0B */ + 0xB8, 0x8E, 0xB8, 0x8F, 0xB8, 0x90, 0xF3, 0xCB, /* 0x0C-0x0F */ + 0xB8, 0x91, 0xD0, 0xA6, 0xB8, 0x92, 0xB8, 0x93, /* 0x10-0x13 */ + 0xB1, 0xCA, 0xF3, 0xC8, 0xB8, 0x94, 0xB8, 0x95, /* 0x14-0x17 */ + 0xB8, 0x96, 0xF3, 0xCF, 0xB8, 0x97, 0xB5, 0xD1, /* 0x18-0x1B */ + 0xB8, 0x98, 0xB8, 0x99, 0xF3, 0xD7, 0xB8, 0x9A, /* 0x1C-0x1F */ + 0xF3, 0xD2, 0xB8, 0x9B, 0xB8, 0x9C, 0xB8, 0x9D, /* 0x20-0x23 */ + 0xF3, 0xD4, 0xF3, 0xD3, 0xB7, 0xFB, 0xB8, 0x9E, /* 0x24-0x27 */ + 0xB1, 0xBF, 0xB8, 0x9F, 0xF3, 0xCE, 0xF3, 0xCA, /* 0x28-0x2B */ + 0xB5, 0xDA, 0xB8, 0xA0, 0xF3, 0xD0, 0xB9, 0x40, /* 0x2C-0x2F */ + 0xB9, 0x41, 0xF3, 0xD1, 0xB9, 0x42, 0xF3, 0xD5, /* 0x30-0x33 */ + 0xB9, 0x43, 0xB9, 0x44, 0xB9, 0x45, 0xB9, 0x46, /* 0x34-0x37 */ + 0xF3, 0xCD, 0xB9, 0x47, 0xBC, 0xE3, 0xB9, 0x48, /* 0x38-0x3B */ + 0xC1, 0xFD, 0xB9, 0x49, 0xF3, 0xD6, 0xB9, 0x4A, /* 0x3C-0x3F */ + 0xB9, 0x4B, 0xB9, 0x4C, 0xB9, 0x4D, 0xB9, 0x4E, /* 0x40-0x43 */ + 0xB9, 0x4F, 0xF3, 0xDA, 0xB9, 0x50, 0xF3, 0xCC, /* 0x44-0x47 */ + 0xB9, 0x51, 0xB5, 0xC8, 0xB9, 0x52, 0xBD, 0xEE, /* 0x48-0x4B */ + 0xF3, 0xDC, 0xB9, 0x53, 0xB9, 0x54, 0xB7, 0xA4, /* 0x4C-0x4F */ + 0xBF, 0xF0, 0xD6, 0xFE, 0xCD, 0xB2, 0xB9, 0x55, /* 0x50-0x53 */ + 0xB4, 0xF0, 0xB9, 0x56, 0xB2, 0xDF, 0xB9, 0x57, /* 0x54-0x57 */ + 0xF3, 0xD8, 0xB9, 0x58, 0xF3, 0xD9, 0xC9, 0xB8, /* 0x58-0x5B */ + 0xB9, 0x59, 0xF3, 0xDD, 0xB9, 0x5A, 0xB9, 0x5B, /* 0x5C-0x5F */ + 0xF3, 0xDE, 0xB9, 0x5C, 0xF3, 0xE1, 0xB9, 0x5D, /* 0x60-0x63 */ + 0xB9, 0x5E, 0xB9, 0x5F, 0xB9, 0x60, 0xB9, 0x61, /* 0x64-0x67 */ + 0xB9, 0x62, 0xB9, 0x63, 0xB9, 0x64, 0xB9, 0x65, /* 0x68-0x6B */ + 0xB9, 0x66, 0xB9, 0x67, 0xF3, 0xDF, 0xB9, 0x68, /* 0x6C-0x6F */ + 0xB9, 0x69, 0xF3, 0xE3, 0xF3, 0xE2, 0xB9, 0x6A, /* 0x70-0x73 */ + 0xB9, 0x6B, 0xF3, 0xDB, 0xB9, 0x6C, 0xBF, 0xEA, /* 0x74-0x77 */ + 0xB9, 0x6D, 0xB3, 0xEF, 0xB9, 0x6E, 0xF3, 0xE0, /* 0x78-0x7B */ + 0xB9, 0x6F, 0xB9, 0x70, 0xC7, 0xA9, 0xB9, 0x71, /* 0x7C-0x7F */ + + 0xBC, 0xF2, 0xB9, 0x72, 0xB9, 0x73, 0xB9, 0x74, /* 0x80-0x83 */ + 0xB9, 0x75, 0xF3, 0xEB, 0xB9, 0x76, 0xB9, 0x77, /* 0x84-0x87 */ + 0xB9, 0x78, 0xB9, 0x79, 0xB9, 0x7A, 0xB9, 0x7B, /* 0x88-0x8B */ + 0xB9, 0x7C, 0xB9, 0xBF, 0xB9, 0x7D, 0xB9, 0x7E, /* 0x8C-0x8F */ + 0xF3, 0xE4, 0xB9, 0x80, 0xB9, 0x81, 0xB9, 0x82, /* 0x90-0x93 */ + 0xB2, 0xAD, 0xBB, 0xFE, 0xB9, 0x83, 0xCB, 0xE3, /* 0x94-0x97 */ + 0xB9, 0x84, 0xB9, 0x85, 0xB9, 0x86, 0xB9, 0x87, /* 0x98-0x9B */ + 0xF3, 0xED, 0xF3, 0xE9, 0xB9, 0x88, 0xB9, 0x89, /* 0x9C-0x9F */ + 0xB9, 0x8A, 0xB9, 0xDC, 0xF3, 0xEE, 0xB9, 0x8B, /* 0xA0-0xA3 */ + 0xB9, 0x8C, 0xB9, 0x8D, 0xF3, 0xE5, 0xF3, 0xE6, /* 0xA4-0xA7 */ + 0xF3, 0xEA, 0xC2, 0xE1, 0xF3, 0xEC, 0xF3, 0xEF, /* 0xA8-0xAB */ + 0xF3, 0xE8, 0xBC, 0xFD, 0xB9, 0x8E, 0xB9, 0x8F, /* 0xAC-0xAF */ + 0xB9, 0x90, 0xCF, 0xE4, 0xB9, 0x91, 0xB9, 0x92, /* 0xB0-0xB3 */ + 0xF3, 0xF0, 0xB9, 0x93, 0xB9, 0x94, 0xB9, 0x95, /* 0xB4-0xB7 */ + 0xF3, 0xE7, 0xB9, 0x96, 0xB9, 0x97, 0xB9, 0x98, /* 0xB8-0xBB */ + 0xB9, 0x99, 0xB9, 0x9A, 0xB9, 0x9B, 0xB9, 0x9C, /* 0xBC-0xBF */ + 0xB9, 0x9D, 0xF3, 0xF2, 0xB9, 0x9E, 0xB9, 0x9F, /* 0xC0-0xC3 */ + 0xB9, 0xA0, 0xBA, 0x40, 0xD7, 0xAD, 0xC6, 0xAA, /* 0xC4-0xC7 */ + 0xBA, 0x41, 0xBA, 0x42, 0xBA, 0x43, 0xBA, 0x44, /* 0xC8-0xCB */ + 0xF3, 0xF3, 0xBA, 0x45, 0xBA, 0x46, 0xBA, 0x47, /* 0xCC-0xCF */ + 0xBA, 0x48, 0xF3, 0xF1, 0xBA, 0x49, 0xC2, 0xA8, /* 0xD0-0xD3 */ + 0xBA, 0x4A, 0xBA, 0x4B, 0xBA, 0x4C, 0xBA, 0x4D, /* 0xD4-0xD7 */ + 0xBA, 0x4E, 0xB8, 0xDD, 0xF3, 0xF5, 0xBA, 0x4F, /* 0xD8-0xDB */ + 0xBA, 0x50, 0xF3, 0xF4, 0xBA, 0x51, 0xBA, 0x52, /* 0xDC-0xDF */ + 0xBA, 0x53, 0xB4, 0xDB, 0xBA, 0x54, 0xBA, 0x55, /* 0xE0-0xE3 */ + 0xBA, 0x56, 0xF3, 0xF6, 0xF3, 0xF7, 0xBA, 0x57, /* 0xE4-0xE7 */ + 0xBA, 0x58, 0xBA, 0x59, 0xF3, 0xF8, 0xBA, 0x5A, /* 0xE8-0xEB */ + 0xBA, 0x5B, 0xBA, 0x5C, 0xC0, 0xBA, 0xBA, 0x5D, /* 0xEC-0xEF */ + 0xBA, 0x5E, 0xC0, 0xE9, 0xBA, 0x5F, 0xBA, 0x60, /* 0xF0-0xF3 */ + 0xBA, 0x61, 0xBA, 0x62, 0xBA, 0x63, 0xC5, 0xF1, /* 0xF4-0xF7 */ + 0xBA, 0x64, 0xBA, 0x65, 0xBA, 0x66, 0xBA, 0x67, /* 0xF8-0xFB */ + 0xF3, 0xFB, 0xBA, 0x68, 0xF3, 0xFA, 0xBA, 0x69, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7C[512] = { + 0xBA, 0x6A, 0xBA, 0x6B, 0xBA, 0x6C, 0xBA, 0x6D, /* 0x00-0x03 */ + 0xBA, 0x6E, 0xBA, 0x6F, 0xBA, 0x70, 0xB4, 0xD8, /* 0x04-0x07 */ + 0xBA, 0x71, 0xBA, 0x72, 0xBA, 0x73, 0xF3, 0xFE, /* 0x08-0x0B */ + 0xF3, 0xF9, 0xBA, 0x74, 0xBA, 0x75, 0xF3, 0xFC, /* 0x0C-0x0F */ + 0xBA, 0x76, 0xBA, 0x77, 0xBA, 0x78, 0xBA, 0x79, /* 0x10-0x13 */ + 0xBA, 0x7A, 0xBA, 0x7B, 0xF3, 0xFD, 0xBA, 0x7C, /* 0x14-0x17 */ + 0xBA, 0x7D, 0xBA, 0x7E, 0xBA, 0x80, 0xBA, 0x81, /* 0x18-0x1B */ + 0xBA, 0x82, 0xBA, 0x83, 0xBA, 0x84, 0xF4, 0xA1, /* 0x1C-0x1F */ + 0xBA, 0x85, 0xBA, 0x86, 0xBA, 0x87, 0xBA, 0x88, /* 0x20-0x23 */ + 0xBA, 0x89, 0xBA, 0x8A, 0xF4, 0xA3, 0xBB, 0xC9, /* 0x24-0x27 */ + 0xBA, 0x8B, 0xBA, 0x8C, 0xF4, 0xA2, 0xBA, 0x8D, /* 0x28-0x2B */ + 0xBA, 0x8E, 0xBA, 0x8F, 0xBA, 0x90, 0xBA, 0x91, /* 0x2C-0x2F */ + 0xBA, 0x92, 0xBA, 0x93, 0xBA, 0x94, 0xBA, 0x95, /* 0x30-0x33 */ + 0xBA, 0x96, 0xBA, 0x97, 0xBA, 0x98, 0xBA, 0x99, /* 0x34-0x37 */ + 0xF4, 0xA4, 0xBA, 0x9A, 0xBA, 0x9B, 0xBA, 0x9C, /* 0x38-0x3B */ + 0xBA, 0x9D, 0xBA, 0x9E, 0xBA, 0x9F, 0xB2, 0xBE, /* 0x3C-0x3F */ + 0xF4, 0xA6, 0xF4, 0xA5, 0xBA, 0xA0, 0xBB, 0x40, /* 0x40-0x43 */ + 0xBB, 0x41, 0xBB, 0x42, 0xBB, 0x43, 0xBB, 0x44, /* 0x44-0x47 */ + 0xBB, 0x45, 0xBB, 0x46, 0xBB, 0x47, 0xBB, 0x48, /* 0x48-0x4B */ + 0xBB, 0x49, 0xBC, 0xAE, 0xBB, 0x4A, 0xBB, 0x4B, /* 0x4C-0x4F */ + 0xBB, 0x4C, 0xBB, 0x4D, 0xBB, 0x4E, 0xBB, 0x4F, /* 0x50-0x53 */ + 0xBB, 0x50, 0xBB, 0x51, 0xBB, 0x52, 0xBB, 0x53, /* 0x54-0x57 */ + 0xBB, 0x54, 0xBB, 0x55, 0xBB, 0x56, 0xBB, 0x57, /* 0x58-0x5B */ + 0xBB, 0x58, 0xBB, 0x59, 0xBB, 0x5A, 0xBB, 0x5B, /* 0x5C-0x5F */ + 0xBB, 0x5C, 0xBB, 0x5D, 0xBB, 0x5E, 0xBB, 0x5F, /* 0x60-0x63 */ + 0xBB, 0x60, 0xBB, 0x61, 0xBB, 0x62, 0xBB, 0x63, /* 0x64-0x67 */ + 0xBB, 0x64, 0xBB, 0x65, 0xBB, 0x66, 0xBB, 0x67, /* 0x68-0x6B */ + 0xBB, 0x68, 0xBB, 0x69, 0xBB, 0x6A, 0xBB, 0x6B, /* 0x6C-0x6F */ + 0xBB, 0x6C, 0xBB, 0x6D, 0xBB, 0x6E, 0xC3, 0xD7, /* 0x70-0x73 */ + 0xD9, 0xE1, 0xBB, 0x6F, 0xBB, 0x70, 0xBB, 0x71, /* 0x74-0x77 */ + 0xBB, 0x72, 0xBB, 0x73, 0xBB, 0x74, 0xC0, 0xE0, /* 0x78-0x7B */ + 0xF4, 0xCC, 0xD7, 0xD1, 0xBB, 0x75, 0xBB, 0x76, /* 0x7C-0x7F */ + + 0xBB, 0x77, 0xBB, 0x78, 0xBB, 0x79, 0xBB, 0x7A, /* 0x80-0x83 */ + 0xBB, 0x7B, 0xBB, 0x7C, 0xBB, 0x7D, 0xBB, 0x7E, /* 0x84-0x87 */ + 0xBB, 0x80, 0xB7, 0xDB, 0xBB, 0x81, 0xBB, 0x82, /* 0x88-0x8B */ + 0xBB, 0x83, 0xBB, 0x84, 0xBB, 0x85, 0xBB, 0x86, /* 0x8C-0x8F */ + 0xBB, 0x87, 0xF4, 0xCE, 0xC1, 0xA3, 0xBB, 0x88, /* 0x90-0x93 */ + 0xBB, 0x89, 0xC6, 0xC9, 0xBB, 0x8A, 0xB4, 0xD6, /* 0x94-0x97 */ + 0xD5, 0xB3, 0xBB, 0x8B, 0xBB, 0x8C, 0xBB, 0x8D, /* 0x98-0x9B */ + 0xF4, 0xD0, 0xF4, 0xCF, 0xF4, 0xD1, 0xCB, 0xDA, /* 0x9C-0x9F */ + 0xBB, 0x8E, 0xBB, 0x8F, 0xF4, 0xD2, 0xBB, 0x90, /* 0xA0-0xA3 */ + 0xD4, 0xC1, 0xD6, 0xE0, 0xBB, 0x91, 0xBB, 0x92, /* 0xA4-0xA7 */ + 0xBB, 0x93, 0xBB, 0x94, 0xB7, 0xE0, 0xBB, 0x95, /* 0xA8-0xAB */ + 0xBB, 0x96, 0xBB, 0x97, 0xC1, 0xB8, 0xBB, 0x98, /* 0xAC-0xAF */ + 0xBB, 0x99, 0xC1, 0xBB, 0xF4, 0xD3, 0xBE, 0xAC, /* 0xB0-0xB3 */ + 0xBB, 0x9A, 0xBB, 0x9B, 0xBB, 0x9C, 0xBB, 0x9D, /* 0xB4-0xB7 */ + 0xBB, 0x9E, 0xB4, 0xE2, 0xBB, 0x9F, 0xBB, 0xA0, /* 0xB8-0xBB */ + 0xF4, 0xD4, 0xF4, 0xD5, 0xBE, 0xAB, 0xBC, 0x40, /* 0xBC-0xBF */ + 0xBC, 0x41, 0xF4, 0xD6, 0xBC, 0x42, 0xBC, 0x43, /* 0xC0-0xC3 */ + 0xBC, 0x44, 0xF4, 0xDB, 0xBC, 0x45, 0xF4, 0xD7, /* 0xC4-0xC7 */ + 0xF4, 0xDA, 0xBC, 0x46, 0xBA, 0xFD, 0xBC, 0x47, /* 0xC8-0xCB */ + 0xF4, 0xD8, 0xF4, 0xD9, 0xBC, 0x48, 0xBC, 0x49, /* 0xCC-0xCF */ + 0xBC, 0x4A, 0xBC, 0x4B, 0xBC, 0x4C, 0xBC, 0x4D, /* 0xD0-0xD3 */ + 0xBC, 0x4E, 0xB8, 0xE2, 0xCC, 0xC7, 0xF4, 0xDC, /* 0xD4-0xD7 */ + 0xBC, 0x4F, 0xB2, 0xDA, 0xBC, 0x50, 0xBC, 0x51, /* 0xD8-0xDB */ + 0xC3, 0xD3, 0xBC, 0x52, 0xBC, 0x53, 0xD4, 0xE3, /* 0xDC-0xDF */ + 0xBF, 0xB7, 0xBC, 0x54, 0xBC, 0x55, 0xBC, 0x56, /* 0xE0-0xE3 */ + 0xBC, 0x57, 0xBC, 0x58, 0xBC, 0x59, 0xBC, 0x5A, /* 0xE4-0xE7 */ + 0xF4, 0xDD, 0xBC, 0x5B, 0xBC, 0x5C, 0xBC, 0x5D, /* 0xE8-0xEB */ + 0xBC, 0x5E, 0xBC, 0x5F, 0xBC, 0x60, 0xC5, 0xB4, /* 0xEC-0xEF */ + 0xBC, 0x61, 0xBC, 0x62, 0xBC, 0x63, 0xBC, 0x64, /* 0xF0-0xF3 */ + 0xBC, 0x65, 0xBC, 0x66, 0xBC, 0x67, 0xBC, 0x68, /* 0xF4-0xF7 */ + 0xF4, 0xE9, 0xBC, 0x69, 0xBC, 0x6A, 0xCF, 0xB5, /* 0xF8-0xFB */ + 0xBC, 0x6B, 0xBC, 0x6C, 0xBC, 0x6D, 0xBC, 0x6E, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7D[512] = { + 0xBC, 0x6F, 0xBC, 0x70, 0xBC, 0x71, 0xBC, 0x72, /* 0x00-0x03 */ + 0xBC, 0x73, 0xBC, 0x74, 0xBC, 0x75, 0xBC, 0x76, /* 0x04-0x07 */ + 0xBC, 0x77, 0xBC, 0x78, 0xCE, 0xC9, 0xBC, 0x79, /* 0x08-0x0B */ + 0xBC, 0x7A, 0xBC, 0x7B, 0xBC, 0x7C, 0xBC, 0x7D, /* 0x0C-0x0F */ + 0xBC, 0x7E, 0xBC, 0x80, 0xBC, 0x81, 0xBC, 0x82, /* 0x10-0x13 */ + 0xBC, 0x83, 0xBC, 0x84, 0xBC, 0x85, 0xBC, 0x86, /* 0x14-0x17 */ + 0xBC, 0x87, 0xBC, 0x88, 0xBC, 0x89, 0xBC, 0x8A, /* 0x18-0x1B */ + 0xBC, 0x8B, 0xBC, 0x8C, 0xBC, 0x8D, 0xBC, 0x8E, /* 0x1C-0x1F */ + 0xCB, 0xD8, 0xBC, 0x8F, 0xCB, 0xF7, 0xBC, 0x90, /* 0x20-0x23 */ + 0xBC, 0x91, 0xBC, 0x92, 0xBC, 0x93, 0xBD, 0xF4, /* 0x24-0x27 */ + 0xBC, 0x94, 0xBC, 0x95, 0xBC, 0x96, 0xD7, 0xCF, /* 0x28-0x2B */ + 0xBC, 0x97, 0xBC, 0x98, 0xBC, 0x99, 0xC0, 0xDB, /* 0x2C-0x2F */ + 0xBC, 0x9A, 0xBC, 0x9B, 0xBC, 0x9C, 0xBC, 0x9D, /* 0x30-0x33 */ + 0xBC, 0x9E, 0xBC, 0x9F, 0xBC, 0xA0, 0xBD, 0x40, /* 0x34-0x37 */ + 0xBD, 0x41, 0xBD, 0x42, 0xBD, 0x43, 0xBD, 0x44, /* 0x38-0x3B */ + 0xBD, 0x45, 0xBD, 0x46, 0xBD, 0x47, 0xBD, 0x48, /* 0x3C-0x3F */ + 0xBD, 0x49, 0xBD, 0x4A, 0xBD, 0x4B, 0xBD, 0x4C, /* 0x40-0x43 */ + 0xBD, 0x4D, 0xBD, 0x4E, 0xBD, 0x4F, 0xBD, 0x50, /* 0x44-0x47 */ + 0xBD, 0x51, 0xBD, 0x52, 0xBD, 0x53, 0xBD, 0x54, /* 0x48-0x4B */ + 0xBD, 0x55, 0xBD, 0x56, 0xBD, 0x57, 0xBD, 0x58, /* 0x4C-0x4F */ + 0xBD, 0x59, 0xBD, 0x5A, 0xBD, 0x5B, 0xBD, 0x5C, /* 0x50-0x53 */ + 0xBD, 0x5D, 0xBD, 0x5E, 0xBD, 0x5F, 0xBD, 0x60, /* 0x54-0x57 */ + 0xBD, 0x61, 0xBD, 0x62, 0xBD, 0x63, 0xBD, 0x64, /* 0x58-0x5B */ + 0xBD, 0x65, 0xBD, 0x66, 0xBD, 0x67, 0xBD, 0x68, /* 0x5C-0x5F */ + 0xBD, 0x69, 0xBD, 0x6A, 0xBD, 0x6B, 0xBD, 0x6C, /* 0x60-0x63 */ + 0xBD, 0x6D, 0xBD, 0x6E, 0xBD, 0x6F, 0xBD, 0x70, /* 0x64-0x67 */ + 0xBD, 0x71, 0xBD, 0x72, 0xBD, 0x73, 0xBD, 0x74, /* 0x68-0x6B */ + 0xBD, 0x75, 0xBD, 0x76, 0xD0, 0xF5, 0xBD, 0x77, /* 0x6C-0x6F */ + 0xBD, 0x78, 0xBD, 0x79, 0xBD, 0x7A, 0xBD, 0x7B, /* 0x70-0x73 */ + 0xBD, 0x7C, 0xBD, 0x7D, 0xBD, 0x7E, 0xF4, 0xEA, /* 0x74-0x77 */ + 0xBD, 0x80, 0xBD, 0x81, 0xBD, 0x82, 0xBD, 0x83, /* 0x78-0x7B */ + 0xBD, 0x84, 0xBD, 0x85, 0xBD, 0x86, 0xBD, 0x87, /* 0x7C-0x7F */ + + 0xBD, 0x88, 0xBD, 0x89, 0xBD, 0x8A, 0xBD, 0x8B, /* 0x80-0x83 */ + 0xBD, 0x8C, 0xBD, 0x8D, 0xBD, 0x8E, 0xBD, 0x8F, /* 0x84-0x87 */ + 0xBD, 0x90, 0xBD, 0x91, 0xBD, 0x92, 0xBD, 0x93, /* 0x88-0x8B */ + 0xBD, 0x94, 0xBD, 0x95, 0xBD, 0x96, 0xBD, 0x97, /* 0x8C-0x8F */ + 0xBD, 0x98, 0xBD, 0x99, 0xBD, 0x9A, 0xBD, 0x9B, /* 0x90-0x93 */ + 0xBD, 0x9C, 0xBD, 0x9D, 0xBD, 0x9E, 0xBD, 0x9F, /* 0x94-0x97 */ + 0xBD, 0xA0, 0xBE, 0x40, 0xBE, 0x41, 0xBE, 0x42, /* 0x98-0x9B */ + 0xBE, 0x43, 0xBE, 0x44, 0xBE, 0x45, 0xBE, 0x46, /* 0x9C-0x9F */ + 0xBE, 0x47, 0xBE, 0x48, 0xBE, 0x49, 0xBE, 0x4A, /* 0xA0-0xA3 */ + 0xBE, 0x4B, 0xBE, 0x4C, 0xF4, 0xEB, 0xBE, 0x4D, /* 0xA4-0xA7 */ + 0xBE, 0x4E, 0xBE, 0x4F, 0xBE, 0x50, 0xBE, 0x51, /* 0xA8-0xAB */ + 0xBE, 0x52, 0xBE, 0x53, 0xF4, 0xEC, 0xBE, 0x54, /* 0xAC-0xAF */ + 0xBE, 0x55, 0xBE, 0x56, 0xBE, 0x57, 0xBE, 0x58, /* 0xB0-0xB3 */ + 0xBE, 0x59, 0xBE, 0x5A, 0xBE, 0x5B, 0xBE, 0x5C, /* 0xB4-0xB7 */ + 0xBE, 0x5D, 0xBE, 0x5E, 0xBE, 0x5F, 0xBE, 0x60, /* 0xB8-0xBB */ + 0xBE, 0x61, 0xBE, 0x62, 0xBE, 0x63, 0xBE, 0x64, /* 0xBC-0xBF */ + 0xBE, 0x65, 0xBE, 0x66, 0xBE, 0x67, 0xBE, 0x68, /* 0xC0-0xC3 */ + 0xBE, 0x69, 0xBE, 0x6A, 0xBE, 0x6B, 0xBE, 0x6C, /* 0xC4-0xC7 */ + 0xBE, 0x6D, 0xBE, 0x6E, 0xBE, 0x6F, 0xBE, 0x70, /* 0xC8-0xCB */ + 0xBE, 0x71, 0xBE, 0x72, 0xBE, 0x73, 0xBE, 0x74, /* 0xCC-0xCF */ + 0xBE, 0x75, 0xBE, 0x76, 0xBE, 0x77, 0xBE, 0x78, /* 0xD0-0xD3 */ + 0xBE, 0x79, 0xBE, 0x7A, 0xBE, 0x7B, 0xBE, 0x7C, /* 0xD4-0xD7 */ + 0xBE, 0x7D, 0xBE, 0x7E, 0xBE, 0x80, 0xBE, 0x81, /* 0xD8-0xDB */ + 0xBE, 0x82, 0xBE, 0x83, 0xBE, 0x84, 0xBE, 0x85, /* 0xDC-0xDF */ + 0xBE, 0x86, 0xBE, 0x87, 0xBE, 0x88, 0xBE, 0x89, /* 0xE0-0xE3 */ + 0xBE, 0x8A, 0xBE, 0x8B, 0xBE, 0x8C, 0xBE, 0x8D, /* 0xE4-0xE7 */ + 0xBE, 0x8E, 0xBE, 0x8F, 0xBE, 0x90, 0xBE, 0x91, /* 0xE8-0xEB */ + 0xBE, 0x92, 0xBE, 0x93, 0xBE, 0x94, 0xBE, 0x95, /* 0xEC-0xEF */ + 0xBE, 0x96, 0xBE, 0x97, 0xBE, 0x98, 0xBE, 0x99, /* 0xF0-0xF3 */ + 0xBE, 0x9A, 0xBE, 0x9B, 0xBE, 0x9C, 0xBE, 0x9D, /* 0xF4-0xF7 */ + 0xBE, 0x9E, 0xBE, 0x9F, 0xBE, 0xA0, 0xBF, 0x40, /* 0xF8-0xFB */ + 0xBF, 0x41, 0xBF, 0x42, 0xBF, 0x43, 0xBF, 0x44, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7E[512] = { + 0xBF, 0x45, 0xBF, 0x46, 0xBF, 0x47, 0xBF, 0x48, /* 0x00-0x03 */ + 0xBF, 0x49, 0xBF, 0x4A, 0xBF, 0x4B, 0xBF, 0x4C, /* 0x04-0x07 */ + 0xBF, 0x4D, 0xBF, 0x4E, 0xBF, 0x4F, 0xBF, 0x50, /* 0x08-0x0B */ + 0xBF, 0x51, 0xBF, 0x52, 0xBF, 0x53, 0xBF, 0x54, /* 0x0C-0x0F */ + 0xBF, 0x55, 0xBF, 0x56, 0xBF, 0x57, 0xBF, 0x58, /* 0x10-0x13 */ + 0xBF, 0x59, 0xBF, 0x5A, 0xBF, 0x5B, 0xBF, 0x5C, /* 0x14-0x17 */ + 0xBF, 0x5D, 0xBF, 0x5E, 0xBF, 0x5F, 0xBF, 0x60, /* 0x18-0x1B */ + 0xBF, 0x61, 0xBF, 0x62, 0xBF, 0x63, 0xBF, 0x64, /* 0x1C-0x1F */ + 0xBF, 0x65, 0xBF, 0x66, 0xBF, 0x67, 0xBF, 0x68, /* 0x20-0x23 */ + 0xBF, 0x69, 0xBF, 0x6A, 0xBF, 0x6B, 0xBF, 0x6C, /* 0x24-0x27 */ + 0xBF, 0x6D, 0xBF, 0x6E, 0xBF, 0x6F, 0xBF, 0x70, /* 0x28-0x2B */ + 0xBF, 0x71, 0xBF, 0x72, 0xBF, 0x73, 0xBF, 0x74, /* 0x2C-0x2F */ + 0xBF, 0x75, 0xBF, 0x76, 0xBF, 0x77, 0xBF, 0x78, /* 0x30-0x33 */ + 0xBF, 0x79, 0xBF, 0x7A, 0xBF, 0x7B, 0xBF, 0x7C, /* 0x34-0x37 */ + 0xBF, 0x7D, 0xBF, 0x7E, 0xBF, 0x80, 0xF7, 0xE3, /* 0x38-0x3B */ + 0xBF, 0x81, 0xBF, 0x82, 0xBF, 0x83, 0xBF, 0x84, /* 0x3C-0x3F */ + 0xBF, 0x85, 0xB7, 0xB1, 0xBF, 0x86, 0xBF, 0x87, /* 0x40-0x43 */ + 0xBF, 0x88, 0xBF, 0x89, 0xBF, 0x8A, 0xF4, 0xED, /* 0x44-0x47 */ + 0xBF, 0x8B, 0xBF, 0x8C, 0xBF, 0x8D, 0xBF, 0x8E, /* 0x48-0x4B */ + 0xBF, 0x8F, 0xBF, 0x90, 0xBF, 0x91, 0xBF, 0x92, /* 0x4C-0x4F */ + 0xBF, 0x93, 0xBF, 0x94, 0xBF, 0x95, 0xBF, 0x96, /* 0x50-0x53 */ + 0xBF, 0x97, 0xBF, 0x98, 0xBF, 0x99, 0xBF, 0x9A, /* 0x54-0x57 */ + 0xBF, 0x9B, 0xBF, 0x9C, 0xBF, 0x9D, 0xBF, 0x9E, /* 0x58-0x5B */ + 0xBF, 0x9F, 0xBF, 0xA0, 0xC0, 0x40, 0xC0, 0x41, /* 0x5C-0x5F */ + 0xC0, 0x42, 0xC0, 0x43, 0xC0, 0x44, 0xC0, 0x45, /* 0x60-0x63 */ + 0xC0, 0x46, 0xC0, 0x47, 0xC0, 0x48, 0xC0, 0x49, /* 0x64-0x67 */ + 0xC0, 0x4A, 0xC0, 0x4B, 0xC0, 0x4C, 0xC0, 0x4D, /* 0x68-0x6B */ + 0xC0, 0x4E, 0xC0, 0x4F, 0xC0, 0x50, 0xC0, 0x51, /* 0x6C-0x6F */ + 0xC0, 0x52, 0xC0, 0x53, 0xC0, 0x54, 0xC0, 0x55, /* 0x70-0x73 */ + 0xC0, 0x56, 0xC0, 0x57, 0xC0, 0x58, 0xC0, 0x59, /* 0x74-0x77 */ + 0xC0, 0x5A, 0xC0, 0x5B, 0xC0, 0x5C, 0xC0, 0x5D, /* 0x78-0x7B */ + 0xC0, 0x5E, 0xC0, 0x5F, 0xC0, 0x60, 0xC0, 0x61, /* 0x7C-0x7F */ + + 0xC0, 0x62, 0xC0, 0x63, 0xD7, 0xEB, 0xC0, 0x64, /* 0x80-0x83 */ + 0xC0, 0x65, 0xC0, 0x66, 0xC0, 0x67, 0xC0, 0x68, /* 0x84-0x87 */ + 0xC0, 0x69, 0xC0, 0x6A, 0xC0, 0x6B, 0xC0, 0x6C, /* 0x88-0x8B */ + 0xC0, 0x6D, 0xC0, 0x6E, 0xC0, 0x6F, 0xC0, 0x70, /* 0x8C-0x8F */ + 0xC0, 0x71, 0xC0, 0x72, 0xC0, 0x73, 0xC0, 0x74, /* 0x90-0x93 */ + 0xC0, 0x75, 0xC0, 0x76, 0xC0, 0x77, 0xC0, 0x78, /* 0x94-0x97 */ + 0xC0, 0x79, 0xC0, 0x7A, 0xC0, 0x7B, 0xF4, 0xEE, /* 0x98-0x9B */ + 0xC0, 0x7C, 0xC0, 0x7D, 0xC0, 0x7E, 0xE6, 0xF9, /* 0x9C-0x9F */ + 0xBE, 0xC0, 0xE6, 0xFA, 0xBA, 0xEC, 0xE6, 0xFB, /* 0xA0-0xA3 */ + 0xCF, 0xCB, 0xE6, 0xFC, 0xD4, 0xBC, 0xBC, 0xB6, /* 0xA4-0xA7 */ + 0xE6, 0xFD, 0xE6, 0xFE, 0xBC, 0xCD, 0xC8, 0xD2, /* 0xA8-0xAB */ + 0xCE, 0xB3, 0xE7, 0xA1, 0xC0, 0x80, 0xB4, 0xBF, /* 0xAC-0xAF */ + 0xE7, 0xA2, 0xC9, 0xB4, 0xB8, 0xD9, 0xC4, 0xC9, /* 0xB0-0xB3 */ + 0xC0, 0x81, 0xD7, 0xDD, 0xC2, 0xDA, 0xB7, 0xD7, /* 0xB4-0xB7 */ + 0xD6, 0xBD, 0xCE, 0xC6, 0xB7, 0xC4, 0xC0, 0x82, /* 0xB8-0xBB */ + 0xC0, 0x83, 0xC5, 0xA6, 0xE7, 0xA3, 0xCF, 0xDF, /* 0xBC-0xBF */ + 0xE7, 0xA4, 0xE7, 0xA5, 0xE7, 0xA6, 0xC1, 0xB7, /* 0xC0-0xC3 */ + 0xD7, 0xE9, 0xC9, 0xF0, 0xCF, 0xB8, 0xD6, 0xAF, /* 0xC4-0xC7 */ + 0xD6, 0xD5, 0xE7, 0xA7, 0xB0, 0xED, 0xE7, 0xA8, /* 0xC8-0xCB */ + 0xE7, 0xA9, 0xC9, 0xDC, 0xD2, 0xEF, 0xBE, 0xAD, /* 0xCC-0xCF */ + 0xE7, 0xAA, 0xB0, 0xF3, 0xC8, 0xDE, 0xBD, 0xE1, /* 0xD0-0xD3 */ + 0xE7, 0xAB, 0xC8, 0xC6, 0xC0, 0x84, 0xE7, 0xAC, /* 0xD4-0xD7 */ + 0xBB, 0xE6, 0xB8, 0xF8, 0xD1, 0xA4, 0xE7, 0xAD, /* 0xD8-0xDB */ + 0xC2, 0xE7, 0xBE, 0xF8, 0xBD, 0xCA, 0xCD, 0xB3, /* 0xDC-0xDF */ + 0xE7, 0xAE, 0xE7, 0xAF, 0xBE, 0xEE, 0xD0, 0xE5, /* 0xE0-0xE3 */ + 0xC0, 0x85, 0xCB, 0xE7, 0xCC, 0xD0, 0xBC, 0xCC, /* 0xE4-0xE7 */ + 0xE7, 0xB0, 0xBC, 0xA8, 0xD0, 0xF7, 0xE7, 0xB1, /* 0xE8-0xEB */ + 0xC0, 0x86, 0xD0, 0xF8, 0xE7, 0xB2, 0xE7, 0xB3, /* 0xEC-0xEF */ + 0xB4, 0xC2, 0xE7, 0xB4, 0xE7, 0xB5, 0xC9, 0xFE, /* 0xF0-0xF3 */ + 0xCE, 0xAC, 0xC3, 0xE0, 0xE7, 0xB7, 0xB1, 0xC1, /* 0xF4-0xF7 */ + 0xB3, 0xF1, 0xC0, 0x87, 0xE7, 0xB8, 0xE7, 0xB9, /* 0xF8-0xFB */ + 0xD7, 0xDB, 0xD5, 0xC0, 0xE7, 0xBA, 0xC2, 0xCC, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7F[512] = { + 0xD7, 0xBA, 0xE7, 0xBB, 0xE7, 0xBC, 0xE7, 0xBD, /* 0x00-0x03 */ + 0xBC, 0xEA, 0xC3, 0xE5, 0xC0, 0xC2, 0xE7, 0xBE, /* 0x04-0x07 */ + 0xE7, 0xBF, 0xBC, 0xA9, 0xC0, 0x88, 0xE7, 0xC0, /* 0x08-0x0B */ + 0xE7, 0xC1, 0xE7, 0xB6, 0xB6, 0xD0, 0xE7, 0xC2, /* 0x0C-0x0F */ + 0xC0, 0x89, 0xE7, 0xC3, 0xE7, 0xC4, 0xBB, 0xBA, /* 0x10-0x13 */ + 0xB5, 0xDE, 0xC2, 0xC6, 0xB1, 0xE0, 0xE7, 0xC5, /* 0x14-0x17 */ + 0xD4, 0xB5, 0xE7, 0xC6, 0xB8, 0xBF, 0xE7, 0xC8, /* 0x18-0x1B */ + 0xE7, 0xC7, 0xB7, 0xEC, 0xC0, 0x8A, 0xE7, 0xC9, /* 0x1C-0x1F */ + 0xB2, 0xF8, 0xE7, 0xCA, 0xE7, 0xCB, 0xE7, 0xCC, /* 0x20-0x23 */ + 0xE7, 0xCD, 0xE7, 0xCE, 0xE7, 0xCF, 0xE7, 0xD0, /* 0x24-0x27 */ + 0xD3, 0xA7, 0xCB, 0xF5, 0xE7, 0xD1, 0xE7, 0xD2, /* 0x28-0x2B */ + 0xE7, 0xD3, 0xE7, 0xD4, 0xC9, 0xC9, 0xE7, 0xD5, /* 0x2C-0x2F */ + 0xE7, 0xD6, 0xE7, 0xD7, 0xE7, 0xD8, 0xE7, 0xD9, /* 0x30-0x33 */ + 0xBD, 0xC9, 0xE7, 0xDA, 0xF3, 0xBE, 0xC0, 0x8B, /* 0x34-0x37 */ + 0xB8, 0xD7, 0xC0, 0x8C, 0xC8, 0xB1, 0xC0, 0x8D, /* 0x38-0x3B */ + 0xC0, 0x8E, 0xC0, 0x8F, 0xC0, 0x90, 0xC0, 0x91, /* 0x3C-0x3F */ + 0xC0, 0x92, 0xC0, 0x93, 0xF3, 0xBF, 0xC0, 0x94, /* 0x40-0x43 */ + 0xF3, 0xC0, 0xF3, 0xC1, 0xC0, 0x95, 0xC0, 0x96, /* 0x44-0x47 */ + 0xC0, 0x97, 0xC0, 0x98, 0xC0, 0x99, 0xC0, 0x9A, /* 0x48-0x4B */ + 0xC0, 0x9B, 0xC0, 0x9C, 0xC0, 0x9D, 0xC0, 0x9E, /* 0x4C-0x4F */ + 0xB9, 0xDE, 0xCD, 0xF8, 0xC0, 0x9F, 0xC0, 0xA0, /* 0x50-0x53 */ + 0xD8, 0xE8, 0xBA, 0xB1, 0xC1, 0x40, 0xC2, 0xDE, /* 0x54-0x57 */ + 0xEE, 0xB7, 0xC1, 0x41, 0xB7, 0xA3, 0xC1, 0x42, /* 0x58-0x5B */ + 0xC1, 0x43, 0xC1, 0x44, 0xC1, 0x45, 0xEE, 0xB9, /* 0x5C-0x5F */ + 0xC1, 0x46, 0xEE, 0xB8, 0xB0, 0xD5, 0xC1, 0x47, /* 0x60-0x63 */ + 0xC1, 0x48, 0xC1, 0x49, 0xC1, 0x4A, 0xC1, 0x4B, /* 0x64-0x67 */ + 0xEE, 0xBB, 0xD5, 0xD6, 0xD7, 0xEF, 0xC1, 0x4C, /* 0x68-0x6B */ + 0xC1, 0x4D, 0xC1, 0x4E, 0xD6, 0xC3, 0xC1, 0x4F, /* 0x6C-0x6F */ + 0xC1, 0x50, 0xEE, 0xBD, 0xCA, 0xF0, 0xC1, 0x51, /* 0x70-0x73 */ + 0xEE, 0xBC, 0xC1, 0x52, 0xC1, 0x53, 0xC1, 0x54, /* 0x74-0x77 */ + 0xC1, 0x55, 0xEE, 0xBE, 0xC1, 0x56, 0xC1, 0x57, /* 0x78-0x7B */ + 0xC1, 0x58, 0xC1, 0x59, 0xEE, 0xC0, 0xC1, 0x5A, /* 0x7C-0x7F */ + + 0xC1, 0x5B, 0xEE, 0xBF, 0xC1, 0x5C, 0xC1, 0x5D, /* 0x80-0x83 */ + 0xC1, 0x5E, 0xC1, 0x5F, 0xC1, 0x60, 0xC1, 0x61, /* 0x84-0x87 */ + 0xC1, 0x62, 0xC1, 0x63, 0xD1, 0xF2, 0xC1, 0x64, /* 0x88-0x8B */ + 0xC7, 0xBC, 0xC1, 0x65, 0xC3, 0xC0, 0xC1, 0x66, /* 0x8C-0x8F */ + 0xC1, 0x67, 0xC1, 0x68, 0xC1, 0x69, 0xC1, 0x6A, /* 0x90-0x93 */ + 0xB8, 0xE1, 0xC1, 0x6B, 0xC1, 0x6C, 0xC1, 0x6D, /* 0x94-0x97 */ + 0xC1, 0x6E, 0xC1, 0x6F, 0xC1, 0xE7, 0xC1, 0x70, /* 0x98-0x9B */ + 0xC1, 0x71, 0xF4, 0xC6, 0xD0, 0xDF, 0xF4, 0xC7, /* 0x9C-0x9F */ + 0xC1, 0x72, 0xCF, 0xDB, 0xC1, 0x73, 0xC1, 0x74, /* 0xA0-0xA3 */ + 0xC8, 0xBA, 0xC1, 0x75, 0xC1, 0x76, 0xF4, 0xC8, /* 0xA4-0xA7 */ + 0xC1, 0x77, 0xC1, 0x78, 0xC1, 0x79, 0xC1, 0x7A, /* 0xA8-0xAB */ + 0xC1, 0x7B, 0xC1, 0x7C, 0xC1, 0x7D, 0xF4, 0xC9, /* 0xAC-0xAF */ + 0xF4, 0xCA, 0xC1, 0x7E, 0xF4, 0xCB, 0xC1, 0x80, /* 0xB0-0xB3 */ + 0xC1, 0x81, 0xC1, 0x82, 0xC1, 0x83, 0xC1, 0x84, /* 0xB4-0xB7 */ + 0xD9, 0xFA, 0xB8, 0xFE, 0xC1, 0x85, 0xC1, 0x86, /* 0xB8-0xBB */ + 0xE5, 0xF1, 0xD3, 0xF0, 0xC1, 0x87, 0xF4, 0xE0, /* 0xBC-0xBF */ + 0xC1, 0x88, 0xCE, 0xCC, 0xC1, 0x89, 0xC1, 0x8A, /* 0xC0-0xC3 */ + 0xC1, 0x8B, 0xB3, 0xE1, 0xC1, 0x8C, 0xC1, 0x8D, /* 0xC4-0xC7 */ + 0xC1, 0x8E, 0xC1, 0x8F, 0xF1, 0xB4, 0xC1, 0x90, /* 0xC8-0xCB */ + 0xD2, 0xEE, 0xC1, 0x91, 0xF4, 0xE1, 0xC1, 0x92, /* 0xCC-0xCF */ + 0xC1, 0x93, 0xC1, 0x94, 0xC1, 0x95, 0xC1, 0x96, /* 0xD0-0xD3 */ + 0xCF, 0xE8, 0xF4, 0xE2, 0xC1, 0x97, 0xC1, 0x98, /* 0xD4-0xD7 */ + 0xC7, 0xCC, 0xC1, 0x99, 0xC1, 0x9A, 0xC1, 0x9B, /* 0xD8-0xDB */ + 0xC1, 0x9C, 0xC1, 0x9D, 0xC1, 0x9E, 0xB5, 0xD4, /* 0xDC-0xDF */ + 0xB4, 0xE4, 0xF4, 0xE4, 0xC1, 0x9F, 0xC1, 0xA0, /* 0xE0-0xE3 */ + 0xC2, 0x40, 0xF4, 0xE3, 0xF4, 0xE5, 0xC2, 0x41, /* 0xE4-0xE7 */ + 0xC2, 0x42, 0xF4, 0xE6, 0xC2, 0x43, 0xC2, 0x44, /* 0xE8-0xEB */ + 0xC2, 0x45, 0xC2, 0x46, 0xF4, 0xE7, 0xC2, 0x47, /* 0xEC-0xEF */ + 0xBA, 0xB2, 0xB0, 0xBF, 0xC2, 0x48, 0xF4, 0xE8, /* 0xF0-0xF3 */ + 0xC2, 0x49, 0xC2, 0x4A, 0xC2, 0x4B, 0xC2, 0x4C, /* 0xF4-0xF7 */ + 0xC2, 0x4D, 0xC2, 0x4E, 0xC2, 0x4F, 0xB7, 0xAD, /* 0xF8-0xFB */ + 0xD2, 0xED, 0xC2, 0x50, 0xC2, 0x51, 0xC2, 0x52, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_80[512] = { + 0xD2, 0xAB, 0xC0, 0xCF, 0xC2, 0x53, 0xBF, 0xBC, /* 0x00-0x03 */ + 0xEB, 0xA3, 0xD5, 0xDF, 0xEA, 0xC8, 0xC2, 0x54, /* 0x04-0x07 */ + 0xC2, 0x55, 0xC2, 0x56, 0xC2, 0x57, 0xF1, 0xF3, /* 0x08-0x0B */ + 0xB6, 0xF8, 0xCB, 0xA3, 0xC2, 0x58, 0xC2, 0x59, /* 0x0C-0x0F */ + 0xC4, 0xCD, 0xC2, 0x5A, 0xF1, 0xE7, 0xC2, 0x5B, /* 0x10-0x13 */ + 0xF1, 0xE8, 0xB8, 0xFB, 0xF1, 0xE9, 0xBA, 0xC4, /* 0x14-0x17 */ + 0xD4, 0xC5, 0xB0, 0xD2, 0xC2, 0x5C, 0xC2, 0x5D, /* 0x18-0x1B */ + 0xF1, 0xEA, 0xC2, 0x5E, 0xC2, 0x5F, 0xC2, 0x60, /* 0x1C-0x1F */ + 0xF1, 0xEB, 0xC2, 0x61, 0xF1, 0xEC, 0xC2, 0x62, /* 0x20-0x23 */ + 0xC2, 0x63, 0xF1, 0xED, 0xF1, 0xEE, 0xF1, 0xEF, /* 0x24-0x27 */ + 0xF1, 0xF1, 0xF1, 0xF0, 0xC5, 0xD5, 0xC2, 0x64, /* 0x28-0x2B */ + 0xC2, 0x65, 0xC2, 0x66, 0xC2, 0x67, 0xC2, 0x68, /* 0x2C-0x2F */ + 0xC2, 0x69, 0xF1, 0xF2, 0xC2, 0x6A, 0xB6, 0xFA, /* 0x30-0x33 */ + 0xC2, 0x6B, 0xF1, 0xF4, 0xD2, 0xAE, 0xDE, 0xC7, /* 0x34-0x37 */ + 0xCB, 0xCA, 0xC2, 0x6C, 0xC2, 0x6D, 0xB3, 0xDC, /* 0x38-0x3B */ + 0xC2, 0x6E, 0xB5, 0xA2, 0xC2, 0x6F, 0xB9, 0xA2, /* 0x3C-0x3F */ + 0xC2, 0x70, 0xC2, 0x71, 0xC4, 0xF4, 0xF1, 0xF5, /* 0x40-0x43 */ + 0xC2, 0x72, 0xC2, 0x73, 0xF1, 0xF6, 0xC2, 0x74, /* 0x44-0x47 */ + 0xC2, 0x75, 0xC2, 0x76, 0xC1, 0xC4, 0xC1, 0xFB, /* 0x48-0x4B */ + 0xD6, 0xB0, 0xF1, 0xF7, 0xC2, 0x77, 0xC2, 0x78, /* 0x4C-0x4F */ + 0xC2, 0x79, 0xC2, 0x7A, 0xF1, 0xF8, 0xC2, 0x7B, /* 0x50-0x53 */ + 0xC1, 0xAA, 0xC2, 0x7C, 0xC2, 0x7D, 0xC2, 0x7E, /* 0x54-0x57 */ + 0xC6, 0xB8, 0xC2, 0x80, 0xBE, 0xDB, 0xC2, 0x81, /* 0x58-0x5B */ + 0xC2, 0x82, 0xC2, 0x83, 0xC2, 0x84, 0xC2, 0x85, /* 0x5C-0x5F */ + 0xC2, 0x86, 0xC2, 0x87, 0xC2, 0x88, 0xC2, 0x89, /* 0x60-0x63 */ + 0xC2, 0x8A, 0xC2, 0x8B, 0xC2, 0x8C, 0xC2, 0x8D, /* 0x64-0x67 */ + 0xC2, 0x8E, 0xF1, 0xF9, 0xB4, 0xCF, 0xC2, 0x8F, /* 0x68-0x6B */ + 0xC2, 0x90, 0xC2, 0x91, 0xC2, 0x92, 0xC2, 0x93, /* 0x6C-0x6F */ + 0xC2, 0x94, 0xF1, 0xFA, 0xC2, 0x95, 0xC2, 0x96, /* 0x70-0x73 */ + 0xC2, 0x97, 0xC2, 0x98, 0xC2, 0x99, 0xC2, 0x9A, /* 0x74-0x77 */ + 0xC2, 0x9B, 0xC2, 0x9C, 0xC2, 0x9D, 0xC2, 0x9E, /* 0x78-0x7B */ + 0xC2, 0x9F, 0xC2, 0xA0, 0xC3, 0x40, 0xED, 0xB2, /* 0x7C-0x7F */ + + 0xED, 0xB1, 0xC3, 0x41, 0xC3, 0x42, 0xCB, 0xE0, /* 0x80-0x83 */ + 0xD2, 0xDE, 0xC3, 0x43, 0xCB, 0xC1, 0xD5, 0xD8, /* 0x84-0x87 */ + 0xC3, 0x44, 0xC8, 0xE2, 0xC3, 0x45, 0xC0, 0xDF, /* 0x88-0x8B */ + 0xBC, 0xA1, 0xC3, 0x46, 0xC3, 0x47, 0xC3, 0x48, /* 0x8C-0x8F */ + 0xC3, 0x49, 0xC3, 0x4A, 0xC3, 0x4B, 0xEB, 0xC1, /* 0x90-0x93 */ + 0xC3, 0x4C, 0xC3, 0x4D, 0xD0, 0xA4, 0xC3, 0x4E, /* 0x94-0x97 */ + 0xD6, 0xE2, 0xC3, 0x4F, 0xB6, 0xC7, 0xB8, 0xD8, /* 0x98-0x9B */ + 0xEB, 0xC0, 0xB8, 0xCE, 0xC3, 0x50, 0xEB, 0xBF, /* 0x9C-0x9F */ + 0xB3, 0xA6, 0xB9, 0xC9, 0xD6, 0xAB, 0xC3, 0x51, /* 0xA0-0xA3 */ + 0xB7, 0xF4, 0xB7, 0xCA, 0xC3, 0x52, 0xC3, 0x53, /* 0xA4-0xA7 */ + 0xC3, 0x54, 0xBC, 0xE7, 0xB7, 0xBE, 0xEB, 0xC6, /* 0xA8-0xAB */ + 0xC3, 0x55, 0xEB, 0xC7, 0xB0, 0xB9, 0xBF, 0xCF, /* 0xAC-0xAF */ + 0xC3, 0x56, 0xEB, 0xC5, 0xD3, 0xFD, 0xC3, 0x57, /* 0xB0-0xB3 */ + 0xEB, 0xC8, 0xC3, 0x58, 0xC3, 0x59, 0xEB, 0xC9, /* 0xB4-0xB7 */ + 0xC3, 0x5A, 0xC3, 0x5B, 0xB7, 0xCE, 0xC3, 0x5C, /* 0xB8-0xBB */ + 0xEB, 0xC2, 0xEB, 0xC4, 0xC9, 0xF6, 0xD6, 0xD7, /* 0xBC-0xBF */ + 0xD5, 0xCD, 0xD0, 0xB2, 0xEB, 0xCF, 0xCE, 0xB8, /* 0xC0-0xC3 */ + 0xEB, 0xD0, 0xC3, 0x5D, 0xB5, 0xA8, 0xC3, 0x5E, /* 0xC4-0xC7 */ + 0xC3, 0x5F, 0xC3, 0x60, 0xC3, 0x61, 0xC3, 0x62, /* 0xC8-0xCB */ + 0xB1, 0xB3, 0xEB, 0xD2, 0xCC, 0xA5, 0xC3, 0x63, /* 0xCC-0xCF */ + 0xC3, 0x64, 0xC3, 0x65, 0xC3, 0x66, 0xC3, 0x67, /* 0xD0-0xD3 */ + 0xC3, 0x68, 0xC3, 0x69, 0xC5, 0xD6, 0xEB, 0xD3, /* 0xD4-0xD7 */ + 0xC3, 0x6A, 0xEB, 0xD1, 0xC5, 0xDF, 0xEB, 0xCE, /* 0xD8-0xDB */ + 0xCA, 0xA4, 0xEB, 0xD5, 0xB0, 0xFB, 0xC3, 0x6B, /* 0xDC-0xDF */ + 0xC3, 0x6C, 0xBA, 0xFA, 0xC3, 0x6D, 0xC3, 0x6E, /* 0xE0-0xE3 */ + 0xD8, 0xB7, 0xF1, 0xE3, 0xC3, 0x6F, 0xEB, 0xCA, /* 0xE4-0xE7 */ + 0xEB, 0xCB, 0xEB, 0xCC, 0xEB, 0xCD, 0xEB, 0xD6, /* 0xE8-0xEB */ + 0xE6, 0xC0, 0xEB, 0xD9, 0xC3, 0x70, 0xBF, 0xE8, /* 0xEC-0xEF */ + 0xD2, 0xC8, 0xEB, 0xD7, 0xEB, 0xDC, 0xB8, 0xEC, /* 0xF0-0xF3 */ + 0xEB, 0xD8, 0xC3, 0x71, 0xBD, 0xBA, 0xC3, 0x72, /* 0xF4-0xF7 */ + 0xD0, 0xD8, 0xC3, 0x73, 0xB0, 0xB7, 0xC3, 0x74, /* 0xF8-0xFB */ + 0xEB, 0xDD, 0xC4, 0xDC, 0xC3, 0x75, 0xC3, 0x76, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_81[512] = { + 0xC3, 0x77, 0xC3, 0x78, 0xD6, 0xAC, 0xC3, 0x79, /* 0x00-0x03 */ + 0xC3, 0x7A, 0xC3, 0x7B, 0xB4, 0xE0, 0xC3, 0x7C, /* 0x04-0x07 */ + 0xC3, 0x7D, 0xC2, 0xF6, 0xBC, 0xB9, 0xC3, 0x7E, /* 0x08-0x0B */ + 0xC3, 0x80, 0xEB, 0xDA, 0xEB, 0xDB, 0xD4, 0xE0, /* 0x0C-0x0F */ + 0xC6, 0xEA, 0xC4, 0xD4, 0xEB, 0xDF, 0xC5, 0xA7, /* 0x10-0x13 */ + 0xD9, 0xF5, 0xC3, 0x81, 0xB2, 0xB1, 0xC3, 0x82, /* 0x14-0x17 */ + 0xEB, 0xE4, 0xC3, 0x83, 0xBD, 0xC5, 0xC3, 0x84, /* 0x18-0x1B */ + 0xC3, 0x85, 0xC3, 0x86, 0xEB, 0xE2, 0xC3, 0x87, /* 0x1C-0x1F */ + 0xC3, 0x88, 0xC3, 0x89, 0xC3, 0x8A, 0xC3, 0x8B, /* 0x20-0x23 */ + 0xC3, 0x8C, 0xC3, 0x8D, 0xC3, 0x8E, 0xC3, 0x8F, /* 0x24-0x27 */ + 0xC3, 0x90, 0xC3, 0x91, 0xC3, 0x92, 0xC3, 0x93, /* 0x28-0x2B */ + 0xEB, 0xE3, 0xC3, 0x94, 0xC3, 0x95, 0xB8, 0xAC, /* 0x2C-0x2F */ + 0xC3, 0x96, 0xCD, 0xD1, 0xEB, 0xE5, 0xC3, 0x97, /* 0x30-0x33 */ + 0xC3, 0x98, 0xC3, 0x99, 0xEB, 0xE1, 0xC3, 0x9A, /* 0x34-0x37 */ + 0xC1, 0xB3, 0xC3, 0x9B, 0xC3, 0x9C, 0xC3, 0x9D, /* 0x38-0x3B */ + 0xC3, 0x9E, 0xC3, 0x9F, 0xC6, 0xA2, 0xC3, 0xA0, /* 0x3C-0x3F */ + 0xC4, 0x40, 0xC4, 0x41, 0xC4, 0x42, 0xC4, 0x43, /* 0x40-0x43 */ + 0xC4, 0x44, 0xC4, 0x45, 0xCC, 0xF3, 0xC4, 0x46, /* 0x44-0x47 */ + 0xEB, 0xE6, 0xC4, 0x47, 0xC0, 0xB0, 0xD2, 0xB8, /* 0x48-0x4B */ + 0xEB, 0xE7, 0xC4, 0x48, 0xC4, 0x49, 0xC4, 0x4A, /* 0x4C-0x4F */ + 0xB8, 0xAF, 0xB8, 0xAD, 0xC4, 0x4B, 0xEB, 0xE8, /* 0x50-0x53 */ + 0xC7, 0xBB, 0xCD, 0xF3, 0xC4, 0x4C, 0xC4, 0x4D, /* 0x54-0x57 */ + 0xC4, 0x4E, 0xEB, 0xEA, 0xEB, 0xEB, 0xC4, 0x4F, /* 0x58-0x5B */ + 0xC4, 0x50, 0xC4, 0x51, 0xC4, 0x52, 0xC4, 0x53, /* 0x5C-0x5F */ + 0xEB, 0xED, 0xC4, 0x54, 0xC4, 0x55, 0xC4, 0x56, /* 0x60-0x63 */ + 0xC4, 0x57, 0xD0, 0xC8, 0xC4, 0x58, 0xEB, 0xF2, /* 0x64-0x67 */ + 0xC4, 0x59, 0xEB, 0xEE, 0xC4, 0x5A, 0xC4, 0x5B, /* 0x68-0x6B */ + 0xC4, 0x5C, 0xEB, 0xF1, 0xC8, 0xF9, 0xC4, 0x5D, /* 0x6C-0x6F */ + 0xD1, 0xFC, 0xEB, 0xEC, 0xC4, 0x5E, 0xC4, 0x5F, /* 0x70-0x73 */ + 0xEB, 0xE9, 0xC4, 0x60, 0xC4, 0x61, 0xC4, 0x62, /* 0x74-0x77 */ + 0xC4, 0x63, 0xB8, 0xB9, 0xCF, 0xD9, 0xC4, 0xE5, /* 0x78-0x7B */ + 0xEB, 0xEF, 0xEB, 0xF0, 0xCC, 0xDA, 0xCD, 0xC8, /* 0x7C-0x7F */ + + 0xB0, 0xF2, 0xC4, 0x64, 0xEB, 0xF6, 0xC4, 0x65, /* 0x80-0x83 */ + 0xC4, 0x66, 0xC4, 0x67, 0xC4, 0x68, 0xC4, 0x69, /* 0x84-0x87 */ + 0xEB, 0xF5, 0xC4, 0x6A, 0xB2, 0xB2, 0xC4, 0x6B, /* 0x88-0x8B */ + 0xC4, 0x6C, 0xC4, 0x6D, 0xC4, 0x6E, 0xB8, 0xE0, /* 0x8C-0x8F */ + 0xC4, 0x6F, 0xEB, 0xF7, 0xC4, 0x70, 0xC4, 0x71, /* 0x90-0x93 */ + 0xC4, 0x72, 0xC4, 0x73, 0xC4, 0x74, 0xC4, 0x75, /* 0x94-0x97 */ + 0xB1, 0xEC, 0xC4, 0x76, 0xC4, 0x77, 0xCC, 0xC5, /* 0x98-0x9B */ + 0xC4, 0xA4, 0xCF, 0xA5, 0xC4, 0x78, 0xC4, 0x79, /* 0x9C-0x9F */ + 0xC4, 0x7A, 0xC4, 0x7B, 0xC4, 0x7C, 0xEB, 0xF9, /* 0xA0-0xA3 */ + 0xC4, 0x7D, 0xC4, 0x7E, 0xEC, 0xA2, 0xC4, 0x80, /* 0xA4-0xA7 */ + 0xC5, 0xF2, 0xC4, 0x81, 0xEB, 0xFA, 0xC4, 0x82, /* 0xA8-0xAB */ + 0xC4, 0x83, 0xC4, 0x84, 0xC4, 0x85, 0xC4, 0x86, /* 0xAC-0xAF */ + 0xC4, 0x87, 0xC4, 0x88, 0xC4, 0x89, 0xC9, 0xC5, /* 0xB0-0xB3 */ + 0xC4, 0x8A, 0xC4, 0x8B, 0xC4, 0x8C, 0xC4, 0x8D, /* 0xB4-0xB7 */ + 0xC4, 0x8E, 0xC4, 0x8F, 0xE2, 0xDF, 0xEB, 0xFE, /* 0xB8-0xBB */ + 0xC4, 0x90, 0xC4, 0x91, 0xC4, 0x92, 0xC4, 0x93, /* 0xBC-0xBF */ + 0xCD, 0xCE, 0xEC, 0xA1, 0xB1, 0xDB, 0xD3, 0xB7, /* 0xC0-0xC3 */ + 0xC4, 0x94, 0xC4, 0x95, 0xD2, 0xDC, 0xC4, 0x96, /* 0xC4-0xC7 */ + 0xC4, 0x97, 0xC4, 0x98, 0xEB, 0xFD, 0xC4, 0x99, /* 0xC8-0xCB */ + 0xEB, 0xFB, 0xC4, 0x9A, 0xC4, 0x9B, 0xC4, 0x9C, /* 0xCC-0xCF */ + 0xC4, 0x9D, 0xC4, 0x9E, 0xC4, 0x9F, 0xC4, 0xA0, /* 0xD0-0xD3 */ + 0xC5, 0x40, 0xC5, 0x41, 0xC5, 0x42, 0xC5, 0x43, /* 0xD4-0xD7 */ + 0xC5, 0x44, 0xC5, 0x45, 0xC5, 0x46, 0xC5, 0x47, /* 0xD8-0xDB */ + 0xC5, 0x48, 0xC5, 0x49, 0xC5, 0x4A, 0xC5, 0x4B, /* 0xDC-0xDF */ + 0xC5, 0x4C, 0xC5, 0x4D, 0xC5, 0x4E, 0xB3, 0xBC, /* 0xE0-0xE3 */ + 0xC5, 0x4F, 0xC5, 0x50, 0xC5, 0x51, 0xEA, 0xB0, /* 0xE4-0xE7 */ + 0xC5, 0x52, 0xC5, 0x53, 0xD7, 0xD4, 0xC5, 0x54, /* 0xE8-0xEB */ + 0xF4, 0xAB, 0xB3, 0xF4, 0xC5, 0x55, 0xC5, 0x56, /* 0xEC-0xEF */ + 0xC5, 0x57, 0xC5, 0x58, 0xC5, 0x59, 0xD6, 0xC1, /* 0xF0-0xF3 */ + 0xD6, 0xC2, 0xC5, 0x5A, 0xC5, 0x5B, 0xC5, 0x5C, /* 0xF4-0xF7 */ + 0xC5, 0x5D, 0xC5, 0x5E, 0xC5, 0x5F, 0xD5, 0xE9, /* 0xF8-0xFB */ + 0xBE, 0xCA, 0xC5, 0x60, 0xF4, 0xA7, 0xC5, 0x61, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_82[512] = { + 0xD2, 0xA8, 0xF4, 0xA8, 0xF4, 0xA9, 0xC5, 0x62, /* 0x00-0x03 */ + 0xF4, 0xAA, 0xBE, 0xCB, 0xD3, 0xDF, 0xC5, 0x63, /* 0x04-0x07 */ + 0xC5, 0x64, 0xC5, 0x65, 0xC5, 0x66, 0xC5, 0x67, /* 0x08-0x0B */ + 0xC9, 0xE0, 0xC9, 0xE1, 0xC5, 0x68, 0xC5, 0x69, /* 0x0C-0x0F */ + 0xF3, 0xC2, 0xC5, 0x6A, 0xCA, 0xE6, 0xC5, 0x6B, /* 0x10-0x13 */ + 0xCC, 0xF2, 0xC5, 0x6C, 0xC5, 0x6D, 0xC5, 0x6E, /* 0x14-0x17 */ + 0xC5, 0x6F, 0xC5, 0x70, 0xC5, 0x71, 0xE2, 0xB6, /* 0x18-0x1B */ + 0xCB, 0xB4, 0xC5, 0x72, 0xCE, 0xE8, 0xD6, 0xDB, /* 0x1C-0x1F */ + 0xC5, 0x73, 0xF4, 0xAD, 0xF4, 0xAE, 0xF4, 0xAF, /* 0x20-0x23 */ + 0xC5, 0x74, 0xC5, 0x75, 0xC5, 0x76, 0xC5, 0x77, /* 0x24-0x27 */ + 0xF4, 0xB2, 0xC5, 0x78, 0xBA, 0xBD, 0xF4, 0xB3, /* 0x28-0x2B */ + 0xB0, 0xE3, 0xF4, 0xB0, 0xC5, 0x79, 0xF4, 0xB1, /* 0x2C-0x2F */ + 0xBD, 0xA2, 0xB2, 0xD5, 0xC5, 0x7A, 0xF4, 0xB6, /* 0x30-0x33 */ + 0xF4, 0xB7, 0xB6, 0xE6, 0xB2, 0xB0, 0xCF, 0xCF, /* 0x34-0x37 */ + 0xF4, 0xB4, 0xB4, 0xAC, 0xC5, 0x7B, 0xF4, 0xB5, /* 0x38-0x3B */ + 0xC5, 0x7C, 0xC5, 0x7D, 0xF4, 0xB8, 0xC5, 0x7E, /* 0x3C-0x3F */ + 0xC5, 0x80, 0xC5, 0x81, 0xC5, 0x82, 0xC5, 0x83, /* 0x40-0x43 */ + 0xF4, 0xB9, 0xC5, 0x84, 0xC5, 0x85, 0xCD, 0xA7, /* 0x44-0x47 */ + 0xC5, 0x86, 0xF4, 0xBA, 0xC5, 0x87, 0xF4, 0xBB, /* 0x48-0x4B */ + 0xC5, 0x88, 0xC5, 0x89, 0xC5, 0x8A, 0xF4, 0xBC, /* 0x4C-0x4F */ + 0xC5, 0x8B, 0xC5, 0x8C, 0xC5, 0x8D, 0xC5, 0x8E, /* 0x50-0x53 */ + 0xC5, 0x8F, 0xC5, 0x90, 0xC5, 0x91, 0xC5, 0x92, /* 0x54-0x57 */ + 0xCB, 0xD2, 0xC5, 0x93, 0xF4, 0xBD, 0xC5, 0x94, /* 0x58-0x5B */ + 0xC5, 0x95, 0xC5, 0x96, 0xC5, 0x97, 0xF4, 0xBE, /* 0x5C-0x5F */ + 0xC5, 0x98, 0xC5, 0x99, 0xC5, 0x9A, 0xC5, 0x9B, /* 0x60-0x63 */ + 0xC5, 0x9C, 0xC5, 0x9D, 0xC5, 0x9E, 0xC5, 0x9F, /* 0x64-0x67 */ + 0xF4, 0xBF, 0xC5, 0xA0, 0xC6, 0x40, 0xC6, 0x41, /* 0x68-0x6B */ + 0xC6, 0x42, 0xC6, 0x43, 0xF4, 0xDE, 0xC1, 0xBC, /* 0x6C-0x6F */ + 0xBC, 0xE8, 0xC6, 0x44, 0xC9, 0xAB, 0xD1, 0xDE, /* 0x70-0x73 */ + 0xE5, 0xF5, 0xC6, 0x45, 0xC6, 0x46, 0xC6, 0x47, /* 0x74-0x77 */ + 0xC6, 0x48, 0xDC, 0xB3, 0xD2, 0xD5, 0xC6, 0x49, /* 0x78-0x7B */ + 0xC6, 0x4A, 0xDC, 0xB4, 0xB0, 0xAC, 0xDC, 0xB5, /* 0x7C-0x7F */ + + 0xC6, 0x4B, 0xC6, 0x4C, 0xBD, 0xDA, 0xC6, 0x4D, /* 0x80-0x83 */ + 0xDC, 0xB9, 0xC6, 0x4E, 0xC6, 0x4F, 0xC6, 0x50, /* 0x84-0x87 */ + 0xD8, 0xC2, 0xC6, 0x51, 0xDC, 0xB7, 0xD3, 0xF3, /* 0x88-0x8B */ + 0xC6, 0x52, 0xC9, 0xD6, 0xDC, 0xBA, 0xDC, 0xB6, /* 0x8C-0x8F */ + 0xC6, 0x53, 0xDC, 0xBB, 0xC3, 0xA2, 0xC6, 0x54, /* 0x90-0x93 */ + 0xC6, 0x55, 0xC6, 0x56, 0xC6, 0x57, 0xDC, 0xBC, /* 0x94-0x97 */ + 0xDC, 0xC5, 0xDC, 0xBD, 0xC6, 0x58, 0xC6, 0x59, /* 0x98-0x9B */ + 0xCE, 0xDF, 0xD6, 0xA5, 0xC6, 0x5A, 0xDC, 0xCF, /* 0x9C-0x9F */ + 0xC6, 0x5B, 0xDC, 0xCD, 0xC6, 0x5C, 0xC6, 0x5D, /* 0xA0-0xA3 */ + 0xDC, 0xD2, 0xBD, 0xE6, 0xC2, 0xAB, 0xC6, 0x5E, /* 0xA4-0xA7 */ + 0xDC, 0xB8, 0xDC, 0xCB, 0xDC, 0xCE, 0xDC, 0xBE, /* 0xA8-0xAB */ + 0xB7, 0xD2, 0xB0, 0xC5, 0xDC, 0xC7, 0xD0, 0xBE, /* 0xAC-0xAF */ + 0xDC, 0xC1, 0xBB, 0xA8, 0xC6, 0x5F, 0xB7, 0xBC, /* 0xB0-0xB3 */ + 0xDC, 0xCC, 0xC6, 0x60, 0xC6, 0x61, 0xDC, 0xC6, /* 0xB4-0xB7 */ + 0xDC, 0xBF, 0xC7, 0xDB, 0xC6, 0x62, 0xC6, 0x63, /* 0xB8-0xBB */ + 0xC6, 0x64, 0xD1, 0xBF, 0xDC, 0xC0, 0xC6, 0x65, /* 0xBC-0xBF */ + 0xC6, 0x66, 0xDC, 0xCA, 0xC6, 0x67, 0xC6, 0x68, /* 0xC0-0xC3 */ + 0xDC, 0xD0, 0xC6, 0x69, 0xC6, 0x6A, 0xCE, 0xAD, /* 0xC4-0xC7 */ + 0xDC, 0xC2, 0xC6, 0x6B, 0xDC, 0xC3, 0xDC, 0xC8, /* 0xC8-0xCB */ + 0xDC, 0xC9, 0xB2, 0xD4, 0xDC, 0xD1, 0xCB, 0xD5, /* 0xCC-0xCF */ + 0xC6, 0x6C, 0xD4, 0xB7, 0xDC, 0xDB, 0xDC, 0xDF, /* 0xD0-0xD3 */ + 0xCC, 0xA6, 0xDC, 0xE6, 0xC6, 0x6D, 0xC3, 0xE7, /* 0xD4-0xD7 */ + 0xDC, 0xDC, 0xC6, 0x6E, 0xC6, 0x6F, 0xBF, 0xC1, /* 0xD8-0xDB */ + 0xDC, 0xD9, 0xC6, 0x70, 0xB0, 0xFA, 0xB9, 0xB6, /* 0xDC-0xDF */ + 0xDC, 0xE5, 0xDC, 0xD3, 0xC6, 0x71, 0xDC, 0xC4, /* 0xE0-0xE3 */ + 0xDC, 0xD6, 0xC8, 0xF4, 0xBF, 0xE0, 0xC6, 0x72, /* 0xE4-0xE7 */ + 0xC6, 0x73, 0xC6, 0x74, 0xC6, 0x75, 0xC9, 0xBB, /* 0xE8-0xEB */ + 0xC6, 0x76, 0xC6, 0x77, 0xC6, 0x78, 0xB1, 0xBD, /* 0xEC-0xEF */ + 0xC6, 0x79, 0xD3, 0xA2, 0xC6, 0x7A, 0xC6, 0x7B, /* 0xF0-0xF3 */ + 0xDC, 0xDA, 0xC6, 0x7C, 0xC6, 0x7D, 0xDC, 0xD5, /* 0xF4-0xF7 */ + 0xC6, 0x7E, 0xC6, 0xBB, 0xC6, 0x80, 0xDC, 0xDE, /* 0xF8-0xFB */ + 0xC6, 0x81, 0xC6, 0x82, 0xC6, 0x83, 0xC6, 0x84, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_83[512] = { + 0xC6, 0x85, 0xD7, 0xC2, 0xC3, 0xAF, 0xB7, 0xB6, /* 0x00-0x03 */ + 0xC7, 0xD1, 0xC3, 0xA9, 0xDC, 0xE2, 0xDC, 0xD8, /* 0x04-0x07 */ + 0xDC, 0xEB, 0xDC, 0xD4, 0xC6, 0x86, 0xC6, 0x87, /* 0x08-0x0B */ + 0xDC, 0xDD, 0xC6, 0x88, 0xBE, 0xA5, 0xDC, 0xD7, /* 0x0C-0x0F */ + 0xC6, 0x89, 0xDC, 0xE0, 0xC6, 0x8A, 0xC6, 0x8B, /* 0x10-0x13 */ + 0xDC, 0xE3, 0xDC, 0xE4, 0xC6, 0x8C, 0xDC, 0xF8, /* 0x14-0x17 */ + 0xC6, 0x8D, 0xC6, 0x8E, 0xDC, 0xE1, 0xDD, 0xA2, /* 0x18-0x1B */ + 0xDC, 0xE7, 0xC6, 0x8F, 0xC6, 0x90, 0xC6, 0x91, /* 0x1C-0x1F */ + 0xC6, 0x92, 0xC6, 0x93, 0xC6, 0x94, 0xC6, 0x95, /* 0x20-0x23 */ + 0xC6, 0x96, 0xC6, 0x97, 0xC6, 0x98, 0xBC, 0xEB, /* 0x24-0x27 */ + 0xB4, 0xC4, 0xC6, 0x99, 0xC6, 0x9A, 0xC3, 0xA3, /* 0x28-0x2B */ + 0xB2, 0xE7, 0xDC, 0xFA, 0xC6, 0x9B, 0xDC, 0xF2, /* 0x2C-0x2F */ + 0xC6, 0x9C, 0xDC, 0xEF, 0xC6, 0x9D, 0xDC, 0xFC, /* 0x30-0x33 */ + 0xDC, 0xEE, 0xD2, 0xF0, 0xB2, 0xE8, 0xC6, 0x9E, /* 0x34-0x37 */ + 0xC8, 0xD7, 0xC8, 0xE3, 0xDC, 0xFB, 0xC6, 0x9F, /* 0x38-0x3B */ + 0xDC, 0xED, 0xC6, 0xA0, 0xC7, 0x40, 0xC7, 0x41, /* 0x3C-0x3F */ + 0xDC, 0xF7, 0xC7, 0x42, 0xC7, 0x43, 0xDC, 0xF5, /* 0x40-0x43 */ + 0xC7, 0x44, 0xC7, 0x45, 0xBE, 0xA3, 0xDC, 0xF4, /* 0x44-0x47 */ + 0xC7, 0x46, 0xB2, 0xDD, 0xC7, 0x47, 0xC7, 0x48, /* 0x48-0x4B */ + 0xC7, 0x49, 0xC7, 0x4A, 0xC7, 0x4B, 0xDC, 0xF3, /* 0x4C-0x4F */ + 0xBC, 0xF6, 0xDC, 0xE8, 0xBB, 0xC4, 0xC7, 0x4C, /* 0x50-0x53 */ + 0xC0, 0xF3, 0xC7, 0x4D, 0xC7, 0x4E, 0xC7, 0x4F, /* 0x54-0x57 */ + 0xC7, 0x50, 0xC7, 0x51, 0xBC, 0xD4, 0xDC, 0xE9, /* 0x58-0x5B */ + 0xDC, 0xEA, 0xC7, 0x52, 0xDC, 0xF1, 0xDC, 0xF6, /* 0x5C-0x5F */ + 0xDC, 0xF9, 0xB5, 0xB4, 0xC7, 0x53, 0xC8, 0xD9, /* 0x60-0x63 */ + 0xBB, 0xE7, 0xDC, 0xFE, 0xDC, 0xFD, 0xD3, 0xAB, /* 0x64-0x67 */ + 0xDD, 0xA1, 0xDD, 0xA3, 0xDD, 0xA5, 0xD2, 0xF1, /* 0x68-0x6B */ + 0xDD, 0xA4, 0xDD, 0xA6, 0xDD, 0xA7, 0xD2, 0xA9, /* 0x6C-0x6F */ + 0xC7, 0x54, 0xC7, 0x55, 0xC7, 0x56, 0xC7, 0x57, /* 0x70-0x73 */ + 0xC7, 0x58, 0xC7, 0x59, 0xC7, 0x5A, 0xBA, 0xC9, /* 0x74-0x77 */ + 0xDD, 0xA9, 0xC7, 0x5B, 0xC7, 0x5C, 0xDD, 0xB6, /* 0x78-0x7B */ + 0xDD, 0xB1, 0xDD, 0xB4, 0xC7, 0x5D, 0xC7, 0x5E, /* 0x7C-0x7F */ + + 0xC7, 0x5F, 0xC7, 0x60, 0xC7, 0x61, 0xC7, 0x62, /* 0x80-0x83 */ + 0xC7, 0x63, 0xDD, 0xB0, 0xC6, 0xCE, 0xC7, 0x64, /* 0x84-0x87 */ + 0xC7, 0x65, 0xC0, 0xF2, 0xC7, 0x66, 0xC7, 0x67, /* 0x88-0x8B */ + 0xC7, 0x68, 0xC7, 0x69, 0xC9, 0xAF, 0xC7, 0x6A, /* 0x8C-0x8F */ + 0xC7, 0x6B, 0xC7, 0x6C, 0xDC, 0xEC, 0xDD, 0xAE, /* 0x90-0x93 */ + 0xC7, 0x6D, 0xC7, 0x6E, 0xC7, 0x6F, 0xC7, 0x70, /* 0x94-0x97 */ + 0xDD, 0xB7, 0xC7, 0x71, 0xC7, 0x72, 0xDC, 0xF0, /* 0x98-0x9B */ + 0xDD, 0xAF, 0xC7, 0x73, 0xDD, 0xB8, 0xC7, 0x74, /* 0x9C-0x9F */ + 0xDD, 0xAC, 0xC7, 0x75, 0xC7, 0x76, 0xC7, 0x77, /* 0xA0-0xA3 */ + 0xC7, 0x78, 0xC7, 0x79, 0xC7, 0x7A, 0xC7, 0x7B, /* 0xA4-0xA7 */ + 0xDD, 0xB9, 0xDD, 0xB3, 0xDD, 0xAD, 0xC4, 0xAA, /* 0xA8-0xAB */ + 0xC7, 0x7C, 0xC7, 0x7D, 0xC7, 0x7E, 0xC7, 0x80, /* 0xAC-0xAF */ + 0xDD, 0xA8, 0xC0, 0xB3, 0xC1, 0xAB, 0xDD, 0xAA, /* 0xB0-0xB3 */ + 0xDD, 0xAB, 0xC7, 0x81, 0xDD, 0xB2, 0xBB, 0xF1, /* 0xB4-0xB7 */ + 0xDD, 0xB5, 0xD3, 0xA8, 0xDD, 0xBA, 0xC7, 0x82, /* 0xB8-0xBB */ + 0xDD, 0xBB, 0xC3, 0xA7, 0xC7, 0x83, 0xC7, 0x84, /* 0xBC-0xBF */ + 0xDD, 0xD2, 0xDD, 0xBC, 0xC7, 0x85, 0xC7, 0x86, /* 0xC0-0xC3 */ + 0xC7, 0x87, 0xDD, 0xD1, 0xC7, 0x88, 0xB9, 0xBD, /* 0xC4-0xC7 */ + 0xC7, 0x89, 0xC7, 0x8A, 0xBE, 0xD5, 0xC7, 0x8B, /* 0xC8-0xCB */ + 0xBE, 0xFA, 0xC7, 0x8C, 0xC7, 0x8D, 0xBA, 0xCA, /* 0xCC-0xCF */ + 0xC7, 0x8E, 0xC7, 0x8F, 0xC7, 0x90, 0xC7, 0x91, /* 0xD0-0xD3 */ + 0xDD, 0xCA, 0xC7, 0x92, 0xDD, 0xC5, 0xC7, 0x93, /* 0xD4-0xD7 */ + 0xDD, 0xBF, 0xC7, 0x94, 0xC7, 0x95, 0xC7, 0x96, /* 0xD8-0xDB */ + 0xB2, 0xCB, 0xDD, 0xC3, 0xC7, 0x97, 0xDD, 0xCB, /* 0xDC-0xDF */ + 0xB2, 0xA4, 0xDD, 0xD5, 0xC7, 0x98, 0xC7, 0x99, /* 0xE0-0xE3 */ + 0xC7, 0x9A, 0xDD, 0xBE, 0xC7, 0x9B, 0xC7, 0x9C, /* 0xE4-0xE7 */ + 0xC7, 0x9D, 0xC6, 0xD0, 0xDD, 0xD0, 0xC7, 0x9E, /* 0xE8-0xEB */ + 0xC7, 0x9F, 0xC7, 0xA0, 0xC8, 0x40, 0xC8, 0x41, /* 0xEC-0xEF */ + 0xDD, 0xD4, 0xC1, 0xE2, 0xB7, 0xC6, 0xC8, 0x42, /* 0xF0-0xF3 */ + 0xC8, 0x43, 0xC8, 0x44, 0xC8, 0x45, 0xC8, 0x46, /* 0xF4-0xF7 */ + 0xDD, 0xCE, 0xDD, 0xCF, 0xC8, 0x47, 0xC8, 0x48, /* 0xF8-0xFB */ + 0xC8, 0x49, 0xDD, 0xC4, 0xC8, 0x4A, 0xC8, 0x4B, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_84[512] = { + 0xC8, 0x4C, 0xDD, 0xBD, 0xC8, 0x4D, 0xDD, 0xCD, /* 0x00-0x03 */ + 0xCC, 0xD1, 0xC8, 0x4E, 0xDD, 0xC9, 0xC8, 0x4F, /* 0x04-0x07 */ + 0xC8, 0x50, 0xC8, 0x51, 0xC8, 0x52, 0xDD, 0xC2, /* 0x08-0x0B */ + 0xC3, 0xC8, 0xC6, 0xBC, 0xCE, 0xAE, 0xDD, 0xCC, /* 0x0C-0x0F */ + 0xC8, 0x53, 0xDD, 0xC8, 0xC8, 0x54, 0xC8, 0x55, /* 0x10-0x13 */ + 0xC8, 0x56, 0xC8, 0x57, 0xC8, 0x58, 0xC8, 0x59, /* 0x14-0x17 */ + 0xDD, 0xC1, 0xC8, 0x5A, 0xC8, 0x5B, 0xC8, 0x5C, /* 0x18-0x1B */ + 0xDD, 0xC6, 0xC2, 0xDC, 0xC8, 0x5D, 0xC8, 0x5E, /* 0x1C-0x1F */ + 0xC8, 0x5F, 0xC8, 0x60, 0xC8, 0x61, 0xC8, 0x62, /* 0x20-0x23 */ + 0xD3, 0xA9, 0xD3, 0xAA, 0xDD, 0xD3, 0xCF, 0xF4, /* 0x24-0x27 */ + 0xC8, 0xF8, 0xC8, 0x63, 0xC8, 0x64, 0xC8, 0x65, /* 0x28-0x2B */ + 0xC8, 0x66, 0xC8, 0x67, 0xC8, 0x68, 0xC8, 0x69, /* 0x2C-0x2F */ + 0xC8, 0x6A, 0xDD, 0xE6, 0xC8, 0x6B, 0xC8, 0x6C, /* 0x30-0x33 */ + 0xC8, 0x6D, 0xC8, 0x6E, 0xC8, 0x6F, 0xC8, 0x70, /* 0x34-0x37 */ + 0xDD, 0xC7, 0xC8, 0x71, 0xC8, 0x72, 0xC8, 0x73, /* 0x38-0x3B */ + 0xDD, 0xE0, 0xC2, 0xE4, 0xC8, 0x74, 0xC8, 0x75, /* 0x3C-0x3F */ + 0xC8, 0x76, 0xC8, 0x77, 0xC8, 0x78, 0xC8, 0x79, /* 0x40-0x43 */ + 0xC8, 0x7A, 0xC8, 0x7B, 0xDD, 0xE1, 0xC8, 0x7C, /* 0x44-0x47 */ + 0xC8, 0x7D, 0xC8, 0x7E, 0xC8, 0x80, 0xC8, 0x81, /* 0x48-0x4B */ + 0xC8, 0x82, 0xC8, 0x83, 0xC8, 0x84, 0xC8, 0x85, /* 0x4C-0x4F */ + 0xC8, 0x86, 0xDD, 0xD7, 0xC8, 0x87, 0xC8, 0x88, /* 0x50-0x53 */ + 0xC8, 0x89, 0xC8, 0x8A, 0xC8, 0x8B, 0xD6, 0xF8, /* 0x54-0x57 */ + 0xC8, 0x8C, 0xDD, 0xD9, 0xDD, 0xD8, 0xB8, 0xF0, /* 0x58-0x5B */ + 0xDD, 0xD6, 0xC8, 0x8D, 0xC8, 0x8E, 0xC8, 0x8F, /* 0x5C-0x5F */ + 0xC8, 0x90, 0xC6, 0xCF, 0xC8, 0x91, 0xB6, 0xAD, /* 0x60-0x63 */ + 0xC8, 0x92, 0xC8, 0x93, 0xC8, 0x94, 0xC8, 0x95, /* 0x64-0x67 */ + 0xC8, 0x96, 0xDD, 0xE2, 0xC8, 0x97, 0xBA, 0xF9, /* 0x68-0x6B */ + 0xD4, 0xE1, 0xDD, 0xE7, 0xC8, 0x98, 0xC8, 0x99, /* 0x6C-0x6F */ + 0xC8, 0x9A, 0xB4, 0xD0, 0xC8, 0x9B, 0xDD, 0xDA, /* 0x70-0x73 */ + 0xC8, 0x9C, 0xBF, 0xFB, 0xDD, 0xE3, 0xC8, 0x9D, /* 0x74-0x77 */ + 0xDD, 0xDF, 0xC8, 0x9E, 0xDD, 0xDD, 0xC8, 0x9F, /* 0x78-0x7B */ + 0xC8, 0xA0, 0xC9, 0x40, 0xC9, 0x41, 0xC9, 0x42, /* 0x7C-0x7F */ + + 0xC9, 0x43, 0xC9, 0x44, 0xB5, 0xD9, 0xC9, 0x45, /* 0x80-0x83 */ + 0xC9, 0x46, 0xC9, 0x47, 0xC9, 0x48, 0xDD, 0xDB, /* 0x84-0x87 */ + 0xDD, 0xDC, 0xDD, 0xDE, 0xC9, 0x49, 0xBD, 0xAF, /* 0x88-0x8B */ + 0xDD, 0xE4, 0xC9, 0x4A, 0xDD, 0xE5, 0xC9, 0x4B, /* 0x8C-0x8F */ + 0xC9, 0x4C, 0xC9, 0x4D, 0xC9, 0x4E, 0xC9, 0x4F, /* 0x90-0x93 */ + 0xC9, 0x50, 0xC9, 0x51, 0xC9, 0x52, 0xDD, 0xF5, /* 0x94-0x97 */ + 0xC9, 0x53, 0xC3, 0xC9, 0xC9, 0x54, 0xC9, 0x55, /* 0x98-0x9B */ + 0xCB, 0xE2, 0xC9, 0x56, 0xC9, 0x57, 0xC9, 0x58, /* 0x9C-0x9F */ + 0xC9, 0x59, 0xDD, 0xF2, 0xC9, 0x5A, 0xC9, 0x5B, /* 0xA0-0xA3 */ + 0xC9, 0x5C, 0xC9, 0x5D, 0xC9, 0x5E, 0xC9, 0x5F, /* 0xA4-0xA7 */ + 0xC9, 0x60, 0xC9, 0x61, 0xC9, 0x62, 0xC9, 0x63, /* 0xA8-0xAB */ + 0xC9, 0x64, 0xC9, 0x65, 0xC9, 0x66, 0xD8, 0xE1, /* 0xAC-0xAF */ + 0xC9, 0x67, 0xC9, 0x68, 0xC6, 0xD1, 0xC9, 0x69, /* 0xB0-0xB3 */ + 0xDD, 0xF4, 0xC9, 0x6A, 0xC9, 0x6B, 0xC9, 0x6C, /* 0xB4-0xB7 */ + 0xD5, 0xF4, 0xDD, 0xF3, 0xDD, 0xF0, 0xC9, 0x6D, /* 0xB8-0xBB */ + 0xC9, 0x6E, 0xDD, 0xEC, 0xC9, 0x6F, 0xDD, 0xEF, /* 0xBC-0xBF */ + 0xC9, 0x70, 0xDD, 0xE8, 0xC9, 0x71, 0xC9, 0x72, /* 0xC0-0xC3 */ + 0xD0, 0xEE, 0xC9, 0x73, 0xC9, 0x74, 0xC9, 0x75, /* 0xC4-0xC7 */ + 0xC9, 0x76, 0xC8, 0xD8, 0xDD, 0xEE, 0xC9, 0x77, /* 0xC8-0xCB */ + 0xC9, 0x78, 0xDD, 0xE9, 0xC9, 0x79, 0xC9, 0x7A, /* 0xCC-0xCF */ + 0xDD, 0xEA, 0xCB, 0xF2, 0xC9, 0x7B, 0xDD, 0xED, /* 0xD0-0xD3 */ + 0xC9, 0x7C, 0xC9, 0x7D, 0xB1, 0xCD, 0xC9, 0x7E, /* 0xD4-0xD7 */ + 0xC9, 0x80, 0xC9, 0x81, 0xC9, 0x82, 0xC9, 0x83, /* 0xD8-0xDB */ + 0xC9, 0x84, 0xC0, 0xB6, 0xC9, 0x85, 0xBC, 0xBB, /* 0xDC-0xDF */ + 0xDD, 0xF1, 0xC9, 0x86, 0xC9, 0x87, 0xDD, 0xF7, /* 0xE0-0xE3 */ + 0xC9, 0x88, 0xDD, 0xF6, 0xDD, 0xEB, 0xC9, 0x89, /* 0xE4-0xE7 */ + 0xC9, 0x8A, 0xC9, 0x8B, 0xC9, 0x8C, 0xC9, 0x8D, /* 0xE8-0xEB */ + 0xC5, 0xEE, 0xC9, 0x8E, 0xC9, 0x8F, 0xC9, 0x90, /* 0xEC-0xEF */ + 0xDD, 0xFB, 0xC9, 0x91, 0xC9, 0x92, 0xC9, 0x93, /* 0xF0-0xF3 */ + 0xC9, 0x94, 0xC9, 0x95, 0xC9, 0x96, 0xC9, 0x97, /* 0xF4-0xF7 */ + 0xC9, 0x98, 0xC9, 0x99, 0xC9, 0x9A, 0xC9, 0x9B, /* 0xF8-0xFB */ + 0xDE, 0xA4, 0xC9, 0x9C, 0xC9, 0x9D, 0xDE, 0xA3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_85[512] = { + 0xC9, 0x9E, 0xC9, 0x9F, 0xC9, 0xA0, 0xCA, 0x40, /* 0x00-0x03 */ + 0xCA, 0x41, 0xCA, 0x42, 0xCA, 0x43, 0xCA, 0x44, /* 0x04-0x07 */ + 0xCA, 0x45, 0xCA, 0x46, 0xCA, 0x47, 0xCA, 0x48, /* 0x08-0x0B */ + 0xDD, 0xF8, 0xCA, 0x49, 0xCA, 0x4A, 0xCA, 0x4B, /* 0x0C-0x0F */ + 0xCA, 0x4C, 0xC3, 0xEF, 0xCA, 0x4D, 0xC2, 0xFB, /* 0x10-0x13 */ + 0xCA, 0x4E, 0xCA, 0x4F, 0xCA, 0x50, 0xD5, 0xE1, /* 0x14-0x17 */ + 0xCA, 0x51, 0xCA, 0x52, 0xCE, 0xB5, 0xCA, 0x53, /* 0x18-0x1B */ + 0xCA, 0x54, 0xCA, 0x55, 0xCA, 0x56, 0xDD, 0xFD, /* 0x1C-0x1F */ + 0xCA, 0x57, 0xB2, 0xCC, 0xCA, 0x58, 0xCA, 0x59, /* 0x20-0x23 */ + 0xCA, 0x5A, 0xCA, 0x5B, 0xCA, 0x5C, 0xCA, 0x5D, /* 0x24-0x27 */ + 0xCA, 0x5E, 0xCA, 0x5F, 0xCA, 0x60, 0xC4, 0xE8, /* 0x28-0x2B */ + 0xCA, 0xDF, 0xCA, 0x61, 0xCA, 0x62, 0xCA, 0x63, /* 0x2C-0x2F */ + 0xCA, 0x64, 0xCA, 0x65, 0xCA, 0x66, 0xCA, 0x67, /* 0x30-0x33 */ + 0xCA, 0x68, 0xCA, 0x69, 0xCA, 0x6A, 0xC7, 0xBE, /* 0x34-0x37 */ + 0xDD, 0xFA, 0xDD, 0xFC, 0xDD, 0xFE, 0xDE, 0xA2, /* 0x38-0x3B */ + 0xB0, 0xAA, 0xB1, 0xCE, 0xCA, 0x6B, 0xCA, 0x6C, /* 0x3C-0x3F */ + 0xCA, 0x6D, 0xCA, 0x6E, 0xCA, 0x6F, 0xDE, 0xAC, /* 0x40-0x43 */ + 0xCA, 0x70, 0xCA, 0x71, 0xCA, 0x72, 0xCA, 0x73, /* 0x44-0x47 */ + 0xDE, 0xA6, 0xBD, 0xB6, 0xC8, 0xEF, 0xCA, 0x74, /* 0x48-0x4B */ + 0xCA, 0x75, 0xCA, 0x76, 0xCA, 0x77, 0xCA, 0x78, /* 0x4C-0x4F */ + 0xCA, 0x79, 0xCA, 0x7A, 0xCA, 0x7B, 0xCA, 0x7C, /* 0x50-0x53 */ + 0xCA, 0x7D, 0xCA, 0x7E, 0xDE, 0xA1, 0xCA, 0x80, /* 0x54-0x57 */ + 0xCA, 0x81, 0xDE, 0xA5, 0xCA, 0x82, 0xCA, 0x83, /* 0x58-0x5B */ + 0xCA, 0x84, 0xCA, 0x85, 0xDE, 0xA9, 0xCA, 0x86, /* 0x5C-0x5F */ + 0xCA, 0x87, 0xCA, 0x88, 0xCA, 0x89, 0xCA, 0x8A, /* 0x60-0x63 */ + 0xDE, 0xA8, 0xCA, 0x8B, 0xCA, 0x8C, 0xCA, 0x8D, /* 0x64-0x67 */ + 0xDE, 0xA7, 0xCA, 0x8E, 0xCA, 0x8F, 0xCA, 0x90, /* 0x68-0x6B */ + 0xCA, 0x91, 0xCA, 0x92, 0xCA, 0x93, 0xCA, 0x94, /* 0x6C-0x6F */ + 0xCA, 0x95, 0xCA, 0x96, 0xDE, 0xAD, 0xCA, 0x97, /* 0x70-0x73 */ + 0xD4, 0xCC, 0xCA, 0x98, 0xCA, 0x99, 0xCA, 0x9A, /* 0x74-0x77 */ + 0xCA, 0x9B, 0xDE, 0xB3, 0xDE, 0xAA, 0xDE, 0xAE, /* 0x78-0x7B */ + 0xCA, 0x9C, 0xCA, 0x9D, 0xC0, 0xD9, 0xCA, 0x9E, /* 0x7C-0x7F */ + + 0xCA, 0x9F, 0xCA, 0xA0, 0xCB, 0x40, 0xCB, 0x41, /* 0x80-0x83 */ + 0xB1, 0xA1, 0xDE, 0xB6, 0xCB, 0x42, 0xDE, 0xB1, /* 0x84-0x87 */ + 0xCB, 0x43, 0xCB, 0x44, 0xCB, 0x45, 0xCB, 0x46, /* 0x88-0x8B */ + 0xCB, 0x47, 0xCB, 0x48, 0xCB, 0x49, 0xDE, 0xB2, /* 0x8C-0x8F */ + 0xCB, 0x4A, 0xCB, 0x4B, 0xCB, 0x4C, 0xCB, 0x4D, /* 0x90-0x93 */ + 0xCB, 0x4E, 0xCB, 0x4F, 0xCB, 0x50, 0xCB, 0x51, /* 0x94-0x97 */ + 0xCB, 0x52, 0xCB, 0x53, 0xCB, 0x54, 0xD1, 0xA6, /* 0x98-0x9B */ + 0xDE, 0xB5, 0xCB, 0x55, 0xCB, 0x56, 0xCB, 0x57, /* 0x9C-0x9F */ + 0xCB, 0x58, 0xCB, 0x59, 0xCB, 0x5A, 0xCB, 0x5B, /* 0xA0-0xA3 */ + 0xDE, 0xAF, 0xCB, 0x5C, 0xCB, 0x5D, 0xCB, 0x5E, /* 0xA4-0xA7 */ + 0xDE, 0xB0, 0xCB, 0x5F, 0xD0, 0xBD, 0xCB, 0x60, /* 0xA8-0xAB */ + 0xCB, 0x61, 0xCB, 0x62, 0xDE, 0xB4, 0xCA, 0xED, /* 0xAC-0xAF */ + 0xDE, 0xB9, 0xCB, 0x63, 0xCB, 0x64, 0xCB, 0x65, /* 0xB0-0xB3 */ + 0xCB, 0x66, 0xCB, 0x67, 0xCB, 0x68, 0xDE, 0xB8, /* 0xB4-0xB7 */ + 0xCB, 0x69, 0xDE, 0xB7, 0xCB, 0x6A, 0xCB, 0x6B, /* 0xB8-0xBB */ + 0xCB, 0x6C, 0xCB, 0x6D, 0xCB, 0x6E, 0xCB, 0x6F, /* 0xBC-0xBF */ + 0xCB, 0x70, 0xDE, 0xBB, 0xCB, 0x71, 0xCB, 0x72, /* 0xC0-0xC3 */ + 0xCB, 0x73, 0xCB, 0x74, 0xCB, 0x75, 0xCB, 0x76, /* 0xC4-0xC7 */ + 0xCB, 0x77, 0xBD, 0xE5, 0xCB, 0x78, 0xCB, 0x79, /* 0xC8-0xCB */ + 0xCB, 0x7A, 0xCB, 0x7B, 0xCB, 0x7C, 0xB2, 0xD8, /* 0xCC-0xCF */ + 0xC3, 0xEA, 0xCB, 0x7D, 0xCB, 0x7E, 0xDE, 0xBA, /* 0xD0-0xD3 */ + 0xCB, 0x80, 0xC5, 0xBA, 0xCB, 0x81, 0xCB, 0x82, /* 0xD4-0xD7 */ + 0xCB, 0x83, 0xCB, 0x84, 0xCB, 0x85, 0xCB, 0x86, /* 0xD8-0xDB */ + 0xDE, 0xBC, 0xCB, 0x87, 0xCB, 0x88, 0xCB, 0x89, /* 0xDC-0xDF */ + 0xCB, 0x8A, 0xCB, 0x8B, 0xCB, 0x8C, 0xCB, 0x8D, /* 0xE0-0xE3 */ + 0xCC, 0xD9, 0xCB, 0x8E, 0xCB, 0x8F, 0xCB, 0x90, /* 0xE4-0xE7 */ + 0xCB, 0x91, 0xB7, 0xAA, 0xCB, 0x92, 0xCB, 0x93, /* 0xE8-0xEB */ + 0xCB, 0x94, 0xCB, 0x95, 0xCB, 0x96, 0xCB, 0x97, /* 0xEC-0xEF */ + 0xCB, 0x98, 0xCB, 0x99, 0xCB, 0x9A, 0xCB, 0x9B, /* 0xF0-0xF3 */ + 0xCB, 0x9C, 0xCB, 0x9D, 0xCB, 0x9E, 0xCB, 0x9F, /* 0xF4-0xF7 */ + 0xCB, 0xA0, 0xCC, 0x40, 0xCC, 0x41, 0xD4, 0xE5, /* 0xF8-0xFB */ + 0xCC, 0x42, 0xCC, 0x43, 0xCC, 0x44, 0xDE, 0xBD, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_86[512] = { + 0xCC, 0x45, 0xCC, 0x46, 0xCC, 0x47, 0xCC, 0x48, /* 0x00-0x03 */ + 0xCC, 0x49, 0xDE, 0xBF, 0xCC, 0x4A, 0xCC, 0x4B, /* 0x04-0x07 */ + 0xCC, 0x4C, 0xCC, 0x4D, 0xCC, 0x4E, 0xCC, 0x4F, /* 0x08-0x0B */ + 0xCC, 0x50, 0xCC, 0x51, 0xCC, 0x52, 0xCC, 0x53, /* 0x0C-0x0F */ + 0xCC, 0x54, 0xC4, 0xA2, 0xCC, 0x55, 0xCC, 0x56, /* 0x10-0x13 */ + 0xCC, 0x57, 0xCC, 0x58, 0xDE, 0xC1, 0xCC, 0x59, /* 0x14-0x17 */ + 0xCC, 0x5A, 0xCC, 0x5B, 0xCC, 0x5C, 0xCC, 0x5D, /* 0x18-0x1B */ + 0xCC, 0x5E, 0xCC, 0x5F, 0xCC, 0x60, 0xCC, 0x61, /* 0x1C-0x1F */ + 0xCC, 0x62, 0xCC, 0x63, 0xCC, 0x64, 0xCC, 0x65, /* 0x20-0x23 */ + 0xCC, 0x66, 0xCC, 0x67, 0xCC, 0x68, 0xDE, 0xBE, /* 0x24-0x27 */ + 0xCC, 0x69, 0xDE, 0xC0, 0xCC, 0x6A, 0xCC, 0x6B, /* 0x28-0x2B */ + 0xCC, 0x6C, 0xCC, 0x6D, 0xCC, 0x6E, 0xCC, 0x6F, /* 0x2C-0x2F */ + 0xCC, 0x70, 0xCC, 0x71, 0xCC, 0x72, 0xCC, 0x73, /* 0x30-0x33 */ + 0xCC, 0x74, 0xCC, 0x75, 0xCC, 0x76, 0xCC, 0x77, /* 0x34-0x37 */ + 0xD5, 0xBA, 0xCC, 0x78, 0xCC, 0x79, 0xCC, 0x7A, /* 0x38-0x3B */ + 0xDE, 0xC2, 0xCC, 0x7B, 0xCC, 0x7C, 0xCC, 0x7D, /* 0x3C-0x3F */ + 0xCC, 0x7E, 0xCC, 0x80, 0xCC, 0x81, 0xCC, 0x82, /* 0x40-0x43 */ + 0xCC, 0x83, 0xCC, 0x84, 0xCC, 0x85, 0xCC, 0x86, /* 0x44-0x47 */ + 0xCC, 0x87, 0xCC, 0x88, 0xCC, 0x89, 0xCC, 0x8A, /* 0x48-0x4B */ + 0xCC, 0x8B, 0xF2, 0xAE, 0xBB, 0xA2, 0xC2, 0xB2, /* 0x4C-0x4F */ + 0xC5, 0xB0, 0xC2, 0xC7, 0xCC, 0x8C, 0xCC, 0x8D, /* 0x50-0x53 */ + 0xF2, 0xAF, 0xCC, 0x8E, 0xCC, 0x8F, 0xCC, 0x90, /* 0x54-0x57 */ + 0xCC, 0x91, 0xCC, 0x92, 0xD0, 0xE9, 0xCC, 0x93, /* 0x58-0x5B */ + 0xCC, 0x94, 0xCC, 0x95, 0xD3, 0xDD, 0xCC, 0x96, /* 0x5C-0x5F */ + 0xCC, 0x97, 0xCC, 0x98, 0xEB, 0xBD, 0xCC, 0x99, /* 0x60-0x63 */ + 0xCC, 0x9A, 0xCC, 0x9B, 0xCC, 0x9C, 0xCC, 0x9D, /* 0x64-0x67 */ + 0xCC, 0x9E, 0xCC, 0x9F, 0xCC, 0xA0, 0xB3, 0xE6, /* 0x68-0x6B */ + 0xF2, 0xB0, 0xCD, 0x40, 0xF2, 0xB1, 0xCD, 0x41, /* 0x6C-0x6F */ + 0xCD, 0x42, 0xCA, 0xAD, 0xCD, 0x43, 0xCD, 0x44, /* 0x70-0x73 */ + 0xCD, 0x45, 0xCD, 0x46, 0xCD, 0x47, 0xCD, 0x48, /* 0x74-0x77 */ + 0xCD, 0x49, 0xBA, 0xE7, 0xF2, 0xB3, 0xF2, 0xB5, /* 0x78-0x7B */ + 0xF2, 0xB4, 0xCB, 0xE4, 0xCF, 0xBA, 0xF2, 0xB2, /* 0x7C-0x7F */ + + 0xCA, 0xB4, 0xD2, 0xCF, 0xC2, 0xEC, 0xCD, 0x4A, /* 0x80-0x83 */ + 0xCD, 0x4B, 0xCD, 0x4C, 0xCD, 0x4D, 0xCD, 0x4E, /* 0x84-0x87 */ + 0xCD, 0x4F, 0xCD, 0x50, 0xCE, 0xC3, 0xF2, 0xB8, /* 0x88-0x8B */ + 0xB0, 0xF6, 0xF2, 0xB7, 0xCD, 0x51, 0xCD, 0x52, /* 0x8C-0x8F */ + 0xCD, 0x53, 0xCD, 0x54, 0xCD, 0x55, 0xF2, 0xBE, /* 0x90-0x93 */ + 0xCD, 0x56, 0xB2, 0xCF, 0xCD, 0x57, 0xCD, 0x58, /* 0x94-0x97 */ + 0xCD, 0x59, 0xCD, 0x5A, 0xCD, 0x5B, 0xCD, 0x5C, /* 0x98-0x9B */ + 0xD1, 0xC1, 0xF2, 0xBA, 0xCD, 0x5D, 0xCD, 0x5E, /* 0x9C-0x9F */ + 0xCD, 0x5F, 0xCD, 0x60, 0xCD, 0x61, 0xF2, 0xBC, /* 0xA0-0xA3 */ + 0xD4, 0xE9, 0xCD, 0x62, 0xCD, 0x63, 0xF2, 0xBB, /* 0xA4-0xA7 */ + 0xF2, 0xB6, 0xF2, 0xBF, 0xF2, 0xBD, 0xCD, 0x64, /* 0xA8-0xAB */ + 0xF2, 0xB9, 0xCD, 0x65, 0xCD, 0x66, 0xF2, 0xC7, /* 0xAC-0xAF */ + 0xF2, 0xC4, 0xF2, 0xC6, 0xCD, 0x67, 0xCD, 0x68, /* 0xB0-0xB3 */ + 0xF2, 0xCA, 0xF2, 0xC2, 0xF2, 0xC0, 0xCD, 0x69, /* 0xB4-0xB7 */ + 0xCD, 0x6A, 0xCD, 0x6B, 0xF2, 0xC5, 0xCD, 0x6C, /* 0xB8-0xBB */ + 0xCD, 0x6D, 0xCD, 0x6E, 0xCD, 0x6F, 0xCD, 0x70, /* 0xBC-0xBF */ + 0xD6, 0xFB, 0xCD, 0x71, 0xCD, 0x72, 0xCD, 0x73, /* 0xC0-0xC3 */ + 0xF2, 0xC1, 0xCD, 0x74, 0xC7, 0xF9, 0xC9, 0xDF, /* 0xC4-0xC7 */ + 0xCD, 0x75, 0xF2, 0xC8, 0xB9, 0xC6, 0xB5, 0xB0, /* 0xC8-0xCB */ + 0xCD, 0x76, 0xCD, 0x77, 0xF2, 0xC3, 0xF2, 0xC9, /* 0xCC-0xCF */ + 0xF2, 0xD0, 0xF2, 0xD6, 0xCD, 0x78, 0xCD, 0x79, /* 0xD0-0xD3 */ + 0xBB, 0xD7, 0xCD, 0x7A, 0xCD, 0x7B, 0xCD, 0x7C, /* 0xD4-0xD7 */ + 0xF2, 0xD5, 0xCD, 0xDC, 0xCD, 0x7D, 0xD6, 0xEB, /* 0xD8-0xDB */ + 0xCD, 0x7E, 0xCD, 0x80, 0xF2, 0xD2, 0xF2, 0xD4, /* 0xDC-0xDF */ + 0xCD, 0x81, 0xCD, 0x82, 0xCD, 0x83, 0xCD, 0x84, /* 0xE0-0xE3 */ + 0xB8, 0xF2, 0xCD, 0x85, 0xCD, 0x86, 0xCD, 0x87, /* 0xE4-0xE7 */ + 0xCD, 0x88, 0xF2, 0xCB, 0xCD, 0x89, 0xCD, 0x8A, /* 0xE8-0xEB */ + 0xCD, 0x8B, 0xF2, 0xCE, 0xC2, 0xF9, 0xCD, 0x8C, /* 0xEC-0xEF */ + 0xD5, 0xDD, 0xF2, 0xCC, 0xF2, 0xCD, 0xF2, 0xCF, /* 0xF0-0xF3 */ + 0xF2, 0xD3, 0xCD, 0x8D, 0xCD, 0x8E, 0xCD, 0x8F, /* 0xF4-0xF7 */ + 0xF2, 0xD9, 0xD3, 0xBC, 0xCD, 0x90, 0xCD, 0x91, /* 0xF8-0xFB */ + 0xCD, 0x92, 0xCD, 0x93, 0xB6, 0xEA, 0xCD, 0x94, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_87[512] = { + 0xCA, 0xF1, 0xCD, 0x95, 0xB7, 0xE4, 0xF2, 0xD7, /* 0x00-0x03 */ + 0xCD, 0x96, 0xCD, 0x97, 0xCD, 0x98, 0xF2, 0xD8, /* 0x04-0x07 */ + 0xF2, 0xDA, 0xF2, 0xDD, 0xF2, 0xDB, 0xCD, 0x99, /* 0x08-0x0B */ + 0xCD, 0x9A, 0xF2, 0xDC, 0xCD, 0x9B, 0xCD, 0x9C, /* 0x0C-0x0F */ + 0xCD, 0x9D, 0xCD, 0x9E, 0xD1, 0xD1, 0xF2, 0xD1, /* 0x10-0x13 */ + 0xCD, 0x9F, 0xCD, 0xC9, 0xCD, 0xA0, 0xCE, 0xCF, /* 0x14-0x17 */ + 0xD6, 0xA9, 0xCE, 0x40, 0xF2, 0xE3, 0xCE, 0x41, /* 0x18-0x1B */ + 0xC3, 0xDB, 0xCE, 0x42, 0xF2, 0xE0, 0xCE, 0x43, /* 0x1C-0x1F */ + 0xCE, 0x44, 0xC0, 0xAF, 0xF2, 0xEC, 0xF2, 0xDE, /* 0x20-0x23 */ + 0xCE, 0x45, 0xF2, 0xE1, 0xCE, 0x46, 0xCE, 0x47, /* 0x24-0x27 */ + 0xCE, 0x48, 0xF2, 0xE8, 0xCE, 0x49, 0xCE, 0x4A, /* 0x28-0x2B */ + 0xCE, 0x4B, 0xCE, 0x4C, 0xF2, 0xE2, 0xCE, 0x4D, /* 0x2C-0x2F */ + 0xCE, 0x4E, 0xF2, 0xE7, 0xCE, 0x4F, 0xCE, 0x50, /* 0x30-0x33 */ + 0xF2, 0xE6, 0xCE, 0x51, 0xCE, 0x52, 0xF2, 0xE9, /* 0x34-0x37 */ + 0xCE, 0x53, 0xCE, 0x54, 0xCE, 0x55, 0xF2, 0xDF, /* 0x38-0x3B */ + 0xCE, 0x56, 0xCE, 0x57, 0xF2, 0xE4, 0xF2, 0xEA, /* 0x3C-0x3F */ + 0xCE, 0x58, 0xCE, 0x59, 0xCE, 0x5A, 0xCE, 0x5B, /* 0x40-0x43 */ + 0xCE, 0x5C, 0xCE, 0x5D, 0xCE, 0x5E, 0xD3, 0xAC, /* 0x44-0x47 */ + 0xF2, 0xE5, 0xB2, 0xF5, 0xCE, 0x5F, 0xCE, 0x60, /* 0x48-0x4B */ + 0xF2, 0xF2, 0xCE, 0x61, 0xD0, 0xAB, 0xCE, 0x62, /* 0x4C-0x4F */ + 0xCE, 0x63, 0xCE, 0x64, 0xCE, 0x65, 0xF2, 0xF5, /* 0x50-0x53 */ + 0xCE, 0x66, 0xCE, 0x67, 0xCE, 0x68, 0xBB, 0xC8, /* 0x54-0x57 */ + 0xCE, 0x69, 0xF2, 0xF9, 0xCE, 0x6A, 0xCE, 0x6B, /* 0x58-0x5B */ + 0xCE, 0x6C, 0xCE, 0x6D, 0xCE, 0x6E, 0xCE, 0x6F, /* 0x5C-0x5F */ + 0xF2, 0xF0, 0xCE, 0x70, 0xCE, 0x71, 0xF2, 0xF6, /* 0x60-0x63 */ + 0xF2, 0xF8, 0xF2, 0xFA, 0xCE, 0x72, 0xCE, 0x73, /* 0x64-0x67 */ + 0xCE, 0x74, 0xCE, 0x75, 0xCE, 0x76, 0xCE, 0x77, /* 0x68-0x6B */ + 0xCE, 0x78, 0xCE, 0x79, 0xF2, 0xF3, 0xCE, 0x7A, /* 0x6C-0x6F */ + 0xF2, 0xF1, 0xCE, 0x7B, 0xCE, 0x7C, 0xCE, 0x7D, /* 0x70-0x73 */ + 0xBA, 0xFB, 0xCE, 0x7E, 0xB5, 0xFB, 0xCE, 0x80, /* 0x74-0x77 */ + 0xCE, 0x81, 0xCE, 0x82, 0xCE, 0x83, 0xF2, 0xEF, /* 0x78-0x7B */ + 0xF2, 0xF7, 0xF2, 0xED, 0xF2, 0xEE, 0xCE, 0x84, /* 0x7C-0x7F */ + + 0xCE, 0x85, 0xCE, 0x86, 0xF2, 0xEB, 0xF3, 0xA6, /* 0x80-0x83 */ + 0xCE, 0x87, 0xF3, 0xA3, 0xCE, 0x88, 0xCE, 0x89, /* 0x84-0x87 */ + 0xF3, 0xA2, 0xCE, 0x8A, 0xCE, 0x8B, 0xF2, 0xF4, /* 0x88-0x8B */ + 0xCE, 0x8C, 0xC8, 0xDA, 0xCE, 0x8D, 0xCE, 0x8E, /* 0x8C-0x8F */ + 0xCE, 0x8F, 0xCE, 0x90, 0xCE, 0x91, 0xF2, 0xFB, /* 0x90-0x93 */ + 0xCE, 0x92, 0xCE, 0x93, 0xCE, 0x94, 0xF3, 0xA5, /* 0x94-0x97 */ + 0xCE, 0x95, 0xCE, 0x96, 0xCE, 0x97, 0xCE, 0x98, /* 0x98-0x9B */ + 0xCE, 0x99, 0xCE, 0x9A, 0xCE, 0x9B, 0xC3, 0xF8, /* 0x9C-0x9F */ + 0xCE, 0x9C, 0xCE, 0x9D, 0xCE, 0x9E, 0xCE, 0x9F, /* 0xA0-0xA3 */ + 0xCE, 0xA0, 0xCF, 0x40, 0xCF, 0x41, 0xCF, 0x42, /* 0xA4-0xA7 */ + 0xF2, 0xFD, 0xCF, 0x43, 0xCF, 0x44, 0xF3, 0xA7, /* 0xA8-0xAB */ + 0xF3, 0xA9, 0xF3, 0xA4, 0xCF, 0x45, 0xF2, 0xFC, /* 0xAC-0xAF */ + 0xCF, 0x46, 0xCF, 0x47, 0xCF, 0x48, 0xF3, 0xAB, /* 0xB0-0xB3 */ + 0xCF, 0x49, 0xF3, 0xAA, 0xCF, 0x4A, 0xCF, 0x4B, /* 0xB4-0xB7 */ + 0xCF, 0x4C, 0xCF, 0x4D, 0xC2, 0xDD, 0xCF, 0x4E, /* 0xB8-0xBB */ + 0xCF, 0x4F, 0xF3, 0xAE, 0xCF, 0x50, 0xCF, 0x51, /* 0xBC-0xBF */ + 0xF3, 0xB0, 0xCF, 0x52, 0xCF, 0x53, 0xCF, 0x54, /* 0xC0-0xC3 */ + 0xCF, 0x55, 0xCF, 0x56, 0xF3, 0xA1, 0xCF, 0x57, /* 0xC4-0xC7 */ + 0xCF, 0x58, 0xCF, 0x59, 0xF3, 0xB1, 0xF3, 0xAC, /* 0xC8-0xCB */ + 0xCF, 0x5A, 0xCF, 0x5B, 0xCF, 0x5C, 0xCF, 0x5D, /* 0xCC-0xCF */ + 0xCF, 0x5E, 0xF3, 0xAF, 0xF2, 0xFE, 0xF3, 0xAD, /* 0xD0-0xD3 */ + 0xCF, 0x5F, 0xCF, 0x60, 0xCF, 0x61, 0xCF, 0x62, /* 0xD4-0xD7 */ + 0xCF, 0x63, 0xCF, 0x64, 0xCF, 0x65, 0xF3, 0xB2, /* 0xD8-0xDB */ + 0xCF, 0x66, 0xCF, 0x67, 0xCF, 0x68, 0xCF, 0x69, /* 0xDC-0xDF */ + 0xF3, 0xB4, 0xCF, 0x6A, 0xCF, 0x6B, 0xCF, 0x6C, /* 0xE0-0xE3 */ + 0xCF, 0x6D, 0xF3, 0xA8, 0xCF, 0x6E, 0xCF, 0x6F, /* 0xE4-0xE7 */ + 0xCF, 0x70, 0xCF, 0x71, 0xF3, 0xB3, 0xCF, 0x72, /* 0xE8-0xEB */ + 0xCF, 0x73, 0xCF, 0x74, 0xF3, 0xB5, 0xCF, 0x75, /* 0xEC-0xEF */ + 0xCF, 0x76, 0xCF, 0x77, 0xCF, 0x78, 0xCF, 0x79, /* 0xF0-0xF3 */ + 0xCF, 0x7A, 0xCF, 0x7B, 0xCF, 0x7C, 0xCF, 0x7D, /* 0xF4-0xF7 */ + 0xCF, 0x7E, 0xD0, 0xB7, 0xCF, 0x80, 0xCF, 0x81, /* 0xF8-0xFB */ + 0xCF, 0x82, 0xCF, 0x83, 0xF3, 0xB8, 0xCF, 0x84, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_88[512] = { + 0xCF, 0x85, 0xCF, 0x86, 0xCF, 0x87, 0xD9, 0xF9, /* 0x00-0x03 */ + 0xCF, 0x88, 0xCF, 0x89, 0xCF, 0x8A, 0xCF, 0x8B, /* 0x04-0x07 */ + 0xCF, 0x8C, 0xCF, 0x8D, 0xF3, 0xB9, 0xCF, 0x8E, /* 0x08-0x0B */ + 0xCF, 0x8F, 0xCF, 0x90, 0xCF, 0x91, 0xCF, 0x92, /* 0x0C-0x0F */ + 0xCF, 0x93, 0xCF, 0x94, 0xCF, 0x95, 0xF3, 0xB7, /* 0x10-0x13 */ + 0xCF, 0x96, 0xC8, 0xE4, 0xF3, 0xB6, 0xCF, 0x97, /* 0x14-0x17 */ + 0xCF, 0x98, 0xCF, 0x99, 0xCF, 0x9A, 0xF3, 0xBA, /* 0x18-0x1B */ + 0xCF, 0x9B, 0xCF, 0x9C, 0xCF, 0x9D, 0xCF, 0x9E, /* 0x1C-0x1F */ + 0xCF, 0x9F, 0xF3, 0xBB, 0xB4, 0xC0, 0xCF, 0xA0, /* 0x20-0x23 */ + 0xD0, 0x40, 0xD0, 0x41, 0xD0, 0x42, 0xD0, 0x43, /* 0x24-0x27 */ + 0xD0, 0x44, 0xD0, 0x45, 0xD0, 0x46, 0xD0, 0x47, /* 0x28-0x2B */ + 0xD0, 0x48, 0xD0, 0x49, 0xD0, 0x4A, 0xD0, 0x4B, /* 0x2C-0x2F */ + 0xD0, 0x4C, 0xD0, 0x4D, 0xEE, 0xC3, 0xD0, 0x4E, /* 0x30-0x33 */ + 0xD0, 0x4F, 0xD0, 0x50, 0xD0, 0x51, 0xD0, 0x52, /* 0x34-0x37 */ + 0xD0, 0x53, 0xF3, 0xBC, 0xD0, 0x54, 0xD0, 0x55, /* 0x38-0x3B */ + 0xF3, 0xBD, 0xD0, 0x56, 0xD0, 0x57, 0xD0, 0x58, /* 0x3C-0x3F */ + 0xD1, 0xAA, 0xD0, 0x59, 0xD0, 0x5A, 0xD0, 0x5B, /* 0x40-0x43 */ + 0xF4, 0xAC, 0xD0, 0xC6, 0xD0, 0x5C, 0xD0, 0x5D, /* 0x44-0x47 */ + 0xD0, 0x5E, 0xD0, 0x5F, 0xD0, 0x60, 0xD0, 0x61, /* 0x48-0x4B */ + 0xD0, 0xD0, 0xD1, 0xDC, 0xD0, 0x62, 0xD0, 0x63, /* 0x4C-0x4F */ + 0xD0, 0x64, 0xD0, 0x65, 0xD0, 0x66, 0xD0, 0x67, /* 0x50-0x53 */ + 0xCF, 0xCE, 0xD0, 0x68, 0xD0, 0x69, 0xBD, 0xD6, /* 0x54-0x57 */ + 0xD0, 0x6A, 0xD1, 0xC3, 0xD0, 0x6B, 0xD0, 0x6C, /* 0x58-0x5B */ + 0xD0, 0x6D, 0xD0, 0x6E, 0xD0, 0x6F, 0xD0, 0x70, /* 0x5C-0x5F */ + 0xD0, 0x71, 0xBA, 0xE2, 0xE1, 0xE9, 0xD2, 0xC2, /* 0x60-0x63 */ + 0xF1, 0xC2, 0xB2, 0xB9, 0xD0, 0x72, 0xD0, 0x73, /* 0x64-0x67 */ + 0xB1, 0xED, 0xF1, 0xC3, 0xD0, 0x74, 0xC9, 0xC0, /* 0x68-0x6B */ + 0xB3, 0xC4, 0xD0, 0x75, 0xD9, 0xF2, 0xD0, 0x76, /* 0x6C-0x6F */ + 0xCB, 0xA5, 0xD0, 0x77, 0xF1, 0xC4, 0xD0, 0x78, /* 0x70-0x73 */ + 0xD0, 0x79, 0xD0, 0x7A, 0xD0, 0x7B, 0xD6, 0xD4, /* 0x74-0x77 */ + 0xD0, 0x7C, 0xD0, 0x7D, 0xD0, 0x7E, 0xD0, 0x80, /* 0x78-0x7B */ + 0xD0, 0x81, 0xF1, 0xC5, 0xF4, 0xC0, 0xF1, 0xC6, /* 0x7C-0x7F */ + + 0xD0, 0x82, 0xD4, 0xAC, 0xF1, 0xC7, 0xD0, 0x83, /* 0x80-0x83 */ + 0xB0, 0xC0, 0xF4, 0xC1, 0xD0, 0x84, 0xD0, 0x85, /* 0x84-0x87 */ + 0xF4, 0xC2, 0xD0, 0x86, 0xD0, 0x87, 0xB4, 0xFC, /* 0x88-0x8B */ + 0xD0, 0x88, 0xC5, 0xDB, 0xD0, 0x89, 0xD0, 0x8A, /* 0x8C-0x8F */ + 0xD0, 0x8B, 0xD0, 0x8C, 0xCC, 0xBB, 0xD0, 0x8D, /* 0x90-0x93 */ + 0xD0, 0x8E, 0xD0, 0x8F, 0xD0, 0xE4, 0xD0, 0x90, /* 0x94-0x97 */ + 0xD0, 0x91, 0xD0, 0x92, 0xD0, 0x93, 0xD0, 0x94, /* 0x98-0x9B */ + 0xCD, 0xE0, 0xD0, 0x95, 0xD0, 0x96, 0xD0, 0x97, /* 0x9C-0x9F */ + 0xD0, 0x98, 0xD0, 0x99, 0xF1, 0xC8, 0xD0, 0x9A, /* 0xA0-0xA3 */ + 0xD9, 0xF3, 0xD0, 0x9B, 0xD0, 0x9C, 0xD0, 0x9D, /* 0xA4-0xA7 */ + 0xD0, 0x9E, 0xD0, 0x9F, 0xD0, 0xA0, 0xB1, 0xBB, /* 0xA8-0xAB */ + 0xD1, 0x40, 0xCF, 0xAE, 0xD1, 0x41, 0xD1, 0x42, /* 0xAC-0xAF */ + 0xD1, 0x43, 0xB8, 0xA4, 0xD1, 0x44, 0xD1, 0x45, /* 0xB0-0xB3 */ + 0xD1, 0x46, 0xD1, 0x47, 0xD1, 0x48, 0xF1, 0xCA, /* 0xB4-0xB7 */ + 0xD1, 0x49, 0xD1, 0x4A, 0xD1, 0x4B, 0xD1, 0x4C, /* 0xB8-0xBB */ + 0xF1, 0xCB, 0xD1, 0x4D, 0xD1, 0x4E, 0xD1, 0x4F, /* 0xBC-0xBF */ + 0xD1, 0x50, 0xB2, 0xC3, 0xC1, 0xD1, 0xD1, 0x51, /* 0xC0-0xC3 */ + 0xD1, 0x52, 0xD7, 0xB0, 0xF1, 0xC9, 0xD1, 0x53, /* 0xC4-0xC7 */ + 0xD1, 0x54, 0xF1, 0xCC, 0xD1, 0x55, 0xD1, 0x56, /* 0xC8-0xCB */ + 0xD1, 0x57, 0xD1, 0x58, 0xF1, 0xCE, 0xD1, 0x59, /* 0xCC-0xCF */ + 0xD1, 0x5A, 0xD1, 0x5B, 0xD9, 0xF6, 0xD1, 0x5C, /* 0xD0-0xD3 */ + 0xD2, 0xE1, 0xD4, 0xA3, 0xD1, 0x5D, 0xD1, 0x5E, /* 0xD4-0xD7 */ + 0xF4, 0xC3, 0xC8, 0xB9, 0xD1, 0x5F, 0xD1, 0x60, /* 0xD8-0xDB */ + 0xD1, 0x61, 0xD1, 0x62, 0xD1, 0x63, 0xF4, 0xC4, /* 0xDC-0xDF */ + 0xD1, 0x64, 0xD1, 0x65, 0xF1, 0xCD, 0xF1, 0xCF, /* 0xE0-0xE3 */ + 0xBF, 0xE3, 0xF1, 0xD0, 0xD1, 0x66, 0xD1, 0x67, /* 0xE4-0xE7 */ + 0xF1, 0xD4, 0xD1, 0x68, 0xD1, 0x69, 0xD1, 0x6A, /* 0xE8-0xEB */ + 0xD1, 0x6B, 0xD1, 0x6C, 0xD1, 0x6D, 0xD1, 0x6E, /* 0xEC-0xEF */ + 0xF1, 0xD6, 0xF1, 0xD1, 0xD1, 0x6F, 0xC9, 0xD1, /* 0xF0-0xF3 */ + 0xC5, 0xE1, 0xD1, 0x70, 0xD1, 0x71, 0xD1, 0x72, /* 0xF4-0xF7 */ + 0xC2, 0xE3, 0xB9, 0xFC, 0xD1, 0x73, 0xD1, 0x74, /* 0xF8-0xFB */ + 0xF1, 0xD3, 0xD1, 0x75, 0xF1, 0xD5, 0xD1, 0x76, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_89[512] = { + 0xD1, 0x77, 0xD1, 0x78, 0xB9, 0xD3, 0xD1, 0x79, /* 0x00-0x03 */ + 0xD1, 0x7A, 0xD1, 0x7B, 0xD1, 0x7C, 0xD1, 0x7D, /* 0x04-0x07 */ + 0xD1, 0x7E, 0xD1, 0x80, 0xF1, 0xDB, 0xD1, 0x81, /* 0x08-0x0B */ + 0xD1, 0x82, 0xD1, 0x83, 0xD1, 0x84, 0xD1, 0x85, /* 0x0C-0x0F */ + 0xBA, 0xD6, 0xD1, 0x86, 0xB0, 0xFD, 0xF1, 0xD9, /* 0x10-0x13 */ + 0xD1, 0x87, 0xD1, 0x88, 0xD1, 0x89, 0xD1, 0x8A, /* 0x14-0x17 */ + 0xD1, 0x8B, 0xF1, 0xD8, 0xF1, 0xD2, 0xF1, 0xDA, /* 0x18-0x1B */ + 0xD1, 0x8C, 0xD1, 0x8D, 0xD1, 0x8E, 0xD1, 0x8F, /* 0x1C-0x1F */ + 0xD1, 0x90, 0xF1, 0xD7, 0xD1, 0x91, 0xD1, 0x92, /* 0x20-0x23 */ + 0xD1, 0x93, 0xC8, 0xEC, 0xD1, 0x94, 0xD1, 0x95, /* 0x24-0x27 */ + 0xD1, 0x96, 0xD1, 0x97, 0xCD, 0xCA, 0xF1, 0xDD, /* 0x28-0x2B */ + 0xD1, 0x98, 0xD1, 0x99, 0xD1, 0x9A, 0xD1, 0x9B, /* 0x2C-0x2F */ + 0xE5, 0xBD, 0xD1, 0x9C, 0xD1, 0x9D, 0xD1, 0x9E, /* 0x30-0x33 */ + 0xF1, 0xDC, 0xD1, 0x9F, 0xF1, 0xDE, 0xD1, 0xA0, /* 0x34-0x37 */ + 0xD2, 0x40, 0xD2, 0x41, 0xD2, 0x42, 0xD2, 0x43, /* 0x38-0x3B */ + 0xD2, 0x44, 0xD2, 0x45, 0xD2, 0x46, 0xD2, 0x47, /* 0x3C-0x3F */ + 0xD2, 0x48, 0xF1, 0xDF, 0xD2, 0x49, 0xD2, 0x4A, /* 0x40-0x43 */ + 0xCF, 0xE5, 0xD2, 0x4B, 0xD2, 0x4C, 0xD2, 0x4D, /* 0x44-0x47 */ + 0xD2, 0x4E, 0xD2, 0x4F, 0xD2, 0x50, 0xD2, 0x51, /* 0x48-0x4B */ + 0xD2, 0x52, 0xD2, 0x53, 0xD2, 0x54, 0xD2, 0x55, /* 0x4C-0x4F */ + 0xD2, 0x56, 0xD2, 0x57, 0xD2, 0x58, 0xD2, 0x59, /* 0x50-0x53 */ + 0xD2, 0x5A, 0xD2, 0x5B, 0xD2, 0x5C, 0xD2, 0x5D, /* 0x54-0x57 */ + 0xD2, 0x5E, 0xD2, 0x5F, 0xD2, 0x60, 0xD2, 0x61, /* 0x58-0x5B */ + 0xD2, 0x62, 0xD2, 0x63, 0xF4, 0xC5, 0xBD, 0xF3, /* 0x5C-0x5F */ + 0xD2, 0x64, 0xD2, 0x65, 0xD2, 0x66, 0xD2, 0x67, /* 0x60-0x63 */ + 0xD2, 0x68, 0xD2, 0x69, 0xF1, 0xE0, 0xD2, 0x6A, /* 0x64-0x67 */ + 0xD2, 0x6B, 0xD2, 0x6C, 0xD2, 0x6D, 0xD2, 0x6E, /* 0x68-0x6B */ + 0xD2, 0x6F, 0xD2, 0x70, 0xD2, 0x71, 0xD2, 0x72, /* 0x6C-0x6F */ + 0xD2, 0x73, 0xD2, 0x74, 0xD2, 0x75, 0xD2, 0x76, /* 0x70-0x73 */ + 0xD2, 0x77, 0xD2, 0x78, 0xD2, 0x79, 0xD2, 0x7A, /* 0x74-0x77 */ + 0xD2, 0x7B, 0xD2, 0x7C, 0xD2, 0x7D, 0xF1, 0xE1, /* 0x78-0x7B */ + 0xD2, 0x7E, 0xD2, 0x80, 0xD2, 0x81, 0xCE, 0xF7, /* 0x7C-0x7F */ + + 0xD2, 0x82, 0xD2, 0xAA, 0xD2, 0x83, 0xF1, 0xFB, /* 0x80-0x83 */ + 0xD2, 0x84, 0xD2, 0x85, 0xB8, 0xB2, 0xD2, 0x86, /* 0x84-0x87 */ + 0xD2, 0x87, 0xD2, 0x88, 0xD2, 0x89, 0xD2, 0x8A, /* 0x88-0x8B */ + 0xD2, 0x8B, 0xD2, 0x8C, 0xD2, 0x8D, 0xD2, 0x8E, /* 0x8C-0x8F */ + 0xD2, 0x8F, 0xD2, 0x90, 0xD2, 0x91, 0xD2, 0x92, /* 0x90-0x93 */ + 0xD2, 0x93, 0xD2, 0x94, 0xD2, 0x95, 0xD2, 0x96, /* 0x94-0x97 */ + 0xD2, 0x97, 0xD2, 0x98, 0xD2, 0x99, 0xD2, 0x9A, /* 0x98-0x9B */ + 0xD2, 0x9B, 0xD2, 0x9C, 0xD2, 0x9D, 0xD2, 0x9E, /* 0x9C-0x9F */ + 0xD2, 0x9F, 0xD2, 0xA0, 0xD3, 0x40, 0xD3, 0x41, /* 0xA0-0xA3 */ + 0xD3, 0x42, 0xD3, 0x43, 0xD3, 0x44, 0xD3, 0x45, /* 0xA4-0xA7 */ + 0xD3, 0x46, 0xD3, 0x47, 0xD3, 0x48, 0xD3, 0x49, /* 0xA8-0xAB */ + 0xD3, 0x4A, 0xD3, 0x4B, 0xD3, 0x4C, 0xD3, 0x4D, /* 0xAC-0xAF */ + 0xD3, 0x4E, 0xD3, 0x4F, 0xD3, 0x50, 0xD3, 0x51, /* 0xB0-0xB3 */ + 0xD3, 0x52, 0xD3, 0x53, 0xD3, 0x54, 0xD3, 0x55, /* 0xB4-0xB7 */ + 0xD3, 0x56, 0xD3, 0x57, 0xD3, 0x58, 0xD3, 0x59, /* 0xB8-0xBB */ + 0xD3, 0x5A, 0xD3, 0x5B, 0xD3, 0x5C, 0xD3, 0x5D, /* 0xBC-0xBF */ + 0xD3, 0x5E, 0xBC, 0xFB, 0xB9, 0xDB, 0xD3, 0x5F, /* 0xC0-0xC3 */ + 0xB9, 0xE6, 0xC3, 0xD9, 0xCA, 0xD3, 0xEA, 0xE8, /* 0xC4-0xC7 */ + 0xC0, 0xC0, 0xBE, 0xF5, 0xEA, 0xE9, 0xEA, 0xEA, /* 0xC8-0xCB */ + 0xEA, 0xEB, 0xD3, 0x60, 0xEA, 0xEC, 0xEA, 0xED, /* 0xCC-0xCF */ + 0xEA, 0xEE, 0xEA, 0xEF, 0xBD, 0xC7, 0xD3, 0x61, /* 0xD0-0xD3 */ + 0xD3, 0x62, 0xD3, 0x63, 0xF5, 0xFB, 0xD3, 0x64, /* 0xD4-0xD7 */ + 0xD3, 0x65, 0xD3, 0x66, 0xF5, 0xFD, 0xD3, 0x67, /* 0xD8-0xDB */ + 0xF5, 0xFE, 0xD3, 0x68, 0xF5, 0xFC, 0xD3, 0x69, /* 0xDC-0xDF */ + 0xD3, 0x6A, 0xD3, 0x6B, 0xD3, 0x6C, 0xBD, 0xE2, /* 0xE0-0xE3 */ + 0xD3, 0x6D, 0xF6, 0xA1, 0xB4, 0xA5, 0xD3, 0x6E, /* 0xE4-0xE7 */ + 0xD3, 0x6F, 0xD3, 0x70, 0xD3, 0x71, 0xF6, 0xA2, /* 0xE8-0xEB */ + 0xD3, 0x72, 0xD3, 0x73, 0xD3, 0x74, 0xF6, 0xA3, /* 0xEC-0xEF */ + 0xD3, 0x75, 0xD3, 0x76, 0xD3, 0x77, 0xEC, 0xB2, /* 0xF0-0xF3 */ + 0xD3, 0x78, 0xD3, 0x79, 0xD3, 0x7A, 0xD3, 0x7B, /* 0xF4-0xF7 */ + 0xD3, 0x7C, 0xD3, 0x7D, 0xD3, 0x7E, 0xD3, 0x80, /* 0xF8-0xFB */ + 0xD3, 0x81, 0xD3, 0x82, 0xD3, 0x83, 0xD3, 0x84, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8A[512] = { + 0xD1, 0xD4, 0xD3, 0x85, 0xD3, 0x86, 0xD3, 0x87, /* 0x00-0x03 */ + 0xD3, 0x88, 0xD3, 0x89, 0xD3, 0x8A, 0xD9, 0xEA, /* 0x04-0x07 */ + 0xD3, 0x8B, 0xD3, 0x8C, 0xD3, 0x8D, 0xD3, 0x8E, /* 0x08-0x0B */ + 0xD3, 0x8F, 0xD3, 0x90, 0xD3, 0x91, 0xD3, 0x92, /* 0x0C-0x0F */ + 0xD3, 0x93, 0xD3, 0x94, 0xD3, 0x95, 0xD3, 0x96, /* 0x10-0x13 */ + 0xD3, 0x97, 0xD3, 0x98, 0xD3, 0x99, 0xD3, 0x9A, /* 0x14-0x17 */ + 0xD3, 0x9B, 0xD3, 0x9C, 0xD3, 0x9D, 0xD3, 0x9E, /* 0x18-0x1B */ + 0xD3, 0x9F, 0xD3, 0xA0, 0xD4, 0x40, 0xD4, 0x41, /* 0x1C-0x1F */ + 0xD4, 0x42, 0xD4, 0x43, 0xD4, 0x44, 0xD4, 0x45, /* 0x20-0x23 */ + 0xD4, 0x46, 0xD4, 0x47, 0xD4, 0x48, 0xD4, 0x49, /* 0x24-0x27 */ + 0xD4, 0x4A, 0xD4, 0x4B, 0xD4, 0x4C, 0xD4, 0x4D, /* 0x28-0x2B */ + 0xD4, 0x4E, 0xD4, 0x4F, 0xD4, 0x50, 0xD4, 0x51, /* 0x2C-0x2F */ + 0xD4, 0x52, 0xD4, 0x53, 0xD4, 0x54, 0xD4, 0x55, /* 0x30-0x33 */ + 0xD4, 0x56, 0xD4, 0x57, 0xD4, 0x58, 0xD4, 0x59, /* 0x34-0x37 */ + 0xD4, 0x5A, 0xD4, 0x5B, 0xD4, 0x5C, 0xD4, 0x5D, /* 0x38-0x3B */ + 0xD4, 0x5E, 0xD4, 0x5F, 0xF6, 0xA4, 0xD4, 0x60, /* 0x3C-0x3F */ + 0xD4, 0x61, 0xD4, 0x62, 0xD4, 0x63, 0xD4, 0x64, /* 0x40-0x43 */ + 0xD4, 0x65, 0xD4, 0x66, 0xD4, 0x67, 0xD4, 0x68, /* 0x44-0x47 */ + 0xEE, 0xBA, 0xD4, 0x69, 0xD4, 0x6A, 0xD4, 0x6B, /* 0x48-0x4B */ + 0xD4, 0x6C, 0xD4, 0x6D, 0xD4, 0x6E, 0xD4, 0x6F, /* 0x4C-0x4F */ + 0xD4, 0x70, 0xD4, 0x71, 0xD4, 0x72, 0xD4, 0x73, /* 0x50-0x53 */ + 0xD4, 0x74, 0xD4, 0x75, 0xD4, 0x76, 0xD4, 0x77, /* 0x54-0x57 */ + 0xD4, 0x78, 0xD4, 0x79, 0xD4, 0x7A, 0xD4, 0x7B, /* 0x58-0x5B */ + 0xD4, 0x7C, 0xD4, 0x7D, 0xD4, 0x7E, 0xD4, 0x80, /* 0x5C-0x5F */ + 0xD4, 0x81, 0xD4, 0x82, 0xD4, 0x83, 0xD4, 0x84, /* 0x60-0x63 */ + 0xD4, 0x85, 0xD4, 0x86, 0xD4, 0x87, 0xD4, 0x88, /* 0x64-0x67 */ + 0xD4, 0x89, 0xD4, 0x8A, 0xD4, 0x8B, 0xD4, 0x8C, /* 0x68-0x6B */ + 0xD4, 0x8D, 0xD4, 0x8E, 0xD4, 0x8F, 0xD4, 0x90, /* 0x6C-0x6F */ + 0xD4, 0x91, 0xD4, 0x92, 0xD4, 0x93, 0xD4, 0x94, /* 0x70-0x73 */ + 0xD4, 0x95, 0xD4, 0x96, 0xD4, 0x97, 0xD4, 0x98, /* 0x74-0x77 */ + 0xD4, 0x99, 0xD5, 0xB2, 0xD4, 0x9A, 0xD4, 0x9B, /* 0x78-0x7B */ + 0xD4, 0x9C, 0xD4, 0x9D, 0xD4, 0x9E, 0xD4, 0x9F, /* 0x7C-0x7F */ + + 0xD4, 0xA0, 0xD5, 0x40, 0xD5, 0x41, 0xD5, 0x42, /* 0x80-0x83 */ + 0xD5, 0x43, 0xD5, 0x44, 0xD5, 0x45, 0xD5, 0x46, /* 0x84-0x87 */ + 0xD5, 0x47, 0xD3, 0xFE, 0xCC, 0xDC, 0xD5, 0x48, /* 0x88-0x8B */ + 0xD5, 0x49, 0xD5, 0x4A, 0xD5, 0x4B, 0xD5, 0x4C, /* 0x8C-0x8F */ + 0xD5, 0x4D, 0xD5, 0x4E, 0xD5, 0x4F, 0xCA, 0xC4, /* 0x90-0x93 */ + 0xD5, 0x50, 0xD5, 0x51, 0xD5, 0x52, 0xD5, 0x53, /* 0x94-0x97 */ + 0xD5, 0x54, 0xD5, 0x55, 0xD5, 0x56, 0xD5, 0x57, /* 0x98-0x9B */ + 0xD5, 0x58, 0xD5, 0x59, 0xD5, 0x5A, 0xD5, 0x5B, /* 0x9C-0x9F */ + 0xD5, 0x5C, 0xD5, 0x5D, 0xD5, 0x5E, 0xD5, 0x5F, /* 0xA0-0xA3 */ + 0xD5, 0x60, 0xD5, 0x61, 0xD5, 0x62, 0xD5, 0x63, /* 0xA4-0xA7 */ + 0xD5, 0x64, 0xD5, 0x65, 0xD5, 0x66, 0xD5, 0x67, /* 0xA8-0xAB */ + 0xD5, 0x68, 0xD5, 0x69, 0xD5, 0x6A, 0xD5, 0x6B, /* 0xAC-0xAF */ + 0xD5, 0x6C, 0xD5, 0x6D, 0xD5, 0x6E, 0xD5, 0x6F, /* 0xB0-0xB3 */ + 0xD5, 0x70, 0xD5, 0x71, 0xD5, 0x72, 0xD5, 0x73, /* 0xB4-0xB7 */ + 0xD5, 0x74, 0xD5, 0x75, 0xD5, 0x76, 0xD5, 0x77, /* 0xB8-0xBB */ + 0xD5, 0x78, 0xD5, 0x79, 0xD5, 0x7A, 0xD5, 0x7B, /* 0xBC-0xBF */ + 0xD5, 0x7C, 0xD5, 0x7D, 0xD5, 0x7E, 0xD5, 0x80, /* 0xC0-0xC3 */ + 0xD5, 0x81, 0xD5, 0x82, 0xD5, 0x83, 0xD5, 0x84, /* 0xC4-0xC7 */ + 0xD5, 0x85, 0xD5, 0x86, 0xD5, 0x87, 0xD5, 0x88, /* 0xC8-0xCB */ + 0xD5, 0x89, 0xD5, 0x8A, 0xD5, 0x8B, 0xD5, 0x8C, /* 0xCC-0xCF */ + 0xD5, 0x8D, 0xD5, 0x8E, 0xD5, 0x8F, 0xD5, 0x90, /* 0xD0-0xD3 */ + 0xD5, 0x91, 0xD5, 0x92, 0xD5, 0x93, 0xD5, 0x94, /* 0xD4-0xD7 */ + 0xD5, 0x95, 0xD5, 0x96, 0xD5, 0x97, 0xD5, 0x98, /* 0xD8-0xDB */ + 0xD5, 0x99, 0xD5, 0x9A, 0xD5, 0x9B, 0xD5, 0x9C, /* 0xDC-0xDF */ + 0xD5, 0x9D, 0xD5, 0x9E, 0xD5, 0x9F, 0xD5, 0xA0, /* 0xE0-0xE3 */ + 0xD6, 0x40, 0xD6, 0x41, 0xD6, 0x42, 0xD6, 0x43, /* 0xE4-0xE7 */ + 0xD6, 0x44, 0xD6, 0x45, 0xD6, 0x46, 0xD6, 0x47, /* 0xE8-0xEB */ + 0xD6, 0x48, 0xD6, 0x49, 0xD6, 0x4A, 0xD6, 0x4B, /* 0xEC-0xEF */ + 0xD6, 0x4C, 0xD6, 0x4D, 0xD6, 0x4E, 0xD6, 0x4F, /* 0xF0-0xF3 */ + 0xD6, 0x50, 0xD6, 0x51, 0xD6, 0x52, 0xD6, 0x53, /* 0xF4-0xF7 */ + 0xD6, 0x54, 0xD6, 0x55, 0xD6, 0x56, 0xD6, 0x57, /* 0xF8-0xFB */ + 0xD6, 0x58, 0xD6, 0x59, 0xD6, 0x5A, 0xD6, 0x5B, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8B[512] = { + 0xD6, 0x5C, 0xD6, 0x5D, 0xD6, 0x5E, 0xD6, 0x5F, /* 0x00-0x03 */ + 0xD6, 0x60, 0xD6, 0x61, 0xD6, 0x62, 0xE5, 0xC0, /* 0x04-0x07 */ + 0xD6, 0x63, 0xD6, 0x64, 0xD6, 0x65, 0xD6, 0x66, /* 0x08-0x0B */ + 0xD6, 0x67, 0xD6, 0x68, 0xD6, 0x69, 0xD6, 0x6A, /* 0x0C-0x0F */ + 0xD6, 0x6B, 0xD6, 0x6C, 0xD6, 0x6D, 0xD6, 0x6E, /* 0x10-0x13 */ + 0xD6, 0x6F, 0xD6, 0x70, 0xD6, 0x71, 0xD6, 0x72, /* 0x14-0x17 */ + 0xD6, 0x73, 0xD6, 0x74, 0xD6, 0x75, 0xD6, 0x76, /* 0x18-0x1B */ + 0xD6, 0x77, 0xD6, 0x78, 0xD6, 0x79, 0xD6, 0x7A, /* 0x1C-0x1F */ + 0xD6, 0x7B, 0xD6, 0x7C, 0xD6, 0x7D, 0xD6, 0x7E, /* 0x20-0x23 */ + 0xD6, 0x80, 0xD6, 0x81, 0xF6, 0xA5, 0xD6, 0x82, /* 0x24-0x27 */ + 0xD6, 0x83, 0xD6, 0x84, 0xD6, 0x85, 0xD6, 0x86, /* 0x28-0x2B */ + 0xD6, 0x87, 0xD6, 0x88, 0xD6, 0x89, 0xD6, 0x8A, /* 0x2C-0x2F */ + 0xD6, 0x8B, 0xD6, 0x8C, 0xD6, 0x8D, 0xD6, 0x8E, /* 0x30-0x33 */ + 0xD6, 0x8F, 0xD6, 0x90, 0xD6, 0x91, 0xD6, 0x92, /* 0x34-0x37 */ + 0xD6, 0x93, 0xD6, 0x94, 0xD6, 0x95, 0xD6, 0x96, /* 0x38-0x3B */ + 0xD6, 0x97, 0xD6, 0x98, 0xD6, 0x99, 0xD6, 0x9A, /* 0x3C-0x3F */ + 0xD6, 0x9B, 0xD6, 0x9C, 0xD6, 0x9D, 0xD6, 0x9E, /* 0x40-0x43 */ + 0xD6, 0x9F, 0xD6, 0xA0, 0xD7, 0x40, 0xD7, 0x41, /* 0x44-0x47 */ + 0xD7, 0x42, 0xD7, 0x43, 0xD7, 0x44, 0xD7, 0x45, /* 0x48-0x4B */ + 0xD7, 0x46, 0xD7, 0x47, 0xD7, 0x48, 0xD7, 0x49, /* 0x4C-0x4F */ + 0xD7, 0x4A, 0xD7, 0x4B, 0xD7, 0x4C, 0xD7, 0x4D, /* 0x50-0x53 */ + 0xD7, 0x4E, 0xD7, 0x4F, 0xD7, 0x50, 0xD7, 0x51, /* 0x54-0x57 */ + 0xD7, 0x52, 0xD7, 0x53, 0xD7, 0x54, 0xD7, 0x55, /* 0x58-0x5B */ + 0xD7, 0x56, 0xD7, 0x57, 0xD7, 0x58, 0xD7, 0x59, /* 0x5C-0x5F */ + 0xD7, 0x5A, 0xD7, 0x5B, 0xD7, 0x5C, 0xD7, 0x5D, /* 0x60-0x63 */ + 0xD7, 0x5E, 0xD7, 0x5F, 0xBE, 0xAF, 0xD7, 0x60, /* 0x64-0x67 */ + 0xD7, 0x61, 0xD7, 0x62, 0xD7, 0x63, 0xD7, 0x64, /* 0x68-0x6B */ + 0xC6, 0xA9, 0xD7, 0x65, 0xD7, 0x66, 0xD7, 0x67, /* 0x6C-0x6F */ + 0xD7, 0x68, 0xD7, 0x69, 0xD7, 0x6A, 0xD7, 0x6B, /* 0x70-0x73 */ + 0xD7, 0x6C, 0xD7, 0x6D, 0xD7, 0x6E, 0xD7, 0x6F, /* 0x74-0x77 */ + 0xD7, 0x70, 0xD7, 0x71, 0xD7, 0x72, 0xD7, 0x73, /* 0x78-0x7B */ + 0xD7, 0x74, 0xD7, 0x75, 0xD7, 0x76, 0xD7, 0x77, /* 0x7C-0x7F */ + + 0xD7, 0x78, 0xD7, 0x79, 0xD7, 0x7A, 0xD7, 0x7B, /* 0x80-0x83 */ + 0xD7, 0x7C, 0xD7, 0x7D, 0xD7, 0x7E, 0xD7, 0x80, /* 0x84-0x87 */ + 0xD7, 0x81, 0xD7, 0x82, 0xD7, 0x83, 0xD7, 0x84, /* 0x88-0x8B */ + 0xD7, 0x85, 0xD7, 0x86, 0xD7, 0x87, 0xD7, 0x88, /* 0x8C-0x8F */ + 0xD7, 0x89, 0xD7, 0x8A, 0xD7, 0x8B, 0xD7, 0x8C, /* 0x90-0x93 */ + 0xD7, 0x8D, 0xD7, 0x8E, 0xD7, 0x8F, 0xD7, 0x90, /* 0x94-0x97 */ + 0xD7, 0x91, 0xD7, 0x92, 0xD7, 0x93, 0xD7, 0x94, /* 0x98-0x9B */ + 0xD7, 0x95, 0xD7, 0x96, 0xD7, 0x97, 0xD7, 0x98, /* 0x9C-0x9F */ + 0xDA, 0xA5, 0xBC, 0xC6, 0xB6, 0xA9, 0xB8, 0xBC, /* 0xA0-0xA3 */ + 0xC8, 0xCF, 0xBC, 0xA5, 0xDA, 0xA6, 0xDA, 0xA7, /* 0xA4-0xA7 */ + 0xCC, 0xD6, 0xC8, 0xC3, 0xDA, 0xA8, 0xC6, 0xFD, /* 0xA8-0xAB */ + 0xD7, 0x99, 0xD1, 0xB5, 0xD2, 0xE9, 0xD1, 0xB6, /* 0xAC-0xAF */ + 0xBC, 0xC7, 0xD7, 0x9A, 0xBD, 0xB2, 0xBB, 0xE4, /* 0xB0-0xB3 */ + 0xDA, 0xA9, 0xDA, 0xAA, 0xD1, 0xC8, 0xDA, 0xAB, /* 0xB4-0xB7 */ + 0xD0, 0xED, 0xB6, 0xEF, 0xC2, 0xDB, 0xD7, 0x9B, /* 0xB8-0xBB */ + 0xCB, 0xCF, 0xB7, 0xED, 0xC9, 0xE8, 0xB7, 0xC3, /* 0xBC-0xBF */ + 0xBE, 0xF7, 0xD6, 0xA4, 0xDA, 0xAC, 0xDA, 0xAD, /* 0xC0-0xC3 */ + 0xC6, 0xC0, 0xD7, 0xE7, 0xCA, 0xB6, 0xD7, 0x9C, /* 0xC4-0xC7 */ + 0xD5, 0xA9, 0xCB, 0xDF, 0xD5, 0xEF, 0xDA, 0xAE, /* 0xC8-0xCB */ + 0xD6, 0xDF, 0xB4, 0xCA, 0xDA, 0xB0, 0xDA, 0xAF, /* 0xCC-0xCF */ + 0xD7, 0x9D, 0xD2, 0xEB, 0xDA, 0xB1, 0xDA, 0xB2, /* 0xD0-0xD3 */ + 0xDA, 0xB3, 0xCA, 0xD4, 0xDA, 0xB4, 0xCA, 0xAB, /* 0xD4-0xD7 */ + 0xDA, 0xB5, 0xDA, 0xB6, 0xB3, 0xCF, 0xD6, 0xEF, /* 0xD8-0xDB */ + 0xDA, 0xB7, 0xBB, 0xB0, 0xB5, 0xAE, 0xDA, 0xB8, /* 0xDC-0xDF */ + 0xDA, 0xB9, 0xB9, 0xEE, 0xD1, 0xAF, 0xD2, 0xE8, /* 0xE0-0xE3 */ + 0xDA, 0xBA, 0xB8, 0xC3, 0xCF, 0xEA, 0xB2, 0xEF, /* 0xE4-0xE7 */ + 0xDA, 0xBB, 0xDA, 0xBC, 0xD7, 0x9E, 0xBD, 0xEB, /* 0xE8-0xEB */ + 0xCE, 0xDC, 0xD3, 0xEF, 0xDA, 0xBD, 0xCE, 0xF3, /* 0xEC-0xEF */ + 0xDA, 0xBE, 0xD3, 0xD5, 0xBB, 0xE5, 0xDA, 0xBF, /* 0xF0-0xF3 */ + 0xCB, 0xB5, 0xCB, 0xD0, 0xDA, 0xC0, 0xC7, 0xEB, /* 0xF4-0xF7 */ + 0xD6, 0xEE, 0xDA, 0xC1, 0xC5, 0xB5, 0xB6, 0xC1, /* 0xF8-0xFB */ + 0xDA, 0xC2, 0xB7, 0xCC, 0xBF, 0xCE, 0xDA, 0xC3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8C[512] = { + 0xDA, 0xC4, 0xCB, 0xAD, 0xDA, 0xC5, 0xB5, 0xF7, /* 0x00-0x03 */ + 0xDA, 0xC6, 0xC1, 0xC2, 0xD7, 0xBB, 0xDA, 0xC7, /* 0x04-0x07 */ + 0xCC, 0xB8, 0xD7, 0x9F, 0xD2, 0xEA, 0xC4, 0xB1, /* 0x08-0x0B */ + 0xDA, 0xC8, 0xB5, 0xFD, 0xBB, 0xD1, 0xDA, 0xC9, /* 0x0C-0x0F */ + 0xD0, 0xB3, 0xDA, 0xCA, 0xDA, 0xCB, 0xCE, 0xBD, /* 0x10-0x13 */ + 0xDA, 0xCC, 0xDA, 0xCD, 0xDA, 0xCE, 0xB2, 0xF7, /* 0x14-0x17 */ + 0xDA, 0xD1, 0xDA, 0xCF, 0xD1, 0xE8, 0xDA, 0xD0, /* 0x18-0x1B */ + 0xC3, 0xD5, 0xDA, 0xD2, 0xD7, 0xA0, 0xDA, 0xD3, /* 0x1C-0x1F */ + 0xDA, 0xD4, 0xDA, 0xD5, 0xD0, 0xBB, 0xD2, 0xA5, /* 0x20-0x23 */ + 0xB0, 0xF9, 0xDA, 0xD6, 0xC7, 0xAB, 0xDA, 0xD7, /* 0x24-0x27 */ + 0xBD, 0xF7, 0xC3, 0xA1, 0xDA, 0xD8, 0xDA, 0xD9, /* 0x28-0x2B */ + 0xC3, 0xFD, 0xCC, 0xB7, 0xDA, 0xDA, 0xDA, 0xDB, /* 0x2C-0x2F */ + 0xC0, 0xBE, 0xC6, 0xD7, 0xDA, 0xDC, 0xDA, 0xDD, /* 0x30-0x33 */ + 0xC7, 0xB4, 0xDA, 0xDE, 0xDA, 0xDF, 0xB9, 0xC8, /* 0x34-0x37 */ + 0xD8, 0x40, 0xD8, 0x41, 0xD8, 0x42, 0xD8, 0x43, /* 0x38-0x3B */ + 0xD8, 0x44, 0xD8, 0x45, 0xD8, 0x46, 0xD8, 0x47, /* 0x3C-0x3F */ + 0xD8, 0x48, 0xBB, 0xED, 0xD8, 0x49, 0xD8, 0x4A, /* 0x40-0x43 */ + 0xD8, 0x4B, 0xD8, 0x4C, 0xB6, 0xB9, 0xF4, 0xF8, /* 0x44-0x47 */ + 0xD8, 0x4D, 0xF4, 0xF9, 0xD8, 0x4E, 0xD8, 0x4F, /* 0x48-0x4B */ + 0xCD, 0xE3, 0xD8, 0x50, 0xD8, 0x51, 0xD8, 0x52, /* 0x4C-0x4F */ + 0xD8, 0x53, 0xD8, 0x54, 0xD8, 0x55, 0xD8, 0x56, /* 0x50-0x53 */ + 0xD8, 0x57, 0xF5, 0xB9, 0xD8, 0x58, 0xD8, 0x59, /* 0x54-0x57 */ + 0xD8, 0x5A, 0xD8, 0x5B, 0xEB, 0xE0, 0xD8, 0x5C, /* 0x58-0x5B */ + 0xD8, 0x5D, 0xD8, 0x5E, 0xD8, 0x5F, 0xD8, 0x60, /* 0x5C-0x5F */ + 0xD8, 0x61, 0xCF, 0xF3, 0xBB, 0xBF, 0xD8, 0x62, /* 0x60-0x63 */ + 0xD8, 0x63, 0xD8, 0x64, 0xD8, 0x65, 0xD8, 0x66, /* 0x64-0x67 */ + 0xD8, 0x67, 0xD8, 0x68, 0xBA, 0xC0, 0xD4, 0xA5, /* 0x68-0x6B */ + 0xD8, 0x69, 0xD8, 0x6A, 0xD8, 0x6B, 0xD8, 0x6C, /* 0x6C-0x6F */ + 0xD8, 0x6D, 0xD8, 0x6E, 0xD8, 0x6F, 0xE1, 0xD9, /* 0x70-0x73 */ + 0xD8, 0x70, 0xD8, 0x71, 0xD8, 0x72, 0xD8, 0x73, /* 0x74-0x77 */ + 0xF5, 0xF4, 0xB1, 0xAA, 0xB2, 0xF2, 0xD8, 0x74, /* 0x78-0x7B */ + 0xD8, 0x75, 0xD8, 0x76, 0xD8, 0x77, 0xD8, 0x78, /* 0x7C-0x7F */ + + 0xD8, 0x79, 0xD8, 0x7A, 0xF5, 0xF5, 0xD8, 0x7B, /* 0x80-0x83 */ + 0xD8, 0x7C, 0xF5, 0xF7, 0xD8, 0x7D, 0xD8, 0x7E, /* 0x84-0x87 */ + 0xD8, 0x80, 0xBA, 0xD1, 0xF5, 0xF6, 0xD8, 0x81, /* 0x88-0x8B */ + 0xC3, 0xB2, 0xD8, 0x82, 0xD8, 0x83, 0xD8, 0x84, /* 0x8C-0x8F */ + 0xD8, 0x85, 0xD8, 0x86, 0xD8, 0x87, 0xD8, 0x88, /* 0x90-0x93 */ + 0xF5, 0xF9, 0xD8, 0x89, 0xD8, 0x8A, 0xD8, 0x8B, /* 0x94-0x97 */ + 0xF5, 0xF8, 0xD8, 0x8C, 0xD8, 0x8D, 0xD8, 0x8E, /* 0x98-0x9B */ + 0xD8, 0x8F, 0xD8, 0x90, 0xD8, 0x91, 0xD8, 0x92, /* 0x9C-0x9F */ + 0xD8, 0x93, 0xD8, 0x94, 0xD8, 0x95, 0xD8, 0x96, /* 0xA0-0xA3 */ + 0xD8, 0x97, 0xD8, 0x98, 0xD8, 0x99, 0xD8, 0x9A, /* 0xA4-0xA7 */ + 0xD8, 0x9B, 0xD8, 0x9C, 0xD8, 0x9D, 0xD8, 0x9E, /* 0xA8-0xAB */ + 0xD8, 0x9F, 0xD8, 0xA0, 0xD9, 0x40, 0xD9, 0x41, /* 0xAC-0xAF */ + 0xD9, 0x42, 0xD9, 0x43, 0xD9, 0x44, 0xD9, 0x45, /* 0xB0-0xB3 */ + 0xD9, 0x46, 0xD9, 0x47, 0xD9, 0x48, 0xD9, 0x49, /* 0xB4-0xB7 */ + 0xD9, 0x4A, 0xD9, 0x4B, 0xD9, 0x4C, 0xD9, 0x4D, /* 0xB8-0xBB */ + 0xD9, 0x4E, 0xD9, 0x4F, 0xD9, 0x50, 0xD9, 0x51, /* 0xBC-0xBF */ + 0xD9, 0x52, 0xD9, 0x53, 0xD9, 0x54, 0xD9, 0x55, /* 0xC0-0xC3 */ + 0xD9, 0x56, 0xD9, 0x57, 0xD9, 0x58, 0xD9, 0x59, /* 0xC4-0xC7 */ + 0xD9, 0x5A, 0xD9, 0x5B, 0xD9, 0x5C, 0xD9, 0x5D, /* 0xC8-0xCB */ + 0xD9, 0x5E, 0xD9, 0x5F, 0xD9, 0x60, 0xD9, 0x61, /* 0xCC-0xCF */ + 0xD9, 0x62, 0xD9, 0x63, 0xD9, 0x64, 0xD9, 0x65, /* 0xD0-0xD3 */ + 0xD9, 0x66, 0xD9, 0x67, 0xD9, 0x68, 0xD9, 0x69, /* 0xD4-0xD7 */ + 0xD9, 0x6A, 0xD9, 0x6B, 0xD9, 0x6C, 0xD9, 0x6D, /* 0xD8-0xDB */ + 0xD9, 0x6E, 0xD9, 0x6F, 0xD9, 0x70, 0xD9, 0x71, /* 0xDC-0xDF */ + 0xD9, 0x72, 0xD9, 0x73, 0xD9, 0x74, 0xD9, 0x75, /* 0xE0-0xE3 */ + 0xD9, 0x76, 0xD9, 0x77, 0xD9, 0x78, 0xD9, 0x79, /* 0xE4-0xE7 */ + 0xD9, 0x7A, 0xD9, 0x7B, 0xD9, 0x7C, 0xD9, 0x7D, /* 0xE8-0xEB */ + 0xD9, 0x7E, 0xD9, 0x80, 0xD9, 0x81, 0xD9, 0x82, /* 0xEC-0xEF */ + 0xD9, 0x83, 0xD9, 0x84, 0xD9, 0x85, 0xD9, 0x86, /* 0xF0-0xF3 */ + 0xD9, 0x87, 0xD9, 0x88, 0xD9, 0x89, 0xD9, 0x8A, /* 0xF4-0xF7 */ + 0xD9, 0x8B, 0xD9, 0x8C, 0xD9, 0x8D, 0xD9, 0x8E, /* 0xF8-0xFB */ + 0xD9, 0x8F, 0xD9, 0x90, 0xD9, 0x91, 0xD9, 0x92, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8D[512] = { + 0xD9, 0x93, 0xD9, 0x94, 0xD9, 0x95, 0xD9, 0x96, /* 0x00-0x03 */ + 0xD9, 0x97, 0xD9, 0x98, 0xD9, 0x99, 0xD9, 0x9A, /* 0x04-0x07 */ + 0xD9, 0x9B, 0xD9, 0x9C, 0xD9, 0x9D, 0xD9, 0x9E, /* 0x08-0x0B */ + 0xD9, 0x9F, 0xD9, 0xA0, 0xDA, 0x40, 0xDA, 0x41, /* 0x0C-0x0F */ + 0xDA, 0x42, 0xDA, 0x43, 0xDA, 0x44, 0xDA, 0x45, /* 0x10-0x13 */ + 0xDA, 0x46, 0xDA, 0x47, 0xDA, 0x48, 0xDA, 0x49, /* 0x14-0x17 */ + 0xDA, 0x4A, 0xDA, 0x4B, 0xDA, 0x4C, 0xDA, 0x4D, /* 0x18-0x1B */ + 0xDA, 0x4E, 0xB1, 0xB4, 0xD5, 0xEA, 0xB8, 0xBA, /* 0x1C-0x1F */ + 0xDA, 0x4F, 0xB9, 0xB1, 0xB2, 0xC6, 0xD4, 0xF0, /* 0x20-0x23 */ + 0xCF, 0xCD, 0xB0, 0xDC, 0xD5, 0xCB, 0xBB, 0xF5, /* 0x24-0x27 */ + 0xD6, 0xCA, 0xB7, 0xB7, 0xCC, 0xB0, 0xC6, 0xB6, /* 0x28-0x2B */ + 0xB1, 0xE1, 0xB9, 0xBA, 0xD6, 0xFC, 0xB9, 0xE1, /* 0x2C-0x2F */ + 0xB7, 0xA1, 0xBC, 0xFA, 0xEA, 0xDA, 0xEA, 0xDB, /* 0x30-0x33 */ + 0xCC, 0xF9, 0xB9, 0xF3, 0xEA, 0xDC, 0xB4, 0xFB, /* 0x34-0x37 */ + 0xC3, 0xB3, 0xB7, 0xD1, 0xBA, 0xD8, 0xEA, 0xDD, /* 0x38-0x3B */ + 0xD4, 0xF4, 0xEA, 0xDE, 0xBC, 0xD6, 0xBB, 0xDF, /* 0x3C-0x3F */ + 0xEA, 0xDF, 0xC1, 0xDE, 0xC2, 0xB8, 0xD4, 0xDF, /* 0x40-0x43 */ + 0xD7, 0xCA, 0xEA, 0xE0, 0xEA, 0xE1, 0xEA, 0xE4, /* 0x44-0x47 */ + 0xEA, 0xE2, 0xEA, 0xE3, 0xC9, 0xDE, 0xB8, 0xB3, /* 0x48-0x4B */ + 0xB6, 0xC4, 0xEA, 0xE5, 0xCA, 0xEA, 0xC9, 0xCD, /* 0x4C-0x4F */ + 0xB4, 0xCD, 0xDA, 0x50, 0xDA, 0x51, 0xE2, 0xD9, /* 0x50-0x53 */ + 0xC5, 0xE2, 0xEA, 0xE6, 0xC0, 0xB5, 0xDA, 0x52, /* 0x54-0x57 */ + 0xD7, 0xB8, 0xEA, 0xE7, 0xD7, 0xAC, 0xC8, 0xFC, /* 0x58-0x5B */ + 0xD8, 0xD3, 0xD8, 0xCD, 0xD4, 0xDE, 0xDA, 0x53, /* 0x5C-0x5F */ + 0xD4, 0xF9, 0xC9, 0xC4, 0xD3, 0xAE, 0xB8, 0xD3, /* 0x60-0x63 */ + 0xB3, 0xE0, 0xDA, 0x54, 0xC9, 0xE2, 0xF4, 0xF6, /* 0x64-0x67 */ + 0xDA, 0x55, 0xDA, 0x56, 0xDA, 0x57, 0xBA, 0xD5, /* 0x68-0x6B */ + 0xDA, 0x58, 0xF4, 0xF7, 0xDA, 0x59, 0xDA, 0x5A, /* 0x6C-0x6F */ + 0xD7, 0xDF, 0xDA, 0x5B, 0xDA, 0x5C, 0xF4, 0xF1, /* 0x70-0x73 */ + 0xB8, 0xB0, 0xD5, 0xD4, 0xB8, 0xCF, 0xC6, 0xF0, /* 0x74-0x77 */ + 0xDA, 0x5D, 0xDA, 0x5E, 0xDA, 0x5F, 0xDA, 0x60, /* 0x78-0x7B */ + 0xDA, 0x61, 0xDA, 0x62, 0xDA, 0x63, 0xDA, 0x64, /* 0x7C-0x7F */ + + 0xDA, 0x65, 0xB3, 0xC3, 0xDA, 0x66, 0xDA, 0x67, /* 0x80-0x83 */ + 0xF4, 0xF2, 0xB3, 0xAC, 0xDA, 0x68, 0xDA, 0x69, /* 0x84-0x87 */ + 0xDA, 0x6A, 0xDA, 0x6B, 0xD4, 0xBD, 0xC7, 0xF7, /* 0x88-0x8B */ + 0xDA, 0x6C, 0xDA, 0x6D, 0xDA, 0x6E, 0xDA, 0x6F, /* 0x8C-0x8F */ + 0xDA, 0x70, 0xF4, 0xF4, 0xDA, 0x71, 0xDA, 0x72, /* 0x90-0x93 */ + 0xF4, 0xF3, 0xDA, 0x73, 0xDA, 0x74, 0xDA, 0x75, /* 0x94-0x97 */ + 0xDA, 0x76, 0xDA, 0x77, 0xDA, 0x78, 0xDA, 0x79, /* 0x98-0x9B */ + 0xDA, 0x7A, 0xDA, 0x7B, 0xDA, 0x7C, 0xCC, 0xCB, /* 0x9C-0x9F */ + 0xDA, 0x7D, 0xDA, 0x7E, 0xDA, 0x80, 0xC8, 0xA4, /* 0xA0-0xA3 */ + 0xDA, 0x81, 0xDA, 0x82, 0xDA, 0x83, 0xDA, 0x84, /* 0xA4-0xA7 */ + 0xDA, 0x85, 0xDA, 0x86, 0xDA, 0x87, 0xDA, 0x88, /* 0xA8-0xAB */ + 0xDA, 0x89, 0xDA, 0x8A, 0xDA, 0x8B, 0xDA, 0x8C, /* 0xAC-0xAF */ + 0xDA, 0x8D, 0xF4, 0xF5, 0xDA, 0x8E, 0xD7, 0xE3, /* 0xB0-0xB3 */ + 0xC5, 0xBF, 0xF5, 0xC0, 0xDA, 0x8F, 0xDA, 0x90, /* 0xB4-0xB7 */ + 0xF5, 0xBB, 0xDA, 0x91, 0xF5, 0xC3, 0xDA, 0x92, /* 0xB8-0xBB */ + 0xF5, 0xC2, 0xDA, 0x93, 0xD6, 0xBA, 0xF5, 0xC1, /* 0xBC-0xBF */ + 0xDA, 0x94, 0xDA, 0x95, 0xDA, 0x96, 0xD4, 0xBE, /* 0xC0-0xC3 */ + 0xF5, 0xC4, 0xDA, 0x97, 0xF5, 0xCC, 0xDA, 0x98, /* 0xC4-0xC7 */ + 0xDA, 0x99, 0xDA, 0x9A, 0xDA, 0x9B, 0xB0, 0xCF, /* 0xC8-0xCB */ + 0xB5, 0xF8, 0xDA, 0x9C, 0xF5, 0xC9, 0xF5, 0xCA, /* 0xCC-0xCF */ + 0xDA, 0x9D, 0xC5, 0xDC, 0xDA, 0x9E, 0xDA, 0x9F, /* 0xD0-0xD3 */ + 0xDA, 0xA0, 0xDB, 0x40, 0xF5, 0xC5, 0xF5, 0xC6, /* 0xD4-0xD7 */ + 0xDB, 0x41, 0xDB, 0x42, 0xF5, 0xC7, 0xF5, 0xCB, /* 0xD8-0xDB */ + 0xDB, 0x43, 0xBE, 0xE0, 0xF5, 0xC8, 0xB8, 0xFA, /* 0xDC-0xDF */ + 0xDB, 0x44, 0xDB, 0x45, 0xDB, 0x46, 0xF5, 0xD0, /* 0xE0-0xE3 */ + 0xF5, 0xD3, 0xDB, 0x47, 0xDB, 0x48, 0xDB, 0x49, /* 0xE4-0xE7 */ + 0xBF, 0xE7, 0xDB, 0x4A, 0xB9, 0xF2, 0xF5, 0xBC, /* 0xE8-0xEB */ + 0xF5, 0xCD, 0xDB, 0x4B, 0xDB, 0x4C, 0xC2, 0xB7, /* 0xEC-0xEF */ + 0xDB, 0x4D, 0xDB, 0x4E, 0xDB, 0x4F, 0xCC, 0xF8, /* 0xF0-0xF3 */ + 0xDB, 0x50, 0xBC, 0xF9, 0xDB, 0x51, 0xF5, 0xCE, /* 0xF4-0xF7 */ + 0xF5, 0xCF, 0xF5, 0xD1, 0xB6, 0xE5, 0xF5, 0xD2, /* 0xF8-0xFB */ + 0xDB, 0x52, 0xF5, 0xD5, 0xDB, 0x53, 0xDB, 0x54, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8E[512] = { + 0xDB, 0x55, 0xDB, 0x56, 0xDB, 0x57, 0xDB, 0x58, /* 0x00-0x03 */ + 0xDB, 0x59, 0xF5, 0xBD, 0xDB, 0x5A, 0xDB, 0x5B, /* 0x04-0x07 */ + 0xDB, 0x5C, 0xF5, 0xD4, 0xD3, 0xBB, 0xDB, 0x5D, /* 0x08-0x0B */ + 0xB3, 0xEC, 0xDB, 0x5E, 0xDB, 0x5F, 0xCC, 0xA4, /* 0x0C-0x0F */ + 0xDB, 0x60, 0xDB, 0x61, 0xDB, 0x62, 0xDB, 0x63, /* 0x10-0x13 */ + 0xF5, 0xD6, 0xDB, 0x64, 0xDB, 0x65, 0xDB, 0x66, /* 0x14-0x17 */ + 0xDB, 0x67, 0xDB, 0x68, 0xDB, 0x69, 0xDB, 0x6A, /* 0x18-0x1B */ + 0xDB, 0x6B, 0xF5, 0xD7, 0xBE, 0xE1, 0xF5, 0xD8, /* 0x1C-0x1F */ + 0xDB, 0x6C, 0xDB, 0x6D, 0xCC, 0xDF, 0xF5, 0xDB, /* 0x20-0x23 */ + 0xDB, 0x6E, 0xDB, 0x6F, 0xDB, 0x70, 0xDB, 0x71, /* 0x24-0x27 */ + 0xDB, 0x72, 0xB2, 0xC8, 0xD7, 0xD9, 0xDB, 0x73, /* 0x28-0x2B */ + 0xF5, 0xD9, 0xDB, 0x74, 0xF5, 0xDA, 0xF5, 0xDC, /* 0x2C-0x2F */ + 0xDB, 0x75, 0xF5, 0xE2, 0xDB, 0x76, 0xDB, 0x77, /* 0x30-0x33 */ + 0xDB, 0x78, 0xF5, 0xE0, 0xDB, 0x79, 0xDB, 0x7A, /* 0x34-0x37 */ + 0xDB, 0x7B, 0xF5, 0xDF, 0xF5, 0xDD, 0xDB, 0x7C, /* 0x38-0x3B */ + 0xDB, 0x7D, 0xF5, 0xE1, 0xDB, 0x7E, 0xDB, 0x80, /* 0x3C-0x3F */ + 0xF5, 0xDE, 0xF5, 0xE4, 0xF5, 0xE5, 0xDB, 0x81, /* 0x40-0x43 */ + 0xCC, 0xE3, 0xDB, 0x82, 0xDB, 0x83, 0xE5, 0xBF, /* 0x44-0x47 */ + 0xB5, 0xB8, 0xF5, 0xE3, 0xF5, 0xE8, 0xCC, 0xA3, /* 0x48-0x4B */ + 0xDB, 0x84, 0xDB, 0x85, 0xDB, 0x86, 0xDB, 0x87, /* 0x4C-0x4F */ + 0xDB, 0x88, 0xF5, 0xE6, 0xF5, 0xE7, 0xDB, 0x89, /* 0x50-0x53 */ + 0xDB, 0x8A, 0xDB, 0x8B, 0xDB, 0x8C, 0xDB, 0x8D, /* 0x54-0x57 */ + 0xDB, 0x8E, 0xF5, 0xBE, 0xDB, 0x8F, 0xDB, 0x90, /* 0x58-0x5B */ + 0xDB, 0x91, 0xDB, 0x92, 0xDB, 0x93, 0xDB, 0x94, /* 0x5C-0x5F */ + 0xDB, 0x95, 0xDB, 0x96, 0xDB, 0x97, 0xDB, 0x98, /* 0x60-0x63 */ + 0xDB, 0x99, 0xDB, 0x9A, 0xB1, 0xC4, 0xDB, 0x9B, /* 0x64-0x67 */ + 0xDB, 0x9C, 0xF5, 0xBF, 0xDB, 0x9D, 0xDB, 0x9E, /* 0x68-0x6B */ + 0xB5, 0xC5, 0xB2, 0xE4, 0xDB, 0x9F, 0xF5, 0xEC, /* 0x6C-0x6F */ + 0xF5, 0xE9, 0xDB, 0xA0, 0xB6, 0xD7, 0xDC, 0x40, /* 0x70-0x73 */ + 0xF5, 0xED, 0xDC, 0x41, 0xF5, 0xEA, 0xDC, 0x42, /* 0x74-0x77 */ + 0xDC, 0x43, 0xDC, 0x44, 0xDC, 0x45, 0xDC, 0x46, /* 0x78-0x7B */ + 0xF5, 0xEB, 0xDC, 0x47, 0xDC, 0x48, 0xB4, 0xDA, /* 0x7C-0x7F */ + + 0xDC, 0x49, 0xD4, 0xEA, 0xDC, 0x4A, 0xDC, 0x4B, /* 0x80-0x83 */ + 0xDC, 0x4C, 0xF5, 0xEE, 0xDC, 0x4D, 0xB3, 0xF9, /* 0x84-0x87 */ + 0xDC, 0x4E, 0xDC, 0x4F, 0xDC, 0x50, 0xDC, 0x51, /* 0x88-0x8B */ + 0xDC, 0x52, 0xDC, 0x53, 0xDC, 0x54, 0xF5, 0xEF, /* 0x8C-0x8F */ + 0xF5, 0xF1, 0xDC, 0x55, 0xDC, 0x56, 0xDC, 0x57, /* 0x90-0x93 */ + 0xF5, 0xF0, 0xDC, 0x58, 0xDC, 0x59, 0xDC, 0x5A, /* 0x94-0x97 */ + 0xDC, 0x5B, 0xDC, 0x5C, 0xDC, 0x5D, 0xDC, 0x5E, /* 0x98-0x9B */ + 0xF5, 0xF2, 0xDC, 0x5F, 0xF5, 0xF3, 0xDC, 0x60, /* 0x9C-0x9F */ + 0xDC, 0x61, 0xDC, 0x62, 0xDC, 0x63, 0xDC, 0x64, /* 0xA0-0xA3 */ + 0xDC, 0x65, 0xDC, 0x66, 0xDC, 0x67, 0xDC, 0x68, /* 0xA4-0xA7 */ + 0xDC, 0x69, 0xDC, 0x6A, 0xDC, 0x6B, 0xC9, 0xED, /* 0xA8-0xAB */ + 0xB9, 0xAA, 0xDC, 0x6C, 0xDC, 0x6D, 0xC7, 0xFB, /* 0xAC-0xAF */ + 0xDC, 0x6E, 0xDC, 0x6F, 0xB6, 0xE3, 0xDC, 0x70, /* 0xB0-0xB3 */ + 0xDC, 0x71, 0xDC, 0x72, 0xDC, 0x73, 0xDC, 0x74, /* 0xB4-0xB7 */ + 0xDC, 0x75, 0xDC, 0x76, 0xCC, 0xC9, 0xDC, 0x77, /* 0xB8-0xBB */ + 0xDC, 0x78, 0xDC, 0x79, 0xDC, 0x7A, 0xDC, 0x7B, /* 0xBC-0xBF */ + 0xDC, 0x7C, 0xDC, 0x7D, 0xDC, 0x7E, 0xDC, 0x80, /* 0xC0-0xC3 */ + 0xDC, 0x81, 0xDC, 0x82, 0xDC, 0x83, 0xDC, 0x84, /* 0xC4-0xC7 */ + 0xDC, 0x85, 0xDC, 0x86, 0xDC, 0x87, 0xDC, 0x88, /* 0xC8-0xCB */ + 0xDC, 0x89, 0xDC, 0x8A, 0xEA, 0xA6, 0xDC, 0x8B, /* 0xCC-0xCF */ + 0xDC, 0x8C, 0xDC, 0x8D, 0xDC, 0x8E, 0xDC, 0x8F, /* 0xD0-0xD3 */ + 0xDC, 0x90, 0xDC, 0x91, 0xDC, 0x92, 0xDC, 0x93, /* 0xD4-0xD7 */ + 0xDC, 0x94, 0xDC, 0x95, 0xDC, 0x96, 0xDC, 0x97, /* 0xD8-0xDB */ + 0xDC, 0x98, 0xDC, 0x99, 0xDC, 0x9A, 0xDC, 0x9B, /* 0xDC-0xDF */ + 0xDC, 0x9C, 0xDC, 0x9D, 0xDC, 0x9E, 0xDC, 0x9F, /* 0xE0-0xE3 */ + 0xDC, 0xA0, 0xDD, 0x40, 0xDD, 0x41, 0xDD, 0x42, /* 0xE4-0xE7 */ + 0xDD, 0x43, 0xDD, 0x44, 0xDD, 0x45, 0xDD, 0x46, /* 0xE8-0xEB */ + 0xDD, 0x47, 0xDD, 0x48, 0xDD, 0x49, 0xDD, 0x4A, /* 0xEC-0xEF */ + 0xDD, 0x4B, 0xDD, 0x4C, 0xDD, 0x4D, 0xDD, 0x4E, /* 0xF0-0xF3 */ + 0xDD, 0x4F, 0xDD, 0x50, 0xDD, 0x51, 0xDD, 0x52, /* 0xF4-0xF7 */ + 0xDD, 0x53, 0xDD, 0x54, 0xDD, 0x55, 0xDD, 0x56, /* 0xF8-0xFB */ + 0xDD, 0x57, 0xDD, 0x58, 0xDD, 0x59, 0xDD, 0x5A, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8F[512] = { + 0xDD, 0x5B, 0xDD, 0x5C, 0xDD, 0x5D, 0xDD, 0x5E, /* 0x00-0x03 */ + 0xDD, 0x5F, 0xDD, 0x60, 0xDD, 0x61, 0xDD, 0x62, /* 0x04-0x07 */ + 0xDD, 0x63, 0xDD, 0x64, 0xDD, 0x65, 0xDD, 0x66, /* 0x08-0x0B */ + 0xDD, 0x67, 0xDD, 0x68, 0xDD, 0x69, 0xDD, 0x6A, /* 0x0C-0x0F */ + 0xDD, 0x6B, 0xDD, 0x6C, 0xDD, 0x6D, 0xDD, 0x6E, /* 0x10-0x13 */ + 0xDD, 0x6F, 0xDD, 0x70, 0xDD, 0x71, 0xDD, 0x72, /* 0x14-0x17 */ + 0xDD, 0x73, 0xDD, 0x74, 0xDD, 0x75, 0xDD, 0x76, /* 0x18-0x1B */ + 0xDD, 0x77, 0xDD, 0x78, 0xDD, 0x79, 0xDD, 0x7A, /* 0x1C-0x1F */ + 0xDD, 0x7B, 0xDD, 0x7C, 0xDD, 0x7D, 0xDD, 0x7E, /* 0x20-0x23 */ + 0xDD, 0x80, 0xDD, 0x81, 0xDD, 0x82, 0xDD, 0x83, /* 0x24-0x27 */ + 0xDD, 0x84, 0xDD, 0x85, 0xDD, 0x86, 0xDD, 0x87, /* 0x28-0x2B */ + 0xDD, 0x88, 0xDD, 0x89, 0xDD, 0x8A, 0xDD, 0x8B, /* 0x2C-0x2F */ + 0xDD, 0x8C, 0xDD, 0x8D, 0xDD, 0x8E, 0xDD, 0x8F, /* 0x30-0x33 */ + 0xDD, 0x90, 0xDD, 0x91, 0xDD, 0x92, 0xDD, 0x93, /* 0x34-0x37 */ + 0xDD, 0x94, 0xDD, 0x95, 0xDD, 0x96, 0xDD, 0x97, /* 0x38-0x3B */ + 0xDD, 0x98, 0xDD, 0x99, 0xDD, 0x9A, 0xDD, 0x9B, /* 0x3C-0x3F */ + 0xDD, 0x9C, 0xDD, 0x9D, 0xDD, 0x9E, 0xDD, 0x9F, /* 0x40-0x43 */ + 0xDD, 0xA0, 0xDE, 0x40, 0xDE, 0x41, 0xDE, 0x42, /* 0x44-0x47 */ + 0xDE, 0x43, 0xDE, 0x44, 0xDE, 0x45, 0xDE, 0x46, /* 0x48-0x4B */ + 0xDE, 0x47, 0xDE, 0x48, 0xDE, 0x49, 0xDE, 0x4A, /* 0x4C-0x4F */ + 0xDE, 0x4B, 0xDE, 0x4C, 0xDE, 0x4D, 0xDE, 0x4E, /* 0x50-0x53 */ + 0xDE, 0x4F, 0xDE, 0x50, 0xDE, 0x51, 0xDE, 0x52, /* 0x54-0x57 */ + 0xDE, 0x53, 0xDE, 0x54, 0xDE, 0x55, 0xDE, 0x56, /* 0x58-0x5B */ + 0xDE, 0x57, 0xDE, 0x58, 0xDE, 0x59, 0xDE, 0x5A, /* 0x5C-0x5F */ + 0xDE, 0x5B, 0xDE, 0x5C, 0xDE, 0x5D, 0xDE, 0x5E, /* 0x60-0x63 */ + 0xDE, 0x5F, 0xDE, 0x60, 0xB3, 0xB5, 0xD4, 0xFE, /* 0x64-0x67 */ + 0xB9, 0xEC, 0xD0, 0xF9, 0xDE, 0x61, 0xE9, 0xED, /* 0x68-0x6B */ + 0xD7, 0xAA, 0xE9, 0xEE, 0xC2, 0xD6, 0xC8, 0xED, /* 0x6C-0x6F */ + 0xBA, 0xE4, 0xE9, 0xEF, 0xE9, 0xF0, 0xE9, 0xF1, /* 0x70-0x73 */ + 0xD6, 0xE1, 0xE9, 0xF2, 0xE9, 0xF3, 0xE9, 0xF5, /* 0x74-0x77 */ + 0xE9, 0xF4, 0xE9, 0xF6, 0xE9, 0xF7, 0xC7, 0xE1, /* 0x78-0x7B */ + 0xE9, 0xF8, 0xD4, 0xD8, 0xE9, 0xF9, 0xBD, 0xCE, /* 0x7C-0x7F */ + + 0xDE, 0x62, 0xE9, 0xFA, 0xE9, 0xFB, 0xBD, 0xCF, /* 0x80-0x83 */ + 0xE9, 0xFC, 0xB8, 0xA8, 0xC1, 0xBE, 0xE9, 0xFD, /* 0x84-0x87 */ + 0xB1, 0xB2, 0xBB, 0xD4, 0xB9, 0xF5, 0xE9, 0xFE, /* 0x88-0x8B */ + 0xDE, 0x63, 0xEA, 0xA1, 0xEA, 0xA2, 0xEA, 0xA3, /* 0x8C-0x8F */ + 0xB7, 0xF8, 0xBC, 0xAD, 0xDE, 0x64, 0xCA, 0xE4, /* 0x90-0x93 */ + 0xE0, 0xCE, 0xD4, 0xAF, 0xCF, 0xBD, 0xD5, 0xB7, /* 0x94-0x97 */ + 0xEA, 0xA4, 0xD5, 0xDE, 0xEA, 0xA5, 0xD0, 0xC1, /* 0x98-0x9B */ + 0xB9, 0xBC, 0xDE, 0x65, 0xB4, 0xC7, 0xB1, 0xD9, /* 0x9C-0x9F */ + 0xDE, 0x66, 0xDE, 0x67, 0xDE, 0x68, 0xC0, 0xB1, /* 0xA0-0xA3 */ + 0xDE, 0x69, 0xDE, 0x6A, 0xDE, 0x6B, 0xDE, 0x6C, /* 0xA4-0xA7 */ + 0xB1, 0xE6, 0xB1, 0xE7, 0xDE, 0x6D, 0xB1, 0xE8, /* 0xA8-0xAB */ + 0xDE, 0x6E, 0xDE, 0x6F, 0xDE, 0x70, 0xDE, 0x71, /* 0xAC-0xAF */ + 0xB3, 0xBD, 0xC8, 0xE8, 0xDE, 0x72, 0xDE, 0x73, /* 0xB0-0xB3 */ + 0xDE, 0x74, 0xDE, 0x75, 0xE5, 0xC1, 0xDE, 0x76, /* 0xB4-0xB7 */ + 0xDE, 0x77, 0xB1, 0xDF, 0xDE, 0x78, 0xDE, 0x79, /* 0xB8-0xBB */ + 0xDE, 0x7A, 0xC1, 0xC9, 0xB4, 0xEF, 0xDE, 0x7B, /* 0xBC-0xBF */ + 0xDE, 0x7C, 0xC7, 0xA8, 0xD3, 0xD8, 0xDE, 0x7D, /* 0xC0-0xC3 */ + 0xC6, 0xF9, 0xD1, 0xB8, 0xDE, 0x7E, 0xB9, 0xFD, /* 0xC4-0xC7 */ + 0xC2, 0xF5, 0xDE, 0x80, 0xDE, 0x81, 0xDE, 0x82, /* 0xC8-0xCB */ + 0xDE, 0x83, 0xDE, 0x84, 0xD3, 0xAD, 0xDE, 0x85, /* 0xCC-0xCF */ + 0xD4, 0xCB, 0xBD, 0xFC, 0xDE, 0x86, 0xE5, 0xC2, /* 0xD0-0xD3 */ + 0xB7, 0xB5, 0xE5, 0xC3, 0xDE, 0x87, 0xDE, 0x88, /* 0xD4-0xD7 */ + 0xBB, 0xB9, 0xD5, 0xE2, 0xDE, 0x89, 0xBD, 0xF8, /* 0xD8-0xDB */ + 0xD4, 0xB6, 0xCE, 0xA5, 0xC1, 0xAC, 0xB3, 0xD9, /* 0xDC-0xDF */ + 0xDE, 0x8A, 0xDE, 0x8B, 0xCC, 0xF6, 0xDE, 0x8C, /* 0xE0-0xE3 */ + 0xE5, 0xC6, 0xE5, 0xC4, 0xE5, 0xC8, 0xDE, 0x8D, /* 0xE4-0xE7 */ + 0xE5, 0xCA, 0xE5, 0xC7, 0xB5, 0xCF, 0xC6, 0xC8, /* 0xE8-0xEB */ + 0xDE, 0x8E, 0xB5, 0xFC, 0xE5, 0xC5, 0xDE, 0x8F, /* 0xEC-0xEF */ + 0xCA, 0xF6, 0xDE, 0x90, 0xDE, 0x91, 0xE5, 0xC9, /* 0xF0-0xF3 */ + 0xDE, 0x92, 0xDE, 0x93, 0xDE, 0x94, 0xC3, 0xD4, /* 0xF4-0xF7 */ + 0xB1, 0xC5, 0xBC, 0xA3, 0xDE, 0x95, 0xDE, 0x96, /* 0xF8-0xFB */ + 0xDE, 0x97, 0xD7, 0xB7, 0xDE, 0x98, 0xDE, 0x99, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_90[512] = { + 0xCD, 0xCB, 0xCB, 0xCD, 0xCA, 0xCA, 0xCC, 0xD3, /* 0x00-0x03 */ + 0xE5, 0xCC, 0xE5, 0xCB, 0xC4, 0xE6, 0xDE, 0x9A, /* 0x04-0x07 */ + 0xDE, 0x9B, 0xD1, 0xA1, 0xD1, 0xB7, 0xE5, 0xCD, /* 0x08-0x0B */ + 0xDE, 0x9C, 0xE5, 0xD0, 0xDE, 0x9D, 0xCD, 0xB8, /* 0x0C-0x0F */ + 0xD6, 0xF0, 0xE5, 0xCF, 0xB5, 0xDD, 0xDE, 0x9E, /* 0x10-0x13 */ + 0xCD, 0xBE, 0xDE, 0x9F, 0xE5, 0xD1, 0xB6, 0xBA, /* 0x14-0x17 */ + 0xDE, 0xA0, 0xDF, 0x40, 0xCD, 0xA8, 0xB9, 0xE4, /* 0x18-0x1B */ + 0xDF, 0x41, 0xCA, 0xC5, 0xB3, 0xD1, 0xCB, 0xD9, /* 0x1C-0x1F */ + 0xD4, 0xEC, 0xE5, 0xD2, 0xB7, 0xEA, 0xDF, 0x42, /* 0x20-0x23 */ + 0xDF, 0x43, 0xDF, 0x44, 0xE5, 0xCE, 0xDF, 0x45, /* 0x24-0x27 */ + 0xDF, 0x46, 0xDF, 0x47, 0xDF, 0x48, 0xDF, 0x49, /* 0x28-0x2B */ + 0xDF, 0x4A, 0xE5, 0xD5, 0xB4, 0xFE, 0xE5, 0xD6, /* 0x2C-0x2F */ + 0xDF, 0x4B, 0xDF, 0x4C, 0xDF, 0x4D, 0xDF, 0x4E, /* 0x30-0x33 */ + 0xDF, 0x4F, 0xE5, 0xD3, 0xE5, 0xD4, 0xDF, 0x50, /* 0x34-0x37 */ + 0xD2, 0xDD, 0xDF, 0x51, 0xDF, 0x52, 0xC2, 0xDF, /* 0x38-0x3B */ + 0xB1, 0xC6, 0xDF, 0x53, 0xD3, 0xE2, 0xDF, 0x54, /* 0x3C-0x3F */ + 0xDF, 0x55, 0xB6, 0xDD, 0xCB, 0xEC, 0xDF, 0x56, /* 0x40-0x43 */ + 0xE5, 0xD7, 0xDF, 0x57, 0xDF, 0x58, 0xD3, 0xF6, /* 0x44-0x47 */ + 0xDF, 0x59, 0xDF, 0x5A, 0xDF, 0x5B, 0xDF, 0x5C, /* 0x48-0x4B */ + 0xDF, 0x5D, 0xB1, 0xE9, 0xDF, 0x5E, 0xB6, 0xF4, /* 0x4C-0x4F */ + 0xE5, 0xDA, 0xE5, 0xD8, 0xE5, 0xD9, 0xB5, 0xC0, /* 0x50-0x53 */ + 0xDF, 0x5F, 0xDF, 0x60, 0xDF, 0x61, 0xD2, 0xC5, /* 0x54-0x57 */ + 0xE5, 0xDC, 0xDF, 0x62, 0xDF, 0x63, 0xE5, 0xDE, /* 0x58-0x5B */ + 0xDF, 0x64, 0xDF, 0x65, 0xDF, 0x66, 0xDF, 0x67, /* 0x5C-0x5F */ + 0xDF, 0x68, 0xDF, 0x69, 0xE5, 0xDD, 0xC7, 0xB2, /* 0x60-0x63 */ + 0xDF, 0x6A, 0xD2, 0xA3, 0xDF, 0x6B, 0xDF, 0x6C, /* 0x64-0x67 */ + 0xE5, 0xDB, 0xDF, 0x6D, 0xDF, 0x6E, 0xDF, 0x6F, /* 0x68-0x6B */ + 0xDF, 0x70, 0xD4, 0xE2, 0xD5, 0xDA, 0xDF, 0x71, /* 0x6C-0x6F */ + 0xDF, 0x72, 0xDF, 0x73, 0xDF, 0x74, 0xDF, 0x75, /* 0x70-0x73 */ + 0xE5, 0xE0, 0xD7, 0xF1, 0xDF, 0x76, 0xDF, 0x77, /* 0x74-0x77 */ + 0xDF, 0x78, 0xDF, 0x79, 0xDF, 0x7A, 0xDF, 0x7B, /* 0x78-0x7B */ + 0xDF, 0x7C, 0xE5, 0xE1, 0xDF, 0x7D, 0xB1, 0xDC, /* 0x7C-0x7F */ + + 0xD1, 0xFB, 0xDF, 0x7E, 0xE5, 0xE2, 0xE5, 0xE4, /* 0x80-0x83 */ + 0xDF, 0x80, 0xDF, 0x81, 0xDF, 0x82, 0xDF, 0x83, /* 0x84-0x87 */ + 0xE5, 0xE3, 0xDF, 0x84, 0xDF, 0x85, 0xE5, 0xE5, /* 0x88-0x8B */ + 0xDF, 0x86, 0xDF, 0x87, 0xDF, 0x88, 0xDF, 0x89, /* 0x8C-0x8F */ + 0xDF, 0x8A, 0xD2, 0xD8, 0xDF, 0x8B, 0xB5, 0xCB, /* 0x90-0x93 */ + 0xDF, 0x8C, 0xE7, 0xDF, 0xDF, 0x8D, 0xDA, 0xF5, /* 0x94-0x97 */ + 0xDF, 0x8E, 0xDA, 0xF8, 0xDF, 0x8F, 0xDA, 0xF6, /* 0x98-0x9B */ + 0xDF, 0x90, 0xDA, 0xF7, 0xDF, 0x91, 0xDF, 0x92, /* 0x9C-0x9F */ + 0xDF, 0x93, 0xDA, 0xFA, 0xD0, 0xCF, 0xC4, 0xC7, /* 0xA0-0xA3 */ + 0xDF, 0x94, 0xDF, 0x95, 0xB0, 0xEE, 0xDF, 0x96, /* 0xA4-0xA7 */ + 0xDF, 0x97, 0xDF, 0x98, 0xD0, 0xB0, 0xDF, 0x99, /* 0xA8-0xAB */ + 0xDA, 0xF9, 0xDF, 0x9A, 0xD3, 0xCA, 0xBA, 0xAA, /* 0xAC-0xAF */ + 0xDB, 0xA2, 0xC7, 0xF1, 0xDF, 0x9B, 0xDA, 0xFC, /* 0xB0-0xB3 */ + 0xDA, 0xFB, 0xC9, 0xDB, 0xDA, 0xFD, 0xDF, 0x9C, /* 0xB4-0xB7 */ + 0xDB, 0xA1, 0xD7, 0xDE, 0xDA, 0xFE, 0xC1, 0xDA, /* 0xB8-0xBB */ + 0xDF, 0x9D, 0xDF, 0x9E, 0xDB, 0xA5, 0xDF, 0x9F, /* 0xBC-0xBF */ + 0xDF, 0xA0, 0xD3, 0xF4, 0xE0, 0x40, 0xE0, 0x41, /* 0xC0-0xC3 */ + 0xDB, 0xA7, 0xDB, 0xA4, 0xE0, 0x42, 0xDB, 0xA8, /* 0xC4-0xC7 */ + 0xE0, 0x43, 0xE0, 0x44, 0xBD, 0xBC, 0xE0, 0x45, /* 0xC8-0xCB */ + 0xE0, 0x46, 0xE0, 0x47, 0xC0, 0xC9, 0xDB, 0xA3, /* 0xCC-0xCF */ + 0xDB, 0xA6, 0xD6, 0xA3, 0xE0, 0x48, 0xDB, 0xA9, /* 0xD0-0xD3 */ + 0xE0, 0x49, 0xE0, 0x4A, 0xE0, 0x4B, 0xDB, 0xAD, /* 0xD4-0xD7 */ + 0xE0, 0x4C, 0xE0, 0x4D, 0xE0, 0x4E, 0xDB, 0xAE, /* 0xD8-0xDB */ + 0xDB, 0xAC, 0xBA, 0xC2, 0xE0, 0x4F, 0xE0, 0x50, /* 0xDC-0xDF */ + 0xE0, 0x51, 0xBF, 0xA4, 0xDB, 0xAB, 0xE0, 0x52, /* 0xE0-0xE3 */ + 0xE0, 0x53, 0xE0, 0x54, 0xDB, 0xAA, 0xD4, 0xC7, /* 0xE4-0xE7 */ + 0xB2, 0xBF, 0xE0, 0x55, 0xE0, 0x56, 0xDB, 0xAF, /* 0xE8-0xEB */ + 0xE0, 0x57, 0xB9, 0xF9, 0xE0, 0x58, 0xDB, 0xB0, /* 0xEC-0xEF */ + 0xE0, 0x59, 0xE0, 0x5A, 0xE0, 0x5B, 0xE0, 0x5C, /* 0xF0-0xF3 */ + 0xB3, 0xBB, 0xE0, 0x5D, 0xE0, 0x5E, 0xE0, 0x5F, /* 0xF4-0xF7 */ + 0xB5, 0xA6, 0xE0, 0x60, 0xE0, 0x61, 0xE0, 0x62, /* 0xF8-0xFB */ + 0xE0, 0x63, 0xB6, 0xBC, 0xDB, 0xB1, 0xE0, 0x64, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_91[512] = { + 0xE0, 0x65, 0xE0, 0x66, 0xB6, 0xF5, 0xE0, 0x67, /* 0x00-0x03 */ + 0xDB, 0xB2, 0xE0, 0x68, 0xE0, 0x69, 0xE0, 0x6A, /* 0x04-0x07 */ + 0xE0, 0x6B, 0xE0, 0x6C, 0xE0, 0x6D, 0xE0, 0x6E, /* 0x08-0x0B */ + 0xE0, 0x6F, 0xE0, 0x70, 0xE0, 0x71, 0xE0, 0x72, /* 0x0C-0x0F */ + 0xE0, 0x73, 0xE0, 0x74, 0xE0, 0x75, 0xE0, 0x76, /* 0x10-0x13 */ + 0xE0, 0x77, 0xE0, 0x78, 0xE0, 0x79, 0xE0, 0x7A, /* 0x14-0x17 */ + 0xE0, 0x7B, 0xB1, 0xC9, 0xE0, 0x7C, 0xE0, 0x7D, /* 0x18-0x1B */ + 0xE0, 0x7E, 0xE0, 0x80, 0xDB, 0xB4, 0xE0, 0x81, /* 0x1C-0x1F */ + 0xE0, 0x82, 0xE0, 0x83, 0xDB, 0xB3, 0xDB, 0xB5, /* 0x20-0x23 */ + 0xE0, 0x84, 0xE0, 0x85, 0xE0, 0x86, 0xE0, 0x87, /* 0x24-0x27 */ + 0xE0, 0x88, 0xE0, 0x89, 0xE0, 0x8A, 0xE0, 0x8B, /* 0x28-0x2B */ + 0xE0, 0x8C, 0xE0, 0x8D, 0xE0, 0x8E, 0xDB, 0xB7, /* 0x2C-0x2F */ + 0xE0, 0x8F, 0xDB, 0xB6, 0xE0, 0x90, 0xE0, 0x91, /* 0x30-0x33 */ + 0xE0, 0x92, 0xE0, 0x93, 0xE0, 0x94, 0xE0, 0x95, /* 0x34-0x37 */ + 0xE0, 0x96, 0xDB, 0xB8, 0xE0, 0x97, 0xE0, 0x98, /* 0x38-0x3B */ + 0xE0, 0x99, 0xE0, 0x9A, 0xE0, 0x9B, 0xE0, 0x9C, /* 0x3C-0x3F */ + 0xE0, 0x9D, 0xE0, 0x9E, 0xE0, 0x9F, 0xDB, 0xB9, /* 0x40-0x43 */ + 0xE0, 0xA0, 0xE1, 0x40, 0xDB, 0xBA, 0xE1, 0x41, /* 0x44-0x47 */ + 0xE1, 0x42, 0xD3, 0xCF, 0xF4, 0xFA, 0xC7, 0xF5, /* 0x48-0x4B */ + 0xD7, 0xC3, 0xC5, 0xE4, 0xF4, 0xFC, 0xF4, 0xFD, /* 0x4C-0x4F */ + 0xF4, 0xFB, 0xE1, 0x43, 0xBE, 0xC6, 0xE1, 0x44, /* 0x50-0x53 */ + 0xE1, 0x45, 0xE1, 0x46, 0xE1, 0x47, 0xD0, 0xEF, /* 0x54-0x57 */ + 0xE1, 0x48, 0xE1, 0x49, 0xB7, 0xD3, 0xE1, 0x4A, /* 0x58-0x5B */ + 0xE1, 0x4B, 0xD4, 0xCD, 0xCC, 0xAA, 0xE1, 0x4C, /* 0x5C-0x5F */ + 0xE1, 0x4D, 0xF5, 0xA2, 0xF5, 0xA1, 0xBA, 0xA8, /* 0x60-0x63 */ + 0xF4, 0xFE, 0xCB, 0xD6, 0xE1, 0x4E, 0xE1, 0x4F, /* 0x64-0x67 */ + 0xE1, 0x50, 0xF5, 0xA4, 0xC0, 0xD2, 0xE1, 0x51, /* 0x68-0x6B */ + 0xB3, 0xEA, 0xE1, 0x52, 0xCD, 0xAA, 0xF5, 0xA5, /* 0x6C-0x6F */ + 0xF5, 0xA3, 0xBD, 0xB4, 0xF5, 0xA8, 0xE1, 0x53, /* 0x70-0x73 */ + 0xF5, 0xA9, 0xBD, 0xCD, 0xC3, 0xB8, 0xBF, 0xE1, /* 0x74-0x77 */ + 0xCB, 0xE1, 0xF5, 0xAA, 0xE1, 0x54, 0xE1, 0x55, /* 0x78-0x7B */ + 0xE1, 0x56, 0xF5, 0xA6, 0xF5, 0xA7, 0xC4, 0xF0, /* 0x7C-0x7F */ + + 0xE1, 0x57, 0xE1, 0x58, 0xE1, 0x59, 0xE1, 0x5A, /* 0x80-0x83 */ + 0xE1, 0x5B, 0xF5, 0xAC, 0xE1, 0x5C, 0xB4, 0xBC, /* 0x84-0x87 */ + 0xE1, 0x5D, 0xD7, 0xED, 0xE1, 0x5E, 0xB4, 0xD7, /* 0x88-0x8B */ + 0xF5, 0xAB, 0xF5, 0xAE, 0xE1, 0x5F, 0xE1, 0x60, /* 0x8C-0x8F */ + 0xF5, 0xAD, 0xF5, 0xAF, 0xD0, 0xD1, 0xE1, 0x61, /* 0x90-0x93 */ + 0xE1, 0x62, 0xE1, 0x63, 0xE1, 0x64, 0xE1, 0x65, /* 0x94-0x97 */ + 0xE1, 0x66, 0xE1, 0x67, 0xC3, 0xD1, 0xC8, 0xA9, /* 0x98-0x9B */ + 0xE1, 0x68, 0xE1, 0x69, 0xE1, 0x6A, 0xE1, 0x6B, /* 0x9C-0x9F */ + 0xE1, 0x6C, 0xE1, 0x6D, 0xF5, 0xB0, 0xF5, 0xB1, /* 0xA0-0xA3 */ + 0xE1, 0x6E, 0xE1, 0x6F, 0xE1, 0x70, 0xE1, 0x71, /* 0xA4-0xA7 */ + 0xE1, 0x72, 0xE1, 0x73, 0xF5, 0xB2, 0xE1, 0x74, /* 0xA8-0xAB */ + 0xE1, 0x75, 0xF5, 0xB3, 0xF5, 0xB4, 0xF5, 0xB5, /* 0xAC-0xAF */ + 0xE1, 0x76, 0xE1, 0x77, 0xE1, 0x78, 0xE1, 0x79, /* 0xB0-0xB3 */ + 0xF5, 0xB7, 0xF5, 0xB6, 0xE1, 0x7A, 0xE1, 0x7B, /* 0xB4-0xB7 */ + 0xE1, 0x7C, 0xE1, 0x7D, 0xF5, 0xB8, 0xE1, 0x7E, /* 0xB8-0xBB */ + 0xE1, 0x80, 0xE1, 0x81, 0xE1, 0x82, 0xE1, 0x83, /* 0xBC-0xBF */ + 0xE1, 0x84, 0xE1, 0x85, 0xE1, 0x86, 0xE1, 0x87, /* 0xC0-0xC3 */ + 0xE1, 0x88, 0xE1, 0x89, 0xE1, 0x8A, 0xB2, 0xC9, /* 0xC4-0xC7 */ + 0xE1, 0x8B, 0xD3, 0xD4, 0xCA, 0xCD, 0xE1, 0x8C, /* 0xC8-0xCB */ + 0xC0, 0xEF, 0xD6, 0xD8, 0xD2, 0xB0, 0xC1, 0xBF, /* 0xCC-0xCF */ + 0xE1, 0x8D, 0xBD, 0xF0, 0xE1, 0x8E, 0xE1, 0x8F, /* 0xD0-0xD3 */ + 0xE1, 0x90, 0xE1, 0x91, 0xE1, 0x92, 0xE1, 0x93, /* 0xD4-0xD7 */ + 0xE1, 0x94, 0xE1, 0x95, 0xE1, 0x96, 0xE1, 0x97, /* 0xD8-0xDB */ + 0xB8, 0xAA, 0xE1, 0x98, 0xE1, 0x99, 0xE1, 0x9A, /* 0xDC-0xDF */ + 0xE1, 0x9B, 0xE1, 0x9C, 0xE1, 0x9D, 0xE1, 0x9E, /* 0xE0-0xE3 */ + 0xE1, 0x9F, 0xE1, 0xA0, 0xE2, 0x40, 0xE2, 0x41, /* 0xE4-0xE7 */ + 0xE2, 0x42, 0xE2, 0x43, 0xE2, 0x44, 0xE2, 0x45, /* 0xE8-0xEB */ + 0xE2, 0x46, 0xE2, 0x47, 0xE2, 0x48, 0xE2, 0x49, /* 0xEC-0xEF */ + 0xE2, 0x4A, 0xE2, 0x4B, 0xE2, 0x4C, 0xE2, 0x4D, /* 0xF0-0xF3 */ + 0xE2, 0x4E, 0xE2, 0x4F, 0xE2, 0x50, 0xE2, 0x51, /* 0xF4-0xF7 */ + 0xE2, 0x52, 0xE2, 0x53, 0xE2, 0x54, 0xE2, 0x55, /* 0xF8-0xFB */ + 0xE2, 0x56, 0xE2, 0x57, 0xE2, 0x58, 0xE2, 0x59, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_92[512] = { + 0xE2, 0x5A, 0xE2, 0x5B, 0xE2, 0x5C, 0xE2, 0x5D, /* 0x00-0x03 */ + 0xE2, 0x5E, 0xE2, 0x5F, 0xE2, 0x60, 0xE2, 0x61, /* 0x04-0x07 */ + 0xE2, 0x62, 0xE2, 0x63, 0xE2, 0x64, 0xE2, 0x65, /* 0x08-0x0B */ + 0xE2, 0x66, 0xE2, 0x67, 0xE2, 0x68, 0xE2, 0x69, /* 0x0C-0x0F */ + 0xE2, 0x6A, 0xE2, 0x6B, 0xE2, 0x6C, 0xE2, 0x6D, /* 0x10-0x13 */ + 0xE2, 0x6E, 0xE2, 0x6F, 0xE2, 0x70, 0xE2, 0x71, /* 0x14-0x17 */ + 0xE2, 0x72, 0xE2, 0x73, 0xE2, 0x74, 0xE2, 0x75, /* 0x18-0x1B */ + 0xE2, 0x76, 0xE2, 0x77, 0xE2, 0x78, 0xE2, 0x79, /* 0x1C-0x1F */ + 0xE2, 0x7A, 0xE2, 0x7B, 0xE2, 0x7C, 0xE2, 0x7D, /* 0x20-0x23 */ + 0xE2, 0x7E, 0xE2, 0x80, 0xE2, 0x81, 0xE2, 0x82, /* 0x24-0x27 */ + 0xE2, 0x83, 0xE2, 0x84, 0xE2, 0x85, 0xE2, 0x86, /* 0x28-0x2B */ + 0xE2, 0x87, 0xE2, 0x88, 0xE2, 0x89, 0xE2, 0x8A, /* 0x2C-0x2F */ + 0xE2, 0x8B, 0xE2, 0x8C, 0xE2, 0x8D, 0xE2, 0x8E, /* 0x30-0x33 */ + 0xE2, 0x8F, 0xE2, 0x90, 0xE2, 0x91, 0xE2, 0x92, /* 0x34-0x37 */ + 0xE2, 0x93, 0xE2, 0x94, 0xE2, 0x95, 0xE2, 0x96, /* 0x38-0x3B */ + 0xE2, 0x97, 0xE2, 0x98, 0xE2, 0x99, 0xE2, 0x9A, /* 0x3C-0x3F */ + 0xE2, 0x9B, 0xE2, 0x9C, 0xE2, 0x9D, 0xE2, 0x9E, /* 0x40-0x43 */ + 0xE2, 0x9F, 0xE2, 0xA0, 0xE3, 0x40, 0xE3, 0x41, /* 0x44-0x47 */ + 0xE3, 0x42, 0xE3, 0x43, 0xE3, 0x44, 0xE3, 0x45, /* 0x48-0x4B */ + 0xE3, 0x46, 0xE3, 0x47, 0xE3, 0x48, 0xE3, 0x49, /* 0x4C-0x4F */ + 0xE3, 0x4A, 0xE3, 0x4B, 0xE3, 0x4C, 0xE3, 0x4D, /* 0x50-0x53 */ + 0xE3, 0x4E, 0xE3, 0x4F, 0xE3, 0x50, 0xE3, 0x51, /* 0x54-0x57 */ + 0xE3, 0x52, 0xE3, 0x53, 0xE3, 0x54, 0xE3, 0x55, /* 0x58-0x5B */ + 0xE3, 0x56, 0xE3, 0x57, 0xE3, 0x58, 0xE3, 0x59, /* 0x5C-0x5F */ + 0xE3, 0x5A, 0xE3, 0x5B, 0xE3, 0x5C, 0xE3, 0x5D, /* 0x60-0x63 */ + 0xE3, 0x5E, 0xE3, 0x5F, 0xE3, 0x60, 0xE3, 0x61, /* 0x64-0x67 */ + 0xE3, 0x62, 0xE3, 0x63, 0xE3, 0x64, 0xE3, 0x65, /* 0x68-0x6B */ + 0xE3, 0x66, 0xE3, 0x67, 0xE3, 0x68, 0xE3, 0x69, /* 0x6C-0x6F */ + 0xE3, 0x6A, 0xE3, 0x6B, 0xE3, 0x6C, 0xE3, 0x6D, /* 0x70-0x73 */ + 0xBC, 0xF8, 0xE3, 0x6E, 0xE3, 0x6F, 0xE3, 0x70, /* 0x74-0x77 */ + 0xE3, 0x71, 0xE3, 0x72, 0xE3, 0x73, 0xE3, 0x74, /* 0x78-0x7B */ + 0xE3, 0x75, 0xE3, 0x76, 0xE3, 0x77, 0xE3, 0x78, /* 0x7C-0x7F */ + + 0xE3, 0x79, 0xE3, 0x7A, 0xE3, 0x7B, 0xE3, 0x7C, /* 0x80-0x83 */ + 0xE3, 0x7D, 0xE3, 0x7E, 0xE3, 0x80, 0xE3, 0x81, /* 0x84-0x87 */ + 0xE3, 0x82, 0xE3, 0x83, 0xE3, 0x84, 0xE3, 0x85, /* 0x88-0x8B */ + 0xE3, 0x86, 0xE3, 0x87, 0xF6, 0xC6, 0xE3, 0x88, /* 0x8C-0x8F */ + 0xE3, 0x89, 0xE3, 0x8A, 0xE3, 0x8B, 0xE3, 0x8C, /* 0x90-0x93 */ + 0xE3, 0x8D, 0xE3, 0x8E, 0xE3, 0x8F, 0xE3, 0x90, /* 0x94-0x97 */ + 0xE3, 0x91, 0xE3, 0x92, 0xE3, 0x93, 0xE3, 0x94, /* 0x98-0x9B */ + 0xE3, 0x95, 0xE3, 0x96, 0xE3, 0x97, 0xE3, 0x98, /* 0x9C-0x9F */ + 0xE3, 0x99, 0xE3, 0x9A, 0xE3, 0x9B, 0xE3, 0x9C, /* 0xA0-0xA3 */ + 0xE3, 0x9D, 0xE3, 0x9E, 0xE3, 0x9F, 0xE3, 0xA0, /* 0xA4-0xA7 */ + 0xE4, 0x40, 0xE4, 0x41, 0xE4, 0x42, 0xE4, 0x43, /* 0xA8-0xAB */ + 0xE4, 0x44, 0xE4, 0x45, 0xF6, 0xC7, 0xE4, 0x46, /* 0xAC-0xAF */ + 0xE4, 0x47, 0xE4, 0x48, 0xE4, 0x49, 0xE4, 0x4A, /* 0xB0-0xB3 */ + 0xE4, 0x4B, 0xE4, 0x4C, 0xE4, 0x4D, 0xE4, 0x4E, /* 0xB4-0xB7 */ + 0xE4, 0x4F, 0xE4, 0x50, 0xE4, 0x51, 0xE4, 0x52, /* 0xB8-0xBB */ + 0xE4, 0x53, 0xE4, 0x54, 0xE4, 0x55, 0xE4, 0x56, /* 0xBC-0xBF */ + 0xE4, 0x57, 0xE4, 0x58, 0xE4, 0x59, 0xE4, 0x5A, /* 0xC0-0xC3 */ + 0xE4, 0x5B, 0xE4, 0x5C, 0xE4, 0x5D, 0xE4, 0x5E, /* 0xC4-0xC7 */ + 0xF6, 0xC8, 0xE4, 0x5F, 0xE4, 0x60, 0xE4, 0x61, /* 0xC8-0xCB */ + 0xE4, 0x62, 0xE4, 0x63, 0xE4, 0x64, 0xE4, 0x65, /* 0xCC-0xCF */ + 0xE4, 0x66, 0xE4, 0x67, 0xE4, 0x68, 0xE4, 0x69, /* 0xD0-0xD3 */ + 0xE4, 0x6A, 0xE4, 0x6B, 0xE4, 0x6C, 0xE4, 0x6D, /* 0xD4-0xD7 */ + 0xE4, 0x6E, 0xE4, 0x6F, 0xE4, 0x70, 0xE4, 0x71, /* 0xD8-0xDB */ + 0xE4, 0x72, 0xE4, 0x73, 0xE4, 0x74, 0xE4, 0x75, /* 0xDC-0xDF */ + 0xE4, 0x76, 0xE4, 0x77, 0xE4, 0x78, 0xE4, 0x79, /* 0xE0-0xE3 */ + 0xE4, 0x7A, 0xE4, 0x7B, 0xE4, 0x7C, 0xE4, 0x7D, /* 0xE4-0xE7 */ + 0xE4, 0x7E, 0xE4, 0x80, 0xE4, 0x81, 0xE4, 0x82, /* 0xE8-0xEB */ + 0xE4, 0x83, 0xE4, 0x84, 0xE4, 0x85, 0xE4, 0x86, /* 0xEC-0xEF */ + 0xE4, 0x87, 0xE4, 0x88, 0xE4, 0x89, 0xE4, 0x8A, /* 0xF0-0xF3 */ + 0xE4, 0x8B, 0xE4, 0x8C, 0xE4, 0x8D, 0xE4, 0x8E, /* 0xF4-0xF7 */ + 0xE4, 0x8F, 0xE4, 0x90, 0xE4, 0x91, 0xE4, 0x92, /* 0xF8-0xFB */ + 0xE4, 0x93, 0xE4, 0x94, 0xE4, 0x95, 0xE4, 0x96, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_93[512] = { + 0xE4, 0x97, 0xE4, 0x98, 0xE4, 0x99, 0xE4, 0x9A, /* 0x00-0x03 */ + 0xE4, 0x9B, 0xE4, 0x9C, 0xE4, 0x9D, 0xE4, 0x9E, /* 0x04-0x07 */ + 0xE4, 0x9F, 0xE4, 0xA0, 0xE5, 0x40, 0xE5, 0x41, /* 0x08-0x0B */ + 0xE5, 0x42, 0xE5, 0x43, 0xE5, 0x44, 0xE5, 0x45, /* 0x0C-0x0F */ + 0xE5, 0x46, 0xE5, 0x47, 0xE5, 0x48, 0xE5, 0x49, /* 0x10-0x13 */ + 0xE5, 0x4A, 0xE5, 0x4B, 0xE5, 0x4C, 0xE5, 0x4D, /* 0x14-0x17 */ + 0xE5, 0x4E, 0xE5, 0x4F, 0xE5, 0x50, 0xE5, 0x51, /* 0x18-0x1B */ + 0xE5, 0x52, 0xE5, 0x53, 0xE5, 0x54, 0xE5, 0x55, /* 0x1C-0x1F */ + 0xE5, 0x56, 0xE5, 0x57, 0xE5, 0x58, 0xE5, 0x59, /* 0x20-0x23 */ + 0xE5, 0x5A, 0xE5, 0x5B, 0xE5, 0x5C, 0xE5, 0x5D, /* 0x24-0x27 */ + 0xE5, 0x5E, 0xE5, 0x5F, 0xE5, 0x60, 0xE5, 0x61, /* 0x28-0x2B */ + 0xE5, 0x62, 0xE5, 0x63, 0xE5, 0x64, 0xE5, 0x65, /* 0x2C-0x2F */ + 0xE5, 0x66, 0xE5, 0x67, 0xE5, 0x68, 0xE5, 0x69, /* 0x30-0x33 */ + 0xE5, 0x6A, 0xE5, 0x6B, 0xE5, 0x6C, 0xE5, 0x6D, /* 0x34-0x37 */ + 0xE5, 0x6E, 0xE5, 0x6F, 0xE5, 0x70, 0xE5, 0x71, /* 0x38-0x3B */ + 0xE5, 0x72, 0xE5, 0x73, 0xF6, 0xC9, 0xE5, 0x74, /* 0x3C-0x3F */ + 0xE5, 0x75, 0xE5, 0x76, 0xE5, 0x77, 0xE5, 0x78, /* 0x40-0x43 */ + 0xE5, 0x79, 0xE5, 0x7A, 0xE5, 0x7B, 0xE5, 0x7C, /* 0x44-0x47 */ + 0xE5, 0x7D, 0xE5, 0x7E, 0xE5, 0x80, 0xE5, 0x81, /* 0x48-0x4B */ + 0xE5, 0x82, 0xE5, 0x83, 0xE5, 0x84, 0xE5, 0x85, /* 0x4C-0x4F */ + 0xE5, 0x86, 0xE5, 0x87, 0xE5, 0x88, 0xE5, 0x89, /* 0x50-0x53 */ + 0xE5, 0x8A, 0xE5, 0x8B, 0xE5, 0x8C, 0xE5, 0x8D, /* 0x54-0x57 */ + 0xE5, 0x8E, 0xE5, 0x8F, 0xE5, 0x90, 0xE5, 0x91, /* 0x58-0x5B */ + 0xE5, 0x92, 0xE5, 0x93, 0xE5, 0x94, 0xE5, 0x95, /* 0x5C-0x5F */ + 0xE5, 0x96, 0xE5, 0x97, 0xE5, 0x98, 0xE5, 0x99, /* 0x60-0x63 */ + 0xE5, 0x9A, 0xE5, 0x9B, 0xE5, 0x9C, 0xE5, 0x9D, /* 0x64-0x67 */ + 0xE5, 0x9E, 0xE5, 0x9F, 0xF6, 0xCA, 0xE5, 0xA0, /* 0x68-0x6B */ + 0xE6, 0x40, 0xE6, 0x41, 0xE6, 0x42, 0xE6, 0x43, /* 0x6C-0x6F */ + 0xE6, 0x44, 0xE6, 0x45, 0xE6, 0x46, 0xE6, 0x47, /* 0x70-0x73 */ + 0xE6, 0x48, 0xE6, 0x49, 0xE6, 0x4A, 0xE6, 0x4B, /* 0x74-0x77 */ + 0xE6, 0x4C, 0xE6, 0x4D, 0xE6, 0x4E, 0xE6, 0x4F, /* 0x78-0x7B */ + 0xE6, 0x50, 0xE6, 0x51, 0xE6, 0x52, 0xE6, 0x53, /* 0x7C-0x7F */ + + 0xE6, 0x54, 0xE6, 0x55, 0xE6, 0x56, 0xE6, 0x57, /* 0x80-0x83 */ + 0xE6, 0x58, 0xE6, 0x59, 0xE6, 0x5A, 0xE6, 0x5B, /* 0x84-0x87 */ + 0xE6, 0x5C, 0xE6, 0x5D, 0xE6, 0x5E, 0xE6, 0x5F, /* 0x88-0x8B */ + 0xE6, 0x60, 0xE6, 0x61, 0xE6, 0x62, 0xF6, 0xCC, /* 0x8C-0x8F */ + 0xE6, 0x63, 0xE6, 0x64, 0xE6, 0x65, 0xE6, 0x66, /* 0x90-0x93 */ + 0xE6, 0x67, 0xE6, 0x68, 0xE6, 0x69, 0xE6, 0x6A, /* 0x94-0x97 */ + 0xE6, 0x6B, 0xE6, 0x6C, 0xE6, 0x6D, 0xE6, 0x6E, /* 0x98-0x9B */ + 0xE6, 0x6F, 0xE6, 0x70, 0xE6, 0x71, 0xE6, 0x72, /* 0x9C-0x9F */ + 0xE6, 0x73, 0xE6, 0x74, 0xE6, 0x75, 0xE6, 0x76, /* 0xA0-0xA3 */ + 0xE6, 0x77, 0xE6, 0x78, 0xE6, 0x79, 0xE6, 0x7A, /* 0xA4-0xA7 */ + 0xE6, 0x7B, 0xE6, 0x7C, 0xE6, 0x7D, 0xE6, 0x7E, /* 0xA8-0xAB */ + 0xE6, 0x80, 0xE6, 0x81, 0xE6, 0x82, 0xE6, 0x83, /* 0xAC-0xAF */ + 0xE6, 0x84, 0xE6, 0x85, 0xE6, 0x86, 0xE6, 0x87, /* 0xB0-0xB3 */ + 0xE6, 0x88, 0xE6, 0x89, 0xE6, 0x8A, 0xE6, 0x8B, /* 0xB4-0xB7 */ + 0xE6, 0x8C, 0xE6, 0x8D, 0xE6, 0x8E, 0xE6, 0x8F, /* 0xB8-0xBB */ + 0xE6, 0x90, 0xE6, 0x91, 0xE6, 0x92, 0xE6, 0x93, /* 0xBC-0xBF */ + 0xE6, 0x94, 0xE6, 0x95, 0xE6, 0x96, 0xE6, 0x97, /* 0xC0-0xC3 */ + 0xE6, 0x98, 0xE6, 0x99, 0xE6, 0x9A, 0xE6, 0x9B, /* 0xC4-0xC7 */ + 0xE6, 0x9C, 0xE6, 0x9D, 0xF6, 0xCB, 0xE6, 0x9E, /* 0xC8-0xCB */ + 0xE6, 0x9F, 0xE6, 0xA0, 0xE7, 0x40, 0xE7, 0x41, /* 0xCC-0xCF */ + 0xE7, 0x42, 0xE7, 0x43, 0xE7, 0x44, 0xE7, 0x45, /* 0xD0-0xD3 */ + 0xE7, 0x46, 0xE7, 0x47, 0xF7, 0xE9, 0xE7, 0x48, /* 0xD4-0xD7 */ + 0xE7, 0x49, 0xE7, 0x4A, 0xE7, 0x4B, 0xE7, 0x4C, /* 0xD8-0xDB */ + 0xE7, 0x4D, 0xE7, 0x4E, 0xE7, 0x4F, 0xE7, 0x50, /* 0xDC-0xDF */ + 0xE7, 0x51, 0xE7, 0x52, 0xE7, 0x53, 0xE7, 0x54, /* 0xE0-0xE3 */ + 0xE7, 0x55, 0xE7, 0x56, 0xE7, 0x57, 0xE7, 0x58, /* 0xE4-0xE7 */ + 0xE7, 0x59, 0xE7, 0x5A, 0xE7, 0x5B, 0xE7, 0x5C, /* 0xE8-0xEB */ + 0xE7, 0x5D, 0xE7, 0x5E, 0xE7, 0x5F, 0xE7, 0x60, /* 0xEC-0xEF */ + 0xE7, 0x61, 0xE7, 0x62, 0xE7, 0x63, 0xE7, 0x64, /* 0xF0-0xF3 */ + 0xE7, 0x65, 0xE7, 0x66, 0xE7, 0x67, 0xE7, 0x68, /* 0xF4-0xF7 */ + 0xE7, 0x69, 0xE7, 0x6A, 0xE7, 0x6B, 0xE7, 0x6C, /* 0xF8-0xFB */ + 0xE7, 0x6D, 0xE7, 0x6E, 0xE7, 0x6F, 0xE7, 0x70, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_94[512] = { + 0xE7, 0x71, 0xE7, 0x72, 0xE7, 0x73, 0xE7, 0x74, /* 0x00-0x03 */ + 0xE7, 0x75, 0xE7, 0x76, 0xE7, 0x77, 0xE7, 0x78, /* 0x04-0x07 */ + 0xE7, 0x79, 0xE7, 0x7A, 0xE7, 0x7B, 0xE7, 0x7C, /* 0x08-0x0B */ + 0xE7, 0x7D, 0xE7, 0x7E, 0xE7, 0x80, 0xE7, 0x81, /* 0x0C-0x0F */ + 0xE7, 0x82, 0xE7, 0x83, 0xE7, 0x84, 0xE7, 0x85, /* 0x10-0x13 */ + 0xE7, 0x86, 0xE7, 0x87, 0xE7, 0x88, 0xE7, 0x89, /* 0x14-0x17 */ + 0xE7, 0x8A, 0xE7, 0x8B, 0xE7, 0x8C, 0xE7, 0x8D, /* 0x18-0x1B */ + 0xE7, 0x8E, 0xE7, 0x8F, 0xE7, 0x90, 0xE7, 0x91, /* 0x1C-0x1F */ + 0xE7, 0x92, 0xE7, 0x93, 0xE7, 0x94, 0xE7, 0x95, /* 0x20-0x23 */ + 0xE7, 0x96, 0xE7, 0x97, 0xE7, 0x98, 0xE7, 0x99, /* 0x24-0x27 */ + 0xE7, 0x9A, 0xE7, 0x9B, 0xE7, 0x9C, 0xE7, 0x9D, /* 0x28-0x2B */ + 0xE7, 0x9E, 0xE7, 0x9F, 0xE7, 0xA0, 0xE8, 0x40, /* 0x2C-0x2F */ + 0xE8, 0x41, 0xE8, 0x42, 0xE8, 0x43, 0xE8, 0x44, /* 0x30-0x33 */ + 0xE8, 0x45, 0xE8, 0x46, 0xE8, 0x47, 0xE8, 0x48, /* 0x34-0x37 */ + 0xE8, 0x49, 0xE8, 0x4A, 0xE8, 0x4B, 0xE8, 0x4C, /* 0x38-0x3B */ + 0xE8, 0x4D, 0xE8, 0x4E, 0xF6, 0xCD, 0xE8, 0x4F, /* 0x3C-0x3F */ + 0xE8, 0x50, 0xE8, 0x51, 0xE8, 0x52, 0xE8, 0x53, /* 0x40-0x43 */ + 0xE8, 0x54, 0xE8, 0x55, 0xE8, 0x56, 0xE8, 0x57, /* 0x44-0x47 */ + 0xE8, 0x58, 0xE8, 0x59, 0xE8, 0x5A, 0xE8, 0x5B, /* 0x48-0x4B */ + 0xE8, 0x5C, 0xE8, 0x5D, 0xE8, 0x5E, 0xE8, 0x5F, /* 0x4C-0x4F */ + 0xE8, 0x60, 0xE8, 0x61, 0xE8, 0x62, 0xE8, 0x63, /* 0x50-0x53 */ + 0xE8, 0x64, 0xE8, 0x65, 0xE8, 0x66, 0xE8, 0x67, /* 0x54-0x57 */ + 0xE8, 0x68, 0xE8, 0x69, 0xE8, 0x6A, 0xE8, 0x6B, /* 0x58-0x5B */ + 0xE8, 0x6C, 0xE8, 0x6D, 0xE8, 0x6E, 0xE8, 0x6F, /* 0x5C-0x5F */ + 0xE8, 0x70, 0xE8, 0x71, 0xE8, 0x72, 0xE8, 0x73, /* 0x60-0x63 */ + 0xE8, 0x74, 0xE8, 0x75, 0xE8, 0x76, 0xE8, 0x77, /* 0x64-0x67 */ + 0xE8, 0x78, 0xE8, 0x79, 0xE8, 0x7A, 0xF6, 0xCE, /* 0x68-0x6B */ + 0xE8, 0x7B, 0xE8, 0x7C, 0xE8, 0x7D, 0xE8, 0x7E, /* 0x6C-0x6F */ + 0xE8, 0x80, 0xE8, 0x81, 0xE8, 0x82, 0xE8, 0x83, /* 0x70-0x73 */ + 0xE8, 0x84, 0xE8, 0x85, 0xE8, 0x86, 0xE8, 0x87, /* 0x74-0x77 */ + 0xE8, 0x88, 0xE8, 0x89, 0xE8, 0x8A, 0xE8, 0x8B, /* 0x78-0x7B */ + 0xE8, 0x8C, 0xE8, 0x8D, 0xE8, 0x8E, 0xE8, 0x8F, /* 0x7C-0x7F */ + + 0xE8, 0x90, 0xE8, 0x91, 0xE8, 0x92, 0xE8, 0x93, /* 0x80-0x83 */ + 0xE8, 0x94, 0xEE, 0xC4, 0xEE, 0xC5, 0xEE, 0xC6, /* 0x84-0x87 */ + 0xD5, 0xEB, 0xB6, 0xA4, 0xEE, 0xC8, 0xEE, 0xC7, /* 0x88-0x8B */ + 0xEE, 0xC9, 0xEE, 0xCA, 0xC7, 0xA5, 0xEE, 0xCB, /* 0x8C-0x8F */ + 0xEE, 0xCC, 0xE8, 0x95, 0xB7, 0xB0, 0xB5, 0xF6, /* 0x90-0x93 */ + 0xEE, 0xCD, 0xEE, 0xCF, 0xE8, 0x96, 0xEE, 0xCE, /* 0x94-0x97 */ + 0xE8, 0x97, 0xB8, 0xC6, 0xEE, 0xD0, 0xEE, 0xD1, /* 0x98-0x9B */ + 0xEE, 0xD2, 0xB6, 0xDB, 0xB3, 0xAE, 0xD6, 0xD3, /* 0x9C-0x9F */ + 0xC4, 0xC6, 0xB1, 0xB5, 0xB8, 0xD6, 0xEE, 0xD3, /* 0xA0-0xA3 */ + 0xEE, 0xD4, 0xD4, 0xBF, 0xC7, 0xD5, 0xBE, 0xFB, /* 0xA4-0xA7 */ + 0xCE, 0xD9, 0xB9, 0xB3, 0xEE, 0xD6, 0xEE, 0xD5, /* 0xA8-0xAB */ + 0xEE, 0xD8, 0xEE, 0xD7, 0xC5, 0xA5, 0xEE, 0xD9, /* 0xAC-0xAF */ + 0xEE, 0xDA, 0xC7, 0xAE, 0xEE, 0xDB, 0xC7, 0xAF, /* 0xB0-0xB3 */ + 0xEE, 0xDC, 0xB2, 0xA7, 0xEE, 0xDD, 0xEE, 0xDE, /* 0xB4-0xB7 */ + 0xEE, 0xDF, 0xEE, 0xE0, 0xEE, 0xE1, 0xD7, 0xEA, /* 0xB8-0xBB */ + 0xEE, 0xE2, 0xEE, 0xE3, 0xBC, 0xD8, 0xEE, 0xE4, /* 0xBC-0xBF */ + 0xD3, 0xCB, 0xCC, 0xFA, 0xB2, 0xAC, 0xC1, 0xE5, /* 0xC0-0xC3 */ + 0xEE, 0xE5, 0xC7, 0xA6, 0xC3, 0xAD, 0xE8, 0x98, /* 0xC4-0xC7 */ + 0xEE, 0xE6, 0xEE, 0xE7, 0xEE, 0xE8, 0xEE, 0xE9, /* 0xC8-0xCB */ + 0xEE, 0xEA, 0xEE, 0xEB, 0xEE, 0xEC, 0xE8, 0x99, /* 0xCC-0xCF */ + 0xEE, 0xED, 0xEE, 0xEE, 0xEE, 0xEF, 0xE8, 0x9A, /* 0xD0-0xD3 */ + 0xE8, 0x9B, 0xEE, 0xF0, 0xEE, 0xF1, 0xEE, 0xF2, /* 0xD4-0xD7 */ + 0xEE, 0xF4, 0xEE, 0xF3, 0xE8, 0x9C, 0xEE, 0xF5, /* 0xD8-0xDB */ + 0xCD, 0xAD, 0xC2, 0xC1, 0xEE, 0xF6, 0xEE, 0xF7, /* 0xDC-0xDF */ + 0xEE, 0xF8, 0xD5, 0xA1, 0xEE, 0xF9, 0xCF, 0xB3, /* 0xE0-0xE3 */ + 0xEE, 0xFA, 0xEE, 0xFB, 0xE8, 0x9D, 0xEE, 0xFC, /* 0xE4-0xE7 */ + 0xEE, 0xFD, 0xEF, 0xA1, 0xEE, 0xFE, 0xEF, 0xA2, /* 0xE8-0xEB */ + 0xB8, 0xF5, 0xC3, 0xFA, 0xEF, 0xA3, 0xEF, 0xA4, /* 0xEC-0xEF */ + 0xBD, 0xC2, 0xD2, 0xBF, 0xB2, 0xF9, 0xEF, 0xA5, /* 0xF0-0xF3 */ + 0xEF, 0xA6, 0xEF, 0xA7, 0xD2, 0xF8, 0xEF, 0xA8, /* 0xF4-0xF7 */ + 0xD6, 0xFD, 0xEF, 0xA9, 0xC6, 0xCC, 0xE8, 0x9E, /* 0xF8-0xFB */ + 0xEF, 0xAA, 0xEF, 0xAB, 0xC1, 0xB4, 0xEF, 0xAC, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_95[512] = { + 0xCF, 0xFA, 0xCB, 0xF8, 0xEF, 0xAE, 0xEF, 0xAD, /* 0x00-0x03 */ + 0xB3, 0xFA, 0xB9, 0xF8, 0xEF, 0xAF, 0xEF, 0xB0, /* 0x04-0x07 */ + 0xD0, 0xE2, 0xEF, 0xB1, 0xEF, 0xB2, 0xB7, 0xE6, /* 0x08-0x0B */ + 0xD0, 0xBF, 0xEF, 0xB3, 0xEF, 0xB4, 0xEF, 0xB5, /* 0x0C-0x0F */ + 0xC8, 0xF1, 0xCC, 0xE0, 0xEF, 0xB6, 0xEF, 0xB7, /* 0x10-0x13 */ + 0xEF, 0xB8, 0xEF, 0xB9, 0xEF, 0xBA, 0xD5, 0xE0, /* 0x14-0x17 */ + 0xEF, 0xBB, 0xB4, 0xED, 0xC3, 0xAA, 0xEF, 0xBC, /* 0x18-0x1B */ + 0xE8, 0x9F, 0xEF, 0xBD, 0xEF, 0xBE, 0xEF, 0xBF, /* 0x1C-0x1F */ + 0xE8, 0xA0, 0xCE, 0xFD, 0xEF, 0xC0, 0xC2, 0xE0, /* 0x20-0x23 */ + 0xB4, 0xB8, 0xD7, 0xB6, 0xBD, 0xF5, 0xE9, 0x40, /* 0x24-0x27 */ + 0xCF, 0xC7, 0xEF, 0xC3, 0xEF, 0xC1, 0xEF, 0xC2, /* 0x28-0x2B */ + 0xEF, 0xC4, 0xB6, 0xA7, 0xBC, 0xFC, 0xBE, 0xE2, /* 0x2C-0x2F */ + 0xC3, 0xCC, 0xEF, 0xC5, 0xEF, 0xC6, 0xE9, 0x41, /* 0x30-0x33 */ + 0xEF, 0xC7, 0xEF, 0xCF, 0xEF, 0xC8, 0xEF, 0xC9, /* 0x34-0x37 */ + 0xEF, 0xCA, 0xC7, 0xC2, 0xEF, 0xF1, 0xB6, 0xCD, /* 0x38-0x3B */ + 0xEF, 0xCB, 0xE9, 0x42, 0xEF, 0xCC, 0xEF, 0xCD, /* 0x3C-0x3F */ + 0xB6, 0xC6, 0xC3, 0xBE, 0xEF, 0xCE, 0xE9, 0x43, /* 0x40-0x43 */ + 0xEF, 0xD0, 0xEF, 0xD1, 0xEF, 0xD2, 0xD5, 0xF2, /* 0x44-0x47 */ + 0xE9, 0x44, 0xEF, 0xD3, 0xC4, 0xF7, 0xE9, 0x45, /* 0x48-0x4B */ + 0xEF, 0xD4, 0xC4, 0xF8, 0xEF, 0xD5, 0xEF, 0xD6, /* 0x4C-0x4F */ + 0xB8, 0xE4, 0xB0, 0xF7, 0xEF, 0xD7, 0xEF, 0xD8, /* 0x50-0x53 */ + 0xEF, 0xD9, 0xE9, 0x46, 0xEF, 0xDA, 0xEF, 0xDB, /* 0x54-0x57 */ + 0xEF, 0xDC, 0xEF, 0xDD, 0xE9, 0x47, 0xEF, 0xDE, /* 0x58-0x5B */ + 0xBE, 0xB5, 0xEF, 0xE1, 0xEF, 0xDF, 0xEF, 0xE0, /* 0x5C-0x5F */ + 0xE9, 0x48, 0xEF, 0xE2, 0xEF, 0xE3, 0xC1, 0xCD, /* 0x60-0x63 */ + 0xEF, 0xE4, 0xEF, 0xE5, 0xEF, 0xE6, 0xEF, 0xE7, /* 0x64-0x67 */ + 0xEF, 0xE8, 0xEF, 0xE9, 0xEF, 0xEA, 0xEF, 0xEB, /* 0x68-0x6B */ + 0xEF, 0xEC, 0xC0, 0xD8, 0xE9, 0x49, 0xEF, 0xED, /* 0x6C-0x6F */ + 0xC1, 0xAD, 0xEF, 0xEE, 0xEF, 0xEF, 0xEF, 0xF0, /* 0x70-0x73 */ + 0xE9, 0x4A, 0xE9, 0x4B, 0xCF, 0xE2, 0xE9, 0x4C, /* 0x74-0x77 */ + 0xE9, 0x4D, 0xE9, 0x4E, 0xE9, 0x4F, 0xE9, 0x50, /* 0x78-0x7B */ + 0xE9, 0x51, 0xE9, 0x52, 0xE9, 0x53, 0xB3, 0xA4, /* 0x7C-0x7F */ + + 0xE9, 0x54, 0xE9, 0x55, 0xE9, 0x56, 0xE9, 0x57, /* 0x80-0x83 */ + 0xE9, 0x58, 0xE9, 0x59, 0xE9, 0x5A, 0xE9, 0x5B, /* 0x84-0x87 */ + 0xE9, 0x5C, 0xE9, 0x5D, 0xE9, 0x5E, 0xE9, 0x5F, /* 0x88-0x8B */ + 0xE9, 0x60, 0xE9, 0x61, 0xE9, 0x62, 0xE9, 0x63, /* 0x8C-0x8F */ + 0xE9, 0x64, 0xE9, 0x65, 0xE9, 0x66, 0xE9, 0x67, /* 0x90-0x93 */ + 0xE9, 0x68, 0xE9, 0x69, 0xE9, 0x6A, 0xE9, 0x6B, /* 0x94-0x97 */ + 0xE9, 0x6C, 0xE9, 0x6D, 0xE9, 0x6E, 0xE9, 0x6F, /* 0x98-0x9B */ + 0xE9, 0x70, 0xE9, 0x71, 0xE9, 0x72, 0xE9, 0x73, /* 0x9C-0x9F */ + 0xE9, 0x74, 0xE9, 0x75, 0xE9, 0x76, 0xE9, 0x77, /* 0xA0-0xA3 */ + 0xE9, 0x78, 0xE9, 0x79, 0xE9, 0x7A, 0xE9, 0x7B, /* 0xA4-0xA7 */ + 0xE9, 0x7C, 0xE9, 0x7D, 0xE9, 0x7E, 0xE9, 0x80, /* 0xA8-0xAB */ + 0xE9, 0x81, 0xE9, 0x82, 0xE9, 0x83, 0xE9, 0x84, /* 0xAC-0xAF */ + 0xE9, 0x85, 0xE9, 0x86, 0xE9, 0x87, 0xE9, 0x88, /* 0xB0-0xB3 */ + 0xE9, 0x89, 0xE9, 0x8A, 0xE9, 0x8B, 0xE9, 0x8C, /* 0xB4-0xB7 */ + 0xE9, 0x8D, 0xE9, 0x8E, 0xE9, 0x8F, 0xE9, 0x90, /* 0xB8-0xBB */ + 0xE9, 0x91, 0xE9, 0x92, 0xE9, 0x93, 0xE9, 0x94, /* 0xBC-0xBF */ + 0xE9, 0x95, 0xE9, 0x96, 0xE9, 0x97, 0xE9, 0x98, /* 0xC0-0xC3 */ + 0xE9, 0x99, 0xE9, 0x9A, 0xE9, 0x9B, 0xE9, 0x9C, /* 0xC4-0xC7 */ + 0xE9, 0x9D, 0xE9, 0x9E, 0xE9, 0x9F, 0xE9, 0xA0, /* 0xC8-0xCB */ + 0xEA, 0x40, 0xEA, 0x41, 0xEA, 0x42, 0xEA, 0x43, /* 0xCC-0xCF */ + 0xEA, 0x44, 0xEA, 0x45, 0xEA, 0x46, 0xEA, 0x47, /* 0xD0-0xD3 */ + 0xEA, 0x48, 0xEA, 0x49, 0xEA, 0x4A, 0xEA, 0x4B, /* 0xD4-0xD7 */ + 0xEA, 0x4C, 0xEA, 0x4D, 0xEA, 0x4E, 0xEA, 0x4F, /* 0xD8-0xDB */ + 0xEA, 0x50, 0xEA, 0x51, 0xEA, 0x52, 0xEA, 0x53, /* 0xDC-0xDF */ + 0xEA, 0x54, 0xEA, 0x55, 0xEA, 0x56, 0xEA, 0x57, /* 0xE0-0xE3 */ + 0xEA, 0x58, 0xEA, 0x59, 0xEA, 0x5A, 0xEA, 0x5B, /* 0xE4-0xE7 */ + 0xC3, 0xC5, 0xE3, 0xC5, 0xC9, 0xC1, 0xE3, 0xC6, /* 0xE8-0xEB */ + 0xEA, 0x5C, 0xB1, 0xD5, 0xCE, 0xCA, 0xB4, 0xB3, /* 0xEC-0xEF */ + 0xC8, 0xF2, 0xE3, 0xC7, 0xCF, 0xD0, 0xE3, 0xC8, /* 0xF0-0xF3 */ + 0xBC, 0xE4, 0xE3, 0xC9, 0xE3, 0xCA, 0xC3, 0xC6, /* 0xF4-0xF7 */ + 0xD5, 0xA2, 0xC4, 0xD6, 0xB9, 0xEB, 0xCE, 0xC5, /* 0xF8-0xFB */ + 0xE3, 0xCB, 0xC3, 0xF6, 0xE3, 0xCC, 0xEA, 0x5D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_96[512] = { + 0xB7, 0xA7, 0xB8, 0xF3, 0xBA, 0xD2, 0xE3, 0xCD, /* 0x00-0x03 */ + 0xE3, 0xCE, 0xD4, 0xC4, 0xE3, 0xCF, 0xEA, 0x5E, /* 0x04-0x07 */ + 0xE3, 0xD0, 0xD1, 0xCB, 0xE3, 0xD1, 0xE3, 0xD2, /* 0x08-0x0B */ + 0xE3, 0xD3, 0xE3, 0xD4, 0xD1, 0xD6, 0xE3, 0xD5, /* 0x0C-0x0F */ + 0xB2, 0xFB, 0xC0, 0xBB, 0xE3, 0xD6, 0xEA, 0x5F, /* 0x10-0x13 */ + 0xC0, 0xAB, 0xE3, 0xD7, 0xE3, 0xD8, 0xE3, 0xD9, /* 0x14-0x17 */ + 0xEA, 0x60, 0xE3, 0xDA, 0xE3, 0xDB, 0xEA, 0x61, /* 0x18-0x1B */ + 0xB8, 0xB7, 0xDA, 0xE2, 0xEA, 0x62, 0xB6, 0xD3, /* 0x1C-0x1F */ + 0xEA, 0x63, 0xDA, 0xE4, 0xDA, 0xE3, 0xEA, 0x64, /* 0x20-0x23 */ + 0xEA, 0x65, 0xEA, 0x66, 0xEA, 0x67, 0xEA, 0x68, /* 0x24-0x27 */ + 0xEA, 0x69, 0xEA, 0x6A, 0xDA, 0xE6, 0xEA, 0x6B, /* 0x28-0x2B */ + 0xEA, 0x6C, 0xEA, 0x6D, 0xC8, 0xEE, 0xEA, 0x6E, /* 0x2C-0x2F */ + 0xEA, 0x6F, 0xDA, 0xE5, 0xB7, 0xC0, 0xD1, 0xF4, /* 0x30-0x33 */ + 0xD2, 0xF5, 0xD5, 0xF3, 0xBD, 0xD7, 0xEA, 0x70, /* 0x34-0x37 */ + 0xEA, 0x71, 0xEA, 0x72, 0xEA, 0x73, 0xD7, 0xE8, /* 0x38-0x3B */ + 0xDA, 0xE8, 0xDA, 0xE7, 0xEA, 0x74, 0xB0, 0xA2, /* 0x3C-0x3F */ + 0xCD, 0xD3, 0xEA, 0x75, 0xDA, 0xE9, 0xEA, 0x76, /* 0x40-0x43 */ + 0xB8, 0xBD, 0xBC, 0xCA, 0xC2, 0xBD, 0xC2, 0xA4, /* 0x44-0x47 */ + 0xB3, 0xC2, 0xDA, 0xEA, 0xEA, 0x77, 0xC2, 0xAA, /* 0x48-0x4B */ + 0xC4, 0xB0, 0xBD, 0xB5, 0xEA, 0x78, 0xEA, 0x79, /* 0x4C-0x4F */ + 0xCF, 0xDE, 0xEA, 0x7A, 0xEA, 0x7B, 0xEA, 0x7C, /* 0x50-0x53 */ + 0xDA, 0xEB, 0xC9, 0xC2, 0xEA, 0x7D, 0xEA, 0x7E, /* 0x54-0x57 */ + 0xEA, 0x80, 0xEA, 0x81, 0xEA, 0x82, 0xB1, 0xDD, /* 0x58-0x5B */ + 0xEA, 0x83, 0xEA, 0x84, 0xEA, 0x85, 0xDA, 0xEC, /* 0x5C-0x5F */ + 0xEA, 0x86, 0xB6, 0xB8, 0xD4, 0xBA, 0xEA, 0x87, /* 0x60-0x63 */ + 0xB3, 0xFD, 0xEA, 0x88, 0xEA, 0x89, 0xDA, 0xED, /* 0x64-0x67 */ + 0xD4, 0xC9, 0xCF, 0xD5, 0xC5, 0xE3, 0xEA, 0x8A, /* 0x68-0x6B */ + 0xDA, 0xEE, 0xEA, 0x8B, 0xEA, 0x8C, 0xEA, 0x8D, /* 0x6C-0x6F */ + 0xEA, 0x8E, 0xEA, 0x8F, 0xDA, 0xEF, 0xEA, 0x90, /* 0x70-0x73 */ + 0xDA, 0xF0, 0xC1, 0xEA, 0xCC, 0xD5, 0xCF, 0xDD, /* 0x74-0x77 */ + 0xEA, 0x91, 0xEA, 0x92, 0xEA, 0x93, 0xEA, 0x94, /* 0x78-0x7B */ + 0xEA, 0x95, 0xEA, 0x96, 0xEA, 0x97, 0xEA, 0x98, /* 0x7C-0x7F */ + + 0xEA, 0x99, 0xEA, 0x9A, 0xEA, 0x9B, 0xEA, 0x9C, /* 0x80-0x83 */ + 0xEA, 0x9D, 0xD3, 0xE7, 0xC2, 0xA1, 0xEA, 0x9E, /* 0x84-0x87 */ + 0xDA, 0xF1, 0xEA, 0x9F, 0xEA, 0xA0, 0xCB, 0xE5, /* 0x88-0x8B */ + 0xEB, 0x40, 0xDA, 0xF2, 0xEB, 0x41, 0xCB, 0xE6, /* 0x8C-0x8F */ + 0xD2, 0xFE, 0xEB, 0x42, 0xEB, 0x43, 0xEB, 0x44, /* 0x90-0x93 */ + 0xB8, 0xF4, 0xEB, 0x45, 0xEB, 0x46, 0xDA, 0xF3, /* 0x94-0x97 */ + 0xB0, 0xAF, 0xCF, 0xB6, 0xEB, 0x47, 0xEB, 0x48, /* 0x98-0x9B */ + 0xD5, 0xCF, 0xEB, 0x49, 0xEB, 0x4A, 0xEB, 0x4B, /* 0x9C-0x9F */ + 0xEB, 0x4C, 0xEB, 0x4D, 0xEB, 0x4E, 0xEB, 0x4F, /* 0xA0-0xA3 */ + 0xEB, 0x50, 0xEB, 0x51, 0xEB, 0x52, 0xCB, 0xED, /* 0xA4-0xA7 */ + 0xEB, 0x53, 0xEB, 0x54, 0xEB, 0x55, 0xEB, 0x56, /* 0xA8-0xAB */ + 0xEB, 0x57, 0xEB, 0x58, 0xEB, 0x59, 0xEB, 0x5A, /* 0xAC-0xAF */ + 0xDA, 0xF4, 0xEB, 0x5B, 0xEB, 0x5C, 0xE3, 0xC4, /* 0xB0-0xB3 */ + 0xEB, 0x5D, 0xEB, 0x5E, 0xC1, 0xA5, 0xEB, 0x5F, /* 0xB4-0xB7 */ + 0xEB, 0x60, 0xF6, 0xBF, 0xEB, 0x61, 0xEB, 0x62, /* 0xB8-0xBB */ + 0xF6, 0xC0, 0xF6, 0xC1, 0xC4, 0xD1, 0xEB, 0x63, /* 0xBC-0xBF */ + 0xC8, 0xB8, 0xD1, 0xE3, 0xEB, 0x64, 0xEB, 0x65, /* 0xC0-0xC3 */ + 0xD0, 0xDB, 0xD1, 0xC5, 0xBC, 0xAF, 0xB9, 0xCD, /* 0xC4-0xC7 */ + 0xEB, 0x66, 0xEF, 0xF4, 0xEB, 0x67, 0xEB, 0x68, /* 0xC8-0xCB */ + 0xB4, 0xC6, 0xD3, 0xBA, 0xF6, 0xC2, 0xB3, 0xFB, /* 0xCC-0xCF */ + 0xEB, 0x69, 0xEB, 0x6A, 0xF6, 0xC3, 0xEB, 0x6B, /* 0xD0-0xD3 */ + 0xEB, 0x6C, 0xB5, 0xF1, 0xEB, 0x6D, 0xEB, 0x6E, /* 0xD4-0xD7 */ + 0xEB, 0x6F, 0xEB, 0x70, 0xEB, 0x71, 0xEB, 0x72, /* 0xD8-0xDB */ + 0xEB, 0x73, 0xEB, 0x74, 0xEB, 0x75, 0xEB, 0x76, /* 0xDC-0xDF */ + 0xF6, 0xC5, 0xEB, 0x77, 0xEB, 0x78, 0xEB, 0x79, /* 0xE0-0xE3 */ + 0xEB, 0x7A, 0xEB, 0x7B, 0xEB, 0x7C, 0xEB, 0x7D, /* 0xE4-0xE7 */ + 0xD3, 0xEA, 0xF6, 0xA7, 0xD1, 0xA9, 0xEB, 0x7E, /* 0xE8-0xEB */ + 0xEB, 0x80, 0xEB, 0x81, 0xEB, 0x82, 0xF6, 0xA9, /* 0xEC-0xEF */ + 0xEB, 0x83, 0xEB, 0x84, 0xEB, 0x85, 0xF6, 0xA8, /* 0xF0-0xF3 */ + 0xEB, 0x86, 0xEB, 0x87, 0xC1, 0xE3, 0xC0, 0xD7, /* 0xF4-0xF7 */ + 0xEB, 0x88, 0xB1, 0xA2, 0xEB, 0x89, 0xEB, 0x8A, /* 0xF8-0xFB */ + 0xEB, 0x8B, 0xEB, 0x8C, 0xCE, 0xED, 0xEB, 0x8D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_97[512] = { + 0xD0, 0xE8, 0xF6, 0xAB, 0xEB, 0x8E, 0xEB, 0x8F, /* 0x00-0x03 */ + 0xCF, 0xF6, 0xEB, 0x90, 0xF6, 0xAA, 0xD5, 0xF0, /* 0x04-0x07 */ + 0xF6, 0xAC, 0xC3, 0xB9, 0xEB, 0x91, 0xEB, 0x92, /* 0x08-0x0B */ + 0xEB, 0x93, 0xBB, 0xF4, 0xF6, 0xAE, 0xF6, 0xAD, /* 0x0C-0x0F */ + 0xEB, 0x94, 0xEB, 0x95, 0xEB, 0x96, 0xC4, 0xDE, /* 0x10-0x13 */ + 0xEB, 0x97, 0xEB, 0x98, 0xC1, 0xD8, 0xEB, 0x99, /* 0x14-0x17 */ + 0xEB, 0x9A, 0xEB, 0x9B, 0xEB, 0x9C, 0xEB, 0x9D, /* 0x18-0x1B */ + 0xCB, 0xAA, 0xEB, 0x9E, 0xCF, 0xBC, 0xEB, 0x9F, /* 0x1C-0x1F */ + 0xEB, 0xA0, 0xEC, 0x40, 0xEC, 0x41, 0xEC, 0x42, /* 0x20-0x23 */ + 0xEC, 0x43, 0xEC, 0x44, 0xEC, 0x45, 0xEC, 0x46, /* 0x24-0x27 */ + 0xEC, 0x47, 0xEC, 0x48, 0xF6, 0xAF, 0xEC, 0x49, /* 0x28-0x2B */ + 0xEC, 0x4A, 0xF6, 0xB0, 0xEC, 0x4B, 0xEC, 0x4C, /* 0x2C-0x2F */ + 0xF6, 0xB1, 0xEC, 0x4D, 0xC2, 0xB6, 0xEC, 0x4E, /* 0x30-0x33 */ + 0xEC, 0x4F, 0xEC, 0x50, 0xEC, 0x51, 0xEC, 0x52, /* 0x34-0x37 */ + 0xB0, 0xD4, 0xC5, 0xF9, 0xEC, 0x53, 0xEC, 0x54, /* 0x38-0x3B */ + 0xEC, 0x55, 0xEC, 0x56, 0xF6, 0xB2, 0xEC, 0x57, /* 0x3C-0x3F */ + 0xEC, 0x58, 0xEC, 0x59, 0xEC, 0x5A, 0xEC, 0x5B, /* 0x40-0x43 */ + 0xEC, 0x5C, 0xEC, 0x5D, 0xEC, 0x5E, 0xEC, 0x5F, /* 0x44-0x47 */ + 0xEC, 0x60, 0xEC, 0x61, 0xEC, 0x62, 0xEC, 0x63, /* 0x48-0x4B */ + 0xEC, 0x64, 0xEC, 0x65, 0xEC, 0x66, 0xEC, 0x67, /* 0x4C-0x4F */ + 0xEC, 0x68, 0xEC, 0x69, 0xC7, 0xE0, 0xF6, 0xA6, /* 0x50-0x53 */ + 0xEC, 0x6A, 0xEC, 0x6B, 0xBE, 0xB8, 0xEC, 0x6C, /* 0x54-0x57 */ + 0xEC, 0x6D, 0xBE, 0xB2, 0xEC, 0x6E, 0xB5, 0xE5, /* 0x58-0x5B */ + 0xEC, 0x6F, 0xEC, 0x70, 0xB7, 0xC7, 0xEC, 0x71, /* 0x5C-0x5F */ + 0xBF, 0xBF, 0xC3, 0xD2, 0xC3, 0xE6, 0xEC, 0x72, /* 0x60-0x63 */ + 0xEC, 0x73, 0xD8, 0xCC, 0xEC, 0x74, 0xEC, 0x75, /* 0x64-0x67 */ + 0xEC, 0x76, 0xB8, 0xEF, 0xEC, 0x77, 0xEC, 0x78, /* 0x68-0x6B */ + 0xEC, 0x79, 0xEC, 0x7A, 0xEC, 0x7B, 0xEC, 0x7C, /* 0x6C-0x6F */ + 0xEC, 0x7D, 0xEC, 0x7E, 0xEC, 0x80, 0xBD, 0xF9, /* 0x70-0x73 */ + 0xD1, 0xA5, 0xEC, 0x81, 0xB0, 0xD0, 0xEC, 0x82, /* 0x74-0x77 */ + 0xEC, 0x83, 0xEC, 0x84, 0xEC, 0x85, 0xEC, 0x86, /* 0x78-0x7B */ + 0xF7, 0xB0, 0xEC, 0x87, 0xEC, 0x88, 0xEC, 0x89, /* 0x7C-0x7F */ + + 0xEC, 0x8A, 0xEC, 0x8B, 0xEC, 0x8C, 0xEC, 0x8D, /* 0x80-0x83 */ + 0xEC, 0x8E, 0xF7, 0xB1, 0xEC, 0x8F, 0xEC, 0x90, /* 0x84-0x87 */ + 0xEC, 0x91, 0xEC, 0x92, 0xEC, 0x93, 0xD0, 0xAC, /* 0x88-0x8B */ + 0xEC, 0x94, 0xB0, 0xB0, 0xEC, 0x95, 0xEC, 0x96, /* 0x8C-0x8F */ + 0xEC, 0x97, 0xF7, 0xB2, 0xF7, 0xB3, 0xEC, 0x98, /* 0x90-0x93 */ + 0xF7, 0xB4, 0xEC, 0x99, 0xEC, 0x9A, 0xEC, 0x9B, /* 0x94-0x97 */ + 0xC7, 0xCA, 0xEC, 0x9C, 0xEC, 0x9D, 0xEC, 0x9E, /* 0x98-0x9B */ + 0xEC, 0x9F, 0xEC, 0xA0, 0xED, 0x40, 0xED, 0x41, /* 0x9C-0x9F */ + 0xBE, 0xCF, 0xED, 0x42, 0xED, 0x43, 0xF7, 0xB7, /* 0xA0-0xA3 */ + 0xED, 0x44, 0xED, 0x45, 0xED, 0x46, 0xED, 0x47, /* 0xA4-0xA7 */ + 0xED, 0x48, 0xED, 0x49, 0xED, 0x4A, 0xF7, 0xB6, /* 0xA8-0xAB */ + 0xED, 0x4B, 0xB1, 0xDE, 0xED, 0x4C, 0xF7, 0xB5, /* 0xAC-0xAF */ + 0xED, 0x4D, 0xED, 0x4E, 0xF7, 0xB8, 0xED, 0x4F, /* 0xB0-0xB3 */ + 0xF7, 0xB9, 0xED, 0x50, 0xED, 0x51, 0xED, 0x52, /* 0xB4-0xB7 */ + 0xED, 0x53, 0xED, 0x54, 0xED, 0x55, 0xED, 0x56, /* 0xB8-0xBB */ + 0xED, 0x57, 0xED, 0x58, 0xED, 0x59, 0xED, 0x5A, /* 0xBC-0xBF */ + 0xED, 0x5B, 0xED, 0x5C, 0xED, 0x5D, 0xED, 0x5E, /* 0xC0-0xC3 */ + 0xED, 0x5F, 0xED, 0x60, 0xED, 0x61, 0xED, 0x62, /* 0xC4-0xC7 */ + 0xED, 0x63, 0xED, 0x64, 0xED, 0x65, 0xED, 0x66, /* 0xC8-0xCB */ + 0xED, 0x67, 0xED, 0x68, 0xED, 0x69, 0xED, 0x6A, /* 0xCC-0xCF */ + 0xED, 0x6B, 0xED, 0x6C, 0xED, 0x6D, 0xED, 0x6E, /* 0xD0-0xD3 */ + 0xED, 0x6F, 0xED, 0x70, 0xED, 0x71, 0xED, 0x72, /* 0xD4-0xD7 */ + 0xED, 0x73, 0xED, 0x74, 0xED, 0x75, 0xED, 0x76, /* 0xD8-0xDB */ + 0xED, 0x77, 0xED, 0x78, 0xED, 0x79, 0xED, 0x7A, /* 0xDC-0xDF */ + 0xED, 0x7B, 0xED, 0x7C, 0xED, 0x7D, 0xED, 0x7E, /* 0xE0-0xE3 */ + 0xED, 0x80, 0xED, 0x81, 0xCE, 0xA4, 0xC8, 0xCD, /* 0xE4-0xE7 */ + 0xED, 0x82, 0xBA, 0xAB, 0xE8, 0xB8, 0xE8, 0xB9, /* 0xE8-0xEB */ + 0xE8, 0xBA, 0xBE, 0xC2, 0xED, 0x83, 0xED, 0x84, /* 0xEC-0xEF */ + 0xED, 0x85, 0xED, 0x86, 0xED, 0x87, 0xD2, 0xF4, /* 0xF0-0xF3 */ + 0xED, 0x88, 0xD4, 0xCF, 0xC9, 0xD8, 0xED, 0x89, /* 0xF4-0xF7 */ + 0xED, 0x8A, 0xED, 0x8B, 0xED, 0x8C, 0xED, 0x8D, /* 0xF8-0xFB */ + 0xED, 0x8E, 0xED, 0x8F, 0xED, 0x90, 0xED, 0x91, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_98[512] = { + 0xED, 0x92, 0xED, 0x93, 0xED, 0x94, 0xED, 0x95, /* 0x00-0x03 */ + 0xED, 0x96, 0xED, 0x97, 0xED, 0x98, 0xED, 0x99, /* 0x04-0x07 */ + 0xED, 0x9A, 0xED, 0x9B, 0xED, 0x9C, 0xED, 0x9D, /* 0x08-0x0B */ + 0xED, 0x9E, 0xED, 0x9F, 0xED, 0xA0, 0xEE, 0x40, /* 0x0C-0x0F */ + 0xEE, 0x41, 0xEE, 0x42, 0xEE, 0x43, 0xEE, 0x44, /* 0x10-0x13 */ + 0xEE, 0x45, 0xEE, 0x46, 0xEE, 0x47, 0xEE, 0x48, /* 0x14-0x17 */ + 0xEE, 0x49, 0xEE, 0x4A, 0xEE, 0x4B, 0xEE, 0x4C, /* 0x18-0x1B */ + 0xEE, 0x4D, 0xEE, 0x4E, 0xEE, 0x4F, 0xEE, 0x50, /* 0x1C-0x1F */ + 0xEE, 0x51, 0xEE, 0x52, 0xEE, 0x53, 0xEE, 0x54, /* 0x20-0x23 */ + 0xEE, 0x55, 0xEE, 0x56, 0xEE, 0x57, 0xEE, 0x58, /* 0x24-0x27 */ + 0xEE, 0x59, 0xEE, 0x5A, 0xEE, 0x5B, 0xEE, 0x5C, /* 0x28-0x2B */ + 0xEE, 0x5D, 0xEE, 0x5E, 0xEE, 0x5F, 0xEE, 0x60, /* 0x2C-0x2F */ + 0xEE, 0x61, 0xEE, 0x62, 0xEE, 0x63, 0xEE, 0x64, /* 0x30-0x33 */ + 0xEE, 0x65, 0xEE, 0x66, 0xEE, 0x67, 0xEE, 0x68, /* 0x34-0x37 */ + 0xEE, 0x69, 0xEE, 0x6A, 0xEE, 0x6B, 0xEE, 0x6C, /* 0x38-0x3B */ + 0xEE, 0x6D, 0xEE, 0x6E, 0xEE, 0x6F, 0xEE, 0x70, /* 0x3C-0x3F */ + 0xEE, 0x71, 0xEE, 0x72, 0xEE, 0x73, 0xEE, 0x74, /* 0x40-0x43 */ + 0xEE, 0x75, 0xEE, 0x76, 0xEE, 0x77, 0xEE, 0x78, /* 0x44-0x47 */ + 0xEE, 0x79, 0xEE, 0x7A, 0xEE, 0x7B, 0xEE, 0x7C, /* 0x48-0x4B */ + 0xEE, 0x7D, 0xEE, 0x7E, 0xEE, 0x80, 0xEE, 0x81, /* 0x4C-0x4F */ + 0xEE, 0x82, 0xEE, 0x83, 0xEE, 0x84, 0xEE, 0x85, /* 0x50-0x53 */ + 0xEE, 0x86, 0xEE, 0x87, 0xEE, 0x88, 0xEE, 0x89, /* 0x54-0x57 */ + 0xEE, 0x8A, 0xEE, 0x8B, 0xEE, 0x8C, 0xEE, 0x8D, /* 0x58-0x5B */ + 0xEE, 0x8E, 0xEE, 0x8F, 0xEE, 0x90, 0xEE, 0x91, /* 0x5C-0x5F */ + 0xEE, 0x92, 0xEE, 0x93, 0xEE, 0x94, 0xEE, 0x95, /* 0x60-0x63 */ + 0xEE, 0x96, 0xEE, 0x97, 0xEE, 0x98, 0xEE, 0x99, /* 0x64-0x67 */ + 0xEE, 0x9A, 0xEE, 0x9B, 0xEE, 0x9C, 0xEE, 0x9D, /* 0x68-0x6B */ + 0xEE, 0x9E, 0xEE, 0x9F, 0xEE, 0xA0, 0xEF, 0x40, /* 0x6C-0x6F */ + 0xEF, 0x41, 0xEF, 0x42, 0xEF, 0x43, 0xEF, 0x44, /* 0x70-0x73 */ + 0xEF, 0x45, 0xD2, 0xB3, 0xB6, 0xA5, 0xC7, 0xEA, /* 0x74-0x77 */ + 0xF1, 0xFC, 0xCF, 0xEE, 0xCB, 0xB3, 0xD0, 0xEB, /* 0x78-0x7B */ + 0xE7, 0xEF, 0xCD, 0xE7, 0xB9, 0xCB, 0xB6, 0xD9, /* 0x7C-0x7F */ + + 0xF1, 0xFD, 0xB0, 0xE4, 0xCB, 0xCC, 0xF1, 0xFE, /* 0x80-0x83 */ + 0xD4, 0xA4, 0xC2, 0xAD, 0xC1, 0xEC, 0xC6, 0xC4, /* 0x84-0x87 */ + 0xBE, 0xB1, 0xF2, 0xA1, 0xBC, 0xD5, 0xEF, 0x46, /* 0x88-0x8B */ + 0xF2, 0xA2, 0xF2, 0xA3, 0xEF, 0x47, 0xF2, 0xA4, /* 0x8C-0x8F */ + 0xD2, 0xC3, 0xC6, 0xB5, 0xEF, 0x48, 0xCD, 0xC7, /* 0x90-0x93 */ + 0xF2, 0xA5, 0xEF, 0x49, 0xD3, 0xB1, 0xBF, 0xC5, /* 0x94-0x97 */ + 0xCC, 0xE2, 0xEF, 0x4A, 0xF2, 0xA6, 0xF2, 0xA7, /* 0x98-0x9B */ + 0xD1, 0xD5, 0xB6, 0xEE, 0xF2, 0xA8, 0xF2, 0xA9, /* 0x9C-0x9F */ + 0xB5, 0xDF, 0xF2, 0xAA, 0xF2, 0xAB, 0xEF, 0x4B, /* 0xA0-0xA3 */ + 0xB2, 0xFC, 0xF2, 0xAC, 0xF2, 0xAD, 0xC8, 0xA7, /* 0xA4-0xA7 */ + 0xEF, 0x4C, 0xEF, 0x4D, 0xEF, 0x4E, 0xEF, 0x4F, /* 0xA8-0xAB */ + 0xEF, 0x50, 0xEF, 0x51, 0xEF, 0x52, 0xEF, 0x53, /* 0xAC-0xAF */ + 0xEF, 0x54, 0xEF, 0x55, 0xEF, 0x56, 0xEF, 0x57, /* 0xB0-0xB3 */ + 0xEF, 0x58, 0xEF, 0x59, 0xEF, 0x5A, 0xEF, 0x5B, /* 0xB4-0xB7 */ + 0xEF, 0x5C, 0xEF, 0x5D, 0xEF, 0x5E, 0xEF, 0x5F, /* 0xB8-0xBB */ + 0xEF, 0x60, 0xEF, 0x61, 0xEF, 0x62, 0xEF, 0x63, /* 0xBC-0xBF */ + 0xEF, 0x64, 0xEF, 0x65, 0xEF, 0x66, 0xEF, 0x67, /* 0xC0-0xC3 */ + 0xEF, 0x68, 0xEF, 0x69, 0xEF, 0x6A, 0xEF, 0x6B, /* 0xC4-0xC7 */ + 0xEF, 0x6C, 0xEF, 0x6D, 0xEF, 0x6E, 0xEF, 0x6F, /* 0xC8-0xCB */ + 0xEF, 0x70, 0xEF, 0x71, 0xB7, 0xE7, 0xEF, 0x72, /* 0xCC-0xCF */ + 0xEF, 0x73, 0xEC, 0xA9, 0xEC, 0xAA, 0xEC, 0xAB, /* 0xD0-0xD3 */ + 0xEF, 0x74, 0xEC, 0xAC, 0xEF, 0x75, 0xEF, 0x76, /* 0xD4-0xD7 */ + 0xC6, 0xAE, 0xEC, 0xAD, 0xEC, 0xAE, 0xEF, 0x77, /* 0xD8-0xDB */ + 0xEF, 0x78, 0xEF, 0x79, 0xB7, 0xC9, 0xCA, 0xB3, /* 0xDC-0xDF */ + 0xEF, 0x7A, 0xEF, 0x7B, 0xEF, 0x7C, 0xEF, 0x7D, /* 0xE0-0xE3 */ + 0xEF, 0x7E, 0xEF, 0x80, 0xEF, 0x81, 0xE2, 0xB8, /* 0xE4-0xE7 */ + 0xF7, 0xCF, 0xEF, 0x82, 0xEF, 0x83, 0xEF, 0x84, /* 0xE8-0xEB */ + 0xEF, 0x85, 0xEF, 0x86, 0xEF, 0x87, 0xEF, 0x88, /* 0xEC-0xEF */ + 0xEF, 0x89, 0xEF, 0x8A, 0xEF, 0x8B, 0xEF, 0x8C, /* 0xF0-0xF3 */ + 0xEF, 0x8D, 0xEF, 0x8E, 0xEF, 0x8F, 0xEF, 0x90, /* 0xF4-0xF7 */ + 0xEF, 0x91, 0xEF, 0x92, 0xEF, 0x93, 0xEF, 0x94, /* 0xF8-0xFB */ + 0xEF, 0x95, 0xEF, 0x96, 0xEF, 0x97, 0xEF, 0x98, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_99[512] = { + 0xEF, 0x99, 0xEF, 0x9A, 0xEF, 0x9B, 0xEF, 0x9C, /* 0x00-0x03 */ + 0xEF, 0x9D, 0xEF, 0x9E, 0xEF, 0x9F, 0xEF, 0xA0, /* 0x04-0x07 */ + 0xF0, 0x40, 0xF0, 0x41, 0xF0, 0x42, 0xF0, 0x43, /* 0x08-0x0B */ + 0xF0, 0x44, 0xF7, 0xD0, 0xF0, 0x45, 0xF0, 0x46, /* 0x0C-0x0F */ + 0xB2, 0xCD, 0xF0, 0x47, 0xF0, 0x48, 0xF0, 0x49, /* 0x10-0x13 */ + 0xF0, 0x4A, 0xF0, 0x4B, 0xF0, 0x4C, 0xF0, 0x4D, /* 0x14-0x17 */ + 0xF0, 0x4E, 0xF0, 0x4F, 0xF0, 0x50, 0xF0, 0x51, /* 0x18-0x1B */ + 0xF0, 0x52, 0xF0, 0x53, 0xF0, 0x54, 0xF0, 0x55, /* 0x1C-0x1F */ + 0xF0, 0x56, 0xF0, 0x57, 0xF0, 0x58, 0xF0, 0x59, /* 0x20-0x23 */ + 0xF0, 0x5A, 0xF0, 0x5B, 0xF0, 0x5C, 0xF0, 0x5D, /* 0x24-0x27 */ + 0xF0, 0x5E, 0xF0, 0x5F, 0xF0, 0x60, 0xF0, 0x61, /* 0x28-0x2B */ + 0xF0, 0x62, 0xF0, 0x63, 0xF7, 0xD1, 0xF0, 0x64, /* 0x2C-0x2F */ + 0xF0, 0x65, 0xF0, 0x66, 0xF0, 0x67, 0xF0, 0x68, /* 0x30-0x33 */ + 0xF0, 0x69, 0xF0, 0x6A, 0xF0, 0x6B, 0xF0, 0x6C, /* 0x34-0x37 */ + 0xF0, 0x6D, 0xF0, 0x6E, 0xF0, 0x6F, 0xF0, 0x70, /* 0x38-0x3B */ + 0xF0, 0x71, 0xF0, 0x72, 0xF0, 0x73, 0xF0, 0x74, /* 0x3C-0x3F */ + 0xF0, 0x75, 0xF0, 0x76, 0xF0, 0x77, 0xF0, 0x78, /* 0x40-0x43 */ + 0xF0, 0x79, 0xF0, 0x7A, 0xF0, 0x7B, 0xF0, 0x7C, /* 0x44-0x47 */ + 0xF0, 0x7D, 0xF0, 0x7E, 0xF0, 0x80, 0xF0, 0x81, /* 0x48-0x4B */ + 0xF0, 0x82, 0xF0, 0x83, 0xF0, 0x84, 0xF0, 0x85, /* 0x4C-0x4F */ + 0xF0, 0x86, 0xF0, 0x87, 0xF0, 0x88, 0xF0, 0x89, /* 0x50-0x53 */ + 0xF7, 0xD3, 0xF7, 0xD2, 0xF0, 0x8A, 0xF0, 0x8B, /* 0x54-0x57 */ + 0xF0, 0x8C, 0xF0, 0x8D, 0xF0, 0x8E, 0xF0, 0x8F, /* 0x58-0x5B */ + 0xF0, 0x90, 0xF0, 0x91, 0xF0, 0x92, 0xF0, 0x93, /* 0x5C-0x5F */ + 0xF0, 0x94, 0xF0, 0x95, 0xF0, 0x96, 0xE2, 0xBB, /* 0x60-0x63 */ + 0xF0, 0x97, 0xBC, 0xA2, 0xF0, 0x98, 0xE2, 0xBC, /* 0x64-0x67 */ + 0xE2, 0xBD, 0xE2, 0xBE, 0xE2, 0xBF, 0xE2, 0xC0, /* 0x68-0x6B */ + 0xE2, 0xC1, 0xB7, 0xB9, 0xD2, 0xFB, 0xBD, 0xA4, /* 0x6C-0x6F */ + 0xCA, 0xCE, 0xB1, 0xA5, 0xCB, 0xC7, 0xF0, 0x99, /* 0x70-0x73 */ + 0xE2, 0xC2, 0xB6, 0xFC, 0xC8, 0xC4, 0xE2, 0xC3, /* 0x74-0x77 */ + 0xF0, 0x9A, 0xF0, 0x9B, 0xBD, 0xC8, 0xF0, 0x9C, /* 0x78-0x7B */ + 0xB1, 0xFD, 0xE2, 0xC4, 0xF0, 0x9D, 0xB6, 0xF6, /* 0x7C-0x7F */ + + 0xE2, 0xC5, 0xC4, 0xD9, 0xF0, 0x9E, 0xF0, 0x9F, /* 0x80-0x83 */ + 0xE2, 0xC6, 0xCF, 0xDA, 0xB9, 0xDD, 0xE2, 0xC7, /* 0x84-0x87 */ + 0xC0, 0xA1, 0xF0, 0xA0, 0xE2, 0xC8, 0xB2, 0xF6, /* 0x88-0x8B */ + 0xF1, 0x40, 0xE2, 0xC9, 0xF1, 0x41, 0xC1, 0xF3, /* 0x8C-0x8F */ + 0xE2, 0xCA, 0xE2, 0xCB, 0xC2, 0xF8, 0xE2, 0xCC, /* 0x90-0x93 */ + 0xE2, 0xCD, 0xE2, 0xCE, 0xCA, 0xD7, 0xD8, 0xB8, /* 0x94-0x97 */ + 0xD9, 0xE5, 0xCF, 0xE3, 0xF1, 0x42, 0xF1, 0x43, /* 0x98-0x9B */ + 0xF1, 0x44, 0xF1, 0x45, 0xF1, 0x46, 0xF1, 0x47, /* 0x9C-0x9F */ + 0xF1, 0x48, 0xF1, 0x49, 0xF1, 0x4A, 0xF1, 0x4B, /* 0xA0-0xA3 */ + 0xF1, 0x4C, 0xF0, 0xA5, 0xF1, 0x4D, 0xF1, 0x4E, /* 0xA4-0xA7 */ + 0xDC, 0xB0, 0xF1, 0x4F, 0xF1, 0x50, 0xF1, 0x51, /* 0xA8-0xAB */ + 0xF1, 0x52, 0xF1, 0x53, 0xF1, 0x54, 0xF1, 0x55, /* 0xAC-0xAF */ + 0xF1, 0x56, 0xF1, 0x57, 0xF1, 0x58, 0xF1, 0x59, /* 0xB0-0xB3 */ + 0xF1, 0x5A, 0xF1, 0x5B, 0xF1, 0x5C, 0xF1, 0x5D, /* 0xB4-0xB7 */ + 0xF1, 0x5E, 0xF1, 0x5F, 0xF1, 0x60, 0xF1, 0x61, /* 0xB8-0xBB */ + 0xF1, 0x62, 0xF1, 0x63, 0xF1, 0x64, 0xF1, 0x65, /* 0xBC-0xBF */ + 0xF1, 0x66, 0xF1, 0x67, 0xF1, 0x68, 0xF1, 0x69, /* 0xC0-0xC3 */ + 0xF1, 0x6A, 0xF1, 0x6B, 0xF1, 0x6C, 0xF1, 0x6D, /* 0xC4-0xC7 */ + 0xF1, 0x6E, 0xF1, 0x6F, 0xF1, 0x70, 0xF1, 0x71, /* 0xC8-0xCB */ + 0xF1, 0x72, 0xF1, 0x73, 0xF1, 0x74, 0xF1, 0x75, /* 0xCC-0xCF */ + 0xF1, 0x76, 0xF1, 0x77, 0xF1, 0x78, 0xF1, 0x79, /* 0xD0-0xD3 */ + 0xF1, 0x7A, 0xF1, 0x7B, 0xF1, 0x7C, 0xF1, 0x7D, /* 0xD4-0xD7 */ + 0xF1, 0x7E, 0xF1, 0x80, 0xF1, 0x81, 0xF1, 0x82, /* 0xD8-0xDB */ + 0xF1, 0x83, 0xF1, 0x84, 0xF1, 0x85, 0xF1, 0x86, /* 0xDC-0xDF */ + 0xF1, 0x87, 0xF1, 0x88, 0xF1, 0x89, 0xF1, 0x8A, /* 0xE0-0xE3 */ + 0xF1, 0x8B, 0xF1, 0x8C, 0xF1, 0x8D, 0xF1, 0x8E, /* 0xE4-0xE7 */ + 0xF1, 0x8F, 0xF1, 0x90, 0xF1, 0x91, 0xF1, 0x92, /* 0xE8-0xEB */ + 0xF1, 0x93, 0xF1, 0x94, 0xF1, 0x95, 0xF1, 0x96, /* 0xEC-0xEF */ + 0xF1, 0x97, 0xF1, 0x98, 0xF1, 0x99, 0xF1, 0x9A, /* 0xF0-0xF3 */ + 0xF1, 0x9B, 0xF1, 0x9C, 0xF1, 0x9D, 0xF1, 0x9E, /* 0xF4-0xF7 */ + 0xF1, 0x9F, 0xF1, 0xA0, 0xF2, 0x40, 0xF2, 0x41, /* 0xF8-0xFB */ + 0xF2, 0x42, 0xF2, 0x43, 0xF2, 0x44, 0xF2, 0x45, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9A[512] = { + 0xF2, 0x46, 0xF2, 0x47, 0xF2, 0x48, 0xF2, 0x49, /* 0x00-0x03 */ + 0xF2, 0x4A, 0xF2, 0x4B, 0xF2, 0x4C, 0xF2, 0x4D, /* 0x04-0x07 */ + 0xF2, 0x4E, 0xF2, 0x4F, 0xF2, 0x50, 0xF2, 0x51, /* 0x08-0x0B */ + 0xF2, 0x52, 0xF2, 0x53, 0xF2, 0x54, 0xF2, 0x55, /* 0x0C-0x0F */ + 0xF2, 0x56, 0xF2, 0x57, 0xF2, 0x58, 0xF2, 0x59, /* 0x10-0x13 */ + 0xF2, 0x5A, 0xF2, 0x5B, 0xF2, 0x5C, 0xF2, 0x5D, /* 0x14-0x17 */ + 0xF2, 0x5E, 0xF2, 0x5F, 0xF2, 0x60, 0xF2, 0x61, /* 0x18-0x1B */ + 0xF2, 0x62, 0xF2, 0x63, 0xF2, 0x64, 0xF2, 0x65, /* 0x1C-0x1F */ + 0xF2, 0x66, 0xF2, 0x67, 0xF2, 0x68, 0xF2, 0x69, /* 0x20-0x23 */ + 0xF2, 0x6A, 0xF2, 0x6B, 0xF2, 0x6C, 0xF2, 0x6D, /* 0x24-0x27 */ + 0xF2, 0x6E, 0xF2, 0x6F, 0xF2, 0x70, 0xF2, 0x71, /* 0x28-0x2B */ + 0xF2, 0x72, 0xF2, 0x73, 0xF2, 0x74, 0xF2, 0x75, /* 0x2C-0x2F */ + 0xF2, 0x76, 0xF2, 0x77, 0xF2, 0x78, 0xF2, 0x79, /* 0x30-0x33 */ + 0xF2, 0x7A, 0xF2, 0x7B, 0xF2, 0x7C, 0xF2, 0x7D, /* 0x34-0x37 */ + 0xF2, 0x7E, 0xF2, 0x80, 0xF2, 0x81, 0xF2, 0x82, /* 0x38-0x3B */ + 0xF2, 0x83, 0xF2, 0x84, 0xF2, 0x85, 0xF2, 0x86, /* 0x3C-0x3F */ + 0xF2, 0x87, 0xF2, 0x88, 0xF2, 0x89, 0xF2, 0x8A, /* 0x40-0x43 */ + 0xF2, 0x8B, 0xF2, 0x8C, 0xF2, 0x8D, 0xF2, 0x8E, /* 0x44-0x47 */ + 0xF2, 0x8F, 0xF2, 0x90, 0xF2, 0x91, 0xF2, 0x92, /* 0x48-0x4B */ + 0xF2, 0x93, 0xF2, 0x94, 0xF2, 0x95, 0xF2, 0x96, /* 0x4C-0x4F */ + 0xF2, 0x97, 0xF2, 0x98, 0xF2, 0x99, 0xF2, 0x9A, /* 0x50-0x53 */ + 0xF2, 0x9B, 0xF2, 0x9C, 0xF2, 0x9D, 0xF2, 0x9E, /* 0x54-0x57 */ + 0xF2, 0x9F, 0xF2, 0xA0, 0xF3, 0x40, 0xF3, 0x41, /* 0x58-0x5B */ + 0xF3, 0x42, 0xF3, 0x43, 0xF3, 0x44, 0xF3, 0x45, /* 0x5C-0x5F */ + 0xF3, 0x46, 0xF3, 0x47, 0xF3, 0x48, 0xF3, 0x49, /* 0x60-0x63 */ + 0xF3, 0x4A, 0xF3, 0x4B, 0xF3, 0x4C, 0xF3, 0x4D, /* 0x64-0x67 */ + 0xF3, 0x4E, 0xF3, 0x4F, 0xF3, 0x50, 0xF3, 0x51, /* 0x68-0x6B */ + 0xC2, 0xED, 0xD4, 0xA6, 0xCD, 0xD4, 0xD1, 0xB1, /* 0x6C-0x6F */ + 0xB3, 0xDB, 0xC7, 0xFD, 0xF3, 0x52, 0xB2, 0xB5, /* 0x70-0x73 */ + 0xC2, 0xBF, 0xE6, 0xE0, 0xCA, 0xBB, 0xE6, 0xE1, /* 0x74-0x77 */ + 0xE6, 0xE2, 0xBE, 0xD4, 0xE6, 0xE3, 0xD7, 0xA4, /* 0x78-0x7B */ + 0xCD, 0xD5, 0xE6, 0xE5, 0xBC, 0xDD, 0xE6, 0xE4, /* 0x7C-0x7F */ + + 0xE6, 0xE6, 0xE6, 0xE7, 0xC2, 0xEE, 0xF3, 0x53, /* 0x80-0x83 */ + 0xBD, 0xBE, 0xE6, 0xE8, 0xC2, 0xE6, 0xBA, 0xA7, /* 0x84-0x87 */ + 0xE6, 0xE9, 0xF3, 0x54, 0xE6, 0xEA, 0xB3, 0xD2, /* 0x88-0x8B */ + 0xD1, 0xE9, 0xF3, 0x55, 0xF3, 0x56, 0xBF, 0xA5, /* 0x8C-0x8F */ + 0xE6, 0xEB, 0xC6, 0xEF, 0xE6, 0xEC, 0xE6, 0xED, /* 0x90-0x93 */ + 0xF3, 0x57, 0xF3, 0x58, 0xE6, 0xEE, 0xC6, 0xAD, /* 0x94-0x97 */ + 0xE6, 0xEF, 0xF3, 0x59, 0xC9, 0xA7, 0xE6, 0xF0, /* 0x98-0x9B */ + 0xE6, 0xF1, 0xE6, 0xF2, 0xE5, 0xB9, 0xE6, 0xF3, /* 0x9C-0x9F */ + 0xE6, 0xF4, 0xC2, 0xE2, 0xE6, 0xF5, 0xE6, 0xF6, /* 0xA0-0xA3 */ + 0xD6, 0xE8, 0xE6, 0xF7, 0xF3, 0x5A, 0xE6, 0xF8, /* 0xA4-0xA7 */ + 0xB9, 0xC7, 0xF3, 0x5B, 0xF3, 0x5C, 0xF3, 0x5D, /* 0xA8-0xAB */ + 0xF3, 0x5E, 0xF3, 0x5F, 0xF3, 0x60, 0xF3, 0x61, /* 0xAC-0xAF */ + 0xF7, 0xBB, 0xF7, 0xBA, 0xF3, 0x62, 0xF3, 0x63, /* 0xB0-0xB3 */ + 0xF3, 0x64, 0xF3, 0x65, 0xF7, 0xBE, 0xF7, 0xBC, /* 0xB4-0xB7 */ + 0xBA, 0xA1, 0xF3, 0x66, 0xF7, 0xBF, 0xF3, 0x67, /* 0xB8-0xBB */ + 0xF7, 0xC0, 0xF3, 0x68, 0xF3, 0x69, 0xF3, 0x6A, /* 0xBC-0xBF */ + 0xF7, 0xC2, 0xF7, 0xC1, 0xF7, 0xC4, 0xF3, 0x6B, /* 0xC0-0xC3 */ + 0xF3, 0x6C, 0xF7, 0xC3, 0xF3, 0x6D, 0xF3, 0x6E, /* 0xC4-0xC7 */ + 0xF3, 0x6F, 0xF3, 0x70, 0xF3, 0x71, 0xF7, 0xC5, /* 0xC8-0xCB */ + 0xF7, 0xC6, 0xF3, 0x72, 0xF3, 0x73, 0xF3, 0x74, /* 0xCC-0xCF */ + 0xF3, 0x75, 0xF7, 0xC7, 0xF3, 0x76, 0xCB, 0xE8, /* 0xD0-0xD3 */ + 0xF3, 0x77, 0xF3, 0x78, 0xF3, 0x79, 0xF3, 0x7A, /* 0xD4-0xD7 */ + 0xB8, 0xDF, 0xF3, 0x7B, 0xF3, 0x7C, 0xF3, 0x7D, /* 0xD8-0xDB */ + 0xF3, 0x7E, 0xF3, 0x80, 0xF3, 0x81, 0xF7, 0xD4, /* 0xDC-0xDF */ + 0xF3, 0x82, 0xF7, 0xD5, 0xF3, 0x83, 0xF3, 0x84, /* 0xE0-0xE3 */ + 0xF3, 0x85, 0xF3, 0x86, 0xF7, 0xD6, 0xF3, 0x87, /* 0xE4-0xE7 */ + 0xF3, 0x88, 0xF3, 0x89, 0xF3, 0x8A, 0xF7, 0xD8, /* 0xE8-0xEB */ + 0xF3, 0x8B, 0xF7, 0xDA, 0xF3, 0x8C, 0xF7, 0xD7, /* 0xEC-0xEF */ + 0xF3, 0x8D, 0xF3, 0x8E, 0xF3, 0x8F, 0xF3, 0x90, /* 0xF0-0xF3 */ + 0xF3, 0x91, 0xF3, 0x92, 0xF3, 0x93, 0xF3, 0x94, /* 0xF4-0xF7 */ + 0xF3, 0x95, 0xF7, 0xDB, 0xF3, 0x96, 0xF7, 0xD9, /* 0xF8-0xFB */ + 0xF3, 0x97, 0xF3, 0x98, 0xF3, 0x99, 0xF3, 0x9A, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9B[512] = { + 0xF3, 0x9B, 0xF3, 0x9C, 0xF3, 0x9D, 0xD7, 0xD7, /* 0x00-0x03 */ + 0xF3, 0x9E, 0xF3, 0x9F, 0xF3, 0xA0, 0xF4, 0x40, /* 0x04-0x07 */ + 0xF7, 0xDC, 0xF4, 0x41, 0xF4, 0x42, 0xF4, 0x43, /* 0x08-0x0B */ + 0xF4, 0x44, 0xF4, 0x45, 0xF4, 0x46, 0xF7, 0xDD, /* 0x0C-0x0F */ + 0xF4, 0x47, 0xF4, 0x48, 0xF4, 0x49, 0xF7, 0xDE, /* 0x10-0x13 */ + 0xF4, 0x4A, 0xF4, 0x4B, 0xF4, 0x4C, 0xF4, 0x4D, /* 0x14-0x17 */ + 0xF4, 0x4E, 0xF4, 0x4F, 0xF4, 0x50, 0xF4, 0x51, /* 0x18-0x1B */ + 0xF4, 0x52, 0xF4, 0x53, 0xF4, 0x54, 0xF7, 0xDF, /* 0x1C-0x1F */ + 0xF4, 0x55, 0xF4, 0x56, 0xF4, 0x57, 0xF7, 0xE0, /* 0x20-0x23 */ + 0xF4, 0x58, 0xF4, 0x59, 0xF4, 0x5A, 0xF4, 0x5B, /* 0x24-0x27 */ + 0xF4, 0x5C, 0xF4, 0x5D, 0xF4, 0x5E, 0xF4, 0x5F, /* 0x28-0x2B */ + 0xF4, 0x60, 0xF4, 0x61, 0xF4, 0x62, 0xDB, 0xCB, /* 0x2C-0x2F */ + 0xF4, 0x63, 0xF4, 0x64, 0xD8, 0xAA, 0xF4, 0x65, /* 0x30-0x33 */ + 0xF4, 0x66, 0xF4, 0x67, 0xF4, 0x68, 0xF4, 0x69, /* 0x34-0x37 */ + 0xF4, 0x6A, 0xF4, 0x6B, 0xF4, 0x6C, 0xE5, 0xF7, /* 0x38-0x3B */ + 0xB9, 0xED, 0xF4, 0x6D, 0xF4, 0x6E, 0xF4, 0x6F, /* 0x3C-0x3F */ + 0xF4, 0x70, 0xBF, 0xFD, 0xBB, 0xEA, 0xF7, 0xC9, /* 0x40-0x43 */ + 0xC6, 0xC7, 0xF7, 0xC8, 0xF4, 0x71, 0xF7, 0xCA, /* 0x44-0x47 */ + 0xF7, 0xCC, 0xF7, 0xCB, 0xF4, 0x72, 0xF4, 0x73, /* 0x48-0x4B */ + 0xF4, 0x74, 0xF7, 0xCD, 0xF4, 0x75, 0xCE, 0xBA, /* 0x4C-0x4F */ + 0xF4, 0x76, 0xF7, 0xCE, 0xF4, 0x77, 0xF4, 0x78, /* 0x50-0x53 */ + 0xC4, 0xA7, 0xF4, 0x79, 0xF4, 0x7A, 0xF4, 0x7B, /* 0x54-0x57 */ + 0xF4, 0x7C, 0xF4, 0x7D, 0xF4, 0x7E, 0xF4, 0x80, /* 0x58-0x5B */ + 0xF4, 0x81, 0xF4, 0x82, 0xF4, 0x83, 0xF4, 0x84, /* 0x5C-0x5F */ + 0xF4, 0x85, 0xF4, 0x86, 0xF4, 0x87, 0xF4, 0x88, /* 0x60-0x63 */ + 0xF4, 0x89, 0xF4, 0x8A, 0xF4, 0x8B, 0xF4, 0x8C, /* 0x64-0x67 */ + 0xF4, 0x8D, 0xF4, 0x8E, 0xF4, 0x8F, 0xF4, 0x90, /* 0x68-0x6B */ + 0xF4, 0x91, 0xF4, 0x92, 0xF4, 0x93, 0xF4, 0x94, /* 0x6C-0x6F */ + 0xF4, 0x95, 0xF4, 0x96, 0xF4, 0x97, 0xF4, 0x98, /* 0x70-0x73 */ + 0xF4, 0x99, 0xF4, 0x9A, 0xF4, 0x9B, 0xF4, 0x9C, /* 0x74-0x77 */ + 0xF4, 0x9D, 0xF4, 0x9E, 0xF4, 0x9F, 0xF4, 0xA0, /* 0x78-0x7B */ + 0xF5, 0x40, 0xF5, 0x41, 0xF5, 0x42, 0xF5, 0x43, /* 0x7C-0x7F */ + + 0xF5, 0x44, 0xF5, 0x45, 0xF5, 0x46, 0xF5, 0x47, /* 0x80-0x83 */ + 0xF5, 0x48, 0xF5, 0x49, 0xF5, 0x4A, 0xF5, 0x4B, /* 0x84-0x87 */ + 0xF5, 0x4C, 0xF5, 0x4D, 0xF5, 0x4E, 0xF5, 0x4F, /* 0x88-0x8B */ + 0xF5, 0x50, 0xF5, 0x51, 0xF5, 0x52, 0xF5, 0x53, /* 0x8C-0x8F */ + 0xF5, 0x54, 0xF5, 0x55, 0xF5, 0x56, 0xF5, 0x57, /* 0x90-0x93 */ + 0xF5, 0x58, 0xF5, 0x59, 0xF5, 0x5A, 0xF5, 0x5B, /* 0x94-0x97 */ + 0xF5, 0x5C, 0xF5, 0x5D, 0xF5, 0x5E, 0xF5, 0x5F, /* 0x98-0x9B */ + 0xF5, 0x60, 0xF5, 0x61, 0xF5, 0x62, 0xF5, 0x63, /* 0x9C-0x9F */ + 0xF5, 0x64, 0xF5, 0x65, 0xF5, 0x66, 0xF5, 0x67, /* 0xA0-0xA3 */ + 0xF5, 0x68, 0xF5, 0x69, 0xF5, 0x6A, 0xF5, 0x6B, /* 0xA4-0xA7 */ + 0xF5, 0x6C, 0xF5, 0x6D, 0xF5, 0x6E, 0xF5, 0x6F, /* 0xA8-0xAB */ + 0xF5, 0x70, 0xF5, 0x71, 0xF5, 0x72, 0xF5, 0x73, /* 0xAC-0xAF */ + 0xF5, 0x74, 0xF5, 0x75, 0xF5, 0x76, 0xF5, 0x77, /* 0xB0-0xB3 */ + 0xF5, 0x78, 0xF5, 0x79, 0xF5, 0x7A, 0xF5, 0x7B, /* 0xB4-0xB7 */ + 0xF5, 0x7C, 0xF5, 0x7D, 0xF5, 0x7E, 0xF5, 0x80, /* 0xB8-0xBB */ + 0xF5, 0x81, 0xF5, 0x82, 0xF5, 0x83, 0xF5, 0x84, /* 0xBC-0xBF */ + 0xF5, 0x85, 0xF5, 0x86, 0xF5, 0x87, 0xF5, 0x88, /* 0xC0-0xC3 */ + 0xF5, 0x89, 0xF5, 0x8A, 0xF5, 0x8B, 0xF5, 0x8C, /* 0xC4-0xC7 */ + 0xF5, 0x8D, 0xF5, 0x8E, 0xF5, 0x8F, 0xF5, 0x90, /* 0xC8-0xCB */ + 0xF5, 0x91, 0xF5, 0x92, 0xF5, 0x93, 0xF5, 0x94, /* 0xCC-0xCF */ + 0xF5, 0x95, 0xF5, 0x96, 0xF5, 0x97, 0xF5, 0x98, /* 0xD0-0xD3 */ + 0xF5, 0x99, 0xF5, 0x9A, 0xF5, 0x9B, 0xF5, 0x9C, /* 0xD4-0xD7 */ + 0xF5, 0x9D, 0xF5, 0x9E, 0xF5, 0x9F, 0xF5, 0xA0, /* 0xD8-0xDB */ + 0xF6, 0x40, 0xF6, 0x41, 0xF6, 0x42, 0xF6, 0x43, /* 0xDC-0xDF */ + 0xF6, 0x44, 0xF6, 0x45, 0xF6, 0x46, 0xF6, 0x47, /* 0xE0-0xE3 */ + 0xF6, 0x48, 0xF6, 0x49, 0xF6, 0x4A, 0xF6, 0x4B, /* 0xE4-0xE7 */ + 0xF6, 0x4C, 0xF6, 0x4D, 0xF6, 0x4E, 0xF6, 0x4F, /* 0xE8-0xEB */ + 0xF6, 0x50, 0xF6, 0x51, 0xF6, 0x52, 0xF6, 0x53, /* 0xEC-0xEF */ + 0xF6, 0x54, 0xF6, 0x55, 0xF6, 0x56, 0xF6, 0x57, /* 0xF0-0xF3 */ + 0xF6, 0x58, 0xF6, 0x59, 0xF6, 0x5A, 0xF6, 0x5B, /* 0xF4-0xF7 */ + 0xF6, 0x5C, 0xF6, 0x5D, 0xF6, 0x5E, 0xF6, 0x5F, /* 0xF8-0xFB */ + 0xF6, 0x60, 0xF6, 0x61, 0xF6, 0x62, 0xF6, 0x63, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9C[512] = { + 0xF6, 0x64, 0xF6, 0x65, 0xF6, 0x66, 0xF6, 0x67, /* 0x00-0x03 */ + 0xF6, 0x68, 0xF6, 0x69, 0xF6, 0x6A, 0xF6, 0x6B, /* 0x04-0x07 */ + 0xF6, 0x6C, 0xF6, 0x6D, 0xF6, 0x6E, 0xF6, 0x6F, /* 0x08-0x0B */ + 0xF6, 0x70, 0xF6, 0x71, 0xF6, 0x72, 0xF6, 0x73, /* 0x0C-0x0F */ + 0xF6, 0x74, 0xF6, 0x75, 0xF6, 0x76, 0xF6, 0x77, /* 0x10-0x13 */ + 0xF6, 0x78, 0xF6, 0x79, 0xF6, 0x7A, 0xF6, 0x7B, /* 0x14-0x17 */ + 0xF6, 0x7C, 0xF6, 0x7D, 0xF6, 0x7E, 0xF6, 0x80, /* 0x18-0x1B */ + 0xF6, 0x81, 0xF6, 0x82, 0xF6, 0x83, 0xF6, 0x84, /* 0x1C-0x1F */ + 0xF6, 0x85, 0xF6, 0x86, 0xF6, 0x87, 0xF6, 0x88, /* 0x20-0x23 */ + 0xF6, 0x89, 0xF6, 0x8A, 0xF6, 0x8B, 0xF6, 0x8C, /* 0x24-0x27 */ + 0xF6, 0x8D, 0xF6, 0x8E, 0xF6, 0x8F, 0xF6, 0x90, /* 0x28-0x2B */ + 0xF6, 0x91, 0xF6, 0x92, 0xF6, 0x93, 0xF6, 0x94, /* 0x2C-0x2F */ + 0xF6, 0x95, 0xF6, 0x96, 0xF6, 0x97, 0xF6, 0x98, /* 0x30-0x33 */ + 0xF6, 0x99, 0xF6, 0x9A, 0xF6, 0x9B, 0xF6, 0x9C, /* 0x34-0x37 */ + 0xF6, 0x9D, 0xF6, 0x9E, 0xF6, 0x9F, 0xF6, 0xA0, /* 0x38-0x3B */ + 0xF7, 0x40, 0xF7, 0x41, 0xF7, 0x42, 0xF7, 0x43, /* 0x3C-0x3F */ + 0xF7, 0x44, 0xF7, 0x45, 0xF7, 0x46, 0xF7, 0x47, /* 0x40-0x43 */ + 0xF7, 0x48, 0xF7, 0x49, 0xF7, 0x4A, 0xF7, 0x4B, /* 0x44-0x47 */ + 0xF7, 0x4C, 0xF7, 0x4D, 0xF7, 0x4E, 0xF7, 0x4F, /* 0x48-0x4B */ + 0xF7, 0x50, 0xF7, 0x51, 0xF7, 0x52, 0xF7, 0x53, /* 0x4C-0x4F */ + 0xF7, 0x54, 0xF7, 0x55, 0xF7, 0x56, 0xF7, 0x57, /* 0x50-0x53 */ + 0xF7, 0x58, 0xF7, 0x59, 0xF7, 0x5A, 0xF7, 0x5B, /* 0x54-0x57 */ + 0xF7, 0x5C, 0xF7, 0x5D, 0xF7, 0x5E, 0xF7, 0x5F, /* 0x58-0x5B */ + 0xF7, 0x60, 0xF7, 0x61, 0xF7, 0x62, 0xF7, 0x63, /* 0x5C-0x5F */ + 0xF7, 0x64, 0xF7, 0x65, 0xF7, 0x66, 0xF7, 0x67, /* 0x60-0x63 */ + 0xF7, 0x68, 0xF7, 0x69, 0xF7, 0x6A, 0xF7, 0x6B, /* 0x64-0x67 */ + 0xF7, 0x6C, 0xF7, 0x6D, 0xF7, 0x6E, 0xF7, 0x6F, /* 0x68-0x6B */ + 0xF7, 0x70, 0xF7, 0x71, 0xF7, 0x72, 0xF7, 0x73, /* 0x6C-0x6F */ + 0xF7, 0x74, 0xF7, 0x75, 0xF7, 0x76, 0xF7, 0x77, /* 0x70-0x73 */ + 0xF7, 0x78, 0xF7, 0x79, 0xF7, 0x7A, 0xF7, 0x7B, /* 0x74-0x77 */ + 0xF7, 0x7C, 0xF7, 0x7D, 0xF7, 0x7E, 0xF7, 0x80, /* 0x78-0x7B */ + 0xD3, 0xE3, 0xF7, 0x81, 0xF7, 0x82, 0xF6, 0xCF, /* 0x7C-0x7F */ + + 0xF7, 0x83, 0xC2, 0xB3, 0xF6, 0xD0, 0xF7, 0x84, /* 0x80-0x83 */ + 0xF7, 0x85, 0xF6, 0xD1, 0xF6, 0xD2, 0xF6, 0xD3, /* 0x84-0x87 */ + 0xF6, 0xD4, 0xF7, 0x86, 0xF7, 0x87, 0xF6, 0xD6, /* 0x88-0x8B */ + 0xF7, 0x88, 0xB1, 0xAB, 0xF6, 0xD7, 0xF7, 0x89, /* 0x8C-0x8F */ + 0xF6, 0xD8, 0xF6, 0xD9, 0xF6, 0xDA, 0xF7, 0x8A, /* 0x90-0x93 */ + 0xF6, 0xDB, 0xF6, 0xDC, 0xF7, 0x8B, 0xF7, 0x8C, /* 0x94-0x97 */ + 0xF7, 0x8D, 0xF7, 0x8E, 0xF6, 0xDD, 0xF6, 0xDE, /* 0x98-0x9B */ + 0xCF, 0xCA, 0xF7, 0x8F, 0xF6, 0xDF, 0xF6, 0xE0, /* 0x9C-0x9F */ + 0xF6, 0xE1, 0xF6, 0xE2, 0xF6, 0xE3, 0xF6, 0xE4, /* 0xA0-0xA3 */ + 0xC0, 0xF0, 0xF6, 0xE5, 0xF6, 0xE6, 0xF6, 0xE7, /* 0xA4-0xA7 */ + 0xF6, 0xE8, 0xF6, 0xE9, 0xF7, 0x90, 0xF6, 0xEA, /* 0xA8-0xAB */ + 0xF7, 0x91, 0xF6, 0xEB, 0xF6, 0xEC, 0xF7, 0x92, /* 0xAC-0xAF */ + 0xF6, 0xED, 0xF6, 0xEE, 0xF6, 0xEF, 0xF6, 0xF0, /* 0xB0-0xB3 */ + 0xF6, 0xF1, 0xF6, 0xF2, 0xF6, 0xF3, 0xF6, 0xF4, /* 0xB4-0xB7 */ + 0xBE, 0xA8, 0xF7, 0x93, 0xF6, 0xF5, 0xF6, 0xF6, /* 0xB8-0xBB */ + 0xF6, 0xF7, 0xF6, 0xF8, 0xF7, 0x94, 0xF7, 0x95, /* 0xBC-0xBF */ + 0xF7, 0x96, 0xF7, 0x97, 0xF7, 0x98, 0xC8, 0xFA, /* 0xC0-0xC3 */ + 0xF6, 0xF9, 0xF6, 0xFA, 0xF6, 0xFB, 0xF6, 0xFC, /* 0xC4-0xC7 */ + 0xF7, 0x99, 0xF7, 0x9A, 0xF6, 0xFD, 0xF6, 0xFE, /* 0xC8-0xCB */ + 0xF7, 0xA1, 0xF7, 0xA2, 0xF7, 0xA3, 0xF7, 0xA4, /* 0xCC-0xCF */ + 0xF7, 0xA5, 0xF7, 0x9B, 0xF7, 0x9C, 0xF7, 0xA6, /* 0xD0-0xD3 */ + 0xF7, 0xA7, 0xF7, 0xA8, 0xB1, 0xEE, 0xF7, 0xA9, /* 0xD4-0xD7 */ + 0xF7, 0xAA, 0xF7, 0xAB, 0xF7, 0x9D, 0xF7, 0x9E, /* 0xD8-0xDB */ + 0xF7, 0xAC, 0xF7, 0xAD, 0xC1, 0xDB, 0xF7, 0xAE, /* 0xDC-0xDF */ + 0xF7, 0x9F, 0xF7, 0xA0, 0xF7, 0xAF, 0xF8, 0x40, /* 0xE0-0xE3 */ + 0xF8, 0x41, 0xF8, 0x42, 0xF8, 0x43, 0xF8, 0x44, /* 0xE4-0xE7 */ + 0xF8, 0x45, 0xF8, 0x46, 0xF8, 0x47, 0xF8, 0x48, /* 0xE8-0xEB */ + 0xF8, 0x49, 0xF8, 0x4A, 0xF8, 0x4B, 0xF8, 0x4C, /* 0xEC-0xEF */ + 0xF8, 0x4D, 0xF8, 0x4E, 0xF8, 0x4F, 0xF8, 0x50, /* 0xF0-0xF3 */ + 0xF8, 0x51, 0xF8, 0x52, 0xF8, 0x53, 0xF8, 0x54, /* 0xF4-0xF7 */ + 0xF8, 0x55, 0xF8, 0x56, 0xF8, 0x57, 0xF8, 0x58, /* 0xF8-0xFB */ + 0xF8, 0x59, 0xF8, 0x5A, 0xF8, 0x5B, 0xF8, 0x5C, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9D[512] = { + 0xF8, 0x5D, 0xF8, 0x5E, 0xF8, 0x5F, 0xF8, 0x60, /* 0x00-0x03 */ + 0xF8, 0x61, 0xF8, 0x62, 0xF8, 0x63, 0xF8, 0x64, /* 0x04-0x07 */ + 0xF8, 0x65, 0xF8, 0x66, 0xF8, 0x67, 0xF8, 0x68, /* 0x08-0x0B */ + 0xF8, 0x69, 0xF8, 0x6A, 0xF8, 0x6B, 0xF8, 0x6C, /* 0x0C-0x0F */ + 0xF8, 0x6D, 0xF8, 0x6E, 0xF8, 0x6F, 0xF8, 0x70, /* 0x10-0x13 */ + 0xF8, 0x71, 0xF8, 0x72, 0xF8, 0x73, 0xF8, 0x74, /* 0x14-0x17 */ + 0xF8, 0x75, 0xF8, 0x76, 0xF8, 0x77, 0xF8, 0x78, /* 0x18-0x1B */ + 0xF8, 0x79, 0xF8, 0x7A, 0xF8, 0x7B, 0xF8, 0x7C, /* 0x1C-0x1F */ + 0xF8, 0x7D, 0xF8, 0x7E, 0xF8, 0x80, 0xF8, 0x81, /* 0x20-0x23 */ + 0xF8, 0x82, 0xF8, 0x83, 0xF8, 0x84, 0xF8, 0x85, /* 0x24-0x27 */ + 0xF8, 0x86, 0xF8, 0x87, 0xF8, 0x88, 0xF8, 0x89, /* 0x28-0x2B */ + 0xF8, 0x8A, 0xF8, 0x8B, 0xF8, 0x8C, 0xF8, 0x8D, /* 0x2C-0x2F */ + 0xF8, 0x8E, 0xF8, 0x8F, 0xF8, 0x90, 0xF8, 0x91, /* 0x30-0x33 */ + 0xF8, 0x92, 0xF8, 0x93, 0xF8, 0x94, 0xF8, 0x95, /* 0x34-0x37 */ + 0xF8, 0x96, 0xF8, 0x97, 0xF8, 0x98, 0xF8, 0x99, /* 0x38-0x3B */ + 0xF8, 0x9A, 0xF8, 0x9B, 0xF8, 0x9C, 0xF8, 0x9D, /* 0x3C-0x3F */ + 0xF8, 0x9E, 0xF8, 0x9F, 0xF8, 0xA0, 0xF9, 0x40, /* 0x40-0x43 */ + 0xF9, 0x41, 0xF9, 0x42, 0xF9, 0x43, 0xF9, 0x44, /* 0x44-0x47 */ + 0xF9, 0x45, 0xF9, 0x46, 0xF9, 0x47, 0xF9, 0x48, /* 0x48-0x4B */ + 0xF9, 0x49, 0xF9, 0x4A, 0xF9, 0x4B, 0xF9, 0x4C, /* 0x4C-0x4F */ + 0xF9, 0x4D, 0xF9, 0x4E, 0xF9, 0x4F, 0xF9, 0x50, /* 0x50-0x53 */ + 0xF9, 0x51, 0xF9, 0x52, 0xF9, 0x53, 0xF9, 0x54, /* 0x54-0x57 */ + 0xF9, 0x55, 0xF9, 0x56, 0xF9, 0x57, 0xF9, 0x58, /* 0x58-0x5B */ + 0xF9, 0x59, 0xF9, 0x5A, 0xF9, 0x5B, 0xF9, 0x5C, /* 0x5C-0x5F */ + 0xF9, 0x5D, 0xF9, 0x5E, 0xF9, 0x5F, 0xF9, 0x60, /* 0x60-0x63 */ + 0xF9, 0x61, 0xF9, 0x62, 0xF9, 0x63, 0xF9, 0x64, /* 0x64-0x67 */ + 0xF9, 0x65, 0xF9, 0x66, 0xF9, 0x67, 0xF9, 0x68, /* 0x68-0x6B */ + 0xF9, 0x69, 0xF9, 0x6A, 0xF9, 0x6B, 0xF9, 0x6C, /* 0x6C-0x6F */ + 0xF9, 0x6D, 0xF9, 0x6E, 0xF9, 0x6F, 0xF9, 0x70, /* 0x70-0x73 */ + 0xF9, 0x71, 0xF9, 0x72, 0xF9, 0x73, 0xF9, 0x74, /* 0x74-0x77 */ + 0xF9, 0x75, 0xF9, 0x76, 0xF9, 0x77, 0xF9, 0x78, /* 0x78-0x7B */ + 0xF9, 0x79, 0xF9, 0x7A, 0xF9, 0x7B, 0xF9, 0x7C, /* 0x7C-0x7F */ + + 0xF9, 0x7D, 0xF9, 0x7E, 0xF9, 0x80, 0xF9, 0x81, /* 0x80-0x83 */ + 0xF9, 0x82, 0xF9, 0x83, 0xF9, 0x84, 0xF9, 0x85, /* 0x84-0x87 */ + 0xF9, 0x86, 0xF9, 0x87, 0xF9, 0x88, 0xF9, 0x89, /* 0x88-0x8B */ + 0xF9, 0x8A, 0xF9, 0x8B, 0xF9, 0x8C, 0xF9, 0x8D, /* 0x8C-0x8F */ + 0xF9, 0x8E, 0xF9, 0x8F, 0xF9, 0x90, 0xF9, 0x91, /* 0x90-0x93 */ + 0xF9, 0x92, 0xF9, 0x93, 0xF9, 0x94, 0xF9, 0x95, /* 0x94-0x97 */ + 0xF9, 0x96, 0xF9, 0x97, 0xF9, 0x98, 0xF9, 0x99, /* 0x98-0x9B */ + 0xF9, 0x9A, 0xF9, 0x9B, 0xF9, 0x9C, 0xF9, 0x9D, /* 0x9C-0x9F */ + 0xF9, 0x9E, 0xF9, 0x9F, 0xF9, 0xA0, 0xFA, 0x40, /* 0xA0-0xA3 */ + 0xFA, 0x41, 0xFA, 0x42, 0xFA, 0x43, 0xFA, 0x44, /* 0xA4-0xA7 */ + 0xFA, 0x45, 0xFA, 0x46, 0xFA, 0x47, 0xFA, 0x48, /* 0xA8-0xAB */ + 0xFA, 0x49, 0xFA, 0x4A, 0xFA, 0x4B, 0xFA, 0x4C, /* 0xAC-0xAF */ + 0xFA, 0x4D, 0xFA, 0x4E, 0xFA, 0x4F, 0xFA, 0x50, /* 0xB0-0xB3 */ + 0xFA, 0x51, 0xFA, 0x52, 0xFA, 0x53, 0xFA, 0x54, /* 0xB4-0xB7 */ + 0xFA, 0x55, 0xFA, 0x56, 0xFA, 0x57, 0xFA, 0x58, /* 0xB8-0xBB */ + 0xFA, 0x59, 0xFA, 0x5A, 0xFA, 0x5B, 0xFA, 0x5C, /* 0xBC-0xBF */ + 0xFA, 0x5D, 0xFA, 0x5E, 0xFA, 0x5F, 0xFA, 0x60, /* 0xC0-0xC3 */ + 0xFA, 0x61, 0xFA, 0x62, 0xFA, 0x63, 0xFA, 0x64, /* 0xC4-0xC7 */ + 0xFA, 0x65, 0xFA, 0x66, 0xFA, 0x67, 0xFA, 0x68, /* 0xC8-0xCB */ + 0xFA, 0x69, 0xFA, 0x6A, 0xFA, 0x6B, 0xFA, 0x6C, /* 0xCC-0xCF */ + 0xFA, 0x6D, 0xFA, 0x6E, 0xFA, 0x6F, 0xFA, 0x70, /* 0xD0-0xD3 */ + 0xFA, 0x71, 0xFA, 0x72, 0xFA, 0x73, 0xFA, 0x74, /* 0xD4-0xD7 */ + 0xFA, 0x75, 0xFA, 0x76, 0xFA, 0x77, 0xFA, 0x78, /* 0xD8-0xDB */ + 0xFA, 0x79, 0xFA, 0x7A, 0xFA, 0x7B, 0xFA, 0x7C, /* 0xDC-0xDF */ + 0xFA, 0x7D, 0xFA, 0x7E, 0xFA, 0x80, 0xFA, 0x81, /* 0xE0-0xE3 */ + 0xFA, 0x82, 0xFA, 0x83, 0xFA, 0x84, 0xFA, 0x85, /* 0xE4-0xE7 */ + 0xFA, 0x86, 0xFA, 0x87, 0xFA, 0x88, 0xFA, 0x89, /* 0xE8-0xEB */ + 0xFA, 0x8A, 0xFA, 0x8B, 0xFA, 0x8C, 0xFA, 0x8D, /* 0xEC-0xEF */ + 0xFA, 0x8E, 0xFA, 0x8F, 0xFA, 0x90, 0xFA, 0x91, /* 0xF0-0xF3 */ + 0xFA, 0x92, 0xFA, 0x93, 0xFA, 0x94, 0xFA, 0x95, /* 0xF4-0xF7 */ + 0xFA, 0x96, 0xFA, 0x97, 0xFA, 0x98, 0xFA, 0x99, /* 0xF8-0xFB */ + 0xFA, 0x9A, 0xFA, 0x9B, 0xFA, 0x9C, 0xFA, 0x9D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9E[512] = { + 0xFA, 0x9E, 0xFA, 0x9F, 0xFA, 0xA0, 0xFB, 0x40, /* 0x00-0x03 */ + 0xFB, 0x41, 0xFB, 0x42, 0xFB, 0x43, 0xFB, 0x44, /* 0x04-0x07 */ + 0xFB, 0x45, 0xFB, 0x46, 0xFB, 0x47, 0xFB, 0x48, /* 0x08-0x0B */ + 0xFB, 0x49, 0xFB, 0x4A, 0xFB, 0x4B, 0xFB, 0x4C, /* 0x0C-0x0F */ + 0xFB, 0x4D, 0xFB, 0x4E, 0xFB, 0x4F, 0xFB, 0x50, /* 0x10-0x13 */ + 0xFB, 0x51, 0xFB, 0x52, 0xFB, 0x53, 0xFB, 0x54, /* 0x14-0x17 */ + 0xFB, 0x55, 0xFB, 0x56, 0xFB, 0x57, 0xFB, 0x58, /* 0x18-0x1B */ + 0xFB, 0x59, 0xFB, 0x5A, 0xFB, 0x5B, 0xC4, 0xF1, /* 0x1C-0x1F */ + 0xF0, 0xAF, 0xBC, 0xA6, 0xF0, 0xB0, 0xC3, 0xF9, /* 0x20-0x23 */ + 0xFB, 0x5C, 0xC5, 0xB8, 0xD1, 0xBB, 0xFB, 0x5D, /* 0x24-0x27 */ + 0xF0, 0xB1, 0xF0, 0xB2, 0xF0, 0xB3, 0xF0, 0xB4, /* 0x28-0x2B */ + 0xF0, 0xB5, 0xD1, 0xBC, 0xFB, 0x5E, 0xD1, 0xEC, /* 0x2C-0x2F */ + 0xFB, 0x5F, 0xF0, 0xB7, 0xF0, 0xB6, 0xD4, 0xA7, /* 0x30-0x33 */ + 0xFB, 0x60, 0xCD, 0xD2, 0xF0, 0xB8, 0xF0, 0xBA, /* 0x34-0x37 */ + 0xF0, 0xB9, 0xF0, 0xBB, 0xF0, 0xBC, 0xFB, 0x61, /* 0x38-0x3B */ + 0xFB, 0x62, 0xB8, 0xEB, 0xF0, 0xBD, 0xBA, 0xE8, /* 0x3C-0x3F */ + 0xFB, 0x63, 0xF0, 0xBE, 0xF0, 0xBF, 0xBE, 0xE9, /* 0x40-0x43 */ + 0xF0, 0xC0, 0xB6, 0xEC, 0xF0, 0xC1, 0xF0, 0xC2, /* 0x44-0x47 */ + 0xF0, 0xC3, 0xF0, 0xC4, 0xC8, 0xB5, 0xF0, 0xC5, /* 0x48-0x4B */ + 0xF0, 0xC6, 0xFB, 0x64, 0xF0, 0xC7, 0xC5, 0xF4, /* 0x4C-0x4F */ + 0xFB, 0x65, 0xF0, 0xC8, 0xFB, 0x66, 0xFB, 0x67, /* 0x50-0x53 */ + 0xFB, 0x68, 0xF0, 0xC9, 0xFB, 0x69, 0xF0, 0xCA, /* 0x54-0x57 */ + 0xF7, 0xBD, 0xFB, 0x6A, 0xF0, 0xCB, 0xF0, 0xCC, /* 0x58-0x5B */ + 0xF0, 0xCD, 0xFB, 0x6B, 0xF0, 0xCE, 0xFB, 0x6C, /* 0x5C-0x5F */ + 0xFB, 0x6D, 0xFB, 0x6E, 0xFB, 0x6F, 0xF0, 0xCF, /* 0x60-0x63 */ + 0xBA, 0xD7, 0xFB, 0x70, 0xF0, 0xD0, 0xF0, 0xD1, /* 0x64-0x67 */ + 0xF0, 0xD2, 0xF0, 0xD3, 0xF0, 0xD4, 0xF0, 0xD5, /* 0x68-0x6B */ + 0xF0, 0xD6, 0xF0, 0xD8, 0xFB, 0x71, 0xFB, 0x72, /* 0x6C-0x6F */ + 0xD3, 0xA5, 0xF0, 0xD7, 0xFB, 0x73, 0xF0, 0xD9, /* 0x70-0x73 */ + 0xFB, 0x74, 0xFB, 0x75, 0xFB, 0x76, 0xFB, 0x77, /* 0x74-0x77 */ + 0xFB, 0x78, 0xFB, 0x79, 0xFB, 0x7A, 0xFB, 0x7B, /* 0x78-0x7B */ + 0xFB, 0x7C, 0xFB, 0x7D, 0xF5, 0xBA, 0xC2, 0xB9, /* 0x7C-0x7F */ + + 0xFB, 0x7E, 0xFB, 0x80, 0xF7, 0xE4, 0xFB, 0x81, /* 0x80-0x83 */ + 0xFB, 0x82, 0xFB, 0x83, 0xFB, 0x84, 0xF7, 0xE5, /* 0x84-0x87 */ + 0xF7, 0xE6, 0xFB, 0x85, 0xFB, 0x86, 0xF7, 0xE7, /* 0x88-0x8B */ + 0xFB, 0x87, 0xFB, 0x88, 0xFB, 0x89, 0xFB, 0x8A, /* 0x8C-0x8F */ + 0xFB, 0x8B, 0xFB, 0x8C, 0xF7, 0xE8, 0xC2, 0xB4, /* 0x90-0x93 */ + 0xFB, 0x8D, 0xFB, 0x8E, 0xFB, 0x8F, 0xFB, 0x90, /* 0x94-0x97 */ + 0xFB, 0x91, 0xFB, 0x92, 0xFB, 0x93, 0xFB, 0x94, /* 0x98-0x9B */ + 0xFB, 0x95, 0xF7, 0xEA, 0xFB, 0x96, 0xF7, 0xEB, /* 0x9C-0x9F */ + 0xFB, 0x97, 0xFB, 0x98, 0xFB, 0x99, 0xFB, 0x9A, /* 0xA0-0xA3 */ + 0xFB, 0x9B, 0xFB, 0x9C, 0xC2, 0xF3, 0xFB, 0x9D, /* 0xA4-0xA7 */ + 0xFB, 0x9E, 0xFB, 0x9F, 0xFB, 0xA0, 0xFC, 0x40, /* 0xA8-0xAB */ + 0xFC, 0x41, 0xFC, 0x42, 0xFC, 0x43, 0xFC, 0x44, /* 0xAC-0xAF */ + 0xFC, 0x45, 0xFC, 0x46, 0xFC, 0x47, 0xFC, 0x48, /* 0xB0-0xB3 */ + 0xF4, 0xF0, 0xFC, 0x49, 0xFC, 0x4A, 0xFC, 0x4B, /* 0xB4-0xB7 */ + 0xF4, 0xEF, 0xFC, 0x4C, 0xFC, 0x4D, 0xC2, 0xE9, /* 0xB8-0xBB */ + 0xFC, 0x4E, 0xF7, 0xE1, 0xF7, 0xE2, 0xFC, 0x4F, /* 0xBC-0xBF */ + 0xFC, 0x50, 0xFC, 0x51, 0xFC, 0x52, 0xFC, 0x53, /* 0xC0-0xC3 */ + 0xBB, 0xC6, 0xFC, 0x54, 0xFC, 0x55, 0xFC, 0x56, /* 0xC4-0xC7 */ + 0xFC, 0x57, 0xD9, 0xE4, 0xFC, 0x58, 0xFC, 0x59, /* 0xC8-0xCB */ + 0xFC, 0x5A, 0xCA, 0xF2, 0xC0, 0xE8, 0xF0, 0xA4, /* 0xCC-0xCF */ + 0xFC, 0x5B, 0xBA, 0xDA, 0xFC, 0x5C, 0xFC, 0x5D, /* 0xD0-0xD3 */ + 0xC7, 0xAD, 0xFC, 0x5E, 0xFC, 0x5F, 0xFC, 0x60, /* 0xD4-0xD7 */ + 0xC4, 0xAC, 0xFC, 0x61, 0xFC, 0x62, 0xF7, 0xEC, /* 0xD8-0xDB */ + 0xF7, 0xED, 0xF7, 0xEE, 0xFC, 0x63, 0xF7, 0xF0, /* 0xDC-0xDF */ + 0xF7, 0xEF, 0xFC, 0x64, 0xF7, 0xF1, 0xFC, 0x65, /* 0xE0-0xE3 */ + 0xFC, 0x66, 0xF7, 0xF4, 0xFC, 0x67, 0xF7, 0xF3, /* 0xE4-0xE7 */ + 0xFC, 0x68, 0xF7, 0xF2, 0xF7, 0xF5, 0xFC, 0x69, /* 0xE8-0xEB */ + 0xFC, 0x6A, 0xFC, 0x6B, 0xFC, 0x6C, 0xF7, 0xF6, /* 0xEC-0xEF */ + 0xFC, 0x6D, 0xFC, 0x6E, 0xFC, 0x6F, 0xFC, 0x70, /* 0xF0-0xF3 */ + 0xFC, 0x71, 0xFC, 0x72, 0xFC, 0x73, 0xFC, 0x74, /* 0xF4-0xF7 */ + 0xFC, 0x75, 0xED, 0xE9, 0xFC, 0x76, 0xED, 0xEA, /* 0xF8-0xFB */ + 0xED, 0xEB, 0xFC, 0x77, 0xF6, 0xBC, 0xFC, 0x78, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9F[512] = { + 0xFC, 0x79, 0xFC, 0x7A, 0xFC, 0x7B, 0xFC, 0x7C, /* 0x00-0x03 */ + 0xFC, 0x7D, 0xFC, 0x7E, 0xFC, 0x80, 0xFC, 0x81, /* 0x04-0x07 */ + 0xFC, 0x82, 0xFC, 0x83, 0xFC, 0x84, 0xF6, 0xBD, /* 0x08-0x0B */ + 0xFC, 0x85, 0xF6, 0xBE, 0xB6, 0xA6, 0xFC, 0x86, /* 0x0C-0x0F */ + 0xD8, 0xBE, 0xFC, 0x87, 0xFC, 0x88, 0xB9, 0xC4, /* 0x10-0x13 */ + 0xFC, 0x89, 0xFC, 0x8A, 0xFC, 0x8B, 0xD8, 0xBB, /* 0x14-0x17 */ + 0xFC, 0x8C, 0xDC, 0xB1, 0xFC, 0x8D, 0xFC, 0x8E, /* 0x18-0x1B */ + 0xFC, 0x8F, 0xFC, 0x90, 0xFC, 0x91, 0xFC, 0x92, /* 0x1C-0x1F */ + 0xCA, 0xF3, 0xFC, 0x93, 0xF7, 0xF7, 0xFC, 0x94, /* 0x20-0x23 */ + 0xFC, 0x95, 0xFC, 0x96, 0xFC, 0x97, 0xFC, 0x98, /* 0x24-0x27 */ + 0xFC, 0x99, 0xFC, 0x9A, 0xFC, 0x9B, 0xFC, 0x9C, /* 0x28-0x2B */ + 0xF7, 0xF8, 0xFC, 0x9D, 0xFC, 0x9E, 0xF7, 0xF9, /* 0x2C-0x2F */ + 0xFC, 0x9F, 0xFC, 0xA0, 0xFD, 0x40, 0xFD, 0x41, /* 0x30-0x33 */ + 0xFD, 0x42, 0xFD, 0x43, 0xFD, 0x44, 0xF7, 0xFB, /* 0x34-0x37 */ + 0xFD, 0x45, 0xF7, 0xFA, 0xFD, 0x46, 0xB1, 0xC7, /* 0x38-0x3B */ + 0xFD, 0x47, 0xF7, 0xFC, 0xF7, 0xFD, 0xFD, 0x48, /* 0x3C-0x3F */ + 0xFD, 0x49, 0xFD, 0x4A, 0xFD, 0x4B, 0xFD, 0x4C, /* 0x40-0x43 */ + 0xF7, 0xFE, 0xFD, 0x4D, 0xFD, 0x4E, 0xFD, 0x4F, /* 0x44-0x47 */ + 0xFD, 0x50, 0xFD, 0x51, 0xFD, 0x52, 0xFD, 0x53, /* 0x48-0x4B */ + 0xFD, 0x54, 0xFD, 0x55, 0xFD, 0x56, 0xFD, 0x57, /* 0x4C-0x4F */ + 0xC6, 0xEB, 0xEC, 0xB4, 0xFD, 0x58, 0xFD, 0x59, /* 0x50-0x53 */ + 0xFD, 0x5A, 0xFD, 0x5B, 0xFD, 0x5C, 0xFD, 0x5D, /* 0x54-0x57 */ + 0xFD, 0x5E, 0xFD, 0x5F, 0xFD, 0x60, 0xFD, 0x61, /* 0x58-0x5B */ + 0xFD, 0x62, 0xFD, 0x63, 0xFD, 0x64, 0xFD, 0x65, /* 0x5C-0x5F */ + 0xFD, 0x66, 0xFD, 0x67, 0xFD, 0x68, 0xFD, 0x69, /* 0x60-0x63 */ + 0xFD, 0x6A, 0xFD, 0x6B, 0xFD, 0x6C, 0xFD, 0x6D, /* 0x64-0x67 */ + 0xFD, 0x6E, 0xFD, 0x6F, 0xFD, 0x70, 0xFD, 0x71, /* 0x68-0x6B */ + 0xFD, 0x72, 0xFD, 0x73, 0xFD, 0x74, 0xFD, 0x75, /* 0x6C-0x6F */ + 0xFD, 0x76, 0xFD, 0x77, 0xFD, 0x78, 0xFD, 0x79, /* 0x70-0x73 */ + 0xFD, 0x7A, 0xFD, 0x7B, 0xFD, 0x7C, 0xFD, 0x7D, /* 0x74-0x77 */ + 0xFD, 0x7E, 0xFD, 0x80, 0xFD, 0x81, 0xFD, 0x82, /* 0x78-0x7B */ + 0xFD, 0x83, 0xFD, 0x84, 0xFD, 0x85, 0xB3, 0xDD, /* 0x7C-0x7F */ + + 0xF6, 0xB3, 0xFD, 0x86, 0xFD, 0x87, 0xF6, 0xB4, /* 0x80-0x83 */ + 0xC1, 0xE4, 0xF6, 0xB5, 0xF6, 0xB6, 0xF6, 0xB7, /* 0x84-0x87 */ + 0xF6, 0xB8, 0xF6, 0xB9, 0xF6, 0xBA, 0xC8, 0xA3, /* 0x88-0x8B */ + 0xF6, 0xBB, 0xFD, 0x88, 0xFD, 0x89, 0xFD, 0x8A, /* 0x8C-0x8F */ + 0xFD, 0x8B, 0xFD, 0x8C, 0xFD, 0x8D, 0xFD, 0x8E, /* 0x90-0x93 */ + 0xFD, 0x8F, 0xFD, 0x90, 0xFD, 0x91, 0xFD, 0x92, /* 0x94-0x97 */ + 0xFD, 0x93, 0xC1, 0xFA, 0xB9, 0xA8, 0xED, 0xE8, /* 0x98-0x9B */ + 0xFD, 0x94, 0xFD, 0x95, 0xFD, 0x96, 0xB9, 0xEA, /* 0x9C-0x9F */ + 0xD9, 0xDF, 0xFD, 0x97, 0xFD, 0x98, 0xFD, 0x99, /* 0xA0-0xA3 */ + 0xFD, 0x9A, 0xFD, 0x9B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_F9[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xFD, 0x9C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xFD, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xFD, 0x9E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0x9F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xFD, 0xA0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FA[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xFE, 0x40, 0xFE, 0x41, 0xFE, 0x42, 0xFE, 0x43, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xFE, 0x44, 0x3F, 0x3F, 0xFE, 0x45, /* 0x10-0x13 */ + 0xFE, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xFE, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFE, 0x48, /* 0x1C-0x1F */ + 0xFE, 0x49, 0xFE, 0x4A, 0x3F, 0x3F, 0xFE, 0x4B, /* 0x20-0x23 */ + 0xFE, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0xFE, 0x4D, /* 0x24-0x27 */ + 0xFE, 0x4E, 0xFE, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FE[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xA9, 0x55, 0xA6, 0xF2, 0x3F, 0x3F, 0xA6, 0xF4, /* 0x30-0x33 */ + 0xA6, 0xF5, 0xA6, 0xE0, 0xA6, 0xE1, 0xA6, 0xF0, /* 0x34-0x37 */ + 0xA6, 0xF1, 0xA6, 0xE2, 0xA6, 0xE3, 0xA6, 0xEE, /* 0x38-0x3B */ + 0xA6, 0xEF, 0xA6, 0xE6, 0xA6, 0xE7, 0xA6, 0xE4, /* 0x3C-0x3F */ + 0xA6, 0xE5, 0xA6, 0xE8, 0xA6, 0xE9, 0xA6, 0xEA, /* 0x40-0x43 */ + 0xA6, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xA9, 0x68, 0xA9, 0x69, 0xA9, 0x6A, /* 0x48-0x4B */ + 0xA9, 0x6B, 0xA9, 0x6C, 0xA9, 0x6D, 0xA9, 0x6E, /* 0x4C-0x4F */ + 0xA9, 0x6F, 0xA9, 0x70, 0xA9, 0x71, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xA9, 0x72, 0xA9, 0x73, 0xA9, 0x74, 0xA9, 0x75, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xA9, 0x76, 0xA9, 0x77, 0xA9, 0x78, /* 0x58-0x5B */ + 0xA9, 0x79, 0xA9, 0x7A, 0xA9, 0x7B, 0xA9, 0x7C, /* 0x5C-0x5F */ + 0xA9, 0x7D, 0xA9, 0x7E, 0xA9, 0x80, 0xA9, 0x81, /* 0x60-0x63 */ + 0xA9, 0x82, 0xA9, 0x83, 0xA9, 0x84, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xA9, 0x85, 0xA9, 0x86, 0xA9, 0x87, 0xA9, 0x88, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FF[512] = { + 0x3F, 0x3F, 0xA3, 0xA1, 0xA3, 0xA2, 0xA3, 0xA3, /* 0x00-0x03 */ + 0xA1, 0xE7, 0xA3, 0xA5, 0xA3, 0xA6, 0xA3, 0xA7, /* 0x04-0x07 */ + 0xA3, 0xA8, 0xA3, 0xA9, 0xA3, 0xAA, 0xA3, 0xAB, /* 0x08-0x0B */ + 0xA3, 0xAC, 0xA3, 0xAD, 0xA3, 0xAE, 0xA3, 0xAF, /* 0x0C-0x0F */ + 0xA3, 0xB0, 0xA3, 0xB1, 0xA3, 0xB2, 0xA3, 0xB3, /* 0x10-0x13 */ + 0xA3, 0xB4, 0xA3, 0xB5, 0xA3, 0xB6, 0xA3, 0xB7, /* 0x14-0x17 */ + 0xA3, 0xB8, 0xA3, 0xB9, 0xA3, 0xBA, 0xA3, 0xBB, /* 0x18-0x1B */ + 0xA3, 0xBC, 0xA3, 0xBD, 0xA3, 0xBE, 0xA3, 0xBF, /* 0x1C-0x1F */ + 0xA3, 0xC0, 0xA3, 0xC1, 0xA3, 0xC2, 0xA3, 0xC3, /* 0x20-0x23 */ + 0xA3, 0xC4, 0xA3, 0xC5, 0xA3, 0xC6, 0xA3, 0xC7, /* 0x24-0x27 */ + 0xA3, 0xC8, 0xA3, 0xC9, 0xA3, 0xCA, 0xA3, 0xCB, /* 0x28-0x2B */ + 0xA3, 0xCC, 0xA3, 0xCD, 0xA3, 0xCE, 0xA3, 0xCF, /* 0x2C-0x2F */ + 0xA3, 0xD0, 0xA3, 0xD1, 0xA3, 0xD2, 0xA3, 0xD3, /* 0x30-0x33 */ + 0xA3, 0xD4, 0xA3, 0xD5, 0xA3, 0xD6, 0xA3, 0xD7, /* 0x34-0x37 */ + 0xA3, 0xD8, 0xA3, 0xD9, 0xA3, 0xDA, 0xA3, 0xDB, /* 0x38-0x3B */ + 0xA3, 0xDC, 0xA3, 0xDD, 0xA3, 0xDE, 0xA3, 0xDF, /* 0x3C-0x3F */ + 0xA3, 0xE0, 0xA3, 0xE1, 0xA3, 0xE2, 0xA3, 0xE3, /* 0x40-0x43 */ + 0xA3, 0xE4, 0xA3, 0xE5, 0xA3, 0xE6, 0xA3, 0xE7, /* 0x44-0x47 */ + 0xA3, 0xE8, 0xA3, 0xE9, 0xA3, 0xEA, 0xA3, 0xEB, /* 0x48-0x4B */ + 0xA3, 0xEC, 0xA3, 0xED, 0xA3, 0xEE, 0xA3, 0xEF, /* 0x4C-0x4F */ + 0xA3, 0xF0, 0xA3, 0xF1, 0xA3, 0xF2, 0xA3, 0xF3, /* 0x50-0x53 */ + 0xA3, 0xF4, 0xA3, 0xF5, 0xA3, 0xF6, 0xA3, 0xF7, /* 0x54-0x57 */ + 0xA3, 0xF8, 0xA3, 0xF9, 0xA3, 0xFA, 0xA3, 0xFB, /* 0x58-0x5B */ + 0xA3, 0xFC, 0xA3, 0xFD, 0xA1, 0xAB, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xA1, 0xE9, 0xA1, 0xEA, 0xA9, 0x56, 0xA3, 0xFE, /* 0xE0-0xE3 */ + 0xA9, 0x57, 0xA3, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char *page_uni2charset[256] = { + NULL, u2c_01, u2c_02, u2c_03, u2c_04, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u2c_20, u2c_21, u2c_22, u2c_23, u2c_24, u2c_25, u2c_26, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u2c_30, u2c_31, u2c_32, u2c_33, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u2c_4E, u2c_4F, + u2c_50, u2c_51, u2c_52, u2c_53, u2c_54, u2c_55, u2c_56, u2c_57, + u2c_58, u2c_59, u2c_5A, u2c_5B, u2c_5C, u2c_5D, u2c_5E, u2c_5F, + u2c_60, u2c_61, u2c_62, u2c_63, u2c_64, u2c_65, u2c_66, u2c_67, + u2c_68, u2c_69, u2c_6A, u2c_6B, u2c_6C, u2c_6D, u2c_6E, u2c_6F, + u2c_70, u2c_71, u2c_72, u2c_73, u2c_74, u2c_75, u2c_76, u2c_77, + u2c_78, u2c_79, u2c_7A, u2c_7B, u2c_7C, u2c_7D, u2c_7E, u2c_7F, + u2c_80, u2c_81, u2c_82, u2c_83, u2c_84, u2c_85, u2c_86, u2c_87, + u2c_88, u2c_89, u2c_8A, u2c_8B, u2c_8C, u2c_8D, u2c_8E, u2c_8F, + u2c_90, u2c_91, u2c_92, u2c_93, u2c_94, u2c_95, u2c_96, u2c_97, + u2c_98, u2c_99, u2c_9A, u2c_9B, u2c_9C, u2c_9D, u2c_9E, u2c_9F, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, u2c_F9, u2c_FA, NULL, NULL, NULL, u2c_FE, u2c_FF, }; + +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + uni2charset = page_uni2charset[ch]; + *outlen = 0; + if (uni2charset){ + if (boundlen <= 1) + return; + out[0] = uni2charset[cl*2]; + out[1] = uni2charset[cl*2+1]; + *outlen = 1; + } else if (ch==0 && cl) + out[0] = cl; + else + out[0] = '?'; + (*outlen)++; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + unsigned char ch, cl; + struct nls_unicode *charset2uni; + + ch = rawstring[0]; + cl = rawstring[1]; + charset2uni = page_charset2uni[ch]; + if (charset2uni && cl){ + *uni1 = charset2uni[cl].uni2; + *uni2 = charset2uni[cl].uni1; + *offset = 2; + } else{ + *uni1 = ch; + *uni2 = 0x00; + *offset = 1; + } + return; +} + +static void inc_use_count(void) +{ + MOD_INC_USE_COUNT; +} + +static void dec_use_count(void) +{ + MOD_DEC_USE_COUNT; +} + +static struct nls_table table = { + "cp936", + uni2char, + char2uni, + inc_use_count, + dec_use_count, + NULL +}; + +int __init init_nls_cp936(void) +{ + return register_nls(&table); +} + +#ifdef MODULE +int init_module(void) +{ + return init_nls_cp936(); +} + + +void cleanup_module(void) +{ + unregister_nls(&table); + 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: 8 + * c-brace-imaginary-offset: 0 + * c-brace-offset: -8 + * c-argdecl-indent: 8 + * c-label-offset: -8 + * c-continued-statement-offset: 8 + * c-continued-brace-offset: 0 + * End: + */ diff -urN v2.2.15/linux/fs/nls/nls_cp949.c linux/fs/nls/nls_cp949.c --- v2.2.15/linux/fs/nls/nls_cp949.c Wed Dec 31 16:00:00 1969 +++ linux/fs/nls/nls_cp949.c Wed Jun 7 14:26:44 2000 @@ -0,0 +1,18403 @@ +/* + * linux/fs/nls_cp949.c + * + * Charset cp949 translation tables. + * Generated automatically from the Microsoft + */ + +#include +#include +#include +#include +#include + +static struct nls_unicode c2u_81[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xAC, 0x02}, {0xAC, 0x03}, {0xAC, 0x05}, /* 0x40-0x43 */ + {0xAC, 0x06}, {0xAC, 0x0B}, {0xAC, 0x0C}, {0xAC, 0x0D}, /* 0x44-0x47 */ + {0xAC, 0x0E}, {0xAC, 0x0F}, {0xAC, 0x18}, {0xAC, 0x1E}, /* 0x48-0x4B */ + {0xAC, 0x1F}, {0xAC, 0x21}, {0xAC, 0x22}, {0xAC, 0x23}, /* 0x4C-0x4F */ + {0xAC, 0x25}, {0xAC, 0x26}, {0xAC, 0x27}, {0xAC, 0x28}, /* 0x50-0x53 */ + {0xAC, 0x29}, {0xAC, 0x2A}, {0xAC, 0x2B}, {0xAC, 0x2E}, /* 0x54-0x57 */ + {0xAC, 0x32}, {0xAC, 0x33}, {0xAC, 0x34}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xAC, 0x35}, {0xAC, 0x36}, {0xAC, 0x37}, /* 0x60-0x63 */ + {0xAC, 0x3A}, {0xAC, 0x3B}, {0xAC, 0x3D}, {0xAC, 0x3E}, /* 0x64-0x67 */ + {0xAC, 0x3F}, {0xAC, 0x41}, {0xAC, 0x42}, {0xAC, 0x43}, /* 0x68-0x6B */ + {0xAC, 0x44}, {0xAC, 0x45}, {0xAC, 0x46}, {0xAC, 0x47}, /* 0x6C-0x6F */ + {0xAC, 0x48}, {0xAC, 0x49}, {0xAC, 0x4A}, {0xAC, 0x4C}, /* 0x70-0x73 */ + {0xAC, 0x4E}, {0xAC, 0x4F}, {0xAC, 0x50}, {0xAC, 0x51}, /* 0x74-0x77 */ + {0xAC, 0x52}, {0xAC, 0x53}, {0xAC, 0x55}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xAC, 0x56}, {0xAC, 0x57}, {0xAC, 0x59}, /* 0x80-0x83 */ + {0xAC, 0x5A}, {0xAC, 0x5B}, {0xAC, 0x5D}, {0xAC, 0x5E}, /* 0x84-0x87 */ + {0xAC, 0x5F}, {0xAC, 0x60}, {0xAC, 0x61}, {0xAC, 0x62}, /* 0x88-0x8B */ + {0xAC, 0x63}, {0xAC, 0x64}, {0xAC, 0x65}, {0xAC, 0x66}, /* 0x8C-0x8F */ + {0xAC, 0x67}, {0xAC, 0x68}, {0xAC, 0x69}, {0xAC, 0x6A}, /* 0x90-0x93 */ + {0xAC, 0x6B}, {0xAC, 0x6C}, {0xAC, 0x6D}, {0xAC, 0x6E}, /* 0x94-0x97 */ + {0xAC, 0x6F}, {0xAC, 0x72}, {0xAC, 0x73}, {0xAC, 0x75}, /* 0x98-0x9B */ + {0xAC, 0x76}, {0xAC, 0x79}, {0xAC, 0x7B}, {0xAC, 0x7C}, /* 0x9C-0x9F */ + {0xAC, 0x7D}, {0xAC, 0x7E}, {0xAC, 0x7F}, {0xAC, 0x82}, /* 0xA0-0xA3 */ + {0xAC, 0x87}, {0xAC, 0x88}, {0xAC, 0x8D}, {0xAC, 0x8E}, /* 0xA4-0xA7 */ + {0xAC, 0x8F}, {0xAC, 0x91}, {0xAC, 0x92}, {0xAC, 0x93}, /* 0xA8-0xAB */ + {0xAC, 0x95}, {0xAC, 0x96}, {0xAC, 0x97}, {0xAC, 0x98}, /* 0xAC-0xAF */ + {0xAC, 0x99}, {0xAC, 0x9A}, {0xAC, 0x9B}, {0xAC, 0x9E}, /* 0xB0-0xB3 */ + {0xAC, 0xA2}, {0xAC, 0xA3}, {0xAC, 0xA4}, {0xAC, 0xA5}, /* 0xB4-0xB7 */ + {0xAC, 0xA6}, {0xAC, 0xA7}, {0xAC, 0xAB}, {0xAC, 0xAD}, /* 0xB8-0xBB */ + {0xAC, 0xAE}, {0xAC, 0xB1}, {0xAC, 0xB2}, {0xAC, 0xB3}, /* 0xBC-0xBF */ + {0xAC, 0xB4}, {0xAC, 0xB5}, {0xAC, 0xB6}, {0xAC, 0xB7}, /* 0xC0-0xC3 */ + {0xAC, 0xBA}, {0xAC, 0xBE}, {0xAC, 0xBF}, {0xAC, 0xC0}, /* 0xC4-0xC7 */ + {0xAC, 0xC2}, {0xAC, 0xC3}, {0xAC, 0xC5}, {0xAC, 0xC6}, /* 0xC8-0xCB */ + {0xAC, 0xC7}, {0xAC, 0xC9}, {0xAC, 0xCA}, {0xAC, 0xCB}, /* 0xCC-0xCF */ + {0xAC, 0xCD}, {0xAC, 0xCE}, {0xAC, 0xCF}, {0xAC, 0xD0}, /* 0xD0-0xD3 */ + {0xAC, 0xD1}, {0xAC, 0xD2}, {0xAC, 0xD3}, {0xAC, 0xD4}, /* 0xD4-0xD7 */ + {0xAC, 0xD6}, {0xAC, 0xD8}, {0xAC, 0xD9}, {0xAC, 0xDA}, /* 0xD8-0xDB */ + {0xAC, 0xDB}, {0xAC, 0xDC}, {0xAC, 0xDD}, {0xAC, 0xDE}, /* 0xDC-0xDF */ + {0xAC, 0xDF}, {0xAC, 0xE2}, {0xAC, 0xE3}, {0xAC, 0xE5}, /* 0xE0-0xE3 */ + {0xAC, 0xE6}, {0xAC, 0xE9}, {0xAC, 0xEB}, {0xAC, 0xED}, /* 0xE4-0xE7 */ + {0xAC, 0xEE}, {0xAC, 0xF2}, {0xAC, 0xF4}, {0xAC, 0xF7}, /* 0xE8-0xEB */ + {0xAC, 0xF8}, {0xAC, 0xF9}, {0xAC, 0xFA}, {0xAC, 0xFB}, /* 0xEC-0xEF */ + {0xAC, 0xFE}, {0xAC, 0xFF}, {0xAD, 0x01}, {0xAD, 0x02}, /* 0xF0-0xF3 */ + {0xAD, 0x03}, {0xAD, 0x05}, {0xAD, 0x07}, {0xAD, 0x08}, /* 0xF4-0xF7 */ + {0xAD, 0x09}, {0xAD, 0x0A}, {0xAD, 0x0B}, {0xAD, 0x0E}, /* 0xF8-0xFB */ + {0xAD, 0x10}, {0xAD, 0x12}, {0xAD, 0x13}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_82[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xAD, 0x14}, {0xAD, 0x15}, {0xAD, 0x16}, /* 0x40-0x43 */ + {0xAD, 0x17}, {0xAD, 0x19}, {0xAD, 0x1A}, {0xAD, 0x1B}, /* 0x44-0x47 */ + {0xAD, 0x1D}, {0xAD, 0x1E}, {0xAD, 0x1F}, {0xAD, 0x21}, /* 0x48-0x4B */ + {0xAD, 0x22}, {0xAD, 0x23}, {0xAD, 0x24}, {0xAD, 0x25}, /* 0x4C-0x4F */ + {0xAD, 0x26}, {0xAD, 0x27}, {0xAD, 0x28}, {0xAD, 0x2A}, /* 0x50-0x53 */ + {0xAD, 0x2B}, {0xAD, 0x2E}, {0xAD, 0x2F}, {0xAD, 0x30}, /* 0x54-0x57 */ + {0xAD, 0x31}, {0xAD, 0x32}, {0xAD, 0x33}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xAD, 0x36}, {0xAD, 0x37}, {0xAD, 0x39}, /* 0x60-0x63 */ + {0xAD, 0x3A}, {0xAD, 0x3B}, {0xAD, 0x3D}, {0xAD, 0x3E}, /* 0x64-0x67 */ + {0xAD, 0x3F}, {0xAD, 0x40}, {0xAD, 0x41}, {0xAD, 0x42}, /* 0x68-0x6B */ + {0xAD, 0x43}, {0xAD, 0x46}, {0xAD, 0x48}, {0xAD, 0x4A}, /* 0x6C-0x6F */ + {0xAD, 0x4B}, {0xAD, 0x4C}, {0xAD, 0x4D}, {0xAD, 0x4E}, /* 0x70-0x73 */ + {0xAD, 0x4F}, {0xAD, 0x51}, {0xAD, 0x52}, {0xAD, 0x53}, /* 0x74-0x77 */ + {0xAD, 0x55}, {0xAD, 0x56}, {0xAD, 0x57}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xAD, 0x59}, {0xAD, 0x5A}, {0xAD, 0x5B}, /* 0x80-0x83 */ + {0xAD, 0x5C}, {0xAD, 0x5D}, {0xAD, 0x5E}, {0xAD, 0x5F}, /* 0x84-0x87 */ + {0xAD, 0x60}, {0xAD, 0x62}, {0xAD, 0x64}, {0xAD, 0x65}, /* 0x88-0x8B */ + {0xAD, 0x66}, {0xAD, 0x67}, {0xAD, 0x68}, {0xAD, 0x69}, /* 0x8C-0x8F */ + {0xAD, 0x6A}, {0xAD, 0x6B}, {0xAD, 0x6E}, {0xAD, 0x6F}, /* 0x90-0x93 */ + {0xAD, 0x71}, {0xAD, 0x72}, {0xAD, 0x77}, {0xAD, 0x78}, /* 0x94-0x97 */ + {0xAD, 0x79}, {0xAD, 0x7A}, {0xAD, 0x7E}, {0xAD, 0x80}, /* 0x98-0x9B */ + {0xAD, 0x83}, {0xAD, 0x84}, {0xAD, 0x85}, {0xAD, 0x86}, /* 0x9C-0x9F */ + {0xAD, 0x87}, {0xAD, 0x8A}, {0xAD, 0x8B}, {0xAD, 0x8D}, /* 0xA0-0xA3 */ + {0xAD, 0x8E}, {0xAD, 0x8F}, {0xAD, 0x91}, {0xAD, 0x92}, /* 0xA4-0xA7 */ + {0xAD, 0x93}, {0xAD, 0x94}, {0xAD, 0x95}, {0xAD, 0x96}, /* 0xA8-0xAB */ + {0xAD, 0x97}, {0xAD, 0x98}, {0xAD, 0x99}, {0xAD, 0x9A}, /* 0xAC-0xAF */ + {0xAD, 0x9B}, {0xAD, 0x9E}, {0xAD, 0x9F}, {0xAD, 0xA0}, /* 0xB0-0xB3 */ + {0xAD, 0xA1}, {0xAD, 0xA2}, {0xAD, 0xA3}, {0xAD, 0xA5}, /* 0xB4-0xB7 */ + {0xAD, 0xA6}, {0xAD, 0xA7}, {0xAD, 0xA8}, {0xAD, 0xA9}, /* 0xB8-0xBB */ + {0xAD, 0xAA}, {0xAD, 0xAB}, {0xAD, 0xAC}, {0xAD, 0xAD}, /* 0xBC-0xBF */ + {0xAD, 0xAE}, {0xAD, 0xAF}, {0xAD, 0xB0}, {0xAD, 0xB1}, /* 0xC0-0xC3 */ + {0xAD, 0xB2}, {0xAD, 0xB3}, {0xAD, 0xB4}, {0xAD, 0xB5}, /* 0xC4-0xC7 */ + {0xAD, 0xB6}, {0xAD, 0xB8}, {0xAD, 0xB9}, {0xAD, 0xBA}, /* 0xC8-0xCB */ + {0xAD, 0xBB}, {0xAD, 0xBC}, {0xAD, 0xBD}, {0xAD, 0xBE}, /* 0xCC-0xCF */ + {0xAD, 0xBF}, {0xAD, 0xC2}, {0xAD, 0xC3}, {0xAD, 0xC5}, /* 0xD0-0xD3 */ + {0xAD, 0xC6}, {0xAD, 0xC7}, {0xAD, 0xC9}, {0xAD, 0xCA}, /* 0xD4-0xD7 */ + {0xAD, 0xCB}, {0xAD, 0xCC}, {0xAD, 0xCD}, {0xAD, 0xCE}, /* 0xD8-0xDB */ + {0xAD, 0xCF}, {0xAD, 0xD2}, {0xAD, 0xD4}, {0xAD, 0xD5}, /* 0xDC-0xDF */ + {0xAD, 0xD6}, {0xAD, 0xD7}, {0xAD, 0xD8}, {0xAD, 0xD9}, /* 0xE0-0xE3 */ + {0xAD, 0xDA}, {0xAD, 0xDB}, {0xAD, 0xDD}, {0xAD, 0xDE}, /* 0xE4-0xE7 */ + {0xAD, 0xDF}, {0xAD, 0xE1}, {0xAD, 0xE2}, {0xAD, 0xE3}, /* 0xE8-0xEB */ + {0xAD, 0xE5}, {0xAD, 0xE6}, {0xAD, 0xE7}, {0xAD, 0xE8}, /* 0xEC-0xEF */ + {0xAD, 0xE9}, {0xAD, 0xEA}, {0xAD, 0xEB}, {0xAD, 0xEC}, /* 0xF0-0xF3 */ + {0xAD, 0xED}, {0xAD, 0xEE}, {0xAD, 0xEF}, {0xAD, 0xF0}, /* 0xF4-0xF7 */ + {0xAD, 0xF1}, {0xAD, 0xF2}, {0xAD, 0xF3}, {0xAD, 0xF4}, /* 0xF8-0xFB */ + {0xAD, 0xF5}, {0xAD, 0xF6}, {0xAD, 0xF7}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_83[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xAD, 0xFA}, {0xAD, 0xFB}, {0xAD, 0xFD}, /* 0x40-0x43 */ + {0xAD, 0xFE}, {0xAE, 0x02}, {0xAE, 0x03}, {0xAE, 0x04}, /* 0x44-0x47 */ + {0xAE, 0x05}, {0xAE, 0x06}, {0xAE, 0x07}, {0xAE, 0x0A}, /* 0x48-0x4B */ + {0xAE, 0x0C}, {0xAE, 0x0E}, {0xAE, 0x0F}, {0xAE, 0x10}, /* 0x4C-0x4F */ + {0xAE, 0x11}, {0xAE, 0x12}, {0xAE, 0x13}, {0xAE, 0x15}, /* 0x50-0x53 */ + {0xAE, 0x16}, {0xAE, 0x17}, {0xAE, 0x18}, {0xAE, 0x19}, /* 0x54-0x57 */ + {0xAE, 0x1A}, {0xAE, 0x1B}, {0xAE, 0x1C}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xAE, 0x1D}, {0xAE, 0x1E}, {0xAE, 0x1F}, /* 0x60-0x63 */ + {0xAE, 0x20}, {0xAE, 0x21}, {0xAE, 0x22}, {0xAE, 0x23}, /* 0x64-0x67 */ + {0xAE, 0x24}, {0xAE, 0x25}, {0xAE, 0x26}, {0xAE, 0x27}, /* 0x68-0x6B */ + {0xAE, 0x28}, {0xAE, 0x29}, {0xAE, 0x2A}, {0xAE, 0x2B}, /* 0x6C-0x6F */ + {0xAE, 0x2C}, {0xAE, 0x2D}, {0xAE, 0x2E}, {0xAE, 0x2F}, /* 0x70-0x73 */ + {0xAE, 0x32}, {0xAE, 0x33}, {0xAE, 0x35}, {0xAE, 0x36}, /* 0x74-0x77 */ + {0xAE, 0x39}, {0xAE, 0x3B}, {0xAE, 0x3C}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xAE, 0x3D}, {0xAE, 0x3E}, {0xAE, 0x3F}, /* 0x80-0x83 */ + {0xAE, 0x42}, {0xAE, 0x44}, {0xAE, 0x47}, {0xAE, 0x48}, /* 0x84-0x87 */ + {0xAE, 0x49}, {0xAE, 0x4B}, {0xAE, 0x4F}, {0xAE, 0x51}, /* 0x88-0x8B */ + {0xAE, 0x52}, {0xAE, 0x53}, {0xAE, 0x55}, {0xAE, 0x57}, /* 0x8C-0x8F */ + {0xAE, 0x58}, {0xAE, 0x59}, {0xAE, 0x5A}, {0xAE, 0x5B}, /* 0x90-0x93 */ + {0xAE, 0x5E}, {0xAE, 0x62}, {0xAE, 0x63}, {0xAE, 0x64}, /* 0x94-0x97 */ + {0xAE, 0x66}, {0xAE, 0x67}, {0xAE, 0x6A}, {0xAE, 0x6B}, /* 0x98-0x9B */ + {0xAE, 0x6D}, {0xAE, 0x6E}, {0xAE, 0x6F}, {0xAE, 0x71}, /* 0x9C-0x9F */ + {0xAE, 0x72}, {0xAE, 0x73}, {0xAE, 0x74}, {0xAE, 0x75}, /* 0xA0-0xA3 */ + {0xAE, 0x76}, {0xAE, 0x77}, {0xAE, 0x7A}, {0xAE, 0x7E}, /* 0xA4-0xA7 */ + {0xAE, 0x7F}, {0xAE, 0x80}, {0xAE, 0x81}, {0xAE, 0x82}, /* 0xA8-0xAB */ + {0xAE, 0x83}, {0xAE, 0x86}, {0xAE, 0x87}, {0xAE, 0x88}, /* 0xAC-0xAF */ + {0xAE, 0x89}, {0xAE, 0x8A}, {0xAE, 0x8B}, {0xAE, 0x8D}, /* 0xB0-0xB3 */ + {0xAE, 0x8E}, {0xAE, 0x8F}, {0xAE, 0x90}, {0xAE, 0x91}, /* 0xB4-0xB7 */ + {0xAE, 0x92}, {0xAE, 0x93}, {0xAE, 0x94}, {0xAE, 0x95}, /* 0xB8-0xBB */ + {0xAE, 0x96}, {0xAE, 0x97}, {0xAE, 0x98}, {0xAE, 0x99}, /* 0xBC-0xBF */ + {0xAE, 0x9A}, {0xAE, 0x9B}, {0xAE, 0x9C}, {0xAE, 0x9D}, /* 0xC0-0xC3 */ + {0xAE, 0x9E}, {0xAE, 0x9F}, {0xAE, 0xA0}, {0xAE, 0xA1}, /* 0xC4-0xC7 */ + {0xAE, 0xA2}, {0xAE, 0xA3}, {0xAE, 0xA4}, {0xAE, 0xA5}, /* 0xC8-0xCB */ + {0xAE, 0xA6}, {0xAE, 0xA7}, {0xAE, 0xA8}, {0xAE, 0xA9}, /* 0xCC-0xCF */ + {0xAE, 0xAA}, {0xAE, 0xAB}, {0xAE, 0xAC}, {0xAE, 0xAD}, /* 0xD0-0xD3 */ + {0xAE, 0xAE}, {0xAE, 0xAF}, {0xAE, 0xB0}, {0xAE, 0xB1}, /* 0xD4-0xD7 */ + {0xAE, 0xB2}, {0xAE, 0xB3}, {0xAE, 0xB4}, {0xAE, 0xB5}, /* 0xD8-0xDB */ + {0xAE, 0xB6}, {0xAE, 0xB7}, {0xAE, 0xB8}, {0xAE, 0xB9}, /* 0xDC-0xDF */ + {0xAE, 0xBA}, {0xAE, 0xBB}, {0xAE, 0xBF}, {0xAE, 0xC1}, /* 0xE0-0xE3 */ + {0xAE, 0xC2}, {0xAE, 0xC3}, {0xAE, 0xC5}, {0xAE, 0xC6}, /* 0xE4-0xE7 */ + {0xAE, 0xC7}, {0xAE, 0xC8}, {0xAE, 0xC9}, {0xAE, 0xCA}, /* 0xE8-0xEB */ + {0xAE, 0xCB}, {0xAE, 0xCE}, {0xAE, 0xD2}, {0xAE, 0xD3}, /* 0xEC-0xEF */ + {0xAE, 0xD4}, {0xAE, 0xD5}, {0xAE, 0xD6}, {0xAE, 0xD7}, /* 0xF0-0xF3 */ + {0xAE, 0xDA}, {0xAE, 0xDB}, {0xAE, 0xDD}, {0xAE, 0xDE}, /* 0xF4-0xF7 */ + {0xAE, 0xDF}, {0xAE, 0xE0}, {0xAE, 0xE1}, {0xAE, 0xE2}, /* 0xF8-0xFB */ + {0xAE, 0xE3}, {0xAE, 0xE4}, {0xAE, 0xE5}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_84[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xAE, 0xE6}, {0xAE, 0xE7}, {0xAE, 0xE9}, /* 0x40-0x43 */ + {0xAE, 0xEA}, {0xAE, 0xEC}, {0xAE, 0xEE}, {0xAE, 0xEF}, /* 0x44-0x47 */ + {0xAE, 0xF0}, {0xAE, 0xF1}, {0xAE, 0xF2}, {0xAE, 0xF3}, /* 0x48-0x4B */ + {0xAE, 0xF5}, {0xAE, 0xF6}, {0xAE, 0xF7}, {0xAE, 0xF9}, /* 0x4C-0x4F */ + {0xAE, 0xFA}, {0xAE, 0xFB}, {0xAE, 0xFD}, {0xAE, 0xFE}, /* 0x50-0x53 */ + {0xAE, 0xFF}, {0xAF, 0x00}, {0xAF, 0x01}, {0xAF, 0x02}, /* 0x54-0x57 */ + {0xAF, 0x03}, {0xAF, 0x04}, {0xAF, 0x05}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xAF, 0x06}, {0xAF, 0x09}, {0xAF, 0x0A}, /* 0x60-0x63 */ + {0xAF, 0x0B}, {0xAF, 0x0C}, {0xAF, 0x0E}, {0xAF, 0x0F}, /* 0x64-0x67 */ + {0xAF, 0x11}, {0xAF, 0x12}, {0xAF, 0x13}, {0xAF, 0x14}, /* 0x68-0x6B */ + {0xAF, 0x15}, {0xAF, 0x16}, {0xAF, 0x17}, {0xAF, 0x18}, /* 0x6C-0x6F */ + {0xAF, 0x19}, {0xAF, 0x1A}, {0xAF, 0x1B}, {0xAF, 0x1C}, /* 0x70-0x73 */ + {0xAF, 0x1D}, {0xAF, 0x1E}, {0xAF, 0x1F}, {0xAF, 0x20}, /* 0x74-0x77 */ + {0xAF, 0x21}, {0xAF, 0x22}, {0xAF, 0x23}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xAF, 0x24}, {0xAF, 0x25}, {0xAF, 0x26}, /* 0x80-0x83 */ + {0xAF, 0x27}, {0xAF, 0x28}, {0xAF, 0x29}, {0xAF, 0x2A}, /* 0x84-0x87 */ + {0xAF, 0x2B}, {0xAF, 0x2E}, {0xAF, 0x2F}, {0xAF, 0x31}, /* 0x88-0x8B */ + {0xAF, 0x33}, {0xAF, 0x35}, {0xAF, 0x36}, {0xAF, 0x37}, /* 0x8C-0x8F */ + {0xAF, 0x38}, {0xAF, 0x39}, {0xAF, 0x3A}, {0xAF, 0x3B}, /* 0x90-0x93 */ + {0xAF, 0x3E}, {0xAF, 0x40}, {0xAF, 0x44}, {0xAF, 0x45}, /* 0x94-0x97 */ + {0xAF, 0x46}, {0xAF, 0x47}, {0xAF, 0x4A}, {0xAF, 0x4B}, /* 0x98-0x9B */ + {0xAF, 0x4C}, {0xAF, 0x4D}, {0xAF, 0x4E}, {0xAF, 0x4F}, /* 0x9C-0x9F */ + {0xAF, 0x51}, {0xAF, 0x52}, {0xAF, 0x53}, {0xAF, 0x54}, /* 0xA0-0xA3 */ + {0xAF, 0x55}, {0xAF, 0x56}, {0xAF, 0x57}, {0xAF, 0x58}, /* 0xA4-0xA7 */ + {0xAF, 0x59}, {0xAF, 0x5A}, {0xAF, 0x5B}, {0xAF, 0x5E}, /* 0xA8-0xAB */ + {0xAF, 0x5F}, {0xAF, 0x60}, {0xAF, 0x61}, {0xAF, 0x62}, /* 0xAC-0xAF */ + {0xAF, 0x63}, {0xAF, 0x66}, {0xAF, 0x67}, {0xAF, 0x68}, /* 0xB0-0xB3 */ + {0xAF, 0x69}, {0xAF, 0x6A}, {0xAF, 0x6B}, {0xAF, 0x6C}, /* 0xB4-0xB7 */ + {0xAF, 0x6D}, {0xAF, 0x6E}, {0xAF, 0x6F}, {0xAF, 0x70}, /* 0xB8-0xBB */ + {0xAF, 0x71}, {0xAF, 0x72}, {0xAF, 0x73}, {0xAF, 0x74}, /* 0xBC-0xBF */ + {0xAF, 0x75}, {0xAF, 0x76}, {0xAF, 0x77}, {0xAF, 0x78}, /* 0xC0-0xC3 */ + {0xAF, 0x7A}, {0xAF, 0x7B}, {0xAF, 0x7C}, {0xAF, 0x7D}, /* 0xC4-0xC7 */ + {0xAF, 0x7E}, {0xAF, 0x7F}, {0xAF, 0x81}, {0xAF, 0x82}, /* 0xC8-0xCB */ + {0xAF, 0x83}, {0xAF, 0x85}, {0xAF, 0x86}, {0xAF, 0x87}, /* 0xCC-0xCF */ + {0xAF, 0x89}, {0xAF, 0x8A}, {0xAF, 0x8B}, {0xAF, 0x8C}, /* 0xD0-0xD3 */ + {0xAF, 0x8D}, {0xAF, 0x8E}, {0xAF, 0x8F}, {0xAF, 0x92}, /* 0xD4-0xD7 */ + {0xAF, 0x93}, {0xAF, 0x94}, {0xAF, 0x96}, {0xAF, 0x97}, /* 0xD8-0xDB */ + {0xAF, 0x98}, {0xAF, 0x99}, {0xAF, 0x9A}, {0xAF, 0x9B}, /* 0xDC-0xDF */ + {0xAF, 0x9D}, {0xAF, 0x9E}, {0xAF, 0x9F}, {0xAF, 0xA0}, /* 0xE0-0xE3 */ + {0xAF, 0xA1}, {0xAF, 0xA2}, {0xAF, 0xA3}, {0xAF, 0xA4}, /* 0xE4-0xE7 */ + {0xAF, 0xA5}, {0xAF, 0xA6}, {0xAF, 0xA7}, {0xAF, 0xA8}, /* 0xE8-0xEB */ + {0xAF, 0xA9}, {0xAF, 0xAA}, {0xAF, 0xAB}, {0xAF, 0xAC}, /* 0xEC-0xEF */ + {0xAF, 0xAD}, {0xAF, 0xAE}, {0xAF, 0xAF}, {0xAF, 0xB0}, /* 0xF0-0xF3 */ + {0xAF, 0xB1}, {0xAF, 0xB2}, {0xAF, 0xB3}, {0xAF, 0xB4}, /* 0xF4-0xF7 */ + {0xAF, 0xB5}, {0xAF, 0xB6}, {0xAF, 0xB7}, {0xAF, 0xBA}, /* 0xF8-0xFB */ + {0xAF, 0xBB}, {0xAF, 0xBD}, {0xAF, 0xBE}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_85[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xAF, 0xBF}, {0xAF, 0xC1}, {0xAF, 0xC2}, /* 0x40-0x43 */ + {0xAF, 0xC3}, {0xAF, 0xC4}, {0xAF, 0xC5}, {0xAF, 0xC6}, /* 0x44-0x47 */ + {0xAF, 0xCA}, {0xAF, 0xCC}, {0xAF, 0xCF}, {0xAF, 0xD0}, /* 0x48-0x4B */ + {0xAF, 0xD1}, {0xAF, 0xD2}, {0xAF, 0xD3}, {0xAF, 0xD5}, /* 0x4C-0x4F */ + {0xAF, 0xD6}, {0xAF, 0xD7}, {0xAF, 0xD8}, {0xAF, 0xD9}, /* 0x50-0x53 */ + {0xAF, 0xDA}, {0xAF, 0xDB}, {0xAF, 0xDD}, {0xAF, 0xDE}, /* 0x54-0x57 */ + {0xAF, 0xDF}, {0xAF, 0xE0}, {0xAF, 0xE1}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xAF, 0xE2}, {0xAF, 0xE3}, {0xAF, 0xE4}, /* 0x60-0x63 */ + {0xAF, 0xE5}, {0xAF, 0xE6}, {0xAF, 0xE7}, {0xAF, 0xEA}, /* 0x64-0x67 */ + {0xAF, 0xEB}, {0xAF, 0xEC}, {0xAF, 0xED}, {0xAF, 0xEE}, /* 0x68-0x6B */ + {0xAF, 0xEF}, {0xAF, 0xF2}, {0xAF, 0xF3}, {0xAF, 0xF5}, /* 0x6C-0x6F */ + {0xAF, 0xF6}, {0xAF, 0xF7}, {0xAF, 0xF9}, {0xAF, 0xFA}, /* 0x70-0x73 */ + {0xAF, 0xFB}, {0xAF, 0xFC}, {0xAF, 0xFD}, {0xAF, 0xFE}, /* 0x74-0x77 */ + {0xAF, 0xFF}, {0xB0, 0x02}, {0xB0, 0x03}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB0, 0x05}, {0xB0, 0x06}, {0xB0, 0x07}, /* 0x80-0x83 */ + {0xB0, 0x08}, {0xB0, 0x09}, {0xB0, 0x0A}, {0xB0, 0x0B}, /* 0x84-0x87 */ + {0xB0, 0x0D}, {0xB0, 0x0E}, {0xB0, 0x0F}, {0xB0, 0x11}, /* 0x88-0x8B */ + {0xB0, 0x12}, {0xB0, 0x13}, {0xB0, 0x15}, {0xB0, 0x16}, /* 0x8C-0x8F */ + {0xB0, 0x17}, {0xB0, 0x18}, {0xB0, 0x19}, {0xB0, 0x1A}, /* 0x90-0x93 */ + {0xB0, 0x1B}, {0xB0, 0x1E}, {0xB0, 0x1F}, {0xB0, 0x20}, /* 0x94-0x97 */ + {0xB0, 0x21}, {0xB0, 0x22}, {0xB0, 0x23}, {0xB0, 0x24}, /* 0x98-0x9B */ + {0xB0, 0x25}, {0xB0, 0x26}, {0xB0, 0x27}, {0xB0, 0x29}, /* 0x9C-0x9F */ + {0xB0, 0x2A}, {0xB0, 0x2B}, {0xB0, 0x2C}, {0xB0, 0x2D}, /* 0xA0-0xA3 */ + {0xB0, 0x2E}, {0xB0, 0x2F}, {0xB0, 0x30}, {0xB0, 0x31}, /* 0xA4-0xA7 */ + {0xB0, 0x32}, {0xB0, 0x33}, {0xB0, 0x34}, {0xB0, 0x35}, /* 0xA8-0xAB */ + {0xB0, 0x36}, {0xB0, 0x37}, {0xB0, 0x38}, {0xB0, 0x39}, /* 0xAC-0xAF */ + {0xB0, 0x3A}, {0xB0, 0x3B}, {0xB0, 0x3C}, {0xB0, 0x3D}, /* 0xB0-0xB3 */ + {0xB0, 0x3E}, {0xB0, 0x3F}, {0xB0, 0x40}, {0xB0, 0x41}, /* 0xB4-0xB7 */ + {0xB0, 0x42}, {0xB0, 0x43}, {0xB0, 0x46}, {0xB0, 0x47}, /* 0xB8-0xBB */ + {0xB0, 0x49}, {0xB0, 0x4B}, {0xB0, 0x4D}, {0xB0, 0x4F}, /* 0xBC-0xBF */ + {0xB0, 0x50}, {0xB0, 0x51}, {0xB0, 0x52}, {0xB0, 0x56}, /* 0xC0-0xC3 */ + {0xB0, 0x58}, {0xB0, 0x5A}, {0xB0, 0x5B}, {0xB0, 0x5C}, /* 0xC4-0xC7 */ + {0xB0, 0x5E}, {0xB0, 0x5F}, {0xB0, 0x60}, {0xB0, 0x61}, /* 0xC8-0xCB */ + {0xB0, 0x62}, {0xB0, 0x63}, {0xB0, 0x64}, {0xB0, 0x65}, /* 0xCC-0xCF */ + {0xB0, 0x66}, {0xB0, 0x67}, {0xB0, 0x68}, {0xB0, 0x69}, /* 0xD0-0xD3 */ + {0xB0, 0x6A}, {0xB0, 0x6B}, {0xB0, 0x6C}, {0xB0, 0x6D}, /* 0xD4-0xD7 */ + {0xB0, 0x6E}, {0xB0, 0x6F}, {0xB0, 0x70}, {0xB0, 0x71}, /* 0xD8-0xDB */ + {0xB0, 0x72}, {0xB0, 0x73}, {0xB0, 0x74}, {0xB0, 0x75}, /* 0xDC-0xDF */ + {0xB0, 0x76}, {0xB0, 0x77}, {0xB0, 0x78}, {0xB0, 0x79}, /* 0xE0-0xE3 */ + {0xB0, 0x7A}, {0xB0, 0x7B}, {0xB0, 0x7E}, {0xB0, 0x7F}, /* 0xE4-0xE7 */ + {0xB0, 0x81}, {0xB0, 0x82}, {0xB0, 0x83}, {0xB0, 0x85}, /* 0xE8-0xEB */ + {0xB0, 0x86}, {0xB0, 0x87}, {0xB0, 0x88}, {0xB0, 0x89}, /* 0xEC-0xEF */ + {0xB0, 0x8A}, {0xB0, 0x8B}, {0xB0, 0x8E}, {0xB0, 0x90}, /* 0xF0-0xF3 */ + {0xB0, 0x92}, {0xB0, 0x93}, {0xB0, 0x94}, {0xB0, 0x95}, /* 0xF4-0xF7 */ + {0xB0, 0x96}, {0xB0, 0x97}, {0xB0, 0x9B}, {0xB0, 0x9D}, /* 0xF8-0xFB */ + {0xB0, 0x9E}, {0xB0, 0xA3}, {0xB0, 0xA4}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_86[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB0, 0xA5}, {0xB0, 0xA6}, {0xB0, 0xA7}, /* 0x40-0x43 */ + {0xB0, 0xAA}, {0xB0, 0xB0}, {0xB0, 0xB2}, {0xB0, 0xB6}, /* 0x44-0x47 */ + {0xB0, 0xB7}, {0xB0, 0xB9}, {0xB0, 0xBA}, {0xB0, 0xBB}, /* 0x48-0x4B */ + {0xB0, 0xBD}, {0xB0, 0xBE}, {0xB0, 0xBF}, {0xB0, 0xC0}, /* 0x4C-0x4F */ + {0xB0, 0xC1}, {0xB0, 0xC2}, {0xB0, 0xC3}, {0xB0, 0xC6}, /* 0x50-0x53 */ + {0xB0, 0xCA}, {0xB0, 0xCB}, {0xB0, 0xCC}, {0xB0, 0xCD}, /* 0x54-0x57 */ + {0xB0, 0xCE}, {0xB0, 0xCF}, {0xB0, 0xD2}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB0, 0xD3}, {0xB0, 0xD5}, {0xB0, 0xD6}, /* 0x60-0x63 */ + {0xB0, 0xD7}, {0xB0, 0xD9}, {0xB0, 0xDA}, {0xB0, 0xDB}, /* 0x64-0x67 */ + {0xB0, 0xDC}, {0xB0, 0xDD}, {0xB0, 0xDE}, {0xB0, 0xDF}, /* 0x68-0x6B */ + {0xB0, 0xE1}, {0xB0, 0xE2}, {0xB0, 0xE3}, {0xB0, 0xE4}, /* 0x6C-0x6F */ + {0xB0, 0xE6}, {0xB0, 0xE7}, {0xB0, 0xE8}, {0xB0, 0xE9}, /* 0x70-0x73 */ + {0xB0, 0xEA}, {0xB0, 0xEB}, {0xB0, 0xEC}, {0xB0, 0xED}, /* 0x74-0x77 */ + {0xB0, 0xEE}, {0xB0, 0xEF}, {0xB0, 0xF0}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB0, 0xF1}, {0xB0, 0xF2}, {0xB0, 0xF3}, /* 0x80-0x83 */ + {0xB0, 0xF4}, {0xB0, 0xF5}, {0xB0, 0xF6}, {0xB0, 0xF7}, /* 0x84-0x87 */ + {0xB0, 0xF8}, {0xB0, 0xF9}, {0xB0, 0xFA}, {0xB0, 0xFB}, /* 0x88-0x8B */ + {0xB0, 0xFC}, {0xB0, 0xFD}, {0xB0, 0xFE}, {0xB0, 0xFF}, /* 0x8C-0x8F */ + {0xB1, 0x00}, {0xB1, 0x01}, {0xB1, 0x02}, {0xB1, 0x03}, /* 0x90-0x93 */ + {0xB1, 0x04}, {0xB1, 0x05}, {0xB1, 0x06}, {0xB1, 0x07}, /* 0x94-0x97 */ + {0xB1, 0x0A}, {0xB1, 0x0D}, {0xB1, 0x0E}, {0xB1, 0x0F}, /* 0x98-0x9B */ + {0xB1, 0x11}, {0xB1, 0x14}, {0xB1, 0x15}, {0xB1, 0x16}, /* 0x9C-0x9F */ + {0xB1, 0x17}, {0xB1, 0x1A}, {0xB1, 0x1E}, {0xB1, 0x1F}, /* 0xA0-0xA3 */ + {0xB1, 0x20}, {0xB1, 0x21}, {0xB1, 0x22}, {0xB1, 0x26}, /* 0xA4-0xA7 */ + {0xB1, 0x27}, {0xB1, 0x29}, {0xB1, 0x2A}, {0xB1, 0x2B}, /* 0xA8-0xAB */ + {0xB1, 0x2D}, {0xB1, 0x2E}, {0xB1, 0x2F}, {0xB1, 0x30}, /* 0xAC-0xAF */ + {0xB1, 0x31}, {0xB1, 0x32}, {0xB1, 0x33}, {0xB1, 0x36}, /* 0xB0-0xB3 */ + {0xB1, 0x3A}, {0xB1, 0x3B}, {0xB1, 0x3C}, {0xB1, 0x3D}, /* 0xB4-0xB7 */ + {0xB1, 0x3E}, {0xB1, 0x3F}, {0xB1, 0x42}, {0xB1, 0x43}, /* 0xB8-0xBB */ + {0xB1, 0x45}, {0xB1, 0x46}, {0xB1, 0x47}, {0xB1, 0x49}, /* 0xBC-0xBF */ + {0xB1, 0x4A}, {0xB1, 0x4B}, {0xB1, 0x4C}, {0xB1, 0x4D}, /* 0xC0-0xC3 */ + {0xB1, 0x4E}, {0xB1, 0x4F}, {0xB1, 0x52}, {0xB1, 0x53}, /* 0xC4-0xC7 */ + {0xB1, 0x56}, {0xB1, 0x57}, {0xB1, 0x59}, {0xB1, 0x5A}, /* 0xC8-0xCB */ + {0xB1, 0x5B}, {0xB1, 0x5D}, {0xB1, 0x5E}, {0xB1, 0x5F}, /* 0xCC-0xCF */ + {0xB1, 0x61}, {0xB1, 0x62}, {0xB1, 0x63}, {0xB1, 0x64}, /* 0xD0-0xD3 */ + {0xB1, 0x65}, {0xB1, 0x66}, {0xB1, 0x67}, {0xB1, 0x68}, /* 0xD4-0xD7 */ + {0xB1, 0x69}, {0xB1, 0x6A}, {0xB1, 0x6B}, {0xB1, 0x6C}, /* 0xD8-0xDB */ + {0xB1, 0x6D}, {0xB1, 0x6E}, {0xB1, 0x6F}, {0xB1, 0x70}, /* 0xDC-0xDF */ + {0xB1, 0x71}, {0xB1, 0x72}, {0xB1, 0x73}, {0xB1, 0x74}, /* 0xE0-0xE3 */ + {0xB1, 0x75}, {0xB1, 0x76}, {0xB1, 0x77}, {0xB1, 0x7A}, /* 0xE4-0xE7 */ + {0xB1, 0x7B}, {0xB1, 0x7D}, {0xB1, 0x7E}, {0xB1, 0x7F}, /* 0xE8-0xEB */ + {0xB1, 0x81}, {0xB1, 0x83}, {0xB1, 0x84}, {0xB1, 0x85}, /* 0xEC-0xEF */ + {0xB1, 0x86}, {0xB1, 0x87}, {0xB1, 0x8A}, {0xB1, 0x8C}, /* 0xF0-0xF3 */ + {0xB1, 0x8E}, {0xB1, 0x8F}, {0xB1, 0x90}, {0xB1, 0x91}, /* 0xF4-0xF7 */ + {0xB1, 0x95}, {0xB1, 0x96}, {0xB1, 0x97}, {0xB1, 0x99}, /* 0xF8-0xFB */ + {0xB1, 0x9A}, {0xB1, 0x9B}, {0xB1, 0x9D}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_87[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB1, 0x9E}, {0xB1, 0x9F}, {0xB1, 0xA0}, /* 0x40-0x43 */ + {0xB1, 0xA1}, {0xB1, 0xA2}, {0xB1, 0xA3}, {0xB1, 0xA4}, /* 0x44-0x47 */ + {0xB1, 0xA5}, {0xB1, 0xA6}, {0xB1, 0xA7}, {0xB1, 0xA9}, /* 0x48-0x4B */ + {0xB1, 0xAA}, {0xB1, 0xAB}, {0xB1, 0xAC}, {0xB1, 0xAD}, /* 0x4C-0x4F */ + {0xB1, 0xAE}, {0xB1, 0xAF}, {0xB1, 0xB0}, {0xB1, 0xB1}, /* 0x50-0x53 */ + {0xB1, 0xB2}, {0xB1, 0xB3}, {0xB1, 0xB4}, {0xB1, 0xB5}, /* 0x54-0x57 */ + {0xB1, 0xB6}, {0xB1, 0xB7}, {0xB1, 0xB8}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB1, 0xB9}, {0xB1, 0xBA}, {0xB1, 0xBB}, /* 0x60-0x63 */ + {0xB1, 0xBC}, {0xB1, 0xBD}, {0xB1, 0xBE}, {0xB1, 0xBF}, /* 0x64-0x67 */ + {0xB1, 0xC0}, {0xB1, 0xC1}, {0xB1, 0xC2}, {0xB1, 0xC3}, /* 0x68-0x6B */ + {0xB1, 0xC4}, {0xB1, 0xC5}, {0xB1, 0xC6}, {0xB1, 0xC7}, /* 0x6C-0x6F */ + {0xB1, 0xC8}, {0xB1, 0xC9}, {0xB1, 0xCA}, {0xB1, 0xCB}, /* 0x70-0x73 */ + {0xB1, 0xCD}, {0xB1, 0xCE}, {0xB1, 0xCF}, {0xB1, 0xD1}, /* 0x74-0x77 */ + {0xB1, 0xD2}, {0xB1, 0xD3}, {0xB1, 0xD5}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB1, 0xD6}, {0xB1, 0xD7}, {0xB1, 0xD8}, /* 0x80-0x83 */ + {0xB1, 0xD9}, {0xB1, 0xDA}, {0xB1, 0xDB}, {0xB1, 0xDE}, /* 0x84-0x87 */ + {0xB1, 0xE0}, {0xB1, 0xE1}, {0xB1, 0xE2}, {0xB1, 0xE3}, /* 0x88-0x8B */ + {0xB1, 0xE4}, {0xB1, 0xE5}, {0xB1, 0xE6}, {0xB1, 0xE7}, /* 0x8C-0x8F */ + {0xB1, 0xEA}, {0xB1, 0xEB}, {0xB1, 0xED}, {0xB1, 0xEE}, /* 0x90-0x93 */ + {0xB1, 0xEF}, {0xB1, 0xF1}, {0xB1, 0xF2}, {0xB1, 0xF3}, /* 0x94-0x97 */ + {0xB1, 0xF4}, {0xB1, 0xF5}, {0xB1, 0xF6}, {0xB1, 0xF7}, /* 0x98-0x9B */ + {0xB1, 0xF8}, {0xB1, 0xFA}, {0xB1, 0xFC}, {0xB1, 0xFE}, /* 0x9C-0x9F */ + {0xB1, 0xFF}, {0xB2, 0x00}, {0xB2, 0x01}, {0xB2, 0x02}, /* 0xA0-0xA3 */ + {0xB2, 0x03}, {0xB2, 0x06}, {0xB2, 0x07}, {0xB2, 0x09}, /* 0xA4-0xA7 */ + {0xB2, 0x0A}, {0xB2, 0x0D}, {0xB2, 0x0E}, {0xB2, 0x0F}, /* 0xA8-0xAB */ + {0xB2, 0x10}, {0xB2, 0x11}, {0xB2, 0x12}, {0xB2, 0x13}, /* 0xAC-0xAF */ + {0xB2, 0x16}, {0xB2, 0x18}, {0xB2, 0x1A}, {0xB2, 0x1B}, /* 0xB0-0xB3 */ + {0xB2, 0x1C}, {0xB2, 0x1D}, {0xB2, 0x1E}, {0xB2, 0x1F}, /* 0xB4-0xB7 */ + {0xB2, 0x21}, {0xB2, 0x22}, {0xB2, 0x23}, {0xB2, 0x24}, /* 0xB8-0xBB */ + {0xB2, 0x25}, {0xB2, 0x26}, {0xB2, 0x27}, {0xB2, 0x28}, /* 0xBC-0xBF */ + {0xB2, 0x29}, {0xB2, 0x2A}, {0xB2, 0x2B}, {0xB2, 0x2C}, /* 0xC0-0xC3 */ + {0xB2, 0x2D}, {0xB2, 0x2E}, {0xB2, 0x2F}, {0xB2, 0x30}, /* 0xC4-0xC7 */ + {0xB2, 0x31}, {0xB2, 0x32}, {0xB2, 0x33}, {0xB2, 0x35}, /* 0xC8-0xCB */ + {0xB2, 0x36}, {0xB2, 0x37}, {0xB2, 0x38}, {0xB2, 0x39}, /* 0xCC-0xCF */ + {0xB2, 0x3A}, {0xB2, 0x3B}, {0xB2, 0x3D}, {0xB2, 0x3E}, /* 0xD0-0xD3 */ + {0xB2, 0x3F}, {0xB2, 0x40}, {0xB2, 0x41}, {0xB2, 0x42}, /* 0xD4-0xD7 */ + {0xB2, 0x43}, {0xB2, 0x44}, {0xB2, 0x45}, {0xB2, 0x46}, /* 0xD8-0xDB */ + {0xB2, 0x47}, {0xB2, 0x48}, {0xB2, 0x49}, {0xB2, 0x4A}, /* 0xDC-0xDF */ + {0xB2, 0x4B}, {0xB2, 0x4C}, {0xB2, 0x4D}, {0xB2, 0x4E}, /* 0xE0-0xE3 */ + {0xB2, 0x4F}, {0xB2, 0x50}, {0xB2, 0x51}, {0xB2, 0x52}, /* 0xE4-0xE7 */ + {0xB2, 0x53}, {0xB2, 0x54}, {0xB2, 0x55}, {0xB2, 0x56}, /* 0xE8-0xEB */ + {0xB2, 0x57}, {0xB2, 0x59}, {0xB2, 0x5A}, {0xB2, 0x5B}, /* 0xEC-0xEF */ + {0xB2, 0x5D}, {0xB2, 0x5E}, {0xB2, 0x5F}, {0xB2, 0x61}, /* 0xF0-0xF3 */ + {0xB2, 0x62}, {0xB2, 0x63}, {0xB2, 0x64}, {0xB2, 0x65}, /* 0xF4-0xF7 */ + {0xB2, 0x66}, {0xB2, 0x67}, {0xB2, 0x6A}, {0xB2, 0x6B}, /* 0xF8-0xFB */ + {0xB2, 0x6C}, {0xB2, 0x6D}, {0xB2, 0x6E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_88[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB2, 0x6F}, {0xB2, 0x70}, {0xB2, 0x71}, /* 0x40-0x43 */ + {0xB2, 0x72}, {0xB2, 0x73}, {0xB2, 0x76}, {0xB2, 0x77}, /* 0x44-0x47 */ + {0xB2, 0x78}, {0xB2, 0x79}, {0xB2, 0x7A}, {0xB2, 0x7B}, /* 0x48-0x4B */ + {0xB2, 0x7D}, {0xB2, 0x7E}, {0xB2, 0x7F}, {0xB2, 0x80}, /* 0x4C-0x4F */ + {0xB2, 0x81}, {0xB2, 0x82}, {0xB2, 0x83}, {0xB2, 0x86}, /* 0x50-0x53 */ + {0xB2, 0x87}, {0xB2, 0x88}, {0xB2, 0x8A}, {0xB2, 0x8B}, /* 0x54-0x57 */ + {0xB2, 0x8C}, {0xB2, 0x8D}, {0xB2, 0x8E}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB2, 0x8F}, {0xB2, 0x92}, {0xB2, 0x93}, /* 0x60-0x63 */ + {0xB2, 0x95}, {0xB2, 0x96}, {0xB2, 0x97}, {0xB2, 0x9B}, /* 0x64-0x67 */ + {0xB2, 0x9C}, {0xB2, 0x9D}, {0xB2, 0x9E}, {0xB2, 0x9F}, /* 0x68-0x6B */ + {0xB2, 0xA2}, {0xB2, 0xA4}, {0xB2, 0xA7}, {0xB2, 0xA8}, /* 0x6C-0x6F */ + {0xB2, 0xA9}, {0xB2, 0xAB}, {0xB2, 0xAD}, {0xB2, 0xAE}, /* 0x70-0x73 */ + {0xB2, 0xAF}, {0xB2, 0xB1}, {0xB2, 0xB2}, {0xB2, 0xB3}, /* 0x74-0x77 */ + {0xB2, 0xB5}, {0xB2, 0xB6}, {0xB2, 0xB7}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB2, 0xB8}, {0xB2, 0xB9}, {0xB2, 0xBA}, /* 0x80-0x83 */ + {0xB2, 0xBB}, {0xB2, 0xBC}, {0xB2, 0xBD}, {0xB2, 0xBE}, /* 0x84-0x87 */ + {0xB2, 0xBF}, {0xB2, 0xC0}, {0xB2, 0xC1}, {0xB2, 0xC2}, /* 0x88-0x8B */ + {0xB2, 0xC3}, {0xB2, 0xC4}, {0xB2, 0xC5}, {0xB2, 0xC6}, /* 0x8C-0x8F */ + {0xB2, 0xC7}, {0xB2, 0xCA}, {0xB2, 0xCB}, {0xB2, 0xCD}, /* 0x90-0x93 */ + {0xB2, 0xCE}, {0xB2, 0xCF}, {0xB2, 0xD1}, {0xB2, 0xD3}, /* 0x94-0x97 */ + {0xB2, 0xD4}, {0xB2, 0xD5}, {0xB2, 0xD6}, {0xB2, 0xD7}, /* 0x98-0x9B */ + {0xB2, 0xDA}, {0xB2, 0xDC}, {0xB2, 0xDE}, {0xB2, 0xDF}, /* 0x9C-0x9F */ + {0xB2, 0xE0}, {0xB2, 0xE1}, {0xB2, 0xE3}, {0xB2, 0xE7}, /* 0xA0-0xA3 */ + {0xB2, 0xE9}, {0xB2, 0xEA}, {0xB2, 0xF0}, {0xB2, 0xF1}, /* 0xA4-0xA7 */ + {0xB2, 0xF2}, {0xB2, 0xF6}, {0xB2, 0xFC}, {0xB2, 0xFD}, /* 0xA8-0xAB */ + {0xB2, 0xFE}, {0xB3, 0x02}, {0xB3, 0x03}, {0xB3, 0x05}, /* 0xAC-0xAF */ + {0xB3, 0x06}, {0xB3, 0x07}, {0xB3, 0x09}, {0xB3, 0x0A}, /* 0xB0-0xB3 */ + {0xB3, 0x0B}, {0xB3, 0x0C}, {0xB3, 0x0D}, {0xB3, 0x0E}, /* 0xB4-0xB7 */ + {0xB3, 0x0F}, {0xB3, 0x12}, {0xB3, 0x16}, {0xB3, 0x17}, /* 0xB8-0xBB */ + {0xB3, 0x18}, {0xB3, 0x19}, {0xB3, 0x1A}, {0xB3, 0x1B}, /* 0xBC-0xBF */ + {0xB3, 0x1D}, {0xB3, 0x1E}, {0xB3, 0x1F}, {0xB3, 0x20}, /* 0xC0-0xC3 */ + {0xB3, 0x21}, {0xB3, 0x22}, {0xB3, 0x23}, {0xB3, 0x24}, /* 0xC4-0xC7 */ + {0xB3, 0x25}, {0xB3, 0x26}, {0xB3, 0x27}, {0xB3, 0x28}, /* 0xC8-0xCB */ + {0xB3, 0x29}, {0xB3, 0x2A}, {0xB3, 0x2B}, {0xB3, 0x2C}, /* 0xCC-0xCF */ + {0xB3, 0x2D}, {0xB3, 0x2E}, {0xB3, 0x2F}, {0xB3, 0x30}, /* 0xD0-0xD3 */ + {0xB3, 0x31}, {0xB3, 0x32}, {0xB3, 0x33}, {0xB3, 0x34}, /* 0xD4-0xD7 */ + {0xB3, 0x35}, {0xB3, 0x36}, {0xB3, 0x37}, {0xB3, 0x38}, /* 0xD8-0xDB */ + {0xB3, 0x39}, {0xB3, 0x3A}, {0xB3, 0x3B}, {0xB3, 0x3C}, /* 0xDC-0xDF */ + {0xB3, 0x3D}, {0xB3, 0x3E}, {0xB3, 0x3F}, {0xB3, 0x40}, /* 0xE0-0xE3 */ + {0xB3, 0x41}, {0xB3, 0x42}, {0xB3, 0x43}, {0xB3, 0x44}, /* 0xE4-0xE7 */ + {0xB3, 0x45}, {0xB3, 0x46}, {0xB3, 0x47}, {0xB3, 0x48}, /* 0xE8-0xEB */ + {0xB3, 0x49}, {0xB3, 0x4A}, {0xB3, 0x4B}, {0xB3, 0x4C}, /* 0xEC-0xEF */ + {0xB3, 0x4D}, {0xB3, 0x4E}, {0xB3, 0x4F}, {0xB3, 0x50}, /* 0xF0-0xF3 */ + {0xB3, 0x51}, {0xB3, 0x52}, {0xB3, 0x53}, {0xB3, 0x57}, /* 0xF4-0xF7 */ + {0xB3, 0x59}, {0xB3, 0x5A}, {0xB3, 0x5D}, {0xB3, 0x60}, /* 0xF8-0xFB */ + {0xB3, 0x61}, {0xB3, 0x62}, {0xB3, 0x63}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_89[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB3, 0x66}, {0xB3, 0x68}, {0xB3, 0x6A}, /* 0x40-0x43 */ + {0xB3, 0x6C}, {0xB3, 0x6D}, {0xB3, 0x6F}, {0xB3, 0x72}, /* 0x44-0x47 */ + {0xB3, 0x73}, {0xB3, 0x75}, {0xB3, 0x76}, {0xB3, 0x77}, /* 0x48-0x4B */ + {0xB3, 0x79}, {0xB3, 0x7A}, {0xB3, 0x7B}, {0xB3, 0x7C}, /* 0x4C-0x4F */ + {0xB3, 0x7D}, {0xB3, 0x7E}, {0xB3, 0x7F}, {0xB3, 0x82}, /* 0x50-0x53 */ + {0xB3, 0x86}, {0xB3, 0x87}, {0xB3, 0x88}, {0xB3, 0x89}, /* 0x54-0x57 */ + {0xB3, 0x8A}, {0xB3, 0x8B}, {0xB3, 0x8D}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB3, 0x8E}, {0xB3, 0x8F}, {0xB3, 0x91}, /* 0x60-0x63 */ + {0xB3, 0x92}, {0xB3, 0x93}, {0xB3, 0x95}, {0xB3, 0x96}, /* 0x64-0x67 */ + {0xB3, 0x97}, {0xB3, 0x98}, {0xB3, 0x99}, {0xB3, 0x9A}, /* 0x68-0x6B */ + {0xB3, 0x9B}, {0xB3, 0x9C}, {0xB3, 0x9D}, {0xB3, 0x9E}, /* 0x6C-0x6F */ + {0xB3, 0x9F}, {0xB3, 0xA2}, {0xB3, 0xA3}, {0xB3, 0xA4}, /* 0x70-0x73 */ + {0xB3, 0xA5}, {0xB3, 0xA6}, {0xB3, 0xA7}, {0xB3, 0xA9}, /* 0x74-0x77 */ + {0xB3, 0xAA}, {0xB3, 0xAB}, {0xB3, 0xAD}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB3, 0xAE}, {0xB3, 0xAF}, {0xB3, 0xB0}, /* 0x80-0x83 */ + {0xB3, 0xB1}, {0xB3, 0xB2}, {0xB3, 0xB3}, {0xB3, 0xB4}, /* 0x84-0x87 */ + {0xB3, 0xB5}, {0xB3, 0xB6}, {0xB3, 0xB7}, {0xB3, 0xB8}, /* 0x88-0x8B */ + {0xB3, 0xB9}, {0xB3, 0xBA}, {0xB3, 0xBB}, {0xB3, 0xBC}, /* 0x8C-0x8F */ + {0xB3, 0xBD}, {0xB3, 0xBE}, {0xB3, 0xBF}, {0xB3, 0xC0}, /* 0x90-0x93 */ + {0xB3, 0xC1}, {0xB3, 0xC2}, {0xB3, 0xC3}, {0xB3, 0xC6}, /* 0x94-0x97 */ + {0xB3, 0xC7}, {0xB3, 0xC9}, {0xB3, 0xCA}, {0xB3, 0xCD}, /* 0x98-0x9B */ + {0xB3, 0xCF}, {0xB3, 0xD1}, {0xB3, 0xD2}, {0xB3, 0xD3}, /* 0x9C-0x9F */ + {0xB3, 0xD6}, {0xB3, 0xD8}, {0xB3, 0xDA}, {0xB3, 0xDC}, /* 0xA0-0xA3 */ + {0xB3, 0xDE}, {0xB3, 0xDF}, {0xB3, 0xE1}, {0xB3, 0xE2}, /* 0xA4-0xA7 */ + {0xB3, 0xE3}, {0xB3, 0xE5}, {0xB3, 0xE6}, {0xB3, 0xE7}, /* 0xA8-0xAB */ + {0xB3, 0xE9}, {0xB3, 0xEA}, {0xB3, 0xEB}, {0xB3, 0xEC}, /* 0xAC-0xAF */ + {0xB3, 0xED}, {0xB3, 0xEE}, {0xB3, 0xEF}, {0xB3, 0xF0}, /* 0xB0-0xB3 */ + {0xB3, 0xF1}, {0xB3, 0xF2}, {0xB3, 0xF3}, {0xB3, 0xF4}, /* 0xB4-0xB7 */ + {0xB3, 0xF5}, {0xB3, 0xF6}, {0xB3, 0xF7}, {0xB3, 0xF8}, /* 0xB8-0xBB */ + {0xB3, 0xF9}, {0xB3, 0xFA}, {0xB3, 0xFB}, {0xB3, 0xFD}, /* 0xBC-0xBF */ + {0xB3, 0xFE}, {0xB3, 0xFF}, {0xB4, 0x00}, {0xB4, 0x01}, /* 0xC0-0xC3 */ + {0xB4, 0x02}, {0xB4, 0x03}, {0xB4, 0x04}, {0xB4, 0x05}, /* 0xC4-0xC7 */ + {0xB4, 0x06}, {0xB4, 0x07}, {0xB4, 0x08}, {0xB4, 0x09}, /* 0xC8-0xCB */ + {0xB4, 0x0A}, {0xB4, 0x0B}, {0xB4, 0x0C}, {0xB4, 0x0D}, /* 0xCC-0xCF */ + {0xB4, 0x0E}, {0xB4, 0x0F}, {0xB4, 0x11}, {0xB4, 0x12}, /* 0xD0-0xD3 */ + {0xB4, 0x13}, {0xB4, 0x14}, {0xB4, 0x15}, {0xB4, 0x16}, /* 0xD4-0xD7 */ + {0xB4, 0x17}, {0xB4, 0x19}, {0xB4, 0x1A}, {0xB4, 0x1B}, /* 0xD8-0xDB */ + {0xB4, 0x1D}, {0xB4, 0x1E}, {0xB4, 0x1F}, {0xB4, 0x21}, /* 0xDC-0xDF */ + {0xB4, 0x22}, {0xB4, 0x23}, {0xB4, 0x24}, {0xB4, 0x25}, /* 0xE0-0xE3 */ + {0xB4, 0x26}, {0xB4, 0x27}, {0xB4, 0x2A}, {0xB4, 0x2C}, /* 0xE4-0xE7 */ + {0xB4, 0x2D}, {0xB4, 0x2E}, {0xB4, 0x2F}, {0xB4, 0x30}, /* 0xE8-0xEB */ + {0xB4, 0x31}, {0xB4, 0x32}, {0xB4, 0x33}, {0xB4, 0x35}, /* 0xEC-0xEF */ + {0xB4, 0x36}, {0xB4, 0x37}, {0xB4, 0x38}, {0xB4, 0x39}, /* 0xF0-0xF3 */ + {0xB4, 0x3A}, {0xB4, 0x3B}, {0xB4, 0x3C}, {0xB4, 0x3D}, /* 0xF4-0xF7 */ + {0xB4, 0x3E}, {0xB4, 0x3F}, {0xB4, 0x40}, {0xB4, 0x41}, /* 0xF8-0xFB */ + {0xB4, 0x42}, {0xB4, 0x43}, {0xB4, 0x44}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8A[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB4, 0x45}, {0xB4, 0x46}, {0xB4, 0x47}, /* 0x40-0x43 */ + {0xB4, 0x48}, {0xB4, 0x49}, {0xB4, 0x4A}, {0xB4, 0x4B}, /* 0x44-0x47 */ + {0xB4, 0x4C}, {0xB4, 0x4D}, {0xB4, 0x4E}, {0xB4, 0x4F}, /* 0x48-0x4B */ + {0xB4, 0x52}, {0xB4, 0x53}, {0xB4, 0x55}, {0xB4, 0x56}, /* 0x4C-0x4F */ + {0xB4, 0x57}, {0xB4, 0x59}, {0xB4, 0x5A}, {0xB4, 0x5B}, /* 0x50-0x53 */ + {0xB4, 0x5C}, {0xB4, 0x5D}, {0xB4, 0x5E}, {0xB4, 0x5F}, /* 0x54-0x57 */ + {0xB4, 0x62}, {0xB4, 0x64}, {0xB4, 0x66}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB4, 0x67}, {0xB4, 0x68}, {0xB4, 0x69}, /* 0x60-0x63 */ + {0xB4, 0x6A}, {0xB4, 0x6B}, {0xB4, 0x6D}, {0xB4, 0x6E}, /* 0x64-0x67 */ + {0xB4, 0x6F}, {0xB4, 0x70}, {0xB4, 0x71}, {0xB4, 0x72}, /* 0x68-0x6B */ + {0xB4, 0x73}, {0xB4, 0x74}, {0xB4, 0x75}, {0xB4, 0x76}, /* 0x6C-0x6F */ + {0xB4, 0x77}, {0xB4, 0x78}, {0xB4, 0x79}, {0xB4, 0x7A}, /* 0x70-0x73 */ + {0xB4, 0x7B}, {0xB4, 0x7C}, {0xB4, 0x7D}, {0xB4, 0x7E}, /* 0x74-0x77 */ + {0xB4, 0x7F}, {0xB4, 0x81}, {0xB4, 0x82}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB4, 0x83}, {0xB4, 0x84}, {0xB4, 0x85}, /* 0x80-0x83 */ + {0xB4, 0x86}, {0xB4, 0x87}, {0xB4, 0x89}, {0xB4, 0x8A}, /* 0x84-0x87 */ + {0xB4, 0x8B}, {0xB4, 0x8C}, {0xB4, 0x8D}, {0xB4, 0x8E}, /* 0x88-0x8B */ + {0xB4, 0x8F}, {0xB4, 0x90}, {0xB4, 0x91}, {0xB4, 0x92}, /* 0x8C-0x8F */ + {0xB4, 0x93}, {0xB4, 0x94}, {0xB4, 0x95}, {0xB4, 0x96}, /* 0x90-0x93 */ + {0xB4, 0x97}, {0xB4, 0x98}, {0xB4, 0x99}, {0xB4, 0x9A}, /* 0x94-0x97 */ + {0xB4, 0x9B}, {0xB4, 0x9C}, {0xB4, 0x9E}, {0xB4, 0x9F}, /* 0x98-0x9B */ + {0xB4, 0xA0}, {0xB4, 0xA1}, {0xB4, 0xA2}, {0xB4, 0xA3}, /* 0x9C-0x9F */ + {0xB4, 0xA5}, {0xB4, 0xA6}, {0xB4, 0xA7}, {0xB4, 0xA9}, /* 0xA0-0xA3 */ + {0xB4, 0xAA}, {0xB4, 0xAB}, {0xB4, 0xAD}, {0xB4, 0xAE}, /* 0xA4-0xA7 */ + {0xB4, 0xAF}, {0xB4, 0xB0}, {0xB4, 0xB1}, {0xB4, 0xB2}, /* 0xA8-0xAB */ + {0xB4, 0xB3}, {0xB4, 0xB4}, {0xB4, 0xB6}, {0xB4, 0xB8}, /* 0xAC-0xAF */ + {0xB4, 0xBA}, {0xB4, 0xBB}, {0xB4, 0xBC}, {0xB4, 0xBD}, /* 0xB0-0xB3 */ + {0xB4, 0xBE}, {0xB4, 0xBF}, {0xB4, 0xC1}, {0xB4, 0xC2}, /* 0xB4-0xB7 */ + {0xB4, 0xC3}, {0xB4, 0xC5}, {0xB4, 0xC6}, {0xB4, 0xC7}, /* 0xB8-0xBB */ + {0xB4, 0xC9}, {0xB4, 0xCA}, {0xB4, 0xCB}, {0xB4, 0xCC}, /* 0xBC-0xBF */ + {0xB4, 0xCD}, {0xB4, 0xCE}, {0xB4, 0xCF}, {0xB4, 0xD1}, /* 0xC0-0xC3 */ + {0xB4, 0xD2}, {0xB4, 0xD3}, {0xB4, 0xD4}, {0xB4, 0xD6}, /* 0xC4-0xC7 */ + {0xB4, 0xD7}, {0xB4, 0xD8}, {0xB4, 0xD9}, {0xB4, 0xDA}, /* 0xC8-0xCB */ + {0xB4, 0xDB}, {0xB4, 0xDE}, {0xB4, 0xDF}, {0xB4, 0xE1}, /* 0xCC-0xCF */ + {0xB4, 0xE2}, {0xB4, 0xE5}, {0xB4, 0xE7}, {0xB4, 0xE8}, /* 0xD0-0xD3 */ + {0xB4, 0xE9}, {0xB4, 0xEA}, {0xB4, 0xEB}, {0xB4, 0xEE}, /* 0xD4-0xD7 */ + {0xB4, 0xF0}, {0xB4, 0xF2}, {0xB4, 0xF3}, {0xB4, 0xF4}, /* 0xD8-0xDB */ + {0xB4, 0xF5}, {0xB4, 0xF6}, {0xB4, 0xF7}, {0xB4, 0xF9}, /* 0xDC-0xDF */ + {0xB4, 0xFA}, {0xB4, 0xFB}, {0xB4, 0xFC}, {0xB4, 0xFD}, /* 0xE0-0xE3 */ + {0xB4, 0xFE}, {0xB4, 0xFF}, {0xB5, 0x00}, {0xB5, 0x01}, /* 0xE4-0xE7 */ + {0xB5, 0x02}, {0xB5, 0x03}, {0xB5, 0x04}, {0xB5, 0x05}, /* 0xE8-0xEB */ + {0xB5, 0x06}, {0xB5, 0x07}, {0xB5, 0x08}, {0xB5, 0x09}, /* 0xEC-0xEF */ + {0xB5, 0x0A}, {0xB5, 0x0B}, {0xB5, 0x0C}, {0xB5, 0x0D}, /* 0xF0-0xF3 */ + {0xB5, 0x0E}, {0xB5, 0x0F}, {0xB5, 0x10}, {0xB5, 0x11}, /* 0xF4-0xF7 */ + {0xB5, 0x12}, {0xB5, 0x13}, {0xB5, 0x16}, {0xB5, 0x17}, /* 0xF8-0xFB */ + {0xB5, 0x19}, {0xB5, 0x1A}, {0xB5, 0x1D}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8B[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB5, 0x1E}, {0xB5, 0x1F}, {0xB5, 0x20}, /* 0x40-0x43 */ + {0xB5, 0x21}, {0xB5, 0x22}, {0xB5, 0x23}, {0xB5, 0x26}, /* 0x44-0x47 */ + {0xB5, 0x2B}, {0xB5, 0x2C}, {0xB5, 0x2D}, {0xB5, 0x2E}, /* 0x48-0x4B */ + {0xB5, 0x2F}, {0xB5, 0x32}, {0xB5, 0x33}, {0xB5, 0x35}, /* 0x4C-0x4F */ + {0xB5, 0x36}, {0xB5, 0x37}, {0xB5, 0x39}, {0xB5, 0x3A}, /* 0x50-0x53 */ + {0xB5, 0x3B}, {0xB5, 0x3C}, {0xB5, 0x3D}, {0xB5, 0x3E}, /* 0x54-0x57 */ + {0xB5, 0x3F}, {0xB5, 0x42}, {0xB5, 0x46}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB5, 0x47}, {0xB5, 0x48}, {0xB5, 0x49}, /* 0x60-0x63 */ + {0xB5, 0x4A}, {0xB5, 0x4E}, {0xB5, 0x4F}, {0xB5, 0x51}, /* 0x64-0x67 */ + {0xB5, 0x52}, {0xB5, 0x53}, {0xB5, 0x55}, {0xB5, 0x56}, /* 0x68-0x6B */ + {0xB5, 0x57}, {0xB5, 0x58}, {0xB5, 0x59}, {0xB5, 0x5A}, /* 0x6C-0x6F */ + {0xB5, 0x5B}, {0xB5, 0x5E}, {0xB5, 0x62}, {0xB5, 0x63}, /* 0x70-0x73 */ + {0xB5, 0x64}, {0xB5, 0x65}, {0xB5, 0x66}, {0xB5, 0x67}, /* 0x74-0x77 */ + {0xB5, 0x68}, {0xB5, 0x69}, {0xB5, 0x6A}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB5, 0x6B}, {0xB5, 0x6C}, {0xB5, 0x6D}, /* 0x80-0x83 */ + {0xB5, 0x6E}, {0xB5, 0x6F}, {0xB5, 0x70}, {0xB5, 0x71}, /* 0x84-0x87 */ + {0xB5, 0x72}, {0xB5, 0x73}, {0xB5, 0x74}, {0xB5, 0x75}, /* 0x88-0x8B */ + {0xB5, 0x76}, {0xB5, 0x77}, {0xB5, 0x78}, {0xB5, 0x79}, /* 0x8C-0x8F */ + {0xB5, 0x7A}, {0xB5, 0x7B}, {0xB5, 0x7C}, {0xB5, 0x7D}, /* 0x90-0x93 */ + {0xB5, 0x7E}, {0xB5, 0x7F}, {0xB5, 0x80}, {0xB5, 0x81}, /* 0x94-0x97 */ + {0xB5, 0x82}, {0xB5, 0x83}, {0xB5, 0x84}, {0xB5, 0x85}, /* 0x98-0x9B */ + {0xB5, 0x86}, {0xB5, 0x87}, {0xB5, 0x88}, {0xB5, 0x89}, /* 0x9C-0x9F */ + {0xB5, 0x8A}, {0xB5, 0x8B}, {0xB5, 0x8C}, {0xB5, 0x8D}, /* 0xA0-0xA3 */ + {0xB5, 0x8E}, {0xB5, 0x8F}, {0xB5, 0x90}, {0xB5, 0x91}, /* 0xA4-0xA7 */ + {0xB5, 0x92}, {0xB5, 0x93}, {0xB5, 0x94}, {0xB5, 0x95}, /* 0xA8-0xAB */ + {0xB5, 0x96}, {0xB5, 0x97}, {0xB5, 0x98}, {0xB5, 0x99}, /* 0xAC-0xAF */ + {0xB5, 0x9A}, {0xB5, 0x9B}, {0xB5, 0x9C}, {0xB5, 0x9D}, /* 0xB0-0xB3 */ + {0xB5, 0x9E}, {0xB5, 0x9F}, {0xB5, 0xA2}, {0xB5, 0xA3}, /* 0xB4-0xB7 */ + {0xB5, 0xA5}, {0xB5, 0xA6}, {0xB5, 0xA7}, {0xB5, 0xA9}, /* 0xB8-0xBB */ + {0xB5, 0xAC}, {0xB5, 0xAD}, {0xB5, 0xAE}, {0xB5, 0xAF}, /* 0xBC-0xBF */ + {0xB5, 0xB2}, {0xB5, 0xB6}, {0xB5, 0xB7}, {0xB5, 0xB8}, /* 0xC0-0xC3 */ + {0xB5, 0xB9}, {0xB5, 0xBA}, {0xB5, 0xBE}, {0xB5, 0xBF}, /* 0xC4-0xC7 */ + {0xB5, 0xC1}, {0xB5, 0xC2}, {0xB5, 0xC3}, {0xB5, 0xC5}, /* 0xC8-0xCB */ + {0xB5, 0xC6}, {0xB5, 0xC7}, {0xB5, 0xC8}, {0xB5, 0xC9}, /* 0xCC-0xCF */ + {0xB5, 0xCA}, {0xB5, 0xCB}, {0xB5, 0xCE}, {0xB5, 0xD2}, /* 0xD0-0xD3 */ + {0xB5, 0xD3}, {0xB5, 0xD4}, {0xB5, 0xD5}, {0xB5, 0xD6}, /* 0xD4-0xD7 */ + {0xB5, 0xD7}, {0xB5, 0xD9}, {0xB5, 0xDA}, {0xB5, 0xDB}, /* 0xD8-0xDB */ + {0xB5, 0xDC}, {0xB5, 0xDD}, {0xB5, 0xDE}, {0xB5, 0xDF}, /* 0xDC-0xDF */ + {0xB5, 0xE0}, {0xB5, 0xE1}, {0xB5, 0xE2}, {0xB5, 0xE3}, /* 0xE0-0xE3 */ + {0xB5, 0xE4}, {0xB5, 0xE5}, {0xB5, 0xE6}, {0xB5, 0xE7}, /* 0xE4-0xE7 */ + {0xB5, 0xE8}, {0xB5, 0xE9}, {0xB5, 0xEA}, {0xB5, 0xEB}, /* 0xE8-0xEB */ + {0xB5, 0xED}, {0xB5, 0xEE}, {0xB5, 0xEF}, {0xB5, 0xF0}, /* 0xEC-0xEF */ + {0xB5, 0xF1}, {0xB5, 0xF2}, {0xB5, 0xF3}, {0xB5, 0xF4}, /* 0xF0-0xF3 */ + {0xB5, 0xF5}, {0xB5, 0xF6}, {0xB5, 0xF7}, {0xB5, 0xF8}, /* 0xF4-0xF7 */ + {0xB5, 0xF9}, {0xB5, 0xFA}, {0xB5, 0xFB}, {0xB5, 0xFC}, /* 0xF8-0xFB */ + {0xB5, 0xFD}, {0xB5, 0xFE}, {0xB5, 0xFF}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8C[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB6, 0x00}, {0xB6, 0x01}, {0xB6, 0x02}, /* 0x40-0x43 */ + {0xB6, 0x03}, {0xB6, 0x04}, {0xB6, 0x05}, {0xB6, 0x06}, /* 0x44-0x47 */ + {0xB6, 0x07}, {0xB6, 0x08}, {0xB6, 0x09}, {0xB6, 0x0A}, /* 0x48-0x4B */ + {0xB6, 0x0B}, {0xB6, 0x0C}, {0xB6, 0x0D}, {0xB6, 0x0E}, /* 0x4C-0x4F */ + {0xB6, 0x0F}, {0xB6, 0x12}, {0xB6, 0x13}, {0xB6, 0x15}, /* 0x50-0x53 */ + {0xB6, 0x16}, {0xB6, 0x17}, {0xB6, 0x19}, {0xB6, 0x1A}, /* 0x54-0x57 */ + {0xB6, 0x1B}, {0xB6, 0x1C}, {0xB6, 0x1D}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB6, 0x1E}, {0xB6, 0x1F}, {0xB6, 0x20}, /* 0x60-0x63 */ + {0xB6, 0x21}, {0xB6, 0x22}, {0xB6, 0x23}, {0xB6, 0x24}, /* 0x64-0x67 */ + {0xB6, 0x26}, {0xB6, 0x27}, {0xB6, 0x28}, {0xB6, 0x29}, /* 0x68-0x6B */ + {0xB6, 0x2A}, {0xB6, 0x2B}, {0xB6, 0x2D}, {0xB6, 0x2E}, /* 0x6C-0x6F */ + {0xB6, 0x2F}, {0xB6, 0x30}, {0xB6, 0x31}, {0xB6, 0x32}, /* 0x70-0x73 */ + {0xB6, 0x33}, {0xB6, 0x35}, {0xB6, 0x36}, {0xB6, 0x37}, /* 0x74-0x77 */ + {0xB6, 0x38}, {0xB6, 0x39}, {0xB6, 0x3A}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB6, 0x3B}, {0xB6, 0x3C}, {0xB6, 0x3D}, /* 0x80-0x83 */ + {0xB6, 0x3E}, {0xB6, 0x3F}, {0xB6, 0x40}, {0xB6, 0x41}, /* 0x84-0x87 */ + {0xB6, 0x42}, {0xB6, 0x43}, {0xB6, 0x44}, {0xB6, 0x45}, /* 0x88-0x8B */ + {0xB6, 0x46}, {0xB6, 0x47}, {0xB6, 0x49}, {0xB6, 0x4A}, /* 0x8C-0x8F */ + {0xB6, 0x4B}, {0xB6, 0x4C}, {0xB6, 0x4D}, {0xB6, 0x4E}, /* 0x90-0x93 */ + {0xB6, 0x4F}, {0xB6, 0x50}, {0xB6, 0x51}, {0xB6, 0x52}, /* 0x94-0x97 */ + {0xB6, 0x53}, {0xB6, 0x54}, {0xB6, 0x55}, {0xB6, 0x56}, /* 0x98-0x9B */ + {0xB6, 0x57}, {0xB6, 0x58}, {0xB6, 0x59}, {0xB6, 0x5A}, /* 0x9C-0x9F */ + {0xB6, 0x5B}, {0xB6, 0x5C}, {0xB6, 0x5D}, {0xB6, 0x5E}, /* 0xA0-0xA3 */ + {0xB6, 0x5F}, {0xB6, 0x60}, {0xB6, 0x61}, {0xB6, 0x62}, /* 0xA4-0xA7 */ + {0xB6, 0x63}, {0xB6, 0x65}, {0xB6, 0x66}, {0xB6, 0x67}, /* 0xA8-0xAB */ + {0xB6, 0x69}, {0xB6, 0x6A}, {0xB6, 0x6B}, {0xB6, 0x6C}, /* 0xAC-0xAF */ + {0xB6, 0x6D}, {0xB6, 0x6E}, {0xB6, 0x6F}, {0xB6, 0x70}, /* 0xB0-0xB3 */ + {0xB6, 0x71}, {0xB6, 0x72}, {0xB6, 0x73}, {0xB6, 0x74}, /* 0xB4-0xB7 */ + {0xB6, 0x75}, {0xB6, 0x76}, {0xB6, 0x77}, {0xB6, 0x78}, /* 0xB8-0xBB */ + {0xB6, 0x79}, {0xB6, 0x7A}, {0xB6, 0x7B}, {0xB6, 0x7C}, /* 0xBC-0xBF */ + {0xB6, 0x7D}, {0xB6, 0x7E}, {0xB6, 0x7F}, {0xB6, 0x80}, /* 0xC0-0xC3 */ + {0xB6, 0x81}, {0xB6, 0x82}, {0xB6, 0x83}, {0xB6, 0x84}, /* 0xC4-0xC7 */ + {0xB6, 0x85}, {0xB6, 0x86}, {0xB6, 0x87}, {0xB6, 0x88}, /* 0xC8-0xCB */ + {0xB6, 0x89}, {0xB6, 0x8A}, {0xB6, 0x8B}, {0xB6, 0x8C}, /* 0xCC-0xCF */ + {0xB6, 0x8D}, {0xB6, 0x8E}, {0xB6, 0x8F}, {0xB6, 0x90}, /* 0xD0-0xD3 */ + {0xB6, 0x91}, {0xB6, 0x92}, {0xB6, 0x93}, {0xB6, 0x94}, /* 0xD4-0xD7 */ + {0xB6, 0x95}, {0xB6, 0x96}, {0xB6, 0x97}, {0xB6, 0x98}, /* 0xD8-0xDB */ + {0xB6, 0x99}, {0xB6, 0x9A}, {0xB6, 0x9B}, {0xB6, 0x9E}, /* 0xDC-0xDF */ + {0xB6, 0x9F}, {0xB6, 0xA1}, {0xB6, 0xA2}, {0xB6, 0xA3}, /* 0xE0-0xE3 */ + {0xB6, 0xA5}, {0xB6, 0xA6}, {0xB6, 0xA7}, {0xB6, 0xA8}, /* 0xE4-0xE7 */ + {0xB6, 0xA9}, {0xB6, 0xAA}, {0xB6, 0xAD}, {0xB6, 0xAE}, /* 0xE8-0xEB */ + {0xB6, 0xAF}, {0xB6, 0xB0}, {0xB6, 0xB2}, {0xB6, 0xB3}, /* 0xEC-0xEF */ + {0xB6, 0xB4}, {0xB6, 0xB5}, {0xB6, 0xB6}, {0xB6, 0xB7}, /* 0xF0-0xF3 */ + {0xB6, 0xB8}, {0xB6, 0xB9}, {0xB6, 0xBA}, {0xB6, 0xBB}, /* 0xF4-0xF7 */ + {0xB6, 0xBC}, {0xB6, 0xBD}, {0xB6, 0xBE}, {0xB6, 0xBF}, /* 0xF8-0xFB */ + {0xB6, 0xC0}, {0xB6, 0xC1}, {0xB6, 0xC2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8D[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB6, 0xC3}, {0xB6, 0xC4}, {0xB6, 0xC5}, /* 0x40-0x43 */ + {0xB6, 0xC6}, {0xB6, 0xC7}, {0xB6, 0xC8}, {0xB6, 0xC9}, /* 0x44-0x47 */ + {0xB6, 0xCA}, {0xB6, 0xCB}, {0xB6, 0xCC}, {0xB6, 0xCD}, /* 0x48-0x4B */ + {0xB6, 0xCE}, {0xB6, 0xCF}, {0xB6, 0xD0}, {0xB6, 0xD1}, /* 0x4C-0x4F */ + {0xB6, 0xD2}, {0xB6, 0xD3}, {0xB6, 0xD5}, {0xB6, 0xD6}, /* 0x50-0x53 */ + {0xB6, 0xD7}, {0xB6, 0xD8}, {0xB6, 0xD9}, {0xB6, 0xDA}, /* 0x54-0x57 */ + {0xB6, 0xDB}, {0xB6, 0xDC}, {0xB6, 0xDD}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB6, 0xDE}, {0xB6, 0xDF}, {0xB6, 0xE0}, /* 0x60-0x63 */ + {0xB6, 0xE1}, {0xB6, 0xE2}, {0xB6, 0xE3}, {0xB6, 0xE4}, /* 0x64-0x67 */ + {0xB6, 0xE5}, {0xB6, 0xE6}, {0xB6, 0xE7}, {0xB6, 0xE8}, /* 0x68-0x6B */ + {0xB6, 0xE9}, {0xB6, 0xEA}, {0xB6, 0xEB}, {0xB6, 0xEC}, /* 0x6C-0x6F */ + {0xB6, 0xED}, {0xB6, 0xEE}, {0xB6, 0xEF}, {0xB6, 0xF1}, /* 0x70-0x73 */ + {0xB6, 0xF2}, {0xB6, 0xF3}, {0xB6, 0xF5}, {0xB6, 0xF6}, /* 0x74-0x77 */ + {0xB6, 0xF7}, {0xB6, 0xF9}, {0xB6, 0xFA}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB6, 0xFB}, {0xB6, 0xFC}, {0xB6, 0xFD}, /* 0x80-0x83 */ + {0xB6, 0xFE}, {0xB6, 0xFF}, {0xB7, 0x02}, {0xB7, 0x03}, /* 0x84-0x87 */ + {0xB7, 0x04}, {0xB7, 0x06}, {0xB7, 0x07}, {0xB7, 0x08}, /* 0x88-0x8B */ + {0xB7, 0x09}, {0xB7, 0x0A}, {0xB7, 0x0B}, {0xB7, 0x0C}, /* 0x8C-0x8F */ + {0xB7, 0x0D}, {0xB7, 0x0E}, {0xB7, 0x0F}, {0xB7, 0x10}, /* 0x90-0x93 */ + {0xB7, 0x11}, {0xB7, 0x12}, {0xB7, 0x13}, {0xB7, 0x14}, /* 0x94-0x97 */ + {0xB7, 0x15}, {0xB7, 0x16}, {0xB7, 0x17}, {0xB7, 0x18}, /* 0x98-0x9B */ + {0xB7, 0x19}, {0xB7, 0x1A}, {0xB7, 0x1B}, {0xB7, 0x1C}, /* 0x9C-0x9F */ + {0xB7, 0x1D}, {0xB7, 0x1E}, {0xB7, 0x1F}, {0xB7, 0x20}, /* 0xA0-0xA3 */ + {0xB7, 0x21}, {0xB7, 0x22}, {0xB7, 0x23}, {0xB7, 0x24}, /* 0xA4-0xA7 */ + {0xB7, 0x25}, {0xB7, 0x26}, {0xB7, 0x27}, {0xB7, 0x2A}, /* 0xA8-0xAB */ + {0xB7, 0x2B}, {0xB7, 0x2D}, {0xB7, 0x2E}, {0xB7, 0x31}, /* 0xAC-0xAF */ + {0xB7, 0x32}, {0xB7, 0x33}, {0xB7, 0x34}, {0xB7, 0x35}, /* 0xB0-0xB3 */ + {0xB7, 0x36}, {0xB7, 0x37}, {0xB7, 0x3A}, {0xB7, 0x3C}, /* 0xB4-0xB7 */ + {0xB7, 0x3D}, {0xB7, 0x3E}, {0xB7, 0x3F}, {0xB7, 0x40}, /* 0xB8-0xBB */ + {0xB7, 0x41}, {0xB7, 0x42}, {0xB7, 0x43}, {0xB7, 0x45}, /* 0xBC-0xBF */ + {0xB7, 0x46}, {0xB7, 0x47}, {0xB7, 0x49}, {0xB7, 0x4A}, /* 0xC0-0xC3 */ + {0xB7, 0x4B}, {0xB7, 0x4D}, {0xB7, 0x4E}, {0xB7, 0x4F}, /* 0xC4-0xC7 */ + {0xB7, 0x50}, {0xB7, 0x51}, {0xB7, 0x52}, {0xB7, 0x53}, /* 0xC8-0xCB */ + {0xB7, 0x56}, {0xB7, 0x57}, {0xB7, 0x58}, {0xB7, 0x59}, /* 0xCC-0xCF */ + {0xB7, 0x5A}, {0xB7, 0x5B}, {0xB7, 0x5C}, {0xB7, 0x5D}, /* 0xD0-0xD3 */ + {0xB7, 0x5E}, {0xB7, 0x5F}, {0xB7, 0x61}, {0xB7, 0x62}, /* 0xD4-0xD7 */ + {0xB7, 0x63}, {0xB7, 0x65}, {0xB7, 0x66}, {0xB7, 0x67}, /* 0xD8-0xDB */ + {0xB7, 0x69}, {0xB7, 0x6A}, {0xB7, 0x6B}, {0xB7, 0x6C}, /* 0xDC-0xDF */ + {0xB7, 0x6D}, {0xB7, 0x6E}, {0xB7, 0x6F}, {0xB7, 0x72}, /* 0xE0-0xE3 */ + {0xB7, 0x74}, {0xB7, 0x76}, {0xB7, 0x77}, {0xB7, 0x78}, /* 0xE4-0xE7 */ + {0xB7, 0x79}, {0xB7, 0x7A}, {0xB7, 0x7B}, {0xB7, 0x7E}, /* 0xE8-0xEB */ + {0xB7, 0x7F}, {0xB7, 0x81}, {0xB7, 0x82}, {0xB7, 0x83}, /* 0xEC-0xEF */ + {0xB7, 0x85}, {0xB7, 0x86}, {0xB7, 0x87}, {0xB7, 0x88}, /* 0xF0-0xF3 */ + {0xB7, 0x89}, {0xB7, 0x8A}, {0xB7, 0x8B}, {0xB7, 0x8E}, /* 0xF4-0xF7 */ + {0xB7, 0x93}, {0xB7, 0x94}, {0xB7, 0x95}, {0xB7, 0x9A}, /* 0xF8-0xFB */ + {0xB7, 0x9B}, {0xB7, 0x9D}, {0xB7, 0x9E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8E[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB7, 0x9F}, {0xB7, 0xA1}, {0xB7, 0xA2}, /* 0x40-0x43 */ + {0xB7, 0xA3}, {0xB7, 0xA4}, {0xB7, 0xA5}, {0xB7, 0xA6}, /* 0x44-0x47 */ + {0xB7, 0xA7}, {0xB7, 0xAA}, {0xB7, 0xAE}, {0xB7, 0xAF}, /* 0x48-0x4B */ + {0xB7, 0xB0}, {0xB7, 0xB1}, {0xB7, 0xB2}, {0xB7, 0xB3}, /* 0x4C-0x4F */ + {0xB7, 0xB6}, {0xB7, 0xB7}, {0xB7, 0xB9}, {0xB7, 0xBA}, /* 0x50-0x53 */ + {0xB7, 0xBB}, {0xB7, 0xBC}, {0xB7, 0xBD}, {0xB7, 0xBE}, /* 0x54-0x57 */ + {0xB7, 0xBF}, {0xB7, 0xC0}, {0xB7, 0xC1}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB7, 0xC2}, {0xB7, 0xC3}, {0xB7, 0xC4}, /* 0x60-0x63 */ + {0xB7, 0xC5}, {0xB7, 0xC6}, {0xB7, 0xC8}, {0xB7, 0xCA}, /* 0x64-0x67 */ + {0xB7, 0xCB}, {0xB7, 0xCC}, {0xB7, 0xCD}, {0xB7, 0xCE}, /* 0x68-0x6B */ + {0xB7, 0xCF}, {0xB7, 0xD0}, {0xB7, 0xD1}, {0xB7, 0xD2}, /* 0x6C-0x6F */ + {0xB7, 0xD3}, {0xB7, 0xD4}, {0xB7, 0xD5}, {0xB7, 0xD6}, /* 0x70-0x73 */ + {0xB7, 0xD7}, {0xB7, 0xD8}, {0xB7, 0xD9}, {0xB7, 0xDA}, /* 0x74-0x77 */ + {0xB7, 0xDB}, {0xB7, 0xDC}, {0xB7, 0xDD}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB7, 0xDE}, {0xB7, 0xDF}, {0xB7, 0xE0}, /* 0x80-0x83 */ + {0xB7, 0xE1}, {0xB7, 0xE2}, {0xB7, 0xE3}, {0xB7, 0xE4}, /* 0x84-0x87 */ + {0xB7, 0xE5}, {0xB7, 0xE6}, {0xB7, 0xE7}, {0xB7, 0xE8}, /* 0x88-0x8B */ + {0xB7, 0xE9}, {0xB7, 0xEA}, {0xB7, 0xEB}, {0xB7, 0xEE}, /* 0x8C-0x8F */ + {0xB7, 0xEF}, {0xB7, 0xF1}, {0xB7, 0xF2}, {0xB7, 0xF3}, /* 0x90-0x93 */ + {0xB7, 0xF5}, {0xB7, 0xF6}, {0xB7, 0xF7}, {0xB7, 0xF8}, /* 0x94-0x97 */ + {0xB7, 0xF9}, {0xB7, 0xFA}, {0xB7, 0xFB}, {0xB7, 0xFE}, /* 0x98-0x9B */ + {0xB8, 0x02}, {0xB8, 0x03}, {0xB8, 0x04}, {0xB8, 0x05}, /* 0x9C-0x9F */ + {0xB8, 0x06}, {0xB8, 0x0A}, {0xB8, 0x0B}, {0xB8, 0x0D}, /* 0xA0-0xA3 */ + {0xB8, 0x0E}, {0xB8, 0x0F}, {0xB8, 0x11}, {0xB8, 0x12}, /* 0xA4-0xA7 */ + {0xB8, 0x13}, {0xB8, 0x14}, {0xB8, 0x15}, {0xB8, 0x16}, /* 0xA8-0xAB */ + {0xB8, 0x17}, {0xB8, 0x1A}, {0xB8, 0x1C}, {0xB8, 0x1E}, /* 0xAC-0xAF */ + {0xB8, 0x1F}, {0xB8, 0x20}, {0xB8, 0x21}, {0xB8, 0x22}, /* 0xB0-0xB3 */ + {0xB8, 0x23}, {0xB8, 0x26}, {0xB8, 0x27}, {0xB8, 0x29}, /* 0xB4-0xB7 */ + {0xB8, 0x2A}, {0xB8, 0x2B}, {0xB8, 0x2D}, {0xB8, 0x2E}, /* 0xB8-0xBB */ + {0xB8, 0x2F}, {0xB8, 0x30}, {0xB8, 0x31}, {0xB8, 0x32}, /* 0xBC-0xBF */ + {0xB8, 0x33}, {0xB8, 0x36}, {0xB8, 0x3A}, {0xB8, 0x3B}, /* 0xC0-0xC3 */ + {0xB8, 0x3C}, {0xB8, 0x3D}, {0xB8, 0x3E}, {0xB8, 0x3F}, /* 0xC4-0xC7 */ + {0xB8, 0x41}, {0xB8, 0x42}, {0xB8, 0x43}, {0xB8, 0x45}, /* 0xC8-0xCB */ + {0xB8, 0x46}, {0xB8, 0x47}, {0xB8, 0x48}, {0xB8, 0x49}, /* 0xCC-0xCF */ + {0xB8, 0x4A}, {0xB8, 0x4B}, {0xB8, 0x4C}, {0xB8, 0x4D}, /* 0xD0-0xD3 */ + {0xB8, 0x4E}, {0xB8, 0x4F}, {0xB8, 0x50}, {0xB8, 0x52}, /* 0xD4-0xD7 */ + {0xB8, 0x54}, {0xB8, 0x55}, {0xB8, 0x56}, {0xB8, 0x57}, /* 0xD8-0xDB */ + {0xB8, 0x58}, {0xB8, 0x59}, {0xB8, 0x5A}, {0xB8, 0x5B}, /* 0xDC-0xDF */ + {0xB8, 0x5E}, {0xB8, 0x5F}, {0xB8, 0x61}, {0xB8, 0x62}, /* 0xE0-0xE3 */ + {0xB8, 0x63}, {0xB8, 0x65}, {0xB8, 0x66}, {0xB8, 0x67}, /* 0xE4-0xE7 */ + {0xB8, 0x68}, {0xB8, 0x69}, {0xB8, 0x6A}, {0xB8, 0x6B}, /* 0xE8-0xEB */ + {0xB8, 0x6E}, {0xB8, 0x70}, {0xB8, 0x72}, {0xB8, 0x73}, /* 0xEC-0xEF */ + {0xB8, 0x74}, {0xB8, 0x75}, {0xB8, 0x76}, {0xB8, 0x77}, /* 0xF0-0xF3 */ + {0xB8, 0x79}, {0xB8, 0x7A}, {0xB8, 0x7B}, {0xB8, 0x7D}, /* 0xF4-0xF7 */ + {0xB8, 0x7E}, {0xB8, 0x7F}, {0xB8, 0x80}, {0xB8, 0x81}, /* 0xF8-0xFB */ + {0xB8, 0x82}, {0xB8, 0x83}, {0xB8, 0x84}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_8F[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB8, 0x85}, {0xB8, 0x86}, {0xB8, 0x87}, /* 0x40-0x43 */ + {0xB8, 0x88}, {0xB8, 0x89}, {0xB8, 0x8A}, {0xB8, 0x8B}, /* 0x44-0x47 */ + {0xB8, 0x8C}, {0xB8, 0x8E}, {0xB8, 0x8F}, {0xB8, 0x90}, /* 0x48-0x4B */ + {0xB8, 0x91}, {0xB8, 0x92}, {0xB8, 0x93}, {0xB8, 0x94}, /* 0x4C-0x4F */ + {0xB8, 0x95}, {0xB8, 0x96}, {0xB8, 0x97}, {0xB8, 0x98}, /* 0x50-0x53 */ + {0xB8, 0x99}, {0xB8, 0x9A}, {0xB8, 0x9B}, {0xB8, 0x9C}, /* 0x54-0x57 */ + {0xB8, 0x9D}, {0xB8, 0x9E}, {0xB8, 0x9F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB8, 0xA0}, {0xB8, 0xA1}, {0xB8, 0xA2}, /* 0x60-0x63 */ + {0xB8, 0xA3}, {0xB8, 0xA4}, {0xB8, 0xA5}, {0xB8, 0xA6}, /* 0x64-0x67 */ + {0xB8, 0xA7}, {0xB8, 0xA9}, {0xB8, 0xAA}, {0xB8, 0xAB}, /* 0x68-0x6B */ + {0xB8, 0xAC}, {0xB8, 0xAD}, {0xB8, 0xAE}, {0xB8, 0xAF}, /* 0x6C-0x6F */ + {0xB8, 0xB1}, {0xB8, 0xB2}, {0xB8, 0xB3}, {0xB8, 0xB5}, /* 0x70-0x73 */ + {0xB8, 0xB6}, {0xB8, 0xB7}, {0xB8, 0xB9}, {0xB8, 0xBA}, /* 0x74-0x77 */ + {0xB8, 0xBB}, {0xB8, 0xBC}, {0xB8, 0xBD}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB8, 0xBE}, {0xB8, 0xBF}, {0xB8, 0xC2}, /* 0x80-0x83 */ + {0xB8, 0xC4}, {0xB8, 0xC6}, {0xB8, 0xC7}, {0xB8, 0xC8}, /* 0x84-0x87 */ + {0xB8, 0xC9}, {0xB8, 0xCA}, {0xB8, 0xCB}, {0xB8, 0xCD}, /* 0x88-0x8B */ + {0xB8, 0xCE}, {0xB8, 0xCF}, {0xB8, 0xD1}, {0xB8, 0xD2}, /* 0x8C-0x8F */ + {0xB8, 0xD3}, {0xB8, 0xD5}, {0xB8, 0xD6}, {0xB8, 0xD7}, /* 0x90-0x93 */ + {0xB8, 0xD8}, {0xB8, 0xD9}, {0xB8, 0xDA}, {0xB8, 0xDB}, /* 0x94-0x97 */ + {0xB8, 0xDC}, {0xB8, 0xDE}, {0xB8, 0xE0}, {0xB8, 0xE2}, /* 0x98-0x9B */ + {0xB8, 0xE3}, {0xB8, 0xE4}, {0xB8, 0xE5}, {0xB8, 0xE6}, /* 0x9C-0x9F */ + {0xB8, 0xE7}, {0xB8, 0xEA}, {0xB8, 0xEB}, {0xB8, 0xED}, /* 0xA0-0xA3 */ + {0xB8, 0xEE}, {0xB8, 0xEF}, {0xB8, 0xF1}, {0xB8, 0xF2}, /* 0xA4-0xA7 */ + {0xB8, 0xF3}, {0xB8, 0xF4}, {0xB8, 0xF5}, {0xB8, 0xF6}, /* 0xA8-0xAB */ + {0xB8, 0xF7}, {0xB8, 0xFA}, {0xB8, 0xFC}, {0xB8, 0xFE}, /* 0xAC-0xAF */ + {0xB8, 0xFF}, {0xB9, 0x00}, {0xB9, 0x01}, {0xB9, 0x02}, /* 0xB0-0xB3 */ + {0xB9, 0x03}, {0xB9, 0x05}, {0xB9, 0x06}, {0xB9, 0x07}, /* 0xB4-0xB7 */ + {0xB9, 0x08}, {0xB9, 0x09}, {0xB9, 0x0A}, {0xB9, 0x0B}, /* 0xB8-0xBB */ + {0xB9, 0x0C}, {0xB9, 0x0D}, {0xB9, 0x0E}, {0xB9, 0x0F}, /* 0xBC-0xBF */ + {0xB9, 0x10}, {0xB9, 0x11}, {0xB9, 0x12}, {0xB9, 0x13}, /* 0xC0-0xC3 */ + {0xB9, 0x14}, {0xB9, 0x15}, {0xB9, 0x16}, {0xB9, 0x17}, /* 0xC4-0xC7 */ + {0xB9, 0x19}, {0xB9, 0x1A}, {0xB9, 0x1B}, {0xB9, 0x1C}, /* 0xC8-0xCB */ + {0xB9, 0x1D}, {0xB9, 0x1E}, {0xB9, 0x1F}, {0xB9, 0x21}, /* 0xCC-0xCF */ + {0xB9, 0x22}, {0xB9, 0x23}, {0xB9, 0x24}, {0xB9, 0x25}, /* 0xD0-0xD3 */ + {0xB9, 0x26}, {0xB9, 0x27}, {0xB9, 0x28}, {0xB9, 0x29}, /* 0xD4-0xD7 */ + {0xB9, 0x2A}, {0xB9, 0x2B}, {0xB9, 0x2C}, {0xB9, 0x2D}, /* 0xD8-0xDB */ + {0xB9, 0x2E}, {0xB9, 0x2F}, {0xB9, 0x30}, {0xB9, 0x31}, /* 0xDC-0xDF */ + {0xB9, 0x32}, {0xB9, 0x33}, {0xB9, 0x34}, {0xB9, 0x35}, /* 0xE0-0xE3 */ + {0xB9, 0x36}, {0xB9, 0x37}, {0xB9, 0x38}, {0xB9, 0x39}, /* 0xE4-0xE7 */ + {0xB9, 0x3A}, {0xB9, 0x3B}, {0xB9, 0x3E}, {0xB9, 0x3F}, /* 0xE8-0xEB */ + {0xB9, 0x41}, {0xB9, 0x42}, {0xB9, 0x43}, {0xB9, 0x45}, /* 0xEC-0xEF */ + {0xB9, 0x46}, {0xB9, 0x47}, {0xB9, 0x48}, {0xB9, 0x49}, /* 0xF0-0xF3 */ + {0xB9, 0x4A}, {0xB9, 0x4B}, {0xB9, 0x4D}, {0xB9, 0x4E}, /* 0xF4-0xF7 */ + {0xB9, 0x50}, {0xB9, 0x52}, {0xB9, 0x53}, {0xB9, 0x54}, /* 0xF8-0xFB */ + {0xB9, 0x55}, {0xB9, 0x56}, {0xB9, 0x57}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_90[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xB9, 0x5A}, {0xB9, 0x5B}, {0xB9, 0x5D}, /* 0x40-0x43 */ + {0xB9, 0x5E}, {0xB9, 0x5F}, {0xB9, 0x61}, {0xB9, 0x62}, /* 0x44-0x47 */ + {0xB9, 0x63}, {0xB9, 0x64}, {0xB9, 0x65}, {0xB9, 0x66}, /* 0x48-0x4B */ + {0xB9, 0x67}, {0xB9, 0x6A}, {0xB9, 0x6C}, {0xB9, 0x6E}, /* 0x4C-0x4F */ + {0xB9, 0x6F}, {0xB9, 0x70}, {0xB9, 0x71}, {0xB9, 0x72}, /* 0x50-0x53 */ + {0xB9, 0x73}, {0xB9, 0x76}, {0xB9, 0x77}, {0xB9, 0x79}, /* 0x54-0x57 */ + {0xB9, 0x7A}, {0xB9, 0x7B}, {0xB9, 0x7D}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xB9, 0x7E}, {0xB9, 0x7F}, {0xB9, 0x80}, /* 0x60-0x63 */ + {0xB9, 0x81}, {0xB9, 0x82}, {0xB9, 0x83}, {0xB9, 0x86}, /* 0x64-0x67 */ + {0xB9, 0x88}, {0xB9, 0x8B}, {0xB9, 0x8C}, {0xB9, 0x8F}, /* 0x68-0x6B */ + {0xB9, 0x90}, {0xB9, 0x91}, {0xB9, 0x92}, {0xB9, 0x93}, /* 0x6C-0x6F */ + {0xB9, 0x94}, {0xB9, 0x95}, {0xB9, 0x96}, {0xB9, 0x97}, /* 0x70-0x73 */ + {0xB9, 0x98}, {0xB9, 0x99}, {0xB9, 0x9A}, {0xB9, 0x9B}, /* 0x74-0x77 */ + {0xB9, 0x9C}, {0xB9, 0x9D}, {0xB9, 0x9E}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xB9, 0x9F}, {0xB9, 0xA0}, {0xB9, 0xA1}, /* 0x80-0x83 */ + {0xB9, 0xA2}, {0xB9, 0xA3}, {0xB9, 0xA4}, {0xB9, 0xA5}, /* 0x84-0x87 */ + {0xB9, 0xA6}, {0xB9, 0xA7}, {0xB9, 0xA8}, {0xB9, 0xA9}, /* 0x88-0x8B */ + {0xB9, 0xAA}, {0xB9, 0xAB}, {0xB9, 0xAE}, {0xB9, 0xAF}, /* 0x8C-0x8F */ + {0xB9, 0xB1}, {0xB9, 0xB2}, {0xB9, 0xB3}, {0xB9, 0xB5}, /* 0x90-0x93 */ + {0xB9, 0xB6}, {0xB9, 0xB7}, {0xB9, 0xB8}, {0xB9, 0xB9}, /* 0x94-0x97 */ + {0xB9, 0xBA}, {0xB9, 0xBB}, {0xB9, 0xBE}, {0xB9, 0xC0}, /* 0x98-0x9B */ + {0xB9, 0xC2}, {0xB9, 0xC3}, {0xB9, 0xC4}, {0xB9, 0xC5}, /* 0x9C-0x9F */ + {0xB9, 0xC6}, {0xB9, 0xC7}, {0xB9, 0xCA}, {0xB9, 0xCB}, /* 0xA0-0xA3 */ + {0xB9, 0xCD}, {0xB9, 0xD3}, {0xB9, 0xD4}, {0xB9, 0xD5}, /* 0xA4-0xA7 */ + {0xB9, 0xD6}, {0xB9, 0xD7}, {0xB9, 0xDA}, {0xB9, 0xDC}, /* 0xA8-0xAB */ + {0xB9, 0xDF}, {0xB9, 0xE0}, {0xB9, 0xE2}, {0xB9, 0xE6}, /* 0xAC-0xAF */ + {0xB9, 0xE7}, {0xB9, 0xE9}, {0xB9, 0xEA}, {0xB9, 0xEB}, /* 0xB0-0xB3 */ + {0xB9, 0xED}, {0xB9, 0xEE}, {0xB9, 0xEF}, {0xB9, 0xF0}, /* 0xB4-0xB7 */ + {0xB9, 0xF1}, {0xB9, 0xF2}, {0xB9, 0xF3}, {0xB9, 0xF6}, /* 0xB8-0xBB */ + {0xB9, 0xFB}, {0xB9, 0xFC}, {0xB9, 0xFD}, {0xB9, 0xFE}, /* 0xBC-0xBF */ + {0xB9, 0xFF}, {0xBA, 0x02}, {0xBA, 0x03}, {0xBA, 0x04}, /* 0xC0-0xC3 */ + {0xBA, 0x05}, {0xBA, 0x06}, {0xBA, 0x07}, {0xBA, 0x09}, /* 0xC4-0xC7 */ + {0xBA, 0x0A}, {0xBA, 0x0B}, {0xBA, 0x0C}, {0xBA, 0x0D}, /* 0xC8-0xCB */ + {0xBA, 0x0E}, {0xBA, 0x0F}, {0xBA, 0x10}, {0xBA, 0x11}, /* 0xCC-0xCF */ + {0xBA, 0x12}, {0xBA, 0x13}, {0xBA, 0x14}, {0xBA, 0x16}, /* 0xD0-0xD3 */ + {0xBA, 0x17}, {0xBA, 0x18}, {0xBA, 0x19}, {0xBA, 0x1A}, /* 0xD4-0xD7 */ + {0xBA, 0x1B}, {0xBA, 0x1C}, {0xBA, 0x1D}, {0xBA, 0x1E}, /* 0xD8-0xDB */ + {0xBA, 0x1F}, {0xBA, 0x20}, {0xBA, 0x21}, {0xBA, 0x22}, /* 0xDC-0xDF */ + {0xBA, 0x23}, {0xBA, 0x24}, {0xBA, 0x25}, {0xBA, 0x26}, /* 0xE0-0xE3 */ + {0xBA, 0x27}, {0xBA, 0x28}, {0xBA, 0x29}, {0xBA, 0x2A}, /* 0xE4-0xE7 */ + {0xBA, 0x2B}, {0xBA, 0x2C}, {0xBA, 0x2D}, {0xBA, 0x2E}, /* 0xE8-0xEB */ + {0xBA, 0x2F}, {0xBA, 0x30}, {0xBA, 0x31}, {0xBA, 0x32}, /* 0xEC-0xEF */ + {0xBA, 0x33}, {0xBA, 0x34}, {0xBA, 0x35}, {0xBA, 0x36}, /* 0xF0-0xF3 */ + {0xBA, 0x37}, {0xBA, 0x3A}, {0xBA, 0x3B}, {0xBA, 0x3D}, /* 0xF4-0xF7 */ + {0xBA, 0x3E}, {0xBA, 0x3F}, {0xBA, 0x41}, {0xBA, 0x43}, /* 0xF8-0xFB */ + {0xBA, 0x44}, {0xBA, 0x45}, {0xBA, 0x46}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_91[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xBA, 0x47}, {0xBA, 0x4A}, {0xBA, 0x4C}, /* 0x40-0x43 */ + {0xBA, 0x4F}, {0xBA, 0x50}, {0xBA, 0x51}, {0xBA, 0x52}, /* 0x44-0x47 */ + {0xBA, 0x56}, {0xBA, 0x57}, {0xBA, 0x59}, {0xBA, 0x5A}, /* 0x48-0x4B */ + {0xBA, 0x5B}, {0xBA, 0x5D}, {0xBA, 0x5E}, {0xBA, 0x5F}, /* 0x4C-0x4F */ + {0xBA, 0x60}, {0xBA, 0x61}, {0xBA, 0x62}, {0xBA, 0x63}, /* 0x50-0x53 */ + {0xBA, 0x66}, {0xBA, 0x6A}, {0xBA, 0x6B}, {0xBA, 0x6C}, /* 0x54-0x57 */ + {0xBA, 0x6D}, {0xBA, 0x6E}, {0xBA, 0x6F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xBA, 0x72}, {0xBA, 0x73}, {0xBA, 0x75}, /* 0x60-0x63 */ + {0xBA, 0x76}, {0xBA, 0x77}, {0xBA, 0x79}, {0xBA, 0x7A}, /* 0x64-0x67 */ + {0xBA, 0x7B}, {0xBA, 0x7C}, {0xBA, 0x7D}, {0xBA, 0x7E}, /* 0x68-0x6B */ + {0xBA, 0x7F}, {0xBA, 0x80}, {0xBA, 0x81}, {0xBA, 0x82}, /* 0x6C-0x6F */ + {0xBA, 0x86}, {0xBA, 0x88}, {0xBA, 0x89}, {0xBA, 0x8A}, /* 0x70-0x73 */ + {0xBA, 0x8B}, {0xBA, 0x8D}, {0xBA, 0x8E}, {0xBA, 0x8F}, /* 0x74-0x77 */ + {0xBA, 0x90}, {0xBA, 0x91}, {0xBA, 0x92}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xBA, 0x93}, {0xBA, 0x94}, {0xBA, 0x95}, /* 0x80-0x83 */ + {0xBA, 0x96}, {0xBA, 0x97}, {0xBA, 0x98}, {0xBA, 0x99}, /* 0x84-0x87 */ + {0xBA, 0x9A}, {0xBA, 0x9B}, {0xBA, 0x9C}, {0xBA, 0x9D}, /* 0x88-0x8B */ + {0xBA, 0x9E}, {0xBA, 0x9F}, {0xBA, 0xA0}, {0xBA, 0xA1}, /* 0x8C-0x8F */ + {0xBA, 0xA2}, {0xBA, 0xA3}, {0xBA, 0xA4}, {0xBA, 0xA5}, /* 0x90-0x93 */ + {0xBA, 0xA6}, {0xBA, 0xA7}, {0xBA, 0xAA}, {0xBA, 0xAD}, /* 0x94-0x97 */ + {0xBA, 0xAE}, {0xBA, 0xAF}, {0xBA, 0xB1}, {0xBA, 0xB3}, /* 0x98-0x9B */ + {0xBA, 0xB4}, {0xBA, 0xB5}, {0xBA, 0xB6}, {0xBA, 0xB7}, /* 0x9C-0x9F */ + {0xBA, 0xBA}, {0xBA, 0xBC}, {0xBA, 0xBE}, {0xBA, 0xBF}, /* 0xA0-0xA3 */ + {0xBA, 0xC0}, {0xBA, 0xC1}, {0xBA, 0xC2}, {0xBA, 0xC3}, /* 0xA4-0xA7 */ + {0xBA, 0xC5}, {0xBA, 0xC6}, {0xBA, 0xC7}, {0xBA, 0xC9}, /* 0xA8-0xAB */ + {0xBA, 0xCA}, {0xBA, 0xCB}, {0xBA, 0xCC}, {0xBA, 0xCD}, /* 0xAC-0xAF */ + {0xBA, 0xCE}, {0xBA, 0xCF}, {0xBA, 0xD0}, {0xBA, 0xD1}, /* 0xB0-0xB3 */ + {0xBA, 0xD2}, {0xBA, 0xD3}, {0xBA, 0xD4}, {0xBA, 0xD5}, /* 0xB4-0xB7 */ + {0xBA, 0xD6}, {0xBA, 0xD7}, {0xBA, 0xDA}, {0xBA, 0xDB}, /* 0xB8-0xBB */ + {0xBA, 0xDC}, {0xBA, 0xDD}, {0xBA, 0xDE}, {0xBA, 0xDF}, /* 0xBC-0xBF */ + {0xBA, 0xE0}, {0xBA, 0xE1}, {0xBA, 0xE2}, {0xBA, 0xE3}, /* 0xC0-0xC3 */ + {0xBA, 0xE4}, {0xBA, 0xE5}, {0xBA, 0xE6}, {0xBA, 0xE7}, /* 0xC4-0xC7 */ + {0xBA, 0xE8}, {0xBA, 0xE9}, {0xBA, 0xEA}, {0xBA, 0xEB}, /* 0xC8-0xCB */ + {0xBA, 0xEC}, {0xBA, 0xED}, {0xBA, 0xEE}, {0xBA, 0xEF}, /* 0xCC-0xCF */ + {0xBA, 0xF0}, {0xBA, 0xF1}, {0xBA, 0xF2}, {0xBA, 0xF3}, /* 0xD0-0xD3 */ + {0xBA, 0xF4}, {0xBA, 0xF5}, {0xBA, 0xF6}, {0xBA, 0xF7}, /* 0xD4-0xD7 */ + {0xBA, 0xF8}, {0xBA, 0xF9}, {0xBA, 0xFA}, {0xBA, 0xFB}, /* 0xD8-0xDB */ + {0xBA, 0xFD}, {0xBA, 0xFE}, {0xBA, 0xFF}, {0xBB, 0x01}, /* 0xDC-0xDF */ + {0xBB, 0x02}, {0xBB, 0x03}, {0xBB, 0x05}, {0xBB, 0x06}, /* 0xE0-0xE3 */ + {0xBB, 0x07}, {0xBB, 0x08}, {0xBB, 0x09}, {0xBB, 0x0A}, /* 0xE4-0xE7 */ + {0xBB, 0x0B}, {0xBB, 0x0C}, {0xBB, 0x0E}, {0xBB, 0x10}, /* 0xE8-0xEB */ + {0xBB, 0x12}, {0xBB, 0x13}, {0xBB, 0x14}, {0xBB, 0x15}, /* 0xEC-0xEF */ + {0xBB, 0x16}, {0xBB, 0x17}, {0xBB, 0x19}, {0xBB, 0x1A}, /* 0xF0-0xF3 */ + {0xBB, 0x1B}, {0xBB, 0x1D}, {0xBB, 0x1E}, {0xBB, 0x1F}, /* 0xF4-0xF7 */ + {0xBB, 0x21}, {0xBB, 0x22}, {0xBB, 0x23}, {0xBB, 0x24}, /* 0xF8-0xFB */ + {0xBB, 0x25}, {0xBB, 0x26}, {0xBB, 0x27}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_92[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xBB, 0x28}, {0xBB, 0x2A}, {0xBB, 0x2C}, /* 0x40-0x43 */ + {0xBB, 0x2D}, {0xBB, 0x2E}, {0xBB, 0x2F}, {0xBB, 0x30}, /* 0x44-0x47 */ + {0xBB, 0x31}, {0xBB, 0x32}, {0xBB, 0x33}, {0xBB, 0x37}, /* 0x48-0x4B */ + {0xBB, 0x39}, {0xBB, 0x3A}, {0xBB, 0x3F}, {0xBB, 0x40}, /* 0x4C-0x4F */ + {0xBB, 0x41}, {0xBB, 0x42}, {0xBB, 0x43}, {0xBB, 0x46}, /* 0x50-0x53 */ + {0xBB, 0x48}, {0xBB, 0x4A}, {0xBB, 0x4B}, {0xBB, 0x4C}, /* 0x54-0x57 */ + {0xBB, 0x4E}, {0xBB, 0x51}, {0xBB, 0x52}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xBB, 0x53}, {0xBB, 0x55}, {0xBB, 0x56}, /* 0x60-0x63 */ + {0xBB, 0x57}, {0xBB, 0x59}, {0xBB, 0x5A}, {0xBB, 0x5B}, /* 0x64-0x67 */ + {0xBB, 0x5C}, {0xBB, 0x5D}, {0xBB, 0x5E}, {0xBB, 0x5F}, /* 0x68-0x6B */ + {0xBB, 0x60}, {0xBB, 0x62}, {0xBB, 0x64}, {0xBB, 0x65}, /* 0x6C-0x6F */ + {0xBB, 0x66}, {0xBB, 0x67}, {0xBB, 0x68}, {0xBB, 0x69}, /* 0x70-0x73 */ + {0xBB, 0x6A}, {0xBB, 0x6B}, {0xBB, 0x6D}, {0xBB, 0x6E}, /* 0x74-0x77 */ + {0xBB, 0x6F}, {0xBB, 0x70}, {0xBB, 0x71}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xBB, 0x72}, {0xBB, 0x73}, {0xBB, 0x74}, /* 0x80-0x83 */ + {0xBB, 0x75}, {0xBB, 0x76}, {0xBB, 0x77}, {0xBB, 0x78}, /* 0x84-0x87 */ + {0xBB, 0x79}, {0xBB, 0x7A}, {0xBB, 0x7B}, {0xBB, 0x7C}, /* 0x88-0x8B */ + {0xBB, 0x7D}, {0xBB, 0x7E}, {0xBB, 0x7F}, {0xBB, 0x80}, /* 0x8C-0x8F */ + {0xBB, 0x81}, {0xBB, 0x82}, {0xBB, 0x83}, {0xBB, 0x84}, /* 0x90-0x93 */ + {0xBB, 0x85}, {0xBB, 0x86}, {0xBB, 0x87}, {0xBB, 0x89}, /* 0x94-0x97 */ + {0xBB, 0x8A}, {0xBB, 0x8B}, {0xBB, 0x8D}, {0xBB, 0x8E}, /* 0x98-0x9B */ + {0xBB, 0x8F}, {0xBB, 0x91}, {0xBB, 0x92}, {0xBB, 0x93}, /* 0x9C-0x9F */ + {0xBB, 0x94}, {0xBB, 0x95}, {0xBB, 0x96}, {0xBB, 0x97}, /* 0xA0-0xA3 */ + {0xBB, 0x98}, {0xBB, 0x99}, {0xBB, 0x9A}, {0xBB, 0x9B}, /* 0xA4-0xA7 */ + {0xBB, 0x9C}, {0xBB, 0x9D}, {0xBB, 0x9E}, {0xBB, 0x9F}, /* 0xA8-0xAB */ + {0xBB, 0xA0}, {0xBB, 0xA1}, {0xBB, 0xA2}, {0xBB, 0xA3}, /* 0xAC-0xAF */ + {0xBB, 0xA5}, {0xBB, 0xA6}, {0xBB, 0xA7}, {0xBB, 0xA9}, /* 0xB0-0xB3 */ + {0xBB, 0xAA}, {0xBB, 0xAB}, {0xBB, 0xAD}, {0xBB, 0xAE}, /* 0xB4-0xB7 */ + {0xBB, 0xAF}, {0xBB, 0xB0}, {0xBB, 0xB1}, {0xBB, 0xB2}, /* 0xB8-0xBB */ + {0xBB, 0xB3}, {0xBB, 0xB5}, {0xBB, 0xB6}, {0xBB, 0xB8}, /* 0xBC-0xBF */ + {0xBB, 0xB9}, {0xBB, 0xBA}, {0xBB, 0xBB}, {0xBB, 0xBC}, /* 0xC0-0xC3 */ + {0xBB, 0xBD}, {0xBB, 0xBE}, {0xBB, 0xBF}, {0xBB, 0xC1}, /* 0xC4-0xC7 */ + {0xBB, 0xC2}, {0xBB, 0xC3}, {0xBB, 0xC5}, {0xBB, 0xC6}, /* 0xC8-0xCB */ + {0xBB, 0xC7}, {0xBB, 0xC9}, {0xBB, 0xCA}, {0xBB, 0xCB}, /* 0xCC-0xCF */ + {0xBB, 0xCC}, {0xBB, 0xCD}, {0xBB, 0xCE}, {0xBB, 0xCF}, /* 0xD0-0xD3 */ + {0xBB, 0xD1}, {0xBB, 0xD2}, {0xBB, 0xD4}, {0xBB, 0xD5}, /* 0xD4-0xD7 */ + {0xBB, 0xD6}, {0xBB, 0xD7}, {0xBB, 0xD8}, {0xBB, 0xD9}, /* 0xD8-0xDB */ + {0xBB, 0xDA}, {0xBB, 0xDB}, {0xBB, 0xDC}, {0xBB, 0xDD}, /* 0xDC-0xDF */ + {0xBB, 0xDE}, {0xBB, 0xDF}, {0xBB, 0xE0}, {0xBB, 0xE1}, /* 0xE0-0xE3 */ + {0xBB, 0xE2}, {0xBB, 0xE3}, {0xBB, 0xE4}, {0xBB, 0xE5}, /* 0xE4-0xE7 */ + {0xBB, 0xE6}, {0xBB, 0xE7}, {0xBB, 0xE8}, {0xBB, 0xE9}, /* 0xE8-0xEB */ + {0xBB, 0xEA}, {0xBB, 0xEB}, {0xBB, 0xEC}, {0xBB, 0xED}, /* 0xEC-0xEF */ + {0xBB, 0xEE}, {0xBB, 0xEF}, {0xBB, 0xF0}, {0xBB, 0xF1}, /* 0xF0-0xF3 */ + {0xBB, 0xF2}, {0xBB, 0xF3}, {0xBB, 0xF4}, {0xBB, 0xF5}, /* 0xF4-0xF7 */ + {0xBB, 0xF6}, {0xBB, 0xF7}, {0xBB, 0xFA}, {0xBB, 0xFB}, /* 0xF8-0xFB */ + {0xBB, 0xFD}, {0xBB, 0xFE}, {0xBC, 0x01}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_93[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xBC, 0x03}, {0xBC, 0x04}, {0xBC, 0x05}, /* 0x40-0x43 */ + {0xBC, 0x06}, {0xBC, 0x07}, {0xBC, 0x0A}, {0xBC, 0x0E}, /* 0x44-0x47 */ + {0xBC, 0x10}, {0xBC, 0x12}, {0xBC, 0x13}, {0xBC, 0x19}, /* 0x48-0x4B */ + {0xBC, 0x1A}, {0xBC, 0x20}, {0xBC, 0x21}, {0xBC, 0x22}, /* 0x4C-0x4F */ + {0xBC, 0x23}, {0xBC, 0x26}, {0xBC, 0x28}, {0xBC, 0x2A}, /* 0x50-0x53 */ + {0xBC, 0x2B}, {0xBC, 0x2C}, {0xBC, 0x2E}, {0xBC, 0x2F}, /* 0x54-0x57 */ + {0xBC, 0x32}, {0xBC, 0x33}, {0xBC, 0x35}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xBC, 0x36}, {0xBC, 0x37}, {0xBC, 0x39}, /* 0x60-0x63 */ + {0xBC, 0x3A}, {0xBC, 0x3B}, {0xBC, 0x3C}, {0xBC, 0x3D}, /* 0x64-0x67 */ + {0xBC, 0x3E}, {0xBC, 0x3F}, {0xBC, 0x42}, {0xBC, 0x46}, /* 0x68-0x6B */ + {0xBC, 0x47}, {0xBC, 0x48}, {0xBC, 0x4A}, {0xBC, 0x4B}, /* 0x6C-0x6F */ + {0xBC, 0x4E}, {0xBC, 0x4F}, {0xBC, 0x51}, {0xBC, 0x52}, /* 0x70-0x73 */ + {0xBC, 0x53}, {0xBC, 0x54}, {0xBC, 0x55}, {0xBC, 0x56}, /* 0x74-0x77 */ + {0xBC, 0x57}, {0xBC, 0x58}, {0xBC, 0x59}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xBC, 0x5A}, {0xBC, 0x5B}, {0xBC, 0x5C}, /* 0x80-0x83 */ + {0xBC, 0x5E}, {0xBC, 0x5F}, {0xBC, 0x60}, {0xBC, 0x61}, /* 0x84-0x87 */ + {0xBC, 0x62}, {0xBC, 0x63}, {0xBC, 0x64}, {0xBC, 0x65}, /* 0x88-0x8B */ + {0xBC, 0x66}, {0xBC, 0x67}, {0xBC, 0x68}, {0xBC, 0x69}, /* 0x8C-0x8F */ + {0xBC, 0x6A}, {0xBC, 0x6B}, {0xBC, 0x6C}, {0xBC, 0x6D}, /* 0x90-0x93 */ + {0xBC, 0x6E}, {0xBC, 0x6F}, {0xBC, 0x70}, {0xBC, 0x71}, /* 0x94-0x97 */ + {0xBC, 0x72}, {0xBC, 0x73}, {0xBC, 0x74}, {0xBC, 0x75}, /* 0x98-0x9B */ + {0xBC, 0x76}, {0xBC, 0x77}, {0xBC, 0x78}, {0xBC, 0x79}, /* 0x9C-0x9F */ + {0xBC, 0x7A}, {0xBC, 0x7B}, {0xBC, 0x7C}, {0xBC, 0x7D}, /* 0xA0-0xA3 */ + {0xBC, 0x7E}, {0xBC, 0x7F}, {0xBC, 0x80}, {0xBC, 0x81}, /* 0xA4-0xA7 */ + {0xBC, 0x82}, {0xBC, 0x83}, {0xBC, 0x86}, {0xBC, 0x87}, /* 0xA8-0xAB */ + {0xBC, 0x89}, {0xBC, 0x8A}, {0xBC, 0x8D}, {0xBC, 0x8F}, /* 0xAC-0xAF */ + {0xBC, 0x90}, {0xBC, 0x91}, {0xBC, 0x92}, {0xBC, 0x93}, /* 0xB0-0xB3 */ + {0xBC, 0x96}, {0xBC, 0x98}, {0xBC, 0x9B}, {0xBC, 0x9C}, /* 0xB4-0xB7 */ + {0xBC, 0x9D}, {0xBC, 0x9E}, {0xBC, 0x9F}, {0xBC, 0xA2}, /* 0xB8-0xBB */ + {0xBC, 0xA3}, {0xBC, 0xA5}, {0xBC, 0xA6}, {0xBC, 0xA9}, /* 0xBC-0xBF */ + {0xBC, 0xAA}, {0xBC, 0xAB}, {0xBC, 0xAC}, {0xBC, 0xAD}, /* 0xC0-0xC3 */ + {0xBC, 0xAE}, {0xBC, 0xAF}, {0xBC, 0xB2}, {0xBC, 0xB6}, /* 0xC4-0xC7 */ + {0xBC, 0xB7}, {0xBC, 0xB8}, {0xBC, 0xB9}, {0xBC, 0xBA}, /* 0xC8-0xCB */ + {0xBC, 0xBB}, {0xBC, 0xBE}, {0xBC, 0xBF}, {0xBC, 0xC1}, /* 0xCC-0xCF */ + {0xBC, 0xC2}, {0xBC, 0xC3}, {0xBC, 0xC5}, {0xBC, 0xC6}, /* 0xD0-0xD3 */ + {0xBC, 0xC7}, {0xBC, 0xC8}, {0xBC, 0xC9}, {0xBC, 0xCA}, /* 0xD4-0xD7 */ + {0xBC, 0xCB}, {0xBC, 0xCC}, {0xBC, 0xCE}, {0xBC, 0xD2}, /* 0xD8-0xDB */ + {0xBC, 0xD3}, {0xBC, 0xD4}, {0xBC, 0xD6}, {0xBC, 0xD7}, /* 0xDC-0xDF */ + {0xBC, 0xD9}, {0xBC, 0xDA}, {0xBC, 0xDB}, {0xBC, 0xDD}, /* 0xE0-0xE3 */ + {0xBC, 0xDE}, {0xBC, 0xDF}, {0xBC, 0xE0}, {0xBC, 0xE1}, /* 0xE4-0xE7 */ + {0xBC, 0xE2}, {0xBC, 0xE3}, {0xBC, 0xE4}, {0xBC, 0xE5}, /* 0xE8-0xEB */ + {0xBC, 0xE6}, {0xBC, 0xE7}, {0xBC, 0xE8}, {0xBC, 0xE9}, /* 0xEC-0xEF */ + {0xBC, 0xEA}, {0xBC, 0xEB}, {0xBC, 0xEC}, {0xBC, 0xED}, /* 0xF0-0xF3 */ + {0xBC, 0xEE}, {0xBC, 0xEF}, {0xBC, 0xF0}, {0xBC, 0xF1}, /* 0xF4-0xF7 */ + {0xBC, 0xF2}, {0xBC, 0xF3}, {0xBC, 0xF7}, {0xBC, 0xF9}, /* 0xF8-0xFB */ + {0xBC, 0xFA}, {0xBC, 0xFB}, {0xBC, 0xFD}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_94[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xBC, 0xFE}, {0xBC, 0xFF}, {0xBD, 0x00}, /* 0x40-0x43 */ + {0xBD, 0x01}, {0xBD, 0x02}, {0xBD, 0x03}, {0xBD, 0x06}, /* 0x44-0x47 */ + {0xBD, 0x08}, {0xBD, 0x0A}, {0xBD, 0x0B}, {0xBD, 0x0C}, /* 0x48-0x4B */ + {0xBD, 0x0D}, {0xBD, 0x0E}, {0xBD, 0x0F}, {0xBD, 0x11}, /* 0x4C-0x4F */ + {0xBD, 0x12}, {0xBD, 0x13}, {0xBD, 0x15}, {0xBD, 0x16}, /* 0x50-0x53 */ + {0xBD, 0x17}, {0xBD, 0x18}, {0xBD, 0x19}, {0xBD, 0x1A}, /* 0x54-0x57 */ + {0xBD, 0x1B}, {0xBD, 0x1C}, {0xBD, 0x1D}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xBD, 0x1E}, {0xBD, 0x1F}, {0xBD, 0x20}, /* 0x60-0x63 */ + {0xBD, 0x21}, {0xBD, 0x22}, {0xBD, 0x23}, {0xBD, 0x25}, /* 0x64-0x67 */ + {0xBD, 0x26}, {0xBD, 0x27}, {0xBD, 0x28}, {0xBD, 0x29}, /* 0x68-0x6B */ + {0xBD, 0x2A}, {0xBD, 0x2B}, {0xBD, 0x2D}, {0xBD, 0x2E}, /* 0x6C-0x6F */ + {0xBD, 0x2F}, {0xBD, 0x30}, {0xBD, 0x31}, {0xBD, 0x32}, /* 0x70-0x73 */ + {0xBD, 0x33}, {0xBD, 0x34}, {0xBD, 0x35}, {0xBD, 0x36}, /* 0x74-0x77 */ + {0xBD, 0x37}, {0xBD, 0x38}, {0xBD, 0x39}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xBD, 0x3A}, {0xBD, 0x3B}, {0xBD, 0x3C}, /* 0x80-0x83 */ + {0xBD, 0x3D}, {0xBD, 0x3E}, {0xBD, 0x3F}, {0xBD, 0x41}, /* 0x84-0x87 */ + {0xBD, 0x42}, {0xBD, 0x43}, {0xBD, 0x44}, {0xBD, 0x45}, /* 0x88-0x8B */ + {0xBD, 0x46}, {0xBD, 0x47}, {0xBD, 0x4A}, {0xBD, 0x4B}, /* 0x8C-0x8F */ + {0xBD, 0x4D}, {0xBD, 0x4E}, {0xBD, 0x4F}, {0xBD, 0x51}, /* 0x90-0x93 */ + {0xBD, 0x52}, {0xBD, 0x53}, {0xBD, 0x54}, {0xBD, 0x55}, /* 0x94-0x97 */ + {0xBD, 0x56}, {0xBD, 0x57}, {0xBD, 0x5A}, {0xBD, 0x5B}, /* 0x98-0x9B */ + {0xBD, 0x5C}, {0xBD, 0x5D}, {0xBD, 0x5E}, {0xBD, 0x5F}, /* 0x9C-0x9F */ + {0xBD, 0x60}, {0xBD, 0x61}, {0xBD, 0x62}, {0xBD, 0x63}, /* 0xA0-0xA3 */ + {0xBD, 0x65}, {0xBD, 0x66}, {0xBD, 0x67}, {0xBD, 0x69}, /* 0xA4-0xA7 */ + {0xBD, 0x6A}, {0xBD, 0x6B}, {0xBD, 0x6C}, {0xBD, 0x6D}, /* 0xA8-0xAB */ + {0xBD, 0x6E}, {0xBD, 0x6F}, {0xBD, 0x70}, {0xBD, 0x71}, /* 0xAC-0xAF */ + {0xBD, 0x72}, {0xBD, 0x73}, {0xBD, 0x74}, {0xBD, 0x75}, /* 0xB0-0xB3 */ + {0xBD, 0x76}, {0xBD, 0x77}, {0xBD, 0x78}, {0xBD, 0x79}, /* 0xB4-0xB7 */ + {0xBD, 0x7A}, {0xBD, 0x7B}, {0xBD, 0x7C}, {0xBD, 0x7D}, /* 0xB8-0xBB */ + {0xBD, 0x7E}, {0xBD, 0x7F}, {0xBD, 0x82}, {0xBD, 0x83}, /* 0xBC-0xBF */ + {0xBD, 0x85}, {0xBD, 0x86}, {0xBD, 0x8B}, {0xBD, 0x8C}, /* 0xC0-0xC3 */ + {0xBD, 0x8D}, {0xBD, 0x8E}, {0xBD, 0x8F}, {0xBD, 0x92}, /* 0xC4-0xC7 */ + {0xBD, 0x94}, {0xBD, 0x96}, {0xBD, 0x97}, {0xBD, 0x98}, /* 0xC8-0xCB */ + {0xBD, 0x9B}, {0xBD, 0x9D}, {0xBD, 0x9E}, {0xBD, 0x9F}, /* 0xCC-0xCF */ + {0xBD, 0xA0}, {0xBD, 0xA1}, {0xBD, 0xA2}, {0xBD, 0xA3}, /* 0xD0-0xD3 */ + {0xBD, 0xA5}, {0xBD, 0xA6}, {0xBD, 0xA7}, {0xBD, 0xA8}, /* 0xD4-0xD7 */ + {0xBD, 0xA9}, {0xBD, 0xAA}, {0xBD, 0xAB}, {0xBD, 0xAC}, /* 0xD8-0xDB */ + {0xBD, 0xAD}, {0xBD, 0xAE}, {0xBD, 0xAF}, {0xBD, 0xB1}, /* 0xDC-0xDF */ + {0xBD, 0xB2}, {0xBD, 0xB3}, {0xBD, 0xB4}, {0xBD, 0xB5}, /* 0xE0-0xE3 */ + {0xBD, 0xB6}, {0xBD, 0xB7}, {0xBD, 0xB9}, {0xBD, 0xBA}, /* 0xE4-0xE7 */ + {0xBD, 0xBB}, {0xBD, 0xBC}, {0xBD, 0xBD}, {0xBD, 0xBE}, /* 0xE8-0xEB */ + {0xBD, 0xBF}, {0xBD, 0xC0}, {0xBD, 0xC1}, {0xBD, 0xC2}, /* 0xEC-0xEF */ + {0xBD, 0xC3}, {0xBD, 0xC4}, {0xBD, 0xC5}, {0xBD, 0xC6}, /* 0xF0-0xF3 */ + {0xBD, 0xC7}, {0xBD, 0xC8}, {0xBD, 0xC9}, {0xBD, 0xCA}, /* 0xF4-0xF7 */ + {0xBD, 0xCB}, {0xBD, 0xCC}, {0xBD, 0xCD}, {0xBD, 0xCE}, /* 0xF8-0xFB */ + {0xBD, 0xCF}, {0xBD, 0xD0}, {0xBD, 0xD1}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_95[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xBD, 0xD2}, {0xBD, 0xD3}, {0xBD, 0xD6}, /* 0x40-0x43 */ + {0xBD, 0xD7}, {0xBD, 0xD9}, {0xBD, 0xDA}, {0xBD, 0xDB}, /* 0x44-0x47 */ + {0xBD, 0xDD}, {0xBD, 0xDE}, {0xBD, 0xDF}, {0xBD, 0xE0}, /* 0x48-0x4B */ + {0xBD, 0xE1}, {0xBD, 0xE2}, {0xBD, 0xE3}, {0xBD, 0xE4}, /* 0x4C-0x4F */ + {0xBD, 0xE5}, {0xBD, 0xE6}, {0xBD, 0xE7}, {0xBD, 0xE8}, /* 0x50-0x53 */ + {0xBD, 0xEA}, {0xBD, 0xEB}, {0xBD, 0xEC}, {0xBD, 0xED}, /* 0x54-0x57 */ + {0xBD, 0xEE}, {0xBD, 0xEF}, {0xBD, 0xF1}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xBD, 0xF2}, {0xBD, 0xF3}, {0xBD, 0xF5}, /* 0x60-0x63 */ + {0xBD, 0xF6}, {0xBD, 0xF7}, {0xBD, 0xF9}, {0xBD, 0xFA}, /* 0x64-0x67 */ + {0xBD, 0xFB}, {0xBD, 0xFC}, {0xBD, 0xFD}, {0xBD, 0xFE}, /* 0x68-0x6B */ + {0xBD, 0xFF}, {0xBE, 0x01}, {0xBE, 0x02}, {0xBE, 0x04}, /* 0x6C-0x6F */ + {0xBE, 0x06}, {0xBE, 0x07}, {0xBE, 0x08}, {0xBE, 0x09}, /* 0x70-0x73 */ + {0xBE, 0x0A}, {0xBE, 0x0B}, {0xBE, 0x0E}, {0xBE, 0x0F}, /* 0x74-0x77 */ + {0xBE, 0x11}, {0xBE, 0x12}, {0xBE, 0x13}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xBE, 0x15}, {0xBE, 0x16}, {0xBE, 0x17}, /* 0x80-0x83 */ + {0xBE, 0x18}, {0xBE, 0x19}, {0xBE, 0x1A}, {0xBE, 0x1B}, /* 0x84-0x87 */ + {0xBE, 0x1E}, {0xBE, 0x20}, {0xBE, 0x21}, {0xBE, 0x22}, /* 0x88-0x8B */ + {0xBE, 0x23}, {0xBE, 0x24}, {0xBE, 0x25}, {0xBE, 0x26}, /* 0x8C-0x8F */ + {0xBE, 0x27}, {0xBE, 0x28}, {0xBE, 0x29}, {0xBE, 0x2A}, /* 0x90-0x93 */ + {0xBE, 0x2B}, {0xBE, 0x2C}, {0xBE, 0x2D}, {0xBE, 0x2E}, /* 0x94-0x97 */ + {0xBE, 0x2F}, {0xBE, 0x30}, {0xBE, 0x31}, {0xBE, 0x32}, /* 0x98-0x9B */ + {0xBE, 0x33}, {0xBE, 0x34}, {0xBE, 0x35}, {0xBE, 0x36}, /* 0x9C-0x9F */ + {0xBE, 0x37}, {0xBE, 0x38}, {0xBE, 0x39}, {0xBE, 0x3A}, /* 0xA0-0xA3 */ + {0xBE, 0x3B}, {0xBE, 0x3C}, {0xBE, 0x3D}, {0xBE, 0x3E}, /* 0xA4-0xA7 */ + {0xBE, 0x3F}, {0xBE, 0x40}, {0xBE, 0x41}, {0xBE, 0x42}, /* 0xA8-0xAB */ + {0xBE, 0x43}, {0xBE, 0x46}, {0xBE, 0x47}, {0xBE, 0x49}, /* 0xAC-0xAF */ + {0xBE, 0x4A}, {0xBE, 0x4B}, {0xBE, 0x4D}, {0xBE, 0x4F}, /* 0xB0-0xB3 */ + {0xBE, 0x50}, {0xBE, 0x51}, {0xBE, 0x52}, {0xBE, 0x53}, /* 0xB4-0xB7 */ + {0xBE, 0x56}, {0xBE, 0x58}, {0xBE, 0x5C}, {0xBE, 0x5D}, /* 0xB8-0xBB */ + {0xBE, 0x5E}, {0xBE, 0x5F}, {0xBE, 0x62}, {0xBE, 0x63}, /* 0xBC-0xBF */ + {0xBE, 0x65}, {0xBE, 0x66}, {0xBE, 0x67}, {0xBE, 0x69}, /* 0xC0-0xC3 */ + {0xBE, 0x6B}, {0xBE, 0x6C}, {0xBE, 0x6D}, {0xBE, 0x6E}, /* 0xC4-0xC7 */ + {0xBE, 0x6F}, {0xBE, 0x72}, {0xBE, 0x76}, {0xBE, 0x77}, /* 0xC8-0xCB */ + {0xBE, 0x78}, {0xBE, 0x79}, {0xBE, 0x7A}, {0xBE, 0x7E}, /* 0xCC-0xCF */ + {0xBE, 0x7F}, {0xBE, 0x81}, {0xBE, 0x82}, {0xBE, 0x83}, /* 0xD0-0xD3 */ + {0xBE, 0x85}, {0xBE, 0x86}, {0xBE, 0x87}, {0xBE, 0x88}, /* 0xD4-0xD7 */ + {0xBE, 0x89}, {0xBE, 0x8A}, {0xBE, 0x8B}, {0xBE, 0x8E}, /* 0xD8-0xDB */ + {0xBE, 0x92}, {0xBE, 0x93}, {0xBE, 0x94}, {0xBE, 0x95}, /* 0xDC-0xDF */ + {0xBE, 0x96}, {0xBE, 0x97}, {0xBE, 0x9A}, {0xBE, 0x9B}, /* 0xE0-0xE3 */ + {0xBE, 0x9C}, {0xBE, 0x9D}, {0xBE, 0x9E}, {0xBE, 0x9F}, /* 0xE4-0xE7 */ + {0xBE, 0xA0}, {0xBE, 0xA1}, {0xBE, 0xA2}, {0xBE, 0xA3}, /* 0xE8-0xEB */ + {0xBE, 0xA4}, {0xBE, 0xA5}, {0xBE, 0xA6}, {0xBE, 0xA7}, /* 0xEC-0xEF */ + {0xBE, 0xA9}, {0xBE, 0xAA}, {0xBE, 0xAB}, {0xBE, 0xAC}, /* 0xF0-0xF3 */ + {0xBE, 0xAD}, {0xBE, 0xAE}, {0xBE, 0xAF}, {0xBE, 0xB0}, /* 0xF4-0xF7 */ + {0xBE, 0xB1}, {0xBE, 0xB2}, {0xBE, 0xB3}, {0xBE, 0xB4}, /* 0xF8-0xFB */ + {0xBE, 0xB5}, {0xBE, 0xB6}, {0xBE, 0xB7}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_96[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xBE, 0xB8}, {0xBE, 0xB9}, {0xBE, 0xBA}, /* 0x40-0x43 */ + {0xBE, 0xBB}, {0xBE, 0xBC}, {0xBE, 0xBD}, {0xBE, 0xBE}, /* 0x44-0x47 */ + {0xBE, 0xBF}, {0xBE, 0xC0}, {0xBE, 0xC1}, {0xBE, 0xC2}, /* 0x48-0x4B */ + {0xBE, 0xC3}, {0xBE, 0xC4}, {0xBE, 0xC5}, {0xBE, 0xC6}, /* 0x4C-0x4F */ + {0xBE, 0xC7}, {0xBE, 0xC8}, {0xBE, 0xC9}, {0xBE, 0xCA}, /* 0x50-0x53 */ + {0xBE, 0xCB}, {0xBE, 0xCC}, {0xBE, 0xCD}, {0xBE, 0xCE}, /* 0x54-0x57 */ + {0xBE, 0xCF}, {0xBE, 0xD2}, {0xBE, 0xD3}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xBE, 0xD5}, {0xBE, 0xD6}, {0xBE, 0xD9}, /* 0x60-0x63 */ + {0xBE, 0xDA}, {0xBE, 0xDB}, {0xBE, 0xDC}, {0xBE, 0xDD}, /* 0x64-0x67 */ + {0xBE, 0xDE}, {0xBE, 0xDF}, {0xBE, 0xE1}, {0xBE, 0xE2}, /* 0x68-0x6B */ + {0xBE, 0xE6}, {0xBE, 0xE7}, {0xBE, 0xE8}, {0xBE, 0xE9}, /* 0x6C-0x6F */ + {0xBE, 0xEA}, {0xBE, 0xEB}, {0xBE, 0xED}, {0xBE, 0xEE}, /* 0x70-0x73 */ + {0xBE, 0xEF}, {0xBE, 0xF0}, {0xBE, 0xF1}, {0xBE, 0xF2}, /* 0x74-0x77 */ + {0xBE, 0xF3}, {0xBE, 0xF4}, {0xBE, 0xF5}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xBE, 0xF6}, {0xBE, 0xF7}, {0xBE, 0xF8}, /* 0x80-0x83 */ + {0xBE, 0xF9}, {0xBE, 0xFA}, {0xBE, 0xFB}, {0xBE, 0xFC}, /* 0x84-0x87 */ + {0xBE, 0xFD}, {0xBE, 0xFE}, {0xBE, 0xFF}, {0xBF, 0x00}, /* 0x88-0x8B */ + {0xBF, 0x02}, {0xBF, 0x03}, {0xBF, 0x04}, {0xBF, 0x05}, /* 0x8C-0x8F */ + {0xBF, 0x06}, {0xBF, 0x07}, {0xBF, 0x0A}, {0xBF, 0x0B}, /* 0x90-0x93 */ + {0xBF, 0x0C}, {0xBF, 0x0D}, {0xBF, 0x0E}, {0xBF, 0x0F}, /* 0x94-0x97 */ + {0xBF, 0x10}, {0xBF, 0x11}, {0xBF, 0x12}, {0xBF, 0x13}, /* 0x98-0x9B */ + {0xBF, 0x14}, {0xBF, 0x15}, {0xBF, 0x16}, {0xBF, 0x17}, /* 0x9C-0x9F */ + {0xBF, 0x1A}, {0xBF, 0x1E}, {0xBF, 0x1F}, {0xBF, 0x20}, /* 0xA0-0xA3 */ + {0xBF, 0x21}, {0xBF, 0x22}, {0xBF, 0x23}, {0xBF, 0x24}, /* 0xA4-0xA7 */ + {0xBF, 0x25}, {0xBF, 0x26}, {0xBF, 0x27}, {0xBF, 0x28}, /* 0xA8-0xAB */ + {0xBF, 0x29}, {0xBF, 0x2A}, {0xBF, 0x2B}, {0xBF, 0x2C}, /* 0xAC-0xAF */ + {0xBF, 0x2D}, {0xBF, 0x2E}, {0xBF, 0x2F}, {0xBF, 0x30}, /* 0xB0-0xB3 */ + {0xBF, 0x31}, {0xBF, 0x32}, {0xBF, 0x33}, {0xBF, 0x34}, /* 0xB4-0xB7 */ + {0xBF, 0x35}, {0xBF, 0x36}, {0xBF, 0x37}, {0xBF, 0x38}, /* 0xB8-0xBB */ + {0xBF, 0x39}, {0xBF, 0x3A}, {0xBF, 0x3B}, {0xBF, 0x3C}, /* 0xBC-0xBF */ + {0xBF, 0x3D}, {0xBF, 0x3E}, {0xBF, 0x3F}, {0xBF, 0x42}, /* 0xC0-0xC3 */ + {0xBF, 0x43}, {0xBF, 0x45}, {0xBF, 0x46}, {0xBF, 0x47}, /* 0xC4-0xC7 */ + {0xBF, 0x49}, {0xBF, 0x4A}, {0xBF, 0x4B}, {0xBF, 0x4C}, /* 0xC8-0xCB */ + {0xBF, 0x4D}, {0xBF, 0x4E}, {0xBF, 0x4F}, {0xBF, 0x52}, /* 0xCC-0xCF */ + {0xBF, 0x53}, {0xBF, 0x54}, {0xBF, 0x56}, {0xBF, 0x57}, /* 0xD0-0xD3 */ + {0xBF, 0x58}, {0xBF, 0x59}, {0xBF, 0x5A}, {0xBF, 0x5B}, /* 0xD4-0xD7 */ + {0xBF, 0x5C}, {0xBF, 0x5D}, {0xBF, 0x5E}, {0xBF, 0x5F}, /* 0xD8-0xDB */ + {0xBF, 0x60}, {0xBF, 0x61}, {0xBF, 0x62}, {0xBF, 0x63}, /* 0xDC-0xDF */ + {0xBF, 0x64}, {0xBF, 0x65}, {0xBF, 0x66}, {0xBF, 0x67}, /* 0xE0-0xE3 */ + {0xBF, 0x68}, {0xBF, 0x69}, {0xBF, 0x6A}, {0xBF, 0x6B}, /* 0xE4-0xE7 */ + {0xBF, 0x6C}, {0xBF, 0x6D}, {0xBF, 0x6E}, {0xBF, 0x6F}, /* 0xE8-0xEB */ + {0xBF, 0x70}, {0xBF, 0x71}, {0xBF, 0x72}, {0xBF, 0x73}, /* 0xEC-0xEF */ + {0xBF, 0x74}, {0xBF, 0x75}, {0xBF, 0x76}, {0xBF, 0x77}, /* 0xF0-0xF3 */ + {0xBF, 0x78}, {0xBF, 0x79}, {0xBF, 0x7A}, {0xBF, 0x7B}, /* 0xF4-0xF7 */ + {0xBF, 0x7C}, {0xBF, 0x7D}, {0xBF, 0x7E}, {0xBF, 0x7F}, /* 0xF8-0xFB */ + {0xBF, 0x80}, {0xBF, 0x81}, {0xBF, 0x82}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_97[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xBF, 0x83}, {0xBF, 0x84}, {0xBF, 0x85}, /* 0x40-0x43 */ + {0xBF, 0x86}, {0xBF, 0x87}, {0xBF, 0x88}, {0xBF, 0x89}, /* 0x44-0x47 */ + {0xBF, 0x8A}, {0xBF, 0x8B}, {0xBF, 0x8C}, {0xBF, 0x8D}, /* 0x48-0x4B */ + {0xBF, 0x8E}, {0xBF, 0x8F}, {0xBF, 0x90}, {0xBF, 0x91}, /* 0x4C-0x4F */ + {0xBF, 0x92}, {0xBF, 0x93}, {0xBF, 0x95}, {0xBF, 0x96}, /* 0x50-0x53 */ + {0xBF, 0x97}, {0xBF, 0x98}, {0xBF, 0x99}, {0xBF, 0x9A}, /* 0x54-0x57 */ + {0xBF, 0x9B}, {0xBF, 0x9C}, {0xBF, 0x9D}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xBF, 0x9E}, {0xBF, 0x9F}, {0xBF, 0xA0}, /* 0x60-0x63 */ + {0xBF, 0xA1}, {0xBF, 0xA2}, {0xBF, 0xA3}, {0xBF, 0xA4}, /* 0x64-0x67 */ + {0xBF, 0xA5}, {0xBF, 0xA6}, {0xBF, 0xA7}, {0xBF, 0xA8}, /* 0x68-0x6B */ + {0xBF, 0xA9}, {0xBF, 0xAA}, {0xBF, 0xAB}, {0xBF, 0xAC}, /* 0x6C-0x6F */ + {0xBF, 0xAD}, {0xBF, 0xAE}, {0xBF, 0xAF}, {0xBF, 0xB1}, /* 0x70-0x73 */ + {0xBF, 0xB2}, {0xBF, 0xB3}, {0xBF, 0xB4}, {0xBF, 0xB5}, /* 0x74-0x77 */ + {0xBF, 0xB6}, {0xBF, 0xB7}, {0xBF, 0xB8}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xBF, 0xB9}, {0xBF, 0xBA}, {0xBF, 0xBB}, /* 0x80-0x83 */ + {0xBF, 0xBC}, {0xBF, 0xBD}, {0xBF, 0xBE}, {0xBF, 0xBF}, /* 0x84-0x87 */ + {0xBF, 0xC0}, {0xBF, 0xC1}, {0xBF, 0xC2}, {0xBF, 0xC3}, /* 0x88-0x8B */ + {0xBF, 0xC4}, {0xBF, 0xC6}, {0xBF, 0xC7}, {0xBF, 0xC8}, /* 0x8C-0x8F */ + {0xBF, 0xC9}, {0xBF, 0xCA}, {0xBF, 0xCB}, {0xBF, 0xCE}, /* 0x90-0x93 */ + {0xBF, 0xCF}, {0xBF, 0xD1}, {0xBF, 0xD2}, {0xBF, 0xD3}, /* 0x94-0x97 */ + {0xBF, 0xD5}, {0xBF, 0xD6}, {0xBF, 0xD7}, {0xBF, 0xD8}, /* 0x98-0x9B */ + {0xBF, 0xD9}, {0xBF, 0xDA}, {0xBF, 0xDB}, {0xBF, 0xDD}, /* 0x9C-0x9F */ + {0xBF, 0xDE}, {0xBF, 0xE0}, {0xBF, 0xE2}, {0xBF, 0xE3}, /* 0xA0-0xA3 */ + {0xBF, 0xE4}, {0xBF, 0xE5}, {0xBF, 0xE6}, {0xBF, 0xE7}, /* 0xA4-0xA7 */ + {0xBF, 0xE8}, {0xBF, 0xE9}, {0xBF, 0xEA}, {0xBF, 0xEB}, /* 0xA8-0xAB */ + {0xBF, 0xEC}, {0xBF, 0xED}, {0xBF, 0xEE}, {0xBF, 0xEF}, /* 0xAC-0xAF */ + {0xBF, 0xF0}, {0xBF, 0xF1}, {0xBF, 0xF2}, {0xBF, 0xF3}, /* 0xB0-0xB3 */ + {0xBF, 0xF4}, {0xBF, 0xF5}, {0xBF, 0xF6}, {0xBF, 0xF7}, /* 0xB4-0xB7 */ + {0xBF, 0xF8}, {0xBF, 0xF9}, {0xBF, 0xFA}, {0xBF, 0xFB}, /* 0xB8-0xBB */ + {0xBF, 0xFC}, {0xBF, 0xFD}, {0xBF, 0xFE}, {0xBF, 0xFF}, /* 0xBC-0xBF */ + {0xC0, 0x00}, {0xC0, 0x01}, {0xC0, 0x02}, {0xC0, 0x03}, /* 0xC0-0xC3 */ + {0xC0, 0x04}, {0xC0, 0x05}, {0xC0, 0x06}, {0xC0, 0x07}, /* 0xC4-0xC7 */ + {0xC0, 0x08}, {0xC0, 0x09}, {0xC0, 0x0A}, {0xC0, 0x0B}, /* 0xC8-0xCB */ + {0xC0, 0x0C}, {0xC0, 0x0D}, {0xC0, 0x0E}, {0xC0, 0x0F}, /* 0xCC-0xCF */ + {0xC0, 0x10}, {0xC0, 0x11}, {0xC0, 0x12}, {0xC0, 0x13}, /* 0xD0-0xD3 */ + {0xC0, 0x14}, {0xC0, 0x15}, {0xC0, 0x16}, {0xC0, 0x17}, /* 0xD4-0xD7 */ + {0xC0, 0x18}, {0xC0, 0x19}, {0xC0, 0x1A}, {0xC0, 0x1B}, /* 0xD8-0xDB */ + {0xC0, 0x1C}, {0xC0, 0x1D}, {0xC0, 0x1E}, {0xC0, 0x1F}, /* 0xDC-0xDF */ + {0xC0, 0x20}, {0xC0, 0x21}, {0xC0, 0x22}, {0xC0, 0x23}, /* 0xE0-0xE3 */ + {0xC0, 0x24}, {0xC0, 0x25}, {0xC0, 0x26}, {0xC0, 0x27}, /* 0xE4-0xE7 */ + {0xC0, 0x28}, {0xC0, 0x29}, {0xC0, 0x2A}, {0xC0, 0x2B}, /* 0xE8-0xEB */ + {0xC0, 0x2C}, {0xC0, 0x2D}, {0xC0, 0x2E}, {0xC0, 0x2F}, /* 0xEC-0xEF */ + {0xC0, 0x30}, {0xC0, 0x31}, {0xC0, 0x32}, {0xC0, 0x33}, /* 0xF0-0xF3 */ + {0xC0, 0x34}, {0xC0, 0x35}, {0xC0, 0x36}, {0xC0, 0x37}, /* 0xF4-0xF7 */ + {0xC0, 0x38}, {0xC0, 0x39}, {0xC0, 0x3A}, {0xC0, 0x3B}, /* 0xF8-0xFB */ + {0xC0, 0x3D}, {0xC0, 0x3E}, {0xC0, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_98[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC0, 0x40}, {0xC0, 0x41}, {0xC0, 0x42}, /* 0x40-0x43 */ + {0xC0, 0x43}, {0xC0, 0x44}, {0xC0, 0x45}, {0xC0, 0x46}, /* 0x44-0x47 */ + {0xC0, 0x47}, {0xC0, 0x48}, {0xC0, 0x49}, {0xC0, 0x4A}, /* 0x48-0x4B */ + {0xC0, 0x4B}, {0xC0, 0x4C}, {0xC0, 0x4D}, {0xC0, 0x4E}, /* 0x4C-0x4F */ + {0xC0, 0x4F}, {0xC0, 0x50}, {0xC0, 0x52}, {0xC0, 0x53}, /* 0x50-0x53 */ + {0xC0, 0x54}, {0xC0, 0x55}, {0xC0, 0x56}, {0xC0, 0x57}, /* 0x54-0x57 */ + {0xC0, 0x59}, {0xC0, 0x5A}, {0xC0, 0x5B}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC0, 0x5D}, {0xC0, 0x5E}, {0xC0, 0x5F}, /* 0x60-0x63 */ + {0xC0, 0x61}, {0xC0, 0x62}, {0xC0, 0x63}, {0xC0, 0x64}, /* 0x64-0x67 */ + {0xC0, 0x65}, {0xC0, 0x66}, {0xC0, 0x67}, {0xC0, 0x6A}, /* 0x68-0x6B */ + {0xC0, 0x6B}, {0xC0, 0x6C}, {0xC0, 0x6D}, {0xC0, 0x6E}, /* 0x6C-0x6F */ + {0xC0, 0x6F}, {0xC0, 0x70}, {0xC0, 0x71}, {0xC0, 0x72}, /* 0x70-0x73 */ + {0xC0, 0x73}, {0xC0, 0x74}, {0xC0, 0x75}, {0xC0, 0x76}, /* 0x74-0x77 */ + {0xC0, 0x77}, {0xC0, 0x78}, {0xC0, 0x79}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC0, 0x7A}, {0xC0, 0x7B}, {0xC0, 0x7C}, /* 0x80-0x83 */ + {0xC0, 0x7D}, {0xC0, 0x7E}, {0xC0, 0x7F}, {0xC0, 0x80}, /* 0x84-0x87 */ + {0xC0, 0x81}, {0xC0, 0x82}, {0xC0, 0x83}, {0xC0, 0x84}, /* 0x88-0x8B */ + {0xC0, 0x85}, {0xC0, 0x86}, {0xC0, 0x87}, {0xC0, 0x88}, /* 0x8C-0x8F */ + {0xC0, 0x89}, {0xC0, 0x8A}, {0xC0, 0x8B}, {0xC0, 0x8C}, /* 0x90-0x93 */ + {0xC0, 0x8D}, {0xC0, 0x8E}, {0xC0, 0x8F}, {0xC0, 0x92}, /* 0x94-0x97 */ + {0xC0, 0x93}, {0xC0, 0x95}, {0xC0, 0x96}, {0xC0, 0x97}, /* 0x98-0x9B */ + {0xC0, 0x99}, {0xC0, 0x9A}, {0xC0, 0x9B}, {0xC0, 0x9C}, /* 0x9C-0x9F */ + {0xC0, 0x9D}, {0xC0, 0x9E}, {0xC0, 0x9F}, {0xC0, 0xA2}, /* 0xA0-0xA3 */ + {0xC0, 0xA4}, {0xC0, 0xA6}, {0xC0, 0xA7}, {0xC0, 0xA8}, /* 0xA4-0xA7 */ + {0xC0, 0xA9}, {0xC0, 0xAA}, {0xC0, 0xAB}, {0xC0, 0xAE}, /* 0xA8-0xAB */ + {0xC0, 0xB1}, {0xC0, 0xB2}, {0xC0, 0xB7}, {0xC0, 0xB8}, /* 0xAC-0xAF */ + {0xC0, 0xB9}, {0xC0, 0xBA}, {0xC0, 0xBB}, {0xC0, 0xBE}, /* 0xB0-0xB3 */ + {0xC0, 0xC2}, {0xC0, 0xC3}, {0xC0, 0xC4}, {0xC0, 0xC6}, /* 0xB4-0xB7 */ + {0xC0, 0xC7}, {0xC0, 0xCA}, {0xC0, 0xCB}, {0xC0, 0xCD}, /* 0xB8-0xBB */ + {0xC0, 0xCE}, {0xC0, 0xCF}, {0xC0, 0xD1}, {0xC0, 0xD2}, /* 0xBC-0xBF */ + {0xC0, 0xD3}, {0xC0, 0xD4}, {0xC0, 0xD5}, {0xC0, 0xD6}, /* 0xC0-0xC3 */ + {0xC0, 0xD7}, {0xC0, 0xDA}, {0xC0, 0xDE}, {0xC0, 0xDF}, /* 0xC4-0xC7 */ + {0xC0, 0xE0}, {0xC0, 0xE1}, {0xC0, 0xE2}, {0xC0, 0xE3}, /* 0xC8-0xCB */ + {0xC0, 0xE6}, {0xC0, 0xE7}, {0xC0, 0xE9}, {0xC0, 0xEA}, /* 0xCC-0xCF */ + {0xC0, 0xEB}, {0xC0, 0xED}, {0xC0, 0xEE}, {0xC0, 0xEF}, /* 0xD0-0xD3 */ + {0xC0, 0xF0}, {0xC0, 0xF1}, {0xC0, 0xF2}, {0xC0, 0xF3}, /* 0xD4-0xD7 */ + {0xC0, 0xF6}, {0xC0, 0xF8}, {0xC0, 0xFA}, {0xC0, 0xFB}, /* 0xD8-0xDB */ + {0xC0, 0xFC}, {0xC0, 0xFD}, {0xC0, 0xFE}, {0xC0, 0xFF}, /* 0xDC-0xDF */ + {0xC1, 0x01}, {0xC1, 0x02}, {0xC1, 0x03}, {0xC1, 0x05}, /* 0xE0-0xE3 */ + {0xC1, 0x06}, {0xC1, 0x07}, {0xC1, 0x09}, {0xC1, 0x0A}, /* 0xE4-0xE7 */ + {0xC1, 0x0B}, {0xC1, 0x0C}, {0xC1, 0x0D}, {0xC1, 0x0E}, /* 0xE8-0xEB */ + {0xC1, 0x0F}, {0xC1, 0x11}, {0xC1, 0x12}, {0xC1, 0x13}, /* 0xEC-0xEF */ + {0xC1, 0x14}, {0xC1, 0x16}, {0xC1, 0x17}, {0xC1, 0x18}, /* 0xF0-0xF3 */ + {0xC1, 0x19}, {0xC1, 0x1A}, {0xC1, 0x1B}, {0xC1, 0x21}, /* 0xF4-0xF7 */ + {0xC1, 0x22}, {0xC1, 0x25}, {0xC1, 0x28}, {0xC1, 0x29}, /* 0xF8-0xFB */ + {0xC1, 0x2A}, {0xC1, 0x2B}, {0xC1, 0x2E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_99[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC1, 0x32}, {0xC1, 0x33}, {0xC1, 0x34}, /* 0x40-0x43 */ + {0xC1, 0x35}, {0xC1, 0x37}, {0xC1, 0x3A}, {0xC1, 0x3B}, /* 0x44-0x47 */ + {0xC1, 0x3D}, {0xC1, 0x3E}, {0xC1, 0x3F}, {0xC1, 0x41}, /* 0x48-0x4B */ + {0xC1, 0x42}, {0xC1, 0x43}, {0xC1, 0x44}, {0xC1, 0x45}, /* 0x4C-0x4F */ + {0xC1, 0x46}, {0xC1, 0x47}, {0xC1, 0x4A}, {0xC1, 0x4E}, /* 0x50-0x53 */ + {0xC1, 0x4F}, {0xC1, 0x50}, {0xC1, 0x51}, {0xC1, 0x52}, /* 0x54-0x57 */ + {0xC1, 0x53}, {0xC1, 0x56}, {0xC1, 0x57}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC1, 0x59}, {0xC1, 0x5A}, {0xC1, 0x5B}, /* 0x60-0x63 */ + {0xC1, 0x5D}, {0xC1, 0x5E}, {0xC1, 0x5F}, {0xC1, 0x60}, /* 0x64-0x67 */ + {0xC1, 0x61}, {0xC1, 0x62}, {0xC1, 0x63}, {0xC1, 0x66}, /* 0x68-0x6B */ + {0xC1, 0x6A}, {0xC1, 0x6B}, {0xC1, 0x6C}, {0xC1, 0x6D}, /* 0x6C-0x6F */ + {0xC1, 0x6E}, {0xC1, 0x6F}, {0xC1, 0x71}, {0xC1, 0x72}, /* 0x70-0x73 */ + {0xC1, 0x73}, {0xC1, 0x75}, {0xC1, 0x76}, {0xC1, 0x77}, /* 0x74-0x77 */ + {0xC1, 0x79}, {0xC1, 0x7A}, {0xC1, 0x7B}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC1, 0x7C}, {0xC1, 0x7D}, {0xC1, 0x7E}, /* 0x80-0x83 */ + {0xC1, 0x7F}, {0xC1, 0x80}, {0xC1, 0x81}, {0xC1, 0x82}, /* 0x84-0x87 */ + {0xC1, 0x83}, {0xC1, 0x84}, {0xC1, 0x86}, {0xC1, 0x87}, /* 0x88-0x8B */ + {0xC1, 0x88}, {0xC1, 0x89}, {0xC1, 0x8A}, {0xC1, 0x8B}, /* 0x8C-0x8F */ + {0xC1, 0x8F}, {0xC1, 0x91}, {0xC1, 0x92}, {0xC1, 0x93}, /* 0x90-0x93 */ + {0xC1, 0x95}, {0xC1, 0x97}, {0xC1, 0x98}, {0xC1, 0x99}, /* 0x94-0x97 */ + {0xC1, 0x9A}, {0xC1, 0x9B}, {0xC1, 0x9E}, {0xC1, 0xA0}, /* 0x98-0x9B */ + {0xC1, 0xA2}, {0xC1, 0xA3}, {0xC1, 0xA4}, {0xC1, 0xA6}, /* 0x9C-0x9F */ + {0xC1, 0xA7}, {0xC1, 0xAA}, {0xC1, 0xAB}, {0xC1, 0xAD}, /* 0xA0-0xA3 */ + {0xC1, 0xAE}, {0xC1, 0xAF}, {0xC1, 0xB1}, {0xC1, 0xB2}, /* 0xA4-0xA7 */ + {0xC1, 0xB3}, {0xC1, 0xB4}, {0xC1, 0xB5}, {0xC1, 0xB6}, /* 0xA8-0xAB */ + {0xC1, 0xB7}, {0xC1, 0xB8}, {0xC1, 0xB9}, {0xC1, 0xBA}, /* 0xAC-0xAF */ + {0xC1, 0xBB}, {0xC1, 0xBC}, {0xC1, 0xBE}, {0xC1, 0xBF}, /* 0xB0-0xB3 */ + {0xC1, 0xC0}, {0xC1, 0xC1}, {0xC1, 0xC2}, {0xC1, 0xC3}, /* 0xB4-0xB7 */ + {0xC1, 0xC5}, {0xC1, 0xC6}, {0xC1, 0xC7}, {0xC1, 0xC9}, /* 0xB8-0xBB */ + {0xC1, 0xCA}, {0xC1, 0xCB}, {0xC1, 0xCD}, {0xC1, 0xCE}, /* 0xBC-0xBF */ + {0xC1, 0xCF}, {0xC1, 0xD0}, {0xC1, 0xD1}, {0xC1, 0xD2}, /* 0xC0-0xC3 */ + {0xC1, 0xD3}, {0xC1, 0xD5}, {0xC1, 0xD6}, {0xC1, 0xD9}, /* 0xC4-0xC7 */ + {0xC1, 0xDA}, {0xC1, 0xDB}, {0xC1, 0xDC}, {0xC1, 0xDD}, /* 0xC8-0xCB */ + {0xC1, 0xDE}, {0xC1, 0xDF}, {0xC1, 0xE1}, {0xC1, 0xE2}, /* 0xCC-0xCF */ + {0xC1, 0xE3}, {0xC1, 0xE5}, {0xC1, 0xE6}, {0xC1, 0xE7}, /* 0xD0-0xD3 */ + {0xC1, 0xE9}, {0xC1, 0xEA}, {0xC1, 0xEB}, {0xC1, 0xEC}, /* 0xD4-0xD7 */ + {0xC1, 0xED}, {0xC1, 0xEE}, {0xC1, 0xEF}, {0xC1, 0xF2}, /* 0xD8-0xDB */ + {0xC1, 0xF4}, {0xC1, 0xF5}, {0xC1, 0xF6}, {0xC1, 0xF7}, /* 0xDC-0xDF */ + {0xC1, 0xF8}, {0xC1, 0xF9}, {0xC1, 0xFA}, {0xC1, 0xFB}, /* 0xE0-0xE3 */ + {0xC1, 0xFE}, {0xC1, 0xFF}, {0xC2, 0x01}, {0xC2, 0x02}, /* 0xE4-0xE7 */ + {0xC2, 0x03}, {0xC2, 0x05}, {0xC2, 0x06}, {0xC2, 0x07}, /* 0xE8-0xEB */ + {0xC2, 0x08}, {0xC2, 0x09}, {0xC2, 0x0A}, {0xC2, 0x0B}, /* 0xEC-0xEF */ + {0xC2, 0x0E}, {0xC2, 0x10}, {0xC2, 0x12}, {0xC2, 0x13}, /* 0xF0-0xF3 */ + {0xC2, 0x14}, {0xC2, 0x15}, {0xC2, 0x16}, {0xC2, 0x17}, /* 0xF4-0xF7 */ + {0xC2, 0x1A}, {0xC2, 0x1B}, {0xC2, 0x1D}, {0xC2, 0x1E}, /* 0xF8-0xFB */ + {0xC2, 0x21}, {0xC2, 0x22}, {0xC2, 0x23}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9A[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC2, 0x24}, {0xC2, 0x25}, {0xC2, 0x26}, /* 0x40-0x43 */ + {0xC2, 0x27}, {0xC2, 0x2A}, {0xC2, 0x2C}, {0xC2, 0x2E}, /* 0x44-0x47 */ + {0xC2, 0x30}, {0xC2, 0x33}, {0xC2, 0x35}, {0xC2, 0x36}, /* 0x48-0x4B */ + {0xC2, 0x37}, {0xC2, 0x38}, {0xC2, 0x39}, {0xC2, 0x3A}, /* 0x4C-0x4F */ + {0xC2, 0x3B}, {0xC2, 0x3C}, {0xC2, 0x3D}, {0xC2, 0x3E}, /* 0x50-0x53 */ + {0xC2, 0x3F}, {0xC2, 0x40}, {0xC2, 0x41}, {0xC2, 0x42}, /* 0x54-0x57 */ + {0xC2, 0x43}, {0xC2, 0x44}, {0xC2, 0x45}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC2, 0x46}, {0xC2, 0x47}, {0xC2, 0x49}, /* 0x60-0x63 */ + {0xC2, 0x4A}, {0xC2, 0x4B}, {0xC2, 0x4C}, {0xC2, 0x4D}, /* 0x64-0x67 */ + {0xC2, 0x4E}, {0xC2, 0x4F}, {0xC2, 0x52}, {0xC2, 0x53}, /* 0x68-0x6B */ + {0xC2, 0x55}, {0xC2, 0x56}, {0xC2, 0x57}, {0xC2, 0x59}, /* 0x6C-0x6F */ + {0xC2, 0x5A}, {0xC2, 0x5B}, {0xC2, 0x5C}, {0xC2, 0x5D}, /* 0x70-0x73 */ + {0xC2, 0x5E}, {0xC2, 0x5F}, {0xC2, 0x61}, {0xC2, 0x62}, /* 0x74-0x77 */ + {0xC2, 0x63}, {0xC2, 0x64}, {0xC2, 0x66}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC2, 0x67}, {0xC2, 0x68}, {0xC2, 0x69}, /* 0x80-0x83 */ + {0xC2, 0x6A}, {0xC2, 0x6B}, {0xC2, 0x6E}, {0xC2, 0x6F}, /* 0x84-0x87 */ + {0xC2, 0x71}, {0xC2, 0x72}, {0xC2, 0x73}, {0xC2, 0x75}, /* 0x88-0x8B */ + {0xC2, 0x76}, {0xC2, 0x77}, {0xC2, 0x78}, {0xC2, 0x79}, /* 0x8C-0x8F */ + {0xC2, 0x7A}, {0xC2, 0x7B}, {0xC2, 0x7E}, {0xC2, 0x80}, /* 0x90-0x93 */ + {0xC2, 0x82}, {0xC2, 0x83}, {0xC2, 0x84}, {0xC2, 0x85}, /* 0x94-0x97 */ + {0xC2, 0x86}, {0xC2, 0x87}, {0xC2, 0x8A}, {0xC2, 0x8B}, /* 0x98-0x9B */ + {0xC2, 0x8C}, {0xC2, 0x8D}, {0xC2, 0x8E}, {0xC2, 0x8F}, /* 0x9C-0x9F */ + {0xC2, 0x91}, {0xC2, 0x92}, {0xC2, 0x93}, {0xC2, 0x94}, /* 0xA0-0xA3 */ + {0xC2, 0x95}, {0xC2, 0x96}, {0xC2, 0x97}, {0xC2, 0x99}, /* 0xA4-0xA7 */ + {0xC2, 0x9A}, {0xC2, 0x9C}, {0xC2, 0x9E}, {0xC2, 0x9F}, /* 0xA8-0xAB */ + {0xC2, 0xA0}, {0xC2, 0xA1}, {0xC2, 0xA2}, {0xC2, 0xA3}, /* 0xAC-0xAF */ + {0xC2, 0xA6}, {0xC2, 0xA7}, {0xC2, 0xA9}, {0xC2, 0xAA}, /* 0xB0-0xB3 */ + {0xC2, 0xAB}, {0xC2, 0xAE}, {0xC2, 0xAF}, {0xC2, 0xB0}, /* 0xB4-0xB7 */ + {0xC2, 0xB1}, {0xC2, 0xB2}, {0xC2, 0xB3}, {0xC2, 0xB6}, /* 0xB8-0xBB */ + {0xC2, 0xB8}, {0xC2, 0xBA}, {0xC2, 0xBB}, {0xC2, 0xBC}, /* 0xBC-0xBF */ + {0xC2, 0xBD}, {0xC2, 0xBE}, {0xC2, 0xBF}, {0xC2, 0xC0}, /* 0xC0-0xC3 */ + {0xC2, 0xC1}, {0xC2, 0xC2}, {0xC2, 0xC3}, {0xC2, 0xC4}, /* 0xC4-0xC7 */ + {0xC2, 0xC5}, {0xC2, 0xC6}, {0xC2, 0xC7}, {0xC2, 0xC8}, /* 0xC8-0xCB */ + {0xC2, 0xC9}, {0xC2, 0xCA}, {0xC2, 0xCB}, {0xC2, 0xCC}, /* 0xCC-0xCF */ + {0xC2, 0xCD}, {0xC2, 0xCE}, {0xC2, 0xCF}, {0xC2, 0xD0}, /* 0xD0-0xD3 */ + {0xC2, 0xD1}, {0xC2, 0xD2}, {0xC2, 0xD3}, {0xC2, 0xD4}, /* 0xD4-0xD7 */ + {0xC2, 0xD5}, {0xC2, 0xD6}, {0xC2, 0xD7}, {0xC2, 0xD8}, /* 0xD8-0xDB */ + {0xC2, 0xD9}, {0xC2, 0xDA}, {0xC2, 0xDB}, {0xC2, 0xDE}, /* 0xDC-0xDF */ + {0xC2, 0xDF}, {0xC2, 0xE1}, {0xC2, 0xE2}, {0xC2, 0xE5}, /* 0xE0-0xE3 */ + {0xC2, 0xE6}, {0xC2, 0xE7}, {0xC2, 0xE8}, {0xC2, 0xE9}, /* 0xE4-0xE7 */ + {0xC2, 0xEA}, {0xC2, 0xEE}, {0xC2, 0xF0}, {0xC2, 0xF2}, /* 0xE8-0xEB */ + {0xC2, 0xF3}, {0xC2, 0xF4}, {0xC2, 0xF5}, {0xC2, 0xF7}, /* 0xEC-0xEF */ + {0xC2, 0xFA}, {0xC2, 0xFD}, {0xC2, 0xFE}, {0xC2, 0xFF}, /* 0xF0-0xF3 */ + {0xC3, 0x01}, {0xC3, 0x02}, {0xC3, 0x03}, {0xC3, 0x04}, /* 0xF4-0xF7 */ + {0xC3, 0x05}, {0xC3, 0x06}, {0xC3, 0x07}, {0xC3, 0x0A}, /* 0xF8-0xFB */ + {0xC3, 0x0B}, {0xC3, 0x0E}, {0xC3, 0x0F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9B[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC3, 0x10}, {0xC3, 0x11}, {0xC3, 0x12}, /* 0x40-0x43 */ + {0xC3, 0x16}, {0xC3, 0x17}, {0xC3, 0x19}, {0xC3, 0x1A}, /* 0x44-0x47 */ + {0xC3, 0x1B}, {0xC3, 0x1D}, {0xC3, 0x1E}, {0xC3, 0x1F}, /* 0x48-0x4B */ + {0xC3, 0x20}, {0xC3, 0x21}, {0xC3, 0x22}, {0xC3, 0x23}, /* 0x4C-0x4F */ + {0xC3, 0x26}, {0xC3, 0x27}, {0xC3, 0x2A}, {0xC3, 0x2B}, /* 0x50-0x53 */ + {0xC3, 0x2C}, {0xC3, 0x2D}, {0xC3, 0x2E}, {0xC3, 0x2F}, /* 0x54-0x57 */ + {0xC3, 0x30}, {0xC3, 0x31}, {0xC3, 0x32}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC3, 0x33}, {0xC3, 0x34}, {0xC3, 0x35}, /* 0x60-0x63 */ + {0xC3, 0x36}, {0xC3, 0x37}, {0xC3, 0x38}, {0xC3, 0x39}, /* 0x64-0x67 */ + {0xC3, 0x3A}, {0xC3, 0x3B}, {0xC3, 0x3C}, {0xC3, 0x3D}, /* 0x68-0x6B */ + {0xC3, 0x3E}, {0xC3, 0x3F}, {0xC3, 0x40}, {0xC3, 0x41}, /* 0x6C-0x6F */ + {0xC3, 0x42}, {0xC3, 0x43}, {0xC3, 0x44}, {0xC3, 0x46}, /* 0x70-0x73 */ + {0xC3, 0x47}, {0xC3, 0x48}, {0xC3, 0x49}, {0xC3, 0x4A}, /* 0x74-0x77 */ + {0xC3, 0x4B}, {0xC3, 0x4C}, {0xC3, 0x4D}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC3, 0x4E}, {0xC3, 0x4F}, {0xC3, 0x50}, /* 0x80-0x83 */ + {0xC3, 0x51}, {0xC3, 0x52}, {0xC3, 0x53}, {0xC3, 0x54}, /* 0x84-0x87 */ + {0xC3, 0x55}, {0xC3, 0x56}, {0xC3, 0x57}, {0xC3, 0x58}, /* 0x88-0x8B */ + {0xC3, 0x59}, {0xC3, 0x5A}, {0xC3, 0x5B}, {0xC3, 0x5C}, /* 0x8C-0x8F */ + {0xC3, 0x5D}, {0xC3, 0x5E}, {0xC3, 0x5F}, {0xC3, 0x60}, /* 0x90-0x93 */ + {0xC3, 0x61}, {0xC3, 0x62}, {0xC3, 0x63}, {0xC3, 0x64}, /* 0x94-0x97 */ + {0xC3, 0x65}, {0xC3, 0x66}, {0xC3, 0x67}, {0xC3, 0x6A}, /* 0x98-0x9B */ + {0xC3, 0x6B}, {0xC3, 0x6D}, {0xC3, 0x6E}, {0xC3, 0x6F}, /* 0x9C-0x9F */ + {0xC3, 0x71}, {0xC3, 0x73}, {0xC3, 0x74}, {0xC3, 0x75}, /* 0xA0-0xA3 */ + {0xC3, 0x76}, {0xC3, 0x77}, {0xC3, 0x7A}, {0xC3, 0x7B}, /* 0xA4-0xA7 */ + {0xC3, 0x7E}, {0xC3, 0x7F}, {0xC3, 0x80}, {0xC3, 0x81}, /* 0xA8-0xAB */ + {0xC3, 0x82}, {0xC3, 0x83}, {0xC3, 0x85}, {0xC3, 0x86}, /* 0xAC-0xAF */ + {0xC3, 0x87}, {0xC3, 0x89}, {0xC3, 0x8A}, {0xC3, 0x8B}, /* 0xB0-0xB3 */ + {0xC3, 0x8D}, {0xC3, 0x8E}, {0xC3, 0x8F}, {0xC3, 0x90}, /* 0xB4-0xB7 */ + {0xC3, 0x91}, {0xC3, 0x92}, {0xC3, 0x93}, {0xC3, 0x94}, /* 0xB8-0xBB */ + {0xC3, 0x95}, {0xC3, 0x96}, {0xC3, 0x97}, {0xC3, 0x98}, /* 0xBC-0xBF */ + {0xC3, 0x99}, {0xC3, 0x9A}, {0xC3, 0x9B}, {0xC3, 0x9C}, /* 0xC0-0xC3 */ + {0xC3, 0x9D}, {0xC3, 0x9E}, {0xC3, 0x9F}, {0xC3, 0xA0}, /* 0xC4-0xC7 */ + {0xC3, 0xA1}, {0xC3, 0xA2}, {0xC3, 0xA3}, {0xC3, 0xA4}, /* 0xC8-0xCB */ + {0xC3, 0xA5}, {0xC3, 0xA6}, {0xC3, 0xA7}, {0xC3, 0xA8}, /* 0xCC-0xCF */ + {0xC3, 0xA9}, {0xC3, 0xAA}, {0xC3, 0xAB}, {0xC3, 0xAC}, /* 0xD0-0xD3 */ + {0xC3, 0xAD}, {0xC3, 0xAE}, {0xC3, 0xAF}, {0xC3, 0xB0}, /* 0xD4-0xD7 */ + {0xC3, 0xB1}, {0xC3, 0xB2}, {0xC3, 0xB3}, {0xC3, 0xB4}, /* 0xD8-0xDB */ + {0xC3, 0xB5}, {0xC3, 0xB6}, {0xC3, 0xB7}, {0xC3, 0xB8}, /* 0xDC-0xDF */ + {0xC3, 0xB9}, {0xC3, 0xBA}, {0xC3, 0xBB}, {0xC3, 0xBC}, /* 0xE0-0xE3 */ + {0xC3, 0xBD}, {0xC3, 0xBE}, {0xC3, 0xBF}, {0xC3, 0xC1}, /* 0xE4-0xE7 */ + {0xC3, 0xC2}, {0xC3, 0xC3}, {0xC3, 0xC4}, {0xC3, 0xC5}, /* 0xE8-0xEB */ + {0xC3, 0xC6}, {0xC3, 0xC7}, {0xC3, 0xC8}, {0xC3, 0xC9}, /* 0xEC-0xEF */ + {0xC3, 0xCA}, {0xC3, 0xCB}, {0xC3, 0xCC}, {0xC3, 0xCD}, /* 0xF0-0xF3 */ + {0xC3, 0xCE}, {0xC3, 0xCF}, {0xC3, 0xD0}, {0xC3, 0xD1}, /* 0xF4-0xF7 */ + {0xC3, 0xD2}, {0xC3, 0xD3}, {0xC3, 0xD4}, {0xC3, 0xD5}, /* 0xF8-0xFB */ + {0xC3, 0xD6}, {0xC3, 0xD7}, {0xC3, 0xDA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9C[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC3, 0xDB}, {0xC3, 0xDD}, {0xC3, 0xDE}, /* 0x40-0x43 */ + {0xC3, 0xE1}, {0xC3, 0xE3}, {0xC3, 0xE4}, {0xC3, 0xE5}, /* 0x44-0x47 */ + {0xC3, 0xE6}, {0xC3, 0xE7}, {0xC3, 0xEA}, {0xC3, 0xEB}, /* 0x48-0x4B */ + {0xC3, 0xEC}, {0xC3, 0xEE}, {0xC3, 0xEF}, {0xC3, 0xF0}, /* 0x4C-0x4F */ + {0xC3, 0xF1}, {0xC3, 0xF2}, {0xC3, 0xF3}, {0xC3, 0xF6}, /* 0x50-0x53 */ + {0xC3, 0xF7}, {0xC3, 0xF9}, {0xC3, 0xFA}, {0xC3, 0xFB}, /* 0x54-0x57 */ + {0xC3, 0xFC}, {0xC3, 0xFD}, {0xC3, 0xFE}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC3, 0xFF}, {0xC4, 0x00}, {0xC4, 0x01}, /* 0x60-0x63 */ + {0xC4, 0x02}, {0xC4, 0x03}, {0xC4, 0x04}, {0xC4, 0x05}, /* 0x64-0x67 */ + {0xC4, 0x06}, {0xC4, 0x07}, {0xC4, 0x09}, {0xC4, 0x0A}, /* 0x68-0x6B */ + {0xC4, 0x0B}, {0xC4, 0x0C}, {0xC4, 0x0D}, {0xC4, 0x0E}, /* 0x6C-0x6F */ + {0xC4, 0x0F}, {0xC4, 0x11}, {0xC4, 0x12}, {0xC4, 0x13}, /* 0x70-0x73 */ + {0xC4, 0x14}, {0xC4, 0x15}, {0xC4, 0x16}, {0xC4, 0x17}, /* 0x74-0x77 */ + {0xC4, 0x18}, {0xC4, 0x19}, {0xC4, 0x1A}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC4, 0x1B}, {0xC4, 0x1C}, {0xC4, 0x1D}, /* 0x80-0x83 */ + {0xC4, 0x1E}, {0xC4, 0x1F}, {0xC4, 0x20}, {0xC4, 0x21}, /* 0x84-0x87 */ + {0xC4, 0x22}, {0xC4, 0x23}, {0xC4, 0x25}, {0xC4, 0x26}, /* 0x88-0x8B */ + {0xC4, 0x27}, {0xC4, 0x28}, {0xC4, 0x29}, {0xC4, 0x2A}, /* 0x8C-0x8F */ + {0xC4, 0x2B}, {0xC4, 0x2D}, {0xC4, 0x2E}, {0xC4, 0x2F}, /* 0x90-0x93 */ + {0xC4, 0x31}, {0xC4, 0x32}, {0xC4, 0x33}, {0xC4, 0x35}, /* 0x94-0x97 */ + {0xC4, 0x36}, {0xC4, 0x37}, {0xC4, 0x38}, {0xC4, 0x39}, /* 0x98-0x9B */ + {0xC4, 0x3A}, {0xC4, 0x3B}, {0xC4, 0x3E}, {0xC4, 0x3F}, /* 0x9C-0x9F */ + {0xC4, 0x40}, {0xC4, 0x41}, {0xC4, 0x42}, {0xC4, 0x43}, /* 0xA0-0xA3 */ + {0xC4, 0x44}, {0xC4, 0x45}, {0xC4, 0x46}, {0xC4, 0x47}, /* 0xA4-0xA7 */ + {0xC4, 0x49}, {0xC4, 0x4A}, {0xC4, 0x4B}, {0xC4, 0x4C}, /* 0xA8-0xAB */ + {0xC4, 0x4D}, {0xC4, 0x4E}, {0xC4, 0x4F}, {0xC4, 0x50}, /* 0xAC-0xAF */ + {0xC4, 0x51}, {0xC4, 0x52}, {0xC4, 0x53}, {0xC4, 0x54}, /* 0xB0-0xB3 */ + {0xC4, 0x55}, {0xC4, 0x56}, {0xC4, 0x57}, {0xC4, 0x58}, /* 0xB4-0xB7 */ + {0xC4, 0x59}, {0xC4, 0x5A}, {0xC4, 0x5B}, {0xC4, 0x5C}, /* 0xB8-0xBB */ + {0xC4, 0x5D}, {0xC4, 0x5E}, {0xC4, 0x5F}, {0xC4, 0x60}, /* 0xBC-0xBF */ + {0xC4, 0x61}, {0xC4, 0x62}, {0xC4, 0x63}, {0xC4, 0x66}, /* 0xC0-0xC3 */ + {0xC4, 0x67}, {0xC4, 0x69}, {0xC4, 0x6A}, {0xC4, 0x6B}, /* 0xC4-0xC7 */ + {0xC4, 0x6D}, {0xC4, 0x6E}, {0xC4, 0x6F}, {0xC4, 0x70}, /* 0xC8-0xCB */ + {0xC4, 0x71}, {0xC4, 0x72}, {0xC4, 0x73}, {0xC4, 0x76}, /* 0xCC-0xCF */ + {0xC4, 0x77}, {0xC4, 0x78}, {0xC4, 0x7A}, {0xC4, 0x7B}, /* 0xD0-0xD3 */ + {0xC4, 0x7C}, {0xC4, 0x7D}, {0xC4, 0x7E}, {0xC4, 0x7F}, /* 0xD4-0xD7 */ + {0xC4, 0x81}, {0xC4, 0x82}, {0xC4, 0x83}, {0xC4, 0x84}, /* 0xD8-0xDB */ + {0xC4, 0x85}, {0xC4, 0x86}, {0xC4, 0x87}, {0xC4, 0x88}, /* 0xDC-0xDF */ + {0xC4, 0x89}, {0xC4, 0x8A}, {0xC4, 0x8B}, {0xC4, 0x8C}, /* 0xE0-0xE3 */ + {0xC4, 0x8D}, {0xC4, 0x8E}, {0xC4, 0x8F}, {0xC4, 0x90}, /* 0xE4-0xE7 */ + {0xC4, 0x91}, {0xC4, 0x92}, {0xC4, 0x93}, {0xC4, 0x95}, /* 0xE8-0xEB */ + {0xC4, 0x96}, {0xC4, 0x97}, {0xC4, 0x98}, {0xC4, 0x99}, /* 0xEC-0xEF */ + {0xC4, 0x9A}, {0xC4, 0x9B}, {0xC4, 0x9D}, {0xC4, 0x9E}, /* 0xF0-0xF3 */ + {0xC4, 0x9F}, {0xC4, 0xA0}, {0xC4, 0xA1}, {0xC4, 0xA2}, /* 0xF4-0xF7 */ + {0xC4, 0xA3}, {0xC4, 0xA4}, {0xC4, 0xA5}, {0xC4, 0xA6}, /* 0xF8-0xFB */ + {0xC4, 0xA7}, {0xC4, 0xA8}, {0xC4, 0xA9}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9D[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC4, 0xAA}, {0xC4, 0xAB}, {0xC4, 0xAC}, /* 0x40-0x43 */ + {0xC4, 0xAD}, {0xC4, 0xAE}, {0xC4, 0xAF}, {0xC4, 0xB0}, /* 0x44-0x47 */ + {0xC4, 0xB1}, {0xC4, 0xB2}, {0xC4, 0xB3}, {0xC4, 0xB4}, /* 0x48-0x4B */ + {0xC4, 0xB5}, {0xC4, 0xB6}, {0xC4, 0xB7}, {0xC4, 0xB9}, /* 0x4C-0x4F */ + {0xC4, 0xBA}, {0xC4, 0xBB}, {0xC4, 0xBD}, {0xC4, 0xBE}, /* 0x50-0x53 */ + {0xC4, 0xBF}, {0xC4, 0xC0}, {0xC4, 0xC1}, {0xC4, 0xC2}, /* 0x54-0x57 */ + {0xC4, 0xC3}, {0xC4, 0xC4}, {0xC4, 0xC5}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC4, 0xC6}, {0xC4, 0xC7}, {0xC4, 0xC8}, /* 0x60-0x63 */ + {0xC4, 0xC9}, {0xC4, 0xCA}, {0xC4, 0xCB}, {0xC4, 0xCC}, /* 0x64-0x67 */ + {0xC4, 0xCD}, {0xC4, 0xCE}, {0xC4, 0xCF}, {0xC4, 0xD0}, /* 0x68-0x6B */ + {0xC4, 0xD1}, {0xC4, 0xD2}, {0xC4, 0xD3}, {0xC4, 0xD4}, /* 0x6C-0x6F */ + {0xC4, 0xD5}, {0xC4, 0xD6}, {0xC4, 0xD7}, {0xC4, 0xD8}, /* 0x70-0x73 */ + {0xC4, 0xD9}, {0xC4, 0xDA}, {0xC4, 0xDB}, {0xC4, 0xDC}, /* 0x74-0x77 */ + {0xC4, 0xDD}, {0xC4, 0xDE}, {0xC4, 0xDF}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC4, 0xE0}, {0xC4, 0xE1}, {0xC4, 0xE2}, /* 0x80-0x83 */ + {0xC4, 0xE3}, {0xC4, 0xE4}, {0xC4, 0xE5}, {0xC4, 0xE6}, /* 0x84-0x87 */ + {0xC4, 0xE7}, {0xC4, 0xE8}, {0xC4, 0xEA}, {0xC4, 0xEB}, /* 0x88-0x8B */ + {0xC4, 0xEC}, {0xC4, 0xED}, {0xC4, 0xEE}, {0xC4, 0xEF}, /* 0x8C-0x8F */ + {0xC4, 0xF2}, {0xC4, 0xF3}, {0xC4, 0xF5}, {0xC4, 0xF6}, /* 0x90-0x93 */ + {0xC4, 0xF7}, {0xC4, 0xF9}, {0xC4, 0xFB}, {0xC4, 0xFC}, /* 0x94-0x97 */ + {0xC4, 0xFD}, {0xC4, 0xFE}, {0xC5, 0x02}, {0xC5, 0x03}, /* 0x98-0x9B */ + {0xC5, 0x04}, {0xC5, 0x05}, {0xC5, 0x06}, {0xC5, 0x07}, /* 0x9C-0x9F */ + {0xC5, 0x08}, {0xC5, 0x09}, {0xC5, 0x0A}, {0xC5, 0x0B}, /* 0xA0-0xA3 */ + {0xC5, 0x0D}, {0xC5, 0x0E}, {0xC5, 0x0F}, {0xC5, 0x11}, /* 0xA4-0xA7 */ + {0xC5, 0x12}, {0xC5, 0x13}, {0xC5, 0x15}, {0xC5, 0x16}, /* 0xA8-0xAB */ + {0xC5, 0x17}, {0xC5, 0x18}, {0xC5, 0x19}, {0xC5, 0x1A}, /* 0xAC-0xAF */ + {0xC5, 0x1B}, {0xC5, 0x1D}, {0xC5, 0x1E}, {0xC5, 0x1F}, /* 0xB0-0xB3 */ + {0xC5, 0x20}, {0xC5, 0x21}, {0xC5, 0x22}, {0xC5, 0x23}, /* 0xB4-0xB7 */ + {0xC5, 0x24}, {0xC5, 0x25}, {0xC5, 0x26}, {0xC5, 0x27}, /* 0xB8-0xBB */ + {0xC5, 0x2A}, {0xC5, 0x2B}, {0xC5, 0x2D}, {0xC5, 0x2E}, /* 0xBC-0xBF */ + {0xC5, 0x2F}, {0xC5, 0x31}, {0xC5, 0x32}, {0xC5, 0x33}, /* 0xC0-0xC3 */ + {0xC5, 0x34}, {0xC5, 0x35}, {0xC5, 0x36}, {0xC5, 0x37}, /* 0xC4-0xC7 */ + {0xC5, 0x3A}, {0xC5, 0x3C}, {0xC5, 0x3E}, {0xC5, 0x3F}, /* 0xC8-0xCB */ + {0xC5, 0x40}, {0xC5, 0x41}, {0xC5, 0x42}, {0xC5, 0x43}, /* 0xCC-0xCF */ + {0xC5, 0x46}, {0xC5, 0x47}, {0xC5, 0x4B}, {0xC5, 0x4F}, /* 0xD0-0xD3 */ + {0xC5, 0x50}, {0xC5, 0x51}, {0xC5, 0x52}, {0xC5, 0x56}, /* 0xD4-0xD7 */ + {0xC5, 0x5A}, {0xC5, 0x5B}, {0xC5, 0x5C}, {0xC5, 0x5F}, /* 0xD8-0xDB */ + {0xC5, 0x62}, {0xC5, 0x63}, {0xC5, 0x65}, {0xC5, 0x66}, /* 0xDC-0xDF */ + {0xC5, 0x67}, {0xC5, 0x69}, {0xC5, 0x6A}, {0xC5, 0x6B}, /* 0xE0-0xE3 */ + {0xC5, 0x6C}, {0xC5, 0x6D}, {0xC5, 0x6E}, {0xC5, 0x6F}, /* 0xE4-0xE7 */ + {0xC5, 0x72}, {0xC5, 0x76}, {0xC5, 0x77}, {0xC5, 0x78}, /* 0xE8-0xEB */ + {0xC5, 0x79}, {0xC5, 0x7A}, {0xC5, 0x7B}, {0xC5, 0x7E}, /* 0xEC-0xEF */ + {0xC5, 0x7F}, {0xC5, 0x81}, {0xC5, 0x82}, {0xC5, 0x83}, /* 0xF0-0xF3 */ + {0xC5, 0x85}, {0xC5, 0x86}, {0xC5, 0x88}, {0xC5, 0x89}, /* 0xF4-0xF7 */ + {0xC5, 0x8A}, {0xC5, 0x8B}, {0xC5, 0x8E}, {0xC5, 0x90}, /* 0xF8-0xFB */ + {0xC5, 0x92}, {0xC5, 0x93}, {0xC5, 0x94}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9E[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC5, 0x96}, {0xC5, 0x99}, {0xC5, 0x9A}, /* 0x40-0x43 */ + {0xC5, 0x9B}, {0xC5, 0x9D}, {0xC5, 0x9E}, {0xC5, 0x9F}, /* 0x44-0x47 */ + {0xC5, 0xA1}, {0xC5, 0xA2}, {0xC5, 0xA3}, {0xC5, 0xA4}, /* 0x48-0x4B */ + {0xC5, 0xA5}, {0xC5, 0xA6}, {0xC5, 0xA7}, {0xC5, 0xA8}, /* 0x4C-0x4F */ + {0xC5, 0xAA}, {0xC5, 0xAB}, {0xC5, 0xAC}, {0xC5, 0xAD}, /* 0x50-0x53 */ + {0xC5, 0xAE}, {0xC5, 0xAF}, {0xC5, 0xB0}, {0xC5, 0xB1}, /* 0x54-0x57 */ + {0xC5, 0xB2}, {0xC5, 0xB3}, {0xC5, 0xB6}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC5, 0xB7}, {0xC5, 0xBA}, {0xC5, 0xBF}, /* 0x60-0x63 */ + {0xC5, 0xC0}, {0xC5, 0xC1}, {0xC5, 0xC2}, {0xC5, 0xC3}, /* 0x64-0x67 */ + {0xC5, 0xCB}, {0xC5, 0xCD}, {0xC5, 0xCF}, {0xC5, 0xD2}, /* 0x68-0x6B */ + {0xC5, 0xD3}, {0xC5, 0xD5}, {0xC5, 0xD6}, {0xC5, 0xD7}, /* 0x6C-0x6F */ + {0xC5, 0xD9}, {0xC5, 0xDA}, {0xC5, 0xDB}, {0xC5, 0xDC}, /* 0x70-0x73 */ + {0xC5, 0xDD}, {0xC5, 0xDE}, {0xC5, 0xDF}, {0xC5, 0xE2}, /* 0x74-0x77 */ + {0xC5, 0xE4}, {0xC5, 0xE6}, {0xC5, 0xE7}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC5, 0xE8}, {0xC5, 0xE9}, {0xC5, 0xEA}, /* 0x80-0x83 */ + {0xC5, 0xEB}, {0xC5, 0xEF}, {0xC5, 0xF1}, {0xC5, 0xF2}, /* 0x84-0x87 */ + {0xC5, 0xF3}, {0xC5, 0xF5}, {0xC5, 0xF8}, {0xC5, 0xF9}, /* 0x88-0x8B */ + {0xC5, 0xFA}, {0xC5, 0xFB}, {0xC6, 0x02}, {0xC6, 0x03}, /* 0x8C-0x8F */ + {0xC6, 0x04}, {0xC6, 0x09}, {0xC6, 0x0A}, {0xC6, 0x0B}, /* 0x90-0x93 */ + {0xC6, 0x0D}, {0xC6, 0x0E}, {0xC6, 0x0F}, {0xC6, 0x11}, /* 0x94-0x97 */ + {0xC6, 0x12}, {0xC6, 0x13}, {0xC6, 0x14}, {0xC6, 0x15}, /* 0x98-0x9B */ + {0xC6, 0x16}, {0xC6, 0x17}, {0xC6, 0x1A}, {0xC6, 0x1D}, /* 0x9C-0x9F */ + {0xC6, 0x1E}, {0xC6, 0x1F}, {0xC6, 0x20}, {0xC6, 0x21}, /* 0xA0-0xA3 */ + {0xC6, 0x22}, {0xC6, 0x23}, {0xC6, 0x26}, {0xC6, 0x27}, /* 0xA4-0xA7 */ + {0xC6, 0x29}, {0xC6, 0x2A}, {0xC6, 0x2B}, {0xC6, 0x2F}, /* 0xA8-0xAB */ + {0xC6, 0x31}, {0xC6, 0x32}, {0xC6, 0x36}, {0xC6, 0x38}, /* 0xAC-0xAF */ + {0xC6, 0x3A}, {0xC6, 0x3C}, {0xC6, 0x3D}, {0xC6, 0x3E}, /* 0xB0-0xB3 */ + {0xC6, 0x3F}, {0xC6, 0x42}, {0xC6, 0x43}, {0xC6, 0x45}, /* 0xB4-0xB7 */ + {0xC6, 0x46}, {0xC6, 0x47}, {0xC6, 0x49}, {0xC6, 0x4A}, /* 0xB8-0xBB */ + {0xC6, 0x4B}, {0xC6, 0x4C}, {0xC6, 0x4D}, {0xC6, 0x4E}, /* 0xBC-0xBF */ + {0xC6, 0x4F}, {0xC6, 0x52}, {0xC6, 0x56}, {0xC6, 0x57}, /* 0xC0-0xC3 */ + {0xC6, 0x58}, {0xC6, 0x59}, {0xC6, 0x5A}, {0xC6, 0x5B}, /* 0xC4-0xC7 */ + {0xC6, 0x5E}, {0xC6, 0x5F}, {0xC6, 0x61}, {0xC6, 0x62}, /* 0xC8-0xCB */ + {0xC6, 0x63}, {0xC6, 0x64}, {0xC6, 0x65}, {0xC6, 0x66}, /* 0xCC-0xCF */ + {0xC6, 0x67}, {0xC6, 0x68}, {0xC6, 0x69}, {0xC6, 0x6A}, /* 0xD0-0xD3 */ + {0xC6, 0x6B}, {0xC6, 0x6D}, {0xC6, 0x6E}, {0xC6, 0x70}, /* 0xD4-0xD7 */ + {0xC6, 0x72}, {0xC6, 0x73}, {0xC6, 0x74}, {0xC6, 0x75}, /* 0xD8-0xDB */ + {0xC6, 0x76}, {0xC6, 0x77}, {0xC6, 0x7A}, {0xC6, 0x7B}, /* 0xDC-0xDF */ + {0xC6, 0x7D}, {0xC6, 0x7E}, {0xC6, 0x7F}, {0xC6, 0x81}, /* 0xE0-0xE3 */ + {0xC6, 0x82}, {0xC6, 0x83}, {0xC6, 0x84}, {0xC6, 0x85}, /* 0xE4-0xE7 */ + {0xC6, 0x86}, {0xC6, 0x87}, {0xC6, 0x8A}, {0xC6, 0x8C}, /* 0xE8-0xEB */ + {0xC6, 0x8E}, {0xC6, 0x8F}, {0xC6, 0x90}, {0xC6, 0x91}, /* 0xEC-0xEF */ + {0xC6, 0x92}, {0xC6, 0x93}, {0xC6, 0x96}, {0xC6, 0x97}, /* 0xF0-0xF3 */ + {0xC6, 0x99}, {0xC6, 0x9A}, {0xC6, 0x9B}, {0xC6, 0x9D}, /* 0xF4-0xF7 */ + {0xC6, 0x9E}, {0xC6, 0x9F}, {0xC6, 0xA0}, {0xC6, 0xA1}, /* 0xF8-0xFB */ + {0xC6, 0xA2}, {0xC6, 0xA3}, {0xC6, 0xA6}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_9F[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC6, 0xA8}, {0xC6, 0xAA}, {0xC6, 0xAB}, /* 0x40-0x43 */ + {0xC6, 0xAC}, {0xC6, 0xAD}, {0xC6, 0xAE}, {0xC6, 0xAF}, /* 0x44-0x47 */ + {0xC6, 0xB2}, {0xC6, 0xB3}, {0xC6, 0xB5}, {0xC6, 0xB6}, /* 0x48-0x4B */ + {0xC6, 0xB7}, {0xC6, 0xBB}, {0xC6, 0xBC}, {0xC6, 0xBD}, /* 0x4C-0x4F */ + {0xC6, 0xBE}, {0xC6, 0xBF}, {0xC6, 0xC2}, {0xC6, 0xC4}, /* 0x50-0x53 */ + {0xC6, 0xC6}, {0xC6, 0xC7}, {0xC6, 0xC8}, {0xC6, 0xC9}, /* 0x54-0x57 */ + {0xC6, 0xCA}, {0xC6, 0xCB}, {0xC6, 0xCE}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC6, 0xCF}, {0xC6, 0xD1}, {0xC6, 0xD2}, /* 0x60-0x63 */ + {0xC6, 0xD3}, {0xC6, 0xD5}, {0xC6, 0xD6}, {0xC6, 0xD7}, /* 0x64-0x67 */ + {0xC6, 0xD8}, {0xC6, 0xD9}, {0xC6, 0xDA}, {0xC6, 0xDB}, /* 0x68-0x6B */ + {0xC6, 0xDE}, {0xC6, 0xDF}, {0xC6, 0xE2}, {0xC6, 0xE3}, /* 0x6C-0x6F */ + {0xC6, 0xE4}, {0xC6, 0xE5}, {0xC6, 0xE6}, {0xC6, 0xE7}, /* 0x70-0x73 */ + {0xC6, 0xEA}, {0xC6, 0xEB}, {0xC6, 0xED}, {0xC6, 0xEE}, /* 0x74-0x77 */ + {0xC6, 0xEF}, {0xC6, 0xF1}, {0xC6, 0xF2}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC6, 0xF3}, {0xC6, 0xF4}, {0xC6, 0xF5}, /* 0x80-0x83 */ + {0xC6, 0xF6}, {0xC6, 0xF7}, {0xC6, 0xFA}, {0xC6, 0xFB}, /* 0x84-0x87 */ + {0xC6, 0xFC}, {0xC6, 0xFE}, {0xC6, 0xFF}, {0xC7, 0x00}, /* 0x88-0x8B */ + {0xC7, 0x01}, {0xC7, 0x02}, {0xC7, 0x03}, {0xC7, 0x06}, /* 0x8C-0x8F */ + {0xC7, 0x07}, {0xC7, 0x09}, {0xC7, 0x0A}, {0xC7, 0x0B}, /* 0x90-0x93 */ + {0xC7, 0x0D}, {0xC7, 0x0E}, {0xC7, 0x0F}, {0xC7, 0x10}, /* 0x94-0x97 */ + {0xC7, 0x11}, {0xC7, 0x12}, {0xC7, 0x13}, {0xC7, 0x16}, /* 0x98-0x9B */ + {0xC7, 0x18}, {0xC7, 0x1A}, {0xC7, 0x1B}, {0xC7, 0x1C}, /* 0x9C-0x9F */ + {0xC7, 0x1D}, {0xC7, 0x1E}, {0xC7, 0x1F}, {0xC7, 0x22}, /* 0xA0-0xA3 */ + {0xC7, 0x23}, {0xC7, 0x25}, {0xC7, 0x26}, {0xC7, 0x27}, /* 0xA4-0xA7 */ + {0xC7, 0x29}, {0xC7, 0x2A}, {0xC7, 0x2B}, {0xC7, 0x2C}, /* 0xA8-0xAB */ + {0xC7, 0x2D}, {0xC7, 0x2E}, {0xC7, 0x2F}, {0xC7, 0x32}, /* 0xAC-0xAF */ + {0xC7, 0x34}, {0xC7, 0x36}, {0xC7, 0x38}, {0xC7, 0x39}, /* 0xB0-0xB3 */ + {0xC7, 0x3A}, {0xC7, 0x3B}, {0xC7, 0x3E}, {0xC7, 0x3F}, /* 0xB4-0xB7 */ + {0xC7, 0x41}, {0xC7, 0x42}, {0xC7, 0x43}, {0xC7, 0x45}, /* 0xB8-0xBB */ + {0xC7, 0x46}, {0xC7, 0x47}, {0xC7, 0x48}, {0xC7, 0x49}, /* 0xBC-0xBF */ + {0xC7, 0x4B}, {0xC7, 0x4E}, {0xC7, 0x50}, {0xC7, 0x59}, /* 0xC0-0xC3 */ + {0xC7, 0x5A}, {0xC7, 0x5B}, {0xC7, 0x5D}, {0xC7, 0x5E}, /* 0xC4-0xC7 */ + {0xC7, 0x5F}, {0xC7, 0x61}, {0xC7, 0x62}, {0xC7, 0x63}, /* 0xC8-0xCB */ + {0xC7, 0x64}, {0xC7, 0x65}, {0xC7, 0x66}, {0xC7, 0x67}, /* 0xCC-0xCF */ + {0xC7, 0x69}, {0xC7, 0x6A}, {0xC7, 0x6C}, {0xC7, 0x6D}, /* 0xD0-0xD3 */ + {0xC7, 0x6E}, {0xC7, 0x6F}, {0xC7, 0x70}, {0xC7, 0x71}, /* 0xD4-0xD7 */ + {0xC7, 0x72}, {0xC7, 0x73}, {0xC7, 0x76}, {0xC7, 0x77}, /* 0xD8-0xDB */ + {0xC7, 0x79}, {0xC7, 0x7A}, {0xC7, 0x7B}, {0xC7, 0x7F}, /* 0xDC-0xDF */ + {0xC7, 0x80}, {0xC7, 0x81}, {0xC7, 0x82}, {0xC7, 0x86}, /* 0xE0-0xE3 */ + {0xC7, 0x8B}, {0xC7, 0x8C}, {0xC7, 0x8D}, {0xC7, 0x8F}, /* 0xE4-0xE7 */ + {0xC7, 0x92}, {0xC7, 0x93}, {0xC7, 0x95}, {0xC7, 0x99}, /* 0xE8-0xEB */ + {0xC7, 0x9B}, {0xC7, 0x9C}, {0xC7, 0x9D}, {0xC7, 0x9E}, /* 0xEC-0xEF */ + {0xC7, 0x9F}, {0xC7, 0xA2}, {0xC7, 0xA7}, {0xC7, 0xA8}, /* 0xF0-0xF3 */ + {0xC7, 0xA9}, {0xC7, 0xAA}, {0xC7, 0xAB}, {0xC7, 0xAE}, /* 0xF4-0xF7 */ + {0xC7, 0xAF}, {0xC7, 0xB1}, {0xC7, 0xB2}, {0xC7, 0xB3}, /* 0xF8-0xFB */ + {0xC7, 0xB5}, {0xC7, 0xB6}, {0xC7, 0xB7}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC7, 0xB8}, {0xC7, 0xB9}, {0xC7, 0xBA}, /* 0x40-0x43 */ + {0xC7, 0xBB}, {0xC7, 0xBE}, {0xC7, 0xC2}, {0xC7, 0xC3}, /* 0x44-0x47 */ + {0xC7, 0xC4}, {0xC7, 0xC5}, {0xC7, 0xC6}, {0xC7, 0xC7}, /* 0x48-0x4B */ + {0xC7, 0xCA}, {0xC7, 0xCB}, {0xC7, 0xCD}, {0xC7, 0xCF}, /* 0x4C-0x4F */ + {0xC7, 0xD1}, {0xC7, 0xD2}, {0xC7, 0xD3}, {0xC7, 0xD4}, /* 0x50-0x53 */ + {0xC7, 0xD5}, {0xC7, 0xD6}, {0xC7, 0xD7}, {0xC7, 0xD9}, /* 0x54-0x57 */ + {0xC7, 0xDA}, {0xC7, 0xDB}, {0xC7, 0xDC}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC7, 0xDE}, {0xC7, 0xDF}, {0xC7, 0xE0}, /* 0x60-0x63 */ + {0xC7, 0xE1}, {0xC7, 0xE2}, {0xC7, 0xE3}, {0xC7, 0xE5}, /* 0x64-0x67 */ + {0xC7, 0xE6}, {0xC7, 0xE7}, {0xC7, 0xE9}, {0xC7, 0xEA}, /* 0x68-0x6B */ + {0xC7, 0xEB}, {0xC7, 0xED}, {0xC7, 0xEE}, {0xC7, 0xEF}, /* 0x6C-0x6F */ + {0xC7, 0xF0}, {0xC7, 0xF1}, {0xC7, 0xF2}, {0xC7, 0xF3}, /* 0x70-0x73 */ + {0xC7, 0xF4}, {0xC7, 0xF5}, {0xC7, 0xF6}, {0xC7, 0xF7}, /* 0x74-0x77 */ + {0xC7, 0xF8}, {0xC7, 0xF9}, {0xC7, 0xFA}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC7, 0xFB}, {0xC7, 0xFC}, {0xC7, 0xFD}, /* 0x80-0x83 */ + {0xC7, 0xFE}, {0xC7, 0xFF}, {0xC8, 0x02}, {0xC8, 0x03}, /* 0x84-0x87 */ + {0xC8, 0x05}, {0xC8, 0x06}, {0xC8, 0x07}, {0xC8, 0x09}, /* 0x88-0x8B */ + {0xC8, 0x0B}, {0xC8, 0x0C}, {0xC8, 0x0D}, {0xC8, 0x0E}, /* 0x8C-0x8F */ + {0xC8, 0x0F}, {0xC8, 0x12}, {0xC8, 0x14}, {0xC8, 0x17}, /* 0x90-0x93 */ + {0xC8, 0x18}, {0xC8, 0x19}, {0xC8, 0x1A}, {0xC8, 0x1B}, /* 0x94-0x97 */ + {0xC8, 0x1E}, {0xC8, 0x1F}, {0xC8, 0x21}, {0xC8, 0x22}, /* 0x98-0x9B */ + {0xC8, 0x23}, {0xC8, 0x25}, {0xC8, 0x26}, {0xC8, 0x27}, /* 0x9C-0x9F */ + {0xC8, 0x28}, {0xC8, 0x29}, {0xC8, 0x2A}, {0xC8, 0x2B}, /* 0xA0-0xA3 */ + {0xC8, 0x2E}, {0xC8, 0x30}, {0xC8, 0x32}, {0xC8, 0x33}, /* 0xA4-0xA7 */ + {0xC8, 0x34}, {0xC8, 0x35}, {0xC8, 0x36}, {0xC8, 0x37}, /* 0xA8-0xAB */ + {0xC8, 0x39}, {0xC8, 0x3A}, {0xC8, 0x3B}, {0xC8, 0x3D}, /* 0xAC-0xAF */ + {0xC8, 0x3E}, {0xC8, 0x3F}, {0xC8, 0x41}, {0xC8, 0x42}, /* 0xB0-0xB3 */ + {0xC8, 0x43}, {0xC8, 0x44}, {0xC8, 0x45}, {0xC8, 0x46}, /* 0xB4-0xB7 */ + {0xC8, 0x47}, {0xC8, 0x4A}, {0xC8, 0x4B}, {0xC8, 0x4E}, /* 0xB8-0xBB */ + {0xC8, 0x4F}, {0xC8, 0x50}, {0xC8, 0x51}, {0xC8, 0x52}, /* 0xBC-0xBF */ + {0xC8, 0x53}, {0xC8, 0x55}, {0xC8, 0x56}, {0xC8, 0x57}, /* 0xC0-0xC3 */ + {0xC8, 0x58}, {0xC8, 0x59}, {0xC8, 0x5A}, {0xC8, 0x5B}, /* 0xC4-0xC7 */ + {0xC8, 0x5C}, {0xC8, 0x5D}, {0xC8, 0x5E}, {0xC8, 0x5F}, /* 0xC8-0xCB */ + {0xC8, 0x60}, {0xC8, 0x61}, {0xC8, 0x62}, {0xC8, 0x63}, /* 0xCC-0xCF */ + {0xC8, 0x64}, {0xC8, 0x65}, {0xC8, 0x66}, {0xC8, 0x67}, /* 0xD0-0xD3 */ + {0xC8, 0x68}, {0xC8, 0x69}, {0xC8, 0x6A}, {0xC8, 0x6B}, /* 0xD4-0xD7 */ + {0xC8, 0x6C}, {0xC8, 0x6D}, {0xC8, 0x6E}, {0xC8, 0x6F}, /* 0xD8-0xDB */ + {0xC8, 0x72}, {0xC8, 0x73}, {0xC8, 0x75}, {0xC8, 0x76}, /* 0xDC-0xDF */ + {0xC8, 0x77}, {0xC8, 0x79}, {0xC8, 0x7B}, {0xC8, 0x7C}, /* 0xE0-0xE3 */ + {0xC8, 0x7D}, {0xC8, 0x7E}, {0xC8, 0x7F}, {0xC8, 0x82}, /* 0xE4-0xE7 */ + {0xC8, 0x84}, {0xC8, 0x88}, {0xC8, 0x89}, {0xC8, 0x8A}, /* 0xE8-0xEB */ + {0xC8, 0x8E}, {0xC8, 0x8F}, {0xC8, 0x90}, {0xC8, 0x91}, /* 0xEC-0xEF */ + {0xC8, 0x92}, {0xC8, 0x93}, {0xC8, 0x95}, {0xC8, 0x96}, /* 0xF0-0xF3 */ + {0xC8, 0x97}, {0xC8, 0x98}, {0xC8, 0x99}, {0xC8, 0x9A}, /* 0xF4-0xF7 */ + {0xC8, 0x9B}, {0xC8, 0x9C}, {0xC8, 0x9E}, {0xC8, 0xA0}, /* 0xF8-0xFB */ + {0xC8, 0xA2}, {0xC8, 0xA3}, {0xC8, 0xA4}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC8, 0xA5}, {0xC8, 0xA6}, {0xC8, 0xA7}, /* 0x40-0x43 */ + {0xC8, 0xA9}, {0xC8, 0xAA}, {0xC8, 0xAB}, {0xC8, 0xAC}, /* 0x44-0x47 */ + {0xC8, 0xAD}, {0xC8, 0xAE}, {0xC8, 0xAF}, {0xC8, 0xB0}, /* 0x48-0x4B */ + {0xC8, 0xB1}, {0xC8, 0xB2}, {0xC8, 0xB3}, {0xC8, 0xB4}, /* 0x4C-0x4F */ + {0xC8, 0xB5}, {0xC8, 0xB6}, {0xC8, 0xB7}, {0xC8, 0xB8}, /* 0x50-0x53 */ + {0xC8, 0xB9}, {0xC8, 0xBA}, {0xC8, 0xBB}, {0xC8, 0xBE}, /* 0x54-0x57 */ + {0xC8, 0xBF}, {0xC8, 0xC0}, {0xC8, 0xC1}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC8, 0xC2}, {0xC8, 0xC3}, {0xC8, 0xC5}, /* 0x60-0x63 */ + {0xC8, 0xC6}, {0xC8, 0xC7}, {0xC8, 0xC9}, {0xC8, 0xCA}, /* 0x64-0x67 */ + {0xC8, 0xCB}, {0xC8, 0xCD}, {0xC8, 0xCE}, {0xC8, 0xCF}, /* 0x68-0x6B */ + {0xC8, 0xD0}, {0xC8, 0xD1}, {0xC8, 0xD2}, {0xC8, 0xD3}, /* 0x6C-0x6F */ + {0xC8, 0xD6}, {0xC8, 0xD8}, {0xC8, 0xDA}, {0xC8, 0xDB}, /* 0x70-0x73 */ + {0xC8, 0xDC}, {0xC8, 0xDD}, {0xC8, 0xDE}, {0xC8, 0xDF}, /* 0x74-0x77 */ + {0xC8, 0xE2}, {0xC8, 0xE3}, {0xC8, 0xE5}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC8, 0xE6}, {0xC8, 0xE7}, {0xC8, 0xE8}, /* 0x80-0x83 */ + {0xC8, 0xE9}, {0xC8, 0xEA}, {0xC8, 0xEB}, {0xC8, 0xEC}, /* 0x84-0x87 */ + {0xC8, 0xED}, {0xC8, 0xEE}, {0xC8, 0xEF}, {0xC8, 0xF0}, /* 0x88-0x8B */ + {0xC8, 0xF1}, {0xC8, 0xF2}, {0xC8, 0xF3}, {0xC8, 0xF4}, /* 0x8C-0x8F */ + {0xC8, 0xF6}, {0xC8, 0xF7}, {0xC8, 0xF8}, {0xC8, 0xF9}, /* 0x90-0x93 */ + {0xC8, 0xFA}, {0xC8, 0xFB}, {0xC8, 0xFE}, {0xC8, 0xFF}, /* 0x94-0x97 */ + {0xC9, 0x01}, {0xC9, 0x02}, {0xC9, 0x03}, {0xC9, 0x07}, /* 0x98-0x9B */ + {0xC9, 0x08}, {0xC9, 0x09}, {0xC9, 0x0A}, {0xC9, 0x0B}, /* 0x9C-0x9F */ + {0xC9, 0x0E}, {0x30, 0x00}, {0x30, 0x01}, {0x30, 0x02}, /* 0xA0-0xA3 */ + {0x00, 0xB7}, {0x20, 0x25}, {0x20, 0x26}, {0x00, 0xA8}, /* 0xA4-0xA7 */ + {0x30, 0x03}, {0x00, 0xAD}, {0x20, 0x15}, {0x22, 0x25}, /* 0xA8-0xAB */ + {0xFF, 0x3C}, {0x22, 0x3C}, {0x20, 0x18}, {0x20, 0x19}, /* 0xAC-0xAF */ + {0x20, 0x1C}, {0x20, 0x1D}, {0x30, 0x14}, {0x30, 0x15}, /* 0xB0-0xB3 */ + {0x30, 0x08}, {0x30, 0x09}, {0x30, 0x0A}, {0x30, 0x0B}, /* 0xB4-0xB7 */ + {0x30, 0x0C}, {0x30, 0x0D}, {0x30, 0x0E}, {0x30, 0x0F}, /* 0xB8-0xBB */ + {0x30, 0x10}, {0x30, 0x11}, {0x00, 0xB1}, {0x00, 0xD7}, /* 0xBC-0xBF */ + {0x00, 0xF7}, {0x22, 0x60}, {0x22, 0x64}, {0x22, 0x65}, /* 0xC0-0xC3 */ + {0x22, 0x1E}, {0x22, 0x34}, {0x00, 0xB0}, {0x20, 0x32}, /* 0xC4-0xC7 */ + {0x20, 0x33}, {0x21, 0x03}, {0x21, 0x2B}, {0xFF, 0xE0}, /* 0xC8-0xCB */ + {0xFF, 0xE1}, {0xFF, 0xE5}, {0x26, 0x42}, {0x26, 0x40}, /* 0xCC-0xCF */ + {0x22, 0x20}, {0x22, 0xA5}, {0x23, 0x12}, {0x22, 0x02}, /* 0xD0-0xD3 */ + {0x22, 0x07}, {0x22, 0x61}, {0x22, 0x52}, {0x00, 0xA7}, /* 0xD4-0xD7 */ + {0x20, 0x3B}, {0x26, 0x06}, {0x26, 0x05}, {0x25, 0xCB}, /* 0xD8-0xDB */ + {0x25, 0xCF}, {0x25, 0xCE}, {0x25, 0xC7}, {0x25, 0xC6}, /* 0xDC-0xDF */ + {0x25, 0xA1}, {0x25, 0xA0}, {0x25, 0xB3}, {0x25, 0xB2}, /* 0xE0-0xE3 */ + {0x25, 0xBD}, {0x25, 0xBC}, {0x21, 0x92}, {0x21, 0x90}, /* 0xE4-0xE7 */ + {0x21, 0x91}, {0x21, 0x93}, {0x21, 0x94}, {0x30, 0x13}, /* 0xE8-0xEB */ + {0x22, 0x6A}, {0x22, 0x6B}, {0x22, 0x1A}, {0x22, 0x3D}, /* 0xEC-0xEF */ + {0x22, 0x1D}, {0x22, 0x35}, {0x22, 0x2B}, {0x22, 0x2C}, /* 0xF0-0xF3 */ + {0x22, 0x08}, {0x22, 0x0B}, {0x22, 0x86}, {0x22, 0x87}, /* 0xF4-0xF7 */ + {0x22, 0x82}, {0x22, 0x83}, {0x22, 0x2A}, {0x22, 0x29}, /* 0xF8-0xFB */ + {0x22, 0x27}, {0x22, 0x28}, {0xFF, 0xE2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC9, 0x10}, {0xC9, 0x12}, {0xC9, 0x13}, /* 0x40-0x43 */ + {0xC9, 0x14}, {0xC9, 0x15}, {0xC9, 0x16}, {0xC9, 0x17}, /* 0x44-0x47 */ + {0xC9, 0x19}, {0xC9, 0x1A}, {0xC9, 0x1B}, {0xC9, 0x1C}, /* 0x48-0x4B */ + {0xC9, 0x1D}, {0xC9, 0x1E}, {0xC9, 0x1F}, {0xC9, 0x20}, /* 0x4C-0x4F */ + {0xC9, 0x21}, {0xC9, 0x22}, {0xC9, 0x23}, {0xC9, 0x24}, /* 0x50-0x53 */ + {0xC9, 0x25}, {0xC9, 0x26}, {0xC9, 0x27}, {0xC9, 0x28}, /* 0x54-0x57 */ + {0xC9, 0x29}, {0xC9, 0x2A}, {0xC9, 0x2B}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC9, 0x2D}, {0xC9, 0x2E}, {0xC9, 0x2F}, /* 0x60-0x63 */ + {0xC9, 0x30}, {0xC9, 0x31}, {0xC9, 0x32}, {0xC9, 0x33}, /* 0x64-0x67 */ + {0xC9, 0x35}, {0xC9, 0x36}, {0xC9, 0x37}, {0xC9, 0x38}, /* 0x68-0x6B */ + {0xC9, 0x39}, {0xC9, 0x3A}, {0xC9, 0x3B}, {0xC9, 0x3C}, /* 0x6C-0x6F */ + {0xC9, 0x3D}, {0xC9, 0x3E}, {0xC9, 0x3F}, {0xC9, 0x40}, /* 0x70-0x73 */ + {0xC9, 0x41}, {0xC9, 0x42}, {0xC9, 0x43}, {0xC9, 0x44}, /* 0x74-0x77 */ + {0xC9, 0x45}, {0xC9, 0x46}, {0xC9, 0x47}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC9, 0x48}, {0xC9, 0x49}, {0xC9, 0x4A}, /* 0x80-0x83 */ + {0xC9, 0x4B}, {0xC9, 0x4C}, {0xC9, 0x4D}, {0xC9, 0x4E}, /* 0x84-0x87 */ + {0xC9, 0x4F}, {0xC9, 0x52}, {0xC9, 0x53}, {0xC9, 0x55}, /* 0x88-0x8B */ + {0xC9, 0x56}, {0xC9, 0x57}, {0xC9, 0x59}, {0xC9, 0x5A}, /* 0x8C-0x8F */ + {0xC9, 0x5B}, {0xC9, 0x5C}, {0xC9, 0x5D}, {0xC9, 0x5E}, /* 0x90-0x93 */ + {0xC9, 0x5F}, {0xC9, 0x62}, {0xC9, 0x64}, {0xC9, 0x65}, /* 0x94-0x97 */ + {0xC9, 0x66}, {0xC9, 0x67}, {0xC9, 0x68}, {0xC9, 0x69}, /* 0x98-0x9B */ + {0xC9, 0x6A}, {0xC9, 0x6B}, {0xC9, 0x6D}, {0xC9, 0x6E}, /* 0x9C-0x9F */ + {0xC9, 0x6F}, {0x21, 0xD2}, {0x21, 0xD4}, {0x22, 0x00}, /* 0xA0-0xA3 */ + {0x22, 0x03}, {0x00, 0xB4}, {0xFF, 0x5E}, {0x02, 0xC7}, /* 0xA4-0xA7 */ + {0x02, 0xD8}, {0x02, 0xDD}, {0x02, 0xDA}, {0x02, 0xD9}, /* 0xA8-0xAB */ + {0x00, 0xB8}, {0x02, 0xDB}, {0x00, 0xA1}, {0x00, 0xBF}, /* 0xAC-0xAF */ + {0x02, 0xD0}, {0x22, 0x2E}, {0x22, 0x11}, {0x22, 0x0F}, /* 0xB0-0xB3 */ + {0x00, 0xA4}, {0x21, 0x09}, {0x20, 0x30}, {0x25, 0xC1}, /* 0xB4-0xB7 */ + {0x25, 0xC0}, {0x25, 0xB7}, {0x25, 0xB6}, {0x26, 0x64}, /* 0xB8-0xBB */ + {0x26, 0x60}, {0x26, 0x61}, {0x26, 0x65}, {0x26, 0x67}, /* 0xBC-0xBF */ + {0x26, 0x63}, {0x22, 0x99}, {0x25, 0xC8}, {0x25, 0xA3}, /* 0xC0-0xC3 */ + {0x25, 0xD0}, {0x25, 0xD1}, {0x25, 0x92}, {0x25, 0xA4}, /* 0xC4-0xC7 */ + {0x25, 0xA5}, {0x25, 0xA8}, {0x25, 0xA7}, {0x25, 0xA6}, /* 0xC8-0xCB */ + {0x25, 0xA9}, {0x26, 0x68}, {0x26, 0x0F}, {0x26, 0x0E}, /* 0xCC-0xCF */ + {0x26, 0x1C}, {0x26, 0x1E}, {0x00, 0xB6}, {0x20, 0x20}, /* 0xD0-0xD3 */ + {0x20, 0x21}, {0x21, 0x95}, {0x21, 0x97}, {0x21, 0x99}, /* 0xD4-0xD7 */ + {0x21, 0x96}, {0x21, 0x98}, {0x26, 0x6D}, {0x26, 0x69}, /* 0xD8-0xDB */ + {0x26, 0x6A}, {0x26, 0x6C}, {0x32, 0x7F}, {0x32, 0x1C}, /* 0xDC-0xDF */ + {0x21, 0x16}, {0x33, 0xC7}, {0x21, 0x22}, {0x33, 0xC2}, /* 0xE0-0xE3 */ + {0x33, 0xD8}, {0x21, 0x21}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC9, 0x71}, {0xC9, 0x72}, {0xC9, 0x73}, /* 0x40-0x43 */ + {0xC9, 0x75}, {0xC9, 0x76}, {0xC9, 0x77}, {0xC9, 0x78}, /* 0x44-0x47 */ + {0xC9, 0x79}, {0xC9, 0x7A}, {0xC9, 0x7B}, {0xC9, 0x7D}, /* 0x48-0x4B */ + {0xC9, 0x7E}, {0xC9, 0x7F}, {0xC9, 0x80}, {0xC9, 0x81}, /* 0x4C-0x4F */ + {0xC9, 0x82}, {0xC9, 0x83}, {0xC9, 0x84}, {0xC9, 0x85}, /* 0x50-0x53 */ + {0xC9, 0x86}, {0xC9, 0x87}, {0xC9, 0x8A}, {0xC9, 0x8B}, /* 0x54-0x57 */ + {0xC9, 0x8D}, {0xC9, 0x8E}, {0xC9, 0x8F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xC9, 0x91}, {0xC9, 0x92}, {0xC9, 0x93}, /* 0x60-0x63 */ + {0xC9, 0x94}, {0xC9, 0x95}, {0xC9, 0x96}, {0xC9, 0x97}, /* 0x64-0x67 */ + {0xC9, 0x9A}, {0xC9, 0x9C}, {0xC9, 0x9E}, {0xC9, 0x9F}, /* 0x68-0x6B */ + {0xC9, 0xA0}, {0xC9, 0xA1}, {0xC9, 0xA2}, {0xC9, 0xA3}, /* 0x6C-0x6F */ + {0xC9, 0xA4}, {0xC9, 0xA5}, {0xC9, 0xA6}, {0xC9, 0xA7}, /* 0x70-0x73 */ + {0xC9, 0xA8}, {0xC9, 0xA9}, {0xC9, 0xAA}, {0xC9, 0xAB}, /* 0x74-0x77 */ + {0xC9, 0xAC}, {0xC9, 0xAD}, {0xC9, 0xAE}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xC9, 0xAF}, {0xC9, 0xB0}, {0xC9, 0xB1}, /* 0x80-0x83 */ + {0xC9, 0xB2}, {0xC9, 0xB3}, {0xC9, 0xB4}, {0xC9, 0xB5}, /* 0x84-0x87 */ + {0xC9, 0xB6}, {0xC9, 0xB7}, {0xC9, 0xB8}, {0xC9, 0xB9}, /* 0x88-0x8B */ + {0xC9, 0xBA}, {0xC9, 0xBB}, {0xC9, 0xBC}, {0xC9, 0xBD}, /* 0x8C-0x8F */ + {0xC9, 0xBE}, {0xC9, 0xBF}, {0xC9, 0xC2}, {0xC9, 0xC3}, /* 0x90-0x93 */ + {0xC9, 0xC5}, {0xC9, 0xC6}, {0xC9, 0xC9}, {0xC9, 0xCB}, /* 0x94-0x97 */ + {0xC9, 0xCC}, {0xC9, 0xCD}, {0xC9, 0xCE}, {0xC9, 0xCF}, /* 0x98-0x9B */ + {0xC9, 0xD2}, {0xC9, 0xD4}, {0xC9, 0xD7}, {0xC9, 0xD8}, /* 0x9C-0x9F */ + {0xC9, 0xDB}, {0xFF, 0x01}, {0xFF, 0x02}, {0xFF, 0x03}, /* 0xA0-0xA3 */ + {0xFF, 0x04}, {0xFF, 0x05}, {0xFF, 0x06}, {0xFF, 0x07}, /* 0xA4-0xA7 */ + {0xFF, 0x08}, {0xFF, 0x09}, {0xFF, 0x0A}, {0xFF, 0x0B}, /* 0xA8-0xAB */ + {0xFF, 0x0C}, {0xFF, 0x0D}, {0xFF, 0x0E}, {0xFF, 0x0F}, /* 0xAC-0xAF */ + {0xFF, 0x10}, {0xFF, 0x11}, {0xFF, 0x12}, {0xFF, 0x13}, /* 0xB0-0xB3 */ + {0xFF, 0x14}, {0xFF, 0x15}, {0xFF, 0x16}, {0xFF, 0x17}, /* 0xB4-0xB7 */ + {0xFF, 0x18}, {0xFF, 0x19}, {0xFF, 0x1A}, {0xFF, 0x1B}, /* 0xB8-0xBB */ + {0xFF, 0x1C}, {0xFF, 0x1D}, {0xFF, 0x1E}, {0xFF, 0x1F}, /* 0xBC-0xBF */ + {0xFF, 0x20}, {0xFF, 0x21}, {0xFF, 0x22}, {0xFF, 0x23}, /* 0xC0-0xC3 */ + {0xFF, 0x24}, {0xFF, 0x25}, {0xFF, 0x26}, {0xFF, 0x27}, /* 0xC4-0xC7 */ + {0xFF, 0x28}, {0xFF, 0x29}, {0xFF, 0x2A}, {0xFF, 0x2B}, /* 0xC8-0xCB */ + {0xFF, 0x2C}, {0xFF, 0x2D}, {0xFF, 0x2E}, {0xFF, 0x2F}, /* 0xCC-0xCF */ + {0xFF, 0x30}, {0xFF, 0x31}, {0xFF, 0x32}, {0xFF, 0x33}, /* 0xD0-0xD3 */ + {0xFF, 0x34}, {0xFF, 0x35}, {0xFF, 0x36}, {0xFF, 0x37}, /* 0xD4-0xD7 */ + {0xFF, 0x38}, {0xFF, 0x39}, {0xFF, 0x3A}, {0xFF, 0x3B}, /* 0xD8-0xDB */ + {0xFF, 0xE6}, {0xFF, 0x3D}, {0xFF, 0x3E}, {0xFF, 0x3F}, /* 0xDC-0xDF */ + {0xFF, 0x40}, {0xFF, 0x41}, {0xFF, 0x42}, {0xFF, 0x43}, /* 0xE0-0xE3 */ + {0xFF, 0x44}, {0xFF, 0x45}, {0xFF, 0x46}, {0xFF, 0x47}, /* 0xE4-0xE7 */ + {0xFF, 0x48}, {0xFF, 0x49}, {0xFF, 0x4A}, {0xFF, 0x4B}, /* 0xE8-0xEB */ + {0xFF, 0x4C}, {0xFF, 0x4D}, {0xFF, 0x4E}, {0xFF, 0x4F}, /* 0xEC-0xEF */ + {0xFF, 0x50}, {0xFF, 0x51}, {0xFF, 0x52}, {0xFF, 0x53}, /* 0xF0-0xF3 */ + {0xFF, 0x54}, {0xFF, 0x55}, {0xFF, 0x56}, {0xFF, 0x57}, /* 0xF4-0xF7 */ + {0xFF, 0x58}, {0xFF, 0x59}, {0xFF, 0x5A}, {0xFF, 0x5B}, /* 0xF8-0xFB */ + {0xFF, 0x5C}, {0xFF, 0x5D}, {0xFF, 0xE3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xC9, 0xDE}, {0xC9, 0xDF}, {0xC9, 0xE1}, /* 0x40-0x43 */ + {0xC9, 0xE3}, {0xC9, 0xE5}, {0xC9, 0xE6}, {0xC9, 0xE8}, /* 0x44-0x47 */ + {0xC9, 0xE9}, {0xC9, 0xEA}, {0xC9, 0xEB}, {0xC9, 0xEE}, /* 0x48-0x4B */ + {0xC9, 0xF2}, {0xC9, 0xF3}, {0xC9, 0xF4}, {0xC9, 0xF5}, /* 0x4C-0x4F */ + {0xC9, 0xF6}, {0xC9, 0xF7}, {0xC9, 0xFA}, {0xC9, 0xFB}, /* 0x50-0x53 */ + {0xC9, 0xFD}, {0xC9, 0xFE}, {0xC9, 0xFF}, {0xCA, 0x01}, /* 0x54-0x57 */ + {0xCA, 0x02}, {0xCA, 0x03}, {0xCA, 0x04}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCA, 0x05}, {0xCA, 0x06}, {0xCA, 0x07}, /* 0x60-0x63 */ + {0xCA, 0x0A}, {0xCA, 0x0E}, {0xCA, 0x0F}, {0xCA, 0x10}, /* 0x64-0x67 */ + {0xCA, 0x11}, {0xCA, 0x12}, {0xCA, 0x13}, {0xCA, 0x15}, /* 0x68-0x6B */ + {0xCA, 0x16}, {0xCA, 0x17}, {0xCA, 0x19}, {0xCA, 0x1A}, /* 0x6C-0x6F */ + {0xCA, 0x1B}, {0xCA, 0x1C}, {0xCA, 0x1D}, {0xCA, 0x1E}, /* 0x70-0x73 */ + {0xCA, 0x1F}, {0xCA, 0x20}, {0xCA, 0x21}, {0xCA, 0x22}, /* 0x74-0x77 */ + {0xCA, 0x23}, {0xCA, 0x24}, {0xCA, 0x25}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCA, 0x26}, {0xCA, 0x27}, {0xCA, 0x28}, /* 0x80-0x83 */ + {0xCA, 0x2A}, {0xCA, 0x2B}, {0xCA, 0x2C}, {0xCA, 0x2D}, /* 0x84-0x87 */ + {0xCA, 0x2E}, {0xCA, 0x2F}, {0xCA, 0x30}, {0xCA, 0x31}, /* 0x88-0x8B */ + {0xCA, 0x32}, {0xCA, 0x33}, {0xCA, 0x34}, {0xCA, 0x35}, /* 0x8C-0x8F */ + {0xCA, 0x36}, {0xCA, 0x37}, {0xCA, 0x38}, {0xCA, 0x39}, /* 0x90-0x93 */ + {0xCA, 0x3A}, {0xCA, 0x3B}, {0xCA, 0x3C}, {0xCA, 0x3D}, /* 0x94-0x97 */ + {0xCA, 0x3E}, {0xCA, 0x3F}, {0xCA, 0x40}, {0xCA, 0x41}, /* 0x98-0x9B */ + {0xCA, 0x42}, {0xCA, 0x43}, {0xCA, 0x44}, {0xCA, 0x45}, /* 0x9C-0x9F */ + {0xCA, 0x46}, {0x31, 0x31}, {0x31, 0x32}, {0x31, 0x33}, /* 0xA0-0xA3 */ + {0x31, 0x34}, {0x31, 0x35}, {0x31, 0x36}, {0x31, 0x37}, /* 0xA4-0xA7 */ + {0x31, 0x38}, {0x31, 0x39}, {0x31, 0x3A}, {0x31, 0x3B}, /* 0xA8-0xAB */ + {0x31, 0x3C}, {0x31, 0x3D}, {0x31, 0x3E}, {0x31, 0x3F}, /* 0xAC-0xAF */ + {0x31, 0x40}, {0x31, 0x41}, {0x31, 0x42}, {0x31, 0x43}, /* 0xB0-0xB3 */ + {0x31, 0x44}, {0x31, 0x45}, {0x31, 0x46}, {0x31, 0x47}, /* 0xB4-0xB7 */ + {0x31, 0x48}, {0x31, 0x49}, {0x31, 0x4A}, {0x31, 0x4B}, /* 0xB8-0xBB */ + {0x31, 0x4C}, {0x31, 0x4D}, {0x31, 0x4E}, {0x31, 0x4F}, /* 0xBC-0xBF */ + {0x31, 0x50}, {0x31, 0x51}, {0x31, 0x52}, {0x31, 0x53}, /* 0xC0-0xC3 */ + {0x31, 0x54}, {0x31, 0x55}, {0x31, 0x56}, {0x31, 0x57}, /* 0xC4-0xC7 */ + {0x31, 0x58}, {0x31, 0x59}, {0x31, 0x5A}, {0x31, 0x5B}, /* 0xC8-0xCB */ + {0x31, 0x5C}, {0x31, 0x5D}, {0x31, 0x5E}, {0x31, 0x5F}, /* 0xCC-0xCF */ + {0x31, 0x60}, {0x31, 0x61}, {0x31, 0x62}, {0x31, 0x63}, /* 0xD0-0xD3 */ + {0x31, 0x64}, {0x31, 0x65}, {0x31, 0x66}, {0x31, 0x67}, /* 0xD4-0xD7 */ + {0x31, 0x68}, {0x31, 0x69}, {0x31, 0x6A}, {0x31, 0x6B}, /* 0xD8-0xDB */ + {0x31, 0x6C}, {0x31, 0x6D}, {0x31, 0x6E}, {0x31, 0x6F}, /* 0xDC-0xDF */ + {0x31, 0x70}, {0x31, 0x71}, {0x31, 0x72}, {0x31, 0x73}, /* 0xE0-0xE3 */ + {0x31, 0x74}, {0x31, 0x75}, {0x31, 0x76}, {0x31, 0x77}, /* 0xE4-0xE7 */ + {0x31, 0x78}, {0x31, 0x79}, {0x31, 0x7A}, {0x31, 0x7B}, /* 0xE8-0xEB */ + {0x31, 0x7C}, {0x31, 0x7D}, {0x31, 0x7E}, {0x31, 0x7F}, /* 0xEC-0xEF */ + {0x31, 0x80}, {0x31, 0x81}, {0x31, 0x82}, {0x31, 0x83}, /* 0xF0-0xF3 */ + {0x31, 0x84}, {0x31, 0x85}, {0x31, 0x86}, {0x31, 0x87}, /* 0xF4-0xF7 */ + {0x31, 0x88}, {0x31, 0x89}, {0x31, 0x8A}, {0x31, 0x8B}, /* 0xF8-0xFB */ + {0x31, 0x8C}, {0x31, 0x8D}, {0x31, 0x8E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCA, 0x47}, {0xCA, 0x48}, {0xCA, 0x49}, /* 0x40-0x43 */ + {0xCA, 0x4A}, {0xCA, 0x4B}, {0xCA, 0x4E}, {0xCA, 0x4F}, /* 0x44-0x47 */ + {0xCA, 0x51}, {0xCA, 0x52}, {0xCA, 0x53}, {0xCA, 0x55}, /* 0x48-0x4B */ + {0xCA, 0x56}, {0xCA, 0x57}, {0xCA, 0x58}, {0xCA, 0x59}, /* 0x4C-0x4F */ + {0xCA, 0x5A}, {0xCA, 0x5B}, {0xCA, 0x5E}, {0xCA, 0x62}, /* 0x50-0x53 */ + {0xCA, 0x63}, {0xCA, 0x64}, {0xCA, 0x65}, {0xCA, 0x66}, /* 0x54-0x57 */ + {0xCA, 0x67}, {0xCA, 0x69}, {0xCA, 0x6A}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCA, 0x6B}, {0xCA, 0x6C}, {0xCA, 0x6D}, /* 0x60-0x63 */ + {0xCA, 0x6E}, {0xCA, 0x6F}, {0xCA, 0x70}, {0xCA, 0x71}, /* 0x64-0x67 */ + {0xCA, 0x72}, {0xCA, 0x73}, {0xCA, 0x74}, {0xCA, 0x75}, /* 0x68-0x6B */ + {0xCA, 0x76}, {0xCA, 0x77}, {0xCA, 0x78}, {0xCA, 0x79}, /* 0x6C-0x6F */ + {0xCA, 0x7A}, {0xCA, 0x7B}, {0xCA, 0x7C}, {0xCA, 0x7E}, /* 0x70-0x73 */ + {0xCA, 0x7F}, {0xCA, 0x80}, {0xCA, 0x81}, {0xCA, 0x82}, /* 0x74-0x77 */ + {0xCA, 0x83}, {0xCA, 0x85}, {0xCA, 0x86}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCA, 0x87}, {0xCA, 0x88}, {0xCA, 0x89}, /* 0x80-0x83 */ + {0xCA, 0x8A}, {0xCA, 0x8B}, {0xCA, 0x8C}, {0xCA, 0x8D}, /* 0x84-0x87 */ + {0xCA, 0x8E}, {0xCA, 0x8F}, {0xCA, 0x90}, {0xCA, 0x91}, /* 0x88-0x8B */ + {0xCA, 0x92}, {0xCA, 0x93}, {0xCA, 0x94}, {0xCA, 0x95}, /* 0x8C-0x8F */ + {0xCA, 0x96}, {0xCA, 0x97}, {0xCA, 0x99}, {0xCA, 0x9A}, /* 0x90-0x93 */ + {0xCA, 0x9B}, {0xCA, 0x9C}, {0xCA, 0x9D}, {0xCA, 0x9E}, /* 0x94-0x97 */ + {0xCA, 0x9F}, {0xCA, 0xA0}, {0xCA, 0xA1}, {0xCA, 0xA2}, /* 0x98-0x9B */ + {0xCA, 0xA3}, {0xCA, 0xA4}, {0xCA, 0xA5}, {0xCA, 0xA6}, /* 0x9C-0x9F */ + {0xCA, 0xA7}, {0x21, 0x70}, {0x21, 0x71}, {0x21, 0x72}, /* 0xA0-0xA3 */ + {0x21, 0x73}, {0x21, 0x74}, {0x21, 0x75}, {0x21, 0x76}, /* 0xA4-0xA7 */ + {0x21, 0x77}, {0x21, 0x78}, {0x21, 0x79}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x21, 0x60}, {0x21, 0x61}, {0x21, 0x62}, {0x21, 0x63}, /* 0xB0-0xB3 */ + {0x21, 0x64}, {0x21, 0x65}, {0x21, 0x66}, {0x21, 0x67}, /* 0xB4-0xB7 */ + {0x21, 0x68}, {0x21, 0x69}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x03, 0x91}, {0x03, 0x92}, {0x03, 0x93}, /* 0xC0-0xC3 */ + {0x03, 0x94}, {0x03, 0x95}, {0x03, 0x96}, {0x03, 0x97}, /* 0xC4-0xC7 */ + {0x03, 0x98}, {0x03, 0x99}, {0x03, 0x9A}, {0x03, 0x9B}, /* 0xC8-0xCB */ + {0x03, 0x9C}, {0x03, 0x9D}, {0x03, 0x9E}, {0x03, 0x9F}, /* 0xCC-0xCF */ + {0x03, 0xA0}, {0x03, 0xA1}, {0x03, 0xA3}, {0x03, 0xA4}, /* 0xD0-0xD3 */ + {0x03, 0xA5}, {0x03, 0xA6}, {0x03, 0xA7}, {0x03, 0xA8}, /* 0xD4-0xD7 */ + {0x03, 0xA9}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x03, 0xB1}, {0x03, 0xB2}, {0x03, 0xB3}, /* 0xE0-0xE3 */ + {0x03, 0xB4}, {0x03, 0xB5}, {0x03, 0xB6}, {0x03, 0xB7}, /* 0xE4-0xE7 */ + {0x03, 0xB8}, {0x03, 0xB9}, {0x03, 0xBA}, {0x03, 0xBB}, /* 0xE8-0xEB */ + {0x03, 0xBC}, {0x03, 0xBD}, {0x03, 0xBE}, {0x03, 0xBF}, /* 0xEC-0xEF */ + {0x03, 0xC0}, {0x03, 0xC1}, {0x03, 0xC3}, {0x03, 0xC4}, /* 0xF0-0xF3 */ + {0x03, 0xC5}, {0x03, 0xC6}, {0x03, 0xC7}, {0x03, 0xC8}, /* 0xF4-0xF7 */ + {0x03, 0xC9}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCA, 0xA8}, {0xCA, 0xA9}, {0xCA, 0xAA}, /* 0x40-0x43 */ + {0xCA, 0xAB}, {0xCA, 0xAC}, {0xCA, 0xAD}, {0xCA, 0xAE}, /* 0x44-0x47 */ + {0xCA, 0xAF}, {0xCA, 0xB0}, {0xCA, 0xB1}, {0xCA, 0xB2}, /* 0x48-0x4B */ + {0xCA, 0xB3}, {0xCA, 0xB4}, {0xCA, 0xB5}, {0xCA, 0xB6}, /* 0x4C-0x4F */ + {0xCA, 0xB7}, {0xCA, 0xB8}, {0xCA, 0xB9}, {0xCA, 0xBA}, /* 0x50-0x53 */ + {0xCA, 0xBB}, {0xCA, 0xBE}, {0xCA, 0xBF}, {0xCA, 0xC1}, /* 0x54-0x57 */ + {0xCA, 0xC2}, {0xCA, 0xC3}, {0xCA, 0xC5}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCA, 0xC6}, {0xCA, 0xC7}, {0xCA, 0xC8}, /* 0x60-0x63 */ + {0xCA, 0xC9}, {0xCA, 0xCA}, {0xCA, 0xCB}, {0xCA, 0xCE}, /* 0x64-0x67 */ + {0xCA, 0xD0}, {0xCA, 0xD2}, {0xCA, 0xD4}, {0xCA, 0xD5}, /* 0x68-0x6B */ + {0xCA, 0xD6}, {0xCA, 0xD7}, {0xCA, 0xDA}, {0xCA, 0xDB}, /* 0x6C-0x6F */ + {0xCA, 0xDC}, {0xCA, 0xDD}, {0xCA, 0xDE}, {0xCA, 0xDF}, /* 0x70-0x73 */ + {0xCA, 0xE1}, {0xCA, 0xE2}, {0xCA, 0xE3}, {0xCA, 0xE4}, /* 0x74-0x77 */ + {0xCA, 0xE5}, {0xCA, 0xE6}, {0xCA, 0xE7}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCA, 0xE8}, {0xCA, 0xE9}, {0xCA, 0xEA}, /* 0x80-0x83 */ + {0xCA, 0xEB}, {0xCA, 0xED}, {0xCA, 0xEE}, {0xCA, 0xEF}, /* 0x84-0x87 */ + {0xCA, 0xF0}, {0xCA, 0xF1}, {0xCA, 0xF2}, {0xCA, 0xF3}, /* 0x88-0x8B */ + {0xCA, 0xF5}, {0xCA, 0xF6}, {0xCA, 0xF7}, {0xCA, 0xF8}, /* 0x8C-0x8F */ + {0xCA, 0xF9}, {0xCA, 0xFA}, {0xCA, 0xFB}, {0xCA, 0xFC}, /* 0x90-0x93 */ + {0xCA, 0xFD}, {0xCA, 0xFE}, {0xCA, 0xFF}, {0xCB, 0x00}, /* 0x94-0x97 */ + {0xCB, 0x01}, {0xCB, 0x02}, {0xCB, 0x03}, {0xCB, 0x04}, /* 0x98-0x9B */ + {0xCB, 0x05}, {0xCB, 0x06}, {0xCB, 0x07}, {0xCB, 0x09}, /* 0x9C-0x9F */ + {0xCB, 0x0A}, {0x25, 0x00}, {0x25, 0x02}, {0x25, 0x0C}, /* 0xA0-0xA3 */ + {0x25, 0x10}, {0x25, 0x18}, {0x25, 0x14}, {0x25, 0x1C}, /* 0xA4-0xA7 */ + {0x25, 0x2C}, {0x25, 0x24}, {0x25, 0x34}, {0x25, 0x3C}, /* 0xA8-0xAB */ + {0x25, 0x01}, {0x25, 0x03}, {0x25, 0x0F}, {0x25, 0x13}, /* 0xAC-0xAF */ + {0x25, 0x1B}, {0x25, 0x17}, {0x25, 0x23}, {0x25, 0x33}, /* 0xB0-0xB3 */ + {0x25, 0x2B}, {0x25, 0x3B}, {0x25, 0x4B}, {0x25, 0x20}, /* 0xB4-0xB7 */ + {0x25, 0x2F}, {0x25, 0x28}, {0x25, 0x37}, {0x25, 0x3F}, /* 0xB8-0xBB */ + {0x25, 0x1D}, {0x25, 0x30}, {0x25, 0x25}, {0x25, 0x38}, /* 0xBC-0xBF */ + {0x25, 0x42}, {0x25, 0x12}, {0x25, 0x11}, {0x25, 0x1A}, /* 0xC0-0xC3 */ + {0x25, 0x19}, {0x25, 0x16}, {0x25, 0x15}, {0x25, 0x0E}, /* 0xC4-0xC7 */ + {0x25, 0x0D}, {0x25, 0x1E}, {0x25, 0x1F}, {0x25, 0x21}, /* 0xC8-0xCB */ + {0x25, 0x22}, {0x25, 0x26}, {0x25, 0x27}, {0x25, 0x29}, /* 0xCC-0xCF */ + {0x25, 0x2A}, {0x25, 0x2D}, {0x25, 0x2E}, {0x25, 0x31}, /* 0xD0-0xD3 */ + {0x25, 0x32}, {0x25, 0x35}, {0x25, 0x36}, {0x25, 0x39}, /* 0xD4-0xD7 */ + {0x25, 0x3A}, {0x25, 0x3D}, {0x25, 0x3E}, {0x25, 0x40}, /* 0xD8-0xDB */ + {0x25, 0x41}, {0x25, 0x43}, {0x25, 0x44}, {0x25, 0x45}, /* 0xDC-0xDF */ + {0x25, 0x46}, {0x25, 0x47}, {0x25, 0x48}, {0x25, 0x49}, /* 0xE0-0xE3 */ + {0x25, 0x4A}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCB, 0x0B}, {0xCB, 0x0C}, {0xCB, 0x0D}, /* 0x40-0x43 */ + {0xCB, 0x0E}, {0xCB, 0x0F}, {0xCB, 0x11}, {0xCB, 0x12}, /* 0x44-0x47 */ + {0xCB, 0x13}, {0xCB, 0x15}, {0xCB, 0x16}, {0xCB, 0x17}, /* 0x48-0x4B */ + {0xCB, 0x19}, {0xCB, 0x1A}, {0xCB, 0x1B}, {0xCB, 0x1C}, /* 0x4C-0x4F */ + {0xCB, 0x1D}, {0xCB, 0x1E}, {0xCB, 0x1F}, {0xCB, 0x22}, /* 0x50-0x53 */ + {0xCB, 0x23}, {0xCB, 0x24}, {0xCB, 0x25}, {0xCB, 0x26}, /* 0x54-0x57 */ + {0xCB, 0x27}, {0xCB, 0x28}, {0xCB, 0x29}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCB, 0x2A}, {0xCB, 0x2B}, {0xCB, 0x2C}, /* 0x60-0x63 */ + {0xCB, 0x2D}, {0xCB, 0x2E}, {0xCB, 0x2F}, {0xCB, 0x30}, /* 0x64-0x67 */ + {0xCB, 0x31}, {0xCB, 0x32}, {0xCB, 0x33}, {0xCB, 0x34}, /* 0x68-0x6B */ + {0xCB, 0x35}, {0xCB, 0x36}, {0xCB, 0x37}, {0xCB, 0x38}, /* 0x6C-0x6F */ + {0xCB, 0x39}, {0xCB, 0x3A}, {0xCB, 0x3B}, {0xCB, 0x3C}, /* 0x70-0x73 */ + {0xCB, 0x3D}, {0xCB, 0x3E}, {0xCB, 0x3F}, {0xCB, 0x40}, /* 0x74-0x77 */ + {0xCB, 0x42}, {0xCB, 0x43}, {0xCB, 0x44}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCB, 0x45}, {0xCB, 0x46}, {0xCB, 0x47}, /* 0x80-0x83 */ + {0xCB, 0x4A}, {0xCB, 0x4B}, {0xCB, 0x4D}, {0xCB, 0x4E}, /* 0x84-0x87 */ + {0xCB, 0x4F}, {0xCB, 0x51}, {0xCB, 0x52}, {0xCB, 0x53}, /* 0x88-0x8B */ + {0xCB, 0x54}, {0xCB, 0x55}, {0xCB, 0x56}, {0xCB, 0x57}, /* 0x8C-0x8F */ + {0xCB, 0x5A}, {0xCB, 0x5B}, {0xCB, 0x5C}, {0xCB, 0x5E}, /* 0x90-0x93 */ + {0xCB, 0x5F}, {0xCB, 0x60}, {0xCB, 0x61}, {0xCB, 0x62}, /* 0x94-0x97 */ + {0xCB, 0x63}, {0xCB, 0x65}, {0xCB, 0x66}, {0xCB, 0x67}, /* 0x98-0x9B */ + {0xCB, 0x68}, {0xCB, 0x69}, {0xCB, 0x6A}, {0xCB, 0x6B}, /* 0x9C-0x9F */ + {0xCB, 0x6C}, {0x33, 0x95}, {0x33, 0x96}, {0x33, 0x97}, /* 0xA0-0xA3 */ + {0x21, 0x13}, {0x33, 0x98}, {0x33, 0xC4}, {0x33, 0xA3}, /* 0xA4-0xA7 */ + {0x33, 0xA4}, {0x33, 0xA5}, {0x33, 0xA6}, {0x33, 0x99}, /* 0xA8-0xAB */ + {0x33, 0x9A}, {0x33, 0x9B}, {0x33, 0x9C}, {0x33, 0x9D}, /* 0xAC-0xAF */ + {0x33, 0x9E}, {0x33, 0x9F}, {0x33, 0xA0}, {0x33, 0xA1}, /* 0xB0-0xB3 */ + {0x33, 0xA2}, {0x33, 0xCA}, {0x33, 0x8D}, {0x33, 0x8E}, /* 0xB4-0xB7 */ + {0x33, 0x8F}, {0x33, 0xCF}, {0x33, 0x88}, {0x33, 0x89}, /* 0xB8-0xBB */ + {0x33, 0xC8}, {0x33, 0xA7}, {0x33, 0xA8}, {0x33, 0xB0}, /* 0xBC-0xBF */ + {0x33, 0xB1}, {0x33, 0xB2}, {0x33, 0xB3}, {0x33, 0xB4}, /* 0xC0-0xC3 */ + {0x33, 0xB5}, {0x33, 0xB6}, {0x33, 0xB7}, {0x33, 0xB8}, /* 0xC4-0xC7 */ + {0x33, 0xB9}, {0x33, 0x80}, {0x33, 0x81}, {0x33, 0x82}, /* 0xC8-0xCB */ + {0x33, 0x83}, {0x33, 0x84}, {0x33, 0xBA}, {0x33, 0xBB}, /* 0xCC-0xCF */ + {0x33, 0xBC}, {0x33, 0xBD}, {0x33, 0xBE}, {0x33, 0xBF}, /* 0xD0-0xD3 */ + {0x33, 0x90}, {0x33, 0x91}, {0x33, 0x92}, {0x33, 0x93}, /* 0xD4-0xD7 */ + {0x33, 0x94}, {0x21, 0x26}, {0x33, 0xC0}, {0x33, 0xC1}, /* 0xD8-0xDB */ + {0x33, 0x8A}, {0x33, 0x8B}, {0x33, 0x8C}, {0x33, 0xD6}, /* 0xDC-0xDF */ + {0x33, 0xC5}, {0x33, 0xAD}, {0x33, 0xAE}, {0x33, 0xAF}, /* 0xE0-0xE3 */ + {0x33, 0xDB}, {0x33, 0xA9}, {0x33, 0xAA}, {0x33, 0xAB}, /* 0xE4-0xE7 */ + {0x33, 0xAC}, {0x33, 0xDD}, {0x33, 0xD0}, {0x33, 0xD3}, /* 0xE8-0xEB */ + {0x33, 0xC3}, {0x33, 0xC9}, {0x33, 0xDC}, {0x33, 0xC6}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCB, 0x6D}, {0xCB, 0x6E}, {0xCB, 0x6F}, /* 0x40-0x43 */ + {0xCB, 0x70}, {0xCB, 0x71}, {0xCB, 0x72}, {0xCB, 0x73}, /* 0x44-0x47 */ + {0xCB, 0x74}, {0xCB, 0x75}, {0xCB, 0x76}, {0xCB, 0x77}, /* 0x48-0x4B */ + {0xCB, 0x7A}, {0xCB, 0x7B}, {0xCB, 0x7C}, {0xCB, 0x7D}, /* 0x4C-0x4F */ + {0xCB, 0x7E}, {0xCB, 0x7F}, {0xCB, 0x80}, {0xCB, 0x81}, /* 0x50-0x53 */ + {0xCB, 0x82}, {0xCB, 0x83}, {0xCB, 0x84}, {0xCB, 0x85}, /* 0x54-0x57 */ + {0xCB, 0x86}, {0xCB, 0x87}, {0xCB, 0x88}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCB, 0x89}, {0xCB, 0x8A}, {0xCB, 0x8B}, /* 0x60-0x63 */ + {0xCB, 0x8C}, {0xCB, 0x8D}, {0xCB, 0x8E}, {0xCB, 0x8F}, /* 0x64-0x67 */ + {0xCB, 0x90}, {0xCB, 0x91}, {0xCB, 0x92}, {0xCB, 0x93}, /* 0x68-0x6B */ + {0xCB, 0x94}, {0xCB, 0x95}, {0xCB, 0x96}, {0xCB, 0x97}, /* 0x6C-0x6F */ + {0xCB, 0x98}, {0xCB, 0x99}, {0xCB, 0x9A}, {0xCB, 0x9B}, /* 0x70-0x73 */ + {0xCB, 0x9D}, {0xCB, 0x9E}, {0xCB, 0x9F}, {0xCB, 0xA0}, /* 0x74-0x77 */ + {0xCB, 0xA1}, {0xCB, 0xA2}, {0xCB, 0xA3}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCB, 0xA4}, {0xCB, 0xA5}, {0xCB, 0xA6}, /* 0x80-0x83 */ + {0xCB, 0xA7}, {0xCB, 0xA8}, {0xCB, 0xA9}, {0xCB, 0xAA}, /* 0x84-0x87 */ + {0xCB, 0xAB}, {0xCB, 0xAC}, {0xCB, 0xAD}, {0xCB, 0xAE}, /* 0x88-0x8B */ + {0xCB, 0xAF}, {0xCB, 0xB0}, {0xCB, 0xB1}, {0xCB, 0xB2}, /* 0x8C-0x8F */ + {0xCB, 0xB3}, {0xCB, 0xB4}, {0xCB, 0xB5}, {0xCB, 0xB6}, /* 0x90-0x93 */ + {0xCB, 0xB7}, {0xCB, 0xB9}, {0xCB, 0xBA}, {0xCB, 0xBB}, /* 0x94-0x97 */ + {0xCB, 0xBC}, {0xCB, 0xBD}, {0xCB, 0xBE}, {0xCB, 0xBF}, /* 0x98-0x9B */ + {0xCB, 0xC0}, {0xCB, 0xC1}, {0xCB, 0xC2}, {0xCB, 0xC3}, /* 0x9C-0x9F */ + {0xCB, 0xC4}, {0x00, 0xC6}, {0x00, 0xD0}, {0x00, 0xAA}, /* 0xA0-0xA3 */ + {0x01, 0x26}, {0x00, 0x3F}, {0x01, 0x32}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x01, 0x3F}, {0x01, 0x41}, {0x00, 0xD8}, {0x01, 0x52}, /* 0xA8-0xAB */ + {0x00, 0xBA}, {0x00, 0xDE}, {0x01, 0x66}, {0x01, 0x4A}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x32, 0x60}, {0x32, 0x61}, {0x32, 0x62}, /* 0xB0-0xB3 */ + {0x32, 0x63}, {0x32, 0x64}, {0x32, 0x65}, {0x32, 0x66}, /* 0xB4-0xB7 */ + {0x32, 0x67}, {0x32, 0x68}, {0x32, 0x69}, {0x32, 0x6A}, /* 0xB8-0xBB */ + {0x32, 0x6B}, {0x32, 0x6C}, {0x32, 0x6D}, {0x32, 0x6E}, /* 0xBC-0xBF */ + {0x32, 0x6F}, {0x32, 0x70}, {0x32, 0x71}, {0x32, 0x72}, /* 0xC0-0xC3 */ + {0x32, 0x73}, {0x32, 0x74}, {0x32, 0x75}, {0x32, 0x76}, /* 0xC4-0xC7 */ + {0x32, 0x77}, {0x32, 0x78}, {0x32, 0x79}, {0x32, 0x7A}, /* 0xC8-0xCB */ + {0x32, 0x7B}, {0x24, 0xD0}, {0x24, 0xD1}, {0x24, 0xD2}, /* 0xCC-0xCF */ + {0x24, 0xD3}, {0x24, 0xD4}, {0x24, 0xD5}, {0x24, 0xD6}, /* 0xD0-0xD3 */ + {0x24, 0xD7}, {0x24, 0xD8}, {0x24, 0xD9}, {0x24, 0xDA}, /* 0xD4-0xD7 */ + {0x24, 0xDB}, {0x24, 0xDC}, {0x24, 0xDD}, {0x24, 0xDE}, /* 0xD8-0xDB */ + {0x24, 0xDF}, {0x24, 0xE0}, {0x24, 0xE1}, {0x24, 0xE2}, /* 0xDC-0xDF */ + {0x24, 0xE3}, {0x24, 0xE4}, {0x24, 0xE5}, {0x24, 0xE6}, /* 0xE0-0xE3 */ + {0x24, 0xE7}, {0x24, 0xE8}, {0x24, 0xE9}, {0x24, 0x60}, /* 0xE4-0xE7 */ + {0x24, 0x61}, {0x24, 0x62}, {0x24, 0x63}, {0x24, 0x64}, /* 0xE8-0xEB */ + {0x24, 0x65}, {0x24, 0x66}, {0x24, 0x67}, {0x24, 0x68}, /* 0xEC-0xEF */ + {0x24, 0x69}, {0x24, 0x6A}, {0x24, 0x6B}, {0x24, 0x6C}, /* 0xF0-0xF3 */ + {0x24, 0x6D}, {0x24, 0x6E}, {0x00, 0xBD}, {0x21, 0x53}, /* 0xF4-0xF7 */ + {0x21, 0x54}, {0x00, 0xBC}, {0x00, 0xBE}, {0x21, 0x5B}, /* 0xF8-0xFB */ + {0x21, 0x5C}, {0x21, 0x5D}, {0x21, 0x5E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCB, 0xC5}, {0xCB, 0xC6}, {0xCB, 0xC7}, /* 0x40-0x43 */ + {0xCB, 0xC8}, {0xCB, 0xC9}, {0xCB, 0xCA}, {0xCB, 0xCB}, /* 0x44-0x47 */ + {0xCB, 0xCC}, {0xCB, 0xCD}, {0xCB, 0xCE}, {0xCB, 0xCF}, /* 0x48-0x4B */ + {0xCB, 0xD0}, {0xCB, 0xD1}, {0xCB, 0xD2}, {0xCB, 0xD3}, /* 0x4C-0x4F */ + {0xCB, 0xD5}, {0xCB, 0xD6}, {0xCB, 0xD7}, {0xCB, 0xD8}, /* 0x50-0x53 */ + {0xCB, 0xD9}, {0xCB, 0xDA}, {0xCB, 0xDB}, {0xCB, 0xDC}, /* 0x54-0x57 */ + {0xCB, 0xDD}, {0xCB, 0xDE}, {0xCB, 0xDF}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCB, 0xE0}, {0xCB, 0xE1}, {0xCB, 0xE2}, /* 0x60-0x63 */ + {0xCB, 0xE3}, {0xCB, 0xE5}, {0xCB, 0xE6}, {0xCB, 0xE8}, /* 0x64-0x67 */ + {0xCB, 0xEA}, {0xCB, 0xEB}, {0xCB, 0xEC}, {0xCB, 0xED}, /* 0x68-0x6B */ + {0xCB, 0xEE}, {0xCB, 0xEF}, {0xCB, 0xF0}, {0xCB, 0xF1}, /* 0x6C-0x6F */ + {0xCB, 0xF2}, {0xCB, 0xF3}, {0xCB, 0xF4}, {0xCB, 0xF5}, /* 0x70-0x73 */ + {0xCB, 0xF6}, {0xCB, 0xF7}, {0xCB, 0xF8}, {0xCB, 0xF9}, /* 0x74-0x77 */ + {0xCB, 0xFA}, {0xCB, 0xFB}, {0xCB, 0xFC}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCB, 0xFD}, {0xCB, 0xFE}, {0xCB, 0xFF}, /* 0x80-0x83 */ + {0xCC, 0x00}, {0xCC, 0x01}, {0xCC, 0x02}, {0xCC, 0x03}, /* 0x84-0x87 */ + {0xCC, 0x04}, {0xCC, 0x05}, {0xCC, 0x06}, {0xCC, 0x07}, /* 0x88-0x8B */ + {0xCC, 0x08}, {0xCC, 0x09}, {0xCC, 0x0A}, {0xCC, 0x0B}, /* 0x8C-0x8F */ + {0xCC, 0x0E}, {0xCC, 0x0F}, {0xCC, 0x11}, {0xCC, 0x12}, /* 0x90-0x93 */ + {0xCC, 0x13}, {0xCC, 0x15}, {0xCC, 0x16}, {0xCC, 0x17}, /* 0x94-0x97 */ + {0xCC, 0x18}, {0xCC, 0x19}, {0xCC, 0x1A}, {0xCC, 0x1B}, /* 0x98-0x9B */ + {0xCC, 0x1E}, {0xCC, 0x1F}, {0xCC, 0x20}, {0xCC, 0x23}, /* 0x9C-0x9F */ + {0xCC, 0x24}, {0x00, 0xE6}, {0x01, 0x11}, {0x00, 0xF0}, /* 0xA0-0xA3 */ + {0x01, 0x27}, {0x01, 0x31}, {0x01, 0x33}, {0x01, 0x38}, /* 0xA4-0xA7 */ + {0x01, 0x40}, {0x01, 0x42}, {0x00, 0xF8}, {0x01, 0x53}, /* 0xA8-0xAB */ + {0x00, 0xDF}, {0x00, 0xFE}, {0x01, 0x67}, {0x01, 0x4B}, /* 0xAC-0xAF */ + {0x01, 0x49}, {0x32, 0x00}, {0x32, 0x01}, {0x32, 0x02}, /* 0xB0-0xB3 */ + {0x32, 0x03}, {0x32, 0x04}, {0x32, 0x05}, {0x32, 0x06}, /* 0xB4-0xB7 */ + {0x32, 0x07}, {0x32, 0x08}, {0x32, 0x09}, {0x32, 0x0A}, /* 0xB8-0xBB */ + {0x32, 0x0B}, {0x32, 0x0C}, {0x32, 0x0D}, {0x32, 0x0E}, /* 0xBC-0xBF */ + {0x32, 0x0F}, {0x32, 0x10}, {0x32, 0x11}, {0x32, 0x12}, /* 0xC0-0xC3 */ + {0x32, 0x13}, {0x32, 0x14}, {0x32, 0x15}, {0x32, 0x16}, /* 0xC4-0xC7 */ + {0x32, 0x17}, {0x32, 0x18}, {0x32, 0x19}, {0x32, 0x1A}, /* 0xC8-0xCB */ + {0x32, 0x1B}, {0x24, 0x9C}, {0x24, 0x9D}, {0x24, 0x9E}, /* 0xCC-0xCF */ + {0x24, 0x9F}, {0x24, 0xA0}, {0x24, 0xA1}, {0x24, 0xA2}, /* 0xD0-0xD3 */ + {0x24, 0xA3}, {0x24, 0xA4}, {0x24, 0xA5}, {0x24, 0xA6}, /* 0xD4-0xD7 */ + {0x24, 0xA7}, {0x24, 0xA8}, {0x24, 0xA9}, {0x24, 0xAA}, /* 0xD8-0xDB */ + {0x24, 0xAB}, {0x24, 0xAC}, {0x24, 0xAD}, {0x24, 0xAE}, /* 0xDC-0xDF */ + {0x24, 0xAF}, {0x24, 0xB0}, {0x24, 0xB1}, {0x24, 0xB2}, /* 0xE0-0xE3 */ + {0x24, 0xB3}, {0x24, 0xB4}, {0x24, 0xB5}, {0x24, 0x74}, /* 0xE4-0xE7 */ + {0x24, 0x75}, {0x24, 0x76}, {0x24, 0x77}, {0x24, 0x78}, /* 0xE8-0xEB */ + {0x24, 0x79}, {0x24, 0x7A}, {0x24, 0x7B}, {0x24, 0x7C}, /* 0xEC-0xEF */ + {0x24, 0x7D}, {0x24, 0x7E}, {0x24, 0x7F}, {0x24, 0x80}, /* 0xF0-0xF3 */ + {0x24, 0x81}, {0x24, 0x82}, {0x00, 0xB9}, {0x00, 0xB2}, /* 0xF4-0xF7 */ + {0x00, 0xB3}, {0x20, 0x74}, {0x20, 0x7F}, {0x20, 0x81}, /* 0xF8-0xFB */ + {0x20, 0x82}, {0x20, 0x83}, {0x20, 0x84}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCC, 0x25}, {0xCC, 0x26}, {0xCC, 0x2A}, /* 0x40-0x43 */ + {0xCC, 0x2B}, {0xCC, 0x2D}, {0xCC, 0x2F}, {0xCC, 0x31}, /* 0x44-0x47 */ + {0xCC, 0x32}, {0xCC, 0x33}, {0xCC, 0x34}, {0xCC, 0x35}, /* 0x48-0x4B */ + {0xCC, 0x36}, {0xCC, 0x37}, {0xCC, 0x3A}, {0xCC, 0x3F}, /* 0x4C-0x4F */ + {0xCC, 0x40}, {0xCC, 0x41}, {0xCC, 0x42}, {0xCC, 0x43}, /* 0x50-0x53 */ + {0xCC, 0x46}, {0xCC, 0x47}, {0xCC, 0x49}, {0xCC, 0x4A}, /* 0x54-0x57 */ + {0xCC, 0x4B}, {0xCC, 0x4D}, {0xCC, 0x4E}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCC, 0x4F}, {0xCC, 0x50}, {0xCC, 0x51}, /* 0x60-0x63 */ + {0xCC, 0x52}, {0xCC, 0x53}, {0xCC, 0x56}, {0xCC, 0x5A}, /* 0x64-0x67 */ + {0xCC, 0x5B}, {0xCC, 0x5C}, {0xCC, 0x5D}, {0xCC, 0x5E}, /* 0x68-0x6B */ + {0xCC, 0x5F}, {0xCC, 0x61}, {0xCC, 0x62}, {0xCC, 0x63}, /* 0x6C-0x6F */ + {0xCC, 0x65}, {0xCC, 0x67}, {0xCC, 0x69}, {0xCC, 0x6A}, /* 0x70-0x73 */ + {0xCC, 0x6B}, {0xCC, 0x6C}, {0xCC, 0x6D}, {0xCC, 0x6E}, /* 0x74-0x77 */ + {0xCC, 0x6F}, {0xCC, 0x71}, {0xCC, 0x72}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCC, 0x73}, {0xCC, 0x74}, {0xCC, 0x76}, /* 0x80-0x83 */ + {0xCC, 0x77}, {0xCC, 0x78}, {0xCC, 0x79}, {0xCC, 0x7A}, /* 0x84-0x87 */ + {0xCC, 0x7B}, {0xCC, 0x7C}, {0xCC, 0x7D}, {0xCC, 0x7E}, /* 0x88-0x8B */ + {0xCC, 0x7F}, {0xCC, 0x80}, {0xCC, 0x81}, {0xCC, 0x82}, /* 0x8C-0x8F */ + {0xCC, 0x83}, {0xCC, 0x84}, {0xCC, 0x85}, {0xCC, 0x86}, /* 0x90-0x93 */ + {0xCC, 0x87}, {0xCC, 0x88}, {0xCC, 0x89}, {0xCC, 0x8A}, /* 0x94-0x97 */ + {0xCC, 0x8B}, {0xCC, 0x8C}, {0xCC, 0x8D}, {0xCC, 0x8E}, /* 0x98-0x9B */ + {0xCC, 0x8F}, {0xCC, 0x90}, {0xCC, 0x91}, {0xCC, 0x92}, /* 0x9C-0x9F */ + {0xCC, 0x93}, {0x30, 0x41}, {0x30, 0x42}, {0x30, 0x43}, /* 0xA0-0xA3 */ + {0x30, 0x44}, {0x30, 0x45}, {0x30, 0x46}, {0x30, 0x47}, /* 0xA4-0xA7 */ + {0x30, 0x48}, {0x30, 0x49}, {0x30, 0x4A}, {0x30, 0x4B}, /* 0xA8-0xAB */ + {0x30, 0x4C}, {0x30, 0x4D}, {0x30, 0x4E}, {0x30, 0x4F}, /* 0xAC-0xAF */ + {0x30, 0x50}, {0x30, 0x51}, {0x30, 0x52}, {0x30, 0x53}, /* 0xB0-0xB3 */ + {0x30, 0x54}, {0x30, 0x55}, {0x30, 0x56}, {0x30, 0x57}, /* 0xB4-0xB7 */ + {0x30, 0x58}, {0x30, 0x59}, {0x30, 0x5A}, {0x30, 0x5B}, /* 0xB8-0xBB */ + {0x30, 0x5C}, {0x30, 0x5D}, {0x30, 0x5E}, {0x30, 0x5F}, /* 0xBC-0xBF */ + {0x30, 0x60}, {0x30, 0x61}, {0x30, 0x62}, {0x30, 0x63}, /* 0xC0-0xC3 */ + {0x30, 0x64}, {0x30, 0x65}, {0x30, 0x66}, {0x30, 0x67}, /* 0xC4-0xC7 */ + {0x30, 0x68}, {0x30, 0x69}, {0x30, 0x6A}, {0x30, 0x6B}, /* 0xC8-0xCB */ + {0x30, 0x6C}, {0x30, 0x6D}, {0x30, 0x6E}, {0x30, 0x6F}, /* 0xCC-0xCF */ + {0x30, 0x70}, {0x30, 0x71}, {0x30, 0x72}, {0x30, 0x73}, /* 0xD0-0xD3 */ + {0x30, 0x74}, {0x30, 0x75}, {0x30, 0x76}, {0x30, 0x77}, /* 0xD4-0xD7 */ + {0x30, 0x78}, {0x30, 0x79}, {0x30, 0x7A}, {0x30, 0x7B}, /* 0xD8-0xDB */ + {0x30, 0x7C}, {0x30, 0x7D}, {0x30, 0x7E}, {0x30, 0x7F}, /* 0xDC-0xDF */ + {0x30, 0x80}, {0x30, 0x81}, {0x30, 0x82}, {0x30, 0x83}, /* 0xE0-0xE3 */ + {0x30, 0x84}, {0x30, 0x85}, {0x30, 0x86}, {0x30, 0x87}, /* 0xE4-0xE7 */ + {0x30, 0x88}, {0x30, 0x89}, {0x30, 0x8A}, {0x30, 0x8B}, /* 0xE8-0xEB */ + {0x30, 0x8C}, {0x30, 0x8D}, {0x30, 0x8E}, {0x30, 0x8F}, /* 0xEC-0xEF */ + {0x30, 0x90}, {0x30, 0x91}, {0x30, 0x92}, {0x30, 0x93}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCC, 0x94}, {0xCC, 0x95}, {0xCC, 0x96}, /* 0x40-0x43 */ + {0xCC, 0x97}, {0xCC, 0x9A}, {0xCC, 0x9B}, {0xCC, 0x9D}, /* 0x44-0x47 */ + {0xCC, 0x9E}, {0xCC, 0x9F}, {0xCC, 0xA1}, {0xCC, 0xA2}, /* 0x48-0x4B */ + {0xCC, 0xA3}, {0xCC, 0xA4}, {0xCC, 0xA5}, {0xCC, 0xA6}, /* 0x4C-0x4F */ + {0xCC, 0xA7}, {0xCC, 0xAA}, {0xCC, 0xAE}, {0xCC, 0xAF}, /* 0x50-0x53 */ + {0xCC, 0xB0}, {0xCC, 0xB1}, {0xCC, 0xB2}, {0xCC, 0xB3}, /* 0x54-0x57 */ + {0xCC, 0xB6}, {0xCC, 0xB7}, {0xCC, 0xB9}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCC, 0xBA}, {0xCC, 0xBB}, {0xCC, 0xBD}, /* 0x60-0x63 */ + {0xCC, 0xBE}, {0xCC, 0xBF}, {0xCC, 0xC0}, {0xCC, 0xC1}, /* 0x64-0x67 */ + {0xCC, 0xC2}, {0xCC, 0xC3}, {0xCC, 0xC6}, {0xCC, 0xC8}, /* 0x68-0x6B */ + {0xCC, 0xCA}, {0xCC, 0xCB}, {0xCC, 0xCC}, {0xCC, 0xCD}, /* 0x6C-0x6F */ + {0xCC, 0xCE}, {0xCC, 0xCF}, {0xCC, 0xD1}, {0xCC, 0xD2}, /* 0x70-0x73 */ + {0xCC, 0xD3}, {0xCC, 0xD5}, {0xCC, 0xD6}, {0xCC, 0xD7}, /* 0x74-0x77 */ + {0xCC, 0xD8}, {0xCC, 0xD9}, {0xCC, 0xDA}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCC, 0xDB}, {0xCC, 0xDC}, {0xCC, 0xDD}, /* 0x80-0x83 */ + {0xCC, 0xDE}, {0xCC, 0xDF}, {0xCC, 0xE0}, {0xCC, 0xE1}, /* 0x84-0x87 */ + {0xCC, 0xE2}, {0xCC, 0xE3}, {0xCC, 0xE5}, {0xCC, 0xE6}, /* 0x88-0x8B */ + {0xCC, 0xE7}, {0xCC, 0xE8}, {0xCC, 0xE9}, {0xCC, 0xEA}, /* 0x8C-0x8F */ + {0xCC, 0xEB}, {0xCC, 0xED}, {0xCC, 0xEE}, {0xCC, 0xEF}, /* 0x90-0x93 */ + {0xCC, 0xF1}, {0xCC, 0xF2}, {0xCC, 0xF3}, {0xCC, 0xF4}, /* 0x94-0x97 */ + {0xCC, 0xF5}, {0xCC, 0xF6}, {0xCC, 0xF7}, {0xCC, 0xF8}, /* 0x98-0x9B */ + {0xCC, 0xF9}, {0xCC, 0xFA}, {0xCC, 0xFB}, {0xCC, 0xFC}, /* 0x9C-0x9F */ + {0xCC, 0xFD}, {0x30, 0xA1}, {0x30, 0xA2}, {0x30, 0xA3}, /* 0xA0-0xA3 */ + {0x30, 0xA4}, {0x30, 0xA5}, {0x30, 0xA6}, {0x30, 0xA7}, /* 0xA4-0xA7 */ + {0x30, 0xA8}, {0x30, 0xA9}, {0x30, 0xAA}, {0x30, 0xAB}, /* 0xA8-0xAB */ + {0x30, 0xAC}, {0x30, 0xAD}, {0x30, 0xAE}, {0x30, 0xAF}, /* 0xAC-0xAF */ + {0x30, 0xB0}, {0x30, 0xB1}, {0x30, 0xB2}, {0x30, 0xB3}, /* 0xB0-0xB3 */ + {0x30, 0xB4}, {0x30, 0xB5}, {0x30, 0xB6}, {0x30, 0xB7}, /* 0xB4-0xB7 */ + {0x30, 0xB8}, {0x30, 0xB9}, {0x30, 0xBA}, {0x30, 0xBB}, /* 0xB8-0xBB */ + {0x30, 0xBC}, {0x30, 0xBD}, {0x30, 0xBE}, {0x30, 0xBF}, /* 0xBC-0xBF */ + {0x30, 0xC0}, {0x30, 0xC1}, {0x30, 0xC2}, {0x30, 0xC3}, /* 0xC0-0xC3 */ + {0x30, 0xC4}, {0x30, 0xC5}, {0x30, 0xC6}, {0x30, 0xC7}, /* 0xC4-0xC7 */ + {0x30, 0xC8}, {0x30, 0xC9}, {0x30, 0xCA}, {0x30, 0xCB}, /* 0xC8-0xCB */ + {0x30, 0xCC}, {0x30, 0xCD}, {0x30, 0xCE}, {0x30, 0xCF}, /* 0xCC-0xCF */ + {0x30, 0xD0}, {0x30, 0xD1}, {0x30, 0xD2}, {0x30, 0xD3}, /* 0xD0-0xD3 */ + {0x30, 0xD4}, {0x30, 0xD5}, {0x30, 0xD6}, {0x30, 0xD7}, /* 0xD4-0xD7 */ + {0x30, 0xD8}, {0x30, 0xD9}, {0x30, 0xDA}, {0x30, 0xDB}, /* 0xD8-0xDB */ + {0x30, 0xDC}, {0x30, 0xDD}, {0x30, 0xDE}, {0x30, 0xDF}, /* 0xDC-0xDF */ + {0x30, 0xE0}, {0x30, 0xE1}, {0x30, 0xE2}, {0x30, 0xE3}, /* 0xE0-0xE3 */ + {0x30, 0xE4}, {0x30, 0xE5}, {0x30, 0xE6}, {0x30, 0xE7}, /* 0xE4-0xE7 */ + {0x30, 0xE8}, {0x30, 0xE9}, {0x30, 0xEA}, {0x30, 0xEB}, /* 0xE8-0xEB */ + {0x30, 0xEC}, {0x30, 0xED}, {0x30, 0xEE}, {0x30, 0xEF}, /* 0xEC-0xEF */ + {0x30, 0xF0}, {0x30, 0xF1}, {0x30, 0xF2}, {0x30, 0xF3}, /* 0xF0-0xF3 */ + {0x30, 0xF4}, {0x30, 0xF5}, {0x30, 0xF6}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCC, 0xFE}, {0xCC, 0xFF}, {0xCD, 0x00}, /* 0x40-0x43 */ + {0xCD, 0x02}, {0xCD, 0x03}, {0xCD, 0x04}, {0xCD, 0x05}, /* 0x44-0x47 */ + {0xCD, 0x06}, {0xCD, 0x07}, {0xCD, 0x0A}, {0xCD, 0x0B}, /* 0x48-0x4B */ + {0xCD, 0x0D}, {0xCD, 0x0E}, {0xCD, 0x0F}, {0xCD, 0x11}, /* 0x4C-0x4F */ + {0xCD, 0x12}, {0xCD, 0x13}, {0xCD, 0x14}, {0xCD, 0x15}, /* 0x50-0x53 */ + {0xCD, 0x16}, {0xCD, 0x17}, {0xCD, 0x1A}, {0xCD, 0x1C}, /* 0x54-0x57 */ + {0xCD, 0x1E}, {0xCD, 0x1F}, {0xCD, 0x20}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCD, 0x21}, {0xCD, 0x22}, {0xCD, 0x23}, /* 0x60-0x63 */ + {0xCD, 0x25}, {0xCD, 0x26}, {0xCD, 0x27}, {0xCD, 0x29}, /* 0x64-0x67 */ + {0xCD, 0x2A}, {0xCD, 0x2B}, {0xCD, 0x2D}, {0xCD, 0x2E}, /* 0x68-0x6B */ + {0xCD, 0x2F}, {0xCD, 0x30}, {0xCD, 0x31}, {0xCD, 0x32}, /* 0x6C-0x6F */ + {0xCD, 0x33}, {0xCD, 0x34}, {0xCD, 0x35}, {0xCD, 0x36}, /* 0x70-0x73 */ + {0xCD, 0x37}, {0xCD, 0x38}, {0xCD, 0x3A}, {0xCD, 0x3B}, /* 0x74-0x77 */ + {0xCD, 0x3C}, {0xCD, 0x3D}, {0xCD, 0x3E}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCD, 0x3F}, {0xCD, 0x40}, {0xCD, 0x41}, /* 0x80-0x83 */ + {0xCD, 0x42}, {0xCD, 0x43}, {0xCD, 0x44}, {0xCD, 0x45}, /* 0x84-0x87 */ + {0xCD, 0x46}, {0xCD, 0x47}, {0xCD, 0x48}, {0xCD, 0x49}, /* 0x88-0x8B */ + {0xCD, 0x4A}, {0xCD, 0x4B}, {0xCD, 0x4C}, {0xCD, 0x4D}, /* 0x8C-0x8F */ + {0xCD, 0x4E}, {0xCD, 0x4F}, {0xCD, 0x50}, {0xCD, 0x51}, /* 0x90-0x93 */ + {0xCD, 0x52}, {0xCD, 0x53}, {0xCD, 0x54}, {0xCD, 0x55}, /* 0x94-0x97 */ + {0xCD, 0x56}, {0xCD, 0x57}, {0xCD, 0x58}, {0xCD, 0x59}, /* 0x98-0x9B */ + {0xCD, 0x5A}, {0xCD, 0x5B}, {0xCD, 0x5D}, {0xCD, 0x5E}, /* 0x9C-0x9F */ + {0xCD, 0x5F}, {0x04, 0x10}, {0x04, 0x11}, {0x04, 0x12}, /* 0xA0-0xA3 */ + {0x04, 0x13}, {0x04, 0x14}, {0x04, 0x15}, {0x04, 0x01}, /* 0xA4-0xA7 */ + {0x04, 0x16}, {0x04, 0x17}, {0x04, 0x18}, {0x04, 0x19}, /* 0xA8-0xAB */ + {0x04, 0x1A}, {0x04, 0x1B}, {0x04, 0x1C}, {0x04, 0x1D}, /* 0xAC-0xAF */ + {0x04, 0x1E}, {0x04, 0x1F}, {0x04, 0x20}, {0x04, 0x21}, /* 0xB0-0xB3 */ + {0x04, 0x22}, {0x04, 0x23}, {0x04, 0x24}, {0x04, 0x25}, /* 0xB4-0xB7 */ + {0x04, 0x26}, {0x04, 0x27}, {0x04, 0x28}, {0x04, 0x29}, /* 0xB8-0xBB */ + {0x04, 0x2A}, {0x04, 0x2B}, {0x04, 0x2C}, {0x04, 0x2D}, /* 0xBC-0xBF */ + {0x04, 0x2E}, {0x04, 0x2F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x04, 0x30}, {0x04, 0x31}, {0x04, 0x32}, /* 0xD0-0xD3 */ + {0x04, 0x33}, {0x04, 0x34}, {0x04, 0x35}, {0x04, 0x51}, /* 0xD4-0xD7 */ + {0x04, 0x36}, {0x04, 0x37}, {0x04, 0x38}, {0x04, 0x39}, /* 0xD8-0xDB */ + {0x04, 0x3A}, {0x04, 0x3B}, {0x04, 0x3C}, {0x04, 0x3D}, /* 0xDC-0xDF */ + {0x04, 0x3E}, {0x04, 0x3F}, {0x04, 0x40}, {0x04, 0x41}, /* 0xE0-0xE3 */ + {0x04, 0x42}, {0x04, 0x43}, {0x04, 0x44}, {0x04, 0x45}, /* 0xE4-0xE7 */ + {0x04, 0x46}, {0x04, 0x47}, {0x04, 0x48}, {0x04, 0x49}, /* 0xE8-0xEB */ + {0x04, 0x4A}, {0x04, 0x4B}, {0x04, 0x4C}, {0x04, 0x4D}, /* 0xEC-0xEF */ + {0x04, 0x4E}, {0x04, 0x4F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCD, 0x61}, {0xCD, 0x62}, {0xCD, 0x63}, /* 0x40-0x43 */ + {0xCD, 0x65}, {0xCD, 0x66}, {0xCD, 0x67}, {0xCD, 0x68}, /* 0x44-0x47 */ + {0xCD, 0x69}, {0xCD, 0x6A}, {0xCD, 0x6B}, {0xCD, 0x6E}, /* 0x48-0x4B */ + {0xCD, 0x70}, {0xCD, 0x72}, {0xCD, 0x73}, {0xCD, 0x74}, /* 0x4C-0x4F */ + {0xCD, 0x75}, {0xCD, 0x76}, {0xCD, 0x77}, {0xCD, 0x79}, /* 0x50-0x53 */ + {0xCD, 0x7A}, {0xCD, 0x7B}, {0xCD, 0x7C}, {0xCD, 0x7D}, /* 0x54-0x57 */ + {0xCD, 0x7E}, {0xCD, 0x7F}, {0xCD, 0x80}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCD, 0x81}, {0xCD, 0x82}, {0xCD, 0x83}, /* 0x60-0x63 */ + {0xCD, 0x84}, {0xCD, 0x85}, {0xCD, 0x86}, {0xCD, 0x87}, /* 0x64-0x67 */ + {0xCD, 0x89}, {0xCD, 0x8A}, {0xCD, 0x8B}, {0xCD, 0x8C}, /* 0x68-0x6B */ + {0xCD, 0x8D}, {0xCD, 0x8E}, {0xCD, 0x8F}, {0xCD, 0x90}, /* 0x6C-0x6F */ + {0xCD, 0x91}, {0xCD, 0x92}, {0xCD, 0x93}, {0xCD, 0x96}, /* 0x70-0x73 */ + {0xCD, 0x97}, {0xCD, 0x99}, {0xCD, 0x9A}, {0xCD, 0x9B}, /* 0x74-0x77 */ + {0xCD, 0x9D}, {0xCD, 0x9E}, {0xCD, 0x9F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCD, 0xA0}, {0xCD, 0xA1}, {0xCD, 0xA2}, /* 0x80-0x83 */ + {0xCD, 0xA3}, {0xCD, 0xA6}, {0xCD, 0xA8}, {0xCD, 0xAA}, /* 0x84-0x87 */ + {0xCD, 0xAB}, {0xCD, 0xAC}, {0xCD, 0xAD}, {0xCD, 0xAE}, /* 0x88-0x8B */ + {0xCD, 0xAF}, {0xCD, 0xB1}, {0xCD, 0xB2}, {0xCD, 0xB3}, /* 0x8C-0x8F */ + {0xCD, 0xB4}, {0xCD, 0xB5}, {0xCD, 0xB6}, {0xCD, 0xB7}, /* 0x90-0x93 */ + {0xCD, 0xB8}, {0xCD, 0xB9}, {0xCD, 0xBA}, {0xCD, 0xBB}, /* 0x94-0x97 */ + {0xCD, 0xBC}, {0xCD, 0xBD}, {0xCD, 0xBE}, {0xCD, 0xBF}, /* 0x98-0x9B */ + {0xCD, 0xC0}, {0xCD, 0xC1}, {0xCD, 0xC2}, {0xCD, 0xC3}, /* 0x9C-0x9F */ + {0xCD, 0xC5}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCD, 0xC6}, {0xCD, 0xC7}, {0xCD, 0xC8}, /* 0x40-0x43 */ + {0xCD, 0xC9}, {0xCD, 0xCA}, {0xCD, 0xCB}, {0xCD, 0xCD}, /* 0x44-0x47 */ + {0xCD, 0xCE}, {0xCD, 0xCF}, {0xCD, 0xD1}, {0xCD, 0xD2}, /* 0x48-0x4B */ + {0xCD, 0xD3}, {0xCD, 0xD4}, {0xCD, 0xD5}, {0xCD, 0xD6}, /* 0x4C-0x4F */ + {0xCD, 0xD7}, {0xCD, 0xD8}, {0xCD, 0xD9}, {0xCD, 0xDA}, /* 0x50-0x53 */ + {0xCD, 0xDB}, {0xCD, 0xDC}, {0xCD, 0xDD}, {0xCD, 0xDE}, /* 0x54-0x57 */ + {0xCD, 0xDF}, {0xCD, 0xE0}, {0xCD, 0xE1}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCD, 0xE2}, {0xCD, 0xE3}, {0xCD, 0xE4}, /* 0x60-0x63 */ + {0xCD, 0xE5}, {0xCD, 0xE6}, {0xCD, 0xE7}, {0xCD, 0xE9}, /* 0x64-0x67 */ + {0xCD, 0xEA}, {0xCD, 0xEB}, {0xCD, 0xED}, {0xCD, 0xEE}, /* 0x68-0x6B */ + {0xCD, 0xEF}, {0xCD, 0xF1}, {0xCD, 0xF2}, {0xCD, 0xF3}, /* 0x6C-0x6F */ + {0xCD, 0xF4}, {0xCD, 0xF5}, {0xCD, 0xF6}, {0xCD, 0xF7}, /* 0x70-0x73 */ + {0xCD, 0xFA}, {0xCD, 0xFC}, {0xCD, 0xFE}, {0xCD, 0xFF}, /* 0x74-0x77 */ + {0xCE, 0x00}, {0xCE, 0x01}, {0xCE, 0x02}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCE, 0x03}, {0xCE, 0x05}, {0xCE, 0x06}, /* 0x80-0x83 */ + {0xCE, 0x07}, {0xCE, 0x09}, {0xCE, 0x0A}, {0xCE, 0x0B}, /* 0x84-0x87 */ + {0xCE, 0x0D}, {0xCE, 0x0E}, {0xCE, 0x0F}, {0xCE, 0x10}, /* 0x88-0x8B */ + {0xCE, 0x11}, {0xCE, 0x12}, {0xCE, 0x13}, {0xCE, 0x15}, /* 0x8C-0x8F */ + {0xCE, 0x16}, {0xCE, 0x17}, {0xCE, 0x18}, {0xCE, 0x1A}, /* 0x90-0x93 */ + {0xCE, 0x1B}, {0xCE, 0x1C}, {0xCE, 0x1D}, {0xCE, 0x1E}, /* 0x94-0x97 */ + {0xCE, 0x1F}, {0xCE, 0x22}, {0xCE, 0x23}, {0xCE, 0x25}, /* 0x98-0x9B */ + {0xCE, 0x26}, {0xCE, 0x27}, {0xCE, 0x29}, {0xCE, 0x2A}, /* 0x9C-0x9F */ + {0xCE, 0x2B}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCE, 0x2C}, {0xCE, 0x2D}, {0xCE, 0x2E}, /* 0x40-0x43 */ + {0xCE, 0x2F}, {0xCE, 0x32}, {0xCE, 0x34}, {0xCE, 0x36}, /* 0x44-0x47 */ + {0xCE, 0x37}, {0xCE, 0x38}, {0xCE, 0x39}, {0xCE, 0x3A}, /* 0x48-0x4B */ + {0xCE, 0x3B}, {0xCE, 0x3C}, {0xCE, 0x3D}, {0xCE, 0x3E}, /* 0x4C-0x4F */ + {0xCE, 0x3F}, {0xCE, 0x40}, {0xCE, 0x41}, {0xCE, 0x42}, /* 0x50-0x53 */ + {0xCE, 0x43}, {0xCE, 0x44}, {0xCE, 0x45}, {0xCE, 0x46}, /* 0x54-0x57 */ + {0xCE, 0x47}, {0xCE, 0x48}, {0xCE, 0x49}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCE, 0x4A}, {0xCE, 0x4B}, {0xCE, 0x4C}, /* 0x60-0x63 */ + {0xCE, 0x4D}, {0xCE, 0x4E}, {0xCE, 0x4F}, {0xCE, 0x50}, /* 0x64-0x67 */ + {0xCE, 0x51}, {0xCE, 0x52}, {0xCE, 0x53}, {0xCE, 0x54}, /* 0x68-0x6B */ + {0xCE, 0x55}, {0xCE, 0x56}, {0xCE, 0x57}, {0xCE, 0x5A}, /* 0x6C-0x6F */ + {0xCE, 0x5B}, {0xCE, 0x5D}, {0xCE, 0x5E}, {0xCE, 0x62}, /* 0x70-0x73 */ + {0xCE, 0x63}, {0xCE, 0x64}, {0xCE, 0x65}, {0xCE, 0x66}, /* 0x74-0x77 */ + {0xCE, 0x67}, {0xCE, 0x6A}, {0xCE, 0x6C}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCE, 0x6E}, {0xCE, 0x6F}, {0xCE, 0x70}, /* 0x80-0x83 */ + {0xCE, 0x71}, {0xCE, 0x72}, {0xCE, 0x73}, {0xCE, 0x76}, /* 0x84-0x87 */ + {0xCE, 0x77}, {0xCE, 0x79}, {0xCE, 0x7A}, {0xCE, 0x7B}, /* 0x88-0x8B */ + {0xCE, 0x7D}, {0xCE, 0x7E}, {0xCE, 0x7F}, {0xCE, 0x80}, /* 0x8C-0x8F */ + {0xCE, 0x81}, {0xCE, 0x82}, {0xCE, 0x83}, {0xCE, 0x86}, /* 0x90-0x93 */ + {0xCE, 0x88}, {0xCE, 0x8A}, {0xCE, 0x8B}, {0xCE, 0x8C}, /* 0x94-0x97 */ + {0xCE, 0x8D}, {0xCE, 0x8E}, {0xCE, 0x8F}, {0xCE, 0x92}, /* 0x98-0x9B */ + {0xCE, 0x93}, {0xCE, 0x95}, {0xCE, 0x96}, {0xCE, 0x97}, /* 0x9C-0x9F */ + {0xCE, 0x99}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCE, 0x9A}, {0xCE, 0x9B}, {0xCE, 0x9C}, /* 0x40-0x43 */ + {0xCE, 0x9D}, {0xCE, 0x9E}, {0xCE, 0x9F}, {0xCE, 0xA2}, /* 0x44-0x47 */ + {0xCE, 0xA6}, {0xCE, 0xA7}, {0xCE, 0xA8}, {0xCE, 0xA9}, /* 0x48-0x4B */ + {0xCE, 0xAA}, {0xCE, 0xAB}, {0xCE, 0xAE}, {0xCE, 0xAF}, /* 0x4C-0x4F */ + {0xCE, 0xB0}, {0xCE, 0xB1}, {0xCE, 0xB2}, {0xCE, 0xB3}, /* 0x50-0x53 */ + {0xCE, 0xB4}, {0xCE, 0xB5}, {0xCE, 0xB6}, {0xCE, 0xB7}, /* 0x54-0x57 */ + {0xCE, 0xB8}, {0xCE, 0xB9}, {0xCE, 0xBA}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCE, 0xBB}, {0xCE, 0xBC}, {0xCE, 0xBD}, /* 0x60-0x63 */ + {0xCE, 0xBE}, {0xCE, 0xBF}, {0xCE, 0xC0}, {0xCE, 0xC2}, /* 0x64-0x67 */ + {0xCE, 0xC3}, {0xCE, 0xC4}, {0xCE, 0xC5}, {0xCE, 0xC6}, /* 0x68-0x6B */ + {0xCE, 0xC7}, {0xCE, 0xC8}, {0xCE, 0xC9}, {0xCE, 0xCA}, /* 0x6C-0x6F */ + {0xCE, 0xCB}, {0xCE, 0xCC}, {0xCE, 0xCD}, {0xCE, 0xCE}, /* 0x70-0x73 */ + {0xCE, 0xCF}, {0xCE, 0xD0}, {0xCE, 0xD1}, {0xCE, 0xD2}, /* 0x74-0x77 */ + {0xCE, 0xD3}, {0xCE, 0xD4}, {0xCE, 0xD5}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCE, 0xD6}, {0xCE, 0xD7}, {0xCE, 0xD8}, /* 0x80-0x83 */ + {0xCE, 0xD9}, {0xCE, 0xDA}, {0xCE, 0xDB}, {0xCE, 0xDC}, /* 0x84-0x87 */ + {0xCE, 0xDD}, {0xCE, 0xDE}, {0xCE, 0xDF}, {0xCE, 0xE0}, /* 0x88-0x8B */ + {0xCE, 0xE1}, {0xCE, 0xE2}, {0xCE, 0xE3}, {0xCE, 0xE6}, /* 0x8C-0x8F */ + {0xCE, 0xE7}, {0xCE, 0xE9}, {0xCE, 0xEA}, {0xCE, 0xED}, /* 0x90-0x93 */ + {0xCE, 0xEE}, {0xCE, 0xEF}, {0xCE, 0xF0}, {0xCE, 0xF1}, /* 0x94-0x97 */ + {0xCE, 0xF2}, {0xCE, 0xF3}, {0xCE, 0xF6}, {0xCE, 0xFA}, /* 0x98-0x9B */ + {0xCE, 0xFB}, {0xCE, 0xFC}, {0xCE, 0xFD}, {0xCE, 0xFE}, /* 0x9C-0x9F */ + {0xCE, 0xFF}, {0xAC, 0x00}, {0xAC, 0x01}, {0xAC, 0x04}, /* 0xA0-0xA3 */ + {0xAC, 0x07}, {0xAC, 0x08}, {0xAC, 0x09}, {0xAC, 0x0A}, /* 0xA4-0xA7 */ + {0xAC, 0x10}, {0xAC, 0x11}, {0xAC, 0x12}, {0xAC, 0x13}, /* 0xA8-0xAB */ + {0xAC, 0x14}, {0xAC, 0x15}, {0xAC, 0x16}, {0xAC, 0x17}, /* 0xAC-0xAF */ + {0xAC, 0x19}, {0xAC, 0x1A}, {0xAC, 0x1B}, {0xAC, 0x1C}, /* 0xB0-0xB3 */ + {0xAC, 0x1D}, {0xAC, 0x20}, {0xAC, 0x24}, {0xAC, 0x2C}, /* 0xB4-0xB7 */ + {0xAC, 0x2D}, {0xAC, 0x2F}, {0xAC, 0x30}, {0xAC, 0x31}, /* 0xB8-0xBB */ + {0xAC, 0x38}, {0xAC, 0x39}, {0xAC, 0x3C}, {0xAC, 0x40}, /* 0xBC-0xBF */ + {0xAC, 0x4B}, {0xAC, 0x4D}, {0xAC, 0x54}, {0xAC, 0x58}, /* 0xC0-0xC3 */ + {0xAC, 0x5C}, {0xAC, 0x70}, {0xAC, 0x71}, {0xAC, 0x74}, /* 0xC4-0xC7 */ + {0xAC, 0x77}, {0xAC, 0x78}, {0xAC, 0x7A}, {0xAC, 0x80}, /* 0xC8-0xCB */ + {0xAC, 0x81}, {0xAC, 0x83}, {0xAC, 0x84}, {0xAC, 0x85}, /* 0xCC-0xCF */ + {0xAC, 0x86}, {0xAC, 0x89}, {0xAC, 0x8A}, {0xAC, 0x8B}, /* 0xD0-0xD3 */ + {0xAC, 0x8C}, {0xAC, 0x90}, {0xAC, 0x94}, {0xAC, 0x9C}, /* 0xD4-0xD7 */ + {0xAC, 0x9D}, {0xAC, 0x9F}, {0xAC, 0xA0}, {0xAC, 0xA1}, /* 0xD8-0xDB */ + {0xAC, 0xA8}, {0xAC, 0xA9}, {0xAC, 0xAA}, {0xAC, 0xAC}, /* 0xDC-0xDF */ + {0xAC, 0xAF}, {0xAC, 0xB0}, {0xAC, 0xB8}, {0xAC, 0xB9}, /* 0xE0-0xE3 */ + {0xAC, 0xBB}, {0xAC, 0xBC}, {0xAC, 0xBD}, {0xAC, 0xC1}, /* 0xE4-0xE7 */ + {0xAC, 0xC4}, {0xAC, 0xC8}, {0xAC, 0xCC}, {0xAC, 0xD5}, /* 0xE8-0xEB */ + {0xAC, 0xD7}, {0xAC, 0xE0}, {0xAC, 0xE1}, {0xAC, 0xE4}, /* 0xEC-0xEF */ + {0xAC, 0xE7}, {0xAC, 0xE8}, {0xAC, 0xEA}, {0xAC, 0xEC}, /* 0xF0-0xF3 */ + {0xAC, 0xEF}, {0xAC, 0xF0}, {0xAC, 0xF1}, {0xAC, 0xF3}, /* 0xF4-0xF7 */ + {0xAC, 0xF5}, {0xAC, 0xF6}, {0xAC, 0xFC}, {0xAC, 0xFD}, /* 0xF8-0xFB */ + {0xAD, 0x00}, {0xAD, 0x04}, {0xAD, 0x06}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCF, 0x02}, {0xCF, 0x03}, {0xCF, 0x05}, /* 0x40-0x43 */ + {0xCF, 0x06}, {0xCF, 0x07}, {0xCF, 0x09}, {0xCF, 0x0A}, /* 0x44-0x47 */ + {0xCF, 0x0B}, {0xCF, 0x0C}, {0xCF, 0x0D}, {0xCF, 0x0E}, /* 0x48-0x4B */ + {0xCF, 0x0F}, {0xCF, 0x12}, {0xCF, 0x14}, {0xCF, 0x16}, /* 0x4C-0x4F */ + {0xCF, 0x17}, {0xCF, 0x18}, {0xCF, 0x19}, {0xCF, 0x1A}, /* 0x50-0x53 */ + {0xCF, 0x1B}, {0xCF, 0x1D}, {0xCF, 0x1E}, {0xCF, 0x1F}, /* 0x54-0x57 */ + {0xCF, 0x21}, {0xCF, 0x22}, {0xCF, 0x23}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCF, 0x25}, {0xCF, 0x26}, {0xCF, 0x27}, /* 0x60-0x63 */ + {0xCF, 0x28}, {0xCF, 0x29}, {0xCF, 0x2A}, {0xCF, 0x2B}, /* 0x64-0x67 */ + {0xCF, 0x2E}, {0xCF, 0x32}, {0xCF, 0x33}, {0xCF, 0x34}, /* 0x68-0x6B */ + {0xCF, 0x35}, {0xCF, 0x36}, {0xCF, 0x37}, {0xCF, 0x39}, /* 0x6C-0x6F */ + {0xCF, 0x3A}, {0xCF, 0x3B}, {0xCF, 0x3C}, {0xCF, 0x3D}, /* 0x70-0x73 */ + {0xCF, 0x3E}, {0xCF, 0x3F}, {0xCF, 0x40}, {0xCF, 0x41}, /* 0x74-0x77 */ + {0xCF, 0x42}, {0xCF, 0x43}, {0xCF, 0x44}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCF, 0x45}, {0xCF, 0x46}, {0xCF, 0x47}, /* 0x80-0x83 */ + {0xCF, 0x48}, {0xCF, 0x49}, {0xCF, 0x4A}, {0xCF, 0x4B}, /* 0x84-0x87 */ + {0xCF, 0x4C}, {0xCF, 0x4D}, {0xCF, 0x4E}, {0xCF, 0x4F}, /* 0x88-0x8B */ + {0xCF, 0x50}, {0xCF, 0x51}, {0xCF, 0x52}, {0xCF, 0x53}, /* 0x8C-0x8F */ + {0xCF, 0x56}, {0xCF, 0x57}, {0xCF, 0x59}, {0xCF, 0x5A}, /* 0x90-0x93 */ + {0xCF, 0x5B}, {0xCF, 0x5D}, {0xCF, 0x5E}, {0xCF, 0x5F}, /* 0x94-0x97 */ + {0xCF, 0x60}, {0xCF, 0x61}, {0xCF, 0x62}, {0xCF, 0x63}, /* 0x98-0x9B */ + {0xCF, 0x66}, {0xCF, 0x68}, {0xCF, 0x6A}, {0xCF, 0x6B}, /* 0x9C-0x9F */ + {0xCF, 0x6C}, {0xAD, 0x0C}, {0xAD, 0x0D}, {0xAD, 0x0F}, /* 0xA0-0xA3 */ + {0xAD, 0x11}, {0xAD, 0x18}, {0xAD, 0x1C}, {0xAD, 0x20}, /* 0xA4-0xA7 */ + {0xAD, 0x29}, {0xAD, 0x2C}, {0xAD, 0x2D}, {0xAD, 0x34}, /* 0xA8-0xAB */ + {0xAD, 0x35}, {0xAD, 0x38}, {0xAD, 0x3C}, {0xAD, 0x44}, /* 0xAC-0xAF */ + {0xAD, 0x45}, {0xAD, 0x47}, {0xAD, 0x49}, {0xAD, 0x50}, /* 0xB0-0xB3 */ + {0xAD, 0x54}, {0xAD, 0x58}, {0xAD, 0x61}, {0xAD, 0x63}, /* 0xB4-0xB7 */ + {0xAD, 0x6C}, {0xAD, 0x6D}, {0xAD, 0x70}, {0xAD, 0x73}, /* 0xB8-0xBB */ + {0xAD, 0x74}, {0xAD, 0x75}, {0xAD, 0x76}, {0xAD, 0x7B}, /* 0xBC-0xBF */ + {0xAD, 0x7C}, {0xAD, 0x7D}, {0xAD, 0x7F}, {0xAD, 0x81}, /* 0xC0-0xC3 */ + {0xAD, 0x82}, {0xAD, 0x88}, {0xAD, 0x89}, {0xAD, 0x8C}, /* 0xC4-0xC7 */ + {0xAD, 0x90}, {0xAD, 0x9C}, {0xAD, 0x9D}, {0xAD, 0xA4}, /* 0xC8-0xCB */ + {0xAD, 0xB7}, {0xAD, 0xC0}, {0xAD, 0xC1}, {0xAD, 0xC4}, /* 0xCC-0xCF */ + {0xAD, 0xC8}, {0xAD, 0xD0}, {0xAD, 0xD1}, {0xAD, 0xD3}, /* 0xD0-0xD3 */ + {0xAD, 0xDC}, {0xAD, 0xE0}, {0xAD, 0xE4}, {0xAD, 0xF8}, /* 0xD4-0xD7 */ + {0xAD, 0xF9}, {0xAD, 0xFC}, {0xAD, 0xFF}, {0xAE, 0x00}, /* 0xD8-0xDB */ + {0xAE, 0x01}, {0xAE, 0x08}, {0xAE, 0x09}, {0xAE, 0x0B}, /* 0xDC-0xDF */ + {0xAE, 0x0D}, {0xAE, 0x14}, {0xAE, 0x30}, {0xAE, 0x31}, /* 0xE0-0xE3 */ + {0xAE, 0x34}, {0xAE, 0x37}, {0xAE, 0x38}, {0xAE, 0x3A}, /* 0xE4-0xE7 */ + {0xAE, 0x40}, {0xAE, 0x41}, {0xAE, 0x43}, {0xAE, 0x45}, /* 0xE8-0xEB */ + {0xAE, 0x46}, {0xAE, 0x4A}, {0xAE, 0x4C}, {0xAE, 0x4D}, /* 0xEC-0xEF */ + {0xAE, 0x4E}, {0xAE, 0x50}, {0xAE, 0x54}, {0xAE, 0x56}, /* 0xF0-0xF3 */ + {0xAE, 0x5C}, {0xAE, 0x5D}, {0xAE, 0x5F}, {0xAE, 0x60}, /* 0xF4-0xF7 */ + {0xAE, 0x61}, {0xAE, 0x65}, {0xAE, 0x68}, {0xAE, 0x69}, /* 0xF8-0xFB */ + {0xAE, 0x6C}, {0xAE, 0x70}, {0xAE, 0x78}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCF, 0x6D}, {0xCF, 0x6E}, {0xCF, 0x6F}, /* 0x40-0x43 */ + {0xCF, 0x72}, {0xCF, 0x73}, {0xCF, 0x75}, {0xCF, 0x76}, /* 0x44-0x47 */ + {0xCF, 0x77}, {0xCF, 0x79}, {0xCF, 0x7A}, {0xCF, 0x7B}, /* 0x48-0x4B */ + {0xCF, 0x7C}, {0xCF, 0x7D}, {0xCF, 0x7E}, {0xCF, 0x7F}, /* 0x4C-0x4F */ + {0xCF, 0x81}, {0xCF, 0x82}, {0xCF, 0x83}, {0xCF, 0x84}, /* 0x50-0x53 */ + {0xCF, 0x86}, {0xCF, 0x87}, {0xCF, 0x88}, {0xCF, 0x89}, /* 0x54-0x57 */ + {0xCF, 0x8A}, {0xCF, 0x8B}, {0xCF, 0x8D}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCF, 0x8E}, {0xCF, 0x8F}, {0xCF, 0x90}, /* 0x60-0x63 */ + {0xCF, 0x91}, {0xCF, 0x92}, {0xCF, 0x93}, {0xCF, 0x94}, /* 0x64-0x67 */ + {0xCF, 0x95}, {0xCF, 0x96}, {0xCF, 0x97}, {0xCF, 0x98}, /* 0x68-0x6B */ + {0xCF, 0x99}, {0xCF, 0x9A}, {0xCF, 0x9B}, {0xCF, 0x9C}, /* 0x6C-0x6F */ + {0xCF, 0x9D}, {0xCF, 0x9E}, {0xCF, 0x9F}, {0xCF, 0xA0}, /* 0x70-0x73 */ + {0xCF, 0xA2}, {0xCF, 0xA3}, {0xCF, 0xA4}, {0xCF, 0xA5}, /* 0x74-0x77 */ + {0xCF, 0xA6}, {0xCF, 0xA7}, {0xCF, 0xA9}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xCF, 0xAA}, {0xCF, 0xAB}, {0xCF, 0xAC}, /* 0x80-0x83 */ + {0xCF, 0xAD}, {0xCF, 0xAE}, {0xCF, 0xAF}, {0xCF, 0xB1}, /* 0x84-0x87 */ + {0xCF, 0xB2}, {0xCF, 0xB3}, {0xCF, 0xB4}, {0xCF, 0xB5}, /* 0x88-0x8B */ + {0xCF, 0xB6}, {0xCF, 0xB7}, {0xCF, 0xB8}, {0xCF, 0xB9}, /* 0x8C-0x8F */ + {0xCF, 0xBA}, {0xCF, 0xBB}, {0xCF, 0xBC}, {0xCF, 0xBD}, /* 0x90-0x93 */ + {0xCF, 0xBE}, {0xCF, 0xBF}, {0xCF, 0xC0}, {0xCF, 0xC1}, /* 0x94-0x97 */ + {0xCF, 0xC2}, {0xCF, 0xC3}, {0xCF, 0xC5}, {0xCF, 0xC6}, /* 0x98-0x9B */ + {0xCF, 0xC7}, {0xCF, 0xC8}, {0xCF, 0xC9}, {0xCF, 0xCA}, /* 0x9C-0x9F */ + {0xCF, 0xCB}, {0xAE, 0x79}, {0xAE, 0x7B}, {0xAE, 0x7C}, /* 0xA0-0xA3 */ + {0xAE, 0x7D}, {0xAE, 0x84}, {0xAE, 0x85}, {0xAE, 0x8C}, /* 0xA4-0xA7 */ + {0xAE, 0xBC}, {0xAE, 0xBD}, {0xAE, 0xBE}, {0xAE, 0xC0}, /* 0xA8-0xAB */ + {0xAE, 0xC4}, {0xAE, 0xCC}, {0xAE, 0xCD}, {0xAE, 0xCF}, /* 0xAC-0xAF */ + {0xAE, 0xD0}, {0xAE, 0xD1}, {0xAE, 0xD8}, {0xAE, 0xD9}, /* 0xB0-0xB3 */ + {0xAE, 0xDC}, {0xAE, 0xE8}, {0xAE, 0xEB}, {0xAE, 0xED}, /* 0xB4-0xB7 */ + {0xAE, 0xF4}, {0xAE, 0xF8}, {0xAE, 0xFC}, {0xAF, 0x07}, /* 0xB8-0xBB */ + {0xAF, 0x08}, {0xAF, 0x0D}, {0xAF, 0x10}, {0xAF, 0x2C}, /* 0xBC-0xBF */ + {0xAF, 0x2D}, {0xAF, 0x30}, {0xAF, 0x32}, {0xAF, 0x34}, /* 0xC0-0xC3 */ + {0xAF, 0x3C}, {0xAF, 0x3D}, {0xAF, 0x3F}, {0xAF, 0x41}, /* 0xC4-0xC7 */ + {0xAF, 0x42}, {0xAF, 0x43}, {0xAF, 0x48}, {0xAF, 0x49}, /* 0xC8-0xCB */ + {0xAF, 0x50}, {0xAF, 0x5C}, {0xAF, 0x5D}, {0xAF, 0x64}, /* 0xCC-0xCF */ + {0xAF, 0x65}, {0xAF, 0x79}, {0xAF, 0x80}, {0xAF, 0x84}, /* 0xD0-0xD3 */ + {0xAF, 0x88}, {0xAF, 0x90}, {0xAF, 0x91}, {0xAF, 0x95}, /* 0xD4-0xD7 */ + {0xAF, 0x9C}, {0xAF, 0xB8}, {0xAF, 0xB9}, {0xAF, 0xBC}, /* 0xD8-0xDB */ + {0xAF, 0xC0}, {0xAF, 0xC7}, {0xAF, 0xC8}, {0xAF, 0xC9}, /* 0xDC-0xDF */ + {0xAF, 0xCB}, {0xAF, 0xCD}, {0xAF, 0xCE}, {0xAF, 0xD4}, /* 0xE0-0xE3 */ + {0xAF, 0xDC}, {0xAF, 0xE8}, {0xAF, 0xE9}, {0xAF, 0xF0}, /* 0xE4-0xE7 */ + {0xAF, 0xF1}, {0xAF, 0xF4}, {0xAF, 0xF8}, {0xB0, 0x00}, /* 0xE8-0xEB */ + {0xB0, 0x01}, {0xB0, 0x04}, {0xB0, 0x0C}, {0xB0, 0x10}, /* 0xEC-0xEF */ + {0xB0, 0x14}, {0xB0, 0x1C}, {0xB0, 0x1D}, {0xB0, 0x28}, /* 0xF0-0xF3 */ + {0xB0, 0x44}, {0xB0, 0x45}, {0xB0, 0x48}, {0xB0, 0x4A}, /* 0xF4-0xF7 */ + {0xB0, 0x4C}, {0xB0, 0x4E}, {0xB0, 0x53}, {0xB0, 0x54}, /* 0xF8-0xFB */ + {0xB0, 0x55}, {0xB0, 0x57}, {0xB0, 0x59}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xCF, 0xCC}, {0xCF, 0xCD}, {0xCF, 0xCE}, /* 0x40-0x43 */ + {0xCF, 0xCF}, {0xCF, 0xD0}, {0xCF, 0xD1}, {0xCF, 0xD2}, /* 0x44-0x47 */ + {0xCF, 0xD3}, {0xCF, 0xD4}, {0xCF, 0xD5}, {0xCF, 0xD6}, /* 0x48-0x4B */ + {0xCF, 0xD7}, {0xCF, 0xD8}, {0xCF, 0xD9}, {0xCF, 0xDA}, /* 0x4C-0x4F */ + {0xCF, 0xDB}, {0xCF, 0xDC}, {0xCF, 0xDD}, {0xCF, 0xDE}, /* 0x50-0x53 */ + {0xCF, 0xDF}, {0xCF, 0xE2}, {0xCF, 0xE3}, {0xCF, 0xE5}, /* 0x54-0x57 */ + {0xCF, 0xE6}, {0xCF, 0xE7}, {0xCF, 0xE9}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xCF, 0xEA}, {0xCF, 0xEB}, {0xCF, 0xEC}, /* 0x60-0x63 */ + {0xCF, 0xED}, {0xCF, 0xEE}, {0xCF, 0xEF}, {0xCF, 0xF2}, /* 0x64-0x67 */ + {0xCF, 0xF4}, {0xCF, 0xF6}, {0xCF, 0xF7}, {0xCF, 0xF8}, /* 0x68-0x6B */ + {0xCF, 0xF9}, {0xCF, 0xFA}, {0xCF, 0xFB}, {0xCF, 0xFD}, /* 0x6C-0x6F */ + {0xCF, 0xFE}, {0xCF, 0xFF}, {0xD0, 0x01}, {0xD0, 0x02}, /* 0x70-0x73 */ + {0xD0, 0x03}, {0xD0, 0x05}, {0xD0, 0x06}, {0xD0, 0x07}, /* 0x74-0x77 */ + {0xD0, 0x08}, {0xD0, 0x09}, {0xD0, 0x0A}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD0, 0x0B}, {0xD0, 0x0C}, {0xD0, 0x0D}, /* 0x80-0x83 */ + {0xD0, 0x0E}, {0xD0, 0x0F}, {0xD0, 0x10}, {0xD0, 0x12}, /* 0x84-0x87 */ + {0xD0, 0x13}, {0xD0, 0x14}, {0xD0, 0x15}, {0xD0, 0x16}, /* 0x88-0x8B */ + {0xD0, 0x17}, {0xD0, 0x19}, {0xD0, 0x1A}, {0xD0, 0x1B}, /* 0x8C-0x8F */ + {0xD0, 0x1C}, {0xD0, 0x1D}, {0xD0, 0x1E}, {0xD0, 0x1F}, /* 0x90-0x93 */ + {0xD0, 0x20}, {0xD0, 0x21}, {0xD0, 0x22}, {0xD0, 0x23}, /* 0x94-0x97 */ + {0xD0, 0x24}, {0xD0, 0x25}, {0xD0, 0x26}, {0xD0, 0x27}, /* 0x98-0x9B */ + {0xD0, 0x28}, {0xD0, 0x29}, {0xD0, 0x2A}, {0xD0, 0x2B}, /* 0x9C-0x9F */ + {0xD0, 0x2C}, {0xB0, 0x5D}, {0xB0, 0x7C}, {0xB0, 0x7D}, /* 0xA0-0xA3 */ + {0xB0, 0x80}, {0xB0, 0x84}, {0xB0, 0x8C}, {0xB0, 0x8D}, /* 0xA4-0xA7 */ + {0xB0, 0x8F}, {0xB0, 0x91}, {0xB0, 0x98}, {0xB0, 0x99}, /* 0xA8-0xAB */ + {0xB0, 0x9A}, {0xB0, 0x9C}, {0xB0, 0x9F}, {0xB0, 0xA0}, /* 0xAC-0xAF */ + {0xB0, 0xA1}, {0xB0, 0xA2}, {0xB0, 0xA8}, {0xB0, 0xA9}, /* 0xB0-0xB3 */ + {0xB0, 0xAB}, {0xB0, 0xAC}, {0xB0, 0xAD}, {0xB0, 0xAE}, /* 0xB4-0xB7 */ + {0xB0, 0xAF}, {0xB0, 0xB1}, {0xB0, 0xB3}, {0xB0, 0xB4}, /* 0xB8-0xBB */ + {0xB0, 0xB5}, {0xB0, 0xB8}, {0xB0, 0xBC}, {0xB0, 0xC4}, /* 0xBC-0xBF */ + {0xB0, 0xC5}, {0xB0, 0xC7}, {0xB0, 0xC8}, {0xB0, 0xC9}, /* 0xC0-0xC3 */ + {0xB0, 0xD0}, {0xB0, 0xD1}, {0xB0, 0xD4}, {0xB0, 0xD8}, /* 0xC4-0xC7 */ + {0xB0, 0xE0}, {0xB0, 0xE5}, {0xB1, 0x08}, {0xB1, 0x09}, /* 0xC8-0xCB */ + {0xB1, 0x0B}, {0xB1, 0x0C}, {0xB1, 0x10}, {0xB1, 0x12}, /* 0xCC-0xCF */ + {0xB1, 0x13}, {0xB1, 0x18}, {0xB1, 0x19}, {0xB1, 0x1B}, /* 0xD0-0xD3 */ + {0xB1, 0x1C}, {0xB1, 0x1D}, {0xB1, 0x23}, {0xB1, 0x24}, /* 0xD4-0xD7 */ + {0xB1, 0x25}, {0xB1, 0x28}, {0xB1, 0x2C}, {0xB1, 0x34}, /* 0xD8-0xDB */ + {0xB1, 0x35}, {0xB1, 0x37}, {0xB1, 0x38}, {0xB1, 0x39}, /* 0xDC-0xDF */ + {0xB1, 0x40}, {0xB1, 0x41}, {0xB1, 0x44}, {0xB1, 0x48}, /* 0xE0-0xE3 */ + {0xB1, 0x50}, {0xB1, 0x51}, {0xB1, 0x54}, {0xB1, 0x55}, /* 0xE4-0xE7 */ + {0xB1, 0x58}, {0xB1, 0x5C}, {0xB1, 0x60}, {0xB1, 0x78}, /* 0xE8-0xEB */ + {0xB1, 0x79}, {0xB1, 0x7C}, {0xB1, 0x80}, {0xB1, 0x82}, /* 0xEC-0xEF */ + {0xB1, 0x88}, {0xB1, 0x89}, {0xB1, 0x8B}, {0xB1, 0x8D}, /* 0xF0-0xF3 */ + {0xB1, 0x92}, {0xB1, 0x93}, {0xB1, 0x94}, {0xB1, 0x98}, /* 0xF4-0xF7 */ + {0xB1, 0x9C}, {0xB1, 0xA8}, {0xB1, 0xCC}, {0xB1, 0xD0}, /* 0xF8-0xFB */ + {0xB1, 0xD4}, {0xB1, 0xDC}, {0xB1, 0xDD}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD0, 0x2E}, {0xD0, 0x2F}, {0xD0, 0x30}, /* 0x40-0x43 */ + {0xD0, 0x31}, {0xD0, 0x32}, {0xD0, 0x33}, {0xD0, 0x36}, /* 0x44-0x47 */ + {0xD0, 0x37}, {0xD0, 0x39}, {0xD0, 0x3A}, {0xD0, 0x3B}, /* 0x48-0x4B */ + {0xD0, 0x3D}, {0xD0, 0x3E}, {0xD0, 0x3F}, {0xD0, 0x40}, /* 0x4C-0x4F */ + {0xD0, 0x41}, {0xD0, 0x42}, {0xD0, 0x43}, {0xD0, 0x46}, /* 0x50-0x53 */ + {0xD0, 0x48}, {0xD0, 0x4A}, {0xD0, 0x4B}, {0xD0, 0x4C}, /* 0x54-0x57 */ + {0xD0, 0x4D}, {0xD0, 0x4E}, {0xD0, 0x4F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD0, 0x51}, {0xD0, 0x52}, {0xD0, 0x53}, /* 0x60-0x63 */ + {0xD0, 0x55}, {0xD0, 0x56}, {0xD0, 0x57}, {0xD0, 0x59}, /* 0x64-0x67 */ + {0xD0, 0x5A}, {0xD0, 0x5B}, {0xD0, 0x5C}, {0xD0, 0x5D}, /* 0x68-0x6B */ + {0xD0, 0x5E}, {0xD0, 0x5F}, {0xD0, 0x61}, {0xD0, 0x62}, /* 0x6C-0x6F */ + {0xD0, 0x63}, {0xD0, 0x64}, {0xD0, 0x65}, {0xD0, 0x66}, /* 0x70-0x73 */ + {0xD0, 0x67}, {0xD0, 0x68}, {0xD0, 0x69}, {0xD0, 0x6A}, /* 0x74-0x77 */ + {0xD0, 0x6B}, {0xD0, 0x6E}, {0xD0, 0x6F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD0, 0x71}, {0xD0, 0x72}, {0xD0, 0x73}, /* 0x80-0x83 */ + {0xD0, 0x75}, {0xD0, 0x76}, {0xD0, 0x77}, {0xD0, 0x78}, /* 0x84-0x87 */ + {0xD0, 0x79}, {0xD0, 0x7A}, {0xD0, 0x7B}, {0xD0, 0x7E}, /* 0x88-0x8B */ + {0xD0, 0x7F}, {0xD0, 0x80}, {0xD0, 0x82}, {0xD0, 0x83}, /* 0x8C-0x8F */ + {0xD0, 0x84}, {0xD0, 0x85}, {0xD0, 0x86}, {0xD0, 0x87}, /* 0x90-0x93 */ + {0xD0, 0x88}, {0xD0, 0x89}, {0xD0, 0x8A}, {0xD0, 0x8B}, /* 0x94-0x97 */ + {0xD0, 0x8C}, {0xD0, 0x8D}, {0xD0, 0x8E}, {0xD0, 0x8F}, /* 0x98-0x9B */ + {0xD0, 0x90}, {0xD0, 0x91}, {0xD0, 0x92}, {0xD0, 0x93}, /* 0x9C-0x9F */ + {0xD0, 0x94}, {0xB1, 0xDF}, {0xB1, 0xE8}, {0xB1, 0xE9}, /* 0xA0-0xA3 */ + {0xB1, 0xEC}, {0xB1, 0xF0}, {0xB1, 0xF9}, {0xB1, 0xFB}, /* 0xA4-0xA7 */ + {0xB1, 0xFD}, {0xB2, 0x04}, {0xB2, 0x05}, {0xB2, 0x08}, /* 0xA8-0xAB */ + {0xB2, 0x0B}, {0xB2, 0x0C}, {0xB2, 0x14}, {0xB2, 0x15}, /* 0xAC-0xAF */ + {0xB2, 0x17}, {0xB2, 0x19}, {0xB2, 0x20}, {0xB2, 0x34}, /* 0xB0-0xB3 */ + {0xB2, 0x3C}, {0xB2, 0x58}, {0xB2, 0x5C}, {0xB2, 0x60}, /* 0xB4-0xB7 */ + {0xB2, 0x68}, {0xB2, 0x69}, {0xB2, 0x74}, {0xB2, 0x75}, /* 0xB8-0xBB */ + {0xB2, 0x7C}, {0xB2, 0x84}, {0xB2, 0x85}, {0xB2, 0x89}, /* 0xBC-0xBF */ + {0xB2, 0x90}, {0xB2, 0x91}, {0xB2, 0x94}, {0xB2, 0x98}, /* 0xC0-0xC3 */ + {0xB2, 0x99}, {0xB2, 0x9A}, {0xB2, 0xA0}, {0xB2, 0xA1}, /* 0xC4-0xC7 */ + {0xB2, 0xA3}, {0xB2, 0xA5}, {0xB2, 0xA6}, {0xB2, 0xAA}, /* 0xC8-0xCB */ + {0xB2, 0xAC}, {0xB2, 0xB0}, {0xB2, 0xB4}, {0xB2, 0xC8}, /* 0xCC-0xCF */ + {0xB2, 0xC9}, {0xB2, 0xCC}, {0xB2, 0xD0}, {0xB2, 0xD2}, /* 0xD0-0xD3 */ + {0xB2, 0xD8}, {0xB2, 0xD9}, {0xB2, 0xDB}, {0xB2, 0xDD}, /* 0xD4-0xD7 */ + {0xB2, 0xE2}, {0xB2, 0xE4}, {0xB2, 0xE5}, {0xB2, 0xE6}, /* 0xD8-0xDB */ + {0xB2, 0xE8}, {0xB2, 0xEB}, {0xB2, 0xEC}, {0xB2, 0xED}, /* 0xDC-0xDF */ + {0xB2, 0xEE}, {0xB2, 0xEF}, {0xB2, 0xF3}, {0xB2, 0xF4}, /* 0xE0-0xE3 */ + {0xB2, 0xF5}, {0xB2, 0xF7}, {0xB2, 0xF8}, {0xB2, 0xF9}, /* 0xE4-0xE7 */ + {0xB2, 0xFA}, {0xB2, 0xFB}, {0xB2, 0xFF}, {0xB3, 0x00}, /* 0xE8-0xEB */ + {0xB3, 0x01}, {0xB3, 0x04}, {0xB3, 0x08}, {0xB3, 0x10}, /* 0xEC-0xEF */ + {0xB3, 0x11}, {0xB3, 0x13}, {0xB3, 0x14}, {0xB3, 0x15}, /* 0xF0-0xF3 */ + {0xB3, 0x1C}, {0xB3, 0x54}, {0xB3, 0x55}, {0xB3, 0x56}, /* 0xF4-0xF7 */ + {0xB3, 0x58}, {0xB3, 0x5B}, {0xB3, 0x5C}, {0xB3, 0x5E}, /* 0xF8-0xFB */ + {0xB3, 0x5F}, {0xB3, 0x64}, {0xB3, 0x65}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD0, 0x95}, {0xD0, 0x96}, {0xD0, 0x97}, /* 0x40-0x43 */ + {0xD0, 0x98}, {0xD0, 0x99}, {0xD0, 0x9A}, {0xD0, 0x9B}, /* 0x44-0x47 */ + {0xD0, 0x9C}, {0xD0, 0x9D}, {0xD0, 0x9E}, {0xD0, 0x9F}, /* 0x48-0x4B */ + {0xD0, 0xA0}, {0xD0, 0xA1}, {0xD0, 0xA2}, {0xD0, 0xA3}, /* 0x4C-0x4F */ + {0xD0, 0xA6}, {0xD0, 0xA7}, {0xD0, 0xA9}, {0xD0, 0xAA}, /* 0x50-0x53 */ + {0xD0, 0xAB}, {0xD0, 0xAD}, {0xD0, 0xAE}, {0xD0, 0xAF}, /* 0x54-0x57 */ + {0xD0, 0xB0}, {0xD0, 0xB1}, {0xD0, 0xB2}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD0, 0xB3}, {0xD0, 0xB6}, {0xD0, 0xB8}, /* 0x60-0x63 */ + {0xD0, 0xBA}, {0xD0, 0xBB}, {0xD0, 0xBC}, {0xD0, 0xBD}, /* 0x64-0x67 */ + {0xD0, 0xBE}, {0xD0, 0xBF}, {0xD0, 0xC2}, {0xD0, 0xC3}, /* 0x68-0x6B */ + {0xD0, 0xC5}, {0xD0, 0xC6}, {0xD0, 0xC7}, {0xD0, 0xCA}, /* 0x6C-0x6F */ + {0xD0, 0xCB}, {0xD0, 0xCC}, {0xD0, 0xCD}, {0xD0, 0xCE}, /* 0x70-0x73 */ + {0xD0, 0xCF}, {0xD0, 0xD2}, {0xD0, 0xD6}, {0xD0, 0xD7}, /* 0x74-0x77 */ + {0xD0, 0xD8}, {0xD0, 0xD9}, {0xD0, 0xDA}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD0, 0xDB}, {0xD0, 0xDE}, {0xD0, 0xDF}, /* 0x80-0x83 */ + {0xD0, 0xE1}, {0xD0, 0xE2}, {0xD0, 0xE3}, {0xD0, 0xE5}, /* 0x84-0x87 */ + {0xD0, 0xE6}, {0xD0, 0xE7}, {0xD0, 0xE8}, {0xD0, 0xE9}, /* 0x88-0x8B */ + {0xD0, 0xEA}, {0xD0, 0xEB}, {0xD0, 0xEE}, {0xD0, 0xF2}, /* 0x8C-0x8F */ + {0xD0, 0xF3}, {0xD0, 0xF4}, {0xD0, 0xF5}, {0xD0, 0xF6}, /* 0x90-0x93 */ + {0xD0, 0xF7}, {0xD0, 0xF9}, {0xD0, 0xFA}, {0xD0, 0xFB}, /* 0x94-0x97 */ + {0xD0, 0xFC}, {0xD0, 0xFD}, {0xD0, 0xFE}, {0xD0, 0xFF}, /* 0x98-0x9B */ + {0xD1, 0x00}, {0xD1, 0x01}, {0xD1, 0x02}, {0xD1, 0x03}, /* 0x9C-0x9F */ + {0xD1, 0x04}, {0xB3, 0x67}, {0xB3, 0x69}, {0xB3, 0x6B}, /* 0xA0-0xA3 */ + {0xB3, 0x6E}, {0xB3, 0x70}, {0xB3, 0x71}, {0xB3, 0x74}, /* 0xA4-0xA7 */ + {0xB3, 0x78}, {0xB3, 0x80}, {0xB3, 0x81}, {0xB3, 0x83}, /* 0xA8-0xAB */ + {0xB3, 0x84}, {0xB3, 0x85}, {0xB3, 0x8C}, {0xB3, 0x90}, /* 0xAC-0xAF */ + {0xB3, 0x94}, {0xB3, 0xA0}, {0xB3, 0xA1}, {0xB3, 0xA8}, /* 0xB0-0xB3 */ + {0xB3, 0xAC}, {0xB3, 0xC4}, {0xB3, 0xC5}, {0xB3, 0xC8}, /* 0xB4-0xB7 */ + {0xB3, 0xCB}, {0xB3, 0xCC}, {0xB3, 0xCE}, {0xB3, 0xD0}, /* 0xB8-0xBB */ + {0xB3, 0xD4}, {0xB3, 0xD5}, {0xB3, 0xD7}, {0xB3, 0xD9}, /* 0xBC-0xBF */ + {0xB3, 0xDB}, {0xB3, 0xDD}, {0xB3, 0xE0}, {0xB3, 0xE4}, /* 0xC0-0xC3 */ + {0xB3, 0xE8}, {0xB3, 0xFC}, {0xB4, 0x10}, {0xB4, 0x18}, /* 0xC4-0xC7 */ + {0xB4, 0x1C}, {0xB4, 0x20}, {0xB4, 0x28}, {0xB4, 0x29}, /* 0xC8-0xCB */ + {0xB4, 0x2B}, {0xB4, 0x34}, {0xB4, 0x50}, {0xB4, 0x51}, /* 0xCC-0xCF */ + {0xB4, 0x54}, {0xB4, 0x58}, {0xB4, 0x60}, {0xB4, 0x61}, /* 0xD0-0xD3 */ + {0xB4, 0x63}, {0xB4, 0x65}, {0xB4, 0x6C}, {0xB4, 0x80}, /* 0xD4-0xD7 */ + {0xB4, 0x88}, {0xB4, 0x9D}, {0xB4, 0xA4}, {0xB4, 0xA8}, /* 0xD8-0xDB */ + {0xB4, 0xAC}, {0xB4, 0xB5}, {0xB4, 0xB7}, {0xB4, 0xB9}, /* 0xDC-0xDF */ + {0xB4, 0xC0}, {0xB4, 0xC4}, {0xB4, 0xC8}, {0xB4, 0xD0}, /* 0xE0-0xE3 */ + {0xB4, 0xD5}, {0xB4, 0xDC}, {0xB4, 0xDD}, {0xB4, 0xE0}, /* 0xE4-0xE7 */ + {0xB4, 0xE3}, {0xB4, 0xE4}, {0xB4, 0xE6}, {0xB4, 0xEC}, /* 0xE8-0xEB */ + {0xB4, 0xED}, {0xB4, 0xEF}, {0xB4, 0xF1}, {0xB4, 0xF8}, /* 0xEC-0xEF */ + {0xB5, 0x14}, {0xB5, 0x15}, {0xB5, 0x18}, {0xB5, 0x1B}, /* 0xF0-0xF3 */ + {0xB5, 0x1C}, {0xB5, 0x24}, {0xB5, 0x25}, {0xB5, 0x27}, /* 0xF4-0xF7 */ + {0xB5, 0x28}, {0xB5, 0x29}, {0xB5, 0x2A}, {0xB5, 0x30}, /* 0xF8-0xFB */ + {0xB5, 0x31}, {0xB5, 0x34}, {0xB5, 0x38}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD1, 0x05}, {0xD1, 0x06}, {0xD1, 0x07}, /* 0x40-0x43 */ + {0xD1, 0x08}, {0xD1, 0x09}, {0xD1, 0x0A}, {0xD1, 0x0B}, /* 0x44-0x47 */ + {0xD1, 0x0C}, {0xD1, 0x0E}, {0xD1, 0x0F}, {0xD1, 0x10}, /* 0x48-0x4B */ + {0xD1, 0x11}, {0xD1, 0x12}, {0xD1, 0x13}, {0xD1, 0x14}, /* 0x4C-0x4F */ + {0xD1, 0x15}, {0xD1, 0x16}, {0xD1, 0x17}, {0xD1, 0x18}, /* 0x50-0x53 */ + {0xD1, 0x19}, {0xD1, 0x1A}, {0xD1, 0x1B}, {0xD1, 0x1C}, /* 0x54-0x57 */ + {0xD1, 0x1D}, {0xD1, 0x1E}, {0xD1, 0x1F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD1, 0x20}, {0xD1, 0x21}, {0xD1, 0x22}, /* 0x60-0x63 */ + {0xD1, 0x23}, {0xD1, 0x24}, {0xD1, 0x25}, {0xD1, 0x26}, /* 0x64-0x67 */ + {0xD1, 0x27}, {0xD1, 0x28}, {0xD1, 0x29}, {0xD1, 0x2A}, /* 0x68-0x6B */ + {0xD1, 0x2B}, {0xD1, 0x2C}, {0xD1, 0x2D}, {0xD1, 0x2E}, /* 0x6C-0x6F */ + {0xD1, 0x2F}, {0xD1, 0x32}, {0xD1, 0x33}, {0xD1, 0x35}, /* 0x70-0x73 */ + {0xD1, 0x36}, {0xD1, 0x37}, {0xD1, 0x39}, {0xD1, 0x3B}, /* 0x74-0x77 */ + {0xD1, 0x3C}, {0xD1, 0x3D}, {0xD1, 0x3E}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD1, 0x3F}, {0xD1, 0x42}, {0xD1, 0x46}, /* 0x80-0x83 */ + {0xD1, 0x47}, {0xD1, 0x48}, {0xD1, 0x49}, {0xD1, 0x4A}, /* 0x84-0x87 */ + {0xD1, 0x4B}, {0xD1, 0x4E}, {0xD1, 0x4F}, {0xD1, 0x51}, /* 0x88-0x8B */ + {0xD1, 0x52}, {0xD1, 0x53}, {0xD1, 0x55}, {0xD1, 0x56}, /* 0x8C-0x8F */ + {0xD1, 0x57}, {0xD1, 0x58}, {0xD1, 0x59}, {0xD1, 0x5A}, /* 0x90-0x93 */ + {0xD1, 0x5B}, {0xD1, 0x5E}, {0xD1, 0x60}, {0xD1, 0x62}, /* 0x94-0x97 */ + {0xD1, 0x63}, {0xD1, 0x64}, {0xD1, 0x65}, {0xD1, 0x66}, /* 0x98-0x9B */ + {0xD1, 0x67}, {0xD1, 0x69}, {0xD1, 0x6A}, {0xD1, 0x6B}, /* 0x9C-0x9F */ + {0xD1, 0x6D}, {0xB5, 0x40}, {0xB5, 0x41}, {0xB5, 0x43}, /* 0xA0-0xA3 */ + {0xB5, 0x44}, {0xB5, 0x45}, {0xB5, 0x4B}, {0xB5, 0x4C}, /* 0xA4-0xA7 */ + {0xB5, 0x4D}, {0xB5, 0x50}, {0xB5, 0x54}, {0xB5, 0x5C}, /* 0xA8-0xAB */ + {0xB5, 0x5D}, {0xB5, 0x5F}, {0xB5, 0x60}, {0xB5, 0x61}, /* 0xAC-0xAF */ + {0xB5, 0xA0}, {0xB5, 0xA1}, {0xB5, 0xA4}, {0xB5, 0xA8}, /* 0xB0-0xB3 */ + {0xB5, 0xAA}, {0xB5, 0xAB}, {0xB5, 0xB0}, {0xB5, 0xB1}, /* 0xB4-0xB7 */ + {0xB5, 0xB3}, {0xB5, 0xB4}, {0xB5, 0xB5}, {0xB5, 0xBB}, /* 0xB8-0xBB */ + {0xB5, 0xBC}, {0xB5, 0xBD}, {0xB5, 0xC0}, {0xB5, 0xC4}, /* 0xBC-0xBF */ + {0xB5, 0xCC}, {0xB5, 0xCD}, {0xB5, 0xCF}, {0xB5, 0xD0}, /* 0xC0-0xC3 */ + {0xB5, 0xD1}, {0xB5, 0xD8}, {0xB5, 0xEC}, {0xB6, 0x10}, /* 0xC4-0xC7 */ + {0xB6, 0x11}, {0xB6, 0x14}, {0xB6, 0x18}, {0xB6, 0x25}, /* 0xC8-0xCB */ + {0xB6, 0x2C}, {0xB6, 0x34}, {0xB6, 0x48}, {0xB6, 0x64}, /* 0xCC-0xCF */ + {0xB6, 0x68}, {0xB6, 0x9C}, {0xB6, 0x9D}, {0xB6, 0xA0}, /* 0xD0-0xD3 */ + {0xB6, 0xA4}, {0xB6, 0xAB}, {0xB6, 0xAC}, {0xB6, 0xB1}, /* 0xD4-0xD7 */ + {0xB6, 0xD4}, {0xB6, 0xF0}, {0xB6, 0xF4}, {0xB6, 0xF8}, /* 0xD8-0xDB */ + {0xB7, 0x00}, {0xB7, 0x01}, {0xB7, 0x05}, {0xB7, 0x28}, /* 0xDC-0xDF */ + {0xB7, 0x29}, {0xB7, 0x2C}, {0xB7, 0x2F}, {0xB7, 0x30}, /* 0xE0-0xE3 */ + {0xB7, 0x38}, {0xB7, 0x39}, {0xB7, 0x3B}, {0xB7, 0x44}, /* 0xE4-0xE7 */ + {0xB7, 0x48}, {0xB7, 0x4C}, {0xB7, 0x54}, {0xB7, 0x55}, /* 0xE8-0xEB */ + {0xB7, 0x60}, {0xB7, 0x64}, {0xB7, 0x68}, {0xB7, 0x70}, /* 0xEC-0xEF */ + {0xB7, 0x71}, {0xB7, 0x73}, {0xB7, 0x75}, {0xB7, 0x7C}, /* 0xF0-0xF3 */ + {0xB7, 0x7D}, {0xB7, 0x80}, {0xB7, 0x84}, {0xB7, 0x8C}, /* 0xF4-0xF7 */ + {0xB7, 0x8D}, {0xB7, 0x8F}, {0xB7, 0x90}, {0xB7, 0x91}, /* 0xF8-0xFB */ + {0xB7, 0x92}, {0xB7, 0x96}, {0xB7, 0x97}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD1, 0x6E}, {0xD1, 0x6F}, {0xD1, 0x70}, /* 0x40-0x43 */ + {0xD1, 0x71}, {0xD1, 0x72}, {0xD1, 0x73}, {0xD1, 0x74}, /* 0x44-0x47 */ + {0xD1, 0x75}, {0xD1, 0x76}, {0xD1, 0x77}, {0xD1, 0x78}, /* 0x48-0x4B */ + {0xD1, 0x79}, {0xD1, 0x7A}, {0xD1, 0x7B}, {0xD1, 0x7D}, /* 0x4C-0x4F */ + {0xD1, 0x7E}, {0xD1, 0x7F}, {0xD1, 0x80}, {0xD1, 0x81}, /* 0x50-0x53 */ + {0xD1, 0x82}, {0xD1, 0x83}, {0xD1, 0x85}, {0xD1, 0x86}, /* 0x54-0x57 */ + {0xD1, 0x87}, {0xD1, 0x89}, {0xD1, 0x8A}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD1, 0x8B}, {0xD1, 0x8C}, {0xD1, 0x8D}, /* 0x60-0x63 */ + {0xD1, 0x8E}, {0xD1, 0x8F}, {0xD1, 0x90}, {0xD1, 0x91}, /* 0x64-0x67 */ + {0xD1, 0x92}, {0xD1, 0x93}, {0xD1, 0x94}, {0xD1, 0x95}, /* 0x68-0x6B */ + {0xD1, 0x96}, {0xD1, 0x97}, {0xD1, 0x98}, {0xD1, 0x99}, /* 0x6C-0x6F */ + {0xD1, 0x9A}, {0xD1, 0x9B}, {0xD1, 0x9C}, {0xD1, 0x9D}, /* 0x70-0x73 */ + {0xD1, 0x9E}, {0xD1, 0x9F}, {0xD1, 0xA2}, {0xD1, 0xA3}, /* 0x74-0x77 */ + {0xD1, 0xA5}, {0xD1, 0xA6}, {0xD1, 0xA7}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD1, 0xA9}, {0xD1, 0xAA}, {0xD1, 0xAB}, /* 0x80-0x83 */ + {0xD1, 0xAC}, {0xD1, 0xAD}, {0xD1, 0xAE}, {0xD1, 0xAF}, /* 0x84-0x87 */ + {0xD1, 0xB2}, {0xD1, 0xB4}, {0xD1, 0xB6}, {0xD1, 0xB7}, /* 0x88-0x8B */ + {0xD1, 0xB8}, {0xD1, 0xB9}, {0xD1, 0xBB}, {0xD1, 0xBD}, /* 0x8C-0x8F */ + {0xD1, 0xBE}, {0xD1, 0xBF}, {0xD1, 0xC1}, {0xD1, 0xC2}, /* 0x90-0x93 */ + {0xD1, 0xC3}, {0xD1, 0xC4}, {0xD1, 0xC5}, {0xD1, 0xC6}, /* 0x94-0x97 */ + {0xD1, 0xC7}, {0xD1, 0xC8}, {0xD1, 0xC9}, {0xD1, 0xCA}, /* 0x98-0x9B */ + {0xD1, 0xCB}, {0xD1, 0xCC}, {0xD1, 0xCD}, {0xD1, 0xCE}, /* 0x9C-0x9F */ + {0xD1, 0xCF}, {0xB7, 0x98}, {0xB7, 0x99}, {0xB7, 0x9C}, /* 0xA0-0xA3 */ + {0xB7, 0xA0}, {0xB7, 0xA8}, {0xB7, 0xA9}, {0xB7, 0xAB}, /* 0xA4-0xA7 */ + {0xB7, 0xAC}, {0xB7, 0xAD}, {0xB7, 0xB4}, {0xB7, 0xB5}, /* 0xA8-0xAB */ + {0xB7, 0xB8}, {0xB7, 0xC7}, {0xB7, 0xC9}, {0xB7, 0xEC}, /* 0xAC-0xAF */ + {0xB7, 0xED}, {0xB7, 0xF0}, {0xB7, 0xF4}, {0xB7, 0xFC}, /* 0xB0-0xB3 */ + {0xB7, 0xFD}, {0xB7, 0xFF}, {0xB8, 0x00}, {0xB8, 0x01}, /* 0xB4-0xB7 */ + {0xB8, 0x07}, {0xB8, 0x08}, {0xB8, 0x09}, {0xB8, 0x0C}, /* 0xB8-0xBB */ + {0xB8, 0x10}, {0xB8, 0x18}, {0xB8, 0x19}, {0xB8, 0x1B}, /* 0xBC-0xBF */ + {0xB8, 0x1D}, {0xB8, 0x24}, {0xB8, 0x25}, {0xB8, 0x28}, /* 0xC0-0xC3 */ + {0xB8, 0x2C}, {0xB8, 0x34}, {0xB8, 0x35}, {0xB8, 0x37}, /* 0xC4-0xC7 */ + {0xB8, 0x38}, {0xB8, 0x39}, {0xB8, 0x40}, {0xB8, 0x44}, /* 0xC8-0xCB */ + {0xB8, 0x51}, {0xB8, 0x53}, {0xB8, 0x5C}, {0xB8, 0x5D}, /* 0xCC-0xCF */ + {0xB8, 0x60}, {0xB8, 0x64}, {0xB8, 0x6C}, {0xB8, 0x6D}, /* 0xD0-0xD3 */ + {0xB8, 0x6F}, {0xB8, 0x71}, {0xB8, 0x78}, {0xB8, 0x7C}, /* 0xD4-0xD7 */ + {0xB8, 0x8D}, {0xB8, 0xA8}, {0xB8, 0xB0}, {0xB8, 0xB4}, /* 0xD8-0xDB */ + {0xB8, 0xB8}, {0xB8, 0xC0}, {0xB8, 0xC1}, {0xB8, 0xC3}, /* 0xDC-0xDF */ + {0xB8, 0xC5}, {0xB8, 0xCC}, {0xB8, 0xD0}, {0xB8, 0xD4}, /* 0xE0-0xE3 */ + {0xB8, 0xDD}, {0xB8, 0xDF}, {0xB8, 0xE1}, {0xB8, 0xE8}, /* 0xE4-0xE7 */ + {0xB8, 0xE9}, {0xB8, 0xEC}, {0xB8, 0xF0}, {0xB8, 0xF8}, /* 0xE8-0xEB */ + {0xB8, 0xF9}, {0xB8, 0xFB}, {0xB8, 0xFD}, {0xB9, 0x04}, /* 0xEC-0xEF */ + {0xB9, 0x18}, {0xB9, 0x20}, {0xB9, 0x3C}, {0xB9, 0x3D}, /* 0xF0-0xF3 */ + {0xB9, 0x40}, {0xB9, 0x44}, {0xB9, 0x4C}, {0xB9, 0x4F}, /* 0xF4-0xF7 */ + {0xB9, 0x51}, {0xB9, 0x58}, {0xB9, 0x59}, {0xB9, 0x5C}, /* 0xF8-0xFB */ + {0xB9, 0x60}, {0xB9, 0x68}, {0xB9, 0x69}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD1, 0xD0}, {0xD1, 0xD1}, {0xD1, 0xD2}, /* 0x40-0x43 */ + {0xD1, 0xD3}, {0xD1, 0xD4}, {0xD1, 0xD5}, {0xD1, 0xD6}, /* 0x44-0x47 */ + {0xD1, 0xD7}, {0xD1, 0xD9}, {0xD1, 0xDA}, {0xD1, 0xDB}, /* 0x48-0x4B */ + {0xD1, 0xDC}, {0xD1, 0xDD}, {0xD1, 0xDE}, {0xD1, 0xDF}, /* 0x4C-0x4F */ + {0xD1, 0xE0}, {0xD1, 0xE1}, {0xD1, 0xE2}, {0xD1, 0xE3}, /* 0x50-0x53 */ + {0xD1, 0xE4}, {0xD1, 0xE5}, {0xD1, 0xE6}, {0xD1, 0xE7}, /* 0x54-0x57 */ + {0xD1, 0xE8}, {0xD1, 0xE9}, {0xD1, 0xEA}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD1, 0xEB}, {0xD1, 0xEC}, {0xD1, 0xED}, /* 0x60-0x63 */ + {0xD1, 0xEE}, {0xD1, 0xEF}, {0xD1, 0xF0}, {0xD1, 0xF1}, /* 0x64-0x67 */ + {0xD1, 0xF2}, {0xD1, 0xF3}, {0xD1, 0xF5}, {0xD1, 0xF6}, /* 0x68-0x6B */ + {0xD1, 0xF7}, {0xD1, 0xF9}, {0xD1, 0xFA}, {0xD1, 0xFB}, /* 0x6C-0x6F */ + {0xD1, 0xFC}, {0xD1, 0xFD}, {0xD1, 0xFE}, {0xD1, 0xFF}, /* 0x70-0x73 */ + {0xD2, 0x00}, {0xD2, 0x01}, {0xD2, 0x02}, {0xD2, 0x03}, /* 0x74-0x77 */ + {0xD2, 0x04}, {0xD2, 0x05}, {0xD2, 0x06}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD2, 0x08}, {0xD2, 0x0A}, {0xD2, 0x0B}, /* 0x80-0x83 */ + {0xD2, 0x0C}, {0xD2, 0x0D}, {0xD2, 0x0E}, {0xD2, 0x0F}, /* 0x84-0x87 */ + {0xD2, 0x11}, {0xD2, 0x12}, {0xD2, 0x13}, {0xD2, 0x14}, /* 0x88-0x8B */ + {0xD2, 0x15}, {0xD2, 0x16}, {0xD2, 0x17}, {0xD2, 0x18}, /* 0x8C-0x8F */ + {0xD2, 0x19}, {0xD2, 0x1A}, {0xD2, 0x1B}, {0xD2, 0x1C}, /* 0x90-0x93 */ + {0xD2, 0x1D}, {0xD2, 0x1E}, {0xD2, 0x1F}, {0xD2, 0x20}, /* 0x94-0x97 */ + {0xD2, 0x21}, {0xD2, 0x22}, {0xD2, 0x23}, {0xD2, 0x24}, /* 0x98-0x9B */ + {0xD2, 0x25}, {0xD2, 0x26}, {0xD2, 0x27}, {0xD2, 0x28}, /* 0x9C-0x9F */ + {0xD2, 0x29}, {0xB9, 0x6B}, {0xB9, 0x6D}, {0xB9, 0x74}, /* 0xA0-0xA3 */ + {0xB9, 0x75}, {0xB9, 0x78}, {0xB9, 0x7C}, {0xB9, 0x84}, /* 0xA4-0xA7 */ + {0xB9, 0x85}, {0xB9, 0x87}, {0xB9, 0x89}, {0xB9, 0x8A}, /* 0xA8-0xAB */ + {0xB9, 0x8D}, {0xB9, 0x8E}, {0xB9, 0xAC}, {0xB9, 0xAD}, /* 0xAC-0xAF */ + {0xB9, 0xB0}, {0xB9, 0xB4}, {0xB9, 0xBC}, {0xB9, 0xBD}, /* 0xB0-0xB3 */ + {0xB9, 0xBF}, {0xB9, 0xC1}, {0xB9, 0xC8}, {0xB9, 0xC9}, /* 0xB4-0xB7 */ + {0xB9, 0xCC}, {0xB9, 0xCE}, {0xB9, 0xCF}, {0xB9, 0xD0}, /* 0xB8-0xBB */ + {0xB9, 0xD1}, {0xB9, 0xD2}, {0xB9, 0xD8}, {0xB9, 0xD9}, /* 0xBC-0xBF */ + {0xB9, 0xDB}, {0xB9, 0xDD}, {0xB9, 0xDE}, {0xB9, 0xE1}, /* 0xC0-0xC3 */ + {0xB9, 0xE3}, {0xB9, 0xE4}, {0xB9, 0xE5}, {0xB9, 0xE8}, /* 0xC4-0xC7 */ + {0xB9, 0xEC}, {0xB9, 0xF4}, {0xB9, 0xF5}, {0xB9, 0xF7}, /* 0xC8-0xCB */ + {0xB9, 0xF8}, {0xB9, 0xF9}, {0xB9, 0xFA}, {0xBA, 0x00}, /* 0xCC-0xCF */ + {0xBA, 0x01}, {0xBA, 0x08}, {0xBA, 0x15}, {0xBA, 0x38}, /* 0xD0-0xD3 */ + {0xBA, 0x39}, {0xBA, 0x3C}, {0xBA, 0x40}, {0xBA, 0x42}, /* 0xD4-0xD7 */ + {0xBA, 0x48}, {0xBA, 0x49}, {0xBA, 0x4B}, {0xBA, 0x4D}, /* 0xD8-0xDB */ + {0xBA, 0x4E}, {0xBA, 0x53}, {0xBA, 0x54}, {0xBA, 0x55}, /* 0xDC-0xDF */ + {0xBA, 0x58}, {0xBA, 0x5C}, {0xBA, 0x64}, {0xBA, 0x65}, /* 0xE0-0xE3 */ + {0xBA, 0x67}, {0xBA, 0x68}, {0xBA, 0x69}, {0xBA, 0x70}, /* 0xE4-0xE7 */ + {0xBA, 0x71}, {0xBA, 0x74}, {0xBA, 0x78}, {0xBA, 0x83}, /* 0xE8-0xEB */ + {0xBA, 0x84}, {0xBA, 0x85}, {0xBA, 0x87}, {0xBA, 0x8C}, /* 0xEC-0xEF */ + {0xBA, 0xA8}, {0xBA, 0xA9}, {0xBA, 0xAB}, {0xBA, 0xAC}, /* 0xF0-0xF3 */ + {0xBA, 0xB0}, {0xBA, 0xB2}, {0xBA, 0xB8}, {0xBA, 0xB9}, /* 0xF4-0xF7 */ + {0xBA, 0xBB}, {0xBA, 0xBD}, {0xBA, 0xC4}, {0xBA, 0xC8}, /* 0xF8-0xFB */ + {0xBA, 0xD8}, {0xBA, 0xD9}, {0xBA, 0xFC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD2, 0x2A}, {0xD2, 0x2B}, {0xD2, 0x2E}, /* 0x40-0x43 */ + {0xD2, 0x2F}, {0xD2, 0x31}, {0xD2, 0x32}, {0xD2, 0x33}, /* 0x44-0x47 */ + {0xD2, 0x35}, {0xD2, 0x36}, {0xD2, 0x37}, {0xD2, 0x38}, /* 0x48-0x4B */ + {0xD2, 0x39}, {0xD2, 0x3A}, {0xD2, 0x3B}, {0xD2, 0x3E}, /* 0x4C-0x4F */ + {0xD2, 0x40}, {0xD2, 0x42}, {0xD2, 0x43}, {0xD2, 0x44}, /* 0x50-0x53 */ + {0xD2, 0x45}, {0xD2, 0x46}, {0xD2, 0x47}, {0xD2, 0x49}, /* 0x54-0x57 */ + {0xD2, 0x4A}, {0xD2, 0x4B}, {0xD2, 0x4C}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD2, 0x4D}, {0xD2, 0x4E}, {0xD2, 0x4F}, /* 0x60-0x63 */ + {0xD2, 0x50}, {0xD2, 0x51}, {0xD2, 0x52}, {0xD2, 0x53}, /* 0x64-0x67 */ + {0xD2, 0x54}, {0xD2, 0x55}, {0xD2, 0x56}, {0xD2, 0x57}, /* 0x68-0x6B */ + {0xD2, 0x58}, {0xD2, 0x59}, {0xD2, 0x5A}, {0xD2, 0x5B}, /* 0x6C-0x6F */ + {0xD2, 0x5D}, {0xD2, 0x5E}, {0xD2, 0x5F}, {0xD2, 0x60}, /* 0x70-0x73 */ + {0xD2, 0x61}, {0xD2, 0x62}, {0xD2, 0x63}, {0xD2, 0x65}, /* 0x74-0x77 */ + {0xD2, 0x66}, {0xD2, 0x67}, {0xD2, 0x68}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD2, 0x69}, {0xD2, 0x6A}, {0xD2, 0x6B}, /* 0x80-0x83 */ + {0xD2, 0x6C}, {0xD2, 0x6D}, {0xD2, 0x6E}, {0xD2, 0x6F}, /* 0x84-0x87 */ + {0xD2, 0x70}, {0xD2, 0x71}, {0xD2, 0x72}, {0xD2, 0x73}, /* 0x88-0x8B */ + {0xD2, 0x74}, {0xD2, 0x75}, {0xD2, 0x76}, {0xD2, 0x77}, /* 0x8C-0x8F */ + {0xD2, 0x78}, {0xD2, 0x79}, {0xD2, 0x7A}, {0xD2, 0x7B}, /* 0x90-0x93 */ + {0xD2, 0x7C}, {0xD2, 0x7D}, {0xD2, 0x7E}, {0xD2, 0x7F}, /* 0x94-0x97 */ + {0xD2, 0x82}, {0xD2, 0x83}, {0xD2, 0x85}, {0xD2, 0x86}, /* 0x98-0x9B */ + {0xD2, 0x87}, {0xD2, 0x89}, {0xD2, 0x8A}, {0xD2, 0x8B}, /* 0x9C-0x9F */ + {0xD2, 0x8C}, {0xBB, 0x00}, {0xBB, 0x04}, {0xBB, 0x0D}, /* 0xA0-0xA3 */ + {0xBB, 0x0F}, {0xBB, 0x11}, {0xBB, 0x18}, {0xBB, 0x1C}, /* 0xA4-0xA7 */ + {0xBB, 0x20}, {0xBB, 0x29}, {0xBB, 0x2B}, {0xBB, 0x34}, /* 0xA8-0xAB */ + {0xBB, 0x35}, {0xBB, 0x36}, {0xBB, 0x38}, {0xBB, 0x3B}, /* 0xAC-0xAF */ + {0xBB, 0x3C}, {0xBB, 0x3D}, {0xBB, 0x3E}, {0xBB, 0x44}, /* 0xB0-0xB3 */ + {0xBB, 0x45}, {0xBB, 0x47}, {0xBB, 0x49}, {0xBB, 0x4D}, /* 0xB4-0xB7 */ + {0xBB, 0x4F}, {0xBB, 0x50}, {0xBB, 0x54}, {0xBB, 0x58}, /* 0xB8-0xBB */ + {0xBB, 0x61}, {0xBB, 0x63}, {0xBB, 0x6C}, {0xBB, 0x88}, /* 0xBC-0xBF */ + {0xBB, 0x8C}, {0xBB, 0x90}, {0xBB, 0xA4}, {0xBB, 0xA8}, /* 0xC0-0xC3 */ + {0xBB, 0xAC}, {0xBB, 0xB4}, {0xBB, 0xB7}, {0xBB, 0xC0}, /* 0xC4-0xC7 */ + {0xBB, 0xC4}, {0xBB, 0xC8}, {0xBB, 0xD0}, {0xBB, 0xD3}, /* 0xC8-0xCB */ + {0xBB, 0xF8}, {0xBB, 0xF9}, {0xBB, 0xFC}, {0xBB, 0xFF}, /* 0xCC-0xCF */ + {0xBC, 0x00}, {0xBC, 0x02}, {0xBC, 0x08}, {0xBC, 0x09}, /* 0xD0-0xD3 */ + {0xBC, 0x0B}, {0xBC, 0x0C}, {0xBC, 0x0D}, {0xBC, 0x0F}, /* 0xD4-0xD7 */ + {0xBC, 0x11}, {0xBC, 0x14}, {0xBC, 0x15}, {0xBC, 0x16}, /* 0xD8-0xDB */ + {0xBC, 0x17}, {0xBC, 0x18}, {0xBC, 0x1B}, {0xBC, 0x1C}, /* 0xDC-0xDF */ + {0xBC, 0x1D}, {0xBC, 0x1E}, {0xBC, 0x1F}, {0xBC, 0x24}, /* 0xE0-0xE3 */ + {0xBC, 0x25}, {0xBC, 0x27}, {0xBC, 0x29}, {0xBC, 0x2D}, /* 0xE4-0xE7 */ + {0xBC, 0x30}, {0xBC, 0x31}, {0xBC, 0x34}, {0xBC, 0x38}, /* 0xE8-0xEB */ + {0xBC, 0x40}, {0xBC, 0x41}, {0xBC, 0x43}, {0xBC, 0x44}, /* 0xEC-0xEF */ + {0xBC, 0x45}, {0xBC, 0x49}, {0xBC, 0x4C}, {0xBC, 0x4D}, /* 0xF0-0xF3 */ + {0xBC, 0x50}, {0xBC, 0x5D}, {0xBC, 0x84}, {0xBC, 0x85}, /* 0xF4-0xF7 */ + {0xBC, 0x88}, {0xBC, 0x8B}, {0xBC, 0x8C}, {0xBC, 0x8E}, /* 0xF8-0xFB */ + {0xBC, 0x94}, {0xBC, 0x95}, {0xBC, 0x97}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD2, 0x8D}, {0xD2, 0x8E}, {0xD2, 0x8F}, /* 0x40-0x43 */ + {0xD2, 0x92}, {0xD2, 0x93}, {0xD2, 0x94}, {0xD2, 0x96}, /* 0x44-0x47 */ + {0xD2, 0x97}, {0xD2, 0x98}, {0xD2, 0x99}, {0xD2, 0x9A}, /* 0x48-0x4B */ + {0xD2, 0x9B}, {0xD2, 0x9D}, {0xD2, 0x9E}, {0xD2, 0x9F}, /* 0x4C-0x4F */ + {0xD2, 0xA1}, {0xD2, 0xA2}, {0xD2, 0xA3}, {0xD2, 0xA5}, /* 0x50-0x53 */ + {0xD2, 0xA6}, {0xD2, 0xA7}, {0xD2, 0xA8}, {0xD2, 0xA9}, /* 0x54-0x57 */ + {0xD2, 0xAA}, {0xD2, 0xAB}, {0xD2, 0xAD}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD2, 0xAE}, {0xD2, 0xAF}, {0xD2, 0xB0}, /* 0x60-0x63 */ + {0xD2, 0xB2}, {0xD2, 0xB3}, {0xD2, 0xB4}, {0xD2, 0xB5}, /* 0x64-0x67 */ + {0xD2, 0xB6}, {0xD2, 0xB7}, {0xD2, 0xBA}, {0xD2, 0xBB}, /* 0x68-0x6B */ + {0xD2, 0xBD}, {0xD2, 0xBE}, {0xD2, 0xC1}, {0xD2, 0xC3}, /* 0x6C-0x6F */ + {0xD2, 0xC4}, {0xD2, 0xC5}, {0xD2, 0xC6}, {0xD2, 0xC7}, /* 0x70-0x73 */ + {0xD2, 0xCA}, {0xD2, 0xCC}, {0xD2, 0xCD}, {0xD2, 0xCE}, /* 0x74-0x77 */ + {0xD2, 0xCF}, {0xD2, 0xD0}, {0xD2, 0xD1}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD2, 0xD2}, {0xD2, 0xD3}, {0xD2, 0xD5}, /* 0x80-0x83 */ + {0xD2, 0xD6}, {0xD2, 0xD7}, {0xD2, 0xD9}, {0xD2, 0xDA}, /* 0x84-0x87 */ + {0xD2, 0xDB}, {0xD2, 0xDD}, {0xD2, 0xDE}, {0xD2, 0xDF}, /* 0x88-0x8B */ + {0xD2, 0xE0}, {0xD2, 0xE1}, {0xD2, 0xE2}, {0xD2, 0xE3}, /* 0x8C-0x8F */ + {0xD2, 0xE6}, {0xD2, 0xE7}, {0xD2, 0xE8}, {0xD2, 0xE9}, /* 0x90-0x93 */ + {0xD2, 0xEA}, {0xD2, 0xEB}, {0xD2, 0xEC}, {0xD2, 0xED}, /* 0x94-0x97 */ + {0xD2, 0xEE}, {0xD2, 0xEF}, {0xD2, 0xF2}, {0xD2, 0xF3}, /* 0x98-0x9B */ + {0xD2, 0xF5}, {0xD2, 0xF6}, {0xD2, 0xF7}, {0xD2, 0xF9}, /* 0x9C-0x9F */ + {0xD2, 0xFA}, {0xBC, 0x99}, {0xBC, 0x9A}, {0xBC, 0xA0}, /* 0xA0-0xA3 */ + {0xBC, 0xA1}, {0xBC, 0xA4}, {0xBC, 0xA7}, {0xBC, 0xA8}, /* 0xA4-0xA7 */ + {0xBC, 0xB0}, {0xBC, 0xB1}, {0xBC, 0xB3}, {0xBC, 0xB4}, /* 0xA8-0xAB */ + {0xBC, 0xB5}, {0xBC, 0xBC}, {0xBC, 0xBD}, {0xBC, 0xC0}, /* 0xAC-0xAF */ + {0xBC, 0xC4}, {0xBC, 0xCD}, {0xBC, 0xCF}, {0xBC, 0xD0}, /* 0xB0-0xB3 */ + {0xBC, 0xD1}, {0xBC, 0xD5}, {0xBC, 0xD8}, {0xBC, 0xDC}, /* 0xB4-0xB7 */ + {0xBC, 0xF4}, {0xBC, 0xF5}, {0xBC, 0xF6}, {0xBC, 0xF8}, /* 0xB8-0xBB */ + {0xBC, 0xFC}, {0xBD, 0x04}, {0xBD, 0x05}, {0xBD, 0x07}, /* 0xBC-0xBF */ + {0xBD, 0x09}, {0xBD, 0x10}, {0xBD, 0x14}, {0xBD, 0x24}, /* 0xC0-0xC3 */ + {0xBD, 0x2C}, {0xBD, 0x40}, {0xBD, 0x48}, {0xBD, 0x49}, /* 0xC4-0xC7 */ + {0xBD, 0x4C}, {0xBD, 0x50}, {0xBD, 0x58}, {0xBD, 0x59}, /* 0xC8-0xCB */ + {0xBD, 0x64}, {0xBD, 0x68}, {0xBD, 0x80}, {0xBD, 0x81}, /* 0xCC-0xCF */ + {0xBD, 0x84}, {0xBD, 0x87}, {0xBD, 0x88}, {0xBD, 0x89}, /* 0xD0-0xD3 */ + {0xBD, 0x8A}, {0xBD, 0x90}, {0xBD, 0x91}, {0xBD, 0x93}, /* 0xD4-0xD7 */ + {0xBD, 0x95}, {0xBD, 0x99}, {0xBD, 0x9A}, {0xBD, 0x9C}, /* 0xD8-0xDB */ + {0xBD, 0xA4}, {0xBD, 0xB0}, {0xBD, 0xB8}, {0xBD, 0xD4}, /* 0xDC-0xDF */ + {0xBD, 0xD5}, {0xBD, 0xD8}, {0xBD, 0xDC}, {0xBD, 0xE9}, /* 0xE0-0xE3 */ + {0xBD, 0xF0}, {0xBD, 0xF4}, {0xBD, 0xF8}, {0xBE, 0x00}, /* 0xE4-0xE7 */ + {0xBE, 0x03}, {0xBE, 0x05}, {0xBE, 0x0C}, {0xBE, 0x0D}, /* 0xE8-0xEB */ + {0xBE, 0x10}, {0xBE, 0x14}, {0xBE, 0x1C}, {0xBE, 0x1D}, /* 0xEC-0xEF */ + {0xBE, 0x1F}, {0xBE, 0x44}, {0xBE, 0x45}, {0xBE, 0x48}, /* 0xF0-0xF3 */ + {0xBE, 0x4C}, {0xBE, 0x4E}, {0xBE, 0x54}, {0xBE, 0x55}, /* 0xF4-0xF7 */ + {0xBE, 0x57}, {0xBE, 0x59}, {0xBE, 0x5A}, {0xBE, 0x5B}, /* 0xF8-0xFB */ + {0xBE, 0x60}, {0xBE, 0x61}, {0xBE, 0x64}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD2, 0xFB}, {0xD2, 0xFC}, {0xD2, 0xFD}, /* 0x40-0x43 */ + {0xD2, 0xFE}, {0xD2, 0xFF}, {0xD3, 0x02}, {0xD3, 0x04}, /* 0x44-0x47 */ + {0xD3, 0x06}, {0xD3, 0x07}, {0xD3, 0x08}, {0xD3, 0x09}, /* 0x48-0x4B */ + {0xD3, 0x0A}, {0xD3, 0x0B}, {0xD3, 0x0F}, {0xD3, 0x11}, /* 0x4C-0x4F */ + {0xD3, 0x12}, {0xD3, 0x13}, {0xD3, 0x15}, {0xD3, 0x17}, /* 0x50-0x53 */ + {0xD3, 0x18}, {0xD3, 0x19}, {0xD3, 0x1A}, {0xD3, 0x1B}, /* 0x54-0x57 */ + {0xD3, 0x1E}, {0xD3, 0x22}, {0xD3, 0x23}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD3, 0x24}, {0xD3, 0x26}, {0xD3, 0x27}, /* 0x60-0x63 */ + {0xD3, 0x2A}, {0xD3, 0x2B}, {0xD3, 0x2D}, {0xD3, 0x2E}, /* 0x64-0x67 */ + {0xD3, 0x2F}, {0xD3, 0x31}, {0xD3, 0x32}, {0xD3, 0x33}, /* 0x68-0x6B */ + {0xD3, 0x34}, {0xD3, 0x35}, {0xD3, 0x36}, {0xD3, 0x37}, /* 0x6C-0x6F */ + {0xD3, 0x3A}, {0xD3, 0x3E}, {0xD3, 0x3F}, {0xD3, 0x40}, /* 0x70-0x73 */ + {0xD3, 0x41}, {0xD3, 0x42}, {0xD3, 0x43}, {0xD3, 0x46}, /* 0x74-0x77 */ + {0xD3, 0x47}, {0xD3, 0x48}, {0xD3, 0x49}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD3, 0x4A}, {0xD3, 0x4B}, {0xD3, 0x4C}, /* 0x80-0x83 */ + {0xD3, 0x4D}, {0xD3, 0x4E}, {0xD3, 0x4F}, {0xD3, 0x50}, /* 0x84-0x87 */ + {0xD3, 0x51}, {0xD3, 0x52}, {0xD3, 0x53}, {0xD3, 0x54}, /* 0x88-0x8B */ + {0xD3, 0x55}, {0xD3, 0x56}, {0xD3, 0x57}, {0xD3, 0x58}, /* 0x8C-0x8F */ + {0xD3, 0x59}, {0xD3, 0x5A}, {0xD3, 0x5B}, {0xD3, 0x5C}, /* 0x90-0x93 */ + {0xD3, 0x5D}, {0xD3, 0x5E}, {0xD3, 0x5F}, {0xD3, 0x60}, /* 0x94-0x97 */ + {0xD3, 0x61}, {0xD3, 0x62}, {0xD3, 0x63}, {0xD3, 0x64}, /* 0x98-0x9B */ + {0xD3, 0x65}, {0xD3, 0x66}, {0xD3, 0x67}, {0xD3, 0x68}, /* 0x9C-0x9F */ + {0xD3, 0x69}, {0xBE, 0x68}, {0xBE, 0x6A}, {0xBE, 0x70}, /* 0xA0-0xA3 */ + {0xBE, 0x71}, {0xBE, 0x73}, {0xBE, 0x74}, {0xBE, 0x75}, /* 0xA4-0xA7 */ + {0xBE, 0x7B}, {0xBE, 0x7C}, {0xBE, 0x7D}, {0xBE, 0x80}, /* 0xA8-0xAB */ + {0xBE, 0x84}, {0xBE, 0x8C}, {0xBE, 0x8D}, {0xBE, 0x8F}, /* 0xAC-0xAF */ + {0xBE, 0x90}, {0xBE, 0x91}, {0xBE, 0x98}, {0xBE, 0x99}, /* 0xB0-0xB3 */ + {0xBE, 0xA8}, {0xBE, 0xD0}, {0xBE, 0xD1}, {0xBE, 0xD4}, /* 0xB4-0xB7 */ + {0xBE, 0xD7}, {0xBE, 0xD8}, {0xBE, 0xE0}, {0xBE, 0xE3}, /* 0xB8-0xBB */ + {0xBE, 0xE4}, {0xBE, 0xE5}, {0xBE, 0xEC}, {0xBF, 0x01}, /* 0xBC-0xBF */ + {0xBF, 0x08}, {0xBF, 0x09}, {0xBF, 0x18}, {0xBF, 0x19}, /* 0xC0-0xC3 */ + {0xBF, 0x1B}, {0xBF, 0x1C}, {0xBF, 0x1D}, {0xBF, 0x40}, /* 0xC4-0xC7 */ + {0xBF, 0x41}, {0xBF, 0x44}, {0xBF, 0x48}, {0xBF, 0x50}, /* 0xC8-0xCB */ + {0xBF, 0x51}, {0xBF, 0x55}, {0xBF, 0x94}, {0xBF, 0xB0}, /* 0xCC-0xCF */ + {0xBF, 0xC5}, {0xBF, 0xCC}, {0xBF, 0xCD}, {0xBF, 0xD0}, /* 0xD0-0xD3 */ + {0xBF, 0xD4}, {0xBF, 0xDC}, {0xBF, 0xDF}, {0xBF, 0xE1}, /* 0xD4-0xD7 */ + {0xC0, 0x3C}, {0xC0, 0x51}, {0xC0, 0x58}, {0xC0, 0x5C}, /* 0xD8-0xDB */ + {0xC0, 0x60}, {0xC0, 0x68}, {0xC0, 0x69}, {0xC0, 0x90}, /* 0xDC-0xDF */ + {0xC0, 0x91}, {0xC0, 0x94}, {0xC0, 0x98}, {0xC0, 0xA0}, /* 0xE0-0xE3 */ + {0xC0, 0xA1}, {0xC0, 0xA3}, {0xC0, 0xA5}, {0xC0, 0xAC}, /* 0xE4-0xE7 */ + {0xC0, 0xAD}, {0xC0, 0xAF}, {0xC0, 0xB0}, {0xC0, 0xB3}, /* 0xE8-0xEB */ + {0xC0, 0xB4}, {0xC0, 0xB5}, {0xC0, 0xB6}, {0xC0, 0xBC}, /* 0xEC-0xEF */ + {0xC0, 0xBD}, {0xC0, 0xBF}, {0xC0, 0xC0}, {0xC0, 0xC1}, /* 0xF0-0xF3 */ + {0xC0, 0xC5}, {0xC0, 0xC8}, {0xC0, 0xC9}, {0xC0, 0xCC}, /* 0xF4-0xF7 */ + {0xC0, 0xD0}, {0xC0, 0xD8}, {0xC0, 0xD9}, {0xC0, 0xDB}, /* 0xF8-0xFB */ + {0xC0, 0xDC}, {0xC0, 0xDD}, {0xC0, 0xE4}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD3, 0x6A}, {0xD3, 0x6B}, {0xD3, 0x6C}, /* 0x40-0x43 */ + {0xD3, 0x6D}, {0xD3, 0x6E}, {0xD3, 0x6F}, {0xD3, 0x70}, /* 0x44-0x47 */ + {0xD3, 0x71}, {0xD3, 0x72}, {0xD3, 0x73}, {0xD3, 0x74}, /* 0x48-0x4B */ + {0xD3, 0x75}, {0xD3, 0x76}, {0xD3, 0x77}, {0xD3, 0x78}, /* 0x4C-0x4F */ + {0xD3, 0x79}, {0xD3, 0x7A}, {0xD3, 0x7B}, {0xD3, 0x7E}, /* 0x50-0x53 */ + {0xD3, 0x7F}, {0xD3, 0x81}, {0xD3, 0x82}, {0xD3, 0x83}, /* 0x54-0x57 */ + {0xD3, 0x85}, {0xD3, 0x86}, {0xD3, 0x87}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD3, 0x88}, {0xD3, 0x89}, {0xD3, 0x8A}, /* 0x60-0x63 */ + {0xD3, 0x8B}, {0xD3, 0x8E}, {0xD3, 0x92}, {0xD3, 0x93}, /* 0x64-0x67 */ + {0xD3, 0x94}, {0xD3, 0x95}, {0xD3, 0x96}, {0xD3, 0x97}, /* 0x68-0x6B */ + {0xD3, 0x9A}, {0xD3, 0x9B}, {0xD3, 0x9D}, {0xD3, 0x9E}, /* 0x6C-0x6F */ + {0xD3, 0x9F}, {0xD3, 0xA1}, {0xD3, 0xA2}, {0xD3, 0xA3}, /* 0x70-0x73 */ + {0xD3, 0xA4}, {0xD3, 0xA5}, {0xD3, 0xA6}, {0xD3, 0xA7}, /* 0x74-0x77 */ + {0xD3, 0xAA}, {0xD3, 0xAC}, {0xD3, 0xAE}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD3, 0xAF}, {0xD3, 0xB0}, {0xD3, 0xB1}, /* 0x80-0x83 */ + {0xD3, 0xB2}, {0xD3, 0xB3}, {0xD3, 0xB5}, {0xD3, 0xB6}, /* 0x84-0x87 */ + {0xD3, 0xB7}, {0xD3, 0xB9}, {0xD3, 0xBA}, {0xD3, 0xBB}, /* 0x88-0x8B */ + {0xD3, 0xBD}, {0xD3, 0xBE}, {0xD3, 0xBF}, {0xD3, 0xC0}, /* 0x8C-0x8F */ + {0xD3, 0xC1}, {0xD3, 0xC2}, {0xD3, 0xC3}, {0xD3, 0xC6}, /* 0x90-0x93 */ + {0xD3, 0xC7}, {0xD3, 0xCA}, {0xD3, 0xCB}, {0xD3, 0xCC}, /* 0x94-0x97 */ + {0xD3, 0xCD}, {0xD3, 0xCE}, {0xD3, 0xCF}, {0xD3, 0xD1}, /* 0x98-0x9B */ + {0xD3, 0xD2}, {0xD3, 0xD3}, {0xD3, 0xD4}, {0xD3, 0xD5}, /* 0x9C-0x9F */ + {0xD3, 0xD6}, {0xC0, 0xE5}, {0xC0, 0xE8}, {0xC0, 0xEC}, /* 0xA0-0xA3 */ + {0xC0, 0xF4}, {0xC0, 0xF5}, {0xC0, 0xF7}, {0xC0, 0xF9}, /* 0xA4-0xA7 */ + {0xC1, 0x00}, {0xC1, 0x04}, {0xC1, 0x08}, {0xC1, 0x10}, /* 0xA8-0xAB */ + {0xC1, 0x15}, {0xC1, 0x1C}, {0xC1, 0x1D}, {0xC1, 0x1E}, /* 0xAC-0xAF */ + {0xC1, 0x1F}, {0xC1, 0x20}, {0xC1, 0x23}, {0xC1, 0x24}, /* 0xB0-0xB3 */ + {0xC1, 0x26}, {0xC1, 0x27}, {0xC1, 0x2C}, {0xC1, 0x2D}, /* 0xB4-0xB7 */ + {0xC1, 0x2F}, {0xC1, 0x30}, {0xC1, 0x31}, {0xC1, 0x36}, /* 0xB8-0xBB */ + {0xC1, 0x38}, {0xC1, 0x39}, {0xC1, 0x3C}, {0xC1, 0x40}, /* 0xBC-0xBF */ + {0xC1, 0x48}, {0xC1, 0x49}, {0xC1, 0x4B}, {0xC1, 0x4C}, /* 0xC0-0xC3 */ + {0xC1, 0x4D}, {0xC1, 0x54}, {0xC1, 0x55}, {0xC1, 0x58}, /* 0xC4-0xC7 */ + {0xC1, 0x5C}, {0xC1, 0x64}, {0xC1, 0x65}, {0xC1, 0x67}, /* 0xC8-0xCB */ + {0xC1, 0x68}, {0xC1, 0x69}, {0xC1, 0x70}, {0xC1, 0x74}, /* 0xCC-0xCF */ + {0xC1, 0x78}, {0xC1, 0x85}, {0xC1, 0x8C}, {0xC1, 0x8D}, /* 0xD0-0xD3 */ + {0xC1, 0x8E}, {0xC1, 0x90}, {0xC1, 0x94}, {0xC1, 0x96}, /* 0xD4-0xD7 */ + {0xC1, 0x9C}, {0xC1, 0x9D}, {0xC1, 0x9F}, {0xC1, 0xA1}, /* 0xD8-0xDB */ + {0xC1, 0xA5}, {0xC1, 0xA8}, {0xC1, 0xA9}, {0xC1, 0xAC}, /* 0xDC-0xDF */ + {0xC1, 0xB0}, {0xC1, 0xBD}, {0xC1, 0xC4}, {0xC1, 0xC8}, /* 0xE0-0xE3 */ + {0xC1, 0xCC}, {0xC1, 0xD4}, {0xC1, 0xD7}, {0xC1, 0xD8}, /* 0xE4-0xE7 */ + {0xC1, 0xE0}, {0xC1, 0xE4}, {0xC1, 0xE8}, {0xC1, 0xF0}, /* 0xE8-0xEB */ + {0xC1, 0xF1}, {0xC1, 0xF3}, {0xC1, 0xFC}, {0xC1, 0xFD}, /* 0xEC-0xEF */ + {0xC2, 0x00}, {0xC2, 0x04}, {0xC2, 0x0C}, {0xC2, 0x0D}, /* 0xF0-0xF3 */ + {0xC2, 0x0F}, {0xC2, 0x11}, {0xC2, 0x18}, {0xC2, 0x19}, /* 0xF4-0xF7 */ + {0xC2, 0x1C}, {0xC2, 0x1F}, {0xC2, 0x20}, {0xC2, 0x28}, /* 0xF8-0xFB */ + {0xC2, 0x29}, {0xC2, 0x2B}, {0xC2, 0x2D}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD3, 0xD7}, {0xD3, 0xD9}, {0xD3, 0xDA}, /* 0x40-0x43 */ + {0xD3, 0xDB}, {0xD3, 0xDC}, {0xD3, 0xDD}, {0xD3, 0xDE}, /* 0x44-0x47 */ + {0xD3, 0xDF}, {0xD3, 0xE0}, {0xD3, 0xE2}, {0xD3, 0xE4}, /* 0x48-0x4B */ + {0xD3, 0xE5}, {0xD3, 0xE6}, {0xD3, 0xE7}, {0xD3, 0xE8}, /* 0x4C-0x4F */ + {0xD3, 0xE9}, {0xD3, 0xEA}, {0xD3, 0xEB}, {0xD3, 0xEE}, /* 0x50-0x53 */ + {0xD3, 0xEF}, {0xD3, 0xF1}, {0xD3, 0xF2}, {0xD3, 0xF3}, /* 0x54-0x57 */ + {0xD3, 0xF5}, {0xD3, 0xF6}, {0xD3, 0xF7}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD3, 0xF8}, {0xD3, 0xF9}, {0xD3, 0xFA}, /* 0x60-0x63 */ + {0xD3, 0xFB}, {0xD3, 0xFE}, {0xD4, 0x00}, {0xD4, 0x02}, /* 0x64-0x67 */ + {0xD4, 0x03}, {0xD4, 0x04}, {0xD4, 0x05}, {0xD4, 0x06}, /* 0x68-0x6B */ + {0xD4, 0x07}, {0xD4, 0x09}, {0xD4, 0x0A}, {0xD4, 0x0B}, /* 0x6C-0x6F */ + {0xD4, 0x0C}, {0xD4, 0x0D}, {0xD4, 0x0E}, {0xD4, 0x0F}, /* 0x70-0x73 */ + {0xD4, 0x10}, {0xD4, 0x11}, {0xD4, 0x12}, {0xD4, 0x13}, /* 0x74-0x77 */ + {0xD4, 0x14}, {0xD4, 0x15}, {0xD4, 0x16}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD4, 0x17}, {0xD4, 0x18}, {0xD4, 0x19}, /* 0x80-0x83 */ + {0xD4, 0x1A}, {0xD4, 0x1B}, {0xD4, 0x1C}, {0xD4, 0x1E}, /* 0x84-0x87 */ + {0xD4, 0x1F}, {0xD4, 0x20}, {0xD4, 0x21}, {0xD4, 0x22}, /* 0x88-0x8B */ + {0xD4, 0x23}, {0xD4, 0x24}, {0xD4, 0x25}, {0xD4, 0x26}, /* 0x8C-0x8F */ + {0xD4, 0x27}, {0xD4, 0x28}, {0xD4, 0x29}, {0xD4, 0x2A}, /* 0x90-0x93 */ + {0xD4, 0x2B}, {0xD4, 0x2C}, {0xD4, 0x2D}, {0xD4, 0x2E}, /* 0x94-0x97 */ + {0xD4, 0x2F}, {0xD4, 0x30}, {0xD4, 0x31}, {0xD4, 0x32}, /* 0x98-0x9B */ + {0xD4, 0x33}, {0xD4, 0x34}, {0xD4, 0x35}, {0xD4, 0x36}, /* 0x9C-0x9F */ + {0xD4, 0x37}, {0xC2, 0x2F}, {0xC2, 0x31}, {0xC2, 0x32}, /* 0xA0-0xA3 */ + {0xC2, 0x34}, {0xC2, 0x48}, {0xC2, 0x50}, {0xC2, 0x51}, /* 0xA4-0xA7 */ + {0xC2, 0x54}, {0xC2, 0x58}, {0xC2, 0x60}, {0xC2, 0x65}, /* 0xA8-0xAB */ + {0xC2, 0x6C}, {0xC2, 0x6D}, {0xC2, 0x70}, {0xC2, 0x74}, /* 0xAC-0xAF */ + {0xC2, 0x7C}, {0xC2, 0x7D}, {0xC2, 0x7F}, {0xC2, 0x81}, /* 0xB0-0xB3 */ + {0xC2, 0x88}, {0xC2, 0x89}, {0xC2, 0x90}, {0xC2, 0x98}, /* 0xB4-0xB7 */ + {0xC2, 0x9B}, {0xC2, 0x9D}, {0xC2, 0xA4}, {0xC2, 0xA5}, /* 0xB8-0xBB */ + {0xC2, 0xA8}, {0xC2, 0xAC}, {0xC2, 0xAD}, {0xC2, 0xB4}, /* 0xBC-0xBF */ + {0xC2, 0xB5}, {0xC2, 0xB7}, {0xC2, 0xB9}, {0xC2, 0xDC}, /* 0xC0-0xC3 */ + {0xC2, 0xDD}, {0xC2, 0xE0}, {0xC2, 0xE3}, {0xC2, 0xE4}, /* 0xC4-0xC7 */ + {0xC2, 0xEB}, {0xC2, 0xEC}, {0xC2, 0xED}, {0xC2, 0xEF}, /* 0xC8-0xCB */ + {0xC2, 0xF1}, {0xC2, 0xF6}, {0xC2, 0xF8}, {0xC2, 0xF9}, /* 0xCC-0xCF */ + {0xC2, 0xFB}, {0xC2, 0xFC}, {0xC3, 0x00}, {0xC3, 0x08}, /* 0xD0-0xD3 */ + {0xC3, 0x09}, {0xC3, 0x0C}, {0xC3, 0x0D}, {0xC3, 0x13}, /* 0xD4-0xD7 */ + {0xC3, 0x14}, {0xC3, 0x15}, {0xC3, 0x18}, {0xC3, 0x1C}, /* 0xD8-0xDB */ + {0xC3, 0x24}, {0xC3, 0x25}, {0xC3, 0x28}, {0xC3, 0x29}, /* 0xDC-0xDF */ + {0xC3, 0x45}, {0xC3, 0x68}, {0xC3, 0x69}, {0xC3, 0x6C}, /* 0xE0-0xE3 */ + {0xC3, 0x70}, {0xC3, 0x72}, {0xC3, 0x78}, {0xC3, 0x79}, /* 0xE4-0xE7 */ + {0xC3, 0x7C}, {0xC3, 0x7D}, {0xC3, 0x84}, {0xC3, 0x88}, /* 0xE8-0xEB */ + {0xC3, 0x8C}, {0xC3, 0xC0}, {0xC3, 0xD8}, {0xC3, 0xD9}, /* 0xEC-0xEF */ + {0xC3, 0xDC}, {0xC3, 0xDF}, {0xC3, 0xE0}, {0xC3, 0xE2}, /* 0xF0-0xF3 */ + {0xC3, 0xE8}, {0xC3, 0xE9}, {0xC3, 0xED}, {0xC3, 0xF4}, /* 0xF4-0xF7 */ + {0xC3, 0xF5}, {0xC3, 0xF8}, {0xC4, 0x08}, {0xC4, 0x10}, /* 0xF8-0xFB */ + {0xC4, 0x24}, {0xC4, 0x2C}, {0xC4, 0x30}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD4, 0x38}, {0xD4, 0x39}, {0xD4, 0x3A}, /* 0x40-0x43 */ + {0xD4, 0x3B}, {0xD4, 0x3C}, {0xD4, 0x3D}, {0xD4, 0x3E}, /* 0x44-0x47 */ + {0xD4, 0x3F}, {0xD4, 0x41}, {0xD4, 0x42}, {0xD4, 0x43}, /* 0x48-0x4B */ + {0xD4, 0x45}, {0xD4, 0x46}, {0xD4, 0x47}, {0xD4, 0x48}, /* 0x4C-0x4F */ + {0xD4, 0x49}, {0xD4, 0x4A}, {0xD4, 0x4B}, {0xD4, 0x4C}, /* 0x50-0x53 */ + {0xD4, 0x4D}, {0xD4, 0x4E}, {0xD4, 0x4F}, {0xD4, 0x50}, /* 0x54-0x57 */ + {0xD4, 0x51}, {0xD4, 0x52}, {0xD4, 0x53}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD4, 0x54}, {0xD4, 0x55}, {0xD4, 0x56}, /* 0x60-0x63 */ + {0xD4, 0x57}, {0xD4, 0x58}, {0xD4, 0x59}, {0xD4, 0x5A}, /* 0x64-0x67 */ + {0xD4, 0x5B}, {0xD4, 0x5D}, {0xD4, 0x5E}, {0xD4, 0x5F}, /* 0x68-0x6B */ + {0xD4, 0x61}, {0xD4, 0x62}, {0xD4, 0x63}, {0xD4, 0x65}, /* 0x6C-0x6F */ + {0xD4, 0x66}, {0xD4, 0x67}, {0xD4, 0x68}, {0xD4, 0x69}, /* 0x70-0x73 */ + {0xD4, 0x6A}, {0xD4, 0x6B}, {0xD4, 0x6C}, {0xD4, 0x6E}, /* 0x74-0x77 */ + {0xD4, 0x70}, {0xD4, 0x71}, {0xD4, 0x72}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD4, 0x73}, {0xD4, 0x74}, {0xD4, 0x75}, /* 0x80-0x83 */ + {0xD4, 0x76}, {0xD4, 0x77}, {0xD4, 0x7A}, {0xD4, 0x7B}, /* 0x84-0x87 */ + {0xD4, 0x7D}, {0xD4, 0x7E}, {0xD4, 0x81}, {0xD4, 0x83}, /* 0x88-0x8B */ + {0xD4, 0x84}, {0xD4, 0x85}, {0xD4, 0x86}, {0xD4, 0x87}, /* 0x8C-0x8F */ + {0xD4, 0x8A}, {0xD4, 0x8C}, {0xD4, 0x8E}, {0xD4, 0x8F}, /* 0x90-0x93 */ + {0xD4, 0x90}, {0xD4, 0x91}, {0xD4, 0x92}, {0xD4, 0x93}, /* 0x94-0x97 */ + {0xD4, 0x95}, {0xD4, 0x96}, {0xD4, 0x97}, {0xD4, 0x98}, /* 0x98-0x9B */ + {0xD4, 0x99}, {0xD4, 0x9A}, {0xD4, 0x9B}, {0xD4, 0x9C}, /* 0x9C-0x9F */ + {0xD4, 0x9D}, {0xC4, 0x34}, {0xC4, 0x3C}, {0xC4, 0x3D}, /* 0xA0-0xA3 */ + {0xC4, 0x48}, {0xC4, 0x64}, {0xC4, 0x65}, {0xC4, 0x68}, /* 0xA4-0xA7 */ + {0xC4, 0x6C}, {0xC4, 0x74}, {0xC4, 0x75}, {0xC4, 0x79}, /* 0xA8-0xAB */ + {0xC4, 0x80}, {0xC4, 0x94}, {0xC4, 0x9C}, {0xC4, 0xB8}, /* 0xAC-0xAF */ + {0xC4, 0xBC}, {0xC4, 0xE9}, {0xC4, 0xF0}, {0xC4, 0xF1}, /* 0xB0-0xB3 */ + {0xC4, 0xF4}, {0xC4, 0xF8}, {0xC4, 0xFA}, {0xC4, 0xFF}, /* 0xB4-0xB7 */ + {0xC5, 0x00}, {0xC5, 0x01}, {0xC5, 0x0C}, {0xC5, 0x10}, /* 0xB8-0xBB */ + {0xC5, 0x14}, {0xC5, 0x1C}, {0xC5, 0x28}, {0xC5, 0x29}, /* 0xBC-0xBF */ + {0xC5, 0x2C}, {0xC5, 0x30}, {0xC5, 0x38}, {0xC5, 0x39}, /* 0xC0-0xC3 */ + {0xC5, 0x3B}, {0xC5, 0x3D}, {0xC5, 0x44}, {0xC5, 0x45}, /* 0xC4-0xC7 */ + {0xC5, 0x48}, {0xC5, 0x49}, {0xC5, 0x4A}, {0xC5, 0x4C}, /* 0xC8-0xCB */ + {0xC5, 0x4D}, {0xC5, 0x4E}, {0xC5, 0x53}, {0xC5, 0x54}, /* 0xCC-0xCF */ + {0xC5, 0x55}, {0xC5, 0x57}, {0xC5, 0x58}, {0xC5, 0x59}, /* 0xD0-0xD3 */ + {0xC5, 0x5D}, {0xC5, 0x5E}, {0xC5, 0x60}, {0xC5, 0x61}, /* 0xD4-0xD7 */ + {0xC5, 0x64}, {0xC5, 0x68}, {0xC5, 0x70}, {0xC5, 0x71}, /* 0xD8-0xDB */ + {0xC5, 0x73}, {0xC5, 0x74}, {0xC5, 0x75}, {0xC5, 0x7C}, /* 0xDC-0xDF */ + {0xC5, 0x7D}, {0xC5, 0x80}, {0xC5, 0x84}, {0xC5, 0x87}, /* 0xE0-0xE3 */ + {0xC5, 0x8C}, {0xC5, 0x8D}, {0xC5, 0x8F}, {0xC5, 0x91}, /* 0xE4-0xE7 */ + {0xC5, 0x95}, {0xC5, 0x97}, {0xC5, 0x98}, {0xC5, 0x9C}, /* 0xE8-0xEB */ + {0xC5, 0xA0}, {0xC5, 0xA9}, {0xC5, 0xB4}, {0xC5, 0xB5}, /* 0xEC-0xEF */ + {0xC5, 0xB8}, {0xC5, 0xB9}, {0xC5, 0xBB}, {0xC5, 0xBC}, /* 0xF0-0xF3 */ + {0xC5, 0xBD}, {0xC5, 0xBE}, {0xC5, 0xC4}, {0xC5, 0xC5}, /* 0xF4-0xF7 */ + {0xC5, 0xC6}, {0xC5, 0xC7}, {0xC5, 0xC8}, {0xC5, 0xC9}, /* 0xF8-0xFB */ + {0xC5, 0xCA}, {0xC5, 0xCC}, {0xC5, 0xCE}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD4, 0x9E}, {0xD4, 0x9F}, {0xD4, 0xA0}, /* 0x40-0x43 */ + {0xD4, 0xA1}, {0xD4, 0xA2}, {0xD4, 0xA3}, {0xD4, 0xA4}, /* 0x44-0x47 */ + {0xD4, 0xA5}, {0xD4, 0xA6}, {0xD4, 0xA7}, {0xD4, 0xA8}, /* 0x48-0x4B */ + {0xD4, 0xAA}, {0xD4, 0xAB}, {0xD4, 0xAC}, {0xD4, 0xAD}, /* 0x4C-0x4F */ + {0xD4, 0xAE}, {0xD4, 0xAF}, {0xD4, 0xB0}, {0xD4, 0xB1}, /* 0x50-0x53 */ + {0xD4, 0xB2}, {0xD4, 0xB3}, {0xD4, 0xB4}, {0xD4, 0xB5}, /* 0x54-0x57 */ + {0xD4, 0xB6}, {0xD4, 0xB7}, {0xD4, 0xB8}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD4, 0xB9}, {0xD4, 0xBA}, {0xD4, 0xBB}, /* 0x60-0x63 */ + {0xD4, 0xBC}, {0xD4, 0xBD}, {0xD4, 0xBE}, {0xD4, 0xBF}, /* 0x64-0x67 */ + {0xD4, 0xC0}, {0xD4, 0xC1}, {0xD4, 0xC2}, {0xD4, 0xC3}, /* 0x68-0x6B */ + {0xD4, 0xC4}, {0xD4, 0xC5}, {0xD4, 0xC6}, {0xD4, 0xC7}, /* 0x6C-0x6F */ + {0xD4, 0xC8}, {0xD4, 0xC9}, {0xD4, 0xCA}, {0xD4, 0xCB}, /* 0x70-0x73 */ + {0xD4, 0xCD}, {0xD4, 0xCE}, {0xD4, 0xCF}, {0xD4, 0xD1}, /* 0x74-0x77 */ + {0xD4, 0xD2}, {0xD4, 0xD3}, {0xD4, 0xD5}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD4, 0xD6}, {0xD4, 0xD7}, {0xD4, 0xD8}, /* 0x80-0x83 */ + {0xD4, 0xD9}, {0xD4, 0xDA}, {0xD4, 0xDB}, {0xD4, 0xDD}, /* 0x84-0x87 */ + {0xD4, 0xDE}, {0xD4, 0xE0}, {0xD4, 0xE1}, {0xD4, 0xE2}, /* 0x88-0x8B */ + {0xD4, 0xE3}, {0xD4, 0xE4}, {0xD4, 0xE5}, {0xD4, 0xE6}, /* 0x8C-0x8F */ + {0xD4, 0xE7}, {0xD4, 0xE9}, {0xD4, 0xEA}, {0xD4, 0xEB}, /* 0x90-0x93 */ + {0xD4, 0xED}, {0xD4, 0xEE}, {0xD4, 0xEF}, {0xD4, 0xF1}, /* 0x94-0x97 */ + {0xD4, 0xF2}, {0xD4, 0xF3}, {0xD4, 0xF4}, {0xD4, 0xF5}, /* 0x98-0x9B */ + {0xD4, 0xF6}, {0xD4, 0xF7}, {0xD4, 0xF9}, {0xD4, 0xFA}, /* 0x9C-0x9F */ + {0xD4, 0xFC}, {0xC5, 0xD0}, {0xC5, 0xD1}, {0xC5, 0xD4}, /* 0xA0-0xA3 */ + {0xC5, 0xD8}, {0xC5, 0xE0}, {0xC5, 0xE1}, {0xC5, 0xE3}, /* 0xA4-0xA7 */ + {0xC5, 0xE5}, {0xC5, 0xEC}, {0xC5, 0xED}, {0xC5, 0xEE}, /* 0xA8-0xAB */ + {0xC5, 0xF0}, {0xC5, 0xF4}, {0xC5, 0xF6}, {0xC5, 0xF7}, /* 0xAC-0xAF */ + {0xC5, 0xFC}, {0xC5, 0xFD}, {0xC5, 0xFE}, {0xC5, 0xFF}, /* 0xB0-0xB3 */ + {0xC6, 0x00}, {0xC6, 0x01}, {0xC6, 0x05}, {0xC6, 0x06}, /* 0xB4-0xB7 */ + {0xC6, 0x07}, {0xC6, 0x08}, {0xC6, 0x0C}, {0xC6, 0x10}, /* 0xB8-0xBB */ + {0xC6, 0x18}, {0xC6, 0x19}, {0xC6, 0x1B}, {0xC6, 0x1C}, /* 0xBC-0xBF */ + {0xC6, 0x24}, {0xC6, 0x25}, {0xC6, 0x28}, {0xC6, 0x2C}, /* 0xC0-0xC3 */ + {0xC6, 0x2D}, {0xC6, 0x2E}, {0xC6, 0x30}, {0xC6, 0x33}, /* 0xC4-0xC7 */ + {0xC6, 0x34}, {0xC6, 0x35}, {0xC6, 0x37}, {0xC6, 0x39}, /* 0xC8-0xCB */ + {0xC6, 0x3B}, {0xC6, 0x40}, {0xC6, 0x41}, {0xC6, 0x44}, /* 0xCC-0xCF */ + {0xC6, 0x48}, {0xC6, 0x50}, {0xC6, 0x51}, {0xC6, 0x53}, /* 0xD0-0xD3 */ + {0xC6, 0x54}, {0xC6, 0x55}, {0xC6, 0x5C}, {0xC6, 0x5D}, /* 0xD4-0xD7 */ + {0xC6, 0x60}, {0xC6, 0x6C}, {0xC6, 0x6F}, {0xC6, 0x71}, /* 0xD8-0xDB */ + {0xC6, 0x78}, {0xC6, 0x79}, {0xC6, 0x7C}, {0xC6, 0x80}, /* 0xDC-0xDF */ + {0xC6, 0x88}, {0xC6, 0x89}, {0xC6, 0x8B}, {0xC6, 0x8D}, /* 0xE0-0xE3 */ + {0xC6, 0x94}, {0xC6, 0x95}, {0xC6, 0x98}, {0xC6, 0x9C}, /* 0xE4-0xE7 */ + {0xC6, 0xA4}, {0xC6, 0xA5}, {0xC6, 0xA7}, {0xC6, 0xA9}, /* 0xE8-0xEB */ + {0xC6, 0xB0}, {0xC6, 0xB1}, {0xC6, 0xB4}, {0xC6, 0xB8}, /* 0xEC-0xEF */ + {0xC6, 0xB9}, {0xC6, 0xBA}, {0xC6, 0xC0}, {0xC6, 0xC1}, /* 0xF0-0xF3 */ + {0xC6, 0xC3}, {0xC6, 0xC5}, {0xC6, 0xCC}, {0xC6, 0xCD}, /* 0xF4-0xF7 */ + {0xC6, 0xD0}, {0xC6, 0xD4}, {0xC6, 0xDC}, {0xC6, 0xDD}, /* 0xF8-0xFB */ + {0xC6, 0xE0}, {0xC6, 0xE1}, {0xC6, 0xE8}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD4, 0xFE}, {0xD4, 0xFF}, {0xD5, 0x00}, /* 0x40-0x43 */ + {0xD5, 0x01}, {0xD5, 0x02}, {0xD5, 0x03}, {0xD5, 0x05}, /* 0x44-0x47 */ + {0xD5, 0x06}, {0xD5, 0x07}, {0xD5, 0x09}, {0xD5, 0x0A}, /* 0x48-0x4B */ + {0xD5, 0x0B}, {0xD5, 0x0D}, {0xD5, 0x0E}, {0xD5, 0x0F}, /* 0x4C-0x4F */ + {0xD5, 0x10}, {0xD5, 0x11}, {0xD5, 0x12}, {0xD5, 0x13}, /* 0x50-0x53 */ + {0xD5, 0x16}, {0xD5, 0x18}, {0xD5, 0x19}, {0xD5, 0x1A}, /* 0x54-0x57 */ + {0xD5, 0x1B}, {0xD5, 0x1C}, {0xD5, 0x1D}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD5, 0x1E}, {0xD5, 0x1F}, {0xD5, 0x20}, /* 0x60-0x63 */ + {0xD5, 0x21}, {0xD5, 0x22}, {0xD5, 0x23}, {0xD5, 0x24}, /* 0x64-0x67 */ + {0xD5, 0x25}, {0xD5, 0x26}, {0xD5, 0x27}, {0xD5, 0x28}, /* 0x68-0x6B */ + {0xD5, 0x29}, {0xD5, 0x2A}, {0xD5, 0x2B}, {0xD5, 0x2C}, /* 0x6C-0x6F */ + {0xD5, 0x2D}, {0xD5, 0x2E}, {0xD5, 0x2F}, {0xD5, 0x30}, /* 0x70-0x73 */ + {0xD5, 0x31}, {0xD5, 0x32}, {0xD5, 0x33}, {0xD5, 0x34}, /* 0x74-0x77 */ + {0xD5, 0x35}, {0xD5, 0x36}, {0xD5, 0x37}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD5, 0x38}, {0xD5, 0x39}, {0xD5, 0x3A}, /* 0x80-0x83 */ + {0xD5, 0x3B}, {0xD5, 0x3E}, {0xD5, 0x3F}, {0xD5, 0x41}, /* 0x84-0x87 */ + {0xD5, 0x42}, {0xD5, 0x43}, {0xD5, 0x45}, {0xD5, 0x46}, /* 0x88-0x8B */ + {0xD5, 0x47}, {0xD5, 0x48}, {0xD5, 0x49}, {0xD5, 0x4A}, /* 0x8C-0x8F */ + {0xD5, 0x4B}, {0xD5, 0x4E}, {0xD5, 0x50}, {0xD5, 0x52}, /* 0x90-0x93 */ + {0xD5, 0x53}, {0xD5, 0x54}, {0xD5, 0x55}, {0xD5, 0x56}, /* 0x94-0x97 */ + {0xD5, 0x57}, {0xD5, 0x5A}, {0xD5, 0x5B}, {0xD5, 0x5D}, /* 0x98-0x9B */ + {0xD5, 0x5E}, {0xD5, 0x5F}, {0xD5, 0x61}, {0xD5, 0x62}, /* 0x9C-0x9F */ + {0xD5, 0x63}, {0xC6, 0xE9}, {0xC6, 0xEC}, {0xC6, 0xF0}, /* 0xA0-0xA3 */ + {0xC6, 0xF8}, {0xC6, 0xF9}, {0xC6, 0xFD}, {0xC7, 0x04}, /* 0xA4-0xA7 */ + {0xC7, 0x05}, {0xC7, 0x08}, {0xC7, 0x0C}, {0xC7, 0x14}, /* 0xA8-0xAB */ + {0xC7, 0x15}, {0xC7, 0x17}, {0xC7, 0x19}, {0xC7, 0x20}, /* 0xAC-0xAF */ + {0xC7, 0x21}, {0xC7, 0x24}, {0xC7, 0x28}, {0xC7, 0x30}, /* 0xB0-0xB3 */ + {0xC7, 0x31}, {0xC7, 0x33}, {0xC7, 0x35}, {0xC7, 0x37}, /* 0xB4-0xB7 */ + {0xC7, 0x3C}, {0xC7, 0x3D}, {0xC7, 0x40}, {0xC7, 0x44}, /* 0xB8-0xBB */ + {0xC7, 0x4A}, {0xC7, 0x4C}, {0xC7, 0x4D}, {0xC7, 0x4F}, /* 0xBC-0xBF */ + {0xC7, 0x51}, {0xC7, 0x52}, {0xC7, 0x53}, {0xC7, 0x54}, /* 0xC0-0xC3 */ + {0xC7, 0x55}, {0xC7, 0x56}, {0xC7, 0x57}, {0xC7, 0x58}, /* 0xC4-0xC7 */ + {0xC7, 0x5C}, {0xC7, 0x60}, {0xC7, 0x68}, {0xC7, 0x6B}, /* 0xC8-0xCB */ + {0xC7, 0x74}, {0xC7, 0x75}, {0xC7, 0x78}, {0xC7, 0x7C}, /* 0xCC-0xCF */ + {0xC7, 0x7D}, {0xC7, 0x7E}, {0xC7, 0x83}, {0xC7, 0x84}, /* 0xD0-0xD3 */ + {0xC7, 0x85}, {0xC7, 0x87}, {0xC7, 0x88}, {0xC7, 0x89}, /* 0xD4-0xD7 */ + {0xC7, 0x8A}, {0xC7, 0x8E}, {0xC7, 0x90}, {0xC7, 0x91}, /* 0xD8-0xDB */ + {0xC7, 0x94}, {0xC7, 0x96}, {0xC7, 0x97}, {0xC7, 0x98}, /* 0xDC-0xDF */ + {0xC7, 0x9A}, {0xC7, 0xA0}, {0xC7, 0xA1}, {0xC7, 0xA3}, /* 0xE0-0xE3 */ + {0xC7, 0xA4}, {0xC7, 0xA5}, {0xC7, 0xA6}, {0xC7, 0xAC}, /* 0xE4-0xE7 */ + {0xC7, 0xAD}, {0xC7, 0xB0}, {0xC7, 0xB4}, {0xC7, 0xBC}, /* 0xE8-0xEB */ + {0xC7, 0xBD}, {0xC7, 0xBF}, {0xC7, 0xC0}, {0xC7, 0xC1}, /* 0xEC-0xEF */ + {0xC7, 0xC8}, {0xC7, 0xC9}, {0xC7, 0xCC}, {0xC7, 0xCE}, /* 0xF0-0xF3 */ + {0xC7, 0xD0}, {0xC7, 0xD8}, {0xC7, 0xDD}, {0xC7, 0xE4}, /* 0xF4-0xF7 */ + {0xC7, 0xE8}, {0xC7, 0xEC}, {0xC8, 0x00}, {0xC8, 0x01}, /* 0xF8-0xFB */ + {0xC8, 0x04}, {0xC8, 0x08}, {0xC8, 0x0A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD5, 0x64}, {0xD5, 0x66}, {0xD5, 0x67}, /* 0x40-0x43 */ + {0xD5, 0x6A}, {0xD5, 0x6C}, {0xD5, 0x6E}, {0xD5, 0x6F}, /* 0x44-0x47 */ + {0xD5, 0x70}, {0xD5, 0x71}, {0xD5, 0x72}, {0xD5, 0x73}, /* 0x48-0x4B */ + {0xD5, 0x76}, {0xD5, 0x77}, {0xD5, 0x79}, {0xD5, 0x7A}, /* 0x4C-0x4F */ + {0xD5, 0x7B}, {0xD5, 0x7D}, {0xD5, 0x7E}, {0xD5, 0x7F}, /* 0x50-0x53 */ + {0xD5, 0x80}, {0xD5, 0x81}, {0xD5, 0x82}, {0xD5, 0x83}, /* 0x54-0x57 */ + {0xD5, 0x86}, {0xD5, 0x8A}, {0xD5, 0x8B}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD5, 0x8C}, {0xD5, 0x8D}, {0xD5, 0x8E}, /* 0x60-0x63 */ + {0xD5, 0x8F}, {0xD5, 0x91}, {0xD5, 0x92}, {0xD5, 0x93}, /* 0x64-0x67 */ + {0xD5, 0x94}, {0xD5, 0x95}, {0xD5, 0x96}, {0xD5, 0x97}, /* 0x68-0x6B */ + {0xD5, 0x98}, {0xD5, 0x99}, {0xD5, 0x9A}, {0xD5, 0x9B}, /* 0x6C-0x6F */ + {0xD5, 0x9C}, {0xD5, 0x9D}, {0xD5, 0x9E}, {0xD5, 0x9F}, /* 0x70-0x73 */ + {0xD5, 0xA0}, {0xD5, 0xA1}, {0xD5, 0xA2}, {0xD5, 0xA3}, /* 0x74-0x77 */ + {0xD5, 0xA4}, {0xD5, 0xA6}, {0xD5, 0xA7}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD5, 0xA8}, {0xD5, 0xA9}, {0xD5, 0xAA}, /* 0x80-0x83 */ + {0xD5, 0xAB}, {0xD5, 0xAC}, {0xD5, 0xAD}, {0xD5, 0xAE}, /* 0x84-0x87 */ + {0xD5, 0xAF}, {0xD5, 0xB0}, {0xD5, 0xB1}, {0xD5, 0xB2}, /* 0x88-0x8B */ + {0xD5, 0xB3}, {0xD5, 0xB4}, {0xD5, 0xB5}, {0xD5, 0xB6}, /* 0x8C-0x8F */ + {0xD5, 0xB7}, {0xD5, 0xB8}, {0xD5, 0xB9}, {0xD5, 0xBA}, /* 0x90-0x93 */ + {0xD5, 0xBB}, {0xD5, 0xBC}, {0xD5, 0xBD}, {0xD5, 0xBE}, /* 0x94-0x97 */ + {0xD5, 0xBF}, {0xD5, 0xC0}, {0xD5, 0xC1}, {0xD5, 0xC2}, /* 0x98-0x9B */ + {0xD5, 0xC3}, {0xD5, 0xC4}, {0xD5, 0xC5}, {0xD5, 0xC6}, /* 0x9C-0x9F */ + {0xD5, 0xC7}, {0xC8, 0x10}, {0xC8, 0x11}, {0xC8, 0x13}, /* 0xA0-0xA3 */ + {0xC8, 0x15}, {0xC8, 0x16}, {0xC8, 0x1C}, {0xC8, 0x1D}, /* 0xA4-0xA7 */ + {0xC8, 0x20}, {0xC8, 0x24}, {0xC8, 0x2C}, {0xC8, 0x2D}, /* 0xA8-0xAB */ + {0xC8, 0x2F}, {0xC8, 0x31}, {0xC8, 0x38}, {0xC8, 0x3C}, /* 0xAC-0xAF */ + {0xC8, 0x40}, {0xC8, 0x48}, {0xC8, 0x49}, {0xC8, 0x4C}, /* 0xB0-0xB3 */ + {0xC8, 0x4D}, {0xC8, 0x54}, {0xC8, 0x70}, {0xC8, 0x71}, /* 0xB4-0xB7 */ + {0xC8, 0x74}, {0xC8, 0x78}, {0xC8, 0x7A}, {0xC8, 0x80}, /* 0xB8-0xBB */ + {0xC8, 0x81}, {0xC8, 0x83}, {0xC8, 0x85}, {0xC8, 0x86}, /* 0xBC-0xBF */ + {0xC8, 0x87}, {0xC8, 0x8B}, {0xC8, 0x8C}, {0xC8, 0x8D}, /* 0xC0-0xC3 */ + {0xC8, 0x94}, {0xC8, 0x9D}, {0xC8, 0x9F}, {0xC8, 0xA1}, /* 0xC4-0xC7 */ + {0xC8, 0xA8}, {0xC8, 0xBC}, {0xC8, 0xBD}, {0xC8, 0xC4}, /* 0xC8-0xCB */ + {0xC8, 0xC8}, {0xC8, 0xCC}, {0xC8, 0xD4}, {0xC8, 0xD5}, /* 0xCC-0xCF */ + {0xC8, 0xD7}, {0xC8, 0xD9}, {0xC8, 0xE0}, {0xC8, 0xE1}, /* 0xD0-0xD3 */ + {0xC8, 0xE4}, {0xC8, 0xF5}, {0xC8, 0xFC}, {0xC8, 0xFD}, /* 0xD4-0xD7 */ + {0xC9, 0x00}, {0xC9, 0x04}, {0xC9, 0x05}, {0xC9, 0x06}, /* 0xD8-0xDB */ + {0xC9, 0x0C}, {0xC9, 0x0D}, {0xC9, 0x0F}, {0xC9, 0x11}, /* 0xDC-0xDF */ + {0xC9, 0x18}, {0xC9, 0x2C}, {0xC9, 0x34}, {0xC9, 0x50}, /* 0xE0-0xE3 */ + {0xC9, 0x51}, {0xC9, 0x54}, {0xC9, 0x58}, {0xC9, 0x60}, /* 0xE4-0xE7 */ + {0xC9, 0x61}, {0xC9, 0x63}, {0xC9, 0x6C}, {0xC9, 0x70}, /* 0xE8-0xEB */ + {0xC9, 0x74}, {0xC9, 0x7C}, {0xC9, 0x88}, {0xC9, 0x89}, /* 0xEC-0xEF */ + {0xC9, 0x8C}, {0xC9, 0x90}, {0xC9, 0x98}, {0xC9, 0x99}, /* 0xF0-0xF3 */ + {0xC9, 0x9B}, {0xC9, 0x9D}, {0xC9, 0xC0}, {0xC9, 0xC1}, /* 0xF4-0xF7 */ + {0xC9, 0xC4}, {0xC9, 0xC7}, {0xC9, 0xC8}, {0xC9, 0xCA}, /* 0xF8-0xFB */ + {0xC9, 0xD0}, {0xC9, 0xD1}, {0xC9, 0xD3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD5, 0xCA}, {0xD5, 0xCB}, {0xD5, 0xCD}, /* 0x40-0x43 */ + {0xD5, 0xCE}, {0xD5, 0xCF}, {0xD5, 0xD1}, {0xD5, 0xD3}, /* 0x44-0x47 */ + {0xD5, 0xD4}, {0xD5, 0xD5}, {0xD5, 0xD6}, {0xD5, 0xD7}, /* 0x48-0x4B */ + {0xD5, 0xDA}, {0xD5, 0xDC}, {0xD5, 0xDE}, {0xD5, 0xDF}, /* 0x4C-0x4F */ + {0xD5, 0xE0}, {0xD5, 0xE1}, {0xD5, 0xE2}, {0xD5, 0xE3}, /* 0x50-0x53 */ + {0xD5, 0xE6}, {0xD5, 0xE7}, {0xD5, 0xE9}, {0xD5, 0xEA}, /* 0x54-0x57 */ + {0xD5, 0xEB}, {0xD5, 0xED}, {0xD5, 0xEE}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD5, 0xEF}, {0xD5, 0xF0}, {0xD5, 0xF1}, /* 0x60-0x63 */ + {0xD5, 0xF2}, {0xD5, 0xF3}, {0xD5, 0xF6}, {0xD5, 0xF8}, /* 0x64-0x67 */ + {0xD5, 0xFA}, {0xD5, 0xFB}, {0xD5, 0xFC}, {0xD5, 0xFD}, /* 0x68-0x6B */ + {0xD5, 0xFE}, {0xD5, 0xFF}, {0xD6, 0x02}, {0xD6, 0x03}, /* 0x6C-0x6F */ + {0xD6, 0x05}, {0xD6, 0x06}, {0xD6, 0x07}, {0xD6, 0x09}, /* 0x70-0x73 */ + {0xD6, 0x0A}, {0xD6, 0x0B}, {0xD6, 0x0C}, {0xD6, 0x0D}, /* 0x74-0x77 */ + {0xD6, 0x0E}, {0xD6, 0x0F}, {0xD6, 0x12}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD6, 0x16}, {0xD6, 0x17}, {0xD6, 0x18}, /* 0x80-0x83 */ + {0xD6, 0x19}, {0xD6, 0x1A}, {0xD6, 0x1B}, {0xD6, 0x1D}, /* 0x84-0x87 */ + {0xD6, 0x1E}, {0xD6, 0x1F}, {0xD6, 0x21}, {0xD6, 0x22}, /* 0x88-0x8B */ + {0xD6, 0x23}, {0xD6, 0x25}, {0xD6, 0x26}, {0xD6, 0x27}, /* 0x8C-0x8F */ + {0xD6, 0x28}, {0xD6, 0x29}, {0xD6, 0x2A}, {0xD6, 0x2B}, /* 0x90-0x93 */ + {0xD6, 0x2C}, {0xD6, 0x2E}, {0xD6, 0x2F}, {0xD6, 0x30}, /* 0x94-0x97 */ + {0xD6, 0x31}, {0xD6, 0x32}, {0xD6, 0x33}, {0xD6, 0x34}, /* 0x98-0x9B */ + {0xD6, 0x35}, {0xD6, 0x36}, {0xD6, 0x37}, {0xD6, 0x3A}, /* 0x9C-0x9F */ + {0xD6, 0x3B}, {0xC9, 0xD5}, {0xC9, 0xD6}, {0xC9, 0xD9}, /* 0xA0-0xA3 */ + {0xC9, 0xDA}, {0xC9, 0xDC}, {0xC9, 0xDD}, {0xC9, 0xE0}, /* 0xA4-0xA7 */ + {0xC9, 0xE2}, {0xC9, 0xE4}, {0xC9, 0xE7}, {0xC9, 0xEC}, /* 0xA8-0xAB */ + {0xC9, 0xED}, {0xC9, 0xEF}, {0xC9, 0xF0}, {0xC9, 0xF1}, /* 0xAC-0xAF */ + {0xC9, 0xF8}, {0xC9, 0xF9}, {0xC9, 0xFC}, {0xCA, 0x00}, /* 0xB0-0xB3 */ + {0xCA, 0x08}, {0xCA, 0x09}, {0xCA, 0x0B}, {0xCA, 0x0C}, /* 0xB4-0xB7 */ + {0xCA, 0x0D}, {0xCA, 0x14}, {0xCA, 0x18}, {0xCA, 0x29}, /* 0xB8-0xBB */ + {0xCA, 0x4C}, {0xCA, 0x4D}, {0xCA, 0x50}, {0xCA, 0x54}, /* 0xBC-0xBF */ + {0xCA, 0x5C}, {0xCA, 0x5D}, {0xCA, 0x5F}, {0xCA, 0x60}, /* 0xC0-0xC3 */ + {0xCA, 0x61}, {0xCA, 0x68}, {0xCA, 0x7D}, {0xCA, 0x84}, /* 0xC4-0xC7 */ + {0xCA, 0x98}, {0xCA, 0xBC}, {0xCA, 0xBD}, {0xCA, 0xC0}, /* 0xC8-0xCB */ + {0xCA, 0xC4}, {0xCA, 0xCC}, {0xCA, 0xCD}, {0xCA, 0xCF}, /* 0xCC-0xCF */ + {0xCA, 0xD1}, {0xCA, 0xD3}, {0xCA, 0xD8}, {0xCA, 0xD9}, /* 0xD0-0xD3 */ + {0xCA, 0xE0}, {0xCA, 0xEC}, {0xCA, 0xF4}, {0xCB, 0x08}, /* 0xD4-0xD7 */ + {0xCB, 0x10}, {0xCB, 0x14}, {0xCB, 0x18}, {0xCB, 0x20}, /* 0xD8-0xDB */ + {0xCB, 0x21}, {0xCB, 0x41}, {0xCB, 0x48}, {0xCB, 0x49}, /* 0xDC-0xDF */ + {0xCB, 0x4C}, {0xCB, 0x50}, {0xCB, 0x58}, {0xCB, 0x59}, /* 0xE0-0xE3 */ + {0xCB, 0x5D}, {0xCB, 0x64}, {0xCB, 0x78}, {0xCB, 0x79}, /* 0xE4-0xE7 */ + {0xCB, 0x9C}, {0xCB, 0xB8}, {0xCB, 0xD4}, {0xCB, 0xE4}, /* 0xE8-0xEB */ + {0xCB, 0xE7}, {0xCB, 0xE9}, {0xCC, 0x0C}, {0xCC, 0x0D}, /* 0xEC-0xEF */ + {0xCC, 0x10}, {0xCC, 0x14}, {0xCC, 0x1C}, {0xCC, 0x1D}, /* 0xF0-0xF3 */ + {0xCC, 0x21}, {0xCC, 0x22}, {0xCC, 0x27}, {0xCC, 0x28}, /* 0xF4-0xF7 */ + {0xCC, 0x29}, {0xCC, 0x2C}, {0xCC, 0x2E}, {0xCC, 0x30}, /* 0xF8-0xFB */ + {0xCC, 0x38}, {0xCC, 0x39}, {0xCC, 0x3B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD6, 0x3D}, {0xD6, 0x3E}, {0xD6, 0x3F}, /* 0x40-0x43 */ + {0xD6, 0x41}, {0xD6, 0x42}, {0xD6, 0x43}, {0xD6, 0x44}, /* 0x44-0x47 */ + {0xD6, 0x46}, {0xD6, 0x47}, {0xD6, 0x4A}, {0xD6, 0x4C}, /* 0x48-0x4B */ + {0xD6, 0x4E}, {0xD6, 0x4F}, {0xD6, 0x50}, {0xD6, 0x52}, /* 0x4C-0x4F */ + {0xD6, 0x53}, {0xD6, 0x56}, {0xD6, 0x57}, {0xD6, 0x59}, /* 0x50-0x53 */ + {0xD6, 0x5A}, {0xD6, 0x5B}, {0xD6, 0x5D}, {0xD6, 0x5E}, /* 0x54-0x57 */ + {0xD6, 0x5F}, {0xD6, 0x60}, {0xD6, 0x61}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD6, 0x62}, {0xD6, 0x63}, {0xD6, 0x64}, /* 0x60-0x63 */ + {0xD6, 0x65}, {0xD6, 0x66}, {0xD6, 0x68}, {0xD6, 0x6A}, /* 0x64-0x67 */ + {0xD6, 0x6B}, {0xD6, 0x6C}, {0xD6, 0x6D}, {0xD6, 0x6E}, /* 0x68-0x6B */ + {0xD6, 0x6F}, {0xD6, 0x72}, {0xD6, 0x73}, {0xD6, 0x75}, /* 0x6C-0x6F */ + {0xD6, 0x76}, {0xD6, 0x77}, {0xD6, 0x78}, {0xD6, 0x79}, /* 0x70-0x73 */ + {0xD6, 0x7A}, {0xD6, 0x7B}, {0xD6, 0x7C}, {0xD6, 0x7D}, /* 0x74-0x77 */ + {0xD6, 0x7E}, {0xD6, 0x7F}, {0xD6, 0x80}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD6, 0x81}, {0xD6, 0x82}, {0xD6, 0x84}, /* 0x80-0x83 */ + {0xD6, 0x86}, {0xD6, 0x87}, {0xD6, 0x88}, {0xD6, 0x89}, /* 0x84-0x87 */ + {0xD6, 0x8A}, {0xD6, 0x8B}, {0xD6, 0x8E}, {0xD6, 0x8F}, /* 0x88-0x8B */ + {0xD6, 0x91}, {0xD6, 0x92}, {0xD6, 0x93}, {0xD6, 0x95}, /* 0x8C-0x8F */ + {0xD6, 0x96}, {0xD6, 0x97}, {0xD6, 0x98}, {0xD6, 0x99}, /* 0x90-0x93 */ + {0xD6, 0x9A}, {0xD6, 0x9B}, {0xD6, 0x9C}, {0xD6, 0x9E}, /* 0x94-0x97 */ + {0xD6, 0xA0}, {0xD6, 0xA2}, {0xD6, 0xA3}, {0xD6, 0xA4}, /* 0x98-0x9B */ + {0xD6, 0xA5}, {0xD6, 0xA6}, {0xD6, 0xA7}, {0xD6, 0xA9}, /* 0x9C-0x9F */ + {0xD6, 0xAA}, {0xCC, 0x3C}, {0xCC, 0x3D}, {0xCC, 0x3E}, /* 0xA0-0xA3 */ + {0xCC, 0x44}, {0xCC, 0x45}, {0xCC, 0x48}, {0xCC, 0x4C}, /* 0xA4-0xA7 */ + {0xCC, 0x54}, {0xCC, 0x55}, {0xCC, 0x57}, {0xCC, 0x58}, /* 0xA8-0xAB */ + {0xCC, 0x59}, {0xCC, 0x60}, {0xCC, 0x64}, {0xCC, 0x66}, /* 0xAC-0xAF */ + {0xCC, 0x68}, {0xCC, 0x70}, {0xCC, 0x75}, {0xCC, 0x98}, /* 0xB0-0xB3 */ + {0xCC, 0x99}, {0xCC, 0x9C}, {0xCC, 0xA0}, {0xCC, 0xA8}, /* 0xB4-0xB7 */ + {0xCC, 0xA9}, {0xCC, 0xAB}, {0xCC, 0xAC}, {0xCC, 0xAD}, /* 0xB8-0xBB */ + {0xCC, 0xB4}, {0xCC, 0xB5}, {0xCC, 0xB8}, {0xCC, 0xBC}, /* 0xBC-0xBF */ + {0xCC, 0xC4}, {0xCC, 0xC5}, {0xCC, 0xC7}, {0xCC, 0xC9}, /* 0xC0-0xC3 */ + {0xCC, 0xD0}, {0xCC, 0xD4}, {0xCC, 0xE4}, {0xCC, 0xEC}, /* 0xC4-0xC7 */ + {0xCC, 0xF0}, {0xCD, 0x01}, {0xCD, 0x08}, {0xCD, 0x09}, /* 0xC8-0xCB */ + {0xCD, 0x0C}, {0xCD, 0x10}, {0xCD, 0x18}, {0xCD, 0x19}, /* 0xCC-0xCF */ + {0xCD, 0x1B}, {0xCD, 0x1D}, {0xCD, 0x24}, {0xCD, 0x28}, /* 0xD0-0xD3 */ + {0xCD, 0x2C}, {0xCD, 0x39}, {0xCD, 0x5C}, {0xCD, 0x60}, /* 0xD4-0xD7 */ + {0xCD, 0x64}, {0xCD, 0x6C}, {0xCD, 0x6D}, {0xCD, 0x6F}, /* 0xD8-0xDB */ + {0xCD, 0x71}, {0xCD, 0x78}, {0xCD, 0x88}, {0xCD, 0x94}, /* 0xDC-0xDF */ + {0xCD, 0x95}, {0xCD, 0x98}, {0xCD, 0x9C}, {0xCD, 0xA4}, /* 0xE0-0xE3 */ + {0xCD, 0xA5}, {0xCD, 0xA7}, {0xCD, 0xA9}, {0xCD, 0xB0}, /* 0xE4-0xE7 */ + {0xCD, 0xC4}, {0xCD, 0xCC}, {0xCD, 0xD0}, {0xCD, 0xE8}, /* 0xE8-0xEB */ + {0xCD, 0xEC}, {0xCD, 0xF0}, {0xCD, 0xF8}, {0xCD, 0xF9}, /* 0xEC-0xEF */ + {0xCD, 0xFB}, {0xCD, 0xFD}, {0xCE, 0x04}, {0xCE, 0x08}, /* 0xF0-0xF3 */ + {0xCE, 0x0C}, {0xCE, 0x14}, {0xCE, 0x19}, {0xCE, 0x20}, /* 0xF4-0xF7 */ + {0xCE, 0x21}, {0xCE, 0x24}, {0xCE, 0x28}, {0xCE, 0x30}, /* 0xF8-0xFB */ + {0xCE, 0x31}, {0xCE, 0x33}, {0xCE, 0x35}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD6, 0xAB}, {0xD6, 0xAD}, {0xD6, 0xAE}, /* 0x40-0x43 */ + {0xD6, 0xAF}, {0xD6, 0xB1}, {0xD6, 0xB2}, {0xD6, 0xB3}, /* 0x44-0x47 */ + {0xD6, 0xB4}, {0xD6, 0xB5}, {0xD6, 0xB6}, {0xD6, 0xB7}, /* 0x48-0x4B */ + {0xD6, 0xB8}, {0xD6, 0xBA}, {0xD6, 0xBC}, {0xD6, 0xBD}, /* 0x4C-0x4F */ + {0xD6, 0xBE}, {0xD6, 0xBF}, {0xD6, 0xC0}, {0xD6, 0xC1}, /* 0x50-0x53 */ + {0xD6, 0xC2}, {0xD6, 0xC3}, {0xD6, 0xC6}, {0xD6, 0xC7}, /* 0x54-0x57 */ + {0xD6, 0xC9}, {0xD6, 0xCA}, {0xD6, 0xCB}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD6, 0xCD}, {0xD6, 0xCE}, {0xD6, 0xCF}, /* 0x60-0x63 */ + {0xD6, 0xD0}, {0xD6, 0xD2}, {0xD6, 0xD3}, {0xD6, 0xD5}, /* 0x64-0x67 */ + {0xD6, 0xD6}, {0xD6, 0xD8}, {0xD6, 0xDA}, {0xD6, 0xDB}, /* 0x68-0x6B */ + {0xD6, 0xDC}, {0xD6, 0xDD}, {0xD6, 0xDE}, {0xD6, 0xDF}, /* 0x6C-0x6F */ + {0xD6, 0xE1}, {0xD6, 0xE2}, {0xD6, 0xE3}, {0xD6, 0xE5}, /* 0x70-0x73 */ + {0xD6, 0xE6}, {0xD6, 0xE7}, {0xD6, 0xE9}, {0xD6, 0xEA}, /* 0x74-0x77 */ + {0xD6, 0xEB}, {0xD6, 0xEC}, {0xD6, 0xED}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD6, 0xEE}, {0xD6, 0xEF}, {0xD6, 0xF1}, /* 0x80-0x83 */ + {0xD6, 0xF2}, {0xD6, 0xF3}, {0xD6, 0xF4}, {0xD6, 0xF6}, /* 0x84-0x87 */ + {0xD6, 0xF7}, {0xD6, 0xF8}, {0xD6, 0xF9}, {0xD6, 0xFA}, /* 0x88-0x8B */ + {0xD6, 0xFB}, {0xD6, 0xFE}, {0xD6, 0xFF}, {0xD7, 0x01}, /* 0x8C-0x8F */ + {0xD7, 0x02}, {0xD7, 0x03}, {0xD7, 0x05}, {0xD7, 0x06}, /* 0x90-0x93 */ + {0xD7, 0x07}, {0xD7, 0x08}, {0xD7, 0x09}, {0xD7, 0x0A}, /* 0x94-0x97 */ + {0xD7, 0x0B}, {0xD7, 0x0C}, {0xD7, 0x0D}, {0xD7, 0x0E}, /* 0x98-0x9B */ + {0xD7, 0x0F}, {0xD7, 0x10}, {0xD7, 0x12}, {0xD7, 0x13}, /* 0x9C-0x9F */ + {0xD7, 0x14}, {0xCE, 0x58}, {0xCE, 0x59}, {0xCE, 0x5C}, /* 0xA0-0xA3 */ + {0xCE, 0x5F}, {0xCE, 0x60}, {0xCE, 0x61}, {0xCE, 0x68}, /* 0xA4-0xA7 */ + {0xCE, 0x69}, {0xCE, 0x6B}, {0xCE, 0x6D}, {0xCE, 0x74}, /* 0xA8-0xAB */ + {0xCE, 0x75}, {0xCE, 0x78}, {0xCE, 0x7C}, {0xCE, 0x84}, /* 0xAC-0xAF */ + {0xCE, 0x85}, {0xCE, 0x87}, {0xCE, 0x89}, {0xCE, 0x90}, /* 0xB0-0xB3 */ + {0xCE, 0x91}, {0xCE, 0x94}, {0xCE, 0x98}, {0xCE, 0xA0}, /* 0xB4-0xB7 */ + {0xCE, 0xA1}, {0xCE, 0xA3}, {0xCE, 0xA4}, {0xCE, 0xA5}, /* 0xB8-0xBB */ + {0xCE, 0xAC}, {0xCE, 0xAD}, {0xCE, 0xC1}, {0xCE, 0xE4}, /* 0xBC-0xBF */ + {0xCE, 0xE5}, {0xCE, 0xE8}, {0xCE, 0xEB}, {0xCE, 0xEC}, /* 0xC0-0xC3 */ + {0xCE, 0xF4}, {0xCE, 0xF5}, {0xCE, 0xF7}, {0xCE, 0xF8}, /* 0xC4-0xC7 */ + {0xCE, 0xF9}, {0xCF, 0x00}, {0xCF, 0x01}, {0xCF, 0x04}, /* 0xC8-0xCB */ + {0xCF, 0x08}, {0xCF, 0x10}, {0xCF, 0x11}, {0xCF, 0x13}, /* 0xCC-0xCF */ + {0xCF, 0x15}, {0xCF, 0x1C}, {0xCF, 0x20}, {0xCF, 0x24}, /* 0xD0-0xD3 */ + {0xCF, 0x2C}, {0xCF, 0x2D}, {0xCF, 0x2F}, {0xCF, 0x30}, /* 0xD4-0xD7 */ + {0xCF, 0x31}, {0xCF, 0x38}, {0xCF, 0x54}, {0xCF, 0x55}, /* 0xD8-0xDB */ + {0xCF, 0x58}, {0xCF, 0x5C}, {0xCF, 0x64}, {0xCF, 0x65}, /* 0xDC-0xDF */ + {0xCF, 0x67}, {0xCF, 0x69}, {0xCF, 0x70}, {0xCF, 0x71}, /* 0xE0-0xE3 */ + {0xCF, 0x74}, {0xCF, 0x78}, {0xCF, 0x80}, {0xCF, 0x85}, /* 0xE4-0xE7 */ + {0xCF, 0x8C}, {0xCF, 0xA1}, {0xCF, 0xA8}, {0xCF, 0xB0}, /* 0xE8-0xEB */ + {0xCF, 0xC4}, {0xCF, 0xE0}, {0xCF, 0xE1}, {0xCF, 0xE4}, /* 0xEC-0xEF */ + {0xCF, 0xE8}, {0xCF, 0xF0}, {0xCF, 0xF1}, {0xCF, 0xF3}, /* 0xF0-0xF3 */ + {0xCF, 0xF5}, {0xCF, 0xFC}, {0xD0, 0x00}, {0xD0, 0x04}, /* 0xF4-0xF7 */ + {0xD0, 0x11}, {0xD0, 0x18}, {0xD0, 0x2D}, {0xD0, 0x34}, /* 0xF8-0xFB */ + {0xD0, 0x35}, {0xD0, 0x38}, {0xD0, 0x3C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD7, 0x15}, {0xD7, 0x16}, {0xD7, 0x17}, /* 0x40-0x43 */ + {0xD7, 0x1A}, {0xD7, 0x1B}, {0xD7, 0x1D}, {0xD7, 0x1E}, /* 0x44-0x47 */ + {0xD7, 0x1F}, {0xD7, 0x21}, {0xD7, 0x22}, {0xD7, 0x23}, /* 0x48-0x4B */ + {0xD7, 0x24}, {0xD7, 0x25}, {0xD7, 0x26}, {0xD7, 0x27}, /* 0x4C-0x4F */ + {0xD7, 0x2A}, {0xD7, 0x2C}, {0xD7, 0x2E}, {0xD7, 0x2F}, /* 0x50-0x53 */ + {0xD7, 0x30}, {0xD7, 0x31}, {0xD7, 0x32}, {0xD7, 0x33}, /* 0x54-0x57 */ + {0xD7, 0x36}, {0xD7, 0x37}, {0xD7, 0x39}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0xD7, 0x3A}, {0xD7, 0x3B}, {0xD7, 0x3D}, /* 0x60-0x63 */ + {0xD7, 0x3E}, {0xD7, 0x3F}, {0xD7, 0x40}, {0xD7, 0x41}, /* 0x64-0x67 */ + {0xD7, 0x42}, {0xD7, 0x43}, {0xD7, 0x45}, {0xD7, 0x46}, /* 0x68-0x6B */ + {0xD7, 0x48}, {0xD7, 0x4A}, {0xD7, 0x4B}, {0xD7, 0x4C}, /* 0x6C-0x6F */ + {0xD7, 0x4D}, {0xD7, 0x4E}, {0xD7, 0x4F}, {0xD7, 0x52}, /* 0x70-0x73 */ + {0xD7, 0x53}, {0xD7, 0x55}, {0xD7, 0x5A}, {0xD7, 0x5B}, /* 0x74-0x77 */ + {0xD7, 0x5C}, {0xD7, 0x5D}, {0xD7, 0x5E}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0xD7, 0x5F}, {0xD7, 0x62}, {0xD7, 0x64}, /* 0x80-0x83 */ + {0xD7, 0x66}, {0xD7, 0x67}, {0xD7, 0x68}, {0xD7, 0x6A}, /* 0x84-0x87 */ + {0xD7, 0x6B}, {0xD7, 0x6D}, {0xD7, 0x6E}, {0xD7, 0x6F}, /* 0x88-0x8B */ + {0xD7, 0x71}, {0xD7, 0x72}, {0xD7, 0x73}, {0xD7, 0x75}, /* 0x8C-0x8F */ + {0xD7, 0x76}, {0xD7, 0x77}, {0xD7, 0x78}, {0xD7, 0x79}, /* 0x90-0x93 */ + {0xD7, 0x7A}, {0xD7, 0x7B}, {0xD7, 0x7E}, {0xD7, 0x7F}, /* 0x94-0x97 */ + {0xD7, 0x80}, {0xD7, 0x82}, {0xD7, 0x83}, {0xD7, 0x84}, /* 0x98-0x9B */ + {0xD7, 0x85}, {0xD7, 0x86}, {0xD7, 0x87}, {0xD7, 0x8A}, /* 0x9C-0x9F */ + {0xD7, 0x8B}, {0xD0, 0x44}, {0xD0, 0x45}, {0xD0, 0x47}, /* 0xA0-0xA3 */ + {0xD0, 0x49}, {0xD0, 0x50}, {0xD0, 0x54}, {0xD0, 0x58}, /* 0xA4-0xA7 */ + {0xD0, 0x60}, {0xD0, 0x6C}, {0xD0, 0x6D}, {0xD0, 0x70}, /* 0xA8-0xAB */ + {0xD0, 0x74}, {0xD0, 0x7C}, {0xD0, 0x7D}, {0xD0, 0x81}, /* 0xAC-0xAF */ + {0xD0, 0xA4}, {0xD0, 0xA5}, {0xD0, 0xA8}, {0xD0, 0xAC}, /* 0xB0-0xB3 */ + {0xD0, 0xB4}, {0xD0, 0xB5}, {0xD0, 0xB7}, {0xD0, 0xB9}, /* 0xB4-0xB7 */ + {0xD0, 0xC0}, {0xD0, 0xC1}, {0xD0, 0xC4}, {0xD0, 0xC8}, /* 0xB8-0xBB */ + {0xD0, 0xC9}, {0xD0, 0xD0}, {0xD0, 0xD1}, {0xD0, 0xD3}, /* 0xBC-0xBF */ + {0xD0, 0xD4}, {0xD0, 0xD5}, {0xD0, 0xDC}, {0xD0, 0xDD}, /* 0xC0-0xC3 */ + {0xD0, 0xE0}, {0xD0, 0xE4}, {0xD0, 0xEC}, {0xD0, 0xED}, /* 0xC4-0xC7 */ + {0xD0, 0xEF}, {0xD0, 0xF0}, {0xD0, 0xF1}, {0xD0, 0xF8}, /* 0xC8-0xCB */ + {0xD1, 0x0D}, {0xD1, 0x30}, {0xD1, 0x31}, {0xD1, 0x34}, /* 0xCC-0xCF */ + {0xD1, 0x38}, {0xD1, 0x3A}, {0xD1, 0x40}, {0xD1, 0x41}, /* 0xD0-0xD3 */ + {0xD1, 0x43}, {0xD1, 0x44}, {0xD1, 0x45}, {0xD1, 0x4C}, /* 0xD4-0xD7 */ + {0xD1, 0x4D}, {0xD1, 0x50}, {0xD1, 0x54}, {0xD1, 0x5C}, /* 0xD8-0xDB */ + {0xD1, 0x5D}, {0xD1, 0x5F}, {0xD1, 0x61}, {0xD1, 0x68}, /* 0xDC-0xDF */ + {0xD1, 0x6C}, {0xD1, 0x7C}, {0xD1, 0x84}, {0xD1, 0x88}, /* 0xE0-0xE3 */ + {0xD1, 0xA0}, {0xD1, 0xA1}, {0xD1, 0xA4}, {0xD1, 0xA8}, /* 0xE4-0xE7 */ + {0xD1, 0xB0}, {0xD1, 0xB1}, {0xD1, 0xB3}, {0xD1, 0xB5}, /* 0xE8-0xEB */ + {0xD1, 0xBA}, {0xD1, 0xBC}, {0xD1, 0xC0}, {0xD1, 0xD8}, /* 0xEC-0xEF */ + {0xD1, 0xF4}, {0xD1, 0xF8}, {0xD2, 0x07}, {0xD2, 0x09}, /* 0xF0-0xF3 */ + {0xD2, 0x10}, {0xD2, 0x2C}, {0xD2, 0x2D}, {0xD2, 0x30}, /* 0xF4-0xF7 */ + {0xD2, 0x34}, {0xD2, 0x3C}, {0xD2, 0x3D}, {0xD2, 0x3F}, /* 0xF8-0xFB */ + {0xD2, 0x41}, {0xD2, 0x48}, {0xD2, 0x5C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0xD7, 0x8D}, {0xD7, 0x8E}, {0xD7, 0x8F}, /* 0x40-0x43 */ + {0xD7, 0x91}, {0xD7, 0x92}, {0xD7, 0x93}, {0xD7, 0x94}, /* 0x44-0x47 */ + {0xD7, 0x95}, {0xD7, 0x96}, {0xD7, 0x97}, {0xD7, 0x9A}, /* 0x48-0x4B */ + {0xD7, 0x9C}, {0xD7, 0x9E}, {0xD7, 0x9F}, {0xD7, 0xA0}, /* 0x4C-0x4F */ + {0xD7, 0xA1}, {0xD7, 0xA2}, {0xD7, 0xA3}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xD2, 0x64}, {0xD2, 0x80}, {0xD2, 0x81}, /* 0xA0-0xA3 */ + {0xD2, 0x84}, {0xD2, 0x88}, {0xD2, 0x90}, {0xD2, 0x91}, /* 0xA4-0xA7 */ + {0xD2, 0x95}, {0xD2, 0x9C}, {0xD2, 0xA0}, {0xD2, 0xA4}, /* 0xA8-0xAB */ + {0xD2, 0xAC}, {0xD2, 0xB1}, {0xD2, 0xB8}, {0xD2, 0xB9}, /* 0xAC-0xAF */ + {0xD2, 0xBC}, {0xD2, 0xBF}, {0xD2, 0xC0}, {0xD2, 0xC2}, /* 0xB0-0xB3 */ + {0xD2, 0xC8}, {0xD2, 0xC9}, {0xD2, 0xCB}, {0xD2, 0xD4}, /* 0xB4-0xB7 */ + {0xD2, 0xD8}, {0xD2, 0xDC}, {0xD2, 0xE4}, {0xD2, 0xE5}, /* 0xB8-0xBB */ + {0xD2, 0xF0}, {0xD2, 0xF1}, {0xD2, 0xF4}, {0xD2, 0xF8}, /* 0xBC-0xBF */ + {0xD3, 0x00}, {0xD3, 0x01}, {0xD3, 0x03}, {0xD3, 0x05}, /* 0xC0-0xC3 */ + {0xD3, 0x0C}, {0xD3, 0x0D}, {0xD3, 0x0E}, {0xD3, 0x10}, /* 0xC4-0xC7 */ + {0xD3, 0x14}, {0xD3, 0x16}, {0xD3, 0x1C}, {0xD3, 0x1D}, /* 0xC8-0xCB */ + {0xD3, 0x1F}, {0xD3, 0x20}, {0xD3, 0x21}, {0xD3, 0x25}, /* 0xCC-0xCF */ + {0xD3, 0x28}, {0xD3, 0x29}, {0xD3, 0x2C}, {0xD3, 0x30}, /* 0xD0-0xD3 */ + {0xD3, 0x38}, {0xD3, 0x39}, {0xD3, 0x3B}, {0xD3, 0x3C}, /* 0xD4-0xD7 */ + {0xD3, 0x3D}, {0xD3, 0x44}, {0xD3, 0x45}, {0xD3, 0x7C}, /* 0xD8-0xDB */ + {0xD3, 0x7D}, {0xD3, 0x80}, {0xD3, 0x84}, {0xD3, 0x8C}, /* 0xDC-0xDF */ + {0xD3, 0x8D}, {0xD3, 0x8F}, {0xD3, 0x90}, {0xD3, 0x91}, /* 0xE0-0xE3 */ + {0xD3, 0x98}, {0xD3, 0x99}, {0xD3, 0x9C}, {0xD3, 0xA0}, /* 0xE4-0xE7 */ + {0xD3, 0xA8}, {0xD3, 0xA9}, {0xD3, 0xAB}, {0xD3, 0xAD}, /* 0xE8-0xEB */ + {0xD3, 0xB4}, {0xD3, 0xB8}, {0xD3, 0xBC}, {0xD3, 0xC4}, /* 0xEC-0xEF */ + {0xD3, 0xC5}, {0xD3, 0xC8}, {0xD3, 0xC9}, {0xD3, 0xD0}, /* 0xF0-0xF3 */ + {0xD3, 0xD8}, {0xD3, 0xE1}, {0xD3, 0xE3}, {0xD3, 0xEC}, /* 0xF4-0xF7 */ + {0xD3, 0xED}, {0xD3, 0xF0}, {0xD3, 0xF4}, {0xD3, 0xFC}, /* 0xF8-0xFB */ + {0xD3, 0xFD}, {0xD3, 0xFF}, {0xD4, 0x01}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xD4, 0x08}, {0xD4, 0x1D}, {0xD4, 0x40}, /* 0xA0-0xA3 */ + {0xD4, 0x44}, {0xD4, 0x5C}, {0xD4, 0x60}, {0xD4, 0x64}, /* 0xA4-0xA7 */ + {0xD4, 0x6D}, {0xD4, 0x6F}, {0xD4, 0x78}, {0xD4, 0x79}, /* 0xA8-0xAB */ + {0xD4, 0x7C}, {0xD4, 0x7F}, {0xD4, 0x80}, {0xD4, 0x82}, /* 0xAC-0xAF */ + {0xD4, 0x88}, {0xD4, 0x89}, {0xD4, 0x8B}, {0xD4, 0x8D}, /* 0xB0-0xB3 */ + {0xD4, 0x94}, {0xD4, 0xA9}, {0xD4, 0xCC}, {0xD4, 0xD0}, /* 0xB4-0xB7 */ + {0xD4, 0xD4}, {0xD4, 0xDC}, {0xD4, 0xDF}, {0xD4, 0xE8}, /* 0xB8-0xBB */ + {0xD4, 0xEC}, {0xD4, 0xF0}, {0xD4, 0xF8}, {0xD4, 0xFB}, /* 0xBC-0xBF */ + {0xD4, 0xFD}, {0xD5, 0x04}, {0xD5, 0x08}, {0xD5, 0x0C}, /* 0xC0-0xC3 */ + {0xD5, 0x14}, {0xD5, 0x15}, {0xD5, 0x17}, {0xD5, 0x3C}, /* 0xC4-0xC7 */ + {0xD5, 0x3D}, {0xD5, 0x40}, {0xD5, 0x44}, {0xD5, 0x4C}, /* 0xC8-0xCB */ + {0xD5, 0x4D}, {0xD5, 0x4F}, {0xD5, 0x51}, {0xD5, 0x58}, /* 0xCC-0xCF */ + {0xD5, 0x59}, {0xD5, 0x5C}, {0xD5, 0x60}, {0xD5, 0x65}, /* 0xD0-0xD3 */ + {0xD5, 0x68}, {0xD5, 0x69}, {0xD5, 0x6B}, {0xD5, 0x6D}, /* 0xD4-0xD7 */ + {0xD5, 0x74}, {0xD5, 0x75}, {0xD5, 0x78}, {0xD5, 0x7C}, /* 0xD8-0xDB */ + {0xD5, 0x84}, {0xD5, 0x85}, {0xD5, 0x87}, {0xD5, 0x88}, /* 0xDC-0xDF */ + {0xD5, 0x89}, {0xD5, 0x90}, {0xD5, 0xA5}, {0xD5, 0xC8}, /* 0xE0-0xE3 */ + {0xD5, 0xC9}, {0xD5, 0xCC}, {0xD5, 0xD0}, {0xD5, 0xD2}, /* 0xE4-0xE7 */ + {0xD5, 0xD8}, {0xD5, 0xD9}, {0xD5, 0xDB}, {0xD5, 0xDD}, /* 0xE8-0xEB */ + {0xD5, 0xE4}, {0xD5, 0xE5}, {0xD5, 0xE8}, {0xD5, 0xEC}, /* 0xEC-0xEF */ + {0xD5, 0xF4}, {0xD5, 0xF5}, {0xD5, 0xF7}, {0xD5, 0xF9}, /* 0xF0-0xF3 */ + {0xD6, 0x00}, {0xD6, 0x01}, {0xD6, 0x04}, {0xD6, 0x08}, /* 0xF4-0xF7 */ + {0xD6, 0x10}, {0xD6, 0x11}, {0xD6, 0x13}, {0xD6, 0x14}, /* 0xF8-0xFB */ + {0xD6, 0x15}, {0xD6, 0x1C}, {0xD6, 0x20}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xD6, 0x24}, {0xD6, 0x2D}, {0xD6, 0x38}, /* 0xA0-0xA3 */ + {0xD6, 0x39}, {0xD6, 0x3C}, {0xD6, 0x40}, {0xD6, 0x45}, /* 0xA4-0xA7 */ + {0xD6, 0x48}, {0xD6, 0x49}, {0xD6, 0x4B}, {0xD6, 0x4D}, /* 0xA8-0xAB */ + {0xD6, 0x51}, {0xD6, 0x54}, {0xD6, 0x55}, {0xD6, 0x58}, /* 0xAC-0xAF */ + {0xD6, 0x5C}, {0xD6, 0x67}, {0xD6, 0x69}, {0xD6, 0x70}, /* 0xB0-0xB3 */ + {0xD6, 0x71}, {0xD6, 0x74}, {0xD6, 0x83}, {0xD6, 0x85}, /* 0xB4-0xB7 */ + {0xD6, 0x8C}, {0xD6, 0x8D}, {0xD6, 0x90}, {0xD6, 0x94}, /* 0xB8-0xBB */ + {0xD6, 0x9D}, {0xD6, 0x9F}, {0xD6, 0xA1}, {0xD6, 0xA8}, /* 0xBC-0xBF */ + {0xD6, 0xAC}, {0xD6, 0xB0}, {0xD6, 0xB9}, {0xD6, 0xBB}, /* 0xC0-0xC3 */ + {0xD6, 0xC4}, {0xD6, 0xC5}, {0xD6, 0xC8}, {0xD6, 0xCC}, /* 0xC4-0xC7 */ + {0xD6, 0xD1}, {0xD6, 0xD4}, {0xD6, 0xD7}, {0xD6, 0xD9}, /* 0xC8-0xCB */ + {0xD6, 0xE0}, {0xD6, 0xE4}, {0xD6, 0xE8}, {0xD6, 0xF0}, /* 0xCC-0xCF */ + {0xD6, 0xF5}, {0xD6, 0xFC}, {0xD6, 0xFD}, {0xD7, 0x00}, /* 0xD0-0xD3 */ + {0xD7, 0x04}, {0xD7, 0x11}, {0xD7, 0x18}, {0xD7, 0x19}, /* 0xD4-0xD7 */ + {0xD7, 0x1C}, {0xD7, 0x20}, {0xD7, 0x28}, {0xD7, 0x29}, /* 0xD8-0xDB */ + {0xD7, 0x2B}, {0xD7, 0x2D}, {0xD7, 0x34}, {0xD7, 0x35}, /* 0xDC-0xDF */ + {0xD7, 0x38}, {0xD7, 0x3C}, {0xD7, 0x44}, {0xD7, 0x47}, /* 0xE0-0xE3 */ + {0xD7, 0x49}, {0xD7, 0x50}, {0xD7, 0x51}, {0xD7, 0x54}, /* 0xE4-0xE7 */ + {0xD7, 0x56}, {0xD7, 0x57}, {0xD7, 0x58}, {0xD7, 0x59}, /* 0xE8-0xEB */ + {0xD7, 0x60}, {0xD7, 0x61}, {0xD7, 0x63}, {0xD7, 0x65}, /* 0xEC-0xEF */ + {0xD7, 0x69}, {0xD7, 0x6C}, {0xD7, 0x70}, {0xD7, 0x74}, /* 0xF0-0xF3 */ + {0xD7, 0x7C}, {0xD7, 0x7D}, {0xD7, 0x81}, {0xD7, 0x88}, /* 0xF4-0xF7 */ + {0xD7, 0x89}, {0xD7, 0x8C}, {0xD7, 0x90}, {0xD7, 0x98}, /* 0xF8-0xFB */ + {0xD7, 0x99}, {0xD7, 0x9B}, {0xD7, 0x9D}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x4F, 0x3D}, {0x4F, 0x73}, {0x50, 0x47}, /* 0xA0-0xA3 */ + {0x50, 0xF9}, {0x52, 0xA0}, {0x53, 0xEF}, {0x54, 0x75}, /* 0xA4-0xA7 */ + {0x54, 0xE5}, {0x56, 0x09}, {0x5A, 0xC1}, {0x5B, 0xB6}, /* 0xA8-0xAB */ + {0x66, 0x87}, {0x67, 0xB6}, {0x67, 0xB7}, {0x67, 0xEF}, /* 0xAC-0xAF */ + {0x6B, 0x4C}, {0x73, 0xC2}, {0x75, 0xC2}, {0x7A, 0x3C}, /* 0xB0-0xB3 */ + {0x82, 0xDB}, {0x83, 0x04}, {0x88, 0x57}, {0x88, 0x88}, /* 0xB4-0xB7 */ + {0x8A, 0x36}, {0x8C, 0xC8}, {0x8D, 0xCF}, {0x8E, 0xFB}, /* 0xB8-0xBB */ + {0x8F, 0xE6}, {0x99, 0xD5}, {0x52, 0x3B}, {0x53, 0x74}, /* 0xBC-0xBF */ + {0x54, 0x04}, {0x60, 0x6A}, {0x61, 0x64}, {0x6B, 0xBC}, /* 0xC0-0xC3 */ + {0x73, 0xCF}, {0x81, 0x1A}, {0x89, 0xBA}, {0x89, 0xD2}, /* 0xC4-0xC7 */ + {0x95, 0xA3}, {0x4F, 0x83}, {0x52, 0x0A}, {0x58, 0xBE}, /* 0xC8-0xCB */ + {0x59, 0x78}, {0x59, 0xE6}, {0x5E, 0x72}, {0x5E, 0x79}, /* 0xCC-0xCF */ + {0x61, 0xC7}, {0x63, 0xC0}, {0x67, 0x46}, {0x67, 0xEC}, /* 0xD0-0xD3 */ + {0x68, 0x7F}, {0x6F, 0x97}, {0x76, 0x4E}, {0x77, 0x0B}, /* 0xD4-0xD7 */ + {0x78, 0xF5}, {0x7A, 0x08}, {0x7A, 0xFF}, {0x7C, 0x21}, /* 0xD8-0xDB */ + {0x80, 0x9D}, {0x82, 0x6E}, {0x82, 0x71}, {0x8A, 0xEB}, /* 0xDC-0xDF */ + {0x95, 0x93}, {0x4E, 0x6B}, {0x55, 0x9D}, {0x66, 0xF7}, /* 0xE0-0xE3 */ + {0x6E, 0x34}, {0x78, 0xA3}, {0x7A, 0xED}, {0x84, 0x5B}, /* 0xE4-0xE7 */ + {0x89, 0x10}, {0x87, 0x4E}, {0x97, 0xA8}, {0x52, 0xD8}, /* 0xE8-0xEB */ + {0x57, 0x4E}, {0x58, 0x2A}, {0x5D, 0x4C}, {0x61, 0x1F}, /* 0xEC-0xEF */ + {0x61, 0xBE}, {0x62, 0x21}, {0x65, 0x62}, {0x67, 0xD1}, /* 0xF0-0xF3 */ + {0x6A, 0x44}, {0x6E, 0x1B}, {0x75, 0x18}, {0x75, 0xB3}, /* 0xF4-0xF7 */ + {0x76, 0xE3}, {0x77, 0xB0}, {0x7D, 0x3A}, {0x90, 0xAF}, /* 0xF8-0xFB */ + {0x94, 0x51}, {0x94, 0x52}, {0x9F, 0x95}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x53, 0x23}, {0x5C, 0xAC}, {0x75, 0x32}, /* 0xA0-0xA3 */ + {0x80, 0xDB}, {0x92, 0x40}, {0x95, 0x98}, {0x52, 0x5B}, /* 0xA4-0xA7 */ + {0x58, 0x08}, {0x59, 0xDC}, {0x5C, 0xA1}, {0x5D, 0x17}, /* 0xA8-0xAB */ + {0x5E, 0xB7}, {0x5F, 0x3A}, {0x5F, 0x4A}, {0x61, 0x77}, /* 0xAC-0xAF */ + {0x6C, 0x5F}, {0x75, 0x7A}, {0x75, 0x86}, {0x7C, 0xE0}, /* 0xB0-0xB3 */ + {0x7D, 0x73}, {0x7D, 0xB1}, {0x7F, 0x8C}, {0x81, 0x54}, /* 0xB4-0xB7 */ + {0x82, 0x21}, {0x85, 0x91}, {0x89, 0x41}, {0x8B, 0x1B}, /* 0xB8-0xBB */ + {0x92, 0xFC}, {0x96, 0x4D}, {0x9C, 0x47}, {0x4E, 0xCB}, /* 0xBC-0xBF */ + {0x4E, 0xF7}, {0x50, 0x0B}, {0x51, 0xF1}, {0x58, 0x4F}, /* 0xC0-0xC3 */ + {0x61, 0x37}, {0x61, 0x3E}, {0x61, 0x68}, {0x65, 0x39}, /* 0xC4-0xC7 */ + {0x69, 0xEA}, {0x6F, 0x11}, {0x75, 0xA5}, {0x76, 0x86}, /* 0xC8-0xCB */ + {0x76, 0xD6}, {0x7B, 0x87}, {0x82, 0xA5}, {0x84, 0xCB}, /* 0xCC-0xCF */ + {0xF9, 0x00}, {0x93, 0xA7}, {0x95, 0x8B}, {0x55, 0x80}, /* 0xD0-0xD3 */ + {0x5B, 0xA2}, {0x57, 0x51}, {0xF9, 0x01}, {0x7C, 0xB3}, /* 0xD4-0xD7 */ + {0x7F, 0xB9}, {0x91, 0xB5}, {0x50, 0x28}, {0x53, 0xBB}, /* 0xD8-0xDB */ + {0x5C, 0x45}, {0x5D, 0xE8}, {0x62, 0xD2}, {0x63, 0x6E}, /* 0xDC-0xDF */ + {0x64, 0xDA}, {0x64, 0xE7}, {0x6E, 0x20}, {0x70, 0xAC}, /* 0xE0-0xE3 */ + {0x79, 0x5B}, {0x8D, 0xDD}, {0x8E, 0x1E}, {0xF9, 0x02}, /* 0xE4-0xE7 */ + {0x90, 0x7D}, {0x92, 0x45}, {0x92, 0xF8}, {0x4E, 0x7E}, /* 0xE8-0xEB */ + {0x4E, 0xF6}, {0x50, 0x65}, {0x5D, 0xFE}, {0x5E, 0xFA}, /* 0xEC-0xEF */ + {0x61, 0x06}, {0x69, 0x57}, {0x81, 0x71}, {0x86, 0x54}, /* 0xF0-0xF3 */ + {0x8E, 0x47}, {0x93, 0x75}, {0x9A, 0x2B}, {0x4E, 0x5E}, /* 0xF4-0xF7 */ + {0x50, 0x91}, {0x67, 0x70}, {0x68, 0x40}, {0x51, 0x09}, /* 0xF8-0xFB */ + {0x52, 0x8D}, {0x52, 0x92}, {0x6A, 0xA2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x77, 0xBC}, {0x92, 0x10}, {0x9E, 0xD4}, /* 0xA0-0xA3 */ + {0x52, 0xAB}, {0x60, 0x2F}, {0x8F, 0xF2}, {0x50, 0x48}, /* 0xA4-0xA7 */ + {0x61, 0xA9}, {0x63, 0xED}, {0x64, 0xCA}, {0x68, 0x3C}, /* 0xA8-0xAB */ + {0x6A, 0x84}, {0x6F, 0xC0}, {0x81, 0x88}, {0x89, 0xA1}, /* 0xAC-0xAF */ + {0x96, 0x94}, {0x58, 0x05}, {0x72, 0x7D}, {0x72, 0xAC}, /* 0xB0-0xB3 */ + {0x75, 0x04}, {0x7D, 0x79}, {0x7E, 0x6D}, {0x80, 0xA9}, /* 0xB4-0xB7 */ + {0x89, 0x8B}, {0x8B, 0x74}, {0x90, 0x63}, {0x9D, 0x51}, /* 0xB8-0xBB */ + {0x62, 0x89}, {0x6C, 0x7A}, {0x6F, 0x54}, {0x7D, 0x50}, /* 0xBC-0xBF */ + {0x7F, 0x3A}, {0x8A, 0x23}, {0x51, 0x7C}, {0x61, 0x4A}, /* 0xC0-0xC3 */ + {0x7B, 0x9D}, {0x8B, 0x19}, {0x92, 0x57}, {0x93, 0x8C}, /* 0xC4-0xC7 */ + {0x4E, 0xAC}, {0x4F, 0xD3}, {0x50, 0x1E}, {0x50, 0xBE}, /* 0xC8-0xCB */ + {0x51, 0x06}, {0x52, 0xC1}, {0x52, 0xCD}, {0x53, 0x7F}, /* 0xCC-0xCF */ + {0x57, 0x70}, {0x58, 0x83}, {0x5E, 0x9A}, {0x5F, 0x91}, /* 0xD0-0xD3 */ + {0x61, 0x76}, {0x61, 0xAC}, {0x64, 0xCE}, {0x65, 0x6C}, /* 0xD4-0xD7 */ + {0x66, 0x6F}, {0x66, 0xBB}, {0x66, 0xF4}, {0x68, 0x97}, /* 0xD8-0xDB */ + {0x6D, 0x87}, {0x70, 0x85}, {0x70, 0xF1}, {0x74, 0x9F}, /* 0xDC-0xDF */ + {0x74, 0xA5}, {0x74, 0xCA}, {0x75, 0xD9}, {0x78, 0x6C}, /* 0xE0-0xE3 */ + {0x78, 0xEC}, {0x7A, 0xDF}, {0x7A, 0xF6}, {0x7D, 0x45}, /* 0xE4-0xE7 */ + {0x7D, 0x93}, {0x80, 0x15}, {0x80, 0x3F}, {0x81, 0x1B}, /* 0xE8-0xEB */ + {0x83, 0x96}, {0x8B, 0x66}, {0x8F, 0x15}, {0x90, 0x15}, /* 0xEC-0xEF */ + {0x93, 0xE1}, {0x98, 0x03}, {0x98, 0x38}, {0x9A, 0x5A}, /* 0xF0-0xF3 */ + {0x9B, 0xE8}, {0x4F, 0xC2}, {0x55, 0x53}, {0x58, 0x3A}, /* 0xF4-0xF7 */ + {0x59, 0x51}, {0x5B, 0x63}, {0x5C, 0x46}, {0x60, 0xB8}, /* 0xF8-0xFB */ + {0x62, 0x12}, {0x68, 0x42}, {0x68, 0xB0}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x68, 0xE8}, {0x6E, 0xAA}, {0x75, 0x4C}, /* 0xA0-0xA3 */ + {0x76, 0x78}, {0x78, 0xCE}, {0x7A, 0x3D}, {0x7C, 0xFB}, /* 0xA4-0xA7 */ + {0x7E, 0x6B}, {0x7E, 0x7C}, {0x8A, 0x08}, {0x8A, 0xA1}, /* 0xA8-0xAB */ + {0x8C, 0x3F}, {0x96, 0x8E}, {0x9D, 0xC4}, {0x53, 0xE4}, /* 0xAC-0xAF */ + {0x53, 0xE9}, {0x54, 0x4A}, {0x54, 0x71}, {0x56, 0xFA}, /* 0xB0-0xB3 */ + {0x59, 0xD1}, {0x5B, 0x64}, {0x5C, 0x3B}, {0x5E, 0xAB}, /* 0xB4-0xB7 */ + {0x62, 0xF7}, {0x65, 0x37}, {0x65, 0x45}, {0x65, 0x72}, /* 0xB8-0xBB */ + {0x66, 0xA0}, {0x67, 0xAF}, {0x69, 0xC1}, {0x6C, 0xBD}, /* 0xBC-0xBF */ + {0x75, 0xFC}, {0x76, 0x90}, {0x77, 0x7E}, {0x7A, 0x3F}, /* 0xC0-0xC3 */ + {0x7F, 0x94}, {0x80, 0x03}, {0x80, 0xA1}, {0x81, 0x8F}, /* 0xC4-0xC7 */ + {0x82, 0xE6}, {0x82, 0xFD}, {0x83, 0xF0}, {0x85, 0xC1}, /* 0xC8-0xCB */ + {0x88, 0x31}, {0x88, 0xB4}, {0x8A, 0xA5}, {0xF9, 0x03}, /* 0xCC-0xCF */ + {0x8F, 0x9C}, {0x93, 0x2E}, {0x96, 0xC7}, {0x98, 0x67}, /* 0xD0-0xD3 */ + {0x9A, 0xD8}, {0x9F, 0x13}, {0x54, 0xED}, {0x65, 0x9B}, /* 0xD4-0xD7 */ + {0x66, 0xF2}, {0x68, 0x8F}, {0x7A, 0x40}, {0x8C, 0x37}, /* 0xD8-0xDB */ + {0x9D, 0x60}, {0x56, 0xF0}, {0x57, 0x64}, {0x5D, 0x11}, /* 0xDC-0xDF */ + {0x66, 0x06}, {0x68, 0xB1}, {0x68, 0xCD}, {0x6E, 0xFE}, /* 0xE0-0xE3 */ + {0x74, 0x28}, {0x88, 0x9E}, {0x9B, 0xE4}, {0x6C, 0x68}, /* 0xE4-0xE7 */ + {0xF9, 0x04}, {0x9A, 0xA8}, {0x4F, 0x9B}, {0x51, 0x6C}, /* 0xE8-0xEB */ + {0x51, 0x71}, {0x52, 0x9F}, {0x5B, 0x54}, {0x5D, 0xE5}, /* 0xEC-0xEF */ + {0x60, 0x50}, {0x60, 0x6D}, {0x62, 0xF1}, {0x63, 0xA7}, /* 0xF0-0xF3 */ + {0x65, 0x3B}, {0x73, 0xD9}, {0x7A, 0x7A}, {0x86, 0xA3}, /* 0xF4-0xF7 */ + {0x8C, 0xA2}, {0x97, 0x8F}, {0x4E, 0x32}, {0x5B, 0xE1}, /* 0xF8-0xFB */ + {0x62, 0x08}, {0x67, 0x9C}, {0x74, 0xDC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x79, 0xD1}, {0x83, 0xD3}, {0x8A, 0x87}, /* 0xA0-0xA3 */ + {0x8A, 0xB2}, {0x8D, 0xE8}, {0x90, 0x4E}, {0x93, 0x4B}, /* 0xA4-0xA7 */ + {0x98, 0x46}, {0x5E, 0xD3}, {0x69, 0xE8}, {0x85, 0xFF}, /* 0xA8-0xAB */ + {0x90, 0xED}, {0xF9, 0x05}, {0x51, 0xA0}, {0x5B, 0x98}, /* 0xAC-0xAF */ + {0x5B, 0xEC}, {0x61, 0x63}, {0x68, 0xFA}, {0x6B, 0x3E}, /* 0xB0-0xB3 */ + {0x70, 0x4C}, {0x74, 0x2F}, {0x74, 0xD8}, {0x7B, 0xA1}, /* 0xB4-0xB7 */ + {0x7F, 0x50}, {0x83, 0xC5}, {0x89, 0xC0}, {0x8C, 0xAB}, /* 0xB8-0xBB */ + {0x95, 0xDC}, {0x99, 0x28}, {0x52, 0x2E}, {0x60, 0x5D}, /* 0xBC-0xBF */ + {0x62, 0xEC}, {0x90, 0x02}, {0x4F, 0x8A}, {0x51, 0x49}, /* 0xC0-0xC3 */ + {0x53, 0x21}, {0x58, 0xD9}, {0x5E, 0xE3}, {0x66, 0xE0}, /* 0xC4-0xC7 */ + {0x6D, 0x38}, {0x70, 0x9A}, {0x72, 0xC2}, {0x73, 0xD6}, /* 0xC8-0xCB */ + {0x7B, 0x50}, {0x80, 0xF1}, {0x94, 0x5B}, {0x53, 0x66}, /* 0xCC-0xCF */ + {0x63, 0x9B}, {0x7F, 0x6B}, {0x4E, 0x56}, {0x50, 0x80}, /* 0xD0-0xD3 */ + {0x58, 0x4A}, {0x58, 0xDE}, {0x60, 0x2A}, {0x61, 0x27}, /* 0xD4-0xD7 */ + {0x62, 0xD0}, {0x69, 0xD0}, {0x9B, 0x41}, {0x5B, 0x8F}, /* 0xD8-0xDB */ + {0x7D, 0x18}, {0x80, 0xB1}, {0x8F, 0x5F}, {0x4E, 0xA4}, /* 0xDC-0xDF */ + {0x50, 0xD1}, {0x54, 0xAC}, {0x55, 0xAC}, {0x5B, 0x0C}, /* 0xE0-0xE3 */ + {0x5D, 0xA0}, {0x5D, 0xE7}, {0x65, 0x2A}, {0x65, 0x4E}, /* 0xE4-0xE7 */ + {0x68, 0x21}, {0x6A, 0x4B}, {0x72, 0xE1}, {0x76, 0x8E}, /* 0xE8-0xEB */ + {0x77, 0xEF}, {0x7D, 0x5E}, {0x7F, 0xF9}, {0x81, 0xA0}, /* 0xEC-0xEF */ + {0x85, 0x4E}, {0x86, 0xDF}, {0x8F, 0x03}, {0x8F, 0x4E}, /* 0xF0-0xF3 */ + {0x90, 0xCA}, {0x99, 0x03}, {0x9A, 0x55}, {0x9B, 0xAB}, /* 0xF4-0xF7 */ + {0x4E, 0x18}, {0x4E, 0x45}, {0x4E, 0x5D}, {0x4E, 0xC7}, /* 0xF8-0xFB */ + {0x4F, 0xF1}, {0x51, 0x77}, {0x52, 0xFE}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x53, 0x40}, {0x53, 0xE3}, {0x53, 0xE5}, /* 0xA0-0xA3 */ + {0x54, 0x8E}, {0x56, 0x14}, {0x57, 0x75}, {0x57, 0xA2}, /* 0xA4-0xA7 */ + {0x5B, 0xC7}, {0x5D, 0x87}, {0x5E, 0xD0}, {0x61, 0xFC}, /* 0xA8-0xAB */ + {0x62, 0xD8}, {0x65, 0x51}, {0x67, 0xB8}, {0x67, 0xE9}, /* 0xAC-0xAF */ + {0x69, 0xCB}, {0x6B, 0x50}, {0x6B, 0xC6}, {0x6B, 0xEC}, /* 0xB0-0xB3 */ + {0x6C, 0x42}, {0x6E, 0x9D}, {0x70, 0x78}, {0x72, 0xD7}, /* 0xB4-0xB7 */ + {0x73, 0x96}, {0x74, 0x03}, {0x77, 0xBF}, {0x77, 0xE9}, /* 0xB8-0xBB */ + {0x7A, 0x76}, {0x7D, 0x7F}, {0x80, 0x09}, {0x81, 0xFC}, /* 0xBC-0xBF */ + {0x82, 0x05}, {0x82, 0x0A}, {0x82, 0xDF}, {0x88, 0x62}, /* 0xC0-0xC3 */ + {0x8B, 0x33}, {0x8C, 0xFC}, {0x8E, 0xC0}, {0x90, 0x11}, /* 0xC4-0xC7 */ + {0x90, 0xB1}, {0x92, 0x64}, {0x92, 0xB6}, {0x99, 0xD2}, /* 0xC8-0xCB */ + {0x9A, 0x45}, {0x9C, 0xE9}, {0x9D, 0xD7}, {0x9F, 0x9C}, /* 0xCC-0xCF */ + {0x57, 0x0B}, {0x5C, 0x40}, {0x83, 0xCA}, {0x97, 0xA0}, /* 0xD0-0xD3 */ + {0x97, 0xAB}, {0x9E, 0xB4}, {0x54, 0x1B}, {0x7A, 0x98}, /* 0xD4-0xD7 */ + {0x7F, 0xA4}, {0x88, 0xD9}, {0x8E, 0xCD}, {0x90, 0xE1}, /* 0xD8-0xDB */ + {0x58, 0x00}, {0x5C, 0x48}, {0x63, 0x98}, {0x7A, 0x9F}, /* 0xDC-0xDF */ + {0x5B, 0xAE}, {0x5F, 0x13}, {0x7A, 0x79}, {0x7A, 0xAE}, /* 0xE0-0xE3 */ + {0x82, 0x8E}, {0x8E, 0xAC}, {0x50, 0x26}, {0x52, 0x38}, /* 0xE4-0xE7 */ + {0x52, 0xF8}, {0x53, 0x77}, {0x57, 0x08}, {0x62, 0xF3}, /* 0xE8-0xEB */ + {0x63, 0x72}, {0x6B, 0x0A}, {0x6D, 0xC3}, {0x77, 0x37}, /* 0xEC-0xEF */ + {0x53, 0xA5}, {0x73, 0x57}, {0x85, 0x68}, {0x8E, 0x76}, /* 0xF0-0xF3 */ + {0x95, 0xD5}, {0x67, 0x3A}, {0x6A, 0xC3}, {0x6F, 0x70}, /* 0xF4-0xF7 */ + {0x8A, 0x6D}, {0x8E, 0xCC}, {0x99, 0x4B}, {0xF9, 0x06}, /* 0xF8-0xFB */ + {0x66, 0x77}, {0x6B, 0x78}, {0x8C, 0xB4}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9B, 0x3C}, {0xF9, 0x07}, {0x53, 0xEB}, /* 0xA0-0xA3 */ + {0x57, 0x2D}, {0x59, 0x4E}, {0x63, 0xC6}, {0x69, 0xFB}, /* 0xA4-0xA7 */ + {0x73, 0xEA}, {0x78, 0x45}, {0x7A, 0xBA}, {0x7A, 0xC5}, /* 0xA8-0xAB */ + {0x7C, 0xFE}, {0x84, 0x75}, {0x89, 0x8F}, {0x8D, 0x73}, /* 0xAC-0xAF */ + {0x90, 0x35}, {0x95, 0xA8}, {0x52, 0xFB}, {0x57, 0x47}, /* 0xB0-0xB3 */ + {0x75, 0x47}, {0x7B, 0x60}, {0x83, 0xCC}, {0x92, 0x1E}, /* 0xB4-0xB7 */ + {0xF9, 0x08}, {0x6A, 0x58}, {0x51, 0x4B}, {0x52, 0x4B}, /* 0xB8-0xBB */ + {0x52, 0x87}, {0x62, 0x1F}, {0x68, 0xD8}, {0x69, 0x75}, /* 0xBC-0xBF */ + {0x96, 0x99}, {0x50, 0xC5}, {0x52, 0xA4}, {0x52, 0xE4}, /* 0xC0-0xC3 */ + {0x61, 0xC3}, {0x65, 0xA4}, {0x68, 0x39}, {0x69, 0xFF}, /* 0xC4-0xC7 */ + {0x74, 0x7E}, {0x7B, 0x4B}, {0x82, 0xB9}, {0x83, 0xEB}, /* 0xC8-0xCB */ + {0x89, 0xB2}, {0x8B, 0x39}, {0x8F, 0xD1}, {0x99, 0x49}, /* 0xCC-0xCF */ + {0xF9, 0x09}, {0x4E, 0xCA}, {0x59, 0x97}, {0x64, 0xD2}, /* 0xD0-0xD3 */ + {0x66, 0x11}, {0x6A, 0x8E}, {0x74, 0x34}, {0x79, 0x81}, /* 0xD4-0xD7 */ + {0x79, 0xBD}, {0x82, 0xA9}, {0x88, 0x7E}, {0x88, 0x7F}, /* 0xD8-0xDB */ + {0x89, 0x5F}, {0xF9, 0x0A}, {0x93, 0x26}, {0x4F, 0x0B}, /* 0xDC-0xDF */ + {0x53, 0xCA}, {0x60, 0x25}, {0x62, 0x71}, {0x6C, 0x72}, /* 0xE0-0xE3 */ + {0x7D, 0x1A}, {0x7D, 0x66}, {0x4E, 0x98}, {0x51, 0x62}, /* 0xE4-0xE7 */ + {0x77, 0xDC}, {0x80, 0xAF}, {0x4F, 0x01}, {0x4F, 0x0E}, /* 0xE8-0xEB */ + {0x51, 0x76}, {0x51, 0x80}, {0x55, 0xDC}, {0x56, 0x68}, /* 0xEC-0xEF */ + {0x57, 0x3B}, {0x57, 0xFA}, {0x57, 0xFC}, {0x59, 0x14}, /* 0xF0-0xF3 */ + {0x59, 0x47}, {0x59, 0x93}, {0x5B, 0xC4}, {0x5C, 0x90}, /* 0xF4-0xF7 */ + {0x5D, 0x0E}, {0x5D, 0xF1}, {0x5E, 0x7E}, {0x5F, 0xCC}, /* 0xF8-0xFB */ + {0x62, 0x80}, {0x65, 0xD7}, {0x65, 0xE3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x67, 0x1E}, {0x67, 0x1F}, {0x67, 0x5E}, /* 0xA0-0xA3 */ + {0x68, 0xCB}, {0x68, 0xC4}, {0x6A, 0x5F}, {0x6B, 0x3A}, /* 0xA4-0xA7 */ + {0x6C, 0x23}, {0x6C, 0x7D}, {0x6C, 0x82}, {0x6D, 0xC7}, /* 0xA8-0xAB */ + {0x73, 0x98}, {0x74, 0x26}, {0x74, 0x2A}, {0x74, 0x82}, /* 0xAC-0xAF */ + {0x74, 0xA3}, {0x75, 0x78}, {0x75, 0x7F}, {0x78, 0x81}, /* 0xB0-0xB3 */ + {0x78, 0xEF}, {0x79, 0x41}, {0x79, 0x47}, {0x79, 0x48}, /* 0xB4-0xB7 */ + {0x79, 0x7A}, {0x7B, 0x95}, {0x7D, 0x00}, {0x7D, 0xBA}, /* 0xB8-0xBB */ + {0x7F, 0x88}, {0x80, 0x06}, {0x80, 0x2D}, {0x80, 0x8C}, /* 0xBC-0xBF */ + {0x8A, 0x18}, {0x8B, 0x4F}, {0x8C, 0x48}, {0x8D, 0x77}, /* 0xC0-0xC3 */ + {0x93, 0x21}, {0x93, 0x24}, {0x98, 0xE2}, {0x99, 0x51}, /* 0xC4-0xC7 */ + {0x9A, 0x0E}, {0x9A, 0x0F}, {0x9A, 0x65}, {0x9E, 0x92}, /* 0xC8-0xCB */ + {0x7D, 0xCA}, {0x4F, 0x76}, {0x54, 0x09}, {0x62, 0xEE}, /* 0xCC-0xCF */ + {0x68, 0x54}, {0x91, 0xD1}, {0x55, 0xAB}, {0x51, 0x3A}, /* 0xD0-0xD3 */ + {0xF9, 0x0B}, {0xF9, 0x0C}, {0x5A, 0x1C}, {0x61, 0xE6}, /* 0xD4-0xD7 */ + {0xF9, 0x0D}, {0x62, 0xCF}, {0x62, 0xFF}, {0xF9, 0x0E}, /* 0xD8-0xDB */ + {0xF9, 0x0F}, {0xF9, 0x10}, {0xF9, 0x11}, {0xF9, 0x12}, /* 0xDC-0xDF */ + {0xF9, 0x13}, {0x90, 0xA3}, {0xF9, 0x14}, {0xF9, 0x15}, /* 0xE0-0xE3 */ + {0xF9, 0x16}, {0xF9, 0x17}, {0xF9, 0x18}, {0x8A, 0xFE}, /* 0xE4-0xE7 */ + {0xF9, 0x19}, {0xF9, 0x1A}, {0xF9, 0x1B}, {0xF9, 0x1C}, /* 0xE8-0xEB */ + {0x66, 0x96}, {0xF9, 0x1D}, {0x71, 0x56}, {0xF9, 0x1E}, /* 0xEC-0xEF */ + {0xF9, 0x1F}, {0x96, 0xE3}, {0xF9, 0x20}, {0x63, 0x4F}, /* 0xF0-0xF3 */ + {0x63, 0x7A}, {0x53, 0x57}, {0xF9, 0x21}, {0x67, 0x8F}, /* 0xF4-0xF7 */ + {0x69, 0x60}, {0x6E, 0x73}, {0xF9, 0x22}, {0x75, 0x37}, /* 0xF8-0xFB */ + {0xF9, 0x23}, {0xF9, 0x24}, {0xF9, 0x25}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x7D, 0x0D}, {0xF9, 0x26}, {0xF9, 0x27}, /* 0xA0-0xA3 */ + {0x88, 0x72}, {0x56, 0xCA}, {0x5A, 0x18}, {0xF9, 0x28}, /* 0xA4-0xA7 */ + {0xF9, 0x29}, {0xF9, 0x2A}, {0xF9, 0x2B}, {0xF9, 0x2C}, /* 0xA8-0xAB */ + {0x4E, 0x43}, {0xF9, 0x2D}, {0x51, 0x67}, {0x59, 0x48}, /* 0xAC-0xAF */ + {0x67, 0xF0}, {0x80, 0x10}, {0xF9, 0x2E}, {0x59, 0x73}, /* 0xB0-0xB3 */ + {0x5E, 0x74}, {0x64, 0x9A}, {0x79, 0xCA}, {0x5F, 0xF5}, /* 0xB4-0xB7 */ + {0x60, 0x6C}, {0x62, 0xC8}, {0x63, 0x7B}, {0x5B, 0xE7}, /* 0xB8-0xBB */ + {0x5B, 0xD7}, {0x52, 0xAA}, {0xF9, 0x2F}, {0x59, 0x74}, /* 0xBC-0xBF */ + {0x5F, 0x29}, {0x60, 0x12}, {0xF9, 0x30}, {0xF9, 0x31}, /* 0xC0-0xC3 */ + {0xF9, 0x32}, {0x74, 0x59}, {0xF9, 0x33}, {0xF9, 0x34}, /* 0xC4-0xC7 */ + {0xF9, 0x35}, {0xF9, 0x36}, {0xF9, 0x37}, {0xF9, 0x38}, /* 0xC8-0xCB */ + {0x99, 0xD1}, {0xF9, 0x39}, {0xF9, 0x3A}, {0xF9, 0x3B}, /* 0xCC-0xCF */ + {0xF9, 0x3C}, {0xF9, 0x3D}, {0xF9, 0x3E}, {0xF9, 0x3F}, /* 0xD0-0xD3 */ + {0xF9, 0x40}, {0xF9, 0x41}, {0xF9, 0x42}, {0xF9, 0x43}, /* 0xD4-0xD7 */ + {0x6F, 0xC3}, {0xF9, 0x44}, {0xF9, 0x45}, {0x81, 0xBF}, /* 0xD8-0xDB */ + {0x8F, 0xB2}, {0x60, 0xF1}, {0xF9, 0x46}, {0xF9, 0x47}, /* 0xDC-0xDF */ + {0x81, 0x66}, {0xF9, 0x48}, {0xF9, 0x49}, {0x5C, 0x3F}, /* 0xE0-0xE3 */ + {0xF9, 0x4A}, {0xF9, 0x4B}, {0xF9, 0x4C}, {0xF9, 0x4D}, /* 0xE4-0xE7 */ + {0xF9, 0x4E}, {0xF9, 0x4F}, {0xF9, 0x50}, {0xF9, 0x51}, /* 0xE8-0xEB */ + {0x5A, 0xE9}, {0x8A, 0x25}, {0x67, 0x7B}, {0x7D, 0x10}, /* 0xEC-0xEF */ + {0xF9, 0x52}, {0xF9, 0x53}, {0xF9, 0x54}, {0xF9, 0x55}, /* 0xF0-0xF3 */ + {0xF9, 0x56}, {0xF9, 0x57}, {0x80, 0xFD}, {0xF9, 0x58}, /* 0xF4-0xF7 */ + {0xF9, 0x59}, {0x5C, 0x3C}, {0x6C, 0xE5}, {0x53, 0x3F}, /* 0xF8-0xFB */ + {0x6E, 0xBA}, {0x59, 0x1A}, {0x83, 0x36}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x4E, 0x39}, {0x4E, 0xB6}, {0x4F, 0x46}, /* 0xA0-0xA3 */ + {0x55, 0xAE}, {0x57, 0x18}, {0x58, 0xC7}, {0x5F, 0x56}, /* 0xA4-0xA7 */ + {0x65, 0xB7}, {0x65, 0xE6}, {0x6A, 0x80}, {0x6B, 0xB5}, /* 0xA8-0xAB */ + {0x6E, 0x4D}, {0x77, 0xED}, {0x7A, 0xEF}, {0x7C, 0x1E}, /* 0xAC-0xAF */ + {0x7D, 0xDE}, {0x86, 0xCB}, {0x88, 0x92}, {0x91, 0x32}, /* 0xB0-0xB3 */ + {0x93, 0x5B}, {0x64, 0xBB}, {0x6F, 0xBE}, {0x73, 0x7A}, /* 0xB4-0xB7 */ + {0x75, 0xB8}, {0x90, 0x54}, {0x55, 0x56}, {0x57, 0x4D}, /* 0xB8-0xBB */ + {0x61, 0xBA}, {0x64, 0xD4}, {0x66, 0xC7}, {0x6D, 0xE1}, /* 0xBC-0xBF */ + {0x6E, 0x5B}, {0x6F, 0x6D}, {0x6F, 0xB9}, {0x75, 0xF0}, /* 0xC0-0xC3 */ + {0x80, 0x43}, {0x81, 0xBD}, {0x85, 0x41}, {0x89, 0x83}, /* 0xC4-0xC7 */ + {0x8A, 0xC7}, {0x8B, 0x5A}, {0x93, 0x1F}, {0x6C, 0x93}, /* 0xC8-0xCB */ + {0x75, 0x53}, {0x7B, 0x54}, {0x8E, 0x0F}, {0x90, 0x5D}, /* 0xCC-0xCF */ + {0x55, 0x10}, {0x58, 0x02}, {0x58, 0x58}, {0x5E, 0x62}, /* 0xD0-0xD3 */ + {0x62, 0x07}, {0x64, 0x9E}, {0x68, 0xE0}, {0x75, 0x76}, /* 0xD4-0xD7 */ + {0x7C, 0xD6}, {0x87, 0xB3}, {0x9E, 0xE8}, {0x4E, 0xE3}, /* 0xD8-0xDB */ + {0x57, 0x88}, {0x57, 0x6E}, {0x59, 0x27}, {0x5C, 0x0D}, /* 0xDC-0xDF */ + {0x5C, 0xB1}, {0x5E, 0x36}, {0x5F, 0x85}, {0x62, 0x34}, /* 0xE0-0xE3 */ + {0x64, 0xE1}, {0x73, 0xB3}, {0x81, 0xFA}, {0x88, 0x8B}, /* 0xE4-0xE7 */ + {0x8C, 0xB8}, {0x96, 0x8A}, {0x9E, 0xDB}, {0x5B, 0x85}, /* 0xE8-0xEB */ + {0x5F, 0xB7}, {0x60, 0xB3}, {0x50, 0x12}, {0x52, 0x00}, /* 0xEC-0xEF */ + {0x52, 0x30}, {0x57, 0x16}, {0x58, 0x35}, {0x58, 0x57}, /* 0xF0-0xF3 */ + {0x5C, 0x0E}, {0x5C, 0x60}, {0x5C, 0xF6}, {0x5D, 0x8B}, /* 0xF4-0xF7 */ + {0x5E, 0xA6}, {0x5F, 0x92}, {0x60, 0xBC}, {0x63, 0x11}, /* 0xF8-0xFB */ + {0x63, 0x89}, {0x64, 0x17}, {0x68, 0x43}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x68, 0xF9}, {0x6A, 0xC2}, {0x6D, 0xD8}, /* 0xA0-0xA3 */ + {0x6E, 0x21}, {0x6E, 0xD4}, {0x6F, 0xE4}, {0x71, 0xFE}, /* 0xA4-0xA7 */ + {0x76, 0xDC}, {0x77, 0x79}, {0x79, 0xB1}, {0x7A, 0x3B}, /* 0xA8-0xAB */ + {0x84, 0x04}, {0x89, 0xA9}, {0x8C, 0xED}, {0x8D, 0xF3}, /* 0xAC-0xAF */ + {0x8E, 0x48}, {0x90, 0x03}, {0x90, 0x14}, {0x90, 0x53}, /* 0xB0-0xB3 */ + {0x90, 0xFD}, {0x93, 0x4D}, {0x96, 0x76}, {0x97, 0xDC}, /* 0xB4-0xB7 */ + {0x6B, 0xD2}, {0x70, 0x06}, {0x72, 0x58}, {0x72, 0xA2}, /* 0xB8-0xBB */ + {0x73, 0x68}, {0x77, 0x63}, {0x79, 0xBF}, {0x7B, 0xE4}, /* 0xBC-0xBF */ + {0x7E, 0x9B}, {0x8B, 0x80}, {0x58, 0xA9}, {0x60, 0xC7}, /* 0xC0-0xC3 */ + {0x65, 0x66}, {0x65, 0xFD}, {0x66, 0xBE}, {0x6C, 0x8C}, /* 0xC4-0xC7 */ + {0x71, 0x1E}, {0x71, 0xC9}, {0x8C, 0x5A}, {0x98, 0x13}, /* 0xC8-0xCB */ + {0x4E, 0x6D}, {0x7A, 0x81}, {0x4E, 0xDD}, {0x51, 0xAC}, /* 0xCC-0xCF */ + {0x51, 0xCD}, {0x52, 0xD5}, {0x54, 0x0C}, {0x61, 0xA7}, /* 0xD0-0xD3 */ + {0x67, 0x71}, {0x68, 0x50}, {0x68, 0xDF}, {0x6D, 0x1E}, /* 0xD4-0xD7 */ + {0x6F, 0x7C}, {0x75, 0xBC}, {0x77, 0xB3}, {0x7A, 0xE5}, /* 0xD8-0xDB */ + {0x80, 0xF4}, {0x84, 0x63}, {0x92, 0x85}, {0x51, 0x5C}, /* 0xDC-0xDF */ + {0x65, 0x97}, {0x67, 0x5C}, {0x67, 0x93}, {0x75, 0xD8}, /* 0xE0-0xE3 */ + {0x7A, 0xC7}, {0x83, 0x73}, {0xF9, 0x5A}, {0x8C, 0x46}, /* 0xE4-0xE7 */ + {0x90, 0x17}, {0x98, 0x2D}, {0x5C, 0x6F}, {0x81, 0xC0}, /* 0xE8-0xEB */ + {0x82, 0x9A}, {0x90, 0x41}, {0x90, 0x6F}, {0x92, 0x0D}, /* 0xEC-0xEF */ + {0x5F, 0x97}, {0x5D, 0x9D}, {0x6A, 0x59}, {0x71, 0xC8}, /* 0xF0-0xF3 */ + {0x76, 0x7B}, {0x7B, 0x49}, {0x85, 0xE4}, {0x8B, 0x04}, /* 0xF4-0xF7 */ + {0x91, 0x27}, {0x9A, 0x30}, {0x55, 0x87}, {0x61, 0xF6}, /* 0xF8-0xFB */ + {0xF9, 0x5B}, {0x76, 0x69}, {0x7F, 0x85}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x86, 0x3F}, {0x87, 0xBA}, {0x88, 0xF8}, /* 0xA0-0xA3 */ + {0x90, 0x8F}, {0xF9, 0x5C}, {0x6D, 0x1B}, {0x70, 0xD9}, /* 0xA4-0xA7 */ + {0x73, 0xDE}, {0x7D, 0x61}, {0x84, 0x3D}, {0xF9, 0x5D}, /* 0xA8-0xAB */ + {0x91, 0x6A}, {0x99, 0xF1}, {0xF9, 0x5E}, {0x4E, 0x82}, /* 0xAC-0xAF */ + {0x53, 0x75}, {0x6B, 0x04}, {0x6B, 0x12}, {0x70, 0x3E}, /* 0xB0-0xB3 */ + {0x72, 0x1B}, {0x86, 0x2D}, {0x9E, 0x1E}, {0x52, 0x4C}, /* 0xB4-0xB7 */ + {0x8F, 0xA3}, {0x5D, 0x50}, {0x64, 0xE5}, {0x65, 0x2C}, /* 0xB8-0xBB */ + {0x6B, 0x16}, {0x6F, 0xEB}, {0x7C, 0x43}, {0x7E, 0x9C}, /* 0xBC-0xBF */ + {0x85, 0xCD}, {0x89, 0x64}, {0x89, 0xBD}, {0x62, 0xC9}, /* 0xC0-0xC3 */ + {0x81, 0xD8}, {0x88, 0x1F}, {0x5E, 0xCA}, {0x67, 0x17}, /* 0xC4-0xC7 */ + {0x6D, 0x6A}, {0x72, 0xFC}, {0x74, 0x05}, {0x74, 0x6F}, /* 0xC8-0xCB */ + {0x87, 0x82}, {0x90, 0xDE}, {0x4F, 0x86}, {0x5D, 0x0D}, /* 0xCC-0xCF */ + {0x5F, 0xA0}, {0x84, 0x0A}, {0x51, 0xB7}, {0x63, 0xA0}, /* 0xD0-0xD3 */ + {0x75, 0x65}, {0x4E, 0xAE}, {0x50, 0x06}, {0x51, 0x69}, /* 0xD4-0xD7 */ + {0x51, 0xC9}, {0x68, 0x81}, {0x6A, 0x11}, {0x7C, 0xAE}, /* 0xD8-0xDB */ + {0x7C, 0xB1}, {0x7C, 0xE7}, {0x82, 0x6F}, {0x8A, 0xD2}, /* 0xDC-0xDF */ + {0x8F, 0x1B}, {0x91, 0xCF}, {0x4F, 0xB6}, {0x51, 0x37}, /* 0xE0-0xE3 */ + {0x52, 0xF5}, {0x54, 0x42}, {0x5E, 0xEC}, {0x61, 0x6E}, /* 0xE4-0xE7 */ + {0x62, 0x3E}, {0x65, 0xC5}, {0x6A, 0xDA}, {0x6F, 0xFE}, /* 0xE8-0xEB */ + {0x79, 0x2A}, {0x85, 0xDC}, {0x88, 0x23}, {0x95, 0xAD}, /* 0xEC-0xEF */ + {0x9A, 0x62}, {0x9A, 0x6A}, {0x9E, 0x97}, {0x9E, 0xCE}, /* 0xF0-0xF3 */ + {0x52, 0x9B}, {0x66, 0xC6}, {0x6B, 0x77}, {0x70, 0x1D}, /* 0xF4-0xF7 */ + {0x79, 0x2B}, {0x8F, 0x62}, {0x97, 0x42}, {0x61, 0x90}, /* 0xF8-0xFB */ + {0x62, 0x00}, {0x65, 0x23}, {0x6F, 0x23}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x71, 0x49}, {0x74, 0x89}, {0x7D, 0xF4}, /* 0xA0-0xA3 */ + {0x80, 0x6F}, {0x84, 0xEE}, {0x8F, 0x26}, {0x90, 0x23}, /* 0xA4-0xA7 */ + {0x93, 0x4A}, {0x51, 0xBD}, {0x52, 0x17}, {0x52, 0xA3}, /* 0xA8-0xAB */ + {0x6D, 0x0C}, {0x70, 0xC8}, {0x88, 0xC2}, {0x5E, 0xC9}, /* 0xAC-0xAF */ + {0x65, 0x82}, {0x6B, 0xAE}, {0x6F, 0xC2}, {0x7C, 0x3E}, /* 0xB0-0xB3 */ + {0x73, 0x75}, {0x4E, 0xE4}, {0x4F, 0x36}, {0x56, 0xF9}, /* 0xB4-0xB7 */ + {0xF9, 0x5F}, {0x5C, 0xBA}, {0x5D, 0xBA}, {0x60, 0x1C}, /* 0xB8-0xBB */ + {0x73, 0xB2}, {0x7B, 0x2D}, {0x7F, 0x9A}, {0x7F, 0xCE}, /* 0xBC-0xBF */ + {0x80, 0x46}, {0x90, 0x1E}, {0x92, 0x34}, {0x96, 0xF6}, /* 0xC0-0xC3 */ + {0x97, 0x48}, {0x98, 0x18}, {0x9F, 0x61}, {0x4F, 0x8B}, /* 0xC4-0xC7 */ + {0x6F, 0xA7}, {0x79, 0xAE}, {0x91, 0xB4}, {0x96, 0xB7}, /* 0xC8-0xCB */ + {0x52, 0xDE}, {0xF9, 0x60}, {0x64, 0x88}, {0x64, 0xC4}, /* 0xCC-0xCF */ + {0x6A, 0xD3}, {0x6F, 0x5E}, {0x70, 0x18}, {0x72, 0x10}, /* 0xD0-0xD3 */ + {0x76, 0xE7}, {0x80, 0x01}, {0x86, 0x06}, {0x86, 0x5C}, /* 0xD4-0xD7 */ + {0x8D, 0xEF}, {0x8F, 0x05}, {0x97, 0x32}, {0x9B, 0x6F}, /* 0xD8-0xDB */ + {0x9D, 0xFA}, {0x9E, 0x75}, {0x78, 0x8C}, {0x79, 0x7F}, /* 0xDC-0xDF */ + {0x7D, 0xA0}, {0x83, 0xC9}, {0x93, 0x04}, {0x9E, 0x7F}, /* 0xE0-0xE3 */ + {0x9E, 0x93}, {0x8A, 0xD6}, {0x58, 0xDF}, {0x5F, 0x04}, /* 0xE4-0xE7 */ + {0x67, 0x27}, {0x70, 0x27}, {0x74, 0xCF}, {0x7C, 0x60}, /* 0xE8-0xEB */ + {0x80, 0x7E}, {0x51, 0x21}, {0x70, 0x28}, {0x72, 0x62}, /* 0xEC-0xEF */ + {0x78, 0xCA}, {0x8C, 0xC2}, {0x8C, 0xDA}, {0x8C, 0xF4}, /* 0xF0-0xF3 */ + {0x96, 0xF7}, {0x4E, 0x86}, {0x50, 0xDA}, {0x5B, 0xEE}, /* 0xF4-0xF7 */ + {0x5E, 0xD6}, {0x65, 0x99}, {0x71, 0xCE}, {0x76, 0x42}, /* 0xF8-0xFB */ + {0x77, 0xAD}, {0x80, 0x4A}, {0x84, 0xFC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x90, 0x7C}, {0x9B, 0x27}, {0x9F, 0x8D}, /* 0xA0-0xA3 */ + {0x58, 0xD8}, {0x5A, 0x41}, {0x5C, 0x62}, {0x6A, 0x13}, /* 0xA4-0xA7 */ + {0x6D, 0xDA}, {0x6F, 0x0F}, {0x76, 0x3B}, {0x7D, 0x2F}, /* 0xA8-0xAB */ + {0x7E, 0x37}, {0x85, 0x1E}, {0x89, 0x38}, {0x93, 0xE4}, /* 0xAC-0xAF */ + {0x96, 0x4B}, {0x52, 0x89}, {0x65, 0xD2}, {0x67, 0xF3}, /* 0xB0-0xB3 */ + {0x69, 0xB4}, {0x6D, 0x41}, {0x6E, 0x9C}, {0x70, 0x0F}, /* 0xB4-0xB7 */ + {0x74, 0x09}, {0x74, 0x60}, {0x75, 0x59}, {0x76, 0x24}, /* 0xB8-0xBB */ + {0x78, 0x6B}, {0x8B, 0x2C}, {0x98, 0x5E}, {0x51, 0x6D}, /* 0xBC-0xBF */ + {0x62, 0x2E}, {0x96, 0x78}, {0x4F, 0x96}, {0x50, 0x2B}, /* 0xC0-0xC3 */ + {0x5D, 0x19}, {0x6D, 0xEA}, {0x7D, 0xB8}, {0x8F, 0x2A}, /* 0xC4-0xC7 */ + {0x5F, 0x8B}, {0x61, 0x44}, {0x68, 0x17}, {0xF9, 0x61}, /* 0xC8-0xCB */ + {0x96, 0x86}, {0x52, 0xD2}, {0x80, 0x8B}, {0x51, 0xDC}, /* 0xCC-0xCF */ + {0x51, 0xCC}, {0x69, 0x5E}, {0x7A, 0x1C}, {0x7D, 0xBE}, /* 0xD0-0xD3 */ + {0x83, 0xF1}, {0x96, 0x75}, {0x4F, 0xDA}, {0x52, 0x29}, /* 0xD4-0xD7 */ + {0x53, 0x98}, {0x54, 0x0F}, {0x55, 0x0E}, {0x5C, 0x65}, /* 0xD8-0xDB */ + {0x60, 0xA7}, {0x67, 0x4E}, {0x68, 0xA8}, {0x6D, 0x6C}, /* 0xDC-0xDF */ + {0x72, 0x81}, {0x72, 0xF8}, {0x74, 0x06}, {0x74, 0x83}, /* 0xE0-0xE3 */ + {0xF9, 0x62}, {0x75, 0xE2}, {0x7C, 0x6C}, {0x7F, 0x79}, /* 0xE4-0xE7 */ + {0x7F, 0xB8}, {0x83, 0x89}, {0x88, 0xCF}, {0x88, 0xE1}, /* 0xE8-0xEB */ + {0x91, 0xCC}, {0x91, 0xD0}, {0x96, 0xE2}, {0x9B, 0xC9}, /* 0xEC-0xEF */ + {0x54, 0x1D}, {0x6F, 0x7E}, {0x71, 0xD0}, {0x74, 0x98}, /* 0xF0-0xF3 */ + {0x85, 0xFA}, {0x8E, 0xAA}, {0x96, 0xA3}, {0x9C, 0x57}, /* 0xF4-0xF7 */ + {0x9E, 0x9F}, {0x67, 0x97}, {0x6D, 0xCB}, {0x74, 0x33}, /* 0xF8-0xFB */ + {0x81, 0xE8}, {0x97, 0x16}, {0x78, 0x2C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x7A, 0xCB}, {0x7B, 0x20}, {0x7C, 0x92}, /* 0xA0-0xA3 */ + {0x64, 0x69}, {0x74, 0x6A}, {0x75, 0xF2}, {0x78, 0xBC}, /* 0xA4-0xA7 */ + {0x78, 0xE8}, {0x99, 0xAC}, {0x9B, 0x54}, {0x9E, 0xBB}, /* 0xA8-0xAB */ + {0x5B, 0xDE}, {0x5E, 0x55}, {0x6F, 0x20}, {0x81, 0x9C}, /* 0xAC-0xAF */ + {0x83, 0xAB}, {0x90, 0x88}, {0x4E, 0x07}, {0x53, 0x4D}, /* 0xB0-0xB3 */ + {0x5A, 0x29}, {0x5D, 0xD2}, {0x5F, 0x4E}, {0x61, 0x62}, /* 0xB4-0xB7 */ + {0x63, 0x3D}, {0x66, 0x69}, {0x66, 0xFC}, {0x6E, 0xFF}, /* 0xB8-0xBB */ + {0x6F, 0x2B}, {0x70, 0x63}, {0x77, 0x9E}, {0x84, 0x2C}, /* 0xBC-0xBF */ + {0x85, 0x13}, {0x88, 0x3B}, {0x8F, 0x13}, {0x99, 0x45}, /* 0xC0-0xC3 */ + {0x9C, 0x3B}, {0x55, 0x1C}, {0x62, 0xB9}, {0x67, 0x2B}, /* 0xC4-0xC7 */ + {0x6C, 0xAB}, {0x83, 0x09}, {0x89, 0x6A}, {0x97, 0x7A}, /* 0xC8-0xCB */ + {0x4E, 0xA1}, {0x59, 0x84}, {0x5F, 0xD8}, {0x5F, 0xD9}, /* 0xCC-0xCF */ + {0x67, 0x1B}, {0x7D, 0xB2}, {0x7F, 0x54}, {0x82, 0x92}, /* 0xD0-0xD3 */ + {0x83, 0x2B}, {0x83, 0xBD}, {0x8F, 0x1E}, {0x90, 0x99}, /* 0xD4-0xD7 */ + {0x57, 0xCB}, {0x59, 0xB9}, {0x5A, 0x92}, {0x5B, 0xD0}, /* 0xD8-0xDB */ + {0x66, 0x27}, {0x67, 0x9A}, {0x68, 0x85}, {0x6B, 0xCF}, /* 0xDC-0xDF */ + {0x71, 0x64}, {0x7F, 0x75}, {0x8C, 0xB7}, {0x8C, 0xE3}, /* 0xE0-0xE3 */ + {0x90, 0x81}, {0x9B, 0x45}, {0x81, 0x08}, {0x8C, 0x8A}, /* 0xE4-0xE7 */ + {0x96, 0x4C}, {0x9A, 0x40}, {0x9E, 0xA5}, {0x5B, 0x5F}, /* 0xE8-0xEB */ + {0x6C, 0x13}, {0x73, 0x1B}, {0x76, 0xF2}, {0x76, 0xDF}, /* 0xEC-0xEF */ + {0x84, 0x0C}, {0x51, 0xAA}, {0x89, 0x93}, {0x51, 0x4D}, /* 0xF0-0xF3 */ + {0x51, 0x95}, {0x52, 0xC9}, {0x68, 0xC9}, {0x6C, 0x94}, /* 0xF4-0xF7 */ + {0x77, 0x04}, {0x77, 0x20}, {0x7D, 0xBF}, {0x7D, 0xEC}, /* 0xF8-0xFB */ + {0x97, 0x62}, {0x9E, 0xB5}, {0x6E, 0xC5}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x85, 0x11}, {0x51, 0xA5}, {0x54, 0x0D}, /* 0xA0-0xA3 */ + {0x54, 0x7D}, {0x66, 0x0E}, {0x66, 0x9D}, {0x69, 0x27}, /* 0xA4-0xA7 */ + {0x6E, 0x9F}, {0x76, 0xBF}, {0x77, 0x91}, {0x83, 0x17}, /* 0xA8-0xAB */ + {0x84, 0xC2}, {0x87, 0x9F}, {0x91, 0x69}, {0x92, 0x98}, /* 0xAC-0xAF */ + {0x9C, 0xF4}, {0x88, 0x82}, {0x4F, 0xAE}, {0x51, 0x92}, /* 0xB0-0xB3 */ + {0x52, 0xDF}, {0x59, 0xC6}, {0x5E, 0x3D}, {0x61, 0x55}, /* 0xB4-0xB7 */ + {0x64, 0x78}, {0x64, 0x79}, {0x66, 0xAE}, {0x67, 0xD0}, /* 0xB8-0xBB */ + {0x6A, 0x21}, {0x6B, 0xCD}, {0x6B, 0xDB}, {0x72, 0x5F}, /* 0xBC-0xBF */ + {0x72, 0x61}, {0x74, 0x41}, {0x77, 0x38}, {0x77, 0xDB}, /* 0xC0-0xC3 */ + {0x80, 0x17}, {0x82, 0xBC}, {0x83, 0x05}, {0x8B, 0x00}, /* 0xC4-0xC7 */ + {0x8B, 0x28}, {0x8C, 0x8C}, {0x67, 0x28}, {0x6C, 0x90}, /* 0xC8-0xCB */ + {0x72, 0x67}, {0x76, 0xEE}, {0x77, 0x66}, {0x7A, 0x46}, /* 0xCC-0xCF */ + {0x9D, 0xA9}, {0x6B, 0x7F}, {0x6C, 0x92}, {0x59, 0x22}, /* 0xD0-0xD3 */ + {0x67, 0x26}, {0x84, 0x99}, {0x53, 0x6F}, {0x58, 0x93}, /* 0xD4-0xD7 */ + {0x59, 0x99}, {0x5E, 0xDF}, {0x63, 0xCF}, {0x66, 0x34}, /* 0xD8-0xDB */ + {0x67, 0x73}, {0x6E, 0x3A}, {0x73, 0x2B}, {0x7A, 0xD7}, /* 0xDC-0xDF */ + {0x82, 0xD7}, {0x93, 0x28}, {0x52, 0xD9}, {0x5D, 0xEB}, /* 0xE0-0xE3 */ + {0x61, 0xAE}, {0x61, 0xCB}, {0x62, 0x0A}, {0x62, 0xC7}, /* 0xE4-0xE7 */ + {0x64, 0xAB}, {0x65, 0xE0}, {0x69, 0x59}, {0x6B, 0x66}, /* 0xE8-0xEB */ + {0x6B, 0xCB}, {0x71, 0x21}, {0x73, 0xF7}, {0x75, 0x5D}, /* 0xEC-0xEF */ + {0x7E, 0x46}, {0x82, 0x1E}, {0x83, 0x02}, {0x85, 0x6A}, /* 0xF0-0xF3 */ + {0x8A, 0xA3}, {0x8C, 0xBF}, {0x97, 0x27}, {0x9D, 0x61}, /* 0xF4-0xF7 */ + {0x58, 0xA8}, {0x9E, 0xD8}, {0x50, 0x11}, {0x52, 0x0E}, /* 0xF8-0xFB */ + {0x54, 0x3B}, {0x55, 0x4F}, {0x65, 0x87}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x6C, 0x76}, {0x7D, 0x0A}, {0x7D, 0x0B}, /* 0xA0-0xA3 */ + {0x80, 0x5E}, {0x86, 0x8A}, {0x95, 0x80}, {0x96, 0xEF}, /* 0xA4-0xA7 */ + {0x52, 0xFF}, {0x6C, 0x95}, {0x72, 0x69}, {0x54, 0x73}, /* 0xA8-0xAB */ + {0x5A, 0x9A}, {0x5C, 0x3E}, {0x5D, 0x4B}, {0x5F, 0x4C}, /* 0xAC-0xAF */ + {0x5F, 0xAE}, {0x67, 0x2A}, {0x68, 0xB6}, {0x69, 0x63}, /* 0xB0-0xB3 */ + {0x6E, 0x3C}, {0x6E, 0x44}, {0x77, 0x09}, {0x7C, 0x73}, /* 0xB4-0xB7 */ + {0x7F, 0x8E}, {0x85, 0x87}, {0x8B, 0x0E}, {0x8F, 0xF7}, /* 0xB8-0xBB */ + {0x97, 0x61}, {0x9E, 0xF4}, {0x5C, 0xB7}, {0x60, 0xB6}, /* 0xBC-0xBF */ + {0x61, 0x0D}, {0x61, 0xAB}, {0x65, 0x4F}, {0x65, 0xFB}, /* 0xC0-0xC3 */ + {0x65, 0xFC}, {0x6C, 0x11}, {0x6C, 0xEF}, {0x73, 0x9F}, /* 0xC4-0xC7 */ + {0x73, 0xC9}, {0x7D, 0xE1}, {0x95, 0x94}, {0x5B, 0xC6}, /* 0xC8-0xCB */ + {0x87, 0x1C}, {0x8B, 0x10}, {0x52, 0x5D}, {0x53, 0x5A}, /* 0xCC-0xCF */ + {0x62, 0xCD}, {0x64, 0x0F}, {0x64, 0xB2}, {0x67, 0x34}, /* 0xD0-0xD3 */ + {0x6A, 0x38}, {0x6C, 0xCA}, {0x73, 0xC0}, {0x74, 0x9E}, /* 0xD4-0xD7 */ + {0x7B, 0x94}, {0x7C, 0x95}, {0x7E, 0x1B}, {0x81, 0x8A}, /* 0xD8-0xDB */ + {0x82, 0x36}, {0x85, 0x84}, {0x8F, 0xEB}, {0x96, 0xF9}, /* 0xDC-0xDF */ + {0x99, 0xC1}, {0x4F, 0x34}, {0x53, 0x4A}, {0x53, 0xCD}, /* 0xE0-0xE3 */ + {0x53, 0xDB}, {0x62, 0xCC}, {0x64, 0x2C}, {0x65, 0x00}, /* 0xE4-0xE7 */ + {0x65, 0x91}, {0x69, 0xC3}, {0x6C, 0xEE}, {0x6F, 0x58}, /* 0xE8-0xEB */ + {0x73, 0xED}, {0x75, 0x54}, {0x76, 0x22}, {0x76, 0xE4}, /* 0xEC-0xEF */ + {0x76, 0xFC}, {0x78, 0xD0}, {0x78, 0xFB}, {0x79, 0x2C}, /* 0xF0-0xF3 */ + {0x7D, 0x46}, {0x82, 0x2C}, {0x87, 0xE0}, {0x8F, 0xD4}, /* 0xF4-0xF7 */ + {0x98, 0x12}, {0x98, 0xEF}, {0x52, 0xC3}, {0x62, 0xD4}, /* 0xF8-0xFB */ + {0x64, 0xA5}, {0x6E, 0x24}, {0x6F, 0x51}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x76, 0x7C}, {0x8D, 0xCB}, {0x91, 0xB1}, /* 0xA0-0xA3 */ + {0x92, 0x62}, {0x9A, 0xEE}, {0x9B, 0x43}, {0x50, 0x23}, /* 0xA4-0xA7 */ + {0x50, 0x8D}, {0x57, 0x4A}, {0x59, 0xA8}, {0x5C, 0x28}, /* 0xA8-0xAB */ + {0x5E, 0x47}, {0x5F, 0x77}, {0x62, 0x3F}, {0x65, 0x3E}, /* 0xAC-0xAF */ + {0x65, 0xB9}, {0x65, 0xC1}, {0x66, 0x09}, {0x67, 0x8B}, /* 0xB0-0xB3 */ + {0x69, 0x9C}, {0x6E, 0xC2}, {0x78, 0xC5}, {0x7D, 0x21}, /* 0xB4-0xB7 */ + {0x80, 0xAA}, {0x81, 0x80}, {0x82, 0x2B}, {0x82, 0xB3}, /* 0xB8-0xBB */ + {0x84, 0xA1}, {0x86, 0x8C}, {0x8A, 0x2A}, {0x8B, 0x17}, /* 0xBC-0xBF */ + {0x90, 0xA6}, {0x96, 0x32}, {0x9F, 0x90}, {0x50, 0x0D}, /* 0xC0-0xC3 */ + {0x4F, 0xF3}, {0xF9, 0x63}, {0x57, 0xF9}, {0x5F, 0x98}, /* 0xC4-0xC7 */ + {0x62, 0xDC}, {0x63, 0x92}, {0x67, 0x6F}, {0x6E, 0x43}, /* 0xC8-0xCB */ + {0x71, 0x19}, {0x76, 0xC3}, {0x80, 0xCC}, {0x80, 0xDA}, /* 0xCC-0xCF */ + {0x88, 0xF4}, {0x88, 0xF5}, {0x89, 0x19}, {0x8C, 0xE0}, /* 0xD0-0xD3 */ + {0x8F, 0x29}, {0x91, 0x4D}, {0x96, 0x6A}, {0x4F, 0x2F}, /* 0xD4-0xD7 */ + {0x4F, 0x70}, {0x5E, 0x1B}, {0x67, 0xCF}, {0x68, 0x22}, /* 0xD8-0xDB */ + {0x76, 0x7D}, {0x76, 0x7E}, {0x9B, 0x44}, {0x5E, 0x61}, /* 0xDC-0xDF */ + {0x6A, 0x0A}, {0x71, 0x69}, {0x71, 0xD4}, {0x75, 0x6A}, /* 0xE0-0xE3 */ + {0xF9, 0x64}, {0x7E, 0x41}, {0x85, 0x43}, {0x85, 0xE9}, /* 0xE4-0xE7 */ + {0x98, 0xDC}, {0x4F, 0x10}, {0x7B, 0x4F}, {0x7F, 0x70}, /* 0xE8-0xEB */ + {0x95, 0xA5}, {0x51, 0xE1}, {0x5E, 0x06}, {0x68, 0xB5}, /* 0xEC-0xEF */ + {0x6C, 0x3E}, {0x6C, 0x4E}, {0x6C, 0xDB}, {0x72, 0xAF}, /* 0xF0-0xF3 */ + {0x7B, 0xC4}, {0x83, 0x03}, {0x6C, 0xD5}, {0x74, 0x3A}, /* 0xF4-0xF7 */ + {0x50, 0xFB}, {0x52, 0x88}, {0x58, 0xC1}, {0x64, 0xD8}, /* 0xF8-0xFB */ + {0x6A, 0x97}, {0x74, 0xA7}, {0x76, 0x56}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x78, 0xA7}, {0x86, 0x17}, {0x95, 0xE2}, /* 0xA0-0xA3 */ + {0x97, 0x39}, {0xF9, 0x65}, {0x53, 0x5E}, {0x5F, 0x01}, /* 0xA4-0xA7 */ + {0x8B, 0x8A}, {0x8F, 0xA8}, {0x8F, 0xAF}, {0x90, 0x8A}, /* 0xA8-0xAB */ + {0x52, 0x25}, {0x77, 0xA5}, {0x9C, 0x49}, {0x9F, 0x08}, /* 0xAC-0xAF */ + {0x4E, 0x19}, {0x50, 0x02}, {0x51, 0x75}, {0x5C, 0x5B}, /* 0xB0-0xB3 */ + {0x5E, 0x77}, {0x66, 0x1E}, {0x66, 0x3A}, {0x67, 0xC4}, /* 0xB4-0xB7 */ + {0x68, 0xC5}, {0x70, 0xB3}, {0x75, 0x01}, {0x75, 0xC5}, /* 0xB8-0xBB */ + {0x79, 0xC9}, {0x7A, 0xDD}, {0x8F, 0x27}, {0x99, 0x20}, /* 0xBC-0xBF */ + {0x9A, 0x08}, {0x4F, 0xDD}, {0x58, 0x21}, {0x58, 0x31}, /* 0xC0-0xC3 */ + {0x5B, 0xF6}, {0x66, 0x6E}, {0x6B, 0x65}, {0x6D, 0x11}, /* 0xC4-0xC7 */ + {0x6E, 0x7A}, {0x6F, 0x7D}, {0x73, 0xE4}, {0x75, 0x2B}, /* 0xC8-0xCB */ + {0x83, 0xE9}, {0x88, 0xDC}, {0x89, 0x13}, {0x8B, 0x5C}, /* 0xCC-0xCF */ + {0x8F, 0x14}, {0x4F, 0x0F}, {0x50, 0xD5}, {0x53, 0x10}, /* 0xD0-0xD3 */ + {0x53, 0x5C}, {0x5B, 0x93}, {0x5F, 0xA9}, {0x67, 0x0D}, /* 0xD4-0xD7 */ + {0x79, 0x8F}, {0x81, 0x79}, {0x83, 0x2F}, {0x85, 0x14}, /* 0xD8-0xDB */ + {0x89, 0x07}, {0x89, 0x86}, {0x8F, 0x39}, {0x8F, 0x3B}, /* 0xDC-0xDF */ + {0x99, 0xA5}, {0x9C, 0x12}, {0x67, 0x2C}, {0x4E, 0x76}, /* 0xE0-0xE3 */ + {0x4F, 0xF8}, {0x59, 0x49}, {0x5C, 0x01}, {0x5C, 0xEF}, /* 0xE4-0xE7 */ + {0x5C, 0xF0}, {0x63, 0x67}, {0x68, 0xD2}, {0x70, 0xFD}, /* 0xE8-0xEB */ + {0x71, 0xA2}, {0x74, 0x2B}, {0x7E, 0x2B}, {0x84, 0xEC}, /* 0xEC-0xEF */ + {0x87, 0x02}, {0x90, 0x22}, {0x92, 0xD2}, {0x9C, 0xF3}, /* 0xF0-0xF3 */ + {0x4E, 0x0D}, {0x4E, 0xD8}, {0x4F, 0xEF}, {0x50, 0x85}, /* 0xF4-0xF7 */ + {0x52, 0x56}, {0x52, 0x6F}, {0x54, 0x26}, {0x54, 0x90}, /* 0xF8-0xFB */ + {0x57, 0xE0}, {0x59, 0x2B}, {0x5A, 0x66}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x5B, 0x5A}, {0x5B, 0x75}, {0x5B, 0xCC}, /* 0xA0-0xA3 */ + {0x5E, 0x9C}, {0xF9, 0x66}, {0x62, 0x76}, {0x65, 0x77}, /* 0xA4-0xA7 */ + {0x65, 0xA7}, {0x6D, 0x6E}, {0x6E, 0xA5}, {0x72, 0x36}, /* 0xA8-0xAB */ + {0x7B, 0x26}, {0x7C, 0x3F}, {0x7F, 0x36}, {0x81, 0x50}, /* 0xAC-0xAF */ + {0x81, 0x51}, {0x81, 0x9A}, {0x82, 0x40}, {0x82, 0x99}, /* 0xB0-0xB3 */ + {0x83, 0xA9}, {0x8A, 0x03}, {0x8C, 0xA0}, {0x8C, 0xE6}, /* 0xB4-0xB7 */ + {0x8C, 0xFB}, {0x8D, 0x74}, {0x8D, 0xBA}, {0x90, 0xE8}, /* 0xB8-0xBB */ + {0x91, 0xDC}, {0x96, 0x1C}, {0x96, 0x44}, {0x99, 0xD9}, /* 0xBC-0xBF */ + {0x9C, 0xE7}, {0x53, 0x17}, {0x52, 0x06}, {0x54, 0x29}, /* 0xC0-0xC3 */ + {0x56, 0x74}, {0x58, 0xB3}, {0x59, 0x54}, {0x59, 0x6E}, /* 0xC4-0xC7 */ + {0x5F, 0xFF}, {0x61, 0xA4}, {0x62, 0x6E}, {0x66, 0x10}, /* 0xC8-0xCB */ + {0x6C, 0x7E}, {0x71, 0x1A}, {0x76, 0xC6}, {0x7C, 0x89}, /* 0xCC-0xCF */ + {0x7C, 0xDE}, {0x7D, 0x1B}, {0x82, 0xAC}, {0x8C, 0xC1}, /* 0xD0-0xD3 */ + {0x96, 0xF0}, {0xF9, 0x67}, {0x4F, 0x5B}, {0x5F, 0x17}, /* 0xD4-0xD7 */ + {0x5F, 0x7F}, {0x62, 0xC2}, {0x5D, 0x29}, {0x67, 0x0B}, /* 0xD8-0xDB */ + {0x68, 0xDA}, {0x78, 0x7C}, {0x7E, 0x43}, {0x9D, 0x6C}, /* 0xDC-0xDF */ + {0x4E, 0x15}, {0x50, 0x99}, {0x53, 0x15}, {0x53, 0x2A}, /* 0xE0-0xE3 */ + {0x53, 0x51}, {0x59, 0x83}, {0x5A, 0x62}, {0x5E, 0x87}, /* 0xE4-0xE7 */ + {0x60, 0xB2}, {0x61, 0x8A}, {0x62, 0x49}, {0x62, 0x79}, /* 0xE8-0xEB */ + {0x65, 0x90}, {0x67, 0x87}, {0x69, 0xA7}, {0x6B, 0xD4}, /* 0xEC-0xEF */ + {0x6B, 0xD6}, {0x6B, 0xD7}, {0x6B, 0xD8}, {0x6C, 0xB8}, /* 0xF0-0xF3 */ + {0xF9, 0x68}, {0x74, 0x35}, {0x75, 0xFA}, {0x78, 0x12}, /* 0xF4-0xF7 */ + {0x78, 0x91}, {0x79, 0xD5}, {0x79, 0xD8}, {0x7C, 0x83}, /* 0xF8-0xFB */ + {0x7D, 0xCB}, {0x7F, 0xE1}, {0x80, 0xA5}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x81, 0x3E}, {0x81, 0xC2}, {0x83, 0xF2}, /* 0xA0-0xA3 */ + {0x87, 0x1A}, {0x88, 0xE8}, {0x8A, 0xB9}, {0x8B, 0x6C}, /* 0xA4-0xA7 */ + {0x8C, 0xBB}, {0x91, 0x19}, {0x97, 0x5E}, {0x98, 0xDB}, /* 0xA8-0xAB */ + {0x9F, 0x3B}, {0x56, 0xAC}, {0x5B, 0x2A}, {0x5F, 0x6C}, /* 0xAC-0xAF */ + {0x65, 0x8C}, {0x6A, 0xB3}, {0x6B, 0xAF}, {0x6D, 0x5C}, /* 0xB0-0xB3 */ + {0x6F, 0xF1}, {0x70, 0x15}, {0x72, 0x5D}, {0x73, 0xAD}, /* 0xB4-0xB7 */ + {0x8C, 0xA7}, {0x8C, 0xD3}, {0x98, 0x3B}, {0x61, 0x91}, /* 0xB8-0xBB */ + {0x6C, 0x37}, {0x80, 0x58}, {0x9A, 0x01}, {0x4E, 0x4D}, /* 0xBC-0xBF */ + {0x4E, 0x8B}, {0x4E, 0x9B}, {0x4E, 0xD5}, {0x4F, 0x3A}, /* 0xC0-0xC3 */ + {0x4F, 0x3C}, {0x4F, 0x7F}, {0x4F, 0xDF}, {0x50, 0xFF}, /* 0xC4-0xC7 */ + {0x53, 0xF2}, {0x53, 0xF8}, {0x55, 0x06}, {0x55, 0xE3}, /* 0xC8-0xCB */ + {0x56, 0xDB}, {0x58, 0xEB}, {0x59, 0x62}, {0x5A, 0x11}, /* 0xCC-0xCF */ + {0x5B, 0xEB}, {0x5B, 0xFA}, {0x5C, 0x04}, {0x5D, 0xF3}, /* 0xD0-0xD3 */ + {0x5E, 0x2B}, {0x5F, 0x99}, {0x60, 0x1D}, {0x63, 0x68}, /* 0xD4-0xD7 */ + {0x65, 0x9C}, {0x65, 0xAF}, {0x67, 0xF6}, {0x67, 0xFB}, /* 0xD8-0xDB */ + {0x68, 0xAD}, {0x6B, 0x7B}, {0x6C, 0x99}, {0x6C, 0xD7}, /* 0xDC-0xDF */ + {0x6E, 0x23}, {0x70, 0x09}, {0x73, 0x45}, {0x78, 0x02}, /* 0xE0-0xE3 */ + {0x79, 0x3E}, {0x79, 0x40}, {0x79, 0x60}, {0x79, 0xC1}, /* 0xE4-0xE7 */ + {0x7B, 0xE9}, {0x7D, 0x17}, {0x7D, 0x72}, {0x80, 0x86}, /* 0xE8-0xEB */ + {0x82, 0x0D}, {0x83, 0x8E}, {0x84, 0xD1}, {0x86, 0xC7}, /* 0xEC-0xEF */ + {0x88, 0xDF}, {0x8A, 0x50}, {0x8A, 0x5E}, {0x8B, 0x1D}, /* 0xF0-0xF3 */ + {0x8C, 0xDC}, {0x8D, 0x66}, {0x8F, 0xAD}, {0x90, 0xAA}, /* 0xF4-0xF7 */ + {0x98, 0xFC}, {0x99, 0xDF}, {0x9E, 0x9D}, {0x52, 0x4A}, /* 0xF8-0xFB */ + {0xF9, 0x69}, {0x67, 0x14}, {0xF9, 0x6A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x50, 0x98}, {0x52, 0x2A}, {0x5C, 0x71}, /* 0xA0-0xA3 */ + {0x65, 0x63}, {0x6C, 0x55}, {0x73, 0xCA}, {0x75, 0x23}, /* 0xA4-0xA7 */ + {0x75, 0x9D}, {0x7B, 0x97}, {0x84, 0x9C}, {0x91, 0x78}, /* 0xA8-0xAB */ + {0x97, 0x30}, {0x4E, 0x77}, {0x64, 0x92}, {0x6B, 0xBA}, /* 0xAC-0xAF */ + {0x71, 0x5E}, {0x85, 0xA9}, {0x4E, 0x09}, {0xF9, 0x6B}, /* 0xB0-0xB3 */ + {0x67, 0x49}, {0x68, 0xEE}, {0x6E, 0x17}, {0x82, 0x9F}, /* 0xB4-0xB7 */ + {0x85, 0x18}, {0x88, 0x6B}, {0x63, 0xF7}, {0x6F, 0x81}, /* 0xB8-0xBB */ + {0x92, 0x12}, {0x98, 0xAF}, {0x4E, 0x0A}, {0x50, 0xB7}, /* 0xBC-0xBF */ + {0x50, 0xCF}, {0x51, 0x1F}, {0x55, 0x46}, {0x55, 0xAA}, /* 0xC0-0xC3 */ + {0x56, 0x17}, {0x5B, 0x40}, {0x5C, 0x19}, {0x5C, 0xE0}, /* 0xC4-0xC7 */ + {0x5E, 0x38}, {0x5E, 0x8A}, {0x5E, 0xA0}, {0x5E, 0xC2}, /* 0xC8-0xCB */ + {0x60, 0xF3}, {0x68, 0x51}, {0x6A, 0x61}, {0x6E, 0x58}, /* 0xCC-0xCF */ + {0x72, 0x3D}, {0x72, 0x40}, {0x72, 0xC0}, {0x76, 0xF8}, /* 0xD0-0xD3 */ + {0x79, 0x65}, {0x7B, 0xB1}, {0x7F, 0xD4}, {0x88, 0xF3}, /* 0xD4-0xD7 */ + {0x89, 0xF4}, {0x8A, 0x73}, {0x8C, 0x61}, {0x8C, 0xDE}, /* 0xD8-0xDB */ + {0x97, 0x1C}, {0x58, 0x5E}, {0x74, 0xBD}, {0x8C, 0xFD}, /* 0xDC-0xDF */ + {0x55, 0xC7}, {0xF9, 0x6C}, {0x7A, 0x61}, {0x7D, 0x22}, /* 0xE0-0xE3 */ + {0x82, 0x72}, {0x72, 0x72}, {0x75, 0x1F}, {0x75, 0x25}, /* 0xE4-0xE7 */ + {0xF9, 0x6D}, {0x7B, 0x19}, {0x58, 0x85}, {0x58, 0xFB}, /* 0xE8-0xEB */ + {0x5D, 0xBC}, {0x5E, 0x8F}, {0x5E, 0xB6}, {0x5F, 0x90}, /* 0xEC-0xEF */ + {0x60, 0x55}, {0x62, 0x92}, {0x63, 0x7F}, {0x65, 0x4D}, /* 0xF0-0xF3 */ + {0x66, 0x91}, {0x66, 0xD9}, {0x66, 0xF8}, {0x68, 0x16}, /* 0xF4-0xF7 */ + {0x68, 0xF2}, {0x72, 0x80}, {0x74, 0x5E}, {0x7B, 0x6E}, /* 0xF8-0xFB */ + {0x7D, 0x6E}, {0x7D, 0xD6}, {0x7F, 0x72}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x80, 0xE5}, {0x82, 0x12}, {0x85, 0xAF}, /* 0xA0-0xA3 */ + {0x89, 0x7F}, {0x8A, 0x93}, {0x90, 0x1D}, {0x92, 0xE4}, /* 0xA4-0xA7 */ + {0x9E, 0xCD}, {0x9F, 0x20}, {0x59, 0x15}, {0x59, 0x6D}, /* 0xA8-0xAB */ + {0x5E, 0x2D}, {0x60, 0xDC}, {0x66, 0x14}, {0x66, 0x73}, /* 0xAC-0xAF */ + {0x67, 0x90}, {0x6C, 0x50}, {0x6D, 0xC5}, {0x6F, 0x5F}, /* 0xB0-0xB3 */ + {0x77, 0xF3}, {0x78, 0xA9}, {0x84, 0xC6}, {0x91, 0xCB}, /* 0xB4-0xB7 */ + {0x93, 0x2B}, {0x4E, 0xD9}, {0x50, 0xCA}, {0x51, 0x48}, /* 0xB8-0xBB */ + {0x55, 0x84}, {0x5B, 0x0B}, {0x5B, 0xA3}, {0x62, 0x47}, /* 0xBC-0xBF */ + {0x65, 0x7E}, {0x65, 0xCB}, {0x6E, 0x32}, {0x71, 0x7D}, /* 0xC0-0xC3 */ + {0x74, 0x01}, {0x74, 0x44}, {0x74, 0x87}, {0x74, 0xBF}, /* 0xC4-0xC7 */ + {0x76, 0x6C}, {0x79, 0xAA}, {0x7D, 0xDA}, {0x7E, 0x55}, /* 0xC8-0xCB */ + {0x7F, 0xA8}, {0x81, 0x7A}, {0x81, 0xB3}, {0x82, 0x39}, /* 0xCC-0xCF */ + {0x86, 0x1A}, {0x87, 0xEC}, {0x8A, 0x75}, {0x8D, 0xE3}, /* 0xD0-0xD3 */ + {0x90, 0x78}, {0x92, 0x91}, {0x94, 0x25}, {0x99, 0x4D}, /* 0xD4-0xD7 */ + {0x9B, 0xAE}, {0x53, 0x68}, {0x5C, 0x51}, {0x69, 0x54}, /* 0xD8-0xDB */ + {0x6C, 0xC4}, {0x6D, 0x29}, {0x6E, 0x2B}, {0x82, 0x0C}, /* 0xDC-0xDF */ + {0x85, 0x9B}, {0x89, 0x3B}, {0x8A, 0x2D}, {0x8A, 0xAA}, /* 0xE0-0xE3 */ + {0x96, 0xEA}, {0x9F, 0x67}, {0x52, 0x61}, {0x66, 0xB9}, /* 0xE4-0xE7 */ + {0x6B, 0xB2}, {0x7E, 0x96}, {0x87, 0xFE}, {0x8D, 0x0D}, /* 0xE8-0xEB */ + {0x95, 0x83}, {0x96, 0x5D}, {0x65, 0x1D}, {0x6D, 0x89}, /* 0xEC-0xEF */ + {0x71, 0xEE}, {0xF9, 0x6E}, {0x57, 0xCE}, {0x59, 0xD3}, /* 0xF0-0xF3 */ + {0x5B, 0xAC}, {0x60, 0x27}, {0x60, 0xFA}, {0x62, 0x10}, /* 0xF4-0xF7 */ + {0x66, 0x1F}, {0x66, 0x5F}, {0x73, 0x29}, {0x73, 0xF9}, /* 0xF8-0xFB */ + {0x76, 0xDB}, {0x77, 0x01}, {0x7B, 0x6C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x80, 0x56}, {0x80, 0x72}, {0x81, 0x65}, /* 0xA0-0xA3 */ + {0x8A, 0xA0}, {0x91, 0x92}, {0x4E, 0x16}, {0x52, 0xE2}, /* 0xA4-0xA7 */ + {0x6B, 0x72}, {0x6D, 0x17}, {0x7A, 0x05}, {0x7B, 0x39}, /* 0xA8-0xAB */ + {0x7D, 0x30}, {0xF9, 0x6F}, {0x8C, 0xB0}, {0x53, 0xEC}, /* 0xAC-0xAF */ + {0x56, 0x2F}, {0x58, 0x51}, {0x5B, 0xB5}, {0x5C, 0x0F}, /* 0xB0-0xB3 */ + {0x5C, 0x11}, {0x5D, 0xE2}, {0x62, 0x40}, {0x63, 0x83}, /* 0xB4-0xB7 */ + {0x64, 0x14}, {0x66, 0x2D}, {0x68, 0xB3}, {0x6C, 0xBC}, /* 0xB8-0xBB */ + {0x6D, 0x88}, {0x6E, 0xAF}, {0x70, 0x1F}, {0x70, 0xA4}, /* 0xBC-0xBF */ + {0x71, 0xD2}, {0x75, 0x26}, {0x75, 0x8F}, {0x75, 0x8E}, /* 0xC0-0xC3 */ + {0x76, 0x19}, {0x7B, 0x11}, {0x7B, 0xE0}, {0x7C, 0x2B}, /* 0xC4-0xC7 */ + {0x7D, 0x20}, {0x7D, 0x39}, {0x85, 0x2C}, {0x85, 0x6D}, /* 0xC8-0xCB */ + {0x86, 0x07}, {0x8A, 0x34}, {0x90, 0x0D}, {0x90, 0x61}, /* 0xCC-0xCF */ + {0x90, 0xB5}, {0x92, 0xB7}, {0x97, 0xF6}, {0x9A, 0x37}, /* 0xD0-0xD3 */ + {0x4F, 0xD7}, {0x5C, 0x6C}, {0x67, 0x5F}, {0x6D, 0x91}, /* 0xD4-0xD7 */ + {0x7C, 0x9F}, {0x7E, 0x8C}, {0x8B, 0x16}, {0x8D, 0x16}, /* 0xD8-0xDB */ + {0x90, 0x1F}, {0x5B, 0x6B}, {0x5D, 0xFD}, {0x64, 0x0D}, /* 0xDC-0xDF */ + {0x84, 0xC0}, {0x90, 0x5C}, {0x98, 0xE1}, {0x73, 0x87}, /* 0xE0-0xE3 */ + {0x5B, 0x8B}, {0x60, 0x9A}, {0x67, 0x7E}, {0x6D, 0xDE}, /* 0xE4-0xE7 */ + {0x8A, 0x1F}, {0x8A, 0xA6}, {0x90, 0x01}, {0x98, 0x0C}, /* 0xE8-0xEB */ + {0x52, 0x37}, {0xF9, 0x70}, {0x70, 0x51}, {0x78, 0x8E}, /* 0xEC-0xEF */ + {0x93, 0x96}, {0x88, 0x70}, {0x91, 0xD7}, {0x4F, 0xEE}, /* 0xF0-0xF3 */ + {0x53, 0xD7}, {0x55, 0xFD}, {0x56, 0xDA}, {0x57, 0x82}, /* 0xF4-0xF7 */ + {0x58, 0xFD}, {0x5A, 0xC2}, {0x5B, 0x88}, {0x5C, 0xAB}, /* 0xF8-0xFB */ + {0x5C, 0xC0}, {0x5E, 0x25}, {0x61, 0x01}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x62, 0x0D}, {0x62, 0x4B}, {0x63, 0x88}, /* 0xA0-0xA3 */ + {0x64, 0x1C}, {0x65, 0x36}, {0x65, 0x78}, {0x6A, 0x39}, /* 0xA4-0xA7 */ + {0x6B, 0x8A}, {0x6C, 0x34}, {0x6D, 0x19}, {0x6F, 0x31}, /* 0xA8-0xAB */ + {0x71, 0xE7}, {0x72, 0xE9}, {0x73, 0x78}, {0x74, 0x07}, /* 0xAC-0xAF */ + {0x74, 0xB2}, {0x76, 0x26}, {0x77, 0x61}, {0x79, 0xC0}, /* 0xB0-0xB3 */ + {0x7A, 0x57}, {0x7A, 0xEA}, {0x7C, 0xB9}, {0x7D, 0x8F}, /* 0xB4-0xB7 */ + {0x7D, 0xAC}, {0x7E, 0x61}, {0x7F, 0x9E}, {0x81, 0x29}, /* 0xB8-0xBB */ + {0x83, 0x31}, {0x84, 0x90}, {0x84, 0xDA}, {0x85, 0xEA}, /* 0xBC-0xBF */ + {0x88, 0x96}, {0x8A, 0xB0}, {0x8B, 0x90}, {0x8F, 0x38}, /* 0xC0-0xC3 */ + {0x90, 0x42}, {0x90, 0x83}, {0x91, 0x6C}, {0x92, 0x96}, /* 0xC4-0xC7 */ + {0x92, 0xB9}, {0x96, 0x8B}, {0x96, 0xA7}, {0x96, 0xA8}, /* 0xC8-0xCB */ + {0x96, 0xD6}, {0x97, 0x00}, {0x98, 0x08}, {0x99, 0x96}, /* 0xCC-0xCF */ + {0x9A, 0xD3}, {0x9B, 0x1A}, {0x53, 0xD4}, {0x58, 0x7E}, /* 0xD0-0xD3 */ + {0x59, 0x19}, {0x5B, 0x70}, {0x5B, 0xBF}, {0x6D, 0xD1}, /* 0xD4-0xD7 */ + {0x6F, 0x5A}, {0x71, 0x9F}, {0x74, 0x21}, {0x74, 0xB9}, /* 0xD8-0xDB */ + {0x80, 0x85}, {0x83, 0xFD}, {0x5D, 0xE1}, {0x5F, 0x87}, /* 0xDC-0xDF */ + {0x5F, 0xAA}, {0x60, 0x42}, {0x65, 0xEC}, {0x68, 0x12}, /* 0xE0-0xE3 */ + {0x69, 0x6F}, {0x6A, 0x53}, {0x6B, 0x89}, {0x6D, 0x35}, /* 0xE4-0xE7 */ + {0x6D, 0xF3}, {0x73, 0xE3}, {0x76, 0xFE}, {0x77, 0xAC}, /* 0xE8-0xEB */ + {0x7B, 0x4D}, {0x7D, 0x14}, {0x81, 0x23}, {0x82, 0x1C}, /* 0xEC-0xEF */ + {0x83, 0x40}, {0x84, 0xF4}, {0x85, 0x63}, {0x8A, 0x62}, /* 0xF0-0xF3 */ + {0x8A, 0xC4}, {0x91, 0x87}, {0x93, 0x1E}, {0x98, 0x06}, /* 0xF4-0xF7 */ + {0x99, 0xB4}, {0x62, 0x0C}, {0x88, 0x53}, {0x8F, 0xF0}, /* 0xF8-0xFB */ + {0x92, 0x65}, {0x5D, 0x07}, {0x5D, 0x27}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x5D, 0x69}, {0x74, 0x5F}, {0x81, 0x9D}, /* 0xA0-0xA3 */ + {0x87, 0x68}, {0x6F, 0xD5}, {0x62, 0xFE}, {0x7F, 0xD2}, /* 0xA4-0xA7 */ + {0x89, 0x36}, {0x89, 0x72}, {0x4E, 0x1E}, {0x4E, 0x58}, /* 0xA8-0xAB */ + {0x50, 0xE7}, {0x52, 0xDD}, {0x53, 0x47}, {0x62, 0x7F}, /* 0xAC-0xAF */ + {0x66, 0x07}, {0x7E, 0x69}, {0x88, 0x05}, {0x96, 0x5E}, /* 0xB0-0xB3 */ + {0x4F, 0x8D}, {0x53, 0x19}, {0x56, 0x36}, {0x59, 0xCB}, /* 0xB4-0xB7 */ + {0x5A, 0xA4}, {0x5C, 0x38}, {0x5C, 0x4E}, {0x5C, 0x4D}, /* 0xB8-0xBB */ + {0x5E, 0x02}, {0x5F, 0x11}, {0x60, 0x43}, {0x65, 0xBD}, /* 0xBC-0xBF */ + {0x66, 0x2F}, {0x66, 0x42}, {0x67, 0xBE}, {0x67, 0xF4}, /* 0xC0-0xC3 */ + {0x73, 0x1C}, {0x77, 0xE2}, {0x79, 0x3A}, {0x7F, 0xC5}, /* 0xC4-0xC7 */ + {0x84, 0x94}, {0x84, 0xCD}, {0x89, 0x96}, {0x8A, 0x66}, /* 0xC8-0xCB */ + {0x8A, 0x69}, {0x8A, 0xE1}, {0x8C, 0x55}, {0x8C, 0x7A}, /* 0xCC-0xCF */ + {0x57, 0xF4}, {0x5B, 0xD4}, {0x5F, 0x0F}, {0x60, 0x6F}, /* 0xD0-0xD3 */ + {0x62, 0xED}, {0x69, 0x0D}, {0x6B, 0x96}, {0x6E, 0x5C}, /* 0xD4-0xD7 */ + {0x71, 0x84}, {0x7B, 0xD2}, {0x87, 0x55}, {0x8B, 0x58}, /* 0xD8-0xDB */ + {0x8E, 0xFE}, {0x98, 0xDF}, {0x98, 0xFE}, {0x4F, 0x38}, /* 0xDC-0xDF */ + {0x4F, 0x81}, {0x4F, 0xE1}, {0x54, 0x7B}, {0x5A, 0x20}, /* 0xE0-0xE3 */ + {0x5B, 0xB8}, {0x61, 0x3C}, {0x65, 0xB0}, {0x66, 0x68}, /* 0xE4-0xE7 */ + {0x71, 0xFC}, {0x75, 0x33}, {0x79, 0x5E}, {0x7D, 0x33}, /* 0xE8-0xEB */ + {0x81, 0x4E}, {0x81, 0xE3}, {0x83, 0x98}, {0x85, 0xAA}, /* 0xEC-0xEF */ + {0x85, 0xCE}, {0x87, 0x03}, {0x8A, 0x0A}, {0x8E, 0xAB}, /* 0xF0-0xF3 */ + {0x8F, 0x9B}, {0xF9, 0x71}, {0x8F, 0xC5}, {0x59, 0x31}, /* 0xF4-0xF7 */ + {0x5B, 0xA4}, {0x5B, 0xE6}, {0x60, 0x89}, {0x5B, 0xE9}, /* 0xF8-0xFB */ + {0x5C, 0x0B}, {0x5F, 0xC3}, {0x6C, 0x81}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xF9, 0x72}, {0x6D, 0xF1}, {0x70, 0x0B}, /* 0xA0-0xA3 */ + {0x75, 0x1A}, {0x82, 0xAF}, {0x8A, 0xF6}, {0x4E, 0xC0}, /* 0xA4-0xA7 */ + {0x53, 0x41}, {0xF9, 0x73}, {0x96, 0xD9}, {0x6C, 0x0F}, /* 0xA8-0xAB */ + {0x4E, 0x9E}, {0x4F, 0xC4}, {0x51, 0x52}, {0x55, 0x5E}, /* 0xAC-0xAF */ + {0x5A, 0x25}, {0x5C, 0xE8}, {0x62, 0x11}, {0x72, 0x59}, /* 0xB0-0xB3 */ + {0x82, 0xBD}, {0x83, 0xAA}, {0x86, 0xFE}, {0x88, 0x59}, /* 0xB4-0xB7 */ + {0x8A, 0x1D}, {0x96, 0x3F}, {0x96, 0xC5}, {0x99, 0x13}, /* 0xB8-0xBB */ + {0x9D, 0x09}, {0x9D, 0x5D}, {0x58, 0x0A}, {0x5C, 0xB3}, /* 0xBC-0xBF */ + {0x5D, 0xBD}, {0x5E, 0x44}, {0x60, 0xE1}, {0x61, 0x15}, /* 0xC0-0xC3 */ + {0x63, 0xE1}, {0x6A, 0x02}, {0x6E, 0x25}, {0x91, 0x02}, /* 0xC4-0xC7 */ + {0x93, 0x54}, {0x98, 0x4E}, {0x9C, 0x10}, {0x9F, 0x77}, /* 0xC8-0xCB */ + {0x5B, 0x89}, {0x5C, 0xB8}, {0x63, 0x09}, {0x66, 0x4F}, /* 0xCC-0xCF */ + {0x68, 0x48}, {0x77, 0x3C}, {0x96, 0xC1}, {0x97, 0x8D}, /* 0xD0-0xD3 */ + {0x98, 0x54}, {0x9B, 0x9F}, {0x65, 0xA1}, {0x8B, 0x01}, /* 0xD4-0xD7 */ + {0x8E, 0xCB}, {0x95, 0xBC}, {0x55, 0x35}, {0x5C, 0xA9}, /* 0xD8-0xDB */ + {0x5D, 0xD6}, {0x5E, 0xB5}, {0x66, 0x97}, {0x76, 0x4C}, /* 0xDC-0xDF */ + {0x83, 0xF4}, {0x95, 0xC7}, {0x58, 0xD3}, {0x62, 0xBC}, /* 0xE0-0xE3 */ + {0x72, 0xCE}, {0x9D, 0x28}, {0x4E, 0xF0}, {0x59, 0x2E}, /* 0xE4-0xE7 */ + {0x60, 0x0F}, {0x66, 0x3B}, {0x6B, 0x83}, {0x79, 0xE7}, /* 0xE8-0xEB */ + {0x9D, 0x26}, {0x53, 0x93}, {0x54, 0xC0}, {0x57, 0xC3}, /* 0xEC-0xEF */ + {0x5D, 0x16}, {0x61, 0x1B}, {0x66, 0xD6}, {0x6D, 0xAF}, /* 0xF0-0xF3 */ + {0x78, 0x8D}, {0x82, 0x7E}, {0x96, 0x98}, {0x97, 0x44}, /* 0xF4-0xF7 */ + {0x53, 0x84}, {0x62, 0x7C}, {0x63, 0x96}, {0x6D, 0xB2}, /* 0xF8-0xFB */ + {0x7E, 0x0A}, {0x81, 0x4B}, {0x98, 0x4D}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x6A, 0xFB}, {0x7F, 0x4C}, {0x9D, 0xAF}, /* 0xA0-0xA3 */ + {0x9E, 0x1A}, {0x4E, 0x5F}, {0x50, 0x3B}, {0x51, 0xB6}, /* 0xA4-0xA7 */ + {0x59, 0x1C}, {0x60, 0xF9}, {0x63, 0xF6}, {0x69, 0x30}, /* 0xA8-0xAB */ + {0x72, 0x3A}, {0x80, 0x36}, {0xF9, 0x74}, {0x91, 0xCE}, /* 0xAC-0xAF */ + {0x5F, 0x31}, {0xF9, 0x75}, {0xF9, 0x76}, {0x7D, 0x04}, /* 0xB0-0xB3 */ + {0x82, 0xE5}, {0x84, 0x6F}, {0x84, 0xBB}, {0x85, 0xE5}, /* 0xB4-0xB7 */ + {0x8E, 0x8D}, {0xF9, 0x77}, {0x4F, 0x6F}, {0xF9, 0x78}, /* 0xB8-0xBB */ + {0xF9, 0x79}, {0x58, 0xE4}, {0x5B, 0x43}, {0x60, 0x59}, /* 0xBC-0xBF */ + {0x63, 0xDA}, {0x65, 0x18}, {0x65, 0x6D}, {0x66, 0x98}, /* 0xC0-0xC3 */ + {0xF9, 0x7A}, {0x69, 0x4A}, {0x6A, 0x23}, {0x6D, 0x0B}, /* 0xC4-0xC7 */ + {0x70, 0x01}, {0x71, 0x6C}, {0x75, 0xD2}, {0x76, 0x0D}, /* 0xC8-0xCB */ + {0x79, 0xB3}, {0x7A, 0x70}, {0xF9, 0x7B}, {0x7F, 0x8A}, /* 0xCC-0xCF */ + {0xF9, 0x7C}, {0x89, 0x44}, {0xF9, 0x7D}, {0x8B, 0x93}, /* 0xD0-0xD3 */ + {0x91, 0xC0}, {0x96, 0x7D}, {0xF9, 0x7E}, {0x99, 0x0A}, /* 0xD4-0xD7 */ + {0x57, 0x04}, {0x5F, 0xA1}, {0x65, 0xBC}, {0x6F, 0x01}, /* 0xD8-0xDB */ + {0x76, 0x00}, {0x79, 0xA6}, {0x8A, 0x9E}, {0x99, 0xAD}, /* 0xDC-0xDF */ + {0x9B, 0x5A}, {0x9F, 0x6C}, {0x51, 0x04}, {0x61, 0xB6}, /* 0xE0-0xE3 */ + {0x62, 0x91}, {0x6A, 0x8D}, {0x81, 0xC6}, {0x50, 0x43}, /* 0xE4-0xE7 */ + {0x58, 0x30}, {0x5F, 0x66}, {0x71, 0x09}, {0x8A, 0x00}, /* 0xE8-0xEB */ + {0x8A, 0xFA}, {0x5B, 0x7C}, {0x86, 0x16}, {0x4F, 0xFA}, /* 0xEC-0xEF */ + {0x51, 0x3C}, {0x56, 0xB4}, {0x59, 0x44}, {0x63, 0xA9}, /* 0xF0-0xF3 */ + {0x6D, 0xF9}, {0x5D, 0xAA}, {0x69, 0x6D}, {0x51, 0x86}, /* 0xF4-0xF7 */ + {0x4E, 0x88}, {0x4F, 0x59}, {0xF9, 0x7F}, {0xF9, 0x80}, /* 0xF8-0xFB */ + {0xF9, 0x81}, {0x59, 0x82}, {0xF9, 0x82}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xF9, 0x83}, {0x6B, 0x5F}, {0x6C, 0x5D}, /* 0xA0-0xA3 */ + {0xF9, 0x84}, {0x74, 0xB5}, {0x79, 0x16}, {0xF9, 0x85}, /* 0xA4-0xA7 */ + {0x82, 0x07}, {0x82, 0x45}, {0x83, 0x39}, {0x8F, 0x3F}, /* 0xA8-0xAB */ + {0x8F, 0x5D}, {0xF9, 0x86}, {0x99, 0x18}, {0xF9, 0x87}, /* 0xAC-0xAF */ + {0xF9, 0x88}, {0xF9, 0x89}, {0x4E, 0xA6}, {0xF9, 0x8A}, /* 0xB0-0xB3 */ + {0x57, 0xDF}, {0x5F, 0x79}, {0x66, 0x13}, {0xF9, 0x8B}, /* 0xB4-0xB7 */ + {0xF9, 0x8C}, {0x75, 0xAB}, {0x7E, 0x79}, {0x8B, 0x6F}, /* 0xB8-0xBB */ + {0xF9, 0x8D}, {0x90, 0x06}, {0x9A, 0x5B}, {0x56, 0xA5}, /* 0xBC-0xBF */ + {0x58, 0x27}, {0x59, 0xF8}, {0x5A, 0x1F}, {0x5B, 0xB4}, /* 0xC0-0xC3 */ + {0xF9, 0x8E}, {0x5E, 0xF6}, {0xF9, 0x8F}, {0xF9, 0x90}, /* 0xC4-0xC7 */ + {0x63, 0x50}, {0x63, 0x3B}, {0xF9, 0x91}, {0x69, 0x3D}, /* 0xC8-0xCB */ + {0x6C, 0x87}, {0x6C, 0xBF}, {0x6D, 0x8E}, {0x6D, 0x93}, /* 0xCC-0xCF */ + {0x6D, 0xF5}, {0x6F, 0x14}, {0xF9, 0x92}, {0x70, 0xDF}, /* 0xD0-0xD3 */ + {0x71, 0x36}, {0x71, 0x59}, {0xF9, 0x93}, {0x71, 0xC3}, /* 0xD4-0xD7 */ + {0x71, 0xD5}, {0xF9, 0x94}, {0x78, 0x4F}, {0x78, 0x6F}, /* 0xD8-0xDB */ + {0xF9, 0x95}, {0x7B, 0x75}, {0x7D, 0xE3}, {0xF9, 0x96}, /* 0xDC-0xDF */ + {0x7E, 0x2F}, {0xF9, 0x97}, {0x88, 0x4D}, {0x8E, 0xDF}, /* 0xE0-0xE3 */ + {0xF9, 0x98}, {0xF9, 0x99}, {0xF9, 0x9A}, {0x92, 0x5B}, /* 0xE4-0xE7 */ + {0xF9, 0x9B}, {0x9C, 0xF6}, {0xF9, 0x9C}, {0xF9, 0x9D}, /* 0xE8-0xEB */ + {0xF9, 0x9E}, {0x60, 0x85}, {0x6D, 0x85}, {0xF9, 0x9F}, /* 0xEC-0xEF */ + {0x71, 0xB1}, {0xF9, 0xA0}, {0xF9, 0xA1}, {0x95, 0xB1}, /* 0xF0-0xF3 */ + {0x53, 0xAD}, {0xF9, 0xA2}, {0xF9, 0xA3}, {0xF9, 0xA4}, /* 0xF4-0xF7 */ + {0x67, 0xD3}, {0xF9, 0xA5}, {0x70, 0x8E}, {0x71, 0x30}, /* 0xF8-0xFB */ + {0x74, 0x30}, {0x82, 0x76}, {0x82, 0xD2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xF9, 0xA6}, {0x95, 0xBB}, {0x9A, 0xE5}, /* 0xA0-0xA3 */ + {0x9E, 0x7D}, {0x66, 0xC4}, {0xF9, 0xA7}, {0x71, 0xC1}, /* 0xA4-0xA7 */ + {0x84, 0x49}, {0xF9, 0xA8}, {0xF9, 0xA9}, {0x58, 0x4B}, /* 0xA8-0xAB */ + {0xF9, 0xAA}, {0xF9, 0xAB}, {0x5D, 0xB8}, {0x5F, 0x71}, /* 0xAC-0xAF */ + {0xF9, 0xAC}, {0x66, 0x20}, {0x66, 0x8E}, {0x69, 0x79}, /* 0xB0-0xB3 */ + {0x69, 0xAE}, {0x6C, 0x38}, {0x6C, 0xF3}, {0x6E, 0x36}, /* 0xB4-0xB7 */ + {0x6F, 0x41}, {0x6F, 0xDA}, {0x70, 0x1B}, {0x70, 0x2F}, /* 0xB8-0xBB */ + {0x71, 0x50}, {0x71, 0xDF}, {0x73, 0x70}, {0xF9, 0xAD}, /* 0xBC-0xBF */ + {0x74, 0x5B}, {0xF9, 0xAE}, {0x74, 0xD4}, {0x76, 0xC8}, /* 0xC0-0xC3 */ + {0x7A, 0x4E}, {0x7E, 0x93}, {0xF9, 0xAF}, {0xF9, 0xB0}, /* 0xC4-0xC7 */ + {0x82, 0xF1}, {0x8A, 0x60}, {0x8F, 0xCE}, {0xF9, 0xB1}, /* 0xC8-0xCB */ + {0x93, 0x48}, {0xF9, 0xB2}, {0x97, 0x19}, {0xF9, 0xB3}, /* 0xCC-0xCF */ + {0xF9, 0xB4}, {0x4E, 0x42}, {0x50, 0x2A}, {0xF9, 0xB5}, /* 0xD0-0xD3 */ + {0x52, 0x08}, {0x53, 0xE1}, {0x66, 0xF3}, {0x6C, 0x6D}, /* 0xD4-0xD7 */ + {0x6F, 0xCA}, {0x73, 0x0A}, {0x77, 0x7F}, {0x7A, 0x62}, /* 0xD8-0xDB */ + {0x82, 0xAE}, {0x85, 0xDD}, {0x86, 0x02}, {0xF9, 0xB6}, /* 0xDC-0xDF */ + {0x88, 0xD4}, {0x8A, 0x63}, {0x8B, 0x7D}, {0x8C, 0x6B}, /* 0xE0-0xE3 */ + {0xF9, 0xB7}, {0x92, 0xB3}, {0xF9, 0xB8}, {0x97, 0x13}, /* 0xE4-0xE7 */ + {0x98, 0x10}, {0x4E, 0x94}, {0x4F, 0x0D}, {0x4F, 0xC9}, /* 0xE8-0xEB */ + {0x50, 0xB2}, {0x53, 0x48}, {0x54, 0x3E}, {0x54, 0x33}, /* 0xEC-0xEF */ + {0x55, 0xDA}, {0x58, 0x62}, {0x58, 0xBA}, {0x59, 0x67}, /* 0xF0-0xF3 */ + {0x5A, 0x1B}, {0x5B, 0xE4}, {0x60, 0x9F}, {0xF9, 0xB9}, /* 0xF4-0xF7 */ + {0x61, 0xCA}, {0x65, 0x56}, {0x65, 0xFF}, {0x66, 0x64}, /* 0xF8-0xFB */ + {0x68, 0xA7}, {0x6C, 0x5A}, {0x6F, 0xB3}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x70, 0xCF}, {0x71, 0xAC}, {0x73, 0x52}, /* 0xA0-0xA3 */ + {0x7B, 0x7D}, {0x87, 0x08}, {0x8A, 0xA4}, {0x9C, 0x32}, /* 0xA4-0xA7 */ + {0x9F, 0x07}, {0x5C, 0x4B}, {0x6C, 0x83}, {0x73, 0x44}, /* 0xA8-0xAB */ + {0x73, 0x89}, {0x92, 0x3A}, {0x6E, 0xAB}, {0x74, 0x65}, /* 0xAC-0xAF */ + {0x76, 0x1F}, {0x7A, 0x69}, {0x7E, 0x15}, {0x86, 0x0A}, /* 0xB0-0xB3 */ + {0x51, 0x40}, {0x58, 0xC5}, {0x64, 0xC1}, {0x74, 0xEE}, /* 0xB4-0xB7 */ + {0x75, 0x15}, {0x76, 0x70}, {0x7F, 0xC1}, {0x90, 0x95}, /* 0xB8-0xBB */ + {0x96, 0xCD}, {0x99, 0x54}, {0x6E, 0x26}, {0x74, 0xE6}, /* 0xBC-0xBF */ + {0x7A, 0xA9}, {0x7A, 0xAA}, {0x81, 0xE5}, {0x86, 0xD9}, /* 0xC0-0xC3 */ + {0x87, 0x78}, {0x8A, 0x1B}, {0x5A, 0x49}, {0x5B, 0x8C}, /* 0xC4-0xC7 */ + {0x5B, 0x9B}, {0x68, 0xA1}, {0x69, 0x00}, {0x6D, 0x63}, /* 0xC8-0xCB */ + {0x73, 0xA9}, {0x74, 0x13}, {0x74, 0x2C}, {0x78, 0x97}, /* 0xCC-0xCF */ + {0x7D, 0xE9}, {0x7F, 0xEB}, {0x81, 0x18}, {0x81, 0x55}, /* 0xD0-0xD3 */ + {0x83, 0x9E}, {0x8C, 0x4C}, {0x96, 0x2E}, {0x98, 0x11}, /* 0xD4-0xD7 */ + {0x66, 0xF0}, {0x5F, 0x80}, {0x65, 0xFA}, {0x67, 0x89}, /* 0xD8-0xDB */ + {0x6C, 0x6A}, {0x73, 0x8B}, {0x50, 0x2D}, {0x5A, 0x03}, /* 0xDC-0xDF */ + {0x6B, 0x6A}, {0x77, 0xEE}, {0x59, 0x16}, {0x5D, 0x6C}, /* 0xE0-0xE3 */ + {0x5D, 0xCD}, {0x73, 0x25}, {0x75, 0x4F}, {0xF9, 0xBA}, /* 0xE4-0xE7 */ + {0xF9, 0xBB}, {0x50, 0xE5}, {0x51, 0xF9}, {0x58, 0x2F}, /* 0xE8-0xEB */ + {0x59, 0x2D}, {0x59, 0x96}, {0x59, 0xDA}, {0x5B, 0xE5}, /* 0xEC-0xEF */ + {0xF9, 0xBC}, {0xF9, 0xBD}, {0x5D, 0xA2}, {0x62, 0xD7}, /* 0xF0-0xF3 */ + {0x64, 0x16}, {0x64, 0x93}, {0x64, 0xFE}, {0xF9, 0xBE}, /* 0xF4-0xF7 */ + {0x66, 0xDC}, {0xF9, 0xBF}, {0x6A, 0x48}, {0xF9, 0xC0}, /* 0xF8-0xFB */ + {0x71, 0xFF}, {0x74, 0x64}, {0xF9, 0xC1}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x7A, 0x88}, {0x7A, 0xAF}, {0x7E, 0x47}, /* 0xA0-0xA3 */ + {0x7E, 0x5E}, {0x80, 0x00}, {0x81, 0x70}, {0xF9, 0xC2}, /* 0xA4-0xA7 */ + {0x87, 0xEF}, {0x89, 0x81}, {0x8B, 0x20}, {0x90, 0x59}, /* 0xA8-0xAB */ + {0xF9, 0xC3}, {0x90, 0x80}, {0x99, 0x52}, {0x61, 0x7E}, /* 0xAC-0xAF */ + {0x6B, 0x32}, {0x6D, 0x74}, {0x7E, 0x1F}, {0x89, 0x25}, /* 0xB0-0xB3 */ + {0x8F, 0xB1}, {0x4F, 0xD1}, {0x50, 0xAD}, {0x51, 0x97}, /* 0xB4-0xB7 */ + {0x52, 0xC7}, {0x57, 0xC7}, {0x58, 0x89}, {0x5B, 0xB9}, /* 0xB8-0xBB */ + {0x5E, 0xB8}, {0x61, 0x42}, {0x69, 0x95}, {0x6D, 0x8C}, /* 0xBC-0xBF */ + {0x6E, 0x67}, {0x6E, 0xB6}, {0x71, 0x94}, {0x74, 0x62}, /* 0xC0-0xC3 */ + {0x75, 0x28}, {0x75, 0x2C}, {0x80, 0x73}, {0x83, 0x38}, /* 0xC4-0xC7 */ + {0x84, 0xC9}, {0x8E, 0x0A}, {0x93, 0x94}, {0x93, 0xDE}, /* 0xC8-0xCB */ + {0xF9, 0xC4}, {0x4E, 0x8E}, {0x4F, 0x51}, {0x50, 0x76}, /* 0xCC-0xCF */ + {0x51, 0x2A}, {0x53, 0xC8}, {0x53, 0xCB}, {0x53, 0xF3}, /* 0xD0-0xD3 */ + {0x5B, 0x87}, {0x5B, 0xD3}, {0x5C, 0x24}, {0x61, 0x1A}, /* 0xD4-0xD7 */ + {0x61, 0x82}, {0x65, 0xF4}, {0x72, 0x5B}, {0x73, 0x97}, /* 0xD8-0xDB */ + {0x74, 0x40}, {0x76, 0xC2}, {0x79, 0x50}, {0x79, 0x91}, /* 0xDC-0xDF */ + {0x79, 0xB9}, {0x7D, 0x06}, {0x7F, 0xBD}, {0x82, 0x8B}, /* 0xE0-0xE3 */ + {0x85, 0xD5}, {0x86, 0x5E}, {0x8F, 0xC2}, {0x90, 0x47}, /* 0xE4-0xE7 */ + {0x90, 0xF5}, {0x91, 0xEA}, {0x96, 0x85}, {0x96, 0xE8}, /* 0xE8-0xEB */ + {0x96, 0xE9}, {0x52, 0xD6}, {0x5F, 0x67}, {0x65, 0xED}, /* 0xEC-0xEF */ + {0x66, 0x31}, {0x68, 0x2F}, {0x71, 0x5C}, {0x7A, 0x36}, /* 0xF0-0xF3 */ + {0x90, 0xC1}, {0x98, 0x0A}, {0x4E, 0x91}, {0xF9, 0xC5}, /* 0xF4-0xF7 */ + {0x6A, 0x52}, {0x6B, 0x9E}, {0x6F, 0x90}, {0x71, 0x89}, /* 0xF8-0xFB */ + {0x80, 0x18}, {0x82, 0xB8}, {0x85, 0x53}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x90, 0x4B}, {0x96, 0x95}, {0x96, 0xF2}, /* 0xA0-0xA3 */ + {0x97, 0xFB}, {0x85, 0x1A}, {0x9B, 0x31}, {0x4E, 0x90}, /* 0xA4-0xA7 */ + {0x71, 0x8A}, {0x96, 0xC4}, {0x51, 0x43}, {0x53, 0x9F}, /* 0xA8-0xAB */ + {0x54, 0xE1}, {0x57, 0x13}, {0x57, 0x12}, {0x57, 0xA3}, /* 0xAC-0xAF */ + {0x5A, 0x9B}, {0x5A, 0xC4}, {0x5B, 0xC3}, {0x60, 0x28}, /* 0xB0-0xB3 */ + {0x61, 0x3F}, {0x63, 0xF4}, {0x6C, 0x85}, {0x6D, 0x39}, /* 0xB4-0xB7 */ + {0x6E, 0x72}, {0x6E, 0x90}, {0x72, 0x30}, {0x73, 0x3F}, /* 0xB8-0xBB */ + {0x74, 0x57}, {0x82, 0xD1}, {0x88, 0x81}, {0x8F, 0x45}, /* 0xBC-0xBF */ + {0x90, 0x60}, {0xF9, 0xC6}, {0x96, 0x62}, {0x98, 0x58}, /* 0xC0-0xC3 */ + {0x9D, 0x1B}, {0x67, 0x08}, {0x8D, 0x8A}, {0x92, 0x5E}, /* 0xC4-0xC7 */ + {0x4F, 0x4D}, {0x50, 0x49}, {0x50, 0xDE}, {0x53, 0x71}, /* 0xC8-0xCB */ + {0x57, 0x0D}, {0x59, 0xD4}, {0x5A, 0x01}, {0x5C, 0x09}, /* 0xCC-0xCF */ + {0x61, 0x70}, {0x66, 0x90}, {0x6E, 0x2D}, {0x72, 0x32}, /* 0xD0-0xD3 */ + {0x74, 0x4B}, {0x7D, 0xEF}, {0x80, 0xC3}, {0x84, 0x0E}, /* 0xD4-0xD7 */ + {0x84, 0x66}, {0x85, 0x3F}, {0x87, 0x5F}, {0x88, 0x5B}, /* 0xD8-0xDB */ + {0x89, 0x18}, {0x8B, 0x02}, {0x90, 0x55}, {0x97, 0xCB}, /* 0xDC-0xDF */ + {0x9B, 0x4F}, {0x4E, 0x73}, {0x4F, 0x91}, {0x51, 0x12}, /* 0xE0-0xE3 */ + {0x51, 0x6A}, {0xF9, 0xC7}, {0x55, 0x2F}, {0x55, 0xA9}, /* 0xE4-0xE7 */ + {0x5B, 0x7A}, {0x5B, 0xA5}, {0x5E, 0x7C}, {0x5E, 0x7D}, /* 0xE8-0xEB */ + {0x5E, 0xBE}, {0x60, 0xA0}, {0x60, 0xDF}, {0x61, 0x08}, /* 0xEC-0xEF */ + {0x61, 0x09}, {0x63, 0xC4}, {0x65, 0x38}, {0x67, 0x09}, /* 0xF0-0xF3 */ + {0xF9, 0xC8}, {0x67, 0xD4}, {0x67, 0xDA}, {0xF9, 0xC9}, /* 0xF4-0xF7 */ + {0x69, 0x61}, {0x69, 0x62}, {0x6C, 0xB9}, {0x6D, 0x27}, /* 0xF8-0xFB */ + {0xF9, 0xCA}, {0x6E, 0x38}, {0xF9, 0xCB}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x6F, 0xE1}, {0x73, 0x36}, {0x73, 0x37}, /* 0xA0-0xA3 */ + {0xF9, 0xCC}, {0x74, 0x5C}, {0x75, 0x31}, {0xF9, 0xCD}, /* 0xA4-0xA7 */ + {0x76, 0x52}, {0xF9, 0xCE}, {0xF9, 0xCF}, {0x7D, 0xAD}, /* 0xA8-0xAB */ + {0x81, 0xFE}, {0x84, 0x38}, {0x88, 0xD5}, {0x8A, 0x98}, /* 0xAC-0xAF */ + {0x8A, 0xDB}, {0x8A, 0xED}, {0x8E, 0x30}, {0x8E, 0x42}, /* 0xB0-0xB3 */ + {0x90, 0x4A}, {0x90, 0x3E}, {0x90, 0x7A}, {0x91, 0x49}, /* 0xB4-0xB7 */ + {0x91, 0xC9}, {0x93, 0x6E}, {0xF9, 0xD0}, {0xF9, 0xD1}, /* 0xB8-0xBB */ + {0x58, 0x09}, {0xF9, 0xD2}, {0x6B, 0xD3}, {0x80, 0x89}, /* 0xBC-0xBF */ + {0x80, 0xB2}, {0xF9, 0xD3}, {0xF9, 0xD4}, {0x51, 0x41}, /* 0xC0-0xC3 */ + {0x59, 0x6B}, {0x5C, 0x39}, {0xF9, 0xD5}, {0xF9, 0xD6}, /* 0xC4-0xC7 */ + {0x6F, 0x64}, {0x73, 0xA7}, {0x80, 0xE4}, {0x8D, 0x07}, /* 0xC8-0xCB */ + {0xF9, 0xD7}, {0x92, 0x17}, {0x95, 0x8F}, {0xF9, 0xD8}, /* 0xCC-0xCF */ + {0xF9, 0xD9}, {0xF9, 0xDA}, {0xF9, 0xDB}, {0x80, 0x7F}, /* 0xD0-0xD3 */ + {0x62, 0x0E}, {0x70, 0x1C}, {0x7D, 0x68}, {0x87, 0x8D}, /* 0xD4-0xD7 */ + {0xF9, 0xDC}, {0x57, 0xA0}, {0x60, 0x69}, {0x61, 0x47}, /* 0xD8-0xDB */ + {0x6B, 0xB7}, {0x8A, 0xBE}, {0x92, 0x80}, {0x96, 0xB1}, /* 0xDC-0xDF */ + {0x4E, 0x59}, {0x54, 0x1F}, {0x6D, 0xEB}, {0x85, 0x2D}, /* 0xE0-0xE3 */ + {0x96, 0x70}, {0x97, 0xF3}, {0x98, 0xEE}, {0x63, 0xD6}, /* 0xE4-0xE7 */ + {0x6C, 0xE3}, {0x90, 0x91}, {0x51, 0xDD}, {0x61, 0xC9}, /* 0xE8-0xEB */ + {0x81, 0xBA}, {0x9D, 0xF9}, {0x4F, 0x9D}, {0x50, 0x1A}, /* 0xEC-0xEF */ + {0x51, 0x00}, {0x5B, 0x9C}, {0x61, 0x0F}, {0x61, 0xFF}, /* 0xF0-0xF3 */ + {0x64, 0xEC}, {0x69, 0x05}, {0x6B, 0xC5}, {0x75, 0x91}, /* 0xF4-0xF7 */ + {0x77, 0xE3}, {0x7F, 0xA9}, {0x82, 0x64}, {0x85, 0x8F}, /* 0xF8-0xFB */ + {0x87, 0xFB}, {0x88, 0x63}, {0x8A, 0xBC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x8B, 0x70}, {0x91, 0xAB}, {0x4E, 0x8C}, /* 0xA0-0xA3 */ + {0x4E, 0xE5}, {0x4F, 0x0A}, {0xF9, 0xDD}, {0xF9, 0xDE}, /* 0xA4-0xA7 */ + {0x59, 0x37}, {0x59, 0xE8}, {0xF9, 0xDF}, {0x5D, 0xF2}, /* 0xA8-0xAB */ + {0x5F, 0x1B}, {0x5F, 0x5B}, {0x60, 0x21}, {0xF9, 0xE0}, /* 0xAC-0xAF */ + {0xF9, 0xE1}, {0xF9, 0xE2}, {0xF9, 0xE3}, {0x72, 0x3E}, /* 0xB0-0xB3 */ + {0x73, 0xE5}, {0xF9, 0xE4}, {0x75, 0x70}, {0x75, 0xCD}, /* 0xB4-0xB7 */ + {0xF9, 0xE5}, {0x79, 0xFB}, {0xF9, 0xE6}, {0x80, 0x0C}, /* 0xB8-0xBB */ + {0x80, 0x33}, {0x80, 0x84}, {0x82, 0xE1}, {0x83, 0x51}, /* 0xBC-0xBF */ + {0xF9, 0xE7}, {0xF9, 0xE8}, {0x8C, 0xBD}, {0x8C, 0xB3}, /* 0xC0-0xC3 */ + {0x90, 0x87}, {0xF9, 0xE9}, {0xF9, 0xEA}, {0x98, 0xF4}, /* 0xC4-0xC7 */ + {0x99, 0x0C}, {0xF9, 0xEB}, {0xF9, 0xEC}, {0x70, 0x37}, /* 0xC8-0xCB */ + {0x76, 0xCA}, {0x7F, 0xCA}, {0x7F, 0xCC}, {0x7F, 0xFC}, /* 0xCC-0xCF */ + {0x8B, 0x1A}, {0x4E, 0xBA}, {0x4E, 0xC1}, {0x52, 0x03}, /* 0xD0-0xD3 */ + {0x53, 0x70}, {0xF9, 0xED}, {0x54, 0xBD}, {0x56, 0xE0}, /* 0xD4-0xD7 */ + {0x59, 0xFB}, {0x5B, 0xC5}, {0x5F, 0x15}, {0x5F, 0xCD}, /* 0xD8-0xDB */ + {0x6E, 0x6E}, {0xF9, 0xEE}, {0xF9, 0xEF}, {0x7D, 0x6A}, /* 0xDC-0xDF */ + {0x83, 0x35}, {0xF9, 0xF0}, {0x86, 0x93}, {0x8A, 0x8D}, /* 0xE0-0xE3 */ + {0xF9, 0xF1}, {0x97, 0x6D}, {0x97, 0x77}, {0xF9, 0xF2}, /* 0xE4-0xE7 */ + {0xF9, 0xF3}, {0x4E, 0x00}, {0x4F, 0x5A}, {0x4F, 0x7E}, /* 0xE8-0xEB */ + {0x58, 0xF9}, {0x65, 0xE5}, {0x6E, 0xA2}, {0x90, 0x38}, /* 0xEC-0xEF */ + {0x93, 0xB0}, {0x99, 0xB9}, {0x4E, 0xFB}, {0x58, 0xEC}, /* 0xF0-0xF3 */ + {0x59, 0x8A}, {0x59, 0xD9}, {0x60, 0x41}, {0xF9, 0xF4}, /* 0xF4-0xF7 */ + {0xF9, 0xF5}, {0x7A, 0x14}, {0xF9, 0xF6}, {0x83, 0x4F}, /* 0xF8-0xFB */ + {0x8C, 0xC3}, {0x51, 0x65}, {0x53, 0x44}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_ED[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xF9, 0xF7}, {0xF9, 0xF8}, {0xF9, 0xF9}, /* 0xA0-0xA3 */ + {0x4E, 0xCD}, {0x52, 0x69}, {0x5B, 0x55}, {0x82, 0xBF}, /* 0xA4-0xA7 */ + {0x4E, 0xD4}, {0x52, 0x3A}, {0x54, 0xA8}, {0x59, 0xC9}, /* 0xA8-0xAB */ + {0x59, 0xFF}, {0x5B, 0x50}, {0x5B, 0x57}, {0x5B, 0x5C}, /* 0xAC-0xAF */ + {0x60, 0x63}, {0x61, 0x48}, {0x6E, 0xCB}, {0x70, 0x99}, /* 0xB0-0xB3 */ + {0x71, 0x6E}, {0x73, 0x86}, {0x74, 0xF7}, {0x75, 0xB5}, /* 0xB4-0xB7 */ + {0x78, 0xC1}, {0x7D, 0x2B}, {0x80, 0x05}, {0x81, 0xEA}, /* 0xB8-0xBB */ + {0x83, 0x28}, {0x85, 0x17}, {0x85, 0xC9}, {0x8A, 0xEE}, /* 0xBC-0xBF */ + {0x8C, 0xC7}, {0x96, 0xCC}, {0x4F, 0x5C}, {0x52, 0xFA}, /* 0xC0-0xC3 */ + {0x56, 0xBC}, {0x65, 0xAB}, {0x66, 0x28}, {0x70, 0x7C}, /* 0xC4-0xC7 */ + {0x70, 0xB8}, {0x72, 0x35}, {0x7D, 0xBD}, {0x82, 0x8D}, /* 0xC8-0xCB */ + {0x91, 0x4C}, {0x96, 0xC0}, {0x9D, 0x72}, {0x5B, 0x71}, /* 0xCC-0xCF */ + {0x68, 0xE7}, {0x6B, 0x98}, {0x6F, 0x7A}, {0x76, 0xDE}, /* 0xD0-0xD3 */ + {0x5C, 0x91}, {0x66, 0xAB}, {0x6F, 0x5B}, {0x7B, 0xB4}, /* 0xD4-0xD7 */ + {0x7C, 0x2A}, {0x88, 0x36}, {0x96, 0xDC}, {0x4E, 0x08}, /* 0xD8-0xDB */ + {0x4E, 0xD7}, {0x53, 0x20}, {0x58, 0x34}, {0x58, 0xBB}, /* 0xDC-0xDF */ + {0x58, 0xEF}, {0x59, 0x6C}, {0x5C, 0x07}, {0x5E, 0x33}, /* 0xE0-0xE3 */ + {0x5E, 0x84}, {0x5F, 0x35}, {0x63, 0x8C}, {0x66, 0xB2}, /* 0xE4-0xE7 */ + {0x67, 0x56}, {0x6A, 0x1F}, {0x6A, 0xA3}, {0x6B, 0x0C}, /* 0xE8-0xEB */ + {0x6F, 0x3F}, {0x72, 0x46}, {0xF9, 0xFA}, {0x73, 0x50}, /* 0xEC-0xEF */ + {0x74, 0x8B}, {0x7A, 0xE0}, {0x7C, 0xA7}, {0x81, 0x78}, /* 0xF0-0xF3 */ + {0x81, 0xDF}, {0x81, 0xE7}, {0x83, 0x8A}, {0x84, 0x6C}, /* 0xF4-0xF7 */ + {0x85, 0x23}, {0x85, 0x94}, {0x85, 0xCF}, {0x88, 0xDD}, /* 0xF8-0xFB */ + {0x8D, 0x13}, {0x91, 0xAC}, {0x95, 0x77}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x96, 0x9C}, {0x51, 0x8D}, {0x54, 0xC9}, /* 0xA0-0xA3 */ + {0x57, 0x28}, {0x5B, 0xB0}, {0x62, 0x4D}, {0x67, 0x50}, /* 0xA4-0xA7 */ + {0x68, 0x3D}, {0x68, 0x93}, {0x6E, 0x3D}, {0x6E, 0xD3}, /* 0xA8-0xAB */ + {0x70, 0x7D}, {0x7E, 0x21}, {0x88, 0xC1}, {0x8C, 0xA1}, /* 0xAC-0xAF */ + {0x8F, 0x09}, {0x9F, 0x4B}, {0x9F, 0x4E}, {0x72, 0x2D}, /* 0xB0-0xB3 */ + {0x7B, 0x8F}, {0x8A, 0xCD}, {0x93, 0x1A}, {0x4F, 0x47}, /* 0xB4-0xB7 */ + {0x4F, 0x4E}, {0x51, 0x32}, {0x54, 0x80}, {0x59, 0xD0}, /* 0xB8-0xBB */ + {0x5E, 0x95}, {0x62, 0xB5}, {0x67, 0x75}, {0x69, 0x6E}, /* 0xBC-0xBF */ + {0x6A, 0x17}, {0x6C, 0xAE}, {0x6E, 0x1A}, {0x72, 0xD9}, /* 0xC0-0xC3 */ + {0x73, 0x2A}, {0x75, 0xBD}, {0x7B, 0xB8}, {0x7D, 0x35}, /* 0xC4-0xC7 */ + {0x82, 0xE7}, {0x83, 0xF9}, {0x84, 0x57}, {0x85, 0xF7}, /* 0xC8-0xCB */ + {0x8A, 0x5B}, {0x8C, 0xAF}, {0x8E, 0x87}, {0x90, 0x19}, /* 0xCC-0xCF */ + {0x90, 0xB8}, {0x96, 0xCE}, {0x9F, 0x5F}, {0x52, 0xE3}, /* 0xD0-0xD3 */ + {0x54, 0x0A}, {0x5A, 0xE1}, {0x5B, 0xC2}, {0x64, 0x58}, /* 0xD4-0xD7 */ + {0x65, 0x75}, {0x6E, 0xF4}, {0x72, 0xC4}, {0xF9, 0xFB}, /* 0xD8-0xDB */ + {0x76, 0x84}, {0x7A, 0x4D}, {0x7B, 0x1B}, {0x7C, 0x4D}, /* 0xDC-0xDF */ + {0x7E, 0x3E}, {0x7F, 0xDF}, {0x83, 0x7B}, {0x8B, 0x2B}, /* 0xE0-0xE3 */ + {0x8C, 0xCA}, {0x8D, 0x64}, {0x8D, 0xE1}, {0x8E, 0x5F}, /* 0xE4-0xE7 */ + {0x8F, 0xEA}, {0x8F, 0xF9}, {0x90, 0x69}, {0x93, 0xD1}, /* 0xE8-0xEB */ + {0x4F, 0x43}, {0x4F, 0x7A}, {0x50, 0xB3}, {0x51, 0x68}, /* 0xEC-0xEF */ + {0x51, 0x78}, {0x52, 0x4D}, {0x52, 0x6A}, {0x58, 0x61}, /* 0xF0-0xF3 */ + {0x58, 0x7C}, {0x59, 0x60}, {0x5C, 0x08}, {0x5C, 0x55}, /* 0xF4-0xF7 */ + {0x5E, 0xDB}, {0x60, 0x9B}, {0x62, 0x30}, {0x68, 0x13}, /* 0xF8-0xFB */ + {0x6B, 0xBF}, {0x6C, 0x08}, {0x6F, 0xB1}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x71, 0x4E}, {0x74, 0x20}, {0x75, 0x30}, /* 0xA0-0xA3 */ + {0x75, 0x38}, {0x75, 0x51}, {0x76, 0x72}, {0x7B, 0x4C}, /* 0xA4-0xA7 */ + {0x7B, 0x8B}, {0x7B, 0xAD}, {0x7B, 0xC6}, {0x7E, 0x8F}, /* 0xA8-0xAB */ + {0x8A, 0x6E}, {0x8F, 0x3E}, {0x8F, 0x49}, {0x92, 0x3F}, /* 0xAC-0xAF */ + {0x92, 0x93}, {0x93, 0x22}, {0x94, 0x2B}, {0x96, 0xFB}, /* 0xB0-0xB3 */ + {0x98, 0x5A}, {0x98, 0x6B}, {0x99, 0x1E}, {0x52, 0x07}, /* 0xB4-0xB7 */ + {0x62, 0x2A}, {0x62, 0x98}, {0x6D, 0x59}, {0x76, 0x64}, /* 0xB8-0xBB */ + {0x7A, 0xCA}, {0x7B, 0xC0}, {0x7D, 0x76}, {0x53, 0x60}, /* 0xBC-0xBF */ + {0x5C, 0xBE}, {0x5E, 0x97}, {0x6F, 0x38}, {0x70, 0xB9}, /* 0xC0-0xC3 */ + {0x7C, 0x98}, {0x97, 0x11}, {0x9B, 0x8E}, {0x9E, 0xDE}, /* 0xC4-0xC7 */ + {0x63, 0xA5}, {0x64, 0x7A}, {0x87, 0x76}, {0x4E, 0x01}, /* 0xC8-0xCB */ + {0x4E, 0x95}, {0x4E, 0xAD}, {0x50, 0x5C}, {0x50, 0x75}, /* 0xCC-0xCF */ + {0x54, 0x48}, {0x59, 0xC3}, {0x5B, 0x9A}, {0x5E, 0x40}, /* 0xD0-0xD3 */ + {0x5E, 0xAD}, {0x5E, 0xF7}, {0x5F, 0x81}, {0x60, 0xC5}, /* 0xD4-0xD7 */ + {0x63, 0x3A}, {0x65, 0x3F}, {0x65, 0x74}, {0x65, 0xCC}, /* 0xD8-0xDB */ + {0x66, 0x76}, {0x66, 0x78}, {0x67, 0xFE}, {0x69, 0x68}, /* 0xDC-0xDF */ + {0x6A, 0x89}, {0x6B, 0x63}, {0x6C, 0x40}, {0x6D, 0xC0}, /* 0xE0-0xE3 */ + {0x6D, 0xE8}, {0x6E, 0x1F}, {0x6E, 0x5E}, {0x70, 0x1E}, /* 0xE4-0xE7 */ + {0x70, 0xA1}, {0x73, 0x8E}, {0x73, 0xFD}, {0x75, 0x3A}, /* 0xE8-0xEB */ + {0x77, 0x5B}, {0x78, 0x87}, {0x79, 0x8E}, {0x7A, 0x0B}, /* 0xEC-0xEF */ + {0x7A, 0x7D}, {0x7C, 0xBE}, {0x7D, 0x8E}, {0x82, 0x47}, /* 0xF0-0xF3 */ + {0x8A, 0x02}, {0x8A, 0xEA}, {0x8C, 0x9E}, {0x91, 0x2D}, /* 0xF4-0xF7 */ + {0x91, 0x4A}, {0x91, 0xD8}, {0x92, 0x66}, {0x92, 0xCC}, /* 0xF8-0xFB */ + {0x93, 0x20}, {0x97, 0x06}, {0x97, 0x56}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x97, 0x5C}, {0x98, 0x02}, {0x9F, 0x0E}, /* 0xA0-0xA3 */ + {0x52, 0x36}, {0x52, 0x91}, {0x55, 0x7C}, {0x58, 0x24}, /* 0xA4-0xA7 */ + {0x5E, 0x1D}, {0x5F, 0x1F}, {0x60, 0x8C}, {0x63, 0xD0}, /* 0xA8-0xAB */ + {0x68, 0xAF}, {0x6F, 0xDF}, {0x79, 0x6D}, {0x7B, 0x2C}, /* 0xAC-0xAF */ + {0x81, 0xCD}, {0x85, 0xBA}, {0x88, 0xFD}, {0x8A, 0xF8}, /* 0xB0-0xB3 */ + {0x8E, 0x44}, {0x91, 0x8D}, {0x96, 0x64}, {0x96, 0x9B}, /* 0xB4-0xB7 */ + {0x97, 0x3D}, {0x98, 0x4C}, {0x9F, 0x4A}, {0x4F, 0xCE}, /* 0xB8-0xBB */ + {0x51, 0x46}, {0x51, 0xCB}, {0x52, 0xA9}, {0x56, 0x32}, /* 0xBC-0xBF */ + {0x5F, 0x14}, {0x5F, 0x6B}, {0x63, 0xAA}, {0x64, 0xCD}, /* 0xC0-0xC3 */ + {0x65, 0xE9}, {0x66, 0x41}, {0x66, 0xFA}, {0x66, 0xF9}, /* 0xC4-0xC7 */ + {0x67, 0x1D}, {0x68, 0x9D}, {0x68, 0xD7}, {0x69, 0xFD}, /* 0xC8-0xCB */ + {0x6F, 0x15}, {0x6F, 0x6E}, {0x71, 0x67}, {0x71, 0xE5}, /* 0xCC-0xCF */ + {0x72, 0x2A}, {0x74, 0xAA}, {0x77, 0x3A}, {0x79, 0x56}, /* 0xD0-0xD3 */ + {0x79, 0x5A}, {0x79, 0xDF}, {0x7A, 0x20}, {0x7A, 0x95}, /* 0xD4-0xD7 */ + {0x7C, 0x97}, {0x7C, 0xDF}, {0x7D, 0x44}, {0x7E, 0x70}, /* 0xD8-0xDB */ + {0x80, 0x87}, {0x85, 0xFB}, {0x86, 0xA4}, {0x8A, 0x54}, /* 0xDC-0xDF */ + {0x8A, 0xBF}, {0x8D, 0x99}, {0x8E, 0x81}, {0x90, 0x20}, /* 0xE0-0xE3 */ + {0x90, 0x6D}, {0x91, 0xE3}, {0x96, 0x3B}, {0x96, 0xD5}, /* 0xE4-0xE7 */ + {0x9C, 0xE5}, {0x65, 0xCF}, {0x7C, 0x07}, {0x8D, 0xB3}, /* 0xE8-0xEB */ + {0x93, 0xC3}, {0x5B, 0x58}, {0x5C, 0x0A}, {0x53, 0x52}, /* 0xEC-0xEF */ + {0x62, 0xD9}, {0x73, 0x1D}, {0x50, 0x27}, {0x5B, 0x97}, /* 0xF0-0xF3 */ + {0x5F, 0x9E}, {0x60, 0xB0}, {0x61, 0x6B}, {0x68, 0xD5}, /* 0xF4-0xF7 */ + {0x6D, 0xD9}, {0x74, 0x2E}, {0x7A, 0x2E}, {0x7D, 0x42}, /* 0xF8-0xFB */ + {0x7D, 0x9C}, {0x7E, 0x31}, {0x81, 0x6B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x8E, 0x2A}, {0x8E, 0x35}, {0x93, 0x7E}, /* 0xA0-0xA3 */ + {0x94, 0x18}, {0x4F, 0x50}, {0x57, 0x50}, {0x5D, 0xE6}, /* 0xA4-0xA7 */ + {0x5E, 0xA7}, {0x63, 0x2B}, {0x7F, 0x6A}, {0x4E, 0x3B}, /* 0xA8-0xAB */ + {0x4F, 0x4F}, {0x4F, 0x8F}, {0x50, 0x5A}, {0x59, 0xDD}, /* 0xAC-0xAF */ + {0x80, 0xC4}, {0x54, 0x6A}, {0x54, 0x68}, {0x55, 0xFE}, /* 0xB0-0xB3 */ + {0x59, 0x4F}, {0x5B, 0x99}, {0x5D, 0xDE}, {0x5E, 0xDA}, /* 0xB4-0xB7 */ + {0x66, 0x5D}, {0x67, 0x31}, {0x67, 0xF1}, {0x68, 0x2A}, /* 0xB8-0xBB */ + {0x6C, 0xE8}, {0x6D, 0x32}, {0x6E, 0x4A}, {0x6F, 0x8D}, /* 0xBC-0xBF */ + {0x70, 0xB7}, {0x73, 0xE0}, {0x75, 0x87}, {0x7C, 0x4C}, /* 0xC0-0xC3 */ + {0x7D, 0x02}, {0x7D, 0x2C}, {0x7D, 0xA2}, {0x82, 0x1F}, /* 0xC4-0xC7 */ + {0x86, 0xDB}, {0x8A, 0x3B}, {0x8A, 0x85}, {0x8D, 0x70}, /* 0xC8-0xCB */ + {0x8E, 0x8A}, {0x8F, 0x33}, {0x90, 0x31}, {0x91, 0x4E}, /* 0xCC-0xCF */ + {0x91, 0x52}, {0x94, 0x44}, {0x99, 0xD0}, {0x7A, 0xF9}, /* 0xD0-0xD3 */ + {0x7C, 0xA5}, {0x4F, 0xCA}, {0x51, 0x01}, {0x51, 0xC6}, /* 0xD4-0xD7 */ + {0x57, 0xC8}, {0x5B, 0xEF}, {0x5C, 0xFB}, {0x66, 0x59}, /* 0xD8-0xDB */ + {0x6A, 0x3D}, {0x6D, 0x5A}, {0x6E, 0x96}, {0x6F, 0xEC}, /* 0xDC-0xDF */ + {0x71, 0x0C}, {0x75, 0x6F}, {0x7A, 0xE3}, {0x88, 0x22}, /* 0xE0-0xE3 */ + {0x90, 0x21}, {0x90, 0x75}, {0x96, 0xCB}, {0x99, 0xFF}, /* 0xE4-0xE7 */ + {0x83, 0x01}, {0x4E, 0x2D}, {0x4E, 0xF2}, {0x88, 0x46}, /* 0xE8-0xEB */ + {0x91, 0xCD}, {0x53, 0x7D}, {0x6A, 0xDB}, {0x69, 0x6B}, /* 0xEC-0xEF */ + {0x6C, 0x41}, {0x84, 0x7A}, {0x58, 0x9E}, {0x61, 0x8E}, /* 0xF0-0xF3 */ + {0x66, 0xFE}, {0x62, 0xEF}, {0x70, 0xDD}, {0x75, 0x11}, /* 0xF4-0xF7 */ + {0x75, 0xC7}, {0x7E, 0x52}, {0x84, 0xB8}, {0x8B, 0x49}, /* 0xF8-0xFB */ + {0x8D, 0x08}, {0x4E, 0x4B}, {0x53, 0xEA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x54, 0xAB}, {0x57, 0x30}, {0x57, 0x40}, /* 0xA0-0xA3 */ + {0x5F, 0xD7}, {0x63, 0x01}, {0x63, 0x07}, {0x64, 0x6F}, /* 0xA4-0xA7 */ + {0x65, 0x2F}, {0x65, 0xE8}, {0x66, 0x7A}, {0x67, 0x9D}, /* 0xA8-0xAB */ + {0x67, 0xB3}, {0x6B, 0x62}, {0x6C, 0x60}, {0x6C, 0x9A}, /* 0xAC-0xAF */ + {0x6F, 0x2C}, {0x77, 0xE5}, {0x78, 0x25}, {0x79, 0x49}, /* 0xB0-0xB3 */ + {0x79, 0x57}, {0x7D, 0x19}, {0x80, 0xA2}, {0x81, 0x02}, /* 0xB4-0xB7 */ + {0x81, 0xF3}, {0x82, 0x9D}, {0x82, 0xB7}, {0x87, 0x18}, /* 0xB8-0xBB */ + {0x8A, 0x8C}, {0xF9, 0xFC}, {0x8D, 0x04}, {0x8D, 0xBE}, /* 0xBC-0xBF */ + {0x90, 0x72}, {0x76, 0xF4}, {0x7A, 0x19}, {0x7A, 0x37}, /* 0xC0-0xC3 */ + {0x7E, 0x54}, {0x80, 0x77}, {0x55, 0x07}, {0x55, 0xD4}, /* 0xC4-0xC7 */ + {0x58, 0x75}, {0x63, 0x2F}, {0x64, 0x22}, {0x66, 0x49}, /* 0xC8-0xCB */ + {0x66, 0x4B}, {0x68, 0x6D}, {0x69, 0x9B}, {0x6B, 0x84}, /* 0xCC-0xCF */ + {0x6D, 0x25}, {0x6E, 0xB1}, {0x73, 0xCD}, {0x74, 0x68}, /* 0xD0-0xD3 */ + {0x74, 0xA1}, {0x75, 0x5B}, {0x75, 0xB9}, {0x76, 0xE1}, /* 0xD4-0xD7 */ + {0x77, 0x1E}, {0x77, 0x8B}, {0x79, 0xE6}, {0x7E, 0x09}, /* 0xD8-0xDB */ + {0x7E, 0x1D}, {0x81, 0xFB}, {0x85, 0x2F}, {0x88, 0x97}, /* 0xDC-0xDF */ + {0x8A, 0x3A}, {0x8C, 0xD1}, {0x8E, 0xEB}, {0x8F, 0xB0}, /* 0xE0-0xE3 */ + {0x90, 0x32}, {0x93, 0xAD}, {0x96, 0x63}, {0x96, 0x73}, /* 0xE4-0xE7 */ + {0x97, 0x07}, {0x4F, 0x84}, {0x53, 0xF1}, {0x59, 0xEA}, /* 0xE8-0xEB */ + {0x5A, 0xC9}, {0x5E, 0x19}, {0x68, 0x4E}, {0x74, 0xC6}, /* 0xEC-0xEF */ + {0x75, 0xBE}, {0x79, 0xE9}, {0x7A, 0x92}, {0x81, 0xA3}, /* 0xF0-0xF3 */ + {0x86, 0xED}, {0x8C, 0xEA}, {0x8D, 0xCC}, {0x8F, 0xED}, /* 0xF4-0xF7 */ + {0x65, 0x9F}, {0x67, 0x15}, {0xF9, 0xFD}, {0x57, 0xF7}, /* 0xF8-0xFB */ + {0x6F, 0x57}, {0x7D, 0xDD}, {0x8F, 0x2F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x93, 0xF6}, {0x96, 0xC6}, {0x5F, 0xB5}, /* 0xA0-0xA3 */ + {0x61, 0xF2}, {0x6F, 0x84}, {0x4E, 0x14}, {0x4F, 0x98}, /* 0xA4-0xA7 */ + {0x50, 0x1F}, {0x53, 0xC9}, {0x55, 0xDF}, {0x5D, 0x6F}, /* 0xA8-0xAB */ + {0x5D, 0xEE}, {0x6B, 0x21}, {0x6B, 0x64}, {0x78, 0xCB}, /* 0xAC-0xAF */ + {0x7B, 0x9A}, {0xF9, 0xFE}, {0x8E, 0x49}, {0x8E, 0xCA}, /* 0xB0-0xB3 */ + {0x90, 0x6E}, {0x63, 0x49}, {0x64, 0x3E}, {0x77, 0x40}, /* 0xB4-0xB7 */ + {0x7A, 0x84}, {0x93, 0x2F}, {0x94, 0x7F}, {0x9F, 0x6A}, /* 0xB8-0xBB */ + {0x64, 0xB0}, {0x6F, 0xAF}, {0x71, 0xE6}, {0x74, 0xA8}, /* 0xBC-0xBF */ + {0x74, 0xDA}, {0x7A, 0xC4}, {0x7C, 0x12}, {0x7E, 0x82}, /* 0xC0-0xC3 */ + {0x7C, 0xB2}, {0x7E, 0x98}, {0x8B, 0x9A}, {0x8D, 0x0A}, /* 0xC4-0xC7 */ + {0x94, 0x7D}, {0x99, 0x10}, {0x99, 0x4C}, {0x52, 0x39}, /* 0xC8-0xCB */ + {0x5B, 0xDF}, {0x64, 0xE6}, {0x67, 0x2D}, {0x7D, 0x2E}, /* 0xCC-0xCF */ + {0x50, 0xED}, {0x53, 0xC3}, {0x58, 0x79}, {0x61, 0x58}, /* 0xD0-0xD3 */ + {0x61, 0x59}, {0x61, 0xFA}, {0x65, 0xAC}, {0x7A, 0xD9}, /* 0xD4-0xD7 */ + {0x8B, 0x92}, {0x8B, 0x96}, {0x50, 0x09}, {0x50, 0x21}, /* 0xD8-0xDB */ + {0x52, 0x75}, {0x55, 0x31}, {0x5A, 0x3C}, {0x5E, 0xE0}, /* 0xDC-0xDF */ + {0x5F, 0x70}, {0x61, 0x34}, {0x65, 0x5E}, {0x66, 0x0C}, /* 0xE0-0xE3 */ + {0x66, 0x36}, {0x66, 0xA2}, {0x69, 0xCD}, {0x6E, 0xC4}, /* 0xE4-0xE7 */ + {0x6F, 0x32}, {0x73, 0x16}, {0x76, 0x21}, {0x7A, 0x93}, /* 0xE8-0xEB */ + {0x81, 0x39}, {0x82, 0x59}, {0x83, 0xD6}, {0x84, 0xBC}, /* 0xEC-0xEF */ + {0x50, 0xB5}, {0x57, 0xF0}, {0x5B, 0xC0}, {0x5B, 0xE8}, /* 0xF0-0xF3 */ + {0x5F, 0x69}, {0x63, 0xA1}, {0x78, 0x26}, {0x7D, 0xB5}, /* 0xF4-0xF7 */ + {0x83, 0xDC}, {0x85, 0x21}, {0x91, 0xC7}, {0x91, 0xF5}, /* 0xF8-0xFB */ + {0x51, 0x8A}, {0x67, 0xF5}, {0x7B, 0x56}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x8C, 0xAC}, {0x51, 0xC4}, {0x59, 0xBB}, /* 0xA0-0xA3 */ + {0x60, 0xBD}, {0x86, 0x55}, {0x50, 0x1C}, {0xF9, 0xFF}, /* 0xA4-0xA7 */ + {0x52, 0x54}, {0x5C, 0x3A}, {0x61, 0x7D}, {0x62, 0x1A}, /* 0xA8-0xAB */ + {0x62, 0xD3}, {0x64, 0xF2}, {0x65, 0xA5}, {0x6E, 0xCC}, /* 0xAC-0xAF */ + {0x76, 0x20}, {0x81, 0x0A}, {0x8E, 0x60}, {0x96, 0x5F}, /* 0xB0-0xB3 */ + {0x96, 0xBB}, {0x4E, 0xDF}, {0x53, 0x43}, {0x55, 0x98}, /* 0xB4-0xB7 */ + {0x59, 0x29}, {0x5D, 0xDD}, {0x64, 0xC5}, {0x6C, 0xC9}, /* 0xB8-0xBB */ + {0x6D, 0xFA}, {0x73, 0x94}, {0x7A, 0x7F}, {0x82, 0x1B}, /* 0xBC-0xBF */ + {0x85, 0xA6}, {0x8C, 0xE4}, {0x8E, 0x10}, {0x90, 0x77}, /* 0xC0-0xC3 */ + {0x91, 0xE7}, {0x95, 0xE1}, {0x96, 0x21}, {0x97, 0xC6}, /* 0xC4-0xC7 */ + {0x51, 0xF8}, {0x54, 0xF2}, {0x55, 0x86}, {0x5F, 0xB9}, /* 0xC8-0xCB */ + {0x64, 0xA4}, {0x6F, 0x88}, {0x7D, 0xB4}, {0x8F, 0x1F}, /* 0xCC-0xCF */ + {0x8F, 0x4D}, {0x94, 0x35}, {0x50, 0xC9}, {0x5C, 0x16}, /* 0xD0-0xD3 */ + {0x6C, 0xBE}, {0x6D, 0xFB}, {0x75, 0x1B}, {0x77, 0xBB}, /* 0xD4-0xD7 */ + {0x7C, 0x3D}, {0x7C, 0x64}, {0x8A, 0x79}, {0x8A, 0xC2}, /* 0xD8-0xDB */ + {0x58, 0x1E}, {0x59, 0xBE}, {0x5E, 0x16}, {0x63, 0x77}, /* 0xDC-0xDF */ + {0x72, 0x52}, {0x75, 0x8A}, {0x77, 0x6B}, {0x8A, 0xDC}, /* 0xE0-0xE3 */ + {0x8C, 0xBC}, {0x8F, 0x12}, {0x5E, 0xF3}, {0x66, 0x74}, /* 0xE4-0xE7 */ + {0x6D, 0xF8}, {0x80, 0x7D}, {0x83, 0xC1}, {0x8A, 0xCB}, /* 0xE8-0xEB */ + {0x97, 0x51}, {0x9B, 0xD6}, {0xFA, 0x00}, {0x52, 0x43}, /* 0xEC-0xEF */ + {0x66, 0xFF}, {0x6D, 0x95}, {0x6E, 0xEF}, {0x7D, 0xE0}, /* 0xF0-0xF3 */ + {0x8A, 0xE6}, {0x90, 0x2E}, {0x90, 0x5E}, {0x9A, 0xD4}, /* 0xF4-0xF7 */ + {0x52, 0x1D}, {0x52, 0x7F}, {0x54, 0xE8}, {0x61, 0x94}, /* 0xF8-0xFB */ + {0x62, 0x84}, {0x62, 0xDB}, {0x68, 0xA2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x69, 0x12}, {0x69, 0x5A}, {0x6A, 0x35}, /* 0xA0-0xA3 */ + {0x70, 0x92}, {0x71, 0x26}, {0x78, 0x5D}, {0x79, 0x01}, /* 0xA4-0xA7 */ + {0x79, 0x0E}, {0x79, 0xD2}, {0x7A, 0x0D}, {0x80, 0x96}, /* 0xA8-0xAB */ + {0x82, 0x78}, {0x82, 0xD5}, {0x83, 0x49}, {0x85, 0x49}, /* 0xAC-0xAF */ + {0x8C, 0x82}, {0x8D, 0x85}, {0x91, 0x62}, {0x91, 0x8B}, /* 0xB0-0xB3 */ + {0x91, 0xAE}, {0x4F, 0xC3}, {0x56, 0xD1}, {0x71, 0xED}, /* 0xB4-0xB7 */ + {0x77, 0xD7}, {0x87, 0x00}, {0x89, 0xF8}, {0x5B, 0xF8}, /* 0xB8-0xBB */ + {0x5F, 0xD6}, {0x67, 0x51}, {0x90, 0xA8}, {0x53, 0xE2}, /* 0xBC-0xBF */ + {0x58, 0x5A}, {0x5B, 0xF5}, {0x60, 0xA4}, {0x61, 0x81}, /* 0xC0-0xC3 */ + {0x64, 0x60}, {0x7E, 0x3D}, {0x80, 0x70}, {0x85, 0x25}, /* 0xC4-0xC7 */ + {0x92, 0x83}, {0x64, 0xAE}, {0x50, 0xAC}, {0x5D, 0x14}, /* 0xC8-0xCB */ + {0x67, 0x00}, {0x58, 0x9C}, {0x62, 0xBD}, {0x63, 0xA8}, /* 0xCC-0xCF */ + {0x69, 0x0E}, {0x69, 0x78}, {0x6A, 0x1E}, {0x6E, 0x6B}, /* 0xD0-0xD3 */ + {0x76, 0xBA}, {0x79, 0xCB}, {0x82, 0xBB}, {0x84, 0x29}, /* 0xD4-0xD7 */ + {0x8A, 0xCF}, {0x8D, 0xA8}, {0x8F, 0xFD}, {0x91, 0x12}, /* 0xD8-0xDB */ + {0x91, 0x4B}, {0x91, 0x9C}, {0x93, 0x10}, {0x93, 0x18}, /* 0xDC-0xDF */ + {0x93, 0x9A}, {0x96, 0xDB}, {0x9A, 0x36}, {0x9C, 0x0D}, /* 0xE0-0xE3 */ + {0x4E, 0x11}, {0x75, 0x5C}, {0x79, 0x5D}, {0x7A, 0xFA}, /* 0xE4-0xE7 */ + {0x7B, 0x51}, {0x7B, 0xC9}, {0x7E, 0x2E}, {0x84, 0xC4}, /* 0xE8-0xEB */ + {0x8E, 0x59}, {0x8E, 0x74}, {0x8E, 0xF8}, {0x90, 0x10}, /* 0xEC-0xEF */ + {0x66, 0x25}, {0x69, 0x3F}, {0x74, 0x43}, {0x51, 0xFA}, /* 0xF0-0xF3 */ + {0x67, 0x2E}, {0x9E, 0xDC}, {0x51, 0x45}, {0x5F, 0xE0}, /* 0xF4-0xF7 */ + {0x6C, 0x96}, {0x87, 0xF2}, {0x88, 0x5D}, {0x88, 0x77}, /* 0xF8-0xFB */ + {0x60, 0xB4}, {0x81, 0xB5}, {0x84, 0x03}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x8D, 0x05}, {0x53, 0xD6}, {0x54, 0x39}, /* 0xA0-0xA3 */ + {0x56, 0x34}, {0x5A, 0x36}, {0x5C, 0x31}, {0x70, 0x8A}, /* 0xA4-0xA7 */ + {0x7F, 0xE0}, {0x80, 0x5A}, {0x81, 0x06}, {0x81, 0xED}, /* 0xA8-0xAB */ + {0x8D, 0xA3}, {0x91, 0x89}, {0x9A, 0x5F}, {0x9D, 0xF2}, /* 0xAC-0xAF */ + {0x50, 0x74}, {0x4E, 0xC4}, {0x53, 0xA0}, {0x60, 0xFB}, /* 0xB0-0xB3 */ + {0x6E, 0x2C}, {0x5C, 0x64}, {0x4F, 0x88}, {0x50, 0x24}, /* 0xB4-0xB7 */ + {0x55, 0xE4}, {0x5C, 0xD9}, {0x5E, 0x5F}, {0x60, 0x65}, /* 0xB8-0xBB */ + {0x68, 0x94}, {0x6C, 0xBB}, {0x6D, 0xC4}, {0x71, 0xBE}, /* 0xBC-0xBF */ + {0x75, 0xD4}, {0x75, 0xF4}, {0x76, 0x61}, {0x7A, 0x1A}, /* 0xC0-0xC3 */ + {0x7A, 0x49}, {0x7D, 0xC7}, {0x7D, 0xFB}, {0x7F, 0x6E}, /* 0xC4-0xC7 */ + {0x81, 0xF4}, {0x86, 0xA9}, {0x8F, 0x1C}, {0x96, 0xC9}, /* 0xC8-0xCB */ + {0x99, 0xB3}, {0x9F, 0x52}, {0x52, 0x47}, {0x52, 0xC5}, /* 0xCC-0xCF */ + {0x98, 0xED}, {0x89, 0xAA}, {0x4E, 0x03}, {0x67, 0xD2}, /* 0xD0-0xD3 */ + {0x6F, 0x06}, {0x4F, 0xB5}, {0x5B, 0xE2}, {0x67, 0x95}, /* 0xD4-0xD7 */ + {0x6C, 0x88}, {0x6D, 0x78}, {0x74, 0x1B}, {0x78, 0x27}, /* 0xD8-0xDB */ + {0x91, 0xDD}, {0x93, 0x7C}, {0x87, 0xC4}, {0x79, 0xE4}, /* 0xDC-0xDF */ + {0x7A, 0x31}, {0x5F, 0xEB}, {0x4E, 0xD6}, {0x54, 0xA4}, /* 0xE0-0xE3 */ + {0x55, 0x3E}, {0x58, 0xAE}, {0x59, 0xA5}, {0x60, 0xF0}, /* 0xE4-0xE7 */ + {0x62, 0x53}, {0x62, 0xD6}, {0x67, 0x36}, {0x69, 0x55}, /* 0xE8-0xEB */ + {0x82, 0x35}, {0x96, 0x40}, {0x99, 0xB1}, {0x99, 0xDD}, /* 0xEC-0xEF */ + {0x50, 0x2C}, {0x53, 0x53}, {0x55, 0x44}, {0x57, 0x7C}, /* 0xF0-0xF3 */ + {0xFA, 0x01}, {0x62, 0x58}, {0xFA, 0x02}, {0x64, 0xE2}, /* 0xF4-0xF7 */ + {0x66, 0x6B}, {0x67, 0xDD}, {0x6F, 0xC1}, {0x6F, 0xEF}, /* 0xF8-0xFB */ + {0x74, 0x22}, {0x74, 0x38}, {0x8A, 0x17}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x94, 0x38}, {0x54, 0x51}, {0x56, 0x06}, /* 0xA0-0xA3 */ + {0x57, 0x66}, {0x5F, 0x48}, {0x61, 0x9A}, {0x6B, 0x4E}, /* 0xA4-0xA7 */ + {0x70, 0x58}, {0x70, 0xAD}, {0x7D, 0xBB}, {0x8A, 0x95}, /* 0xA8-0xAB */ + {0x59, 0x6A}, {0x81, 0x2B}, {0x63, 0xA2}, {0x77, 0x08}, /* 0xAC-0xAF */ + {0x80, 0x3D}, {0x8C, 0xAA}, {0x58, 0x54}, {0x64, 0x2D}, /* 0xB0-0xB3 */ + {0x69, 0xBB}, {0x5B, 0x95}, {0x5E, 0x11}, {0x6E, 0x6F}, /* 0xB4-0xB7 */ + {0xFA, 0x03}, {0x85, 0x69}, {0x51, 0x4C}, {0x53, 0xF0}, /* 0xB8-0xBB */ + {0x59, 0x2A}, {0x60, 0x20}, {0x61, 0x4B}, {0x6B, 0x86}, /* 0xBC-0xBF */ + {0x6C, 0x70}, {0x6C, 0xF0}, {0x7B, 0x1E}, {0x80, 0xCE}, /* 0xC0-0xC3 */ + {0x82, 0xD4}, {0x8D, 0xC6}, {0x90, 0xB0}, {0x98, 0xB1}, /* 0xC4-0xC7 */ + {0xFA, 0x04}, {0x64, 0xC7}, {0x6F, 0xA4}, {0x64, 0x91}, /* 0xC8-0xCB */ + {0x65, 0x04}, {0x51, 0x4E}, {0x54, 0x10}, {0x57, 0x1F}, /* 0xCC-0xCF */ + {0x8A, 0x0E}, {0x61, 0x5F}, {0x68, 0x76}, {0xFA, 0x05}, /* 0xD0-0xD3 */ + {0x75, 0xDB}, {0x7B, 0x52}, {0x7D, 0x71}, {0x90, 0x1A}, /* 0xD4-0xD7 */ + {0x58, 0x06}, {0x69, 0xCC}, {0x81, 0x7F}, {0x89, 0x2A}, /* 0xD8-0xDB */ + {0x90, 0x00}, {0x98, 0x39}, {0x50, 0x78}, {0x59, 0x57}, /* 0xDC-0xDF */ + {0x59, 0xAC}, {0x62, 0x95}, {0x90, 0x0F}, {0x9B, 0x2A}, /* 0xE0-0xE3 */ + {0x61, 0x5D}, {0x72, 0x79}, {0x95, 0xD6}, {0x57, 0x61}, /* 0xE4-0xE7 */ + {0x5A, 0x46}, {0x5D, 0xF4}, {0x62, 0x8A}, {0x64, 0xAD}, /* 0xE8-0xEB */ + {0x64, 0xFA}, {0x67, 0x77}, {0x6C, 0xE2}, {0x6D, 0x3E}, /* 0xEC-0xEF */ + {0x72, 0x2C}, {0x74, 0x36}, {0x78, 0x34}, {0x7F, 0x77}, /* 0xF0-0xF3 */ + {0x82, 0xAD}, {0x8D, 0xDB}, {0x98, 0x17}, {0x52, 0x24}, /* 0xF4-0xF7 */ + {0x57, 0x42}, {0x67, 0x7F}, {0x72, 0x48}, {0x74, 0xE3}, /* 0xF8-0xFB */ + {0x8C, 0xA9}, {0x8F, 0xA6}, {0x92, 0x11}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x96, 0x2A}, {0x51, 0x6B}, {0x53, 0xED}, /* 0xA0-0xA3 */ + {0x63, 0x4C}, {0x4F, 0x69}, {0x55, 0x04}, {0x60, 0x96}, /* 0xA4-0xA7 */ + {0x65, 0x57}, {0x6C, 0x9B}, {0x6D, 0x7F}, {0x72, 0x4C}, /* 0xA8-0xAB */ + {0x72, 0xFD}, {0x7A, 0x17}, {0x89, 0x87}, {0x8C, 0x9D}, /* 0xAC-0xAF */ + {0x5F, 0x6D}, {0x6F, 0x8E}, {0x70, 0xF9}, {0x81, 0xA8}, /* 0xB0-0xB3 */ + {0x61, 0x0E}, {0x4F, 0xBF}, {0x50, 0x4F}, {0x62, 0x41}, /* 0xB4-0xB7 */ + {0x72, 0x47}, {0x7B, 0xC7}, {0x7D, 0xE8}, {0x7F, 0xE9}, /* 0xB8-0xBB */ + {0x90, 0x4D}, {0x97, 0xAD}, {0x9A, 0x19}, {0x8C, 0xB6}, /* 0xBC-0xBF */ + {0x57, 0x6A}, {0x5E, 0x73}, {0x67, 0xB0}, {0x84, 0x0D}, /* 0xC0-0xC3 */ + {0x8A, 0x55}, {0x54, 0x20}, {0x5B, 0x16}, {0x5E, 0x63}, /* 0xC4-0xC7 */ + {0x5E, 0xE2}, {0x5F, 0x0A}, {0x65, 0x83}, {0x80, 0xBA}, /* 0xC8-0xCB */ + {0x85, 0x3D}, {0x95, 0x89}, {0x96, 0x5B}, {0x4F, 0x48}, /* 0xCC-0xCF */ + {0x53, 0x05}, {0x53, 0x0D}, {0x53, 0x0F}, {0x54, 0x86}, /* 0xD0-0xD3 */ + {0x54, 0xFA}, {0x57, 0x03}, {0x5E, 0x03}, {0x60, 0x16}, /* 0xD4-0xD7 */ + {0x62, 0x9B}, {0x62, 0xB1}, {0x63, 0x55}, {0xFA, 0x06}, /* 0xD8-0xDB */ + {0x6C, 0xE1}, {0x6D, 0x66}, {0x75, 0xB1}, {0x78, 0x32}, /* 0xDC-0xDF */ + {0x80, 0xDE}, {0x81, 0x2F}, {0x82, 0xDE}, {0x84, 0x61}, /* 0xE0-0xE3 */ + {0x84, 0xB2}, {0x88, 0x8D}, {0x89, 0x12}, {0x90, 0x0B}, /* 0xE4-0xE7 */ + {0x92, 0xEA}, {0x98, 0xFD}, {0x9B, 0x91}, {0x5E, 0x45}, /* 0xE8-0xEB */ + {0x66, 0xB4}, {0x66, 0xDD}, {0x70, 0x11}, {0x72, 0x06}, /* 0xEC-0xEF */ + {0xFA, 0x07}, {0x4F, 0xF5}, {0x52, 0x7D}, {0x5F, 0x6A}, /* 0xF0-0xF3 */ + {0x61, 0x53}, {0x67, 0x53}, {0x6A, 0x19}, {0x6F, 0x02}, /* 0xF4-0xF7 */ + {0x74, 0xE2}, {0x79, 0x68}, {0x88, 0x68}, {0x8C, 0x79}, /* 0xF8-0xFB */ + {0x98, 0xC7}, {0x98, 0xC4}, {0x9A, 0x43}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x54, 0xC1}, {0x7A, 0x1F}, {0x69, 0x53}, /* 0xA0-0xA3 */ + {0x8A, 0xF7}, {0x8C, 0x4A}, {0x98, 0xA8}, {0x99, 0xAE}, /* 0xA4-0xA7 */ + {0x5F, 0x7C}, {0x62, 0xAB}, {0x75, 0xB2}, {0x76, 0xAE}, /* 0xA8-0xAB */ + {0x88, 0xAB}, {0x90, 0x7F}, {0x96, 0x42}, {0x53, 0x39}, /* 0xAC-0xAF */ + {0x5F, 0x3C}, {0x5F, 0xC5}, {0x6C, 0xCC}, {0x73, 0xCC}, /* 0xB0-0xB3 */ + {0x75, 0x62}, {0x75, 0x8B}, {0x7B, 0x46}, {0x82, 0xFE}, /* 0xB4-0xB7 */ + {0x99, 0x9D}, {0x4E, 0x4F}, {0x90, 0x3C}, {0x4E, 0x0B}, /* 0xB8-0xBB */ + {0x4F, 0x55}, {0x53, 0xA6}, {0x59, 0x0F}, {0x5E, 0xC8}, /* 0xBC-0xBF */ + {0x66, 0x30}, {0x6C, 0xB3}, {0x74, 0x55}, {0x83, 0x77}, /* 0xC0-0xC3 */ + {0x87, 0x66}, {0x8C, 0xC0}, {0x90, 0x50}, {0x97, 0x1E}, /* 0xC4-0xC7 */ + {0x9C, 0x15}, {0x58, 0xD1}, {0x5B, 0x78}, {0x86, 0x50}, /* 0xC8-0xCB */ + {0x8B, 0x14}, {0x9D, 0xB4}, {0x5B, 0xD2}, {0x60, 0x68}, /* 0xCC-0xCF */ + {0x60, 0x8D}, {0x65, 0xF1}, {0x6C, 0x57}, {0x6F, 0x22}, /* 0xD0-0xD3 */ + {0x6F, 0xA3}, {0x70, 0x1A}, {0x7F, 0x55}, {0x7F, 0xF0}, /* 0xD4-0xD7 */ + {0x95, 0x91}, {0x95, 0x92}, {0x96, 0x50}, {0x97, 0xD3}, /* 0xD8-0xDB */ + {0x52, 0x72}, {0x8F, 0x44}, {0x51, 0xFD}, {0x54, 0x2B}, /* 0xDC-0xDF */ + {0x54, 0xB8}, {0x55, 0x63}, {0x55, 0x8A}, {0x6A, 0xBB}, /* 0xE0-0xE3 */ + {0x6D, 0xB5}, {0x7D, 0xD8}, {0x82, 0x66}, {0x92, 0x9C}, /* 0xE4-0xE7 */ + {0x96, 0x77}, {0x9E, 0x79}, {0x54, 0x08}, {0x54, 0xC8}, /* 0xE8-0xEB */ + {0x76, 0xD2}, {0x86, 0xE4}, {0x95, 0xA4}, {0x95, 0xD4}, /* 0xEC-0xEF */ + {0x96, 0x5C}, {0x4E, 0xA2}, {0x4F, 0x09}, {0x59, 0xEE}, /* 0xF0-0xF3 */ + {0x5A, 0xE6}, {0x5D, 0xF7}, {0x60, 0x52}, {0x62, 0x97}, /* 0xF4-0xF7 */ + {0x67, 0x6D}, {0x68, 0x41}, {0x6C, 0x86}, {0x6E, 0x2F}, /* 0xF8-0xFB */ + {0x7F, 0x38}, {0x80, 0x9B}, {0x82, 0x2A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xFA, 0x08}, {0xFA, 0x09}, {0x98, 0x05}, /* 0xA0-0xA3 */ + {0x4E, 0xA5}, {0x50, 0x55}, {0x54, 0xB3}, {0x57, 0x93}, /* 0xA4-0xA7 */ + {0x59, 0x5A}, {0x5B, 0x69}, {0x5B, 0xB3}, {0x61, 0xC8}, /* 0xA8-0xAB */ + {0x69, 0x77}, {0x6D, 0x77}, {0x70, 0x23}, {0x87, 0xF9}, /* 0xAC-0xAF */ + {0x89, 0xE3}, {0x8A, 0x72}, {0x8A, 0xE7}, {0x90, 0x82}, /* 0xB0-0xB3 */ + {0x99, 0xED}, {0x9A, 0xB8}, {0x52, 0xBE}, {0x68, 0x38}, /* 0xB4-0xB7 */ + {0x50, 0x16}, {0x5E, 0x78}, {0x67, 0x4F}, {0x83, 0x47}, /* 0xB8-0xBB */ + {0x88, 0x4C}, {0x4E, 0xAB}, {0x54, 0x11}, {0x56, 0xAE}, /* 0xBC-0xBF */ + {0x73, 0xE6}, {0x91, 0x15}, {0x97, 0xFF}, {0x99, 0x09}, /* 0xC0-0xC3 */ + {0x99, 0x57}, {0x99, 0x99}, {0x56, 0x53}, {0x58, 0x9F}, /* 0xC4-0xC7 */ + {0x86, 0x5B}, {0x8A, 0x31}, {0x61, 0xB2}, {0x6A, 0xF6}, /* 0xC8-0xCB */ + {0x73, 0x7B}, {0x8E, 0xD2}, {0x6B, 0x47}, {0x96, 0xAA}, /* 0xCC-0xCF */ + {0x9A, 0x57}, {0x59, 0x55}, {0x72, 0x00}, {0x8D, 0x6B}, /* 0xD0-0xD3 */ + {0x97, 0x69}, {0x4F, 0xD4}, {0x5C, 0xF4}, {0x5F, 0x26}, /* 0xD4-0xD7 */ + {0x61, 0xF8}, {0x66, 0x5B}, {0x6C, 0xEB}, {0x70, 0xAB}, /* 0xD8-0xDB */ + {0x73, 0x84}, {0x73, 0xB9}, {0x73, 0xFE}, {0x77, 0x29}, /* 0xDC-0xDF */ + {0x77, 0x4D}, {0x7D, 0x43}, {0x7D, 0x62}, {0x7E, 0x23}, /* 0xE0-0xE3 */ + {0x82, 0x37}, {0x88, 0x52}, {0xFA, 0x0A}, {0x8C, 0xE2}, /* 0xE4-0xE7 */ + {0x92, 0x49}, {0x98, 0x6F}, {0x5B, 0x51}, {0x7A, 0x74}, /* 0xE8-0xEB */ + {0x88, 0x40}, {0x98, 0x01}, {0x5A, 0xCC}, {0x4F, 0xE0}, /* 0xEC-0xEF */ + {0x53, 0x54}, {0x59, 0x3E}, {0x5C, 0xFD}, {0x63, 0x3E}, /* 0xF0-0xF3 */ + {0x6D, 0x79}, {0x72, 0xF9}, {0x81, 0x05}, {0x81, 0x07}, /* 0xF4-0xF7 */ + {0x83, 0xA2}, {0x92, 0xCF}, {0x98, 0x30}, {0x4E, 0xA8}, /* 0xF8-0xFB */ + {0x51, 0x44}, {0x52, 0x11}, {0x57, 0x8B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x5F, 0x62}, {0x6C, 0xC2}, {0x6E, 0xCE}, /* 0xA0-0xA3 */ + {0x70, 0x05}, {0x70, 0x50}, {0x70, 0xAF}, {0x71, 0x92}, /* 0xA4-0xA7 */ + {0x73, 0xE9}, {0x74, 0x69}, {0x83, 0x4A}, {0x87, 0xA2}, /* 0xA8-0xAB */ + {0x88, 0x61}, {0x90, 0x08}, {0x90, 0xA2}, {0x93, 0xA3}, /* 0xAC-0xAF */ + {0x99, 0xA8}, {0x51, 0x6E}, {0x5F, 0x57}, {0x60, 0xE0}, /* 0xB0-0xB3 */ + {0x61, 0x67}, {0x66, 0xB3}, {0x85, 0x59}, {0x8E, 0x4A}, /* 0xB4-0xB7 */ + {0x91, 0xAF}, {0x97, 0x8B}, {0x4E, 0x4E}, {0x4E, 0x92}, /* 0xB8-0xBB */ + {0x54, 0x7C}, {0x58, 0xD5}, {0x58, 0xFA}, {0x59, 0x7D}, /* 0xBC-0xBF */ + {0x5C, 0xB5}, {0x5F, 0x27}, {0x62, 0x36}, {0x62, 0x48}, /* 0xC0-0xC3 */ + {0x66, 0x0A}, {0x66, 0x67}, {0x6B, 0xEB}, {0x6D, 0x69}, /* 0xC4-0xC7 */ + {0x6D, 0xCF}, {0x6E, 0x56}, {0x6E, 0xF8}, {0x6F, 0x94}, /* 0xC8-0xCB */ + {0x6F, 0xE0}, {0x6F, 0xE9}, {0x70, 0x5D}, {0x72, 0xD0}, /* 0xCC-0xCF */ + {0x74, 0x25}, {0x74, 0x5A}, {0x74, 0xE0}, {0x76, 0x93}, /* 0xD0-0xD3 */ + {0x79, 0x5C}, {0x7C, 0xCA}, {0x7E, 0x1E}, {0x80, 0xE1}, /* 0xD4-0xD7 */ + {0x82, 0xA6}, {0x84, 0x6B}, {0x84, 0xBF}, {0x86, 0x4E}, /* 0xD8-0xDB */ + {0x86, 0x5F}, {0x87, 0x74}, {0x8B, 0x77}, {0x8C, 0x6A}, /* 0xDC-0xDF */ + {0x93, 0xAC}, {0x98, 0x00}, {0x98, 0x65}, {0x60, 0xD1}, /* 0xE0-0xE3 */ + {0x62, 0x16}, {0x91, 0x77}, {0x5A, 0x5A}, {0x66, 0x0F}, /* 0xE4-0xE7 */ + {0x6D, 0xF7}, {0x6E, 0x3E}, {0x74, 0x3F}, {0x9B, 0x42}, /* 0xE8-0xEB */ + {0x5F, 0xFD}, {0x60, 0xDA}, {0x7B, 0x0F}, {0x54, 0xC4}, /* 0xEC-0xEF */ + {0x5F, 0x18}, {0x6C, 0x5E}, {0x6C, 0xD3}, {0x6D, 0x2A}, /* 0xF0-0xF3 */ + {0x70, 0xD8}, {0x7D, 0x05}, {0x86, 0x79}, {0x8A, 0x0C}, /* 0xF4-0xF7 */ + {0x9D, 0x3B}, {0x53, 0x16}, {0x54, 0x8C}, {0x5B, 0x05}, /* 0xF8-0xFB */ + {0x6A, 0x3A}, {0x70, 0x6B}, {0x75, 0x75}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x79, 0x8D}, {0x79, 0xBE}, {0x82, 0xB1}, /* 0xA0-0xA3 */ + {0x83, 0xEF}, {0x8A, 0x71}, {0x8B, 0x41}, {0x8C, 0xA8}, /* 0xA4-0xA7 */ + {0x97, 0x74}, {0xFA, 0x0B}, {0x64, 0xF4}, {0x65, 0x2B}, /* 0xA8-0xAB */ + {0x78, 0xBA}, {0x78, 0xBB}, {0x7A, 0x6B}, {0x4E, 0x38}, /* 0xAC-0xAF */ + {0x55, 0x9A}, {0x59, 0x50}, {0x5B, 0xA6}, {0x5E, 0x7B}, /* 0xB0-0xB3 */ + {0x60, 0xA3}, {0x63, 0xDB}, {0x6B, 0x61}, {0x66, 0x65}, /* 0xB4-0xB7 */ + {0x68, 0x53}, {0x6E, 0x19}, {0x71, 0x65}, {0x74, 0xB0}, /* 0xB8-0xBB */ + {0x7D, 0x08}, {0x90, 0x84}, {0x9A, 0x69}, {0x9C, 0x25}, /* 0xBC-0xBF */ + {0x6D, 0x3B}, {0x6E, 0xD1}, {0x73, 0x3E}, {0x8C, 0x41}, /* 0xC0-0xC3 */ + {0x95, 0xCA}, {0x51, 0xF0}, {0x5E, 0x4C}, {0x5F, 0xA8}, /* 0xC4-0xC7 */ + {0x60, 0x4D}, {0x60, 0xF6}, {0x61, 0x30}, {0x61, 0x4C}, /* 0xC8-0xCB */ + {0x66, 0x43}, {0x66, 0x44}, {0x69, 0xA5}, {0x6C, 0xC1}, /* 0xCC-0xCF */ + {0x6E, 0x5F}, {0x6E, 0xC9}, {0x6F, 0x62}, {0x71, 0x4C}, /* 0xD0-0xD3 */ + {0x74, 0x9C}, {0x76, 0x87}, {0x7B, 0xC1}, {0x7C, 0x27}, /* 0xD4-0xD7 */ + {0x83, 0x52}, {0x87, 0x57}, {0x90, 0x51}, {0x96, 0x8D}, /* 0xD8-0xDB */ + {0x9E, 0xC3}, {0x53, 0x2F}, {0x56, 0xDE}, {0x5E, 0xFB}, /* 0xDC-0xDF */ + {0x5F, 0x8A}, {0x60, 0x62}, {0x60, 0x94}, {0x61, 0xF7}, /* 0xE0-0xE3 */ + {0x66, 0x66}, {0x67, 0x03}, {0x6A, 0x9C}, {0x6D, 0xEE}, /* 0xE4-0xE7 */ + {0x6F, 0xAE}, {0x70, 0x70}, {0x73, 0x6A}, {0x7E, 0x6A}, /* 0xE8-0xEB */ + {0x81, 0xBE}, {0x83, 0x34}, {0x86, 0xD4}, {0x8A, 0xA8}, /* 0xEC-0xEF */ + {0x8C, 0xC4}, {0x52, 0x83}, {0x73, 0x72}, {0x5B, 0x96}, /* 0xF0-0xF3 */ + {0x6A, 0x6B}, {0x94, 0x04}, {0x54, 0xEE}, {0x56, 0x86}, /* 0xF4-0xF7 */ + {0x5B, 0x5D}, {0x65, 0x48}, {0x65, 0x85}, {0x66, 0xC9}, /* 0xF8-0xFB */ + {0x68, 0x9F}, {0x6D, 0x8D}, {0x6D, 0xC6}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_FD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x40-0x43 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x44-0x47 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x48-0x4B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x4C-0x4F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x50-0x53 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x54-0x57 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x58-0x5B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x5C-0x5F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x60-0x63 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x64-0x67 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x68-0x6B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x6C-0x6F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x70-0x73 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x74-0x77 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x78-0x7B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x72, 0x3B}, {0x80, 0xB4}, {0x91, 0x75}, /* 0xA0-0xA3 */ + {0x9A, 0x4D}, {0x4F, 0xAF}, {0x50, 0x19}, {0x53, 0x9A}, /* 0xA4-0xA7 */ + {0x54, 0x0E}, {0x54, 0x3C}, {0x55, 0x89}, {0x55, 0xC5}, /* 0xA8-0xAB */ + {0x5E, 0x3F}, {0x5F, 0x8C}, {0x67, 0x3D}, {0x71, 0x66}, /* 0xAC-0xAF */ + {0x73, 0xDD}, {0x90, 0x05}, {0x52, 0xDB}, {0x52, 0xF3}, /* 0xB0-0xB3 */ + {0x58, 0x64}, {0x58, 0xCE}, {0x71, 0x04}, {0x71, 0x8F}, /* 0xB4-0xB7 */ + {0x71, 0xFB}, {0x85, 0xB0}, {0x8A, 0x13}, {0x66, 0x88}, /* 0xB8-0xBB */ + {0x85, 0xA8}, {0x55, 0xA7}, {0x66, 0x84}, {0x71, 0x4A}, /* 0xBC-0xBF */ + {0x84, 0x31}, {0x53, 0x49}, {0x55, 0x99}, {0x6B, 0xC1}, /* 0xC0-0xC3 */ + {0x5F, 0x59}, {0x5F, 0xBD}, {0x63, 0xEE}, {0x66, 0x89}, /* 0xC4-0xC7 */ + {0x71, 0x47}, {0x8A, 0xF1}, {0x8F, 0x1D}, {0x9E, 0xBE}, /* 0xC8-0xCB */ + {0x4F, 0x11}, {0x64, 0x3A}, {0x70, 0xCB}, {0x75, 0x66}, /* 0xCC-0xCF */ + {0x86, 0x67}, {0x60, 0x64}, {0x8B, 0x4E}, {0x9D, 0xF8}, /* 0xD0-0xD3 */ + {0x51, 0x47}, {0x51, 0xF6}, {0x53, 0x08}, {0x6D, 0x36}, /* 0xD4-0xD7 */ + {0x80, 0xF8}, {0x9E, 0xD1}, {0x66, 0x15}, {0x6B, 0x23}, /* 0xD8-0xDB */ + {0x70, 0x98}, {0x75, 0xD5}, {0x54, 0x03}, {0x5C, 0x79}, /* 0xDC-0xDF */ + {0x7D, 0x07}, {0x8A, 0x16}, {0x6B, 0x20}, {0x6B, 0x3D}, /* 0xE0-0xE3 */ + {0x6B, 0x46}, {0x54, 0x38}, {0x60, 0x70}, {0x6D, 0x3D}, /* 0xE4-0xE7 */ + {0x7F, 0xD5}, {0x82, 0x08}, {0x50, 0xD6}, {0x51, 0xDE}, /* 0xE8-0xEB */ + {0x55, 0x9C}, {0x56, 0x6B}, {0x56, 0xCD}, {0x59, 0xEC}, /* 0xEC-0xEF */ + {0x5B, 0x09}, {0x5E, 0x0C}, {0x61, 0x99}, {0x61, 0x98}, /* 0xF0-0xF3 */ + {0x62, 0x31}, {0x66, 0x5E}, {0x66, 0xE6}, {0x71, 0x99}, /* 0xF4-0xF7 */ + {0x71, 0xB9}, {0x71, 0xBA}, {0x72, 0xA7}, {0x79, 0xA7}, /* 0xF8-0xFB */ + {0x7A, 0x00}, {0x7F, 0xB2}, {0x8A, 0x70}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode *page_charset2uni[256] = { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, c2u_81, c2u_82, c2u_83, c2u_84, c2u_85, c2u_86, c2u_87, + c2u_88, c2u_89, c2u_8A, c2u_8B, c2u_8C, c2u_8D, c2u_8E, c2u_8F, + c2u_90, c2u_91, c2u_92, c2u_93, c2u_94, c2u_95, c2u_96, c2u_97, + c2u_98, c2u_99, c2u_9A, c2u_9B, c2u_9C, c2u_9D, c2u_9E, c2u_9F, + c2u_A0, c2u_A1, c2u_A2, c2u_A3, c2u_A4, c2u_A5, c2u_A6, c2u_A7, + c2u_A8, c2u_A9, c2u_AA, c2u_AB, c2u_AC, c2u_AD, c2u_AE, c2u_AF, + c2u_B0, c2u_B1, c2u_B2, c2u_B3, c2u_B4, c2u_B5, c2u_B6, c2u_B7, + c2u_B8, c2u_B9, c2u_BA, c2u_BB, c2u_BC, c2u_BD, c2u_BE, c2u_BF, + c2u_C0, c2u_C1, c2u_C2, c2u_C3, c2u_C4, c2u_C5, c2u_C6, c2u_C7, + c2u_C8, NULL, c2u_CA, c2u_CB, c2u_CC, c2u_CD, c2u_CE, c2u_CF, + c2u_D0, c2u_D1, c2u_D2, c2u_D3, c2u_D4, c2u_D5, c2u_D6, c2u_D7, + c2u_D8, c2u_D9, c2u_DA, c2u_DB, c2u_DC, c2u_DD, c2u_DE, c2u_DF, + c2u_E0, c2u_E1, c2u_E2, c2u_E3, c2u_E4, c2u_E5, c2u_E6, c2u_E7, + c2u_E8, c2u_E9, c2u_EA, c2u_EB, c2u_EC, c2u_ED, c2u_EE, c2u_EF, + c2u_F0, c2u_F1, c2u_F2, c2u_F3, c2u_F4, c2u_F5, c2u_F6, c2u_F7, + c2u_F8, c2u_F9, c2u_FA, c2u_FB, c2u_FC, c2u_FD, NULL, NULL, +}; + +static unsigned char u2c_01[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xA9, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA4, 0xA9, 0xA4, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xA9, 0xA5, 0xA8, 0xA6, 0xA9, 0xA6, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xA9, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA8, /* 0x3C-0x3F */ + 0xA9, 0xA8, 0xA8, 0xA9, 0xA9, 0xA9, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xA9, 0xB0, 0xA8, 0xAF, 0xA9, 0xAF, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xAB, 0xA9, 0xAB, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xAE, 0xA9, 0xAE, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_02[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xA7, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xA2, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xA2, 0xA8, 0xA2, 0xAB, 0xA2, 0xAA, 0xA2, 0xAD, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xA2, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_03[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xA5, 0xC1, 0xA5, 0xC2, 0xA5, 0xC3, /* 0x90-0x93 */ + 0xA5, 0xC4, 0xA5, 0xC5, 0xA5, 0xC6, 0xA5, 0xC7, /* 0x94-0x97 */ + 0xA5, 0xC8, 0xA5, 0xC9, 0xA5, 0xCA, 0xA5, 0xCB, /* 0x98-0x9B */ + 0xA5, 0xCC, 0xA5, 0xCD, 0xA5, 0xCE, 0xA5, 0xCF, /* 0x9C-0x9F */ + 0xA5, 0xD0, 0xA5, 0xD1, 0x3F, 0x3F, 0xA5, 0xD2, /* 0xA0-0xA3 */ + 0xA5, 0xD3, 0xA5, 0xD4, 0xA5, 0xD5, 0xA5, 0xD6, /* 0xA4-0xA7 */ + 0xA5, 0xD7, 0xA5, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xA5, 0xE1, 0xA5, 0xE2, 0xA5, 0xE3, /* 0xB0-0xB3 */ + 0xA5, 0xE4, 0xA5, 0xE5, 0xA5, 0xE6, 0xA5, 0xE7, /* 0xB4-0xB7 */ + 0xA5, 0xE8, 0xA5, 0xE9, 0xA5, 0xEA, 0xA5, 0xEB, /* 0xB8-0xBB */ + 0xA5, 0xEC, 0xA5, 0xED, 0xA5, 0xEE, 0xA5, 0xEF, /* 0xBC-0xBF */ + 0xA5, 0xF0, 0xA5, 0xF1, 0x3F, 0x3F, 0xA5, 0xF2, /* 0xC0-0xC3 */ + 0xA5, 0xF3, 0xA5, 0xF4, 0xA5, 0xF5, 0xA5, 0xF6, /* 0xC4-0xC7 */ + 0xA5, 0xF7, 0xA5, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_04[512] = { + 0x3F, 0x3F, 0xAC, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xAC, 0xA1, 0xAC, 0xA2, 0xAC, 0xA3, 0xAC, 0xA4, /* 0x10-0x13 */ + 0xAC, 0xA5, 0xAC, 0xA6, 0xAC, 0xA8, 0xAC, 0xA9, /* 0x14-0x17 */ + 0xAC, 0xAA, 0xAC, 0xAB, 0xAC, 0xAC, 0xAC, 0xAD, /* 0x18-0x1B */ + 0xAC, 0xAE, 0xAC, 0xAF, 0xAC, 0xB0, 0xAC, 0xB1, /* 0x1C-0x1F */ + 0xAC, 0xB2, 0xAC, 0xB3, 0xAC, 0xB4, 0xAC, 0xB5, /* 0x20-0x23 */ + 0xAC, 0xB6, 0xAC, 0xB7, 0xAC, 0xB8, 0xAC, 0xB9, /* 0x24-0x27 */ + 0xAC, 0xBA, 0xAC, 0xBB, 0xAC, 0xBC, 0xAC, 0xBD, /* 0x28-0x2B */ + 0xAC, 0xBE, 0xAC, 0xBF, 0xAC, 0xC0, 0xAC, 0xC1, /* 0x2C-0x2F */ + 0xAC, 0xD1, 0xAC, 0xD2, 0xAC, 0xD3, 0xAC, 0xD4, /* 0x30-0x33 */ + 0xAC, 0xD5, 0xAC, 0xD6, 0xAC, 0xD8, 0xAC, 0xD9, /* 0x34-0x37 */ + 0xAC, 0xDA, 0xAC, 0xDB, 0xAC, 0xDC, 0xAC, 0xDD, /* 0x38-0x3B */ + 0xAC, 0xDE, 0xAC, 0xDF, 0xAC, 0xE0, 0xAC, 0xE1, /* 0x3C-0x3F */ + 0xAC, 0xE2, 0xAC, 0xE3, 0xAC, 0xE4, 0xAC, 0xE5, /* 0x40-0x43 */ + 0xAC, 0xE6, 0xAC, 0xE7, 0xAC, 0xE8, 0xAC, 0xE9, /* 0x44-0x47 */ + 0xAC, 0xEA, 0xAC, 0xEB, 0xAC, 0xEC, 0xAC, 0xED, /* 0x48-0x4B */ + 0xAC, 0xEE, 0xAC, 0xEF, 0xAC, 0xF0, 0xAC, 0xF1, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xAC, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_20[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xA1, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xA1, 0xAE, 0xA1, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xA1, 0xB0, 0xA1, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xA2, 0xD3, 0xA2, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xA1, 0xA5, 0xA1, 0xA6, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xA2, 0xB6, 0x3F, 0x3F, 0xA1, 0xC7, 0xA1, 0xC8, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD8, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xA9, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0xFA, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xA9, 0xFB, 0xA9, 0xFC, 0xA9, 0xFD, /* 0x80-0x83 */ + 0xA9, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_21[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xC9, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xA2, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xA4, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xE0, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xA2, 0xE5, 0xA2, 0xE2, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xD9, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xCA, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xF7, /* 0x50-0x53 */ + 0xA8, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xFB, /* 0x58-0x5B */ + 0xA8, 0xFC, 0xA8, 0xFD, 0xA8, 0xFE, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA5, 0xB0, 0xA5, 0xB1, 0xA5, 0xB2, 0xA5, 0xB3, /* 0x60-0x63 */ + 0xA5, 0xB4, 0xA5, 0xB5, 0xA5, 0xB6, 0xA5, 0xB7, /* 0x64-0x67 */ + 0xA5, 0xB8, 0xA5, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xA5, 0xA1, 0xA5, 0xA2, 0xA5, 0xA3, 0xA5, 0xA4, /* 0x70-0x73 */ + 0xA5, 0xA5, 0xA5, 0xA6, 0xA5, 0xA7, 0xA5, 0xA8, /* 0x74-0x77 */ + 0xA5, 0xA9, 0xA5, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xA1, 0xE7, 0xA1, 0xE8, 0xA1, 0xE6, 0xA1, 0xE9, /* 0x90-0x93 */ + 0xA1, 0xEA, 0xA2, 0xD5, 0xA2, 0xD8, 0xA2, 0xD6, /* 0x94-0x97 */ + 0xA2, 0xD9, 0xA2, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xA1, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xA2, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_22[512] = { + 0xA2, 0xA3, 0x3F, 0x3F, 0xA1, 0xD3, 0xA2, 0xA4, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD4, /* 0x04-0x07 */ + 0xA1, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF5, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xB3, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xA2, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xEE, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xA1, 0xF0, 0xA1, 0xC4, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xA1, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xA1, 0xAB, 0x3F, 0x3F, 0xA1, 0xFC, /* 0x24-0x27 */ + 0xA1, 0xFD, 0xA1, 0xFB, 0xA1, 0xFA, 0xA1, 0xF2, /* 0x28-0x2B */ + 0xA1, 0xF3, 0x3F, 0x3F, 0xA2, 0xB1, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xA1, 0xC5, 0xA1, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xA1, 0xAD, 0xA1, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD6, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA1, 0xC1, 0xA1, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xA1, 0xC2, 0xA1, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xEC, 0xA1, 0xED, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF8, 0xA1, 0xF9, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF6, 0xA1, 0xF7, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xA2, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xA1, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_23[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD2, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_24[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA8, 0xE7, 0xA8, 0xE8, 0xA8, 0xE9, 0xA8, 0xEA, /* 0x60-0x63 */ + 0xA8, 0xEB, 0xA8, 0xEC, 0xA8, 0xED, 0xA8, 0xEE, /* 0x64-0x67 */ + 0xA8, 0xEF, 0xA8, 0xF0, 0xA8, 0xF1, 0xA8, 0xF2, /* 0x68-0x6B */ + 0xA8, 0xF3, 0xA8, 0xF4, 0xA8, 0xF5, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xA9, 0xE7, 0xA9, 0xE8, 0xA9, 0xE9, 0xA9, 0xEA, /* 0x74-0x77 */ + 0xA9, 0xEB, 0xA9, 0xEC, 0xA9, 0xED, 0xA9, 0xEE, /* 0x78-0x7B */ + 0xA9, 0xEF, 0xA9, 0xF0, 0xA9, 0xF1, 0xA9, 0xF2, /* 0x7C-0x7F */ + + 0xA9, 0xF3, 0xA9, 0xF4, 0xA9, 0xF5, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xA9, 0xCD, 0xA9, 0xCE, 0xA9, 0xCF, 0xA9, 0xD0, /* 0x9C-0x9F */ + 0xA9, 0xD1, 0xA9, 0xD2, 0xA9, 0xD3, 0xA9, 0xD4, /* 0xA0-0xA3 */ + 0xA9, 0xD5, 0xA9, 0xD6, 0xA9, 0xD7, 0xA9, 0xD8, /* 0xA4-0xA7 */ + 0xA9, 0xD9, 0xA9, 0xDA, 0xA9, 0xDB, 0xA9, 0xDC, /* 0xA8-0xAB */ + 0xA9, 0xDD, 0xA9, 0xDE, 0xA9, 0xDF, 0xA9, 0xE0, /* 0xAC-0xAF */ + 0xA9, 0xE1, 0xA9, 0xE2, 0xA9, 0xE3, 0xA9, 0xE4, /* 0xB0-0xB3 */ + 0xA9, 0xE5, 0xA9, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xA8, 0xCD, 0xA8, 0xCE, 0xA8, 0xCF, 0xA8, 0xD0, /* 0xD0-0xD3 */ + 0xA8, 0xD1, 0xA8, 0xD2, 0xA8, 0xD3, 0xA8, 0xD4, /* 0xD4-0xD7 */ + 0xA8, 0xD5, 0xA8, 0xD6, 0xA8, 0xD7, 0xA8, 0xD8, /* 0xD8-0xDB */ + 0xA8, 0xD9, 0xA8, 0xDA, 0xA8, 0xDB, 0xA8, 0xDC, /* 0xDC-0xDF */ + 0xA8, 0xDD, 0xA8, 0xDE, 0xA8, 0xDF, 0xA8, 0xE0, /* 0xE0-0xE3 */ + 0xA8, 0xE1, 0xA8, 0xE2, 0xA8, 0xE3, 0xA8, 0xE4, /* 0xE4-0xE7 */ + 0xA8, 0xE5, 0xA8, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_25[512] = { + 0xA6, 0xA1, 0xA6, 0xAC, 0xA6, 0xA2, 0xA6, 0xAD, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xA6, 0xA3, 0xA6, 0xC8, 0xA6, 0xC7, 0xA6, 0xAE, /* 0x0C-0x0F */ + 0xA6, 0xA4, 0xA6, 0xC2, 0xA6, 0xC1, 0xA6, 0xAF, /* 0x10-0x13 */ + 0xA6, 0xA6, 0xA6, 0xC6, 0xA6, 0xC5, 0xA6, 0xB1, /* 0x14-0x17 */ + 0xA6, 0xA5, 0xA6, 0xC4, 0xA6, 0xC3, 0xA6, 0xB0, /* 0x18-0x1B */ + 0xA6, 0xA7, 0xA6, 0xBC, 0xA6, 0xC9, 0xA6, 0xCA, /* 0x1C-0x1F */ + 0xA6, 0xB7, 0xA6, 0xCB, 0xA6, 0xCC, 0xA6, 0xB2, /* 0x20-0x23 */ + 0xA6, 0xA9, 0xA6, 0xBE, 0xA6, 0xCD, 0xA6, 0xCE, /* 0x24-0x27 */ + 0xA6, 0xB9, 0xA6, 0xCF, 0xA6, 0xD0, 0xA6, 0xB4, /* 0x28-0x2B */ + 0xA6, 0xA8, 0xA6, 0xD1, 0xA6, 0xD2, 0xA6, 0xB8, /* 0x2C-0x2F */ + 0xA6, 0xBD, 0xA6, 0xD3, 0xA6, 0xD4, 0xA6, 0xB3, /* 0x30-0x33 */ + 0xA6, 0xAA, 0xA6, 0xD5, 0xA6, 0xD6, 0xA6, 0xBA, /* 0x34-0x37 */ + 0xA6, 0xBF, 0xA6, 0xD7, 0xA6, 0xD8, 0xA6, 0xB5, /* 0x38-0x3B */ + 0xA6, 0xAB, 0xA6, 0xD9, 0xA6, 0xDA, 0xA6, 0xBB, /* 0x3C-0x3F */ + 0xA6, 0xDB, 0xA6, 0xDC, 0xA6, 0xC0, 0xA6, 0xDD, /* 0x40-0x43 */ + 0xA6, 0xDE, 0xA6, 0xDF, 0xA6, 0xE0, 0xA6, 0xE1, /* 0x44-0x47 */ + 0xA6, 0xE2, 0xA6, 0xE3, 0xA6, 0xE4, 0xA6, 0xB6, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xC6, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xA1, 0xE1, 0xA1, 0xE0, 0x3F, 0x3F, 0xA2, 0xC3, /* 0xA0-0xA3 */ + 0xA2, 0xC7, 0xA2, 0xC8, 0xA2, 0xCB, 0xA2, 0xCA, /* 0xA4-0xA7 */ + 0xA2, 0xC9, 0xA2, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xE3, 0xA1, 0xE2, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xBA, 0xA2, 0xB9, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xA1, 0xE5, 0xA1, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xA2, 0xB8, 0xA2, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xDF, 0xA1, 0xDE, /* 0xC4-0xC7 */ + 0xA2, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xDB, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xDD, 0xA1, 0xDC, /* 0xCC-0xCF */ + 0xA2, 0xC4, 0xA2, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_26[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA1, 0xDA, 0xA1, 0xD9, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xCF, 0xA2, 0xCE, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xA2, 0xD0, 0x3F, 0x3F, 0xA2, 0xD1, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xA1, 0xCF, 0x3F, 0x3F, 0xA1, 0xCE, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA2, 0xBC, 0xA2, 0xBD, 0x3F, 0x3F, 0xA2, 0xC0, /* 0x60-0x63 */ + 0xA2, 0xBB, 0xA2, 0xBE, 0x3F, 0x3F, 0xA2, 0xBF, /* 0x64-0x67 */ + 0xA2, 0xCD, 0xA2, 0xDB, 0xA2, 0xDC, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xA2, 0xDD, 0xA2, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_30[512] = { + 0xA1, 0xA1, 0xA1, 0xA2, 0xA1, 0xA3, 0xA1, 0xA8, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xA1, 0xB4, 0xA1, 0xB5, 0xA1, 0xB6, 0xA1, 0xB7, /* 0x08-0x0B */ + 0xA1, 0xB8, 0xA1, 0xB9, 0xA1, 0xBA, 0xA1, 0xBB, /* 0x0C-0x0F */ + 0xA1, 0xBC, 0xA1, 0xBD, 0x3F, 0x3F, 0xA1, 0xEB, /* 0x10-0x13 */ + 0xA1, 0xB2, 0xA1, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xAA, 0xA1, 0xAA, 0xA2, 0xAA, 0xA3, /* 0x40-0x43 */ + 0xAA, 0xA4, 0xAA, 0xA5, 0xAA, 0xA6, 0xAA, 0xA7, /* 0x44-0x47 */ + 0xAA, 0xA8, 0xAA, 0xA9, 0xAA, 0xAA, 0xAA, 0xAB, /* 0x48-0x4B */ + 0xAA, 0xAC, 0xAA, 0xAD, 0xAA, 0xAE, 0xAA, 0xAF, /* 0x4C-0x4F */ + 0xAA, 0xB0, 0xAA, 0xB1, 0xAA, 0xB2, 0xAA, 0xB3, /* 0x50-0x53 */ + 0xAA, 0xB4, 0xAA, 0xB5, 0xAA, 0xB6, 0xAA, 0xB7, /* 0x54-0x57 */ + 0xAA, 0xB8, 0xAA, 0xB9, 0xAA, 0xBA, 0xAA, 0xBB, /* 0x58-0x5B */ + 0xAA, 0xBC, 0xAA, 0xBD, 0xAA, 0xBE, 0xAA, 0xBF, /* 0x5C-0x5F */ + 0xAA, 0xC0, 0xAA, 0xC1, 0xAA, 0xC2, 0xAA, 0xC3, /* 0x60-0x63 */ + 0xAA, 0xC4, 0xAA, 0xC5, 0xAA, 0xC6, 0xAA, 0xC7, /* 0x64-0x67 */ + 0xAA, 0xC8, 0xAA, 0xC9, 0xAA, 0xCA, 0xAA, 0xCB, /* 0x68-0x6B */ + 0xAA, 0xCC, 0xAA, 0xCD, 0xAA, 0xCE, 0xAA, 0xCF, /* 0x6C-0x6F */ + 0xAA, 0xD0, 0xAA, 0xD1, 0xAA, 0xD2, 0xAA, 0xD3, /* 0x70-0x73 */ + 0xAA, 0xD4, 0xAA, 0xD5, 0xAA, 0xD6, 0xAA, 0xD7, /* 0x74-0x77 */ + 0xAA, 0xD8, 0xAA, 0xD9, 0xAA, 0xDA, 0xAA, 0xDB, /* 0x78-0x7B */ + 0xAA, 0xDC, 0xAA, 0xDD, 0xAA, 0xDE, 0xAA, 0xDF, /* 0x7C-0x7F */ + + 0xAA, 0xE0, 0xAA, 0xE1, 0xAA, 0xE2, 0xAA, 0xE3, /* 0x80-0x83 */ + 0xAA, 0xE4, 0xAA, 0xE5, 0xAA, 0xE6, 0xAA, 0xE7, /* 0x84-0x87 */ + 0xAA, 0xE8, 0xAA, 0xE9, 0xAA, 0xEA, 0xAA, 0xEB, /* 0x88-0x8B */ + 0xAA, 0xEC, 0xAA, 0xED, 0xAA, 0xEE, 0xAA, 0xEF, /* 0x8C-0x8F */ + 0xAA, 0xF0, 0xAA, 0xF1, 0xAA, 0xF2, 0xAA, 0xF3, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xAB, 0xA1, 0xAB, 0xA2, 0xAB, 0xA3, /* 0xA0-0xA3 */ + 0xAB, 0xA4, 0xAB, 0xA5, 0xAB, 0xA6, 0xAB, 0xA7, /* 0xA4-0xA7 */ + 0xAB, 0xA8, 0xAB, 0xA9, 0xAB, 0xAA, 0xAB, 0xAB, /* 0xA8-0xAB */ + 0xAB, 0xAC, 0xAB, 0xAD, 0xAB, 0xAE, 0xAB, 0xAF, /* 0xAC-0xAF */ + 0xAB, 0xB0, 0xAB, 0xB1, 0xAB, 0xB2, 0xAB, 0xB3, /* 0xB0-0xB3 */ + 0xAB, 0xB4, 0xAB, 0xB5, 0xAB, 0xB6, 0xAB, 0xB7, /* 0xB4-0xB7 */ + 0xAB, 0xB8, 0xAB, 0xB9, 0xAB, 0xBA, 0xAB, 0xBB, /* 0xB8-0xBB */ + 0xAB, 0xBC, 0xAB, 0xBD, 0xAB, 0xBE, 0xAB, 0xBF, /* 0xBC-0xBF */ + 0xAB, 0xC0, 0xAB, 0xC1, 0xAB, 0xC2, 0xAB, 0xC3, /* 0xC0-0xC3 */ + 0xAB, 0xC4, 0xAB, 0xC5, 0xAB, 0xC6, 0xAB, 0xC7, /* 0xC4-0xC7 */ + 0xAB, 0xC8, 0xAB, 0xC9, 0xAB, 0xCA, 0xAB, 0xCB, /* 0xC8-0xCB */ + 0xAB, 0xCC, 0xAB, 0xCD, 0xAB, 0xCE, 0xAB, 0xCF, /* 0xCC-0xCF */ + 0xAB, 0xD0, 0xAB, 0xD1, 0xAB, 0xD2, 0xAB, 0xD3, /* 0xD0-0xD3 */ + 0xAB, 0xD4, 0xAB, 0xD5, 0xAB, 0xD6, 0xAB, 0xD7, /* 0xD4-0xD7 */ + 0xAB, 0xD8, 0xAB, 0xD9, 0xAB, 0xDA, 0xAB, 0xDB, /* 0xD8-0xDB */ + 0xAB, 0xDC, 0xAB, 0xDD, 0xAB, 0xDE, 0xAB, 0xDF, /* 0xDC-0xDF */ + 0xAB, 0xE0, 0xAB, 0xE1, 0xAB, 0xE2, 0xAB, 0xE3, /* 0xE0-0xE3 */ + 0xAB, 0xE4, 0xAB, 0xE5, 0xAB, 0xE6, 0xAB, 0xE7, /* 0xE4-0xE7 */ + 0xAB, 0xE8, 0xAB, 0xE9, 0xAB, 0xEA, 0xAB, 0xEB, /* 0xE8-0xEB */ + 0xAB, 0xEC, 0xAB, 0xED, 0xAB, 0xEE, 0xAB, 0xEF, /* 0xEC-0xEF */ + 0xAB, 0xF0, 0xAB, 0xF1, 0xAB, 0xF2, 0xAB, 0xF3, /* 0xF0-0xF3 */ + 0xAB, 0xF4, 0xAB, 0xF5, 0xAB, 0xF6, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_31[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xA4, 0xA1, 0xA4, 0xA2, 0xA4, 0xA3, /* 0x30-0x33 */ + 0xA4, 0xA4, 0xA4, 0xA5, 0xA4, 0xA6, 0xA4, 0xA7, /* 0x34-0x37 */ + 0xA4, 0xA8, 0xA4, 0xA9, 0xA4, 0xAA, 0xA4, 0xAB, /* 0x38-0x3B */ + 0xA4, 0xAC, 0xA4, 0xAD, 0xA4, 0xAE, 0xA4, 0xAF, /* 0x3C-0x3F */ + 0xA4, 0xB0, 0xA4, 0xB1, 0xA4, 0xB2, 0xA4, 0xB3, /* 0x40-0x43 */ + 0xA4, 0xB4, 0xA4, 0xB5, 0xA4, 0xB6, 0xA4, 0xB7, /* 0x44-0x47 */ + 0xA4, 0xB8, 0xA4, 0xB9, 0xA4, 0xBA, 0xA4, 0xBB, /* 0x48-0x4B */ + 0xA4, 0xBC, 0xA4, 0xBD, 0xA4, 0xBE, 0xA4, 0xBF, /* 0x4C-0x4F */ + 0xA4, 0xC0, 0xA4, 0xC1, 0xA4, 0xC2, 0xA4, 0xC3, /* 0x50-0x53 */ + 0xA4, 0xC4, 0xA4, 0xC5, 0xA4, 0xC6, 0xA4, 0xC7, /* 0x54-0x57 */ + 0xA4, 0xC8, 0xA4, 0xC9, 0xA4, 0xCA, 0xA4, 0xCB, /* 0x58-0x5B */ + 0xA4, 0xCC, 0xA4, 0xCD, 0xA4, 0xCE, 0xA4, 0xCF, /* 0x5C-0x5F */ + 0xA4, 0xD0, 0xA4, 0xD1, 0xA4, 0xD2, 0xA4, 0xD3, /* 0x60-0x63 */ + 0xA4, 0xD4, 0xA4, 0xD5, 0xA4, 0xD6, 0xA4, 0xD7, /* 0x64-0x67 */ + 0xA4, 0xD8, 0xA4, 0xD9, 0xA4, 0xDA, 0xA4, 0xDB, /* 0x68-0x6B */ + 0xA4, 0xDC, 0xA4, 0xDD, 0xA4, 0xDE, 0xA4, 0xDF, /* 0x6C-0x6F */ + 0xA4, 0xE0, 0xA4, 0xE1, 0xA4, 0xE2, 0xA4, 0xE3, /* 0x70-0x73 */ + 0xA4, 0xE4, 0xA4, 0xE5, 0xA4, 0xE6, 0xA4, 0xE7, /* 0x74-0x77 */ + 0xA4, 0xE8, 0xA4, 0xE9, 0xA4, 0xEA, 0xA4, 0xEB, /* 0x78-0x7B */ + 0xA4, 0xEC, 0xA4, 0xED, 0xA4, 0xEE, 0xA4, 0xEF, /* 0x7C-0x7F */ + + 0xA4, 0xF0, 0xA4, 0xF1, 0xA4, 0xF2, 0xA4, 0xF3, /* 0x80-0x83 */ + 0xA4, 0xF4, 0xA4, 0xF5, 0xA4, 0xF6, 0xA4, 0xF7, /* 0x84-0x87 */ + 0xA4, 0xF8, 0xA4, 0xF9, 0xA4, 0xFA, 0xA4, 0xFB, /* 0x88-0x8B */ + 0xA4, 0xFC, 0xA4, 0xFD, 0xA4, 0xFE, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_32[512] = { + 0xA9, 0xB1, 0xA9, 0xB2, 0xA9, 0xB3, 0xA9, 0xB4, /* 0x00-0x03 */ + 0xA9, 0xB5, 0xA9, 0xB6, 0xA9, 0xB7, 0xA9, 0xB8, /* 0x04-0x07 */ + 0xA9, 0xB9, 0xA9, 0xBA, 0xA9, 0xBB, 0xA9, 0xBC, /* 0x08-0x0B */ + 0xA9, 0xBD, 0xA9, 0xBE, 0xA9, 0xBF, 0xA9, 0xC0, /* 0x0C-0x0F */ + 0xA9, 0xC1, 0xA9, 0xC2, 0xA9, 0xC3, 0xA9, 0xC4, /* 0x10-0x13 */ + 0xA9, 0xC5, 0xA9, 0xC6, 0xA9, 0xC7, 0xA9, 0xC8, /* 0x14-0x17 */ + 0xA9, 0xC9, 0xA9, 0xCA, 0xA9, 0xCB, 0xA9, 0xCC, /* 0x18-0x1B */ + 0xA2, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA8, 0xB1, 0xA8, 0xB2, 0xA8, 0xB3, 0xA8, 0xB4, /* 0x60-0x63 */ + 0xA8, 0xB5, 0xA8, 0xB6, 0xA8, 0xB7, 0xA8, 0xB8, /* 0x64-0x67 */ + 0xA8, 0xB9, 0xA8, 0xBA, 0xA8, 0xBB, 0xA8, 0xBC, /* 0x68-0x6B */ + 0xA8, 0xBD, 0xA8, 0xBE, 0xA8, 0xBF, 0xA8, 0xC0, /* 0x6C-0x6F */ + 0xA8, 0xC1, 0xA8, 0xC2, 0xA8, 0xC3, 0xA8, 0xC4, /* 0x70-0x73 */ + 0xA8, 0xC5, 0xA8, 0xC6, 0xA8, 0xC7, 0xA8, 0xC8, /* 0x74-0x77 */ + 0xA8, 0xC9, 0xA8, 0xCA, 0xA8, 0xCB, 0xA8, 0xCC, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xDE, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_33[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xA7, 0xC9, 0xA7, 0xCA, 0xA7, 0xCB, 0xA7, 0xCC, /* 0x80-0x83 */ + 0xA7, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xA7, 0xBA, 0xA7, 0xBB, 0xA7, 0xDC, 0xA7, 0xDD, /* 0x88-0x8B */ + 0xA7, 0xDE, 0xA7, 0xB6, 0xA7, 0xB7, 0xA7, 0xB8, /* 0x8C-0x8F */ + 0xA7, 0xD4, 0xA7, 0xD5, 0xA7, 0xD6, 0xA7, 0xD7, /* 0x90-0x93 */ + 0xA7, 0xD8, 0xA7, 0xA1, 0xA7, 0xA2, 0xA7, 0xA3, /* 0x94-0x97 */ + 0xA7, 0xA5, 0xA7, 0xAB, 0xA7, 0xAC, 0xA7, 0xAD, /* 0x98-0x9B */ + 0xA7, 0xAE, 0xA7, 0xAF, 0xA7, 0xB0, 0xA7, 0xB1, /* 0x9C-0x9F */ + 0xA7, 0xB2, 0xA7, 0xB3, 0xA7, 0xB4, 0xA7, 0xA7, /* 0xA0-0xA3 */ + 0xA7, 0xA8, 0xA7, 0xA9, 0xA7, 0xAA, 0xA7, 0xBD, /* 0xA4-0xA7 */ + 0xA7, 0xBE, 0xA7, 0xE5, 0xA7, 0xE6, 0xA7, 0xE7, /* 0xA8-0xAB */ + 0xA7, 0xE8, 0xA7, 0xE1, 0xA7, 0xE2, 0xA7, 0xE3, /* 0xAC-0xAF */ + 0xA7, 0xBF, 0xA7, 0xC0, 0xA7, 0xC1, 0xA7, 0xC2, /* 0xB0-0xB3 */ + 0xA7, 0xC3, 0xA7, 0xC4, 0xA7, 0xC5, 0xA7, 0xC6, /* 0xB4-0xB7 */ + 0xA7, 0xC7, 0xA7, 0xC8, 0xA7, 0xCE, 0xA7, 0xCF, /* 0xB8-0xBB */ + 0xA7, 0xD0, 0xA7, 0xD1, 0xA7, 0xD2, 0xA7, 0xD3, /* 0xBC-0xBF */ + 0xA7, 0xDA, 0xA7, 0xDB, 0xA2, 0xE3, 0xA7, 0xEC, /* 0xC0-0xC3 */ + 0xA7, 0xA6, 0xA7, 0xE0, 0xA7, 0xEF, 0xA2, 0xE1, /* 0xC4-0xC7 */ + 0xA7, 0xBC, 0xA7, 0xED, 0xA7, 0xB5, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xB9, /* 0xCC-0xCF */ + 0xA7, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xEB, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xDF, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xA2, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xE4, /* 0xD8-0xDB */ + 0xA7, 0xEE, 0xA7, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_4E[512] = { + 0xEC, 0xE9, 0xEF, 0xCB, 0x3F, 0x3F, 0xF6, 0xD2, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xB2, /* 0x04-0x07 */ + 0xED, 0xDB, 0xDF, 0xB2, 0xDF, 0xBE, 0xF9, 0xBB, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xDC, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xF5, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xF3, 0xA6, 0xDD, 0xE0, 0xE1, 0xA6, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xCE, 0xF8, 0xDC, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xAA, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xF1, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xFA, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xFC, 0xAF, 0xD3, 0xA1, 0x3F, 0x3F, 0xF1, 0xAB, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xD1, 0xD2, 0xAC, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xCE, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xFD, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xDE, 0xBF, 0xFB, 0xBA, 0xF9, 0xB9, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xD2, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xE3, 0xAB, 0xEB, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xCE, 0xFA, 0xCB, 0xF7, 0xE5, 0xA5, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xE1, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xD4, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xE1, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xE3, 0xDF, 0xAD, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xEB, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xAF, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xF5, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xE5, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xC0, /* 0x88-0x8B */ + 0xEC, 0xA3, 0x3F, 0x3F, 0xE9, 0xCD, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xEA, 0xA7, 0xE9, 0xF6, 0xFB, 0xBB, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xE7, 0xE9, 0xEF, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xD0, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xC1, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xAC, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xD8, 0xCC, 0xF9, 0xF1, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xCE, 0xDF, 0xFA, 0xA4, 0xE6, 0xB2, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xFA, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xBD, /* 0xA8-0xAB */ + 0xCC, 0xC8, 0xEF, 0xCD, 0xD5, 0xD5, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xA2, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xD1, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xE4, 0xA7, 0xEC, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xF6, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xFB, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xD1, 0xCB, 0xBF, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xED, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xED, 0xA8, 0xDE, 0xC2, 0xF6, 0xE2, 0xED, 0xDC, /* 0xD4-0xD7 */ + 0xDC, 0xF5, 0xE0, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xD4, 0xCE, 0x3F, 0x3F, 0xF4, 0xB5, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xDB, /* 0xE0-0xE3 */ + 0xD6, 0xB5, 0xEC, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xE4, 0xE6, 0x3F, 0x3F, 0xF1, 0xEA, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xEC, 0xCB, 0xC0, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xF2, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_4F[512] = { + 0x3F, 0x3F, 0xD0, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF9, 0xF2, 0xEC, 0xA5, 0xD0, 0xDF, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE7, 0xEA, 0xD0, 0xEB, 0xDC, 0xD1, /* 0x0C-0x0F */ + 0xDB, 0xE9, 0xFD, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xD7, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xDA, 0xE1, 0x3F, 0x3F, 0xD6, 0xB6, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xE3, 0xDF, 0x3F, 0x3F, 0xDE, 0xC3, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xDE, 0xC4, 0xCA, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xEC, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xA3, 0xEE, 0xB7, /* 0x44-0x47 */ + 0xF8, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xEA, 0xC8, 0xEE, 0xB8, 0xF1, 0xAC, /* 0x4C-0x4F */ + 0xF1, 0xA5, 0xE9, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xF9, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xE5, 0xF9, 0xEC, 0xEA, 0xDD, 0xD6, /* 0x58-0x5B */ + 0xED, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xF8, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xBA, /* 0x6C-0x6F */ + 0xDB, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xA2, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xCD, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xED, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xEB, 0xDE, 0xC5, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xE3, 0xE0, 0x3F, 0x3F, 0xCA, 0xC9, /* 0x80-0x83 */ + 0xF2, 0xE9, 0x3F, 0x3F, 0xD5, 0xCE, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xF6, 0xB6, 0x3F, 0x3F, 0xCE, 0xC2, 0xD6, 0xC7, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xE3, 0xB4, 0x3F, 0x3F, 0xF1, 0xAD, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xEA, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xC2, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xF3, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xEA, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xEB, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xB2, 0xFD, 0xA5, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xF6, 0xD5, 0xD5, 0xE2, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xB5, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xF5, 0xF5, 0xB5, /* 0xC0-0xC3 */ + 0xE4, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xE7, 0xEB, 0xF1, 0xD5, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xBB, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xE9, 0xB5, 0x3F, 0x3F, 0xCC, 0xC9, /* 0xD0-0xD3 */ + 0xFA, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xD4, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xD6, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xDC, 0xC1, 0x3F, 0x3F, 0xDE, 0xC6, /* 0xDC-0xDF */ + 0xFA, 0xEF, 0xE3, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xF3, 0xDC, 0xF6, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xCE, 0xFC, 0x3F, 0x3F, 0xDB, 0xC4, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xF8, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xDC, 0xE4, 0x3F, 0x3F, 0xE5, 0xEF, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_50[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xB1, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xD6, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF3, 0xDA, 0x3F, 0x3F, 0xCB, 0xC1, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xDB, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xD9, 0xFA, 0xD3, 0xEE, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xB8, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xFD, 0xA6, 0xEB, 0xEF, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xF4, 0xA6, 0x3F, 0x3F, 0xCC, 0xCA, 0xF3, 0xA8, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xF3, 0xDB, 0x3F, 0x3F, 0xDB, 0xA7, /* 0x20-0x23 */ + 0xF6, 0xB7, 0x3F, 0x3F, 0xCF, 0xE6, 0xF0, 0xF2, /* 0x24-0x27 */ + 0xCB, 0xDA, 0x3F, 0x3F, 0xE7, 0xD2, 0xD7, 0xC3, /* 0x28-0x2B */ + 0xF6, 0xF0, 0xE8, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA6, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xE7, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xA3, /* 0x44-0x47 */ + 0xCC, 0xA7, 0xEA, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xB6, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xFA, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xAE, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xEF, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xCB, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xF6, 0xB0, 0xEF, 0xCF, 0xE9, 0xCF, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xF7, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xCE, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xDC, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xDB, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xCB, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xDF, 0xA1, 0xDD, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xF5, 0xCA, 0xE9, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xEC, 0xEE, 0xEE, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xF3, 0xF0, 0x3F, 0x3F, 0xDF, 0xBF, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xCB, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xD0, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xF4, 0xD2, 0xE0, 0xBA, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xC0, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xCE, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xDC, 0xD2, 0xFD, 0xEA, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xF6, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xCA, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xE8, 0xE9, 0x3F, 0x3F, 0xE3, 0xAC, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xF3, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xCA, 0xA4, 0x3F, 0x3F, 0xDB, 0xF8, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xC7, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_51[512] = { + 0xEB, 0xF0, 0xF1, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xE5, 0xE2, 0x3F, 0x3F, 0xCC, 0xCC, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xCB, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xE3, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xC1, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xD6, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xD0, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xB9, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xE3, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xD3, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xE5, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xE8, 0xB4, 0xEB, 0xC3, 0x3F, 0x3F, 0xEA, 0xAA, /* 0x40-0x43 */ + 0xFA, 0xFC, 0xF5, 0xF6, 0xF0, 0xBC, 0xFD, 0xD4, /* 0x44-0x47 */ + 0xE0, 0xBB, 0xCE, 0xC3, 0x3F, 0x3F, 0xD0, 0xBA, /* 0x48-0x4B */ + 0xF7, 0xBA, 0xD8, 0xF3, 0xF7, 0xCD, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xAE, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xD4, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xE7, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xEC, 0xFD, 0x3F, 0x3F, 0xD2, 0xAE, /* 0x64-0x67 */ + 0xEE, 0xEF, 0xD5, 0xD7, 0xEA, 0xE4, 0xF8, 0xA2, /* 0x68-0x6B */ + 0xCD, 0xEB, 0xD7, 0xBF, 0xFB, 0xB1, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xCD, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xDC, 0xB2, 0xD0, 0xEC, 0xCE, 0xFD, /* 0x74-0x77 */ + 0xEE, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xCC, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xD0, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xF7, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xFC, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xEE, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xB3, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xD8, 0xF4, 0x3F, 0x3F, 0xE9, 0xB7, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xCE, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xD9, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xF1, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xD4, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA7, 0xD5, 0xD2, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xD6, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xF4, 0xA2, 0x3F, 0x3F, 0xF1, 0xD7, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xD5, 0xD8, 0x3F, 0x3F, 0xF0, 0xBD, /* 0xC8-0xCB */ + 0xD7, 0xD0, 0xD4, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xD7, 0xCF, 0xEB, 0xEA, 0xFD, 0xEB, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xDB, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xFC, 0xC5, 0xCB, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xD5, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xF4, 0xC8, 0xE8, 0xEA, 0xF5, 0xF3, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xF9, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_52[512] = { + 0xD3, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xD3, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xC2, 0xEF, 0xB7, /* 0x04-0x07 */ + 0xE7, 0xD4, 0x3F, 0x3F, 0xCA, 0xCA, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xFB, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xFA, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xAA, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xF4, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xF7, 0xF7, 0xDC, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xD7, 0xD7, 0xDF, 0xA2, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xBE, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xD3, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xA4, 0xE1, 0xEC, /* 0x34-0x37 */ + 0xCF, 0xE7, 0xF3, 0xCB, 0xED, 0xA9, 0xCA, 0xBE, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xEF, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xCE, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xFB, 0xD0, 0xBB, /* 0x48-0x4B */ + 0xD5, 0xB7, 0xEE, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xF4, 0xA8, 0x3F, 0x3F, 0xDC, 0xF8, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xA7, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xDA, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xE0, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xED, 0xA5, 0xEE, 0xF2, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xF9, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xDC, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xF3, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xF8, 0xF2, 0x3F, 0x3F, 0xF4, 0xF9, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xF1, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xBC, /* 0x84-0x87 */ + 0xDB, 0xF9, 0xD7, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xCB, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xF0, 0xA5, 0xCB, 0xFD, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xF4, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xED, /* 0x9C-0x9F */ + 0xCA, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xAB, /* 0xA0-0xA3 */ + 0xD0, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xF0, 0xBE, 0xD2, 0xBD, 0xCC, 0xA4, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xB6, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xCC, 0xCD, 0x3F, 0x3F, 0xDA, 0xFA, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xF6, 0xCF, 0x3F, 0x3F, 0xE9, 0xB8, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xD8, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xCC, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xCD, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xD4, 0xD1, 0xE9, 0xED, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xCA, 0xEB, 0xD9, 0xE2, 0x3F, 0x3F, 0xFD, 0xB2, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xE3, 0xAD, 0xD6, 0xCC, 0xD9, 0xB4, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA7, 0xEE, 0xD3, /* 0xE0-0xE3 */ + 0xD0, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xB3, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xD5, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xCF, 0xE8, 0x3F, 0x3F, 0xED, 0xC3, 0xD0, 0xB2, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xFE, 0xDA, 0xA8, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_53[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xF8, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xFD, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xF8, 0xD1, 0x3F, 0x3F, 0xF8, 0xD2, /* 0x0C-0x0F */ + 0xDC, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xDD, 0xE2, 0xFB, 0xF9, 0xDD, 0xC1, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xE3, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xED, 0xDD, 0xCE, 0xC4, 0x3F, 0x3F, 0xCB, 0xA1, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xE3, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xDD, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xF9, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xFB, /* 0x3C-0x3F */ + 0xCF, 0xA1, 0xE4, 0xA8, 0x3F, 0x3F, 0xF4, 0xB6, /* 0x40-0x43 */ + 0xEC, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xAE, /* 0x44-0x47 */ + 0xE7, 0xED, 0xFD, 0xC1, 0xDA, 0xE2, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xD8, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xDD, 0xE4, 0xF0, 0xEF, 0xF6, 0xF1, /* 0x50-0x53 */ + 0xFA, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xF5, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xCF, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xDC, 0xD4, 0x3F, 0x3F, 0xDC, 0xA6, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xEF, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xCF, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xE0, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xD6, /* 0x6C-0x6F */ + 0xEC, 0xD4, 0xEA, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xCA, 0xBF, 0xD5, 0xB0, 0x3F, 0x3F, 0xCF, 0xE9, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xF1, 0xED, 0x3F, 0x3F, 0xCC, 0xCF, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xE4, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xED, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xD7, 0xD8, 0x3F, 0x3F, 0xFD, 0xA7, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xAB, /* 0x9C-0x9F */ + 0xF6, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xCF, 0xF0, 0xF9, 0xBD, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xE6, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xDB, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xD1, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xE9, 0xD1, 0xF3, 0xA9, 0xD0, 0xE0, 0xE9, 0xD2, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xDA, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xE2, 0xD2, 0x3F, 0x3F, 0xF6, 0xA2, 0xE1, 0xF4, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xE4, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xE7, 0xD5, 0xF5, 0xBF, 0xCF, 0xA2, /* 0xE0-0xE3 */ + 0xCD, 0xAF, 0xCF, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xCD, 0xB0, 0xF1, 0xFE, 0xD0, 0xA3, /* 0xE8-0xEB */ + 0xE1, 0xAF, 0xF8, 0xA3, 0x3F, 0x3F, 0xCA, 0xA6, /* 0xEC-0xEF */ + 0xF7, 0xBB, 0xF2, 0xEA, 0xDE, 0xC8, 0xE9, 0xD3, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xDE, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_54[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xDE, /* 0x00-0x03 */ + 0xCA, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xF9, 0xEA, 0xD1, 0xCE, 0xEE, 0xD4, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xD4, 0xD2, 0xD9, 0xA3, 0xFD, 0xA8, 0xD7, 0xD9, /* 0x0C-0x0F */ + 0xF7, 0xCE, 0xFA, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xD6, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xD7, 0xF0, 0x3F, 0x3F, 0xEB, 0xE1, /* 0x1C-0x1F */ + 0xF8, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xFA, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xDD, 0xC3, 0x3F, 0x3F, 0xF9, 0xDF, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xEF, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xFD, 0xE5, 0xF6, 0xA3, 0x3F, 0x3F, 0xD9, 0xFC, /* 0x38-0x3B */ + 0xFD, 0xA9, 0x3F, 0x3F, 0xE7, 0xEE, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xE5, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xEF, 0xD0, 0x3F, 0x3F, 0xCD, 0xB1, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xF7, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF1, 0xB2, 0x3F, 0x3F, 0xF1, 0xB1, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xCD, 0xB2, 0x3F, 0x3F, 0xDA, 0xAB, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xCA, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xE2, /* 0x78-0x7B */ + 0xFB, 0xBC, 0xD9, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xEE, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xD3, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xFB, 0xFA, 0x3F, 0x3F, 0xCF, 0xA4, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xDC, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xF6, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xED, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xA1, /* 0xA8-0xAB */ + 0xCE, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xA6, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xF9, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xEC, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xE4, 0xEE, 0xF9, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xFB, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xF9, 0xEB, 0xEE, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xEA, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xCA, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xF4, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xCD, 0xD6, 0xFC, 0xF6, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xC9, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xD4, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_55[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xF8, 0xA6, 0x3F, 0x3F, 0xDE, 0xCA, 0xF2, 0xC6, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xDA, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xD3, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xD8, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xE6, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xF3, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xE4, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xE4, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xF6, 0xF2, 0x3F, 0x3F, 0xDF, 0xC2, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xFD, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xF6, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xBA, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xAF, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xE1, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xF0, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xCB, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xE0, 0xBC, 0x3F, 0x3F, 0xF4, 0xCA, 0xD4, 0xFA, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xFD, 0xAA, 0xF9, 0xE2, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xF4, 0xB7, 0xFD, 0xC2, 0xFC, 0xB0, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xFD, 0xEC, 0xCA, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xBD, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xEA, 0xE7, 0xDF, 0xC3, 0xD1, 0xD2, /* 0xA8-0xAB */ + 0xCE, 0xE2, 0x3F, 0x3F, 0xD3, 0xA4, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xFD, 0xAB, 0x3F, 0x3F, 0xDF, 0xE0, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xF2, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF0, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xD0, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xAA, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xCB, /* 0xE0-0xE3 */ + 0xF6, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xE1, 0xF5, 0xF1, 0xB3, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_56[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xA3, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xCA, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xCF, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xC4, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xB0, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xBF, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xF6, 0xA4, 0x3F, 0x3F, 0xE3, 0xB6, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xC6, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xD0, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xED, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xDD, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xF7, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xE6, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xDE, 0xAD, 0x3F, 0x3F, 0xFA, 0xBF, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xE5, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xED, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xA5, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xFD, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xF5, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xF6, 0xDE, 0xCC, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xDE, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xEC, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xCD, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xD6, 0xB7, 0xCD, 0xB3, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_57[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xD5, /* 0x00-0x03 */ + 0xE5, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xCF, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xD0, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xEA, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xAE, 0xEA, 0xAD, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xF1, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xD3, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xCF, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xEE, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xD0, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xF2, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xF0, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xF2, 0xA3, 0x3F, 0x3F, 0xF7, 0xF8, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xB3, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xA9, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xD3, 0xBB, 0xCA, 0xEC, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF1, 0xA6, 0xCB, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xF7, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xCD, 0xDE, 0x3F, 0x3F, 0xF7, 0xA4, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xC0, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xDD, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xCC, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xCF, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xF6, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xF7, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xD3, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xFE, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xA7, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xEB, 0xD9, 0x3F, 0x3F, 0xCF, 0xA7, 0xEA, 0xAF, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xEF, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xB9, /* 0xC4-0xC7 */ + 0xF1, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xD8, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xF2, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xB4, /* 0xDC-0xDF */ + 0xDC, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xF3, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xE3, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xFB, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xDB, 0xC6, 0xD0, 0xF1, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xD0, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_58[512] = { + 0xCF, 0xDC, 0x3F, 0x3F, 0xD3, 0xD1, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xCC, 0xB1, 0xF7, 0xD8, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xCB, 0xA8, 0xEB, 0xBC, 0xE4, 0xBE, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xDC, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xDC, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xF0, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xC0, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xED, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xEB, /* 0x2C-0x2F */ + 0xE5, 0xE8, 0xDC, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xED, 0xDE, 0xD3, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xF7, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xD4, 0xE7, 0xAB, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xC3, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xE1, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xF7, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xF3, /* 0x54-0x57 */ + 0xD3, 0xD2, 0x3F, 0x3F, 0xF5, 0xC0, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xDD, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xEE, 0xF3, 0xE7, 0xF1, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xFD, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xF2, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xF3, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xEE, 0xF4, 0x3F, 0x3F, 0xE2, 0xD3, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xD1, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xDF, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xE9, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xD7, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xF5, 0xCD, 0x3F, 0x3F, 0xF1, 0xF2, 0xFA, 0xC7, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xD9, 0xF8, 0xD4, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xE5, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xC5, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF2, 0xED, 0xDF, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xCB, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xDB, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xE8, 0xB5, 0x3F, 0x3F, 0xD3, 0xA6, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xB5, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xF9, 0xC9, 0x3F, 0x3F, 0xE4, 0xE2, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xFB, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xD7, 0xA4, 0xCE, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xD5, 0xD6, 0xE6, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xE5, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xCD, /* 0xE8-0xEB */ + 0xEC, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xE0, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xEC, 0xEC, 0xFB, 0xBE, 0xDF, 0xEB, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xE1, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_59[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xBE, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xD0, 0xF3, 0xE0, 0xAA, 0xE8, 0xE2, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xE2, 0xD4, 0xD2, 0xFD, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xE5, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xD3, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xDE, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xF4, 0xB8, 0xF7, 0xBC, 0xDC, 0xFD, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xE8, 0xEC, 0xE4, 0xE7, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xE3, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xA8, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xF1, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xE5, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xF4, /* 0x44-0x47 */ + 0xD2, 0xAF, 0xDC, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xA5, 0xF1, 0xB4, /* 0x4C-0x4F */ + 0xFC, 0xB1, 0xCC, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xDD, 0xC6, 0xFA, 0xD1, 0x3F, 0x3F, 0xF7, 0xDF, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xA8, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xEE, 0xF5, 0x3F, 0x3F, 0xDE, 0xCE, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF3, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xAC, 0xEB, 0xC4, /* 0x68-0x6B */ + 0xED, 0xE1, 0xE0, 0xAB, 0xDD, 0xC7, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xB3, /* 0x70-0x73 */ + 0xD2, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xCA, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xFB, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xFD, 0xDD, 0xE5, /* 0x80-0x83 */ + 0xD8, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xF4, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xF5, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xED, 0xD0, 0xD2, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xD9, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xF6, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xDB, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xF7, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xD8, 0xD9, 0x3F, 0x3F, 0xF4, 0xA3, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xDD, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xD1, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xB5, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xED, 0xAB, 0x3F, 0x3F, 0xE3, 0xB7, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xEE, 0xBB, 0xCD, 0xB4, 0x3F, 0x3F, 0xE0, 0xF3, /* 0xD0-0xD3 */ + 0xEA, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xEC, 0xF5, 0xE8, 0xEE, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xCB, 0xA9, 0xF1, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xCD, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xEC, 0xA9, 0x3F, 0x3F, 0xF2, 0xEB, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xFD, 0xEF, 0x3F, 0x3F, 0xF9, 0xF3, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xE6, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xD8, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xAC, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5A[512] = { + 0x3F, 0x3F, 0xEA, 0xCE, 0x3F, 0x3F, 0xE8, 0xDF, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xDE, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xD2, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF4, /* 0x18-0x1B */ + 0xD1, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xC2, /* 0x1C-0x1F */ + 0xE3, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xE4, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xD8, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xA5, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xF3, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xD7, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xE8, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xE8, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xE6, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xE6, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xFE, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xDA, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xAC, 0xEA, 0xB0, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xE3, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xCA, 0xAA, 0xE1, 0xF9, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xEA, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xF2, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xFA, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xEE, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xF4, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xD2, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5B[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xFB, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xFD, 0xF0, 0x3F, 0x3F, 0xE0, 0xBD, /* 0x08-0x0B */ + 0xCE, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xC6, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xAE, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xDF, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xBE, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xED, 0xAD, 0xFA, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xCD, 0xEE, 0xED, 0xA6, 0x3F, 0x3F, 0xED, 0xAE, /* 0x54-0x57 */ + 0xF0, 0xED, 0x3F, 0x3F, 0xDD, 0xA1, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xED, 0xAF, 0xFC, 0xF8, 0x3F, 0x3F, 0xD8, 0xEB, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xF9, /* 0x60-0x63 */ + 0xCD, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xFA, 0xA9, 0x3F, 0x3F, 0xE1, 0xDD, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xE2, 0xD5, 0xED, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xDD, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xF9, 0xCA, 0x3F, 0x3F, 0xEA, 0xE8, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xE5, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xD3, 0xEB, 0x3F, 0x3F, 0xE9, 0xD4, /* 0x84-0x87 */ + 0xE1, 0xFA, 0xE4, 0xCC, 0x3F, 0x3F, 0xE1, 0xE4, /* 0x88-0x8B */ + 0xE8, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xDB, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xD5, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xF7, 0xB5, 0xFC, 0xF3, 0xF0, 0xF3, /* 0x94-0x97 */ + 0xCE, 0xAF, 0xF1, 0xB5, 0xEF, 0xD2, 0xE8, 0xC8, /* 0x98-0x9B */ + 0xEB, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xD4, 0xE0, 0xBE, /* 0xA0-0xA3 */ + 0xE3, 0xF8, 0xEA, 0xE9, 0xFC, 0xB2, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE0, 0xF4, 0x3F, 0x3F, 0xCF, 0xE0, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xEE, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xAA, /* 0xB0-0xB3 */ + 0xE6, 0xC3, 0xE1, 0xB2, 0xCA, 0xAB, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xE3, 0xE4, 0xE9, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xD6, /* 0xBC-0xBF */ + 0xF3, 0xF2, 0x3F, 0x3F, 0xEE, 0xD6, 0xEA, 0xB2, /* 0xC0-0xC3 */ + 0xD0, 0xF6, 0xEC, 0xD9, 0xDA, 0xCB, 0xCF, 0xA8, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xDD, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xD8, 0xDB, 0x3F, 0x3F, 0xF9, 0xCE, 0xE9, 0xD5, /* 0xD0-0xD3 */ + 0xE3, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xBC, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xAC, 0xF3, 0xCC, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xCD, 0xFB, 0xF6, 0xD6, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xE7, 0xF5, 0xE8, 0xEF, 0xE3, 0xF9, 0xD2, 0xBB, /* 0xE4-0xE7 */ + 0xF3, 0xF3, 0xE3, 0xFB, 0x3F, 0x3F, 0xDE, 0xD0, /* 0xE8-0xEB */ + 0xCE, 0xB0, 0x3F, 0x3F, 0xD6, 0xF7, 0xF1, 0xD9, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xF5, 0xC1, 0xDC, 0xC4, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xF5, 0xBB, 0x3F, 0x3F, 0xDE, 0xD1, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5C[512] = { + 0x3F, 0x3F, 0xDC, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xDE, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xE2, /* 0x04-0x07 */ + 0xEE, 0xF6, 0xEA, 0xCF, 0xF0, 0xEE, 0xE3, 0xFC, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xD3, 0xDF, 0xD3, 0xF4, 0xE1, 0xB3, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xE1, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xD3, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xDF, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xE9, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xDB, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xF6, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xE3, 0xB9, 0xEB, 0xC5, 0xF4, 0xA9, 0xCD, 0xB6, /* 0x38-0x3B */ + 0xD2, 0xF9, 0x3F, 0x3F, 0xDA, 0xAD, 0xD2, 0xE3, /* 0x3C-0x3F */ + 0xCF, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xCB, 0xDC, 0xCC, 0xFA, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xCF, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xA9, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xE3, 0xBB, 0xE3, 0xBA, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xE0, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xEE, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xB3, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xD3, 0xF5, 0x3F, 0x3F, 0xD7, 0xA6, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xF6, 0xB5, 0xD7, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE1, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xEA, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xDF, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xFD, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xD0, 0xF7, 0xED, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xCB, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xE4, 0xDB, 0x3F, 0x3F, 0xE1, 0xFB, /* 0xA8-0xAB */ + 0xCB, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xD3, 0xE0, 0x3F, 0x3F, 0xE4, 0xBF, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xFB, 0xC0, 0x3F, 0x3F, 0xDA, 0xBE, /* 0xB4-0xB7 */ + 0xE4, 0xCD, 0x3F, 0x3F, 0xD6, 0xB9, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xC0, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xE1, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xF6, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xDF, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xE4, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xE7, /* 0xEC-0xEF */ + 0xDC, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xFA, 0xD6, 0x3F, 0x3F, 0xD3, 0xF6, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xDA, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xFA, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5D[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xFD, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xD5, 0xCF, 0xD0, 0xF8, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xCD, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xF5, 0xCB, 0x3F, 0x3F, 0xE4, 0xF0, 0xCB, 0xAB, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xD7, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xFE, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xDD, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xAE, /* 0x48-0x4B */ + 0xCA, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xD5, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xE3, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE8, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xAB, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xA9, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xF7, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xD4, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xCE, 0xE4, 0x3F, 0x3F, 0xE8, 0xF2, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xF5, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xE7, 0xAE, 0x3F, 0x3F, 0xD6, 0xBA, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xDF, 0xEC, 0xE4, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xE8, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xB5, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xDC, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xF4, 0xB9, 0xF1, 0xB6, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xE2, 0xDE, 0xE1, 0xB5, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xCD, 0xEF, 0xF1, 0xA7, 0xCE, 0xE5, /* 0xE4-0xE7 */ + 0xCB, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xE3, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xAC, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xD0, 0xF9, 0xEC, 0xAB, 0xDE, 0xD3, /* 0xF0-0xF3 */ + 0xF7, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xF5, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xE1, 0xDE, 0xCB, 0xEE, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xBC, 0xF8, 0xD6, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xEE, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xFD, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xF7, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xDE, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF2, 0xED, 0x3F, 0x3F, 0xDB, 0xD9, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xF0, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xE1, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xD4, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xE0, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xE3, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xE1, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xDF, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xD9, 0xB6, 0x3F, 0x3F, 0xFD, 0xAC, /* 0x3C-0x3F */ + 0xEF, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xE4, 0xC1, 0xF8, 0xEB, 0x3F, 0x3F, 0xDB, 0xAC, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xFC, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xD8, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xBA, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xDB, 0xDF, 0xD3, 0xD3, 0xF8, 0xC7, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xCE, 0xF8, 0xC1, /* 0x70-0x73 */ + 0xD2, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xB4, /* 0x74-0x77 */ + 0xFA, 0xB9, 0xCA, 0xCF, 0x3F, 0x3F, 0xFC, 0xB3, /* 0x78-0x7B */ + 0xEA, 0xEA, 0xEA, 0xEB, 0xD0, 0xFA, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xED, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xE7, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xC9, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xED, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xEE, 0xBC, 0x3F, 0x3F, 0xEF, 0xC1, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xD2, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xDD, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xDF, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xF8, 0xF1, 0xA8, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xB7, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xEF, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xE4, 0xDD, 0xDF, 0xEE, 0xCB, 0xAC, /* 0xB4-0xB7 */ + 0xE9, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xEC, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xCB, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xF9, 0xBF, 0xD6, 0xAF, 0xD5, 0xC6, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xCF, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xA9, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xF8, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xB7, 0xEE, 0xF8, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xD9, /* 0xDC-0xDF */ + 0xF3, 0xDF, 0x3F, 0x3F, 0xF8, 0xC8, 0xCE, 0xC6, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xD5, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xE6, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xC5, 0xEF, 0xD5, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xEF, 0xFC, 0xDF, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5F[512] = { + 0x3F, 0x3F, 0xDC, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD6, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xC9, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xD2, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xE3, 0xBD, 0x3F, 0x3F, 0xCF, 0xE1, /* 0x10-0x13 */ + 0xF0, 0xC0, 0xEC, 0xDA, 0x3F, 0x3F, 0xDD, 0xD7, /* 0x14-0x17 */ + 0xFB, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xAC, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xA9, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xD7, 0xFB, 0xC1, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xD2, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xE5, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xED, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xAD, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xF9, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xF7, 0xA5, 0x3F, 0x3F, 0xCB, 0xAE, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xDA, 0xAF, 0x3F, 0x3F, 0xD8, 0xB6, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xA7, 0xFB, 0xB2, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xFD, 0xC4, 0x3F, 0x3F, 0xEC, 0xAD, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xA1, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xE9, 0xE9, 0xEE, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xF3, 0xF4, 0xF8, 0xF3, 0xF0, 0xC1, /* 0x68-0x6B */ + 0xDE, 0xAF, 0xF8, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xF3, 0xE0, 0xE7, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xAD, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xE6, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xF9, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xD8, /* 0x7C-0x7F */ + + 0xE8, 0xD9, 0xEF, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xD3, 0xE2, 0x3F, 0x3F, 0xE2, 0xDF, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xE0, 0xD7, 0xC8, /* 0x88-0x8B */ + 0xFD, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xDF, 0xEF, 0xCC, 0xD3, 0xD3, 0xF9, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xF0, /* 0x94-0x97 */ + 0xDB, 0xC7, 0xDE, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xF4, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xD5, 0xD0, 0xE5, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xFC, 0xC7, 0xDC, 0xD6, 0xE2, 0xE0, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xB0, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xF3, 0xA3, 0x3F, 0x3F, 0xD3, 0xEC, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xF4, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xFD, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xFD, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xF9, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xD0, 0xFB, 0xEC, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xBC, 0xF2, 0xA4, /* 0xD4-0xD7 */ + 0xD8, 0xCE, 0xD8, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xF5, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xE1, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xD2, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xFB, 0xEC, 0x3F, 0x3F, 0xDD, 0xC8, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_60[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xE8, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xC1, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xD7, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xD6, 0xBB, 0xDE, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xF7, 0xBD, 0xEC, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xD0, 0xE1, 0x3F, 0x3F, 0xE0, 0xF5, /* 0x24-0x27 */ + 0xEA, 0xB3, 0x3F, 0x3F, 0xCE, 0xD6, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xA5, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xEC, 0xF6, 0xE2, 0xE1, 0xE3, 0xBE, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xFC, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xCD, 0xF0, 0x3F, 0x3F, 0xF9, 0xF6, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xDF, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xE5, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xCE, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xE1, 0xED, 0xB0, /* 0x60-0x63 */ + 0xFD, 0xD1, 0xF6, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF9, 0xCF, 0xEB, 0xDA, 0xCA, 0xC1, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xD2, 0xB8, 0xCD, 0xF1, 0x3F, 0x3F, 0xE3, 0xD3, /* 0x6C-0x6F */ + 0xFD, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xE6, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xE3, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xF0, 0xAA, 0xF9, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xFC, 0xE2, 0x3F, 0x3F, 0xF8, 0xA7, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xE5, 0xEE, 0xF9, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF6, /* 0x9C-0x9F */ + 0xEA, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xB4, /* 0xA0-0xA3 */ + 0xF5, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xDC, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xF0, 0xF5, 0x3F, 0x3F, 0xDD, 0xE8, 0xD3, 0xED, /* 0xB0-0xB3 */ + 0xF5, 0xFC, 0x3F, 0x3F, 0xDA, 0xBF, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xCC, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xD3, 0xFA, 0xF4, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xEF, 0xD7, 0x3F, 0x3F, 0xD4, 0xC3, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xFB, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xED, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xE0, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xEE, /* 0xDC-0xDF */ + 0xFB, 0xB3, 0xE4, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xF6, 0xE7, 0xD2, 0xDD, 0x3F, 0x3F, 0xDF, 0xCC, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xC9, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xE5, 0xA9, 0xE0, 0xF6, 0xF6, 0xB3, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_61[512] = { + 0x3F, 0x3F, 0xE1, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xF0, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xEA, 0xEF, 0xEA, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xDA, 0xC0, 0xF8, 0xB4, 0xEB, 0xF2, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xE4, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xD7, 0xE4, 0xF1, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xEF, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xD7, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xFC, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xF3, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xC4, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xE3, 0xE5, 0x3F, 0x3F, 0xCB, 0xC5, 0xEA, 0xB4, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xBD, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xD7, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xDB, /* 0x44-0x47 */ + 0xED, 0xB1, 0x3F, 0x3F, 0xCC, 0xC3, 0xF7, 0xBE, /* 0x48-0x4B */ + 0xFC, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xF4, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xD9, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xF3, 0xD3, 0xF3, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xF7, 0xE4, 0x3F, 0x3F, 0xF7, 0xD1, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xB7, 0xCE, 0xB1, /* 0x60-0x63 */ + 0xCA, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xB4, /* 0x64-0x67 */ + 0xCB, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xF6, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xE7, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xEA, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xD4, 0xCB, 0xAF, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xF4, 0xAA, 0xE9, 0xAF, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xF5, 0xC3, 0xE9, 0xD8, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xE9, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xF3, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xD5, 0xFB, 0xDE, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xF4, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xFD, 0xF3, 0xFD, 0xF2, 0xF7, 0xA6, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xDD, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xD3, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xCC, 0xA8, 0x3F, 0x3F, 0xDA, 0xC1, /* 0xA8-0xAB */ + 0xCC, 0xD5, 0x3F, 0x3F, 0xD9, 0xE4, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xCA, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xE3, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xBC, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xF0, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xC4, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xD0, /* 0xC4-0xC7 */ + 0xFA, 0xAB, 0xEB, 0xEB, 0xE7, 0xF8, 0xD9, 0xE5, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xD7, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xA4, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xFB, 0xFC, 0xE3, /* 0xF4-0xF7 */ + 0xFA, 0xD8, 0x3F, 0x3F, 0xF3, 0xD5, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xCF, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xF3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_62[512] = { + 0xD5, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xD4, /* 0x04-0x07 */ + 0xCD, 0xFC, 0x3F, 0x3F, 0xD9, 0xE6, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xE2, 0xF9, 0xE2, 0xA1, 0xEB, 0xD4, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xE0, 0xF7, 0xE4, 0xB2, 0xCC, 0xFC, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xE4, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xAB, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xBD, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xCA, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xB8, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xC0, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xEE, 0xFA, 0xFD, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xD3, 0xE3, 0x3F, 0x3F, 0xFB, 0xC2, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xE8, 0xDB, 0xAE, /* 0x3C-0x3F */ + 0xE1, 0xB6, 0xF8, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xBF, /* 0x44-0x47 */ + 0xFB, 0xC3, 0xDD, 0xEA, 0x3F, 0x3F, 0xE2, 0xA2, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xEE, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xE8, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xF6, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xCA, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xD0, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xA6, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xDD, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xE4, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xAF, /* 0x7C-0x7F */ + + 0xD0, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xF4, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xCC, 0xBC, 0xF7, 0xEA, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xE5, 0xE4, 0xDF, 0xF1, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xF7, 0xE1, 0x3F, 0x3F, 0xF9, 0xF7, /* 0x94-0x97 */ + 0xEF, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xD8, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xA9, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xF8, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xEE, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xD8, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xE4, 0xE3, 0xF5, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xD9, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xE7, /* 0xC4-0xC7 */ + 0xD2, 0xB9, 0xD5, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xDA, 0xE5, 0xDA, 0xD0, 0x3F, 0x3F, 0xD1, 0xD9, /* 0xCC-0xCF */ + 0xCE, 0xD8, 0x3F, 0x3F, 0xCB, 0xDE, 0xF4, 0xAC, /* 0xD0-0xD3 */ + 0xDA, 0xFB, 0x3F, 0x3F, 0xF6, 0xE9, 0xE8, 0xF3, /* 0xD4-0xD7 */ + 0xCF, 0xAC, 0xF0, 0xF0, 0x3F, 0x3F, 0xF4, 0xFD, /* 0xD8-0xDB */ + 0xDB, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xCE, 0xC0, 0xE3, 0xD4, 0xD1, 0xCF, 0xF1, 0xF5, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xCD, 0xF2, 0x3F, 0x3F, 0xCF, 0xEB, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xB8, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xA6, 0xD1, 0xDA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_63[512] = { + 0x3F, 0x3F, 0xF2, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xA6, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xE4, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xD3, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xA9, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xC9, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xD8, 0xE6, 0xC9, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xD8, 0xB8, 0xFA, 0xF3, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xF3, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xF8, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xF3, /* 0x4C-0x4F */ + 0xE6, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xF8, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xE9, /* 0x64-0x67 */ + 0xDE, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xDF, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xEC, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xDF, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xF4, 0xD2, 0xBA, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xF2, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xB7, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xE2, 0xA3, 0xD3, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xED, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xC9, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xFA, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xCF, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xD0, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xD5, 0xD3, 0xF3, 0xF5, 0xF7, 0xAE, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xEF, 0xC8, 0x3F, 0x3F, 0xCD, 0xF3, /* 0xA4-0xA7 */ + 0xF5, 0xCF, 0xE5, 0xF3, 0xF0, 0xC2, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xCA, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xEA, 0xF1, 0x3F, 0x3F, 0xD0, 0xA6, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xDA, /* 0xCC-0xCF */ + 0xF0, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xE7, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xC0, 0xFC, 0xB5, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xE4, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xCC, 0xA9, 0xFD, 0xC6, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xEA, 0xB5, 0x3F, 0x3F, 0xE5, 0xAA, 0xDF, 0xBA, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_64[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE1, 0xDF, 0x3F, 0x3F, 0xDA, 0xD1, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xE1, 0xB8, 0x3F, 0x3F, 0xE8, 0xF4, 0xD3, 0xFD, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xE2, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xCA, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xDA, 0xE6, 0xF7, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xCD, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xB6, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xEE, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xF5, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xD8, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xA7, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xD9, 0xB8, 0xD9, 0xB9, 0xEF, 0xC9, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xD6, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xF7, 0xCB, 0xDF, 0xAE, 0xE8, 0xF5, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xB5, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xD5, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xF4, 0xCC, 0xDA, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xE8, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xF7, 0xEB, 0xF5, 0xC9, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xF3, 0xBC, 0x3F, 0x3F, 0xDA, 0xD2, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xB5, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xE8, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xD6, 0xCF, 0xF4, 0xBA, 0x3F, 0x3F, 0xF7, 0xC9, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xAA, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xF0, 0xC3, 0xCC, 0xD6, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xD3, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xD3, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xDB, 0xFB, 0x3F, 0x3F, 0xCB, 0xE0, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xD3, 0xE4, 0xF6, 0xF7, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xD5, 0xBA, 0xF3, 0xCD, 0xCB, 0xE1, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xEB, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xAD, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xFC, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xEC, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xF6, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_65[512] = { + 0xDA, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xF7, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xE5, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xE0, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xFD, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xE6, 0xFC, 0xAB, /* 0x28-0x2B */ + 0xD5, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xA8, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xA5, 0xCD, 0xB9, /* 0x34-0x37 */ + 0xEA, 0xF2, 0xCB, 0xC7, 0x3F, 0x3F, 0xCD, 0xF4, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xAF, 0xEF, 0xD9, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xCD, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xFC, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xDF, 0xF3, 0xCE, 0xE7, 0xDA, 0xC2, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xCF, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF9, 0xF8, 0xA8, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xE2, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xF2, 0xDF, 0xA4, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xC4, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xCC, 0xD7, 0xE5, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xBB, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xEF, 0xDA, 0xEE, 0xD8, 0x3F, 0x3F, 0xDD, 0xA7, /* 0x74-0x77 */ + 0xE2, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xC0, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xB0, 0xF8, 0xCA, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xFC, 0xFA, 0x3F, 0x3F, 0xD9, 0xFE, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xDE, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xDD, 0xEC, 0xDA, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xE0, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xD6, 0xF9, 0x3F, 0x3F, 0xCD, 0xD7, /* 0x98-0x9B */ + 0xDE, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xF8, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xE4, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xD0, 0xC5, 0xF4, 0xAE, 0x3F, 0x3F, 0xDD, 0xA8, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xC5, /* 0xA8-0xAB */ + 0xF3, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xD9, /* 0xAC-0xAF */ + 0xE3, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xA8, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xDB, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xE5, 0xDA, 0xE3, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xDB, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xD5, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xC1, /* 0xC8-0xCB */ + 0xEF, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xE9, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xB2, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xFD, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xD9, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xFE, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xEC, 0xED, 0xD3, 0xA9, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xF2, 0xA9, 0xF0, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xE2, 0xE2, 0xE9, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xF9, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xE9, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xDA, 0xDA, 0xC3, /* 0xF8-0xFB */ + 0xDA, 0xC4, 0xD4, 0xC5, 0x3F, 0x3F, 0xE7, 0xFA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_66[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xE0, 0xE3, 0xB0, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xDB, 0xB2, 0xFB, 0xC4, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xF3, 0xE3, 0x3F, 0x3F, 0xD9, 0xA5, 0xFB, 0xE7, /* 0x0C-0x0F */ + 0xDD, 0xCB, 0xD0, 0xD4, 0x3F, 0x3F, 0xE6, 0xB6, /* 0x10-0x13 */ + 0xE0, 0xAE, 0xFD, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xB5, 0xE0, 0xF8, /* 0x1C-0x1F */ + 0xE7, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xF5, 0xF0, 0x3F, 0x3F, 0xD8, 0xDC, /* 0x24-0x27 */ + 0xED, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xE1, 0xB9, 0x3F, 0x3F, 0xE3, 0xC0, /* 0x2C-0x2F */ + 0xF9, 0xC0, 0xE9, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xD9, 0xDB, 0x3F, 0x3F, 0xF3, 0xE4, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xB6, 0xE4, 0xE9, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xF0, 0xC5, 0xE3, 0xC1, 0xFC, 0xCC, /* 0x40-0x43 */ + 0xFC, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xF2, 0xCB, 0x3F, 0x3F, 0xF2, 0xCC, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xCF, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xF1, 0xDB, 0x3F, 0x3F, 0xFA, 0xD9, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xF1, 0xB8, 0xFD, 0xF5, 0xE0, 0xF9, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xE7, 0xFB, 0xFC, 0xB7, 0xFC, 0xE4, 0xFB, 0xC5, /* 0x64-0x67 */ + 0xE3, 0xE7, 0xD8, 0xB9, 0x3F, 0x3F, 0xF6, 0xF8, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xC5, 0xCC, 0xD8, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xAF, /* 0x70-0x73 */ + 0xF4, 0xE7, 0x3F, 0x3F, 0xEF, 0xDC, 0xCF, 0xFC, /* 0x74-0x77 */ + 0xEF, 0xDD, 0x3F, 0x3F, 0xF2, 0xAA, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xFD, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xAC, /* 0x84-0x87 */ + 0xFD, 0xBB, 0xFD, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xB2, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xEA, 0xD1, 0xDF, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xEC, 0xE4, 0xDE, /* 0x94-0x97 */ + 0xE5, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xD9, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xCD, 0xBC, 0x3F, 0x3F, 0xF3, 0xE5, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD5, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xBA, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xE7, 0xFB, 0xB5, /* 0xB0-0xB3 */ + 0xF8, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xE0, 0xE7, 0x3F, 0x3F, 0xCC, 0xD9, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xC6, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xE7, 0xA5, 0x3F, 0x3F, 0xD5, 0xF5, 0xD3, 0xBE, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xFC, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xF2, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xDF, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xE8, 0xF8, 0xF8, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xCE, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xF6, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xE8, 0xD8, 0x3F, 0x3F, 0xCD, 0xD8, 0xE7, 0xD6, /* 0xF0-0xF3 */ + 0xCC, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xE3, /* 0xF4-0xF7 */ + 0xDF, 0xF6, 0xF0, 0xC7, 0xF0, 0xC6, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xD8, 0xBA, 0x3F, 0x3F, 0xF1, 0xF4, 0xF4, 0xF0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_67[512] = { + 0xF5, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xE5, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xEA, 0xC5, 0xEA, 0xF3, 0x3F, 0x3F, 0xDD, 0xDB, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xDC, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xDE, 0xFD, 0xF2, 0xF9, 0x3F, 0x3F, 0xD5, 0xC7, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xD0, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xF0, 0xC8, 0xD1, 0xA1, 0xD1, 0xA2, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xD4, 0xD6, 0xE8, /* 0x24-0x27 */ + 0xD9, 0xCA, 0x3F, 0x3F, 0xDA, 0xB1, 0xD8, 0xC7, /* 0x28-0x2B */ + 0xDC, 0xE2, 0xF3, 0xCE, 0xF5, 0xF4, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xF1, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xDA, 0xD3, 0x3F, 0x3F, 0xF6, 0xEA, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xF5, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xFD, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xD2, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xDF, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xDD, 0xFA, 0xBA, /* 0x4C-0x4F */ + 0xEE, 0xA7, 0xF5, 0xBD, 0x3F, 0x3F, 0xF8, 0xF5, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xE8, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xD4, 0xE1, 0x3F, 0x3F, 0xD1, 0xA3, 0xE1, 0xD6, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xF9, 0xF8, 0x3F, 0x3F, 0xDB, 0xCA, /* 0x6C-0x6F */ + 0xCB, 0xF9, 0xD4, 0xD4, 0x3F, 0x3F, 0xD9, 0xDC, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xEE, 0xBE, 0x3F, 0x3F, 0xF7, 0xED, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xEE, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xE6, 0xF7, 0xF9, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xED, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xE8, 0xDB, 0x3F, 0x3F, 0xDB, 0xB3, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xF7, /* 0x8C-0x8F */ + 0xE0, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xE2, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xF6, 0xD7, 0x3F, 0x3F, 0xD7, 0xF9, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xDD, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xCD, 0xFD, 0xF2, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xBD, /* 0xAC-0xAF */ + 0xF8, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xAC, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xAD, 0xCA, 0xAE, /* 0xB4-0xB7 */ + 0xCF, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xC2, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xDC, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xDA, /* 0xCC-0xCF */ + 0xD9, 0xBB, 0xCA, 0xF3, 0xF6, 0xD3, 0xE6, 0xF8, /* 0xD0-0xD3 */ + 0xEA, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xF6, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xF6, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xCF, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xCA, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xAF, /* 0xEC-0xEF */ + 0xD2, 0xB0, 0xF1, 0xBA, 0x3F, 0x3F, 0xD7, 0xB3, /* 0xF0-0xF3 */ + 0xE3, 0xC3, 0xF3, 0xFD, 0xDE, 0xDA, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xDB, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xDE, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_68[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xE3, 0xEE, 0xFB, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xF7, 0xD7, 0xCA, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xCE, 0xE8, 0xDB, 0xDB, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xBB, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF1, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xFA, 0xB7, 0xD0, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xCC, 0xAB, 0xEE, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xCB, 0xFA, 0xF9, 0xF9, 0xCC, 0xFD, 0xD3, 0xFE, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xE4, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xEE, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xD4, 0xD5, 0xDF, 0xCD, 0x3F, 0x3F, 0xFC, 0xB8, /* 0x50-0x53 */ + 0xD1, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xF2, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xD2, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xD4, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xD5, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xD8, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xD9, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xA9, /* 0x90-0x93 */ + 0xF6, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xDB, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xF0, 0xC9, 0x3F, 0x3F, 0xFC, 0xFC, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xE8, 0xC9, 0xF4, 0xFE, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xFC, /* 0xA4-0xA7 */ + 0xD7, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xDE, 0xDC, 0x3F, 0x3F, 0xF0, 0xAC, /* 0xAC-0xAF */ + 0xCC, 0xFE, 0xCD, 0xE1, 0x3F, 0x3F, 0xE1, 0xBA, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xDB, 0xEF, 0xDA, 0xB2, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xD1, 0xA5, 0xDC, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xD8, 0xF6, 0x3F, 0x3F, 0xD1, 0xA4, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xCD, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xEA, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xF0, 0xF7, 0x3F, 0x3F, 0xF0, 0xCA, /* 0xD4-0xD7 */ + 0xD0, 0xBE, 0x3F, 0x3F, 0xDD, 0xDC, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xD6, /* 0xDC-0xDF */ + 0xD3, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD0, /* 0xE4-0xE7 */ + 0xCD, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xB5, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xF8, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xD4, 0xA1, 0xCE, 0xB2, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_69[512] = { + 0xE8, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xEB, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE3, 0xD5, 0xF5, 0xD0, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xA1, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xA7, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xE5, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xE6, 0xCB, 0x3F, 0x3F, 0xF5, 0xF1, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xC5, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xA3, /* 0x50-0x53 */ + 0xE0, 0xDB, 0xF6, 0xEB, 0x3F, 0x3F, 0xCB, 0xF1, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xD9, 0xEA, 0xF5, 0xA2, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xD1, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xD1, 0xF8, 0xEA, 0xF8, 0xEA, 0xF9, 0xDA, 0xB3, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xEF, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xEF, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xE5, 0xF6, 0xEE, 0xBF, 0xE2, 0xE4, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xD0, 0xBF, 0x3F, 0x3F, 0xFA, 0xAC, /* 0x74-0x77 */ + 0xF5, 0xD1, 0xE7, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xE9, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xCE, /* 0x98-0x9B */ + 0xDB, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xFC, 0xCE, 0x3F, 0x3F, 0xDD, 0xEE, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xB4, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xD7, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xB4, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xCD, 0xBE, 0x3F, 0x3F, 0xDA, 0xE9, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xB0, /* 0xC8-0xCB */ + 0xF7, 0xD9, 0xF3, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xCE, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xCE, 0xAA, 0x3F, 0x3F, 0xCB, 0xC8, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xA7, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xF0, 0xCB, 0x3F, 0x3F, 0xD0, 0xC7, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6A[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xC5, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xE0, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xD5, 0xDA, 0x3F, 0x3F, 0xD7, 0xA7, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xC0, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF8, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xD2, 0xED, 0xE9, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xD9, 0xBC, 0x3F, 0x3F, 0xE5, 0xC6, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF5, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xDA, 0xD4, 0xE2, 0xA7, 0xFB, 0xFC, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xF1, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xCA, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xE8, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xE9, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF8, 0xE2, 0xE5, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xD0, 0xB9, 0xD4, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xA6, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xDF, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xF4, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xD3, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xCC, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xEF, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xE5, 0xE5, 0xD0, 0xD5, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xFC, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xFC, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xFE, 0xED, 0xEA, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xB1, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xE3, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xA2, 0xCF, 0xF6, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xD0, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xEA, 0xF1, 0xEE, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xCB, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA1, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6B[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD5, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xED, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xED, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xB2, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xBC, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xFD, 0xE2, 0xF3, 0xAD, 0x3F, 0x3F, 0xFD, 0xDB, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xB0, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xA7, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xFD, 0xE3, 0xCE, 0xB3, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xE4, 0xFA, 0xCE, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xCA, 0xB0, 0x3F, 0x3F, 0xF7, 0xA7, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xCF, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xA2, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xFC, 0xB6, 0xF2, 0xAD, 0xEF, 0xE1, /* 0x60-0x63 */ + 0xF3, 0xAE, 0xDC, 0xC6, 0xD9, 0xEB, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xE0, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA8, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xF6, /* 0x74-0x77 */ + 0xCF, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xDD, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xD1, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xEA, /* 0x80-0x83 */ + 0xF2, 0xCF, 0x3F, 0x3F, 0xF7, 0xBF, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xE2, 0xE6, 0xE2, 0xA8, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xD6, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xED, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF9, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xB1, 0xDE, 0xB2, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE8, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xD3, 0xAB, 0x3F, 0x3F, 0xEB, 0xDC, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xAF, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xCA, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xFC, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xFD, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xEB, 0xF6, 0xCF, 0xB2, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xEC, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xD9, 0xBD, 0x3F, 0x3F, 0xD8, 0xDF, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xB8, 0xEB, 0xBE, /* 0xD0-0xD3 */ + 0xDD, 0xEF, 0x3F, 0x3F, 0xDD, 0xF0, 0xDD, 0xF1, /* 0xD4-0xD7 */ + 0xDD, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xBE, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xC6, /* 0xE8-0xEB */ + 0xCF, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6C[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xEE, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xAB, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xDA, 0xC5, 0x3F, 0x3F, 0xD8, 0xEC, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xA8, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xE2, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xBC, /* 0x34-0x37 */ + 0xE7, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xF0, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xEF, 0xE2, 0xF1, 0xF0, 0xCF, 0xB4, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xF1, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xE0, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xDF, 0xA5, 0x3F, 0x3F, 0xF9, 0xD2, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xFD, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xE6, 0xA3, 0xFB, 0xF1, 0xCB, 0xB0, /* 0x5C-0x5F */ + 0xF2, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xCD, 0xE7, 0x3F, 0x3F, 0xE8, 0xDC, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xE7, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xF7, 0xC0, 0x3F, 0x3F, 0xD0, 0xE3, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xA1, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xBD, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xD1, 0xA9, 0xDD, 0xCC, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xE3, 0xFE, 0xD1, 0xAA, 0xE8, 0xAA, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xEA, 0xB6, 0xF9, 0xFA, 0xE6, 0xCC, /* 0x84-0x87 */ + 0xF6, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xD4, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xD9, 0xCB, 0x3F, 0x3F, 0xD9, 0xD2, 0xD3, 0xCB, /* 0x90-0x93 */ + 0xD8, 0xF7, 0xDA, 0xA9, 0xF5, 0xF8, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xDE, 0xDE, 0xF2, 0xAF, 0xF8, 0xA9, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xC8, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xC1, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xC1, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xDD, 0xF3, 0xEA, 0xFA, 0x3F, 0x3F, 0xF6, 0xBD, /* 0xB8-0xBB */ + 0xE1, 0xBB, 0xCD, 0xBF, 0xF4, 0xD4, 0xE6, 0xCD, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xFC, 0xCF, 0xFB, 0xA2, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xE0, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xF4, 0xBB, 0xDA, 0xD5, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xF9, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xF2, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xDB, 0xF6, 0x3F, 0x3F, 0xDE, 0xDF, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xF2, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xF8, 0xDC, 0xF7, 0xEE, 0xEB, 0xE8, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xD2, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xF1, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xDA, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xEA, 0xDA, 0xC6, /* 0xEC-0xEF */ + 0xF7, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xB6, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6D[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xC7, /* 0x08-0x0B */ + 0xD6, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xDC, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA9, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xE2, 0xAA, 0x3F, 0x3F, 0xD5, 0xA6, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xD7, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xF2, 0xD0, 0x3F, 0x3F, 0xEA, 0xFB, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xE0, 0xDD, 0xFB, 0xF3, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xBD, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xE2, 0xE7, 0xFD, 0xD7, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xCE, 0xC8, 0xEA, 0xB7, 0x3F, 0x3F, 0xFC, 0xC0, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xFD, 0xE7, 0xF7, 0xEF, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xD7, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xEF, 0xBA, 0xF1, 0xDD, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xDE, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xCB, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xDD, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xFB, 0xC7, 0xD5, 0xC8, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xD7, 0xDF, 0x3F, 0x3F, 0xDD, 0xA9, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xE9, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xAD, /* 0x74-0x77 */ + 0xF6, 0xD9, 0xFA, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xAA, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xE6, 0xEE, 0x3F, 0x3F, 0xCC, 0xDC, /* 0x84-0x87 */ + 0xE1, 0xBC, 0xE0, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xE9, 0xBF, 0xFC, 0xFD, 0xE6, 0xCE, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xE1, 0xD7, 0x3F, 0x3F, 0xE6, 0xCF, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xF4, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xF3, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xFB, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xF9, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xEF, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xEE, /* 0xC0-0xC3 */ + 0xF6, 0xBE, 0xE0, 0xB2, 0xFC, 0xFE, 0xD1, 0xAB, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xFA, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xC8, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xE2, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xD4, 0xA3, 0xF0, 0xF8, 0xD7, 0xA8, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xE7, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xD3, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xEF, 0xE4, 0x3F, 0x3F, 0xD7, 0xC5, 0xEB, 0xE2, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xE7, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xE4, 0xA2, 0x3F, 0x3F, 0xE2, 0xE8, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xE6, 0xD0, 0x3F, 0x3F, 0xFB, 0xE8, /* 0xF4-0xF7 */ + 0xF4, 0xE8, 0xE5, 0xF4, 0xF4, 0xBC, 0xF4, 0xD5, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xB6, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xFC, 0xB9, 0xEE, 0xC2, 0xCA, 0xF5, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xE5, /* 0x1C-0x1F */ + 0xCB, 0xE2, 0xD4, 0xA4, 0x3F, 0x3F, 0xDE, 0xE0, /* 0x20-0x23 */ + 0xDA, 0xFD, 0xE4, 0xC6, 0xE8, 0xBE, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xDE, /* 0x28-0x2B */ + 0xF6, 0xB4, 0xEA, 0xD2, 0x3F, 0x3F, 0xF9, 0xFB, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xC2, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xCA, 0xE4, 0x3F, 0x3F, 0xE7, 0xB7, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xEA, 0xFD, 0x3F, 0x3F, 0xD9, 0xDD, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xDA, 0xB4, 0xEE, 0xAA, 0xFB, 0xE9, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xCB, /* 0x40-0x43 */ + 0xDA, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xBE, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xD3, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xC9, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xDF, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xC0, /* 0x58-0x5B */ + 0xE3, 0xD7, 0x3F, 0x3F, 0xEF, 0xE6, 0xFC, 0xD0, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xC0, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xD3, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xDC, 0xF7, 0xB7, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xB8, 0xD1, 0xF9, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xC8, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xEA, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xDE, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xD7, 0xB6, 0xCF, 0xB5, 0x3F, 0x3F, 0xD9, 0xA8, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xEE, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xDD, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xA2, 0xE8, 0xAE, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xBD, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xF2, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xC1, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xFC, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xB5, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xF3, 0xE7, 0xD8, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xFC, 0xD1, 0x3F, 0x3F, 0xED, 0xB2, /* 0xC8-0xCB */ + 0xF4, 0xAF, 0x3F, 0x3F, 0xFB, 0xA3, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xFC, 0xC1, 0x3F, 0x3F, 0xEE, 0xAB, /* 0xD0-0xD3 */ + 0xD4, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xF2, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xEE, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xFB, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xE3, 0xD8, 0xBB, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6F[512] = { + 0x3F, 0x3F, 0xE5, 0xDB, 0xF8, 0xF7, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xD4, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xA9, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xCB, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xE6, 0xD1, 0xF0, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xD8, 0xAE, 0x3F, 0x3F, 0xF9, 0xD3, 0xD5, 0xFE, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xBC, /* 0x28-0x2B */ + 0xF2, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xE2, 0xAB, 0xF3, 0xE8, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xEF, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xEC, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xE7, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xDA, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xCC, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xFC, /* 0x54-0x57 */ + 0xDA, 0xEB, 0x3F, 0x3F, 0xE2, 0xD8, 0xED, 0xD6, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xD1, 0xE0, 0xB3, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xD2, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xEB, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xD3, 0xC1, 0xF0, 0xCD, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xCF, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD2, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xD4, 0xD8, 0xDC, 0xC9, 0xD7, 0xF1, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xDF, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xF3, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xF4, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xF1, 0xBF, 0xF8, 0xB1, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xE9, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xFB, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xD5, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xD4, /* 0xA0-0xA3 */ + 0xF7, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xC8, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xE8, 0xF3, 0xBD, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xEE, 0xFE, 0x3F, 0x3F, 0xE7, 0xFE, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xD3, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xB6, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xCC, 0xAD, 0xF6, 0xFA, 0xD6, 0xB2, 0xD2, 0xD8, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xD8, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xE3, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xB9, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xAD, /* 0xDC-0xDF */ + 0xFB, 0xCC, 0xEB, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xD4, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xFB, 0xCD, 0x3F, 0x3F, 0xD5, 0xBD, /* 0xE8-0xEB */ + 0xF1, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xFB, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xDE, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xEB, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_70[512] = { + 0x3F, 0x3F, 0xE5, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xFB, 0xA4, 0xD4, 0xB9, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xDE, 0xE1, 0x3F, 0x3F, 0xE4, 0xA3, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xB7, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xF8, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xDE, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xD6, 0xD2, 0x3F, 0x3F, 0xF9, 0xD5, 0xE7, 0xBA, /* 0x18-0x1B */ + 0xEB, 0xD5, 0xD5, 0xF7, 0xEF, 0xE7, 0xE1, 0xBE, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xAE, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xE9, /* 0x24-0x27 */ + 0xD6, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xBB, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xCB, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xB3, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xCE, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xFB, 0xA5, 0xE1, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xF7, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xFB, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xBD, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xFD, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xFC, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xCF, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xED, 0xC7, 0xEE, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xCC, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xA7, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xFA, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xA4, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xFD, 0xDC, 0xED, 0xB3, 0xCE, 0xC9, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xEF, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xE1, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xDB, /* 0xA8-0xAB */ + 0xCB, 0xE3, 0xF7, 0xA9, 0x3F, 0x3F, 0xFB, 0xA6, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xB9, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xC0, /* 0xB4-0xB7 */ + 0xED, 0xC8, 0xEF, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xD6, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xCE, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xA1, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xFB, 0xF4, 0xD5, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xF1, 0xF6, 0x3F, 0x3F, 0xE6, 0xD3, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xCC, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xF8, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xDC, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_71[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xFD, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xE5, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xF1, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xDB, 0xCC, 0xDD, 0xCD, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xC8, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xD9, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xA5, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xE6, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xD4, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xC8, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xD6, 0xA1, 0xFD, 0xBF, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xFC, 0xD3, 0x3F, 0x3F, 0xEF, 0xA1, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xE7, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xEE, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xE6, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xE9, 0xF2, 0x3F, 0x3F, 0xDF, 0xB0, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xD8, 0xE0, 0xFC, 0xBA, 0xFD, 0xAF, 0xF0, 0xCE, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xDB, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE5, 0xC9, 0x3F, 0x3F, 0xED, 0xB4, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xE0, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xE3, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xE9, 0xFB, 0xEA, 0xA8, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xB7, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xA7, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xE9, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xFD, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xD9, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xEC, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE8, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xE6, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xFD, 0xF8, 0xFD, 0xF9, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xBF, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xE7, 0xA7, 0x3F, 0x3F, 0xE6, 0xD7, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xD4, 0xF3, 0xD4, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xFA, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xD7, 0xF2, 0x3F, 0x3F, 0xE1, 0xC0, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xDB, 0xE2, 0xE6, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xBD, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xF0, 0xCF, 0xF3, 0xBE, 0xE2, 0xAC, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xF5, 0xB7, 0xE0, 0xF0, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xB8, /* 0xF8-0xFB */ + 0xE3, 0xE8, 0x3F, 0x3F, 0xD4, 0xA7, 0xE8, 0xFC, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_72[512] = { + 0xFA, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xEF, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xD6, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xB4, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xD0, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xF7, 0xF0, 0xEE, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xEA, 0xBA, 0x3F, 0x3F, 0xEA, 0xD3, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xED, 0xC9, 0xDD, 0xAB, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xAC, 0xFD, 0xA1, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xDF, 0xD0, 0xEC, 0xB3, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xDF, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xED, 0xF8, 0xB8, /* 0x44-0x47 */ + 0xF7, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xF8, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xE0, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xD4, 0xBA, 0xE4, 0xB3, 0x3F, 0x3F, 0xE9, 0xDA, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xDE, 0xB6, 0x3F, 0x3F, 0xD9, 0xBF, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xD9, 0xC0, 0xD6, 0xEF, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xCC, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xDA, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xE5, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xF7, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xCC, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xDF, 0xF9, 0xD7, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xBB, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xFA, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xCC, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xF3, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xDF, 0xD2, 0x3F, 0x3F, 0xCE, 0xCA, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xEE, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xE4, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xFB, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xB7, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xEE, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xCE, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xE2, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xD7, 0xE1, 0xFA, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xD5, 0xC9, 0xF8, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_73[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xD9, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xE9, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xED, /* 0x18-0x1B */ + 0xE3, 0xC4, 0xF0, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xE8, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xE0, 0xFA, 0xEE, 0xC4, 0xD9, 0xDE, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xA2, 0xEB, 0xA3, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xC2, 0xEA, 0xBB, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xE8, 0xAB, 0xDE, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xED, 0xEF, 0x3F, 0x3F, 0xE8, 0xA3, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xF1, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xD4, 0xBC, 0x3F, 0x3F, 0xFC, 0xEA, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xE7, 0xBE, 0x3F, 0x3F, 0xFC, 0xF2, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xD6, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xE2, 0xAE, 0x3F, 0x3F, 0xD3, 0xB7, 0xFA, 0xCC, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xFA, 0xDC, 0x3F, 0x3F, 0xED, 0xB5, 0xE1, 0xE3, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xE8, 0xAC, 0x3F, 0x3F, 0xE8, 0xDD, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xE9, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xF4, 0xBD, 0x3F, 0x3F, 0xCF, 0xB8, 0xE9, 0xDB, /* 0x94-0x97 */ + 0xD1, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xC7, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xC9, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xE8, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xDE, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xBC, 0xD3, 0xE5, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xFA, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xDA, 0xD6, 0x3F, 0x3F, 0xCA, 0xB1, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xDA, 0xC8, 0xDF, 0xA6, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xF9, 0xB3, 0xF2, 0xD2, 0x3F, 0x3F, 0xCA, 0xC4, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xCB, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xCD, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xFD, 0xB0, 0xD5, 0xA8, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xF1, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xE9, /* 0xE0-0xE3 */ + 0xDC, 0xCA, 0xEC, 0xB4, 0xFA, 0xC0, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xFB, 0xA8, 0xD0, 0xA8, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xDA, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xEE, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xE0, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xEF, 0xEA, 0xFA, 0xDE, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_74[512] = { + 0x3F, 0x3F, 0xE0, 0xC4, 0x3F, 0x3F, 0xCF, 0xB9, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xD5, 0xCA, 0xD7, 0xE2, 0xE2, 0xAF, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xD7, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xCD, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xDA, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xEF, 0xA2, 0xE2, 0xDA, 0xF6, 0xFC, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xFB, 0xD0, 0xD1, 0xAD, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xCD, 0xE4, 0x3F, 0x3F, 0xD1, 0xAE, 0xDC, 0xED, /* 0x28-0x2B */ + 0xE8, 0xCE, 0x3F, 0x3F, 0xF0, 0xF9, 0xCE, 0xB5, /* 0x2C-0x2F */ + 0xE6, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xFB, /* 0x30-0x33 */ + 0xD0, 0xD6, 0xDD, 0xF5, 0xF7, 0xF1, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xF6, 0xFD, 0x3F, 0x3F, 0xDB, 0xF7, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xEA, /* 0x3C-0x3F */ + 0xE9, 0xDC, 0xD9, 0xC1, 0x3F, 0x3F, 0xF5, 0xF2, /* 0x40-0x43 */ + 0xE0, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xD4, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xF9, 0xC2, 0x3F, 0x3F, 0xEA, 0xBC, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xD2, 0xC5, 0xFB, 0xD1, 0xE7, 0xC0, /* 0x58-0x5B */ + 0xEB, 0xA5, 0x3F, 0x3F, 0xDF, 0xFA, 0xE3, 0xA2, /* 0x5C-0x5F */ + 0xD7, 0xB9, 0x3F, 0x3F, 0xE9, 0xC3, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xE8, 0xFD, 0xE8, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF2, 0xD3, 0xFB, 0xA9, 0xD8, 0xA5, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xCB, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xC8, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xAF, 0xD7, 0xE3, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xC6, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xD6, 0xA2, 0x3F, 0x3F, 0xED, 0xF0, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xD7, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xFC, 0xD4, 0x3F, 0x3F, 0xDA, 0xD7, 0xCC, 0xDF, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xF2, 0xD4, 0x3F, 0x3F, 0xD1, 0xB0, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xCC, 0xE0, 0x3F, 0x3F, 0xDB, 0xFD, /* 0xA4-0xA7 */ + 0xF3, 0xBF, 0x3F, 0x3F, 0xF0, 0xD1, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xFC, 0xBB, 0x3F, 0x3F, 0xE2, 0xB0, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xE6, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xE2, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xDF, 0xDE, 0x3F, 0x3F, 0xE0, 0xC7, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xEF, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xE1, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xEA, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xE7, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xCE, 0xB6, 0x3F, 0x3F, 0xF3, 0xC0, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xCD, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xFB, 0xD2, 0x3F, 0x3F, 0xF8, 0xF8, 0xF7, 0xFB, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xBF, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xB7, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xB6, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_75[512] = { + 0x3F, 0x3F, 0xDC, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xCC, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xF1, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xE8, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xCA, 0xF6, 0x3F, 0x3F, 0xE4, 0xA4, 0xF4, 0xD6, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xE6, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xA7, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xDF, 0xE7, 0xE1, 0xC1, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xE9, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xCB, /* 0x28-0x2B */ + 0xE9, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xEF, 0xA3, 0xEB, 0xA6, 0xCB, 0xA3, 0xE3, 0xE9, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xFB, /* 0x34-0x37 */ + 0xEF, 0xA4, 0x3F, 0x3F, 0xEF, 0xEB, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xB4, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xCD, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xE6, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xEF, 0xA5, 0x3F, 0x3F, 0xD3, 0xCC, /* 0x50-0x53 */ + 0xDA, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xD7, 0xBA, 0x3F, 0x3F, 0xF2, 0xD5, /* 0x58-0x5B */ + 0xF5, 0xE5, 0xD9, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xB4, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xD5, 0xD4, 0xFD, 0xCF, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xE3, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xE1, /* 0x6C-0x6F */ + 0xEC, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xFB, 0xFE, 0xD3, 0xD7, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xD1, 0xB1, 0x3F, 0x3F, 0xCB, 0xB1, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xB2, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xB2, 0xF1, 0xC2, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xE1, 0xF9, 0xB5, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xC3, 0xE1, 0xC2, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xEB, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xDF, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xCB, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xB9, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xF8, 0xDE, 0xF9, 0xAA, 0xCA, 0xF7, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xED, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xD3, 0xB8, 0xF2, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xD4, 0xD9, 0xEE, 0xC5, 0xF2, 0xF0, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xB2, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xDC, 0xBB, 0x3F, 0x3F, 0xF1, 0xF8, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xEC, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xCA, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xF6, 0xC0, 0xFD, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xD4, 0xE3, 0xCC, 0xE2, 0x3F, 0x3F, 0xF7, 0xD4, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xE5, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xD3, 0xC3, 0x3F, 0x3F, 0xD8, 0xA6, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xF6, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xF6, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xCD, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_76[512] = { + 0xE5, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE5, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xE1, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xB0, /* 0x1C-0x1F */ + 0xF4, 0xB0, 0xF3, 0xEA, 0xDA, 0xEE, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xD7, 0xBB, 0x3F, 0x3F, 0xE2, 0xB1, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xAA, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xFB, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xE4, 0xDF, 0x3F, 0x3F, 0xCA, 0xD6, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xA8, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xFE, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xF6, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xEF, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xD4, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE0, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xE8, 0xB9, 0x3F, 0x3F, 0xEF, 0xA6, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xCD, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xF4, /* 0x78-0x7B */ + 0xDB, 0xA1, 0xDB, 0xDC, 0xDB, 0xDD, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xEE, 0xDC, 0x3F, 0x3F, 0xCB, 0xCB, 0xFC, 0xD5, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xEB, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xCD, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xD3, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xAB, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xD4, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xA9, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xDD, 0xDB, 0xCD, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xCE, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xE7, 0xC3, 0x3F, 0x3F, 0xEC, 0xCC, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xEC, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xCC, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xFC, /* 0xD8-0xDB */ + 0xD4, 0xA8, 0x3F, 0x3F, 0xED, 0xD3, 0xD8, 0xEF, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xF2, 0xD7, 0x3F, 0x3F, 0xCA, 0xF8, /* 0xE0-0xE3 */ + 0xDA, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xD4, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xCD, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xEE, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xF2, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xDF, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xDA, 0xF0, 0x3F, 0x3F, 0xE2, 0xEA, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_77[512] = { + 0x3F, 0x3F, 0xE0, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD8, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xF7, 0xAF, 0xDA, 0xB6, 0x3F, 0x3F, 0xCA, 0xD7, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xD8, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xD8, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xFA, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xEF, /* 0x34-0x37 */ + 0xD9, 0xC2, 0x3F, 0x3F, 0xF0, 0xD2, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xE4, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xF3, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xFA, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xEC, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xE2, 0xB2, 0x3F, 0x3F, 0xD4, 0xBD, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xCE, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xE2, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xD4, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xC2, 0xE7, 0xDA, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xD9, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xD9, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xBE, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xDC, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE2, 0xEB, 0xD6, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xCA, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xDA, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xD7, /* 0xB8-0xBB */ + 0xCC, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xBA, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xB8, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xC3, /* 0xD8-0xDB */ + 0xD0, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xC5, 0xEB, 0xF8, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xF2, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xCF, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xD3, 0xAD, 0xE8, 0xE1, 0xCE, 0xEC, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xB4, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_78[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xE3, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xF7, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xF2, 0xB2, 0xF3, 0xF6, 0xF6, 0xDB, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xD7, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xDF, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xF7, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xD0, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xDA, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xF5, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xBC, /* 0x68-0x6B */ + 0xCC, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xDB, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xDD, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xD1, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xED, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xD6, 0xDE, 0xE4, 0xF4, 0xE1, 0xEF, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xDD, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xCF, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xE5, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xA1, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xE0, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xAC, 0xFC, 0xAD, /* 0xB8-0xBB */ + 0xD8, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xED, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xDB, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xF0, 0xF3, 0xAF, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xA5, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xDA, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xD8, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xCC, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xB4, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xCA, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xF2, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_79[512] = { + 0x3F, 0x3F, 0xF5, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xA8, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xA6, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xEC, 0xD5, 0xF8, /* 0x28-0x2B */ + 0xDA, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xC6, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xE4, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xDE, 0xE5, 0xD1, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xB6, /* 0x44-0x47 */ + 0xD1, 0xB7, 0xF2, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xE9, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xD3, 0xF2, 0xB4, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xD4, 0xCB, 0xE4, /* 0x58-0x5B */ + 0xFB, 0xD4, 0xF5, 0xE6, 0xE3, 0xEA, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xDE, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xDF, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF8, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xF0, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xB8, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xDF, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xD0, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xFC, 0xA1, 0xEF, 0xEE, 0xDC, 0xD8, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xE9, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xDD, 0xFD, 0xFB, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xC9, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xC9, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xD4, 0xAA, 0x3F, 0x3F, 0xE5, 0xCC, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xE9, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xD0, 0xD8, 0xFC, 0xA2, 0xD4, 0xBE, /* 0xBC-0xBF */ + 0xE2, 0xB3, 0xDE, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xDC, 0xBC, 0xD2, 0xB6, 0xF5, 0xD5, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xCE, 0xA1, 0xF5, 0xA9, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xDD, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xDD, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xD5, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xF6, 0xDF, 0x3F, 0x3F, 0xF2, 0xDA, 0xE4, 0xEB, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xF2, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xB9, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7A[512] = { + 0xFD, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xE1, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xCA, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xEF, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xF5, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xEC, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xAD, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF2, 0xC2, 0xF6, 0xC3, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xD7, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xA2, /* 0x1C-0x1F */ + 0xF0, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xFA, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xF6, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF3, 0xF2, 0xC3, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xAB, /* 0x38-0x3B */ + 0xCA, 0xB3, 0xCD, 0xA6, 0x3F, 0x3F, 0xCD, 0xC3, /* 0x3C-0x3F */ + 0xCD, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xCF, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xF6, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xEE, 0xDD, 0xE7, 0xC4, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xB4, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xDF, 0xE2, 0xE7, 0xDB, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xE8, 0xB1, 0x3F, 0x3F, 0xFC, 0xAE, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xE5, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xFA, 0xEB, 0x3F, 0x3F, 0xCF, 0xBC, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xCF, 0xE2, 0xCD, 0xF6, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xEF, 0xF0, 0x3F, 0x3F, 0xF4, 0xBE, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xD4, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xF3, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xE9, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xF2, 0xF3, 0xEB, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xF0, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xCF, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xDF, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xE8, 0xC0, 0xE8, 0xC1, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xE3, 0xE9, 0xA2, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xAA, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xF3, 0xC1, 0xD0, 0xAB, 0x3F, 0x3F, 0xD4, 0xE4, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xBC, 0xD8, 0xA1, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xDF, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xF3, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xDC, 0xBD, 0x3F, 0x3F, 0xCC, 0xE5, /* 0xDC-0xDF */ + 0xED, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xE2, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xD4, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xB5, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xCA, 0xE6, 0x3F, 0x3F, 0xD3, 0xAE, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xE6, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xF1, 0xD3, 0xF5, 0xE7, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xDA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7B[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xEE, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xE1, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xDF, 0xE9, 0x3F, 0x3F, 0xEE, 0xDE, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xC2, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xD8, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xAC, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xF0, 0xAF, 0xD6, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xE1, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xB6, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xD4, 0xF5, 0x3F, 0x3F, 0xD0, 0xC9, /* 0x48-0x4B */ + 0xEF, 0xA7, 0xE2, 0xEC, 0x3F, 0x3F, 0xDB, 0xEA, /* 0x4C-0x4F */ + 0xCE, 0xCC, 0xF5, 0xE8, 0xF7, 0xD5, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xD3, 0xCD, 0x3F, 0x3F, 0xF3, 0xFE, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xD0, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE0, 0xFE, 0x3F, 0x3F, 0xDF, 0xFB, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xE6, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xE8, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xCD, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xA8, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xB4, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xDA, 0xD8, 0xD1, 0xB9, 0x3F, 0x3F, 0xDF, 0xA9, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xB0, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xCC, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xCE, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xEF, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xDF, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xED, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xEE, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xEF, 0xBD, 0xFC, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xDB, 0xF4, 0x3F, 0x3F, 0xEF, 0xAA, 0xF8, 0xB9, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xF5, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xD9, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xE1, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xD4, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xDE, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7C[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xEA, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xC2, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xAF, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xCA, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xD7, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD8, 0xE1, 0xC7, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xF4, 0xD8, 0xD6, 0xB3, 0xDD, 0xAD, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xBE, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xF1, 0xC3, 0xEE, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xD6, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xF4, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xD7, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xB7, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xFB, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xDD, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xA3, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xDA, 0xD9, 0x3F, 0x3F, 0xF0, 0xD8, /* 0x94-0x97 */ + 0xEF, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xD8, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xF1, 0xD4, 0x3F, 0x3F, 0xED, 0xF2, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xDB, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xD5, 0xDC, 0xF3, 0xC4, 0xCB, 0xD7, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xE2, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xF1, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xD5, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xD8, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xD0, 0xF0, 0xD9, /* 0xDC-0xDF */ + 0xCB, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xDD, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xA7, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xAC, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7D[512] = { + 0xD1, 0xBA, 0x3F, 0x3F, 0xF1, 0xC4, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xE5, 0xB3, 0xFB, 0xF5, 0xE9, 0xE1, 0xFD, 0xE0, /* 0x04-0x07 */ + 0xFC, 0xBC, 0x3F, 0x3F, 0xDA, 0xA2, 0xDA, 0xA3, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xD2, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xD2, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xE2, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xE9, /* 0x14-0x17 */ + 0xCE, 0xDC, 0xF2, 0xB5, 0xD0, 0xE4, 0xDD, 0xD1, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xE1, 0xC8, 0xDB, 0xB7, 0xDF, 0xE3, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xB9, /* 0x28-0x2B */ + 0xF1, 0xC5, 0x3F, 0x3F, 0xF3, 0xCF, 0xD7, 0xAB, /* 0x2C-0x2F */ + 0xE1, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xEB, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xEE, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xE1, 0xC9, 0xCA, 0xFA, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xFB, 0xFA, 0xE1, /* 0x40-0x43 */ + 0xF0, 0xDA, 0xCC, 0xE7, 0xDA, 0xF4, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xCC, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xED, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xD5, 0xA9, 0xFA, 0xE2, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xE5, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xEB, 0xD6, 0x3F, 0x3F, 0xEC, 0xDF, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xFC, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xF7, 0xD6, 0xDE, 0xEA, 0xCB, 0xB4, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xBE, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xCC, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xBD, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xF2, 0xE2, 0xB7, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xE8, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xF0, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xD6, 0xE0, 0x3F, 0x3F, 0xF1, 0xC6, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE2, 0xB8, 0xEB, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xCB, 0xB5, 0xD8, 0xD1, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xF4, 0xCE, 0xF3, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xD7, 0xC6, 0x3F, 0x3F, 0xD1, 0xBB, 0xF7, 0xAA, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xED, 0xCA, 0xD7, 0xD3, 0xD8, 0xFA, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xC5, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xCC, 0xDD, 0xFC, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xFD, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xF9, 0xE5, 0x3F, 0x3F, 0xE0, 0xCA, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xF2, 0xFD, 0xD3, 0xB0, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xF4, 0xF3, 0xDA, 0xC9, 0x3F, 0x3F, 0xE6, 0xDE, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xF8, 0xBA, 0xE8, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xD8, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xD5, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xD6, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xC6, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF2, 0xDB, 0xE4, 0xFC, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xE8, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xDA, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xF2, 0xDC, 0xFB, 0xD6, 0xE9, 0xB2, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xEE, 0xAD, 0x3F, 0x3F, 0xFA, 0xE3, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xEE, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xEA, 0xE6, 0xE0, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xF0, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xAC, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xF5, 0xC5, 0xEE, 0xE0, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xDB, 0xE5, 0x3F, 0x3F, 0xDD, 0xDE, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xF0, 0xE9, 0xA3, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xF9, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xF2, 0xC4, 0xE0, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xA4, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xE2, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xE3, 0xB1, 0xFC, 0xEB, 0xCD, 0xA8, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xCC, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xF0, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xE6, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xCD, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xC3, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xE1, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xAB, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xC5, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE9, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xF3, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xC0, /* 0x98-0x9B */ + 0xD5, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7F[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xAE, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xF9, 0xFC, 0x3F, 0x3F, 0xCC, 0xC0, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xE5, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xCE, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xD8, 0xD2, 0xF9, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xAA, 0xCE, 0xD1, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xC7, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xDB, 0xEB, 0x3F, 0x3F, 0xDF, 0xFE, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xD8, 0xE1, 0x3F, 0x3F, 0xF7, 0xF3, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xD7, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xD4, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xD1, 0xBC, 0x3F, 0x3F, 0xE5, 0xCF, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xCB, 0xB6, 0x3F, 0x3F, 0xDA, 0xB8, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xCD, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xBE, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xBA, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xCF, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xE0, 0xCC, 0xEB, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xFD, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xD7, 0xE8, 0xCB, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xE9, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xE8, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xE3, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xCD, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xEC, 0xCE, 0x3F, 0x3F, 0xD6, 0xBF, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xA7, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xDF, 0xD6, 0xFD, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xE1, /* 0xDC-0xDF */ + 0xF6, 0xA8, 0xDD, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xF8, 0xBB, 0x3F, 0x3F, 0xE8, 0xD1, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xF9, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xCE, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xEC, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_80[512] = { + 0xE9, 0xA5, 0xD6, 0xD5, 0x3F, 0x3F, 0xCD, 0xC5, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xED, 0xBA, 0xD1, 0xBD, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xCF, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xEC, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xD2, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xCC, 0xE9, 0x3F, 0x3F, 0xD9, 0xC4, /* 0x14-0x17 */ + 0xE9, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xD1, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xBC, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xAD, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xF7, 0xB0, 0x3F, 0x3F, 0xCC, 0xEA, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xC4, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xC0, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xFD, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA1, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xDE, 0xBD, 0x3F, 0x3F, 0xF6, 0xA9, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xA4, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xA4, /* 0x6C-0x6F */ + 0xF5, 0xC6, 0x3F, 0x3F, 0xE1, 0xA2, 0xE9, 0xC6, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xC5, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xF4, 0xE9, 0xD6, 0xEC, 0xEB, 0xD3, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xEC, 0xBD, 0xE2, 0xDC, 0xDE, 0xEB, 0xF0, 0xDC, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xEB, 0xBF, 0x3F, 0x3F, 0xD7, 0xCE, /* 0x88-0x8B */ + 0xD1, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xAB, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xFD, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xCA, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xCD, 0xC6, 0xF2, 0xB6, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xDD, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xCC, 0xB7, 0xDB, 0xB8, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xE9, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xCE, 0xDD, 0xEB, 0xC0, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xFD, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xCB, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xD6, /* 0xC0-0xC3 */ + 0xF1, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xDB, 0xCE, 0x3F, 0x3F, 0xF7, 0xC3, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xCF, 0xCB, 0xA4, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xE0, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xFB, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xEB, 0xCA, 0xE0, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xCE, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xD4, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xFD, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xD2, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_81[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xB7, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xFA, 0xF6, 0xF6, 0xAA, 0xFA, 0xF7, /* 0x04-0x07 */ + 0xD8, 0xE6, 0x3F, 0x3F, 0xF4, 0xB1, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xE8, 0xD2, 0x3F, 0x3F, 0xCA, 0xC5, 0xCC, 0xEB, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xEE, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xE2, 0xBB, 0x3F, 0x3F, 0xF7, 0xAD, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xE1, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xF3, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xA1, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xFD, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xEC, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xDD, 0xAF, 0xDD, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xCB, 0xB7, 0xE8, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xE1, 0xA3, 0xD2, 0xE0, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xFE, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xE9, 0xA6, 0xCB, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xED, 0xF3, 0xDC, 0xD9, 0xE0, 0xCD, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xDA, /* 0x7C-0x7F */ + + 0xDB, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xCC, 0xAE, 0x3F, 0x3F, 0xDA, 0xDB, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xC7, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xB1, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xD8, 0xAF, 0xE3, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xCE, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xF3, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xF8, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xCE, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xF5, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xEC, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xD3, 0xC5, 0xFC, 0xEC, 0xD2, 0xDB, /* 0xBC-0xBF */ + 0xD4, 0xEB, 0x3F, 0x3F, 0xDE, 0xA2, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xE6, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xF0, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xD5, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xF4, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xED, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xE8, 0xC2, 0x3F, 0x3F, 0xED, 0xF5, /* 0xE4-0xE7 */ + 0xD7, 0xFC, 0x3F, 0x3F, 0xED, 0xBB, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xF6, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xB8, /* 0xF0-0xF3 */ + 0xF6, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xE6, 0xF2, 0xDD, /* 0xF8-0xFB */ + 0xCF, 0xBF, 0x3F, 0x3F, 0xEB, 0xAC, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_82[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xCF, 0xC0, 0x3F, 0x3F, 0xE6, 0xA8, /* 0x04-0x07 */ + 0xFD, 0xE9, 0x3F, 0x3F, 0xCF, 0xC1, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xE0, 0xDF, 0xDE, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xA2, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xBF, /* 0x18-0x1B */ + 0xE2, 0xEF, 0x3F, 0x3F, 0xD9, 0xF1, 0xF1, 0xC7, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xCB, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xFE, 0xDB, 0xBA, /* 0x28-0x2B */ + 0xDA, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF6, 0xEC, 0xDA, 0xDC, 0xFA, 0xE4, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xE0, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xDD, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xE6, 0xA9, 0x3F, 0x3F, 0xEF, 0xF3, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xF3, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xEB, 0xFA, 0x3F, 0x3F, 0xF9, 0xE6, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xDD, 0xD5, 0xDE, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xCA, 0xDE, 0xDF, 0xE4, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xFD, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xF5, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xF5, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE3, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xED, 0xCB, 0xCF, 0xE4, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xD3, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xDD, 0xB3, 0xD4, 0xEC, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xF2, 0xB9, 0x3F, 0x3F, 0xDF, 0xB7, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xCB, 0xCE, 0xFB, 0xD8, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xD0, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xDD, 0xD2, 0xF7, 0xF4, 0xE7, 0xDC, 0xE4, 0xA5, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xFC, 0xA3, 0x3F, 0x3F, 0xDB, 0xBB, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xBA, /* 0xB4-0xB7 */ + 0xE9, 0xFD, 0xD0, 0xCA, 0x3F, 0x3F, 0xF5, 0xD6, /* 0xB8-0xBB */ + 0xD9, 0xC5, 0xE4, 0xB4, 0x3F, 0x3F, 0xED, 0xA7, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xEA, 0xBD, 0xE6, 0xFE, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xF7, 0xC4, 0xF5, 0xAD, 0x3F, 0x3F, 0xD9, 0xE0, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xB4, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xE2, 0xCF, 0xC2, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xEC, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xE5, 0xB4, 0xCD, 0xC8, 0xEE, 0xC8, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xE7, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xCD, 0xC9, 0xF9, 0xB7, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_83[512] = { + 0x3F, 0x3F, 0xF1, 0xE8, 0xD9, 0xF2, 0xDB, 0xF5, /* 0x00-0x03 */ + 0xCA, 0xB5, 0xD9, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xD8, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xAB, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xED, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xD4, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xDA, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xE2, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xFC, 0xED, 0xEC, 0xE0, 0xD2, 0xFE, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xE9, 0xC7, 0xE6, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xE2, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xBB, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xF5, 0xAE, 0xFB, 0xAA, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xFB, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xEC, 0xBF, 0xFC, 0xD8, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xE5, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xC3, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xE2, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xD7, 0xE9, 0xED, 0xF6, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xED, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xEC, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xE3, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xD4, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xF8, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xDD, 0xB4, 0xE4, 0xB5, 0xD8, 0xB0, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xD8, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xF4, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xCE, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xD6, 0xE1, 0xCF, 0xD2, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xD0, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xA2, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xEE, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xF3, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xDC, 0xCC, 0x3F, 0x3F, 0xD0, 0xCB, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xA4, /* 0xEC-0xEF */ + 0xCD, 0xCA, 0xD7, 0xD4, 0xDE, 0xA3, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xE4, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xEE, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xE2, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_84[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xFE, /* 0x00-0x03 */ + 0xD4, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xD1, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xD8, 0xF0, 0xF8, 0xC3, 0xEA, 0xD7, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xF5, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xD8, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xFD, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xEB, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xD5, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xE7, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xCA, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xE7, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xF8, 0xE3, 0x3F, 0x3F, 0xD4, 0xDD, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xD8, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xD9, /* 0x68-0x6B */ + 0xED, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xB5, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xD0, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xF1, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xE2, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xE3, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xD9, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xDF, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xDB, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xE4, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xF1, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xB6, /* 0xB8-0xBB */ + 0xF3, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xDA, /* 0xBC-0xBF */ + 0xE1, 0xE0, 0x3F, 0x3F, 0xD9, 0xAC, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xF5, 0xEB, 0x3F, 0x3F, 0xE0, 0xB6, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xE9, 0xC8, 0x3F, 0x3F, 0xCB, 0xCF, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xE3, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xDE, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xBE, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xDC, 0xEF, 0x3F, 0x3F, 0xD6, 0xA5, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xE2, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xD6, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_85[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xD9, 0xA1, 0x3F, 0x3F, 0xD8, 0xC0, /* 0x10-0x13 */ + 0xDC, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xBD, /* 0x14-0x17 */ + 0xDF, 0xB8, 0x3F, 0x3F, 0xEA, 0xA5, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xAD, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xF3, 0xF9, 0x3F, 0x3F, 0xED, 0xF8, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xF5, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xE1, 0xCA, 0xEB, 0xE3, 0x3F, 0x3F, 0xF2, 0xDE, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xF8, 0xCC, 0x3F, 0x3F, 0xEA, 0xD9, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xD3, 0xC6, 0x3F, 0x3F, 0xDB, 0xE6, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xF5, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xF0, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xFE, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xFB, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xF2, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xCF, 0xF2, 0xF7, 0xB9, 0xD9, 0xF3, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xE1, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xDA, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xB9, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xFB, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xCB, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xED, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE0, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xC0, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xFD, 0xBC, 0xDF, 0xB1, 0xE3, 0xEF, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xA3, /* 0xAC-0xAF */ + 0xFD, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xB1, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xCD, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xED, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xD5, 0xC0, 0xE3, 0xF0, 0xED, 0xFA, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xE9, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xD5, 0xED, 0xE7, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xD4, 0xF6, 0xE5, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xDB, 0xE7, 0xE2, 0xBF, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xCB, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xF4, 0xF0, 0xDD, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xAB, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_86[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xDE, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xD6, 0xE1, 0xCC, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xB3, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xEE, 0xDC, 0xA2, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xD0, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xD5, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xA1, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xDB, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF9, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xCB, 0xF3, 0xF4, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xC8, /* 0x58-0x5B */ + 0xD6, 0xD7, 0x3F, 0x3F, 0xE9, 0xE5, 0xFB, 0xDC, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xD0, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xFB, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xA5, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xDB, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xE2, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xF7, /* 0xA0-0xA3 */ + 0xF0, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xF6, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xEF, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xB1, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xFC, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xE8, 0xC3, 0x3F, 0x3F, 0xF1, 0xC8, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xF1, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xF9, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xF2, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xB6, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_87[512] = { + 0xF5, 0xB9, 0x3F, 0x3F, 0xDC, 0xF0, 0xE3, 0xF1, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xE8, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xF2, 0xBB, 0x3F, 0x3F, 0xDE, 0xA4, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xDA, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xE9, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xE3, 0xDA, 0x3F, 0x3F, 0xFC, 0xD9, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xDA, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xC4, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xE3, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xFB, 0xDD, 0x3F, 0x3F, 0xEF, 0xCA, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xE8, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xCC, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xEB, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xAD, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xAB, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xD9, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xA2, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xF6, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xDA, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xE0, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xA8, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xF9, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xFA, 0xAF, 0x3F, 0x3F, 0xEB, 0xFC, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xEA, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_88[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xE3, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xC5, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xE3, 0xD5, 0xEE, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xCD, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xD9, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xC1, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xFA, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xEB, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xFA, 0xBC, 0xE6, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xE5, 0xE2, 0xFA, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xB6, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xE4, 0xB7, 0x3F, 0x3F, 0xEA, 0xDB, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xF5, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xFB, 0xAC, 0xCF, 0xC3, 0xEB, 0xFD, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF8, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xB9, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xE1, 0xF1, 0x3F, 0x3F, 0xD2, 0xA4, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xFB, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xDA, 0xD0, 0xDB, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xEA, 0xBE, 0xD9, 0xB1, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xCA, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xE7, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xF8, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xB2, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xC0, 0xF2, 0xDF, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xE5, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xAC, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xCD, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xEE, 0xAE, 0xD6, 0xAE, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xEA, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xE7, 0xE0, 0xEB, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xCF, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xDC, 0xCD, 0xED, 0xFB, 0x3F, 0x3F, 0xDE, 0xF0, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xD7, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xDE, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xD7, /* 0xF0-0xF3 */ + 0xDB, 0xD0, 0xDB, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xD5, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xF0, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_89[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xDC, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xCA, 0xE8, 0x3F, 0x3F, 0xF8, 0xE6, 0xDC, 0xCE, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xEA, 0xDC, 0xDB, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xE9, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xDB, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xA8, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xD7, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE1, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xCB, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xE5, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xDC, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xD5, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xCA, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xA9, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xA4, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xE9, 0xA9, 0x3F, 0x3F, 0xD3, 0xC7, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xDD, 0xF8, 0xAE, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xB8, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xAE, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xF2, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xCA, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xCC, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xD4, 0xAD, 0xF6, 0xD1, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xCC, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xC6, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xD5, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xCE, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xC7, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xB0, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xDF, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xF5, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8A[512] = { + 0xE5, 0xEB, 0x3F, 0x3F, 0xEF, 0xF4, 0xDD, 0xB5, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xCD, 0xAA, 0x3F, 0x3F, 0xE3, 0xF2, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xFB, 0xF7, 0x3F, 0x3F, 0xF7, 0xD0, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xBA, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xE1, 0xF6, 0xFE, /* 0x14-0x17 */ + 0xD1, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xC5, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xE4, 0xB8, 0x3F, 0x3F, 0xE1, 0xE8, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xC1, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xD2, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xBE, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xE0, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xFA, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xE1, 0xCD, 0x3F, 0x3F, 0xCA, 0xB8, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xE0, 0xF1, 0xC9, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xDE, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xF0, 0xDF, 0xF8, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xCC, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xF2, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xE7, 0xC9, 0x3F, 0x3F, 0xE2, 0xF3, 0xE7, 0xE1, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xCB, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xE3, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xCF, 0xF8, 0xEF, 0xAC, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xFD, 0xFE, 0xFC, 0xA5, 0xFA, 0xB1, 0xDF, 0xD9, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xE0, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xF4, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xF1, 0xCA, 0x3F, 0x3F, 0xCE, 0xA3, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xF2, 0xBC, 0xEC, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xA5, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xF7, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xEB, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xDE, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xE1, 0xA4, 0xCD, 0xAB, 0x3F, 0x3F, 0xD9, 0xF4, /* 0xA0-0xA3 */ + 0xE8, 0xA6, 0xCD, 0xCE, 0xE1, 0xE9, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xFC, 0xEF, 0x3F, 0x3F, 0xE0, 0xE3, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xE2, 0xC1, 0x3F, 0x3F, 0xCE, 0xA4, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xDE, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xEB, 0xFE, 0x3F, 0x3F, 0xEB, 0xDD, 0xF0, 0xE0, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xDB, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xE2, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xC8, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xEB, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xEE, 0xB5, 0x3F, 0x3F, 0xF5, 0xD8, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xDF, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xE5, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xB0, /* 0xD8-0xDB */ + 0xF4, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xE3, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xF4, 0xFA, 0xB2, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xF5, 0xCA, 0xDF, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xEB, 0xB1, 0xED, 0xBF, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xFD, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xA6, 0xF9, 0xA4, /* 0xF4-0xF7 */ + 0xF0, 0xB3, 0x3F, 0x3F, 0xE5, 0xEC, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xE7, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8B[512] = { + 0xD9, 0xC7, 0xE4, 0xD7, 0xEA, 0xDD, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD4, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xBA, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xDA, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xF9, 0xCC, 0x3F, 0x3F, 0xE1, 0xDA, 0xDB, 0xBF, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xCC, 0xC5, 0xEC, 0xD0, 0xCB, 0xBB, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xDE, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xE9, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xD9, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xE3, /* 0x28-0x2B */ + 0xD7, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xC4, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xD0, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xFC, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xF1, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xD2, 0xD1, 0xC1, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xE3, 0xDB, 0x3F, 0x3F, 0xD3, 0xC9, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xDC, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xED, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xDE, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xBB, /* 0x6C-0x6F */ + 0xEC, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xCC, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xDE, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xE7, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xD4, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xA8, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xE2, 0xC2, 0x3F, 0x3F, 0xF3, 0xD8, 0xE5, 0xD3, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xD9, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xC6, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8C[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xDB, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xAC, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xFC, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xE7, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xD1, 0xC2, 0x3F, 0x3F, 0xF9, 0xA5, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xE8, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xE3, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xCA, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xDF, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xDF, 0xE7, 0xE3, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xF8, 0xFB, 0xE3, 0xCF, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xB0, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xE7, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xD9, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xF8, 0xAF, 0xEF, 0xF6, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xDD, 0xB6, 0xEE, 0xAF, 0xCD, 0xF8, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xB8, /* 0xA4-0xA7 */ + 0xFC, 0xA7, 0xF7, 0xFC, 0xF7, 0xB1, 0xCE, 0xBB, /* 0xA8-0xAB */ + 0xF4, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xCD, /* 0xAC-0xAF */ + 0xE1, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xC3, /* 0xB0-0xB3 */ + 0xCF, 0xFE, 0x3F, 0x3F, 0xF8, 0xBF, 0xD8, 0xE2, /* 0xB4-0xB7 */ + 0xD3, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xA8, /* 0xB8-0xBB */ + 0xF4, 0xE4, 0xEC, 0xC2, 0x3F, 0x3F, 0xD9, 0xF5, /* 0xBC-0xBF */ + 0xF9, 0xC5, 0xDD, 0xD3, 0xD6, 0xF1, 0xEC, 0xFC, /* 0xC0-0xC3 */ + 0xFC, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xC0, /* 0xC4-0xC7 */ + 0xCA, 0xB9, 0x3F, 0x3F, 0xEE, 0xE4, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xF2, 0xE1, 0x3F, 0x3F, 0xDE, 0xB9, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xF2, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xDE, 0xF4, 0x3F, 0x3F, 0xDF, 0xDB, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xDB, 0xD3, 0x3F, 0x3F, 0xFA, 0xE7, 0xD8, 0xE3, /* 0xE0-0xE3 */ + 0xF4, 0xC1, 0x3F, 0x3F, 0xDD, 0xB7, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xF5, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xD4, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xD6, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xB8, /* 0xF8-0xFB */ + 0xCF, 0xC5, 0xDF, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8D[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xF2, 0xBE, 0xF6, 0xA1, 0x3F, 0x3F, 0xEB, 0xCB, /* 0x04-0x07 */ + 0xF1, 0xFC, 0x3F, 0x3F, 0xF3, 0xC7, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE0, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xFC, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xDB, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xEE, 0xE5, 0x3F, 0x3F, 0xDE, 0xF5, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xD3, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xF1, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xAF, /* 0x70-0x73 */ + 0xDD, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xC3, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xF5, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xC6, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xF0, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xAC, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xF5, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xEB, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xBA, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xBF, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xC5, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xA2, /* 0xC8-0xCB */ + 0xF2, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xBA, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xF5, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xCB, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xEE, 0xE6, 0x3F, 0x3F, 0xE0, 0xD3, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xCE, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xD8, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xAF, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xC9, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xCE, /* 0x0C-0x0F */ + 0xF4, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xE6, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xA1, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xEB, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF1, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xB3, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xF0, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xF4, /* 0x44-0x47 */ + 0xD4, 0xB0, 0xF3, 0xB2, 0xFB, 0xB7, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xF5, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xE7, /* 0x5C-0x5F */ + 0xF4, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xF5, 0xED, 0x3F, 0x3F, 0xCF, 0xF3, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xF0, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xCE, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xCC, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xE5, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xF5, 0xE3, 0xF3, /* 0xA8-0xAB */ + 0xCF, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xCF, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xB3, 0xE4, 0xD8, /* 0xC8-0xCB */ + 0xCF, 0xF9, 0xCF, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xCD, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE3, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xE2, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xF5, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xBB, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xDC, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8F[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xF2, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xD6, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xEE, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xE5, 0xD8, 0xC2, /* 0x10-0x13 */ + 0xDC, 0xD0, 0xCC, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xE0, /* 0x18-0x1B */ + 0xF6, 0xCA, 0xFD, 0xCA, 0xD8, 0xD6, 0xF4, 0xCF, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xA6, 0xDC, 0xBE, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xDB, 0xD4, 0xD7, 0xC7, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xFE, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xCD, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xE2, 0xC3, 0xDC, 0xDE, 0x3F, 0x3F, 0xDC, 0xDF, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xAD, 0xE6, 0xAB, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xF9, 0xDD, 0xEA, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xEF, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xF4, 0xD0, 0xCE, 0xF3, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xE6, 0xAC, 0x3F, 0x3F, 0xCE, 0xDE, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xF9, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xF4, /* 0x98-0x9B */ + 0xCD, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xB8, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xFD, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xDC, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xDE, 0xF6, 0x3F, 0x3F, 0xDC, 0xAA, /* 0xAC-0xAF */ + 0xF2, 0xE3, 0xE9, 0xB4, 0xD2, 0xDC, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE6, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xE3, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xCA, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xD0, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xDA, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xBC, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xE8, 0xDA, 0xDE, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xF2, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xE2, 0xFB, 0x3F, 0x3F, 0xCC, 0xA6, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xBB, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xEE, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xF5, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_90[512] = { + 0xF7, 0xDC, 0xE1, 0xEA, 0xCE, 0xC1, 0xD4, 0xB1, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xFD, 0xB1, 0xE6, 0xBD, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xFB, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xE7, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE1, 0xCE, 0x3F, 0x3F, 0xF7, 0xE2, /* 0x0C-0x0F */ + 0xF5, 0xEF, 0xCF, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xD4, 0xB2, 0xCC, 0xEF, 0x3F, 0x3F, 0xD4, 0xE8, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xEE, 0xCF, 0xF7, 0xD7, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xE0, 0xA6, 0xD6, 0xC1, 0xE1, 0xDC, /* 0x1C-0x1F */ + 0xF0, 0xE3, 0xF1, 0xE4, 0xDC, 0xF1, 0xD6, 0xA7, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xF5, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xF1, 0xCE, 0xF2, 0xE4, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xD0, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xEC, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xF9, 0xBA, 0x3F, 0x3F, 0xEB, 0xB5, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xD4, 0xED, 0xE2, 0xC4, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE7, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xB4, 0xEA, 0xA1, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xF8, 0xBC, 0xCE, 0xA6, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF9, 0xC6, 0xFC, 0xDA, 0x3F, 0x3F, 0xD4, 0xB3, /* 0x50-0x53 */ + 0xD3, 0xB9, 0xEA, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xE9, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xE1, 0xE1, 0xD3, 0xCF, 0xF4, 0xF6, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xEA, 0xC0, 0xE1, 0xCF, 0x3F, 0x3F, 0xCC, 0xBA, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xEE, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xF0, 0xE4, 0xF3, 0xB4, 0xD4, 0xEE, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xC0, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xF1, 0xE5, 0x3F, 0x3F, 0xF4, 0xC3, /* 0x74-0x77 */ + 0xE0, 0xD4, 0x3F, 0x3F, 0xEB, 0xB6, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xD7, 0xA1, 0xCB, 0xE8, 0x3F, 0x3F, 0xF9, 0xAD, /* 0x7C-0x7F */ + + 0xE9, 0xAD, 0xD8, 0xE4, 0xFA, 0xB3, 0xE2, 0xC5, /* 0x80-0x83 */ + 0xFC, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xC4, /* 0x84-0x87 */ + 0xD8, 0xB1, 0x3F, 0x3F, 0xDC, 0xAB, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xA4, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xEB, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xE8, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xD8, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xAE, 0xD1, 0xE1, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xC0, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xF5, 0xBE, 0x3F, 0x3F, 0xDE, 0xF7, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xFB, /* 0xAC-0xAF */ + 0xF7, 0xC6, 0xCF, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xE1, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xEE, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xE9, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xF4, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xCD, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xCF, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xDD, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xCE, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xE9, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xD4, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_91[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xC7, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xDB, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xFA, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xDE, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xF8, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xEF, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xB3, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xEB, 0xB7, 0xEF, 0xF8, 0xF5, 0xDC, /* 0x48-0x4B */ + 0xED, 0xCC, 0xDB, 0xD5, 0xF1, 0xCF, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xD0, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xB2, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xD9, 0xAE, 0xD5, 0xAC, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE2, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xFD, 0xA3, 0x3F, 0x3F, 0xFB, 0xE5, /* 0x74-0x77 */ + 0xDF, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xF5, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xF6, 0xAD, 0x3F, 0x3F, 0xF5, 0xB3, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xF0, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA5, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xF5, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xA2, /* 0xA8-0xAB */ + 0xED, 0xFD, 0x3F, 0x3F, 0xF5, 0xB4, 0xFB, 0xB8, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xDB, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xD6, 0xCA, 0xCB, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xE5, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xFA, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xEB, 0xB8, 0x3F, 0x3F, 0xE0, 0xB7, /* 0xC8-0xCB */ + 0xD7, 0xEC, 0xF1, 0xEC, 0xE5, 0xAF, 0xD5, 0xE1, /* 0xCC-0xCF */ + 0xD7, 0xED, 0xD1, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xF2, /* 0xD4-0xD7 */ + 0xEF, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xDD, 0xBC, 0xF6, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xE5, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xC4, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE9, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xF3, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_92[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xD4, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xCC, 0xA2, 0xF7, 0xFE, 0xDF, 0xBC, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xCD, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xB7, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xD6, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xAD, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xAF, /* 0x3C-0x3F */ + 0xCB, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xCB, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xFA, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xC6, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE7, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xC7, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xA4, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xCF, 0xC9, 0xE2, 0xFC, 0xEF, 0xFA, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xEB, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xC8, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xD4, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xE0, 0xD5, 0x3F, 0x3F, 0xEF, 0xB0, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xC7, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xD9, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xF9, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xE5, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xCA, 0xE1, 0xD1, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xE2, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xEF, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xF9, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xF2, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xE0, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xE8, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xCB, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xCB, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_93[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD6, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xF5, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xF5, 0xDF, 0x3F, 0x3F, 0xEE, 0xB6, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xF6, 0xD3, 0xCA, /* 0x1C-0x1F */ + 0xEF, 0xFC, 0xD1, 0xC4, 0xEF, 0xB1, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xD1, 0xC5, 0x3F, 0x3F, 0xD0, 0xDE, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xD9, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xB8, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xD1, 0xF3, 0xB9, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xE7, 0xCC, 0x3F, 0x3F, 0xD6, 0xA8, 0xCE, 0xA7, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xD4, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xE4, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xB4, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xB9, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xCB, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xF6, 0xDD, 0x3F, 0x3F, 0xF1, 0xA3, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xCC, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xE9, 0xCA, 0x3F, 0x3F, 0xE1, 0xF0, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xE0, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xAF, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xD1, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xFB, 0xE0, 0xF2, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xEC, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xEC, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xEE, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xCB, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xCC, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xD7, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xA1, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_94[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xFC, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xF1, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xE0, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xB2, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF4, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xF7, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xF1, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xCA, 0xFC, 0xCA, 0xFD, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xCE, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xF3, 0xC8, 0x3F, 0x3F, 0xF3, 0xBA, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_95[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xFE, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xDA, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xEC, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xF8, 0xCD, 0x3F, 0x3F, 0xCB, 0xD2, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xCE, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xF9, 0xD8, 0xF9, 0xD9, 0xCA, 0xE0, /* 0x90-0x93 */ + 0xDA, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xCB, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xC8, /* 0xA0-0xA3 */ + 0xF9, 0xEE, 0xDB, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xD0, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xD5, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xE6, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xA2, /* 0xB8-0xBB */ + 0xE4, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xE1, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xC4, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xF9, 0xEF, 0xCF, 0xF4, 0xF7, 0xE6, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xCE, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xF4, 0xC5, 0xDC, 0xA3, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_96[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xDD, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xF4, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xA1, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xD6, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xC1, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xE6, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xB9, /* 0x3C-0x3F */ + 0xF6, 0xED, 0x3F, 0x3F, 0xF9, 0xAE, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xDD, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xB0, /* 0x48-0x4B */ + 0xD8, 0xE8, 0xCB, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF9, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xCE, /* 0x58-0x5B */ + 0xF9, 0xF0, 0xE0, 0xED, 0xE3, 0xB3, 0xF4, 0xB3, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xC2, 0xF2, 0xE6, /* 0x60-0x63 */ + 0xF0, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xD6, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xEB, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xE7, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xD7, 0xD5, 0xD4, 0xB6, 0xF9, 0xE8, /* 0x74-0x77 */ + 0xD7, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xE5, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xE9, 0xEA, 0xD7, 0xCC, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xE9, 0xE2, 0xC9, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xFC, 0xDB, 0xCD, 0xAD, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xCC, 0xB0, 0xEA, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xE4, 0xF6, 0xD0, 0xC0, 0x3F, 0x3F, 0xF0, 0xB7, /* 0x98-0x9B */ + 0xEE, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xF6, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xCA, /* 0xA4-0xA7 */ + 0xE2, 0xCB, 0x3F, 0x3F, 0xFA, 0xCF, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xEB, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xCB, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xB4, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xED, 0xCD, 0xE4, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xEA, 0xA9, 0xE4, 0xBA, 0xF3, 0xA2, 0xCD, 0xD2, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xF6, 0xCB, 0x3F, 0x3F, 0xF1, 0xE6, /* 0xC8-0xCB */ + 0xED, 0xC1, 0xE8, 0xBC, 0xEE, 0xD1, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xF0, 0xE7, 0xE2, 0xCC, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xE4, 0xAA, 0x3F, 0x3F, 0xF5, 0xE1, /* 0xD8-0xDB */ + 0xED, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xEE, 0xD1, 0xF1, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xE9, 0xEB, 0xE9, 0xEC, 0xE0, 0xE4, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xA7, /* 0xEC-0xEF */ + 0xDD, 0xD4, 0x3F, 0x3F, 0xEA, 0xA3, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xC3, 0xD6, 0xF4, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xDA, 0xDF, 0x3F, 0x3F, 0xEF, 0xB3, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_97[512] = { + 0xE2, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xFD, 0xF2, 0xE8, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xEF, 0xC5, 0x3F, 0x3F, 0xE7, 0xE7, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xFD, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xE7, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xDF, 0xDC, 0x3F, 0x3F, 0xF9, 0xC7, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xF6, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xDF, 0xAC, 0x3F, 0x3F, 0xD6, 0xDA, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xDC, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xF0, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xFA, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xE4, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xD6, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xF4, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xFE, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xF0, 0xA1, 0x3F, 0x3F, 0xDE, 0xAA, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xDA, 0xBC, 0xD8, 0xFC, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xFA, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xEC, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xFC, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xE6, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xCB, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xB9, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xE4, 0xD3, 0x3F, 0x3F, 0xCD, 0xF9, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xCF, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xCA, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xD4, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xF8, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xC7, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xDF, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xDB, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xD4, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xE5, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xD2, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xA4, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xC2, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_98[512] = { + 0xFB, 0xE1, 0xFA, 0xED, 0xF0, 0xA2, 0xCC, 0xF1, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xFA, 0xA3, 0xE2, 0xF7, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xE2, 0xCE, 0x3F, 0x3F, 0xE9, 0xF5, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xE1, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xE7, 0xE8, 0xE8, 0xD7, 0xDA, 0xF8, 0xD4, 0xCB, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xF6, /* 0x14-0x17 */ + 0xD6, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xD4, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xFA, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xCC, 0xF2, 0xF7, 0xDD, 0x3F, 0x3F, 0xDE, 0xBA, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xA8, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xF0, 0xB9, 0xE4, 0xFE, 0xE4, 0xC9, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xE4, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xEA, 0xC3, 0x3F, 0x3F, 0xEF, 0xB4, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xBE, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xFB, 0xE2, 0x3F, 0x3F, 0xCD, 0xD3, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xB5, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xE9, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xF9, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xBD, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xF7, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xF8, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xFC, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xAB, /* 0xD8-0xDB */ + 0xDB, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xDD, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xE1, 0xE2, 0xD1, 0xC6, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xF6, 0xD0, 0xEB, 0xE6, 0xDA, 0xF9, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xEC, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xDE, 0xF8, 0xF8, 0xE9, 0xE3, 0xDE, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_99[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xF5, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xFA, 0xC3, 0xE5, 0xD7, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xEC, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xF3, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xBB, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xE6, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xB6, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xDC, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xCE, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xD8, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xD0, 0xCF, 0x3F, 0x3F, 0xCF, 0xFA, /* 0x48-0x4B */ + 0xF3, 0xCA, 0xE0, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xD1, 0xC7, 0xE9, 0xAE, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xE8, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0xC4, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xCF, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xFA, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xF9, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xDC, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xFB, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xD8, 0xA9, 0xE5, 0xDF, 0xF9, 0xA7, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xF6, 0xEE, 0x3F, 0x3F, 0xF6, 0xCC, /* 0xB0-0xB3 */ + 0xE2, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xEC, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xDA, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xF1, 0xD2, 0xD2, 0xCC, 0xCF, 0xCB, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xCA, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xDD, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xF6, 0xEF, 0x3F, 0x3F, 0xDE, 0xF9, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xFA, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xD5, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xE7, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9A[512] = { + 0x3F, 0x3F, 0xDE, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xDC, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xC8, 0xD1, 0xC9, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF8, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xF6, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xD4, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xE2, 0xE1, 0xD3, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xD8, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xFE, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xCF, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xFD, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xCE, 0xF6, 0x3F, 0x3F, 0xFA, 0xD0, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xF3, 0xE6, 0xBE, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xAE, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xF0, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xD1, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xFC, 0xBE, 0xD5, 0xF1, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xCD, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xFA, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xD0, /* 0xD0-0xD3 */ + 0xF4, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xCD, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xE7, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xA5, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9B[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xD1, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xA2, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xE3, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xEA, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xD0, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xCE, 0xDA, 0xFB, 0xEB, 0xDB, 0xA6, /* 0x40-0x43 */ + 0xDB, 0xDE, 0xD8, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xE0, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xD8, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xE0, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xDB, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xC6, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xF8, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xD5, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xF7, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xD8, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xD7, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xED, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xCD, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xCC, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9C[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xF5, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xE4, 0xCA, 0x3F, 0x3F, 0xDC, 0xE1, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xF9, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xFC, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xA7, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xC4, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xBE, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xDC, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xF7, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xF0, 0xE8, 0x3F, 0x3F, 0xDD, 0xC0, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xCF, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xF3, /* 0xF0-0xF3 */ + 0xD9, 0xB0, 0x3F, 0x3F, 0xE6, 0xE9, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9D[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xE4, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xC4, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xEC, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xE4, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFB, 0xF8, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xCC, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xE4, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xCD, 0xDC, 0xD9, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xDD, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xCE, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xD9, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA3, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xF9, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xCD, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xCE, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xAF, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xFD, 0xD3, 0xEB, 0xED, 0xD6, 0xDC, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xA4, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xB6, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xD6, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xF9, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xE7, 0xA4, 0x3F, 0x3F, 0xD6, 0xE3, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xCB, 0xD6, 0xE4, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xF2, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xDE, 0xFA, 0x3F, 0x3F, 0xD7, 0xF8, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xD8, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xCF, 0xD5, 0xD8, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xAB, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xFD, 0xCB, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFC, 0xDC, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xE0, 0xA8, 0xD5, 0xF3, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xFD, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xCC, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xD9, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xEA, /* 0xD8-0xDB */ + 0xF5, 0xF5, 0x3F, 0x3F, 0xEF, 0xC7, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xD3, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xDA, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9F[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xA8, /* 0x04-0x07 */ + 0xDC, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xA3, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xD5, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xE0, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xAC, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xBA, 0xEE, 0xB1, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xB2, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xCD, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xD2, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xD6, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE5, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xBB, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE5, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xCB, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xD7, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xDB, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xCA, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xCF, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_AC[512] = { + 0xB0, 0xA1, 0xB0, 0xA2, 0x81, 0x41, 0x81, 0x42, /* 0x00-0x03 */ + 0xB0, 0xA3, 0x81, 0x43, 0x81, 0x44, 0xB0, 0xA4, /* 0x04-0x07 */ + 0xB0, 0xA5, 0xB0, 0xA6, 0xB0, 0xA7, 0x81, 0x45, /* 0x08-0x0B */ + 0x81, 0x46, 0x81, 0x47, 0x81, 0x48, 0x81, 0x49, /* 0x0C-0x0F */ + 0xB0, 0xA8, 0xB0, 0xA9, 0xB0, 0xAA, 0xB0, 0xAB, /* 0x10-0x13 */ + 0xB0, 0xAC, 0xB0, 0xAD, 0xB0, 0xAE, 0xB0, 0xAF, /* 0x14-0x17 */ + 0x81, 0x4A, 0xB0, 0xB0, 0xB0, 0xB1, 0xB0, 0xB2, /* 0x18-0x1B */ + 0xB0, 0xB3, 0xB0, 0xB4, 0x81, 0x4B, 0x81, 0x4C, /* 0x1C-0x1F */ + 0xB0, 0xB5, 0x81, 0x4D, 0x81, 0x4E, 0x81, 0x4F, /* 0x20-0x23 */ + 0xB0, 0xB6, 0x81, 0x50, 0x81, 0x51, 0x81, 0x52, /* 0x24-0x27 */ + 0x81, 0x53, 0x81, 0x54, 0x81, 0x55, 0x81, 0x56, /* 0x28-0x2B */ + 0xB0, 0xB7, 0xB0, 0xB8, 0x81, 0x57, 0xB0, 0xB9, /* 0x2C-0x2F */ + 0xB0, 0xBA, 0xB0, 0xBB, 0x81, 0x58, 0x81, 0x59, /* 0x30-0x33 */ + 0x81, 0x5A, 0x81, 0x61, 0x81, 0x62, 0x81, 0x63, /* 0x34-0x37 */ + 0xB0, 0xBC, 0xB0, 0xBD, 0x81, 0x64, 0x81, 0x65, /* 0x38-0x3B */ + 0xB0, 0xBE, 0x81, 0x66, 0x81, 0x67, 0x81, 0x68, /* 0x3C-0x3F */ + 0xB0, 0xBF, 0x81, 0x69, 0x81, 0x6A, 0x81, 0x6B, /* 0x40-0x43 */ + 0x81, 0x6C, 0x81, 0x6D, 0x81, 0x6E, 0x81, 0x6F, /* 0x44-0x47 */ + 0x81, 0x70, 0x81, 0x71, 0x81, 0x72, 0xB0, 0xC0, /* 0x48-0x4B */ + 0x81, 0x73, 0xB0, 0xC1, 0x81, 0x74, 0x81, 0x75, /* 0x4C-0x4F */ + 0x81, 0x76, 0x81, 0x77, 0x81, 0x78, 0x81, 0x79, /* 0x50-0x53 */ + 0xB0, 0xC2, 0x81, 0x7A, 0x81, 0x81, 0x81, 0x82, /* 0x54-0x57 */ + 0xB0, 0xC3, 0x81, 0x83, 0x81, 0x84, 0x81, 0x85, /* 0x58-0x5B */ + 0xB0, 0xC4, 0x81, 0x86, 0x81, 0x87, 0x81, 0x88, /* 0x5C-0x5F */ + 0x81, 0x89, 0x81, 0x8A, 0x81, 0x8B, 0x81, 0x8C, /* 0x60-0x63 */ + 0x81, 0x8D, 0x81, 0x8E, 0x81, 0x8F, 0x81, 0x90, /* 0x64-0x67 */ + 0x81, 0x91, 0x81, 0x92, 0x81, 0x93, 0x81, 0x94, /* 0x68-0x6B */ + 0x81, 0x95, 0x81, 0x96, 0x81, 0x97, 0x81, 0x98, /* 0x6C-0x6F */ + 0xB0, 0xC5, 0xB0, 0xC6, 0x81, 0x99, 0x81, 0x9A, /* 0x70-0x73 */ + 0xB0, 0xC7, 0x81, 0x9B, 0x81, 0x9C, 0xB0, 0xC8, /* 0x74-0x77 */ + 0xB0, 0xC9, 0x81, 0x9D, 0xB0, 0xCA, 0x81, 0x9E, /* 0x78-0x7B */ + 0x81, 0x9F, 0x81, 0xA0, 0x81, 0xA1, 0x81, 0xA2, /* 0x7C-0x7F */ + + 0xB0, 0xCB, 0xB0, 0xCC, 0x81, 0xA3, 0xB0, 0xCD, /* 0x80-0x83 */ + 0xB0, 0xCE, 0xB0, 0xCF, 0xB0, 0xD0, 0x81, 0xA4, /* 0x84-0x87 */ + 0x81, 0xA5, 0xB0, 0xD1, 0xB0, 0xD2, 0xB0, 0xD3, /* 0x88-0x8B */ + 0xB0, 0xD4, 0x81, 0xA6, 0x81, 0xA7, 0x81, 0xA8, /* 0x8C-0x8F */ + 0xB0, 0xD5, 0x81, 0xA9, 0x81, 0xAA, 0x81, 0xAB, /* 0x90-0x93 */ + 0xB0, 0xD6, 0x81, 0xAC, 0x81, 0xAD, 0x81, 0xAE, /* 0x94-0x97 */ + 0x81, 0xAF, 0x81, 0xB0, 0x81, 0xB1, 0x81, 0xB2, /* 0x98-0x9B */ + 0xB0, 0xD7, 0xB0, 0xD8, 0x81, 0xB3, 0xB0, 0xD9, /* 0x9C-0x9F */ + 0xB0, 0xDA, 0xB0, 0xDB, 0x81, 0xB4, 0x81, 0xB5, /* 0xA0-0xA3 */ + 0x81, 0xB6, 0x81, 0xB7, 0x81, 0xB8, 0x81, 0xB9, /* 0xA4-0xA7 */ + 0xB0, 0xDC, 0xB0, 0xDD, 0xB0, 0xDE, 0x81, 0xBA, /* 0xA8-0xAB */ + 0xB0, 0xDF, 0x81, 0xBB, 0x81, 0xBC, 0xB0, 0xE0, /* 0xAC-0xAF */ + 0xB0, 0xE1, 0x81, 0xBD, 0x81, 0xBE, 0x81, 0xBF, /* 0xB0-0xB3 */ + 0x81, 0xC0, 0x81, 0xC1, 0x81, 0xC2, 0x81, 0xC3, /* 0xB4-0xB7 */ + 0xB0, 0xE2, 0xB0, 0xE3, 0x81, 0xC4, 0xB0, 0xE4, /* 0xB8-0xBB */ + 0xB0, 0xE5, 0xB0, 0xE6, 0x81, 0xC5, 0x81, 0xC6, /* 0xBC-0xBF */ + 0x81, 0xC7, 0xB0, 0xE7, 0x81, 0xC8, 0x81, 0xC9, /* 0xC0-0xC3 */ + 0xB0, 0xE8, 0x81, 0xCA, 0x81, 0xCB, 0x81, 0xCC, /* 0xC4-0xC7 */ + 0xB0, 0xE9, 0x81, 0xCD, 0x81, 0xCE, 0x81, 0xCF, /* 0xC8-0xCB */ + 0xB0, 0xEA, 0x81, 0xD0, 0x81, 0xD1, 0x81, 0xD2, /* 0xCC-0xCF */ + 0x81, 0xD3, 0x81, 0xD4, 0x81, 0xD5, 0x81, 0xD6, /* 0xD0-0xD3 */ + 0x81, 0xD7, 0xB0, 0xEB, 0x81, 0xD8, 0xB0, 0xEC, /* 0xD4-0xD7 */ + 0x81, 0xD9, 0x81, 0xDA, 0x81, 0xDB, 0x81, 0xDC, /* 0xD8-0xDB */ + 0x81, 0xDD, 0x81, 0xDE, 0x81, 0xDF, 0x81, 0xE0, /* 0xDC-0xDF */ + 0xB0, 0xED, 0xB0, 0xEE, 0x81, 0xE1, 0x81, 0xE2, /* 0xE0-0xE3 */ + 0xB0, 0xEF, 0x81, 0xE3, 0x81, 0xE4, 0xB0, 0xF0, /* 0xE4-0xE7 */ + 0xB0, 0xF1, 0x81, 0xE5, 0xB0, 0xF2, 0x81, 0xE6, /* 0xE8-0xEB */ + 0xB0, 0xF3, 0x81, 0xE7, 0x81, 0xE8, 0xB0, 0xF4, /* 0xEC-0xEF */ + 0xB0, 0xF5, 0xB0, 0xF6, 0x81, 0xE9, 0xB0, 0xF7, /* 0xF0-0xF3 */ + 0x81, 0xEA, 0xB0, 0xF8, 0xB0, 0xF9, 0x81, 0xEB, /* 0xF4-0xF7 */ + 0x81, 0xEC, 0x81, 0xED, 0x81, 0xEE, 0x81, 0xEF, /* 0xF8-0xFB */ + 0xB0, 0xFA, 0xB0, 0xFB, 0x81, 0xF0, 0x81, 0xF1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_AD[512] = { + 0xB0, 0xFC, 0x81, 0xF2, 0x81, 0xF3, 0x81, 0xF4, /* 0x00-0x03 */ + 0xB0, 0xFD, 0x81, 0xF5, 0xB0, 0xFE, 0x81, 0xF6, /* 0x04-0x07 */ + 0x81, 0xF7, 0x81, 0xF8, 0x81, 0xF9, 0x81, 0xFA, /* 0x08-0x0B */ + 0xB1, 0xA1, 0xB1, 0xA2, 0x81, 0xFB, 0xB1, 0xA3, /* 0x0C-0x0F */ + 0x81, 0xFC, 0xB1, 0xA4, 0x81, 0xFD, 0x81, 0xFE, /* 0x10-0x13 */ + 0x82, 0x41, 0x82, 0x42, 0x82, 0x43, 0x82, 0x44, /* 0x14-0x17 */ + 0xB1, 0xA5, 0x82, 0x45, 0x82, 0x46, 0x82, 0x47, /* 0x18-0x1B */ + 0xB1, 0xA6, 0x82, 0x48, 0x82, 0x49, 0x82, 0x4A, /* 0x1C-0x1F */ + 0xB1, 0xA7, 0x82, 0x4B, 0x82, 0x4C, 0x82, 0x4D, /* 0x20-0x23 */ + 0x82, 0x4E, 0x82, 0x4F, 0x82, 0x50, 0x82, 0x51, /* 0x24-0x27 */ + 0x82, 0x52, 0xB1, 0xA8, 0x82, 0x53, 0x82, 0x54, /* 0x28-0x2B */ + 0xB1, 0xA9, 0xB1, 0xAA, 0x82, 0x55, 0x82, 0x56, /* 0x2C-0x2F */ + 0x82, 0x57, 0x82, 0x58, 0x82, 0x59, 0x82, 0x5A, /* 0x30-0x33 */ + 0xB1, 0xAB, 0xB1, 0xAC, 0x82, 0x61, 0x82, 0x62, /* 0x34-0x37 */ + 0xB1, 0xAD, 0x82, 0x63, 0x82, 0x64, 0x82, 0x65, /* 0x38-0x3B */ + 0xB1, 0xAE, 0x82, 0x66, 0x82, 0x67, 0x82, 0x68, /* 0x3C-0x3F */ + 0x82, 0x69, 0x82, 0x6A, 0x82, 0x6B, 0x82, 0x6C, /* 0x40-0x43 */ + 0xB1, 0xAF, 0xB1, 0xB0, 0x82, 0x6D, 0xB1, 0xB1, /* 0x44-0x47 */ + 0x82, 0x6E, 0xB1, 0xB2, 0x82, 0x6F, 0x82, 0x70, /* 0x48-0x4B */ + 0x82, 0x71, 0x82, 0x72, 0x82, 0x73, 0x82, 0x74, /* 0x4C-0x4F */ + 0xB1, 0xB3, 0x82, 0x75, 0x82, 0x76, 0x82, 0x77, /* 0x50-0x53 */ + 0xB1, 0xB4, 0x82, 0x78, 0x82, 0x79, 0x82, 0x7A, /* 0x54-0x57 */ + 0xB1, 0xB5, 0x82, 0x81, 0x82, 0x82, 0x82, 0x83, /* 0x58-0x5B */ + 0x82, 0x84, 0x82, 0x85, 0x82, 0x86, 0x82, 0x87, /* 0x5C-0x5F */ + 0x82, 0x88, 0xB1, 0xB6, 0x82, 0x89, 0xB1, 0xB7, /* 0x60-0x63 */ + 0x82, 0x8A, 0x82, 0x8B, 0x82, 0x8C, 0x82, 0x8D, /* 0x64-0x67 */ + 0x82, 0x8E, 0x82, 0x8F, 0x82, 0x90, 0x82, 0x91, /* 0x68-0x6B */ + 0xB1, 0xB8, 0xB1, 0xB9, 0x82, 0x92, 0x82, 0x93, /* 0x6C-0x6F */ + 0xB1, 0xBA, 0x82, 0x94, 0x82, 0x95, 0xB1, 0xBB, /* 0x70-0x73 */ + 0xB1, 0xBC, 0xB1, 0xBD, 0xB1, 0xBE, 0x82, 0x96, /* 0x74-0x77 */ + 0x82, 0x97, 0x82, 0x98, 0x82, 0x99, 0xB1, 0xBF, /* 0x78-0x7B */ + 0xB1, 0xC0, 0xB1, 0xC1, 0x82, 0x9A, 0xB1, 0xC2, /* 0x7C-0x7F */ + + 0x82, 0x9B, 0xB1, 0xC3, 0xB1, 0xC4, 0x82, 0x9C, /* 0x80-0x83 */ + 0x82, 0x9D, 0x82, 0x9E, 0x82, 0x9F, 0x82, 0xA0, /* 0x84-0x87 */ + 0xB1, 0xC5, 0xB1, 0xC6, 0x82, 0xA1, 0x82, 0xA2, /* 0x88-0x8B */ + 0xB1, 0xC7, 0x82, 0xA3, 0x82, 0xA4, 0x82, 0xA5, /* 0x8C-0x8F */ + 0xB1, 0xC8, 0x82, 0xA6, 0x82, 0xA7, 0x82, 0xA8, /* 0x90-0x93 */ + 0x82, 0xA9, 0x82, 0xAA, 0x82, 0xAB, 0x82, 0xAC, /* 0x94-0x97 */ + 0x82, 0xAD, 0x82, 0xAE, 0x82, 0xAF, 0x82, 0xB0, /* 0x98-0x9B */ + 0xB1, 0xC9, 0xB1, 0xCA, 0x82, 0xB1, 0x82, 0xB2, /* 0x9C-0x9F */ + 0x82, 0xB3, 0x82, 0xB4, 0x82, 0xB5, 0x82, 0xB6, /* 0xA0-0xA3 */ + 0xB1, 0xCB, 0x82, 0xB7, 0x82, 0xB8, 0x82, 0xB9, /* 0xA4-0xA7 */ + 0x82, 0xBA, 0x82, 0xBB, 0x82, 0xBC, 0x82, 0xBD, /* 0xA8-0xAB */ + 0x82, 0xBE, 0x82, 0xBF, 0x82, 0xC0, 0x82, 0xC1, /* 0xAC-0xAF */ + 0x82, 0xC2, 0x82, 0xC3, 0x82, 0xC4, 0x82, 0xC5, /* 0xB0-0xB3 */ + 0x82, 0xC6, 0x82, 0xC7, 0x82, 0xC8, 0xB1, 0xCC, /* 0xB4-0xB7 */ + 0x82, 0xC9, 0x82, 0xCA, 0x82, 0xCB, 0x82, 0xCC, /* 0xB8-0xBB */ + 0x82, 0xCD, 0x82, 0xCE, 0x82, 0xCF, 0x82, 0xD0, /* 0xBC-0xBF */ + 0xB1, 0xCD, 0xB1, 0xCE, 0x82, 0xD1, 0x82, 0xD2, /* 0xC0-0xC3 */ + 0xB1, 0xCF, 0x82, 0xD3, 0x82, 0xD4, 0x82, 0xD5, /* 0xC4-0xC7 */ + 0xB1, 0xD0, 0x82, 0xD6, 0x82, 0xD7, 0x82, 0xD8, /* 0xC8-0xCB */ + 0x82, 0xD9, 0x82, 0xDA, 0x82, 0xDB, 0x82, 0xDC, /* 0xCC-0xCF */ + 0xB1, 0xD1, 0xB1, 0xD2, 0x82, 0xDD, 0xB1, 0xD3, /* 0xD0-0xD3 */ + 0x82, 0xDE, 0x82, 0xDF, 0x82, 0xE0, 0x82, 0xE1, /* 0xD4-0xD7 */ + 0x82, 0xE2, 0x82, 0xE3, 0x82, 0xE4, 0x82, 0xE5, /* 0xD8-0xDB */ + 0xB1, 0xD4, 0x82, 0xE6, 0x82, 0xE7, 0x82, 0xE8, /* 0xDC-0xDF */ + 0xB1, 0xD5, 0x82, 0xE9, 0x82, 0xEA, 0x82, 0xEB, /* 0xE0-0xE3 */ + 0xB1, 0xD6, 0x82, 0xEC, 0x82, 0xED, 0x82, 0xEE, /* 0xE4-0xE7 */ + 0x82, 0xEF, 0x82, 0xF0, 0x82, 0xF1, 0x82, 0xF2, /* 0xE8-0xEB */ + 0x82, 0xF3, 0x82, 0xF4, 0x82, 0xF5, 0x82, 0xF6, /* 0xEC-0xEF */ + 0x82, 0xF7, 0x82, 0xF8, 0x82, 0xF9, 0x82, 0xFA, /* 0xF0-0xF3 */ + 0x82, 0xFB, 0x82, 0xFC, 0x82, 0xFD, 0x82, 0xFE, /* 0xF4-0xF7 */ + 0xB1, 0xD7, 0xB1, 0xD8, 0x83, 0x41, 0x83, 0x42, /* 0xF8-0xFB */ + 0xB1, 0xD9, 0x83, 0x43, 0x83, 0x44, 0xB1, 0xDA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_AE[512] = { + 0xB1, 0xDB, 0xB1, 0xDC, 0x83, 0x45, 0x83, 0x46, /* 0x00-0x03 */ + 0x83, 0x47, 0x83, 0x48, 0x83, 0x49, 0x83, 0x4A, /* 0x04-0x07 */ + 0xB1, 0xDD, 0xB1, 0xDE, 0x83, 0x4B, 0xB1, 0xDF, /* 0x08-0x0B */ + 0x83, 0x4C, 0xB1, 0xE0, 0x83, 0x4D, 0x83, 0x4E, /* 0x0C-0x0F */ + 0x83, 0x4F, 0x83, 0x50, 0x83, 0x51, 0x83, 0x52, /* 0x10-0x13 */ + 0xB1, 0xE1, 0x83, 0x53, 0x83, 0x54, 0x83, 0x55, /* 0x14-0x17 */ + 0x83, 0x56, 0x83, 0x57, 0x83, 0x58, 0x83, 0x59, /* 0x18-0x1B */ + 0x83, 0x5A, 0x83, 0x61, 0x83, 0x62, 0x83, 0x63, /* 0x1C-0x1F */ + 0x83, 0x64, 0x83, 0x65, 0x83, 0x66, 0x83, 0x67, /* 0x20-0x23 */ + 0x83, 0x68, 0x83, 0x69, 0x83, 0x6A, 0x83, 0x6B, /* 0x24-0x27 */ + 0x83, 0x6C, 0x83, 0x6D, 0x83, 0x6E, 0x83, 0x6F, /* 0x28-0x2B */ + 0x83, 0x70, 0x83, 0x71, 0x83, 0x72, 0x83, 0x73, /* 0x2C-0x2F */ + 0xB1, 0xE2, 0xB1, 0xE3, 0x83, 0x74, 0x83, 0x75, /* 0x30-0x33 */ + 0xB1, 0xE4, 0x83, 0x76, 0x83, 0x77, 0xB1, 0xE5, /* 0x34-0x37 */ + 0xB1, 0xE6, 0x83, 0x78, 0xB1, 0xE7, 0x83, 0x79, /* 0x38-0x3B */ + 0x83, 0x7A, 0x83, 0x81, 0x83, 0x82, 0x83, 0x83, /* 0x3C-0x3F */ + 0xB1, 0xE8, 0xB1, 0xE9, 0x83, 0x84, 0xB1, 0xEA, /* 0x40-0x43 */ + 0x83, 0x85, 0xB1, 0xEB, 0xB1, 0xEC, 0x83, 0x86, /* 0x44-0x47 */ + 0x83, 0x87, 0x83, 0x88, 0xB1, 0xED, 0x83, 0x89, /* 0x48-0x4B */ + 0xB1, 0xEE, 0xB1, 0xEF, 0xB1, 0xF0, 0x83, 0x8A, /* 0x4C-0x4F */ + 0xB1, 0xF1, 0x83, 0x8B, 0x83, 0x8C, 0x83, 0x8D, /* 0x50-0x53 */ + 0xB1, 0xF2, 0x83, 0x8E, 0xB1, 0xF3, 0x83, 0x8F, /* 0x54-0x57 */ + 0x83, 0x90, 0x83, 0x91, 0x83, 0x92, 0x83, 0x93, /* 0x58-0x5B */ + 0xB1, 0xF4, 0xB1, 0xF5, 0x83, 0x94, 0xB1, 0xF6, /* 0x5C-0x5F */ + 0xB1, 0xF7, 0xB1, 0xF8, 0x83, 0x95, 0x83, 0x96, /* 0x60-0x63 */ + 0x83, 0x97, 0xB1, 0xF9, 0x83, 0x98, 0x83, 0x99, /* 0x64-0x67 */ + 0xB1, 0xFA, 0xB1, 0xFB, 0x83, 0x9A, 0x83, 0x9B, /* 0x68-0x6B */ + 0xB1, 0xFC, 0x83, 0x9C, 0x83, 0x9D, 0x83, 0x9E, /* 0x6C-0x6F */ + 0xB1, 0xFD, 0x83, 0x9F, 0x83, 0xA0, 0x83, 0xA1, /* 0x70-0x73 */ + 0x83, 0xA2, 0x83, 0xA3, 0x83, 0xA4, 0x83, 0xA5, /* 0x74-0x77 */ + 0xB1, 0xFE, 0xB2, 0xA1, 0x83, 0xA6, 0xB2, 0xA2, /* 0x78-0x7B */ + 0xB2, 0xA3, 0xB2, 0xA4, 0x83, 0xA7, 0x83, 0xA8, /* 0x7C-0x7F */ + + 0x83, 0xA9, 0x83, 0xAA, 0x83, 0xAB, 0x83, 0xAC, /* 0x80-0x83 */ + 0xB2, 0xA5, 0xB2, 0xA6, 0x83, 0xAD, 0x83, 0xAE, /* 0x84-0x87 */ + 0x83, 0xAF, 0x83, 0xB0, 0x83, 0xB1, 0x83, 0xB2, /* 0x88-0x8B */ + 0xB2, 0xA7, 0x83, 0xB3, 0x83, 0xB4, 0x83, 0xB5, /* 0x8C-0x8F */ + 0x83, 0xB6, 0x83, 0xB7, 0x83, 0xB8, 0x83, 0xB9, /* 0x90-0x93 */ + 0x83, 0xBA, 0x83, 0xBB, 0x83, 0xBC, 0x83, 0xBD, /* 0x94-0x97 */ + 0x83, 0xBE, 0x83, 0xBF, 0x83, 0xC0, 0x83, 0xC1, /* 0x98-0x9B */ + 0x83, 0xC2, 0x83, 0xC3, 0x83, 0xC4, 0x83, 0xC5, /* 0x9C-0x9F */ + 0x83, 0xC6, 0x83, 0xC7, 0x83, 0xC8, 0x83, 0xC9, /* 0xA0-0xA3 */ + 0x83, 0xCA, 0x83, 0xCB, 0x83, 0xCC, 0x83, 0xCD, /* 0xA4-0xA7 */ + 0x83, 0xCE, 0x83, 0xCF, 0x83, 0xD0, 0x83, 0xD1, /* 0xA8-0xAB */ + 0x83, 0xD2, 0x83, 0xD3, 0x83, 0xD4, 0x83, 0xD5, /* 0xAC-0xAF */ + 0x83, 0xD6, 0x83, 0xD7, 0x83, 0xD8, 0x83, 0xD9, /* 0xB0-0xB3 */ + 0x83, 0xDA, 0x83, 0xDB, 0x83, 0xDC, 0x83, 0xDD, /* 0xB4-0xB7 */ + 0x83, 0xDE, 0x83, 0xDF, 0x83, 0xE0, 0x83, 0xE1, /* 0xB8-0xBB */ + 0xB2, 0xA8, 0xB2, 0xA9, 0xB2, 0xAA, 0x83, 0xE2, /* 0xBC-0xBF */ + 0xB2, 0xAB, 0x83, 0xE3, 0x83, 0xE4, 0x83, 0xE5, /* 0xC0-0xC3 */ + 0xB2, 0xAC, 0x83, 0xE6, 0x83, 0xE7, 0x83, 0xE8, /* 0xC4-0xC7 */ + 0x83, 0xE9, 0x83, 0xEA, 0x83, 0xEB, 0x83, 0xEC, /* 0xC8-0xCB */ + 0xB2, 0xAD, 0xB2, 0xAE, 0x83, 0xED, 0xB2, 0xAF, /* 0xCC-0xCF */ + 0xB2, 0xB0, 0xB2, 0xB1, 0x83, 0xEE, 0x83, 0xEF, /* 0xD0-0xD3 */ + 0x83, 0xF0, 0x83, 0xF1, 0x83, 0xF2, 0x83, 0xF3, /* 0xD4-0xD7 */ + 0xB2, 0xB2, 0xB2, 0xB3, 0x83, 0xF4, 0x83, 0xF5, /* 0xD8-0xDB */ + 0xB2, 0xB4, 0x83, 0xF6, 0x83, 0xF7, 0x83, 0xF8, /* 0xDC-0xDF */ + 0x83, 0xF9, 0x83, 0xFA, 0x83, 0xFB, 0x83, 0xFC, /* 0xE0-0xE3 */ + 0x83, 0xFD, 0x83, 0xFE, 0x84, 0x41, 0x84, 0x42, /* 0xE4-0xE7 */ + 0xB2, 0xB5, 0x84, 0x43, 0x84, 0x44, 0xB2, 0xB6, /* 0xE8-0xEB */ + 0x84, 0x45, 0xB2, 0xB7, 0x84, 0x46, 0x84, 0x47, /* 0xEC-0xEF */ + 0x84, 0x48, 0x84, 0x49, 0x84, 0x4A, 0x84, 0x4B, /* 0xF0-0xF3 */ + 0xB2, 0xB8, 0x84, 0x4C, 0x84, 0x4D, 0x84, 0x4E, /* 0xF4-0xF7 */ + 0xB2, 0xB9, 0x84, 0x4F, 0x84, 0x50, 0x84, 0x51, /* 0xF8-0xFB */ + 0xB2, 0xBA, 0x84, 0x52, 0x84, 0x53, 0x84, 0x54, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_AF[512] = { + 0x84, 0x55, 0x84, 0x56, 0x84, 0x57, 0x84, 0x58, /* 0x00-0x03 */ + 0x84, 0x59, 0x84, 0x5A, 0x84, 0x61, 0xB2, 0xBB, /* 0x04-0x07 */ + 0xB2, 0xBC, 0x84, 0x62, 0x84, 0x63, 0x84, 0x64, /* 0x08-0x0B */ + 0x84, 0x65, 0xB2, 0xBD, 0x84, 0x66, 0x84, 0x67, /* 0x0C-0x0F */ + 0xB2, 0xBE, 0x84, 0x68, 0x84, 0x69, 0x84, 0x6A, /* 0x10-0x13 */ + 0x84, 0x6B, 0x84, 0x6C, 0x84, 0x6D, 0x84, 0x6E, /* 0x14-0x17 */ + 0x84, 0x6F, 0x84, 0x70, 0x84, 0x71, 0x84, 0x72, /* 0x18-0x1B */ + 0x84, 0x73, 0x84, 0x74, 0x84, 0x75, 0x84, 0x76, /* 0x1C-0x1F */ + 0x84, 0x77, 0x84, 0x78, 0x84, 0x79, 0x84, 0x7A, /* 0x20-0x23 */ + 0x84, 0x81, 0x84, 0x82, 0x84, 0x83, 0x84, 0x84, /* 0x24-0x27 */ + 0x84, 0x85, 0x84, 0x86, 0x84, 0x87, 0x84, 0x88, /* 0x28-0x2B */ + 0xB2, 0xBF, 0xB2, 0xC0, 0x84, 0x89, 0x84, 0x8A, /* 0x2C-0x2F */ + 0xB2, 0xC1, 0x84, 0x8B, 0xB2, 0xC2, 0x84, 0x8C, /* 0x30-0x33 */ + 0xB2, 0xC3, 0x84, 0x8D, 0x84, 0x8E, 0x84, 0x8F, /* 0x34-0x37 */ + 0x84, 0x90, 0x84, 0x91, 0x84, 0x92, 0x84, 0x93, /* 0x38-0x3B */ + 0xB2, 0xC4, 0xB2, 0xC5, 0x84, 0x94, 0xB2, 0xC6, /* 0x3C-0x3F */ + 0x84, 0x95, 0xB2, 0xC7, 0xB2, 0xC8, 0xB2, 0xC9, /* 0x40-0x43 */ + 0x84, 0x96, 0x84, 0x97, 0x84, 0x98, 0x84, 0x99, /* 0x44-0x47 */ + 0xB2, 0xCA, 0xB2, 0xCB, 0x84, 0x9A, 0x84, 0x9B, /* 0x48-0x4B */ + 0x84, 0x9C, 0x84, 0x9D, 0x84, 0x9E, 0x84, 0x9F, /* 0x4C-0x4F */ + 0xB2, 0xCC, 0x84, 0xA0, 0x84, 0xA1, 0x84, 0xA2, /* 0x50-0x53 */ + 0x84, 0xA3, 0x84, 0xA4, 0x84, 0xA5, 0x84, 0xA6, /* 0x54-0x57 */ + 0x84, 0xA7, 0x84, 0xA8, 0x84, 0xA9, 0x84, 0xAA, /* 0x58-0x5B */ + 0xB2, 0xCD, 0xB2, 0xCE, 0x84, 0xAB, 0x84, 0xAC, /* 0x5C-0x5F */ + 0x84, 0xAD, 0x84, 0xAE, 0x84, 0xAF, 0x84, 0xB0, /* 0x60-0x63 */ + 0xB2, 0xCF, 0xB2, 0xD0, 0x84, 0xB1, 0x84, 0xB2, /* 0x64-0x67 */ + 0x84, 0xB3, 0x84, 0xB4, 0x84, 0xB5, 0x84, 0xB6, /* 0x68-0x6B */ + 0x84, 0xB7, 0x84, 0xB8, 0x84, 0xB9, 0x84, 0xBA, /* 0x6C-0x6F */ + 0x84, 0xBB, 0x84, 0xBC, 0x84, 0xBD, 0x84, 0xBE, /* 0x70-0x73 */ + 0x84, 0xBF, 0x84, 0xC0, 0x84, 0xC1, 0x84, 0xC2, /* 0x74-0x77 */ + 0x84, 0xC3, 0xB2, 0xD1, 0x84, 0xC4, 0x84, 0xC5, /* 0x78-0x7B */ + 0x84, 0xC6, 0x84, 0xC7, 0x84, 0xC8, 0x84, 0xC9, /* 0x7C-0x7F */ + + 0xB2, 0xD2, 0x84, 0xCA, 0x84, 0xCB, 0x84, 0xCC, /* 0x80-0x83 */ + 0xB2, 0xD3, 0x84, 0xCD, 0x84, 0xCE, 0x84, 0xCF, /* 0x84-0x87 */ + 0xB2, 0xD4, 0x84, 0xD0, 0x84, 0xD1, 0x84, 0xD2, /* 0x88-0x8B */ + 0x84, 0xD3, 0x84, 0xD4, 0x84, 0xD5, 0x84, 0xD6, /* 0x8C-0x8F */ + 0xB2, 0xD5, 0xB2, 0xD6, 0x84, 0xD7, 0x84, 0xD8, /* 0x90-0x93 */ + 0x84, 0xD9, 0xB2, 0xD7, 0x84, 0xDA, 0x84, 0xDB, /* 0x94-0x97 */ + 0x84, 0xDC, 0x84, 0xDD, 0x84, 0xDE, 0x84, 0xDF, /* 0x98-0x9B */ + 0xB2, 0xD8, 0x84, 0xE0, 0x84, 0xE1, 0x84, 0xE2, /* 0x9C-0x9F */ + 0x84, 0xE3, 0x84, 0xE4, 0x84, 0xE5, 0x84, 0xE6, /* 0xA0-0xA3 */ + 0x84, 0xE7, 0x84, 0xE8, 0x84, 0xE9, 0x84, 0xEA, /* 0xA4-0xA7 */ + 0x84, 0xEB, 0x84, 0xEC, 0x84, 0xED, 0x84, 0xEE, /* 0xA8-0xAB */ + 0x84, 0xEF, 0x84, 0xF0, 0x84, 0xF1, 0x84, 0xF2, /* 0xAC-0xAF */ + 0x84, 0xF3, 0x84, 0xF4, 0x84, 0xF5, 0x84, 0xF6, /* 0xB0-0xB3 */ + 0x84, 0xF7, 0x84, 0xF8, 0x84, 0xF9, 0x84, 0xFA, /* 0xB4-0xB7 */ + 0xB2, 0xD9, 0xB2, 0xDA, 0x84, 0xFB, 0x84, 0xFC, /* 0xB8-0xBB */ + 0xB2, 0xDB, 0x84, 0xFD, 0x84, 0xFE, 0x85, 0x41, /* 0xBC-0xBF */ + 0xB2, 0xDC, 0x85, 0x42, 0x85, 0x43, 0x85, 0x44, /* 0xC0-0xC3 */ + 0x85, 0x45, 0x85, 0x46, 0x85, 0x47, 0xB2, 0xDD, /* 0xC4-0xC7 */ + 0xB2, 0xDE, 0xB2, 0xDF, 0x85, 0x48, 0xB2, 0xE0, /* 0xC8-0xCB */ + 0x85, 0x49, 0xB2, 0xE1, 0xB2, 0xE2, 0x85, 0x4A, /* 0xCC-0xCF */ + 0x85, 0x4B, 0x85, 0x4C, 0x85, 0x4D, 0x85, 0x4E, /* 0xD0-0xD3 */ + 0xB2, 0xE3, 0x85, 0x4F, 0x85, 0x50, 0x85, 0x51, /* 0xD4-0xD7 */ + 0x85, 0x52, 0x85, 0x53, 0x85, 0x54, 0x85, 0x55, /* 0xD8-0xDB */ + 0xB2, 0xE4, 0x85, 0x56, 0x85, 0x57, 0x85, 0x58, /* 0xDC-0xDF */ + 0x85, 0x59, 0x85, 0x5A, 0x85, 0x61, 0x85, 0x62, /* 0xE0-0xE3 */ + 0x85, 0x63, 0x85, 0x64, 0x85, 0x65, 0x85, 0x66, /* 0xE4-0xE7 */ + 0xB2, 0xE5, 0xB2, 0xE6, 0x85, 0x67, 0x85, 0x68, /* 0xE8-0xEB */ + 0x85, 0x69, 0x85, 0x6A, 0x85, 0x6B, 0x85, 0x6C, /* 0xEC-0xEF */ + 0xB2, 0xE7, 0xB2, 0xE8, 0x85, 0x6D, 0x85, 0x6E, /* 0xF0-0xF3 */ + 0xB2, 0xE9, 0x85, 0x6F, 0x85, 0x70, 0x85, 0x71, /* 0xF4-0xF7 */ + 0xB2, 0xEA, 0x85, 0x72, 0x85, 0x73, 0x85, 0x74, /* 0xF8-0xFB */ + 0x85, 0x75, 0x85, 0x76, 0x85, 0x77, 0x85, 0x78, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B0[512] = { + 0xB2, 0xEB, 0xB2, 0xEC, 0x85, 0x79, 0x85, 0x7A, /* 0x00-0x03 */ + 0xB2, 0xED, 0x85, 0x81, 0x85, 0x82, 0x85, 0x83, /* 0x04-0x07 */ + 0x85, 0x84, 0x85, 0x85, 0x85, 0x86, 0x85, 0x87, /* 0x08-0x0B */ + 0xB2, 0xEE, 0x85, 0x88, 0x85, 0x89, 0x85, 0x8A, /* 0x0C-0x0F */ + 0xB2, 0xEF, 0x85, 0x8B, 0x85, 0x8C, 0x85, 0x8D, /* 0x10-0x13 */ + 0xB2, 0xF0, 0x85, 0x8E, 0x85, 0x8F, 0x85, 0x90, /* 0x14-0x17 */ + 0x85, 0x91, 0x85, 0x92, 0x85, 0x93, 0x85, 0x94, /* 0x18-0x1B */ + 0xB2, 0xF1, 0xB2, 0xF2, 0x85, 0x95, 0x85, 0x96, /* 0x1C-0x1F */ + 0x85, 0x97, 0x85, 0x98, 0x85, 0x99, 0x85, 0x9A, /* 0x20-0x23 */ + 0x85, 0x9B, 0x85, 0x9C, 0x85, 0x9D, 0x85, 0x9E, /* 0x24-0x27 */ + 0xB2, 0xF3, 0x85, 0x9F, 0x85, 0xA0, 0x85, 0xA1, /* 0x28-0x2B */ + 0x85, 0xA2, 0x85, 0xA3, 0x85, 0xA4, 0x85, 0xA5, /* 0x2C-0x2F */ + 0x85, 0xA6, 0x85, 0xA7, 0x85, 0xA8, 0x85, 0xA9, /* 0x30-0x33 */ + 0x85, 0xAA, 0x85, 0xAB, 0x85, 0xAC, 0x85, 0xAD, /* 0x34-0x37 */ + 0x85, 0xAE, 0x85, 0xAF, 0x85, 0xB0, 0x85, 0xB1, /* 0x38-0x3B */ + 0x85, 0xB2, 0x85, 0xB3, 0x85, 0xB4, 0x85, 0xB5, /* 0x3C-0x3F */ + 0x85, 0xB6, 0x85, 0xB7, 0x85, 0xB8, 0x85, 0xB9, /* 0x40-0x43 */ + 0xB2, 0xF4, 0xB2, 0xF5, 0x85, 0xBA, 0x85, 0xBB, /* 0x44-0x47 */ + 0xB2, 0xF6, 0x85, 0xBC, 0xB2, 0xF7, 0x85, 0xBD, /* 0x48-0x4B */ + 0xB2, 0xF8, 0x85, 0xBE, 0xB2, 0xF9, 0x85, 0xBF, /* 0x4C-0x4F */ + 0x85, 0xC0, 0x85, 0xC1, 0x85, 0xC2, 0xB2, 0xFA, /* 0x50-0x53 */ + 0xB2, 0xFB, 0xB2, 0xFC, 0x85, 0xC3, 0xB2, 0xFD, /* 0x54-0x57 */ + 0x85, 0xC4, 0xB2, 0xFE, 0x85, 0xC5, 0x85, 0xC6, /* 0x58-0x5B */ + 0x85, 0xC7, 0xB3, 0xA1, 0x85, 0xC8, 0x85, 0xC9, /* 0x5C-0x5F */ + 0x85, 0xCA, 0x85, 0xCB, 0x85, 0xCC, 0x85, 0xCD, /* 0x60-0x63 */ + 0x85, 0xCE, 0x85, 0xCF, 0x85, 0xD0, 0x85, 0xD1, /* 0x64-0x67 */ + 0x85, 0xD2, 0x85, 0xD3, 0x85, 0xD4, 0x85, 0xD5, /* 0x68-0x6B */ + 0x85, 0xD6, 0x85, 0xD7, 0x85, 0xD8, 0x85, 0xD9, /* 0x6C-0x6F */ + 0x85, 0xDA, 0x85, 0xDB, 0x85, 0xDC, 0x85, 0xDD, /* 0x70-0x73 */ + 0x85, 0xDE, 0x85, 0xDF, 0x85, 0xE0, 0x85, 0xE1, /* 0x74-0x77 */ + 0x85, 0xE2, 0x85, 0xE3, 0x85, 0xE4, 0x85, 0xE5, /* 0x78-0x7B */ + 0xB3, 0xA2, 0xB3, 0xA3, 0x85, 0xE6, 0x85, 0xE7, /* 0x7C-0x7F */ + + 0xB3, 0xA4, 0x85, 0xE8, 0x85, 0xE9, 0x85, 0xEA, /* 0x80-0x83 */ + 0xB3, 0xA5, 0x85, 0xEB, 0x85, 0xEC, 0x85, 0xED, /* 0x84-0x87 */ + 0x85, 0xEE, 0x85, 0xEF, 0x85, 0xF0, 0x85, 0xF1, /* 0x88-0x8B */ + 0xB3, 0xA6, 0xB3, 0xA7, 0x85, 0xF2, 0xB3, 0xA8, /* 0x8C-0x8F */ + 0x85, 0xF3, 0xB3, 0xA9, 0x85, 0xF4, 0x85, 0xF5, /* 0x90-0x93 */ + 0x85, 0xF6, 0x85, 0xF7, 0x85, 0xF8, 0x85, 0xF9, /* 0x94-0x97 */ + 0xB3, 0xAA, 0xB3, 0xAB, 0xB3, 0xAC, 0x85, 0xFA, /* 0x98-0x9B */ + 0xB3, 0xAD, 0x85, 0xFB, 0x85, 0xFC, 0xB3, 0xAE, /* 0x9C-0x9F */ + 0xB3, 0xAF, 0xB3, 0xB0, 0xB3, 0xB1, 0x85, 0xFD, /* 0xA0-0xA3 */ + 0x85, 0xFE, 0x86, 0x41, 0x86, 0x42, 0x86, 0x43, /* 0xA4-0xA7 */ + 0xB3, 0xB2, 0xB3, 0xB3, 0x86, 0x44, 0xB3, 0xB4, /* 0xA8-0xAB */ + 0xB3, 0xB5, 0xB3, 0xB6, 0xB3, 0xB7, 0xB3, 0xB8, /* 0xAC-0xAF */ + 0x86, 0x45, 0xB3, 0xB9, 0x86, 0x46, 0xB3, 0xBA, /* 0xB0-0xB3 */ + 0xB3, 0xBB, 0xB3, 0xBC, 0x86, 0x47, 0x86, 0x48, /* 0xB4-0xB7 */ + 0xB3, 0xBD, 0x86, 0x49, 0x86, 0x4A, 0x86, 0x4B, /* 0xB8-0xBB */ + 0xB3, 0xBE, 0x86, 0x4C, 0x86, 0x4D, 0x86, 0x4E, /* 0xBC-0xBF */ + 0x86, 0x4F, 0x86, 0x50, 0x86, 0x51, 0x86, 0x52, /* 0xC0-0xC3 */ + 0xB3, 0xBF, 0xB3, 0xC0, 0x86, 0x53, 0xB3, 0xC1, /* 0xC4-0xC7 */ + 0xB3, 0xC2, 0xB3, 0xC3, 0x86, 0x54, 0x86, 0x55, /* 0xC8-0xCB */ + 0x86, 0x56, 0x86, 0x57, 0x86, 0x58, 0x86, 0x59, /* 0xCC-0xCF */ + 0xB3, 0xC4, 0xB3, 0xC5, 0x86, 0x5A, 0x86, 0x61, /* 0xD0-0xD3 */ + 0xB3, 0xC6, 0x86, 0x62, 0x86, 0x63, 0x86, 0x64, /* 0xD4-0xD7 */ + 0xB3, 0xC7, 0x86, 0x65, 0x86, 0x66, 0x86, 0x67, /* 0xD8-0xDB */ + 0x86, 0x68, 0x86, 0x69, 0x86, 0x6A, 0x86, 0x6B, /* 0xDC-0xDF */ + 0xB3, 0xC8, 0x86, 0x6C, 0x86, 0x6D, 0x86, 0x6E, /* 0xE0-0xE3 */ + 0x86, 0x6F, 0xB3, 0xC9, 0x86, 0x70, 0x86, 0x71, /* 0xE4-0xE7 */ + 0x86, 0x72, 0x86, 0x73, 0x86, 0x74, 0x86, 0x75, /* 0xE8-0xEB */ + 0x86, 0x76, 0x86, 0x77, 0x86, 0x78, 0x86, 0x79, /* 0xEC-0xEF */ + 0x86, 0x7A, 0x86, 0x81, 0x86, 0x82, 0x86, 0x83, /* 0xF0-0xF3 */ + 0x86, 0x84, 0x86, 0x85, 0x86, 0x86, 0x86, 0x87, /* 0xF4-0xF7 */ + 0x86, 0x88, 0x86, 0x89, 0x86, 0x8A, 0x86, 0x8B, /* 0xF8-0xFB */ + 0x86, 0x8C, 0x86, 0x8D, 0x86, 0x8E, 0x86, 0x8F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B1[512] = { + 0x86, 0x90, 0x86, 0x91, 0x86, 0x92, 0x86, 0x93, /* 0x00-0x03 */ + 0x86, 0x94, 0x86, 0x95, 0x86, 0x96, 0x86, 0x97, /* 0x04-0x07 */ + 0xB3, 0xCA, 0xB3, 0xCB, 0x86, 0x98, 0xB3, 0xCC, /* 0x08-0x0B */ + 0xB3, 0xCD, 0x86, 0x99, 0x86, 0x9A, 0x86, 0x9B, /* 0x0C-0x0F */ + 0xB3, 0xCE, 0x86, 0x9C, 0xB3, 0xCF, 0xB3, 0xD0, /* 0x10-0x13 */ + 0x86, 0x9D, 0x86, 0x9E, 0x86, 0x9F, 0x86, 0xA0, /* 0x14-0x17 */ + 0xB3, 0xD1, 0xB3, 0xD2, 0x86, 0xA1, 0xB3, 0xD3, /* 0x18-0x1B */ + 0xB3, 0xD4, 0xB3, 0xD5, 0x86, 0xA2, 0x86, 0xA3, /* 0x1C-0x1F */ + 0x86, 0xA4, 0x86, 0xA5, 0x86, 0xA6, 0xB3, 0xD6, /* 0x20-0x23 */ + 0xB3, 0xD7, 0xB3, 0xD8, 0x86, 0xA7, 0x86, 0xA8, /* 0x24-0x27 */ + 0xB3, 0xD9, 0x86, 0xA9, 0x86, 0xAA, 0x86, 0xAB, /* 0x28-0x2B */ + 0xB3, 0xDA, 0x86, 0xAC, 0x86, 0xAD, 0x86, 0xAE, /* 0x2C-0x2F */ + 0x86, 0xAF, 0x86, 0xB0, 0x86, 0xB1, 0x86, 0xB2, /* 0x30-0x33 */ + 0xB3, 0xDB, 0xB3, 0xDC, 0x86, 0xB3, 0xB3, 0xDD, /* 0x34-0x37 */ + 0xB3, 0xDE, 0xB3, 0xDF, 0x86, 0xB4, 0x86, 0xB5, /* 0x38-0x3B */ + 0x86, 0xB6, 0x86, 0xB7, 0x86, 0xB8, 0x86, 0xB9, /* 0x3C-0x3F */ + 0xB3, 0xE0, 0xB3, 0xE1, 0x86, 0xBA, 0x86, 0xBB, /* 0x40-0x43 */ + 0xB3, 0xE2, 0x86, 0xBC, 0x86, 0xBD, 0x86, 0xBE, /* 0x44-0x47 */ + 0xB3, 0xE3, 0x86, 0xBF, 0x86, 0xC0, 0x86, 0xC1, /* 0x48-0x4B */ + 0x86, 0xC2, 0x86, 0xC3, 0x86, 0xC4, 0x86, 0xC5, /* 0x4C-0x4F */ + 0xB3, 0xE4, 0xB3, 0xE5, 0x86, 0xC6, 0x86, 0xC7, /* 0x50-0x53 */ + 0xB3, 0xE6, 0xB3, 0xE7, 0x86, 0xC8, 0x86, 0xC9, /* 0x54-0x57 */ + 0xB3, 0xE8, 0x86, 0xCA, 0x86, 0xCB, 0x86, 0xCC, /* 0x58-0x5B */ + 0xB3, 0xE9, 0x86, 0xCD, 0x86, 0xCE, 0x86, 0xCF, /* 0x5C-0x5F */ + 0xB3, 0xEA, 0x86, 0xD0, 0x86, 0xD1, 0x86, 0xD2, /* 0x60-0x63 */ + 0x86, 0xD3, 0x86, 0xD4, 0x86, 0xD5, 0x86, 0xD6, /* 0x64-0x67 */ + 0x86, 0xD7, 0x86, 0xD8, 0x86, 0xD9, 0x86, 0xDA, /* 0x68-0x6B */ + 0x86, 0xDB, 0x86, 0xDC, 0x86, 0xDD, 0x86, 0xDE, /* 0x6C-0x6F */ + 0x86, 0xDF, 0x86, 0xE0, 0x86, 0xE1, 0x86, 0xE2, /* 0x70-0x73 */ + 0x86, 0xE3, 0x86, 0xE4, 0x86, 0xE5, 0x86, 0xE6, /* 0x74-0x77 */ + 0xB3, 0xEB, 0xB3, 0xEC, 0x86, 0xE7, 0x86, 0xE8, /* 0x78-0x7B */ + 0xB3, 0xED, 0x86, 0xE9, 0x86, 0xEA, 0x86, 0xEB, /* 0x7C-0x7F */ + + 0xB3, 0xEE, 0x86, 0xEC, 0xB3, 0xEF, 0x86, 0xED, /* 0x80-0x83 */ + 0x86, 0xEE, 0x86, 0xEF, 0x86, 0xF0, 0x86, 0xF1, /* 0x84-0x87 */ + 0xB3, 0xF0, 0xB3, 0xF1, 0x86, 0xF2, 0xB3, 0xF2, /* 0x88-0x8B */ + 0x86, 0xF3, 0xB3, 0xF3, 0x86, 0xF4, 0x86, 0xF5, /* 0x8C-0x8F */ + 0x86, 0xF6, 0x86, 0xF7, 0xB3, 0xF4, 0xB3, 0xF5, /* 0x90-0x93 */ + 0xB3, 0xF6, 0x86, 0xF8, 0x86, 0xF9, 0x86, 0xFA, /* 0x94-0x97 */ + 0xB3, 0xF7, 0x86, 0xFB, 0x86, 0xFC, 0x86, 0xFD, /* 0x98-0x9B */ + 0xB3, 0xF8, 0x86, 0xFE, 0x87, 0x41, 0x87, 0x42, /* 0x9C-0x9F */ + 0x87, 0x43, 0x87, 0x44, 0x87, 0x45, 0x87, 0x46, /* 0xA0-0xA3 */ + 0x87, 0x47, 0x87, 0x48, 0x87, 0x49, 0x87, 0x4A, /* 0xA4-0xA7 */ + 0xB3, 0xF9, 0x87, 0x4B, 0x87, 0x4C, 0x87, 0x4D, /* 0xA8-0xAB */ + 0x87, 0x4E, 0x87, 0x4F, 0x87, 0x50, 0x87, 0x51, /* 0xAC-0xAF */ + 0x87, 0x52, 0x87, 0x53, 0x87, 0x54, 0x87, 0x55, /* 0xB0-0xB3 */ + 0x87, 0x56, 0x87, 0x57, 0x87, 0x58, 0x87, 0x59, /* 0xB4-0xB7 */ + 0x87, 0x5A, 0x87, 0x61, 0x87, 0x62, 0x87, 0x63, /* 0xB8-0xBB */ + 0x87, 0x64, 0x87, 0x65, 0x87, 0x66, 0x87, 0x67, /* 0xBC-0xBF */ + 0x87, 0x68, 0x87, 0x69, 0x87, 0x6A, 0x87, 0x6B, /* 0xC0-0xC3 */ + 0x87, 0x6C, 0x87, 0x6D, 0x87, 0x6E, 0x87, 0x6F, /* 0xC4-0xC7 */ + 0x87, 0x70, 0x87, 0x71, 0x87, 0x72, 0x87, 0x73, /* 0xC8-0xCB */ + 0xB3, 0xFA, 0x87, 0x74, 0x87, 0x75, 0x87, 0x76, /* 0xCC-0xCF */ + 0xB3, 0xFB, 0x87, 0x77, 0x87, 0x78, 0x87, 0x79, /* 0xD0-0xD3 */ + 0xB3, 0xFC, 0x87, 0x7A, 0x87, 0x81, 0x87, 0x82, /* 0xD4-0xD7 */ + 0x87, 0x83, 0x87, 0x84, 0x87, 0x85, 0x87, 0x86, /* 0xD8-0xDB */ + 0xB3, 0xFD, 0xB3, 0xFE, 0x87, 0x87, 0xB4, 0xA1, /* 0xDC-0xDF */ + 0x87, 0x88, 0x87, 0x89, 0x87, 0x8A, 0x87, 0x8B, /* 0xE0-0xE3 */ + 0x87, 0x8C, 0x87, 0x8D, 0x87, 0x8E, 0x87, 0x8F, /* 0xE4-0xE7 */ + 0xB4, 0xA2, 0xB4, 0xA3, 0x87, 0x90, 0x87, 0x91, /* 0xE8-0xEB */ + 0xB4, 0xA4, 0x87, 0x92, 0x87, 0x93, 0x87, 0x94, /* 0xEC-0xEF */ + 0xB4, 0xA5, 0x87, 0x95, 0x87, 0x96, 0x87, 0x97, /* 0xF0-0xF3 */ + 0x87, 0x98, 0x87, 0x99, 0x87, 0x9A, 0x87, 0x9B, /* 0xF4-0xF7 */ + 0x87, 0x9C, 0xB4, 0xA6, 0x87, 0x9D, 0xB4, 0xA7, /* 0xF8-0xFB */ + 0x87, 0x9E, 0xB4, 0xA8, 0x87, 0x9F, 0x87, 0xA0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B2[512] = { + 0x87, 0xA1, 0x87, 0xA2, 0x87, 0xA3, 0x87, 0xA4, /* 0x00-0x03 */ + 0xB4, 0xA9, 0xB4, 0xAA, 0x87, 0xA5, 0x87, 0xA6, /* 0x04-0x07 */ + 0xB4, 0xAB, 0x87, 0xA7, 0x87, 0xA8, 0xB4, 0xAC, /* 0x08-0x0B */ + 0xB4, 0xAD, 0x87, 0xA9, 0x87, 0xAA, 0x87, 0xAB, /* 0x0C-0x0F */ + 0x87, 0xAC, 0x87, 0xAD, 0x87, 0xAE, 0x87, 0xAF, /* 0x10-0x13 */ + 0xB4, 0xAE, 0xB4, 0xAF, 0x87, 0xB0, 0xB4, 0xB0, /* 0x14-0x17 */ + 0x87, 0xB1, 0xB4, 0xB1, 0x87, 0xB2, 0x87, 0xB3, /* 0x18-0x1B */ + 0x87, 0xB4, 0x87, 0xB5, 0x87, 0xB6, 0x87, 0xB7, /* 0x1C-0x1F */ + 0xB4, 0xB2, 0x87, 0xB8, 0x87, 0xB9, 0x87, 0xBA, /* 0x20-0x23 */ + 0x87, 0xBB, 0x87, 0xBC, 0x87, 0xBD, 0x87, 0xBE, /* 0x24-0x27 */ + 0x87, 0xBF, 0x87, 0xC0, 0x87, 0xC1, 0x87, 0xC2, /* 0x28-0x2B */ + 0x87, 0xC3, 0x87, 0xC4, 0x87, 0xC5, 0x87, 0xC6, /* 0x2C-0x2F */ + 0x87, 0xC7, 0x87, 0xC8, 0x87, 0xC9, 0x87, 0xCA, /* 0x30-0x33 */ + 0xB4, 0xB3, 0x87, 0xCB, 0x87, 0xCC, 0x87, 0xCD, /* 0x34-0x37 */ + 0x87, 0xCE, 0x87, 0xCF, 0x87, 0xD0, 0x87, 0xD1, /* 0x38-0x3B */ + 0xB4, 0xB4, 0x87, 0xD2, 0x87, 0xD3, 0x87, 0xD4, /* 0x3C-0x3F */ + 0x87, 0xD5, 0x87, 0xD6, 0x87, 0xD7, 0x87, 0xD8, /* 0x40-0x43 */ + 0x87, 0xD9, 0x87, 0xDA, 0x87, 0xDB, 0x87, 0xDC, /* 0x44-0x47 */ + 0x87, 0xDD, 0x87, 0xDE, 0x87, 0xDF, 0x87, 0xE0, /* 0x48-0x4B */ + 0x87, 0xE1, 0x87, 0xE2, 0x87, 0xE3, 0x87, 0xE4, /* 0x4C-0x4F */ + 0x87, 0xE5, 0x87, 0xE6, 0x87, 0xE7, 0x87, 0xE8, /* 0x50-0x53 */ + 0x87, 0xE9, 0x87, 0xEA, 0x87, 0xEB, 0x87, 0xEC, /* 0x54-0x57 */ + 0xB4, 0xB5, 0x87, 0xED, 0x87, 0xEE, 0x87, 0xEF, /* 0x58-0x5B */ + 0xB4, 0xB6, 0x87, 0xF0, 0x87, 0xF1, 0x87, 0xF2, /* 0x5C-0x5F */ + 0xB4, 0xB7, 0x87, 0xF3, 0x87, 0xF4, 0x87, 0xF5, /* 0x60-0x63 */ + 0x87, 0xF6, 0x87, 0xF7, 0x87, 0xF8, 0x87, 0xF9, /* 0x64-0x67 */ + 0xB4, 0xB8, 0xB4, 0xB9, 0x87, 0xFA, 0x87, 0xFB, /* 0x68-0x6B */ + 0x87, 0xFC, 0x87, 0xFD, 0x87, 0xFE, 0x88, 0x41, /* 0x6C-0x6F */ + 0x88, 0x42, 0x88, 0x43, 0x88, 0x44, 0x88, 0x45, /* 0x70-0x73 */ + 0xB4, 0xBA, 0xB4, 0xBB, 0x88, 0x46, 0x88, 0x47, /* 0x74-0x77 */ + 0x88, 0x48, 0x88, 0x49, 0x88, 0x4A, 0x88, 0x4B, /* 0x78-0x7B */ + 0xB4, 0xBC, 0x88, 0x4C, 0x88, 0x4D, 0x88, 0x4E, /* 0x7C-0x7F */ + + 0x88, 0x4F, 0x88, 0x50, 0x88, 0x51, 0x88, 0x52, /* 0x80-0x83 */ + 0xB4, 0xBD, 0xB4, 0xBE, 0x88, 0x53, 0x88, 0x54, /* 0x84-0x87 */ + 0x88, 0x55, 0xB4, 0xBF, 0x88, 0x56, 0x88, 0x57, /* 0x88-0x8B */ + 0x88, 0x58, 0x88, 0x59, 0x88, 0x5A, 0x88, 0x61, /* 0x8C-0x8F */ + 0xB4, 0xC0, 0xB4, 0xC1, 0x88, 0x62, 0x88, 0x63, /* 0x90-0x93 */ + 0xB4, 0xC2, 0x88, 0x64, 0x88, 0x65, 0x88, 0x66, /* 0x94-0x97 */ + 0xB4, 0xC3, 0xB4, 0xC4, 0xB4, 0xC5, 0x88, 0x67, /* 0x98-0x9B */ + 0x88, 0x68, 0x88, 0x69, 0x88, 0x6A, 0x88, 0x6B, /* 0x9C-0x9F */ + 0xB4, 0xC6, 0xB4, 0xC7, 0x88, 0x6C, 0xB4, 0xC8, /* 0xA0-0xA3 */ + 0x88, 0x6D, 0xB4, 0xC9, 0xB4, 0xCA, 0x88, 0x6E, /* 0xA4-0xA7 */ + 0x88, 0x6F, 0x88, 0x70, 0xB4, 0xCB, 0x88, 0x71, /* 0xA8-0xAB */ + 0xB4, 0xCC, 0x88, 0x72, 0x88, 0x73, 0x88, 0x74, /* 0xAC-0xAF */ + 0xB4, 0xCD, 0x88, 0x75, 0x88, 0x76, 0x88, 0x77, /* 0xB0-0xB3 */ + 0xB4, 0xCE, 0x88, 0x78, 0x88, 0x79, 0x88, 0x7A, /* 0xB4-0xB7 */ + 0x88, 0x81, 0x88, 0x82, 0x88, 0x83, 0x88, 0x84, /* 0xB8-0xBB */ + 0x88, 0x85, 0x88, 0x86, 0x88, 0x87, 0x88, 0x88, /* 0xBC-0xBF */ + 0x88, 0x89, 0x88, 0x8A, 0x88, 0x8B, 0x88, 0x8C, /* 0xC0-0xC3 */ + 0x88, 0x8D, 0x88, 0x8E, 0x88, 0x8F, 0x88, 0x90, /* 0xC4-0xC7 */ + 0xB4, 0xCF, 0xB4, 0xD0, 0x88, 0x91, 0x88, 0x92, /* 0xC8-0xCB */ + 0xB4, 0xD1, 0x88, 0x93, 0x88, 0x94, 0x88, 0x95, /* 0xCC-0xCF */ + 0xB4, 0xD2, 0x88, 0x96, 0xB4, 0xD3, 0x88, 0x97, /* 0xD0-0xD3 */ + 0x88, 0x98, 0x88, 0x99, 0x88, 0x9A, 0x88, 0x9B, /* 0xD4-0xD7 */ + 0xB4, 0xD4, 0xB4, 0xD5, 0x88, 0x9C, 0xB4, 0xD6, /* 0xD8-0xDB */ + 0x88, 0x9D, 0xB4, 0xD7, 0x88, 0x9E, 0x88, 0x9F, /* 0xDC-0xDF */ + 0x88, 0xA0, 0x88, 0xA1, 0xB4, 0xD8, 0x88, 0xA2, /* 0xE0-0xE3 */ + 0xB4, 0xD9, 0xB4, 0xDA, 0xB4, 0xDB, 0x88, 0xA3, /* 0xE4-0xE7 */ + 0xB4, 0xDC, 0x88, 0xA4, 0x88, 0xA5, 0xB4, 0xDD, /* 0xE8-0xEB */ + 0xB4, 0xDE, 0xB4, 0xDF, 0xB4, 0xE0, 0xB4, 0xE1, /* 0xEC-0xEF */ + 0x88, 0xA6, 0x88, 0xA7, 0x88, 0xA8, 0xB4, 0xE2, /* 0xF0-0xF3 */ + 0xB4, 0xE3, 0xB4, 0xE4, 0x88, 0xA9, 0xB4, 0xE5, /* 0xF4-0xF7 */ + 0xB4, 0xE6, 0xB4, 0xE7, 0xB4, 0xE8, 0xB4, 0xE9, /* 0xF8-0xFB */ + 0x88, 0xAA, 0x88, 0xAB, 0x88, 0xAC, 0xB4, 0xEA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B3[512] = { + 0xB4, 0xEB, 0xB4, 0xEC, 0x88, 0xAD, 0x88, 0xAE, /* 0x00-0x03 */ + 0xB4, 0xED, 0x88, 0xAF, 0x88, 0xB0, 0x88, 0xB1, /* 0x04-0x07 */ + 0xB4, 0xEE, 0x88, 0xB2, 0x88, 0xB3, 0x88, 0xB4, /* 0x08-0x0B */ + 0x88, 0xB5, 0x88, 0xB6, 0x88, 0xB7, 0x88, 0xB8, /* 0x0C-0x0F */ + 0xB4, 0xEF, 0xB4, 0xF0, 0x88, 0xB9, 0xB4, 0xF1, /* 0x10-0x13 */ + 0xB4, 0xF2, 0xB4, 0xF3, 0x88, 0xBA, 0x88, 0xBB, /* 0x14-0x17 */ + 0x88, 0xBC, 0x88, 0xBD, 0x88, 0xBE, 0x88, 0xBF, /* 0x18-0x1B */ + 0xB4, 0xF4, 0x88, 0xC0, 0x88, 0xC1, 0x88, 0xC2, /* 0x1C-0x1F */ + 0x88, 0xC3, 0x88, 0xC4, 0x88, 0xC5, 0x88, 0xC6, /* 0x20-0x23 */ + 0x88, 0xC7, 0x88, 0xC8, 0x88, 0xC9, 0x88, 0xCA, /* 0x24-0x27 */ + 0x88, 0xCB, 0x88, 0xCC, 0x88, 0xCD, 0x88, 0xCE, /* 0x28-0x2B */ + 0x88, 0xCF, 0x88, 0xD0, 0x88, 0xD1, 0x88, 0xD2, /* 0x2C-0x2F */ + 0x88, 0xD3, 0x88, 0xD4, 0x88, 0xD5, 0x88, 0xD6, /* 0x30-0x33 */ + 0x88, 0xD7, 0x88, 0xD8, 0x88, 0xD9, 0x88, 0xDA, /* 0x34-0x37 */ + 0x88, 0xDB, 0x88, 0xDC, 0x88, 0xDD, 0x88, 0xDE, /* 0x38-0x3B */ + 0x88, 0xDF, 0x88, 0xE0, 0x88, 0xE1, 0x88, 0xE2, /* 0x3C-0x3F */ + 0x88, 0xE3, 0x88, 0xE4, 0x88, 0xE5, 0x88, 0xE6, /* 0x40-0x43 */ + 0x88, 0xE7, 0x88, 0xE8, 0x88, 0xE9, 0x88, 0xEA, /* 0x44-0x47 */ + 0x88, 0xEB, 0x88, 0xEC, 0x88, 0xED, 0x88, 0xEE, /* 0x48-0x4B */ + 0x88, 0xEF, 0x88, 0xF0, 0x88, 0xF1, 0x88, 0xF2, /* 0x4C-0x4F */ + 0x88, 0xF3, 0x88, 0xF4, 0x88, 0xF5, 0x88, 0xF6, /* 0x50-0x53 */ + 0xB4, 0xF5, 0xB4, 0xF6, 0xB4, 0xF7, 0x88, 0xF7, /* 0x54-0x57 */ + 0xB4, 0xF8, 0x88, 0xF8, 0x88, 0xF9, 0xB4, 0xF9, /* 0x58-0x5B */ + 0xB4, 0xFA, 0x88, 0xFA, 0xB4, 0xFB, 0xB4, 0xFC, /* 0x5C-0x5F */ + 0x88, 0xFB, 0x88, 0xFC, 0x88, 0xFD, 0x88, 0xFE, /* 0x60-0x63 */ + 0xB4, 0xFD, 0xB4, 0xFE, 0x89, 0x41, 0xB5, 0xA1, /* 0x64-0x67 */ + 0x89, 0x42, 0xB5, 0xA2, 0x89, 0x43, 0xB5, 0xA3, /* 0x68-0x6B */ + 0x89, 0x44, 0x89, 0x45, 0xB5, 0xA4, 0x89, 0x46, /* 0x6C-0x6F */ + 0xB5, 0xA5, 0xB5, 0xA6, 0x89, 0x47, 0x89, 0x48, /* 0x70-0x73 */ + 0xB5, 0xA7, 0x89, 0x49, 0x89, 0x4A, 0x89, 0x4B, /* 0x74-0x77 */ + 0xB5, 0xA8, 0x89, 0x4C, 0x89, 0x4D, 0x89, 0x4E, /* 0x78-0x7B */ + 0x89, 0x4F, 0x89, 0x50, 0x89, 0x51, 0x89, 0x52, /* 0x7C-0x7F */ + + 0xB5, 0xA9, 0xB5, 0xAA, 0x89, 0x53, 0xB5, 0xAB, /* 0x80-0x83 */ + 0xB5, 0xAC, 0xB5, 0xAD, 0x89, 0x54, 0x89, 0x55, /* 0x84-0x87 */ + 0x89, 0x56, 0x89, 0x57, 0x89, 0x58, 0x89, 0x59, /* 0x88-0x8B */ + 0xB5, 0xAE, 0x89, 0x5A, 0x89, 0x61, 0x89, 0x62, /* 0x8C-0x8F */ + 0xB5, 0xAF, 0x89, 0x63, 0x89, 0x64, 0x89, 0x65, /* 0x90-0x93 */ + 0xB5, 0xB0, 0x89, 0x66, 0x89, 0x67, 0x89, 0x68, /* 0x94-0x97 */ + 0x89, 0x69, 0x89, 0x6A, 0x89, 0x6B, 0x89, 0x6C, /* 0x98-0x9B */ + 0x89, 0x6D, 0x89, 0x6E, 0x89, 0x6F, 0x89, 0x70, /* 0x9C-0x9F */ + 0xB5, 0xB1, 0xB5, 0xB2, 0x89, 0x71, 0x89, 0x72, /* 0xA0-0xA3 */ + 0x89, 0x73, 0x89, 0x74, 0x89, 0x75, 0x89, 0x76, /* 0xA4-0xA7 */ + 0xB5, 0xB3, 0x89, 0x77, 0x89, 0x78, 0x89, 0x79, /* 0xA8-0xAB */ + 0xB5, 0xB4, 0x89, 0x7A, 0x89, 0x81, 0x89, 0x82, /* 0xAC-0xAF */ + 0x89, 0x83, 0x89, 0x84, 0x89, 0x85, 0x89, 0x86, /* 0xB0-0xB3 */ + 0x89, 0x87, 0x89, 0x88, 0x89, 0x89, 0x89, 0x8A, /* 0xB4-0xB7 */ + 0x89, 0x8B, 0x89, 0x8C, 0x89, 0x8D, 0x89, 0x8E, /* 0xB8-0xBB */ + 0x89, 0x8F, 0x89, 0x90, 0x89, 0x91, 0x89, 0x92, /* 0xBC-0xBF */ + 0x89, 0x93, 0x89, 0x94, 0x89, 0x95, 0x89, 0x96, /* 0xC0-0xC3 */ + 0xB5, 0xB5, 0xB5, 0xB6, 0x89, 0x97, 0x89, 0x98, /* 0xC4-0xC7 */ + 0xB5, 0xB7, 0x89, 0x99, 0x89, 0x9A, 0xB5, 0xB8, /* 0xC8-0xCB */ + 0xB5, 0xB9, 0x89, 0x9B, 0xB5, 0xBA, 0x89, 0x9C, /* 0xCC-0xCF */ + 0xB5, 0xBB, 0x89, 0x9D, 0x89, 0x9E, 0x89, 0x9F, /* 0xD0-0xD3 */ + 0xB5, 0xBC, 0xB5, 0xBD, 0x89, 0xA0, 0xB5, 0xBE, /* 0xD4-0xD7 */ + 0x89, 0xA1, 0xB5, 0xBF, 0x89, 0xA2, 0xB5, 0xC0, /* 0xD8-0xDB */ + 0x89, 0xA3, 0xB5, 0xC1, 0x89, 0xA4, 0x89, 0xA5, /* 0xDC-0xDF */ + 0xB5, 0xC2, 0x89, 0xA6, 0x89, 0xA7, 0x89, 0xA8, /* 0xE0-0xE3 */ + 0xB5, 0xC3, 0x89, 0xA9, 0x89, 0xAA, 0x89, 0xAB, /* 0xE4-0xE7 */ + 0xB5, 0xC4, 0x89, 0xAC, 0x89, 0xAD, 0x89, 0xAE, /* 0xE8-0xEB */ + 0x89, 0xAF, 0x89, 0xB0, 0x89, 0xB1, 0x89, 0xB2, /* 0xEC-0xEF */ + 0x89, 0xB3, 0x89, 0xB4, 0x89, 0xB5, 0x89, 0xB6, /* 0xF0-0xF3 */ + 0x89, 0xB7, 0x89, 0xB8, 0x89, 0xB9, 0x89, 0xBA, /* 0xF4-0xF7 */ + 0x89, 0xBB, 0x89, 0xBC, 0x89, 0xBD, 0x89, 0xBE, /* 0xF8-0xFB */ + 0xB5, 0xC5, 0x89, 0xBF, 0x89, 0xC0, 0x89, 0xC1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B4[512] = { + 0x89, 0xC2, 0x89, 0xC3, 0x89, 0xC4, 0x89, 0xC5, /* 0x00-0x03 */ + 0x89, 0xC6, 0x89, 0xC7, 0x89, 0xC8, 0x89, 0xC9, /* 0x04-0x07 */ + 0x89, 0xCA, 0x89, 0xCB, 0x89, 0xCC, 0x89, 0xCD, /* 0x08-0x0B */ + 0x89, 0xCE, 0x89, 0xCF, 0x89, 0xD0, 0x89, 0xD1, /* 0x0C-0x0F */ + 0xB5, 0xC6, 0x89, 0xD2, 0x89, 0xD3, 0x89, 0xD4, /* 0x10-0x13 */ + 0x89, 0xD5, 0x89, 0xD6, 0x89, 0xD7, 0x89, 0xD8, /* 0x14-0x17 */ + 0xB5, 0xC7, 0x89, 0xD9, 0x89, 0xDA, 0x89, 0xDB, /* 0x18-0x1B */ + 0xB5, 0xC8, 0x89, 0xDC, 0x89, 0xDD, 0x89, 0xDE, /* 0x1C-0x1F */ + 0xB5, 0xC9, 0x89, 0xDF, 0x89, 0xE0, 0x89, 0xE1, /* 0x20-0x23 */ + 0x89, 0xE2, 0x89, 0xE3, 0x89, 0xE4, 0x89, 0xE5, /* 0x24-0x27 */ + 0xB5, 0xCA, 0xB5, 0xCB, 0x89, 0xE6, 0xB5, 0xCC, /* 0x28-0x2B */ + 0x89, 0xE7, 0x89, 0xE8, 0x89, 0xE9, 0x89, 0xEA, /* 0x2C-0x2F */ + 0x89, 0xEB, 0x89, 0xEC, 0x89, 0xED, 0x89, 0xEE, /* 0x30-0x33 */ + 0xB5, 0xCD, 0x89, 0xEF, 0x89, 0xF0, 0x89, 0xF1, /* 0x34-0x37 */ + 0x89, 0xF2, 0x89, 0xF3, 0x89, 0xF4, 0x89, 0xF5, /* 0x38-0x3B */ + 0x89, 0xF6, 0x89, 0xF7, 0x89, 0xF8, 0x89, 0xF9, /* 0x3C-0x3F */ + 0x89, 0xFA, 0x89, 0xFB, 0x89, 0xFC, 0x89, 0xFD, /* 0x40-0x43 */ + 0x89, 0xFE, 0x8A, 0x41, 0x8A, 0x42, 0x8A, 0x43, /* 0x44-0x47 */ + 0x8A, 0x44, 0x8A, 0x45, 0x8A, 0x46, 0x8A, 0x47, /* 0x48-0x4B */ + 0x8A, 0x48, 0x8A, 0x49, 0x8A, 0x4A, 0x8A, 0x4B, /* 0x4C-0x4F */ + 0xB5, 0xCE, 0xB5, 0xCF, 0x8A, 0x4C, 0x8A, 0x4D, /* 0x50-0x53 */ + 0xB5, 0xD0, 0x8A, 0x4E, 0x8A, 0x4F, 0x8A, 0x50, /* 0x54-0x57 */ + 0xB5, 0xD1, 0x8A, 0x51, 0x8A, 0x52, 0x8A, 0x53, /* 0x58-0x5B */ + 0x8A, 0x54, 0x8A, 0x55, 0x8A, 0x56, 0x8A, 0x57, /* 0x5C-0x5F */ + 0xB5, 0xD2, 0xB5, 0xD3, 0x8A, 0x58, 0xB5, 0xD4, /* 0x60-0x63 */ + 0x8A, 0x59, 0xB5, 0xD5, 0x8A, 0x5A, 0x8A, 0x61, /* 0x64-0x67 */ + 0x8A, 0x62, 0x8A, 0x63, 0x8A, 0x64, 0x8A, 0x65, /* 0x68-0x6B */ + 0xB5, 0xD6, 0x8A, 0x66, 0x8A, 0x67, 0x8A, 0x68, /* 0x6C-0x6F */ + 0x8A, 0x69, 0x8A, 0x6A, 0x8A, 0x6B, 0x8A, 0x6C, /* 0x70-0x73 */ + 0x8A, 0x6D, 0x8A, 0x6E, 0x8A, 0x6F, 0x8A, 0x70, /* 0x74-0x77 */ + 0x8A, 0x71, 0x8A, 0x72, 0x8A, 0x73, 0x8A, 0x74, /* 0x78-0x7B */ + 0x8A, 0x75, 0x8A, 0x76, 0x8A, 0x77, 0x8A, 0x78, /* 0x7C-0x7F */ + + 0xB5, 0xD7, 0x8A, 0x79, 0x8A, 0x7A, 0x8A, 0x81, /* 0x80-0x83 */ + 0x8A, 0x82, 0x8A, 0x83, 0x8A, 0x84, 0x8A, 0x85, /* 0x84-0x87 */ + 0xB5, 0xD8, 0x8A, 0x86, 0x8A, 0x87, 0x8A, 0x88, /* 0x88-0x8B */ + 0x8A, 0x89, 0x8A, 0x8A, 0x8A, 0x8B, 0x8A, 0x8C, /* 0x8C-0x8F */ + 0x8A, 0x8D, 0x8A, 0x8E, 0x8A, 0x8F, 0x8A, 0x90, /* 0x90-0x93 */ + 0x8A, 0x91, 0x8A, 0x92, 0x8A, 0x93, 0x8A, 0x94, /* 0x94-0x97 */ + 0x8A, 0x95, 0x8A, 0x96, 0x8A, 0x97, 0x8A, 0x98, /* 0x98-0x9B */ + 0x8A, 0x99, 0xB5, 0xD9, 0x8A, 0x9A, 0x8A, 0x9B, /* 0x9C-0x9F */ + 0x8A, 0x9C, 0x8A, 0x9D, 0x8A, 0x9E, 0x8A, 0x9F, /* 0xA0-0xA3 */ + 0xB5, 0xDA, 0x8A, 0xA0, 0x8A, 0xA1, 0x8A, 0xA2, /* 0xA4-0xA7 */ + 0xB5, 0xDB, 0x8A, 0xA3, 0x8A, 0xA4, 0x8A, 0xA5, /* 0xA8-0xAB */ + 0xB5, 0xDC, 0x8A, 0xA6, 0x8A, 0xA7, 0x8A, 0xA8, /* 0xAC-0xAF */ + 0x8A, 0xA9, 0x8A, 0xAA, 0x8A, 0xAB, 0x8A, 0xAC, /* 0xB0-0xB3 */ + 0x8A, 0xAD, 0xB5, 0xDD, 0x8A, 0xAE, 0xB5, 0xDE, /* 0xB4-0xB7 */ + 0x8A, 0xAF, 0xB5, 0xDF, 0x8A, 0xB0, 0x8A, 0xB1, /* 0xB8-0xBB */ + 0x8A, 0xB2, 0x8A, 0xB3, 0x8A, 0xB4, 0x8A, 0xB5, /* 0xBC-0xBF */ + 0xB5, 0xE0, 0x8A, 0xB6, 0x8A, 0xB7, 0x8A, 0xB8, /* 0xC0-0xC3 */ + 0xB5, 0xE1, 0x8A, 0xB9, 0x8A, 0xBA, 0x8A, 0xBB, /* 0xC4-0xC7 */ + 0xB5, 0xE2, 0x8A, 0xBC, 0x8A, 0xBD, 0x8A, 0xBE, /* 0xC8-0xCB */ + 0x8A, 0xBF, 0x8A, 0xC0, 0x8A, 0xC1, 0x8A, 0xC2, /* 0xCC-0xCF */ + 0xB5, 0xE3, 0x8A, 0xC3, 0x8A, 0xC4, 0x8A, 0xC5, /* 0xD0-0xD3 */ + 0x8A, 0xC6, 0xB5, 0xE4, 0x8A, 0xC7, 0x8A, 0xC8, /* 0xD4-0xD7 */ + 0x8A, 0xC9, 0x8A, 0xCA, 0x8A, 0xCB, 0x8A, 0xCC, /* 0xD8-0xDB */ + 0xB5, 0xE5, 0xB5, 0xE6, 0x8A, 0xCD, 0x8A, 0xCE, /* 0xDC-0xDF */ + 0xB5, 0xE7, 0x8A, 0xCF, 0x8A, 0xD0, 0xB5, 0xE8, /* 0xE0-0xE3 */ + 0xB5, 0xE9, 0x8A, 0xD1, 0xB5, 0xEA, 0x8A, 0xD2, /* 0xE4-0xE7 */ + 0x8A, 0xD3, 0x8A, 0xD4, 0x8A, 0xD5, 0x8A, 0xD6, /* 0xE8-0xEB */ + 0xB5, 0xEB, 0xB5, 0xEC, 0x8A, 0xD7, 0xB5, 0xED, /* 0xEC-0xEF */ + 0x8A, 0xD8, 0xB5, 0xEE, 0x8A, 0xD9, 0x8A, 0xDA, /* 0xF0-0xF3 */ + 0x8A, 0xDB, 0x8A, 0xDC, 0x8A, 0xDD, 0x8A, 0xDE, /* 0xF4-0xF7 */ + 0xB5, 0xEF, 0x8A, 0xDF, 0x8A, 0xE0, 0x8A, 0xE1, /* 0xF8-0xFB */ + 0x8A, 0xE2, 0x8A, 0xE3, 0x8A, 0xE4, 0x8A, 0xE5, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B5[512] = { + 0x8A, 0xE6, 0x8A, 0xE7, 0x8A, 0xE8, 0x8A, 0xE9, /* 0x00-0x03 */ + 0x8A, 0xEA, 0x8A, 0xEB, 0x8A, 0xEC, 0x8A, 0xED, /* 0x04-0x07 */ + 0x8A, 0xEE, 0x8A, 0xEF, 0x8A, 0xF0, 0x8A, 0xF1, /* 0x08-0x0B */ + 0x8A, 0xF2, 0x8A, 0xF3, 0x8A, 0xF4, 0x8A, 0xF5, /* 0x0C-0x0F */ + 0x8A, 0xF6, 0x8A, 0xF7, 0x8A, 0xF8, 0x8A, 0xF9, /* 0x10-0x13 */ + 0xB5, 0xF0, 0xB5, 0xF1, 0x8A, 0xFA, 0x8A, 0xFB, /* 0x14-0x17 */ + 0xB5, 0xF2, 0x8A, 0xFC, 0x8A, 0xFD, 0xB5, 0xF3, /* 0x18-0x1B */ + 0xB5, 0xF4, 0x8A, 0xFE, 0x8B, 0x41, 0x8B, 0x42, /* 0x1C-0x1F */ + 0x8B, 0x43, 0x8B, 0x44, 0x8B, 0x45, 0x8B, 0x46, /* 0x20-0x23 */ + 0xB5, 0xF5, 0xB5, 0xF6, 0x8B, 0x47, 0xB5, 0xF7, /* 0x24-0x27 */ + 0xB5, 0xF8, 0xB5, 0xF9, 0xB5, 0xFA, 0x8B, 0x48, /* 0x28-0x2B */ + 0x8B, 0x49, 0x8B, 0x4A, 0x8B, 0x4B, 0x8B, 0x4C, /* 0x2C-0x2F */ + 0xB5, 0xFB, 0xB5, 0xFC, 0x8B, 0x4D, 0x8B, 0x4E, /* 0x30-0x33 */ + 0xB5, 0xFD, 0x8B, 0x4F, 0x8B, 0x50, 0x8B, 0x51, /* 0x34-0x37 */ + 0xB5, 0xFE, 0x8B, 0x52, 0x8B, 0x53, 0x8B, 0x54, /* 0x38-0x3B */ + 0x8B, 0x55, 0x8B, 0x56, 0x8B, 0x57, 0x8B, 0x58, /* 0x3C-0x3F */ + 0xB6, 0xA1, 0xB6, 0xA2, 0x8B, 0x59, 0xB6, 0xA3, /* 0x40-0x43 */ + 0xB6, 0xA4, 0xB6, 0xA5, 0x8B, 0x5A, 0x8B, 0x61, /* 0x44-0x47 */ + 0x8B, 0x62, 0x8B, 0x63, 0x8B, 0x64, 0xB6, 0xA6, /* 0x48-0x4B */ + 0xB6, 0xA7, 0xB6, 0xA8, 0x8B, 0x65, 0x8B, 0x66, /* 0x4C-0x4F */ + 0xB6, 0xA9, 0x8B, 0x67, 0x8B, 0x68, 0x8B, 0x69, /* 0x50-0x53 */ + 0xB6, 0xAA, 0x8B, 0x6A, 0x8B, 0x6B, 0x8B, 0x6C, /* 0x54-0x57 */ + 0x8B, 0x6D, 0x8B, 0x6E, 0x8B, 0x6F, 0x8B, 0x70, /* 0x58-0x5B */ + 0xB6, 0xAB, 0xB6, 0xAC, 0x8B, 0x71, 0xB6, 0xAD, /* 0x5C-0x5F */ + 0xB6, 0xAE, 0xB6, 0xAF, 0x8B, 0x72, 0x8B, 0x73, /* 0x60-0x63 */ + 0x8B, 0x74, 0x8B, 0x75, 0x8B, 0x76, 0x8B, 0x77, /* 0x64-0x67 */ + 0x8B, 0x78, 0x8B, 0x79, 0x8B, 0x7A, 0x8B, 0x81, /* 0x68-0x6B */ + 0x8B, 0x82, 0x8B, 0x83, 0x8B, 0x84, 0x8B, 0x85, /* 0x6C-0x6F */ + 0x8B, 0x86, 0x8B, 0x87, 0x8B, 0x88, 0x8B, 0x89, /* 0x70-0x73 */ + 0x8B, 0x8A, 0x8B, 0x8B, 0x8B, 0x8C, 0x8B, 0x8D, /* 0x74-0x77 */ + 0x8B, 0x8E, 0x8B, 0x8F, 0x8B, 0x90, 0x8B, 0x91, /* 0x78-0x7B */ + 0x8B, 0x92, 0x8B, 0x93, 0x8B, 0x94, 0x8B, 0x95, /* 0x7C-0x7F */ + + 0x8B, 0x96, 0x8B, 0x97, 0x8B, 0x98, 0x8B, 0x99, /* 0x80-0x83 */ + 0x8B, 0x9A, 0x8B, 0x9B, 0x8B, 0x9C, 0x8B, 0x9D, /* 0x84-0x87 */ + 0x8B, 0x9E, 0x8B, 0x9F, 0x8B, 0xA0, 0x8B, 0xA1, /* 0x88-0x8B */ + 0x8B, 0xA2, 0x8B, 0xA3, 0x8B, 0xA4, 0x8B, 0xA5, /* 0x8C-0x8F */ + 0x8B, 0xA6, 0x8B, 0xA7, 0x8B, 0xA8, 0x8B, 0xA9, /* 0x90-0x93 */ + 0x8B, 0xAA, 0x8B, 0xAB, 0x8B, 0xAC, 0x8B, 0xAD, /* 0x94-0x97 */ + 0x8B, 0xAE, 0x8B, 0xAF, 0x8B, 0xB0, 0x8B, 0xB1, /* 0x98-0x9B */ + 0x8B, 0xB2, 0x8B, 0xB3, 0x8B, 0xB4, 0x8B, 0xB5, /* 0x9C-0x9F */ + 0xB6, 0xB0, 0xB6, 0xB1, 0x8B, 0xB6, 0x8B, 0xB7, /* 0xA0-0xA3 */ + 0xB6, 0xB2, 0x8B, 0xB8, 0x8B, 0xB9, 0x8B, 0xBA, /* 0xA4-0xA7 */ + 0xB6, 0xB3, 0x8B, 0xBB, 0xB6, 0xB4, 0xB6, 0xB5, /* 0xA8-0xAB */ + 0x8B, 0xBC, 0x8B, 0xBD, 0x8B, 0xBE, 0x8B, 0xBF, /* 0xAC-0xAF */ + 0xB6, 0xB6, 0xB6, 0xB7, 0x8B, 0xC0, 0xB6, 0xB8, /* 0xB0-0xB3 */ + 0xB6, 0xB9, 0xB6, 0xBA, 0x8B, 0xC1, 0x8B, 0xC2, /* 0xB4-0xB7 */ + 0x8B, 0xC3, 0x8B, 0xC4, 0x8B, 0xC5, 0xB6, 0xBB, /* 0xB8-0xBB */ + 0xB6, 0xBC, 0xB6, 0xBD, 0x8B, 0xC6, 0x8B, 0xC7, /* 0xBC-0xBF */ + 0xB6, 0xBE, 0x8B, 0xC8, 0x8B, 0xC9, 0x8B, 0xCA, /* 0xC0-0xC3 */ + 0xB6, 0xBF, 0x8B, 0xCB, 0x8B, 0xCC, 0x8B, 0xCD, /* 0xC4-0xC7 */ + 0x8B, 0xCE, 0x8B, 0xCF, 0x8B, 0xD0, 0x8B, 0xD1, /* 0xC8-0xCB */ + 0xB6, 0xC0, 0xB6, 0xC1, 0x8B, 0xD2, 0xB6, 0xC2, /* 0xCC-0xCF */ + 0xB6, 0xC3, 0xB6, 0xC4, 0x8B, 0xD3, 0x8B, 0xD4, /* 0xD0-0xD3 */ + 0x8B, 0xD5, 0x8B, 0xD6, 0x8B, 0xD7, 0x8B, 0xD8, /* 0xD4-0xD7 */ + 0xB6, 0xC5, 0x8B, 0xD9, 0x8B, 0xDA, 0x8B, 0xDB, /* 0xD8-0xDB */ + 0x8B, 0xDC, 0x8B, 0xDD, 0x8B, 0xDE, 0x8B, 0xDF, /* 0xDC-0xDF */ + 0x8B, 0xE0, 0x8B, 0xE1, 0x8B, 0xE2, 0x8B, 0xE3, /* 0xE0-0xE3 */ + 0x8B, 0xE4, 0x8B, 0xE5, 0x8B, 0xE6, 0x8B, 0xE7, /* 0xE4-0xE7 */ + 0x8B, 0xE8, 0x8B, 0xE9, 0x8B, 0xEA, 0x8B, 0xEB, /* 0xE8-0xEB */ + 0xB6, 0xC6, 0x8B, 0xEC, 0x8B, 0xED, 0x8B, 0xEE, /* 0xEC-0xEF */ + 0x8B, 0xEF, 0x8B, 0xF0, 0x8B, 0xF1, 0x8B, 0xF2, /* 0xF0-0xF3 */ + 0x8B, 0xF3, 0x8B, 0xF4, 0x8B, 0xF5, 0x8B, 0xF6, /* 0xF4-0xF7 */ + 0x8B, 0xF7, 0x8B, 0xF8, 0x8B, 0xF9, 0x8B, 0xFA, /* 0xF8-0xFB */ + 0x8B, 0xFB, 0x8B, 0xFC, 0x8B, 0xFD, 0x8B, 0xFE, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B6[512] = { + 0x8C, 0x41, 0x8C, 0x42, 0x8C, 0x43, 0x8C, 0x44, /* 0x00-0x03 */ + 0x8C, 0x45, 0x8C, 0x46, 0x8C, 0x47, 0x8C, 0x48, /* 0x04-0x07 */ + 0x8C, 0x49, 0x8C, 0x4A, 0x8C, 0x4B, 0x8C, 0x4C, /* 0x08-0x0B */ + 0x8C, 0x4D, 0x8C, 0x4E, 0x8C, 0x4F, 0x8C, 0x50, /* 0x0C-0x0F */ + 0xB6, 0xC7, 0xB6, 0xC8, 0x8C, 0x51, 0x8C, 0x52, /* 0x10-0x13 */ + 0xB6, 0xC9, 0x8C, 0x53, 0x8C, 0x54, 0x8C, 0x55, /* 0x14-0x17 */ + 0xB6, 0xCA, 0x8C, 0x56, 0x8C, 0x57, 0x8C, 0x58, /* 0x18-0x1B */ + 0x8C, 0x59, 0x8C, 0x5A, 0x8C, 0x61, 0x8C, 0x62, /* 0x1C-0x1F */ + 0x8C, 0x63, 0x8C, 0x64, 0x8C, 0x65, 0x8C, 0x66, /* 0x20-0x23 */ + 0x8C, 0x67, 0xB6, 0xCB, 0x8C, 0x68, 0x8C, 0x69, /* 0x24-0x27 */ + 0x8C, 0x6A, 0x8C, 0x6B, 0x8C, 0x6C, 0x8C, 0x6D, /* 0x28-0x2B */ + 0xB6, 0xCC, 0x8C, 0x6E, 0x8C, 0x6F, 0x8C, 0x70, /* 0x2C-0x2F */ + 0x8C, 0x71, 0x8C, 0x72, 0x8C, 0x73, 0x8C, 0x74, /* 0x30-0x33 */ + 0xB6, 0xCD, 0x8C, 0x75, 0x8C, 0x76, 0x8C, 0x77, /* 0x34-0x37 */ + 0x8C, 0x78, 0x8C, 0x79, 0x8C, 0x7A, 0x8C, 0x81, /* 0x38-0x3B */ + 0x8C, 0x82, 0x8C, 0x83, 0x8C, 0x84, 0x8C, 0x85, /* 0x3C-0x3F */ + 0x8C, 0x86, 0x8C, 0x87, 0x8C, 0x88, 0x8C, 0x89, /* 0x40-0x43 */ + 0x8C, 0x8A, 0x8C, 0x8B, 0x8C, 0x8C, 0x8C, 0x8D, /* 0x44-0x47 */ + 0xB6, 0xCE, 0x8C, 0x8E, 0x8C, 0x8F, 0x8C, 0x90, /* 0x48-0x4B */ + 0x8C, 0x91, 0x8C, 0x92, 0x8C, 0x93, 0x8C, 0x94, /* 0x4C-0x4F */ + 0x8C, 0x95, 0x8C, 0x96, 0x8C, 0x97, 0x8C, 0x98, /* 0x50-0x53 */ + 0x8C, 0x99, 0x8C, 0x9A, 0x8C, 0x9B, 0x8C, 0x9C, /* 0x54-0x57 */ + 0x8C, 0x9D, 0x8C, 0x9E, 0x8C, 0x9F, 0x8C, 0xA0, /* 0x58-0x5B */ + 0x8C, 0xA1, 0x8C, 0xA2, 0x8C, 0xA3, 0x8C, 0xA4, /* 0x5C-0x5F */ + 0x8C, 0xA5, 0x8C, 0xA6, 0x8C, 0xA7, 0x8C, 0xA8, /* 0x60-0x63 */ + 0xB6, 0xCF, 0x8C, 0xA9, 0x8C, 0xAA, 0x8C, 0xAB, /* 0x64-0x67 */ + 0xB6, 0xD0, 0x8C, 0xAC, 0x8C, 0xAD, 0x8C, 0xAE, /* 0x68-0x6B */ + 0x8C, 0xAF, 0x8C, 0xB0, 0x8C, 0xB1, 0x8C, 0xB2, /* 0x6C-0x6F */ + 0x8C, 0xB3, 0x8C, 0xB4, 0x8C, 0xB5, 0x8C, 0xB6, /* 0x70-0x73 */ + 0x8C, 0xB7, 0x8C, 0xB8, 0x8C, 0xB9, 0x8C, 0xBA, /* 0x74-0x77 */ + 0x8C, 0xBB, 0x8C, 0xBC, 0x8C, 0xBD, 0x8C, 0xBE, /* 0x78-0x7B */ + 0x8C, 0xBF, 0x8C, 0xC0, 0x8C, 0xC1, 0x8C, 0xC2, /* 0x7C-0x7F */ + + 0x8C, 0xC3, 0x8C, 0xC4, 0x8C, 0xC5, 0x8C, 0xC6, /* 0x80-0x83 */ + 0x8C, 0xC7, 0x8C, 0xC8, 0x8C, 0xC9, 0x8C, 0xCA, /* 0x84-0x87 */ + 0x8C, 0xCB, 0x8C, 0xCC, 0x8C, 0xCD, 0x8C, 0xCE, /* 0x88-0x8B */ + 0x8C, 0xCF, 0x8C, 0xD0, 0x8C, 0xD1, 0x8C, 0xD2, /* 0x8C-0x8F */ + 0x8C, 0xD3, 0x8C, 0xD4, 0x8C, 0xD5, 0x8C, 0xD6, /* 0x90-0x93 */ + 0x8C, 0xD7, 0x8C, 0xD8, 0x8C, 0xD9, 0x8C, 0xDA, /* 0x94-0x97 */ + 0x8C, 0xDB, 0x8C, 0xDC, 0x8C, 0xDD, 0x8C, 0xDE, /* 0x98-0x9B */ + 0xB6, 0xD1, 0xB6, 0xD2, 0x8C, 0xDF, 0x8C, 0xE0, /* 0x9C-0x9F */ + 0xB6, 0xD3, 0x8C, 0xE1, 0x8C, 0xE2, 0x8C, 0xE3, /* 0xA0-0xA3 */ + 0xB6, 0xD4, 0x8C, 0xE4, 0x8C, 0xE5, 0x8C, 0xE6, /* 0xA4-0xA7 */ + 0x8C, 0xE7, 0x8C, 0xE8, 0x8C, 0xE9, 0xB6, 0xD5, /* 0xA8-0xAB */ + 0xB6, 0xD6, 0x8C, 0xEA, 0x8C, 0xEB, 0x8C, 0xEC, /* 0xAC-0xAF */ + 0x8C, 0xED, 0xB6, 0xD7, 0x8C, 0xEE, 0x8C, 0xEF, /* 0xB0-0xB3 */ + 0x8C, 0xF0, 0x8C, 0xF1, 0x8C, 0xF2, 0x8C, 0xF3, /* 0xB4-0xB7 */ + 0x8C, 0xF4, 0x8C, 0xF5, 0x8C, 0xF6, 0x8C, 0xF7, /* 0xB8-0xBB */ + 0x8C, 0xF8, 0x8C, 0xF9, 0x8C, 0xFA, 0x8C, 0xFB, /* 0xBC-0xBF */ + 0x8C, 0xFC, 0x8C, 0xFD, 0x8C, 0xFE, 0x8D, 0x41, /* 0xC0-0xC3 */ + 0x8D, 0x42, 0x8D, 0x43, 0x8D, 0x44, 0x8D, 0x45, /* 0xC4-0xC7 */ + 0x8D, 0x46, 0x8D, 0x47, 0x8D, 0x48, 0x8D, 0x49, /* 0xC8-0xCB */ + 0x8D, 0x4A, 0x8D, 0x4B, 0x8D, 0x4C, 0x8D, 0x4D, /* 0xCC-0xCF */ + 0x8D, 0x4E, 0x8D, 0x4F, 0x8D, 0x50, 0x8D, 0x51, /* 0xD0-0xD3 */ + 0xB6, 0xD8, 0x8D, 0x52, 0x8D, 0x53, 0x8D, 0x54, /* 0xD4-0xD7 */ + 0x8D, 0x55, 0x8D, 0x56, 0x8D, 0x57, 0x8D, 0x58, /* 0xD8-0xDB */ + 0x8D, 0x59, 0x8D, 0x5A, 0x8D, 0x61, 0x8D, 0x62, /* 0xDC-0xDF */ + 0x8D, 0x63, 0x8D, 0x64, 0x8D, 0x65, 0x8D, 0x66, /* 0xE0-0xE3 */ + 0x8D, 0x67, 0x8D, 0x68, 0x8D, 0x69, 0x8D, 0x6A, /* 0xE4-0xE7 */ + 0x8D, 0x6B, 0x8D, 0x6C, 0x8D, 0x6D, 0x8D, 0x6E, /* 0xE8-0xEB */ + 0x8D, 0x6F, 0x8D, 0x70, 0x8D, 0x71, 0x8D, 0x72, /* 0xEC-0xEF */ + 0xB6, 0xD9, 0x8D, 0x73, 0x8D, 0x74, 0x8D, 0x75, /* 0xF0-0xF3 */ + 0xB6, 0xDA, 0x8D, 0x76, 0x8D, 0x77, 0x8D, 0x78, /* 0xF4-0xF7 */ + 0xB6, 0xDB, 0x8D, 0x79, 0x8D, 0x7A, 0x8D, 0x81, /* 0xF8-0xFB */ + 0x8D, 0x82, 0x8D, 0x83, 0x8D, 0x84, 0x8D, 0x85, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B7[512] = { + 0xB6, 0xDC, 0xB6, 0xDD, 0x8D, 0x86, 0x8D, 0x87, /* 0x00-0x03 */ + 0x8D, 0x88, 0xB6, 0xDE, 0x8D, 0x89, 0x8D, 0x8A, /* 0x04-0x07 */ + 0x8D, 0x8B, 0x8D, 0x8C, 0x8D, 0x8D, 0x8D, 0x8E, /* 0x08-0x0B */ + 0x8D, 0x8F, 0x8D, 0x90, 0x8D, 0x91, 0x8D, 0x92, /* 0x0C-0x0F */ + 0x8D, 0x93, 0x8D, 0x94, 0x8D, 0x95, 0x8D, 0x96, /* 0x10-0x13 */ + 0x8D, 0x97, 0x8D, 0x98, 0x8D, 0x99, 0x8D, 0x9A, /* 0x14-0x17 */ + 0x8D, 0x9B, 0x8D, 0x9C, 0x8D, 0x9D, 0x8D, 0x9E, /* 0x18-0x1B */ + 0x8D, 0x9F, 0x8D, 0xA0, 0x8D, 0xA1, 0x8D, 0xA2, /* 0x1C-0x1F */ + 0x8D, 0xA3, 0x8D, 0xA4, 0x8D, 0xA5, 0x8D, 0xA6, /* 0x20-0x23 */ + 0x8D, 0xA7, 0x8D, 0xA8, 0x8D, 0xA9, 0x8D, 0xAA, /* 0x24-0x27 */ + 0xB6, 0xDF, 0xB6, 0xE0, 0x8D, 0xAB, 0x8D, 0xAC, /* 0x28-0x2B */ + 0xB6, 0xE1, 0x8D, 0xAD, 0x8D, 0xAE, 0xB6, 0xE2, /* 0x2C-0x2F */ + 0xB6, 0xE3, 0x8D, 0xAF, 0x8D, 0xB0, 0x8D, 0xB1, /* 0x30-0x33 */ + 0x8D, 0xB2, 0x8D, 0xB3, 0x8D, 0xB4, 0x8D, 0xB5, /* 0x34-0x37 */ + 0xB6, 0xE4, 0xB6, 0xE5, 0x8D, 0xB6, 0xB6, 0xE6, /* 0x38-0x3B */ + 0x8D, 0xB7, 0x8D, 0xB8, 0x8D, 0xB9, 0x8D, 0xBA, /* 0x3C-0x3F */ + 0x8D, 0xBB, 0x8D, 0xBC, 0x8D, 0xBD, 0x8D, 0xBE, /* 0x40-0x43 */ + 0xB6, 0xE7, 0x8D, 0xBF, 0x8D, 0xC0, 0x8D, 0xC1, /* 0x44-0x47 */ + 0xB6, 0xE8, 0x8D, 0xC2, 0x8D, 0xC3, 0x8D, 0xC4, /* 0x48-0x4B */ + 0xB6, 0xE9, 0x8D, 0xC5, 0x8D, 0xC6, 0x8D, 0xC7, /* 0x4C-0x4F */ + 0x8D, 0xC8, 0x8D, 0xC9, 0x8D, 0xCA, 0x8D, 0xCB, /* 0x50-0x53 */ + 0xB6, 0xEA, 0xB6, 0xEB, 0x8D, 0xCC, 0x8D, 0xCD, /* 0x54-0x57 */ + 0x8D, 0xCE, 0x8D, 0xCF, 0x8D, 0xD0, 0x8D, 0xD1, /* 0x58-0x5B */ + 0x8D, 0xD2, 0x8D, 0xD3, 0x8D, 0xD4, 0x8D, 0xD5, /* 0x5C-0x5F */ + 0xB6, 0xEC, 0x8D, 0xD6, 0x8D, 0xD7, 0x8D, 0xD8, /* 0x60-0x63 */ + 0xB6, 0xED, 0x8D, 0xD9, 0x8D, 0xDA, 0x8D, 0xDB, /* 0x64-0x67 */ + 0xB6, 0xEE, 0x8D, 0xDC, 0x8D, 0xDD, 0x8D, 0xDE, /* 0x68-0x6B */ + 0x8D, 0xDF, 0x8D, 0xE0, 0x8D, 0xE1, 0x8D, 0xE2, /* 0x6C-0x6F */ + 0xB6, 0xEF, 0xB6, 0xF0, 0x8D, 0xE3, 0xB6, 0xF1, /* 0x70-0x73 */ + 0x8D, 0xE4, 0xB6, 0xF2, 0x8D, 0xE5, 0x8D, 0xE6, /* 0x74-0x77 */ + 0x8D, 0xE7, 0x8D, 0xE8, 0x8D, 0xE9, 0x8D, 0xEA, /* 0x78-0x7B */ + 0xB6, 0xF3, 0xB6, 0xF4, 0x8D, 0xEB, 0x8D, 0xEC, /* 0x7C-0x7F */ + + 0xB6, 0xF5, 0x8D, 0xED, 0x8D, 0xEE, 0x8D, 0xEF, /* 0x80-0x83 */ + 0xB6, 0xF6, 0x8D, 0xF0, 0x8D, 0xF1, 0x8D, 0xF2, /* 0x84-0x87 */ + 0x8D, 0xF3, 0x8D, 0xF4, 0x8D, 0xF5, 0x8D, 0xF6, /* 0x88-0x8B */ + 0xB6, 0xF7, 0xB6, 0xF8, 0x8D, 0xF7, 0xB6, 0xF9, /* 0x8C-0x8F */ + 0xB6, 0xFA, 0xB6, 0xFB, 0xB6, 0xFC, 0x8D, 0xF8, /* 0x90-0x93 */ + 0x8D, 0xF9, 0x8D, 0xFA, 0xB6, 0xFD, 0xB6, 0xFE, /* 0x94-0x97 */ + 0xB7, 0xA1, 0xB7, 0xA2, 0x8D, 0xFB, 0x8D, 0xFC, /* 0x98-0x9B */ + 0xB7, 0xA3, 0x8D, 0xFD, 0x8D, 0xFE, 0x8E, 0x41, /* 0x9C-0x9F */ + 0xB7, 0xA4, 0x8E, 0x42, 0x8E, 0x43, 0x8E, 0x44, /* 0xA0-0xA3 */ + 0x8E, 0x45, 0x8E, 0x46, 0x8E, 0x47, 0x8E, 0x48, /* 0xA4-0xA7 */ + 0xB7, 0xA5, 0xB7, 0xA6, 0x8E, 0x49, 0xB7, 0xA7, /* 0xA8-0xAB */ + 0xB7, 0xA8, 0xB7, 0xA9, 0x8E, 0x4A, 0x8E, 0x4B, /* 0xAC-0xAF */ + 0x8E, 0x4C, 0x8E, 0x4D, 0x8E, 0x4E, 0x8E, 0x4F, /* 0xB0-0xB3 */ + 0xB7, 0xAA, 0xB7, 0xAB, 0x8E, 0x50, 0x8E, 0x51, /* 0xB4-0xB7 */ + 0xB7, 0xAC, 0x8E, 0x52, 0x8E, 0x53, 0x8E, 0x54, /* 0xB8-0xBB */ + 0x8E, 0x55, 0x8E, 0x56, 0x8E, 0x57, 0x8E, 0x58, /* 0xBC-0xBF */ + 0x8E, 0x59, 0x8E, 0x5A, 0x8E, 0x61, 0x8E, 0x62, /* 0xC0-0xC3 */ + 0x8E, 0x63, 0x8E, 0x64, 0x8E, 0x65, 0xB7, 0xAD, /* 0xC4-0xC7 */ + 0x8E, 0x66, 0xB7, 0xAE, 0x8E, 0x67, 0x8E, 0x68, /* 0xC8-0xCB */ + 0x8E, 0x69, 0x8E, 0x6A, 0x8E, 0x6B, 0x8E, 0x6C, /* 0xCC-0xCF */ + 0x8E, 0x6D, 0x8E, 0x6E, 0x8E, 0x6F, 0x8E, 0x70, /* 0xD0-0xD3 */ + 0x8E, 0x71, 0x8E, 0x72, 0x8E, 0x73, 0x8E, 0x74, /* 0xD4-0xD7 */ + 0x8E, 0x75, 0x8E, 0x76, 0x8E, 0x77, 0x8E, 0x78, /* 0xD8-0xDB */ + 0x8E, 0x79, 0x8E, 0x7A, 0x8E, 0x81, 0x8E, 0x82, /* 0xDC-0xDF */ + 0x8E, 0x83, 0x8E, 0x84, 0x8E, 0x85, 0x8E, 0x86, /* 0xE0-0xE3 */ + 0x8E, 0x87, 0x8E, 0x88, 0x8E, 0x89, 0x8E, 0x8A, /* 0xE4-0xE7 */ + 0x8E, 0x8B, 0x8E, 0x8C, 0x8E, 0x8D, 0x8E, 0x8E, /* 0xE8-0xEB */ + 0xB7, 0xAF, 0xB7, 0xB0, 0x8E, 0x8F, 0x8E, 0x90, /* 0xEC-0xEF */ + 0xB7, 0xB1, 0x8E, 0x91, 0x8E, 0x92, 0x8E, 0x93, /* 0xF0-0xF3 */ + 0xB7, 0xB2, 0x8E, 0x94, 0x8E, 0x95, 0x8E, 0x96, /* 0xF4-0xF7 */ + 0x8E, 0x97, 0x8E, 0x98, 0x8E, 0x99, 0x8E, 0x9A, /* 0xF8-0xFB */ + 0xB7, 0xB3, 0xB7, 0xB4, 0x8E, 0x9B, 0xB7, 0xB5, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B8[512] = { + 0xB7, 0xB6, 0xB7, 0xB7, 0x8E, 0x9C, 0x8E, 0x9D, /* 0x00-0x03 */ + 0x8E, 0x9E, 0x8E, 0x9F, 0x8E, 0xA0, 0xB7, 0xB8, /* 0x04-0x07 */ + 0xB7, 0xB9, 0xB7, 0xBA, 0x8E, 0xA1, 0x8E, 0xA2, /* 0x08-0x0B */ + 0xB7, 0xBB, 0x8E, 0xA3, 0x8E, 0xA4, 0x8E, 0xA5, /* 0x0C-0x0F */ + 0xB7, 0xBC, 0x8E, 0xA6, 0x8E, 0xA7, 0x8E, 0xA8, /* 0x10-0x13 */ + 0x8E, 0xA9, 0x8E, 0xAA, 0x8E, 0xAB, 0x8E, 0xAC, /* 0x14-0x17 */ + 0xB7, 0xBD, 0xB7, 0xBE, 0x8E, 0xAD, 0xB7, 0xBF, /* 0x18-0x1B */ + 0x8E, 0xAE, 0xB7, 0xC0, 0x8E, 0xAF, 0x8E, 0xB0, /* 0x1C-0x1F */ + 0x8E, 0xB1, 0x8E, 0xB2, 0x8E, 0xB3, 0x8E, 0xB4, /* 0x20-0x23 */ + 0xB7, 0xC1, 0xB7, 0xC2, 0x8E, 0xB5, 0x8E, 0xB6, /* 0x24-0x27 */ + 0xB7, 0xC3, 0x8E, 0xB7, 0x8E, 0xB8, 0x8E, 0xB9, /* 0x28-0x2B */ + 0xB7, 0xC4, 0x8E, 0xBA, 0x8E, 0xBB, 0x8E, 0xBC, /* 0x2C-0x2F */ + 0x8E, 0xBD, 0x8E, 0xBE, 0x8E, 0xBF, 0x8E, 0xC0, /* 0x30-0x33 */ + 0xB7, 0xC5, 0xB7, 0xC6, 0x8E, 0xC1, 0xB7, 0xC7, /* 0x34-0x37 */ + 0xB7, 0xC8, 0xB7, 0xC9, 0x8E, 0xC2, 0x8E, 0xC3, /* 0x38-0x3B */ + 0x8E, 0xC4, 0x8E, 0xC5, 0x8E, 0xC6, 0x8E, 0xC7, /* 0x3C-0x3F */ + 0xB7, 0xCA, 0x8E, 0xC8, 0x8E, 0xC9, 0x8E, 0xCA, /* 0x40-0x43 */ + 0xB7, 0xCB, 0x8E, 0xCB, 0x8E, 0xCC, 0x8E, 0xCD, /* 0x44-0x47 */ + 0x8E, 0xCE, 0x8E, 0xCF, 0x8E, 0xD0, 0x8E, 0xD1, /* 0x48-0x4B */ + 0x8E, 0xD2, 0x8E, 0xD3, 0x8E, 0xD4, 0x8E, 0xD5, /* 0x4C-0x4F */ + 0x8E, 0xD6, 0xB7, 0xCC, 0x8E, 0xD7, 0xB7, 0xCD, /* 0x50-0x53 */ + 0x8E, 0xD8, 0x8E, 0xD9, 0x8E, 0xDA, 0x8E, 0xDB, /* 0x54-0x57 */ + 0x8E, 0xDC, 0x8E, 0xDD, 0x8E, 0xDE, 0x8E, 0xDF, /* 0x58-0x5B */ + 0xB7, 0xCE, 0xB7, 0xCF, 0x8E, 0xE0, 0x8E, 0xE1, /* 0x5C-0x5F */ + 0xB7, 0xD0, 0x8E, 0xE2, 0x8E, 0xE3, 0x8E, 0xE4, /* 0x60-0x63 */ + 0xB7, 0xD1, 0x8E, 0xE5, 0x8E, 0xE6, 0x8E, 0xE7, /* 0x64-0x67 */ + 0x8E, 0xE8, 0x8E, 0xE9, 0x8E, 0xEA, 0x8E, 0xEB, /* 0x68-0x6B */ + 0xB7, 0xD2, 0xB7, 0xD3, 0x8E, 0xEC, 0xB7, 0xD4, /* 0x6C-0x6F */ + 0x8E, 0xED, 0xB7, 0xD5, 0x8E, 0xEE, 0x8E, 0xEF, /* 0x70-0x73 */ + 0x8E, 0xF0, 0x8E, 0xF1, 0x8E, 0xF2, 0x8E, 0xF3, /* 0x74-0x77 */ + 0xB7, 0xD6, 0x8E, 0xF4, 0x8E, 0xF5, 0x8E, 0xF6, /* 0x78-0x7B */ + 0xB7, 0xD7, 0x8E, 0xF7, 0x8E, 0xF8, 0x8E, 0xF9, /* 0x7C-0x7F */ + + 0x8E, 0xFA, 0x8E, 0xFB, 0x8E, 0xFC, 0x8E, 0xFD, /* 0x80-0x83 */ + 0x8E, 0xFE, 0x8F, 0x41, 0x8F, 0x42, 0x8F, 0x43, /* 0x84-0x87 */ + 0x8F, 0x44, 0x8F, 0x45, 0x8F, 0x46, 0x8F, 0x47, /* 0x88-0x8B */ + 0x8F, 0x48, 0xB7, 0xD8, 0x8F, 0x49, 0x8F, 0x4A, /* 0x8C-0x8F */ + 0x8F, 0x4B, 0x8F, 0x4C, 0x8F, 0x4D, 0x8F, 0x4E, /* 0x90-0x93 */ + 0x8F, 0x4F, 0x8F, 0x50, 0x8F, 0x51, 0x8F, 0x52, /* 0x94-0x97 */ + 0x8F, 0x53, 0x8F, 0x54, 0x8F, 0x55, 0x8F, 0x56, /* 0x98-0x9B */ + 0x8F, 0x57, 0x8F, 0x58, 0x8F, 0x59, 0x8F, 0x5A, /* 0x9C-0x9F */ + 0x8F, 0x61, 0x8F, 0x62, 0x8F, 0x63, 0x8F, 0x64, /* 0xA0-0xA3 */ + 0x8F, 0x65, 0x8F, 0x66, 0x8F, 0x67, 0x8F, 0x68, /* 0xA4-0xA7 */ + 0xB7, 0xD9, 0x8F, 0x69, 0x8F, 0x6A, 0x8F, 0x6B, /* 0xA8-0xAB */ + 0x8F, 0x6C, 0x8F, 0x6D, 0x8F, 0x6E, 0x8F, 0x6F, /* 0xAC-0xAF */ + 0xB7, 0xDA, 0x8F, 0x70, 0x8F, 0x71, 0x8F, 0x72, /* 0xB0-0xB3 */ + 0xB7, 0xDB, 0x8F, 0x73, 0x8F, 0x74, 0x8F, 0x75, /* 0xB4-0xB7 */ + 0xB7, 0xDC, 0x8F, 0x76, 0x8F, 0x77, 0x8F, 0x78, /* 0xB8-0xBB */ + 0x8F, 0x79, 0x8F, 0x7A, 0x8F, 0x81, 0x8F, 0x82, /* 0xBC-0xBF */ + 0xB7, 0xDD, 0xB7, 0xDE, 0x8F, 0x83, 0xB7, 0xDF, /* 0xC0-0xC3 */ + 0x8F, 0x84, 0xB7, 0xE0, 0x8F, 0x85, 0x8F, 0x86, /* 0xC4-0xC7 */ + 0x8F, 0x87, 0x8F, 0x88, 0x8F, 0x89, 0x8F, 0x8A, /* 0xC8-0xCB */ + 0xB7, 0xE1, 0x8F, 0x8B, 0x8F, 0x8C, 0x8F, 0x8D, /* 0xCC-0xCF */ + 0xB7, 0xE2, 0x8F, 0x8E, 0x8F, 0x8F, 0x8F, 0x90, /* 0xD0-0xD3 */ + 0xB7, 0xE3, 0x8F, 0x91, 0x8F, 0x92, 0x8F, 0x93, /* 0xD4-0xD7 */ + 0x8F, 0x94, 0x8F, 0x95, 0x8F, 0x96, 0x8F, 0x97, /* 0xD8-0xDB */ + 0x8F, 0x98, 0xB7, 0xE4, 0x8F, 0x99, 0xB7, 0xE5, /* 0xDC-0xDF */ + 0x8F, 0x9A, 0xB7, 0xE6, 0x8F, 0x9B, 0x8F, 0x9C, /* 0xE0-0xE3 */ + 0x8F, 0x9D, 0x8F, 0x9E, 0x8F, 0x9F, 0x8F, 0xA0, /* 0xE4-0xE7 */ + 0xB7, 0xE7, 0xB7, 0xE8, 0x8F, 0xA1, 0x8F, 0xA2, /* 0xE8-0xEB */ + 0xB7, 0xE9, 0x8F, 0xA3, 0x8F, 0xA4, 0x8F, 0xA5, /* 0xEC-0xEF */ + 0xB7, 0xEA, 0x8F, 0xA6, 0x8F, 0xA7, 0x8F, 0xA8, /* 0xF0-0xF3 */ + 0x8F, 0xA9, 0x8F, 0xAA, 0x8F, 0xAB, 0x8F, 0xAC, /* 0xF4-0xF7 */ + 0xB7, 0xEB, 0xB7, 0xEC, 0x8F, 0xAD, 0xB7, 0xED, /* 0xF8-0xFB */ + 0x8F, 0xAE, 0xB7, 0xEE, 0x8F, 0xAF, 0x8F, 0xB0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_B9[512] = { + 0x8F, 0xB1, 0x8F, 0xB2, 0x8F, 0xB3, 0x8F, 0xB4, /* 0x00-0x03 */ + 0xB7, 0xEF, 0x8F, 0xB5, 0x8F, 0xB6, 0x8F, 0xB7, /* 0x04-0x07 */ + 0x8F, 0xB8, 0x8F, 0xB9, 0x8F, 0xBA, 0x8F, 0xBB, /* 0x08-0x0B */ + 0x8F, 0xBC, 0x8F, 0xBD, 0x8F, 0xBE, 0x8F, 0xBF, /* 0x0C-0x0F */ + 0x8F, 0xC0, 0x8F, 0xC1, 0x8F, 0xC2, 0x8F, 0xC3, /* 0x10-0x13 */ + 0x8F, 0xC4, 0x8F, 0xC5, 0x8F, 0xC6, 0x8F, 0xC7, /* 0x14-0x17 */ + 0xB7, 0xF0, 0x8F, 0xC8, 0x8F, 0xC9, 0x8F, 0xCA, /* 0x18-0x1B */ + 0x8F, 0xCB, 0x8F, 0xCC, 0x8F, 0xCD, 0x8F, 0xCE, /* 0x1C-0x1F */ + 0xB7, 0xF1, 0x8F, 0xCF, 0x8F, 0xD0, 0x8F, 0xD1, /* 0x20-0x23 */ + 0x8F, 0xD2, 0x8F, 0xD3, 0x8F, 0xD4, 0x8F, 0xD5, /* 0x24-0x27 */ + 0x8F, 0xD6, 0x8F, 0xD7, 0x8F, 0xD8, 0x8F, 0xD9, /* 0x28-0x2B */ + 0x8F, 0xDA, 0x8F, 0xDB, 0x8F, 0xDC, 0x8F, 0xDD, /* 0x2C-0x2F */ + 0x8F, 0xDE, 0x8F, 0xDF, 0x8F, 0xE0, 0x8F, 0xE1, /* 0x30-0x33 */ + 0x8F, 0xE2, 0x8F, 0xE3, 0x8F, 0xE4, 0x8F, 0xE5, /* 0x34-0x37 */ + 0x8F, 0xE6, 0x8F, 0xE7, 0x8F, 0xE8, 0x8F, 0xE9, /* 0x38-0x3B */ + 0xB7, 0xF2, 0xB7, 0xF3, 0x8F, 0xEA, 0x8F, 0xEB, /* 0x3C-0x3F */ + 0xB7, 0xF4, 0x8F, 0xEC, 0x8F, 0xED, 0x8F, 0xEE, /* 0x40-0x43 */ + 0xB7, 0xF5, 0x8F, 0xEF, 0x8F, 0xF0, 0x8F, 0xF1, /* 0x44-0x47 */ + 0x8F, 0xF2, 0x8F, 0xF3, 0x8F, 0xF4, 0x8F, 0xF5, /* 0x48-0x4B */ + 0xB7, 0xF6, 0x8F, 0xF6, 0x8F, 0xF7, 0xB7, 0xF7, /* 0x4C-0x4F */ + 0x8F, 0xF8, 0xB7, 0xF8, 0x8F, 0xF9, 0x8F, 0xFA, /* 0x50-0x53 */ + 0x8F, 0xFB, 0x8F, 0xFC, 0x8F, 0xFD, 0x8F, 0xFE, /* 0x54-0x57 */ + 0xB7, 0xF9, 0xB7, 0xFA, 0x90, 0x41, 0x90, 0x42, /* 0x58-0x5B */ + 0xB7, 0xFB, 0x90, 0x43, 0x90, 0x44, 0x90, 0x45, /* 0x5C-0x5F */ + 0xB7, 0xFC, 0x90, 0x46, 0x90, 0x47, 0x90, 0x48, /* 0x60-0x63 */ + 0x90, 0x49, 0x90, 0x4A, 0x90, 0x4B, 0x90, 0x4C, /* 0x64-0x67 */ + 0xB7, 0xFD, 0xB7, 0xFE, 0x90, 0x4D, 0xB8, 0xA1, /* 0x68-0x6B */ + 0x90, 0x4E, 0xB8, 0xA2, 0x90, 0x4F, 0x90, 0x50, /* 0x6C-0x6F */ + 0x90, 0x51, 0x90, 0x52, 0x90, 0x53, 0x90, 0x54, /* 0x70-0x73 */ + 0xB8, 0xA3, 0xB8, 0xA4, 0x90, 0x55, 0x90, 0x56, /* 0x74-0x77 */ + 0xB8, 0xA5, 0x90, 0x57, 0x90, 0x58, 0x90, 0x59, /* 0x78-0x7B */ + 0xB8, 0xA6, 0x90, 0x5A, 0x90, 0x61, 0x90, 0x62, /* 0x7C-0x7F */ + + 0x90, 0x63, 0x90, 0x64, 0x90, 0x65, 0x90, 0x66, /* 0x80-0x83 */ + 0xB8, 0xA7, 0xB8, 0xA8, 0x90, 0x67, 0xB8, 0xA9, /* 0x84-0x87 */ + 0x90, 0x68, 0xB8, 0xAA, 0xB8, 0xAB, 0x90, 0x69, /* 0x88-0x8B */ + 0x90, 0x6A, 0xB8, 0xAC, 0xB8, 0xAD, 0x90, 0x6B, /* 0x8C-0x8F */ + 0x90, 0x6C, 0x90, 0x6D, 0x90, 0x6E, 0x90, 0x6F, /* 0x90-0x93 */ + 0x90, 0x70, 0x90, 0x71, 0x90, 0x72, 0x90, 0x73, /* 0x94-0x97 */ + 0x90, 0x74, 0x90, 0x75, 0x90, 0x76, 0x90, 0x77, /* 0x98-0x9B */ + 0x90, 0x78, 0x90, 0x79, 0x90, 0x7A, 0x90, 0x81, /* 0x9C-0x9F */ + 0x90, 0x82, 0x90, 0x83, 0x90, 0x84, 0x90, 0x85, /* 0xA0-0xA3 */ + 0x90, 0x86, 0x90, 0x87, 0x90, 0x88, 0x90, 0x89, /* 0xA4-0xA7 */ + 0x90, 0x8A, 0x90, 0x8B, 0x90, 0x8C, 0x90, 0x8D, /* 0xA8-0xAB */ + 0xB8, 0xAE, 0xB8, 0xAF, 0x90, 0x8E, 0x90, 0x8F, /* 0xAC-0xAF */ + 0xB8, 0xB0, 0x90, 0x90, 0x90, 0x91, 0x90, 0x92, /* 0xB0-0xB3 */ + 0xB8, 0xB1, 0x90, 0x93, 0x90, 0x94, 0x90, 0x95, /* 0xB4-0xB7 */ + 0x90, 0x96, 0x90, 0x97, 0x90, 0x98, 0x90, 0x99, /* 0xB8-0xBB */ + 0xB8, 0xB2, 0xB8, 0xB3, 0x90, 0x9A, 0xB8, 0xB4, /* 0xBC-0xBF */ + 0x90, 0x9B, 0xB8, 0xB5, 0x90, 0x9C, 0x90, 0x9D, /* 0xC0-0xC3 */ + 0x90, 0x9E, 0x90, 0x9F, 0x90, 0xA0, 0x90, 0xA1, /* 0xC4-0xC7 */ + 0xB8, 0xB6, 0xB8, 0xB7, 0x90, 0xA2, 0x90, 0xA3, /* 0xC8-0xCB */ + 0xB8, 0xB8, 0x90, 0xA4, 0xB8, 0xB9, 0xB8, 0xBA, /* 0xCC-0xCF */ + 0xB8, 0xBB, 0xB8, 0xBC, 0xB8, 0xBD, 0x90, 0xA5, /* 0xD0-0xD3 */ + 0x90, 0xA6, 0x90, 0xA7, 0x90, 0xA8, 0x90, 0xA9, /* 0xD4-0xD7 */ + 0xB8, 0xBE, 0xB8, 0xBF, 0x90, 0xAA, 0xB8, 0xC0, /* 0xD8-0xDB */ + 0x90, 0xAB, 0xB8, 0xC1, 0xB8, 0xC2, 0x90, 0xAC, /* 0xDC-0xDF */ + 0x90, 0xAD, 0xB8, 0xC3, 0x90, 0xAE, 0xB8, 0xC4, /* 0xE0-0xE3 */ + 0xB8, 0xC5, 0xB8, 0xC6, 0x90, 0xAF, 0x90, 0xB0, /* 0xE4-0xE7 */ + 0xB8, 0xC7, 0x90, 0xB1, 0x90, 0xB2, 0x90, 0xB3, /* 0xE8-0xEB */ + 0xB8, 0xC8, 0x90, 0xB4, 0x90, 0xB5, 0x90, 0xB6, /* 0xEC-0xEF */ + 0x90, 0xB7, 0x90, 0xB8, 0x90, 0xB9, 0x90, 0xBA, /* 0xF0-0xF3 */ + 0xB8, 0xC9, 0xB8, 0xCA, 0x90, 0xBB, 0xB8, 0xCB, /* 0xF4-0xF7 */ + 0xB8, 0xCC, 0xB8, 0xCD, 0xB8, 0xCE, 0x90, 0xBC, /* 0xF8-0xFB */ + 0x90, 0xBD, 0x90, 0xBE, 0x90, 0xBF, 0x90, 0xC0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_BA[512] = { + 0xB8, 0xCF, 0xB8, 0xD0, 0x90, 0xC1, 0x90, 0xC2, /* 0x00-0x03 */ + 0x90, 0xC3, 0x90, 0xC4, 0x90, 0xC5, 0x90, 0xC6, /* 0x04-0x07 */ + 0xB8, 0xD1, 0x90, 0xC7, 0x90, 0xC8, 0x90, 0xC9, /* 0x08-0x0B */ + 0x90, 0xCA, 0x90, 0xCB, 0x90, 0xCC, 0x90, 0xCD, /* 0x0C-0x0F */ + 0x90, 0xCE, 0x90, 0xCF, 0x90, 0xD0, 0x90, 0xD1, /* 0x10-0x13 */ + 0x90, 0xD2, 0xB8, 0xD2, 0x90, 0xD3, 0x90, 0xD4, /* 0x14-0x17 */ + 0x90, 0xD5, 0x90, 0xD6, 0x90, 0xD7, 0x90, 0xD8, /* 0x18-0x1B */ + 0x90, 0xD9, 0x90, 0xDA, 0x90, 0xDB, 0x90, 0xDC, /* 0x1C-0x1F */ + 0x90, 0xDD, 0x90, 0xDE, 0x90, 0xDF, 0x90, 0xE0, /* 0x20-0x23 */ + 0x90, 0xE1, 0x90, 0xE2, 0x90, 0xE3, 0x90, 0xE4, /* 0x24-0x27 */ + 0x90, 0xE5, 0x90, 0xE6, 0x90, 0xE7, 0x90, 0xE8, /* 0x28-0x2B */ + 0x90, 0xE9, 0x90, 0xEA, 0x90, 0xEB, 0x90, 0xEC, /* 0x2C-0x2F */ + 0x90, 0xED, 0x90, 0xEE, 0x90, 0xEF, 0x90, 0xF0, /* 0x30-0x33 */ + 0x90, 0xF1, 0x90, 0xF2, 0x90, 0xF3, 0x90, 0xF4, /* 0x34-0x37 */ + 0xB8, 0xD3, 0xB8, 0xD4, 0x90, 0xF5, 0x90, 0xF6, /* 0x38-0x3B */ + 0xB8, 0xD5, 0x90, 0xF7, 0x90, 0xF8, 0x90, 0xF9, /* 0x3C-0x3F */ + 0xB8, 0xD6, 0x90, 0xFA, 0xB8, 0xD7, 0x90, 0xFB, /* 0x40-0x43 */ + 0x90, 0xFC, 0x90, 0xFD, 0x90, 0xFE, 0x91, 0x41, /* 0x44-0x47 */ + 0xB8, 0xD8, 0xB8, 0xD9, 0x91, 0x42, 0xB8, 0xDA, /* 0x48-0x4B */ + 0x91, 0x43, 0xB8, 0xDB, 0xB8, 0xDC, 0x91, 0x44, /* 0x4C-0x4F */ + 0x91, 0x45, 0x91, 0x46, 0x91, 0x47, 0xB8, 0xDD, /* 0x50-0x53 */ + 0xB8, 0xDE, 0xB8, 0xDF, 0x91, 0x48, 0x91, 0x49, /* 0x54-0x57 */ + 0xB8, 0xE0, 0x91, 0x4A, 0x91, 0x4B, 0x91, 0x4C, /* 0x58-0x5B */ + 0xB8, 0xE1, 0x91, 0x4D, 0x91, 0x4E, 0x91, 0x4F, /* 0x5C-0x5F */ + 0x91, 0x50, 0x91, 0x51, 0x91, 0x52, 0x91, 0x53, /* 0x60-0x63 */ + 0xB8, 0xE2, 0xB8, 0xE3, 0x91, 0x54, 0xB8, 0xE4, /* 0x64-0x67 */ + 0xB8, 0xE5, 0xB8, 0xE6, 0x91, 0x55, 0x91, 0x56, /* 0x68-0x6B */ + 0x91, 0x57, 0x91, 0x58, 0x91, 0x59, 0x91, 0x5A, /* 0x6C-0x6F */ + 0xB8, 0xE7, 0xB8, 0xE8, 0x91, 0x61, 0x91, 0x62, /* 0x70-0x73 */ + 0xB8, 0xE9, 0x91, 0x63, 0x91, 0x64, 0x91, 0x65, /* 0x74-0x77 */ + 0xB8, 0xEA, 0x91, 0x66, 0x91, 0x67, 0x91, 0x68, /* 0x78-0x7B */ + 0x91, 0x69, 0x91, 0x6A, 0x91, 0x6B, 0x91, 0x6C, /* 0x7C-0x7F */ + + 0x91, 0x6D, 0x91, 0x6E, 0x91, 0x6F, 0xB8, 0xEB, /* 0x80-0x83 */ + 0xB8, 0xEC, 0xB8, 0xED, 0x91, 0x70, 0xB8, 0xEE, /* 0x84-0x87 */ + 0x91, 0x71, 0x91, 0x72, 0x91, 0x73, 0x91, 0x74, /* 0x88-0x8B */ + 0xB8, 0xEF, 0x91, 0x75, 0x91, 0x76, 0x91, 0x77, /* 0x8C-0x8F */ + 0x91, 0x78, 0x91, 0x79, 0x91, 0x7A, 0x91, 0x81, /* 0x90-0x93 */ + 0x91, 0x82, 0x91, 0x83, 0x91, 0x84, 0x91, 0x85, /* 0x94-0x97 */ + 0x91, 0x86, 0x91, 0x87, 0x91, 0x88, 0x91, 0x89, /* 0x98-0x9B */ + 0x91, 0x8A, 0x91, 0x8B, 0x91, 0x8C, 0x91, 0x8D, /* 0x9C-0x9F */ + 0x91, 0x8E, 0x91, 0x8F, 0x91, 0x90, 0x91, 0x91, /* 0xA0-0xA3 */ + 0x91, 0x92, 0x91, 0x93, 0x91, 0x94, 0x91, 0x95, /* 0xA4-0xA7 */ + 0xB8, 0xF0, 0xB8, 0xF1, 0x91, 0x96, 0xB8, 0xF2, /* 0xA8-0xAB */ + 0xB8, 0xF3, 0x91, 0x97, 0x91, 0x98, 0x91, 0x99, /* 0xAC-0xAF */ + 0xB8, 0xF4, 0x91, 0x9A, 0xB8, 0xF5, 0x91, 0x9B, /* 0xB0-0xB3 */ + 0x91, 0x9C, 0x91, 0x9D, 0x91, 0x9E, 0x91, 0x9F, /* 0xB4-0xB7 */ + 0xB8, 0xF6, 0xB8, 0xF7, 0x91, 0xA0, 0xB8, 0xF8, /* 0xB8-0xBB */ + 0x91, 0xA1, 0xB8, 0xF9, 0x91, 0xA2, 0x91, 0xA3, /* 0xBC-0xBF */ + 0x91, 0xA4, 0x91, 0xA5, 0x91, 0xA6, 0x91, 0xA7, /* 0xC0-0xC3 */ + 0xB8, 0xFA, 0x91, 0xA8, 0x91, 0xA9, 0x91, 0xAA, /* 0xC4-0xC7 */ + 0xB8, 0xFB, 0x91, 0xAB, 0x91, 0xAC, 0x91, 0xAD, /* 0xC8-0xCB */ + 0x91, 0xAE, 0x91, 0xAF, 0x91, 0xB0, 0x91, 0xB1, /* 0xCC-0xCF */ + 0x91, 0xB2, 0x91, 0xB3, 0x91, 0xB4, 0x91, 0xB5, /* 0xD0-0xD3 */ + 0x91, 0xB6, 0x91, 0xB7, 0x91, 0xB8, 0x91, 0xB9, /* 0xD4-0xD7 */ + 0xB8, 0xFC, 0xB8, 0xFD, 0x91, 0xBA, 0x91, 0xBB, /* 0xD8-0xDB */ + 0x91, 0xBC, 0x91, 0xBD, 0x91, 0xBE, 0x91, 0xBF, /* 0xDC-0xDF */ + 0x91, 0xC0, 0x91, 0xC1, 0x91, 0xC2, 0x91, 0xC3, /* 0xE0-0xE3 */ + 0x91, 0xC4, 0x91, 0xC5, 0x91, 0xC6, 0x91, 0xC7, /* 0xE4-0xE7 */ + 0x91, 0xC8, 0x91, 0xC9, 0x91, 0xCA, 0x91, 0xCB, /* 0xE8-0xEB */ + 0x91, 0xCC, 0x91, 0xCD, 0x91, 0xCE, 0x91, 0xCF, /* 0xEC-0xEF */ + 0x91, 0xD0, 0x91, 0xD1, 0x91, 0xD2, 0x91, 0xD3, /* 0xF0-0xF3 */ + 0x91, 0xD4, 0x91, 0xD5, 0x91, 0xD6, 0x91, 0xD7, /* 0xF4-0xF7 */ + 0x91, 0xD8, 0x91, 0xD9, 0x91, 0xDA, 0x91, 0xDB, /* 0xF8-0xFB */ + 0xB8, 0xFE, 0x91, 0xDC, 0x91, 0xDD, 0x91, 0xDE, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_BB[512] = { + 0xB9, 0xA1, 0x91, 0xDF, 0x91, 0xE0, 0x91, 0xE1, /* 0x00-0x03 */ + 0xB9, 0xA2, 0x91, 0xE2, 0x91, 0xE3, 0x91, 0xE4, /* 0x04-0x07 */ + 0x91, 0xE5, 0x91, 0xE6, 0x91, 0xE7, 0x91, 0xE8, /* 0x08-0x0B */ + 0x91, 0xE9, 0xB9, 0xA3, 0x91, 0xEA, 0xB9, 0xA4, /* 0x0C-0x0F */ + 0x91, 0xEB, 0xB9, 0xA5, 0x91, 0xEC, 0x91, 0xED, /* 0x10-0x13 */ + 0x91, 0xEE, 0x91, 0xEF, 0x91, 0xF0, 0x91, 0xF1, /* 0x14-0x17 */ + 0xB9, 0xA6, 0x91, 0xF2, 0x91, 0xF3, 0x91, 0xF4, /* 0x18-0x1B */ + 0xB9, 0xA7, 0x91, 0xF5, 0x91, 0xF6, 0x91, 0xF7, /* 0x1C-0x1F */ + 0xB9, 0xA8, 0x91, 0xF8, 0x91, 0xF9, 0x91, 0xFA, /* 0x20-0x23 */ + 0x91, 0xFB, 0x91, 0xFC, 0x91, 0xFD, 0x91, 0xFE, /* 0x24-0x27 */ + 0x92, 0x41, 0xB9, 0xA9, 0x92, 0x42, 0xB9, 0xAA, /* 0x28-0x2B */ + 0x92, 0x43, 0x92, 0x44, 0x92, 0x45, 0x92, 0x46, /* 0x2C-0x2F */ + 0x92, 0x47, 0x92, 0x48, 0x92, 0x49, 0x92, 0x4A, /* 0x30-0x33 */ + 0xB9, 0xAB, 0xB9, 0xAC, 0xB9, 0xAD, 0x92, 0x4B, /* 0x34-0x37 */ + 0xB9, 0xAE, 0x92, 0x4C, 0x92, 0x4D, 0xB9, 0xAF, /* 0x38-0x3B */ + 0xB9, 0xB0, 0xB9, 0xB1, 0xB9, 0xB2, 0x92, 0x4E, /* 0x3C-0x3F */ + 0x92, 0x4F, 0x92, 0x50, 0x92, 0x51, 0x92, 0x52, /* 0x40-0x43 */ + 0xB9, 0xB3, 0xB9, 0xB4, 0x92, 0x53, 0xB9, 0xB5, /* 0x44-0x47 */ + 0x92, 0x54, 0xB9, 0xB6, 0x92, 0x55, 0x92, 0x56, /* 0x48-0x4B */ + 0x92, 0x57, 0xB9, 0xB7, 0x92, 0x58, 0xB9, 0xB8, /* 0x4C-0x4F */ + 0xB9, 0xB9, 0x92, 0x59, 0x92, 0x5A, 0x92, 0x61, /* 0x50-0x53 */ + 0xB9, 0xBA, 0x92, 0x62, 0x92, 0x63, 0x92, 0x64, /* 0x54-0x57 */ + 0xB9, 0xBB, 0x92, 0x65, 0x92, 0x66, 0x92, 0x67, /* 0x58-0x5B */ + 0x92, 0x68, 0x92, 0x69, 0x92, 0x6A, 0x92, 0x6B, /* 0x5C-0x5F */ + 0x92, 0x6C, 0xB9, 0xBC, 0x92, 0x6D, 0xB9, 0xBD, /* 0x60-0x63 */ + 0x92, 0x6E, 0x92, 0x6F, 0x92, 0x70, 0x92, 0x71, /* 0x64-0x67 */ + 0x92, 0x72, 0x92, 0x73, 0x92, 0x74, 0x92, 0x75, /* 0x68-0x6B */ + 0xB9, 0xBE, 0x92, 0x76, 0x92, 0x77, 0x92, 0x78, /* 0x6C-0x6F */ + 0x92, 0x79, 0x92, 0x7A, 0x92, 0x81, 0x92, 0x82, /* 0x70-0x73 */ + 0x92, 0x83, 0x92, 0x84, 0x92, 0x85, 0x92, 0x86, /* 0x74-0x77 */ + 0x92, 0x87, 0x92, 0x88, 0x92, 0x89, 0x92, 0x8A, /* 0x78-0x7B */ + 0x92, 0x8B, 0x92, 0x8C, 0x92, 0x8D, 0x92, 0x8E, /* 0x7C-0x7F */ + + 0x92, 0x8F, 0x92, 0x90, 0x92, 0x91, 0x92, 0x92, /* 0x80-0x83 */ + 0x92, 0x93, 0x92, 0x94, 0x92, 0x95, 0x92, 0x96, /* 0x84-0x87 */ + 0xB9, 0xBF, 0x92, 0x97, 0x92, 0x98, 0x92, 0x99, /* 0x88-0x8B */ + 0xB9, 0xC0, 0x92, 0x9A, 0x92, 0x9B, 0x92, 0x9C, /* 0x8C-0x8F */ + 0xB9, 0xC1, 0x92, 0x9D, 0x92, 0x9E, 0x92, 0x9F, /* 0x90-0x93 */ + 0x92, 0xA0, 0x92, 0xA1, 0x92, 0xA2, 0x92, 0xA3, /* 0x94-0x97 */ + 0x92, 0xA4, 0x92, 0xA5, 0x92, 0xA6, 0x92, 0xA7, /* 0x98-0x9B */ + 0x92, 0xA8, 0x92, 0xA9, 0x92, 0xAA, 0x92, 0xAB, /* 0x9C-0x9F */ + 0x92, 0xAC, 0x92, 0xAD, 0x92, 0xAE, 0x92, 0xAF, /* 0xA0-0xA3 */ + 0xB9, 0xC2, 0x92, 0xB0, 0x92, 0xB1, 0x92, 0xB2, /* 0xA4-0xA7 */ + 0xB9, 0xC3, 0x92, 0xB3, 0x92, 0xB4, 0x92, 0xB5, /* 0xA8-0xAB */ + 0xB9, 0xC4, 0x92, 0xB6, 0x92, 0xB7, 0x92, 0xB8, /* 0xAC-0xAF */ + 0x92, 0xB9, 0x92, 0xBA, 0x92, 0xBB, 0x92, 0xBC, /* 0xB0-0xB3 */ + 0xB9, 0xC5, 0x92, 0xBD, 0x92, 0xBE, 0xB9, 0xC6, /* 0xB4-0xB7 */ + 0x92, 0xBF, 0x92, 0xC0, 0x92, 0xC1, 0x92, 0xC2, /* 0xB8-0xBB */ + 0x92, 0xC3, 0x92, 0xC4, 0x92, 0xC5, 0x92, 0xC6, /* 0xBC-0xBF */ + 0xB9, 0xC7, 0x92, 0xC7, 0x92, 0xC8, 0x92, 0xC9, /* 0xC0-0xC3 */ + 0xB9, 0xC8, 0x92, 0xCA, 0x92, 0xCB, 0x92, 0xCC, /* 0xC4-0xC7 */ + 0xB9, 0xC9, 0x92, 0xCD, 0x92, 0xCE, 0x92, 0xCF, /* 0xC8-0xCB */ + 0x92, 0xD0, 0x92, 0xD1, 0x92, 0xD2, 0x92, 0xD3, /* 0xCC-0xCF */ + 0xB9, 0xCA, 0x92, 0xD4, 0x92, 0xD5, 0xB9, 0xCB, /* 0xD0-0xD3 */ + 0x92, 0xD6, 0x92, 0xD7, 0x92, 0xD8, 0x92, 0xD9, /* 0xD4-0xD7 */ + 0x92, 0xDA, 0x92, 0xDB, 0x92, 0xDC, 0x92, 0xDD, /* 0xD8-0xDB */ + 0x92, 0xDE, 0x92, 0xDF, 0x92, 0xE0, 0x92, 0xE1, /* 0xDC-0xDF */ + 0x92, 0xE2, 0x92, 0xE3, 0x92, 0xE4, 0x92, 0xE5, /* 0xE0-0xE3 */ + 0x92, 0xE6, 0x92, 0xE7, 0x92, 0xE8, 0x92, 0xE9, /* 0xE4-0xE7 */ + 0x92, 0xEA, 0x92, 0xEB, 0x92, 0xEC, 0x92, 0xED, /* 0xE8-0xEB */ + 0x92, 0xEE, 0x92, 0xEF, 0x92, 0xF0, 0x92, 0xF1, /* 0xEC-0xEF */ + 0x92, 0xF2, 0x92, 0xF3, 0x92, 0xF4, 0x92, 0xF5, /* 0xF0-0xF3 */ + 0x92, 0xF6, 0x92, 0xF7, 0x92, 0xF8, 0x92, 0xF9, /* 0xF4-0xF7 */ + 0xB9, 0xCC, 0xB9, 0xCD, 0x92, 0xFA, 0x92, 0xFB, /* 0xF8-0xFB */ + 0xB9, 0xCE, 0x92, 0xFC, 0x92, 0xFD, 0xB9, 0xCF, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_BC[512] = { + 0xB9, 0xD0, 0x92, 0xFE, 0xB9, 0xD1, 0x93, 0x41, /* 0x00-0x03 */ + 0x93, 0x42, 0x93, 0x43, 0x93, 0x44, 0x93, 0x45, /* 0x04-0x07 */ + 0xB9, 0xD2, 0xB9, 0xD3, 0x93, 0x46, 0xB9, 0xD4, /* 0x08-0x0B */ + 0xB9, 0xD5, 0xB9, 0xD6, 0x93, 0x47, 0xB9, 0xD7, /* 0x0C-0x0F */ + 0x93, 0x48, 0xB9, 0xD8, 0x93, 0x49, 0x93, 0x4A, /* 0x10-0x13 */ + 0xB9, 0xD9, 0xB9, 0xDA, 0xB9, 0xDB, 0xB9, 0xDC, /* 0x14-0x17 */ + 0xB9, 0xDD, 0x93, 0x4B, 0x93, 0x4C, 0xB9, 0xDE, /* 0x18-0x1B */ + 0xB9, 0xDF, 0xB9, 0xE0, 0xB9, 0xE1, 0xB9, 0xE2, /* 0x1C-0x1F */ + 0x93, 0x4D, 0x93, 0x4E, 0x93, 0x4F, 0x93, 0x50, /* 0x20-0x23 */ + 0xB9, 0xE3, 0xB9, 0xE4, 0x93, 0x51, 0xB9, 0xE5, /* 0x24-0x27 */ + 0x93, 0x52, 0xB9, 0xE6, 0x93, 0x53, 0x93, 0x54, /* 0x28-0x2B */ + 0x93, 0x55, 0xB9, 0xE7, 0x93, 0x56, 0x93, 0x57, /* 0x2C-0x2F */ + 0xB9, 0xE8, 0xB9, 0xE9, 0x93, 0x58, 0x93, 0x59, /* 0x30-0x33 */ + 0xB9, 0xEA, 0x93, 0x5A, 0x93, 0x61, 0x93, 0x62, /* 0x34-0x37 */ + 0xB9, 0xEB, 0x93, 0x63, 0x93, 0x64, 0x93, 0x65, /* 0x38-0x3B */ + 0x93, 0x66, 0x93, 0x67, 0x93, 0x68, 0x93, 0x69, /* 0x3C-0x3F */ + 0xB9, 0xEC, 0xB9, 0xED, 0x93, 0x6A, 0xB9, 0xEE, /* 0x40-0x43 */ + 0xB9, 0xEF, 0xB9, 0xF0, 0x93, 0x6B, 0x93, 0x6C, /* 0x44-0x47 */ + 0x93, 0x6D, 0xB9, 0xF1, 0x93, 0x6E, 0x93, 0x6F, /* 0x48-0x4B */ + 0xB9, 0xF2, 0xB9, 0xF3, 0x93, 0x70, 0x93, 0x71, /* 0x4C-0x4F */ + 0xB9, 0xF4, 0x93, 0x72, 0x93, 0x73, 0x93, 0x74, /* 0x50-0x53 */ + 0x93, 0x75, 0x93, 0x76, 0x93, 0x77, 0x93, 0x78, /* 0x54-0x57 */ + 0x93, 0x79, 0x93, 0x7A, 0x93, 0x81, 0x93, 0x82, /* 0x58-0x5B */ + 0x93, 0x83, 0xB9, 0xF5, 0x93, 0x84, 0x93, 0x85, /* 0x5C-0x5F */ + 0x93, 0x86, 0x93, 0x87, 0x93, 0x88, 0x93, 0x89, /* 0x60-0x63 */ + 0x93, 0x8A, 0x93, 0x8B, 0x93, 0x8C, 0x93, 0x8D, /* 0x64-0x67 */ + 0x93, 0x8E, 0x93, 0x8F, 0x93, 0x90, 0x93, 0x91, /* 0x68-0x6B */ + 0x93, 0x92, 0x93, 0x93, 0x93, 0x94, 0x93, 0x95, /* 0x6C-0x6F */ + 0x93, 0x96, 0x93, 0x97, 0x93, 0x98, 0x93, 0x99, /* 0x70-0x73 */ + 0x93, 0x9A, 0x93, 0x9B, 0x93, 0x9C, 0x93, 0x9D, /* 0x74-0x77 */ + 0x93, 0x9E, 0x93, 0x9F, 0x93, 0xA0, 0x93, 0xA1, /* 0x78-0x7B */ + 0x93, 0xA2, 0x93, 0xA3, 0x93, 0xA4, 0x93, 0xA5, /* 0x7C-0x7F */ + + 0x93, 0xA6, 0x93, 0xA7, 0x93, 0xA8, 0x93, 0xA9, /* 0x80-0x83 */ + 0xB9, 0xF6, 0xB9, 0xF7, 0x93, 0xAA, 0x93, 0xAB, /* 0x84-0x87 */ + 0xB9, 0xF8, 0x93, 0xAC, 0x93, 0xAD, 0xB9, 0xF9, /* 0x88-0x8B */ + 0xB9, 0xFA, 0x93, 0xAE, 0xB9, 0xFB, 0x93, 0xAF, /* 0x8C-0x8F */ + 0x93, 0xB0, 0x93, 0xB1, 0x93, 0xB2, 0x93, 0xB3, /* 0x90-0x93 */ + 0xB9, 0xFC, 0xB9, 0xFD, 0x93, 0xB4, 0xB9, 0xFE, /* 0x94-0x97 */ + 0x93, 0xB5, 0xBA, 0xA1, 0xBA, 0xA2, 0x93, 0xB6, /* 0x98-0x9B */ + 0x93, 0xB7, 0x93, 0xB8, 0x93, 0xB9, 0x93, 0xBA, /* 0x9C-0x9F */ + 0xBA, 0xA3, 0xBA, 0xA4, 0x93, 0xBB, 0x93, 0xBC, /* 0xA0-0xA3 */ + 0xBA, 0xA5, 0x93, 0xBD, 0x93, 0xBE, 0xBA, 0xA6, /* 0xA4-0xA7 */ + 0xBA, 0xA7, 0x93, 0xBF, 0x93, 0xC0, 0x93, 0xC1, /* 0xA8-0xAB */ + 0x93, 0xC2, 0x93, 0xC3, 0x93, 0xC4, 0x93, 0xC5, /* 0xAC-0xAF */ + 0xBA, 0xA8, 0xBA, 0xA9, 0x93, 0xC6, 0xBA, 0xAA, /* 0xB0-0xB3 */ + 0xBA, 0xAB, 0xBA, 0xAC, 0x93, 0xC7, 0x93, 0xC8, /* 0xB4-0xB7 */ + 0x93, 0xC9, 0x93, 0xCA, 0x93, 0xCB, 0x93, 0xCC, /* 0xB8-0xBB */ + 0xBA, 0xAD, 0xBA, 0xAE, 0x93, 0xCD, 0x93, 0xCE, /* 0xBC-0xBF */ + 0xBA, 0xAF, 0x93, 0xCF, 0x93, 0xD0, 0x93, 0xD1, /* 0xC0-0xC3 */ + 0xBA, 0xB0, 0x93, 0xD2, 0x93, 0xD3, 0x93, 0xD4, /* 0xC4-0xC7 */ + 0x93, 0xD5, 0x93, 0xD6, 0x93, 0xD7, 0x93, 0xD8, /* 0xC8-0xCB */ + 0x93, 0xD9, 0xBA, 0xB1, 0x93, 0xDA, 0xBA, 0xB2, /* 0xCC-0xCF */ + 0xBA, 0xB3, 0xBA, 0xB4, 0x93, 0xDB, 0x93, 0xDC, /* 0xD0-0xD3 */ + 0x93, 0xDD, 0xBA, 0xB5, 0x93, 0xDE, 0x93, 0xDF, /* 0xD4-0xD7 */ + 0xBA, 0xB6, 0x93, 0xE0, 0x93, 0xE1, 0x93, 0xE2, /* 0xD8-0xDB */ + 0xBA, 0xB7, 0x93, 0xE3, 0x93, 0xE4, 0x93, 0xE5, /* 0xDC-0xDF */ + 0x93, 0xE6, 0x93, 0xE7, 0x93, 0xE8, 0x93, 0xE9, /* 0xE0-0xE3 */ + 0x93, 0xEA, 0x93, 0xEB, 0x93, 0xEC, 0x93, 0xED, /* 0xE4-0xE7 */ + 0x93, 0xEE, 0x93, 0xEF, 0x93, 0xF0, 0x93, 0xF1, /* 0xE8-0xEB */ + 0x93, 0xF2, 0x93, 0xF3, 0x93, 0xF4, 0x93, 0xF5, /* 0xEC-0xEF */ + 0x93, 0xF6, 0x93, 0xF7, 0x93, 0xF8, 0x93, 0xF9, /* 0xF0-0xF3 */ + 0xBA, 0xB8, 0xBA, 0xB9, 0xBA, 0xBA, 0x93, 0xFA, /* 0xF4-0xF7 */ + 0xBA, 0xBB, 0x93, 0xFB, 0x93, 0xFC, 0x93, 0xFD, /* 0xF8-0xFB */ + 0xBA, 0xBC, 0x93, 0xFE, 0x94, 0x41, 0x94, 0x42, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_BD[512] = { + 0x94, 0x43, 0x94, 0x44, 0x94, 0x45, 0x94, 0x46, /* 0x00-0x03 */ + 0xBA, 0xBD, 0xBA, 0xBE, 0x94, 0x47, 0xBA, 0xBF, /* 0x04-0x07 */ + 0x94, 0x48, 0xBA, 0xC0, 0x94, 0x49, 0x94, 0x4A, /* 0x08-0x0B */ + 0x94, 0x4B, 0x94, 0x4C, 0x94, 0x4D, 0x94, 0x4E, /* 0x0C-0x0F */ + 0xBA, 0xC1, 0x94, 0x4F, 0x94, 0x50, 0x94, 0x51, /* 0x10-0x13 */ + 0xBA, 0xC2, 0x94, 0x52, 0x94, 0x53, 0x94, 0x54, /* 0x14-0x17 */ + 0x94, 0x55, 0x94, 0x56, 0x94, 0x57, 0x94, 0x58, /* 0x18-0x1B */ + 0x94, 0x59, 0x94, 0x5A, 0x94, 0x61, 0x94, 0x62, /* 0x1C-0x1F */ + 0x94, 0x63, 0x94, 0x64, 0x94, 0x65, 0x94, 0x66, /* 0x20-0x23 */ + 0xBA, 0xC3, 0x94, 0x67, 0x94, 0x68, 0x94, 0x69, /* 0x24-0x27 */ + 0x94, 0x6A, 0x94, 0x6B, 0x94, 0x6C, 0x94, 0x6D, /* 0x28-0x2B */ + 0xBA, 0xC4, 0x94, 0x6E, 0x94, 0x6F, 0x94, 0x70, /* 0x2C-0x2F */ + 0x94, 0x71, 0x94, 0x72, 0x94, 0x73, 0x94, 0x74, /* 0x30-0x33 */ + 0x94, 0x75, 0x94, 0x76, 0x94, 0x77, 0x94, 0x78, /* 0x34-0x37 */ + 0x94, 0x79, 0x94, 0x7A, 0x94, 0x81, 0x94, 0x82, /* 0x38-0x3B */ + 0x94, 0x83, 0x94, 0x84, 0x94, 0x85, 0x94, 0x86, /* 0x3C-0x3F */ + 0xBA, 0xC5, 0x94, 0x87, 0x94, 0x88, 0x94, 0x89, /* 0x40-0x43 */ + 0x94, 0x8A, 0x94, 0x8B, 0x94, 0x8C, 0x94, 0x8D, /* 0x44-0x47 */ + 0xBA, 0xC6, 0xBA, 0xC7, 0x94, 0x8E, 0x94, 0x8F, /* 0x48-0x4B */ + 0xBA, 0xC8, 0x94, 0x90, 0x94, 0x91, 0x94, 0x92, /* 0x4C-0x4F */ + 0xBA, 0xC9, 0x94, 0x93, 0x94, 0x94, 0x94, 0x95, /* 0x50-0x53 */ + 0x94, 0x96, 0x94, 0x97, 0x94, 0x98, 0x94, 0x99, /* 0x54-0x57 */ + 0xBA, 0xCA, 0xBA, 0xCB, 0x94, 0x9A, 0x94, 0x9B, /* 0x58-0x5B */ + 0x94, 0x9C, 0x94, 0x9D, 0x94, 0x9E, 0x94, 0x9F, /* 0x5C-0x5F */ + 0x94, 0xA0, 0x94, 0xA1, 0x94, 0xA2, 0x94, 0xA3, /* 0x60-0x63 */ + 0xBA, 0xCC, 0x94, 0xA4, 0x94, 0xA5, 0x94, 0xA6, /* 0x64-0x67 */ + 0xBA, 0xCD, 0x94, 0xA7, 0x94, 0xA8, 0x94, 0xA9, /* 0x68-0x6B */ + 0x94, 0xAA, 0x94, 0xAB, 0x94, 0xAC, 0x94, 0xAD, /* 0x6C-0x6F */ + 0x94, 0xAE, 0x94, 0xAF, 0x94, 0xB0, 0x94, 0xB1, /* 0x70-0x73 */ + 0x94, 0xB2, 0x94, 0xB3, 0x94, 0xB4, 0x94, 0xB5, /* 0x74-0x77 */ + 0x94, 0xB6, 0x94, 0xB7, 0x94, 0xB8, 0x94, 0xB9, /* 0x78-0x7B */ + 0x94, 0xBA, 0x94, 0xBB, 0x94, 0xBC, 0x94, 0xBD, /* 0x7C-0x7F */ + + 0xBA, 0xCE, 0xBA, 0xCF, 0x94, 0xBE, 0x94, 0xBF, /* 0x80-0x83 */ + 0xBA, 0xD0, 0x94, 0xC0, 0x94, 0xC1, 0xBA, 0xD1, /* 0x84-0x87 */ + 0xBA, 0xD2, 0xBA, 0xD3, 0xBA, 0xD4, 0x94, 0xC2, /* 0x88-0x8B */ + 0x94, 0xC3, 0x94, 0xC4, 0x94, 0xC5, 0x94, 0xC6, /* 0x8C-0x8F */ + 0xBA, 0xD5, 0xBA, 0xD6, 0x94, 0xC7, 0xBA, 0xD7, /* 0x90-0x93 */ + 0x94, 0xC8, 0xBA, 0xD8, 0x94, 0xC9, 0x94, 0xCA, /* 0x94-0x97 */ + 0x94, 0xCB, 0xBA, 0xD9, 0xBA, 0xDA, 0x94, 0xCC, /* 0x98-0x9B */ + 0xBA, 0xDB, 0x94, 0xCD, 0x94, 0xCE, 0x94, 0xCF, /* 0x9C-0x9F */ + 0x94, 0xD0, 0x94, 0xD1, 0x94, 0xD2, 0x94, 0xD3, /* 0xA0-0xA3 */ + 0xBA, 0xDC, 0x94, 0xD4, 0x94, 0xD5, 0x94, 0xD6, /* 0xA4-0xA7 */ + 0x94, 0xD7, 0x94, 0xD8, 0x94, 0xD9, 0x94, 0xDA, /* 0xA8-0xAB */ + 0x94, 0xDB, 0x94, 0xDC, 0x94, 0xDD, 0x94, 0xDE, /* 0xAC-0xAF */ + 0xBA, 0xDD, 0x94, 0xDF, 0x94, 0xE0, 0x94, 0xE1, /* 0xB0-0xB3 */ + 0x94, 0xE2, 0x94, 0xE3, 0x94, 0xE4, 0x94, 0xE5, /* 0xB4-0xB7 */ + 0xBA, 0xDE, 0x94, 0xE6, 0x94, 0xE7, 0x94, 0xE8, /* 0xB8-0xBB */ + 0x94, 0xE9, 0x94, 0xEA, 0x94, 0xEB, 0x94, 0xEC, /* 0xBC-0xBF */ + 0x94, 0xED, 0x94, 0xEE, 0x94, 0xEF, 0x94, 0xF0, /* 0xC0-0xC3 */ + 0x94, 0xF1, 0x94, 0xF2, 0x94, 0xF3, 0x94, 0xF4, /* 0xC4-0xC7 */ + 0x94, 0xF5, 0x94, 0xF6, 0x94, 0xF7, 0x94, 0xF8, /* 0xC8-0xCB */ + 0x94, 0xF9, 0x94, 0xFA, 0x94, 0xFB, 0x94, 0xFC, /* 0xCC-0xCF */ + 0x94, 0xFD, 0x94, 0xFE, 0x95, 0x41, 0x95, 0x42, /* 0xD0-0xD3 */ + 0xBA, 0xDF, 0xBA, 0xE0, 0x95, 0x43, 0x95, 0x44, /* 0xD4-0xD7 */ + 0xBA, 0xE1, 0x95, 0x45, 0x95, 0x46, 0x95, 0x47, /* 0xD8-0xDB */ + 0xBA, 0xE2, 0x95, 0x48, 0x95, 0x49, 0x95, 0x4A, /* 0xDC-0xDF */ + 0x95, 0x4B, 0x95, 0x4C, 0x95, 0x4D, 0x95, 0x4E, /* 0xE0-0xE3 */ + 0x95, 0x4F, 0x95, 0x50, 0x95, 0x51, 0x95, 0x52, /* 0xE4-0xE7 */ + 0x95, 0x53, 0xBA, 0xE3, 0x95, 0x54, 0x95, 0x55, /* 0xE8-0xEB */ + 0x95, 0x56, 0x95, 0x57, 0x95, 0x58, 0x95, 0x59, /* 0xEC-0xEF */ + 0xBA, 0xE4, 0x95, 0x5A, 0x95, 0x61, 0x95, 0x62, /* 0xF0-0xF3 */ + 0xBA, 0xE5, 0x95, 0x63, 0x95, 0x64, 0x95, 0x65, /* 0xF4-0xF7 */ + 0xBA, 0xE6, 0x95, 0x66, 0x95, 0x67, 0x95, 0x68, /* 0xF8-0xFB */ + 0x95, 0x69, 0x95, 0x6A, 0x95, 0x6B, 0x95, 0x6C, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_BE[512] = { + 0xBA, 0xE7, 0x95, 0x6D, 0x95, 0x6E, 0xBA, 0xE8, /* 0x00-0x03 */ + 0x95, 0x6F, 0xBA, 0xE9, 0x95, 0x70, 0x95, 0x71, /* 0x04-0x07 */ + 0x95, 0x72, 0x95, 0x73, 0x95, 0x74, 0x95, 0x75, /* 0x08-0x0B */ + 0xBA, 0xEA, 0xBA, 0xEB, 0x95, 0x76, 0x95, 0x77, /* 0x0C-0x0F */ + 0xBA, 0xEC, 0x95, 0x78, 0x95, 0x79, 0x95, 0x7A, /* 0x10-0x13 */ + 0xBA, 0xED, 0x95, 0x81, 0x95, 0x82, 0x95, 0x83, /* 0x14-0x17 */ + 0x95, 0x84, 0x95, 0x85, 0x95, 0x86, 0x95, 0x87, /* 0x18-0x1B */ + 0xBA, 0xEE, 0xBA, 0xEF, 0x95, 0x88, 0xBA, 0xF0, /* 0x1C-0x1F */ + 0x95, 0x89, 0x95, 0x8A, 0x95, 0x8B, 0x95, 0x8C, /* 0x20-0x23 */ + 0x95, 0x8D, 0x95, 0x8E, 0x95, 0x8F, 0x95, 0x90, /* 0x24-0x27 */ + 0x95, 0x91, 0x95, 0x92, 0x95, 0x93, 0x95, 0x94, /* 0x28-0x2B */ + 0x95, 0x95, 0x95, 0x96, 0x95, 0x97, 0x95, 0x98, /* 0x2C-0x2F */ + 0x95, 0x99, 0x95, 0x9A, 0x95, 0x9B, 0x95, 0x9C, /* 0x30-0x33 */ + 0x95, 0x9D, 0x95, 0x9E, 0x95, 0x9F, 0x95, 0xA0, /* 0x34-0x37 */ + 0x95, 0xA1, 0x95, 0xA2, 0x95, 0xA3, 0x95, 0xA4, /* 0x38-0x3B */ + 0x95, 0xA5, 0x95, 0xA6, 0x95, 0xA7, 0x95, 0xA8, /* 0x3C-0x3F */ + 0x95, 0xA9, 0x95, 0xAA, 0x95, 0xAB, 0x95, 0xAC, /* 0x40-0x43 */ + 0xBA, 0xF1, 0xBA, 0xF2, 0x95, 0xAD, 0x95, 0xAE, /* 0x44-0x47 */ + 0xBA, 0xF3, 0x95, 0xAF, 0x95, 0xB0, 0x95, 0xB1, /* 0x48-0x4B */ + 0xBA, 0xF4, 0x95, 0xB2, 0xBA, 0xF5, 0x95, 0xB3, /* 0x4C-0x4F */ + 0x95, 0xB4, 0x95, 0xB5, 0x95, 0xB6, 0x95, 0xB7, /* 0x50-0x53 */ + 0xBA, 0xF6, 0xBA, 0xF7, 0x95, 0xB8, 0xBA, 0xF8, /* 0x54-0x57 */ + 0x95, 0xB9, 0xBA, 0xF9, 0xBA, 0xFA, 0xBA, 0xFB, /* 0x58-0x5B */ + 0x95, 0xBA, 0x95, 0xBB, 0x95, 0xBC, 0x95, 0xBD, /* 0x5C-0x5F */ + 0xBA, 0xFC, 0xBA, 0xFD, 0x95, 0xBE, 0x95, 0xBF, /* 0x60-0x63 */ + 0xBA, 0xFE, 0x95, 0xC0, 0x95, 0xC1, 0x95, 0xC2, /* 0x64-0x67 */ + 0xBB, 0xA1, 0x95, 0xC3, 0xBB, 0xA2, 0x95, 0xC4, /* 0x68-0x6B */ + 0x95, 0xC5, 0x95, 0xC6, 0x95, 0xC7, 0x95, 0xC8, /* 0x6C-0x6F */ + 0xBB, 0xA3, 0xBB, 0xA4, 0x95, 0xC9, 0xBB, 0xA5, /* 0x70-0x73 */ + 0xBB, 0xA6, 0xBB, 0xA7, 0x95, 0xCA, 0x95, 0xCB, /* 0x74-0x77 */ + 0x95, 0xCC, 0x95, 0xCD, 0x95, 0xCE, 0xBB, 0xA8, /* 0x78-0x7B */ + 0xBB, 0xA9, 0xBB, 0xAA, 0x95, 0xCF, 0x95, 0xD0, /* 0x7C-0x7F */ + + 0xBB, 0xAB, 0x95, 0xD1, 0x95, 0xD2, 0x95, 0xD3, /* 0x80-0x83 */ + 0xBB, 0xAC, 0x95, 0xD4, 0x95, 0xD5, 0x95, 0xD6, /* 0x84-0x87 */ + 0x95, 0xD7, 0x95, 0xD8, 0x95, 0xD9, 0x95, 0xDA, /* 0x88-0x8B */ + 0xBB, 0xAD, 0xBB, 0xAE, 0x95, 0xDB, 0xBB, 0xAF, /* 0x8C-0x8F */ + 0xBB, 0xB0, 0xBB, 0xB1, 0x95, 0xDC, 0x95, 0xDD, /* 0x90-0x93 */ + 0x95, 0xDE, 0x95, 0xDF, 0x95, 0xE0, 0x95, 0xE1, /* 0x94-0x97 */ + 0xBB, 0xB2, 0xBB, 0xB3, 0x95, 0xE2, 0x95, 0xE3, /* 0x98-0x9B */ + 0x95, 0xE4, 0x95, 0xE5, 0x95, 0xE6, 0x95, 0xE7, /* 0x9C-0x9F */ + 0x95, 0xE8, 0x95, 0xE9, 0x95, 0xEA, 0x95, 0xEB, /* 0xA0-0xA3 */ + 0x95, 0xEC, 0x95, 0xED, 0x95, 0xEE, 0x95, 0xEF, /* 0xA4-0xA7 */ + 0xBB, 0xB4, 0x95, 0xF0, 0x95, 0xF1, 0x95, 0xF2, /* 0xA8-0xAB */ + 0x95, 0xF3, 0x95, 0xF4, 0x95, 0xF5, 0x95, 0xF6, /* 0xAC-0xAF */ + 0x95, 0xF7, 0x95, 0xF8, 0x95, 0xF9, 0x95, 0xFA, /* 0xB0-0xB3 */ + 0x95, 0xFB, 0x95, 0xFC, 0x95, 0xFD, 0x95, 0xFE, /* 0xB4-0xB7 */ + 0x96, 0x41, 0x96, 0x42, 0x96, 0x43, 0x96, 0x44, /* 0xB8-0xBB */ + 0x96, 0x45, 0x96, 0x46, 0x96, 0x47, 0x96, 0x48, /* 0xBC-0xBF */ + 0x96, 0x49, 0x96, 0x4A, 0x96, 0x4B, 0x96, 0x4C, /* 0xC0-0xC3 */ + 0x96, 0x4D, 0x96, 0x4E, 0x96, 0x4F, 0x96, 0x50, /* 0xC4-0xC7 */ + 0x96, 0x51, 0x96, 0x52, 0x96, 0x53, 0x96, 0x54, /* 0xC8-0xCB */ + 0x96, 0x55, 0x96, 0x56, 0x96, 0x57, 0x96, 0x58, /* 0xCC-0xCF */ + 0xBB, 0xB5, 0xBB, 0xB6, 0x96, 0x59, 0x96, 0x5A, /* 0xD0-0xD3 */ + 0xBB, 0xB7, 0x96, 0x61, 0x96, 0x62, 0xBB, 0xB8, /* 0xD4-0xD7 */ + 0xBB, 0xB9, 0x96, 0x63, 0x96, 0x64, 0x96, 0x65, /* 0xD8-0xDB */ + 0x96, 0x66, 0x96, 0x67, 0x96, 0x68, 0x96, 0x69, /* 0xDC-0xDF */ + 0xBB, 0xBA, 0x96, 0x6A, 0x96, 0x6B, 0xBB, 0xBB, /* 0xE0-0xE3 */ + 0xBB, 0xBC, 0xBB, 0xBD, 0x96, 0x6C, 0x96, 0x6D, /* 0xE4-0xE7 */ + 0x96, 0x6E, 0x96, 0x6F, 0x96, 0x70, 0x96, 0x71, /* 0xE8-0xEB */ + 0xBB, 0xBE, 0x96, 0x72, 0x96, 0x73, 0x96, 0x74, /* 0xEC-0xEF */ + 0x96, 0x75, 0x96, 0x76, 0x96, 0x77, 0x96, 0x78, /* 0xF0-0xF3 */ + 0x96, 0x79, 0x96, 0x7A, 0x96, 0x81, 0x96, 0x82, /* 0xF4-0xF7 */ + 0x96, 0x83, 0x96, 0x84, 0x96, 0x85, 0x96, 0x86, /* 0xF8-0xFB */ + 0x96, 0x87, 0x96, 0x88, 0x96, 0x89, 0x96, 0x8A, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_BF[512] = { + 0x96, 0x8B, 0xBB, 0xBF, 0x96, 0x8C, 0x96, 0x8D, /* 0x00-0x03 */ + 0x96, 0x8E, 0x96, 0x8F, 0x96, 0x90, 0x96, 0x91, /* 0x04-0x07 */ + 0xBB, 0xC0, 0xBB, 0xC1, 0x96, 0x92, 0x96, 0x93, /* 0x08-0x0B */ + 0x96, 0x94, 0x96, 0x95, 0x96, 0x96, 0x96, 0x97, /* 0x0C-0x0F */ + 0x96, 0x98, 0x96, 0x99, 0x96, 0x9A, 0x96, 0x9B, /* 0x10-0x13 */ + 0x96, 0x9C, 0x96, 0x9D, 0x96, 0x9E, 0x96, 0x9F, /* 0x14-0x17 */ + 0xBB, 0xC2, 0xBB, 0xC3, 0x96, 0xA0, 0xBB, 0xC4, /* 0x18-0x1B */ + 0xBB, 0xC5, 0xBB, 0xC6, 0x96, 0xA1, 0x96, 0xA2, /* 0x1C-0x1F */ + 0x96, 0xA3, 0x96, 0xA4, 0x96, 0xA5, 0x96, 0xA6, /* 0x20-0x23 */ + 0x96, 0xA7, 0x96, 0xA8, 0x96, 0xA9, 0x96, 0xAA, /* 0x24-0x27 */ + 0x96, 0xAB, 0x96, 0xAC, 0x96, 0xAD, 0x96, 0xAE, /* 0x28-0x2B */ + 0x96, 0xAF, 0x96, 0xB0, 0x96, 0xB1, 0x96, 0xB2, /* 0x2C-0x2F */ + 0x96, 0xB3, 0x96, 0xB4, 0x96, 0xB5, 0x96, 0xB6, /* 0x30-0x33 */ + 0x96, 0xB7, 0x96, 0xB8, 0x96, 0xB9, 0x96, 0xBA, /* 0x34-0x37 */ + 0x96, 0xBB, 0x96, 0xBC, 0x96, 0xBD, 0x96, 0xBE, /* 0x38-0x3B */ + 0x96, 0xBF, 0x96, 0xC0, 0x96, 0xC1, 0x96, 0xC2, /* 0x3C-0x3F */ + 0xBB, 0xC7, 0xBB, 0xC8, 0x96, 0xC3, 0x96, 0xC4, /* 0x40-0x43 */ + 0xBB, 0xC9, 0x96, 0xC5, 0x96, 0xC6, 0x96, 0xC7, /* 0x44-0x47 */ + 0xBB, 0xCA, 0x96, 0xC8, 0x96, 0xC9, 0x96, 0xCA, /* 0x48-0x4B */ + 0x96, 0xCB, 0x96, 0xCC, 0x96, 0xCD, 0x96, 0xCE, /* 0x4C-0x4F */ + 0xBB, 0xCB, 0xBB, 0xCC, 0x96, 0xCF, 0x96, 0xD0, /* 0x50-0x53 */ + 0x96, 0xD1, 0xBB, 0xCD, 0x96, 0xD2, 0x96, 0xD3, /* 0x54-0x57 */ + 0x96, 0xD4, 0x96, 0xD5, 0x96, 0xD6, 0x96, 0xD7, /* 0x58-0x5B */ + 0x96, 0xD8, 0x96, 0xD9, 0x96, 0xDA, 0x96, 0xDB, /* 0x5C-0x5F */ + 0x96, 0xDC, 0x96, 0xDD, 0x96, 0xDE, 0x96, 0xDF, /* 0x60-0x63 */ + 0x96, 0xE0, 0x96, 0xE1, 0x96, 0xE2, 0x96, 0xE3, /* 0x64-0x67 */ + 0x96, 0xE4, 0x96, 0xE5, 0x96, 0xE6, 0x96, 0xE7, /* 0x68-0x6B */ + 0x96, 0xE8, 0x96, 0xE9, 0x96, 0xEA, 0x96, 0xEB, /* 0x6C-0x6F */ + 0x96, 0xEC, 0x96, 0xED, 0x96, 0xEE, 0x96, 0xEF, /* 0x70-0x73 */ + 0x96, 0xF0, 0x96, 0xF1, 0x96, 0xF2, 0x96, 0xF3, /* 0x74-0x77 */ + 0x96, 0xF4, 0x96, 0xF5, 0x96, 0xF6, 0x96, 0xF7, /* 0x78-0x7B */ + 0x96, 0xF8, 0x96, 0xF9, 0x96, 0xFA, 0x96, 0xFB, /* 0x7C-0x7F */ + + 0x96, 0xFC, 0x96, 0xFD, 0x96, 0xFE, 0x97, 0x41, /* 0x80-0x83 */ + 0x97, 0x42, 0x97, 0x43, 0x97, 0x44, 0x97, 0x45, /* 0x84-0x87 */ + 0x97, 0x46, 0x97, 0x47, 0x97, 0x48, 0x97, 0x49, /* 0x88-0x8B */ + 0x97, 0x4A, 0x97, 0x4B, 0x97, 0x4C, 0x97, 0x4D, /* 0x8C-0x8F */ + 0x97, 0x4E, 0x97, 0x4F, 0x97, 0x50, 0x97, 0x51, /* 0x90-0x93 */ + 0xBB, 0xCE, 0x97, 0x52, 0x97, 0x53, 0x97, 0x54, /* 0x94-0x97 */ + 0x97, 0x55, 0x97, 0x56, 0x97, 0x57, 0x97, 0x58, /* 0x98-0x9B */ + 0x97, 0x59, 0x97, 0x5A, 0x97, 0x61, 0x97, 0x62, /* 0x9C-0x9F */ + 0x97, 0x63, 0x97, 0x64, 0x97, 0x65, 0x97, 0x66, /* 0xA0-0xA3 */ + 0x97, 0x67, 0x97, 0x68, 0x97, 0x69, 0x97, 0x6A, /* 0xA4-0xA7 */ + 0x97, 0x6B, 0x97, 0x6C, 0x97, 0x6D, 0x97, 0x6E, /* 0xA8-0xAB */ + 0x97, 0x6F, 0x97, 0x70, 0x97, 0x71, 0x97, 0x72, /* 0xAC-0xAF */ + 0xBB, 0xCF, 0x97, 0x73, 0x97, 0x74, 0x97, 0x75, /* 0xB0-0xB3 */ + 0x97, 0x76, 0x97, 0x77, 0x97, 0x78, 0x97, 0x79, /* 0xB4-0xB7 */ + 0x97, 0x7A, 0x97, 0x81, 0x97, 0x82, 0x97, 0x83, /* 0xB8-0xBB */ + 0x97, 0x84, 0x97, 0x85, 0x97, 0x86, 0x97, 0x87, /* 0xBC-0xBF */ + 0x97, 0x88, 0x97, 0x89, 0x97, 0x8A, 0x97, 0x8B, /* 0xC0-0xC3 */ + 0x97, 0x8C, 0xBB, 0xD0, 0x97, 0x8D, 0x97, 0x8E, /* 0xC4-0xC7 */ + 0x97, 0x8F, 0x97, 0x90, 0x97, 0x91, 0x97, 0x92, /* 0xC8-0xCB */ + 0xBB, 0xD1, 0xBB, 0xD2, 0x97, 0x93, 0x97, 0x94, /* 0xCC-0xCF */ + 0xBB, 0xD3, 0x97, 0x95, 0x97, 0x96, 0x97, 0x97, /* 0xD0-0xD3 */ + 0xBB, 0xD4, 0x97, 0x98, 0x97, 0x99, 0x97, 0x9A, /* 0xD4-0xD7 */ + 0x97, 0x9B, 0x97, 0x9C, 0x97, 0x9D, 0x97, 0x9E, /* 0xD8-0xDB */ + 0xBB, 0xD5, 0x97, 0x9F, 0x97, 0xA0, 0xBB, 0xD6, /* 0xDC-0xDF */ + 0x97, 0xA1, 0xBB, 0xD7, 0x97, 0xA2, 0x97, 0xA3, /* 0xE0-0xE3 */ + 0x97, 0xA4, 0x97, 0xA5, 0x97, 0xA6, 0x97, 0xA7, /* 0xE4-0xE7 */ + 0x97, 0xA8, 0x97, 0xA9, 0x97, 0xAA, 0x97, 0xAB, /* 0xE8-0xEB */ + 0x97, 0xAC, 0x97, 0xAD, 0x97, 0xAE, 0x97, 0xAF, /* 0xEC-0xEF */ + 0x97, 0xB0, 0x97, 0xB1, 0x97, 0xB2, 0x97, 0xB3, /* 0xF0-0xF3 */ + 0x97, 0xB4, 0x97, 0xB5, 0x97, 0xB6, 0x97, 0xB7, /* 0xF4-0xF7 */ + 0x97, 0xB8, 0x97, 0xB9, 0x97, 0xBA, 0x97, 0xBB, /* 0xF8-0xFB */ + 0x97, 0xBC, 0x97, 0xBD, 0x97, 0xBE, 0x97, 0xBF, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C0[512] = { + 0x97, 0xC0, 0x97, 0xC1, 0x97, 0xC2, 0x97, 0xC3, /* 0x00-0x03 */ + 0x97, 0xC4, 0x97, 0xC5, 0x97, 0xC6, 0x97, 0xC7, /* 0x04-0x07 */ + 0x97, 0xC8, 0x97, 0xC9, 0x97, 0xCA, 0x97, 0xCB, /* 0x08-0x0B */ + 0x97, 0xCC, 0x97, 0xCD, 0x97, 0xCE, 0x97, 0xCF, /* 0x0C-0x0F */ + 0x97, 0xD0, 0x97, 0xD1, 0x97, 0xD2, 0x97, 0xD3, /* 0x10-0x13 */ + 0x97, 0xD4, 0x97, 0xD5, 0x97, 0xD6, 0x97, 0xD7, /* 0x14-0x17 */ + 0x97, 0xD8, 0x97, 0xD9, 0x97, 0xDA, 0x97, 0xDB, /* 0x18-0x1B */ + 0x97, 0xDC, 0x97, 0xDD, 0x97, 0xDE, 0x97, 0xDF, /* 0x1C-0x1F */ + 0x97, 0xE0, 0x97, 0xE1, 0x97, 0xE2, 0x97, 0xE3, /* 0x20-0x23 */ + 0x97, 0xE4, 0x97, 0xE5, 0x97, 0xE6, 0x97, 0xE7, /* 0x24-0x27 */ + 0x97, 0xE8, 0x97, 0xE9, 0x97, 0xEA, 0x97, 0xEB, /* 0x28-0x2B */ + 0x97, 0xEC, 0x97, 0xED, 0x97, 0xEE, 0x97, 0xEF, /* 0x2C-0x2F */ + 0x97, 0xF0, 0x97, 0xF1, 0x97, 0xF2, 0x97, 0xF3, /* 0x30-0x33 */ + 0x97, 0xF4, 0x97, 0xF5, 0x97, 0xF6, 0x97, 0xF7, /* 0x34-0x37 */ + 0x97, 0xF8, 0x97, 0xF9, 0x97, 0xFA, 0x97, 0xFB, /* 0x38-0x3B */ + 0xBB, 0xD8, 0x97, 0xFC, 0x97, 0xFD, 0x97, 0xFE, /* 0x3C-0x3F */ + 0x98, 0x41, 0x98, 0x42, 0x98, 0x43, 0x98, 0x44, /* 0x40-0x43 */ + 0x98, 0x45, 0x98, 0x46, 0x98, 0x47, 0x98, 0x48, /* 0x44-0x47 */ + 0x98, 0x49, 0x98, 0x4A, 0x98, 0x4B, 0x98, 0x4C, /* 0x48-0x4B */ + 0x98, 0x4D, 0x98, 0x4E, 0x98, 0x4F, 0x98, 0x50, /* 0x4C-0x4F */ + 0x98, 0x51, 0xBB, 0xD9, 0x98, 0x52, 0x98, 0x53, /* 0x50-0x53 */ + 0x98, 0x54, 0x98, 0x55, 0x98, 0x56, 0x98, 0x57, /* 0x54-0x57 */ + 0xBB, 0xDA, 0x98, 0x58, 0x98, 0x59, 0x98, 0x5A, /* 0x58-0x5B */ + 0xBB, 0xDB, 0x98, 0x61, 0x98, 0x62, 0x98, 0x63, /* 0x5C-0x5F */ + 0xBB, 0xDC, 0x98, 0x64, 0x98, 0x65, 0x98, 0x66, /* 0x60-0x63 */ + 0x98, 0x67, 0x98, 0x68, 0x98, 0x69, 0x98, 0x6A, /* 0x64-0x67 */ + 0xBB, 0xDD, 0xBB, 0xDE, 0x98, 0x6B, 0x98, 0x6C, /* 0x68-0x6B */ + 0x98, 0x6D, 0x98, 0x6E, 0x98, 0x6F, 0x98, 0x70, /* 0x6C-0x6F */ + 0x98, 0x71, 0x98, 0x72, 0x98, 0x73, 0x98, 0x74, /* 0x70-0x73 */ + 0x98, 0x75, 0x98, 0x76, 0x98, 0x77, 0x98, 0x78, /* 0x74-0x77 */ + 0x98, 0x79, 0x98, 0x7A, 0x98, 0x81, 0x98, 0x82, /* 0x78-0x7B */ + 0x98, 0x83, 0x98, 0x84, 0x98, 0x85, 0x98, 0x86, /* 0x7C-0x7F */ + + 0x98, 0x87, 0x98, 0x88, 0x98, 0x89, 0x98, 0x8A, /* 0x80-0x83 */ + 0x98, 0x8B, 0x98, 0x8C, 0x98, 0x8D, 0x98, 0x8E, /* 0x84-0x87 */ + 0x98, 0x8F, 0x98, 0x90, 0x98, 0x91, 0x98, 0x92, /* 0x88-0x8B */ + 0x98, 0x93, 0x98, 0x94, 0x98, 0x95, 0x98, 0x96, /* 0x8C-0x8F */ + 0xBB, 0xDF, 0xBB, 0xE0, 0x98, 0x97, 0x98, 0x98, /* 0x90-0x93 */ + 0xBB, 0xE1, 0x98, 0x99, 0x98, 0x9A, 0x98, 0x9B, /* 0x94-0x97 */ + 0xBB, 0xE2, 0x98, 0x9C, 0x98, 0x9D, 0x98, 0x9E, /* 0x98-0x9B */ + 0x98, 0x9F, 0x98, 0xA0, 0x98, 0xA1, 0x98, 0xA2, /* 0x9C-0x9F */ + 0xBB, 0xE3, 0xBB, 0xE4, 0x98, 0xA3, 0xBB, 0xE5, /* 0xA0-0xA3 */ + 0x98, 0xA4, 0xBB, 0xE6, 0x98, 0xA5, 0x98, 0xA6, /* 0xA4-0xA7 */ + 0x98, 0xA7, 0x98, 0xA8, 0x98, 0xA9, 0x98, 0xAA, /* 0xA8-0xAB */ + 0xBB, 0xE7, 0xBB, 0xE8, 0x98, 0xAB, 0xBB, 0xE9, /* 0xAC-0xAF */ + 0xBB, 0xEA, 0x98, 0xAC, 0x98, 0xAD, 0xBB, 0xEB, /* 0xB0-0xB3 */ + 0xBB, 0xEC, 0xBB, 0xED, 0xBB, 0xEE, 0x98, 0xAE, /* 0xB4-0xB7 */ + 0x98, 0xAF, 0x98, 0xB0, 0x98, 0xB1, 0x98, 0xB2, /* 0xB8-0xBB */ + 0xBB, 0xEF, 0xBB, 0xF0, 0x98, 0xB3, 0xBB, 0xF1, /* 0xBC-0xBF */ + 0xBB, 0xF2, 0xBB, 0xF3, 0x98, 0xB4, 0x98, 0xB5, /* 0xC0-0xC3 */ + 0x98, 0xB6, 0xBB, 0xF4, 0x98, 0xB7, 0x98, 0xB8, /* 0xC4-0xC7 */ + 0xBB, 0xF5, 0xBB, 0xF6, 0x98, 0xB9, 0x98, 0xBA, /* 0xC8-0xCB */ + 0xBB, 0xF7, 0x98, 0xBB, 0x98, 0xBC, 0x98, 0xBD, /* 0xCC-0xCF */ + 0xBB, 0xF8, 0x98, 0xBE, 0x98, 0xBF, 0x98, 0xC0, /* 0xD0-0xD3 */ + 0x98, 0xC1, 0x98, 0xC2, 0x98, 0xC3, 0x98, 0xC4, /* 0xD4-0xD7 */ + 0xBB, 0xF9, 0xBB, 0xFA, 0x98, 0xC5, 0xBB, 0xFB, /* 0xD8-0xDB */ + 0xBB, 0xFC, 0xBB, 0xFD, 0x98, 0xC6, 0x98, 0xC7, /* 0xDC-0xDF */ + 0x98, 0xC8, 0x98, 0xC9, 0x98, 0xCA, 0x98, 0xCB, /* 0xE0-0xE3 */ + 0xBB, 0xFE, 0xBC, 0xA1, 0x98, 0xCC, 0x98, 0xCD, /* 0xE4-0xE7 */ + 0xBC, 0xA2, 0x98, 0xCE, 0x98, 0xCF, 0x98, 0xD0, /* 0xE8-0xEB */ + 0xBC, 0xA3, 0x98, 0xD1, 0x98, 0xD2, 0x98, 0xD3, /* 0xEC-0xEF */ + 0x98, 0xD4, 0x98, 0xD5, 0x98, 0xD6, 0x98, 0xD7, /* 0xF0-0xF3 */ + 0xBC, 0xA4, 0xBC, 0xA5, 0x98, 0xD8, 0xBC, 0xA6, /* 0xF4-0xF7 */ + 0x98, 0xD9, 0xBC, 0xA7, 0x98, 0xDA, 0x98, 0xDB, /* 0xF8-0xFB */ + 0x98, 0xDC, 0x98, 0xDD, 0x98, 0xDE, 0x98, 0xDF, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C1[512] = { + 0xBC, 0xA8, 0x98, 0xE0, 0x98, 0xE1, 0x98, 0xE2, /* 0x00-0x03 */ + 0xBC, 0xA9, 0x98, 0xE3, 0x98, 0xE4, 0x98, 0xE5, /* 0x04-0x07 */ + 0xBC, 0xAA, 0x98, 0xE6, 0x98, 0xE7, 0x98, 0xE8, /* 0x08-0x0B */ + 0x98, 0xE9, 0x98, 0xEA, 0x98, 0xEB, 0x98, 0xEC, /* 0x0C-0x0F */ + 0xBC, 0xAB, 0x98, 0xED, 0x98, 0xEE, 0x98, 0xEF, /* 0x10-0x13 */ + 0x98, 0xF0, 0xBC, 0xAC, 0x98, 0xF1, 0x98, 0xF2, /* 0x14-0x17 */ + 0x98, 0xF3, 0x98, 0xF4, 0x98, 0xF5, 0x98, 0xF6, /* 0x18-0x1B */ + 0xBC, 0xAD, 0xBC, 0xAE, 0xBC, 0xAF, 0xBC, 0xB0, /* 0x1C-0x1F */ + 0xBC, 0xB1, 0x98, 0xF7, 0x98, 0xF8, 0xBC, 0xB2, /* 0x20-0x23 */ + 0xBC, 0xB3, 0x98, 0xF9, 0xBC, 0xB4, 0xBC, 0xB5, /* 0x24-0x27 */ + 0x98, 0xFA, 0x98, 0xFB, 0x98, 0xFC, 0x98, 0xFD, /* 0x28-0x2B */ + 0xBC, 0xB6, 0xBC, 0xB7, 0x98, 0xFE, 0xBC, 0xB8, /* 0x2C-0x2F */ + 0xBC, 0xB9, 0xBC, 0xBA, 0x99, 0x41, 0x99, 0x42, /* 0x30-0x33 */ + 0x99, 0x43, 0x99, 0x44, 0xBC, 0xBB, 0x99, 0x45, /* 0x34-0x37 */ + 0xBC, 0xBC, 0xBC, 0xBD, 0x99, 0x46, 0x99, 0x47, /* 0x38-0x3B */ + 0xBC, 0xBE, 0x99, 0x48, 0x99, 0x49, 0x99, 0x4A, /* 0x3C-0x3F */ + 0xBC, 0xBF, 0x99, 0x4B, 0x99, 0x4C, 0x99, 0x4D, /* 0x40-0x43 */ + 0x99, 0x4E, 0x99, 0x4F, 0x99, 0x50, 0x99, 0x51, /* 0x44-0x47 */ + 0xBC, 0xC0, 0xBC, 0xC1, 0x99, 0x52, 0xBC, 0xC2, /* 0x48-0x4B */ + 0xBC, 0xC3, 0xBC, 0xC4, 0x99, 0x53, 0x99, 0x54, /* 0x4C-0x4F */ + 0x99, 0x55, 0x99, 0x56, 0x99, 0x57, 0x99, 0x58, /* 0x50-0x53 */ + 0xBC, 0xC5, 0xBC, 0xC6, 0x99, 0x59, 0x99, 0x5A, /* 0x54-0x57 */ + 0xBC, 0xC7, 0x99, 0x61, 0x99, 0x62, 0x99, 0x63, /* 0x58-0x5B */ + 0xBC, 0xC8, 0x99, 0x64, 0x99, 0x65, 0x99, 0x66, /* 0x5C-0x5F */ + 0x99, 0x67, 0x99, 0x68, 0x99, 0x69, 0x99, 0x6A, /* 0x60-0x63 */ + 0xBC, 0xC9, 0xBC, 0xCA, 0x99, 0x6B, 0xBC, 0xCB, /* 0x64-0x67 */ + 0xBC, 0xCC, 0xBC, 0xCD, 0x99, 0x6C, 0x99, 0x6D, /* 0x68-0x6B */ + 0x99, 0x6E, 0x99, 0x6F, 0x99, 0x70, 0x99, 0x71, /* 0x6C-0x6F */ + 0xBC, 0xCE, 0x99, 0x72, 0x99, 0x73, 0x99, 0x74, /* 0x70-0x73 */ + 0xBC, 0xCF, 0x99, 0x75, 0x99, 0x76, 0x99, 0x77, /* 0x74-0x77 */ + 0xBC, 0xD0, 0x99, 0x78, 0x99, 0x79, 0x99, 0x7A, /* 0x78-0x7B */ + 0x99, 0x81, 0x99, 0x82, 0x99, 0x83, 0x99, 0x84, /* 0x7C-0x7F */ + + 0x99, 0x85, 0x99, 0x86, 0x99, 0x87, 0x99, 0x88, /* 0x80-0x83 */ + 0x99, 0x89, 0xBC, 0xD1, 0x99, 0x8A, 0x99, 0x8B, /* 0x84-0x87 */ + 0x99, 0x8C, 0x99, 0x8D, 0x99, 0x8E, 0x99, 0x8F, /* 0x88-0x8B */ + 0xBC, 0xD2, 0xBC, 0xD3, 0xBC, 0xD4, 0x99, 0x90, /* 0x8C-0x8F */ + 0xBC, 0xD5, 0x99, 0x91, 0x99, 0x92, 0x99, 0x93, /* 0x90-0x93 */ + 0xBC, 0xD6, 0x99, 0x94, 0xBC, 0xD7, 0x99, 0x95, /* 0x94-0x97 */ + 0x99, 0x96, 0x99, 0x97, 0x99, 0x98, 0x99, 0x99, /* 0x98-0x9B */ + 0xBC, 0xD8, 0xBC, 0xD9, 0x99, 0x9A, 0xBC, 0xDA, /* 0x9C-0x9F */ + 0x99, 0x9B, 0xBC, 0xDB, 0x99, 0x9C, 0x99, 0x9D, /* 0xA0-0xA3 */ + 0x99, 0x9E, 0xBC, 0xDC, 0x99, 0x9F, 0x99, 0xA0, /* 0xA4-0xA7 */ + 0xBC, 0xDD, 0xBC, 0xDE, 0x99, 0xA1, 0x99, 0xA2, /* 0xA8-0xAB */ + 0xBC, 0xDF, 0x99, 0xA3, 0x99, 0xA4, 0x99, 0xA5, /* 0xAC-0xAF */ + 0xBC, 0xE0, 0x99, 0xA6, 0x99, 0xA7, 0x99, 0xA8, /* 0xB0-0xB3 */ + 0x99, 0xA9, 0x99, 0xAA, 0x99, 0xAB, 0x99, 0xAC, /* 0xB4-0xB7 */ + 0x99, 0xAD, 0x99, 0xAE, 0x99, 0xAF, 0x99, 0xB0, /* 0xB8-0xBB */ + 0x99, 0xB1, 0xBC, 0xE1, 0x99, 0xB2, 0x99, 0xB3, /* 0xBC-0xBF */ + 0x99, 0xB4, 0x99, 0xB5, 0x99, 0xB6, 0x99, 0xB7, /* 0xC0-0xC3 */ + 0xBC, 0xE2, 0x99, 0xB8, 0x99, 0xB9, 0x99, 0xBA, /* 0xC4-0xC7 */ + 0xBC, 0xE3, 0x99, 0xBB, 0x99, 0xBC, 0x99, 0xBD, /* 0xC8-0xCB */ + 0xBC, 0xE4, 0x99, 0xBE, 0x99, 0xBF, 0x99, 0xC0, /* 0xCC-0xCF */ + 0x99, 0xC1, 0x99, 0xC2, 0x99, 0xC3, 0x99, 0xC4, /* 0xD0-0xD3 */ + 0xBC, 0xE5, 0x99, 0xC5, 0x99, 0xC6, 0xBC, 0xE6, /* 0xD4-0xD7 */ + 0xBC, 0xE7, 0x99, 0xC7, 0x99, 0xC8, 0x99, 0xC9, /* 0xD8-0xDB */ + 0x99, 0xCA, 0x99, 0xCB, 0x99, 0xCC, 0x99, 0xCD, /* 0xDC-0xDF */ + 0xBC, 0xE8, 0x99, 0xCE, 0x99, 0xCF, 0x99, 0xD0, /* 0xE0-0xE3 */ + 0xBC, 0xE9, 0x99, 0xD1, 0x99, 0xD2, 0x99, 0xD3, /* 0xE4-0xE7 */ + 0xBC, 0xEA, 0x99, 0xD4, 0x99, 0xD5, 0x99, 0xD6, /* 0xE8-0xEB */ + 0x99, 0xD7, 0x99, 0xD8, 0x99, 0xD9, 0x99, 0xDA, /* 0xEC-0xEF */ + 0xBC, 0xEB, 0xBC, 0xEC, 0x99, 0xDB, 0xBC, 0xED, /* 0xF0-0xF3 */ + 0x99, 0xDC, 0x99, 0xDD, 0x99, 0xDE, 0x99, 0xDF, /* 0xF4-0xF7 */ + 0x99, 0xE0, 0x99, 0xE1, 0x99, 0xE2, 0x99, 0xE3, /* 0xF8-0xFB */ + 0xBC, 0xEE, 0xBC, 0xEF, 0x99, 0xE4, 0x99, 0xE5, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C2[512] = { + 0xBC, 0xF0, 0x99, 0xE6, 0x99, 0xE7, 0x99, 0xE8, /* 0x00-0x03 */ + 0xBC, 0xF1, 0x99, 0xE9, 0x99, 0xEA, 0x99, 0xEB, /* 0x04-0x07 */ + 0x99, 0xEC, 0x99, 0xED, 0x99, 0xEE, 0x99, 0xEF, /* 0x08-0x0B */ + 0xBC, 0xF2, 0xBC, 0xF3, 0x99, 0xF0, 0xBC, 0xF4, /* 0x0C-0x0F */ + 0x99, 0xF1, 0xBC, 0xF5, 0x99, 0xF2, 0x99, 0xF3, /* 0x10-0x13 */ + 0x99, 0xF4, 0x99, 0xF5, 0x99, 0xF6, 0x99, 0xF7, /* 0x14-0x17 */ + 0xBC, 0xF6, 0xBC, 0xF7, 0x99, 0xF8, 0x99, 0xF9, /* 0x18-0x1B */ + 0xBC, 0xF8, 0x99, 0xFA, 0x99, 0xFB, 0xBC, 0xF9, /* 0x1C-0x1F */ + 0xBC, 0xFA, 0x99, 0xFC, 0x99, 0xFD, 0x99, 0xFE, /* 0x20-0x23 */ + 0x9A, 0x41, 0x9A, 0x42, 0x9A, 0x43, 0x9A, 0x44, /* 0x24-0x27 */ + 0xBC, 0xFB, 0xBC, 0xFC, 0x9A, 0x45, 0xBC, 0xFD, /* 0x28-0x2B */ + 0x9A, 0x46, 0xBC, 0xFE, 0x9A, 0x47, 0xBD, 0xA1, /* 0x2C-0x2F */ + 0x9A, 0x48, 0xBD, 0xA2, 0xBD, 0xA3, 0x9A, 0x49, /* 0x30-0x33 */ + 0xBD, 0xA4, 0x9A, 0x4A, 0x9A, 0x4B, 0x9A, 0x4C, /* 0x34-0x37 */ + 0x9A, 0x4D, 0x9A, 0x4E, 0x9A, 0x4F, 0x9A, 0x50, /* 0x38-0x3B */ + 0x9A, 0x51, 0x9A, 0x52, 0x9A, 0x53, 0x9A, 0x54, /* 0x3C-0x3F */ + 0x9A, 0x55, 0x9A, 0x56, 0x9A, 0x57, 0x9A, 0x58, /* 0x40-0x43 */ + 0x9A, 0x59, 0x9A, 0x5A, 0x9A, 0x61, 0x9A, 0x62, /* 0x44-0x47 */ + 0xBD, 0xA5, 0x9A, 0x63, 0x9A, 0x64, 0x9A, 0x65, /* 0x48-0x4B */ + 0x9A, 0x66, 0x9A, 0x67, 0x9A, 0x68, 0x9A, 0x69, /* 0x4C-0x4F */ + 0xBD, 0xA6, 0xBD, 0xA7, 0x9A, 0x6A, 0x9A, 0x6B, /* 0x50-0x53 */ + 0xBD, 0xA8, 0x9A, 0x6C, 0x9A, 0x6D, 0x9A, 0x6E, /* 0x54-0x57 */ + 0xBD, 0xA9, 0x9A, 0x6F, 0x9A, 0x70, 0x9A, 0x71, /* 0x58-0x5B */ + 0x9A, 0x72, 0x9A, 0x73, 0x9A, 0x74, 0x9A, 0x75, /* 0x5C-0x5F */ + 0xBD, 0xAA, 0x9A, 0x76, 0x9A, 0x77, 0x9A, 0x78, /* 0x60-0x63 */ + 0x9A, 0x79, 0xBD, 0xAB, 0x9A, 0x7A, 0x9A, 0x81, /* 0x64-0x67 */ + 0x9A, 0x82, 0x9A, 0x83, 0x9A, 0x84, 0x9A, 0x85, /* 0x68-0x6B */ + 0xBD, 0xAC, 0xBD, 0xAD, 0x9A, 0x86, 0x9A, 0x87, /* 0x6C-0x6F */ + 0xBD, 0xAE, 0x9A, 0x88, 0x9A, 0x89, 0x9A, 0x8A, /* 0x70-0x73 */ + 0xBD, 0xAF, 0x9A, 0x8B, 0x9A, 0x8C, 0x9A, 0x8D, /* 0x74-0x77 */ + 0x9A, 0x8E, 0x9A, 0x8F, 0x9A, 0x90, 0x9A, 0x91, /* 0x78-0x7B */ + 0xBD, 0xB0, 0xBD, 0xB1, 0x9A, 0x92, 0xBD, 0xB2, /* 0x7C-0x7F */ + + 0x9A, 0x93, 0xBD, 0xB3, 0x9A, 0x94, 0x9A, 0x95, /* 0x80-0x83 */ + 0x9A, 0x96, 0x9A, 0x97, 0x9A, 0x98, 0x9A, 0x99, /* 0x84-0x87 */ + 0xBD, 0xB4, 0xBD, 0xB5, 0x9A, 0x9A, 0x9A, 0x9B, /* 0x88-0x8B */ + 0x9A, 0x9C, 0x9A, 0x9D, 0x9A, 0x9E, 0x9A, 0x9F, /* 0x8C-0x8F */ + 0xBD, 0xB6, 0x9A, 0xA0, 0x9A, 0xA1, 0x9A, 0xA2, /* 0x90-0x93 */ + 0x9A, 0xA3, 0x9A, 0xA4, 0x9A, 0xA5, 0x9A, 0xA6, /* 0x94-0x97 */ + 0xBD, 0xB7, 0x9A, 0xA7, 0x9A, 0xA8, 0xBD, 0xB8, /* 0x98-0x9B */ + 0x9A, 0xA9, 0xBD, 0xB9, 0x9A, 0xAA, 0x9A, 0xAB, /* 0x9C-0x9F */ + 0x9A, 0xAC, 0x9A, 0xAD, 0x9A, 0xAE, 0x9A, 0xAF, /* 0xA0-0xA3 */ + 0xBD, 0xBA, 0xBD, 0xBB, 0x9A, 0xB0, 0x9A, 0xB1, /* 0xA4-0xA7 */ + 0xBD, 0xBC, 0x9A, 0xB2, 0x9A, 0xB3, 0x9A, 0xB4, /* 0xA8-0xAB */ + 0xBD, 0xBD, 0xBD, 0xBE, 0x9A, 0xB5, 0x9A, 0xB6, /* 0xAC-0xAF */ + 0x9A, 0xB7, 0x9A, 0xB8, 0x9A, 0xB9, 0x9A, 0xBA, /* 0xB0-0xB3 */ + 0xBD, 0xBF, 0xBD, 0xC0, 0x9A, 0xBB, 0xBD, 0xC1, /* 0xB4-0xB7 */ + 0x9A, 0xBC, 0xBD, 0xC2, 0x9A, 0xBD, 0x9A, 0xBE, /* 0xB8-0xBB */ + 0x9A, 0xBF, 0x9A, 0xC0, 0x9A, 0xC1, 0x9A, 0xC2, /* 0xBC-0xBF */ + 0x9A, 0xC3, 0x9A, 0xC4, 0x9A, 0xC5, 0x9A, 0xC6, /* 0xC0-0xC3 */ + 0x9A, 0xC7, 0x9A, 0xC8, 0x9A, 0xC9, 0x9A, 0xCA, /* 0xC4-0xC7 */ + 0x9A, 0xCB, 0x9A, 0xCC, 0x9A, 0xCD, 0x9A, 0xCE, /* 0xC8-0xCB */ + 0x9A, 0xCF, 0x9A, 0xD0, 0x9A, 0xD1, 0x9A, 0xD2, /* 0xCC-0xCF */ + 0x9A, 0xD3, 0x9A, 0xD4, 0x9A, 0xD5, 0x9A, 0xD6, /* 0xD0-0xD3 */ + 0x9A, 0xD7, 0x9A, 0xD8, 0x9A, 0xD9, 0x9A, 0xDA, /* 0xD4-0xD7 */ + 0x9A, 0xDB, 0x9A, 0xDC, 0x9A, 0xDD, 0x9A, 0xDE, /* 0xD8-0xDB */ + 0xBD, 0xC3, 0xBD, 0xC4, 0x9A, 0xDF, 0x9A, 0xE0, /* 0xDC-0xDF */ + 0xBD, 0xC5, 0x9A, 0xE1, 0x9A, 0xE2, 0xBD, 0xC6, /* 0xE0-0xE3 */ + 0xBD, 0xC7, 0x9A, 0xE3, 0x9A, 0xE4, 0x9A, 0xE5, /* 0xE4-0xE7 */ + 0x9A, 0xE6, 0x9A, 0xE7, 0x9A, 0xE8, 0xBD, 0xC8, /* 0xE8-0xEB */ + 0xBD, 0xC9, 0xBD, 0xCA, 0x9A, 0xE9, 0xBD, 0xCB, /* 0xEC-0xEF */ + 0x9A, 0xEA, 0xBD, 0xCC, 0x9A, 0xEB, 0x9A, 0xEC, /* 0xF0-0xF3 */ + 0x9A, 0xED, 0x9A, 0xEE, 0xBD, 0xCD, 0x9A, 0xEF, /* 0xF4-0xF7 */ + 0xBD, 0xCE, 0xBD, 0xCF, 0x9A, 0xF0, 0xBD, 0xD0, /* 0xF8-0xFB */ + 0xBD, 0xD1, 0x9A, 0xF1, 0x9A, 0xF2, 0x9A, 0xF3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C3[512] = { + 0xBD, 0xD2, 0x9A, 0xF4, 0x9A, 0xF5, 0x9A, 0xF6, /* 0x00-0x03 */ + 0x9A, 0xF7, 0x9A, 0xF8, 0x9A, 0xF9, 0x9A, 0xFA, /* 0x04-0x07 */ + 0xBD, 0xD3, 0xBD, 0xD4, 0x9A, 0xFB, 0x9A, 0xFC, /* 0x08-0x0B */ + 0xBD, 0xD5, 0xBD, 0xD6, 0x9A, 0xFD, 0x9A, 0xFE, /* 0x0C-0x0F */ + 0x9B, 0x41, 0x9B, 0x42, 0x9B, 0x43, 0xBD, 0xD7, /* 0x10-0x13 */ + 0xBD, 0xD8, 0xBD, 0xD9, 0x9B, 0x44, 0x9B, 0x45, /* 0x14-0x17 */ + 0xBD, 0xDA, 0x9B, 0x46, 0x9B, 0x47, 0x9B, 0x48, /* 0x18-0x1B */ + 0xBD, 0xDB, 0x9B, 0x49, 0x9B, 0x4A, 0x9B, 0x4B, /* 0x1C-0x1F */ + 0x9B, 0x4C, 0x9B, 0x4D, 0x9B, 0x4E, 0x9B, 0x4F, /* 0x20-0x23 */ + 0xBD, 0xDC, 0xBD, 0xDD, 0x9B, 0x50, 0x9B, 0x51, /* 0x24-0x27 */ + 0xBD, 0xDE, 0xBD, 0xDF, 0x9B, 0x52, 0x9B, 0x53, /* 0x28-0x2B */ + 0x9B, 0x54, 0x9B, 0x55, 0x9B, 0x56, 0x9B, 0x57, /* 0x2C-0x2F */ + 0x9B, 0x58, 0x9B, 0x59, 0x9B, 0x5A, 0x9B, 0x61, /* 0x30-0x33 */ + 0x9B, 0x62, 0x9B, 0x63, 0x9B, 0x64, 0x9B, 0x65, /* 0x34-0x37 */ + 0x9B, 0x66, 0x9B, 0x67, 0x9B, 0x68, 0x9B, 0x69, /* 0x38-0x3B */ + 0x9B, 0x6A, 0x9B, 0x6B, 0x9B, 0x6C, 0x9B, 0x6D, /* 0x3C-0x3F */ + 0x9B, 0x6E, 0x9B, 0x6F, 0x9B, 0x70, 0x9B, 0x71, /* 0x40-0x43 */ + 0x9B, 0x72, 0xBD, 0xE0, 0x9B, 0x73, 0x9B, 0x74, /* 0x44-0x47 */ + 0x9B, 0x75, 0x9B, 0x76, 0x9B, 0x77, 0x9B, 0x78, /* 0x48-0x4B */ + 0x9B, 0x79, 0x9B, 0x7A, 0x9B, 0x81, 0x9B, 0x82, /* 0x4C-0x4F */ + 0x9B, 0x83, 0x9B, 0x84, 0x9B, 0x85, 0x9B, 0x86, /* 0x50-0x53 */ + 0x9B, 0x87, 0x9B, 0x88, 0x9B, 0x89, 0x9B, 0x8A, /* 0x54-0x57 */ + 0x9B, 0x8B, 0x9B, 0x8C, 0x9B, 0x8D, 0x9B, 0x8E, /* 0x58-0x5B */ + 0x9B, 0x8F, 0x9B, 0x90, 0x9B, 0x91, 0x9B, 0x92, /* 0x5C-0x5F */ + 0x9B, 0x93, 0x9B, 0x94, 0x9B, 0x95, 0x9B, 0x96, /* 0x60-0x63 */ + 0x9B, 0x97, 0x9B, 0x98, 0x9B, 0x99, 0x9B, 0x9A, /* 0x64-0x67 */ + 0xBD, 0xE1, 0xBD, 0xE2, 0x9B, 0x9B, 0x9B, 0x9C, /* 0x68-0x6B */ + 0xBD, 0xE3, 0x9B, 0x9D, 0x9B, 0x9E, 0x9B, 0x9F, /* 0x6C-0x6F */ + 0xBD, 0xE4, 0x9B, 0xA0, 0xBD, 0xE5, 0x9B, 0xA1, /* 0x70-0x73 */ + 0x9B, 0xA2, 0x9B, 0xA3, 0x9B, 0xA4, 0x9B, 0xA5, /* 0x74-0x77 */ + 0xBD, 0xE6, 0xBD, 0xE7, 0x9B, 0xA6, 0x9B, 0xA7, /* 0x78-0x7B */ + 0xBD, 0xE8, 0xBD, 0xE9, 0x9B, 0xA8, 0x9B, 0xA9, /* 0x7C-0x7F */ + + 0x9B, 0xAA, 0x9B, 0xAB, 0x9B, 0xAC, 0x9B, 0xAD, /* 0x80-0x83 */ + 0xBD, 0xEA, 0x9B, 0xAE, 0x9B, 0xAF, 0x9B, 0xB0, /* 0x84-0x87 */ + 0xBD, 0xEB, 0x9B, 0xB1, 0x9B, 0xB2, 0x9B, 0xB3, /* 0x88-0x8B */ + 0xBD, 0xEC, 0x9B, 0xB4, 0x9B, 0xB5, 0x9B, 0xB6, /* 0x8C-0x8F */ + 0x9B, 0xB7, 0x9B, 0xB8, 0x9B, 0xB9, 0x9B, 0xBA, /* 0x90-0x93 */ + 0x9B, 0xBB, 0x9B, 0xBC, 0x9B, 0xBD, 0x9B, 0xBE, /* 0x94-0x97 */ + 0x9B, 0xBF, 0x9B, 0xC0, 0x9B, 0xC1, 0x9B, 0xC2, /* 0x98-0x9B */ + 0x9B, 0xC3, 0x9B, 0xC4, 0x9B, 0xC5, 0x9B, 0xC6, /* 0x9C-0x9F */ + 0x9B, 0xC7, 0x9B, 0xC8, 0x9B, 0xC9, 0x9B, 0xCA, /* 0xA0-0xA3 */ + 0x9B, 0xCB, 0x9B, 0xCC, 0x9B, 0xCD, 0x9B, 0xCE, /* 0xA4-0xA7 */ + 0x9B, 0xCF, 0x9B, 0xD0, 0x9B, 0xD1, 0x9B, 0xD2, /* 0xA8-0xAB */ + 0x9B, 0xD3, 0x9B, 0xD4, 0x9B, 0xD5, 0x9B, 0xD6, /* 0xAC-0xAF */ + 0x9B, 0xD7, 0x9B, 0xD8, 0x9B, 0xD9, 0x9B, 0xDA, /* 0xB0-0xB3 */ + 0x9B, 0xDB, 0x9B, 0xDC, 0x9B, 0xDD, 0x9B, 0xDE, /* 0xB4-0xB7 */ + 0x9B, 0xDF, 0x9B, 0xE0, 0x9B, 0xE1, 0x9B, 0xE2, /* 0xB8-0xBB */ + 0x9B, 0xE3, 0x9B, 0xE4, 0x9B, 0xE5, 0x9B, 0xE6, /* 0xBC-0xBF */ + 0xBD, 0xED, 0x9B, 0xE7, 0x9B, 0xE8, 0x9B, 0xE9, /* 0xC0-0xC3 */ + 0x9B, 0xEA, 0x9B, 0xEB, 0x9B, 0xEC, 0x9B, 0xED, /* 0xC4-0xC7 */ + 0x9B, 0xEE, 0x9B, 0xEF, 0x9B, 0xF0, 0x9B, 0xF1, /* 0xC8-0xCB */ + 0x9B, 0xF2, 0x9B, 0xF3, 0x9B, 0xF4, 0x9B, 0xF5, /* 0xCC-0xCF */ + 0x9B, 0xF6, 0x9B, 0xF7, 0x9B, 0xF8, 0x9B, 0xF9, /* 0xD0-0xD3 */ + 0x9B, 0xFA, 0x9B, 0xFB, 0x9B, 0xFC, 0x9B, 0xFD, /* 0xD4-0xD7 */ + 0xBD, 0xEE, 0xBD, 0xEF, 0x9B, 0xFE, 0x9C, 0x41, /* 0xD8-0xDB */ + 0xBD, 0xF0, 0x9C, 0x42, 0x9C, 0x43, 0xBD, 0xF1, /* 0xDC-0xDF */ + 0xBD, 0xF2, 0x9C, 0x44, 0xBD, 0xF3, 0x9C, 0x45, /* 0xE0-0xE3 */ + 0x9C, 0x46, 0x9C, 0x47, 0x9C, 0x48, 0x9C, 0x49, /* 0xE4-0xE7 */ + 0xBD, 0xF4, 0xBD, 0xF5, 0x9C, 0x4A, 0x9C, 0x4B, /* 0xE8-0xEB */ + 0x9C, 0x4C, 0xBD, 0xF6, 0x9C, 0x4D, 0x9C, 0x4E, /* 0xEC-0xEF */ + 0x9C, 0x4F, 0x9C, 0x50, 0x9C, 0x51, 0x9C, 0x52, /* 0xF0-0xF3 */ + 0xBD, 0xF7, 0xBD, 0xF8, 0x9C, 0x53, 0x9C, 0x54, /* 0xF4-0xF7 */ + 0xBD, 0xF9, 0x9C, 0x55, 0x9C, 0x56, 0x9C, 0x57, /* 0xF8-0xFB */ + 0x9C, 0x58, 0x9C, 0x59, 0x9C, 0x5A, 0x9C, 0x61, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C4[512] = { + 0x9C, 0x62, 0x9C, 0x63, 0x9C, 0x64, 0x9C, 0x65, /* 0x00-0x03 */ + 0x9C, 0x66, 0x9C, 0x67, 0x9C, 0x68, 0x9C, 0x69, /* 0x04-0x07 */ + 0xBD, 0xFA, 0x9C, 0x6A, 0x9C, 0x6B, 0x9C, 0x6C, /* 0x08-0x0B */ + 0x9C, 0x6D, 0x9C, 0x6E, 0x9C, 0x6F, 0x9C, 0x70, /* 0x0C-0x0F */ + 0xBD, 0xFB, 0x9C, 0x71, 0x9C, 0x72, 0x9C, 0x73, /* 0x10-0x13 */ + 0x9C, 0x74, 0x9C, 0x75, 0x9C, 0x76, 0x9C, 0x77, /* 0x14-0x17 */ + 0x9C, 0x78, 0x9C, 0x79, 0x9C, 0x7A, 0x9C, 0x81, /* 0x18-0x1B */ + 0x9C, 0x82, 0x9C, 0x83, 0x9C, 0x84, 0x9C, 0x85, /* 0x1C-0x1F */ + 0x9C, 0x86, 0x9C, 0x87, 0x9C, 0x88, 0x9C, 0x89, /* 0x20-0x23 */ + 0xBD, 0xFC, 0x9C, 0x8A, 0x9C, 0x8B, 0x9C, 0x8C, /* 0x24-0x27 */ + 0x9C, 0x8D, 0x9C, 0x8E, 0x9C, 0x8F, 0x9C, 0x90, /* 0x28-0x2B */ + 0xBD, 0xFD, 0x9C, 0x91, 0x9C, 0x92, 0x9C, 0x93, /* 0x2C-0x2F */ + 0xBD, 0xFE, 0x9C, 0x94, 0x9C, 0x95, 0x9C, 0x96, /* 0x30-0x33 */ + 0xBE, 0xA1, 0x9C, 0x97, 0x9C, 0x98, 0x9C, 0x99, /* 0x34-0x37 */ + 0x9C, 0x9A, 0x9C, 0x9B, 0x9C, 0x9C, 0x9C, 0x9D, /* 0x38-0x3B */ + 0xBE, 0xA2, 0xBE, 0xA3, 0x9C, 0x9E, 0x9C, 0x9F, /* 0x3C-0x3F */ + 0x9C, 0xA0, 0x9C, 0xA1, 0x9C, 0xA2, 0x9C, 0xA3, /* 0x40-0x43 */ + 0x9C, 0xA4, 0x9C, 0xA5, 0x9C, 0xA6, 0x9C, 0xA7, /* 0x44-0x47 */ + 0xBE, 0xA4, 0x9C, 0xA8, 0x9C, 0xA9, 0x9C, 0xAA, /* 0x48-0x4B */ + 0x9C, 0xAB, 0x9C, 0xAC, 0x9C, 0xAD, 0x9C, 0xAE, /* 0x4C-0x4F */ + 0x9C, 0xAF, 0x9C, 0xB0, 0x9C, 0xB1, 0x9C, 0xB2, /* 0x50-0x53 */ + 0x9C, 0xB3, 0x9C, 0xB4, 0x9C, 0xB5, 0x9C, 0xB6, /* 0x54-0x57 */ + 0x9C, 0xB7, 0x9C, 0xB8, 0x9C, 0xB9, 0x9C, 0xBA, /* 0x58-0x5B */ + 0x9C, 0xBB, 0x9C, 0xBC, 0x9C, 0xBD, 0x9C, 0xBE, /* 0x5C-0x5F */ + 0x9C, 0xBF, 0x9C, 0xC0, 0x9C, 0xC1, 0x9C, 0xC2, /* 0x60-0x63 */ + 0xBE, 0xA5, 0xBE, 0xA6, 0x9C, 0xC3, 0x9C, 0xC4, /* 0x64-0x67 */ + 0xBE, 0xA7, 0x9C, 0xC5, 0x9C, 0xC6, 0x9C, 0xC7, /* 0x68-0x6B */ + 0xBE, 0xA8, 0x9C, 0xC8, 0x9C, 0xC9, 0x9C, 0xCA, /* 0x6C-0x6F */ + 0x9C, 0xCB, 0x9C, 0xCC, 0x9C, 0xCD, 0x9C, 0xCE, /* 0x70-0x73 */ + 0xBE, 0xA9, 0xBE, 0xAA, 0x9C, 0xCF, 0x9C, 0xD0, /* 0x74-0x77 */ + 0x9C, 0xD1, 0xBE, 0xAB, 0x9C, 0xD2, 0x9C, 0xD3, /* 0x78-0x7B */ + 0x9C, 0xD4, 0x9C, 0xD5, 0x9C, 0xD6, 0x9C, 0xD7, /* 0x7C-0x7F */ + + 0xBE, 0xAC, 0x9C, 0xD8, 0x9C, 0xD9, 0x9C, 0xDA, /* 0x80-0x83 */ + 0x9C, 0xDB, 0x9C, 0xDC, 0x9C, 0xDD, 0x9C, 0xDE, /* 0x84-0x87 */ + 0x9C, 0xDF, 0x9C, 0xE0, 0x9C, 0xE1, 0x9C, 0xE2, /* 0x88-0x8B */ + 0x9C, 0xE3, 0x9C, 0xE4, 0x9C, 0xE5, 0x9C, 0xE6, /* 0x8C-0x8F */ + 0x9C, 0xE7, 0x9C, 0xE8, 0x9C, 0xE9, 0x9C, 0xEA, /* 0x90-0x93 */ + 0xBE, 0xAD, 0x9C, 0xEB, 0x9C, 0xEC, 0x9C, 0xED, /* 0x94-0x97 */ + 0x9C, 0xEE, 0x9C, 0xEF, 0x9C, 0xF0, 0x9C, 0xF1, /* 0x98-0x9B */ + 0xBE, 0xAE, 0x9C, 0xF2, 0x9C, 0xF3, 0x9C, 0xF4, /* 0x9C-0x9F */ + 0x9C, 0xF5, 0x9C, 0xF6, 0x9C, 0xF7, 0x9C, 0xF8, /* 0xA0-0xA3 */ + 0x9C, 0xF9, 0x9C, 0xFA, 0x9C, 0xFB, 0x9C, 0xFC, /* 0xA4-0xA7 */ + 0x9C, 0xFD, 0x9C, 0xFE, 0x9D, 0x41, 0x9D, 0x42, /* 0xA8-0xAB */ + 0x9D, 0x43, 0x9D, 0x44, 0x9D, 0x45, 0x9D, 0x46, /* 0xAC-0xAF */ + 0x9D, 0x47, 0x9D, 0x48, 0x9D, 0x49, 0x9D, 0x4A, /* 0xB0-0xB3 */ + 0x9D, 0x4B, 0x9D, 0x4C, 0x9D, 0x4D, 0x9D, 0x4E, /* 0xB4-0xB7 */ + 0xBE, 0xAF, 0x9D, 0x4F, 0x9D, 0x50, 0x9D, 0x51, /* 0xB8-0xBB */ + 0xBE, 0xB0, 0x9D, 0x52, 0x9D, 0x53, 0x9D, 0x54, /* 0xBC-0xBF */ + 0x9D, 0x55, 0x9D, 0x56, 0x9D, 0x57, 0x9D, 0x58, /* 0xC0-0xC3 */ + 0x9D, 0x59, 0x9D, 0x5A, 0x9D, 0x61, 0x9D, 0x62, /* 0xC4-0xC7 */ + 0x9D, 0x63, 0x9D, 0x64, 0x9D, 0x65, 0x9D, 0x66, /* 0xC8-0xCB */ + 0x9D, 0x67, 0x9D, 0x68, 0x9D, 0x69, 0x9D, 0x6A, /* 0xCC-0xCF */ + 0x9D, 0x6B, 0x9D, 0x6C, 0x9D, 0x6D, 0x9D, 0x6E, /* 0xD0-0xD3 */ + 0x9D, 0x6F, 0x9D, 0x70, 0x9D, 0x71, 0x9D, 0x72, /* 0xD4-0xD7 */ + 0x9D, 0x73, 0x9D, 0x74, 0x9D, 0x75, 0x9D, 0x76, /* 0xD8-0xDB */ + 0x9D, 0x77, 0x9D, 0x78, 0x9D, 0x79, 0x9D, 0x7A, /* 0xDC-0xDF */ + 0x9D, 0x81, 0x9D, 0x82, 0x9D, 0x83, 0x9D, 0x84, /* 0xE0-0xE3 */ + 0x9D, 0x85, 0x9D, 0x86, 0x9D, 0x87, 0x9D, 0x88, /* 0xE4-0xE7 */ + 0x9D, 0x89, 0xBE, 0xB1, 0x9D, 0x8A, 0x9D, 0x8B, /* 0xE8-0xEB */ + 0x9D, 0x8C, 0x9D, 0x8D, 0x9D, 0x8E, 0x9D, 0x8F, /* 0xEC-0xEF */ + 0xBE, 0xB2, 0xBE, 0xB3, 0x9D, 0x90, 0x9D, 0x91, /* 0xF0-0xF3 */ + 0xBE, 0xB4, 0x9D, 0x92, 0x9D, 0x93, 0x9D, 0x94, /* 0xF4-0xF7 */ + 0xBE, 0xB5, 0x9D, 0x95, 0xBE, 0xB6, 0x9D, 0x96, /* 0xF8-0xFB */ + 0x9D, 0x97, 0x9D, 0x98, 0x9D, 0x99, 0xBE, 0xB7, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C5[512] = { + 0xBE, 0xB8, 0xBE, 0xB9, 0x9D, 0x9A, 0x9D, 0x9B, /* 0x00-0x03 */ + 0x9D, 0x9C, 0x9D, 0x9D, 0x9D, 0x9E, 0x9D, 0x9F, /* 0x04-0x07 */ + 0x9D, 0xA0, 0x9D, 0xA1, 0x9D, 0xA2, 0x9D, 0xA3, /* 0x08-0x0B */ + 0xBE, 0xBA, 0x9D, 0xA4, 0x9D, 0xA5, 0x9D, 0xA6, /* 0x0C-0x0F */ + 0xBE, 0xBB, 0x9D, 0xA7, 0x9D, 0xA8, 0x9D, 0xA9, /* 0x10-0x13 */ + 0xBE, 0xBC, 0x9D, 0xAA, 0x9D, 0xAB, 0x9D, 0xAC, /* 0x14-0x17 */ + 0x9D, 0xAD, 0x9D, 0xAE, 0x9D, 0xAF, 0x9D, 0xB0, /* 0x18-0x1B */ + 0xBE, 0xBD, 0x9D, 0xB1, 0x9D, 0xB2, 0x9D, 0xB3, /* 0x1C-0x1F */ + 0x9D, 0xB4, 0x9D, 0xB5, 0x9D, 0xB6, 0x9D, 0xB7, /* 0x20-0x23 */ + 0x9D, 0xB8, 0x9D, 0xB9, 0x9D, 0xBA, 0x9D, 0xBB, /* 0x24-0x27 */ + 0xBE, 0xBE, 0xBE, 0xBF, 0x9D, 0xBC, 0x9D, 0xBD, /* 0x28-0x2B */ + 0xBE, 0xC0, 0x9D, 0xBE, 0x9D, 0xBF, 0x9D, 0xC0, /* 0x2C-0x2F */ + 0xBE, 0xC1, 0x9D, 0xC1, 0x9D, 0xC2, 0x9D, 0xC3, /* 0x30-0x33 */ + 0x9D, 0xC4, 0x9D, 0xC5, 0x9D, 0xC6, 0x9D, 0xC7, /* 0x34-0x37 */ + 0xBE, 0xC2, 0xBE, 0xC3, 0x9D, 0xC8, 0xBE, 0xC4, /* 0x38-0x3B */ + 0x9D, 0xC9, 0xBE, 0xC5, 0x9D, 0xCA, 0x9D, 0xCB, /* 0x3C-0x3F */ + 0x9D, 0xCC, 0x9D, 0xCD, 0x9D, 0xCE, 0x9D, 0xCF, /* 0x40-0x43 */ + 0xBE, 0xC6, 0xBE, 0xC7, 0x9D, 0xD0, 0x9D, 0xD1, /* 0x44-0x47 */ + 0xBE, 0xC8, 0xBE, 0xC9, 0xBE, 0xCA, 0x9D, 0xD2, /* 0x48-0x4B */ + 0xBE, 0xCB, 0xBE, 0xCC, 0xBE, 0xCD, 0x9D, 0xD3, /* 0x4C-0x4F */ + 0x9D, 0xD4, 0x9D, 0xD5, 0x9D, 0xD6, 0xBE, 0xCE, /* 0x50-0x53 */ + 0xBE, 0xCF, 0xBE, 0xD0, 0x9D, 0xD7, 0xBE, 0xD1, /* 0x54-0x57 */ + 0xBE, 0xD2, 0xBE, 0xD3, 0x9D, 0xD8, 0x9D, 0xD9, /* 0x58-0x5B */ + 0x9D, 0xDA, 0xBE, 0xD4, 0xBE, 0xD5, 0x9D, 0xDB, /* 0x5C-0x5F */ + 0xBE, 0xD6, 0xBE, 0xD7, 0x9D, 0xDC, 0x9D, 0xDD, /* 0x60-0x63 */ + 0xBE, 0xD8, 0x9D, 0xDE, 0x9D, 0xDF, 0x9D, 0xE0, /* 0x64-0x67 */ + 0xBE, 0xD9, 0x9D, 0xE1, 0x9D, 0xE2, 0x9D, 0xE3, /* 0x68-0x6B */ + 0x9D, 0xE4, 0x9D, 0xE5, 0x9D, 0xE6, 0x9D, 0xE7, /* 0x6C-0x6F */ + 0xBE, 0xDA, 0xBE, 0xDB, 0x9D, 0xE8, 0xBE, 0xDC, /* 0x70-0x73 */ + 0xBE, 0xDD, 0xBE, 0xDE, 0x9D, 0xE9, 0x9D, 0xEA, /* 0x74-0x77 */ + 0x9D, 0xEB, 0x9D, 0xEC, 0x9D, 0xED, 0x9D, 0xEE, /* 0x78-0x7B */ + 0xBE, 0xDF, 0xBE, 0xE0, 0x9D, 0xEF, 0x9D, 0xF0, /* 0x7C-0x7F */ + + 0xBE, 0xE1, 0x9D, 0xF1, 0x9D, 0xF2, 0x9D, 0xF3, /* 0x80-0x83 */ + 0xBE, 0xE2, 0x9D, 0xF4, 0x9D, 0xF5, 0xBE, 0xE3, /* 0x84-0x87 */ + 0x9D, 0xF6, 0x9D, 0xF7, 0x9D, 0xF8, 0x9D, 0xF9, /* 0x88-0x8B */ + 0xBE, 0xE4, 0xBE, 0xE5, 0x9D, 0xFA, 0xBE, 0xE6, /* 0x8C-0x8F */ + 0x9D, 0xFB, 0xBE, 0xE7, 0x9D, 0xFC, 0x9D, 0xFD, /* 0x90-0x93 */ + 0x9D, 0xFE, 0xBE, 0xE8, 0x9E, 0x41, 0xBE, 0xE9, /* 0x94-0x97 */ + 0xBE, 0xEA, 0x9E, 0x42, 0x9E, 0x43, 0x9E, 0x44, /* 0x98-0x9B */ + 0xBE, 0xEB, 0x9E, 0x45, 0x9E, 0x46, 0x9E, 0x47, /* 0x9C-0x9F */ + 0xBE, 0xEC, 0x9E, 0x48, 0x9E, 0x49, 0x9E, 0x4A, /* 0xA0-0xA3 */ + 0x9E, 0x4B, 0x9E, 0x4C, 0x9E, 0x4D, 0x9E, 0x4E, /* 0xA4-0xA7 */ + 0x9E, 0x4F, 0xBE, 0xED, 0x9E, 0x50, 0x9E, 0x51, /* 0xA8-0xAB */ + 0x9E, 0x52, 0x9E, 0x53, 0x9E, 0x54, 0x9E, 0x55, /* 0xAC-0xAF */ + 0x9E, 0x56, 0x9E, 0x57, 0x9E, 0x58, 0x9E, 0x59, /* 0xB0-0xB3 */ + 0xBE, 0xEE, 0xBE, 0xEF, 0x9E, 0x5A, 0x9E, 0x61, /* 0xB4-0xB7 */ + 0xBE, 0xF0, 0xBE, 0xF1, 0x9E, 0x62, 0xBE, 0xF2, /* 0xB8-0xBB */ + 0xBE, 0xF3, 0xBE, 0xF4, 0xBE, 0xF5, 0x9E, 0x63, /* 0xBC-0xBF */ + 0x9E, 0x64, 0x9E, 0x65, 0x9E, 0x66, 0x9E, 0x67, /* 0xC0-0xC3 */ + 0xBE, 0xF6, 0xBE, 0xF7, 0xBE, 0xF8, 0xBE, 0xF9, /* 0xC4-0xC7 */ + 0xBE, 0xFA, 0xBE, 0xFB, 0xBE, 0xFC, 0x9E, 0x68, /* 0xC8-0xCB */ + 0xBE, 0xFD, 0x9E, 0x69, 0xBE, 0xFE, 0x9E, 0x6A, /* 0xCC-0xCF */ + 0xBF, 0xA1, 0xBF, 0xA2, 0x9E, 0x6B, 0x9E, 0x6C, /* 0xD0-0xD3 */ + 0xBF, 0xA3, 0x9E, 0x6D, 0x9E, 0x6E, 0x9E, 0x6F, /* 0xD4-0xD7 */ + 0xBF, 0xA4, 0x9E, 0x70, 0x9E, 0x71, 0x9E, 0x72, /* 0xD8-0xDB */ + 0x9E, 0x73, 0x9E, 0x74, 0x9E, 0x75, 0x9E, 0x76, /* 0xDC-0xDF */ + 0xBF, 0xA5, 0xBF, 0xA6, 0x9E, 0x77, 0xBF, 0xA7, /* 0xE0-0xE3 */ + 0x9E, 0x78, 0xBF, 0xA8, 0x9E, 0x79, 0x9E, 0x7A, /* 0xE4-0xE7 */ + 0x9E, 0x81, 0x9E, 0x82, 0x9E, 0x83, 0x9E, 0x84, /* 0xE8-0xEB */ + 0xBF, 0xA9, 0xBF, 0xAA, 0xBF, 0xAB, 0x9E, 0x85, /* 0xEC-0xEF */ + 0xBF, 0xAC, 0x9E, 0x86, 0x9E, 0x87, 0x9E, 0x88, /* 0xF0-0xF3 */ + 0xBF, 0xAD, 0x9E, 0x89, 0xBF, 0xAE, 0xBF, 0xAF, /* 0xF4-0xF7 */ + 0x9E, 0x8A, 0x9E, 0x8B, 0x9E, 0x8C, 0x9E, 0x8D, /* 0xF8-0xFB */ + 0xBF, 0xB0, 0xBF, 0xB1, 0xBF, 0xB2, 0xBF, 0xB3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C6[512] = { + 0xBF, 0xB4, 0xBF, 0xB5, 0x9E, 0x8E, 0x9E, 0x8F, /* 0x00-0x03 */ + 0x9E, 0x90, 0xBF, 0xB6, 0xBF, 0xB7, 0xBF, 0xB8, /* 0x04-0x07 */ + 0xBF, 0xB9, 0x9E, 0x91, 0x9E, 0x92, 0x9E, 0x93, /* 0x08-0x0B */ + 0xBF, 0xBA, 0x9E, 0x94, 0x9E, 0x95, 0x9E, 0x96, /* 0x0C-0x0F */ + 0xBF, 0xBB, 0x9E, 0x97, 0x9E, 0x98, 0x9E, 0x99, /* 0x10-0x13 */ + 0x9E, 0x9A, 0x9E, 0x9B, 0x9E, 0x9C, 0x9E, 0x9D, /* 0x14-0x17 */ + 0xBF, 0xBC, 0xBF, 0xBD, 0x9E, 0x9E, 0xBF, 0xBE, /* 0x18-0x1B */ + 0xBF, 0xBF, 0x9E, 0x9F, 0x9E, 0xA0, 0x9E, 0xA1, /* 0x1C-0x1F */ + 0x9E, 0xA2, 0x9E, 0xA3, 0x9E, 0xA4, 0x9E, 0xA5, /* 0x20-0x23 */ + 0xBF, 0xC0, 0xBF, 0xC1, 0x9E, 0xA6, 0x9E, 0xA7, /* 0x24-0x27 */ + 0xBF, 0xC2, 0x9E, 0xA8, 0x9E, 0xA9, 0x9E, 0xAA, /* 0x28-0x2B */ + 0xBF, 0xC3, 0xBF, 0xC4, 0xBF, 0xC5, 0x9E, 0xAB, /* 0x2C-0x2F */ + 0xBF, 0xC6, 0x9E, 0xAC, 0x9E, 0xAD, 0xBF, 0xC7, /* 0x30-0x33 */ + 0xBF, 0xC8, 0xBF, 0xC9, 0x9E, 0xAE, 0xBF, 0xCA, /* 0x34-0x37 */ + 0x9E, 0xAF, 0xBF, 0xCB, 0x9E, 0xB0, 0xBF, 0xCC, /* 0x38-0x3B */ + 0x9E, 0xB1, 0x9E, 0xB2, 0x9E, 0xB3, 0x9E, 0xB4, /* 0x3C-0x3F */ + 0xBF, 0xCD, 0xBF, 0xCE, 0x9E, 0xB5, 0x9E, 0xB6, /* 0x40-0x43 */ + 0xBF, 0xCF, 0x9E, 0xB7, 0x9E, 0xB8, 0x9E, 0xB9, /* 0x44-0x47 */ + 0xBF, 0xD0, 0x9E, 0xBA, 0x9E, 0xBB, 0x9E, 0xBC, /* 0x48-0x4B */ + 0x9E, 0xBD, 0x9E, 0xBE, 0x9E, 0xBF, 0x9E, 0xC0, /* 0x4C-0x4F */ + 0xBF, 0xD1, 0xBF, 0xD2, 0x9E, 0xC1, 0xBF, 0xD3, /* 0x50-0x53 */ + 0xBF, 0xD4, 0xBF, 0xD5, 0x9E, 0xC2, 0x9E, 0xC3, /* 0x54-0x57 */ + 0x9E, 0xC4, 0x9E, 0xC5, 0x9E, 0xC6, 0x9E, 0xC7, /* 0x58-0x5B */ + 0xBF, 0xD6, 0xBF, 0xD7, 0x9E, 0xC8, 0x9E, 0xC9, /* 0x5C-0x5F */ + 0xBF, 0xD8, 0x9E, 0xCA, 0x9E, 0xCB, 0x9E, 0xCC, /* 0x60-0x63 */ + 0x9E, 0xCD, 0x9E, 0xCE, 0x9E, 0xCF, 0x9E, 0xD0, /* 0x64-0x67 */ + 0x9E, 0xD1, 0x9E, 0xD2, 0x9E, 0xD3, 0x9E, 0xD4, /* 0x68-0x6B */ + 0xBF, 0xD9, 0x9E, 0xD5, 0x9E, 0xD6, 0xBF, 0xDA, /* 0x6C-0x6F */ + 0x9E, 0xD7, 0xBF, 0xDB, 0x9E, 0xD8, 0x9E, 0xD9, /* 0x70-0x73 */ + 0x9E, 0xDA, 0x9E, 0xDB, 0x9E, 0xDC, 0x9E, 0xDD, /* 0x74-0x77 */ + 0xBF, 0xDC, 0xBF, 0xDD, 0x9E, 0xDE, 0x9E, 0xDF, /* 0x78-0x7B */ + 0xBF, 0xDE, 0x9E, 0xE0, 0x9E, 0xE1, 0x9E, 0xE2, /* 0x7C-0x7F */ + + 0xBF, 0xDF, 0x9E, 0xE3, 0x9E, 0xE4, 0x9E, 0xE5, /* 0x80-0x83 */ + 0x9E, 0xE6, 0x9E, 0xE7, 0x9E, 0xE8, 0x9E, 0xE9, /* 0x84-0x87 */ + 0xBF, 0xE0, 0xBF, 0xE1, 0x9E, 0xEA, 0xBF, 0xE2, /* 0x88-0x8B */ + 0x9E, 0xEB, 0xBF, 0xE3, 0x9E, 0xEC, 0x9E, 0xED, /* 0x8C-0x8F */ + 0x9E, 0xEE, 0x9E, 0xEF, 0x9E, 0xF0, 0x9E, 0xF1, /* 0x90-0x93 */ + 0xBF, 0xE4, 0xBF, 0xE5, 0x9E, 0xF2, 0x9E, 0xF3, /* 0x94-0x97 */ + 0xBF, 0xE6, 0x9E, 0xF4, 0x9E, 0xF5, 0x9E, 0xF6, /* 0x98-0x9B */ + 0xBF, 0xE7, 0x9E, 0xF7, 0x9E, 0xF8, 0x9E, 0xF9, /* 0x9C-0x9F */ + 0x9E, 0xFA, 0x9E, 0xFB, 0x9E, 0xFC, 0x9E, 0xFD, /* 0xA0-0xA3 */ + 0xBF, 0xE8, 0xBF, 0xE9, 0x9E, 0xFE, 0xBF, 0xEA, /* 0xA4-0xA7 */ + 0x9F, 0x41, 0xBF, 0xEB, 0x9F, 0x42, 0x9F, 0x43, /* 0xA8-0xAB */ + 0x9F, 0x44, 0x9F, 0x45, 0x9F, 0x46, 0x9F, 0x47, /* 0xAC-0xAF */ + 0xBF, 0xEC, 0xBF, 0xED, 0x9F, 0x48, 0x9F, 0x49, /* 0xB0-0xB3 */ + 0xBF, 0xEE, 0x9F, 0x4A, 0x9F, 0x4B, 0x9F, 0x4C, /* 0xB4-0xB7 */ + 0xBF, 0xEF, 0xBF, 0xF0, 0xBF, 0xF1, 0x9F, 0x4D, /* 0xB8-0xBB */ + 0x9F, 0x4E, 0x9F, 0x4F, 0x9F, 0x50, 0x9F, 0x51, /* 0xBC-0xBF */ + 0xBF, 0xF2, 0xBF, 0xF3, 0x9F, 0x52, 0xBF, 0xF4, /* 0xC0-0xC3 */ + 0x9F, 0x53, 0xBF, 0xF5, 0x9F, 0x54, 0x9F, 0x55, /* 0xC4-0xC7 */ + 0x9F, 0x56, 0x9F, 0x57, 0x9F, 0x58, 0x9F, 0x59, /* 0xC8-0xCB */ + 0xBF, 0xF6, 0xBF, 0xF7, 0x9F, 0x5A, 0x9F, 0x61, /* 0xCC-0xCF */ + 0xBF, 0xF8, 0x9F, 0x62, 0x9F, 0x63, 0x9F, 0x64, /* 0xD0-0xD3 */ + 0xBF, 0xF9, 0x9F, 0x65, 0x9F, 0x66, 0x9F, 0x67, /* 0xD4-0xD7 */ + 0x9F, 0x68, 0x9F, 0x69, 0x9F, 0x6A, 0x9F, 0x6B, /* 0xD8-0xDB */ + 0xBF, 0xFA, 0xBF, 0xFB, 0x9F, 0x6C, 0x9F, 0x6D, /* 0xDC-0xDF */ + 0xBF, 0xFC, 0xBF, 0xFD, 0x9F, 0x6E, 0x9F, 0x6F, /* 0xE0-0xE3 */ + 0x9F, 0x70, 0x9F, 0x71, 0x9F, 0x72, 0x9F, 0x73, /* 0xE4-0xE7 */ + 0xBF, 0xFE, 0xC0, 0xA1, 0x9F, 0x74, 0x9F, 0x75, /* 0xE8-0xEB */ + 0xC0, 0xA2, 0x9F, 0x76, 0x9F, 0x77, 0x9F, 0x78, /* 0xEC-0xEF */ + 0xC0, 0xA3, 0x9F, 0x79, 0x9F, 0x7A, 0x9F, 0x81, /* 0xF0-0xF3 */ + 0x9F, 0x82, 0x9F, 0x83, 0x9F, 0x84, 0x9F, 0x85, /* 0xF4-0xF7 */ + 0xC0, 0xA4, 0xC0, 0xA5, 0x9F, 0x86, 0x9F, 0x87, /* 0xF8-0xFB */ + 0x9F, 0x88, 0xC0, 0xA6, 0x9F, 0x89, 0x9F, 0x8A, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C7[512] = { + 0x9F, 0x8B, 0x9F, 0x8C, 0x9F, 0x8D, 0x9F, 0x8E, /* 0x00-0x03 */ + 0xC0, 0xA7, 0xC0, 0xA8, 0x9F, 0x8F, 0x9F, 0x90, /* 0x04-0x07 */ + 0xC0, 0xA9, 0x9F, 0x91, 0x9F, 0x92, 0x9F, 0x93, /* 0x08-0x0B */ + 0xC0, 0xAA, 0x9F, 0x94, 0x9F, 0x95, 0x9F, 0x96, /* 0x0C-0x0F */ + 0x9F, 0x97, 0x9F, 0x98, 0x9F, 0x99, 0x9F, 0x9A, /* 0x10-0x13 */ + 0xC0, 0xAB, 0xC0, 0xAC, 0x9F, 0x9B, 0xC0, 0xAD, /* 0x14-0x17 */ + 0x9F, 0x9C, 0xC0, 0xAE, 0x9F, 0x9D, 0x9F, 0x9E, /* 0x18-0x1B */ + 0x9F, 0x9F, 0x9F, 0xA0, 0x9F, 0xA1, 0x9F, 0xA2, /* 0x1C-0x1F */ + 0xC0, 0xAF, 0xC0, 0xB0, 0x9F, 0xA3, 0x9F, 0xA4, /* 0x20-0x23 */ + 0xC0, 0xB1, 0x9F, 0xA5, 0x9F, 0xA6, 0x9F, 0xA7, /* 0x24-0x27 */ + 0xC0, 0xB2, 0x9F, 0xA8, 0x9F, 0xA9, 0x9F, 0xAA, /* 0x28-0x2B */ + 0x9F, 0xAB, 0x9F, 0xAC, 0x9F, 0xAD, 0x9F, 0xAE, /* 0x2C-0x2F */ + 0xC0, 0xB3, 0xC0, 0xB4, 0x9F, 0xAF, 0xC0, 0xB5, /* 0x30-0x33 */ + 0x9F, 0xB0, 0xC0, 0xB6, 0x9F, 0xB1, 0xC0, 0xB7, /* 0x34-0x37 */ + 0x9F, 0xB2, 0x9F, 0xB3, 0x9F, 0xB4, 0x9F, 0xB5, /* 0x38-0x3B */ + 0xC0, 0xB8, 0xC0, 0xB9, 0x9F, 0xB6, 0x9F, 0xB7, /* 0x3C-0x3F */ + 0xC0, 0xBA, 0x9F, 0xB8, 0x9F, 0xB9, 0x9F, 0xBA, /* 0x40-0x43 */ + 0xC0, 0xBB, 0x9F, 0xBB, 0x9F, 0xBC, 0x9F, 0xBD, /* 0x44-0x47 */ + 0x9F, 0xBE, 0x9F, 0xBF, 0xC0, 0xBC, 0x9F, 0xC0, /* 0x48-0x4B */ + 0xC0, 0xBD, 0xC0, 0xBE, 0x9F, 0xC1, 0xC0, 0xBF, /* 0x4C-0x4F */ + 0x9F, 0xC2, 0xC0, 0xC0, 0xC0, 0xC1, 0xC0, 0xC2, /* 0x50-0x53 */ + 0xC0, 0xC3, 0xC0, 0xC4, 0xC0, 0xC5, 0xC0, 0xC6, /* 0x54-0x57 */ + 0xC0, 0xC7, 0x9F, 0xC3, 0x9F, 0xC4, 0x9F, 0xC5, /* 0x58-0x5B */ + 0xC0, 0xC8, 0x9F, 0xC6, 0x9F, 0xC7, 0x9F, 0xC8, /* 0x5C-0x5F */ + 0xC0, 0xC9, 0x9F, 0xC9, 0x9F, 0xCA, 0x9F, 0xCB, /* 0x60-0x63 */ + 0x9F, 0xCC, 0x9F, 0xCD, 0x9F, 0xCE, 0x9F, 0xCF, /* 0x64-0x67 */ + 0xC0, 0xCA, 0x9F, 0xD0, 0x9F, 0xD1, 0xC0, 0xCB, /* 0x68-0x6B */ + 0x9F, 0xD2, 0x9F, 0xD3, 0x9F, 0xD4, 0x9F, 0xD5, /* 0x6C-0x6F */ + 0x9F, 0xD6, 0x9F, 0xD7, 0x9F, 0xD8, 0x9F, 0xD9, /* 0x70-0x73 */ + 0xC0, 0xCC, 0xC0, 0xCD, 0x9F, 0xDA, 0x9F, 0xDB, /* 0x74-0x77 */ + 0xC0, 0xCE, 0x9F, 0xDC, 0x9F, 0xDD, 0x9F, 0xDE, /* 0x78-0x7B */ + 0xC0, 0xCF, 0xC0, 0xD0, 0xC0, 0xD1, 0x9F, 0xDF, /* 0x7C-0x7F */ + + 0x9F, 0xE0, 0x9F, 0xE1, 0x9F, 0xE2, 0xC0, 0xD2, /* 0x80-0x83 */ + 0xC0, 0xD3, 0xC0, 0xD4, 0x9F, 0xE3, 0xC0, 0xD5, /* 0x84-0x87 */ + 0xC0, 0xD6, 0xC0, 0xD7, 0xC0, 0xD8, 0x9F, 0xE4, /* 0x88-0x8B */ + 0x9F, 0xE5, 0x9F, 0xE6, 0xC0, 0xD9, 0x9F, 0xE7, /* 0x8C-0x8F */ + 0xC0, 0xDA, 0xC0, 0xDB, 0x9F, 0xE8, 0x9F, 0xE9, /* 0x90-0x93 */ + 0xC0, 0xDC, 0x9F, 0xEA, 0xC0, 0xDD, 0xC0, 0xDE, /* 0x94-0x97 */ + 0xC0, 0xDF, 0x9F, 0xEB, 0xC0, 0xE0, 0x9F, 0xEC, /* 0x98-0x9B */ + 0x9F, 0xED, 0x9F, 0xEE, 0x9F, 0xEF, 0x9F, 0xF0, /* 0x9C-0x9F */ + 0xC0, 0xE1, 0xC0, 0xE2, 0x9F, 0xF1, 0xC0, 0xE3, /* 0xA0-0xA3 */ + 0xC0, 0xE4, 0xC0, 0xE5, 0xC0, 0xE6, 0x9F, 0xF2, /* 0xA4-0xA7 */ + 0x9F, 0xF3, 0x9F, 0xF4, 0x9F, 0xF5, 0x9F, 0xF6, /* 0xA8-0xAB */ + 0xC0, 0xE7, 0xC0, 0xE8, 0x9F, 0xF7, 0x9F, 0xF8, /* 0xAC-0xAF */ + 0xC0, 0xE9, 0x9F, 0xF9, 0x9F, 0xFA, 0x9F, 0xFB, /* 0xB0-0xB3 */ + 0xC0, 0xEA, 0x9F, 0xFC, 0x9F, 0xFD, 0x9F, 0xFE, /* 0xB4-0xB7 */ + 0xA0, 0x41, 0xA0, 0x42, 0xA0, 0x43, 0xA0, 0x44, /* 0xB8-0xBB */ + 0xC0, 0xEB, 0xC0, 0xEC, 0xA0, 0x45, 0xC0, 0xED, /* 0xBC-0xBF */ + 0xC0, 0xEE, 0xC0, 0xEF, 0xA0, 0x46, 0xA0, 0x47, /* 0xC0-0xC3 */ + 0xA0, 0x48, 0xA0, 0x49, 0xA0, 0x4A, 0xA0, 0x4B, /* 0xC4-0xC7 */ + 0xC0, 0xF0, 0xC0, 0xF1, 0xA0, 0x4C, 0xA0, 0x4D, /* 0xC8-0xCB */ + 0xC0, 0xF2, 0xA0, 0x4E, 0xC0, 0xF3, 0xA0, 0x4F, /* 0xCC-0xCF */ + 0xC0, 0xF4, 0xA0, 0x50, 0xA0, 0x51, 0xA0, 0x52, /* 0xD0-0xD3 */ + 0xA0, 0x53, 0xA0, 0x54, 0xA0, 0x55, 0xA0, 0x56, /* 0xD4-0xD7 */ + 0xC0, 0xF5, 0xA0, 0x57, 0xA0, 0x58, 0xA0, 0x59, /* 0xD8-0xDB */ + 0xA0, 0x5A, 0xC0, 0xF6, 0xA0, 0x61, 0xA0, 0x62, /* 0xDC-0xDF */ + 0xA0, 0x63, 0xA0, 0x64, 0xA0, 0x65, 0xA0, 0x66, /* 0xE0-0xE3 */ + 0xC0, 0xF7, 0xA0, 0x67, 0xA0, 0x68, 0xA0, 0x69, /* 0xE4-0xE7 */ + 0xC0, 0xF8, 0xA0, 0x6A, 0xA0, 0x6B, 0xA0, 0x6C, /* 0xE8-0xEB */ + 0xC0, 0xF9, 0xA0, 0x6D, 0xA0, 0x6E, 0xA0, 0x6F, /* 0xEC-0xEF */ + 0xA0, 0x70, 0xA0, 0x71, 0xA0, 0x72, 0xA0, 0x73, /* 0xF0-0xF3 */ + 0xA0, 0x74, 0xA0, 0x75, 0xA0, 0x76, 0xA0, 0x77, /* 0xF4-0xF7 */ + 0xA0, 0x78, 0xA0, 0x79, 0xA0, 0x7A, 0xA0, 0x81, /* 0xF8-0xFB */ + 0xA0, 0x82, 0xA0, 0x83, 0xA0, 0x84, 0xA0, 0x85, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C8[512] = { + 0xC0, 0xFA, 0xC0, 0xFB, 0xA0, 0x86, 0xA0, 0x87, /* 0x00-0x03 */ + 0xC0, 0xFC, 0xA0, 0x88, 0xA0, 0x89, 0xA0, 0x8A, /* 0x04-0x07 */ + 0xC0, 0xFD, 0xA0, 0x8B, 0xC0, 0xFE, 0xA0, 0x8C, /* 0x08-0x0B */ + 0xA0, 0x8D, 0xA0, 0x8E, 0xA0, 0x8F, 0xA0, 0x90, /* 0x0C-0x0F */ + 0xC1, 0xA1, 0xC1, 0xA2, 0xA0, 0x91, 0xC1, 0xA3, /* 0x10-0x13 */ + 0xA0, 0x92, 0xC1, 0xA4, 0xC1, 0xA5, 0xA0, 0x93, /* 0x14-0x17 */ + 0xA0, 0x94, 0xA0, 0x95, 0xA0, 0x96, 0xA0, 0x97, /* 0x18-0x1B */ + 0xC1, 0xA6, 0xC1, 0xA7, 0xA0, 0x98, 0xA0, 0x99, /* 0x1C-0x1F */ + 0xC1, 0xA8, 0xA0, 0x9A, 0xA0, 0x9B, 0xA0, 0x9C, /* 0x20-0x23 */ + 0xC1, 0xA9, 0xA0, 0x9D, 0xA0, 0x9E, 0xA0, 0x9F, /* 0x24-0x27 */ + 0xA0, 0xA0, 0xA0, 0xA1, 0xA0, 0xA2, 0xA0, 0xA3, /* 0x28-0x2B */ + 0xC1, 0xAA, 0xC1, 0xAB, 0xA0, 0xA4, 0xC1, 0xAC, /* 0x2C-0x2F */ + 0xA0, 0xA5, 0xC1, 0xAD, 0xA0, 0xA6, 0xA0, 0xA7, /* 0x30-0x33 */ + 0xA0, 0xA8, 0xA0, 0xA9, 0xA0, 0xAA, 0xA0, 0xAB, /* 0x34-0x37 */ + 0xC1, 0xAE, 0xA0, 0xAC, 0xA0, 0xAD, 0xA0, 0xAE, /* 0x38-0x3B */ + 0xC1, 0xAF, 0xA0, 0xAF, 0xA0, 0xB0, 0xA0, 0xB1, /* 0x3C-0x3F */ + 0xC1, 0xB0, 0xA0, 0xB2, 0xA0, 0xB3, 0xA0, 0xB4, /* 0x40-0x43 */ + 0xA0, 0xB5, 0xA0, 0xB6, 0xA0, 0xB7, 0xA0, 0xB8, /* 0x44-0x47 */ + 0xC1, 0xB1, 0xC1, 0xB2, 0xA0, 0xB9, 0xA0, 0xBA, /* 0x48-0x4B */ + 0xC1, 0xB3, 0xC1, 0xB4, 0xA0, 0xBB, 0xA0, 0xBC, /* 0x4C-0x4F */ + 0xA0, 0xBD, 0xA0, 0xBE, 0xA0, 0xBF, 0xA0, 0xC0, /* 0x50-0x53 */ + 0xC1, 0xB5, 0xA0, 0xC1, 0xA0, 0xC2, 0xA0, 0xC3, /* 0x54-0x57 */ + 0xA0, 0xC4, 0xA0, 0xC5, 0xA0, 0xC6, 0xA0, 0xC7, /* 0x58-0x5B */ + 0xA0, 0xC8, 0xA0, 0xC9, 0xA0, 0xCA, 0xA0, 0xCB, /* 0x5C-0x5F */ + 0xA0, 0xCC, 0xA0, 0xCD, 0xA0, 0xCE, 0xA0, 0xCF, /* 0x60-0x63 */ + 0xA0, 0xD0, 0xA0, 0xD1, 0xA0, 0xD2, 0xA0, 0xD3, /* 0x64-0x67 */ + 0xA0, 0xD4, 0xA0, 0xD5, 0xA0, 0xD6, 0xA0, 0xD7, /* 0x68-0x6B */ + 0xA0, 0xD8, 0xA0, 0xD9, 0xA0, 0xDA, 0xA0, 0xDB, /* 0x6C-0x6F */ + 0xC1, 0xB6, 0xC1, 0xB7, 0xA0, 0xDC, 0xA0, 0xDD, /* 0x70-0x73 */ + 0xC1, 0xB8, 0xA0, 0xDE, 0xA0, 0xDF, 0xA0, 0xE0, /* 0x74-0x77 */ + 0xC1, 0xB9, 0xA0, 0xE1, 0xC1, 0xBA, 0xA0, 0xE2, /* 0x78-0x7B */ + 0xA0, 0xE3, 0xA0, 0xE4, 0xA0, 0xE5, 0xA0, 0xE6, /* 0x7C-0x7F */ + + 0xC1, 0xBB, 0xC1, 0xBC, 0xA0, 0xE7, 0xC1, 0xBD, /* 0x80-0x83 */ + 0xA0, 0xE8, 0xC1, 0xBE, 0xC1, 0xBF, 0xC1, 0xC0, /* 0x84-0x87 */ + 0xA0, 0xE9, 0xA0, 0xEA, 0xA0, 0xEB, 0xC1, 0xC1, /* 0x88-0x8B */ + 0xC1, 0xC2, 0xC1, 0xC3, 0xA0, 0xEC, 0xA0, 0xED, /* 0x8C-0x8F */ + 0xA0, 0xEE, 0xA0, 0xEF, 0xA0, 0xF0, 0xA0, 0xF1, /* 0x90-0x93 */ + 0xC1, 0xC4, 0xA0, 0xF2, 0xA0, 0xF3, 0xA0, 0xF4, /* 0x94-0x97 */ + 0xA0, 0xF5, 0xA0, 0xF6, 0xA0, 0xF7, 0xA0, 0xF8, /* 0x98-0x9B */ + 0xA0, 0xF9, 0xC1, 0xC5, 0xA0, 0xFA, 0xC1, 0xC6, /* 0x9C-0x9F */ + 0xA0, 0xFB, 0xC1, 0xC7, 0xA0, 0xFC, 0xA0, 0xFD, /* 0xA0-0xA3 */ + 0xA0, 0xFE, 0xA1, 0x41, 0xA1, 0x42, 0xA1, 0x43, /* 0xA4-0xA7 */ + 0xC1, 0xC8, 0xA1, 0x44, 0xA1, 0x45, 0xA1, 0x46, /* 0xA8-0xAB */ + 0xA1, 0x47, 0xA1, 0x48, 0xA1, 0x49, 0xA1, 0x4A, /* 0xAC-0xAF */ + 0xA1, 0x4B, 0xA1, 0x4C, 0xA1, 0x4D, 0xA1, 0x4E, /* 0xB0-0xB3 */ + 0xA1, 0x4F, 0xA1, 0x50, 0xA1, 0x51, 0xA1, 0x52, /* 0xB4-0xB7 */ + 0xA1, 0x53, 0xA1, 0x54, 0xA1, 0x55, 0xA1, 0x56, /* 0xB8-0xBB */ + 0xC1, 0xC9, 0xC1, 0xCA, 0xA1, 0x57, 0xA1, 0x58, /* 0xBC-0xBF */ + 0xA1, 0x59, 0xA1, 0x5A, 0xA1, 0x61, 0xA1, 0x62, /* 0xC0-0xC3 */ + 0xC1, 0xCB, 0xA1, 0x63, 0xA1, 0x64, 0xA1, 0x65, /* 0xC4-0xC7 */ + 0xC1, 0xCC, 0xA1, 0x66, 0xA1, 0x67, 0xA1, 0x68, /* 0xC8-0xCB */ + 0xC1, 0xCD, 0xA1, 0x69, 0xA1, 0x6A, 0xA1, 0x6B, /* 0xCC-0xCF */ + 0xA1, 0x6C, 0xA1, 0x6D, 0xA1, 0x6E, 0xA1, 0x6F, /* 0xD0-0xD3 */ + 0xC1, 0xCE, 0xC1, 0xCF, 0xA1, 0x70, 0xC1, 0xD0, /* 0xD4-0xD7 */ + 0xA1, 0x71, 0xC1, 0xD1, 0xA1, 0x72, 0xA1, 0x73, /* 0xD8-0xDB */ + 0xA1, 0x74, 0xA1, 0x75, 0xA1, 0x76, 0xA1, 0x77, /* 0xDC-0xDF */ + 0xC1, 0xD2, 0xC1, 0xD3, 0xA1, 0x78, 0xA1, 0x79, /* 0xE0-0xE3 */ + 0xC1, 0xD4, 0xA1, 0x7A, 0xA1, 0x81, 0xA1, 0x82, /* 0xE4-0xE7 */ + 0xA1, 0x83, 0xA1, 0x84, 0xA1, 0x85, 0xA1, 0x86, /* 0xE8-0xEB */ + 0xA1, 0x87, 0xA1, 0x88, 0xA1, 0x89, 0xA1, 0x8A, /* 0xEC-0xEF */ + 0xA1, 0x8B, 0xA1, 0x8C, 0xA1, 0x8D, 0xA1, 0x8E, /* 0xF0-0xF3 */ + 0xA1, 0x8F, 0xC1, 0xD5, 0xA1, 0x90, 0xA1, 0x91, /* 0xF4-0xF7 */ + 0xA1, 0x92, 0xA1, 0x93, 0xA1, 0x94, 0xA1, 0x95, /* 0xF8-0xFB */ + 0xC1, 0xD6, 0xC1, 0xD7, 0xA1, 0x96, 0xA1, 0x97, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_C9[512] = { + 0xC1, 0xD8, 0xA1, 0x98, 0xA1, 0x99, 0xA1, 0x9A, /* 0x00-0x03 */ + 0xC1, 0xD9, 0xC1, 0xDA, 0xC1, 0xDB, 0xA1, 0x9B, /* 0x04-0x07 */ + 0xA1, 0x9C, 0xA1, 0x9D, 0xA1, 0x9E, 0xA1, 0x9F, /* 0x08-0x0B */ + 0xC1, 0xDC, 0xC1, 0xDD, 0xA1, 0xA0, 0xC1, 0xDE, /* 0x0C-0x0F */ + 0xA2, 0x41, 0xC1, 0xDF, 0xA2, 0x42, 0xA2, 0x43, /* 0x10-0x13 */ + 0xA2, 0x44, 0xA2, 0x45, 0xA2, 0x46, 0xA2, 0x47, /* 0x14-0x17 */ + 0xC1, 0xE0, 0xA2, 0x48, 0xA2, 0x49, 0xA2, 0x4A, /* 0x18-0x1B */ + 0xA2, 0x4B, 0xA2, 0x4C, 0xA2, 0x4D, 0xA2, 0x4E, /* 0x1C-0x1F */ + 0xA2, 0x4F, 0xA2, 0x50, 0xA2, 0x51, 0xA2, 0x52, /* 0x20-0x23 */ + 0xA2, 0x53, 0xA2, 0x54, 0xA2, 0x55, 0xA2, 0x56, /* 0x24-0x27 */ + 0xA2, 0x57, 0xA2, 0x58, 0xA2, 0x59, 0xA2, 0x5A, /* 0x28-0x2B */ + 0xC1, 0xE1, 0xA2, 0x61, 0xA2, 0x62, 0xA2, 0x63, /* 0x2C-0x2F */ + 0xA2, 0x64, 0xA2, 0x65, 0xA2, 0x66, 0xA2, 0x67, /* 0x30-0x33 */ + 0xC1, 0xE2, 0xA2, 0x68, 0xA2, 0x69, 0xA2, 0x6A, /* 0x34-0x37 */ + 0xA2, 0x6B, 0xA2, 0x6C, 0xA2, 0x6D, 0xA2, 0x6E, /* 0x38-0x3B */ + 0xA2, 0x6F, 0xA2, 0x70, 0xA2, 0x71, 0xA2, 0x72, /* 0x3C-0x3F */ + 0xA2, 0x73, 0xA2, 0x74, 0xA2, 0x75, 0xA2, 0x76, /* 0x40-0x43 */ + 0xA2, 0x77, 0xA2, 0x78, 0xA2, 0x79, 0xA2, 0x7A, /* 0x44-0x47 */ + 0xA2, 0x81, 0xA2, 0x82, 0xA2, 0x83, 0xA2, 0x84, /* 0x48-0x4B */ + 0xA2, 0x85, 0xA2, 0x86, 0xA2, 0x87, 0xA2, 0x88, /* 0x4C-0x4F */ + 0xC1, 0xE3, 0xC1, 0xE4, 0xA2, 0x89, 0xA2, 0x8A, /* 0x50-0x53 */ + 0xC1, 0xE5, 0xA2, 0x8B, 0xA2, 0x8C, 0xA2, 0x8D, /* 0x54-0x57 */ + 0xC1, 0xE6, 0xA2, 0x8E, 0xA2, 0x8F, 0xA2, 0x90, /* 0x58-0x5B */ + 0xA2, 0x91, 0xA2, 0x92, 0xA2, 0x93, 0xA2, 0x94, /* 0x5C-0x5F */ + 0xC1, 0xE7, 0xC1, 0xE8, 0xA2, 0x95, 0xC1, 0xE9, /* 0x60-0x63 */ + 0xA2, 0x96, 0xA2, 0x97, 0xA2, 0x98, 0xA2, 0x99, /* 0x64-0x67 */ + 0xA2, 0x9A, 0xA2, 0x9B, 0xA2, 0x9C, 0xA2, 0x9D, /* 0x68-0x6B */ + 0xC1, 0xEA, 0xA2, 0x9E, 0xA2, 0x9F, 0xA2, 0xA0, /* 0x6C-0x6F */ + 0xC1, 0xEB, 0xA3, 0x41, 0xA3, 0x42, 0xA3, 0x43, /* 0x70-0x73 */ + 0xC1, 0xEC, 0xA3, 0x44, 0xA3, 0x45, 0xA3, 0x46, /* 0x74-0x77 */ + 0xA3, 0x47, 0xA3, 0x48, 0xA3, 0x49, 0xA3, 0x4A, /* 0x78-0x7B */ + 0xC1, 0xED, 0xA3, 0x4B, 0xA3, 0x4C, 0xA3, 0x4D, /* 0x7C-0x7F */ + + 0xA3, 0x4E, 0xA3, 0x4F, 0xA3, 0x50, 0xA3, 0x51, /* 0x80-0x83 */ + 0xA3, 0x52, 0xA3, 0x53, 0xA3, 0x54, 0xA3, 0x55, /* 0x84-0x87 */ + 0xC1, 0xEE, 0xC1, 0xEF, 0xA3, 0x56, 0xA3, 0x57, /* 0x88-0x8B */ + 0xC1, 0xF0, 0xA3, 0x58, 0xA3, 0x59, 0xA3, 0x5A, /* 0x8C-0x8F */ + 0xC1, 0xF1, 0xA3, 0x61, 0xA3, 0x62, 0xA3, 0x63, /* 0x90-0x93 */ + 0xA3, 0x64, 0xA3, 0x65, 0xA3, 0x66, 0xA3, 0x67, /* 0x94-0x97 */ + 0xC1, 0xF2, 0xC1, 0xF3, 0xA3, 0x68, 0xC1, 0xF4, /* 0x98-0x9B */ + 0xA3, 0x69, 0xC1, 0xF5, 0xA3, 0x6A, 0xA3, 0x6B, /* 0x9C-0x9F */ + 0xA3, 0x6C, 0xA3, 0x6D, 0xA3, 0x6E, 0xA3, 0x6F, /* 0xA0-0xA3 */ + 0xA3, 0x70, 0xA3, 0x71, 0xA3, 0x72, 0xA3, 0x73, /* 0xA4-0xA7 */ + 0xA3, 0x74, 0xA3, 0x75, 0xA3, 0x76, 0xA3, 0x77, /* 0xA8-0xAB */ + 0xA3, 0x78, 0xA3, 0x79, 0xA3, 0x7A, 0xA3, 0x81, /* 0xAC-0xAF */ + 0xA3, 0x82, 0xA3, 0x83, 0xA3, 0x84, 0xA3, 0x85, /* 0xB0-0xB3 */ + 0xA3, 0x86, 0xA3, 0x87, 0xA3, 0x88, 0xA3, 0x89, /* 0xB4-0xB7 */ + 0xA3, 0x8A, 0xA3, 0x8B, 0xA3, 0x8C, 0xA3, 0x8D, /* 0xB8-0xBB */ + 0xA3, 0x8E, 0xA3, 0x8F, 0xA3, 0x90, 0xA3, 0x91, /* 0xBC-0xBF */ + 0xC1, 0xF6, 0xC1, 0xF7, 0xA3, 0x92, 0xA3, 0x93, /* 0xC0-0xC3 */ + 0xC1, 0xF8, 0xA3, 0x94, 0xA3, 0x95, 0xC1, 0xF9, /* 0xC4-0xC7 */ + 0xC1, 0xFA, 0xA3, 0x96, 0xC1, 0xFB, 0xA3, 0x97, /* 0xC8-0xCB */ + 0xA3, 0x98, 0xA3, 0x99, 0xA3, 0x9A, 0xA3, 0x9B, /* 0xCC-0xCF */ + 0xC1, 0xFC, 0xC1, 0xFD, 0xA3, 0x9C, 0xC1, 0xFE, /* 0xD0-0xD3 */ + 0xA3, 0x9D, 0xC2, 0xA1, 0xC2, 0xA2, 0xA3, 0x9E, /* 0xD4-0xD7 */ + 0xA3, 0x9F, 0xC2, 0xA3, 0xC2, 0xA4, 0xA3, 0xA0, /* 0xD8-0xDB */ + 0xC2, 0xA5, 0xC2, 0xA6, 0xA4, 0x41, 0xA4, 0x42, /* 0xDC-0xDF */ + 0xC2, 0xA7, 0xA4, 0x43, 0xC2, 0xA8, 0xA4, 0x44, /* 0xE0-0xE3 */ + 0xC2, 0xA9, 0xA4, 0x45, 0xA4, 0x46, 0xC2, 0xAA, /* 0xE4-0xE7 */ + 0xA4, 0x47, 0xA4, 0x48, 0xA4, 0x49, 0xA4, 0x4A, /* 0xE8-0xEB */ + 0xC2, 0xAB, 0xC2, 0xAC, 0xA4, 0x4B, 0xC2, 0xAD, /* 0xEC-0xEF */ + 0xC2, 0xAE, 0xC2, 0xAF, 0xA4, 0x4C, 0xA4, 0x4D, /* 0xF0-0xF3 */ + 0xA4, 0x4E, 0xA4, 0x4F, 0xA4, 0x50, 0xA4, 0x51, /* 0xF4-0xF7 */ + 0xC2, 0xB0, 0xC2, 0xB1, 0xA4, 0x52, 0xA4, 0x53, /* 0xF8-0xFB */ + 0xC2, 0xB2, 0xA4, 0x54, 0xA4, 0x55, 0xA4, 0x56, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_CA[512] = { + 0xC2, 0xB3, 0xA4, 0x57, 0xA4, 0x58, 0xA4, 0x59, /* 0x00-0x03 */ + 0xA4, 0x5A, 0xA4, 0x61, 0xA4, 0x62, 0xA4, 0x63, /* 0x04-0x07 */ + 0xC2, 0xB4, 0xC2, 0xB5, 0xA4, 0x64, 0xC2, 0xB6, /* 0x08-0x0B */ + 0xC2, 0xB7, 0xC2, 0xB8, 0xA4, 0x65, 0xA4, 0x66, /* 0x0C-0x0F */ + 0xA4, 0x67, 0xA4, 0x68, 0xA4, 0x69, 0xA4, 0x6A, /* 0x10-0x13 */ + 0xC2, 0xB9, 0xA4, 0x6B, 0xA4, 0x6C, 0xA4, 0x6D, /* 0x14-0x17 */ + 0xC2, 0xBA, 0xA4, 0x6E, 0xA4, 0x6F, 0xA4, 0x70, /* 0x18-0x1B */ + 0xA4, 0x71, 0xA4, 0x72, 0xA4, 0x73, 0xA4, 0x74, /* 0x1C-0x1F */ + 0xA4, 0x75, 0xA4, 0x76, 0xA4, 0x77, 0xA4, 0x78, /* 0x20-0x23 */ + 0xA4, 0x79, 0xA4, 0x7A, 0xA4, 0x81, 0xA4, 0x82, /* 0x24-0x27 */ + 0xA4, 0x83, 0xC2, 0xBB, 0xA4, 0x84, 0xA4, 0x85, /* 0x28-0x2B */ + 0xA4, 0x86, 0xA4, 0x87, 0xA4, 0x88, 0xA4, 0x89, /* 0x2C-0x2F */ + 0xA4, 0x8A, 0xA4, 0x8B, 0xA4, 0x8C, 0xA4, 0x8D, /* 0x30-0x33 */ + 0xA4, 0x8E, 0xA4, 0x8F, 0xA4, 0x90, 0xA4, 0x91, /* 0x34-0x37 */ + 0xA4, 0x92, 0xA4, 0x93, 0xA4, 0x94, 0xA4, 0x95, /* 0x38-0x3B */ + 0xA4, 0x96, 0xA4, 0x97, 0xA4, 0x98, 0xA4, 0x99, /* 0x3C-0x3F */ + 0xA4, 0x9A, 0xA4, 0x9B, 0xA4, 0x9C, 0xA4, 0x9D, /* 0x40-0x43 */ + 0xA4, 0x9E, 0xA4, 0x9F, 0xA4, 0xA0, 0xA5, 0x41, /* 0x44-0x47 */ + 0xA5, 0x42, 0xA5, 0x43, 0xA5, 0x44, 0xA5, 0x45, /* 0x48-0x4B */ + 0xC2, 0xBC, 0xC2, 0xBD, 0xA5, 0x46, 0xA5, 0x47, /* 0x4C-0x4F */ + 0xC2, 0xBE, 0xA5, 0x48, 0xA5, 0x49, 0xA5, 0x4A, /* 0x50-0x53 */ + 0xC2, 0xBF, 0xA5, 0x4B, 0xA5, 0x4C, 0xA5, 0x4D, /* 0x54-0x57 */ + 0xA5, 0x4E, 0xA5, 0x4F, 0xA5, 0x50, 0xA5, 0x51, /* 0x58-0x5B */ + 0xC2, 0xC0, 0xC2, 0xC1, 0xA5, 0x52, 0xC2, 0xC2, /* 0x5C-0x5F */ + 0xC2, 0xC3, 0xC2, 0xC4, 0xA5, 0x53, 0xA5, 0x54, /* 0x60-0x63 */ + 0xA5, 0x55, 0xA5, 0x56, 0xA5, 0x57, 0xA5, 0x58, /* 0x64-0x67 */ + 0xC2, 0xC5, 0xA5, 0x59, 0xA5, 0x5A, 0xA5, 0x61, /* 0x68-0x6B */ + 0xA5, 0x62, 0xA5, 0x63, 0xA5, 0x64, 0xA5, 0x65, /* 0x6C-0x6F */ + 0xA5, 0x66, 0xA5, 0x67, 0xA5, 0x68, 0xA5, 0x69, /* 0x70-0x73 */ + 0xA5, 0x6A, 0xA5, 0x6B, 0xA5, 0x6C, 0xA5, 0x6D, /* 0x74-0x77 */ + 0xA5, 0x6E, 0xA5, 0x6F, 0xA5, 0x70, 0xA5, 0x71, /* 0x78-0x7B */ + 0xA5, 0x72, 0xC2, 0xC6, 0xA5, 0x73, 0xA5, 0x74, /* 0x7C-0x7F */ + + 0xA5, 0x75, 0xA5, 0x76, 0xA5, 0x77, 0xA5, 0x78, /* 0x80-0x83 */ + 0xC2, 0xC7, 0xA5, 0x79, 0xA5, 0x7A, 0xA5, 0x81, /* 0x84-0x87 */ + 0xA5, 0x82, 0xA5, 0x83, 0xA5, 0x84, 0xA5, 0x85, /* 0x88-0x8B */ + 0xA5, 0x86, 0xA5, 0x87, 0xA5, 0x88, 0xA5, 0x89, /* 0x8C-0x8F */ + 0xA5, 0x8A, 0xA5, 0x8B, 0xA5, 0x8C, 0xA5, 0x8D, /* 0x90-0x93 */ + 0xA5, 0x8E, 0xA5, 0x8F, 0xA5, 0x90, 0xA5, 0x91, /* 0x94-0x97 */ + 0xC2, 0xC8, 0xA5, 0x92, 0xA5, 0x93, 0xA5, 0x94, /* 0x98-0x9B */ + 0xA5, 0x95, 0xA5, 0x96, 0xA5, 0x97, 0xA5, 0x98, /* 0x9C-0x9F */ + 0xA5, 0x99, 0xA5, 0x9A, 0xA5, 0x9B, 0xA5, 0x9C, /* 0xA0-0xA3 */ + 0xA5, 0x9D, 0xA5, 0x9E, 0xA5, 0x9F, 0xA5, 0xA0, /* 0xA4-0xA7 */ + 0xA6, 0x41, 0xA6, 0x42, 0xA6, 0x43, 0xA6, 0x44, /* 0xA8-0xAB */ + 0xA6, 0x45, 0xA6, 0x46, 0xA6, 0x47, 0xA6, 0x48, /* 0xAC-0xAF */ + 0xA6, 0x49, 0xA6, 0x4A, 0xA6, 0x4B, 0xA6, 0x4C, /* 0xB0-0xB3 */ + 0xA6, 0x4D, 0xA6, 0x4E, 0xA6, 0x4F, 0xA6, 0x50, /* 0xB4-0xB7 */ + 0xA6, 0x51, 0xA6, 0x52, 0xA6, 0x53, 0xA6, 0x54, /* 0xB8-0xBB */ + 0xC2, 0xC9, 0xC2, 0xCA, 0xA6, 0x55, 0xA6, 0x56, /* 0xBC-0xBF */ + 0xC2, 0xCB, 0xA6, 0x57, 0xA6, 0x58, 0xA6, 0x59, /* 0xC0-0xC3 */ + 0xC2, 0xCC, 0xA6, 0x5A, 0xA6, 0x61, 0xA6, 0x62, /* 0xC4-0xC7 */ + 0xA6, 0x63, 0xA6, 0x64, 0xA6, 0x65, 0xA6, 0x66, /* 0xC8-0xCB */ + 0xC2, 0xCD, 0xC2, 0xCE, 0xA6, 0x67, 0xC2, 0xCF, /* 0xCC-0xCF */ + 0xA6, 0x68, 0xC2, 0xD0, 0xA6, 0x69, 0xC2, 0xD1, /* 0xD0-0xD3 */ + 0xA6, 0x6A, 0xA6, 0x6B, 0xA6, 0x6C, 0xA6, 0x6D, /* 0xD4-0xD7 */ + 0xC2, 0xD2, 0xC2, 0xD3, 0xA6, 0x6E, 0xA6, 0x6F, /* 0xD8-0xDB */ + 0xA6, 0x70, 0xA6, 0x71, 0xA6, 0x72, 0xA6, 0x73, /* 0xDC-0xDF */ + 0xC2, 0xD4, 0xA6, 0x74, 0xA6, 0x75, 0xA6, 0x76, /* 0xE0-0xE3 */ + 0xA6, 0x77, 0xA6, 0x78, 0xA6, 0x79, 0xA6, 0x7A, /* 0xE4-0xE7 */ + 0xA6, 0x81, 0xA6, 0x82, 0xA6, 0x83, 0xA6, 0x84, /* 0xE8-0xEB */ + 0xC2, 0xD5, 0xA6, 0x85, 0xA6, 0x86, 0xA6, 0x87, /* 0xEC-0xEF */ + 0xA6, 0x88, 0xA6, 0x89, 0xA6, 0x8A, 0xA6, 0x8B, /* 0xF0-0xF3 */ + 0xC2, 0xD6, 0xA6, 0x8C, 0xA6, 0x8D, 0xA6, 0x8E, /* 0xF4-0xF7 */ + 0xA6, 0x8F, 0xA6, 0x90, 0xA6, 0x91, 0xA6, 0x92, /* 0xF8-0xFB */ + 0xA6, 0x93, 0xA6, 0x94, 0xA6, 0x95, 0xA6, 0x96, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_CB[512] = { + 0xA6, 0x97, 0xA6, 0x98, 0xA6, 0x99, 0xA6, 0x9A, /* 0x00-0x03 */ + 0xA6, 0x9B, 0xA6, 0x9C, 0xA6, 0x9D, 0xA6, 0x9E, /* 0x04-0x07 */ + 0xC2, 0xD7, 0xA6, 0x9F, 0xA6, 0xA0, 0xA7, 0x41, /* 0x08-0x0B */ + 0xA7, 0x42, 0xA7, 0x43, 0xA7, 0x44, 0xA7, 0x45, /* 0x0C-0x0F */ + 0xC2, 0xD8, 0xA7, 0x46, 0xA7, 0x47, 0xA7, 0x48, /* 0x10-0x13 */ + 0xC2, 0xD9, 0xA7, 0x49, 0xA7, 0x4A, 0xA7, 0x4B, /* 0x14-0x17 */ + 0xC2, 0xDA, 0xA7, 0x4C, 0xA7, 0x4D, 0xA7, 0x4E, /* 0x18-0x1B */ + 0xA7, 0x4F, 0xA7, 0x50, 0xA7, 0x51, 0xA7, 0x52, /* 0x1C-0x1F */ + 0xC2, 0xDB, 0xC2, 0xDC, 0xA7, 0x53, 0xA7, 0x54, /* 0x20-0x23 */ + 0xA7, 0x55, 0xA7, 0x56, 0xA7, 0x57, 0xA7, 0x58, /* 0x24-0x27 */ + 0xA7, 0x59, 0xA7, 0x5A, 0xA7, 0x61, 0xA7, 0x62, /* 0x28-0x2B */ + 0xA7, 0x63, 0xA7, 0x64, 0xA7, 0x65, 0xA7, 0x66, /* 0x2C-0x2F */ + 0xA7, 0x67, 0xA7, 0x68, 0xA7, 0x69, 0xA7, 0x6A, /* 0x30-0x33 */ + 0xA7, 0x6B, 0xA7, 0x6C, 0xA7, 0x6D, 0xA7, 0x6E, /* 0x34-0x37 */ + 0xA7, 0x6F, 0xA7, 0x70, 0xA7, 0x71, 0xA7, 0x72, /* 0x38-0x3B */ + 0xA7, 0x73, 0xA7, 0x74, 0xA7, 0x75, 0xA7, 0x76, /* 0x3C-0x3F */ + 0xA7, 0x77, 0xC2, 0xDD, 0xA7, 0x78, 0xA7, 0x79, /* 0x40-0x43 */ + 0xA7, 0x7A, 0xA7, 0x81, 0xA7, 0x82, 0xA7, 0x83, /* 0x44-0x47 */ + 0xC2, 0xDE, 0xC2, 0xDF, 0xA7, 0x84, 0xA7, 0x85, /* 0x48-0x4B */ + 0xC2, 0xE0, 0xA7, 0x86, 0xA7, 0x87, 0xA7, 0x88, /* 0x4C-0x4F */ + 0xC2, 0xE1, 0xA7, 0x89, 0xA7, 0x8A, 0xA7, 0x8B, /* 0x50-0x53 */ + 0xA7, 0x8C, 0xA7, 0x8D, 0xA7, 0x8E, 0xA7, 0x8F, /* 0x54-0x57 */ + 0xC2, 0xE2, 0xC2, 0xE3, 0xA7, 0x90, 0xA7, 0x91, /* 0x58-0x5B */ + 0xA7, 0x92, 0xC2, 0xE4, 0xA7, 0x93, 0xA7, 0x94, /* 0x5C-0x5F */ + 0xA7, 0x95, 0xA7, 0x96, 0xA7, 0x97, 0xA7, 0x98, /* 0x60-0x63 */ + 0xC2, 0xE5, 0xA7, 0x99, 0xA7, 0x9A, 0xA7, 0x9B, /* 0x64-0x67 */ + 0xA7, 0x9C, 0xA7, 0x9D, 0xA7, 0x9E, 0xA7, 0x9F, /* 0x68-0x6B */ + 0xA7, 0xA0, 0xA8, 0x41, 0xA8, 0x42, 0xA8, 0x43, /* 0x6C-0x6F */ + 0xA8, 0x44, 0xA8, 0x45, 0xA8, 0x46, 0xA8, 0x47, /* 0x70-0x73 */ + 0xA8, 0x48, 0xA8, 0x49, 0xA8, 0x4A, 0xA8, 0x4B, /* 0x74-0x77 */ + 0xC2, 0xE6, 0xC2, 0xE7, 0xA8, 0x4C, 0xA8, 0x4D, /* 0x78-0x7B */ + 0xA8, 0x4E, 0xA8, 0x4F, 0xA8, 0x50, 0xA8, 0x51, /* 0x7C-0x7F */ + + 0xA8, 0x52, 0xA8, 0x53, 0xA8, 0x54, 0xA8, 0x55, /* 0x80-0x83 */ + 0xA8, 0x56, 0xA8, 0x57, 0xA8, 0x58, 0xA8, 0x59, /* 0x84-0x87 */ + 0xA8, 0x5A, 0xA8, 0x61, 0xA8, 0x62, 0xA8, 0x63, /* 0x88-0x8B */ + 0xA8, 0x64, 0xA8, 0x65, 0xA8, 0x66, 0xA8, 0x67, /* 0x8C-0x8F */ + 0xA8, 0x68, 0xA8, 0x69, 0xA8, 0x6A, 0xA8, 0x6B, /* 0x90-0x93 */ + 0xA8, 0x6C, 0xA8, 0x6D, 0xA8, 0x6E, 0xA8, 0x6F, /* 0x94-0x97 */ + 0xA8, 0x70, 0xA8, 0x71, 0xA8, 0x72, 0xA8, 0x73, /* 0x98-0x9B */ + 0xC2, 0xE8, 0xA8, 0x74, 0xA8, 0x75, 0xA8, 0x76, /* 0x9C-0x9F */ + 0xA8, 0x77, 0xA8, 0x78, 0xA8, 0x79, 0xA8, 0x7A, /* 0xA0-0xA3 */ + 0xA8, 0x81, 0xA8, 0x82, 0xA8, 0x83, 0xA8, 0x84, /* 0xA4-0xA7 */ + 0xA8, 0x85, 0xA8, 0x86, 0xA8, 0x87, 0xA8, 0x88, /* 0xA8-0xAB */ + 0xA8, 0x89, 0xA8, 0x8A, 0xA8, 0x8B, 0xA8, 0x8C, /* 0xAC-0xAF */ + 0xA8, 0x8D, 0xA8, 0x8E, 0xA8, 0x8F, 0xA8, 0x90, /* 0xB0-0xB3 */ + 0xA8, 0x91, 0xA8, 0x92, 0xA8, 0x93, 0xA8, 0x94, /* 0xB4-0xB7 */ + 0xC2, 0xE9, 0xA8, 0x95, 0xA8, 0x96, 0xA8, 0x97, /* 0xB8-0xBB */ + 0xA8, 0x98, 0xA8, 0x99, 0xA8, 0x9A, 0xA8, 0x9B, /* 0xBC-0xBF */ + 0xA8, 0x9C, 0xA8, 0x9D, 0xA8, 0x9E, 0xA8, 0x9F, /* 0xC0-0xC3 */ + 0xA8, 0xA0, 0xA9, 0x41, 0xA9, 0x42, 0xA9, 0x43, /* 0xC4-0xC7 */ + 0xA9, 0x44, 0xA9, 0x45, 0xA9, 0x46, 0xA9, 0x47, /* 0xC8-0xCB */ + 0xA9, 0x48, 0xA9, 0x49, 0xA9, 0x4A, 0xA9, 0x4B, /* 0xCC-0xCF */ + 0xA9, 0x4C, 0xA9, 0x4D, 0xA9, 0x4E, 0xA9, 0x4F, /* 0xD0-0xD3 */ + 0xC2, 0xEA, 0xA9, 0x50, 0xA9, 0x51, 0xA9, 0x52, /* 0xD4-0xD7 */ + 0xA9, 0x53, 0xA9, 0x54, 0xA9, 0x55, 0xA9, 0x56, /* 0xD8-0xDB */ + 0xA9, 0x57, 0xA9, 0x58, 0xA9, 0x59, 0xA9, 0x5A, /* 0xDC-0xDF */ + 0xA9, 0x61, 0xA9, 0x62, 0xA9, 0x63, 0xA9, 0x64, /* 0xE0-0xE3 */ + 0xC2, 0xEB, 0xA9, 0x65, 0xA9, 0x66, 0xC2, 0xEC, /* 0xE4-0xE7 */ + 0xA9, 0x67, 0xC2, 0xED, 0xA9, 0x68, 0xA9, 0x69, /* 0xE8-0xEB */ + 0xA9, 0x6A, 0xA9, 0x6B, 0xA9, 0x6C, 0xA9, 0x6D, /* 0xEC-0xEF */ + 0xA9, 0x6E, 0xA9, 0x6F, 0xA9, 0x70, 0xA9, 0x71, /* 0xF0-0xF3 */ + 0xA9, 0x72, 0xA9, 0x73, 0xA9, 0x74, 0xA9, 0x75, /* 0xF4-0xF7 */ + 0xA9, 0x76, 0xA9, 0x77, 0xA9, 0x78, 0xA9, 0x79, /* 0xF8-0xFB */ + 0xA9, 0x7A, 0xA9, 0x81, 0xA9, 0x82, 0xA9, 0x83, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_CC[512] = { + 0xA9, 0x84, 0xA9, 0x85, 0xA9, 0x86, 0xA9, 0x87, /* 0x00-0x03 */ + 0xA9, 0x88, 0xA9, 0x89, 0xA9, 0x8A, 0xA9, 0x8B, /* 0x04-0x07 */ + 0xA9, 0x8C, 0xA9, 0x8D, 0xA9, 0x8E, 0xA9, 0x8F, /* 0x08-0x0B */ + 0xC2, 0xEE, 0xC2, 0xEF, 0xA9, 0x90, 0xA9, 0x91, /* 0x0C-0x0F */ + 0xC2, 0xF0, 0xA9, 0x92, 0xA9, 0x93, 0xA9, 0x94, /* 0x10-0x13 */ + 0xC2, 0xF1, 0xA9, 0x95, 0xA9, 0x96, 0xA9, 0x97, /* 0x14-0x17 */ + 0xA9, 0x98, 0xA9, 0x99, 0xA9, 0x9A, 0xA9, 0x9B, /* 0x18-0x1B */ + 0xC2, 0xF2, 0xC2, 0xF3, 0xA9, 0x9C, 0xA9, 0x9D, /* 0x1C-0x1F */ + 0xA9, 0x9E, 0xC2, 0xF4, 0xC2, 0xF5, 0xA9, 0x9F, /* 0x20-0x23 */ + 0xA9, 0xA0, 0xAA, 0x41, 0xAA, 0x42, 0xC2, 0xF6, /* 0x24-0x27 */ + 0xC2, 0xF7, 0xC2, 0xF8, 0xAA, 0x43, 0xAA, 0x44, /* 0x28-0x2B */ + 0xC2, 0xF9, 0xAA, 0x45, 0xC2, 0xFA, 0xAA, 0x46, /* 0x2C-0x2F */ + 0xC2, 0xFB, 0xAA, 0x47, 0xAA, 0x48, 0xAA, 0x49, /* 0x30-0x33 */ + 0xAA, 0x4A, 0xAA, 0x4B, 0xAA, 0x4C, 0xAA, 0x4D, /* 0x34-0x37 */ + 0xC2, 0xFC, 0xC2, 0xFD, 0xAA, 0x4E, 0xC2, 0xFE, /* 0x38-0x3B */ + 0xC3, 0xA1, 0xC3, 0xA2, 0xC3, 0xA3, 0xAA, 0x4F, /* 0x3C-0x3F */ + 0xAA, 0x50, 0xAA, 0x51, 0xAA, 0x52, 0xAA, 0x53, /* 0x40-0x43 */ + 0xC3, 0xA4, 0xC3, 0xA5, 0xAA, 0x54, 0xAA, 0x55, /* 0x44-0x47 */ + 0xC3, 0xA6, 0xAA, 0x56, 0xAA, 0x57, 0xAA, 0x58, /* 0x48-0x4B */ + 0xC3, 0xA7, 0xAA, 0x59, 0xAA, 0x5A, 0xAA, 0x61, /* 0x4C-0x4F */ + 0xAA, 0x62, 0xAA, 0x63, 0xAA, 0x64, 0xAA, 0x65, /* 0x50-0x53 */ + 0xC3, 0xA8, 0xC3, 0xA9, 0xAA, 0x66, 0xC3, 0xAA, /* 0x54-0x57 */ + 0xC3, 0xAB, 0xC3, 0xAC, 0xAA, 0x67, 0xAA, 0x68, /* 0x58-0x5B */ + 0xAA, 0x69, 0xAA, 0x6A, 0xAA, 0x6B, 0xAA, 0x6C, /* 0x5C-0x5F */ + 0xC3, 0xAD, 0xAA, 0x6D, 0xAA, 0x6E, 0xAA, 0x6F, /* 0x60-0x63 */ + 0xC3, 0xAE, 0xAA, 0x70, 0xC3, 0xAF, 0xAA, 0x71, /* 0x64-0x67 */ + 0xC3, 0xB0, 0xAA, 0x72, 0xAA, 0x73, 0xAA, 0x74, /* 0x68-0x6B */ + 0xAA, 0x75, 0xAA, 0x76, 0xAA, 0x77, 0xAA, 0x78, /* 0x6C-0x6F */ + 0xC3, 0xB1, 0xAA, 0x79, 0xAA, 0x7A, 0xAA, 0x81, /* 0x70-0x73 */ + 0xAA, 0x82, 0xC3, 0xB2, 0xAA, 0x83, 0xAA, 0x84, /* 0x74-0x77 */ + 0xAA, 0x85, 0xAA, 0x86, 0xAA, 0x87, 0xAA, 0x88, /* 0x78-0x7B */ + 0xAA, 0x89, 0xAA, 0x8A, 0xAA, 0x8B, 0xAA, 0x8C, /* 0x7C-0x7F */ + + 0xAA, 0x8D, 0xAA, 0x8E, 0xAA, 0x8F, 0xAA, 0x90, /* 0x80-0x83 */ + 0xAA, 0x91, 0xAA, 0x92, 0xAA, 0x93, 0xAA, 0x94, /* 0x84-0x87 */ + 0xAA, 0x95, 0xAA, 0x96, 0xAA, 0x97, 0xAA, 0x98, /* 0x88-0x8B */ + 0xAA, 0x99, 0xAA, 0x9A, 0xAA, 0x9B, 0xAA, 0x9C, /* 0x8C-0x8F */ + 0xAA, 0x9D, 0xAA, 0x9E, 0xAA, 0x9F, 0xAA, 0xA0, /* 0x90-0x93 */ + 0xAB, 0x41, 0xAB, 0x42, 0xAB, 0x43, 0xAB, 0x44, /* 0x94-0x97 */ + 0xC3, 0xB3, 0xC3, 0xB4, 0xAB, 0x45, 0xAB, 0x46, /* 0x98-0x9B */ + 0xC3, 0xB5, 0xAB, 0x47, 0xAB, 0x48, 0xAB, 0x49, /* 0x9C-0x9F */ + 0xC3, 0xB6, 0xAB, 0x4A, 0xAB, 0x4B, 0xAB, 0x4C, /* 0xA0-0xA3 */ + 0xAB, 0x4D, 0xAB, 0x4E, 0xAB, 0x4F, 0xAB, 0x50, /* 0xA4-0xA7 */ + 0xC3, 0xB7, 0xC3, 0xB8, 0xAB, 0x51, 0xC3, 0xB9, /* 0xA8-0xAB */ + 0xC3, 0xBA, 0xC3, 0xBB, 0xAB, 0x52, 0xAB, 0x53, /* 0xAC-0xAF */ + 0xAB, 0x54, 0xAB, 0x55, 0xAB, 0x56, 0xAB, 0x57, /* 0xB0-0xB3 */ + 0xC3, 0xBC, 0xC3, 0xBD, 0xAB, 0x58, 0xAB, 0x59, /* 0xB4-0xB7 */ + 0xC3, 0xBE, 0xAB, 0x5A, 0xAB, 0x61, 0xAB, 0x62, /* 0xB8-0xBB */ + 0xC3, 0xBF, 0xAB, 0x63, 0xAB, 0x64, 0xAB, 0x65, /* 0xBC-0xBF */ + 0xAB, 0x66, 0xAB, 0x67, 0xAB, 0x68, 0xAB, 0x69, /* 0xC0-0xC3 */ + 0xC3, 0xC0, 0xC3, 0xC1, 0xAB, 0x6A, 0xC3, 0xC2, /* 0xC4-0xC7 */ + 0xAB, 0x6B, 0xC3, 0xC3, 0xAB, 0x6C, 0xAB, 0x6D, /* 0xC8-0xCB */ + 0xAB, 0x6E, 0xAB, 0x6F, 0xAB, 0x70, 0xAB, 0x71, /* 0xCC-0xCF */ + 0xC3, 0xC4, 0xAB, 0x72, 0xAB, 0x73, 0xAB, 0x74, /* 0xD0-0xD3 */ + 0xC3, 0xC5, 0xAB, 0x75, 0xAB, 0x76, 0xAB, 0x77, /* 0xD4-0xD7 */ + 0xAB, 0x78, 0xAB, 0x79, 0xAB, 0x7A, 0xAB, 0x81, /* 0xD8-0xDB */ + 0xAB, 0x82, 0xAB, 0x83, 0xAB, 0x84, 0xAB, 0x85, /* 0xDC-0xDF */ + 0xAB, 0x86, 0xAB, 0x87, 0xAB, 0x88, 0xAB, 0x89, /* 0xE0-0xE3 */ + 0xC3, 0xC6, 0xAB, 0x8A, 0xAB, 0x8B, 0xAB, 0x8C, /* 0xE4-0xE7 */ + 0xAB, 0x8D, 0xAB, 0x8E, 0xAB, 0x8F, 0xAB, 0x90, /* 0xE8-0xEB */ + 0xC3, 0xC7, 0xAB, 0x91, 0xAB, 0x92, 0xAB, 0x93, /* 0xEC-0xEF */ + 0xC3, 0xC8, 0xAB, 0x94, 0xAB, 0x95, 0xAB, 0x96, /* 0xF0-0xF3 */ + 0xAB, 0x97, 0xAB, 0x98, 0xAB, 0x99, 0xAB, 0x9A, /* 0xF4-0xF7 */ + 0xAB, 0x9B, 0xAB, 0x9C, 0xAB, 0x9D, 0xAB, 0x9E, /* 0xF8-0xFB */ + 0xAB, 0x9F, 0xAB, 0xA0, 0xAC, 0x41, 0xAC, 0x42, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_CD[512] = { + 0xAC, 0x43, 0xC3, 0xC9, 0xAC, 0x44, 0xAC, 0x45, /* 0x00-0x03 */ + 0xAC, 0x46, 0xAC, 0x47, 0xAC, 0x48, 0xAC, 0x49, /* 0x04-0x07 */ + 0xC3, 0xCA, 0xC3, 0xCB, 0xAC, 0x4A, 0xAC, 0x4B, /* 0x08-0x0B */ + 0xC3, 0xCC, 0xAC, 0x4C, 0xAC, 0x4D, 0xAC, 0x4E, /* 0x0C-0x0F */ + 0xC3, 0xCD, 0xAC, 0x4F, 0xAC, 0x50, 0xAC, 0x51, /* 0x10-0x13 */ + 0xAC, 0x52, 0xAC, 0x53, 0xAC, 0x54, 0xAC, 0x55, /* 0x14-0x17 */ + 0xC3, 0xCE, 0xC3, 0xCF, 0xAC, 0x56, 0xC3, 0xD0, /* 0x18-0x1B */ + 0xAC, 0x57, 0xC3, 0xD1, 0xAC, 0x58, 0xAC, 0x59, /* 0x1C-0x1F */ + 0xAC, 0x5A, 0xAC, 0x61, 0xAC, 0x62, 0xAC, 0x63, /* 0x20-0x23 */ + 0xC3, 0xD2, 0xAC, 0x64, 0xAC, 0x65, 0xAC, 0x66, /* 0x24-0x27 */ + 0xC3, 0xD3, 0xAC, 0x67, 0xAC, 0x68, 0xAC, 0x69, /* 0x28-0x2B */ + 0xC3, 0xD4, 0xAC, 0x6A, 0xAC, 0x6B, 0xAC, 0x6C, /* 0x2C-0x2F */ + 0xAC, 0x6D, 0xAC, 0x6E, 0xAC, 0x6F, 0xAC, 0x70, /* 0x30-0x33 */ + 0xAC, 0x71, 0xAC, 0x72, 0xAC, 0x73, 0xAC, 0x74, /* 0x34-0x37 */ + 0xAC, 0x75, 0xC3, 0xD5, 0xAC, 0x76, 0xAC, 0x77, /* 0x38-0x3B */ + 0xAC, 0x78, 0xAC, 0x79, 0xAC, 0x7A, 0xAC, 0x81, /* 0x3C-0x3F */ + 0xAC, 0x82, 0xAC, 0x83, 0xAC, 0x84, 0xAC, 0x85, /* 0x40-0x43 */ + 0xAC, 0x86, 0xAC, 0x87, 0xAC, 0x88, 0xAC, 0x89, /* 0x44-0x47 */ + 0xAC, 0x8A, 0xAC, 0x8B, 0xAC, 0x8C, 0xAC, 0x8D, /* 0x48-0x4B */ + 0xAC, 0x8E, 0xAC, 0x8F, 0xAC, 0x90, 0xAC, 0x91, /* 0x4C-0x4F */ + 0xAC, 0x92, 0xAC, 0x93, 0xAC, 0x94, 0xAC, 0x95, /* 0x50-0x53 */ + 0xAC, 0x96, 0xAC, 0x97, 0xAC, 0x98, 0xAC, 0x99, /* 0x54-0x57 */ + 0xAC, 0x9A, 0xAC, 0x9B, 0xAC, 0x9C, 0xAC, 0x9D, /* 0x58-0x5B */ + 0xC3, 0xD6, 0xAC, 0x9E, 0xAC, 0x9F, 0xAC, 0xA0, /* 0x5C-0x5F */ + 0xC3, 0xD7, 0xAD, 0x41, 0xAD, 0x42, 0xAD, 0x43, /* 0x60-0x63 */ + 0xC3, 0xD8, 0xAD, 0x44, 0xAD, 0x45, 0xAD, 0x46, /* 0x64-0x67 */ + 0xAD, 0x47, 0xAD, 0x48, 0xAD, 0x49, 0xAD, 0x4A, /* 0x68-0x6B */ + 0xC3, 0xD9, 0xC3, 0xDA, 0xAD, 0x4B, 0xC3, 0xDB, /* 0x6C-0x6F */ + 0xAD, 0x4C, 0xC3, 0xDC, 0xAD, 0x4D, 0xAD, 0x4E, /* 0x70-0x73 */ + 0xAD, 0x4F, 0xAD, 0x50, 0xAD, 0x51, 0xAD, 0x52, /* 0x74-0x77 */ + 0xC3, 0xDD, 0xAD, 0x53, 0xAD, 0x54, 0xAD, 0x55, /* 0x78-0x7B */ + 0xAD, 0x56, 0xAD, 0x57, 0xAD, 0x58, 0xAD, 0x59, /* 0x7C-0x7F */ + + 0xAD, 0x5A, 0xAD, 0x61, 0xAD, 0x62, 0xAD, 0x63, /* 0x80-0x83 */ + 0xAD, 0x64, 0xAD, 0x65, 0xAD, 0x66, 0xAD, 0x67, /* 0x84-0x87 */ + 0xC3, 0xDE, 0xAD, 0x68, 0xAD, 0x69, 0xAD, 0x6A, /* 0x88-0x8B */ + 0xAD, 0x6B, 0xAD, 0x6C, 0xAD, 0x6D, 0xAD, 0x6E, /* 0x8C-0x8F */ + 0xAD, 0x6F, 0xAD, 0x70, 0xAD, 0x71, 0xAD, 0x72, /* 0x90-0x93 */ + 0xC3, 0xDF, 0xC3, 0xE0, 0xAD, 0x73, 0xAD, 0x74, /* 0x94-0x97 */ + 0xC3, 0xE1, 0xAD, 0x75, 0xAD, 0x76, 0xAD, 0x77, /* 0x98-0x9B */ + 0xC3, 0xE2, 0xAD, 0x78, 0xAD, 0x79, 0xAD, 0x7A, /* 0x9C-0x9F */ + 0xAD, 0x81, 0xAD, 0x82, 0xAD, 0x83, 0xAD, 0x84, /* 0xA0-0xA3 */ + 0xC3, 0xE3, 0xC3, 0xE4, 0xAD, 0x85, 0xC3, 0xE5, /* 0xA4-0xA7 */ + 0xAD, 0x86, 0xC3, 0xE6, 0xAD, 0x87, 0xAD, 0x88, /* 0xA8-0xAB */ + 0xAD, 0x89, 0xAD, 0x8A, 0xAD, 0x8B, 0xAD, 0x8C, /* 0xAC-0xAF */ + 0xC3, 0xE7, 0xAD, 0x8D, 0xAD, 0x8E, 0xAD, 0x8F, /* 0xB0-0xB3 */ + 0xAD, 0x90, 0xAD, 0x91, 0xAD, 0x92, 0xAD, 0x93, /* 0xB4-0xB7 */ + 0xAD, 0x94, 0xAD, 0x95, 0xAD, 0x96, 0xAD, 0x97, /* 0xB8-0xBB */ + 0xAD, 0x98, 0xAD, 0x99, 0xAD, 0x9A, 0xAD, 0x9B, /* 0xBC-0xBF */ + 0xAD, 0x9C, 0xAD, 0x9D, 0xAD, 0x9E, 0xAD, 0x9F, /* 0xC0-0xC3 */ + 0xC3, 0xE8, 0xAD, 0xA0, 0xAE, 0x41, 0xAE, 0x42, /* 0xC4-0xC7 */ + 0xAE, 0x43, 0xAE, 0x44, 0xAE, 0x45, 0xAE, 0x46, /* 0xC8-0xCB */ + 0xC3, 0xE9, 0xAE, 0x47, 0xAE, 0x48, 0xAE, 0x49, /* 0xCC-0xCF */ + 0xC3, 0xEA, 0xAE, 0x4A, 0xAE, 0x4B, 0xAE, 0x4C, /* 0xD0-0xD3 */ + 0xAE, 0x4D, 0xAE, 0x4E, 0xAE, 0x4F, 0xAE, 0x50, /* 0xD4-0xD7 */ + 0xAE, 0x51, 0xAE, 0x52, 0xAE, 0x53, 0xAE, 0x54, /* 0xD8-0xDB */ + 0xAE, 0x55, 0xAE, 0x56, 0xAE, 0x57, 0xAE, 0x58, /* 0xDC-0xDF */ + 0xAE, 0x59, 0xAE, 0x5A, 0xAE, 0x61, 0xAE, 0x62, /* 0xE0-0xE3 */ + 0xAE, 0x63, 0xAE, 0x64, 0xAE, 0x65, 0xAE, 0x66, /* 0xE4-0xE7 */ + 0xC3, 0xEB, 0xAE, 0x67, 0xAE, 0x68, 0xAE, 0x69, /* 0xE8-0xEB */ + 0xC3, 0xEC, 0xAE, 0x6A, 0xAE, 0x6B, 0xAE, 0x6C, /* 0xEC-0xEF */ + 0xC3, 0xED, 0xAE, 0x6D, 0xAE, 0x6E, 0xAE, 0x6F, /* 0xF0-0xF3 */ + 0xAE, 0x70, 0xAE, 0x71, 0xAE, 0x72, 0xAE, 0x73, /* 0xF4-0xF7 */ + 0xC3, 0xEE, 0xC3, 0xEF, 0xAE, 0x74, 0xC3, 0xF0, /* 0xF8-0xFB */ + 0xAE, 0x75, 0xC3, 0xF1, 0xAE, 0x76, 0xAE, 0x77, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_CE[512] = { + 0xAE, 0x78, 0xAE, 0x79, 0xAE, 0x7A, 0xAE, 0x81, /* 0x00-0x03 */ + 0xC3, 0xF2, 0xAE, 0x82, 0xAE, 0x83, 0xAE, 0x84, /* 0x04-0x07 */ + 0xC3, 0xF3, 0xAE, 0x85, 0xAE, 0x86, 0xAE, 0x87, /* 0x08-0x0B */ + 0xC3, 0xF4, 0xAE, 0x88, 0xAE, 0x89, 0xAE, 0x8A, /* 0x0C-0x0F */ + 0xAE, 0x8B, 0xAE, 0x8C, 0xAE, 0x8D, 0xAE, 0x8E, /* 0x10-0x13 */ + 0xC3, 0xF5, 0xAE, 0x8F, 0xAE, 0x90, 0xAE, 0x91, /* 0x14-0x17 */ + 0xAE, 0x92, 0xC3, 0xF6, 0xAE, 0x93, 0xAE, 0x94, /* 0x18-0x1B */ + 0xAE, 0x95, 0xAE, 0x96, 0xAE, 0x97, 0xAE, 0x98, /* 0x1C-0x1F */ + 0xC3, 0xF7, 0xC3, 0xF8, 0xAE, 0x99, 0xAE, 0x9A, /* 0x20-0x23 */ + 0xC3, 0xF9, 0xAE, 0x9B, 0xAE, 0x9C, 0xAE, 0x9D, /* 0x24-0x27 */ + 0xC3, 0xFA, 0xAE, 0x9E, 0xAE, 0x9F, 0xAE, 0xA0, /* 0x28-0x2B */ + 0xAF, 0x41, 0xAF, 0x42, 0xAF, 0x43, 0xAF, 0x44, /* 0x2C-0x2F */ + 0xC3, 0xFB, 0xC3, 0xFC, 0xAF, 0x45, 0xC3, 0xFD, /* 0x30-0x33 */ + 0xAF, 0x46, 0xC3, 0xFE, 0xAF, 0x47, 0xAF, 0x48, /* 0x34-0x37 */ + 0xAF, 0x49, 0xAF, 0x4A, 0xAF, 0x4B, 0xAF, 0x4C, /* 0x38-0x3B */ + 0xAF, 0x4D, 0xAF, 0x4E, 0xAF, 0x4F, 0xAF, 0x50, /* 0x3C-0x3F */ + 0xAF, 0x51, 0xAF, 0x52, 0xAF, 0x53, 0xAF, 0x54, /* 0x40-0x43 */ + 0xAF, 0x55, 0xAF, 0x56, 0xAF, 0x57, 0xAF, 0x58, /* 0x44-0x47 */ + 0xAF, 0x59, 0xAF, 0x5A, 0xAF, 0x61, 0xAF, 0x62, /* 0x48-0x4B */ + 0xAF, 0x63, 0xAF, 0x64, 0xAF, 0x65, 0xAF, 0x66, /* 0x4C-0x4F */ + 0xAF, 0x67, 0xAF, 0x68, 0xAF, 0x69, 0xAF, 0x6A, /* 0x50-0x53 */ + 0xAF, 0x6B, 0xAF, 0x6C, 0xAF, 0x6D, 0xAF, 0x6E, /* 0x54-0x57 */ + 0xC4, 0xA1, 0xC4, 0xA2, 0xAF, 0x6F, 0xAF, 0x70, /* 0x58-0x5B */ + 0xC4, 0xA3, 0xAF, 0x71, 0xAF, 0x72, 0xC4, 0xA4, /* 0x5C-0x5F */ + 0xC4, 0xA5, 0xC4, 0xA6, 0xAF, 0x73, 0xAF, 0x74, /* 0x60-0x63 */ + 0xAF, 0x75, 0xAF, 0x76, 0xAF, 0x77, 0xAF, 0x78, /* 0x64-0x67 */ + 0xC4, 0xA7, 0xC4, 0xA8, 0xAF, 0x79, 0xC4, 0xA9, /* 0x68-0x6B */ + 0xAF, 0x7A, 0xC4, 0xAA, 0xAF, 0x81, 0xAF, 0x82, /* 0x6C-0x6F */ + 0xAF, 0x83, 0xAF, 0x84, 0xAF, 0x85, 0xAF, 0x86, /* 0x70-0x73 */ + 0xC4, 0xAB, 0xC4, 0xAC, 0xAF, 0x87, 0xAF, 0x88, /* 0x74-0x77 */ + 0xC4, 0xAD, 0xAF, 0x89, 0xAF, 0x8A, 0xAF, 0x8B, /* 0x78-0x7B */ + 0xC4, 0xAE, 0xAF, 0x8C, 0xAF, 0x8D, 0xAF, 0x8E, /* 0x7C-0x7F */ + + 0xAF, 0x8F, 0xAF, 0x90, 0xAF, 0x91, 0xAF, 0x92, /* 0x80-0x83 */ + 0xC4, 0xAF, 0xC4, 0xB0, 0xAF, 0x93, 0xC4, 0xB1, /* 0x84-0x87 */ + 0xAF, 0x94, 0xC4, 0xB2, 0xAF, 0x95, 0xAF, 0x96, /* 0x88-0x8B */ + 0xAF, 0x97, 0xAF, 0x98, 0xAF, 0x99, 0xAF, 0x9A, /* 0x8C-0x8F */ + 0xC4, 0xB3, 0xC4, 0xB4, 0xAF, 0x9B, 0xAF, 0x9C, /* 0x90-0x93 */ + 0xC4, 0xB5, 0xAF, 0x9D, 0xAF, 0x9E, 0xAF, 0x9F, /* 0x94-0x97 */ + 0xC4, 0xB6, 0xAF, 0xA0, 0xB0, 0x41, 0xB0, 0x42, /* 0x98-0x9B */ + 0xB0, 0x43, 0xB0, 0x44, 0xB0, 0x45, 0xB0, 0x46, /* 0x9C-0x9F */ + 0xC4, 0xB7, 0xC4, 0xB8, 0xB0, 0x47, 0xC4, 0xB9, /* 0xA0-0xA3 */ + 0xC4, 0xBA, 0xC4, 0xBB, 0xB0, 0x48, 0xB0, 0x49, /* 0xA4-0xA7 */ + 0xB0, 0x4A, 0xB0, 0x4B, 0xB0, 0x4C, 0xB0, 0x4D, /* 0xA8-0xAB */ + 0xC4, 0xBC, 0xC4, 0xBD, 0xB0, 0x4E, 0xB0, 0x4F, /* 0xAC-0xAF */ + 0xB0, 0x50, 0xB0, 0x51, 0xB0, 0x52, 0xB0, 0x53, /* 0xB0-0xB3 */ + 0xB0, 0x54, 0xB0, 0x55, 0xB0, 0x56, 0xB0, 0x57, /* 0xB4-0xB7 */ + 0xB0, 0x58, 0xB0, 0x59, 0xB0, 0x5A, 0xB0, 0x61, /* 0xB8-0xBB */ + 0xB0, 0x62, 0xB0, 0x63, 0xB0, 0x64, 0xB0, 0x65, /* 0xBC-0xBF */ + 0xB0, 0x66, 0xC4, 0xBE, 0xB0, 0x67, 0xB0, 0x68, /* 0xC0-0xC3 */ + 0xB0, 0x69, 0xB0, 0x6A, 0xB0, 0x6B, 0xB0, 0x6C, /* 0xC4-0xC7 */ + 0xB0, 0x6D, 0xB0, 0x6E, 0xB0, 0x6F, 0xB0, 0x70, /* 0xC8-0xCB */ + 0xB0, 0x71, 0xB0, 0x72, 0xB0, 0x73, 0xB0, 0x74, /* 0xCC-0xCF */ + 0xB0, 0x75, 0xB0, 0x76, 0xB0, 0x77, 0xB0, 0x78, /* 0xD0-0xD3 */ + 0xB0, 0x79, 0xB0, 0x7A, 0xB0, 0x81, 0xB0, 0x82, /* 0xD4-0xD7 */ + 0xB0, 0x83, 0xB0, 0x84, 0xB0, 0x85, 0xB0, 0x86, /* 0xD8-0xDB */ + 0xB0, 0x87, 0xB0, 0x88, 0xB0, 0x89, 0xB0, 0x8A, /* 0xDC-0xDF */ + 0xB0, 0x8B, 0xB0, 0x8C, 0xB0, 0x8D, 0xB0, 0x8E, /* 0xE0-0xE3 */ + 0xC4, 0xBF, 0xC4, 0xC0, 0xB0, 0x8F, 0xB0, 0x90, /* 0xE4-0xE7 */ + 0xC4, 0xC1, 0xB0, 0x91, 0xB0, 0x92, 0xC4, 0xC2, /* 0xE8-0xEB */ + 0xC4, 0xC3, 0xB0, 0x93, 0xB0, 0x94, 0xB0, 0x95, /* 0xEC-0xEF */ + 0xB0, 0x96, 0xB0, 0x97, 0xB0, 0x98, 0xB0, 0x99, /* 0xF0-0xF3 */ + 0xC4, 0xC4, 0xC4, 0xC5, 0xB0, 0x9A, 0xC4, 0xC6, /* 0xF4-0xF7 */ + 0xC4, 0xC7, 0xC4, 0xC8, 0xB0, 0x9B, 0xB0, 0x9C, /* 0xF8-0xFB */ + 0xB0, 0x9D, 0xB0, 0x9E, 0xB0, 0x9F, 0xB0, 0xA0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_CF[512] = { + 0xC4, 0xC9, 0xC4, 0xCA, 0xB1, 0x41, 0xB1, 0x42, /* 0x00-0x03 */ + 0xC4, 0xCB, 0xB1, 0x43, 0xB1, 0x44, 0xB1, 0x45, /* 0x04-0x07 */ + 0xC4, 0xCC, 0xB1, 0x46, 0xB1, 0x47, 0xB1, 0x48, /* 0x08-0x0B */ + 0xB1, 0x49, 0xB1, 0x4A, 0xB1, 0x4B, 0xB1, 0x4C, /* 0x0C-0x0F */ + 0xC4, 0xCD, 0xC4, 0xCE, 0xB1, 0x4D, 0xC4, 0xCF, /* 0x10-0x13 */ + 0xB1, 0x4E, 0xC4, 0xD0, 0xB1, 0x4F, 0xB1, 0x50, /* 0x14-0x17 */ + 0xB1, 0x51, 0xB1, 0x52, 0xB1, 0x53, 0xB1, 0x54, /* 0x18-0x1B */ + 0xC4, 0xD1, 0xB1, 0x55, 0xB1, 0x56, 0xB1, 0x57, /* 0x1C-0x1F */ + 0xC4, 0xD2, 0xB1, 0x58, 0xB1, 0x59, 0xB1, 0x5A, /* 0x20-0x23 */ + 0xC4, 0xD3, 0xB1, 0x61, 0xB1, 0x62, 0xB1, 0x63, /* 0x24-0x27 */ + 0xB1, 0x64, 0xB1, 0x65, 0xB1, 0x66, 0xB1, 0x67, /* 0x28-0x2B */ + 0xC4, 0xD4, 0xC4, 0xD5, 0xB1, 0x68, 0xC4, 0xD6, /* 0x2C-0x2F */ + 0xC4, 0xD7, 0xC4, 0xD8, 0xB1, 0x69, 0xB1, 0x6A, /* 0x30-0x33 */ + 0xB1, 0x6B, 0xB1, 0x6C, 0xB1, 0x6D, 0xB1, 0x6E, /* 0x34-0x37 */ + 0xC4, 0xD9, 0xB1, 0x6F, 0xB1, 0x70, 0xB1, 0x71, /* 0x38-0x3B */ + 0xB1, 0x72, 0xB1, 0x73, 0xB1, 0x74, 0xB1, 0x75, /* 0x3C-0x3F */ + 0xB1, 0x76, 0xB1, 0x77, 0xB1, 0x78, 0xB1, 0x79, /* 0x40-0x43 */ + 0xB1, 0x7A, 0xB1, 0x81, 0xB1, 0x82, 0xB1, 0x83, /* 0x44-0x47 */ + 0xB1, 0x84, 0xB1, 0x85, 0xB1, 0x86, 0xB1, 0x87, /* 0x48-0x4B */ + 0xB1, 0x88, 0xB1, 0x89, 0xB1, 0x8A, 0xB1, 0x8B, /* 0x4C-0x4F */ + 0xB1, 0x8C, 0xB1, 0x8D, 0xB1, 0x8E, 0xB1, 0x8F, /* 0x50-0x53 */ + 0xC4, 0xDA, 0xC4, 0xDB, 0xB1, 0x90, 0xB1, 0x91, /* 0x54-0x57 */ + 0xC4, 0xDC, 0xB1, 0x92, 0xB1, 0x93, 0xB1, 0x94, /* 0x58-0x5B */ + 0xC4, 0xDD, 0xB1, 0x95, 0xB1, 0x96, 0xB1, 0x97, /* 0x5C-0x5F */ + 0xB1, 0x98, 0xB1, 0x99, 0xB1, 0x9A, 0xB1, 0x9B, /* 0x60-0x63 */ + 0xC4, 0xDE, 0xC4, 0xDF, 0xB1, 0x9C, 0xC4, 0xE0, /* 0x64-0x67 */ + 0xB1, 0x9D, 0xC4, 0xE1, 0xB1, 0x9E, 0xB1, 0x9F, /* 0x68-0x6B */ + 0xB1, 0xA0, 0xB2, 0x41, 0xB2, 0x42, 0xB2, 0x43, /* 0x6C-0x6F */ + 0xC4, 0xE2, 0xC4, 0xE3, 0xB2, 0x44, 0xB2, 0x45, /* 0x70-0x73 */ + 0xC4, 0xE4, 0xB2, 0x46, 0xB2, 0x47, 0xB2, 0x48, /* 0x74-0x77 */ + 0xC4, 0xE5, 0xB2, 0x49, 0xB2, 0x4A, 0xB2, 0x4B, /* 0x78-0x7B */ + 0xB2, 0x4C, 0xB2, 0x4D, 0xB2, 0x4E, 0xB2, 0x4F, /* 0x7C-0x7F */ + + 0xC4, 0xE6, 0xB2, 0x50, 0xB2, 0x51, 0xB2, 0x52, /* 0x80-0x83 */ + 0xB2, 0x53, 0xC4, 0xE7, 0xB2, 0x54, 0xB2, 0x55, /* 0x84-0x87 */ + 0xB2, 0x56, 0xB2, 0x57, 0xB2, 0x58, 0xB2, 0x59, /* 0x88-0x8B */ + 0xC4, 0xE8, 0xB2, 0x5A, 0xB2, 0x61, 0xB2, 0x62, /* 0x8C-0x8F */ + 0xB2, 0x63, 0xB2, 0x64, 0xB2, 0x65, 0xB2, 0x66, /* 0x90-0x93 */ + 0xB2, 0x67, 0xB2, 0x68, 0xB2, 0x69, 0xB2, 0x6A, /* 0x94-0x97 */ + 0xB2, 0x6B, 0xB2, 0x6C, 0xB2, 0x6D, 0xB2, 0x6E, /* 0x98-0x9B */ + 0xB2, 0x6F, 0xB2, 0x70, 0xB2, 0x71, 0xB2, 0x72, /* 0x9C-0x9F */ + 0xB2, 0x73, 0xC4, 0xE9, 0xB2, 0x74, 0xB2, 0x75, /* 0xA0-0xA3 */ + 0xB2, 0x76, 0xB2, 0x77, 0xB2, 0x78, 0xB2, 0x79, /* 0xA4-0xA7 */ + 0xC4, 0xEA, 0xB2, 0x7A, 0xB2, 0x81, 0xB2, 0x82, /* 0xA8-0xAB */ + 0xB2, 0x83, 0xB2, 0x84, 0xB2, 0x85, 0xB2, 0x86, /* 0xAC-0xAF */ + 0xC4, 0xEB, 0xB2, 0x87, 0xB2, 0x88, 0xB2, 0x89, /* 0xB0-0xB3 */ + 0xB2, 0x8A, 0xB2, 0x8B, 0xB2, 0x8C, 0xB2, 0x8D, /* 0xB4-0xB7 */ + 0xB2, 0x8E, 0xB2, 0x8F, 0xB2, 0x90, 0xB2, 0x91, /* 0xB8-0xBB */ + 0xB2, 0x92, 0xB2, 0x93, 0xB2, 0x94, 0xB2, 0x95, /* 0xBC-0xBF */ + 0xB2, 0x96, 0xB2, 0x97, 0xB2, 0x98, 0xB2, 0x99, /* 0xC0-0xC3 */ + 0xC4, 0xEC, 0xB2, 0x9A, 0xB2, 0x9B, 0xB2, 0x9C, /* 0xC4-0xC7 */ + 0xB2, 0x9D, 0xB2, 0x9E, 0xB2, 0x9F, 0xB2, 0xA0, /* 0xC8-0xCB */ + 0xB3, 0x41, 0xB3, 0x42, 0xB3, 0x43, 0xB3, 0x44, /* 0xCC-0xCF */ + 0xB3, 0x45, 0xB3, 0x46, 0xB3, 0x47, 0xB3, 0x48, /* 0xD0-0xD3 */ + 0xB3, 0x49, 0xB3, 0x4A, 0xB3, 0x4B, 0xB3, 0x4C, /* 0xD4-0xD7 */ + 0xB3, 0x4D, 0xB3, 0x4E, 0xB3, 0x4F, 0xB3, 0x50, /* 0xD8-0xDB */ + 0xB3, 0x51, 0xB3, 0x52, 0xB3, 0x53, 0xB3, 0x54, /* 0xDC-0xDF */ + 0xC4, 0xED, 0xC4, 0xEE, 0xB3, 0x55, 0xB3, 0x56, /* 0xE0-0xE3 */ + 0xC4, 0xEF, 0xB3, 0x57, 0xB3, 0x58, 0xB3, 0x59, /* 0xE4-0xE7 */ + 0xC4, 0xF0, 0xB3, 0x5A, 0xB3, 0x61, 0xB3, 0x62, /* 0xE8-0xEB */ + 0xB3, 0x63, 0xB3, 0x64, 0xB3, 0x65, 0xB3, 0x66, /* 0xEC-0xEF */ + 0xC4, 0xF1, 0xC4, 0xF2, 0xB3, 0x67, 0xC4, 0xF3, /* 0xF0-0xF3 */ + 0xB3, 0x68, 0xC4, 0xF4, 0xB3, 0x69, 0xB3, 0x6A, /* 0xF4-0xF7 */ + 0xB3, 0x6B, 0xB3, 0x6C, 0xB3, 0x6D, 0xB3, 0x6E, /* 0xF8-0xFB */ + 0xC4, 0xF5, 0xB3, 0x6F, 0xB3, 0x70, 0xB3, 0x71, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_D0[512] = { + 0xC4, 0xF6, 0xB3, 0x72, 0xB3, 0x73, 0xB3, 0x74, /* 0x00-0x03 */ + 0xC4, 0xF7, 0xB3, 0x75, 0xB3, 0x76, 0xB3, 0x77, /* 0x04-0x07 */ + 0xB3, 0x78, 0xB3, 0x79, 0xB3, 0x7A, 0xB3, 0x81, /* 0x08-0x0B */ + 0xB3, 0x82, 0xB3, 0x83, 0xB3, 0x84, 0xB3, 0x85, /* 0x0C-0x0F */ + 0xB3, 0x86, 0xC4, 0xF8, 0xB3, 0x87, 0xB3, 0x88, /* 0x10-0x13 */ + 0xB3, 0x89, 0xB3, 0x8A, 0xB3, 0x8B, 0xB3, 0x8C, /* 0x14-0x17 */ + 0xC4, 0xF9, 0xB3, 0x8D, 0xB3, 0x8E, 0xB3, 0x8F, /* 0x18-0x1B */ + 0xB3, 0x90, 0xB3, 0x91, 0xB3, 0x92, 0xB3, 0x93, /* 0x1C-0x1F */ + 0xB3, 0x94, 0xB3, 0x95, 0xB3, 0x96, 0xB3, 0x97, /* 0x20-0x23 */ + 0xB3, 0x98, 0xB3, 0x99, 0xB3, 0x9A, 0xB3, 0x9B, /* 0x24-0x27 */ + 0xB3, 0x9C, 0xB3, 0x9D, 0xB3, 0x9E, 0xB3, 0x9F, /* 0x28-0x2B */ + 0xB3, 0xA0, 0xC4, 0xFA, 0xB4, 0x41, 0xB4, 0x42, /* 0x2C-0x2F */ + 0xB4, 0x43, 0xB4, 0x44, 0xB4, 0x45, 0xB4, 0x46, /* 0x30-0x33 */ + 0xC4, 0xFB, 0xC4, 0xFC, 0xB4, 0x47, 0xB4, 0x48, /* 0x34-0x37 */ + 0xC4, 0xFD, 0xB4, 0x49, 0xB4, 0x4A, 0xB4, 0x4B, /* 0x38-0x3B */ + 0xC4, 0xFE, 0xB4, 0x4C, 0xB4, 0x4D, 0xB4, 0x4E, /* 0x3C-0x3F */ + 0xB4, 0x4F, 0xB4, 0x50, 0xB4, 0x51, 0xB4, 0x52, /* 0x40-0x43 */ + 0xC5, 0xA1, 0xC5, 0xA2, 0xB4, 0x53, 0xC5, 0xA3, /* 0x44-0x47 */ + 0xB4, 0x54, 0xC5, 0xA4, 0xB4, 0x55, 0xB4, 0x56, /* 0x48-0x4B */ + 0xB4, 0x57, 0xB4, 0x58, 0xB4, 0x59, 0xB4, 0x5A, /* 0x4C-0x4F */ + 0xC5, 0xA5, 0xB4, 0x61, 0xB4, 0x62, 0xB4, 0x63, /* 0x50-0x53 */ + 0xC5, 0xA6, 0xB4, 0x64, 0xB4, 0x65, 0xB4, 0x66, /* 0x54-0x57 */ + 0xC5, 0xA7, 0xB4, 0x67, 0xB4, 0x68, 0xB4, 0x69, /* 0x58-0x5B */ + 0xB4, 0x6A, 0xB4, 0x6B, 0xB4, 0x6C, 0xB4, 0x6D, /* 0x5C-0x5F */ + 0xC5, 0xA8, 0xB4, 0x6E, 0xB4, 0x6F, 0xB4, 0x70, /* 0x60-0x63 */ + 0xB4, 0x71, 0xB4, 0x72, 0xB4, 0x73, 0xB4, 0x74, /* 0x64-0x67 */ + 0xB4, 0x75, 0xB4, 0x76, 0xB4, 0x77, 0xB4, 0x78, /* 0x68-0x6B */ + 0xC5, 0xA9, 0xC5, 0xAA, 0xB4, 0x79, 0xB4, 0x7A, /* 0x6C-0x6F */ + 0xC5, 0xAB, 0xB4, 0x81, 0xB4, 0x82, 0xB4, 0x83, /* 0x70-0x73 */ + 0xC5, 0xAC, 0xB4, 0x84, 0xB4, 0x85, 0xB4, 0x86, /* 0x74-0x77 */ + 0xB4, 0x87, 0xB4, 0x88, 0xB4, 0x89, 0xB4, 0x8A, /* 0x78-0x7B */ + 0xC5, 0xAD, 0xC5, 0xAE, 0xB4, 0x8B, 0xB4, 0x8C, /* 0x7C-0x7F */ + + 0xB4, 0x8D, 0xC5, 0xAF, 0xB4, 0x8E, 0xB4, 0x8F, /* 0x80-0x83 */ + 0xB4, 0x90, 0xB4, 0x91, 0xB4, 0x92, 0xB4, 0x93, /* 0x84-0x87 */ + 0xB4, 0x94, 0xB4, 0x95, 0xB4, 0x96, 0xB4, 0x97, /* 0x88-0x8B */ + 0xB4, 0x98, 0xB4, 0x99, 0xB4, 0x9A, 0xB4, 0x9B, /* 0x8C-0x8F */ + 0xB4, 0x9C, 0xB4, 0x9D, 0xB4, 0x9E, 0xB4, 0x9F, /* 0x90-0x93 */ + 0xB4, 0xA0, 0xB5, 0x41, 0xB5, 0x42, 0xB5, 0x43, /* 0x94-0x97 */ + 0xB5, 0x44, 0xB5, 0x45, 0xB5, 0x46, 0xB5, 0x47, /* 0x98-0x9B */ + 0xB5, 0x48, 0xB5, 0x49, 0xB5, 0x4A, 0xB5, 0x4B, /* 0x9C-0x9F */ + 0xB5, 0x4C, 0xB5, 0x4D, 0xB5, 0x4E, 0xB5, 0x4F, /* 0xA0-0xA3 */ + 0xC5, 0xB0, 0xC5, 0xB1, 0xB5, 0x50, 0xB5, 0x51, /* 0xA4-0xA7 */ + 0xC5, 0xB2, 0xB5, 0x52, 0xB5, 0x53, 0xB5, 0x54, /* 0xA8-0xAB */ + 0xC5, 0xB3, 0xB5, 0x55, 0xB5, 0x56, 0xB5, 0x57, /* 0xAC-0xAF */ + 0xB5, 0x58, 0xB5, 0x59, 0xB5, 0x5A, 0xB5, 0x61, /* 0xB0-0xB3 */ + 0xC5, 0xB4, 0xC5, 0xB5, 0xB5, 0x62, 0xC5, 0xB6, /* 0xB4-0xB7 */ + 0xB5, 0x63, 0xC5, 0xB7, 0xB5, 0x64, 0xB5, 0x65, /* 0xB8-0xBB */ + 0xB5, 0x66, 0xB5, 0x67, 0xB5, 0x68, 0xB5, 0x69, /* 0xBC-0xBF */ + 0xC5, 0xB8, 0xC5, 0xB9, 0xB5, 0x6A, 0xB5, 0x6B, /* 0xC0-0xC3 */ + 0xC5, 0xBA, 0xB5, 0x6C, 0xB5, 0x6D, 0xB5, 0x6E, /* 0xC4-0xC7 */ + 0xC5, 0xBB, 0xC5, 0xBC, 0xB5, 0x6F, 0xB5, 0x70, /* 0xC8-0xCB */ + 0xB5, 0x71, 0xB5, 0x72, 0xB5, 0x73, 0xB5, 0x74, /* 0xCC-0xCF */ + 0xC5, 0xBD, 0xC5, 0xBE, 0xB5, 0x75, 0xC5, 0xBF, /* 0xD0-0xD3 */ + 0xC5, 0xC0, 0xC5, 0xC1, 0xB5, 0x76, 0xB5, 0x77, /* 0xD4-0xD7 */ + 0xB5, 0x78, 0xB5, 0x79, 0xB5, 0x7A, 0xB5, 0x81, /* 0xD8-0xDB */ + 0xC5, 0xC2, 0xC5, 0xC3, 0xB5, 0x82, 0xB5, 0x83, /* 0xDC-0xDF */ + 0xC5, 0xC4, 0xB5, 0x84, 0xB5, 0x85, 0xB5, 0x86, /* 0xE0-0xE3 */ + 0xC5, 0xC5, 0xB5, 0x87, 0xB5, 0x88, 0xB5, 0x89, /* 0xE4-0xE7 */ + 0xB5, 0x8A, 0xB5, 0x8B, 0xB5, 0x8C, 0xB5, 0x8D, /* 0xE8-0xEB */ + 0xC5, 0xC6, 0xC5, 0xC7, 0xB5, 0x8E, 0xC5, 0xC8, /* 0xEC-0xEF */ + 0xC5, 0xC9, 0xC5, 0xCA, 0xB5, 0x8F, 0xB5, 0x90, /* 0xF0-0xF3 */ + 0xB5, 0x91, 0xB5, 0x92, 0xB5, 0x93, 0xB5, 0x94, /* 0xF4-0xF7 */ + 0xC5, 0xCB, 0xB5, 0x95, 0xB5, 0x96, 0xB5, 0x97, /* 0xF8-0xFB */ + 0xB5, 0x98, 0xB5, 0x99, 0xB5, 0x9A, 0xB5, 0x9B, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_D1[512] = { + 0xB5, 0x9C, 0xB5, 0x9D, 0xB5, 0x9E, 0xB5, 0x9F, /* 0x00-0x03 */ + 0xB5, 0xA0, 0xB6, 0x41, 0xB6, 0x42, 0xB6, 0x43, /* 0x04-0x07 */ + 0xB6, 0x44, 0xB6, 0x45, 0xB6, 0x46, 0xB6, 0x47, /* 0x08-0x0B */ + 0xB6, 0x48, 0xC5, 0xCC, 0xB6, 0x49, 0xB6, 0x4A, /* 0x0C-0x0F */ + 0xB6, 0x4B, 0xB6, 0x4C, 0xB6, 0x4D, 0xB6, 0x4E, /* 0x10-0x13 */ + 0xB6, 0x4F, 0xB6, 0x50, 0xB6, 0x51, 0xB6, 0x52, /* 0x14-0x17 */ + 0xB6, 0x53, 0xB6, 0x54, 0xB6, 0x55, 0xB6, 0x56, /* 0x18-0x1B */ + 0xB6, 0x57, 0xB6, 0x58, 0xB6, 0x59, 0xB6, 0x5A, /* 0x1C-0x1F */ + 0xB6, 0x61, 0xB6, 0x62, 0xB6, 0x63, 0xB6, 0x64, /* 0x20-0x23 */ + 0xB6, 0x65, 0xB6, 0x66, 0xB6, 0x67, 0xB6, 0x68, /* 0x24-0x27 */ + 0xB6, 0x69, 0xB6, 0x6A, 0xB6, 0x6B, 0xB6, 0x6C, /* 0x28-0x2B */ + 0xB6, 0x6D, 0xB6, 0x6E, 0xB6, 0x6F, 0xB6, 0x70, /* 0x2C-0x2F */ + 0xC5, 0xCD, 0xC5, 0xCE, 0xB6, 0x71, 0xB6, 0x72, /* 0x30-0x33 */ + 0xC5, 0xCF, 0xB6, 0x73, 0xB6, 0x74, 0xB6, 0x75, /* 0x34-0x37 */ + 0xC5, 0xD0, 0xB6, 0x76, 0xC5, 0xD1, 0xB6, 0x77, /* 0x38-0x3B */ + 0xB6, 0x78, 0xB6, 0x79, 0xB6, 0x7A, 0xB6, 0x81, /* 0x3C-0x3F */ + 0xC5, 0xD2, 0xC5, 0xD3, 0xB6, 0x82, 0xC5, 0xD4, /* 0x40-0x43 */ + 0xC5, 0xD5, 0xC5, 0xD6, 0xB6, 0x83, 0xB6, 0x84, /* 0x44-0x47 */ + 0xB6, 0x85, 0xB6, 0x86, 0xB6, 0x87, 0xB6, 0x88, /* 0x48-0x4B */ + 0xC5, 0xD7, 0xC5, 0xD8, 0xB6, 0x89, 0xB6, 0x8A, /* 0x4C-0x4F */ + 0xC5, 0xD9, 0xB6, 0x8B, 0xB6, 0x8C, 0xB6, 0x8D, /* 0x50-0x53 */ + 0xC5, 0xDA, 0xB6, 0x8E, 0xB6, 0x8F, 0xB6, 0x90, /* 0x54-0x57 */ + 0xB6, 0x91, 0xB6, 0x92, 0xB6, 0x93, 0xB6, 0x94, /* 0x58-0x5B */ + 0xC5, 0xDB, 0xC5, 0xDC, 0xB6, 0x95, 0xC5, 0xDD, /* 0x5C-0x5F */ + 0xB6, 0x96, 0xC5, 0xDE, 0xB6, 0x97, 0xB6, 0x98, /* 0x60-0x63 */ + 0xB6, 0x99, 0xB6, 0x9A, 0xB6, 0x9B, 0xB6, 0x9C, /* 0x64-0x67 */ + 0xC5, 0xDF, 0xB6, 0x9D, 0xB6, 0x9E, 0xB6, 0x9F, /* 0x68-0x6B */ + 0xC5, 0xE0, 0xB6, 0xA0, 0xB7, 0x41, 0xB7, 0x42, /* 0x6C-0x6F */ + 0xB7, 0x43, 0xB7, 0x44, 0xB7, 0x45, 0xB7, 0x46, /* 0x70-0x73 */ + 0xB7, 0x47, 0xB7, 0x48, 0xB7, 0x49, 0xB7, 0x4A, /* 0x74-0x77 */ + 0xB7, 0x4B, 0xB7, 0x4C, 0xB7, 0x4D, 0xB7, 0x4E, /* 0x78-0x7B */ + 0xC5, 0xE1, 0xB7, 0x4F, 0xB7, 0x50, 0xB7, 0x51, /* 0x7C-0x7F */ + + 0xB7, 0x52, 0xB7, 0x53, 0xB7, 0x54, 0xB7, 0x55, /* 0x80-0x83 */ + 0xC5, 0xE2, 0xB7, 0x56, 0xB7, 0x57, 0xB7, 0x58, /* 0x84-0x87 */ + 0xC5, 0xE3, 0xB7, 0x59, 0xB7, 0x5A, 0xB7, 0x61, /* 0x88-0x8B */ + 0xB7, 0x62, 0xB7, 0x63, 0xB7, 0x64, 0xB7, 0x65, /* 0x8C-0x8F */ + 0xB7, 0x66, 0xB7, 0x67, 0xB7, 0x68, 0xB7, 0x69, /* 0x90-0x93 */ + 0xB7, 0x6A, 0xB7, 0x6B, 0xB7, 0x6C, 0xB7, 0x6D, /* 0x94-0x97 */ + 0xB7, 0x6E, 0xB7, 0x6F, 0xB7, 0x70, 0xB7, 0x71, /* 0x98-0x9B */ + 0xB7, 0x72, 0xB7, 0x73, 0xB7, 0x74, 0xB7, 0x75, /* 0x9C-0x9F */ + 0xC5, 0xE4, 0xC5, 0xE5, 0xB7, 0x76, 0xB7, 0x77, /* 0xA0-0xA3 */ + 0xC5, 0xE6, 0xB7, 0x78, 0xB7, 0x79, 0xB7, 0x7A, /* 0xA4-0xA7 */ + 0xC5, 0xE7, 0xB7, 0x81, 0xB7, 0x82, 0xB7, 0x83, /* 0xA8-0xAB */ + 0xB7, 0x84, 0xB7, 0x85, 0xB7, 0x86, 0xB7, 0x87, /* 0xAC-0xAF */ + 0xC5, 0xE8, 0xC5, 0xE9, 0xB7, 0x88, 0xC5, 0xEA, /* 0xB0-0xB3 */ + 0xB7, 0x89, 0xC5, 0xEB, 0xB7, 0x8A, 0xB7, 0x8B, /* 0xB4-0xB7 */ + 0xB7, 0x8C, 0xB7, 0x8D, 0xC5, 0xEC, 0xB7, 0x8E, /* 0xB8-0xBB */ + 0xC5, 0xED, 0xB7, 0x8F, 0xB7, 0x90, 0xB7, 0x91, /* 0xBC-0xBF */ + 0xC5, 0xEE, 0xB7, 0x92, 0xB7, 0x93, 0xB7, 0x94, /* 0xC0-0xC3 */ + 0xB7, 0x95, 0xB7, 0x96, 0xB7, 0x97, 0xB7, 0x98, /* 0xC4-0xC7 */ + 0xB7, 0x99, 0xB7, 0x9A, 0xB7, 0x9B, 0xB7, 0x9C, /* 0xC8-0xCB */ + 0xB7, 0x9D, 0xB7, 0x9E, 0xB7, 0x9F, 0xB7, 0xA0, /* 0xCC-0xCF */ + 0xB8, 0x41, 0xB8, 0x42, 0xB8, 0x43, 0xB8, 0x44, /* 0xD0-0xD3 */ + 0xB8, 0x45, 0xB8, 0x46, 0xB8, 0x47, 0xB8, 0x48, /* 0xD4-0xD7 */ + 0xC5, 0xEF, 0xB8, 0x49, 0xB8, 0x4A, 0xB8, 0x4B, /* 0xD8-0xDB */ + 0xB8, 0x4C, 0xB8, 0x4D, 0xB8, 0x4E, 0xB8, 0x4F, /* 0xDC-0xDF */ + 0xB8, 0x50, 0xB8, 0x51, 0xB8, 0x52, 0xB8, 0x53, /* 0xE0-0xE3 */ + 0xB8, 0x54, 0xB8, 0x55, 0xB8, 0x56, 0xB8, 0x57, /* 0xE4-0xE7 */ + 0xB8, 0x58, 0xB8, 0x59, 0xB8, 0x5A, 0xB8, 0x61, /* 0xE8-0xEB */ + 0xB8, 0x62, 0xB8, 0x63, 0xB8, 0x64, 0xB8, 0x65, /* 0xEC-0xEF */ + 0xB8, 0x66, 0xB8, 0x67, 0xB8, 0x68, 0xB8, 0x69, /* 0xF0-0xF3 */ + 0xC5, 0xF0, 0xB8, 0x6A, 0xB8, 0x6B, 0xB8, 0x6C, /* 0xF4-0xF7 */ + 0xC5, 0xF1, 0xB8, 0x6D, 0xB8, 0x6E, 0xB8, 0x6F, /* 0xF8-0xFB */ + 0xB8, 0x70, 0xB8, 0x71, 0xB8, 0x72, 0xB8, 0x73, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_D2[512] = { + 0xB8, 0x74, 0xB8, 0x75, 0xB8, 0x76, 0xB8, 0x77, /* 0x00-0x03 */ + 0xB8, 0x78, 0xB8, 0x79, 0xB8, 0x7A, 0xC5, 0xF2, /* 0x04-0x07 */ + 0xB8, 0x81, 0xC5, 0xF3, 0xB8, 0x82, 0xB8, 0x83, /* 0x08-0x0B */ + 0xB8, 0x84, 0xB8, 0x85, 0xB8, 0x86, 0xB8, 0x87, /* 0x0C-0x0F */ + 0xC5, 0xF4, 0xB8, 0x88, 0xB8, 0x89, 0xB8, 0x8A, /* 0x10-0x13 */ + 0xB8, 0x8B, 0xB8, 0x8C, 0xB8, 0x8D, 0xB8, 0x8E, /* 0x14-0x17 */ + 0xB8, 0x8F, 0xB8, 0x90, 0xB8, 0x91, 0xB8, 0x92, /* 0x18-0x1B */ + 0xB8, 0x93, 0xB8, 0x94, 0xB8, 0x95, 0xB8, 0x96, /* 0x1C-0x1F */ + 0xB8, 0x97, 0xB8, 0x98, 0xB8, 0x99, 0xB8, 0x9A, /* 0x20-0x23 */ + 0xB8, 0x9B, 0xB8, 0x9C, 0xB8, 0x9D, 0xB8, 0x9E, /* 0x24-0x27 */ + 0xB8, 0x9F, 0xB8, 0xA0, 0xB9, 0x41, 0xB9, 0x42, /* 0x28-0x2B */ + 0xC5, 0xF5, 0xC5, 0xF6, 0xB9, 0x43, 0xB9, 0x44, /* 0x2C-0x2F */ + 0xC5, 0xF7, 0xB9, 0x45, 0xB9, 0x46, 0xB9, 0x47, /* 0x30-0x33 */ + 0xC5, 0xF8, 0xB9, 0x48, 0xB9, 0x49, 0xB9, 0x4A, /* 0x34-0x37 */ + 0xB9, 0x4B, 0xB9, 0x4C, 0xB9, 0x4D, 0xB9, 0x4E, /* 0x38-0x3B */ + 0xC5, 0xF9, 0xC5, 0xFA, 0xB9, 0x4F, 0xC5, 0xFB, /* 0x3C-0x3F */ + 0xB9, 0x50, 0xC5, 0xFC, 0xB9, 0x51, 0xB9, 0x52, /* 0x40-0x43 */ + 0xB9, 0x53, 0xB9, 0x54, 0xB9, 0x55, 0xB9, 0x56, /* 0x44-0x47 */ + 0xC5, 0xFD, 0xB9, 0x57, 0xB9, 0x58, 0xB9, 0x59, /* 0x48-0x4B */ + 0xB9, 0x5A, 0xB9, 0x61, 0xB9, 0x62, 0xB9, 0x63, /* 0x4C-0x4F */ + 0xB9, 0x64, 0xB9, 0x65, 0xB9, 0x66, 0xB9, 0x67, /* 0x50-0x53 */ + 0xB9, 0x68, 0xB9, 0x69, 0xB9, 0x6A, 0xB9, 0x6B, /* 0x54-0x57 */ + 0xB9, 0x6C, 0xB9, 0x6D, 0xB9, 0x6E, 0xB9, 0x6F, /* 0x58-0x5B */ + 0xC5, 0xFE, 0xB9, 0x70, 0xB9, 0x71, 0xB9, 0x72, /* 0x5C-0x5F */ + 0xB9, 0x73, 0xB9, 0x74, 0xB9, 0x75, 0xB9, 0x76, /* 0x60-0x63 */ + 0xC6, 0xA1, 0xB9, 0x77, 0xB9, 0x78, 0xB9, 0x79, /* 0x64-0x67 */ + 0xB9, 0x7A, 0xB9, 0x81, 0xB9, 0x82, 0xB9, 0x83, /* 0x68-0x6B */ + 0xB9, 0x84, 0xB9, 0x85, 0xB9, 0x86, 0xB9, 0x87, /* 0x6C-0x6F */ + 0xB9, 0x88, 0xB9, 0x89, 0xB9, 0x8A, 0xB9, 0x8B, /* 0x70-0x73 */ + 0xB9, 0x8C, 0xB9, 0x8D, 0xB9, 0x8E, 0xB9, 0x8F, /* 0x74-0x77 */ + 0xB9, 0x90, 0xB9, 0x91, 0xB9, 0x92, 0xB9, 0x93, /* 0x78-0x7B */ + 0xB9, 0x94, 0xB9, 0x95, 0xB9, 0x96, 0xB9, 0x97, /* 0x7C-0x7F */ + + 0xC6, 0xA2, 0xC6, 0xA3, 0xB9, 0x98, 0xB9, 0x99, /* 0x80-0x83 */ + 0xC6, 0xA4, 0xB9, 0x9A, 0xB9, 0x9B, 0xB9, 0x9C, /* 0x84-0x87 */ + 0xC6, 0xA5, 0xB9, 0x9D, 0xB9, 0x9E, 0xB9, 0x9F, /* 0x88-0x8B */ + 0xB9, 0xA0, 0xBA, 0x41, 0xBA, 0x42, 0xBA, 0x43, /* 0x8C-0x8F */ + 0xC6, 0xA6, 0xC6, 0xA7, 0xBA, 0x44, 0xBA, 0x45, /* 0x90-0x93 */ + 0xBA, 0x46, 0xC6, 0xA8, 0xBA, 0x47, 0xBA, 0x48, /* 0x94-0x97 */ + 0xBA, 0x49, 0xBA, 0x4A, 0xBA, 0x4B, 0xBA, 0x4C, /* 0x98-0x9B */ + 0xC6, 0xA9, 0xBA, 0x4D, 0xBA, 0x4E, 0xBA, 0x4F, /* 0x9C-0x9F */ + 0xC6, 0xAA, 0xBA, 0x50, 0xBA, 0x51, 0xBA, 0x52, /* 0xA0-0xA3 */ + 0xC6, 0xAB, 0xBA, 0x53, 0xBA, 0x54, 0xBA, 0x55, /* 0xA4-0xA7 */ + 0xBA, 0x56, 0xBA, 0x57, 0xBA, 0x58, 0xBA, 0x59, /* 0xA8-0xAB */ + 0xC6, 0xAC, 0xBA, 0x5A, 0xBA, 0x61, 0xBA, 0x62, /* 0xAC-0xAF */ + 0xBA, 0x63, 0xC6, 0xAD, 0xBA, 0x64, 0xBA, 0x65, /* 0xB0-0xB3 */ + 0xBA, 0x66, 0xBA, 0x67, 0xBA, 0x68, 0xBA, 0x69, /* 0xB4-0xB7 */ + 0xC6, 0xAE, 0xC6, 0xAF, 0xBA, 0x6A, 0xBA, 0x6B, /* 0xB8-0xBB */ + 0xC6, 0xB0, 0xBA, 0x6C, 0xBA, 0x6D, 0xC6, 0xB1, /* 0xBC-0xBF */ + 0xC6, 0xB2, 0xBA, 0x6E, 0xC6, 0xB3, 0xBA, 0x6F, /* 0xC0-0xC3 */ + 0xBA, 0x70, 0xBA, 0x71, 0xBA, 0x72, 0xBA, 0x73, /* 0xC4-0xC7 */ + 0xC6, 0xB4, 0xC6, 0xB5, 0xBA, 0x74, 0xC6, 0xB6, /* 0xC8-0xCB */ + 0xBA, 0x75, 0xBA, 0x76, 0xBA, 0x77, 0xBA, 0x78, /* 0xCC-0xCF */ + 0xBA, 0x79, 0xBA, 0x7A, 0xBA, 0x81, 0xBA, 0x82, /* 0xD0-0xD3 */ + 0xC6, 0xB7, 0xBA, 0x83, 0xBA, 0x84, 0xBA, 0x85, /* 0xD4-0xD7 */ + 0xC6, 0xB8, 0xBA, 0x86, 0xBA, 0x87, 0xBA, 0x88, /* 0xD8-0xDB */ + 0xC6, 0xB9, 0xBA, 0x89, 0xBA, 0x8A, 0xBA, 0x8B, /* 0xDC-0xDF */ + 0xBA, 0x8C, 0xBA, 0x8D, 0xBA, 0x8E, 0xBA, 0x8F, /* 0xE0-0xE3 */ + 0xC6, 0xBA, 0xC6, 0xBB, 0xBA, 0x90, 0xBA, 0x91, /* 0xE4-0xE7 */ + 0xBA, 0x92, 0xBA, 0x93, 0xBA, 0x94, 0xBA, 0x95, /* 0xE8-0xEB */ + 0xBA, 0x96, 0xBA, 0x97, 0xBA, 0x98, 0xBA, 0x99, /* 0xEC-0xEF */ + 0xC6, 0xBC, 0xC6, 0xBD, 0xBA, 0x9A, 0xBA, 0x9B, /* 0xF0-0xF3 */ + 0xC6, 0xBE, 0xBA, 0x9C, 0xBA, 0x9D, 0xBA, 0x9E, /* 0xF4-0xF7 */ + 0xC6, 0xBF, 0xBA, 0x9F, 0xBA, 0xA0, 0xBB, 0x41, /* 0xF8-0xFB */ + 0xBB, 0x42, 0xBB, 0x43, 0xBB, 0x44, 0xBB, 0x45, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_D3[512] = { + 0xC6, 0xC0, 0xC6, 0xC1, 0xBB, 0x46, 0xC6, 0xC2, /* 0x00-0x03 */ + 0xBB, 0x47, 0xC6, 0xC3, 0xBB, 0x48, 0xBB, 0x49, /* 0x04-0x07 */ + 0xBB, 0x4A, 0xBB, 0x4B, 0xBB, 0x4C, 0xBB, 0x4D, /* 0x08-0x0B */ + 0xC6, 0xC4, 0xC6, 0xC5, 0xC6, 0xC6, 0xBB, 0x4E, /* 0x0C-0x0F */ + 0xC6, 0xC7, 0xBB, 0x4F, 0xBB, 0x50, 0xBB, 0x51, /* 0x10-0x13 */ + 0xC6, 0xC8, 0xBB, 0x52, 0xC6, 0xC9, 0xBB, 0x53, /* 0x14-0x17 */ + 0xBB, 0x54, 0xBB, 0x55, 0xBB, 0x56, 0xBB, 0x57, /* 0x18-0x1B */ + 0xC6, 0xCA, 0xC6, 0xCB, 0xBB, 0x58, 0xC6, 0xCC, /* 0x1C-0x1F */ + 0xC6, 0xCD, 0xC6, 0xCE, 0xBB, 0x59, 0xBB, 0x5A, /* 0x20-0x23 */ + 0xBB, 0x61, 0xC6, 0xCF, 0xBB, 0x62, 0xBB, 0x63, /* 0x24-0x27 */ + 0xC6, 0xD0, 0xC6, 0xD1, 0xBB, 0x64, 0xBB, 0x65, /* 0x28-0x2B */ + 0xC6, 0xD2, 0xBB, 0x66, 0xBB, 0x67, 0xBB, 0x68, /* 0x2C-0x2F */ + 0xC6, 0xD3, 0xBB, 0x69, 0xBB, 0x6A, 0xBB, 0x6B, /* 0x30-0x33 */ + 0xBB, 0x6C, 0xBB, 0x6D, 0xBB, 0x6E, 0xBB, 0x6F, /* 0x34-0x37 */ + 0xC6, 0xD4, 0xC6, 0xD5, 0xBB, 0x70, 0xC6, 0xD6, /* 0x38-0x3B */ + 0xC6, 0xD7, 0xC6, 0xD8, 0xBB, 0x71, 0xBB, 0x72, /* 0x3C-0x3F */ + 0xBB, 0x73, 0xBB, 0x74, 0xBB, 0x75, 0xBB, 0x76, /* 0x40-0x43 */ + 0xC6, 0xD9, 0xC6, 0xDA, 0xBB, 0x77, 0xBB, 0x78, /* 0x44-0x47 */ + 0xBB, 0x79, 0xBB, 0x7A, 0xBB, 0x81, 0xBB, 0x82, /* 0x48-0x4B */ + 0xBB, 0x83, 0xBB, 0x84, 0xBB, 0x85, 0xBB, 0x86, /* 0x4C-0x4F */ + 0xBB, 0x87, 0xBB, 0x88, 0xBB, 0x89, 0xBB, 0x8A, /* 0x50-0x53 */ + 0xBB, 0x8B, 0xBB, 0x8C, 0xBB, 0x8D, 0xBB, 0x8E, /* 0x54-0x57 */ + 0xBB, 0x8F, 0xBB, 0x90, 0xBB, 0x91, 0xBB, 0x92, /* 0x58-0x5B */ + 0xBB, 0x93, 0xBB, 0x94, 0xBB, 0x95, 0xBB, 0x96, /* 0x5C-0x5F */ + 0xBB, 0x97, 0xBB, 0x98, 0xBB, 0x99, 0xBB, 0x9A, /* 0x60-0x63 */ + 0xBB, 0x9B, 0xBB, 0x9C, 0xBB, 0x9D, 0xBB, 0x9E, /* 0x64-0x67 */ + 0xBB, 0x9F, 0xBB, 0xA0, 0xBC, 0x41, 0xBC, 0x42, /* 0x68-0x6B */ + 0xBC, 0x43, 0xBC, 0x44, 0xBC, 0x45, 0xBC, 0x46, /* 0x6C-0x6F */ + 0xBC, 0x47, 0xBC, 0x48, 0xBC, 0x49, 0xBC, 0x4A, /* 0x70-0x73 */ + 0xBC, 0x4B, 0xBC, 0x4C, 0xBC, 0x4D, 0xBC, 0x4E, /* 0x74-0x77 */ + 0xBC, 0x4F, 0xBC, 0x50, 0xBC, 0x51, 0xBC, 0x52, /* 0x78-0x7B */ + 0xC6, 0xDB, 0xC6, 0xDC, 0xBC, 0x53, 0xBC, 0x54, /* 0x7C-0x7F */ + + 0xC6, 0xDD, 0xBC, 0x55, 0xBC, 0x56, 0xBC, 0x57, /* 0x80-0x83 */ + 0xC6, 0xDE, 0xBC, 0x58, 0xBC, 0x59, 0xBC, 0x5A, /* 0x84-0x87 */ + 0xBC, 0x61, 0xBC, 0x62, 0xBC, 0x63, 0xBC, 0x64, /* 0x88-0x8B */ + 0xC6, 0xDF, 0xC6, 0xE0, 0xBC, 0x65, 0xC6, 0xE1, /* 0x8C-0x8F */ + 0xC6, 0xE2, 0xC6, 0xE3, 0xBC, 0x66, 0xBC, 0x67, /* 0x90-0x93 */ + 0xBC, 0x68, 0xBC, 0x69, 0xBC, 0x6A, 0xBC, 0x6B, /* 0x94-0x97 */ + 0xC6, 0xE4, 0xC6, 0xE5, 0xBC, 0x6C, 0xBC, 0x6D, /* 0x98-0x9B */ + 0xC6, 0xE6, 0xBC, 0x6E, 0xBC, 0x6F, 0xBC, 0x70, /* 0x9C-0x9F */ + 0xC6, 0xE7, 0xBC, 0x71, 0xBC, 0x72, 0xBC, 0x73, /* 0xA0-0xA3 */ + 0xBC, 0x74, 0xBC, 0x75, 0xBC, 0x76, 0xBC, 0x77, /* 0xA4-0xA7 */ + 0xC6, 0xE8, 0xC6, 0xE9, 0xBC, 0x78, 0xC6, 0xEA, /* 0xA8-0xAB */ + 0xBC, 0x79, 0xC6, 0xEB, 0xBC, 0x7A, 0xBC, 0x81, /* 0xAC-0xAF */ + 0xBC, 0x82, 0xBC, 0x83, 0xBC, 0x84, 0xBC, 0x85, /* 0xB0-0xB3 */ + 0xC6, 0xEC, 0xBC, 0x86, 0xBC, 0x87, 0xBC, 0x88, /* 0xB4-0xB7 */ + 0xC6, 0xED, 0xBC, 0x89, 0xBC, 0x8A, 0xBC, 0x8B, /* 0xB8-0xBB */ + 0xC6, 0xEE, 0xBC, 0x8C, 0xBC, 0x8D, 0xBC, 0x8E, /* 0xBC-0xBF */ + 0xBC, 0x8F, 0xBC, 0x90, 0xBC, 0x91, 0xBC, 0x92, /* 0xC0-0xC3 */ + 0xC6, 0xEF, 0xC6, 0xF0, 0xBC, 0x93, 0xBC, 0x94, /* 0xC4-0xC7 */ + 0xC6, 0xF1, 0xC6, 0xF2, 0xBC, 0x95, 0xBC, 0x96, /* 0xC8-0xCB */ + 0xBC, 0x97, 0xBC, 0x98, 0xBC, 0x99, 0xBC, 0x9A, /* 0xCC-0xCF */ + 0xC6, 0xF3, 0xBC, 0x9B, 0xBC, 0x9C, 0xBC, 0x9D, /* 0xD0-0xD3 */ + 0xBC, 0x9E, 0xBC, 0x9F, 0xBC, 0xA0, 0xBD, 0x41, /* 0xD4-0xD7 */ + 0xC6, 0xF4, 0xBD, 0x42, 0xBD, 0x43, 0xBD, 0x44, /* 0xD8-0xDB */ + 0xBD, 0x45, 0xBD, 0x46, 0xBD, 0x47, 0xBD, 0x48, /* 0xDC-0xDF */ + 0xBD, 0x49, 0xC6, 0xF5, 0xBD, 0x4A, 0xC6, 0xF6, /* 0xE0-0xE3 */ + 0xBD, 0x4B, 0xBD, 0x4C, 0xBD, 0x4D, 0xBD, 0x4E, /* 0xE4-0xE7 */ + 0xBD, 0x4F, 0xBD, 0x50, 0xBD, 0x51, 0xBD, 0x52, /* 0xE8-0xEB */ + 0xC6, 0xF7, 0xC6, 0xF8, 0xBD, 0x53, 0xBD, 0x54, /* 0xEC-0xEF */ + 0xC6, 0xF9, 0xBD, 0x55, 0xBD, 0x56, 0xBD, 0x57, /* 0xF0-0xF3 */ + 0xC6, 0xFA, 0xBD, 0x58, 0xBD, 0x59, 0xBD, 0x5A, /* 0xF4-0xF7 */ + 0xBD, 0x61, 0xBD, 0x62, 0xBD, 0x63, 0xBD, 0x64, /* 0xF8-0xFB */ + 0xC6, 0xFB, 0xC6, 0xFC, 0xBD, 0x65, 0xC6, 0xFD, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_D4[512] = { + 0xBD, 0x66, 0xC6, 0xFE, 0xBD, 0x67, 0xBD, 0x68, /* 0x00-0x03 */ + 0xBD, 0x69, 0xBD, 0x6A, 0xBD, 0x6B, 0xBD, 0x6C, /* 0x04-0x07 */ + 0xC7, 0xA1, 0xBD, 0x6D, 0xBD, 0x6E, 0xBD, 0x6F, /* 0x08-0x0B */ + 0xBD, 0x70, 0xBD, 0x71, 0xBD, 0x72, 0xBD, 0x73, /* 0x0C-0x0F */ + 0xBD, 0x74, 0xBD, 0x75, 0xBD, 0x76, 0xBD, 0x77, /* 0x10-0x13 */ + 0xBD, 0x78, 0xBD, 0x79, 0xBD, 0x7A, 0xBD, 0x81, /* 0x14-0x17 */ + 0xBD, 0x82, 0xBD, 0x83, 0xBD, 0x84, 0xBD, 0x85, /* 0x18-0x1B */ + 0xBD, 0x86, 0xC7, 0xA2, 0xBD, 0x87, 0xBD, 0x88, /* 0x1C-0x1F */ + 0xBD, 0x89, 0xBD, 0x8A, 0xBD, 0x8B, 0xBD, 0x8C, /* 0x20-0x23 */ + 0xBD, 0x8D, 0xBD, 0x8E, 0xBD, 0x8F, 0xBD, 0x90, /* 0x24-0x27 */ + 0xBD, 0x91, 0xBD, 0x92, 0xBD, 0x93, 0xBD, 0x94, /* 0x28-0x2B */ + 0xBD, 0x95, 0xBD, 0x96, 0xBD, 0x97, 0xBD, 0x98, /* 0x2C-0x2F */ + 0xBD, 0x99, 0xBD, 0x9A, 0xBD, 0x9B, 0xBD, 0x9C, /* 0x30-0x33 */ + 0xBD, 0x9D, 0xBD, 0x9E, 0xBD, 0x9F, 0xBD, 0xA0, /* 0x34-0x37 */ + 0xBE, 0x41, 0xBE, 0x42, 0xBE, 0x43, 0xBE, 0x44, /* 0x38-0x3B */ + 0xBE, 0x45, 0xBE, 0x46, 0xBE, 0x47, 0xBE, 0x48, /* 0x3C-0x3F */ + 0xC7, 0xA3, 0xBE, 0x49, 0xBE, 0x4A, 0xBE, 0x4B, /* 0x40-0x43 */ + 0xC7, 0xA4, 0xBE, 0x4C, 0xBE, 0x4D, 0xBE, 0x4E, /* 0x44-0x47 */ + 0xBE, 0x4F, 0xBE, 0x50, 0xBE, 0x51, 0xBE, 0x52, /* 0x48-0x4B */ + 0xBE, 0x53, 0xBE, 0x54, 0xBE, 0x55, 0xBE, 0x56, /* 0x4C-0x4F */ + 0xBE, 0x57, 0xBE, 0x58, 0xBE, 0x59, 0xBE, 0x5A, /* 0x50-0x53 */ + 0xBE, 0x61, 0xBE, 0x62, 0xBE, 0x63, 0xBE, 0x64, /* 0x54-0x57 */ + 0xBE, 0x65, 0xBE, 0x66, 0xBE, 0x67, 0xBE, 0x68, /* 0x58-0x5B */ + 0xC7, 0xA5, 0xBE, 0x69, 0xBE, 0x6A, 0xBE, 0x6B, /* 0x5C-0x5F */ + 0xC7, 0xA6, 0xBE, 0x6C, 0xBE, 0x6D, 0xBE, 0x6E, /* 0x60-0x63 */ + 0xC7, 0xA7, 0xBE, 0x6F, 0xBE, 0x70, 0xBE, 0x71, /* 0x64-0x67 */ + 0xBE, 0x72, 0xBE, 0x73, 0xBE, 0x74, 0xBE, 0x75, /* 0x68-0x6B */ + 0xBE, 0x76, 0xC7, 0xA8, 0xBE, 0x77, 0xC7, 0xA9, /* 0x6C-0x6F */ + 0xBE, 0x78, 0xBE, 0x79, 0xBE, 0x7A, 0xBE, 0x81, /* 0x70-0x73 */ + 0xBE, 0x82, 0xBE, 0x83, 0xBE, 0x84, 0xBE, 0x85, /* 0x74-0x77 */ + 0xC7, 0xAA, 0xC7, 0xAB, 0xBE, 0x86, 0xBE, 0x87, /* 0x78-0x7B */ + 0xC7, 0xAC, 0xBE, 0x88, 0xBE, 0x89, 0xC7, 0xAD, /* 0x7C-0x7F */ + + 0xC7, 0xAE, 0xBE, 0x8A, 0xC7, 0xAF, 0xBE, 0x8B, /* 0x80-0x83 */ + 0xBE, 0x8C, 0xBE, 0x8D, 0xBE, 0x8E, 0xBE, 0x8F, /* 0x84-0x87 */ + 0xC7, 0xB0, 0xC7, 0xB1, 0xBE, 0x90, 0xC7, 0xB2, /* 0x88-0x8B */ + 0xBE, 0x91, 0xC7, 0xB3, 0xBE, 0x92, 0xBE, 0x93, /* 0x8C-0x8F */ + 0xBE, 0x94, 0xBE, 0x95, 0xBE, 0x96, 0xBE, 0x97, /* 0x90-0x93 */ + 0xC7, 0xB4, 0xBE, 0x98, 0xBE, 0x99, 0xBE, 0x9A, /* 0x94-0x97 */ + 0xBE, 0x9B, 0xBE, 0x9C, 0xBE, 0x9D, 0xBE, 0x9E, /* 0x98-0x9B */ + 0xBE, 0x9F, 0xBE, 0xA0, 0xBF, 0x41, 0xBF, 0x42, /* 0x9C-0x9F */ + 0xBF, 0x43, 0xBF, 0x44, 0xBF, 0x45, 0xBF, 0x46, /* 0xA0-0xA3 */ + 0xBF, 0x47, 0xBF, 0x48, 0xBF, 0x49, 0xBF, 0x4A, /* 0xA4-0xA7 */ + 0xBF, 0x4B, 0xC7, 0xB5, 0xBF, 0x4C, 0xBF, 0x4D, /* 0xA8-0xAB */ + 0xBF, 0x4E, 0xBF, 0x4F, 0xBF, 0x50, 0xBF, 0x51, /* 0xAC-0xAF */ + 0xBF, 0x52, 0xBF, 0x53, 0xBF, 0x54, 0xBF, 0x55, /* 0xB0-0xB3 */ + 0xBF, 0x56, 0xBF, 0x57, 0xBF, 0x58, 0xBF, 0x59, /* 0xB4-0xB7 */ + 0xBF, 0x5A, 0xBF, 0x61, 0xBF, 0x62, 0xBF, 0x63, /* 0xB8-0xBB */ + 0xBF, 0x64, 0xBF, 0x65, 0xBF, 0x66, 0xBF, 0x67, /* 0xBC-0xBF */ + 0xBF, 0x68, 0xBF, 0x69, 0xBF, 0x6A, 0xBF, 0x6B, /* 0xC0-0xC3 */ + 0xBF, 0x6C, 0xBF, 0x6D, 0xBF, 0x6E, 0xBF, 0x6F, /* 0xC4-0xC7 */ + 0xBF, 0x70, 0xBF, 0x71, 0xBF, 0x72, 0xBF, 0x73, /* 0xC8-0xCB */ + 0xC7, 0xB6, 0xBF, 0x74, 0xBF, 0x75, 0xBF, 0x76, /* 0xCC-0xCF */ + 0xC7, 0xB7, 0xBF, 0x77, 0xBF, 0x78, 0xBF, 0x79, /* 0xD0-0xD3 */ + 0xC7, 0xB8, 0xBF, 0x7A, 0xBF, 0x81, 0xBF, 0x82, /* 0xD4-0xD7 */ + 0xBF, 0x83, 0xBF, 0x84, 0xBF, 0x85, 0xBF, 0x86, /* 0xD8-0xDB */ + 0xC7, 0xB9, 0xBF, 0x87, 0xBF, 0x88, 0xC7, 0xBA, /* 0xDC-0xDF */ + 0xBF, 0x89, 0xBF, 0x8A, 0xBF, 0x8B, 0xBF, 0x8C, /* 0xE0-0xE3 */ + 0xBF, 0x8D, 0xBF, 0x8E, 0xBF, 0x8F, 0xBF, 0x90, /* 0xE4-0xE7 */ + 0xC7, 0xBB, 0xBF, 0x91, 0xBF, 0x92, 0xBF, 0x93, /* 0xE8-0xEB */ + 0xC7, 0xBC, 0xBF, 0x94, 0xBF, 0x95, 0xBF, 0x96, /* 0xEC-0xEF */ + 0xC7, 0xBD, 0xBF, 0x97, 0xBF, 0x98, 0xBF, 0x99, /* 0xF0-0xF3 */ + 0xBF, 0x9A, 0xBF, 0x9B, 0xBF, 0x9C, 0xBF, 0x9D, /* 0xF4-0xF7 */ + 0xC7, 0xBE, 0xBF, 0x9E, 0xBF, 0x9F, 0xC7, 0xBF, /* 0xF8-0xFB */ + 0xBF, 0xA0, 0xC7, 0xC0, 0xC0, 0x41, 0xC0, 0x42, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_D5[512] = { + 0xC0, 0x43, 0xC0, 0x44, 0xC0, 0x45, 0xC0, 0x46, /* 0x00-0x03 */ + 0xC7, 0xC1, 0xC0, 0x47, 0xC0, 0x48, 0xC0, 0x49, /* 0x04-0x07 */ + 0xC7, 0xC2, 0xC0, 0x4A, 0xC0, 0x4B, 0xC0, 0x4C, /* 0x08-0x0B */ + 0xC7, 0xC3, 0xC0, 0x4D, 0xC0, 0x4E, 0xC0, 0x4F, /* 0x0C-0x0F */ + 0xC0, 0x50, 0xC0, 0x51, 0xC0, 0x52, 0xC0, 0x53, /* 0x10-0x13 */ + 0xC7, 0xC4, 0xC7, 0xC5, 0xC0, 0x54, 0xC7, 0xC6, /* 0x14-0x17 */ + 0xC0, 0x55, 0xC0, 0x56, 0xC0, 0x57, 0xC0, 0x58, /* 0x18-0x1B */ + 0xC0, 0x59, 0xC0, 0x5A, 0xC0, 0x61, 0xC0, 0x62, /* 0x1C-0x1F */ + 0xC0, 0x63, 0xC0, 0x64, 0xC0, 0x65, 0xC0, 0x66, /* 0x20-0x23 */ + 0xC0, 0x67, 0xC0, 0x68, 0xC0, 0x69, 0xC0, 0x6A, /* 0x24-0x27 */ + 0xC0, 0x6B, 0xC0, 0x6C, 0xC0, 0x6D, 0xC0, 0x6E, /* 0x28-0x2B */ + 0xC0, 0x6F, 0xC0, 0x70, 0xC0, 0x71, 0xC0, 0x72, /* 0x2C-0x2F */ + 0xC0, 0x73, 0xC0, 0x74, 0xC0, 0x75, 0xC0, 0x76, /* 0x30-0x33 */ + 0xC0, 0x77, 0xC0, 0x78, 0xC0, 0x79, 0xC0, 0x7A, /* 0x34-0x37 */ + 0xC0, 0x81, 0xC0, 0x82, 0xC0, 0x83, 0xC0, 0x84, /* 0x38-0x3B */ + 0xC7, 0xC7, 0xC7, 0xC8, 0xC0, 0x85, 0xC0, 0x86, /* 0x3C-0x3F */ + 0xC7, 0xC9, 0xC0, 0x87, 0xC0, 0x88, 0xC0, 0x89, /* 0x40-0x43 */ + 0xC7, 0xCA, 0xC0, 0x8A, 0xC0, 0x8B, 0xC0, 0x8C, /* 0x44-0x47 */ + 0xC0, 0x8D, 0xC0, 0x8E, 0xC0, 0x8F, 0xC0, 0x90, /* 0x48-0x4B */ + 0xC7, 0xCB, 0xC7, 0xCC, 0xC0, 0x91, 0xC7, 0xCD, /* 0x4C-0x4F */ + 0xC0, 0x92, 0xC7, 0xCE, 0xC0, 0x93, 0xC0, 0x94, /* 0x50-0x53 */ + 0xC0, 0x95, 0xC0, 0x96, 0xC0, 0x97, 0xC0, 0x98, /* 0x54-0x57 */ + 0xC7, 0xCF, 0xC7, 0xD0, 0xC0, 0x99, 0xC0, 0x9A, /* 0x58-0x5B */ + 0xC7, 0xD1, 0xC0, 0x9B, 0xC0, 0x9C, 0xC0, 0x9D, /* 0x5C-0x5F */ + 0xC7, 0xD2, 0xC0, 0x9E, 0xC0, 0x9F, 0xC0, 0xA0, /* 0x60-0x63 */ + 0xC1, 0x41, 0xC7, 0xD3, 0xC1, 0x42, 0xC1, 0x43, /* 0x64-0x67 */ + 0xC7, 0xD4, 0xC7, 0xD5, 0xC1, 0x44, 0xC7, 0xD6, /* 0x68-0x6B */ + 0xC1, 0x45, 0xC7, 0xD7, 0xC1, 0x46, 0xC1, 0x47, /* 0x6C-0x6F */ + 0xC1, 0x48, 0xC1, 0x49, 0xC1, 0x4A, 0xC1, 0x4B, /* 0x70-0x73 */ + 0xC7, 0xD8, 0xC7, 0xD9, 0xC1, 0x4C, 0xC1, 0x4D, /* 0x74-0x77 */ + 0xC7, 0xDA, 0xC1, 0x4E, 0xC1, 0x4F, 0xC1, 0x50, /* 0x78-0x7B */ + 0xC7, 0xDB, 0xC1, 0x51, 0xC1, 0x52, 0xC1, 0x53, /* 0x7C-0x7F */ + + 0xC1, 0x54, 0xC1, 0x55, 0xC1, 0x56, 0xC1, 0x57, /* 0x80-0x83 */ + 0xC7, 0xDC, 0xC7, 0xDD, 0xC1, 0x58, 0xC7, 0xDE, /* 0x84-0x87 */ + 0xC7, 0xDF, 0xC7, 0xE0, 0xC1, 0x59, 0xC1, 0x5A, /* 0x88-0x8B */ + 0xC1, 0x61, 0xC1, 0x62, 0xC1, 0x63, 0xC1, 0x64, /* 0x8C-0x8F */ + 0xC7, 0xE1, 0xC1, 0x65, 0xC1, 0x66, 0xC1, 0x67, /* 0x90-0x93 */ + 0xC1, 0x68, 0xC1, 0x69, 0xC1, 0x6A, 0xC1, 0x6B, /* 0x94-0x97 */ + 0xC1, 0x6C, 0xC1, 0x6D, 0xC1, 0x6E, 0xC1, 0x6F, /* 0x98-0x9B */ + 0xC1, 0x70, 0xC1, 0x71, 0xC1, 0x72, 0xC1, 0x73, /* 0x9C-0x9F */ + 0xC1, 0x74, 0xC1, 0x75, 0xC1, 0x76, 0xC1, 0x77, /* 0xA0-0xA3 */ + 0xC1, 0x78, 0xC7, 0xE2, 0xC1, 0x79, 0xC1, 0x7A, /* 0xA4-0xA7 */ + 0xC1, 0x81, 0xC1, 0x82, 0xC1, 0x83, 0xC1, 0x84, /* 0xA8-0xAB */ + 0xC1, 0x85, 0xC1, 0x86, 0xC1, 0x87, 0xC1, 0x88, /* 0xAC-0xAF */ + 0xC1, 0x89, 0xC1, 0x8A, 0xC1, 0x8B, 0xC1, 0x8C, /* 0xB0-0xB3 */ + 0xC1, 0x8D, 0xC1, 0x8E, 0xC1, 0x8F, 0xC1, 0x90, /* 0xB4-0xB7 */ + 0xC1, 0x91, 0xC1, 0x92, 0xC1, 0x93, 0xC1, 0x94, /* 0xB8-0xBB */ + 0xC1, 0x95, 0xC1, 0x96, 0xC1, 0x97, 0xC1, 0x98, /* 0xBC-0xBF */ + 0xC1, 0x99, 0xC1, 0x9A, 0xC1, 0x9B, 0xC1, 0x9C, /* 0xC0-0xC3 */ + 0xC1, 0x9D, 0xC1, 0x9E, 0xC1, 0x9F, 0xC1, 0xA0, /* 0xC4-0xC7 */ + 0xC7, 0xE3, 0xC7, 0xE4, 0xC2, 0x41, 0xC2, 0x42, /* 0xC8-0xCB */ + 0xC7, 0xE5, 0xC2, 0x43, 0xC2, 0x44, 0xC2, 0x45, /* 0xCC-0xCF */ + 0xC7, 0xE6, 0xC2, 0x46, 0xC7, 0xE7, 0xC2, 0x47, /* 0xD0-0xD3 */ + 0xC2, 0x48, 0xC2, 0x49, 0xC2, 0x4A, 0xC2, 0x4B, /* 0xD4-0xD7 */ + 0xC7, 0xE8, 0xC7, 0xE9, 0xC2, 0x4C, 0xC7, 0xEA, /* 0xD8-0xDB */ + 0xC2, 0x4D, 0xC7, 0xEB, 0xC2, 0x4E, 0xC2, 0x4F, /* 0xDC-0xDF */ + 0xC2, 0x50, 0xC2, 0x51, 0xC2, 0x52, 0xC2, 0x53, /* 0xE0-0xE3 */ + 0xC7, 0xEC, 0xC7, 0xED, 0xC2, 0x54, 0xC2, 0x55, /* 0xE4-0xE7 */ + 0xC7, 0xEE, 0xC2, 0x56, 0xC2, 0x57, 0xC2, 0x58, /* 0xE8-0xEB */ + 0xC7, 0xEF, 0xC2, 0x59, 0xC2, 0x5A, 0xC2, 0x61, /* 0xEC-0xEF */ + 0xC2, 0x62, 0xC2, 0x63, 0xC2, 0x64, 0xC2, 0x65, /* 0xF0-0xF3 */ + 0xC7, 0xF0, 0xC7, 0xF1, 0xC2, 0x66, 0xC7, 0xF2, /* 0xF4-0xF7 */ + 0xC2, 0x67, 0xC7, 0xF3, 0xC2, 0x68, 0xC2, 0x69, /* 0xF8-0xFB */ + 0xC2, 0x6A, 0xC2, 0x6B, 0xC2, 0x6C, 0xC2, 0x6D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_D6[512] = { + 0xC7, 0xF4, 0xC7, 0xF5, 0xC2, 0x6E, 0xC2, 0x6F, /* 0x00-0x03 */ + 0xC7, 0xF6, 0xC2, 0x70, 0xC2, 0x71, 0xC2, 0x72, /* 0x04-0x07 */ + 0xC7, 0xF7, 0xC2, 0x73, 0xC2, 0x74, 0xC2, 0x75, /* 0x08-0x0B */ + 0xC2, 0x76, 0xC2, 0x77, 0xC2, 0x78, 0xC2, 0x79, /* 0x0C-0x0F */ + 0xC7, 0xF8, 0xC7, 0xF9, 0xC2, 0x7A, 0xC7, 0xFA, /* 0x10-0x13 */ + 0xC7, 0xFB, 0xC7, 0xFC, 0xC2, 0x81, 0xC2, 0x82, /* 0x14-0x17 */ + 0xC2, 0x83, 0xC2, 0x84, 0xC2, 0x85, 0xC2, 0x86, /* 0x18-0x1B */ + 0xC7, 0xFD, 0xC2, 0x87, 0xC2, 0x88, 0xC2, 0x89, /* 0x1C-0x1F */ + 0xC7, 0xFE, 0xC2, 0x8A, 0xC2, 0x8B, 0xC2, 0x8C, /* 0x20-0x23 */ + 0xC8, 0xA1, 0xC2, 0x8D, 0xC2, 0x8E, 0xC2, 0x8F, /* 0x24-0x27 */ + 0xC2, 0x90, 0xC2, 0x91, 0xC2, 0x92, 0xC2, 0x93, /* 0x28-0x2B */ + 0xC2, 0x94, 0xC8, 0xA2, 0xC2, 0x95, 0xC2, 0x96, /* 0x2C-0x2F */ + 0xC2, 0x97, 0xC2, 0x98, 0xC2, 0x99, 0xC2, 0x9A, /* 0x30-0x33 */ + 0xC2, 0x9B, 0xC2, 0x9C, 0xC2, 0x9D, 0xC2, 0x9E, /* 0x34-0x37 */ + 0xC8, 0xA3, 0xC8, 0xA4, 0xC2, 0x9F, 0xC2, 0xA0, /* 0x38-0x3B */ + 0xC8, 0xA5, 0xC3, 0x41, 0xC3, 0x42, 0xC3, 0x43, /* 0x3C-0x3F */ + 0xC8, 0xA6, 0xC3, 0x44, 0xC3, 0x45, 0xC3, 0x46, /* 0x40-0x43 */ + 0xC3, 0x47, 0xC8, 0xA7, 0xC3, 0x48, 0xC3, 0x49, /* 0x44-0x47 */ + 0xC8, 0xA8, 0xC8, 0xA9, 0xC3, 0x4A, 0xC8, 0xAA, /* 0x48-0x4B */ + 0xC3, 0x4B, 0xC8, 0xAB, 0xC3, 0x4C, 0xC3, 0x4D, /* 0x4C-0x4F */ + 0xC3, 0x4E, 0xC8, 0xAC, 0xC3, 0x4F, 0xC3, 0x50, /* 0x50-0x53 */ + 0xC8, 0xAD, 0xC8, 0xAE, 0xC3, 0x51, 0xC3, 0x52, /* 0x54-0x57 */ + 0xC8, 0xAF, 0xC3, 0x53, 0xC3, 0x54, 0xC3, 0x55, /* 0x58-0x5B */ + 0xC8, 0xB0, 0xC3, 0x56, 0xC3, 0x57, 0xC3, 0x58, /* 0x5C-0x5F */ + 0xC3, 0x59, 0xC3, 0x5A, 0xC3, 0x61, 0xC3, 0x62, /* 0x60-0x63 */ + 0xC3, 0x63, 0xC3, 0x64, 0xC3, 0x65, 0xC8, 0xB1, /* 0x64-0x67 */ + 0xC3, 0x66, 0xC8, 0xB2, 0xC3, 0x67, 0xC3, 0x68, /* 0x68-0x6B */ + 0xC3, 0x69, 0xC3, 0x6A, 0xC3, 0x6B, 0xC3, 0x6C, /* 0x6C-0x6F */ + 0xC8, 0xB3, 0xC8, 0xB4, 0xC3, 0x6D, 0xC3, 0x6E, /* 0x70-0x73 */ + 0xC8, 0xB5, 0xC3, 0x6F, 0xC3, 0x70, 0xC3, 0x71, /* 0x74-0x77 */ + 0xC3, 0x72, 0xC3, 0x73, 0xC3, 0x74, 0xC3, 0x75, /* 0x78-0x7B */ + 0xC3, 0x76, 0xC3, 0x77, 0xC3, 0x78, 0xC3, 0x79, /* 0x7C-0x7F */ + + 0xC3, 0x7A, 0xC3, 0x81, 0xC3, 0x82, 0xC8, 0xB6, /* 0x80-0x83 */ + 0xC3, 0x83, 0xC8, 0xB7, 0xC3, 0x84, 0xC3, 0x85, /* 0x84-0x87 */ + 0xC3, 0x86, 0xC3, 0x87, 0xC3, 0x88, 0xC3, 0x89, /* 0x88-0x8B */ + 0xC8, 0xB8, 0xC8, 0xB9, 0xC3, 0x8A, 0xC3, 0x8B, /* 0x8C-0x8F */ + 0xC8, 0xBA, 0xC3, 0x8C, 0xC3, 0x8D, 0xC3, 0x8E, /* 0x90-0x93 */ + 0xC8, 0xBB, 0xC3, 0x8F, 0xC3, 0x90, 0xC3, 0x91, /* 0x94-0x97 */ + 0xC3, 0x92, 0xC3, 0x93, 0xC3, 0x94, 0xC3, 0x95, /* 0x98-0x9B */ + 0xC3, 0x96, 0xC8, 0xBC, 0xC3, 0x97, 0xC8, 0xBD, /* 0x9C-0x9F */ + 0xC3, 0x98, 0xC8, 0xBE, 0xC3, 0x99, 0xC3, 0x9A, /* 0xA0-0xA3 */ + 0xC3, 0x9B, 0xC3, 0x9C, 0xC3, 0x9D, 0xC3, 0x9E, /* 0xA4-0xA7 */ + 0xC8, 0xBF, 0xC3, 0x9F, 0xC3, 0xA0, 0xC4, 0x41, /* 0xA8-0xAB */ + 0xC8, 0xC0, 0xC4, 0x42, 0xC4, 0x43, 0xC4, 0x44, /* 0xAC-0xAF */ + 0xC8, 0xC1, 0xC4, 0x45, 0xC4, 0x46, 0xC4, 0x47, /* 0xB0-0xB3 */ + 0xC4, 0x48, 0xC4, 0x49, 0xC4, 0x4A, 0xC4, 0x4B, /* 0xB4-0xB7 */ + 0xC4, 0x4C, 0xC8, 0xC2, 0xC4, 0x4D, 0xC8, 0xC3, /* 0xB8-0xBB */ + 0xC4, 0x4E, 0xC4, 0x4F, 0xC4, 0x50, 0xC4, 0x51, /* 0xBC-0xBF */ + 0xC4, 0x52, 0xC4, 0x53, 0xC4, 0x54, 0xC4, 0x55, /* 0xC0-0xC3 */ + 0xC8, 0xC4, 0xC8, 0xC5, 0xC4, 0x56, 0xC4, 0x57, /* 0xC4-0xC7 */ + 0xC8, 0xC6, 0xC4, 0x58, 0xC4, 0x59, 0xC4, 0x5A, /* 0xC8-0xCB */ + 0xC8, 0xC7, 0xC4, 0x61, 0xC4, 0x62, 0xC4, 0x63, /* 0xCC-0xCF */ + 0xC4, 0x64, 0xC8, 0xC8, 0xC4, 0x65, 0xC4, 0x66, /* 0xD0-0xD3 */ + 0xC8, 0xC9, 0xC4, 0x67, 0xC4, 0x68, 0xC8, 0xCA, /* 0xD4-0xD7 */ + 0xC4, 0x69, 0xC8, 0xCB, 0xC4, 0x6A, 0xC4, 0x6B, /* 0xD8-0xDB */ + 0xC4, 0x6C, 0xC4, 0x6D, 0xC4, 0x6E, 0xC4, 0x6F, /* 0xDC-0xDF */ + 0xC8, 0xCC, 0xC4, 0x70, 0xC4, 0x71, 0xC4, 0x72, /* 0xE0-0xE3 */ + 0xC8, 0xCD, 0xC4, 0x73, 0xC4, 0x74, 0xC4, 0x75, /* 0xE4-0xE7 */ + 0xC8, 0xCE, 0xC4, 0x76, 0xC4, 0x77, 0xC4, 0x78, /* 0xE8-0xEB */ + 0xC4, 0x79, 0xC4, 0x7A, 0xC4, 0x81, 0xC4, 0x82, /* 0xEC-0xEF */ + 0xC8, 0xCF, 0xC4, 0x83, 0xC4, 0x84, 0xC4, 0x85, /* 0xF0-0xF3 */ + 0xC4, 0x86, 0xC8, 0xD0, 0xC4, 0x87, 0xC4, 0x88, /* 0xF4-0xF7 */ + 0xC4, 0x89, 0xC4, 0x8A, 0xC4, 0x8B, 0xC4, 0x8C, /* 0xF8-0xFB */ + 0xC8, 0xD1, 0xC8, 0xD2, 0xC4, 0x8D, 0xC4, 0x8E, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_D7[512] = { + 0xC8, 0xD3, 0xC4, 0x8F, 0xC4, 0x90, 0xC4, 0x91, /* 0x00-0x03 */ + 0xC8, 0xD4, 0xC4, 0x92, 0xC4, 0x93, 0xC4, 0x94, /* 0x04-0x07 */ + 0xC4, 0x95, 0xC4, 0x96, 0xC4, 0x97, 0xC4, 0x98, /* 0x08-0x0B */ + 0xC4, 0x99, 0xC4, 0x9A, 0xC4, 0x9B, 0xC4, 0x9C, /* 0x0C-0x0F */ + 0xC4, 0x9D, 0xC8, 0xD5, 0xC4, 0x9E, 0xC4, 0x9F, /* 0x10-0x13 */ + 0xC4, 0xA0, 0xC5, 0x41, 0xC5, 0x42, 0xC5, 0x43, /* 0x14-0x17 */ + 0xC8, 0xD6, 0xC8, 0xD7, 0xC5, 0x44, 0xC5, 0x45, /* 0x18-0x1B */ + 0xC8, 0xD8, 0xC5, 0x46, 0xC5, 0x47, 0xC5, 0x48, /* 0x1C-0x1F */ + 0xC8, 0xD9, 0xC5, 0x49, 0xC5, 0x4A, 0xC5, 0x4B, /* 0x20-0x23 */ + 0xC5, 0x4C, 0xC5, 0x4D, 0xC5, 0x4E, 0xC5, 0x4F, /* 0x24-0x27 */ + 0xC8, 0xDA, 0xC8, 0xDB, 0xC5, 0x50, 0xC8, 0xDC, /* 0x28-0x2B */ + 0xC5, 0x51, 0xC8, 0xDD, 0xC5, 0x52, 0xC5, 0x53, /* 0x2C-0x2F */ + 0xC5, 0x54, 0xC5, 0x55, 0xC5, 0x56, 0xC5, 0x57, /* 0x30-0x33 */ + 0xC8, 0xDE, 0xC8, 0xDF, 0xC5, 0x58, 0xC5, 0x59, /* 0x34-0x37 */ + 0xC8, 0xE0, 0xC5, 0x5A, 0xC5, 0x61, 0xC5, 0x62, /* 0x38-0x3B */ + 0xC8, 0xE1, 0xC5, 0x63, 0xC5, 0x64, 0xC5, 0x65, /* 0x3C-0x3F */ + 0xC5, 0x66, 0xC5, 0x67, 0xC5, 0x68, 0xC5, 0x69, /* 0x40-0x43 */ + 0xC8, 0xE2, 0xC5, 0x6A, 0xC5, 0x6B, 0xC8, 0xE3, /* 0x44-0x47 */ + 0xC5, 0x6C, 0xC8, 0xE4, 0xC5, 0x6D, 0xC5, 0x6E, /* 0x48-0x4B */ + 0xC5, 0x6F, 0xC5, 0x70, 0xC5, 0x71, 0xC5, 0x72, /* 0x4C-0x4F */ + 0xC8, 0xE5, 0xC8, 0xE6, 0xC5, 0x73, 0xC5, 0x74, /* 0x50-0x53 */ + 0xC8, 0xE7, 0xC5, 0x75, 0xC8, 0xE8, 0xC8, 0xE9, /* 0x54-0x57 */ + 0xC8, 0xEA, 0xC8, 0xEB, 0xC5, 0x76, 0xC5, 0x77, /* 0x58-0x5B */ + 0xC5, 0x78, 0xC5, 0x79, 0xC5, 0x7A, 0xC5, 0x81, /* 0x5C-0x5F */ + 0xC8, 0xEC, 0xC8, 0xED, 0xC5, 0x82, 0xC8, 0xEE, /* 0x60-0x63 */ + 0xC5, 0x83, 0xC8, 0xEF, 0xC5, 0x84, 0xC5, 0x85, /* 0x64-0x67 */ + 0xC5, 0x86, 0xC8, 0xF0, 0xC5, 0x87, 0xC5, 0x88, /* 0x68-0x6B */ + 0xC8, 0xF1, 0xC5, 0x89, 0xC5, 0x8A, 0xC5, 0x8B, /* 0x6C-0x6F */ + 0xC8, 0xF2, 0xC5, 0x8C, 0xC5, 0x8D, 0xC5, 0x8E, /* 0x70-0x73 */ + 0xC8, 0xF3, 0xC5, 0x8F, 0xC5, 0x90, 0xC5, 0x91, /* 0x74-0x77 */ + 0xC5, 0x92, 0xC5, 0x93, 0xC5, 0x94, 0xC5, 0x95, /* 0x78-0x7B */ + 0xC8, 0xF4, 0xC8, 0xF5, 0xC5, 0x96, 0xC5, 0x97, /* 0x7C-0x7F */ + + 0xC5, 0x98, 0xC8, 0xF6, 0xC5, 0x99, 0xC5, 0x9A, /* 0x80-0x83 */ + 0xC5, 0x9B, 0xC5, 0x9C, 0xC5, 0x9D, 0xC5, 0x9E, /* 0x84-0x87 */ + 0xC8, 0xF7, 0xC8, 0xF8, 0xC5, 0x9F, 0xC5, 0xA0, /* 0x88-0x8B */ + 0xC8, 0xF9, 0xC6, 0x41, 0xC6, 0x42, 0xC6, 0x43, /* 0x8C-0x8F */ + 0xC8, 0xFA, 0xC6, 0x44, 0xC6, 0x45, 0xC6, 0x46, /* 0x90-0x93 */ + 0xC6, 0x47, 0xC6, 0x48, 0xC6, 0x49, 0xC6, 0x4A, /* 0x94-0x97 */ + 0xC8, 0xFB, 0xC8, 0xFC, 0xC6, 0x4B, 0xC8, 0xFD, /* 0x98-0x9B */ + 0xC6, 0x4C, 0xC8, 0xFE, 0xC6, 0x4D, 0xC6, 0x4E, /* 0x9C-0x9F */ + 0xC6, 0x4F, 0xC6, 0x50, 0xC6, 0x51, 0xC6, 0x52, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_F9[512] = { + 0xCB, 0xD0, 0xCB, 0xD6, 0xCB, 0xE7, 0xCD, 0xCF, /* 0x00-0x03 */ + 0xCD, 0xE8, 0xCE, 0xAD, 0xCF, 0xFB, 0xD0, 0xA2, /* 0x04-0x07 */ + 0xD0, 0xB8, 0xD0, 0xD0, 0xD0, 0xDD, 0xD1, 0xD4, /* 0x08-0x0B */ + 0xD1, 0xD5, 0xD1, 0xD8, 0xD1, 0xDB, 0xD1, 0xDC, /* 0x0C-0x0F */ + 0xD1, 0xDD, 0xD1, 0xDE, 0xD1, 0xDF, 0xD1, 0xE0, /* 0x10-0x13 */ + 0xD1, 0xE2, 0xD1, 0xE3, 0xD1, 0xE4, 0xD1, 0xE5, /* 0x14-0x17 */ + 0xD1, 0xE6, 0xD1, 0xE8, 0xD1, 0xE9, 0xD1, 0xEA, /* 0x18-0x1B */ + 0xD1, 0xEB, 0xD1, 0xED, 0xD1, 0xEF, 0xD1, 0xF0, /* 0x1C-0x1F */ + 0xD1, 0xF2, 0xD1, 0xF6, 0xD1, 0xFA, 0xD1, 0xFC, /* 0x20-0x23 */ + 0xD1, 0xFD, 0xD1, 0xFE, 0xD2, 0xA2, 0xD2, 0xA3, /* 0x24-0x27 */ + 0xD2, 0xA7, 0xD2, 0xA8, 0xD2, 0xA9, 0xD2, 0xAA, /* 0x28-0x2B */ + 0xD2, 0xAB, 0xD2, 0xAD, 0xD2, 0xB2, 0xD2, 0xBE, /* 0x2C-0x2F */ + 0xD2, 0xC2, 0xD2, 0xC3, 0xD2, 0xC4, 0xD2, 0xC6, /* 0x30-0x33 */ + 0xD2, 0xC7, 0xD2, 0xC8, 0xD2, 0xC9, 0xD2, 0xCA, /* 0x34-0x37 */ + 0xD2, 0xCB, 0xD2, 0xCD, 0xD2, 0xCE, 0xD2, 0xCF, /* 0x38-0x3B */ + 0xD2, 0xD0, 0xD2, 0xD1, 0xD2, 0xD2, 0xD2, 0xD3, /* 0x3C-0x3F */ + 0xD2, 0xD4, 0xD2, 0xD5, 0xD2, 0xD6, 0xD2, 0xD7, /* 0x40-0x43 */ + 0xD2, 0xD9, 0xD2, 0xDA, 0xD2, 0xDE, 0xD2, 0xDF, /* 0x44-0x47 */ + 0xD2, 0xE1, 0xD2, 0xE2, 0xD2, 0xE4, 0xD2, 0xE5, /* 0x48-0x4B */ + 0xD2, 0xE6, 0xD2, 0xE7, 0xD2, 0xE8, 0xD2, 0xE9, /* 0x4C-0x4F */ + 0xD2, 0xEA, 0xD2, 0xEB, 0xD2, 0xF0, 0xD2, 0xF1, /* 0x50-0x53 */ + 0xD2, 0xF2, 0xD2, 0xF3, 0xD2, 0xF4, 0xD2, 0xF5, /* 0x54-0x57 */ + 0xD2, 0xF7, 0xD2, 0xF8, 0xD4, 0xE6, 0xD4, 0xFC, /* 0x58-0x5B */ + 0xD5, 0xA5, 0xD5, 0xAB, 0xD5, 0xAE, 0xD6, 0xB8, /* 0x5C-0x5F */ + 0xD6, 0xCD, 0xD7, 0xCB, 0xD7, 0xE4, 0xDB, 0xC5, /* 0x60-0x63 */ + 0xDB, 0xE4, 0xDC, 0xA5, 0xDD, 0xA5, 0xDD, 0xD5, /* 0x64-0x67 */ + 0xDD, 0xF4, 0xDE, 0xFC, 0xDE, 0xFE, 0xDF, 0xB3, /* 0x68-0x6B */ + 0xDF, 0xE1, 0xDF, 0xE8, 0xE0, 0xF1, 0xE1, 0xAD, /* 0x6C-0x6F */ + 0xE1, 0xED, 0xE3, 0xF5, 0xE4, 0xA1, 0xE4, 0xA9, /* 0x70-0x73 */ + 0xE5, 0xAE, 0xE5, 0xB1, 0xE5, 0xB2, 0xE5, 0xB9, /* 0x74-0x77 */ + 0xE5, 0xBB, 0xE5, 0xBC, 0xE5, 0xC4, 0xE5, 0xCE, /* 0x78-0x7B */ + 0xE5, 0xD0, 0xE5, 0xD2, 0xE5, 0xD6, 0xE5, 0xFA, /* 0x7C-0x7F */ + + 0xE5, 0xFB, 0xE5, 0xFC, 0xE5, 0xFE, 0xE6, 0xA1, /* 0x80-0x83 */ + 0xE6, 0xA4, 0xE6, 0xA7, 0xE6, 0xAD, 0xE6, 0xAF, /* 0x84-0x87 */ + 0xE6, 0xB0, 0xE6, 0xB1, 0xE6, 0xB3, 0xE6, 0xB7, /* 0x88-0x8B */ + 0xE6, 0xB8, 0xE6, 0xBC, 0xE6, 0xC4, 0xE6, 0xC6, /* 0x8C-0x8F */ + 0xE6, 0xC7, 0xE6, 0xCA, 0xE6, 0xD2, 0xE6, 0xD6, /* 0x90-0x93 */ + 0xE6, 0xD9, 0xE6, 0xDC, 0xE6, 0xDF, 0xE6, 0xE1, /* 0x94-0x97 */ + 0xE6, 0xE4, 0xE6, 0xE5, 0xE6, 0xE6, 0xE6, 0xE8, /* 0x98-0x9B */ + 0xE6, 0xEA, 0xE6, 0xEB, 0xE6, 0xEC, 0xE6, 0xEF, /* 0x9C-0x9F */ + 0xE6, 0xF1, 0xE6, 0xF2, 0xE6, 0xF5, 0xE6, 0xF6, /* 0xA0-0xA3 */ + 0xE6, 0xF7, 0xE6, 0xF9, 0xE7, 0xA1, 0xE7, 0xA6, /* 0xA4-0xA7 */ + 0xE7, 0xA9, 0xE7, 0xAA, 0xE7, 0xAC, 0xE7, 0xAD, /* 0xA8-0xAB */ + 0xE7, 0xB0, 0xE7, 0xBF, 0xE7, 0xC1, 0xE7, 0xC6, /* 0xAC-0xAF */ + 0xE7, 0xC7, 0xE7, 0xCB, 0xE7, 0xCD, 0xE7, 0xCF, /* 0xB0-0xB3 */ + 0xE7, 0xD0, 0xE7, 0xD3, 0xE7, 0xDF, 0xE7, 0xE4, /* 0xB4-0xB7 */ + 0xE7, 0xE6, 0xE7, 0xF7, 0xE8, 0xE7, 0xE8, 0xE8, /* 0xB8-0xBB */ + 0xE8, 0xF0, 0xE8, 0xF1, 0xE8, 0xF7, 0xE8, 0xF9, /* 0xBC-0xBF */ + 0xE8, 0xFB, 0xE8, 0xFE, 0xE9, 0xA7, 0xE9, 0xAC, /* 0xC0-0xC3 */ + 0xE9, 0xCC, 0xE9, 0xF7, 0xEA, 0xC1, 0xEA, 0xE5, /* 0xC4-0xC7 */ + 0xEA, 0xF4, 0xEA, 0xF7, 0xEA, 0xFC, 0xEA, 0xFE, /* 0xC8-0xCB */ + 0xEB, 0xA4, 0xEB, 0xA7, 0xEB, 0xA9, 0xEB, 0xAA, /* 0xCC-0xCF */ + 0xEB, 0xBA, 0xEB, 0xBB, 0xEB, 0xBD, 0xEB, 0xC1, /* 0xD0-0xD3 */ + 0xEB, 0xC2, 0xEB, 0xC6, 0xEB, 0xC7, 0xEB, 0xCC, /* 0xD4-0xD7 */ + 0xEB, 0xCF, 0xEB, 0xD0, 0xEB, 0xD1, 0xEB, 0xD2, /* 0xD8-0xDB */ + 0xEB, 0xD8, 0xEC, 0xA6, 0xEC, 0xA7, 0xEC, 0xAA, /* 0xDC-0xDF */ + 0xEC, 0xAF, 0xEC, 0xB0, 0xEC, 0xB1, 0xEC, 0xB2, /* 0xE0-0xE3 */ + 0xEC, 0xB5, 0xEC, 0xB8, 0xEC, 0xBA, 0xEC, 0xC0, /* 0xE4-0xE7 */ + 0xEC, 0xC1, 0xEC, 0xC5, 0xEC, 0xC6, 0xEC, 0xC9, /* 0xE8-0xEB */ + 0xEC, 0xCA, 0xEC, 0xD5, 0xEC, 0xDD, 0xEC, 0xDE, /* 0xEC-0xEF */ + 0xEC, 0xE1, 0xEC, 0xE4, 0xEC, 0xE7, 0xEC, 0xE8, /* 0xF0-0xF3 */ + 0xEC, 0xF7, 0xEC, 0xF8, 0xEC, 0xFA, 0xED, 0xA1, /* 0xF4-0xF7 */ + 0xED, 0xA2, 0xED, 0xA3, 0xED, 0xEE, 0xEE, 0xDB, /* 0xF8-0xFB */ + 0xF2, 0xBD, 0xF2, 0xFA, 0xF3, 0xB1, 0xF4, 0xA7, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FA[512] = { + 0xF4, 0xEE, 0xF6, 0xF4, 0xF6, 0xF6, 0xF7, 0xB8, /* 0x00-0x03 */ + 0xF7, 0xC8, 0xF7, 0xD3, 0xF8, 0xDB, 0xF8, 0xF0, /* 0x04-0x07 */ + 0xFA, 0xA1, 0xFA, 0xA2, 0xFA, 0xE6, 0xFC, 0xA9, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FF[512] = { + 0x3F, 0x3F, 0xA3, 0xA1, 0xA3, 0xA2, 0xA3, 0xA3, /* 0x00-0x03 */ + 0xA3, 0xA4, 0xA3, 0xA5, 0xA3, 0xA6, 0xA3, 0xA7, /* 0x04-0x07 */ + 0xA3, 0xA8, 0xA3, 0xA9, 0xA3, 0xAA, 0xA3, 0xAB, /* 0x08-0x0B */ + 0xA3, 0xAC, 0xA3, 0xAD, 0xA3, 0xAE, 0xA3, 0xAF, /* 0x0C-0x0F */ + 0xA3, 0xB0, 0xA3, 0xB1, 0xA3, 0xB2, 0xA3, 0xB3, /* 0x10-0x13 */ + 0xA3, 0xB4, 0xA3, 0xB5, 0xA3, 0xB6, 0xA3, 0xB7, /* 0x14-0x17 */ + 0xA3, 0xB8, 0xA3, 0xB9, 0xA3, 0xBA, 0xA3, 0xBB, /* 0x18-0x1B */ + 0xA3, 0xBC, 0xA3, 0xBD, 0xA3, 0xBE, 0xA3, 0xBF, /* 0x1C-0x1F */ + 0xA3, 0xC0, 0xA3, 0xC1, 0xA3, 0xC2, 0xA3, 0xC3, /* 0x20-0x23 */ + 0xA3, 0xC4, 0xA3, 0xC5, 0xA3, 0xC6, 0xA3, 0xC7, /* 0x24-0x27 */ + 0xA3, 0xC8, 0xA3, 0xC9, 0xA3, 0xCA, 0xA3, 0xCB, /* 0x28-0x2B */ + 0xA3, 0xCC, 0xA3, 0xCD, 0xA3, 0xCE, 0xA3, 0xCF, /* 0x2C-0x2F */ + 0xA3, 0xD0, 0xA3, 0xD1, 0xA3, 0xD2, 0xA3, 0xD3, /* 0x30-0x33 */ + 0xA3, 0xD4, 0xA3, 0xD5, 0xA3, 0xD6, 0xA3, 0xD7, /* 0x34-0x37 */ + 0xA3, 0xD8, 0xA3, 0xD9, 0xA3, 0xDA, 0xA3, 0xDB, /* 0x38-0x3B */ + 0xA1, 0xAC, 0xA3, 0xDD, 0xA3, 0xDE, 0xA3, 0xDF, /* 0x3C-0x3F */ + 0xA3, 0xE0, 0xA3, 0xE1, 0xA3, 0xE2, 0xA3, 0xE3, /* 0x40-0x43 */ + 0xA3, 0xE4, 0xA3, 0xE5, 0xA3, 0xE6, 0xA3, 0xE7, /* 0x44-0x47 */ + 0xA3, 0xE8, 0xA3, 0xE9, 0xA3, 0xEA, 0xA3, 0xEB, /* 0x48-0x4B */ + 0xA3, 0xEC, 0xA3, 0xED, 0xA3, 0xEE, 0xA3, 0xEF, /* 0x4C-0x4F */ + 0xA3, 0xF0, 0xA3, 0xF1, 0xA3, 0xF2, 0xA3, 0xF3, /* 0x50-0x53 */ + 0xA3, 0xF4, 0xA3, 0xF5, 0xA3, 0xF6, 0xA3, 0xF7, /* 0x54-0x57 */ + 0xA3, 0xF8, 0xA3, 0xF9, 0xA3, 0xFA, 0xA3, 0xFB, /* 0x58-0x5B */ + 0xA3, 0xFC, 0xA3, 0xFD, 0xA2, 0xA6, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xA1, 0xCB, 0xA1, 0xCC, 0xA1, 0xFE, 0xA3, 0xFE, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xA1, 0xCD, 0xA3, 0xDC, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char *page_uni2charset[256] = { + NULL, u2c_01, u2c_02, u2c_03, u2c_04, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u2c_20, u2c_21, u2c_22, u2c_23, u2c_24, u2c_25, u2c_26, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u2c_30, u2c_31, u2c_32, u2c_33, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u2c_4E, u2c_4F, + u2c_50, u2c_51, u2c_52, u2c_53, u2c_54, u2c_55, u2c_56, u2c_57, + u2c_58, u2c_59, u2c_5A, u2c_5B, u2c_5C, u2c_5D, u2c_5E, u2c_5F, + u2c_60, u2c_61, u2c_62, u2c_63, u2c_64, u2c_65, u2c_66, u2c_67, + u2c_68, u2c_69, u2c_6A, u2c_6B, u2c_6C, u2c_6D, u2c_6E, u2c_6F, + u2c_70, u2c_71, u2c_72, u2c_73, u2c_74, u2c_75, u2c_76, u2c_77, + u2c_78, u2c_79, u2c_7A, u2c_7B, u2c_7C, u2c_7D, u2c_7E, u2c_7F, + u2c_80, u2c_81, u2c_82, u2c_83, u2c_84, u2c_85, u2c_86, u2c_87, + u2c_88, u2c_89, u2c_8A, u2c_8B, u2c_8C, u2c_8D, u2c_8E, u2c_8F, + u2c_90, u2c_91, u2c_92, u2c_93, u2c_94, u2c_95, u2c_96, u2c_97, + u2c_98, u2c_99, u2c_9A, u2c_9B, u2c_9C, u2c_9D, u2c_9E, u2c_9F, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, u2c_AC, u2c_AD, u2c_AE, u2c_AF, + u2c_B0, u2c_B1, u2c_B2, u2c_B3, u2c_B4, u2c_B5, u2c_B6, u2c_B7, + u2c_B8, u2c_B9, u2c_BA, u2c_BB, u2c_BC, u2c_BD, u2c_BE, u2c_BF, + u2c_C0, u2c_C1, u2c_C2, u2c_C3, u2c_C4, u2c_C5, u2c_C6, u2c_C7, + u2c_C8, u2c_C9, u2c_CA, u2c_CB, u2c_CC, u2c_CD, u2c_CE, u2c_CF, + u2c_D0, u2c_D1, u2c_D2, u2c_D3, u2c_D4, u2c_D5, u2c_D6, u2c_D7, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, u2c_F9, u2c_FA, NULL, NULL, NULL, NULL, u2c_FF, }; + +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + uni2charset = page_uni2charset[ch]; + *outlen = 0; + if (uni2charset){ + if (boundlen <= 1) + return; + out[0] = uni2charset[cl*2]; + out[1] = uni2charset[cl*2+1]; + *outlen = 1; + } else if (ch==0 && cl) + out[0] = cl; + else + out[0] = '?'; + (*outlen)++; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + unsigned char ch, cl; + struct nls_unicode *charset2uni; + + ch = rawstring[0]; + cl = rawstring[1]; + charset2uni = page_charset2uni[ch]; + if (charset2uni && cl){ + *uni1 = charset2uni[cl].uni2; + *uni2 = charset2uni[cl].uni1; + *offset = 2; + } else{ + *uni1 = ch; + *uni2 = 0x00; + *offset = 1; + } + return; +} + +static void inc_use_count(void) +{ + MOD_INC_USE_COUNT; +} + +static void dec_use_count(void) +{ + MOD_DEC_USE_COUNT; +} + +static struct nls_table table = { + "cp949", + uni2char, + char2uni, + inc_use_count, + dec_use_count, + NULL +}; + +int __init init_nls_cp949(void) +{ + return register_nls(&table); +} + +#ifdef MODULE +int init_module(void) +{ + return init_nls_cp949(); +} + + +void cleanup_module(void) +{ + unregister_nls(&table); + 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: 8 + * c-brace-imaginary-offset: 0 + * c-brace-offset: -8 + * c-argdecl-indent: 8 + * c-label-offset: -8 + * c-continued-statement-offset: 8 + * c-continued-brace-offset: 0 + * End: + */ diff -urN v2.2.15/linux/fs/nls/nls_cp950.c linux/fs/nls/nls_cp950.c --- v2.2.15/linux/fs/nls/nls_cp950.c Wed Dec 31 16:00:00 1969 +++ linux/fs/nls/nls_cp950.c Wed Jun 7 14:26:44 2000 @@ -0,0 +1,12623 @@ +/* + * linux/fs/nls_cp950.c + * + * Charset cp950 translation tables. + * Generated automatically from the Microsoft + */ + +#include +#include +#include +#include +#include + +static struct nls_unicode c2u_A1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x30, 0x00}, {0xFF, 0x0C}, {0x30, 0x01}, {0x30, 0x02}, /* 0x40-0x43 */ + {0xFF, 0x0E}, {0x20, 0x27}, {0xFF, 0x1B}, {0xFF, 0x1A}, /* 0x44-0x47 */ + {0xFF, 0x1F}, {0xFF, 0x01}, {0xFE, 0x30}, {0x20, 0x26}, /* 0x48-0x4B */ + {0x20, 0x25}, {0xFE, 0x50}, {0xFE, 0x51}, {0xFE, 0x52}, /* 0x4C-0x4F */ + {0x00, 0xB7}, {0xFE, 0x54}, {0xFE, 0x55}, {0xFE, 0x56}, /* 0x50-0x53 */ + {0xFE, 0x57}, {0xFF, 0x5C}, {0x20, 0x13}, {0xFE, 0x31}, /* 0x54-0x57 */ + {0x20, 0x14}, {0xFE, 0x33}, {0x25, 0x74}, {0xFE, 0x34}, /* 0x58-0x5B */ + {0xFE, 0x4F}, {0xFF, 0x08}, {0xFF, 0x09}, {0xFE, 0x35}, /* 0x5C-0x5F */ + {0xFE, 0x36}, {0xFF, 0x5B}, {0xFF, 0x5D}, {0xFE, 0x37}, /* 0x60-0x63 */ + {0xFE, 0x38}, {0x30, 0x14}, {0x30, 0x15}, {0xFE, 0x39}, /* 0x64-0x67 */ + {0xFE, 0x3A}, {0x30, 0x10}, {0x30, 0x11}, {0xFE, 0x3B}, /* 0x68-0x6B */ + {0xFE, 0x3C}, {0x30, 0x0A}, {0x30, 0x0B}, {0xFE, 0x3D}, /* 0x6C-0x6F */ + {0xFE, 0x3E}, {0x30, 0x08}, {0x30, 0x09}, {0xFE, 0x3F}, /* 0x70-0x73 */ + {0xFE, 0x40}, {0x30, 0x0C}, {0x30, 0x0D}, {0xFE, 0x41}, /* 0x74-0x77 */ + {0xFE, 0x42}, {0x30, 0x0E}, {0x30, 0x0F}, {0xFE, 0x43}, /* 0x78-0x7B */ + {0xFE, 0x44}, {0xFE, 0x59}, {0xFE, 0x5A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0xFE, 0x5B}, {0xFE, 0x5C}, {0xFE, 0x5D}, /* 0xA0-0xA3 */ + {0xFE, 0x5E}, {0x20, 0x18}, {0x20, 0x19}, {0x20, 0x1C}, /* 0xA4-0xA7 */ + {0x20, 0x1D}, {0x30, 0x1D}, {0x30, 0x1E}, {0x20, 0x35}, /* 0xA8-0xAB */ + {0x20, 0x32}, {0xFF, 0x03}, {0xFF, 0x06}, {0xFF, 0x0A}, /* 0xAC-0xAF */ + {0x20, 0x3B}, {0x00, 0xA7}, {0x30, 0x03}, {0x25, 0xCB}, /* 0xB0-0xB3 */ + {0x25, 0xCF}, {0x25, 0xB3}, {0x25, 0xB2}, {0x25, 0xCE}, /* 0xB4-0xB7 */ + {0x26, 0x06}, {0x26, 0x05}, {0x25, 0xC7}, {0x25, 0xC6}, /* 0xB8-0xBB */ + {0x25, 0xA1}, {0x25, 0xA0}, {0x25, 0xBD}, {0x25, 0xBC}, /* 0xBC-0xBF */ + {0x32, 0xA3}, {0x21, 0x05}, {0x00, 0xAF}, {0xFF, 0xE3}, /* 0xC0-0xC3 */ + {0xFF, 0x3F}, {0x02, 0xCD}, {0xFE, 0x49}, {0xFE, 0x4A}, /* 0xC4-0xC7 */ + {0xFE, 0x4D}, {0xFE, 0x4E}, {0xFE, 0x4B}, {0xFE, 0x4C}, /* 0xC8-0xCB */ + {0xFE, 0x5F}, {0xFE, 0x60}, {0xFE, 0x61}, {0xFF, 0x0B}, /* 0xCC-0xCF */ + {0xFF, 0x0D}, {0x00, 0xD7}, {0x00, 0xF7}, {0x00, 0xB1}, /* 0xD0-0xD3 */ + {0x22, 0x1A}, {0xFF, 0x1C}, {0xFF, 0x1E}, {0xFF, 0x1D}, /* 0xD4-0xD7 */ + {0x22, 0x66}, {0x22, 0x67}, {0x22, 0x60}, {0x22, 0x1E}, /* 0xD8-0xDB */ + {0x22, 0x52}, {0x22, 0x61}, {0xFE, 0x62}, {0xFE, 0x63}, /* 0xDC-0xDF */ + {0xFE, 0x64}, {0xFE, 0x65}, {0xFE, 0x66}, {0xFF, 0x5E}, /* 0xE0-0xE3 */ + {0x22, 0x29}, {0x22, 0x2A}, {0x22, 0xA5}, {0x22, 0x20}, /* 0xE4-0xE7 */ + {0x22, 0x1F}, {0x22, 0xBF}, {0x33, 0xD2}, {0x33, 0xD1}, /* 0xE8-0xEB */ + {0x22, 0x2B}, {0x22, 0x2E}, {0x22, 0x35}, {0x22, 0x34}, /* 0xEC-0xEF */ + {0x26, 0x40}, {0x26, 0x42}, {0x22, 0x95}, {0x22, 0x99}, /* 0xF0-0xF3 */ + {0x21, 0x91}, {0x21, 0x93}, {0x21, 0x90}, {0x21, 0x92}, /* 0xF4-0xF7 */ + {0x21, 0x96}, {0x21, 0x97}, {0x21, 0x99}, {0x21, 0x98}, /* 0xF8-0xFB */ + {0x22, 0x25}, {0x22, 0x23}, {0xFF, 0x0F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0xFF, 0x3C}, {0x22, 0x15}, {0xFE, 0x68}, {0xFF, 0x04}, /* 0x40-0x43 */ + {0xFF, 0xE5}, {0x30, 0x12}, {0xFF, 0xE0}, {0xFF, 0xE1}, /* 0x44-0x47 */ + {0xFF, 0x05}, {0xFF, 0x20}, {0x21, 0x03}, {0x21, 0x09}, /* 0x48-0x4B */ + {0xFE, 0x69}, {0xFE, 0x6A}, {0xFE, 0x6B}, {0x33, 0xD5}, /* 0x4C-0x4F */ + {0x33, 0x9C}, {0x33, 0x9D}, {0x33, 0x9E}, {0x33, 0xCE}, /* 0x50-0x53 */ + {0x33, 0xA1}, {0x33, 0x8E}, {0x33, 0x8F}, {0x33, 0xC4}, /* 0x54-0x57 */ + {0x00, 0xB0}, {0x51, 0x59}, {0x51, 0x5B}, {0x51, 0x5E}, /* 0x58-0x5B */ + {0x51, 0x5D}, {0x51, 0x61}, {0x51, 0x63}, {0x55, 0xE7}, /* 0x5C-0x5F */ + {0x74, 0xE9}, {0x7C, 0xCE}, {0x25, 0x81}, {0x25, 0x82}, /* 0x60-0x63 */ + {0x25, 0x83}, {0x25, 0x84}, {0x25, 0x85}, {0x25, 0x86}, /* 0x64-0x67 */ + {0x25, 0x87}, {0x25, 0x88}, {0x25, 0x8F}, {0x25, 0x8E}, /* 0x68-0x6B */ + {0x25, 0x8D}, {0x25, 0x8C}, {0x25, 0x8B}, {0x25, 0x8A}, /* 0x6C-0x6F */ + {0x25, 0x89}, {0x25, 0x3C}, {0x25, 0x34}, {0x25, 0x2C}, /* 0x70-0x73 */ + {0x25, 0x24}, {0x25, 0x1C}, {0x25, 0x94}, {0x25, 0x00}, /* 0x74-0x77 */ + {0x25, 0x02}, {0x25, 0x95}, {0x25, 0x0C}, {0x25, 0x10}, /* 0x78-0x7B */ + {0x25, 0x14}, {0x25, 0x18}, {0x25, 0x6D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x25, 0x6E}, {0x25, 0x70}, {0x25, 0x6F}, /* 0xA0-0xA3 */ + {0x25, 0x50}, {0x25, 0x5E}, {0x25, 0x6A}, {0x25, 0x61}, /* 0xA4-0xA7 */ + {0x25, 0xE2}, {0x25, 0xE3}, {0x25, 0xE5}, {0x25, 0xE4}, /* 0xA8-0xAB */ + {0x25, 0x71}, {0x25, 0x72}, {0x25, 0x73}, {0xFF, 0x10}, /* 0xAC-0xAF */ + {0xFF, 0x11}, {0xFF, 0x12}, {0xFF, 0x13}, {0xFF, 0x14}, /* 0xB0-0xB3 */ + {0xFF, 0x15}, {0xFF, 0x16}, {0xFF, 0x17}, {0xFF, 0x18}, /* 0xB4-0xB7 */ + {0xFF, 0x19}, {0x21, 0x60}, {0x21, 0x61}, {0x21, 0x62}, /* 0xB8-0xBB */ + {0x21, 0x63}, {0x21, 0x64}, {0x21, 0x65}, {0x21, 0x66}, /* 0xBC-0xBF */ + {0x21, 0x67}, {0x21, 0x68}, {0x21, 0x69}, {0x30, 0x21}, /* 0xC0-0xC3 */ + {0x30, 0x22}, {0x30, 0x23}, {0x30, 0x24}, {0x30, 0x25}, /* 0xC4-0xC7 */ + {0x30, 0x26}, {0x30, 0x27}, {0x30, 0x28}, {0x30, 0x29}, /* 0xC8-0xCB */ + {0x53, 0x41}, {0x53, 0x44}, {0x53, 0x45}, {0xFF, 0x21}, /* 0xCC-0xCF */ + {0xFF, 0x22}, {0xFF, 0x23}, {0xFF, 0x24}, {0xFF, 0x25}, /* 0xD0-0xD3 */ + {0xFF, 0x26}, {0xFF, 0x27}, {0xFF, 0x28}, {0xFF, 0x29}, /* 0xD4-0xD7 */ + {0xFF, 0x2A}, {0xFF, 0x2B}, {0xFF, 0x2C}, {0xFF, 0x2D}, /* 0xD8-0xDB */ + {0xFF, 0x2E}, {0xFF, 0x2F}, {0xFF, 0x30}, {0xFF, 0x31}, /* 0xDC-0xDF */ + {0xFF, 0x32}, {0xFF, 0x33}, {0xFF, 0x34}, {0xFF, 0x35}, /* 0xE0-0xE3 */ + {0xFF, 0x36}, {0xFF, 0x37}, {0xFF, 0x38}, {0xFF, 0x39}, /* 0xE4-0xE7 */ + {0xFF, 0x3A}, {0xFF, 0x41}, {0xFF, 0x42}, {0xFF, 0x43}, /* 0xE8-0xEB */ + {0xFF, 0x44}, {0xFF, 0x45}, {0xFF, 0x46}, {0xFF, 0x47}, /* 0xEC-0xEF */ + {0xFF, 0x48}, {0xFF, 0x49}, {0xFF, 0x4A}, {0xFF, 0x4B}, /* 0xF0-0xF3 */ + {0xFF, 0x4C}, {0xFF, 0x4D}, {0xFF, 0x4E}, {0xFF, 0x4F}, /* 0xF4-0xF7 */ + {0xFF, 0x50}, {0xFF, 0x51}, {0xFF, 0x52}, {0xFF, 0x53}, /* 0xF8-0xFB */ + {0xFF, 0x54}, {0xFF, 0x55}, {0xFF, 0x56}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0xFF, 0x57}, {0xFF, 0x58}, {0xFF, 0x59}, {0xFF, 0x5A}, /* 0x40-0x43 */ + {0x03, 0x91}, {0x03, 0x92}, {0x03, 0x93}, {0x03, 0x94}, /* 0x44-0x47 */ + {0x03, 0x95}, {0x03, 0x96}, {0x03, 0x97}, {0x03, 0x98}, /* 0x48-0x4B */ + {0x03, 0x99}, {0x03, 0x9A}, {0x03, 0x9B}, {0x03, 0x9C}, /* 0x4C-0x4F */ + {0x03, 0x9D}, {0x03, 0x9E}, {0x03, 0x9F}, {0x03, 0xA0}, /* 0x50-0x53 */ + {0x03, 0xA1}, {0x03, 0xA3}, {0x03, 0xA4}, {0x03, 0xA5}, /* 0x54-0x57 */ + {0x03, 0xA6}, {0x03, 0xA7}, {0x03, 0xA8}, {0x03, 0xA9}, /* 0x58-0x5B */ + {0x03, 0xB1}, {0x03, 0xB2}, {0x03, 0xB3}, {0x03, 0xB4}, /* 0x5C-0x5F */ + {0x03, 0xB5}, {0x03, 0xB6}, {0x03, 0xB7}, {0x03, 0xB8}, /* 0x60-0x63 */ + {0x03, 0xB9}, {0x03, 0xBA}, {0x03, 0xBB}, {0x03, 0xBC}, /* 0x64-0x67 */ + {0x03, 0xBD}, {0x03, 0xBE}, {0x03, 0xBF}, {0x03, 0xC0}, /* 0x68-0x6B */ + {0x03, 0xC1}, {0x03, 0xC3}, {0x03, 0xC4}, {0x03, 0xC5}, /* 0x6C-0x6F */ + {0x03, 0xC6}, {0x03, 0xC7}, {0x03, 0xC8}, {0x03, 0xC9}, /* 0x70-0x73 */ + {0x31, 0x05}, {0x31, 0x06}, {0x31, 0x07}, {0x31, 0x08}, /* 0x74-0x77 */ + {0x31, 0x09}, {0x31, 0x0A}, {0x31, 0x0B}, {0x31, 0x0C}, /* 0x78-0x7B */ + {0x31, 0x0D}, {0x31, 0x0E}, {0x31, 0x0F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x31, 0x10}, {0x31, 0x11}, {0x31, 0x12}, /* 0xA0-0xA3 */ + {0x31, 0x13}, {0x31, 0x14}, {0x31, 0x15}, {0x31, 0x16}, /* 0xA4-0xA7 */ + {0x31, 0x17}, {0x31, 0x18}, {0x31, 0x19}, {0x31, 0x1A}, /* 0xA8-0xAB */ + {0x31, 0x1B}, {0x31, 0x1C}, {0x31, 0x1D}, {0x31, 0x1E}, /* 0xAC-0xAF */ + {0x31, 0x1F}, {0x31, 0x20}, {0x31, 0x21}, {0x31, 0x22}, /* 0xB0-0xB3 */ + {0x31, 0x23}, {0x31, 0x24}, {0x31, 0x25}, {0x31, 0x26}, /* 0xB4-0xB7 */ + {0x31, 0x27}, {0x31, 0x28}, {0x31, 0x29}, {0x02, 0xD9}, /* 0xB8-0xBB */ + {0x02, 0xC9}, {0x02, 0xCA}, {0x02, 0xC7}, {0x02, 0xCB}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x4E, 0x00}, {0x4E, 0x59}, {0x4E, 0x01}, {0x4E, 0x03}, /* 0x40-0x43 */ + {0x4E, 0x43}, {0x4E, 0x5D}, {0x4E, 0x86}, {0x4E, 0x8C}, /* 0x44-0x47 */ + {0x4E, 0xBA}, {0x51, 0x3F}, {0x51, 0x65}, {0x51, 0x6B}, /* 0x48-0x4B */ + {0x51, 0xE0}, {0x52, 0x00}, {0x52, 0x01}, {0x52, 0x9B}, /* 0x4C-0x4F */ + {0x53, 0x15}, {0x53, 0x41}, {0x53, 0x5C}, {0x53, 0xC8}, /* 0x50-0x53 */ + {0x4E, 0x09}, {0x4E, 0x0B}, {0x4E, 0x08}, {0x4E, 0x0A}, /* 0x54-0x57 */ + {0x4E, 0x2B}, {0x4E, 0x38}, {0x51, 0xE1}, {0x4E, 0x45}, /* 0x58-0x5B */ + {0x4E, 0x48}, {0x4E, 0x5F}, {0x4E, 0x5E}, {0x4E, 0x8E}, /* 0x5C-0x5F */ + {0x4E, 0xA1}, {0x51, 0x40}, {0x52, 0x03}, {0x52, 0xFA}, /* 0x60-0x63 */ + {0x53, 0x43}, {0x53, 0xC9}, {0x53, 0xE3}, {0x57, 0x1F}, /* 0x64-0x67 */ + {0x58, 0xEB}, {0x59, 0x15}, {0x59, 0x27}, {0x59, 0x73}, /* 0x68-0x6B */ + {0x5B, 0x50}, {0x5B, 0x51}, {0x5B, 0x53}, {0x5B, 0xF8}, /* 0x6C-0x6F */ + {0x5C, 0x0F}, {0x5C, 0x22}, {0x5C, 0x38}, {0x5C, 0x71}, /* 0x70-0x73 */ + {0x5D, 0xDD}, {0x5D, 0xE5}, {0x5D, 0xF1}, {0x5D, 0xF2}, /* 0x74-0x77 */ + {0x5D, 0xF3}, {0x5D, 0xFE}, {0x5E, 0x72}, {0x5E, 0xFE}, /* 0x78-0x7B */ + {0x5F, 0x0B}, {0x5F, 0x13}, {0x62, 0x4D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x4E, 0x11}, {0x4E, 0x10}, {0x4E, 0x0D}, /* 0xA0-0xA3 */ + {0x4E, 0x2D}, {0x4E, 0x30}, {0x4E, 0x39}, {0x4E, 0x4B}, /* 0xA4-0xA7 */ + {0x5C, 0x39}, {0x4E, 0x88}, {0x4E, 0x91}, {0x4E, 0x95}, /* 0xA8-0xAB */ + {0x4E, 0x92}, {0x4E, 0x94}, {0x4E, 0xA2}, {0x4E, 0xC1}, /* 0xAC-0xAF */ + {0x4E, 0xC0}, {0x4E, 0xC3}, {0x4E, 0xC6}, {0x4E, 0xC7}, /* 0xB0-0xB3 */ + {0x4E, 0xCD}, {0x4E, 0xCA}, {0x4E, 0xCB}, {0x4E, 0xC4}, /* 0xB4-0xB7 */ + {0x51, 0x43}, {0x51, 0x41}, {0x51, 0x67}, {0x51, 0x6D}, /* 0xB8-0xBB */ + {0x51, 0x6E}, {0x51, 0x6C}, {0x51, 0x97}, {0x51, 0xF6}, /* 0xBC-0xBF */ + {0x52, 0x06}, {0x52, 0x07}, {0x52, 0x08}, {0x52, 0xFB}, /* 0xC0-0xC3 */ + {0x52, 0xFE}, {0x52, 0xFF}, {0x53, 0x16}, {0x53, 0x39}, /* 0xC4-0xC7 */ + {0x53, 0x48}, {0x53, 0x47}, {0x53, 0x45}, {0x53, 0x5E}, /* 0xC8-0xCB */ + {0x53, 0x84}, {0x53, 0xCB}, {0x53, 0xCA}, {0x53, 0xCD}, /* 0xCC-0xCF */ + {0x58, 0xEC}, {0x59, 0x29}, {0x59, 0x2B}, {0x59, 0x2A}, /* 0xD0-0xD3 */ + {0x59, 0x2D}, {0x5B, 0x54}, {0x5C, 0x11}, {0x5C, 0x24}, /* 0xD4-0xD7 */ + {0x5C, 0x3A}, {0x5C, 0x6F}, {0x5D, 0xF4}, {0x5E, 0x7B}, /* 0xD8-0xDB */ + {0x5E, 0xFF}, {0x5F, 0x14}, {0x5F, 0x15}, {0x5F, 0xC3}, /* 0xDC-0xDF */ + {0x62, 0x08}, {0x62, 0x36}, {0x62, 0x4B}, {0x62, 0x4E}, /* 0xE0-0xE3 */ + {0x65, 0x2F}, {0x65, 0x87}, {0x65, 0x97}, {0x65, 0xA4}, /* 0xE4-0xE7 */ + {0x65, 0xB9}, {0x65, 0xE5}, {0x66, 0xF0}, {0x67, 0x08}, /* 0xE8-0xEB */ + {0x67, 0x28}, {0x6B, 0x20}, {0x6B, 0x62}, {0x6B, 0x79}, /* 0xEC-0xEF */ + {0x6B, 0xCB}, {0x6B, 0xD4}, {0x6B, 0xDB}, {0x6C, 0x0F}, /* 0xF0-0xF3 */ + {0x6C, 0x34}, {0x70, 0x6B}, {0x72, 0x2A}, {0x72, 0x36}, /* 0xF4-0xF7 */ + {0x72, 0x3B}, {0x72, 0x47}, {0x72, 0x59}, {0x72, 0x5B}, /* 0xF8-0xFB */ + {0x72, 0xAC}, {0x73, 0x8B}, {0x4E, 0x19}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x4E, 0x16}, {0x4E, 0x15}, {0x4E, 0x14}, {0x4E, 0x18}, /* 0x40-0x43 */ + {0x4E, 0x3B}, {0x4E, 0x4D}, {0x4E, 0x4F}, {0x4E, 0x4E}, /* 0x44-0x47 */ + {0x4E, 0xE5}, {0x4E, 0xD8}, {0x4E, 0xD4}, {0x4E, 0xD5}, /* 0x48-0x4B */ + {0x4E, 0xD6}, {0x4E, 0xD7}, {0x4E, 0xE3}, {0x4E, 0xE4}, /* 0x4C-0x4F */ + {0x4E, 0xD9}, {0x4E, 0xDE}, {0x51, 0x45}, {0x51, 0x44}, /* 0x50-0x53 */ + {0x51, 0x89}, {0x51, 0x8A}, {0x51, 0xAC}, {0x51, 0xF9}, /* 0x54-0x57 */ + {0x51, 0xFA}, {0x51, 0xF8}, {0x52, 0x0A}, {0x52, 0xA0}, /* 0x58-0x5B */ + {0x52, 0x9F}, {0x53, 0x05}, {0x53, 0x06}, {0x53, 0x17}, /* 0x5C-0x5F */ + {0x53, 0x1D}, {0x4E, 0xDF}, {0x53, 0x4A}, {0x53, 0x49}, /* 0x60-0x63 */ + {0x53, 0x61}, {0x53, 0x60}, {0x53, 0x6F}, {0x53, 0x6E}, /* 0x64-0x67 */ + {0x53, 0xBB}, {0x53, 0xEF}, {0x53, 0xE4}, {0x53, 0xF3}, /* 0x68-0x6B */ + {0x53, 0xEC}, {0x53, 0xEE}, {0x53, 0xE9}, {0x53, 0xE8}, /* 0x6C-0x6F */ + {0x53, 0xFC}, {0x53, 0xF8}, {0x53, 0xF5}, {0x53, 0xEB}, /* 0x70-0x73 */ + {0x53, 0xE6}, {0x53, 0xEA}, {0x53, 0xF2}, {0x53, 0xF1}, /* 0x74-0x77 */ + {0x53, 0xF0}, {0x53, 0xE5}, {0x53, 0xED}, {0x53, 0xFB}, /* 0x78-0x7B */ + {0x56, 0xDB}, {0x56, 0xDA}, {0x59, 0x16}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x59, 0x2E}, {0x59, 0x31}, {0x59, 0x74}, /* 0xA0-0xA3 */ + {0x59, 0x76}, {0x5B, 0x55}, {0x5B, 0x83}, {0x5C, 0x3C}, /* 0xA4-0xA7 */ + {0x5D, 0xE8}, {0x5D, 0xE7}, {0x5D, 0xE6}, {0x5E, 0x02}, /* 0xA8-0xAB */ + {0x5E, 0x03}, {0x5E, 0x73}, {0x5E, 0x7C}, {0x5F, 0x01}, /* 0xAC-0xAF */ + {0x5F, 0x18}, {0x5F, 0x17}, {0x5F, 0xC5}, {0x62, 0x0A}, /* 0xB0-0xB3 */ + {0x62, 0x53}, {0x62, 0x54}, {0x62, 0x52}, {0x62, 0x51}, /* 0xB4-0xB7 */ + {0x65, 0xA5}, {0x65, 0xE6}, {0x67, 0x2E}, {0x67, 0x2C}, /* 0xB8-0xBB */ + {0x67, 0x2A}, {0x67, 0x2B}, {0x67, 0x2D}, {0x6B, 0x63}, /* 0xBC-0xBF */ + {0x6B, 0xCD}, {0x6C, 0x11}, {0x6C, 0x10}, {0x6C, 0x38}, /* 0xC0-0xC3 */ + {0x6C, 0x41}, {0x6C, 0x40}, {0x6C, 0x3E}, {0x72, 0xAF}, /* 0xC4-0xC7 */ + {0x73, 0x84}, {0x73, 0x89}, {0x74, 0xDC}, {0x74, 0xE6}, /* 0xC8-0xCB */ + {0x75, 0x18}, {0x75, 0x1F}, {0x75, 0x28}, {0x75, 0x29}, /* 0xCC-0xCF */ + {0x75, 0x30}, {0x75, 0x31}, {0x75, 0x32}, {0x75, 0x33}, /* 0xD0-0xD3 */ + {0x75, 0x8B}, {0x76, 0x7D}, {0x76, 0xAE}, {0x76, 0xBF}, /* 0xD4-0xD7 */ + {0x76, 0xEE}, {0x77, 0xDB}, {0x77, 0xE2}, {0x77, 0xF3}, /* 0xD8-0xDB */ + {0x79, 0x3A}, {0x79, 0xBE}, {0x7A, 0x74}, {0x7A, 0xCB}, /* 0xDC-0xDF */ + {0x4E, 0x1E}, {0x4E, 0x1F}, {0x4E, 0x52}, {0x4E, 0x53}, /* 0xE0-0xE3 */ + {0x4E, 0x69}, {0x4E, 0x99}, {0x4E, 0xA4}, {0x4E, 0xA6}, /* 0xE4-0xE7 */ + {0x4E, 0xA5}, {0x4E, 0xFF}, {0x4F, 0x09}, {0x4F, 0x19}, /* 0xE8-0xEB */ + {0x4F, 0x0A}, {0x4F, 0x15}, {0x4F, 0x0D}, {0x4F, 0x10}, /* 0xEC-0xEF */ + {0x4F, 0x11}, {0x4F, 0x0F}, {0x4E, 0xF2}, {0x4E, 0xF6}, /* 0xF0-0xF3 */ + {0x4E, 0xFB}, {0x4E, 0xF0}, {0x4E, 0xF3}, {0x4E, 0xFD}, /* 0xF4-0xF7 */ + {0x4F, 0x01}, {0x4F, 0x0B}, {0x51, 0x49}, {0x51, 0x47}, /* 0xF8-0xFB */ + {0x51, 0x46}, {0x51, 0x48}, {0x51, 0x68}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x51, 0x71}, {0x51, 0x8D}, {0x51, 0xB0}, {0x52, 0x17}, /* 0x40-0x43 */ + {0x52, 0x11}, {0x52, 0x12}, {0x52, 0x0E}, {0x52, 0x16}, /* 0x44-0x47 */ + {0x52, 0xA3}, {0x53, 0x08}, {0x53, 0x21}, {0x53, 0x20}, /* 0x48-0x4B */ + {0x53, 0x70}, {0x53, 0x71}, {0x54, 0x09}, {0x54, 0x0F}, /* 0x4C-0x4F */ + {0x54, 0x0C}, {0x54, 0x0A}, {0x54, 0x10}, {0x54, 0x01}, /* 0x50-0x53 */ + {0x54, 0x0B}, {0x54, 0x04}, {0x54, 0x11}, {0x54, 0x0D}, /* 0x54-0x57 */ + {0x54, 0x08}, {0x54, 0x03}, {0x54, 0x0E}, {0x54, 0x06}, /* 0x58-0x5B */ + {0x54, 0x12}, {0x56, 0xE0}, {0x56, 0xDE}, {0x56, 0xDD}, /* 0x5C-0x5F */ + {0x57, 0x33}, {0x57, 0x30}, {0x57, 0x28}, {0x57, 0x2D}, /* 0x60-0x63 */ + {0x57, 0x2C}, {0x57, 0x2F}, {0x57, 0x29}, {0x59, 0x19}, /* 0x64-0x67 */ + {0x59, 0x1A}, {0x59, 0x37}, {0x59, 0x38}, {0x59, 0x84}, /* 0x68-0x6B */ + {0x59, 0x78}, {0x59, 0x83}, {0x59, 0x7D}, {0x59, 0x79}, /* 0x6C-0x6F */ + {0x59, 0x82}, {0x59, 0x81}, {0x5B, 0x57}, {0x5B, 0x58}, /* 0x70-0x73 */ + {0x5B, 0x87}, {0x5B, 0x88}, {0x5B, 0x85}, {0x5B, 0x89}, /* 0x74-0x77 */ + {0x5B, 0xFA}, {0x5C, 0x16}, {0x5C, 0x79}, {0x5D, 0xDE}, /* 0x78-0x7B */ + {0x5E, 0x06}, {0x5E, 0x76}, {0x5E, 0x74}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x5F, 0x0F}, {0x5F, 0x1B}, {0x5F, 0xD9}, /* 0xA0-0xA3 */ + {0x5F, 0xD6}, {0x62, 0x0E}, {0x62, 0x0C}, {0x62, 0x0D}, /* 0xA4-0xA7 */ + {0x62, 0x10}, {0x62, 0x63}, {0x62, 0x5B}, {0x62, 0x58}, /* 0xA8-0xAB */ + {0x65, 0x36}, {0x65, 0xE9}, {0x65, 0xE8}, {0x65, 0xEC}, /* 0xAC-0xAF */ + {0x65, 0xED}, {0x66, 0xF2}, {0x66, 0xF3}, {0x67, 0x09}, /* 0xB0-0xB3 */ + {0x67, 0x3D}, {0x67, 0x34}, {0x67, 0x31}, {0x67, 0x35}, /* 0xB4-0xB7 */ + {0x6B, 0x21}, {0x6B, 0x64}, {0x6B, 0x7B}, {0x6C, 0x16}, /* 0xB8-0xBB */ + {0x6C, 0x5D}, {0x6C, 0x57}, {0x6C, 0x59}, {0x6C, 0x5F}, /* 0xBC-0xBF */ + {0x6C, 0x60}, {0x6C, 0x50}, {0x6C, 0x55}, {0x6C, 0x61}, /* 0xC0-0xC3 */ + {0x6C, 0x5B}, {0x6C, 0x4D}, {0x6C, 0x4E}, {0x70, 0x70}, /* 0xC4-0xC7 */ + {0x72, 0x5F}, {0x72, 0x5D}, {0x76, 0x7E}, {0x7A, 0xF9}, /* 0xC8-0xCB */ + {0x7C, 0x73}, {0x7C, 0xF8}, {0x7F, 0x36}, {0x7F, 0x8A}, /* 0xCC-0xCF */ + {0x7F, 0xBD}, {0x80, 0x01}, {0x80, 0x03}, {0x80, 0x0C}, /* 0xD0-0xD3 */ + {0x80, 0x12}, {0x80, 0x33}, {0x80, 0x7F}, {0x80, 0x89}, /* 0xD4-0xD7 */ + {0x80, 0x8B}, {0x80, 0x8C}, {0x81, 0xE3}, {0x81, 0xEA}, /* 0xD8-0xDB */ + {0x81, 0xF3}, {0x81, 0xFC}, {0x82, 0x0C}, {0x82, 0x1B}, /* 0xDC-0xDF */ + {0x82, 0x1F}, {0x82, 0x6E}, {0x82, 0x72}, {0x82, 0x7E}, /* 0xE0-0xE3 */ + {0x86, 0x6B}, {0x88, 0x40}, {0x88, 0x4C}, {0x88, 0x63}, /* 0xE4-0xE7 */ + {0x89, 0x7F}, {0x96, 0x21}, {0x4E, 0x32}, {0x4E, 0xA8}, /* 0xE8-0xEB */ + {0x4F, 0x4D}, {0x4F, 0x4F}, {0x4F, 0x47}, {0x4F, 0x57}, /* 0xEC-0xEF */ + {0x4F, 0x5E}, {0x4F, 0x34}, {0x4F, 0x5B}, {0x4F, 0x55}, /* 0xF0-0xF3 */ + {0x4F, 0x30}, {0x4F, 0x50}, {0x4F, 0x51}, {0x4F, 0x3D}, /* 0xF4-0xF7 */ + {0x4F, 0x3A}, {0x4F, 0x38}, {0x4F, 0x43}, {0x4F, 0x54}, /* 0xF8-0xFB */ + {0x4F, 0x3C}, {0x4F, 0x46}, {0x4F, 0x63}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x4F, 0x5C}, {0x4F, 0x60}, {0x4F, 0x2F}, {0x4F, 0x4E}, /* 0x40-0x43 */ + {0x4F, 0x36}, {0x4F, 0x59}, {0x4F, 0x5D}, {0x4F, 0x48}, /* 0x44-0x47 */ + {0x4F, 0x5A}, {0x51, 0x4C}, {0x51, 0x4B}, {0x51, 0x4D}, /* 0x48-0x4B */ + {0x51, 0x75}, {0x51, 0xB6}, {0x51, 0xB7}, {0x52, 0x25}, /* 0x4C-0x4F */ + {0x52, 0x24}, {0x52, 0x29}, {0x52, 0x2A}, {0x52, 0x28}, /* 0x50-0x53 */ + {0x52, 0xAB}, {0x52, 0xA9}, {0x52, 0xAA}, {0x52, 0xAC}, /* 0x54-0x57 */ + {0x53, 0x23}, {0x53, 0x73}, {0x53, 0x75}, {0x54, 0x1D}, /* 0x58-0x5B */ + {0x54, 0x2D}, {0x54, 0x1E}, {0x54, 0x3E}, {0x54, 0x26}, /* 0x5C-0x5F */ + {0x54, 0x4E}, {0x54, 0x27}, {0x54, 0x46}, {0x54, 0x43}, /* 0x60-0x63 */ + {0x54, 0x33}, {0x54, 0x48}, {0x54, 0x42}, {0x54, 0x1B}, /* 0x64-0x67 */ + {0x54, 0x29}, {0x54, 0x4A}, {0x54, 0x39}, {0x54, 0x3B}, /* 0x68-0x6B */ + {0x54, 0x38}, {0x54, 0x2E}, {0x54, 0x35}, {0x54, 0x36}, /* 0x6C-0x6F */ + {0x54, 0x20}, {0x54, 0x3C}, {0x54, 0x40}, {0x54, 0x31}, /* 0x70-0x73 */ + {0x54, 0x2B}, {0x54, 0x1F}, {0x54, 0x2C}, {0x56, 0xEA}, /* 0x74-0x77 */ + {0x56, 0xF0}, {0x56, 0xE4}, {0x56, 0xEB}, {0x57, 0x4A}, /* 0x78-0x7B */ + {0x57, 0x51}, {0x57, 0x40}, {0x57, 0x4D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x57, 0x47}, {0x57, 0x4E}, {0x57, 0x3E}, /* 0xA0-0xA3 */ + {0x57, 0x50}, {0x57, 0x4F}, {0x57, 0x3B}, {0x58, 0xEF}, /* 0xA4-0xA7 */ + {0x59, 0x3E}, {0x59, 0x9D}, {0x59, 0x92}, {0x59, 0xA8}, /* 0xA8-0xAB */ + {0x59, 0x9E}, {0x59, 0xA3}, {0x59, 0x99}, {0x59, 0x96}, /* 0xAC-0xAF */ + {0x59, 0x8D}, {0x59, 0xA4}, {0x59, 0x93}, {0x59, 0x8A}, /* 0xB0-0xB3 */ + {0x59, 0xA5}, {0x5B, 0x5D}, {0x5B, 0x5C}, {0x5B, 0x5A}, /* 0xB4-0xB7 */ + {0x5B, 0x5B}, {0x5B, 0x8C}, {0x5B, 0x8B}, {0x5B, 0x8F}, /* 0xB8-0xBB */ + {0x5C, 0x2C}, {0x5C, 0x40}, {0x5C, 0x41}, {0x5C, 0x3F}, /* 0xBC-0xBF */ + {0x5C, 0x3E}, {0x5C, 0x90}, {0x5C, 0x91}, {0x5C, 0x94}, /* 0xC0-0xC3 */ + {0x5C, 0x8C}, {0x5D, 0xEB}, {0x5E, 0x0C}, {0x5E, 0x8F}, /* 0xC4-0xC7 */ + {0x5E, 0x87}, {0x5E, 0x8A}, {0x5E, 0xF7}, {0x5F, 0x04}, /* 0xC8-0xCB */ + {0x5F, 0x1F}, {0x5F, 0x64}, {0x5F, 0x62}, {0x5F, 0x77}, /* 0xCC-0xCF */ + {0x5F, 0x79}, {0x5F, 0xD8}, {0x5F, 0xCC}, {0x5F, 0xD7}, /* 0xD0-0xD3 */ + {0x5F, 0xCD}, {0x5F, 0xF1}, {0x5F, 0xEB}, {0x5F, 0xF8}, /* 0xD4-0xD7 */ + {0x5F, 0xEA}, {0x62, 0x12}, {0x62, 0x11}, {0x62, 0x84}, /* 0xD8-0xDB */ + {0x62, 0x97}, {0x62, 0x96}, {0x62, 0x80}, {0x62, 0x76}, /* 0xDC-0xDF */ + {0x62, 0x89}, {0x62, 0x6D}, {0x62, 0x8A}, {0x62, 0x7C}, /* 0xE0-0xE3 */ + {0x62, 0x7E}, {0x62, 0x79}, {0x62, 0x73}, {0x62, 0x92}, /* 0xE4-0xE7 */ + {0x62, 0x6F}, {0x62, 0x98}, {0x62, 0x6E}, {0x62, 0x95}, /* 0xE8-0xEB */ + {0x62, 0x93}, {0x62, 0x91}, {0x62, 0x86}, {0x65, 0x39}, /* 0xEC-0xEF */ + {0x65, 0x3B}, {0x65, 0x38}, {0x65, 0xF1}, {0x66, 0xF4}, /* 0xF0-0xF3 */ + {0x67, 0x5F}, {0x67, 0x4E}, {0x67, 0x4F}, {0x67, 0x50}, /* 0xF4-0xF7 */ + {0x67, 0x51}, {0x67, 0x5C}, {0x67, 0x56}, {0x67, 0x5E}, /* 0xF8-0xFB */ + {0x67, 0x49}, {0x67, 0x46}, {0x67, 0x60}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x67, 0x53}, {0x67, 0x57}, {0x6B, 0x65}, {0x6B, 0xCF}, /* 0x40-0x43 */ + {0x6C, 0x42}, {0x6C, 0x5E}, {0x6C, 0x99}, {0x6C, 0x81}, /* 0x44-0x47 */ + {0x6C, 0x88}, {0x6C, 0x89}, {0x6C, 0x85}, {0x6C, 0x9B}, /* 0x48-0x4B */ + {0x6C, 0x6A}, {0x6C, 0x7A}, {0x6C, 0x90}, {0x6C, 0x70}, /* 0x4C-0x4F */ + {0x6C, 0x8C}, {0x6C, 0x68}, {0x6C, 0x96}, {0x6C, 0x92}, /* 0x50-0x53 */ + {0x6C, 0x7D}, {0x6C, 0x83}, {0x6C, 0x72}, {0x6C, 0x7E}, /* 0x54-0x57 */ + {0x6C, 0x74}, {0x6C, 0x86}, {0x6C, 0x76}, {0x6C, 0x8D}, /* 0x58-0x5B */ + {0x6C, 0x94}, {0x6C, 0x98}, {0x6C, 0x82}, {0x70, 0x76}, /* 0x5C-0x5F */ + {0x70, 0x7C}, {0x70, 0x7D}, {0x70, 0x78}, {0x72, 0x62}, /* 0x60-0x63 */ + {0x72, 0x61}, {0x72, 0x60}, {0x72, 0xC4}, {0x72, 0xC2}, /* 0x64-0x67 */ + {0x73, 0x96}, {0x75, 0x2C}, {0x75, 0x2B}, {0x75, 0x37}, /* 0x68-0x6B */ + {0x75, 0x38}, {0x76, 0x82}, {0x76, 0xEF}, {0x77, 0xE3}, /* 0x6C-0x6F */ + {0x79, 0xC1}, {0x79, 0xC0}, {0x79, 0xBF}, {0x7A, 0x76}, /* 0x70-0x73 */ + {0x7C, 0xFB}, {0x7F, 0x55}, {0x80, 0x96}, {0x80, 0x93}, /* 0x74-0x77 */ + {0x80, 0x9D}, {0x80, 0x98}, {0x80, 0x9B}, {0x80, 0x9A}, /* 0x78-0x7B */ + {0x80, 0xB2}, {0x82, 0x6F}, {0x82, 0x92}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x82, 0x8B}, {0x82, 0x8D}, {0x89, 0x8B}, /* 0xA0-0xA3 */ + {0x89, 0xD2}, {0x8A, 0x00}, {0x8C, 0x37}, {0x8C, 0x46}, /* 0xA4-0xA7 */ + {0x8C, 0x55}, {0x8C, 0x9D}, {0x8D, 0x64}, {0x8D, 0x70}, /* 0xA8-0xAB */ + {0x8D, 0xB3}, {0x8E, 0xAB}, {0x8E, 0xCA}, {0x8F, 0x9B}, /* 0xAC-0xAF */ + {0x8F, 0xB0}, {0x8F, 0xC2}, {0x8F, 0xC6}, {0x8F, 0xC5}, /* 0xB0-0xB3 */ + {0x8F, 0xC4}, {0x5D, 0xE1}, {0x90, 0x91}, {0x90, 0xA2}, /* 0xB4-0xB7 */ + {0x90, 0xAA}, {0x90, 0xA6}, {0x90, 0xA3}, {0x91, 0x49}, /* 0xB8-0xBB */ + {0x91, 0xC6}, {0x91, 0xCC}, {0x96, 0x32}, {0x96, 0x2E}, /* 0xBC-0xBF */ + {0x96, 0x31}, {0x96, 0x2A}, {0x96, 0x2C}, {0x4E, 0x26}, /* 0xC0-0xC3 */ + {0x4E, 0x56}, {0x4E, 0x73}, {0x4E, 0x8B}, {0x4E, 0x9B}, /* 0xC4-0xC7 */ + {0x4E, 0x9E}, {0x4E, 0xAB}, {0x4E, 0xAC}, {0x4F, 0x6F}, /* 0xC8-0xCB */ + {0x4F, 0x9D}, {0x4F, 0x8D}, {0x4F, 0x73}, {0x4F, 0x7F}, /* 0xCC-0xCF */ + {0x4F, 0x6C}, {0x4F, 0x9B}, {0x4F, 0x8B}, {0x4F, 0x86}, /* 0xD0-0xD3 */ + {0x4F, 0x83}, {0x4F, 0x70}, {0x4F, 0x75}, {0x4F, 0x88}, /* 0xD4-0xD7 */ + {0x4F, 0x69}, {0x4F, 0x7B}, {0x4F, 0x96}, {0x4F, 0x7E}, /* 0xD8-0xDB */ + {0x4F, 0x8F}, {0x4F, 0x91}, {0x4F, 0x7A}, {0x51, 0x54}, /* 0xDC-0xDF */ + {0x51, 0x52}, {0x51, 0x55}, {0x51, 0x69}, {0x51, 0x77}, /* 0xE0-0xE3 */ + {0x51, 0x76}, {0x51, 0x78}, {0x51, 0xBD}, {0x51, 0xFD}, /* 0xE4-0xE7 */ + {0x52, 0x3B}, {0x52, 0x38}, {0x52, 0x37}, {0x52, 0x3A}, /* 0xE8-0xEB */ + {0x52, 0x30}, {0x52, 0x2E}, {0x52, 0x36}, {0x52, 0x41}, /* 0xEC-0xEF */ + {0x52, 0xBE}, {0x52, 0xBB}, {0x53, 0x52}, {0x53, 0x54}, /* 0xF0-0xF3 */ + {0x53, 0x53}, {0x53, 0x51}, {0x53, 0x66}, {0x53, 0x77}, /* 0xF4-0xF7 */ + {0x53, 0x78}, {0x53, 0x79}, {0x53, 0xD6}, {0x53, 0xD4}, /* 0xF8-0xFB */ + {0x53, 0xD7}, {0x54, 0x73}, {0x54, 0x75}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_A9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x54, 0x96}, {0x54, 0x78}, {0x54, 0x95}, {0x54, 0x80}, /* 0x40-0x43 */ + {0x54, 0x7B}, {0x54, 0x77}, {0x54, 0x84}, {0x54, 0x92}, /* 0x44-0x47 */ + {0x54, 0x86}, {0x54, 0x7C}, {0x54, 0x90}, {0x54, 0x71}, /* 0x48-0x4B */ + {0x54, 0x76}, {0x54, 0x8C}, {0x54, 0x9A}, {0x54, 0x62}, /* 0x4C-0x4F */ + {0x54, 0x68}, {0x54, 0x8B}, {0x54, 0x7D}, {0x54, 0x8E}, /* 0x50-0x53 */ + {0x56, 0xFA}, {0x57, 0x83}, {0x57, 0x77}, {0x57, 0x6A}, /* 0x54-0x57 */ + {0x57, 0x69}, {0x57, 0x61}, {0x57, 0x66}, {0x57, 0x64}, /* 0x58-0x5B */ + {0x57, 0x7C}, {0x59, 0x1C}, {0x59, 0x49}, {0x59, 0x47}, /* 0x5C-0x5F */ + {0x59, 0x48}, {0x59, 0x44}, {0x59, 0x54}, {0x59, 0xBE}, /* 0x60-0x63 */ + {0x59, 0xBB}, {0x59, 0xD4}, {0x59, 0xB9}, {0x59, 0xAE}, /* 0x64-0x67 */ + {0x59, 0xD1}, {0x59, 0xC6}, {0x59, 0xD0}, {0x59, 0xCD}, /* 0x68-0x6B */ + {0x59, 0xCB}, {0x59, 0xD3}, {0x59, 0xCA}, {0x59, 0xAF}, /* 0x6C-0x6F */ + {0x59, 0xB3}, {0x59, 0xD2}, {0x59, 0xC5}, {0x5B, 0x5F}, /* 0x70-0x73 */ + {0x5B, 0x64}, {0x5B, 0x63}, {0x5B, 0x97}, {0x5B, 0x9A}, /* 0x74-0x77 */ + {0x5B, 0x98}, {0x5B, 0x9C}, {0x5B, 0x99}, {0x5B, 0x9B}, /* 0x78-0x7B */ + {0x5C, 0x1A}, {0x5C, 0x48}, {0x5C, 0x45}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x5C, 0x46}, {0x5C, 0xB7}, {0x5C, 0xA1}, /* 0xA0-0xA3 */ + {0x5C, 0xB8}, {0x5C, 0xA9}, {0x5C, 0xAB}, {0x5C, 0xB1}, /* 0xA4-0xA7 */ + {0x5C, 0xB3}, {0x5E, 0x18}, {0x5E, 0x1A}, {0x5E, 0x16}, /* 0xA8-0xAB */ + {0x5E, 0x15}, {0x5E, 0x1B}, {0x5E, 0x11}, {0x5E, 0x78}, /* 0xAC-0xAF */ + {0x5E, 0x9A}, {0x5E, 0x97}, {0x5E, 0x9C}, {0x5E, 0x95}, /* 0xB0-0xB3 */ + {0x5E, 0x96}, {0x5E, 0xF6}, {0x5F, 0x26}, {0x5F, 0x27}, /* 0xB4-0xB7 */ + {0x5F, 0x29}, {0x5F, 0x80}, {0x5F, 0x81}, {0x5F, 0x7F}, /* 0xB8-0xBB */ + {0x5F, 0x7C}, {0x5F, 0xDD}, {0x5F, 0xE0}, {0x5F, 0xFD}, /* 0xBC-0xBF */ + {0x5F, 0xF5}, {0x5F, 0xFF}, {0x60, 0x0F}, {0x60, 0x14}, /* 0xC0-0xC3 */ + {0x60, 0x2F}, {0x60, 0x35}, {0x60, 0x16}, {0x60, 0x2A}, /* 0xC4-0xC7 */ + {0x60, 0x15}, {0x60, 0x21}, {0x60, 0x27}, {0x60, 0x29}, /* 0xC8-0xCB */ + {0x60, 0x2B}, {0x60, 0x1B}, {0x62, 0x16}, {0x62, 0x15}, /* 0xCC-0xCF */ + {0x62, 0x3F}, {0x62, 0x3E}, {0x62, 0x40}, {0x62, 0x7F}, /* 0xD0-0xD3 */ + {0x62, 0xC9}, {0x62, 0xCC}, {0x62, 0xC4}, {0x62, 0xBF}, /* 0xD4-0xD7 */ + {0x62, 0xC2}, {0x62, 0xB9}, {0x62, 0xD2}, {0x62, 0xDB}, /* 0xD8-0xDB */ + {0x62, 0xAB}, {0x62, 0xD3}, {0x62, 0xD4}, {0x62, 0xCB}, /* 0xDC-0xDF */ + {0x62, 0xC8}, {0x62, 0xA8}, {0x62, 0xBD}, {0x62, 0xBC}, /* 0xE0-0xE3 */ + {0x62, 0xD0}, {0x62, 0xD9}, {0x62, 0xC7}, {0x62, 0xCD}, /* 0xE4-0xE7 */ + {0x62, 0xB5}, {0x62, 0xDA}, {0x62, 0xB1}, {0x62, 0xD8}, /* 0xE8-0xEB */ + {0x62, 0xD6}, {0x62, 0xD7}, {0x62, 0xC6}, {0x62, 0xAC}, /* 0xEC-0xEF */ + {0x62, 0xCE}, {0x65, 0x3E}, {0x65, 0xA7}, {0x65, 0xBC}, /* 0xF0-0xF3 */ + {0x65, 0xFA}, {0x66, 0x14}, {0x66, 0x13}, {0x66, 0x0C}, /* 0xF4-0xF7 */ + {0x66, 0x06}, {0x66, 0x02}, {0x66, 0x0E}, {0x66, 0x00}, /* 0xF8-0xFB */ + {0x66, 0x0F}, {0x66, 0x15}, {0x66, 0x0A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x66, 0x07}, {0x67, 0x0D}, {0x67, 0x0B}, {0x67, 0x6D}, /* 0x40-0x43 */ + {0x67, 0x8B}, {0x67, 0x95}, {0x67, 0x71}, {0x67, 0x9C}, /* 0x44-0x47 */ + {0x67, 0x73}, {0x67, 0x77}, {0x67, 0x87}, {0x67, 0x9D}, /* 0x48-0x4B */ + {0x67, 0x97}, {0x67, 0x6F}, {0x67, 0x70}, {0x67, 0x7F}, /* 0x4C-0x4F */ + {0x67, 0x89}, {0x67, 0x7E}, {0x67, 0x90}, {0x67, 0x75}, /* 0x50-0x53 */ + {0x67, 0x9A}, {0x67, 0x93}, {0x67, 0x7C}, {0x67, 0x6A}, /* 0x54-0x57 */ + {0x67, 0x72}, {0x6B, 0x23}, {0x6B, 0x66}, {0x6B, 0x67}, /* 0x58-0x5B */ + {0x6B, 0x7F}, {0x6C, 0x13}, {0x6C, 0x1B}, {0x6C, 0xE3}, /* 0x5C-0x5F */ + {0x6C, 0xE8}, {0x6C, 0xF3}, {0x6C, 0xB1}, {0x6C, 0xCC}, /* 0x60-0x63 */ + {0x6C, 0xE5}, {0x6C, 0xB3}, {0x6C, 0xBD}, {0x6C, 0xBE}, /* 0x64-0x67 */ + {0x6C, 0xBC}, {0x6C, 0xE2}, {0x6C, 0xAB}, {0x6C, 0xD5}, /* 0x68-0x6B */ + {0x6C, 0xD3}, {0x6C, 0xB8}, {0x6C, 0xC4}, {0x6C, 0xB9}, /* 0x6C-0x6F */ + {0x6C, 0xC1}, {0x6C, 0xAE}, {0x6C, 0xD7}, {0x6C, 0xC5}, /* 0x70-0x73 */ + {0x6C, 0xF1}, {0x6C, 0xBF}, {0x6C, 0xBB}, {0x6C, 0xE1}, /* 0x74-0x77 */ + {0x6C, 0xDB}, {0x6C, 0xCA}, {0x6C, 0xAC}, {0x6C, 0xEF}, /* 0x78-0x7B */ + {0x6C, 0xDC}, {0x6C, 0xD6}, {0x6C, 0xE0}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x70, 0x95}, {0x70, 0x8E}, {0x70, 0x92}, /* 0xA0-0xA3 */ + {0x70, 0x8A}, {0x70, 0x99}, {0x72, 0x2C}, {0x72, 0x2D}, /* 0xA4-0xA7 */ + {0x72, 0x38}, {0x72, 0x48}, {0x72, 0x67}, {0x72, 0x69}, /* 0xA8-0xAB */ + {0x72, 0xC0}, {0x72, 0xCE}, {0x72, 0xD9}, {0x72, 0xD7}, /* 0xAC-0xAF */ + {0x72, 0xD0}, {0x73, 0xA9}, {0x73, 0xA8}, {0x73, 0x9F}, /* 0xB0-0xB3 */ + {0x73, 0xAB}, {0x73, 0xA5}, {0x75, 0x3D}, {0x75, 0x9D}, /* 0xB4-0xB7 */ + {0x75, 0x99}, {0x75, 0x9A}, {0x76, 0x84}, {0x76, 0xC2}, /* 0xB8-0xBB */ + {0x76, 0xF2}, {0x76, 0xF4}, {0x77, 0xE5}, {0x77, 0xFD}, /* 0xBC-0xBF */ + {0x79, 0x3E}, {0x79, 0x40}, {0x79, 0x41}, {0x79, 0xC9}, /* 0xC0-0xC3 */ + {0x79, 0xC8}, {0x7A, 0x7A}, {0x7A, 0x79}, {0x7A, 0xFA}, /* 0xC4-0xC7 */ + {0x7C, 0xFE}, {0x7F, 0x54}, {0x7F, 0x8C}, {0x7F, 0x8B}, /* 0xC8-0xCB */ + {0x80, 0x05}, {0x80, 0xBA}, {0x80, 0xA5}, {0x80, 0xA2}, /* 0xCC-0xCF */ + {0x80, 0xB1}, {0x80, 0xA1}, {0x80, 0xAB}, {0x80, 0xA9}, /* 0xD0-0xD3 */ + {0x80, 0xB4}, {0x80, 0xAA}, {0x80, 0xAF}, {0x81, 0xE5}, /* 0xD4-0xD7 */ + {0x81, 0xFE}, {0x82, 0x0D}, {0x82, 0xB3}, {0x82, 0x9D}, /* 0xD8-0xDB */ + {0x82, 0x99}, {0x82, 0xAD}, {0x82, 0xBD}, {0x82, 0x9F}, /* 0xDC-0xDF */ + {0x82, 0xB9}, {0x82, 0xB1}, {0x82, 0xAC}, {0x82, 0xA5}, /* 0xE0-0xE3 */ + {0x82, 0xAF}, {0x82, 0xB8}, {0x82, 0xA3}, {0x82, 0xB0}, /* 0xE4-0xE7 */ + {0x82, 0xBE}, {0x82, 0xB7}, {0x86, 0x4E}, {0x86, 0x71}, /* 0xE8-0xEB */ + {0x52, 0x1D}, {0x88, 0x68}, {0x8E, 0xCB}, {0x8F, 0xCE}, /* 0xEC-0xEF */ + {0x8F, 0xD4}, {0x8F, 0xD1}, {0x90, 0xB5}, {0x90, 0xB8}, /* 0xF0-0xF3 */ + {0x90, 0xB1}, {0x90, 0xB6}, {0x91, 0xC7}, {0x91, 0xD1}, /* 0xF4-0xF7 */ + {0x95, 0x77}, {0x95, 0x80}, {0x96, 0x1C}, {0x96, 0x40}, /* 0xF8-0xFB */ + {0x96, 0x3F}, {0x96, 0x3B}, {0x96, 0x44}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x96, 0x42}, {0x96, 0xB9}, {0x96, 0xE8}, {0x97, 0x52}, /* 0x40-0x43 */ + {0x97, 0x5E}, {0x4E, 0x9F}, {0x4E, 0xAD}, {0x4E, 0xAE}, /* 0x44-0x47 */ + {0x4F, 0xE1}, {0x4F, 0xB5}, {0x4F, 0xAF}, {0x4F, 0xBF}, /* 0x48-0x4B */ + {0x4F, 0xE0}, {0x4F, 0xD1}, {0x4F, 0xCF}, {0x4F, 0xDD}, /* 0x4C-0x4F */ + {0x4F, 0xC3}, {0x4F, 0xB6}, {0x4F, 0xD8}, {0x4F, 0xDF}, /* 0x50-0x53 */ + {0x4F, 0xCA}, {0x4F, 0xD7}, {0x4F, 0xAE}, {0x4F, 0xD0}, /* 0x54-0x57 */ + {0x4F, 0xC4}, {0x4F, 0xC2}, {0x4F, 0xDA}, {0x4F, 0xCE}, /* 0x58-0x5B */ + {0x4F, 0xDE}, {0x4F, 0xB7}, {0x51, 0x57}, {0x51, 0x92}, /* 0x5C-0x5F */ + {0x51, 0x91}, {0x51, 0xA0}, {0x52, 0x4E}, {0x52, 0x43}, /* 0x60-0x63 */ + {0x52, 0x4A}, {0x52, 0x4D}, {0x52, 0x4C}, {0x52, 0x4B}, /* 0x64-0x67 */ + {0x52, 0x47}, {0x52, 0xC7}, {0x52, 0xC9}, {0x52, 0xC3}, /* 0x68-0x6B */ + {0x52, 0xC1}, {0x53, 0x0D}, {0x53, 0x57}, {0x53, 0x7B}, /* 0x6C-0x6F */ + {0x53, 0x9A}, {0x53, 0xDB}, {0x54, 0xAC}, {0x54, 0xC0}, /* 0x70-0x73 */ + {0x54, 0xA8}, {0x54, 0xCE}, {0x54, 0xC9}, {0x54, 0xB8}, /* 0x74-0x77 */ + {0x54, 0xA6}, {0x54, 0xB3}, {0x54, 0xC7}, {0x54, 0xC2}, /* 0x78-0x7B */ + {0x54, 0xBD}, {0x54, 0xAA}, {0x54, 0xC1}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x54, 0xC4}, {0x54, 0xC8}, {0x54, 0xAF}, /* 0xA0-0xA3 */ + {0x54, 0xAB}, {0x54, 0xB1}, {0x54, 0xBB}, {0x54, 0xA9}, /* 0xA4-0xA7 */ + {0x54, 0xA7}, {0x54, 0xBF}, {0x56, 0xFF}, {0x57, 0x82}, /* 0xA8-0xAB */ + {0x57, 0x8B}, {0x57, 0xA0}, {0x57, 0xA3}, {0x57, 0xA2}, /* 0xAC-0xAF */ + {0x57, 0xCE}, {0x57, 0xAE}, {0x57, 0x93}, {0x59, 0x55}, /* 0xB0-0xB3 */ + {0x59, 0x51}, {0x59, 0x4F}, {0x59, 0x4E}, {0x59, 0x50}, /* 0xB4-0xB7 */ + {0x59, 0xDC}, {0x59, 0xD8}, {0x59, 0xFF}, {0x59, 0xE3}, /* 0xB8-0xBB */ + {0x59, 0xE8}, {0x5A, 0x03}, {0x59, 0xE5}, {0x59, 0xEA}, /* 0xBC-0xBF */ + {0x59, 0xDA}, {0x59, 0xE6}, {0x5A, 0x01}, {0x59, 0xFB}, /* 0xC0-0xC3 */ + {0x5B, 0x69}, {0x5B, 0xA3}, {0x5B, 0xA6}, {0x5B, 0xA4}, /* 0xC4-0xC7 */ + {0x5B, 0xA2}, {0x5B, 0xA5}, {0x5C, 0x01}, {0x5C, 0x4E}, /* 0xC8-0xCB */ + {0x5C, 0x4F}, {0x5C, 0x4D}, {0x5C, 0x4B}, {0x5C, 0xD9}, /* 0xCC-0xCF */ + {0x5C, 0xD2}, {0x5D, 0xF7}, {0x5E, 0x1D}, {0x5E, 0x25}, /* 0xD0-0xD3 */ + {0x5E, 0x1F}, {0x5E, 0x7D}, {0x5E, 0xA0}, {0x5E, 0xA6}, /* 0xD4-0xD7 */ + {0x5E, 0xFA}, {0x5F, 0x08}, {0x5F, 0x2D}, {0x5F, 0x65}, /* 0xD8-0xDB */ + {0x5F, 0x88}, {0x5F, 0x85}, {0x5F, 0x8A}, {0x5F, 0x8B}, /* 0xDC-0xDF */ + {0x5F, 0x87}, {0x5F, 0x8C}, {0x5F, 0x89}, {0x60, 0x12}, /* 0xE0-0xE3 */ + {0x60, 0x1D}, {0x60, 0x20}, {0x60, 0x25}, {0x60, 0x0E}, /* 0xE4-0xE7 */ + {0x60, 0x28}, {0x60, 0x4D}, {0x60, 0x70}, {0x60, 0x68}, /* 0xE8-0xEB */ + {0x60, 0x62}, {0x60, 0x46}, {0x60, 0x43}, {0x60, 0x6C}, /* 0xEC-0xEF */ + {0x60, 0x6B}, {0x60, 0x6A}, {0x60, 0x64}, {0x62, 0x41}, /* 0xF0-0xF3 */ + {0x62, 0xDC}, {0x63, 0x16}, {0x63, 0x09}, {0x62, 0xFC}, /* 0xF4-0xF7 */ + {0x62, 0xED}, {0x63, 0x01}, {0x62, 0xEE}, {0x62, 0xFD}, /* 0xF8-0xFB */ + {0x63, 0x07}, {0x62, 0xF1}, {0x62, 0xF7}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x62, 0xEF}, {0x62, 0xEC}, {0x62, 0xFE}, {0x62, 0xF4}, /* 0x40-0x43 */ + {0x63, 0x11}, {0x63, 0x02}, {0x65, 0x3F}, {0x65, 0x45}, /* 0x44-0x47 */ + {0x65, 0xAB}, {0x65, 0xBD}, {0x65, 0xE2}, {0x66, 0x25}, /* 0x48-0x4B */ + {0x66, 0x2D}, {0x66, 0x20}, {0x66, 0x27}, {0x66, 0x2F}, /* 0x4C-0x4F */ + {0x66, 0x1F}, {0x66, 0x28}, {0x66, 0x31}, {0x66, 0x24}, /* 0x50-0x53 */ + {0x66, 0xF7}, {0x67, 0xFF}, {0x67, 0xD3}, {0x67, 0xF1}, /* 0x54-0x57 */ + {0x67, 0xD4}, {0x67, 0xD0}, {0x67, 0xEC}, {0x67, 0xB6}, /* 0x58-0x5B */ + {0x67, 0xAF}, {0x67, 0xF5}, {0x67, 0xE9}, {0x67, 0xEF}, /* 0x5C-0x5F */ + {0x67, 0xC4}, {0x67, 0xD1}, {0x67, 0xB4}, {0x67, 0xDA}, /* 0x60-0x63 */ + {0x67, 0xE5}, {0x67, 0xB8}, {0x67, 0xCF}, {0x67, 0xDE}, /* 0x64-0x67 */ + {0x67, 0xF3}, {0x67, 0xB0}, {0x67, 0xD9}, {0x67, 0xE2}, /* 0x68-0x6B */ + {0x67, 0xDD}, {0x67, 0xD2}, {0x6B, 0x6A}, {0x6B, 0x83}, /* 0x6C-0x6F */ + {0x6B, 0x86}, {0x6B, 0xB5}, {0x6B, 0xD2}, {0x6B, 0xD7}, /* 0x70-0x73 */ + {0x6C, 0x1F}, {0x6C, 0xC9}, {0x6D, 0x0B}, {0x6D, 0x32}, /* 0x74-0x77 */ + {0x6D, 0x2A}, {0x6D, 0x41}, {0x6D, 0x25}, {0x6D, 0x0C}, /* 0x78-0x7B */ + {0x6D, 0x31}, {0x6D, 0x1E}, {0x6D, 0x17}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x6D, 0x3B}, {0x6D, 0x3D}, {0x6D, 0x3E}, /* 0xA0-0xA3 */ + {0x6D, 0x36}, {0x6D, 0x1B}, {0x6C, 0xF5}, {0x6D, 0x39}, /* 0xA4-0xA7 */ + {0x6D, 0x27}, {0x6D, 0x38}, {0x6D, 0x29}, {0x6D, 0x2E}, /* 0xA8-0xAB */ + {0x6D, 0x35}, {0x6D, 0x0E}, {0x6D, 0x2B}, {0x70, 0xAB}, /* 0xAC-0xAF */ + {0x70, 0xBA}, {0x70, 0xB3}, {0x70, 0xAC}, {0x70, 0xAF}, /* 0xB0-0xB3 */ + {0x70, 0xAD}, {0x70, 0xB8}, {0x70, 0xAE}, {0x70, 0xA4}, /* 0xB4-0xB7 */ + {0x72, 0x30}, {0x72, 0x72}, {0x72, 0x6F}, {0x72, 0x74}, /* 0xB8-0xBB */ + {0x72, 0xE9}, {0x72, 0xE0}, {0x72, 0xE1}, {0x73, 0xB7}, /* 0xBC-0xBF */ + {0x73, 0xCA}, {0x73, 0xBB}, {0x73, 0xB2}, {0x73, 0xCD}, /* 0xC0-0xC3 */ + {0x73, 0xC0}, {0x73, 0xB3}, {0x75, 0x1A}, {0x75, 0x2D}, /* 0xC4-0xC7 */ + {0x75, 0x4F}, {0x75, 0x4C}, {0x75, 0x4E}, {0x75, 0x4B}, /* 0xC8-0xCB */ + {0x75, 0xAB}, {0x75, 0xA4}, {0x75, 0xA5}, {0x75, 0xA2}, /* 0xCC-0xCF */ + {0x75, 0xA3}, {0x76, 0x78}, {0x76, 0x86}, {0x76, 0x87}, /* 0xD0-0xD3 */ + {0x76, 0x88}, {0x76, 0xC8}, {0x76, 0xC6}, {0x76, 0xC3}, /* 0xD4-0xD7 */ + {0x76, 0xC5}, {0x77, 0x01}, {0x76, 0xF9}, {0x76, 0xF8}, /* 0xD8-0xDB */ + {0x77, 0x09}, {0x77, 0x0B}, {0x76, 0xFE}, {0x76, 0xFC}, /* 0xDC-0xDF */ + {0x77, 0x07}, {0x77, 0xDC}, {0x78, 0x02}, {0x78, 0x14}, /* 0xE0-0xE3 */ + {0x78, 0x0C}, {0x78, 0x0D}, {0x79, 0x46}, {0x79, 0x49}, /* 0xE4-0xE7 */ + {0x79, 0x48}, {0x79, 0x47}, {0x79, 0xB9}, {0x79, 0xBA}, /* 0xE8-0xEB */ + {0x79, 0xD1}, {0x79, 0xD2}, {0x79, 0xCB}, {0x7A, 0x7F}, /* 0xEC-0xEF */ + {0x7A, 0x81}, {0x7A, 0xFF}, {0x7A, 0xFD}, {0x7C, 0x7D}, /* 0xF0-0xF3 */ + {0x7D, 0x02}, {0x7D, 0x05}, {0x7D, 0x00}, {0x7D, 0x09}, /* 0xF4-0xF7 */ + {0x7D, 0x07}, {0x7D, 0x04}, {0x7D, 0x06}, {0x7F, 0x38}, /* 0xF8-0xFB */ + {0x7F, 0x8E}, {0x7F, 0xBF}, {0x80, 0x04}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x80, 0x10}, {0x80, 0x0D}, {0x80, 0x11}, {0x80, 0x36}, /* 0x40-0x43 */ + {0x80, 0xD6}, {0x80, 0xE5}, {0x80, 0xDA}, {0x80, 0xC3}, /* 0x44-0x47 */ + {0x80, 0xC4}, {0x80, 0xCC}, {0x80, 0xE1}, {0x80, 0xDB}, /* 0x48-0x4B */ + {0x80, 0xCE}, {0x80, 0xDE}, {0x80, 0xE4}, {0x80, 0xDD}, /* 0x4C-0x4F */ + {0x81, 0xF4}, {0x82, 0x22}, {0x82, 0xE7}, {0x83, 0x03}, /* 0x50-0x53 */ + {0x83, 0x05}, {0x82, 0xE3}, {0x82, 0xDB}, {0x82, 0xE6}, /* 0x54-0x57 */ + {0x83, 0x04}, {0x82, 0xE5}, {0x83, 0x02}, {0x83, 0x09}, /* 0x58-0x5B */ + {0x82, 0xD2}, {0x82, 0xD7}, {0x82, 0xF1}, {0x83, 0x01}, /* 0x5C-0x5F */ + {0x82, 0xDC}, {0x82, 0xD4}, {0x82, 0xD1}, {0x82, 0xDE}, /* 0x60-0x63 */ + {0x82, 0xD3}, {0x82, 0xDF}, {0x82, 0xEF}, {0x83, 0x06}, /* 0x64-0x67 */ + {0x86, 0x50}, {0x86, 0x79}, {0x86, 0x7B}, {0x86, 0x7A}, /* 0x68-0x6B */ + {0x88, 0x4D}, {0x88, 0x6B}, {0x89, 0x81}, {0x89, 0xD4}, /* 0x6C-0x6F */ + {0x8A, 0x08}, {0x8A, 0x02}, {0x8A, 0x03}, {0x8C, 0x9E}, /* 0x70-0x73 */ + {0x8C, 0xA0}, {0x8D, 0x74}, {0x8D, 0x73}, {0x8D, 0xB4}, /* 0x74-0x77 */ + {0x8E, 0xCD}, {0x8E, 0xCC}, {0x8F, 0xF0}, {0x8F, 0xE6}, /* 0x78-0x7B */ + {0x8F, 0xE2}, {0x8F, 0xEA}, {0x8F, 0xE5}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x8F, 0xED}, {0x8F, 0xEB}, {0x8F, 0xE4}, /* 0xA0-0xA3 */ + {0x8F, 0xE8}, {0x90, 0xCA}, {0x90, 0xCE}, {0x90, 0xC1}, /* 0xA4-0xA7 */ + {0x90, 0xC3}, {0x91, 0x4B}, {0x91, 0x4A}, {0x91, 0xCD}, /* 0xA8-0xAB */ + {0x95, 0x82}, {0x96, 0x50}, {0x96, 0x4B}, {0x96, 0x4C}, /* 0xAC-0xAF */ + {0x96, 0x4D}, {0x97, 0x62}, {0x97, 0x69}, {0x97, 0xCB}, /* 0xB0-0xB3 */ + {0x97, 0xED}, {0x97, 0xF3}, {0x98, 0x01}, {0x98, 0xA8}, /* 0xB4-0xB7 */ + {0x98, 0xDB}, {0x98, 0xDF}, {0x99, 0x96}, {0x99, 0x99}, /* 0xB8-0xBB */ + {0x4E, 0x58}, {0x4E, 0xB3}, {0x50, 0x0C}, {0x50, 0x0D}, /* 0xBC-0xBF */ + {0x50, 0x23}, {0x4F, 0xEF}, {0x50, 0x26}, {0x50, 0x25}, /* 0xC0-0xC3 */ + {0x4F, 0xF8}, {0x50, 0x29}, {0x50, 0x16}, {0x50, 0x06}, /* 0xC4-0xC7 */ + {0x50, 0x3C}, {0x50, 0x1F}, {0x50, 0x1A}, {0x50, 0x12}, /* 0xC8-0xCB */ + {0x50, 0x11}, {0x4F, 0xFA}, {0x50, 0x00}, {0x50, 0x14}, /* 0xCC-0xCF */ + {0x50, 0x28}, {0x4F, 0xF1}, {0x50, 0x21}, {0x50, 0x0B}, /* 0xD0-0xD3 */ + {0x50, 0x19}, {0x50, 0x18}, {0x4F, 0xF3}, {0x4F, 0xEE}, /* 0xD4-0xD7 */ + {0x50, 0x2D}, {0x50, 0x2A}, {0x4F, 0xFE}, {0x50, 0x2B}, /* 0xD8-0xDB */ + {0x50, 0x09}, {0x51, 0x7C}, {0x51, 0xA4}, {0x51, 0xA5}, /* 0xDC-0xDF */ + {0x51, 0xA2}, {0x51, 0xCD}, {0x51, 0xCC}, {0x51, 0xC6}, /* 0xE0-0xE3 */ + {0x51, 0xCB}, {0x52, 0x56}, {0x52, 0x5C}, {0x52, 0x54}, /* 0xE4-0xE7 */ + {0x52, 0x5B}, {0x52, 0x5D}, {0x53, 0x2A}, {0x53, 0x7F}, /* 0xE8-0xEB */ + {0x53, 0x9F}, {0x53, 0x9D}, {0x53, 0xDF}, {0x54, 0xE8}, /* 0xEC-0xEF */ + {0x55, 0x10}, {0x55, 0x01}, {0x55, 0x37}, {0x54, 0xFC}, /* 0xF0-0xF3 */ + {0x54, 0xE5}, {0x54, 0xF2}, {0x55, 0x06}, {0x54, 0xFA}, /* 0xF4-0xF7 */ + {0x55, 0x14}, {0x54, 0xE9}, {0x54, 0xED}, {0x54, 0xE1}, /* 0xF8-0xFB */ + {0x55, 0x09}, {0x54, 0xEE}, {0x54, 0xEA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x54, 0xE6}, {0x55, 0x27}, {0x55, 0x07}, {0x54, 0xFD}, /* 0x40-0x43 */ + {0x55, 0x0F}, {0x57, 0x03}, {0x57, 0x04}, {0x57, 0xC2}, /* 0x44-0x47 */ + {0x57, 0xD4}, {0x57, 0xCB}, {0x57, 0xC3}, {0x58, 0x09}, /* 0x48-0x4B */ + {0x59, 0x0F}, {0x59, 0x57}, {0x59, 0x58}, {0x59, 0x5A}, /* 0x4C-0x4F */ + {0x5A, 0x11}, {0x5A, 0x18}, {0x5A, 0x1C}, {0x5A, 0x1F}, /* 0x50-0x53 */ + {0x5A, 0x1B}, {0x5A, 0x13}, {0x59, 0xEC}, {0x5A, 0x20}, /* 0x54-0x57 */ + {0x5A, 0x23}, {0x5A, 0x29}, {0x5A, 0x25}, {0x5A, 0x0C}, /* 0x58-0x5B */ + {0x5A, 0x09}, {0x5B, 0x6B}, {0x5C, 0x58}, {0x5B, 0xB0}, /* 0x5C-0x5F */ + {0x5B, 0xB3}, {0x5B, 0xB6}, {0x5B, 0xB4}, {0x5B, 0xAE}, /* 0x60-0x63 */ + {0x5B, 0xB5}, {0x5B, 0xB9}, {0x5B, 0xB8}, {0x5C, 0x04}, /* 0x64-0x67 */ + {0x5C, 0x51}, {0x5C, 0x55}, {0x5C, 0x50}, {0x5C, 0xED}, /* 0x68-0x6B */ + {0x5C, 0xFD}, {0x5C, 0xFB}, {0x5C, 0xEA}, {0x5C, 0xE8}, /* 0x6C-0x6F */ + {0x5C, 0xF0}, {0x5C, 0xF6}, {0x5D, 0x01}, {0x5C, 0xF4}, /* 0x70-0x73 */ + {0x5D, 0xEE}, {0x5E, 0x2D}, {0x5E, 0x2B}, {0x5E, 0xAB}, /* 0x74-0x77 */ + {0x5E, 0xAD}, {0x5E, 0xA7}, {0x5F, 0x31}, {0x5F, 0x92}, /* 0x78-0x7B */ + {0x5F, 0x91}, {0x5F, 0x90}, {0x60, 0x59}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x60, 0x63}, {0x60, 0x65}, {0x60, 0x50}, /* 0xA0-0xA3 */ + {0x60, 0x55}, {0x60, 0x6D}, {0x60, 0x69}, {0x60, 0x6F}, /* 0xA4-0xA7 */ + {0x60, 0x84}, {0x60, 0x9F}, {0x60, 0x9A}, {0x60, 0x8D}, /* 0xA8-0xAB */ + {0x60, 0x94}, {0x60, 0x8C}, {0x60, 0x85}, {0x60, 0x96}, /* 0xAC-0xAF */ + {0x62, 0x47}, {0x62, 0xF3}, {0x63, 0x08}, {0x62, 0xFF}, /* 0xB0-0xB3 */ + {0x63, 0x4E}, {0x63, 0x3E}, {0x63, 0x2F}, {0x63, 0x55}, /* 0xB4-0xB7 */ + {0x63, 0x42}, {0x63, 0x46}, {0x63, 0x4F}, {0x63, 0x49}, /* 0xB8-0xBB */ + {0x63, 0x3A}, {0x63, 0x50}, {0x63, 0x3D}, {0x63, 0x2A}, /* 0xBC-0xBF */ + {0x63, 0x2B}, {0x63, 0x28}, {0x63, 0x4D}, {0x63, 0x4C}, /* 0xC0-0xC3 */ + {0x65, 0x48}, {0x65, 0x49}, {0x65, 0x99}, {0x65, 0xC1}, /* 0xC4-0xC7 */ + {0x65, 0xC5}, {0x66, 0x42}, {0x66, 0x49}, {0x66, 0x4F}, /* 0xC8-0xCB */ + {0x66, 0x43}, {0x66, 0x52}, {0x66, 0x4C}, {0x66, 0x45}, /* 0xCC-0xCF */ + {0x66, 0x41}, {0x66, 0xF8}, {0x67, 0x14}, {0x67, 0x15}, /* 0xD0-0xD3 */ + {0x67, 0x17}, {0x68, 0x21}, {0x68, 0x38}, {0x68, 0x48}, /* 0xD4-0xD7 */ + {0x68, 0x46}, {0x68, 0x53}, {0x68, 0x39}, {0x68, 0x42}, /* 0xD8-0xDB */ + {0x68, 0x54}, {0x68, 0x29}, {0x68, 0xB3}, {0x68, 0x17}, /* 0xDC-0xDF */ + {0x68, 0x4C}, {0x68, 0x51}, {0x68, 0x3D}, {0x67, 0xF4}, /* 0xE0-0xE3 */ + {0x68, 0x50}, {0x68, 0x40}, {0x68, 0x3C}, {0x68, 0x43}, /* 0xE4-0xE7 */ + {0x68, 0x2A}, {0x68, 0x45}, {0x68, 0x13}, {0x68, 0x18}, /* 0xE8-0xEB */ + {0x68, 0x41}, {0x6B, 0x8A}, {0x6B, 0x89}, {0x6B, 0xB7}, /* 0xEC-0xEF */ + {0x6C, 0x23}, {0x6C, 0x27}, {0x6C, 0x28}, {0x6C, 0x26}, /* 0xF0-0xF3 */ + {0x6C, 0x24}, {0x6C, 0xF0}, {0x6D, 0x6A}, {0x6D, 0x95}, /* 0xF4-0xF7 */ + {0x6D, 0x88}, {0x6D, 0x87}, {0x6D, 0x66}, {0x6D, 0x78}, /* 0xF8-0xFB */ + {0x6D, 0x77}, {0x6D, 0x59}, {0x6D, 0x93}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_AF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6D, 0x6C}, {0x6D, 0x89}, {0x6D, 0x6E}, {0x6D, 0x5A}, /* 0x40-0x43 */ + {0x6D, 0x74}, {0x6D, 0x69}, {0x6D, 0x8C}, {0x6D, 0x8A}, /* 0x44-0x47 */ + {0x6D, 0x79}, {0x6D, 0x85}, {0x6D, 0x65}, {0x6D, 0x94}, /* 0x48-0x4B */ + {0x70, 0xCA}, {0x70, 0xD8}, {0x70, 0xE4}, {0x70, 0xD9}, /* 0x4C-0x4F */ + {0x70, 0xC8}, {0x70, 0xCF}, {0x72, 0x39}, {0x72, 0x79}, /* 0x50-0x53 */ + {0x72, 0xFC}, {0x72, 0xF9}, {0x72, 0xFD}, {0x72, 0xF8}, /* 0x54-0x57 */ + {0x72, 0xF7}, {0x73, 0x86}, {0x73, 0xED}, {0x74, 0x09}, /* 0x58-0x5B */ + {0x73, 0xEE}, {0x73, 0xE0}, {0x73, 0xEA}, {0x73, 0xDE}, /* 0x5C-0x5F */ + {0x75, 0x54}, {0x75, 0x5D}, {0x75, 0x5C}, {0x75, 0x5A}, /* 0x60-0x63 */ + {0x75, 0x59}, {0x75, 0xBE}, {0x75, 0xC5}, {0x75, 0xC7}, /* 0x64-0x67 */ + {0x75, 0xB2}, {0x75, 0xB3}, {0x75, 0xBD}, {0x75, 0xBC}, /* 0x68-0x6B */ + {0x75, 0xB9}, {0x75, 0xC2}, {0x75, 0xB8}, {0x76, 0x8B}, /* 0x6C-0x6F */ + {0x76, 0xB0}, {0x76, 0xCA}, {0x76, 0xCD}, {0x76, 0xCE}, /* 0x70-0x73 */ + {0x77, 0x29}, {0x77, 0x1F}, {0x77, 0x20}, {0x77, 0x28}, /* 0x74-0x77 */ + {0x77, 0xE9}, {0x78, 0x30}, {0x78, 0x27}, {0x78, 0x38}, /* 0x78-0x7B */ + {0x78, 0x1D}, {0x78, 0x34}, {0x78, 0x37}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x78, 0x25}, {0x78, 0x2D}, {0x78, 0x20}, /* 0xA0-0xA3 */ + {0x78, 0x1F}, {0x78, 0x32}, {0x79, 0x55}, {0x79, 0x50}, /* 0xA4-0xA7 */ + {0x79, 0x60}, {0x79, 0x5F}, {0x79, 0x56}, {0x79, 0x5E}, /* 0xA8-0xAB */ + {0x79, 0x5D}, {0x79, 0x57}, {0x79, 0x5A}, {0x79, 0xE4}, /* 0xAC-0xAF */ + {0x79, 0xE3}, {0x79, 0xE7}, {0x79, 0xDF}, {0x79, 0xE6}, /* 0xB0-0xB3 */ + {0x79, 0xE9}, {0x79, 0xD8}, {0x7A, 0x84}, {0x7A, 0x88}, /* 0xB4-0xB7 */ + {0x7A, 0xD9}, {0x7B, 0x06}, {0x7B, 0x11}, {0x7C, 0x89}, /* 0xB8-0xBB */ + {0x7D, 0x21}, {0x7D, 0x17}, {0x7D, 0x0B}, {0x7D, 0x0A}, /* 0xBC-0xBF */ + {0x7D, 0x20}, {0x7D, 0x22}, {0x7D, 0x14}, {0x7D, 0x10}, /* 0xC0-0xC3 */ + {0x7D, 0x15}, {0x7D, 0x1A}, {0x7D, 0x1C}, {0x7D, 0x0D}, /* 0xC4-0xC7 */ + {0x7D, 0x19}, {0x7D, 0x1B}, {0x7F, 0x3A}, {0x7F, 0x5F}, /* 0xC8-0xCB */ + {0x7F, 0x94}, {0x7F, 0xC5}, {0x7F, 0xC1}, {0x80, 0x06}, /* 0xCC-0xCF */ + {0x80, 0x18}, {0x80, 0x15}, {0x80, 0x19}, {0x80, 0x17}, /* 0xD0-0xD3 */ + {0x80, 0x3D}, {0x80, 0x3F}, {0x80, 0xF1}, {0x81, 0x02}, /* 0xD4-0xD7 */ + {0x80, 0xF0}, {0x81, 0x05}, {0x80, 0xED}, {0x80, 0xF4}, /* 0xD8-0xDB */ + {0x81, 0x06}, {0x80, 0xF8}, {0x80, 0xF3}, {0x81, 0x08}, /* 0xDC-0xDF */ + {0x80, 0xFD}, {0x81, 0x0A}, {0x80, 0xFC}, {0x80, 0xEF}, /* 0xE0-0xE3 */ + {0x81, 0xED}, {0x81, 0xEC}, {0x82, 0x00}, {0x82, 0x10}, /* 0xE4-0xE7 */ + {0x82, 0x2A}, {0x82, 0x2B}, {0x82, 0x28}, {0x82, 0x2C}, /* 0xE8-0xEB */ + {0x82, 0xBB}, {0x83, 0x2B}, {0x83, 0x52}, {0x83, 0x54}, /* 0xEC-0xEF */ + {0x83, 0x4A}, {0x83, 0x38}, {0x83, 0x50}, {0x83, 0x49}, /* 0xF0-0xF3 */ + {0x83, 0x35}, {0x83, 0x34}, {0x83, 0x4F}, {0x83, 0x32}, /* 0xF4-0xF7 */ + {0x83, 0x39}, {0x83, 0x36}, {0x83, 0x17}, {0x83, 0x40}, /* 0xF8-0xFB */ + {0x83, 0x31}, {0x83, 0x28}, {0x83, 0x43}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x86, 0x54}, {0x86, 0x8A}, {0x86, 0xAA}, {0x86, 0x93}, /* 0x40-0x43 */ + {0x86, 0xA4}, {0x86, 0xA9}, {0x86, 0x8C}, {0x86, 0xA3}, /* 0x44-0x47 */ + {0x86, 0x9C}, {0x88, 0x70}, {0x88, 0x77}, {0x88, 0x81}, /* 0x48-0x4B */ + {0x88, 0x82}, {0x88, 0x7D}, {0x88, 0x79}, {0x8A, 0x18}, /* 0x4C-0x4F */ + {0x8A, 0x10}, {0x8A, 0x0E}, {0x8A, 0x0C}, {0x8A, 0x15}, /* 0x50-0x53 */ + {0x8A, 0x0A}, {0x8A, 0x17}, {0x8A, 0x13}, {0x8A, 0x16}, /* 0x54-0x57 */ + {0x8A, 0x0F}, {0x8A, 0x11}, {0x8C, 0x48}, {0x8C, 0x7A}, /* 0x58-0x5B */ + {0x8C, 0x79}, {0x8C, 0xA1}, {0x8C, 0xA2}, {0x8D, 0x77}, /* 0x5C-0x5F */ + {0x8E, 0xAC}, {0x8E, 0xD2}, {0x8E, 0xD4}, {0x8E, 0xCF}, /* 0x60-0x63 */ + {0x8F, 0xB1}, {0x90, 0x01}, {0x90, 0x06}, {0x8F, 0xF7}, /* 0x64-0x67 */ + {0x90, 0x00}, {0x8F, 0xFA}, {0x8F, 0xF4}, {0x90, 0x03}, /* 0x68-0x6B */ + {0x8F, 0xFD}, {0x90, 0x05}, {0x8F, 0xF8}, {0x90, 0x95}, /* 0x6C-0x6F */ + {0x90, 0xE1}, {0x90, 0xDD}, {0x90, 0xE2}, {0x91, 0x52}, /* 0x70-0x73 */ + {0x91, 0x4D}, {0x91, 0x4C}, {0x91, 0xD8}, {0x91, 0xDD}, /* 0x74-0x77 */ + {0x91, 0xD7}, {0x91, 0xDC}, {0x91, 0xD9}, {0x95, 0x83}, /* 0x78-0x7B */ + {0x96, 0x62}, {0x96, 0x63}, {0x96, 0x61}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x96, 0x5B}, {0x96, 0x5D}, {0x96, 0x64}, /* 0xA0-0xA3 */ + {0x96, 0x58}, {0x96, 0x5E}, {0x96, 0xBB}, {0x98, 0xE2}, /* 0xA4-0xA7 */ + {0x99, 0xAC}, {0x9A, 0xA8}, {0x9A, 0xD8}, {0x9B, 0x25}, /* 0xA8-0xAB */ + {0x9B, 0x32}, {0x9B, 0x3C}, {0x4E, 0x7E}, {0x50, 0x7A}, /* 0xAC-0xAF */ + {0x50, 0x7D}, {0x50, 0x5C}, {0x50, 0x47}, {0x50, 0x43}, /* 0xB0-0xB3 */ + {0x50, 0x4C}, {0x50, 0x5A}, {0x50, 0x49}, {0x50, 0x65}, /* 0xB4-0xB7 */ + {0x50, 0x76}, {0x50, 0x4E}, {0x50, 0x55}, {0x50, 0x75}, /* 0xB8-0xBB */ + {0x50, 0x74}, {0x50, 0x77}, {0x50, 0x4F}, {0x50, 0x0F}, /* 0xBC-0xBF */ + {0x50, 0x6F}, {0x50, 0x6D}, {0x51, 0x5C}, {0x51, 0x95}, /* 0xC0-0xC3 */ + {0x51, 0xF0}, {0x52, 0x6A}, {0x52, 0x6F}, {0x52, 0xD2}, /* 0xC4-0xC7 */ + {0x52, 0xD9}, {0x52, 0xD8}, {0x52, 0xD5}, {0x53, 0x10}, /* 0xC8-0xCB */ + {0x53, 0x0F}, {0x53, 0x19}, {0x53, 0x3F}, {0x53, 0x40}, /* 0xCC-0xCF */ + {0x53, 0x3E}, {0x53, 0xC3}, {0x66, 0xFC}, {0x55, 0x46}, /* 0xD0-0xD3 */ + {0x55, 0x6A}, {0x55, 0x66}, {0x55, 0x44}, {0x55, 0x5E}, /* 0xD4-0xD7 */ + {0x55, 0x61}, {0x55, 0x43}, {0x55, 0x4A}, {0x55, 0x31}, /* 0xD8-0xDB */ + {0x55, 0x56}, {0x55, 0x4F}, {0x55, 0x55}, {0x55, 0x2F}, /* 0xDC-0xDF */ + {0x55, 0x64}, {0x55, 0x38}, {0x55, 0x2E}, {0x55, 0x5C}, /* 0xE0-0xE3 */ + {0x55, 0x2C}, {0x55, 0x63}, {0x55, 0x33}, {0x55, 0x41}, /* 0xE4-0xE7 */ + {0x55, 0x57}, {0x57, 0x08}, {0x57, 0x0B}, {0x57, 0x09}, /* 0xE8-0xEB */ + {0x57, 0xDF}, {0x58, 0x05}, {0x58, 0x0A}, {0x58, 0x06}, /* 0xEC-0xEF */ + {0x57, 0xE0}, {0x57, 0xE4}, {0x57, 0xFA}, {0x58, 0x02}, /* 0xF0-0xF3 */ + {0x58, 0x35}, {0x57, 0xF7}, {0x57, 0xF9}, {0x59, 0x20}, /* 0xF4-0xF7 */ + {0x59, 0x62}, {0x5A, 0x36}, {0x5A, 0x41}, {0x5A, 0x49}, /* 0xF8-0xFB */ + {0x5A, 0x66}, {0x5A, 0x6A}, {0x5A, 0x40}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5A, 0x3C}, {0x5A, 0x62}, {0x5A, 0x5A}, {0x5A, 0x46}, /* 0x40-0x43 */ + {0x5A, 0x4A}, {0x5B, 0x70}, {0x5B, 0xC7}, {0x5B, 0xC5}, /* 0x44-0x47 */ + {0x5B, 0xC4}, {0x5B, 0xC2}, {0x5B, 0xBF}, {0x5B, 0xC6}, /* 0x48-0x4B */ + {0x5C, 0x09}, {0x5C, 0x08}, {0x5C, 0x07}, {0x5C, 0x60}, /* 0x4C-0x4F */ + {0x5C, 0x5C}, {0x5C, 0x5D}, {0x5D, 0x07}, {0x5D, 0x06}, /* 0x50-0x53 */ + {0x5D, 0x0E}, {0x5D, 0x1B}, {0x5D, 0x16}, {0x5D, 0x22}, /* 0x54-0x57 */ + {0x5D, 0x11}, {0x5D, 0x29}, {0x5D, 0x14}, {0x5D, 0x19}, /* 0x58-0x5B */ + {0x5D, 0x24}, {0x5D, 0x27}, {0x5D, 0x17}, {0x5D, 0xE2}, /* 0x5C-0x5F */ + {0x5E, 0x38}, {0x5E, 0x36}, {0x5E, 0x33}, {0x5E, 0x37}, /* 0x60-0x63 */ + {0x5E, 0xB7}, {0x5E, 0xB8}, {0x5E, 0xB6}, {0x5E, 0xB5}, /* 0x64-0x67 */ + {0x5E, 0xBE}, {0x5F, 0x35}, {0x5F, 0x37}, {0x5F, 0x57}, /* 0x68-0x6B */ + {0x5F, 0x6C}, {0x5F, 0x69}, {0x5F, 0x6B}, {0x5F, 0x97}, /* 0x6C-0x6F */ + {0x5F, 0x99}, {0x5F, 0x9E}, {0x5F, 0x98}, {0x5F, 0xA1}, /* 0x70-0x73 */ + {0x5F, 0xA0}, {0x5F, 0x9C}, {0x60, 0x7F}, {0x60, 0xA3}, /* 0x74-0x77 */ + {0x60, 0x89}, {0x60, 0xA0}, {0x60, 0xA8}, {0x60, 0xCB}, /* 0x78-0x7B */ + {0x60, 0xB4}, {0x60, 0xE6}, {0x60, 0xBD}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x60, 0xC5}, {0x60, 0xBB}, {0x60, 0xB5}, /* 0xA0-0xA3 */ + {0x60, 0xDC}, {0x60, 0xBC}, {0x60, 0xD8}, {0x60, 0xD5}, /* 0xA4-0xA7 */ + {0x60, 0xC6}, {0x60, 0xDF}, {0x60, 0xB8}, {0x60, 0xDA}, /* 0xA8-0xAB */ + {0x60, 0xC7}, {0x62, 0x1A}, {0x62, 0x1B}, {0x62, 0x48}, /* 0xAC-0xAF */ + {0x63, 0xA0}, {0x63, 0xA7}, {0x63, 0x72}, {0x63, 0x96}, /* 0xB0-0xB3 */ + {0x63, 0xA2}, {0x63, 0xA5}, {0x63, 0x77}, {0x63, 0x67}, /* 0xB4-0xB7 */ + {0x63, 0x98}, {0x63, 0xAA}, {0x63, 0x71}, {0x63, 0xA9}, /* 0xB8-0xBB */ + {0x63, 0x89}, {0x63, 0x83}, {0x63, 0x9B}, {0x63, 0x6B}, /* 0xBC-0xBF */ + {0x63, 0xA8}, {0x63, 0x84}, {0x63, 0x88}, {0x63, 0x99}, /* 0xC0-0xC3 */ + {0x63, 0xA1}, {0x63, 0xAC}, {0x63, 0x92}, {0x63, 0x8F}, /* 0xC4-0xC7 */ + {0x63, 0x80}, {0x63, 0x7B}, {0x63, 0x69}, {0x63, 0x68}, /* 0xC8-0xCB */ + {0x63, 0x7A}, {0x65, 0x5D}, {0x65, 0x56}, {0x65, 0x51}, /* 0xCC-0xCF */ + {0x65, 0x59}, {0x65, 0x57}, {0x55, 0x5F}, {0x65, 0x4F}, /* 0xD0-0xD3 */ + {0x65, 0x58}, {0x65, 0x55}, {0x65, 0x54}, {0x65, 0x9C}, /* 0xD4-0xD7 */ + {0x65, 0x9B}, {0x65, 0xAC}, {0x65, 0xCF}, {0x65, 0xCB}, /* 0xD8-0xDB */ + {0x65, 0xCC}, {0x65, 0xCE}, {0x66, 0x5D}, {0x66, 0x5A}, /* 0xDC-0xDF */ + {0x66, 0x64}, {0x66, 0x68}, {0x66, 0x66}, {0x66, 0x5E}, /* 0xE0-0xE3 */ + {0x66, 0xF9}, {0x52, 0xD7}, {0x67, 0x1B}, {0x68, 0x81}, /* 0xE4-0xE7 */ + {0x68, 0xAF}, {0x68, 0xA2}, {0x68, 0x93}, {0x68, 0xB5}, /* 0xE8-0xEB */ + {0x68, 0x7F}, {0x68, 0x76}, {0x68, 0xB1}, {0x68, 0xA7}, /* 0xEC-0xEF */ + {0x68, 0x97}, {0x68, 0xB0}, {0x68, 0x83}, {0x68, 0xC4}, /* 0xF0-0xF3 */ + {0x68, 0xAD}, {0x68, 0x86}, {0x68, 0x85}, {0x68, 0x94}, /* 0xF4-0xF7 */ + {0x68, 0x9D}, {0x68, 0xA8}, {0x68, 0x9F}, {0x68, 0xA1}, /* 0xF8-0xFB */ + {0x68, 0x82}, {0x6B, 0x32}, {0x6B, 0xBA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6B, 0xEB}, {0x6B, 0xEC}, {0x6C, 0x2B}, {0x6D, 0x8E}, /* 0x40-0x43 */ + {0x6D, 0xBC}, {0x6D, 0xF3}, {0x6D, 0xD9}, {0x6D, 0xB2}, /* 0x44-0x47 */ + {0x6D, 0xE1}, {0x6D, 0xCC}, {0x6D, 0xE4}, {0x6D, 0xFB}, /* 0x48-0x4B */ + {0x6D, 0xFA}, {0x6E, 0x05}, {0x6D, 0xC7}, {0x6D, 0xCB}, /* 0x4C-0x4F */ + {0x6D, 0xAF}, {0x6D, 0xD1}, {0x6D, 0xAE}, {0x6D, 0xDE}, /* 0x50-0x53 */ + {0x6D, 0xF9}, {0x6D, 0xB8}, {0x6D, 0xF7}, {0x6D, 0xF5}, /* 0x54-0x57 */ + {0x6D, 0xC5}, {0x6D, 0xD2}, {0x6E, 0x1A}, {0x6D, 0xB5}, /* 0x58-0x5B */ + {0x6D, 0xDA}, {0x6D, 0xEB}, {0x6D, 0xD8}, {0x6D, 0xEA}, /* 0x5C-0x5F */ + {0x6D, 0xF1}, {0x6D, 0xEE}, {0x6D, 0xE8}, {0x6D, 0xC6}, /* 0x60-0x63 */ + {0x6D, 0xC4}, {0x6D, 0xAA}, {0x6D, 0xEC}, {0x6D, 0xBF}, /* 0x64-0x67 */ + {0x6D, 0xE6}, {0x70, 0xF9}, {0x71, 0x09}, {0x71, 0x0A}, /* 0x68-0x6B */ + {0x70, 0xFD}, {0x70, 0xEF}, {0x72, 0x3D}, {0x72, 0x7D}, /* 0x6C-0x6F */ + {0x72, 0x81}, {0x73, 0x1C}, {0x73, 0x1B}, {0x73, 0x16}, /* 0x70-0x73 */ + {0x73, 0x13}, {0x73, 0x19}, {0x73, 0x87}, {0x74, 0x05}, /* 0x74-0x77 */ + {0x74, 0x0A}, {0x74, 0x03}, {0x74, 0x06}, {0x73, 0xFE}, /* 0x78-0x7B */ + {0x74, 0x0D}, {0x74, 0xE0}, {0x74, 0xF6}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x74, 0xF7}, {0x75, 0x1C}, {0x75, 0x22}, /* 0xA0-0xA3 */ + {0x75, 0x65}, {0x75, 0x66}, {0x75, 0x62}, {0x75, 0x70}, /* 0xA4-0xA7 */ + {0x75, 0x8F}, {0x75, 0xD4}, {0x75, 0xD5}, {0x75, 0xB5}, /* 0xA8-0xAB */ + {0x75, 0xCA}, {0x75, 0xCD}, {0x76, 0x8E}, {0x76, 0xD4}, /* 0xAC-0xAF */ + {0x76, 0xD2}, {0x76, 0xDB}, {0x77, 0x37}, {0x77, 0x3E}, /* 0xB0-0xB3 */ + {0x77, 0x3C}, {0x77, 0x36}, {0x77, 0x38}, {0x77, 0x3A}, /* 0xB4-0xB7 */ + {0x78, 0x6B}, {0x78, 0x43}, {0x78, 0x4E}, {0x79, 0x65}, /* 0xB8-0xBB */ + {0x79, 0x68}, {0x79, 0x6D}, {0x79, 0xFB}, {0x7A, 0x92}, /* 0xBC-0xBF */ + {0x7A, 0x95}, {0x7B, 0x20}, {0x7B, 0x28}, {0x7B, 0x1B}, /* 0xC0-0xC3 */ + {0x7B, 0x2C}, {0x7B, 0x26}, {0x7B, 0x19}, {0x7B, 0x1E}, /* 0xC4-0xC7 */ + {0x7B, 0x2E}, {0x7C, 0x92}, {0x7C, 0x97}, {0x7C, 0x95}, /* 0xC8-0xCB */ + {0x7D, 0x46}, {0x7D, 0x43}, {0x7D, 0x71}, {0x7D, 0x2E}, /* 0xCC-0xCF */ + {0x7D, 0x39}, {0x7D, 0x3C}, {0x7D, 0x40}, {0x7D, 0x30}, /* 0xD0-0xD3 */ + {0x7D, 0x33}, {0x7D, 0x44}, {0x7D, 0x2F}, {0x7D, 0x42}, /* 0xD4-0xD7 */ + {0x7D, 0x32}, {0x7D, 0x31}, {0x7F, 0x3D}, {0x7F, 0x9E}, /* 0xD8-0xDB */ + {0x7F, 0x9A}, {0x7F, 0xCC}, {0x7F, 0xCE}, {0x7F, 0xD2}, /* 0xDC-0xDF */ + {0x80, 0x1C}, {0x80, 0x4A}, {0x80, 0x46}, {0x81, 0x2F}, /* 0xE0-0xE3 */ + {0x81, 0x16}, {0x81, 0x23}, {0x81, 0x2B}, {0x81, 0x29}, /* 0xE4-0xE7 */ + {0x81, 0x30}, {0x81, 0x24}, {0x82, 0x02}, {0x82, 0x35}, /* 0xE8-0xEB */ + {0x82, 0x37}, {0x82, 0x36}, {0x82, 0x39}, {0x83, 0x8E}, /* 0xEC-0xEF */ + {0x83, 0x9E}, {0x83, 0x98}, {0x83, 0x78}, {0x83, 0xA2}, /* 0xF0-0xF3 */ + {0x83, 0x96}, {0x83, 0xBD}, {0x83, 0xAB}, {0x83, 0x92}, /* 0xF4-0xF7 */ + {0x83, 0x8A}, {0x83, 0x93}, {0x83, 0x89}, {0x83, 0xA0}, /* 0xF8-0xFB */ + {0x83, 0x77}, {0x83, 0x7B}, {0x83, 0x7C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x83, 0x86}, {0x83, 0xA7}, {0x86, 0x55}, {0x5F, 0x6A}, /* 0x40-0x43 */ + {0x86, 0xC7}, {0x86, 0xC0}, {0x86, 0xB6}, {0x86, 0xC4}, /* 0x44-0x47 */ + {0x86, 0xB5}, {0x86, 0xC6}, {0x86, 0xCB}, {0x86, 0xB1}, /* 0x48-0x4B */ + {0x86, 0xAF}, {0x86, 0xC9}, {0x88, 0x53}, {0x88, 0x9E}, /* 0x4C-0x4F */ + {0x88, 0x88}, {0x88, 0xAB}, {0x88, 0x92}, {0x88, 0x96}, /* 0x50-0x53 */ + {0x88, 0x8D}, {0x88, 0x8B}, {0x89, 0x93}, {0x89, 0x8F}, /* 0x54-0x57 */ + {0x8A, 0x2A}, {0x8A, 0x1D}, {0x8A, 0x23}, {0x8A, 0x25}, /* 0x58-0x5B */ + {0x8A, 0x31}, {0x8A, 0x2D}, {0x8A, 0x1F}, {0x8A, 0x1B}, /* 0x5C-0x5F */ + {0x8A, 0x22}, {0x8C, 0x49}, {0x8C, 0x5A}, {0x8C, 0xA9}, /* 0x60-0x63 */ + {0x8C, 0xAC}, {0x8C, 0xAB}, {0x8C, 0xA8}, {0x8C, 0xAA}, /* 0x64-0x67 */ + {0x8C, 0xA7}, {0x8D, 0x67}, {0x8D, 0x66}, {0x8D, 0xBE}, /* 0x68-0x6B */ + {0x8D, 0xBA}, {0x8E, 0xDB}, {0x8E, 0xDF}, {0x90, 0x19}, /* 0x6C-0x6F */ + {0x90, 0x0D}, {0x90, 0x1A}, {0x90, 0x17}, {0x90, 0x23}, /* 0x70-0x73 */ + {0x90, 0x1F}, {0x90, 0x1D}, {0x90, 0x10}, {0x90, 0x15}, /* 0x74-0x77 */ + {0x90, 0x1E}, {0x90, 0x20}, {0x90, 0x0F}, {0x90, 0x22}, /* 0x78-0x7B */ + {0x90, 0x16}, {0x90, 0x1B}, {0x90, 0x14}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x90, 0xE8}, {0x90, 0xED}, {0x90, 0xFD}, /* 0xA0-0xA3 */ + {0x91, 0x57}, {0x91, 0xCE}, {0x91, 0xF5}, {0x91, 0xE6}, /* 0xA4-0xA7 */ + {0x91, 0xE3}, {0x91, 0xE7}, {0x91, 0xED}, {0x91, 0xE9}, /* 0xA8-0xAB */ + {0x95, 0x89}, {0x96, 0x6A}, {0x96, 0x75}, {0x96, 0x73}, /* 0xAC-0xAF */ + {0x96, 0x78}, {0x96, 0x70}, {0x96, 0x74}, {0x96, 0x76}, /* 0xB0-0xB3 */ + {0x96, 0x77}, {0x96, 0x6C}, {0x96, 0xC0}, {0x96, 0xEA}, /* 0xB4-0xB7 */ + {0x96, 0xE9}, {0x7A, 0xE0}, {0x7A, 0xDF}, {0x98, 0x02}, /* 0xB8-0xBB */ + {0x98, 0x03}, {0x9B, 0x5A}, {0x9C, 0xE5}, {0x9E, 0x75}, /* 0xBC-0xBF */ + {0x9E, 0x7F}, {0x9E, 0xA5}, {0x9E, 0xBB}, {0x50, 0xA2}, /* 0xC0-0xC3 */ + {0x50, 0x8D}, {0x50, 0x85}, {0x50, 0x99}, {0x50, 0x91}, /* 0xC4-0xC7 */ + {0x50, 0x80}, {0x50, 0x96}, {0x50, 0x98}, {0x50, 0x9A}, /* 0xC8-0xCB */ + {0x67, 0x00}, {0x51, 0xF1}, {0x52, 0x72}, {0x52, 0x74}, /* 0xCC-0xCF */ + {0x52, 0x75}, {0x52, 0x69}, {0x52, 0xDE}, {0x52, 0xDD}, /* 0xD0-0xD3 */ + {0x52, 0xDB}, {0x53, 0x5A}, {0x53, 0xA5}, {0x55, 0x7B}, /* 0xD4-0xD7 */ + {0x55, 0x80}, {0x55, 0xA7}, {0x55, 0x7C}, {0x55, 0x8A}, /* 0xD8-0xDB */ + {0x55, 0x9D}, {0x55, 0x98}, {0x55, 0x82}, {0x55, 0x9C}, /* 0xDC-0xDF */ + {0x55, 0xAA}, {0x55, 0x94}, {0x55, 0x87}, {0x55, 0x8B}, /* 0xE0-0xE3 */ + {0x55, 0x83}, {0x55, 0xB3}, {0x55, 0xAE}, {0x55, 0x9F}, /* 0xE4-0xE7 */ + {0x55, 0x3E}, {0x55, 0xB2}, {0x55, 0x9A}, {0x55, 0xBB}, /* 0xE8-0xEB */ + {0x55, 0xAC}, {0x55, 0xB1}, {0x55, 0x7E}, {0x55, 0x89}, /* 0xEC-0xEF */ + {0x55, 0xAB}, {0x55, 0x99}, {0x57, 0x0D}, {0x58, 0x2F}, /* 0xF0-0xF3 */ + {0x58, 0x2A}, {0x58, 0x34}, {0x58, 0x24}, {0x58, 0x30}, /* 0xF4-0xF7 */ + {0x58, 0x31}, {0x58, 0x21}, {0x58, 0x1D}, {0x58, 0x20}, /* 0xF8-0xFB */ + {0x58, 0xF9}, {0x58, 0xFA}, {0x59, 0x60}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5A, 0x77}, {0x5A, 0x9A}, {0x5A, 0x7F}, {0x5A, 0x92}, /* 0x40-0x43 */ + {0x5A, 0x9B}, {0x5A, 0xA7}, {0x5B, 0x73}, {0x5B, 0x71}, /* 0x44-0x47 */ + {0x5B, 0xD2}, {0x5B, 0xCC}, {0x5B, 0xD3}, {0x5B, 0xD0}, /* 0x48-0x4B */ + {0x5C, 0x0A}, {0x5C, 0x0B}, {0x5C, 0x31}, {0x5D, 0x4C}, /* 0x4C-0x4F */ + {0x5D, 0x50}, {0x5D, 0x34}, {0x5D, 0x47}, {0x5D, 0xFD}, /* 0x50-0x53 */ + {0x5E, 0x45}, {0x5E, 0x3D}, {0x5E, 0x40}, {0x5E, 0x43}, /* 0x54-0x57 */ + {0x5E, 0x7E}, {0x5E, 0xCA}, {0x5E, 0xC1}, {0x5E, 0xC2}, /* 0x58-0x5B */ + {0x5E, 0xC4}, {0x5F, 0x3C}, {0x5F, 0x6D}, {0x5F, 0xA9}, /* 0x5C-0x5F */ + {0x5F, 0xAA}, {0x5F, 0xA8}, {0x60, 0xD1}, {0x60, 0xE1}, /* 0x60-0x63 */ + {0x60, 0xB2}, {0x60, 0xB6}, {0x60, 0xE0}, {0x61, 0x1C}, /* 0x64-0x67 */ + {0x61, 0x23}, {0x60, 0xFA}, {0x61, 0x15}, {0x60, 0xF0}, /* 0x68-0x6B */ + {0x60, 0xFB}, {0x60, 0xF4}, {0x61, 0x68}, {0x60, 0xF1}, /* 0x6C-0x6F */ + {0x61, 0x0E}, {0x60, 0xF6}, {0x61, 0x09}, {0x61, 0x00}, /* 0x70-0x73 */ + {0x61, 0x12}, {0x62, 0x1F}, {0x62, 0x49}, {0x63, 0xA3}, /* 0x74-0x77 */ + {0x63, 0x8C}, {0x63, 0xCF}, {0x63, 0xC0}, {0x63, 0xE9}, /* 0x78-0x7B */ + {0x63, 0xC9}, {0x63, 0xC6}, {0x63, 0xCD}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x63, 0xD2}, {0x63, 0xE3}, {0x63, 0xD0}, /* 0xA0-0xA3 */ + {0x63, 0xE1}, {0x63, 0xD6}, {0x63, 0xED}, {0x63, 0xEE}, /* 0xA4-0xA7 */ + {0x63, 0x76}, {0x63, 0xF4}, {0x63, 0xEA}, {0x63, 0xDB}, /* 0xA8-0xAB */ + {0x64, 0x52}, {0x63, 0xDA}, {0x63, 0xF9}, {0x65, 0x5E}, /* 0xAC-0xAF */ + {0x65, 0x66}, {0x65, 0x62}, {0x65, 0x63}, {0x65, 0x91}, /* 0xB0-0xB3 */ + {0x65, 0x90}, {0x65, 0xAF}, {0x66, 0x6E}, {0x66, 0x70}, /* 0xB4-0xB7 */ + {0x66, 0x74}, {0x66, 0x76}, {0x66, 0x6F}, {0x66, 0x91}, /* 0xB8-0xBB */ + {0x66, 0x7A}, {0x66, 0x7E}, {0x66, 0x77}, {0x66, 0xFE}, /* 0xBC-0xBF */ + {0x66, 0xFF}, {0x67, 0x1F}, {0x67, 0x1D}, {0x68, 0xFA}, /* 0xC0-0xC3 */ + {0x68, 0xD5}, {0x68, 0xE0}, {0x68, 0xD8}, {0x68, 0xD7}, /* 0xC4-0xC7 */ + {0x69, 0x05}, {0x68, 0xDF}, {0x68, 0xF5}, {0x68, 0xEE}, /* 0xC8-0xCB */ + {0x68, 0xE7}, {0x68, 0xF9}, {0x68, 0xD2}, {0x68, 0xF2}, /* 0xCC-0xCF */ + {0x68, 0xE3}, {0x68, 0xCB}, {0x68, 0xCD}, {0x69, 0x0D}, /* 0xD0-0xD3 */ + {0x69, 0x12}, {0x69, 0x0E}, {0x68, 0xC9}, {0x68, 0xDA}, /* 0xD4-0xD7 */ + {0x69, 0x6E}, {0x68, 0xFB}, {0x6B, 0x3E}, {0x6B, 0x3A}, /* 0xD8-0xDB */ + {0x6B, 0x3D}, {0x6B, 0x98}, {0x6B, 0x96}, {0x6B, 0xBC}, /* 0xDC-0xDF */ + {0x6B, 0xEF}, {0x6C, 0x2E}, {0x6C, 0x2F}, {0x6C, 0x2C}, /* 0xE0-0xE3 */ + {0x6E, 0x2F}, {0x6E, 0x38}, {0x6E, 0x54}, {0x6E, 0x21}, /* 0xE4-0xE7 */ + {0x6E, 0x32}, {0x6E, 0x67}, {0x6E, 0x4A}, {0x6E, 0x20}, /* 0xE8-0xEB */ + {0x6E, 0x25}, {0x6E, 0x23}, {0x6E, 0x1B}, {0x6E, 0x5B}, /* 0xEC-0xEF */ + {0x6E, 0x58}, {0x6E, 0x24}, {0x6E, 0x56}, {0x6E, 0x6E}, /* 0xF0-0xF3 */ + {0x6E, 0x2D}, {0x6E, 0x26}, {0x6E, 0x6F}, {0x6E, 0x34}, /* 0xF4-0xF7 */ + {0x6E, 0x4D}, {0x6E, 0x3A}, {0x6E, 0x2C}, {0x6E, 0x43}, /* 0xF8-0xFB */ + {0x6E, 0x1D}, {0x6E, 0x3E}, {0x6E, 0xCB}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6E, 0x89}, {0x6E, 0x19}, {0x6E, 0x4E}, {0x6E, 0x63}, /* 0x40-0x43 */ + {0x6E, 0x44}, {0x6E, 0x72}, {0x6E, 0x69}, {0x6E, 0x5F}, /* 0x44-0x47 */ + {0x71, 0x19}, {0x71, 0x1A}, {0x71, 0x26}, {0x71, 0x30}, /* 0x48-0x4B */ + {0x71, 0x21}, {0x71, 0x36}, {0x71, 0x6E}, {0x71, 0x1C}, /* 0x4C-0x4F */ + {0x72, 0x4C}, {0x72, 0x84}, {0x72, 0x80}, {0x73, 0x36}, /* 0x50-0x53 */ + {0x73, 0x25}, {0x73, 0x34}, {0x73, 0x29}, {0x74, 0x3A}, /* 0x54-0x57 */ + {0x74, 0x2A}, {0x74, 0x33}, {0x74, 0x22}, {0x74, 0x25}, /* 0x58-0x5B */ + {0x74, 0x35}, {0x74, 0x36}, {0x74, 0x34}, {0x74, 0x2F}, /* 0x5C-0x5F */ + {0x74, 0x1B}, {0x74, 0x26}, {0x74, 0x28}, {0x75, 0x25}, /* 0x60-0x63 */ + {0x75, 0x26}, {0x75, 0x6B}, {0x75, 0x6A}, {0x75, 0xE2}, /* 0x64-0x67 */ + {0x75, 0xDB}, {0x75, 0xE3}, {0x75, 0xD9}, {0x75, 0xD8}, /* 0x68-0x6B */ + {0x75, 0xDE}, {0x75, 0xE0}, {0x76, 0x7B}, {0x76, 0x7C}, /* 0x6C-0x6F */ + {0x76, 0x96}, {0x76, 0x93}, {0x76, 0xB4}, {0x76, 0xDC}, /* 0x70-0x73 */ + {0x77, 0x4F}, {0x77, 0xED}, {0x78, 0x5D}, {0x78, 0x6C}, /* 0x74-0x77 */ + {0x78, 0x6F}, {0x7A, 0x0D}, {0x7A, 0x08}, {0x7A, 0x0B}, /* 0x78-0x7B */ + {0x7A, 0x05}, {0x7A, 0x00}, {0x7A, 0x98}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x7A, 0x97}, {0x7A, 0x96}, {0x7A, 0xE5}, /* 0xA0-0xA3 */ + {0x7A, 0xE3}, {0x7B, 0x49}, {0x7B, 0x56}, {0x7B, 0x46}, /* 0xA4-0xA7 */ + {0x7B, 0x50}, {0x7B, 0x52}, {0x7B, 0x54}, {0x7B, 0x4D}, /* 0xA8-0xAB */ + {0x7B, 0x4B}, {0x7B, 0x4F}, {0x7B, 0x51}, {0x7C, 0x9F}, /* 0xAC-0xAF */ + {0x7C, 0xA5}, {0x7D, 0x5E}, {0x7D, 0x50}, {0x7D, 0x68}, /* 0xB0-0xB3 */ + {0x7D, 0x55}, {0x7D, 0x2B}, {0x7D, 0x6E}, {0x7D, 0x72}, /* 0xB4-0xB7 */ + {0x7D, 0x61}, {0x7D, 0x66}, {0x7D, 0x62}, {0x7D, 0x70}, /* 0xB8-0xBB */ + {0x7D, 0x73}, {0x55, 0x84}, {0x7F, 0xD4}, {0x7F, 0xD5}, /* 0xBC-0xBF */ + {0x80, 0x0B}, {0x80, 0x52}, {0x80, 0x85}, {0x81, 0x55}, /* 0xC0-0xC3 */ + {0x81, 0x54}, {0x81, 0x4B}, {0x81, 0x51}, {0x81, 0x4E}, /* 0xC4-0xC7 */ + {0x81, 0x39}, {0x81, 0x46}, {0x81, 0x3E}, {0x81, 0x4C}, /* 0xC8-0xCB */ + {0x81, 0x53}, {0x81, 0x74}, {0x82, 0x12}, {0x82, 0x1C}, /* 0xCC-0xCF */ + {0x83, 0xE9}, {0x84, 0x03}, {0x83, 0xF8}, {0x84, 0x0D}, /* 0xD0-0xD3 */ + {0x83, 0xE0}, {0x83, 0xC5}, {0x84, 0x0B}, {0x83, 0xC1}, /* 0xD4-0xD7 */ + {0x83, 0xEF}, {0x83, 0xF1}, {0x83, 0xF4}, {0x84, 0x57}, /* 0xD8-0xDB */ + {0x84, 0x0A}, {0x83, 0xF0}, {0x84, 0x0C}, {0x83, 0xCC}, /* 0xDC-0xDF */ + {0x83, 0xFD}, {0x83, 0xF2}, {0x83, 0xCA}, {0x84, 0x38}, /* 0xE0-0xE3 */ + {0x84, 0x0E}, {0x84, 0x04}, {0x83, 0xDC}, {0x84, 0x07}, /* 0xE4-0xE7 */ + {0x83, 0xD4}, {0x83, 0xDF}, {0x86, 0x5B}, {0x86, 0xDF}, /* 0xE8-0xEB */ + {0x86, 0xD9}, {0x86, 0xED}, {0x86, 0xD4}, {0x86, 0xDB}, /* 0xEC-0xEF */ + {0x86, 0xE4}, {0x86, 0xD0}, {0x86, 0xDE}, {0x88, 0x57}, /* 0xF0-0xF3 */ + {0x88, 0xC1}, {0x88, 0xC2}, {0x88, 0xB1}, {0x89, 0x83}, /* 0xF4-0xF7 */ + {0x89, 0x96}, {0x8A, 0x3B}, {0x8A, 0x60}, {0x8A, 0x55}, /* 0xF8-0xFB */ + {0x8A, 0x5E}, {0x8A, 0x3C}, {0x8A, 0x41}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8A, 0x54}, {0x8A, 0x5B}, {0x8A, 0x50}, {0x8A, 0x46}, /* 0x40-0x43 */ + {0x8A, 0x34}, {0x8A, 0x3A}, {0x8A, 0x36}, {0x8A, 0x56}, /* 0x44-0x47 */ + {0x8C, 0x61}, {0x8C, 0x82}, {0x8C, 0xAF}, {0x8C, 0xBC}, /* 0x48-0x4B */ + {0x8C, 0xB3}, {0x8C, 0xBD}, {0x8C, 0xC1}, {0x8C, 0xBB}, /* 0x4C-0x4F */ + {0x8C, 0xC0}, {0x8C, 0xB4}, {0x8C, 0xB7}, {0x8C, 0xB6}, /* 0x50-0x53 */ + {0x8C, 0xBF}, {0x8C, 0xB8}, {0x8D, 0x8A}, {0x8D, 0x85}, /* 0x54-0x57 */ + {0x8D, 0x81}, {0x8D, 0xCE}, {0x8D, 0xDD}, {0x8D, 0xCB}, /* 0x58-0x5B */ + {0x8D, 0xDA}, {0x8D, 0xD1}, {0x8D, 0xCC}, {0x8D, 0xDB}, /* 0x5C-0x5F */ + {0x8D, 0xC6}, {0x8E, 0xFB}, {0x8E, 0xF8}, {0x8E, 0xFC}, /* 0x60-0x63 */ + {0x8F, 0x9C}, {0x90, 0x2E}, {0x90, 0x35}, {0x90, 0x31}, /* 0x64-0x67 */ + {0x90, 0x38}, {0x90, 0x32}, {0x90, 0x36}, {0x91, 0x02}, /* 0x68-0x6B */ + {0x90, 0xF5}, {0x91, 0x09}, {0x90, 0xFE}, {0x91, 0x63}, /* 0x6C-0x6F */ + {0x91, 0x65}, {0x91, 0xCF}, {0x92, 0x14}, {0x92, 0x15}, /* 0x70-0x73 */ + {0x92, 0x23}, {0x92, 0x09}, {0x92, 0x1E}, {0x92, 0x0D}, /* 0x74-0x77 */ + {0x92, 0x10}, {0x92, 0x07}, {0x92, 0x11}, {0x95, 0x94}, /* 0x78-0x7B */ + {0x95, 0x8F}, {0x95, 0x8B}, {0x95, 0x91}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x95, 0x93}, {0x95, 0x92}, {0x95, 0x8E}, /* 0xA0-0xA3 */ + {0x96, 0x8A}, {0x96, 0x8E}, {0x96, 0x8B}, {0x96, 0x7D}, /* 0xA4-0xA7 */ + {0x96, 0x85}, {0x96, 0x86}, {0x96, 0x8D}, {0x96, 0x72}, /* 0xA8-0xAB */ + {0x96, 0x84}, {0x96, 0xC1}, {0x96, 0xC5}, {0x96, 0xC4}, /* 0xAC-0xAF */ + {0x96, 0xC6}, {0x96, 0xC7}, {0x96, 0xEF}, {0x96, 0xF2}, /* 0xB0-0xB3 */ + {0x97, 0xCC}, {0x98, 0x05}, {0x98, 0x06}, {0x98, 0x08}, /* 0xB4-0xB7 */ + {0x98, 0xE7}, {0x98, 0xEA}, {0x98, 0xEF}, {0x98, 0xE9}, /* 0xB8-0xBB */ + {0x98, 0xF2}, {0x98, 0xED}, {0x99, 0xAE}, {0x99, 0xAD}, /* 0xBC-0xBF */ + {0x9E, 0xC3}, {0x9E, 0xCD}, {0x9E, 0xD1}, {0x4E, 0x82}, /* 0xC0-0xC3 */ + {0x50, 0xAD}, {0x50, 0xB5}, {0x50, 0xB2}, {0x50, 0xB3}, /* 0xC4-0xC7 */ + {0x50, 0xC5}, {0x50, 0xBE}, {0x50, 0xAC}, {0x50, 0xB7}, /* 0xC8-0xCB */ + {0x50, 0xBB}, {0x50, 0xAF}, {0x50, 0xC7}, {0x52, 0x7F}, /* 0xCC-0xCF */ + {0x52, 0x77}, {0x52, 0x7D}, {0x52, 0xDF}, {0x52, 0xE6}, /* 0xD0-0xD3 */ + {0x52, 0xE4}, {0x52, 0xE2}, {0x52, 0xE3}, {0x53, 0x2F}, /* 0xD4-0xD7 */ + {0x55, 0xDF}, {0x55, 0xE8}, {0x55, 0xD3}, {0x55, 0xE6}, /* 0xD8-0xDB */ + {0x55, 0xCE}, {0x55, 0xDC}, {0x55, 0xC7}, {0x55, 0xD1}, /* 0xDC-0xDF */ + {0x55, 0xE3}, {0x55, 0xE4}, {0x55, 0xEF}, {0x55, 0xDA}, /* 0xE0-0xE3 */ + {0x55, 0xE1}, {0x55, 0xC5}, {0x55, 0xC6}, {0x55, 0xE5}, /* 0xE4-0xE7 */ + {0x55, 0xC9}, {0x57, 0x12}, {0x57, 0x13}, {0x58, 0x5E}, /* 0xE8-0xEB */ + {0x58, 0x51}, {0x58, 0x58}, {0x58, 0x57}, {0x58, 0x5A}, /* 0xEC-0xEF */ + {0x58, 0x54}, {0x58, 0x6B}, {0x58, 0x4C}, {0x58, 0x6D}, /* 0xF0-0xF3 */ + {0x58, 0x4A}, {0x58, 0x62}, {0x58, 0x52}, {0x58, 0x4B}, /* 0xF4-0xF7 */ + {0x59, 0x67}, {0x5A, 0xC1}, {0x5A, 0xC9}, {0x5A, 0xCC}, /* 0xF8-0xFB */ + {0x5A, 0xBE}, {0x5A, 0xBD}, {0x5A, 0xBC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5A, 0xB3}, {0x5A, 0xC2}, {0x5A, 0xB2}, {0x5D, 0x69}, /* 0x40-0x43 */ + {0x5D, 0x6F}, {0x5E, 0x4C}, {0x5E, 0x79}, {0x5E, 0xC9}, /* 0x44-0x47 */ + {0x5E, 0xC8}, {0x5F, 0x12}, {0x5F, 0x59}, {0x5F, 0xAC}, /* 0x48-0x4B */ + {0x5F, 0xAE}, {0x61, 0x1A}, {0x61, 0x0F}, {0x61, 0x48}, /* 0x4C-0x4F */ + {0x61, 0x1F}, {0x60, 0xF3}, {0x61, 0x1B}, {0x60, 0xF9}, /* 0x50-0x53 */ + {0x61, 0x01}, {0x61, 0x08}, {0x61, 0x4E}, {0x61, 0x4C}, /* 0x54-0x57 */ + {0x61, 0x44}, {0x61, 0x4D}, {0x61, 0x3E}, {0x61, 0x34}, /* 0x58-0x5B */ + {0x61, 0x27}, {0x61, 0x0D}, {0x61, 0x06}, {0x61, 0x37}, /* 0x5C-0x5F */ + {0x62, 0x21}, {0x62, 0x22}, {0x64, 0x13}, {0x64, 0x3E}, /* 0x60-0x63 */ + {0x64, 0x1E}, {0x64, 0x2A}, {0x64, 0x2D}, {0x64, 0x3D}, /* 0x64-0x67 */ + {0x64, 0x2C}, {0x64, 0x0F}, {0x64, 0x1C}, {0x64, 0x14}, /* 0x68-0x6B */ + {0x64, 0x0D}, {0x64, 0x36}, {0x64, 0x16}, {0x64, 0x17}, /* 0x6C-0x6F */ + {0x64, 0x06}, {0x65, 0x6C}, {0x65, 0x9F}, {0x65, 0xB0}, /* 0x70-0x73 */ + {0x66, 0x97}, {0x66, 0x89}, {0x66, 0x87}, {0x66, 0x88}, /* 0x74-0x77 */ + {0x66, 0x96}, {0x66, 0x84}, {0x66, 0x98}, {0x66, 0x8D}, /* 0x78-0x7B */ + {0x67, 0x03}, {0x69, 0x94}, {0x69, 0x6D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x69, 0x5A}, {0x69, 0x77}, {0x69, 0x60}, /* 0xA0-0xA3 */ + {0x69, 0x54}, {0x69, 0x75}, {0x69, 0x30}, {0x69, 0x82}, /* 0xA4-0xA7 */ + {0x69, 0x4A}, {0x69, 0x68}, {0x69, 0x6B}, {0x69, 0x5E}, /* 0xA8-0xAB */ + {0x69, 0x53}, {0x69, 0x79}, {0x69, 0x86}, {0x69, 0x5D}, /* 0xAC-0xAF */ + {0x69, 0x63}, {0x69, 0x5B}, {0x6B, 0x47}, {0x6B, 0x72}, /* 0xB0-0xB3 */ + {0x6B, 0xC0}, {0x6B, 0xBF}, {0x6B, 0xD3}, {0x6B, 0xFD}, /* 0xB4-0xB7 */ + {0x6E, 0xA2}, {0x6E, 0xAF}, {0x6E, 0xD3}, {0x6E, 0xB6}, /* 0xB8-0xBB */ + {0x6E, 0xC2}, {0x6E, 0x90}, {0x6E, 0x9D}, {0x6E, 0xC7}, /* 0xBC-0xBF */ + {0x6E, 0xC5}, {0x6E, 0xA5}, {0x6E, 0x98}, {0x6E, 0xBC}, /* 0xC0-0xC3 */ + {0x6E, 0xBA}, {0x6E, 0xAB}, {0x6E, 0xD1}, {0x6E, 0x96}, /* 0xC4-0xC7 */ + {0x6E, 0x9C}, {0x6E, 0xC4}, {0x6E, 0xD4}, {0x6E, 0xAA}, /* 0xC8-0xCB */ + {0x6E, 0xA7}, {0x6E, 0xB4}, {0x71, 0x4E}, {0x71, 0x59}, /* 0xCC-0xCF */ + {0x71, 0x69}, {0x71, 0x64}, {0x71, 0x49}, {0x71, 0x67}, /* 0xD0-0xD3 */ + {0x71, 0x5C}, {0x71, 0x6C}, {0x71, 0x66}, {0x71, 0x4C}, /* 0xD4-0xD7 */ + {0x71, 0x65}, {0x71, 0x5E}, {0x71, 0x46}, {0x71, 0x68}, /* 0xD8-0xDB */ + {0x71, 0x56}, {0x72, 0x3A}, {0x72, 0x52}, {0x73, 0x37}, /* 0xDC-0xDF */ + {0x73, 0x45}, {0x73, 0x3F}, {0x73, 0x3E}, {0x74, 0x6F}, /* 0xE0-0xE3 */ + {0x74, 0x5A}, {0x74, 0x55}, {0x74, 0x5F}, {0x74, 0x5E}, /* 0xE4-0xE7 */ + {0x74, 0x41}, {0x74, 0x3F}, {0x74, 0x59}, {0x74, 0x5B}, /* 0xE8-0xEB */ + {0x74, 0x5C}, {0x75, 0x76}, {0x75, 0x78}, {0x76, 0x00}, /* 0xEC-0xEF */ + {0x75, 0xF0}, {0x76, 0x01}, {0x75, 0xF2}, {0x75, 0xF1}, /* 0xF0-0xF3 */ + {0x75, 0xFA}, {0x75, 0xFF}, {0x75, 0xF4}, {0x75, 0xF3}, /* 0xF4-0xF7 */ + {0x76, 0xDE}, {0x76, 0xDF}, {0x77, 0x5B}, {0x77, 0x6B}, /* 0xF8-0xFB */ + {0x77, 0x66}, {0x77, 0x5E}, {0x77, 0x63}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x77, 0x79}, {0x77, 0x6A}, {0x77, 0x6C}, {0x77, 0x5C}, /* 0x40-0x43 */ + {0x77, 0x65}, {0x77, 0x68}, {0x77, 0x62}, {0x77, 0xEE}, /* 0x44-0x47 */ + {0x78, 0x8E}, {0x78, 0xB0}, {0x78, 0x97}, {0x78, 0x98}, /* 0x48-0x4B */ + {0x78, 0x8C}, {0x78, 0x89}, {0x78, 0x7C}, {0x78, 0x91}, /* 0x4C-0x4F */ + {0x78, 0x93}, {0x78, 0x7F}, {0x79, 0x7A}, {0x79, 0x7F}, /* 0x50-0x53 */ + {0x79, 0x81}, {0x84, 0x2C}, {0x79, 0xBD}, {0x7A, 0x1C}, /* 0x54-0x57 */ + {0x7A, 0x1A}, {0x7A, 0x20}, {0x7A, 0x14}, {0x7A, 0x1F}, /* 0x58-0x5B */ + {0x7A, 0x1E}, {0x7A, 0x9F}, {0x7A, 0xA0}, {0x7B, 0x77}, /* 0x5C-0x5F */ + {0x7B, 0xC0}, {0x7B, 0x60}, {0x7B, 0x6E}, {0x7B, 0x67}, /* 0x60-0x63 */ + {0x7C, 0xB1}, {0x7C, 0xB3}, {0x7C, 0xB5}, {0x7D, 0x93}, /* 0x64-0x67 */ + {0x7D, 0x79}, {0x7D, 0x91}, {0x7D, 0x81}, {0x7D, 0x8F}, /* 0x68-0x6B */ + {0x7D, 0x5B}, {0x7F, 0x6E}, {0x7F, 0x69}, {0x7F, 0x6A}, /* 0x6C-0x6F */ + {0x7F, 0x72}, {0x7F, 0xA9}, {0x7F, 0xA8}, {0x7F, 0xA4}, /* 0x70-0x73 */ + {0x80, 0x56}, {0x80, 0x58}, {0x80, 0x86}, {0x80, 0x84}, /* 0x74-0x77 */ + {0x81, 0x71}, {0x81, 0x70}, {0x81, 0x78}, {0x81, 0x65}, /* 0x78-0x7B */ + {0x81, 0x6E}, {0x81, 0x73}, {0x81, 0x6B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x81, 0x79}, {0x81, 0x7A}, {0x81, 0x66}, /* 0xA0-0xA3 */ + {0x82, 0x05}, {0x82, 0x47}, {0x84, 0x82}, {0x84, 0x77}, /* 0xA4-0xA7 */ + {0x84, 0x3D}, {0x84, 0x31}, {0x84, 0x75}, {0x84, 0x66}, /* 0xA8-0xAB */ + {0x84, 0x6B}, {0x84, 0x49}, {0x84, 0x6C}, {0x84, 0x5B}, /* 0xAC-0xAF */ + {0x84, 0x3C}, {0x84, 0x35}, {0x84, 0x61}, {0x84, 0x63}, /* 0xB0-0xB3 */ + {0x84, 0x69}, {0x84, 0x6D}, {0x84, 0x46}, {0x86, 0x5E}, /* 0xB4-0xB7 */ + {0x86, 0x5C}, {0x86, 0x5F}, {0x86, 0xF9}, {0x87, 0x13}, /* 0xB8-0xBB */ + {0x87, 0x08}, {0x87, 0x07}, {0x87, 0x00}, {0x86, 0xFE}, /* 0xBC-0xBF */ + {0x86, 0xFB}, {0x87, 0x02}, {0x87, 0x03}, {0x87, 0x06}, /* 0xC0-0xC3 */ + {0x87, 0x0A}, {0x88, 0x59}, {0x88, 0xDF}, {0x88, 0xD4}, /* 0xC4-0xC7 */ + {0x88, 0xD9}, {0x88, 0xDC}, {0x88, 0xD8}, {0x88, 0xDD}, /* 0xC8-0xCB */ + {0x88, 0xE1}, {0x88, 0xCA}, {0x88, 0xD5}, {0x88, 0xD2}, /* 0xCC-0xCF */ + {0x89, 0x9C}, {0x89, 0xE3}, {0x8A, 0x6B}, {0x8A, 0x72}, /* 0xD0-0xD3 */ + {0x8A, 0x73}, {0x8A, 0x66}, {0x8A, 0x69}, {0x8A, 0x70}, /* 0xD4-0xD7 */ + {0x8A, 0x87}, {0x8A, 0x7C}, {0x8A, 0x63}, {0x8A, 0xA0}, /* 0xD8-0xDB */ + {0x8A, 0x71}, {0x8A, 0x85}, {0x8A, 0x6D}, {0x8A, 0x62}, /* 0xDC-0xDF */ + {0x8A, 0x6E}, {0x8A, 0x6C}, {0x8A, 0x79}, {0x8A, 0x7B}, /* 0xE0-0xE3 */ + {0x8A, 0x3E}, {0x8A, 0x68}, {0x8C, 0x62}, {0x8C, 0x8A}, /* 0xE4-0xE7 */ + {0x8C, 0x89}, {0x8C, 0xCA}, {0x8C, 0xC7}, {0x8C, 0xC8}, /* 0xE8-0xEB */ + {0x8C, 0xC4}, {0x8C, 0xB2}, {0x8C, 0xC3}, {0x8C, 0xC2}, /* 0xEC-0xEF */ + {0x8C, 0xC5}, {0x8D, 0xE1}, {0x8D, 0xDF}, {0x8D, 0xE8}, /* 0xF0-0xF3 */ + {0x8D, 0xEF}, {0x8D, 0xF3}, {0x8D, 0xFA}, {0x8D, 0xEA}, /* 0xF4-0xF7 */ + {0x8D, 0xE4}, {0x8D, 0xE6}, {0x8E, 0xB2}, {0x8F, 0x03}, /* 0xF8-0xFB */ + {0x8F, 0x09}, {0x8E, 0xFE}, {0x8F, 0x0A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_B9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8F, 0x9F}, {0x8F, 0xB2}, {0x90, 0x4B}, {0x90, 0x4A}, /* 0x40-0x43 */ + {0x90, 0x53}, {0x90, 0x42}, {0x90, 0x54}, {0x90, 0x3C}, /* 0x44-0x47 */ + {0x90, 0x55}, {0x90, 0x50}, {0x90, 0x47}, {0x90, 0x4F}, /* 0x48-0x4B */ + {0x90, 0x4E}, {0x90, 0x4D}, {0x90, 0x51}, {0x90, 0x3E}, /* 0x4C-0x4F */ + {0x90, 0x41}, {0x91, 0x12}, {0x91, 0x17}, {0x91, 0x6C}, /* 0x50-0x53 */ + {0x91, 0x6A}, {0x91, 0x69}, {0x91, 0xC9}, {0x92, 0x37}, /* 0x54-0x57 */ + {0x92, 0x57}, {0x92, 0x38}, {0x92, 0x3D}, {0x92, 0x40}, /* 0x58-0x5B */ + {0x92, 0x3E}, {0x92, 0x5B}, {0x92, 0x4B}, {0x92, 0x64}, /* 0x5C-0x5F */ + {0x92, 0x51}, {0x92, 0x34}, {0x92, 0x49}, {0x92, 0x4D}, /* 0x60-0x63 */ + {0x92, 0x45}, {0x92, 0x39}, {0x92, 0x3F}, {0x92, 0x5A}, /* 0x64-0x67 */ + {0x95, 0x98}, {0x96, 0x98}, {0x96, 0x94}, {0x96, 0x95}, /* 0x68-0x6B */ + {0x96, 0xCD}, {0x96, 0xCB}, {0x96, 0xC9}, {0x96, 0xCA}, /* 0x6C-0x6F */ + {0x96, 0xF7}, {0x96, 0xFB}, {0x96, 0xF9}, {0x96, 0xF6}, /* 0x70-0x73 */ + {0x97, 0x56}, {0x97, 0x74}, {0x97, 0x76}, {0x98, 0x10}, /* 0x74-0x77 */ + {0x98, 0x11}, {0x98, 0x13}, {0x98, 0x0A}, {0x98, 0x12}, /* 0x78-0x7B */ + {0x98, 0x0C}, {0x98, 0xFC}, {0x98, 0xF4}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x98, 0xFD}, {0x98, 0xFE}, {0x99, 0xB3}, /* 0xA0-0xA3 */ + {0x99, 0xB1}, {0x99, 0xB4}, {0x9A, 0xE1}, {0x9C, 0xE9}, /* 0xA4-0xA7 */ + {0x9E, 0x82}, {0x9F, 0x0E}, {0x9F, 0x13}, {0x9F, 0x20}, /* 0xA8-0xAB */ + {0x50, 0xE7}, {0x50, 0xEE}, {0x50, 0xE5}, {0x50, 0xD6}, /* 0xAC-0xAF */ + {0x50, 0xED}, {0x50, 0xDA}, {0x50, 0xD5}, {0x50, 0xCF}, /* 0xB0-0xB3 */ + {0x50, 0xD1}, {0x50, 0xF1}, {0x50, 0xCE}, {0x50, 0xE9}, /* 0xB4-0xB7 */ + {0x51, 0x62}, {0x51, 0xF3}, {0x52, 0x83}, {0x52, 0x82}, /* 0xB8-0xBB */ + {0x53, 0x31}, {0x53, 0xAD}, {0x55, 0xFE}, {0x56, 0x00}, /* 0xBC-0xBF */ + {0x56, 0x1B}, {0x56, 0x17}, {0x55, 0xFD}, {0x56, 0x14}, /* 0xC0-0xC3 */ + {0x56, 0x06}, {0x56, 0x09}, {0x56, 0x0D}, {0x56, 0x0E}, /* 0xC4-0xC7 */ + {0x55, 0xF7}, {0x56, 0x16}, {0x56, 0x1F}, {0x56, 0x08}, /* 0xC8-0xCB */ + {0x56, 0x10}, {0x55, 0xF6}, {0x57, 0x18}, {0x57, 0x16}, /* 0xCC-0xCF */ + {0x58, 0x75}, {0x58, 0x7E}, {0x58, 0x83}, {0x58, 0x93}, /* 0xD0-0xD3 */ + {0x58, 0x8A}, {0x58, 0x79}, {0x58, 0x85}, {0x58, 0x7D}, /* 0xD4-0xD7 */ + {0x58, 0xFD}, {0x59, 0x25}, {0x59, 0x22}, {0x59, 0x24}, /* 0xD8-0xDB */ + {0x59, 0x6A}, {0x59, 0x69}, {0x5A, 0xE1}, {0x5A, 0xE6}, /* 0xDC-0xDF */ + {0x5A, 0xE9}, {0x5A, 0xD7}, {0x5A, 0xD6}, {0x5A, 0xD8}, /* 0xE0-0xE3 */ + {0x5A, 0xE3}, {0x5B, 0x75}, {0x5B, 0xDE}, {0x5B, 0xE7}, /* 0xE4-0xE7 */ + {0x5B, 0xE1}, {0x5B, 0xE5}, {0x5B, 0xE6}, {0x5B, 0xE8}, /* 0xE8-0xEB */ + {0x5B, 0xE2}, {0x5B, 0xE4}, {0x5B, 0xDF}, {0x5C, 0x0D}, /* 0xEC-0xEF */ + {0x5C, 0x62}, {0x5D, 0x84}, {0x5D, 0x87}, {0x5E, 0x5B}, /* 0xF0-0xF3 */ + {0x5E, 0x63}, {0x5E, 0x55}, {0x5E, 0x57}, {0x5E, 0x54}, /* 0xF4-0xF7 */ + {0x5E, 0xD3}, {0x5E, 0xD6}, {0x5F, 0x0A}, {0x5F, 0x46}, /* 0xF8-0xFB */ + {0x5F, 0x70}, {0x5F, 0xB9}, {0x61, 0x47}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x61, 0x3F}, {0x61, 0x4B}, {0x61, 0x77}, {0x61, 0x62}, /* 0x40-0x43 */ + {0x61, 0x63}, {0x61, 0x5F}, {0x61, 0x5A}, {0x61, 0x58}, /* 0x44-0x47 */ + {0x61, 0x75}, {0x62, 0x2A}, {0x64, 0x87}, {0x64, 0x58}, /* 0x48-0x4B */ + {0x64, 0x54}, {0x64, 0xA4}, {0x64, 0x78}, {0x64, 0x5F}, /* 0x4C-0x4F */ + {0x64, 0x7A}, {0x64, 0x51}, {0x64, 0x67}, {0x64, 0x34}, /* 0x50-0x53 */ + {0x64, 0x6D}, {0x64, 0x7B}, {0x65, 0x72}, {0x65, 0xA1}, /* 0x54-0x57 */ + {0x65, 0xD7}, {0x65, 0xD6}, {0x66, 0xA2}, {0x66, 0xA8}, /* 0x58-0x5B */ + {0x66, 0x9D}, {0x69, 0x9C}, {0x69, 0xA8}, {0x69, 0x95}, /* 0x5C-0x5F */ + {0x69, 0xC1}, {0x69, 0xAE}, {0x69, 0xD3}, {0x69, 0xCB}, /* 0x60-0x63 */ + {0x69, 0x9B}, {0x69, 0xB7}, {0x69, 0xBB}, {0x69, 0xAB}, /* 0x64-0x67 */ + {0x69, 0xB4}, {0x69, 0xD0}, {0x69, 0xCD}, {0x69, 0xAD}, /* 0x68-0x6B */ + {0x69, 0xCC}, {0x69, 0xA6}, {0x69, 0xC3}, {0x69, 0xA3}, /* 0x6C-0x6F */ + {0x6B, 0x49}, {0x6B, 0x4C}, {0x6C, 0x33}, {0x6F, 0x33}, /* 0x70-0x73 */ + {0x6F, 0x14}, {0x6E, 0xFE}, {0x6F, 0x13}, {0x6E, 0xF4}, /* 0x74-0x77 */ + {0x6F, 0x29}, {0x6F, 0x3E}, {0x6F, 0x20}, {0x6F, 0x2C}, /* 0x78-0x7B */ + {0x6F, 0x0F}, {0x6F, 0x02}, {0x6F, 0x22}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x6E, 0xFF}, {0x6E, 0xEF}, {0x6F, 0x06}, /* 0xA0-0xA3 */ + {0x6F, 0x31}, {0x6F, 0x38}, {0x6F, 0x32}, {0x6F, 0x23}, /* 0xA4-0xA7 */ + {0x6F, 0x15}, {0x6F, 0x2B}, {0x6F, 0x2F}, {0x6F, 0x88}, /* 0xA8-0xAB */ + {0x6F, 0x2A}, {0x6E, 0xEC}, {0x6F, 0x01}, {0x6E, 0xF2}, /* 0xAC-0xAF */ + {0x6E, 0xCC}, {0x6E, 0xF7}, {0x71, 0x94}, {0x71, 0x99}, /* 0xB0-0xB3 */ + {0x71, 0x7D}, {0x71, 0x8A}, {0x71, 0x84}, {0x71, 0x92}, /* 0xB4-0xB7 */ + {0x72, 0x3E}, {0x72, 0x92}, {0x72, 0x96}, {0x73, 0x44}, /* 0xB8-0xBB */ + {0x73, 0x50}, {0x74, 0x64}, {0x74, 0x63}, {0x74, 0x6A}, /* 0xBC-0xBF */ + {0x74, 0x70}, {0x74, 0x6D}, {0x75, 0x04}, {0x75, 0x91}, /* 0xC0-0xC3 */ + {0x76, 0x27}, {0x76, 0x0D}, {0x76, 0x0B}, {0x76, 0x09}, /* 0xC4-0xC7 */ + {0x76, 0x13}, {0x76, 0xE1}, {0x76, 0xE3}, {0x77, 0x84}, /* 0xC8-0xCB */ + {0x77, 0x7D}, {0x77, 0x7F}, {0x77, 0x61}, {0x78, 0xC1}, /* 0xCC-0xCF */ + {0x78, 0x9F}, {0x78, 0xA7}, {0x78, 0xB3}, {0x78, 0xA9}, /* 0xD0-0xD3 */ + {0x78, 0xA3}, {0x79, 0x8E}, {0x79, 0x8F}, {0x79, 0x8D}, /* 0xD4-0xD7 */ + {0x7A, 0x2E}, {0x7A, 0x31}, {0x7A, 0xAA}, {0x7A, 0xA9}, /* 0xD8-0xDB */ + {0x7A, 0xED}, {0x7A, 0xEF}, {0x7B, 0xA1}, {0x7B, 0x95}, /* 0xDC-0xDF */ + {0x7B, 0x8B}, {0x7B, 0x75}, {0x7B, 0x97}, {0x7B, 0x9D}, /* 0xE0-0xE3 */ + {0x7B, 0x94}, {0x7B, 0x8F}, {0x7B, 0xB8}, {0x7B, 0x87}, /* 0xE4-0xE7 */ + {0x7B, 0x84}, {0x7C, 0xB9}, {0x7C, 0xBD}, {0x7C, 0xBE}, /* 0xE8-0xEB */ + {0x7D, 0xBB}, {0x7D, 0xB0}, {0x7D, 0x9C}, {0x7D, 0xBD}, /* 0xEC-0xEF */ + {0x7D, 0xBE}, {0x7D, 0xA0}, {0x7D, 0xCA}, {0x7D, 0xB4}, /* 0xF0-0xF3 */ + {0x7D, 0xB2}, {0x7D, 0xB1}, {0x7D, 0xBA}, {0x7D, 0xA2}, /* 0xF4-0xF7 */ + {0x7D, 0xBF}, {0x7D, 0xB5}, {0x7D, 0xB8}, {0x7D, 0xAD}, /* 0xF8-0xFB */ + {0x7D, 0xD2}, {0x7D, 0xC7}, {0x7D, 0xAC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7F, 0x70}, {0x7F, 0xE0}, {0x7F, 0xE1}, {0x7F, 0xDF}, /* 0x40-0x43 */ + {0x80, 0x5E}, {0x80, 0x5A}, {0x80, 0x87}, {0x81, 0x50}, /* 0x44-0x47 */ + {0x81, 0x80}, {0x81, 0x8F}, {0x81, 0x88}, {0x81, 0x8A}, /* 0x48-0x4B */ + {0x81, 0x7F}, {0x81, 0x82}, {0x81, 0xE7}, {0x81, 0xFA}, /* 0x4C-0x4F */ + {0x82, 0x07}, {0x82, 0x14}, {0x82, 0x1E}, {0x82, 0x4B}, /* 0x50-0x53 */ + {0x84, 0xC9}, {0x84, 0xBF}, {0x84, 0xC6}, {0x84, 0xC4}, /* 0x54-0x57 */ + {0x84, 0x99}, {0x84, 0x9E}, {0x84, 0xB2}, {0x84, 0x9C}, /* 0x58-0x5B */ + {0x84, 0xCB}, {0x84, 0xB8}, {0x84, 0xC0}, {0x84, 0xD3}, /* 0x5C-0x5F */ + {0x84, 0x90}, {0x84, 0xBC}, {0x84, 0xD1}, {0x84, 0xCA}, /* 0x60-0x63 */ + {0x87, 0x3F}, {0x87, 0x1C}, {0x87, 0x3B}, {0x87, 0x22}, /* 0x64-0x67 */ + {0x87, 0x25}, {0x87, 0x34}, {0x87, 0x18}, {0x87, 0x55}, /* 0x68-0x6B */ + {0x87, 0x37}, {0x87, 0x29}, {0x88, 0xF3}, {0x89, 0x02}, /* 0x6C-0x6F */ + {0x88, 0xF4}, {0x88, 0xF9}, {0x88, 0xF8}, {0x88, 0xFD}, /* 0x70-0x73 */ + {0x88, 0xE8}, {0x89, 0x1A}, {0x88, 0xEF}, {0x8A, 0xA6}, /* 0x74-0x77 */ + {0x8A, 0x8C}, {0x8A, 0x9E}, {0x8A, 0xA3}, {0x8A, 0x8D}, /* 0x78-0x7B */ + {0x8A, 0xA1}, {0x8A, 0x93}, {0x8A, 0xA4}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x8A, 0xAA}, {0x8A, 0xA5}, {0x8A, 0xA8}, /* 0xA0-0xA3 */ + {0x8A, 0x98}, {0x8A, 0x91}, {0x8A, 0x9A}, {0x8A, 0xA7}, /* 0xA4-0xA7 */ + {0x8C, 0x6A}, {0x8C, 0x8D}, {0x8C, 0x8C}, {0x8C, 0xD3}, /* 0xA8-0xAB */ + {0x8C, 0xD1}, {0x8C, 0xD2}, {0x8D, 0x6B}, {0x8D, 0x99}, /* 0xAC-0xAF */ + {0x8D, 0x95}, {0x8D, 0xFC}, {0x8F, 0x14}, {0x8F, 0x12}, /* 0xB0-0xB3 */ + {0x8F, 0x15}, {0x8F, 0x13}, {0x8F, 0xA3}, {0x90, 0x60}, /* 0xB4-0xB7 */ + {0x90, 0x58}, {0x90, 0x5C}, {0x90, 0x63}, {0x90, 0x59}, /* 0xB8-0xBB */ + {0x90, 0x5E}, {0x90, 0x62}, {0x90, 0x5D}, {0x90, 0x5B}, /* 0xBC-0xBF */ + {0x91, 0x19}, {0x91, 0x18}, {0x91, 0x1E}, {0x91, 0x75}, /* 0xC0-0xC3 */ + {0x91, 0x78}, {0x91, 0x77}, {0x91, 0x74}, {0x92, 0x78}, /* 0xC4-0xC7 */ + {0x92, 0x80}, {0x92, 0x85}, {0x92, 0x98}, {0x92, 0x96}, /* 0xC8-0xCB */ + {0x92, 0x7B}, {0x92, 0x93}, {0x92, 0x9C}, {0x92, 0xA8}, /* 0xCC-0xCF */ + {0x92, 0x7C}, {0x92, 0x91}, {0x95, 0xA1}, {0x95, 0xA8}, /* 0xD0-0xD3 */ + {0x95, 0xA9}, {0x95, 0xA3}, {0x95, 0xA5}, {0x95, 0xA4}, /* 0xD4-0xD7 */ + {0x96, 0x99}, {0x96, 0x9C}, {0x96, 0x9B}, {0x96, 0xCC}, /* 0xD8-0xDB */ + {0x96, 0xD2}, {0x97, 0x00}, {0x97, 0x7C}, {0x97, 0x85}, /* 0xDC-0xDF */ + {0x97, 0xF6}, {0x98, 0x17}, {0x98, 0x18}, {0x98, 0xAF}, /* 0xE0-0xE3 */ + {0x98, 0xB1}, {0x99, 0x03}, {0x99, 0x05}, {0x99, 0x0C}, /* 0xE4-0xE7 */ + {0x99, 0x09}, {0x99, 0xC1}, {0x9A, 0xAF}, {0x9A, 0xB0}, /* 0xE8-0xEB */ + {0x9A, 0xE6}, {0x9B, 0x41}, {0x9B, 0x42}, {0x9C, 0xF4}, /* 0xEC-0xEF */ + {0x9C, 0xF6}, {0x9C, 0xF3}, {0x9E, 0xBC}, {0x9F, 0x3B}, /* 0xF0-0xF3 */ + {0x9F, 0x4A}, {0x51, 0x04}, {0x51, 0x00}, {0x50, 0xFB}, /* 0xF4-0xF7 */ + {0x50, 0xF5}, {0x50, 0xF9}, {0x51, 0x02}, {0x51, 0x08}, /* 0xF8-0xFB */ + {0x51, 0x09}, {0x51, 0x05}, {0x51, 0xDC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x52, 0x87}, {0x52, 0x88}, {0x52, 0x89}, {0x52, 0x8D}, /* 0x40-0x43 */ + {0x52, 0x8A}, {0x52, 0xF0}, {0x53, 0xB2}, {0x56, 0x2E}, /* 0x44-0x47 */ + {0x56, 0x3B}, {0x56, 0x39}, {0x56, 0x32}, {0x56, 0x3F}, /* 0x48-0x4B */ + {0x56, 0x34}, {0x56, 0x29}, {0x56, 0x53}, {0x56, 0x4E}, /* 0x4C-0x4F */ + {0x56, 0x57}, {0x56, 0x74}, {0x56, 0x36}, {0x56, 0x2F}, /* 0x50-0x53 */ + {0x56, 0x30}, {0x58, 0x80}, {0x58, 0x9F}, {0x58, 0x9E}, /* 0x54-0x57 */ + {0x58, 0xB3}, {0x58, 0x9C}, {0x58, 0xAE}, {0x58, 0xA9}, /* 0x58-0x5B */ + {0x58, 0xA6}, {0x59, 0x6D}, {0x5B, 0x09}, {0x5A, 0xFB}, /* 0x5C-0x5F */ + {0x5B, 0x0B}, {0x5A, 0xF5}, {0x5B, 0x0C}, {0x5B, 0x08}, /* 0x60-0x63 */ + {0x5B, 0xEE}, {0x5B, 0xEC}, {0x5B, 0xE9}, {0x5B, 0xEB}, /* 0x64-0x67 */ + {0x5C, 0x64}, {0x5C, 0x65}, {0x5D, 0x9D}, {0x5D, 0x94}, /* 0x68-0x6B */ + {0x5E, 0x62}, {0x5E, 0x5F}, {0x5E, 0x61}, {0x5E, 0xE2}, /* 0x6C-0x6F */ + {0x5E, 0xDA}, {0x5E, 0xDF}, {0x5E, 0xDD}, {0x5E, 0xE3}, /* 0x70-0x73 */ + {0x5E, 0xE0}, {0x5F, 0x48}, {0x5F, 0x71}, {0x5F, 0xB7}, /* 0x74-0x77 */ + {0x5F, 0xB5}, {0x61, 0x76}, {0x61, 0x67}, {0x61, 0x6E}, /* 0x78-0x7B */ + {0x61, 0x5D}, {0x61, 0x55}, {0x61, 0x82}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x61, 0x7C}, {0x61, 0x70}, {0x61, 0x6B}, /* 0xA0-0xA3 */ + {0x61, 0x7E}, {0x61, 0xA7}, {0x61, 0x90}, {0x61, 0xAB}, /* 0xA4-0xA7 */ + {0x61, 0x8E}, {0x61, 0xAC}, {0x61, 0x9A}, {0x61, 0xA4}, /* 0xA8-0xAB */ + {0x61, 0x94}, {0x61, 0xAE}, {0x62, 0x2E}, {0x64, 0x69}, /* 0xAC-0xAF */ + {0x64, 0x6F}, {0x64, 0x79}, {0x64, 0x9E}, {0x64, 0xB2}, /* 0xB0-0xB3 */ + {0x64, 0x88}, {0x64, 0x90}, {0x64, 0xB0}, {0x64, 0xA5}, /* 0xB4-0xB7 */ + {0x64, 0x93}, {0x64, 0x95}, {0x64, 0xA9}, {0x64, 0x92}, /* 0xB8-0xBB */ + {0x64, 0xAE}, {0x64, 0xAD}, {0x64, 0xAB}, {0x64, 0x9A}, /* 0xBC-0xBF */ + {0x64, 0xAC}, {0x64, 0x99}, {0x64, 0xA2}, {0x64, 0xB3}, /* 0xC0-0xC3 */ + {0x65, 0x75}, {0x65, 0x77}, {0x65, 0x78}, {0x66, 0xAE}, /* 0xC4-0xC7 */ + {0x66, 0xAB}, {0x66, 0xB4}, {0x66, 0xB1}, {0x6A, 0x23}, /* 0xC8-0xCB */ + {0x6A, 0x1F}, {0x69, 0xE8}, {0x6A, 0x01}, {0x6A, 0x1E}, /* 0xCC-0xCF */ + {0x6A, 0x19}, {0x69, 0xFD}, {0x6A, 0x21}, {0x6A, 0x13}, /* 0xD0-0xD3 */ + {0x6A, 0x0A}, {0x69, 0xF3}, {0x6A, 0x02}, {0x6A, 0x05}, /* 0xD4-0xD7 */ + {0x69, 0xED}, {0x6A, 0x11}, {0x6B, 0x50}, {0x6B, 0x4E}, /* 0xD8-0xDB */ + {0x6B, 0xA4}, {0x6B, 0xC5}, {0x6B, 0xC6}, {0x6F, 0x3F}, /* 0xDC-0xDF */ + {0x6F, 0x7C}, {0x6F, 0x84}, {0x6F, 0x51}, {0x6F, 0x66}, /* 0xE0-0xE3 */ + {0x6F, 0x54}, {0x6F, 0x86}, {0x6F, 0x6D}, {0x6F, 0x5B}, /* 0xE4-0xE7 */ + {0x6F, 0x78}, {0x6F, 0x6E}, {0x6F, 0x8E}, {0x6F, 0x7A}, /* 0xE8-0xEB */ + {0x6F, 0x70}, {0x6F, 0x64}, {0x6F, 0x97}, {0x6F, 0x58}, /* 0xEC-0xEF */ + {0x6E, 0xD5}, {0x6F, 0x6F}, {0x6F, 0x60}, {0x6F, 0x5F}, /* 0xF0-0xF3 */ + {0x71, 0x9F}, {0x71, 0xAC}, {0x71, 0xB1}, {0x71, 0xA8}, /* 0xF4-0xF7 */ + {0x72, 0x56}, {0x72, 0x9B}, {0x73, 0x4E}, {0x73, 0x57}, /* 0xF8-0xFB */ + {0x74, 0x69}, {0x74, 0x8B}, {0x74, 0x83}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x74, 0x7E}, {0x74, 0x80}, {0x75, 0x7F}, {0x76, 0x20}, /* 0x40-0x43 */ + {0x76, 0x29}, {0x76, 0x1F}, {0x76, 0x24}, {0x76, 0x26}, /* 0x44-0x47 */ + {0x76, 0x21}, {0x76, 0x22}, {0x76, 0x9A}, {0x76, 0xBA}, /* 0x48-0x4B */ + {0x76, 0xE4}, {0x77, 0x8E}, {0x77, 0x87}, {0x77, 0x8C}, /* 0x4C-0x4F */ + {0x77, 0x91}, {0x77, 0x8B}, {0x78, 0xCB}, {0x78, 0xC5}, /* 0x50-0x53 */ + {0x78, 0xBA}, {0x78, 0xCA}, {0x78, 0xBE}, {0x78, 0xD5}, /* 0x54-0x57 */ + {0x78, 0xBC}, {0x78, 0xD0}, {0x7A, 0x3F}, {0x7A, 0x3C}, /* 0x58-0x5B */ + {0x7A, 0x40}, {0x7A, 0x3D}, {0x7A, 0x37}, {0x7A, 0x3B}, /* 0x5C-0x5F */ + {0x7A, 0xAF}, {0x7A, 0xAE}, {0x7B, 0xAD}, {0x7B, 0xB1}, /* 0x60-0x63 */ + {0x7B, 0xC4}, {0x7B, 0xB4}, {0x7B, 0xC6}, {0x7B, 0xC7}, /* 0x64-0x67 */ + {0x7B, 0xC1}, {0x7B, 0xA0}, {0x7B, 0xCC}, {0x7C, 0xCA}, /* 0x68-0x6B */ + {0x7D, 0xE0}, {0x7D, 0xF4}, {0x7D, 0xEF}, {0x7D, 0xFB}, /* 0x6C-0x6F */ + {0x7D, 0xD8}, {0x7D, 0xEC}, {0x7D, 0xDD}, {0x7D, 0xE8}, /* 0x70-0x73 */ + {0x7D, 0xE3}, {0x7D, 0xDA}, {0x7D, 0xDE}, {0x7D, 0xE9}, /* 0x74-0x77 */ + {0x7D, 0x9E}, {0x7D, 0xD9}, {0x7D, 0xF2}, {0x7D, 0xF9}, /* 0x78-0x7B */ + {0x7F, 0x75}, {0x7F, 0x77}, {0x7F, 0xAF}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x7F, 0xE9}, {0x80, 0x26}, {0x81, 0x9B}, /* 0xA0-0xA3 */ + {0x81, 0x9C}, {0x81, 0x9D}, {0x81, 0xA0}, {0x81, 0x9A}, /* 0xA4-0xA7 */ + {0x81, 0x98}, {0x85, 0x17}, {0x85, 0x3D}, {0x85, 0x1A}, /* 0xA8-0xAB */ + {0x84, 0xEE}, {0x85, 0x2C}, {0x85, 0x2D}, {0x85, 0x13}, /* 0xAC-0xAF */ + {0x85, 0x11}, {0x85, 0x23}, {0x85, 0x21}, {0x85, 0x14}, /* 0xB0-0xB3 */ + {0x84, 0xEC}, {0x85, 0x25}, {0x84, 0xFF}, {0x85, 0x06}, /* 0xB4-0xB7 */ + {0x87, 0x82}, {0x87, 0x74}, {0x87, 0x76}, {0x87, 0x60}, /* 0xB8-0xBB */ + {0x87, 0x66}, {0x87, 0x78}, {0x87, 0x68}, {0x87, 0x59}, /* 0xBC-0xBF */ + {0x87, 0x57}, {0x87, 0x4C}, {0x87, 0x53}, {0x88, 0x5B}, /* 0xC0-0xC3 */ + {0x88, 0x5D}, {0x89, 0x10}, {0x89, 0x07}, {0x89, 0x12}, /* 0xC4-0xC7 */ + {0x89, 0x13}, {0x89, 0x15}, {0x89, 0x0A}, {0x8A, 0xBC}, /* 0xC8-0xCB */ + {0x8A, 0xD2}, {0x8A, 0xC7}, {0x8A, 0xC4}, {0x8A, 0x95}, /* 0xCC-0xCF */ + {0x8A, 0xCB}, {0x8A, 0xF8}, {0x8A, 0xB2}, {0x8A, 0xC9}, /* 0xD0-0xD3 */ + {0x8A, 0xC2}, {0x8A, 0xBF}, {0x8A, 0xB0}, {0x8A, 0xD6}, /* 0xD4-0xD7 */ + {0x8A, 0xCD}, {0x8A, 0xB6}, {0x8A, 0xB9}, {0x8A, 0xDB}, /* 0xD8-0xDB */ + {0x8C, 0x4C}, {0x8C, 0x4E}, {0x8C, 0x6C}, {0x8C, 0xE0}, /* 0xDC-0xDF */ + {0x8C, 0xDE}, {0x8C, 0xE6}, {0x8C, 0xE4}, {0x8C, 0xEC}, /* 0xE0-0xE3 */ + {0x8C, 0xED}, {0x8C, 0xE2}, {0x8C, 0xE3}, {0x8C, 0xDC}, /* 0xE4-0xE7 */ + {0x8C, 0xEA}, {0x8C, 0xE1}, {0x8D, 0x6D}, {0x8D, 0x9F}, /* 0xE8-0xEB */ + {0x8D, 0xA3}, {0x8E, 0x2B}, {0x8E, 0x10}, {0x8E, 0x1D}, /* 0xEC-0xEF */ + {0x8E, 0x22}, {0x8E, 0x0F}, {0x8E, 0x29}, {0x8E, 0x1F}, /* 0xF0-0xF3 */ + {0x8E, 0x21}, {0x8E, 0x1E}, {0x8E, 0xBA}, {0x8F, 0x1D}, /* 0xF4-0xF7 */ + {0x8F, 0x1B}, {0x8F, 0x1F}, {0x8F, 0x29}, {0x8F, 0x26}, /* 0xF8-0xFB */ + {0x8F, 0x2A}, {0x8F, 0x1C}, {0x8F, 0x1E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8F, 0x25}, {0x90, 0x69}, {0x90, 0x6E}, {0x90, 0x68}, /* 0x40-0x43 */ + {0x90, 0x6D}, {0x90, 0x77}, {0x91, 0x30}, {0x91, 0x2D}, /* 0x44-0x47 */ + {0x91, 0x27}, {0x91, 0x31}, {0x91, 0x87}, {0x91, 0x89}, /* 0x48-0x4B */ + {0x91, 0x8B}, {0x91, 0x83}, {0x92, 0xC5}, {0x92, 0xBB}, /* 0x4C-0x4F */ + {0x92, 0xB7}, {0x92, 0xEA}, {0x92, 0xAC}, {0x92, 0xE4}, /* 0x50-0x53 */ + {0x92, 0xC1}, {0x92, 0xB3}, {0x92, 0xBC}, {0x92, 0xD2}, /* 0x54-0x57 */ + {0x92, 0xC7}, {0x92, 0xF0}, {0x92, 0xB2}, {0x95, 0xAD}, /* 0x58-0x5B */ + {0x95, 0xB1}, {0x97, 0x04}, {0x97, 0x06}, {0x97, 0x07}, /* 0x5C-0x5F */ + {0x97, 0x09}, {0x97, 0x60}, {0x97, 0x8D}, {0x97, 0x8B}, /* 0x60-0x63 */ + {0x97, 0x8F}, {0x98, 0x21}, {0x98, 0x2B}, {0x98, 0x1C}, /* 0x64-0x67 */ + {0x98, 0xB3}, {0x99, 0x0A}, {0x99, 0x13}, {0x99, 0x12}, /* 0x68-0x6B */ + {0x99, 0x18}, {0x99, 0xDD}, {0x99, 0xD0}, {0x99, 0xDF}, /* 0x6C-0x6F */ + {0x99, 0xDB}, {0x99, 0xD1}, {0x99, 0xD5}, {0x99, 0xD2}, /* 0x70-0x73 */ + {0x99, 0xD9}, {0x9A, 0xB7}, {0x9A, 0xEE}, {0x9A, 0xEF}, /* 0x74-0x77 */ + {0x9B, 0x27}, {0x9B, 0x45}, {0x9B, 0x44}, {0x9B, 0x77}, /* 0x78-0x7B */ + {0x9B, 0x6F}, {0x9D, 0x06}, {0x9D, 0x09}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9D, 0x03}, {0x9E, 0xA9}, {0x9E, 0xBE}, /* 0xA0-0xA3 */ + {0x9E, 0xCE}, {0x58, 0xA8}, {0x9F, 0x52}, {0x51, 0x12}, /* 0xA4-0xA7 */ + {0x51, 0x18}, {0x51, 0x14}, {0x51, 0x10}, {0x51, 0x15}, /* 0xA8-0xAB */ + {0x51, 0x80}, {0x51, 0xAA}, {0x51, 0xDD}, {0x52, 0x91}, /* 0xAC-0xAF */ + {0x52, 0x93}, {0x52, 0xF3}, {0x56, 0x59}, {0x56, 0x6B}, /* 0xB0-0xB3 */ + {0x56, 0x79}, {0x56, 0x69}, {0x56, 0x64}, {0x56, 0x78}, /* 0xB4-0xB7 */ + {0x56, 0x6A}, {0x56, 0x68}, {0x56, 0x65}, {0x56, 0x71}, /* 0xB8-0xBB */ + {0x56, 0x6F}, {0x56, 0x6C}, {0x56, 0x62}, {0x56, 0x76}, /* 0xBC-0xBF */ + {0x58, 0xC1}, {0x58, 0xBE}, {0x58, 0xC7}, {0x58, 0xC5}, /* 0xC0-0xC3 */ + {0x59, 0x6E}, {0x5B, 0x1D}, {0x5B, 0x34}, {0x5B, 0x78}, /* 0xC4-0xC7 */ + {0x5B, 0xF0}, {0x5C, 0x0E}, {0x5F, 0x4A}, {0x61, 0xB2}, /* 0xC8-0xCB */ + {0x61, 0x91}, {0x61, 0xA9}, {0x61, 0x8A}, {0x61, 0xCD}, /* 0xCC-0xCF */ + {0x61, 0xB6}, {0x61, 0xBE}, {0x61, 0xCA}, {0x61, 0xC8}, /* 0xD0-0xD3 */ + {0x62, 0x30}, {0x64, 0xC5}, {0x64, 0xC1}, {0x64, 0xCB}, /* 0xD4-0xD7 */ + {0x64, 0xBB}, {0x64, 0xBC}, {0x64, 0xDA}, {0x64, 0xC4}, /* 0xD8-0xDB */ + {0x64, 0xC7}, {0x64, 0xC2}, {0x64, 0xCD}, {0x64, 0xBF}, /* 0xDC-0xDF */ + {0x64, 0xD2}, {0x64, 0xD4}, {0x64, 0xBE}, {0x65, 0x74}, /* 0xE0-0xE3 */ + {0x66, 0xC6}, {0x66, 0xC9}, {0x66, 0xB9}, {0x66, 0xC4}, /* 0xE4-0xE7 */ + {0x66, 0xC7}, {0x66, 0xB8}, {0x6A, 0x3D}, {0x6A, 0x38}, /* 0xE8-0xEB */ + {0x6A, 0x3A}, {0x6A, 0x59}, {0x6A, 0x6B}, {0x6A, 0x58}, /* 0xEC-0xEF */ + {0x6A, 0x39}, {0x6A, 0x44}, {0x6A, 0x62}, {0x6A, 0x61}, /* 0xF0-0xF3 */ + {0x6A, 0x4B}, {0x6A, 0x47}, {0x6A, 0x35}, {0x6A, 0x5F}, /* 0xF4-0xF7 */ + {0x6A, 0x48}, {0x6B, 0x59}, {0x6B, 0x77}, {0x6C, 0x05}, /* 0xF8-0xFB */ + {0x6F, 0xC2}, {0x6F, 0xB1}, {0x6F, 0xA1}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_BF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6F, 0xC3}, {0x6F, 0xA4}, {0x6F, 0xC1}, {0x6F, 0xA7}, /* 0x40-0x43 */ + {0x6F, 0xB3}, {0x6F, 0xC0}, {0x6F, 0xB9}, {0x6F, 0xB6}, /* 0x44-0x47 */ + {0x6F, 0xA6}, {0x6F, 0xA0}, {0x6F, 0xB4}, {0x71, 0xBE}, /* 0x48-0x4B */ + {0x71, 0xC9}, {0x71, 0xD0}, {0x71, 0xD2}, {0x71, 0xC8}, /* 0x4C-0x4F */ + {0x71, 0xD5}, {0x71, 0xB9}, {0x71, 0xCE}, {0x71, 0xD9}, /* 0x50-0x53 */ + {0x71, 0xDC}, {0x71, 0xC3}, {0x71, 0xC4}, {0x73, 0x68}, /* 0x54-0x57 */ + {0x74, 0x9C}, {0x74, 0xA3}, {0x74, 0x98}, {0x74, 0x9F}, /* 0x58-0x5B */ + {0x74, 0x9E}, {0x74, 0xE2}, {0x75, 0x0C}, {0x75, 0x0D}, /* 0x5C-0x5F */ + {0x76, 0x34}, {0x76, 0x38}, {0x76, 0x3A}, {0x76, 0xE7}, /* 0x60-0x63 */ + {0x76, 0xE5}, {0x77, 0xA0}, {0x77, 0x9E}, {0x77, 0x9F}, /* 0x64-0x67 */ + {0x77, 0xA5}, {0x78, 0xE8}, {0x78, 0xDA}, {0x78, 0xEC}, /* 0x68-0x6B */ + {0x78, 0xE7}, {0x79, 0xA6}, {0x7A, 0x4D}, {0x7A, 0x4E}, /* 0x6C-0x6F */ + {0x7A, 0x46}, {0x7A, 0x4C}, {0x7A, 0x4B}, {0x7A, 0xBA}, /* 0x70-0x73 */ + {0x7B, 0xD9}, {0x7C, 0x11}, {0x7B, 0xC9}, {0x7B, 0xE4}, /* 0x74-0x77 */ + {0x7B, 0xDB}, {0x7B, 0xE1}, {0x7B, 0xE9}, {0x7B, 0xE6}, /* 0x78-0x7B */ + {0x7C, 0xD5}, {0x7C, 0xD6}, {0x7E, 0x0A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x7E, 0x11}, {0x7E, 0x08}, {0x7E, 0x1B}, /* 0xA0-0xA3 */ + {0x7E, 0x23}, {0x7E, 0x1E}, {0x7E, 0x1D}, {0x7E, 0x09}, /* 0xA4-0xA7 */ + {0x7E, 0x10}, {0x7F, 0x79}, {0x7F, 0xB2}, {0x7F, 0xF0}, /* 0xA8-0xAB */ + {0x7F, 0xF1}, {0x7F, 0xEE}, {0x80, 0x28}, {0x81, 0xB3}, /* 0xAC-0xAF */ + {0x81, 0xA9}, {0x81, 0xA8}, {0x81, 0xFB}, {0x82, 0x08}, /* 0xB0-0xB3 */ + {0x82, 0x58}, {0x82, 0x59}, {0x85, 0x4A}, {0x85, 0x59}, /* 0xB4-0xB7 */ + {0x85, 0x48}, {0x85, 0x68}, {0x85, 0x69}, {0x85, 0x43}, /* 0xB8-0xBB */ + {0x85, 0x49}, {0x85, 0x6D}, {0x85, 0x6A}, {0x85, 0x5E}, /* 0xBC-0xBF */ + {0x87, 0x83}, {0x87, 0x9F}, {0x87, 0x9E}, {0x87, 0xA2}, /* 0xC0-0xC3 */ + {0x87, 0x8D}, {0x88, 0x61}, {0x89, 0x2A}, {0x89, 0x32}, /* 0xC4-0xC7 */ + {0x89, 0x25}, {0x89, 0x2B}, {0x89, 0x21}, {0x89, 0xAA}, /* 0xC8-0xCB */ + {0x89, 0xA6}, {0x8A, 0xE6}, {0x8A, 0xFA}, {0x8A, 0xEB}, /* 0xCC-0xCF */ + {0x8A, 0xF1}, {0x8B, 0x00}, {0x8A, 0xDC}, {0x8A, 0xE7}, /* 0xD0-0xD3 */ + {0x8A, 0xEE}, {0x8A, 0xFE}, {0x8B, 0x01}, {0x8B, 0x02}, /* 0xD4-0xD7 */ + {0x8A, 0xF7}, {0x8A, 0xED}, {0x8A, 0xF3}, {0x8A, 0xF6}, /* 0xD8-0xDB */ + {0x8A, 0xFC}, {0x8C, 0x6B}, {0x8C, 0x6D}, {0x8C, 0x93}, /* 0xDC-0xDF */ + {0x8C, 0xF4}, {0x8E, 0x44}, {0x8E, 0x31}, {0x8E, 0x34}, /* 0xE0-0xE3 */ + {0x8E, 0x42}, {0x8E, 0x39}, {0x8E, 0x35}, {0x8F, 0x3B}, /* 0xE4-0xE7 */ + {0x8F, 0x2F}, {0x8F, 0x38}, {0x8F, 0x33}, {0x8F, 0xA8}, /* 0xE8-0xEB */ + {0x8F, 0xA6}, {0x90, 0x75}, {0x90, 0x74}, {0x90, 0x78}, /* 0xEC-0xEF */ + {0x90, 0x72}, {0x90, 0x7C}, {0x90, 0x7A}, {0x91, 0x34}, /* 0xF0-0xF3 */ + {0x91, 0x92}, {0x93, 0x20}, {0x93, 0x36}, {0x92, 0xF8}, /* 0xF4-0xF7 */ + {0x93, 0x33}, {0x93, 0x2F}, {0x93, 0x22}, {0x92, 0xFC}, /* 0xF8-0xFB */ + {0x93, 0x2B}, {0x93, 0x04}, {0x93, 0x1A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x93, 0x10}, {0x93, 0x26}, {0x93, 0x21}, {0x93, 0x15}, /* 0x40-0x43 */ + {0x93, 0x2E}, {0x93, 0x19}, {0x95, 0xBB}, {0x96, 0xA7}, /* 0x44-0x47 */ + {0x96, 0xA8}, {0x96, 0xAA}, {0x96, 0xD5}, {0x97, 0x0E}, /* 0x48-0x4B */ + {0x97, 0x11}, {0x97, 0x16}, {0x97, 0x0D}, {0x97, 0x13}, /* 0x4C-0x4F */ + {0x97, 0x0F}, {0x97, 0x5B}, {0x97, 0x5C}, {0x97, 0x66}, /* 0x50-0x53 */ + {0x97, 0x98}, {0x98, 0x30}, {0x98, 0x38}, {0x98, 0x3B}, /* 0x54-0x57 */ + {0x98, 0x37}, {0x98, 0x2D}, {0x98, 0x39}, {0x98, 0x24}, /* 0x58-0x5B */ + {0x99, 0x10}, {0x99, 0x28}, {0x99, 0x1E}, {0x99, 0x1B}, /* 0x5C-0x5F */ + {0x99, 0x21}, {0x99, 0x1A}, {0x99, 0xED}, {0x99, 0xE2}, /* 0x60-0x63 */ + {0x99, 0xF1}, {0x9A, 0xB8}, {0x9A, 0xBC}, {0x9A, 0xFB}, /* 0x64-0x67 */ + {0x9A, 0xED}, {0x9B, 0x28}, {0x9B, 0x91}, {0x9D, 0x15}, /* 0x68-0x6B */ + {0x9D, 0x23}, {0x9D, 0x26}, {0x9D, 0x28}, {0x9D, 0x12}, /* 0x6C-0x6F */ + {0x9D, 0x1B}, {0x9E, 0xD8}, {0x9E, 0xD4}, {0x9F, 0x8D}, /* 0x70-0x73 */ + {0x9F, 0x9C}, {0x51, 0x2A}, {0x51, 0x1F}, {0x51, 0x21}, /* 0x74-0x77 */ + {0x51, 0x32}, {0x52, 0xF5}, {0x56, 0x8E}, {0x56, 0x80}, /* 0x78-0x7B */ + {0x56, 0x90}, {0x56, 0x85}, {0x56, 0x87}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x56, 0x8F}, {0x58, 0xD5}, {0x58, 0xD3}, /* 0xA0-0xA3 */ + {0x58, 0xD1}, {0x58, 0xCE}, {0x5B, 0x30}, {0x5B, 0x2A}, /* 0xA4-0xA7 */ + {0x5B, 0x24}, {0x5B, 0x7A}, {0x5C, 0x37}, {0x5C, 0x68}, /* 0xA8-0xAB */ + {0x5D, 0xBC}, {0x5D, 0xBA}, {0x5D, 0xBD}, {0x5D, 0xB8}, /* 0xAC-0xAF */ + {0x5E, 0x6B}, {0x5F, 0x4C}, {0x5F, 0xBD}, {0x61, 0xC9}, /* 0xB0-0xB3 */ + {0x61, 0xC2}, {0x61, 0xC7}, {0x61, 0xE6}, {0x61, 0xCB}, /* 0xB4-0xB7 */ + {0x62, 0x32}, {0x62, 0x34}, {0x64, 0xCE}, {0x64, 0xCA}, /* 0xB8-0xBB */ + {0x64, 0xD8}, {0x64, 0xE0}, {0x64, 0xF0}, {0x64, 0xE6}, /* 0xBC-0xBF */ + {0x64, 0xEC}, {0x64, 0xF1}, {0x64, 0xE2}, {0x64, 0xED}, /* 0xC0-0xC3 */ + {0x65, 0x82}, {0x65, 0x83}, {0x66, 0xD9}, {0x66, 0xD6}, /* 0xC4-0xC7 */ + {0x6A, 0x80}, {0x6A, 0x94}, {0x6A, 0x84}, {0x6A, 0xA2}, /* 0xC8-0xCB */ + {0x6A, 0x9C}, {0x6A, 0xDB}, {0x6A, 0xA3}, {0x6A, 0x7E}, /* 0xCC-0xCF */ + {0x6A, 0x97}, {0x6A, 0x90}, {0x6A, 0xA0}, {0x6B, 0x5C}, /* 0xD0-0xD3 */ + {0x6B, 0xAE}, {0x6B, 0xDA}, {0x6C, 0x08}, {0x6F, 0xD8}, /* 0xD4-0xD7 */ + {0x6F, 0xF1}, {0x6F, 0xDF}, {0x6F, 0xE0}, {0x6F, 0xDB}, /* 0xD8-0xDB */ + {0x6F, 0xE4}, {0x6F, 0xEB}, {0x6F, 0xEF}, {0x6F, 0x80}, /* 0xDC-0xDF */ + {0x6F, 0xEC}, {0x6F, 0xE1}, {0x6F, 0xE9}, {0x6F, 0xD5}, /* 0xE0-0xE3 */ + {0x6F, 0xEE}, {0x6F, 0xF0}, {0x71, 0xE7}, {0x71, 0xDF}, /* 0xE4-0xE7 */ + {0x71, 0xEE}, {0x71, 0xE6}, {0x71, 0xE5}, {0x71, 0xED}, /* 0xE8-0xEB */ + {0x71, 0xEC}, {0x71, 0xF4}, {0x71, 0xE0}, {0x72, 0x35}, /* 0xEC-0xEF */ + {0x72, 0x46}, {0x73, 0x70}, {0x73, 0x72}, {0x74, 0xA9}, /* 0xF0-0xF3 */ + {0x74, 0xB0}, {0x74, 0xA6}, {0x74, 0xA8}, {0x76, 0x46}, /* 0xF4-0xF7 */ + {0x76, 0x42}, {0x76, 0x4C}, {0x76, 0xEA}, {0x77, 0xB3}, /* 0xF8-0xFB */ + {0x77, 0xAA}, {0x77, 0xB0}, {0x77, 0xAC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x77, 0xA7}, {0x77, 0xAD}, {0x77, 0xEF}, {0x78, 0xF7}, /* 0x40-0x43 */ + {0x78, 0xFA}, {0x78, 0xF4}, {0x78, 0xEF}, {0x79, 0x01}, /* 0x44-0x47 */ + {0x79, 0xA7}, {0x79, 0xAA}, {0x7A, 0x57}, {0x7A, 0xBF}, /* 0x48-0x4B */ + {0x7C, 0x07}, {0x7C, 0x0D}, {0x7B, 0xFE}, {0x7B, 0xF7}, /* 0x4C-0x4F */ + {0x7C, 0x0C}, {0x7B, 0xE0}, {0x7C, 0xE0}, {0x7C, 0xDC}, /* 0x50-0x53 */ + {0x7C, 0xDE}, {0x7C, 0xE2}, {0x7C, 0xDF}, {0x7C, 0xD9}, /* 0x54-0x57 */ + {0x7C, 0xDD}, {0x7E, 0x2E}, {0x7E, 0x3E}, {0x7E, 0x46}, /* 0x58-0x5B */ + {0x7E, 0x37}, {0x7E, 0x32}, {0x7E, 0x43}, {0x7E, 0x2B}, /* 0x5C-0x5F */ + {0x7E, 0x3D}, {0x7E, 0x31}, {0x7E, 0x45}, {0x7E, 0x41}, /* 0x60-0x63 */ + {0x7E, 0x34}, {0x7E, 0x39}, {0x7E, 0x48}, {0x7E, 0x35}, /* 0x64-0x67 */ + {0x7E, 0x3F}, {0x7E, 0x2F}, {0x7F, 0x44}, {0x7F, 0xF3}, /* 0x68-0x6B */ + {0x7F, 0xFC}, {0x80, 0x71}, {0x80, 0x72}, {0x80, 0x70}, /* 0x6C-0x6F */ + {0x80, 0x6F}, {0x80, 0x73}, {0x81, 0xC6}, {0x81, 0xC3}, /* 0x70-0x73 */ + {0x81, 0xBA}, {0x81, 0xC2}, {0x81, 0xC0}, {0x81, 0xBF}, /* 0x74-0x77 */ + {0x81, 0xBD}, {0x81, 0xC9}, {0x81, 0xBE}, {0x81, 0xE8}, /* 0x78-0x7B */ + {0x82, 0x09}, {0x82, 0x71}, {0x85, 0xAA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x85, 0x84}, {0x85, 0x7E}, {0x85, 0x9C}, /* 0xA0-0xA3 */ + {0x85, 0x91}, {0x85, 0x94}, {0x85, 0xAF}, {0x85, 0x9B}, /* 0xA4-0xA7 */ + {0x85, 0x87}, {0x85, 0xA8}, {0x85, 0x8A}, {0x86, 0x67}, /* 0xA8-0xAB */ + {0x87, 0xC0}, {0x87, 0xD1}, {0x87, 0xB3}, {0x87, 0xD2}, /* 0xAC-0xAF */ + {0x87, 0xC6}, {0x87, 0xAB}, {0x87, 0xBB}, {0x87, 0xBA}, /* 0xB0-0xB3 */ + {0x87, 0xC8}, {0x87, 0xCB}, {0x89, 0x3B}, {0x89, 0x36}, /* 0xB4-0xB7 */ + {0x89, 0x44}, {0x89, 0x38}, {0x89, 0x3D}, {0x89, 0xAC}, /* 0xB8-0xBB */ + {0x8B, 0x0E}, {0x8B, 0x17}, {0x8B, 0x19}, {0x8B, 0x1B}, /* 0xBC-0xBF */ + {0x8B, 0x0A}, {0x8B, 0x20}, {0x8B, 0x1D}, {0x8B, 0x04}, /* 0xC0-0xC3 */ + {0x8B, 0x10}, {0x8C, 0x41}, {0x8C, 0x3F}, {0x8C, 0x73}, /* 0xC4-0xC7 */ + {0x8C, 0xFA}, {0x8C, 0xFD}, {0x8C, 0xFC}, {0x8C, 0xF8}, /* 0xC8-0xCB */ + {0x8C, 0xFB}, {0x8D, 0xA8}, {0x8E, 0x49}, {0x8E, 0x4B}, /* 0xCC-0xCF */ + {0x8E, 0x48}, {0x8E, 0x4A}, {0x8F, 0x44}, {0x8F, 0x3E}, /* 0xD0-0xD3 */ + {0x8F, 0x42}, {0x8F, 0x45}, {0x8F, 0x3F}, {0x90, 0x7F}, /* 0xD4-0xD7 */ + {0x90, 0x7D}, {0x90, 0x84}, {0x90, 0x81}, {0x90, 0x82}, /* 0xD8-0xDB */ + {0x90, 0x80}, {0x91, 0x39}, {0x91, 0xA3}, {0x91, 0x9E}, /* 0xDC-0xDF */ + {0x91, 0x9C}, {0x93, 0x4D}, {0x93, 0x82}, {0x93, 0x28}, /* 0xE0-0xE3 */ + {0x93, 0x75}, {0x93, 0x4A}, {0x93, 0x65}, {0x93, 0x4B}, /* 0xE4-0xE7 */ + {0x93, 0x18}, {0x93, 0x7E}, {0x93, 0x6C}, {0x93, 0x5B}, /* 0xE8-0xEB */ + {0x93, 0x70}, {0x93, 0x5A}, {0x93, 0x54}, {0x95, 0xCA}, /* 0xEC-0xEF */ + {0x95, 0xCB}, {0x95, 0xCC}, {0x95, 0xC8}, {0x95, 0xC6}, /* 0xF0-0xF3 */ + {0x96, 0xB1}, {0x96, 0xB8}, {0x96, 0xD6}, {0x97, 0x1C}, /* 0xF4-0xF7 */ + {0x97, 0x1E}, {0x97, 0xA0}, {0x97, 0xD3}, {0x98, 0x46}, /* 0xF8-0xFB */ + {0x98, 0xB6}, {0x99, 0x35}, {0x9A, 0x01}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x99, 0xFF}, {0x9B, 0xAE}, {0x9B, 0xAB}, {0x9B, 0xAA}, /* 0x40-0x43 */ + {0x9B, 0xAD}, {0x9D, 0x3B}, {0x9D, 0x3F}, {0x9E, 0x8B}, /* 0x44-0x47 */ + {0x9E, 0xCF}, {0x9E, 0xDE}, {0x9E, 0xDC}, {0x9E, 0xDD}, /* 0x48-0x4B */ + {0x9E, 0xDB}, {0x9F, 0x3E}, {0x9F, 0x4B}, {0x53, 0xE2}, /* 0x4C-0x4F */ + {0x56, 0x95}, {0x56, 0xAE}, {0x58, 0xD9}, {0x58, 0xD8}, /* 0x50-0x53 */ + {0x5B, 0x38}, {0x5F, 0x5D}, {0x61, 0xE3}, {0x62, 0x33}, /* 0x54-0x57 */ + {0x64, 0xF4}, {0x64, 0xF2}, {0x64, 0xFE}, {0x65, 0x06}, /* 0x58-0x5B */ + {0x64, 0xFA}, {0x64, 0xFB}, {0x64, 0xF7}, {0x65, 0xB7}, /* 0x5C-0x5F */ + {0x66, 0xDC}, {0x67, 0x26}, {0x6A, 0xB3}, {0x6A, 0xAC}, /* 0x60-0x63 */ + {0x6A, 0xC3}, {0x6A, 0xBB}, {0x6A, 0xB8}, {0x6A, 0xC2}, /* 0x64-0x67 */ + {0x6A, 0xAE}, {0x6A, 0xAF}, {0x6B, 0x5F}, {0x6B, 0x78}, /* 0x68-0x6B */ + {0x6B, 0xAF}, {0x70, 0x09}, {0x70, 0x0B}, {0x6F, 0xFE}, /* 0x6C-0x6F */ + {0x70, 0x06}, {0x6F, 0xFA}, {0x70, 0x11}, {0x70, 0x0F}, /* 0x70-0x73 */ + {0x71, 0xFB}, {0x71, 0xFC}, {0x71, 0xFE}, {0x71, 0xF8}, /* 0x74-0x77 */ + {0x73, 0x77}, {0x73, 0x75}, {0x74, 0xA7}, {0x74, 0xBF}, /* 0x78-0x7B */ + {0x75, 0x15}, {0x76, 0x56}, {0x76, 0x58}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x76, 0x52}, {0x77, 0xBD}, {0x77, 0xBF}, /* 0xA0-0xA3 */ + {0x77, 0xBB}, {0x77, 0xBC}, {0x79, 0x0E}, {0x79, 0xAE}, /* 0xA4-0xA7 */ + {0x7A, 0x61}, {0x7A, 0x62}, {0x7A, 0x60}, {0x7A, 0xC4}, /* 0xA8-0xAB */ + {0x7A, 0xC5}, {0x7C, 0x2B}, {0x7C, 0x27}, {0x7C, 0x2A}, /* 0xAC-0xAF */ + {0x7C, 0x1E}, {0x7C, 0x23}, {0x7C, 0x21}, {0x7C, 0xE7}, /* 0xB0-0xB3 */ + {0x7E, 0x54}, {0x7E, 0x55}, {0x7E, 0x5E}, {0x7E, 0x5A}, /* 0xB4-0xB7 */ + {0x7E, 0x61}, {0x7E, 0x52}, {0x7E, 0x59}, {0x7F, 0x48}, /* 0xB8-0xBB */ + {0x7F, 0xF9}, {0x7F, 0xFB}, {0x80, 0x77}, {0x80, 0x76}, /* 0xBC-0xBF */ + {0x81, 0xCD}, {0x81, 0xCF}, {0x82, 0x0A}, {0x85, 0xCF}, /* 0xC0-0xC3 */ + {0x85, 0xA9}, {0x85, 0xCD}, {0x85, 0xD0}, {0x85, 0xC9}, /* 0xC4-0xC7 */ + {0x85, 0xB0}, {0x85, 0xBA}, {0x85, 0xB9}, {0x85, 0xA6}, /* 0xC8-0xCB */ + {0x87, 0xEF}, {0x87, 0xEC}, {0x87, 0xF2}, {0x87, 0xE0}, /* 0xCC-0xCF */ + {0x89, 0x86}, {0x89, 0xB2}, {0x89, 0xF4}, {0x8B, 0x28}, /* 0xD0-0xD3 */ + {0x8B, 0x39}, {0x8B, 0x2C}, {0x8B, 0x2B}, {0x8C, 0x50}, /* 0xD4-0xD7 */ + {0x8D, 0x05}, {0x8E, 0x59}, {0x8E, 0x63}, {0x8E, 0x66}, /* 0xD8-0xDB */ + {0x8E, 0x64}, {0x8E, 0x5F}, {0x8E, 0x55}, {0x8E, 0xC0}, /* 0xDC-0xDF */ + {0x8F, 0x49}, {0x8F, 0x4D}, {0x90, 0x87}, {0x90, 0x83}, /* 0xE0-0xE3 */ + {0x90, 0x88}, {0x91, 0xAB}, {0x91, 0xAC}, {0x91, 0xD0}, /* 0xE4-0xE7 */ + {0x93, 0x94}, {0x93, 0x8A}, {0x93, 0x96}, {0x93, 0xA2}, /* 0xE8-0xEB */ + {0x93, 0xB3}, {0x93, 0xAE}, {0x93, 0xAC}, {0x93, 0xB0}, /* 0xEC-0xEF */ + {0x93, 0x98}, {0x93, 0x9A}, {0x93, 0x97}, {0x95, 0xD4}, /* 0xF0-0xF3 */ + {0x95, 0xD6}, {0x95, 0xD0}, {0x95, 0xD5}, {0x96, 0xE2}, /* 0xF4-0xF7 */ + {0x96, 0xDC}, {0x96, 0xD9}, {0x96, 0xDB}, {0x96, 0xDE}, /* 0xF8-0xFB */ + {0x97, 0x24}, {0x97, 0xA3}, {0x97, 0xA6}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x97, 0xAD}, {0x97, 0xF9}, {0x98, 0x4D}, {0x98, 0x4F}, /* 0x40-0x43 */ + {0x98, 0x4C}, {0x98, 0x4E}, {0x98, 0x53}, {0x98, 0xBA}, /* 0x44-0x47 */ + {0x99, 0x3E}, {0x99, 0x3F}, {0x99, 0x3D}, {0x99, 0x2E}, /* 0x48-0x4B */ + {0x99, 0xA5}, {0x9A, 0x0E}, {0x9A, 0xC1}, {0x9B, 0x03}, /* 0x4C-0x4F */ + {0x9B, 0x06}, {0x9B, 0x4F}, {0x9B, 0x4E}, {0x9B, 0x4D}, /* 0x50-0x53 */ + {0x9B, 0xCA}, {0x9B, 0xC9}, {0x9B, 0xFD}, {0x9B, 0xC8}, /* 0x54-0x57 */ + {0x9B, 0xC0}, {0x9D, 0x51}, {0x9D, 0x5D}, {0x9D, 0x60}, /* 0x58-0x5B */ + {0x9E, 0xE0}, {0x9F, 0x15}, {0x9F, 0x2C}, {0x51, 0x33}, /* 0x5C-0x5F */ + {0x56, 0xA5}, {0x58, 0xDE}, {0x58, 0xDF}, {0x58, 0xE2}, /* 0x60-0x63 */ + {0x5B, 0xF5}, {0x9F, 0x90}, {0x5E, 0xEC}, {0x61, 0xF2}, /* 0x64-0x67 */ + {0x61, 0xF7}, {0x61, 0xF6}, {0x61, 0xF5}, {0x65, 0x00}, /* 0x68-0x6B */ + {0x65, 0x0F}, {0x66, 0xE0}, {0x66, 0xDD}, {0x6A, 0xE5}, /* 0x6C-0x6F */ + {0x6A, 0xDD}, {0x6A, 0xDA}, {0x6A, 0xD3}, {0x70, 0x1B}, /* 0x70-0x73 */ + {0x70, 0x1F}, {0x70, 0x28}, {0x70, 0x1A}, {0x70, 0x1D}, /* 0x74-0x77 */ + {0x70, 0x15}, {0x70, 0x18}, {0x72, 0x06}, {0x72, 0x0D}, /* 0x78-0x7B */ + {0x72, 0x58}, {0x72, 0xA2}, {0x73, 0x78}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x73, 0x7A}, {0x74, 0xBD}, {0x74, 0xCA}, /* 0xA0-0xA3 */ + {0x74, 0xE3}, {0x75, 0x87}, {0x75, 0x86}, {0x76, 0x5F}, /* 0xA4-0xA7 */ + {0x76, 0x61}, {0x77, 0xC7}, {0x79, 0x19}, {0x79, 0xB1}, /* 0xA8-0xAB */ + {0x7A, 0x6B}, {0x7A, 0x69}, {0x7C, 0x3E}, {0x7C, 0x3F}, /* 0xAC-0xAF */ + {0x7C, 0x38}, {0x7C, 0x3D}, {0x7C, 0x37}, {0x7C, 0x40}, /* 0xB0-0xB3 */ + {0x7E, 0x6B}, {0x7E, 0x6D}, {0x7E, 0x79}, {0x7E, 0x69}, /* 0xB4-0xB7 */ + {0x7E, 0x6A}, {0x7F, 0x85}, {0x7E, 0x73}, {0x7F, 0xB6}, /* 0xB8-0xBB */ + {0x7F, 0xB9}, {0x7F, 0xB8}, {0x81, 0xD8}, {0x85, 0xE9}, /* 0xBC-0xBF */ + {0x85, 0xDD}, {0x85, 0xEA}, {0x85, 0xD5}, {0x85, 0xE4}, /* 0xC0-0xC3 */ + {0x85, 0xE5}, {0x85, 0xF7}, {0x87, 0xFB}, {0x88, 0x05}, /* 0xC4-0xC7 */ + {0x88, 0x0D}, {0x87, 0xF9}, {0x87, 0xFE}, {0x89, 0x60}, /* 0xC8-0xCB */ + {0x89, 0x5F}, {0x89, 0x56}, {0x89, 0x5E}, {0x8B, 0x41}, /* 0xCC-0xCF */ + {0x8B, 0x5C}, {0x8B, 0x58}, {0x8B, 0x49}, {0x8B, 0x5A}, /* 0xD0-0xD3 */ + {0x8B, 0x4E}, {0x8B, 0x4F}, {0x8B, 0x46}, {0x8B, 0x59}, /* 0xD4-0xD7 */ + {0x8D, 0x08}, {0x8D, 0x0A}, {0x8E, 0x7C}, {0x8E, 0x72}, /* 0xD8-0xDB */ + {0x8E, 0x87}, {0x8E, 0x76}, {0x8E, 0x6C}, {0x8E, 0x7A}, /* 0xDC-0xDF */ + {0x8E, 0x74}, {0x8F, 0x54}, {0x8F, 0x4E}, {0x8F, 0xAD}, /* 0xE0-0xE3 */ + {0x90, 0x8A}, {0x90, 0x8B}, {0x91, 0xB1}, {0x91, 0xAE}, /* 0xE4-0xE7 */ + {0x93, 0xE1}, {0x93, 0xD1}, {0x93, 0xDF}, {0x93, 0xC3}, /* 0xE8-0xEB */ + {0x93, 0xC8}, {0x93, 0xDC}, {0x93, 0xDD}, {0x93, 0xD6}, /* 0xEC-0xEF */ + {0x93, 0xE2}, {0x93, 0xCD}, {0x93, 0xD8}, {0x93, 0xE4}, /* 0xF0-0xF3 */ + {0x93, 0xD7}, {0x93, 0xE8}, {0x95, 0xDC}, {0x96, 0xB4}, /* 0xF4-0xF7 */ + {0x96, 0xE3}, {0x97, 0x2A}, {0x97, 0x27}, {0x97, 0x61}, /* 0xF8-0xFB */ + {0x97, 0xDC}, {0x97, 0xFB}, {0x98, 0x5E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x98, 0x58}, {0x98, 0x5B}, {0x98, 0xBC}, {0x99, 0x45}, /* 0x40-0x43 */ + {0x99, 0x49}, {0x9A, 0x16}, {0x9A, 0x19}, {0x9B, 0x0D}, /* 0x44-0x47 */ + {0x9B, 0xE8}, {0x9B, 0xE7}, {0x9B, 0xD6}, {0x9B, 0xDB}, /* 0x48-0x4B */ + {0x9D, 0x89}, {0x9D, 0x61}, {0x9D, 0x72}, {0x9D, 0x6A}, /* 0x4C-0x4F */ + {0x9D, 0x6C}, {0x9E, 0x92}, {0x9E, 0x97}, {0x9E, 0x93}, /* 0x50-0x53 */ + {0x9E, 0xB4}, {0x52, 0xF8}, {0x56, 0xA8}, {0x56, 0xB7}, /* 0x54-0x57 */ + {0x56, 0xB6}, {0x56, 0xB4}, {0x56, 0xBC}, {0x58, 0xE4}, /* 0x58-0x5B */ + {0x5B, 0x40}, {0x5B, 0x43}, {0x5B, 0x7D}, {0x5B, 0xF6}, /* 0x5C-0x5F */ + {0x5D, 0xC9}, {0x61, 0xF8}, {0x61, 0xFA}, {0x65, 0x18}, /* 0x60-0x63 */ + {0x65, 0x14}, {0x65, 0x19}, {0x66, 0xE6}, {0x67, 0x27}, /* 0x64-0x67 */ + {0x6A, 0xEC}, {0x70, 0x3E}, {0x70, 0x30}, {0x70, 0x32}, /* 0x68-0x6B */ + {0x72, 0x10}, {0x73, 0x7B}, {0x74, 0xCF}, {0x76, 0x62}, /* 0x6C-0x6F */ + {0x76, 0x65}, {0x79, 0x26}, {0x79, 0x2A}, {0x79, 0x2C}, /* 0x70-0x73 */ + {0x79, 0x2B}, {0x7A, 0xC7}, {0x7A, 0xF6}, {0x7C, 0x4C}, /* 0x74-0x77 */ + {0x7C, 0x43}, {0x7C, 0x4D}, {0x7C, 0xEF}, {0x7C, 0xF0}, /* 0x78-0x7B */ + {0x8F, 0xAE}, {0x7E, 0x7D}, {0x7E, 0x7C}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x7E, 0x82}, {0x7F, 0x4C}, {0x80, 0x00}, /* 0xA0-0xA3 */ + {0x81, 0xDA}, {0x82, 0x66}, {0x85, 0xFB}, {0x85, 0xF9}, /* 0xA4-0xA7 */ + {0x86, 0x11}, {0x85, 0xFA}, {0x86, 0x06}, {0x86, 0x0B}, /* 0xA8-0xAB */ + {0x86, 0x07}, {0x86, 0x0A}, {0x88, 0x14}, {0x88, 0x15}, /* 0xAC-0xAF */ + {0x89, 0x64}, {0x89, 0xBA}, {0x89, 0xF8}, {0x8B, 0x70}, /* 0xB0-0xB3 */ + {0x8B, 0x6C}, {0x8B, 0x66}, {0x8B, 0x6F}, {0x8B, 0x5F}, /* 0xB4-0xB7 */ + {0x8B, 0x6B}, {0x8D, 0x0F}, {0x8D, 0x0D}, {0x8E, 0x89}, /* 0xB8-0xBB */ + {0x8E, 0x81}, {0x8E, 0x85}, {0x8E, 0x82}, {0x91, 0xB4}, /* 0xBC-0xBF */ + {0x91, 0xCB}, {0x94, 0x18}, {0x94, 0x03}, {0x93, 0xFD}, /* 0xC0-0xC3 */ + {0x95, 0xE1}, {0x97, 0x30}, {0x98, 0xC4}, {0x99, 0x52}, /* 0xC4-0xC7 */ + {0x99, 0x51}, {0x99, 0xA8}, {0x9A, 0x2B}, {0x9A, 0x30}, /* 0xC8-0xCB */ + {0x9A, 0x37}, {0x9A, 0x35}, {0x9C, 0x13}, {0x9C, 0x0D}, /* 0xCC-0xCF */ + {0x9E, 0x79}, {0x9E, 0xB5}, {0x9E, 0xE8}, {0x9F, 0x2F}, /* 0xD0-0xD3 */ + {0x9F, 0x5F}, {0x9F, 0x63}, {0x9F, 0x61}, {0x51, 0x37}, /* 0xD4-0xD7 */ + {0x51, 0x38}, {0x56, 0xC1}, {0x56, 0xC0}, {0x56, 0xC2}, /* 0xD8-0xDB */ + {0x59, 0x14}, {0x5C, 0x6C}, {0x5D, 0xCD}, {0x61, 0xFC}, /* 0xDC-0xDF */ + {0x61, 0xFE}, {0x65, 0x1D}, {0x65, 0x1C}, {0x65, 0x95}, /* 0xE0-0xE3 */ + {0x66, 0xE9}, {0x6A, 0xFB}, {0x6B, 0x04}, {0x6A, 0xFA}, /* 0xE4-0xE7 */ + {0x6B, 0xB2}, {0x70, 0x4C}, {0x72, 0x1B}, {0x72, 0xA7}, /* 0xE8-0xEB */ + {0x74, 0xD6}, {0x74, 0xD4}, {0x76, 0x69}, {0x77, 0xD3}, /* 0xEC-0xEF */ + {0x7C, 0x50}, {0x7E, 0x8F}, {0x7E, 0x8C}, {0x7F, 0xBC}, /* 0xF0-0xF3 */ + {0x86, 0x17}, {0x86, 0x2D}, {0x86, 0x1A}, {0x88, 0x23}, /* 0xF4-0xF7 */ + {0x88, 0x22}, {0x88, 0x21}, {0x88, 0x1F}, {0x89, 0x6A}, /* 0xF8-0xFB */ + {0x89, 0x6C}, {0x89, 0xBD}, {0x8B, 0x74}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8B, 0x77}, {0x8B, 0x7D}, {0x8D, 0x13}, {0x8E, 0x8A}, /* 0x40-0x43 */ + {0x8E, 0x8D}, {0x8E, 0x8B}, {0x8F, 0x5F}, {0x8F, 0xAF}, /* 0x44-0x47 */ + {0x91, 0xBA}, {0x94, 0x2E}, {0x94, 0x33}, {0x94, 0x35}, /* 0x48-0x4B */ + {0x94, 0x3A}, {0x94, 0x38}, {0x94, 0x32}, {0x94, 0x2B}, /* 0x4C-0x4F */ + {0x95, 0xE2}, {0x97, 0x38}, {0x97, 0x39}, {0x97, 0x32}, /* 0x50-0x53 */ + {0x97, 0xFF}, {0x98, 0x67}, {0x98, 0x65}, {0x99, 0x57}, /* 0x54-0x57 */ + {0x9A, 0x45}, {0x9A, 0x43}, {0x9A, 0x40}, {0x9A, 0x3E}, /* 0x58-0x5B */ + {0x9A, 0xCF}, {0x9B, 0x54}, {0x9B, 0x51}, {0x9C, 0x2D}, /* 0x5C-0x5F */ + {0x9C, 0x25}, {0x9D, 0xAF}, {0x9D, 0xB4}, {0x9D, 0xC2}, /* 0x60-0x63 */ + {0x9D, 0xB8}, {0x9E, 0x9D}, {0x9E, 0xEF}, {0x9F, 0x19}, /* 0x64-0x67 */ + {0x9F, 0x5C}, {0x9F, 0x66}, {0x9F, 0x67}, {0x51, 0x3C}, /* 0x68-0x6B */ + {0x51, 0x3B}, {0x56, 0xC8}, {0x56, 0xCA}, {0x56, 0xC9}, /* 0x6C-0x6F */ + {0x5B, 0x7F}, {0x5D, 0xD4}, {0x5D, 0xD2}, {0x5F, 0x4E}, /* 0x70-0x73 */ + {0x61, 0xFF}, {0x65, 0x24}, {0x6B, 0x0A}, {0x6B, 0x61}, /* 0x74-0x77 */ + {0x70, 0x51}, {0x70, 0x58}, {0x73, 0x80}, {0x74, 0xE4}, /* 0x78-0x7B */ + {0x75, 0x8A}, {0x76, 0x6E}, {0x76, 0x6C}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x79, 0xB3}, {0x7C, 0x60}, {0x7C, 0x5F}, /* 0xA0-0xA3 */ + {0x80, 0x7E}, {0x80, 0x7D}, {0x81, 0xDF}, {0x89, 0x72}, /* 0xA4-0xA7 */ + {0x89, 0x6F}, {0x89, 0xFC}, {0x8B, 0x80}, {0x8D, 0x16}, /* 0xA8-0xAB */ + {0x8D, 0x17}, {0x8E, 0x91}, {0x8E, 0x93}, {0x8F, 0x61}, /* 0xAC-0xAF */ + {0x91, 0x48}, {0x94, 0x44}, {0x94, 0x51}, {0x94, 0x52}, /* 0xB0-0xB3 */ + {0x97, 0x3D}, {0x97, 0x3E}, {0x97, 0xC3}, {0x97, 0xC1}, /* 0xB4-0xB7 */ + {0x98, 0x6B}, {0x99, 0x55}, {0x9A, 0x55}, {0x9A, 0x4D}, /* 0xB8-0xBB */ + {0x9A, 0xD2}, {0x9B, 0x1A}, {0x9C, 0x49}, {0x9C, 0x31}, /* 0xBC-0xBF */ + {0x9C, 0x3E}, {0x9C, 0x3B}, {0x9D, 0xD3}, {0x9D, 0xD7}, /* 0xC0-0xC3 */ + {0x9F, 0x34}, {0x9F, 0x6C}, {0x9F, 0x6A}, {0x9F, 0x94}, /* 0xC4-0xC7 */ + {0x56, 0xCC}, {0x5D, 0xD6}, {0x62, 0x00}, {0x65, 0x23}, /* 0xC8-0xCB */ + {0x65, 0x2B}, {0x65, 0x2A}, {0x66, 0xEC}, {0x6B, 0x10}, /* 0xCC-0xCF */ + {0x74, 0xDA}, {0x7A, 0xCA}, {0x7C, 0x64}, {0x7C, 0x63}, /* 0xD0-0xD3 */ + {0x7C, 0x65}, {0x7E, 0x93}, {0x7E, 0x96}, {0x7E, 0x94}, /* 0xD4-0xD7 */ + {0x81, 0xE2}, {0x86, 0x38}, {0x86, 0x3F}, {0x88, 0x31}, /* 0xD8-0xDB */ + {0x8B, 0x8A}, {0x90, 0x90}, {0x90, 0x8F}, {0x94, 0x63}, /* 0xDC-0xDF */ + {0x94, 0x60}, {0x94, 0x64}, {0x97, 0x68}, {0x98, 0x6F}, /* 0xE0-0xE3 */ + {0x99, 0x5C}, {0x9A, 0x5A}, {0x9A, 0x5B}, {0x9A, 0x57}, /* 0xE4-0xE7 */ + {0x9A, 0xD3}, {0x9A, 0xD4}, {0x9A, 0xD1}, {0x9C, 0x54}, /* 0xE8-0xEB */ + {0x9C, 0x57}, {0x9C, 0x56}, {0x9D, 0xE5}, {0x9E, 0x9F}, /* 0xEC-0xEF */ + {0x9E, 0xF4}, {0x56, 0xD1}, {0x58, 0xE9}, {0x65, 0x2C}, /* 0xF0-0xF3 */ + {0x70, 0x5E}, {0x76, 0x71}, {0x76, 0x72}, {0x77, 0xD7}, /* 0xF4-0xF7 */ + {0x7F, 0x50}, {0x7F, 0x88}, {0x88, 0x36}, {0x88, 0x39}, /* 0xF8-0xFB */ + {0x88, 0x62}, {0x8B, 0x93}, {0x8B, 0x92}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8B, 0x96}, {0x82, 0x77}, {0x8D, 0x1B}, {0x91, 0xC0}, /* 0x40-0x43 */ + {0x94, 0x6A}, {0x97, 0x42}, {0x97, 0x48}, {0x97, 0x44}, /* 0x44-0x47 */ + {0x97, 0xC6}, {0x98, 0x70}, {0x9A, 0x5F}, {0x9B, 0x22}, /* 0x48-0x4B */ + {0x9B, 0x58}, {0x9C, 0x5F}, {0x9D, 0xF9}, {0x9D, 0xFA}, /* 0x4C-0x4F */ + {0x9E, 0x7C}, {0x9E, 0x7D}, {0x9F, 0x07}, {0x9F, 0x77}, /* 0x50-0x53 */ + {0x9F, 0x72}, {0x5E, 0xF3}, {0x6B, 0x16}, {0x70, 0x63}, /* 0x54-0x57 */ + {0x7C, 0x6C}, {0x7C, 0x6E}, {0x88, 0x3B}, {0x89, 0xC0}, /* 0x58-0x5B */ + {0x8E, 0xA1}, {0x91, 0xC1}, {0x94, 0x72}, {0x94, 0x70}, /* 0x5C-0x5F */ + {0x98, 0x71}, {0x99, 0x5E}, {0x9A, 0xD6}, {0x9B, 0x23}, /* 0x60-0x63 */ + {0x9E, 0xCC}, {0x70, 0x64}, {0x77, 0xDA}, {0x8B, 0x9A}, /* 0x64-0x67 */ + {0x94, 0x77}, {0x97, 0xC9}, {0x9A, 0x62}, {0x9A, 0x65}, /* 0x68-0x6B */ + {0x7E, 0x9C}, {0x8B, 0x9C}, {0x8E, 0xAA}, {0x91, 0xC5}, /* 0x6C-0x6F */ + {0x94, 0x7D}, {0x94, 0x7E}, {0x94, 0x7C}, {0x9C, 0x77}, /* 0x70-0x73 */ + {0x9C, 0x78}, {0x9E, 0xF7}, {0x8C, 0x54}, {0x94, 0x7F}, /* 0x74-0x77 */ + {0x9E, 0x1A}, {0x72, 0x28}, {0x9A, 0x6A}, {0x9B, 0x31}, /* 0x78-0x7B */ + {0x9E, 0x1B}, {0x9E, 0x1E}, {0x7C, 0x72}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA0-0xA3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA4-0xA7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xA8-0xAB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xAC-0xAF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB0-0xB3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB4-0xB7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xB8-0xBB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xBC-0xBF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC0-0xC3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC4-0xC7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xC8-0xCB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xCC-0xCF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD0-0xD3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD4-0xD7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xD8-0xDB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xDC-0xDF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE0-0xE3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE4-0xE7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xE8-0xEB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xEC-0xEF */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF0-0xF3 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF4-0xF7 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xF8-0xFB */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_C9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x4E, 0x42}, {0x4E, 0x5C}, {0x51, 0xF5}, {0x53, 0x1A}, /* 0x40-0x43 */ + {0x53, 0x82}, {0x4E, 0x07}, {0x4E, 0x0C}, {0x4E, 0x47}, /* 0x44-0x47 */ + {0x4E, 0x8D}, {0x56, 0xD7}, {0xFA, 0x0C}, {0x5C, 0x6E}, /* 0x48-0x4B */ + {0x5F, 0x73}, {0x4E, 0x0F}, {0x51, 0x87}, {0x4E, 0x0E}, /* 0x4C-0x4F */ + {0x4E, 0x2E}, {0x4E, 0x93}, {0x4E, 0xC2}, {0x4E, 0xC9}, /* 0x50-0x53 */ + {0x4E, 0xC8}, {0x51, 0x98}, {0x52, 0xFC}, {0x53, 0x6C}, /* 0x54-0x57 */ + {0x53, 0xB9}, {0x57, 0x20}, {0x59, 0x03}, {0x59, 0x2C}, /* 0x58-0x5B */ + {0x5C, 0x10}, {0x5D, 0xFF}, {0x65, 0xE1}, {0x6B, 0xB3}, /* 0x5C-0x5F */ + {0x6B, 0xCC}, {0x6C, 0x14}, {0x72, 0x3F}, {0x4E, 0x31}, /* 0x60-0x63 */ + {0x4E, 0x3C}, {0x4E, 0xE8}, {0x4E, 0xDC}, {0x4E, 0xE9}, /* 0x64-0x67 */ + {0x4E, 0xE1}, {0x4E, 0xDD}, {0x4E, 0xDA}, {0x52, 0x0C}, /* 0x68-0x6B */ + {0x53, 0x1C}, {0x53, 0x4C}, {0x57, 0x22}, {0x57, 0x23}, /* 0x6C-0x6F */ + {0x59, 0x17}, {0x59, 0x2F}, {0x5B, 0x81}, {0x5B, 0x84}, /* 0x70-0x73 */ + {0x5C, 0x12}, {0x5C, 0x3B}, {0x5C, 0x74}, {0x5C, 0x73}, /* 0x74-0x77 */ + {0x5E, 0x04}, {0x5E, 0x80}, {0x5E, 0x82}, {0x5F, 0xC9}, /* 0x78-0x7B */ + {0x62, 0x09}, {0x62, 0x50}, {0x6C, 0x15}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x6C, 0x36}, {0x6C, 0x43}, {0x6C, 0x3F}, /* 0xA0-0xA3 */ + {0x6C, 0x3B}, {0x72, 0xAE}, {0x72, 0xB0}, {0x73, 0x8A}, /* 0xA4-0xA7 */ + {0x79, 0xB8}, {0x80, 0x8A}, {0x96, 0x1E}, {0x4F, 0x0E}, /* 0xA8-0xAB */ + {0x4F, 0x18}, {0x4F, 0x2C}, {0x4E, 0xF5}, {0x4F, 0x14}, /* 0xAC-0xAF */ + {0x4E, 0xF1}, {0x4F, 0x00}, {0x4E, 0xF7}, {0x4F, 0x08}, /* 0xB0-0xB3 */ + {0x4F, 0x1D}, {0x4F, 0x02}, {0x4F, 0x05}, {0x4F, 0x22}, /* 0xB4-0xB7 */ + {0x4F, 0x13}, {0x4F, 0x04}, {0x4E, 0xF4}, {0x4F, 0x12}, /* 0xB8-0xBB */ + {0x51, 0xB1}, {0x52, 0x13}, {0x52, 0x09}, {0x52, 0x10}, /* 0xBC-0xBF */ + {0x52, 0xA6}, {0x53, 0x22}, {0x53, 0x1F}, {0x53, 0x4D}, /* 0xC0-0xC3 */ + {0x53, 0x8A}, {0x54, 0x07}, {0x56, 0xE1}, {0x56, 0xDF}, /* 0xC4-0xC7 */ + {0x57, 0x2E}, {0x57, 0x2A}, {0x57, 0x34}, {0x59, 0x3C}, /* 0xC8-0xCB */ + {0x59, 0x80}, {0x59, 0x7C}, {0x59, 0x85}, {0x59, 0x7B}, /* 0xCC-0xCF */ + {0x59, 0x7E}, {0x59, 0x77}, {0x59, 0x7F}, {0x5B, 0x56}, /* 0xD0-0xD3 */ + {0x5C, 0x15}, {0x5C, 0x25}, {0x5C, 0x7C}, {0x5C, 0x7A}, /* 0xD4-0xD7 */ + {0x5C, 0x7B}, {0x5C, 0x7E}, {0x5D, 0xDF}, {0x5E, 0x75}, /* 0xD8-0xDB */ + {0x5E, 0x84}, {0x5F, 0x02}, {0x5F, 0x1A}, {0x5F, 0x74}, /* 0xDC-0xDF */ + {0x5F, 0xD5}, {0x5F, 0xD4}, {0x5F, 0xCF}, {0x62, 0x5C}, /* 0xE0-0xE3 */ + {0x62, 0x5E}, {0x62, 0x64}, {0x62, 0x61}, {0x62, 0x66}, /* 0xE4-0xE7 */ + {0x62, 0x62}, {0x62, 0x59}, {0x62, 0x60}, {0x62, 0x5A}, /* 0xE8-0xEB */ + {0x62, 0x65}, {0x65, 0xEF}, {0x65, 0xEE}, {0x67, 0x3E}, /* 0xEC-0xEF */ + {0x67, 0x39}, {0x67, 0x38}, {0x67, 0x3B}, {0x67, 0x3A}, /* 0xF0-0xF3 */ + {0x67, 0x3F}, {0x67, 0x3C}, {0x67, 0x33}, {0x6C, 0x18}, /* 0xF4-0xF7 */ + {0x6C, 0x46}, {0x6C, 0x52}, {0x6C, 0x5C}, {0x6C, 0x4F}, /* 0xF8-0xFB */ + {0x6C, 0x4A}, {0x6C, 0x54}, {0x6C, 0x4B}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6C, 0x4C}, {0x70, 0x71}, {0x72, 0x5E}, {0x72, 0xB4}, /* 0x40-0x43 */ + {0x72, 0xB5}, {0x73, 0x8E}, {0x75, 0x2A}, {0x76, 0x7F}, /* 0x44-0x47 */ + {0x7A, 0x75}, {0x7F, 0x51}, {0x82, 0x78}, {0x82, 0x7C}, /* 0x48-0x4B */ + {0x82, 0x80}, {0x82, 0x7D}, {0x82, 0x7F}, {0x86, 0x4D}, /* 0x4C-0x4F */ + {0x89, 0x7E}, {0x90, 0x99}, {0x90, 0x97}, {0x90, 0x98}, /* 0x50-0x53 */ + {0x90, 0x9B}, {0x90, 0x94}, {0x96, 0x22}, {0x96, 0x24}, /* 0x54-0x57 */ + {0x96, 0x20}, {0x96, 0x23}, {0x4F, 0x56}, {0x4F, 0x3B}, /* 0x58-0x5B */ + {0x4F, 0x62}, {0x4F, 0x49}, {0x4F, 0x53}, {0x4F, 0x64}, /* 0x5C-0x5F */ + {0x4F, 0x3E}, {0x4F, 0x67}, {0x4F, 0x52}, {0x4F, 0x5F}, /* 0x60-0x63 */ + {0x4F, 0x41}, {0x4F, 0x58}, {0x4F, 0x2D}, {0x4F, 0x33}, /* 0x64-0x67 */ + {0x4F, 0x3F}, {0x4F, 0x61}, {0x51, 0x8F}, {0x51, 0xB9}, /* 0x68-0x6B */ + {0x52, 0x1C}, {0x52, 0x1E}, {0x52, 0x21}, {0x52, 0xAD}, /* 0x6C-0x6F */ + {0x52, 0xAE}, {0x53, 0x09}, {0x53, 0x63}, {0x53, 0x72}, /* 0x70-0x73 */ + {0x53, 0x8E}, {0x53, 0x8F}, {0x54, 0x30}, {0x54, 0x37}, /* 0x74-0x77 */ + {0x54, 0x2A}, {0x54, 0x54}, {0x54, 0x45}, {0x54, 0x19}, /* 0x78-0x7B */ + {0x54, 0x1C}, {0x54, 0x25}, {0x54, 0x18}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x54, 0x3D}, {0x54, 0x4F}, {0x54, 0x41}, /* 0xA0-0xA3 */ + {0x54, 0x28}, {0x54, 0x24}, {0x54, 0x47}, {0x56, 0xEE}, /* 0xA4-0xA7 */ + {0x56, 0xE7}, {0x56, 0xE5}, {0x57, 0x41}, {0x57, 0x45}, /* 0xA8-0xAB */ + {0x57, 0x4C}, {0x57, 0x49}, {0x57, 0x4B}, {0x57, 0x52}, /* 0xAC-0xAF */ + {0x59, 0x06}, {0x59, 0x40}, {0x59, 0xA6}, {0x59, 0x98}, /* 0xB0-0xB3 */ + {0x59, 0xA0}, {0x59, 0x97}, {0x59, 0x8E}, {0x59, 0xA2}, /* 0xB4-0xB7 */ + {0x59, 0x90}, {0x59, 0x8F}, {0x59, 0xA7}, {0x59, 0xA1}, /* 0xB8-0xBB */ + {0x5B, 0x8E}, {0x5B, 0x92}, {0x5C, 0x28}, {0x5C, 0x2A}, /* 0xBC-0xBF */ + {0x5C, 0x8D}, {0x5C, 0x8F}, {0x5C, 0x88}, {0x5C, 0x8B}, /* 0xC0-0xC3 */ + {0x5C, 0x89}, {0x5C, 0x92}, {0x5C, 0x8A}, {0x5C, 0x86}, /* 0xC4-0xC7 */ + {0x5C, 0x93}, {0x5C, 0x95}, {0x5D, 0xE0}, {0x5E, 0x0A}, /* 0xC8-0xCB */ + {0x5E, 0x0E}, {0x5E, 0x8B}, {0x5E, 0x89}, {0x5E, 0x8C}, /* 0xCC-0xCF */ + {0x5E, 0x88}, {0x5E, 0x8D}, {0x5F, 0x05}, {0x5F, 0x1D}, /* 0xD0-0xD3 */ + {0x5F, 0x78}, {0x5F, 0x76}, {0x5F, 0xD2}, {0x5F, 0xD1}, /* 0xD4-0xD7 */ + {0x5F, 0xD0}, {0x5F, 0xED}, {0x5F, 0xE8}, {0x5F, 0xEE}, /* 0xD8-0xDB */ + {0x5F, 0xF3}, {0x5F, 0xE1}, {0x5F, 0xE4}, {0x5F, 0xE3}, /* 0xDC-0xDF */ + {0x5F, 0xFA}, {0x5F, 0xEF}, {0x5F, 0xF7}, {0x5F, 0xFB}, /* 0xE0-0xE3 */ + {0x60, 0x00}, {0x5F, 0xF4}, {0x62, 0x3A}, {0x62, 0x83}, /* 0xE4-0xE7 */ + {0x62, 0x8C}, {0x62, 0x8E}, {0x62, 0x8F}, {0x62, 0x94}, /* 0xE8-0xEB */ + {0x62, 0x87}, {0x62, 0x71}, {0x62, 0x7B}, {0x62, 0x7A}, /* 0xEC-0xEF */ + {0x62, 0x70}, {0x62, 0x81}, {0x62, 0x88}, {0x62, 0x77}, /* 0xF0-0xF3 */ + {0x62, 0x7D}, {0x62, 0x72}, {0x62, 0x74}, {0x65, 0x37}, /* 0xF4-0xF7 */ + {0x65, 0xF0}, {0x65, 0xF4}, {0x65, 0xF3}, {0x65, 0xF2}, /* 0xF8-0xFB */ + {0x65, 0xF5}, {0x67, 0x45}, {0x67, 0x47}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x67, 0x59}, {0x67, 0x55}, {0x67, 0x4C}, {0x67, 0x48}, /* 0x40-0x43 */ + {0x67, 0x5D}, {0x67, 0x4D}, {0x67, 0x5A}, {0x67, 0x4B}, /* 0x44-0x47 */ + {0x6B, 0xD0}, {0x6C, 0x19}, {0x6C, 0x1A}, {0x6C, 0x78}, /* 0x48-0x4B */ + {0x6C, 0x67}, {0x6C, 0x6B}, {0x6C, 0x84}, {0x6C, 0x8B}, /* 0x4C-0x4F */ + {0x6C, 0x8F}, {0x6C, 0x71}, {0x6C, 0x6F}, {0x6C, 0x69}, /* 0x50-0x53 */ + {0x6C, 0x9A}, {0x6C, 0x6D}, {0x6C, 0x87}, {0x6C, 0x95}, /* 0x54-0x57 */ + {0x6C, 0x9C}, {0x6C, 0x66}, {0x6C, 0x73}, {0x6C, 0x65}, /* 0x58-0x5B */ + {0x6C, 0x7B}, {0x6C, 0x8E}, {0x70, 0x74}, {0x70, 0x7A}, /* 0x5C-0x5F */ + {0x72, 0x63}, {0x72, 0xBF}, {0x72, 0xBD}, {0x72, 0xC3}, /* 0x60-0x63 */ + {0x72, 0xC6}, {0x72, 0xC1}, {0x72, 0xBA}, {0x72, 0xC5}, /* 0x64-0x67 */ + {0x73, 0x95}, {0x73, 0x97}, {0x73, 0x93}, {0x73, 0x94}, /* 0x68-0x6B */ + {0x73, 0x92}, {0x75, 0x3A}, {0x75, 0x39}, {0x75, 0x94}, /* 0x6C-0x6F */ + {0x75, 0x95}, {0x76, 0x81}, {0x79, 0x3D}, {0x80, 0x34}, /* 0x70-0x73 */ + {0x80, 0x95}, {0x80, 0x99}, {0x80, 0x90}, {0x80, 0x92}, /* 0x74-0x77 */ + {0x80, 0x9C}, {0x82, 0x90}, {0x82, 0x8F}, {0x82, 0x85}, /* 0x78-0x7B */ + {0x82, 0x8E}, {0x82, 0x91}, {0x82, 0x93}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x82, 0x8A}, {0x82, 0x83}, {0x82, 0x84}, /* 0xA0-0xA3 */ + {0x8C, 0x78}, {0x8F, 0xC9}, {0x8F, 0xBF}, {0x90, 0x9F}, /* 0xA4-0xA7 */ + {0x90, 0xA1}, {0x90, 0xA5}, {0x90, 0x9E}, {0x90, 0xA7}, /* 0xA8-0xAB */ + {0x90, 0xA0}, {0x96, 0x30}, {0x96, 0x28}, {0x96, 0x2F}, /* 0xAC-0xAF */ + {0x96, 0x2D}, {0x4E, 0x33}, {0x4F, 0x98}, {0x4F, 0x7C}, /* 0xB0-0xB3 */ + {0x4F, 0x85}, {0x4F, 0x7D}, {0x4F, 0x80}, {0x4F, 0x87}, /* 0xB4-0xB7 */ + {0x4F, 0x76}, {0x4F, 0x74}, {0x4F, 0x89}, {0x4F, 0x84}, /* 0xB8-0xBB */ + {0x4F, 0x77}, {0x4F, 0x4C}, {0x4F, 0x97}, {0x4F, 0x6A}, /* 0xBC-0xBF */ + {0x4F, 0x9A}, {0x4F, 0x79}, {0x4F, 0x81}, {0x4F, 0x78}, /* 0xC0-0xC3 */ + {0x4F, 0x90}, {0x4F, 0x9C}, {0x4F, 0x94}, {0x4F, 0x9E}, /* 0xC4-0xC7 */ + {0x4F, 0x92}, {0x4F, 0x82}, {0x4F, 0x95}, {0x4F, 0x6B}, /* 0xC8-0xCB */ + {0x4F, 0x6E}, {0x51, 0x9E}, {0x51, 0xBC}, {0x51, 0xBE}, /* 0xCC-0xCF */ + {0x52, 0x35}, {0x52, 0x32}, {0x52, 0x33}, {0x52, 0x46}, /* 0xD0-0xD3 */ + {0x52, 0x31}, {0x52, 0xBC}, {0x53, 0x0A}, {0x53, 0x0B}, /* 0xD4-0xD7 */ + {0x53, 0x3C}, {0x53, 0x92}, {0x53, 0x94}, {0x54, 0x87}, /* 0xD8-0xDB */ + {0x54, 0x7F}, {0x54, 0x81}, {0x54, 0x91}, {0x54, 0x82}, /* 0xDC-0xDF */ + {0x54, 0x88}, {0x54, 0x6B}, {0x54, 0x7A}, {0x54, 0x7E}, /* 0xE0-0xE3 */ + {0x54, 0x65}, {0x54, 0x6C}, {0x54, 0x74}, {0x54, 0x66}, /* 0xE4-0xE7 */ + {0x54, 0x8D}, {0x54, 0x6F}, {0x54, 0x61}, {0x54, 0x60}, /* 0xE8-0xEB */ + {0x54, 0x98}, {0x54, 0x63}, {0x54, 0x67}, {0x54, 0x64}, /* 0xEC-0xEF */ + {0x56, 0xF7}, {0x56, 0xF9}, {0x57, 0x6F}, {0x57, 0x72}, /* 0xF0-0xF3 */ + {0x57, 0x6D}, {0x57, 0x6B}, {0x57, 0x71}, {0x57, 0x70}, /* 0xF4-0xF7 */ + {0x57, 0x76}, {0x57, 0x80}, {0x57, 0x75}, {0x57, 0x7B}, /* 0xF8-0xFB */ + {0x57, 0x73}, {0x57, 0x74}, {0x57, 0x62}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x57, 0x68}, {0x57, 0x7D}, {0x59, 0x0C}, {0x59, 0x45}, /* 0x40-0x43 */ + {0x59, 0xB5}, {0x59, 0xBA}, {0x59, 0xCF}, {0x59, 0xCE}, /* 0x44-0x47 */ + {0x59, 0xB2}, {0x59, 0xCC}, {0x59, 0xC1}, {0x59, 0xB6}, /* 0x48-0x4B */ + {0x59, 0xBC}, {0x59, 0xC3}, {0x59, 0xD6}, {0x59, 0xB1}, /* 0x4C-0x4F */ + {0x59, 0xBD}, {0x59, 0xC0}, {0x59, 0xC8}, {0x59, 0xB4}, /* 0x50-0x53 */ + {0x59, 0xC7}, {0x5B, 0x62}, {0x5B, 0x65}, {0x5B, 0x93}, /* 0x54-0x57 */ + {0x5B, 0x95}, {0x5C, 0x44}, {0x5C, 0x47}, {0x5C, 0xAE}, /* 0x58-0x5B */ + {0x5C, 0xA4}, {0x5C, 0xA0}, {0x5C, 0xB5}, {0x5C, 0xAF}, /* 0x5C-0x5F */ + {0x5C, 0xA8}, {0x5C, 0xAC}, {0x5C, 0x9F}, {0x5C, 0xA3}, /* 0x60-0x63 */ + {0x5C, 0xAD}, {0x5C, 0xA2}, {0x5C, 0xAA}, {0x5C, 0xA7}, /* 0x64-0x67 */ + {0x5C, 0x9D}, {0x5C, 0xA5}, {0x5C, 0xB6}, {0x5C, 0xB0}, /* 0x68-0x6B */ + {0x5C, 0xA6}, {0x5E, 0x17}, {0x5E, 0x14}, {0x5E, 0x19}, /* 0x6C-0x6F */ + {0x5F, 0x28}, {0x5F, 0x22}, {0x5F, 0x23}, {0x5F, 0x24}, /* 0x70-0x73 */ + {0x5F, 0x54}, {0x5F, 0x82}, {0x5F, 0x7E}, {0x5F, 0x7D}, /* 0x74-0x77 */ + {0x5F, 0xDE}, {0x5F, 0xE5}, {0x60, 0x2D}, {0x60, 0x26}, /* 0x78-0x7B */ + {0x60, 0x19}, {0x60, 0x32}, {0x60, 0x0B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x60, 0x34}, {0x60, 0x0A}, {0x60, 0x17}, /* 0xA0-0xA3 */ + {0x60, 0x33}, {0x60, 0x1A}, {0x60, 0x1E}, {0x60, 0x2C}, /* 0xA4-0xA7 */ + {0x60, 0x22}, {0x60, 0x0D}, {0x60, 0x10}, {0x60, 0x2E}, /* 0xA8-0xAB */ + {0x60, 0x13}, {0x60, 0x11}, {0x60, 0x0C}, {0x60, 0x09}, /* 0xAC-0xAF */ + {0x60, 0x1C}, {0x62, 0x14}, {0x62, 0x3D}, {0x62, 0xAD}, /* 0xB0-0xB3 */ + {0x62, 0xB4}, {0x62, 0xD1}, {0x62, 0xBE}, {0x62, 0xAA}, /* 0xB4-0xB7 */ + {0x62, 0xB6}, {0x62, 0xCA}, {0x62, 0xAE}, {0x62, 0xB3}, /* 0xB8-0xBB */ + {0x62, 0xAF}, {0x62, 0xBB}, {0x62, 0xA9}, {0x62, 0xB0}, /* 0xBC-0xBF */ + {0x62, 0xB8}, {0x65, 0x3D}, {0x65, 0xA8}, {0x65, 0xBB}, /* 0xC0-0xC3 */ + {0x66, 0x09}, {0x65, 0xFC}, {0x66, 0x04}, {0x66, 0x12}, /* 0xC4-0xC7 */ + {0x66, 0x08}, {0x65, 0xFB}, {0x66, 0x03}, {0x66, 0x0B}, /* 0xC8-0xCB */ + {0x66, 0x0D}, {0x66, 0x05}, {0x65, 0xFD}, {0x66, 0x11}, /* 0xCC-0xCF */ + {0x66, 0x10}, {0x66, 0xF6}, {0x67, 0x0A}, {0x67, 0x85}, /* 0xD0-0xD3 */ + {0x67, 0x6C}, {0x67, 0x8E}, {0x67, 0x92}, {0x67, 0x76}, /* 0xD4-0xD7 */ + {0x67, 0x7B}, {0x67, 0x98}, {0x67, 0x86}, {0x67, 0x84}, /* 0xD8-0xDB */ + {0x67, 0x74}, {0x67, 0x8D}, {0x67, 0x8C}, {0x67, 0x7A}, /* 0xDC-0xDF */ + {0x67, 0x9F}, {0x67, 0x91}, {0x67, 0x99}, {0x67, 0x83}, /* 0xE0-0xE3 */ + {0x67, 0x7D}, {0x67, 0x81}, {0x67, 0x78}, {0x67, 0x79}, /* 0xE4-0xE7 */ + {0x67, 0x94}, {0x6B, 0x25}, {0x6B, 0x80}, {0x6B, 0x7E}, /* 0xE8-0xEB */ + {0x6B, 0xDE}, {0x6C, 0x1D}, {0x6C, 0x93}, {0x6C, 0xEC}, /* 0xEC-0xEF */ + {0x6C, 0xEB}, {0x6C, 0xEE}, {0x6C, 0xD9}, {0x6C, 0xB6}, /* 0xF0-0xF3 */ + {0x6C, 0xD4}, {0x6C, 0xAD}, {0x6C, 0xE7}, {0x6C, 0xB7}, /* 0xF4-0xF7 */ + {0x6C, 0xD0}, {0x6C, 0xC2}, {0x6C, 0xBA}, {0x6C, 0xC3}, /* 0xF8-0xFB */ + {0x6C, 0xC6}, {0x6C, 0xED}, {0x6C, 0xF2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6C, 0xD2}, {0x6C, 0xDD}, {0x6C, 0xB4}, {0x6C, 0x8A}, /* 0x40-0x43 */ + {0x6C, 0x9D}, {0x6C, 0x80}, {0x6C, 0xDE}, {0x6C, 0xC0}, /* 0x44-0x47 */ + {0x6D, 0x30}, {0x6C, 0xCD}, {0x6C, 0xC7}, {0x6C, 0xB0}, /* 0x48-0x4B */ + {0x6C, 0xF9}, {0x6C, 0xCF}, {0x6C, 0xE9}, {0x6C, 0xD1}, /* 0x4C-0x4F */ + {0x70, 0x94}, {0x70, 0x98}, {0x70, 0x85}, {0x70, 0x93}, /* 0x50-0x53 */ + {0x70, 0x86}, {0x70, 0x84}, {0x70, 0x91}, {0x70, 0x96}, /* 0x54-0x57 */ + {0x70, 0x82}, {0x70, 0x9A}, {0x70, 0x83}, {0x72, 0x6A}, /* 0x58-0x5B */ + {0x72, 0xD6}, {0x72, 0xCB}, {0x72, 0xD8}, {0x72, 0xC9}, /* 0x5C-0x5F */ + {0x72, 0xDC}, {0x72, 0xD2}, {0x72, 0xD4}, {0x72, 0xDA}, /* 0x60-0x63 */ + {0x72, 0xCC}, {0x72, 0xD1}, {0x73, 0xA4}, {0x73, 0xA1}, /* 0x64-0x67 */ + {0x73, 0xAD}, {0x73, 0xA6}, {0x73, 0xA2}, {0x73, 0xA0}, /* 0x68-0x6B */ + {0x73, 0xAC}, {0x73, 0x9D}, {0x74, 0xDD}, {0x74, 0xE8}, /* 0x6C-0x6F */ + {0x75, 0x3F}, {0x75, 0x40}, {0x75, 0x3E}, {0x75, 0x8C}, /* 0x70-0x73 */ + {0x75, 0x98}, {0x76, 0xAF}, {0x76, 0xF3}, {0x76, 0xF1}, /* 0x74-0x77 */ + {0x76, 0xF0}, {0x76, 0xF5}, {0x77, 0xF8}, {0x77, 0xFC}, /* 0x78-0x7B */ + {0x77, 0xF9}, {0x77, 0xFB}, {0x77, 0xFA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x77, 0xF7}, {0x79, 0x42}, {0x79, 0x3F}, /* 0xA0-0xA3 */ + {0x79, 0xC5}, {0x7A, 0x78}, {0x7A, 0x7B}, {0x7A, 0xFB}, /* 0xA4-0xA7 */ + {0x7C, 0x75}, {0x7C, 0xFD}, {0x80, 0x35}, {0x80, 0x8F}, /* 0xA8-0xAB */ + {0x80, 0xAE}, {0x80, 0xA3}, {0x80, 0xB8}, {0x80, 0xB5}, /* 0xAC-0xAF */ + {0x80, 0xAD}, {0x82, 0x20}, {0x82, 0xA0}, {0x82, 0xC0}, /* 0xB0-0xB3 */ + {0x82, 0xAB}, {0x82, 0x9A}, {0x82, 0x98}, {0x82, 0x9B}, /* 0xB4-0xB7 */ + {0x82, 0xB5}, {0x82, 0xA7}, {0x82, 0xAE}, {0x82, 0xBC}, /* 0xB8-0xBB */ + {0x82, 0x9E}, {0x82, 0xBA}, {0x82, 0xB4}, {0x82, 0xA8}, /* 0xBC-0xBF */ + {0x82, 0xA1}, {0x82, 0xA9}, {0x82, 0xC2}, {0x82, 0xA4}, /* 0xC0-0xC3 */ + {0x82, 0xC3}, {0x82, 0xB6}, {0x82, 0xA2}, {0x86, 0x70}, /* 0xC4-0xC7 */ + {0x86, 0x6F}, {0x86, 0x6D}, {0x86, 0x6E}, {0x8C, 0x56}, /* 0xC8-0xCB */ + {0x8F, 0xD2}, {0x8F, 0xCB}, {0x8F, 0xD3}, {0x8F, 0xCD}, /* 0xCC-0xCF */ + {0x8F, 0xD6}, {0x8F, 0xD5}, {0x8F, 0xD7}, {0x90, 0xB2}, /* 0xD0-0xD3 */ + {0x90, 0xB4}, {0x90, 0xAF}, {0x90, 0xB3}, {0x90, 0xB0}, /* 0xD4-0xD7 */ + {0x96, 0x39}, {0x96, 0x3D}, {0x96, 0x3C}, {0x96, 0x3A}, /* 0xD8-0xDB */ + {0x96, 0x43}, {0x4F, 0xCD}, {0x4F, 0xC5}, {0x4F, 0xD3}, /* 0xDC-0xDF */ + {0x4F, 0xB2}, {0x4F, 0xC9}, {0x4F, 0xCB}, {0x4F, 0xC1}, /* 0xE0-0xE3 */ + {0x4F, 0xD4}, {0x4F, 0xDC}, {0x4F, 0xD9}, {0x4F, 0xBB}, /* 0xE4-0xE7 */ + {0x4F, 0xB3}, {0x4F, 0xDB}, {0x4F, 0xC7}, {0x4F, 0xD6}, /* 0xE8-0xEB */ + {0x4F, 0xBA}, {0x4F, 0xC0}, {0x4F, 0xB9}, {0x4F, 0xEC}, /* 0xEC-0xEF */ + {0x52, 0x44}, {0x52, 0x49}, {0x52, 0xC0}, {0x52, 0xC2}, /* 0xF0-0xF3 */ + {0x53, 0x3D}, {0x53, 0x7C}, {0x53, 0x97}, {0x53, 0x96}, /* 0xF4-0xF7 */ + {0x53, 0x99}, {0x53, 0x98}, {0x54, 0xBA}, {0x54, 0xA1}, /* 0xF8-0xFB */ + {0x54, 0xAD}, {0x54, 0xA5}, {0x54, 0xCF}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x54, 0xC3}, {0x83, 0x0D}, {0x54, 0xB7}, {0x54, 0xAE}, /* 0x40-0x43 */ + {0x54, 0xD6}, {0x54, 0xB6}, {0x54, 0xC5}, {0x54, 0xC6}, /* 0x44-0x47 */ + {0x54, 0xA0}, {0x54, 0x70}, {0x54, 0xBC}, {0x54, 0xA2}, /* 0x48-0x4B */ + {0x54, 0xBE}, {0x54, 0x72}, {0x54, 0xDE}, {0x54, 0xB0}, /* 0x4C-0x4F */ + {0x57, 0xB5}, {0x57, 0x9E}, {0x57, 0x9F}, {0x57, 0xA4}, /* 0x50-0x53 */ + {0x57, 0x8C}, {0x57, 0x97}, {0x57, 0x9D}, {0x57, 0x9B}, /* 0x54-0x57 */ + {0x57, 0x94}, {0x57, 0x98}, {0x57, 0x8F}, {0x57, 0x99}, /* 0x58-0x5B */ + {0x57, 0xA5}, {0x57, 0x9A}, {0x57, 0x95}, {0x58, 0xF4}, /* 0x5C-0x5F */ + {0x59, 0x0D}, {0x59, 0x53}, {0x59, 0xE1}, {0x59, 0xDE}, /* 0x60-0x63 */ + {0x59, 0xEE}, {0x5A, 0x00}, {0x59, 0xF1}, {0x59, 0xDD}, /* 0x64-0x67 */ + {0x59, 0xFA}, {0x59, 0xFD}, {0x59, 0xFC}, {0x59, 0xF6}, /* 0x68-0x6B */ + {0x59, 0xE4}, {0x59, 0xF2}, {0x59, 0xF7}, {0x59, 0xDB}, /* 0x6C-0x6F */ + {0x59, 0xE9}, {0x59, 0xF3}, {0x59, 0xF5}, {0x59, 0xE0}, /* 0x70-0x73 */ + {0x59, 0xFE}, {0x59, 0xF4}, {0x59, 0xED}, {0x5B, 0xA8}, /* 0x74-0x77 */ + {0x5C, 0x4C}, {0x5C, 0xD0}, {0x5C, 0xD8}, {0x5C, 0xCC}, /* 0x78-0x7B */ + {0x5C, 0xD7}, {0x5C, 0xCB}, {0x5C, 0xDB}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x5C, 0xDE}, {0x5C, 0xDA}, {0x5C, 0xC9}, /* 0xA0-0xA3 */ + {0x5C, 0xC7}, {0x5C, 0xCA}, {0x5C, 0xD6}, {0x5C, 0xD3}, /* 0xA4-0xA7 */ + {0x5C, 0xD4}, {0x5C, 0xCF}, {0x5C, 0xC8}, {0x5C, 0xC6}, /* 0xA8-0xAB */ + {0x5C, 0xCE}, {0x5C, 0xDF}, {0x5C, 0xF8}, {0x5D, 0xF9}, /* 0xAC-0xAF */ + {0x5E, 0x21}, {0x5E, 0x22}, {0x5E, 0x23}, {0x5E, 0x20}, /* 0xB0-0xB3 */ + {0x5E, 0x24}, {0x5E, 0xB0}, {0x5E, 0xA4}, {0x5E, 0xA2}, /* 0xB4-0xB7 */ + {0x5E, 0x9B}, {0x5E, 0xA3}, {0x5E, 0xA5}, {0x5F, 0x07}, /* 0xB8-0xBB */ + {0x5F, 0x2E}, {0x5F, 0x56}, {0x5F, 0x86}, {0x60, 0x37}, /* 0xBC-0xBF */ + {0x60, 0x39}, {0x60, 0x54}, {0x60, 0x72}, {0x60, 0x5E}, /* 0xC0-0xC3 */ + {0x60, 0x45}, {0x60, 0x53}, {0x60, 0x47}, {0x60, 0x49}, /* 0xC4-0xC7 */ + {0x60, 0x5B}, {0x60, 0x4C}, {0x60, 0x40}, {0x60, 0x42}, /* 0xC8-0xCB */ + {0x60, 0x5F}, {0x60, 0x24}, {0x60, 0x44}, {0x60, 0x58}, /* 0xCC-0xCF */ + {0x60, 0x66}, {0x60, 0x6E}, {0x62, 0x42}, {0x62, 0x43}, /* 0xD0-0xD3 */ + {0x62, 0xCF}, {0x63, 0x0D}, {0x63, 0x0B}, {0x62, 0xF5}, /* 0xD4-0xD7 */ + {0x63, 0x0E}, {0x63, 0x03}, {0x62, 0xEB}, {0x62, 0xF9}, /* 0xD8-0xDB */ + {0x63, 0x0F}, {0x63, 0x0C}, {0x62, 0xF8}, {0x62, 0xF6}, /* 0xDC-0xDF */ + {0x63, 0x00}, {0x63, 0x13}, {0x63, 0x14}, {0x62, 0xFA}, /* 0xE0-0xE3 */ + {0x63, 0x15}, {0x62, 0xFB}, {0x62, 0xF0}, {0x65, 0x41}, /* 0xE4-0xE7 */ + {0x65, 0x43}, {0x65, 0xAA}, {0x65, 0xBF}, {0x66, 0x36}, /* 0xE8-0xEB */ + {0x66, 0x21}, {0x66, 0x32}, {0x66, 0x35}, {0x66, 0x1C}, /* 0xEC-0xEF */ + {0x66, 0x26}, {0x66, 0x22}, {0x66, 0x33}, {0x66, 0x2B}, /* 0xF0-0xF3 */ + {0x66, 0x3A}, {0x66, 0x1D}, {0x66, 0x34}, {0x66, 0x39}, /* 0xF4-0xF7 */ + {0x66, 0x2E}, {0x67, 0x0F}, {0x67, 0x10}, {0x67, 0xC1}, /* 0xF8-0xFB */ + {0x67, 0xF2}, {0x67, 0xC8}, {0x67, 0xBA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_CF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x67, 0xDC}, {0x67, 0xBB}, {0x67, 0xF8}, {0x67, 0xD8}, /* 0x40-0x43 */ + {0x67, 0xC0}, {0x67, 0xB7}, {0x67, 0xC5}, {0x67, 0xEB}, /* 0x44-0x47 */ + {0x67, 0xE4}, {0x67, 0xDF}, {0x67, 0xB5}, {0x67, 0xCD}, /* 0x48-0x4B */ + {0x67, 0xB3}, {0x67, 0xF7}, {0x67, 0xF6}, {0x67, 0xEE}, /* 0x4C-0x4F */ + {0x67, 0xE3}, {0x67, 0xC2}, {0x67, 0xB9}, {0x67, 0xCE}, /* 0x50-0x53 */ + {0x67, 0xE7}, {0x67, 0xF0}, {0x67, 0xB2}, {0x67, 0xFC}, /* 0x54-0x57 */ + {0x67, 0xC6}, {0x67, 0xED}, {0x67, 0xCC}, {0x67, 0xAE}, /* 0x58-0x5B */ + {0x67, 0xE6}, {0x67, 0xDB}, {0x67, 0xFA}, {0x67, 0xC9}, /* 0x5C-0x5F */ + {0x67, 0xCA}, {0x67, 0xC3}, {0x67, 0xEA}, {0x67, 0xCB}, /* 0x60-0x63 */ + {0x6B, 0x28}, {0x6B, 0x82}, {0x6B, 0x84}, {0x6B, 0xB6}, /* 0x64-0x67 */ + {0x6B, 0xD6}, {0x6B, 0xD8}, {0x6B, 0xE0}, {0x6C, 0x20}, /* 0x68-0x6B */ + {0x6C, 0x21}, {0x6D, 0x28}, {0x6D, 0x34}, {0x6D, 0x2D}, /* 0x6C-0x6F */ + {0x6D, 0x1F}, {0x6D, 0x3C}, {0x6D, 0x3F}, {0x6D, 0x12}, /* 0x70-0x73 */ + {0x6D, 0x0A}, {0x6C, 0xDA}, {0x6D, 0x33}, {0x6D, 0x04}, /* 0x74-0x77 */ + {0x6D, 0x19}, {0x6D, 0x3A}, {0x6D, 0x1A}, {0x6D, 0x11}, /* 0x78-0x7B */ + {0x6D, 0x00}, {0x6D, 0x1D}, {0x6D, 0x42}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x6D, 0x01}, {0x6D, 0x18}, {0x6D, 0x37}, /* 0xA0-0xA3 */ + {0x6D, 0x03}, {0x6D, 0x0F}, {0x6D, 0x40}, {0x6D, 0x07}, /* 0xA4-0xA7 */ + {0x6D, 0x20}, {0x6D, 0x2C}, {0x6D, 0x08}, {0x6D, 0x22}, /* 0xA8-0xAB */ + {0x6D, 0x09}, {0x6D, 0x10}, {0x70, 0xB7}, {0x70, 0x9F}, /* 0xAC-0xAF */ + {0x70, 0xBE}, {0x70, 0xB1}, {0x70, 0xB0}, {0x70, 0xA1}, /* 0xB0-0xB3 */ + {0x70, 0xB4}, {0x70, 0xB5}, {0x70, 0xA9}, {0x72, 0x41}, /* 0xB4-0xB7 */ + {0x72, 0x49}, {0x72, 0x4A}, {0x72, 0x6C}, {0x72, 0x70}, /* 0xB8-0xBB */ + {0x72, 0x73}, {0x72, 0x6E}, {0x72, 0xCA}, {0x72, 0xE4}, /* 0xBC-0xBF */ + {0x72, 0xE8}, {0x72, 0xEB}, {0x72, 0xDF}, {0x72, 0xEA}, /* 0xC0-0xC3 */ + {0x72, 0xE6}, {0x72, 0xE3}, {0x73, 0x85}, {0x73, 0xCC}, /* 0xC4-0xC7 */ + {0x73, 0xC2}, {0x73, 0xC8}, {0x73, 0xC5}, {0x73, 0xB9}, /* 0xC8-0xCB */ + {0x73, 0xB6}, {0x73, 0xB5}, {0x73, 0xB4}, {0x73, 0xEB}, /* 0xCC-0xCF */ + {0x73, 0xBF}, {0x73, 0xC7}, {0x73, 0xBE}, {0x73, 0xC3}, /* 0xD0-0xD3 */ + {0x73, 0xC6}, {0x73, 0xB8}, {0x73, 0xCB}, {0x74, 0xEC}, /* 0xD4-0xD7 */ + {0x74, 0xEE}, {0x75, 0x2E}, {0x75, 0x47}, {0x75, 0x48}, /* 0xD8-0xDB */ + {0x75, 0xA7}, {0x75, 0xAA}, {0x76, 0x79}, {0x76, 0xC4}, /* 0xDC-0xDF */ + {0x77, 0x08}, {0x77, 0x03}, {0x77, 0x04}, {0x77, 0x05}, /* 0xE0-0xE3 */ + {0x77, 0x0A}, {0x76, 0xF7}, {0x76, 0xFB}, {0x76, 0xFA}, /* 0xE4-0xE7 */ + {0x77, 0xE7}, {0x77, 0xE8}, {0x78, 0x06}, {0x78, 0x11}, /* 0xE8-0xEB */ + {0x78, 0x12}, {0x78, 0x05}, {0x78, 0x10}, {0x78, 0x0F}, /* 0xEC-0xEF */ + {0x78, 0x0E}, {0x78, 0x09}, {0x78, 0x03}, {0x78, 0x13}, /* 0xF0-0xF3 */ + {0x79, 0x4A}, {0x79, 0x4C}, {0x79, 0x4B}, {0x79, 0x45}, /* 0xF4-0xF7 */ + {0x79, 0x44}, {0x79, 0xD5}, {0x79, 0xCD}, {0x79, 0xCF}, /* 0xF8-0xFB */ + {0x79, 0xD6}, {0x79, 0xCE}, {0x7A, 0x80}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7A, 0x7E}, {0x7A, 0xD1}, {0x7B, 0x00}, {0x7B, 0x01}, /* 0x40-0x43 */ + {0x7C, 0x7A}, {0x7C, 0x78}, {0x7C, 0x79}, {0x7C, 0x7F}, /* 0x44-0x47 */ + {0x7C, 0x80}, {0x7C, 0x81}, {0x7D, 0x03}, {0x7D, 0x08}, /* 0x48-0x4B */ + {0x7D, 0x01}, {0x7F, 0x58}, {0x7F, 0x91}, {0x7F, 0x8D}, /* 0x4C-0x4F */ + {0x7F, 0xBE}, {0x80, 0x07}, {0x80, 0x0E}, {0x80, 0x0F}, /* 0x50-0x53 */ + {0x80, 0x14}, {0x80, 0x37}, {0x80, 0xD8}, {0x80, 0xC7}, /* 0x54-0x57 */ + {0x80, 0xE0}, {0x80, 0xD1}, {0x80, 0xC8}, {0x80, 0xC2}, /* 0x58-0x5B */ + {0x80, 0xD0}, {0x80, 0xC5}, {0x80, 0xE3}, {0x80, 0xD9}, /* 0x5C-0x5F */ + {0x80, 0xDC}, {0x80, 0xCA}, {0x80, 0xD5}, {0x80, 0xC9}, /* 0x60-0x63 */ + {0x80, 0xCF}, {0x80, 0xD7}, {0x80, 0xE6}, {0x80, 0xCD}, /* 0x64-0x67 */ + {0x81, 0xFF}, {0x82, 0x21}, {0x82, 0x94}, {0x82, 0xD9}, /* 0x68-0x6B */ + {0x82, 0xFE}, {0x82, 0xF9}, {0x83, 0x07}, {0x82, 0xE8}, /* 0x6C-0x6F */ + {0x83, 0x00}, {0x82, 0xD5}, {0x83, 0x3A}, {0x82, 0xEB}, /* 0x70-0x73 */ + {0x82, 0xD6}, {0x82, 0xF4}, {0x82, 0xEC}, {0x82, 0xE1}, /* 0x74-0x77 */ + {0x82, 0xF2}, {0x82, 0xF5}, {0x83, 0x0C}, {0x82, 0xFB}, /* 0x78-0x7B */ + {0x82, 0xF6}, {0x82, 0xF0}, {0x82, 0xEA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x82, 0xE4}, {0x82, 0xE0}, {0x82, 0xFA}, /* 0xA0-0xA3 */ + {0x82, 0xF3}, {0x82, 0xED}, {0x86, 0x77}, {0x86, 0x74}, /* 0xA4-0xA7 */ + {0x86, 0x7C}, {0x86, 0x73}, {0x88, 0x41}, {0x88, 0x4E}, /* 0xA8-0xAB */ + {0x88, 0x67}, {0x88, 0x6A}, {0x88, 0x69}, {0x89, 0xD3}, /* 0xAC-0xAF */ + {0x8A, 0x04}, {0x8A, 0x07}, {0x8D, 0x72}, {0x8F, 0xE3}, /* 0xB0-0xB3 */ + {0x8F, 0xE1}, {0x8F, 0xEE}, {0x8F, 0xE0}, {0x90, 0xF1}, /* 0xB4-0xB7 */ + {0x90, 0xBD}, {0x90, 0xBF}, {0x90, 0xD5}, {0x90, 0xC5}, /* 0xB8-0xBB */ + {0x90, 0xBE}, {0x90, 0xC7}, {0x90, 0xCB}, {0x90, 0xC8}, /* 0xBC-0xBF */ + {0x91, 0xD4}, {0x91, 0xD3}, {0x96, 0x54}, {0x96, 0x4F}, /* 0xC0-0xC3 */ + {0x96, 0x51}, {0x96, 0x53}, {0x96, 0x4A}, {0x96, 0x4E}, /* 0xC4-0xC7 */ + {0x50, 0x1E}, {0x50, 0x05}, {0x50, 0x07}, {0x50, 0x13}, /* 0xC8-0xCB */ + {0x50, 0x22}, {0x50, 0x30}, {0x50, 0x1B}, {0x4F, 0xF5}, /* 0xCC-0xCF */ + {0x4F, 0xF4}, {0x50, 0x33}, {0x50, 0x37}, {0x50, 0x2C}, /* 0xD0-0xD3 */ + {0x4F, 0xF6}, {0x4F, 0xF7}, {0x50, 0x17}, {0x50, 0x1C}, /* 0xD4-0xD7 */ + {0x50, 0x20}, {0x50, 0x27}, {0x50, 0x35}, {0x50, 0x2F}, /* 0xD8-0xDB */ + {0x50, 0x31}, {0x50, 0x0E}, {0x51, 0x5A}, {0x51, 0x94}, /* 0xDC-0xDF */ + {0x51, 0x93}, {0x51, 0xCA}, {0x51, 0xC4}, {0x51, 0xC5}, /* 0xE0-0xE3 */ + {0x51, 0xC8}, {0x51, 0xCE}, {0x52, 0x61}, {0x52, 0x5A}, /* 0xE4-0xE7 */ + {0x52, 0x52}, {0x52, 0x5E}, {0x52, 0x5F}, {0x52, 0x55}, /* 0xE8-0xEB */ + {0x52, 0x62}, {0x52, 0xCD}, {0x53, 0x0E}, {0x53, 0x9E}, /* 0xEC-0xEF */ + {0x55, 0x26}, {0x54, 0xE2}, {0x55, 0x17}, {0x55, 0x12}, /* 0xF0-0xF3 */ + {0x54, 0xE7}, {0x54, 0xF3}, {0x54, 0xE4}, {0x55, 0x1A}, /* 0xF4-0xF7 */ + {0x54, 0xFF}, {0x55, 0x04}, {0x55, 0x08}, {0x54, 0xEB}, /* 0xF8-0xFB */ + {0x55, 0x11}, {0x55, 0x05}, {0x54, 0xF1}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x55, 0x0A}, {0x54, 0xFB}, {0x54, 0xF7}, {0x54, 0xF8}, /* 0x40-0x43 */ + {0x54, 0xE0}, {0x55, 0x0E}, {0x55, 0x03}, {0x55, 0x0B}, /* 0x44-0x47 */ + {0x57, 0x01}, {0x57, 0x02}, {0x57, 0xCC}, {0x58, 0x32}, /* 0x48-0x4B */ + {0x57, 0xD5}, {0x57, 0xD2}, {0x57, 0xBA}, {0x57, 0xC6}, /* 0x4C-0x4F */ + {0x57, 0xBD}, {0x57, 0xBC}, {0x57, 0xB8}, {0x57, 0xB6}, /* 0x50-0x53 */ + {0x57, 0xBF}, {0x57, 0xC7}, {0x57, 0xD0}, {0x57, 0xB9}, /* 0x54-0x57 */ + {0x57, 0xC1}, {0x59, 0x0E}, {0x59, 0x4A}, {0x5A, 0x19}, /* 0x58-0x5B */ + {0x5A, 0x16}, {0x5A, 0x2D}, {0x5A, 0x2E}, {0x5A, 0x15}, /* 0x5C-0x5F */ + {0x5A, 0x0F}, {0x5A, 0x17}, {0x5A, 0x0A}, {0x5A, 0x1E}, /* 0x60-0x63 */ + {0x5A, 0x33}, {0x5B, 0x6C}, {0x5B, 0xA7}, {0x5B, 0xAD}, /* 0x64-0x67 */ + {0x5B, 0xAC}, {0x5C, 0x03}, {0x5C, 0x56}, {0x5C, 0x54}, /* 0x68-0x6B */ + {0x5C, 0xEC}, {0x5C, 0xFF}, {0x5C, 0xEE}, {0x5C, 0xF1}, /* 0x6C-0x6F */ + {0x5C, 0xF7}, {0x5D, 0x00}, {0x5C, 0xF9}, {0x5E, 0x29}, /* 0x70-0x73 */ + {0x5E, 0x28}, {0x5E, 0xA8}, {0x5E, 0xAE}, {0x5E, 0xAA}, /* 0x74-0x77 */ + {0x5E, 0xAC}, {0x5F, 0x33}, {0x5F, 0x30}, {0x5F, 0x67}, /* 0x78-0x7B */ + {0x60, 0x5D}, {0x60, 0x5A}, {0x60, 0x67}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x60, 0x41}, {0x60, 0xA2}, {0x60, 0x88}, /* 0xA0-0xA3 */ + {0x60, 0x80}, {0x60, 0x92}, {0x60, 0x81}, {0x60, 0x9D}, /* 0xA4-0xA7 */ + {0x60, 0x83}, {0x60, 0x95}, {0x60, 0x9B}, {0x60, 0x97}, /* 0xA8-0xAB */ + {0x60, 0x87}, {0x60, 0x9C}, {0x60, 0x8E}, {0x62, 0x19}, /* 0xAC-0xAF */ + {0x62, 0x46}, {0x62, 0xF2}, {0x63, 0x10}, {0x63, 0x56}, /* 0xB0-0xB3 */ + {0x63, 0x2C}, {0x63, 0x44}, {0x63, 0x45}, {0x63, 0x36}, /* 0xB4-0xB7 */ + {0x63, 0x43}, {0x63, 0xE4}, {0x63, 0x39}, {0x63, 0x4B}, /* 0xB8-0xBB */ + {0x63, 0x4A}, {0x63, 0x3C}, {0x63, 0x29}, {0x63, 0x41}, /* 0xBC-0xBF */ + {0x63, 0x34}, {0x63, 0x58}, {0x63, 0x54}, {0x63, 0x59}, /* 0xC0-0xC3 */ + {0x63, 0x2D}, {0x63, 0x47}, {0x63, 0x33}, {0x63, 0x5A}, /* 0xC4-0xC7 */ + {0x63, 0x51}, {0x63, 0x38}, {0x63, 0x57}, {0x63, 0x40}, /* 0xC8-0xCB */ + {0x63, 0x48}, {0x65, 0x4A}, {0x65, 0x46}, {0x65, 0xC6}, /* 0xCC-0xCF */ + {0x65, 0xC3}, {0x65, 0xC4}, {0x65, 0xC2}, {0x66, 0x4A}, /* 0xD0-0xD3 */ + {0x66, 0x5F}, {0x66, 0x47}, {0x66, 0x51}, {0x67, 0x12}, /* 0xD4-0xD7 */ + {0x67, 0x13}, {0x68, 0x1F}, {0x68, 0x1A}, {0x68, 0x49}, /* 0xD8-0xDB */ + {0x68, 0x32}, {0x68, 0x33}, {0x68, 0x3B}, {0x68, 0x4B}, /* 0xDC-0xDF */ + {0x68, 0x4F}, {0x68, 0x16}, {0x68, 0x31}, {0x68, 0x1C}, /* 0xE0-0xE3 */ + {0x68, 0x35}, {0x68, 0x2B}, {0x68, 0x2D}, {0x68, 0x2F}, /* 0xE4-0xE7 */ + {0x68, 0x4E}, {0x68, 0x44}, {0x68, 0x34}, {0x68, 0x1D}, /* 0xE8-0xEB */ + {0x68, 0x12}, {0x68, 0x14}, {0x68, 0x26}, {0x68, 0x28}, /* 0xEC-0xEF */ + {0x68, 0x2E}, {0x68, 0x4D}, {0x68, 0x3A}, {0x68, 0x25}, /* 0xF0-0xF3 */ + {0x68, 0x20}, {0x6B, 0x2C}, {0x6B, 0x2F}, {0x6B, 0x2D}, /* 0xF4-0xF7 */ + {0x6B, 0x31}, {0x6B, 0x34}, {0x6B, 0x6D}, {0x80, 0x82}, /* 0xF8-0xFB */ + {0x6B, 0x88}, {0x6B, 0xE6}, {0x6B, 0xE4}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6B, 0xE8}, {0x6B, 0xE3}, {0x6B, 0xE2}, {0x6B, 0xE7}, /* 0x40-0x43 */ + {0x6C, 0x25}, {0x6D, 0x7A}, {0x6D, 0x63}, {0x6D, 0x64}, /* 0x44-0x47 */ + {0x6D, 0x76}, {0x6D, 0x0D}, {0x6D, 0x61}, {0x6D, 0x92}, /* 0x48-0x4B */ + {0x6D, 0x58}, {0x6D, 0x62}, {0x6D, 0x6D}, {0x6D, 0x6F}, /* 0x4C-0x4F */ + {0x6D, 0x91}, {0x6D, 0x8D}, {0x6D, 0xEF}, {0x6D, 0x7F}, /* 0x50-0x53 */ + {0x6D, 0x86}, {0x6D, 0x5E}, {0x6D, 0x67}, {0x6D, 0x60}, /* 0x54-0x57 */ + {0x6D, 0x97}, {0x6D, 0x70}, {0x6D, 0x7C}, {0x6D, 0x5F}, /* 0x58-0x5B */ + {0x6D, 0x82}, {0x6D, 0x98}, {0x6D, 0x2F}, {0x6D, 0x68}, /* 0x5C-0x5F */ + {0x6D, 0x8B}, {0x6D, 0x7E}, {0x6D, 0x80}, {0x6D, 0x84}, /* 0x60-0x63 */ + {0x6D, 0x16}, {0x6D, 0x83}, {0x6D, 0x7B}, {0x6D, 0x7D}, /* 0x64-0x67 */ + {0x6D, 0x75}, {0x6D, 0x90}, {0x70, 0xDC}, {0x70, 0xD3}, /* 0x68-0x6B */ + {0x70, 0xD1}, {0x70, 0xDD}, {0x70, 0xCB}, {0x7F, 0x39}, /* 0x6C-0x6F */ + {0x70, 0xE2}, {0x70, 0xD7}, {0x70, 0xD2}, {0x70, 0xDE}, /* 0x70-0x73 */ + {0x70, 0xE0}, {0x70, 0xD4}, {0x70, 0xCD}, {0x70, 0xC5}, /* 0x74-0x77 */ + {0x70, 0xC6}, {0x70, 0xC7}, {0x70, 0xDA}, {0x70, 0xCE}, /* 0x78-0x7B */ + {0x70, 0xE1}, {0x72, 0x42}, {0x72, 0x78}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x72, 0x77}, {0x72, 0x76}, {0x73, 0x00}, /* 0xA0-0xA3 */ + {0x72, 0xFA}, {0x72, 0xF4}, {0x72, 0xFE}, {0x72, 0xF6}, /* 0xA4-0xA7 */ + {0x72, 0xF3}, {0x72, 0xFB}, {0x73, 0x01}, {0x73, 0xD3}, /* 0xA8-0xAB */ + {0x73, 0xD9}, {0x73, 0xE5}, {0x73, 0xD6}, {0x73, 0xBC}, /* 0xAC-0xAF */ + {0x73, 0xE7}, {0x73, 0xE3}, {0x73, 0xE9}, {0x73, 0xDC}, /* 0xB0-0xB3 */ + {0x73, 0xD2}, {0x73, 0xDB}, {0x73, 0xD4}, {0x73, 0xDD}, /* 0xB4-0xB7 */ + {0x73, 0xDA}, {0x73, 0xD7}, {0x73, 0xD8}, {0x73, 0xE8}, /* 0xB8-0xBB */ + {0x74, 0xDE}, {0x74, 0xDF}, {0x74, 0xF4}, {0x74, 0xF5}, /* 0xBC-0xBF */ + {0x75, 0x21}, {0x75, 0x5B}, {0x75, 0x5F}, {0x75, 0xB0}, /* 0xC0-0xC3 */ + {0x75, 0xC1}, {0x75, 0xBB}, {0x75, 0xC4}, {0x75, 0xC0}, /* 0xC4-0xC7 */ + {0x75, 0xBF}, {0x75, 0xB6}, {0x75, 0xBA}, {0x76, 0x8A}, /* 0xC8-0xCB */ + {0x76, 0xC9}, {0x77, 0x1D}, {0x77, 0x1B}, {0x77, 0x10}, /* 0xCC-0xCF */ + {0x77, 0x13}, {0x77, 0x12}, {0x77, 0x23}, {0x77, 0x11}, /* 0xD0-0xD3 */ + {0x77, 0x15}, {0x77, 0x19}, {0x77, 0x1A}, {0x77, 0x22}, /* 0xD4-0xD7 */ + {0x77, 0x27}, {0x78, 0x23}, {0x78, 0x2C}, {0x78, 0x22}, /* 0xD8-0xDB */ + {0x78, 0x35}, {0x78, 0x2F}, {0x78, 0x28}, {0x78, 0x2E}, /* 0xDC-0xDF */ + {0x78, 0x2B}, {0x78, 0x21}, {0x78, 0x29}, {0x78, 0x33}, /* 0xE0-0xE3 */ + {0x78, 0x2A}, {0x78, 0x31}, {0x79, 0x54}, {0x79, 0x5B}, /* 0xE4-0xE7 */ + {0x79, 0x4F}, {0x79, 0x5C}, {0x79, 0x53}, {0x79, 0x52}, /* 0xE8-0xEB */ + {0x79, 0x51}, {0x79, 0xEB}, {0x79, 0xEC}, {0x79, 0xE0}, /* 0xEC-0xEF */ + {0x79, 0xEE}, {0x79, 0xED}, {0x79, 0xEA}, {0x79, 0xDC}, /* 0xF0-0xF3 */ + {0x79, 0xDE}, {0x79, 0xDD}, {0x7A, 0x86}, {0x7A, 0x89}, /* 0xF4-0xF7 */ + {0x7A, 0x85}, {0x7A, 0x8B}, {0x7A, 0x8C}, {0x7A, 0x8A}, /* 0xF8-0xFB */ + {0x7A, 0x87}, {0x7A, 0xD8}, {0x7B, 0x10}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7B, 0x04}, {0x7B, 0x13}, {0x7B, 0x05}, {0x7B, 0x0F}, /* 0x40-0x43 */ + {0x7B, 0x08}, {0x7B, 0x0A}, {0x7B, 0x0E}, {0x7B, 0x09}, /* 0x44-0x47 */ + {0x7B, 0x12}, {0x7C, 0x84}, {0x7C, 0x91}, {0x7C, 0x8A}, /* 0x48-0x4B */ + {0x7C, 0x8C}, {0x7C, 0x88}, {0x7C, 0x8D}, {0x7C, 0x85}, /* 0x4C-0x4F */ + {0x7D, 0x1E}, {0x7D, 0x1D}, {0x7D, 0x11}, {0x7D, 0x0E}, /* 0x50-0x53 */ + {0x7D, 0x18}, {0x7D, 0x16}, {0x7D, 0x13}, {0x7D, 0x1F}, /* 0x54-0x57 */ + {0x7D, 0x12}, {0x7D, 0x0F}, {0x7D, 0x0C}, {0x7F, 0x5C}, /* 0x58-0x5B */ + {0x7F, 0x61}, {0x7F, 0x5E}, {0x7F, 0x60}, {0x7F, 0x5D}, /* 0x5C-0x5F */ + {0x7F, 0x5B}, {0x7F, 0x96}, {0x7F, 0x92}, {0x7F, 0xC3}, /* 0x60-0x63 */ + {0x7F, 0xC2}, {0x7F, 0xC0}, {0x80, 0x16}, {0x80, 0x3E}, /* 0x64-0x67 */ + {0x80, 0x39}, {0x80, 0xFA}, {0x80, 0xF2}, {0x80, 0xF9}, /* 0x68-0x6B */ + {0x80, 0xF5}, {0x81, 0x01}, {0x80, 0xFB}, {0x81, 0x00}, /* 0x6C-0x6F */ + {0x82, 0x01}, {0x82, 0x2F}, {0x82, 0x25}, {0x83, 0x33}, /* 0x70-0x73 */ + {0x83, 0x2D}, {0x83, 0x44}, {0x83, 0x19}, {0x83, 0x51}, /* 0x74-0x77 */ + {0x83, 0x25}, {0x83, 0x56}, {0x83, 0x3F}, {0x83, 0x41}, /* 0x78-0x7B */ + {0x83, 0x26}, {0x83, 0x1C}, {0x83, 0x22}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x83, 0x42}, {0x83, 0x4E}, {0x83, 0x1B}, /* 0xA0-0xA3 */ + {0x83, 0x2A}, {0x83, 0x08}, {0x83, 0x3C}, {0x83, 0x4D}, /* 0xA4-0xA7 */ + {0x83, 0x16}, {0x83, 0x24}, {0x83, 0x20}, {0x83, 0x37}, /* 0xA8-0xAB */ + {0x83, 0x2F}, {0x83, 0x29}, {0x83, 0x47}, {0x83, 0x45}, /* 0xAC-0xAF */ + {0x83, 0x4C}, {0x83, 0x53}, {0x83, 0x1E}, {0x83, 0x2C}, /* 0xB0-0xB3 */ + {0x83, 0x4B}, {0x83, 0x27}, {0x83, 0x48}, {0x86, 0x53}, /* 0xB4-0xB7 */ + {0x86, 0x52}, {0x86, 0xA2}, {0x86, 0xA8}, {0x86, 0x96}, /* 0xB8-0xBB */ + {0x86, 0x8D}, {0x86, 0x91}, {0x86, 0x9E}, {0x86, 0x87}, /* 0xBC-0xBF */ + {0x86, 0x97}, {0x86, 0x86}, {0x86, 0x8B}, {0x86, 0x9A}, /* 0xC0-0xC3 */ + {0x86, 0x85}, {0x86, 0xA5}, {0x86, 0x99}, {0x86, 0xA1}, /* 0xC4-0xC7 */ + {0x86, 0xA7}, {0x86, 0x95}, {0x86, 0x98}, {0x86, 0x8E}, /* 0xC8-0xCB */ + {0x86, 0x9D}, {0x86, 0x90}, {0x86, 0x94}, {0x88, 0x43}, /* 0xCC-0xCF */ + {0x88, 0x44}, {0x88, 0x6D}, {0x88, 0x75}, {0x88, 0x76}, /* 0xD0-0xD3 */ + {0x88, 0x72}, {0x88, 0x80}, {0x88, 0x71}, {0x88, 0x7F}, /* 0xD4-0xD7 */ + {0x88, 0x6F}, {0x88, 0x83}, {0x88, 0x7E}, {0x88, 0x74}, /* 0xD8-0xDB */ + {0x88, 0x7C}, {0x8A, 0x12}, {0x8C, 0x47}, {0x8C, 0x57}, /* 0xDC-0xDF */ + {0x8C, 0x7B}, {0x8C, 0xA4}, {0x8C, 0xA3}, {0x8D, 0x76}, /* 0xE0-0xE3 */ + {0x8D, 0x78}, {0x8D, 0xB5}, {0x8D, 0xB7}, {0x8D, 0xB6}, /* 0xE4-0xE7 */ + {0x8E, 0xD1}, {0x8E, 0xD3}, {0x8F, 0xFE}, {0x8F, 0xF5}, /* 0xE8-0xEB */ + {0x90, 0x02}, {0x8F, 0xFF}, {0x8F, 0xFB}, {0x90, 0x04}, /* 0xEC-0xEF */ + {0x8F, 0xFC}, {0x8F, 0xF6}, {0x90, 0xD6}, {0x90, 0xE0}, /* 0xF0-0xF3 */ + {0x90, 0xD9}, {0x90, 0xDA}, {0x90, 0xE3}, {0x90, 0xDF}, /* 0xF4-0xF7 */ + {0x90, 0xE5}, {0x90, 0xD8}, {0x90, 0xDB}, {0x90, 0xD7}, /* 0xF8-0xFB */ + {0x90, 0xDC}, {0x90, 0xE4}, {0x91, 0x50}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x91, 0x4E}, {0x91, 0x4F}, {0x91, 0xD5}, {0x91, 0xE2}, /* 0x40-0x43 */ + {0x91, 0xDA}, {0x96, 0x5C}, {0x96, 0x5F}, {0x96, 0xBC}, /* 0x44-0x47 */ + {0x98, 0xE3}, {0x9A, 0xDF}, {0x9B, 0x2F}, {0x4E, 0x7F}, /* 0x48-0x4B */ + {0x50, 0x70}, {0x50, 0x6A}, {0x50, 0x61}, {0x50, 0x5E}, /* 0x4C-0x4F */ + {0x50, 0x60}, {0x50, 0x53}, {0x50, 0x4B}, {0x50, 0x5D}, /* 0x50-0x53 */ + {0x50, 0x72}, {0x50, 0x48}, {0x50, 0x4D}, {0x50, 0x41}, /* 0x54-0x57 */ + {0x50, 0x5B}, {0x50, 0x4A}, {0x50, 0x62}, {0x50, 0x15}, /* 0x58-0x5B */ + {0x50, 0x45}, {0x50, 0x5F}, {0x50, 0x69}, {0x50, 0x6B}, /* 0x5C-0x5F */ + {0x50, 0x63}, {0x50, 0x64}, {0x50, 0x46}, {0x50, 0x40}, /* 0x60-0x63 */ + {0x50, 0x6E}, {0x50, 0x73}, {0x50, 0x57}, {0x50, 0x51}, /* 0x64-0x67 */ + {0x51, 0xD0}, {0x52, 0x6B}, {0x52, 0x6D}, {0x52, 0x6C}, /* 0x68-0x6B */ + {0x52, 0x6E}, {0x52, 0xD6}, {0x52, 0xD3}, {0x53, 0x2D}, /* 0x6C-0x6F */ + {0x53, 0x9C}, {0x55, 0x75}, {0x55, 0x76}, {0x55, 0x3C}, /* 0x70-0x73 */ + {0x55, 0x4D}, {0x55, 0x50}, {0x55, 0x34}, {0x55, 0x2A}, /* 0x74-0x77 */ + {0x55, 0x51}, {0x55, 0x62}, {0x55, 0x36}, {0x55, 0x35}, /* 0x78-0x7B */ + {0x55, 0x30}, {0x55, 0x52}, {0x55, 0x45}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x55, 0x0C}, {0x55, 0x32}, {0x55, 0x65}, /* 0xA0-0xA3 */ + {0x55, 0x4E}, {0x55, 0x39}, {0x55, 0x48}, {0x55, 0x2D}, /* 0xA4-0xA7 */ + {0x55, 0x3B}, {0x55, 0x40}, {0x55, 0x4B}, {0x57, 0x0A}, /* 0xA8-0xAB */ + {0x57, 0x07}, {0x57, 0xFB}, {0x58, 0x14}, {0x57, 0xE2}, /* 0xAC-0xAF */ + {0x57, 0xF6}, {0x57, 0xDC}, {0x57, 0xF4}, {0x58, 0x00}, /* 0xB0-0xB3 */ + {0x57, 0xED}, {0x57, 0xFD}, {0x58, 0x08}, {0x57, 0xF8}, /* 0xB4-0xB7 */ + {0x58, 0x0B}, {0x57, 0xF3}, {0x57, 0xCF}, {0x58, 0x07}, /* 0xB8-0xBB */ + {0x57, 0xEE}, {0x57, 0xE3}, {0x57, 0xF2}, {0x57, 0xE5}, /* 0xBC-0xBF */ + {0x57, 0xEC}, {0x57, 0xE1}, {0x58, 0x0E}, {0x57, 0xFC}, /* 0xC0-0xC3 */ + {0x58, 0x10}, {0x57, 0xE7}, {0x58, 0x01}, {0x58, 0x0C}, /* 0xC4-0xC7 */ + {0x57, 0xF1}, {0x57, 0xE9}, {0x57, 0xF0}, {0x58, 0x0D}, /* 0xC8-0xCB */ + {0x58, 0x04}, {0x59, 0x5C}, {0x5A, 0x60}, {0x5A, 0x58}, /* 0xCC-0xCF */ + {0x5A, 0x55}, {0x5A, 0x67}, {0x5A, 0x5E}, {0x5A, 0x38}, /* 0xD0-0xD3 */ + {0x5A, 0x35}, {0x5A, 0x6D}, {0x5A, 0x50}, {0x5A, 0x5F}, /* 0xD4-0xD7 */ + {0x5A, 0x65}, {0x5A, 0x6C}, {0x5A, 0x53}, {0x5A, 0x64}, /* 0xD8-0xDB */ + {0x5A, 0x57}, {0x5A, 0x43}, {0x5A, 0x5D}, {0x5A, 0x52}, /* 0xDC-0xDF */ + {0x5A, 0x44}, {0x5A, 0x5B}, {0x5A, 0x48}, {0x5A, 0x8E}, /* 0xE0-0xE3 */ + {0x5A, 0x3E}, {0x5A, 0x4D}, {0x5A, 0x39}, {0x5A, 0x4C}, /* 0xE4-0xE7 */ + {0x5A, 0x70}, {0x5A, 0x69}, {0x5A, 0x47}, {0x5A, 0x51}, /* 0xE8-0xEB */ + {0x5A, 0x56}, {0x5A, 0x42}, {0x5A, 0x5C}, {0x5B, 0x72}, /* 0xEC-0xEF */ + {0x5B, 0x6E}, {0x5B, 0xC1}, {0x5B, 0xC0}, {0x5C, 0x59}, /* 0xF0-0xF3 */ + {0x5D, 0x1E}, {0x5D, 0x0B}, {0x5D, 0x1D}, {0x5D, 0x1A}, /* 0xF4-0xF7 */ + {0x5D, 0x20}, {0x5D, 0x0C}, {0x5D, 0x28}, {0x5D, 0x0D}, /* 0xF8-0xFB */ + {0x5D, 0x26}, {0x5D, 0x25}, {0x5D, 0x0F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5D, 0x30}, {0x5D, 0x12}, {0x5D, 0x23}, {0x5D, 0x1F}, /* 0x40-0x43 */ + {0x5D, 0x2E}, {0x5E, 0x3E}, {0x5E, 0x34}, {0x5E, 0xB1}, /* 0x44-0x47 */ + {0x5E, 0xB4}, {0x5E, 0xB9}, {0x5E, 0xB2}, {0x5E, 0xB3}, /* 0x48-0x4B */ + {0x5F, 0x36}, {0x5F, 0x38}, {0x5F, 0x9B}, {0x5F, 0x96}, /* 0x4C-0x4F */ + {0x5F, 0x9F}, {0x60, 0x8A}, {0x60, 0x90}, {0x60, 0x86}, /* 0x50-0x53 */ + {0x60, 0xBE}, {0x60, 0xB0}, {0x60, 0xBA}, {0x60, 0xD3}, /* 0x54-0x57 */ + {0x60, 0xD4}, {0x60, 0xCF}, {0x60, 0xE4}, {0x60, 0xD9}, /* 0x58-0x5B */ + {0x60, 0xDD}, {0x60, 0xC8}, {0x60, 0xB1}, {0x60, 0xDB}, /* 0x5C-0x5F */ + {0x60, 0xB7}, {0x60, 0xCA}, {0x60, 0xBF}, {0x60, 0xC3}, /* 0x60-0x63 */ + {0x60, 0xCD}, {0x60, 0xC0}, {0x63, 0x32}, {0x63, 0x65}, /* 0x64-0x67 */ + {0x63, 0x8A}, {0x63, 0x82}, {0x63, 0x7D}, {0x63, 0xBD}, /* 0x68-0x6B */ + {0x63, 0x9E}, {0x63, 0xAD}, {0x63, 0x9D}, {0x63, 0x97}, /* 0x6C-0x6F */ + {0x63, 0xAB}, {0x63, 0x8E}, {0x63, 0x6F}, {0x63, 0x87}, /* 0x70-0x73 */ + {0x63, 0x90}, {0x63, 0x6E}, {0x63, 0xAF}, {0x63, 0x75}, /* 0x74-0x77 */ + {0x63, 0x9C}, {0x63, 0x6D}, {0x63, 0xAE}, {0x63, 0x7C}, /* 0x78-0x7B */ + {0x63, 0xA4}, {0x63, 0x3B}, {0x63, 0x9F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x63, 0x78}, {0x63, 0x85}, {0x63, 0x81}, /* 0xA0-0xA3 */ + {0x63, 0x91}, {0x63, 0x8D}, {0x63, 0x70}, {0x65, 0x53}, /* 0xA4-0xA7 */ + {0x65, 0xCD}, {0x66, 0x65}, {0x66, 0x61}, {0x66, 0x5B}, /* 0xA8-0xAB */ + {0x66, 0x59}, {0x66, 0x5C}, {0x66, 0x62}, {0x67, 0x18}, /* 0xAC-0xAF */ + {0x68, 0x79}, {0x68, 0x87}, {0x68, 0x90}, {0x68, 0x9C}, /* 0xB0-0xB3 */ + {0x68, 0x6D}, {0x68, 0x6E}, {0x68, 0xAE}, {0x68, 0xAB}, /* 0xB4-0xB7 */ + {0x69, 0x56}, {0x68, 0x6F}, {0x68, 0xA3}, {0x68, 0xAC}, /* 0xB8-0xBB */ + {0x68, 0xA9}, {0x68, 0x75}, {0x68, 0x74}, {0x68, 0xB2}, /* 0xBC-0xBF */ + {0x68, 0x8F}, {0x68, 0x77}, {0x68, 0x92}, {0x68, 0x7C}, /* 0xC0-0xC3 */ + {0x68, 0x6B}, {0x68, 0x72}, {0x68, 0xAA}, {0x68, 0x80}, /* 0xC4-0xC7 */ + {0x68, 0x71}, {0x68, 0x7E}, {0x68, 0x9B}, {0x68, 0x96}, /* 0xC8-0xCB */ + {0x68, 0x8B}, {0x68, 0xA0}, {0x68, 0x89}, {0x68, 0xA4}, /* 0xCC-0xCF */ + {0x68, 0x78}, {0x68, 0x7B}, {0x68, 0x91}, {0x68, 0x8C}, /* 0xD0-0xD3 */ + {0x68, 0x8A}, {0x68, 0x7D}, {0x6B, 0x36}, {0x6B, 0x33}, /* 0xD4-0xD7 */ + {0x6B, 0x37}, {0x6B, 0x38}, {0x6B, 0x91}, {0x6B, 0x8F}, /* 0xD8-0xDB */ + {0x6B, 0x8D}, {0x6B, 0x8E}, {0x6B, 0x8C}, {0x6C, 0x2A}, /* 0xDC-0xDF */ + {0x6D, 0xC0}, {0x6D, 0xAB}, {0x6D, 0xB4}, {0x6D, 0xB3}, /* 0xE0-0xE3 */ + {0x6E, 0x74}, {0x6D, 0xAC}, {0x6D, 0xE9}, {0x6D, 0xE2}, /* 0xE4-0xE7 */ + {0x6D, 0xB7}, {0x6D, 0xF6}, {0x6D, 0xD4}, {0x6E, 0x00}, /* 0xE8-0xEB */ + {0x6D, 0xC8}, {0x6D, 0xE0}, {0x6D, 0xDF}, {0x6D, 0xD6}, /* 0xEC-0xEF */ + {0x6D, 0xBE}, {0x6D, 0xE5}, {0x6D, 0xDC}, {0x6D, 0xDD}, /* 0xF0-0xF3 */ + {0x6D, 0xDB}, {0x6D, 0xF4}, {0x6D, 0xCA}, {0x6D, 0xBD}, /* 0xF4-0xF7 */ + {0x6D, 0xED}, {0x6D, 0xF0}, {0x6D, 0xBA}, {0x6D, 0xD5}, /* 0xF8-0xFB */ + {0x6D, 0xC2}, {0x6D, 0xCF}, {0x6D, 0xC9}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6D, 0xD0}, {0x6D, 0xF2}, {0x6D, 0xD3}, {0x6D, 0xFD}, /* 0x40-0x43 */ + {0x6D, 0xD7}, {0x6D, 0xCD}, {0x6D, 0xE3}, {0x6D, 0xBB}, /* 0x44-0x47 */ + {0x70, 0xFA}, {0x71, 0x0D}, {0x70, 0xF7}, {0x71, 0x17}, /* 0x48-0x4B */ + {0x70, 0xF4}, {0x71, 0x0C}, {0x70, 0xF0}, {0x71, 0x04}, /* 0x4C-0x4F */ + {0x70, 0xF3}, {0x71, 0x10}, {0x70, 0xFC}, {0x70, 0xFF}, /* 0x50-0x53 */ + {0x71, 0x06}, {0x71, 0x13}, {0x71, 0x00}, {0x70, 0xF8}, /* 0x54-0x57 */ + {0x70, 0xF6}, {0x71, 0x0B}, {0x71, 0x02}, {0x71, 0x0E}, /* 0x58-0x5B */ + {0x72, 0x7E}, {0x72, 0x7B}, {0x72, 0x7C}, {0x72, 0x7F}, /* 0x5C-0x5F */ + {0x73, 0x1D}, {0x73, 0x17}, {0x73, 0x07}, {0x73, 0x11}, /* 0x60-0x63 */ + {0x73, 0x18}, {0x73, 0x0A}, {0x73, 0x08}, {0x72, 0xFF}, /* 0x64-0x67 */ + {0x73, 0x0F}, {0x73, 0x1E}, {0x73, 0x88}, {0x73, 0xF6}, /* 0x68-0x6B */ + {0x73, 0xF8}, {0x73, 0xF5}, {0x74, 0x04}, {0x74, 0x01}, /* 0x6C-0x6F */ + {0x73, 0xFD}, {0x74, 0x07}, {0x74, 0x00}, {0x73, 0xFA}, /* 0x70-0x73 */ + {0x73, 0xFC}, {0x73, 0xFF}, {0x74, 0x0C}, {0x74, 0x0B}, /* 0x74-0x77 */ + {0x73, 0xF4}, {0x74, 0x08}, {0x75, 0x64}, {0x75, 0x63}, /* 0x78-0x7B */ + {0x75, 0xCE}, {0x75, 0xD2}, {0x75, 0xCF}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x75, 0xCB}, {0x75, 0xCC}, {0x75, 0xD1}, /* 0xA0-0xA3 */ + {0x75, 0xD0}, {0x76, 0x8F}, {0x76, 0x89}, {0x76, 0xD3}, /* 0xA4-0xA7 */ + {0x77, 0x39}, {0x77, 0x2F}, {0x77, 0x2D}, {0x77, 0x31}, /* 0xA8-0xAB */ + {0x77, 0x32}, {0x77, 0x34}, {0x77, 0x33}, {0x77, 0x3D}, /* 0xAC-0xAF */ + {0x77, 0x25}, {0x77, 0x3B}, {0x77, 0x35}, {0x78, 0x48}, /* 0xB0-0xB3 */ + {0x78, 0x52}, {0x78, 0x49}, {0x78, 0x4D}, {0x78, 0x4A}, /* 0xB4-0xB7 */ + {0x78, 0x4C}, {0x78, 0x26}, {0x78, 0x45}, {0x78, 0x50}, /* 0xB8-0xBB */ + {0x79, 0x64}, {0x79, 0x67}, {0x79, 0x69}, {0x79, 0x6A}, /* 0xBC-0xBF */ + {0x79, 0x63}, {0x79, 0x6B}, {0x79, 0x61}, {0x79, 0xBB}, /* 0xC0-0xC3 */ + {0x79, 0xFA}, {0x79, 0xF8}, {0x79, 0xF6}, {0x79, 0xF7}, /* 0xC4-0xC7 */ + {0x7A, 0x8F}, {0x7A, 0x94}, {0x7A, 0x90}, {0x7B, 0x35}, /* 0xC8-0xCB */ + {0x7B, 0x47}, {0x7B, 0x34}, {0x7B, 0x25}, {0x7B, 0x30}, /* 0xCC-0xCF */ + {0x7B, 0x22}, {0x7B, 0x24}, {0x7B, 0x33}, {0x7B, 0x18}, /* 0xD0-0xD3 */ + {0x7B, 0x2A}, {0x7B, 0x1D}, {0x7B, 0x31}, {0x7B, 0x2B}, /* 0xD4-0xD7 */ + {0x7B, 0x2D}, {0x7B, 0x2F}, {0x7B, 0x32}, {0x7B, 0x38}, /* 0xD8-0xDB */ + {0x7B, 0x1A}, {0x7B, 0x23}, {0x7C, 0x94}, {0x7C, 0x98}, /* 0xDC-0xDF */ + {0x7C, 0x96}, {0x7C, 0xA3}, {0x7D, 0x35}, {0x7D, 0x3D}, /* 0xE0-0xE3 */ + {0x7D, 0x38}, {0x7D, 0x36}, {0x7D, 0x3A}, {0x7D, 0x45}, /* 0xE4-0xE7 */ + {0x7D, 0x2C}, {0x7D, 0x29}, {0x7D, 0x41}, {0x7D, 0x47}, /* 0xE8-0xEB */ + {0x7D, 0x3E}, {0x7D, 0x3F}, {0x7D, 0x4A}, {0x7D, 0x3B}, /* 0xEC-0xEF */ + {0x7D, 0x28}, {0x7F, 0x63}, {0x7F, 0x95}, {0x7F, 0x9C}, /* 0xF0-0xF3 */ + {0x7F, 0x9D}, {0x7F, 0x9B}, {0x7F, 0xCA}, {0x7F, 0xCB}, /* 0xF4-0xF7 */ + {0x7F, 0xCD}, {0x7F, 0xD0}, {0x7F, 0xD1}, {0x7F, 0xC7}, /* 0xF8-0xFB */ + {0x7F, 0xCF}, {0x7F, 0xC9}, {0x80, 0x1F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x80, 0x1E}, {0x80, 0x1B}, {0x80, 0x47}, {0x80, 0x43}, /* 0x40-0x43 */ + {0x80, 0x48}, {0x81, 0x18}, {0x81, 0x25}, {0x81, 0x19}, /* 0x44-0x47 */ + {0x81, 0x1B}, {0x81, 0x2D}, {0x81, 0x1F}, {0x81, 0x2C}, /* 0x48-0x4B */ + {0x81, 0x1E}, {0x81, 0x21}, {0x81, 0x15}, {0x81, 0x27}, /* 0x4C-0x4F */ + {0x81, 0x1D}, {0x81, 0x22}, {0x82, 0x11}, {0x82, 0x38}, /* 0x50-0x53 */ + {0x82, 0x33}, {0x82, 0x3A}, {0x82, 0x34}, {0x82, 0x32}, /* 0x54-0x57 */ + {0x82, 0x74}, {0x83, 0x90}, {0x83, 0xA3}, {0x83, 0xA8}, /* 0x58-0x5B */ + {0x83, 0x8D}, {0x83, 0x7A}, {0x83, 0x73}, {0x83, 0xA4}, /* 0x5C-0x5F */ + {0x83, 0x74}, {0x83, 0x8F}, {0x83, 0x81}, {0x83, 0x95}, /* 0x60-0x63 */ + {0x83, 0x99}, {0x83, 0x75}, {0x83, 0x94}, {0x83, 0xA9}, /* 0x64-0x67 */ + {0x83, 0x7D}, {0x83, 0x83}, {0x83, 0x8C}, {0x83, 0x9D}, /* 0x68-0x6B */ + {0x83, 0x9B}, {0x83, 0xAA}, {0x83, 0x8B}, {0x83, 0x7E}, /* 0x6C-0x6F */ + {0x83, 0xA5}, {0x83, 0xAF}, {0x83, 0x88}, {0x83, 0x97}, /* 0x70-0x73 */ + {0x83, 0xB0}, {0x83, 0x7F}, {0x83, 0xA6}, {0x83, 0x87}, /* 0x74-0x77 */ + {0x83, 0xAE}, {0x83, 0x76}, {0x83, 0x9A}, {0x86, 0x59}, /* 0x78-0x7B */ + {0x86, 0x56}, {0x86, 0xBF}, {0x86, 0xB7}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x86, 0xC2}, {0x86, 0xC1}, {0x86, 0xC5}, /* 0xA0-0xA3 */ + {0x86, 0xBA}, {0x86, 0xB0}, {0x86, 0xC8}, {0x86, 0xB9}, /* 0xA4-0xA7 */ + {0x86, 0xB3}, {0x86, 0xB8}, {0x86, 0xCC}, {0x86, 0xB4}, /* 0xA8-0xAB */ + {0x86, 0xBB}, {0x86, 0xBC}, {0x86, 0xC3}, {0x86, 0xBD}, /* 0xAC-0xAF */ + {0x86, 0xBE}, {0x88, 0x52}, {0x88, 0x89}, {0x88, 0x95}, /* 0xB0-0xB3 */ + {0x88, 0xA8}, {0x88, 0xA2}, {0x88, 0xAA}, {0x88, 0x9A}, /* 0xB4-0xB7 */ + {0x88, 0x91}, {0x88, 0xA1}, {0x88, 0x9F}, {0x88, 0x98}, /* 0xB8-0xBB */ + {0x88, 0xA7}, {0x88, 0x99}, {0x88, 0x9B}, {0x88, 0x97}, /* 0xBC-0xBF */ + {0x88, 0xA4}, {0x88, 0xAC}, {0x88, 0x8C}, {0x88, 0x93}, /* 0xC0-0xC3 */ + {0x88, 0x8E}, {0x89, 0x82}, {0x89, 0xD6}, {0x89, 0xD9}, /* 0xC4-0xC7 */ + {0x89, 0xD5}, {0x8A, 0x30}, {0x8A, 0x27}, {0x8A, 0x2C}, /* 0xC8-0xCB */ + {0x8A, 0x1E}, {0x8C, 0x39}, {0x8C, 0x3B}, {0x8C, 0x5C}, /* 0xCC-0xCF */ + {0x8C, 0x5D}, {0x8C, 0x7D}, {0x8C, 0xA5}, {0x8D, 0x7D}, /* 0xD0-0xD3 */ + {0x8D, 0x7B}, {0x8D, 0x79}, {0x8D, 0xBC}, {0x8D, 0xC2}, /* 0xD4-0xD7 */ + {0x8D, 0xB9}, {0x8D, 0xBF}, {0x8D, 0xC1}, {0x8E, 0xD8}, /* 0xD8-0xDB */ + {0x8E, 0xDE}, {0x8E, 0xDD}, {0x8E, 0xDC}, {0x8E, 0xD7}, /* 0xDC-0xDF */ + {0x8E, 0xE0}, {0x8E, 0xE1}, {0x90, 0x24}, {0x90, 0x0B}, /* 0xE0-0xE3 */ + {0x90, 0x11}, {0x90, 0x1C}, {0x90, 0x0C}, {0x90, 0x21}, /* 0xE4-0xE7 */ + {0x90, 0xEF}, {0x90, 0xEA}, {0x90, 0xF0}, {0x90, 0xF4}, /* 0xE8-0xEB */ + {0x90, 0xF2}, {0x90, 0xF3}, {0x90, 0xD4}, {0x90, 0xEB}, /* 0xEC-0xEF */ + {0x90, 0xEC}, {0x90, 0xE9}, {0x91, 0x56}, {0x91, 0x58}, /* 0xF0-0xF3 */ + {0x91, 0x5A}, {0x91, 0x53}, {0x91, 0x55}, {0x91, 0xEC}, /* 0xF4-0xF7 */ + {0x91, 0xF4}, {0x91, 0xF1}, {0x91, 0xF3}, {0x91, 0xF8}, /* 0xF8-0xFB */ + {0x91, 0xE4}, {0x91, 0xF9}, {0x91, 0xEA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x91, 0xEB}, {0x91, 0xF7}, {0x91, 0xE8}, {0x91, 0xEE}, /* 0x40-0x43 */ + {0x95, 0x7A}, {0x95, 0x86}, {0x95, 0x88}, {0x96, 0x7C}, /* 0x44-0x47 */ + {0x96, 0x6D}, {0x96, 0x6B}, {0x96, 0x71}, {0x96, 0x6F}, /* 0x48-0x4B */ + {0x96, 0xBF}, {0x97, 0x6A}, {0x98, 0x04}, {0x98, 0xE5}, /* 0x4C-0x4F */ + {0x99, 0x97}, {0x50, 0x9B}, {0x50, 0x95}, {0x50, 0x94}, /* 0x50-0x53 */ + {0x50, 0x9E}, {0x50, 0x8B}, {0x50, 0xA3}, {0x50, 0x83}, /* 0x54-0x57 */ + {0x50, 0x8C}, {0x50, 0x8E}, {0x50, 0x9D}, {0x50, 0x68}, /* 0x58-0x5B */ + {0x50, 0x9C}, {0x50, 0x92}, {0x50, 0x82}, {0x50, 0x87}, /* 0x5C-0x5F */ + {0x51, 0x5F}, {0x51, 0xD4}, {0x53, 0x12}, {0x53, 0x11}, /* 0x60-0x63 */ + {0x53, 0xA4}, {0x53, 0xA7}, {0x55, 0x91}, {0x55, 0xA8}, /* 0x64-0x67 */ + {0x55, 0xA5}, {0x55, 0xAD}, {0x55, 0x77}, {0x56, 0x45}, /* 0x68-0x6B */ + {0x55, 0xA2}, {0x55, 0x93}, {0x55, 0x88}, {0x55, 0x8F}, /* 0x6C-0x6F */ + {0x55, 0xB5}, {0x55, 0x81}, {0x55, 0xA3}, {0x55, 0x92}, /* 0x70-0x73 */ + {0x55, 0xA4}, {0x55, 0x7D}, {0x55, 0x8C}, {0x55, 0xA6}, /* 0x74-0x77 */ + {0x55, 0x7F}, {0x55, 0x95}, {0x55, 0xA1}, {0x55, 0x8E}, /* 0x78-0x7B */ + {0x57, 0x0C}, {0x58, 0x29}, {0x58, 0x37}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x58, 0x19}, {0x58, 0x1E}, {0x58, 0x27}, /* 0xA0-0xA3 */ + {0x58, 0x23}, {0x58, 0x28}, {0x57, 0xF5}, {0x58, 0x48}, /* 0xA4-0xA7 */ + {0x58, 0x25}, {0x58, 0x1C}, {0x58, 0x1B}, {0x58, 0x33}, /* 0xA8-0xAB */ + {0x58, 0x3F}, {0x58, 0x36}, {0x58, 0x2E}, {0x58, 0x39}, /* 0xAC-0xAF */ + {0x58, 0x38}, {0x58, 0x2D}, {0x58, 0x2C}, {0x58, 0x3B}, /* 0xB0-0xB3 */ + {0x59, 0x61}, {0x5A, 0xAF}, {0x5A, 0x94}, {0x5A, 0x9F}, /* 0xB4-0xB7 */ + {0x5A, 0x7A}, {0x5A, 0xA2}, {0x5A, 0x9E}, {0x5A, 0x78}, /* 0xB8-0xBB */ + {0x5A, 0xA6}, {0x5A, 0x7C}, {0x5A, 0xA5}, {0x5A, 0xAC}, /* 0xBC-0xBF */ + {0x5A, 0x95}, {0x5A, 0xAE}, {0x5A, 0x37}, {0x5A, 0x84}, /* 0xC0-0xC3 */ + {0x5A, 0x8A}, {0x5A, 0x97}, {0x5A, 0x83}, {0x5A, 0x8B}, /* 0xC4-0xC7 */ + {0x5A, 0xA9}, {0x5A, 0x7B}, {0x5A, 0x7D}, {0x5A, 0x8C}, /* 0xC8-0xCB */ + {0x5A, 0x9C}, {0x5A, 0x8F}, {0x5A, 0x93}, {0x5A, 0x9D}, /* 0xCC-0xCF */ + {0x5B, 0xEA}, {0x5B, 0xCD}, {0x5B, 0xCB}, {0x5B, 0xD4}, /* 0xD0-0xD3 */ + {0x5B, 0xD1}, {0x5B, 0xCA}, {0x5B, 0xCE}, {0x5C, 0x0C}, /* 0xD4-0xD7 */ + {0x5C, 0x30}, {0x5D, 0x37}, {0x5D, 0x43}, {0x5D, 0x6B}, /* 0xD8-0xDB */ + {0x5D, 0x41}, {0x5D, 0x4B}, {0x5D, 0x3F}, {0x5D, 0x35}, /* 0xDC-0xDF */ + {0x5D, 0x51}, {0x5D, 0x4E}, {0x5D, 0x55}, {0x5D, 0x33}, /* 0xE0-0xE3 */ + {0x5D, 0x3A}, {0x5D, 0x52}, {0x5D, 0x3D}, {0x5D, 0x31}, /* 0xE4-0xE7 */ + {0x5D, 0x59}, {0x5D, 0x42}, {0x5D, 0x39}, {0x5D, 0x49}, /* 0xE8-0xEB */ + {0x5D, 0x38}, {0x5D, 0x3C}, {0x5D, 0x32}, {0x5D, 0x36}, /* 0xEC-0xEF */ + {0x5D, 0x40}, {0x5D, 0x45}, {0x5E, 0x44}, {0x5E, 0x41}, /* 0xF0-0xF3 */ + {0x5F, 0x58}, {0x5F, 0xA6}, {0x5F, 0xA5}, {0x5F, 0xAB}, /* 0xF4-0xF7 */ + {0x60, 0xC9}, {0x60, 0xB9}, {0x60, 0xCC}, {0x60, 0xE2}, /* 0xF8-0xFB */ + {0x60, 0xCE}, {0x60, 0xC4}, {0x61, 0x14}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_D9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x60, 0xF2}, {0x61, 0x0A}, {0x61, 0x16}, {0x61, 0x05}, /* 0x40-0x43 */ + {0x60, 0xF5}, {0x61, 0x13}, {0x60, 0xF8}, {0x60, 0xFC}, /* 0x44-0x47 */ + {0x60, 0xFE}, {0x60, 0xC1}, {0x61, 0x03}, {0x61, 0x18}, /* 0x48-0x4B */ + {0x61, 0x1D}, {0x61, 0x10}, {0x60, 0xFF}, {0x61, 0x04}, /* 0x4C-0x4F */ + {0x61, 0x0B}, {0x62, 0x4A}, {0x63, 0x94}, {0x63, 0xB1}, /* 0x50-0x53 */ + {0x63, 0xB0}, {0x63, 0xCE}, {0x63, 0xE5}, {0x63, 0xE8}, /* 0x54-0x57 */ + {0x63, 0xEF}, {0x63, 0xC3}, {0x64, 0x9D}, {0x63, 0xF3}, /* 0x58-0x5B */ + {0x63, 0xCA}, {0x63, 0xE0}, {0x63, 0xF6}, {0x63, 0xD5}, /* 0x5C-0x5F */ + {0x63, 0xF2}, {0x63, 0xF5}, {0x64, 0x61}, {0x63, 0xDF}, /* 0x60-0x63 */ + {0x63, 0xBE}, {0x63, 0xDD}, {0x63, 0xDC}, {0x63, 0xC4}, /* 0x64-0x67 */ + {0x63, 0xD8}, {0x63, 0xD3}, {0x63, 0xC2}, {0x63, 0xC7}, /* 0x68-0x6B */ + {0x63, 0xCC}, {0x63, 0xCB}, {0x63, 0xC8}, {0x63, 0xF0}, /* 0x6C-0x6F */ + {0x63, 0xD7}, {0x63, 0xD9}, {0x65, 0x32}, {0x65, 0x67}, /* 0x70-0x73 */ + {0x65, 0x6A}, {0x65, 0x64}, {0x65, 0x5C}, {0x65, 0x68}, /* 0x74-0x77 */ + {0x65, 0x65}, {0x65, 0x8C}, {0x65, 0x9D}, {0x65, 0x9E}, /* 0x78-0x7B */ + {0x65, 0xAE}, {0x65, 0xD0}, {0x65, 0xD2}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x66, 0x7C}, {0x66, 0x6C}, {0x66, 0x7B}, /* 0xA0-0xA3 */ + {0x66, 0x80}, {0x66, 0x71}, {0x66, 0x79}, {0x66, 0x6A}, /* 0xA4-0xA7 */ + {0x66, 0x72}, {0x67, 0x01}, {0x69, 0x0C}, {0x68, 0xD3}, /* 0xA8-0xAB */ + {0x69, 0x04}, {0x68, 0xDC}, {0x69, 0x2A}, {0x68, 0xEC}, /* 0xAC-0xAF */ + {0x68, 0xEA}, {0x68, 0xF1}, {0x69, 0x0F}, {0x68, 0xD6}, /* 0xB0-0xB3 */ + {0x68, 0xF7}, {0x68, 0xEB}, {0x68, 0xE4}, {0x68, 0xF6}, /* 0xB4-0xB7 */ + {0x69, 0x13}, {0x69, 0x10}, {0x68, 0xF3}, {0x68, 0xE1}, /* 0xB8-0xBB */ + {0x69, 0x07}, {0x68, 0xCC}, {0x69, 0x08}, {0x69, 0x70}, /* 0xBC-0xBF */ + {0x68, 0xB4}, {0x69, 0x11}, {0x68, 0xEF}, {0x68, 0xC6}, /* 0xC0-0xC3 */ + {0x69, 0x14}, {0x68, 0xF8}, {0x68, 0xD0}, {0x68, 0xFD}, /* 0xC4-0xC7 */ + {0x68, 0xFC}, {0x68, 0xE8}, {0x69, 0x0B}, {0x69, 0x0A}, /* 0xC8-0xCB */ + {0x69, 0x17}, {0x68, 0xCE}, {0x68, 0xC8}, {0x68, 0xDD}, /* 0xCC-0xCF */ + {0x68, 0xDE}, {0x68, 0xE6}, {0x68, 0xF4}, {0x68, 0xD1}, /* 0xD0-0xD3 */ + {0x69, 0x06}, {0x68, 0xD4}, {0x68, 0xE9}, {0x69, 0x15}, /* 0xD4-0xD7 */ + {0x69, 0x25}, {0x68, 0xC7}, {0x6B, 0x39}, {0x6B, 0x3B}, /* 0xD8-0xDB */ + {0x6B, 0x3F}, {0x6B, 0x3C}, {0x6B, 0x94}, {0x6B, 0x97}, /* 0xDC-0xDF */ + {0x6B, 0x99}, {0x6B, 0x95}, {0x6B, 0xBD}, {0x6B, 0xF0}, /* 0xE0-0xE3 */ + {0x6B, 0xF2}, {0x6B, 0xF3}, {0x6C, 0x30}, {0x6D, 0xFC}, /* 0xE4-0xE7 */ + {0x6E, 0x46}, {0x6E, 0x47}, {0x6E, 0x1F}, {0x6E, 0x49}, /* 0xE8-0xEB */ + {0x6E, 0x88}, {0x6E, 0x3C}, {0x6E, 0x3D}, {0x6E, 0x45}, /* 0xEC-0xEF */ + {0x6E, 0x62}, {0x6E, 0x2B}, {0x6E, 0x3F}, {0x6E, 0x41}, /* 0xF0-0xF3 */ + {0x6E, 0x5D}, {0x6E, 0x73}, {0x6E, 0x1C}, {0x6E, 0x33}, /* 0xF4-0xF7 */ + {0x6E, 0x4B}, {0x6E, 0x40}, {0x6E, 0x51}, {0x6E, 0x3B}, /* 0xF8-0xFB */ + {0x6E, 0x03}, {0x6E, 0x2E}, {0x6E, 0x5E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6E, 0x68}, {0x6E, 0x5C}, {0x6E, 0x61}, {0x6E, 0x31}, /* 0x40-0x43 */ + {0x6E, 0x28}, {0x6E, 0x60}, {0x6E, 0x71}, {0x6E, 0x6B}, /* 0x44-0x47 */ + {0x6E, 0x39}, {0x6E, 0x22}, {0x6E, 0x30}, {0x6E, 0x53}, /* 0x48-0x4B */ + {0x6E, 0x65}, {0x6E, 0x27}, {0x6E, 0x78}, {0x6E, 0x64}, /* 0x4C-0x4F */ + {0x6E, 0x77}, {0x6E, 0x55}, {0x6E, 0x79}, {0x6E, 0x52}, /* 0x50-0x53 */ + {0x6E, 0x66}, {0x6E, 0x35}, {0x6E, 0x36}, {0x6E, 0x5A}, /* 0x54-0x57 */ + {0x71, 0x20}, {0x71, 0x1E}, {0x71, 0x2F}, {0x70, 0xFB}, /* 0x58-0x5B */ + {0x71, 0x2E}, {0x71, 0x31}, {0x71, 0x23}, {0x71, 0x25}, /* 0x5C-0x5F */ + {0x71, 0x22}, {0x71, 0x32}, {0x71, 0x1F}, {0x71, 0x28}, /* 0x60-0x63 */ + {0x71, 0x3A}, {0x71, 0x1B}, {0x72, 0x4B}, {0x72, 0x5A}, /* 0x64-0x67 */ + {0x72, 0x88}, {0x72, 0x89}, {0x72, 0x86}, {0x72, 0x85}, /* 0x68-0x6B */ + {0x72, 0x8B}, {0x73, 0x12}, {0x73, 0x0B}, {0x73, 0x30}, /* 0x6C-0x6F */ + {0x73, 0x22}, {0x73, 0x31}, {0x73, 0x33}, {0x73, 0x27}, /* 0x70-0x73 */ + {0x73, 0x32}, {0x73, 0x2D}, {0x73, 0x26}, {0x73, 0x23}, /* 0x74-0x77 */ + {0x73, 0x35}, {0x73, 0x0C}, {0x74, 0x2E}, {0x74, 0x2C}, /* 0x78-0x7B */ + {0x74, 0x30}, {0x74, 0x2B}, {0x74, 0x16}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x74, 0x1A}, {0x74, 0x21}, {0x74, 0x2D}, /* 0xA0-0xA3 */ + {0x74, 0x31}, {0x74, 0x24}, {0x74, 0x23}, {0x74, 0x1D}, /* 0xA4-0xA7 */ + {0x74, 0x29}, {0x74, 0x20}, {0x74, 0x32}, {0x74, 0xFB}, /* 0xA8-0xAB */ + {0x75, 0x2F}, {0x75, 0x6F}, {0x75, 0x6C}, {0x75, 0xE7}, /* 0xAC-0xAF */ + {0x75, 0xDA}, {0x75, 0xE1}, {0x75, 0xE6}, {0x75, 0xDD}, /* 0xB0-0xB3 */ + {0x75, 0xDF}, {0x75, 0xE4}, {0x75, 0xD7}, {0x76, 0x95}, /* 0xB4-0xB7 */ + {0x76, 0x92}, {0x76, 0xDA}, {0x77, 0x46}, {0x77, 0x47}, /* 0xB8-0xBB */ + {0x77, 0x44}, {0x77, 0x4D}, {0x77, 0x45}, {0x77, 0x4A}, /* 0xBC-0xBF */ + {0x77, 0x4E}, {0x77, 0x4B}, {0x77, 0x4C}, {0x77, 0xDE}, /* 0xC0-0xC3 */ + {0x77, 0xEC}, {0x78, 0x60}, {0x78, 0x64}, {0x78, 0x65}, /* 0xC4-0xC7 */ + {0x78, 0x5C}, {0x78, 0x6D}, {0x78, 0x71}, {0x78, 0x6A}, /* 0xC8-0xCB */ + {0x78, 0x6E}, {0x78, 0x70}, {0x78, 0x69}, {0x78, 0x68}, /* 0xCC-0xCF */ + {0x78, 0x5E}, {0x78, 0x62}, {0x79, 0x74}, {0x79, 0x73}, /* 0xD0-0xD3 */ + {0x79, 0x72}, {0x79, 0x70}, {0x7A, 0x02}, {0x7A, 0x0A}, /* 0xD4-0xD7 */ + {0x7A, 0x03}, {0x7A, 0x0C}, {0x7A, 0x04}, {0x7A, 0x99}, /* 0xD8-0xDB */ + {0x7A, 0xE6}, {0x7A, 0xE4}, {0x7B, 0x4A}, {0x7B, 0x3B}, /* 0xDC-0xDF */ + {0x7B, 0x44}, {0x7B, 0x48}, {0x7B, 0x4C}, {0x7B, 0x4E}, /* 0xE0-0xE3 */ + {0x7B, 0x40}, {0x7B, 0x58}, {0x7B, 0x45}, {0x7C, 0xA2}, /* 0xE4-0xE7 */ + {0x7C, 0x9E}, {0x7C, 0xA8}, {0x7C, 0xA1}, {0x7D, 0x58}, /* 0xE8-0xEB */ + {0x7D, 0x6F}, {0x7D, 0x63}, {0x7D, 0x53}, {0x7D, 0x56}, /* 0xEC-0xEF */ + {0x7D, 0x67}, {0x7D, 0x6A}, {0x7D, 0x4F}, {0x7D, 0x6D}, /* 0xF0-0xF3 */ + {0x7D, 0x5C}, {0x7D, 0x6B}, {0x7D, 0x52}, {0x7D, 0x54}, /* 0xF4-0xF7 */ + {0x7D, 0x69}, {0x7D, 0x51}, {0x7D, 0x5F}, {0x7D, 0x4E}, /* 0xF8-0xFB */ + {0x7F, 0x3E}, {0x7F, 0x3F}, {0x7F, 0x65}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7F, 0x66}, {0x7F, 0xA2}, {0x7F, 0xA0}, {0x7F, 0xA1}, /* 0x40-0x43 */ + {0x7F, 0xD7}, {0x80, 0x51}, {0x80, 0x4F}, {0x80, 0x50}, /* 0x44-0x47 */ + {0x80, 0xFE}, {0x80, 0xD4}, {0x81, 0x43}, {0x81, 0x4A}, /* 0x48-0x4B */ + {0x81, 0x52}, {0x81, 0x4F}, {0x81, 0x47}, {0x81, 0x3D}, /* 0x4C-0x4F */ + {0x81, 0x4D}, {0x81, 0x3A}, {0x81, 0xE6}, {0x81, 0xEE}, /* 0x50-0x53 */ + {0x81, 0xF7}, {0x81, 0xF8}, {0x81, 0xF9}, {0x82, 0x04}, /* 0x54-0x57 */ + {0x82, 0x3C}, {0x82, 0x3D}, {0x82, 0x3F}, {0x82, 0x75}, /* 0x58-0x5B */ + {0x83, 0x3B}, {0x83, 0xCF}, {0x83, 0xF9}, {0x84, 0x23}, /* 0x5C-0x5F */ + {0x83, 0xC0}, {0x83, 0xE8}, {0x84, 0x12}, {0x83, 0xE7}, /* 0x60-0x63 */ + {0x83, 0xE4}, {0x83, 0xFC}, {0x83, 0xF6}, {0x84, 0x10}, /* 0x64-0x67 */ + {0x83, 0xC6}, {0x83, 0xC8}, {0x83, 0xEB}, {0x83, 0xE3}, /* 0x68-0x6B */ + {0x83, 0xBF}, {0x84, 0x01}, {0x83, 0xDD}, {0x83, 0xE5}, /* 0x6C-0x6F */ + {0x83, 0xD8}, {0x83, 0xFF}, {0x83, 0xE1}, {0x83, 0xCB}, /* 0x70-0x73 */ + {0x83, 0xCE}, {0x83, 0xD6}, {0x83, 0xF5}, {0x83, 0xC9}, /* 0x74-0x77 */ + {0x84, 0x09}, {0x84, 0x0F}, {0x83, 0xDE}, {0x84, 0x11}, /* 0x78-0x7B */ + {0x84, 0x06}, {0x83, 0xC2}, {0x83, 0xF3}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x83, 0xD5}, {0x83, 0xFA}, {0x83, 0xC7}, /* 0xA0-0xA3 */ + {0x83, 0xD1}, {0x83, 0xEA}, {0x84, 0x13}, {0x83, 0xC3}, /* 0xA4-0xA7 */ + {0x83, 0xEC}, {0x83, 0xEE}, {0x83, 0xC4}, {0x83, 0xFB}, /* 0xA8-0xAB */ + {0x83, 0xD7}, {0x83, 0xE2}, {0x84, 0x1B}, {0x83, 0xDB}, /* 0xAC-0xAF */ + {0x83, 0xFE}, {0x86, 0xD8}, {0x86, 0xE2}, {0x86, 0xE6}, /* 0xB0-0xB3 */ + {0x86, 0xD3}, {0x86, 0xE3}, {0x86, 0xDA}, {0x86, 0xEA}, /* 0xB4-0xB7 */ + {0x86, 0xDD}, {0x86, 0xEB}, {0x86, 0xDC}, {0x86, 0xEC}, /* 0xB8-0xBB */ + {0x86, 0xE9}, {0x86, 0xD7}, {0x86, 0xE8}, {0x86, 0xD1}, /* 0xBC-0xBF */ + {0x88, 0x48}, {0x88, 0x56}, {0x88, 0x55}, {0x88, 0xBA}, /* 0xC0-0xC3 */ + {0x88, 0xD7}, {0x88, 0xB9}, {0x88, 0xB8}, {0x88, 0xC0}, /* 0xC4-0xC7 */ + {0x88, 0xBE}, {0x88, 0xB6}, {0x88, 0xBC}, {0x88, 0xB7}, /* 0xC8-0xCB */ + {0x88, 0xBD}, {0x88, 0xB2}, {0x89, 0x01}, {0x88, 0xC9}, /* 0xCC-0xCF */ + {0x89, 0x95}, {0x89, 0x98}, {0x89, 0x97}, {0x89, 0xDD}, /* 0xD0-0xD3 */ + {0x89, 0xDA}, {0x89, 0xDB}, {0x8A, 0x4E}, {0x8A, 0x4D}, /* 0xD4-0xD7 */ + {0x8A, 0x39}, {0x8A, 0x59}, {0x8A, 0x40}, {0x8A, 0x57}, /* 0xD8-0xDB */ + {0x8A, 0x58}, {0x8A, 0x44}, {0x8A, 0x45}, {0x8A, 0x52}, /* 0xDC-0xDF */ + {0x8A, 0x48}, {0x8A, 0x51}, {0x8A, 0x4A}, {0x8A, 0x4C}, /* 0xE0-0xE3 */ + {0x8A, 0x4F}, {0x8C, 0x5F}, {0x8C, 0x81}, {0x8C, 0x80}, /* 0xE4-0xE7 */ + {0x8C, 0xBA}, {0x8C, 0xBE}, {0x8C, 0xB0}, {0x8C, 0xB9}, /* 0xE8-0xEB */ + {0x8C, 0xB5}, {0x8D, 0x84}, {0x8D, 0x80}, {0x8D, 0x89}, /* 0xEC-0xEF */ + {0x8D, 0xD8}, {0x8D, 0xD3}, {0x8D, 0xCD}, {0x8D, 0xC7}, /* 0xF0-0xF3 */ + {0x8D, 0xD6}, {0x8D, 0xDC}, {0x8D, 0xCF}, {0x8D, 0xD5}, /* 0xF4-0xF7 */ + {0x8D, 0xD9}, {0x8D, 0xC8}, {0x8D, 0xD7}, {0x8D, 0xC5}, /* 0xF8-0xFB */ + {0x8E, 0xEF}, {0x8E, 0xF7}, {0x8E, 0xFA}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8E, 0xF9}, {0x8E, 0xE6}, {0x8E, 0xEE}, {0x8E, 0xE5}, /* 0x40-0x43 */ + {0x8E, 0xF5}, {0x8E, 0xE7}, {0x8E, 0xE8}, {0x8E, 0xF6}, /* 0x44-0x47 */ + {0x8E, 0xEB}, {0x8E, 0xF1}, {0x8E, 0xEC}, {0x8E, 0xF4}, /* 0x48-0x4B */ + {0x8E, 0xE9}, {0x90, 0x2D}, {0x90, 0x34}, {0x90, 0x2F}, /* 0x4C-0x4F */ + {0x91, 0x06}, {0x91, 0x2C}, {0x91, 0x04}, {0x90, 0xFF}, /* 0x50-0x53 */ + {0x90, 0xFC}, {0x91, 0x08}, {0x90, 0xF9}, {0x90, 0xFB}, /* 0x54-0x57 */ + {0x91, 0x01}, {0x91, 0x00}, {0x91, 0x07}, {0x91, 0x05}, /* 0x58-0x5B */ + {0x91, 0x03}, {0x91, 0x61}, {0x91, 0x64}, {0x91, 0x5F}, /* 0x5C-0x5F */ + {0x91, 0x62}, {0x91, 0x60}, {0x92, 0x01}, {0x92, 0x0A}, /* 0x60-0x63 */ + {0x92, 0x25}, {0x92, 0x03}, {0x92, 0x1A}, {0x92, 0x26}, /* 0x64-0x67 */ + {0x92, 0x0F}, {0x92, 0x0C}, {0x92, 0x00}, {0x92, 0x12}, /* 0x68-0x6B */ + {0x91, 0xFF}, {0x91, 0xFD}, {0x92, 0x06}, {0x92, 0x04}, /* 0x6C-0x6F */ + {0x92, 0x27}, {0x92, 0x02}, {0x92, 0x1C}, {0x92, 0x24}, /* 0x70-0x73 */ + {0x92, 0x19}, {0x92, 0x17}, {0x92, 0x05}, {0x92, 0x16}, /* 0x74-0x77 */ + {0x95, 0x7B}, {0x95, 0x8D}, {0x95, 0x8C}, {0x95, 0x90}, /* 0x78-0x7B */ + {0x96, 0x87}, {0x96, 0x7E}, {0x96, 0x88}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x96, 0x89}, {0x96, 0x83}, {0x96, 0x80}, /* 0xA0-0xA3 */ + {0x96, 0xC2}, {0x96, 0xC8}, {0x96, 0xC3}, {0x96, 0xF1}, /* 0xA4-0xA7 */ + {0x96, 0xF0}, {0x97, 0x6C}, {0x97, 0x70}, {0x97, 0x6E}, /* 0xA8-0xAB */ + {0x98, 0x07}, {0x98, 0xA9}, {0x98, 0xEB}, {0x9C, 0xE6}, /* 0xAC-0xAF */ + {0x9E, 0xF9}, {0x4E, 0x83}, {0x4E, 0x84}, {0x4E, 0xB6}, /* 0xB0-0xB3 */ + {0x50, 0xBD}, {0x50, 0xBF}, {0x50, 0xC6}, {0x50, 0xAE}, /* 0xB4-0xB7 */ + {0x50, 0xC4}, {0x50, 0xCA}, {0x50, 0xB4}, {0x50, 0xC8}, /* 0xB8-0xBB */ + {0x50, 0xC2}, {0x50, 0xB0}, {0x50, 0xC1}, {0x50, 0xBA}, /* 0xBC-0xBF */ + {0x50, 0xB1}, {0x50, 0xCB}, {0x50, 0xC9}, {0x50, 0xB6}, /* 0xC0-0xC3 */ + {0x50, 0xB8}, {0x51, 0xD7}, {0x52, 0x7A}, {0x52, 0x78}, /* 0xC4-0xC7 */ + {0x52, 0x7B}, {0x52, 0x7C}, {0x55, 0xC3}, {0x55, 0xDB}, /* 0xC8-0xCB */ + {0x55, 0xCC}, {0x55, 0xD0}, {0x55, 0xCB}, {0x55, 0xCA}, /* 0xCC-0xCF */ + {0x55, 0xDD}, {0x55, 0xC0}, {0x55, 0xD4}, {0x55, 0xC4}, /* 0xD0-0xD3 */ + {0x55, 0xE9}, {0x55, 0xBF}, {0x55, 0xD2}, {0x55, 0x8D}, /* 0xD4-0xD7 */ + {0x55, 0xCF}, {0x55, 0xD5}, {0x55, 0xE2}, {0x55, 0xD6}, /* 0xD8-0xDB */ + {0x55, 0xC8}, {0x55, 0xF2}, {0x55, 0xCD}, {0x55, 0xD9}, /* 0xDC-0xDF */ + {0x55, 0xC2}, {0x57, 0x14}, {0x58, 0x53}, {0x58, 0x68}, /* 0xE0-0xE3 */ + {0x58, 0x64}, {0x58, 0x4F}, {0x58, 0x4D}, {0x58, 0x49}, /* 0xE4-0xE7 */ + {0x58, 0x6F}, {0x58, 0x55}, {0x58, 0x4E}, {0x58, 0x5D}, /* 0xE8-0xEB */ + {0x58, 0x59}, {0x58, 0x65}, {0x58, 0x5B}, {0x58, 0x3D}, /* 0xEC-0xEF */ + {0x58, 0x63}, {0x58, 0x71}, {0x58, 0xFC}, {0x5A, 0xC7}, /* 0xF0-0xF3 */ + {0x5A, 0xC4}, {0x5A, 0xCB}, {0x5A, 0xBA}, {0x5A, 0xB8}, /* 0xF4-0xF7 */ + {0x5A, 0xB1}, {0x5A, 0xB5}, {0x5A, 0xB0}, {0x5A, 0xBF}, /* 0xF8-0xFB */ + {0x5A, 0xC8}, {0x5A, 0xBB}, {0x5A, 0xC6}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DD[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5A, 0xB7}, {0x5A, 0xC0}, {0x5A, 0xCA}, {0x5A, 0xB4}, /* 0x40-0x43 */ + {0x5A, 0xB6}, {0x5A, 0xCD}, {0x5A, 0xB9}, {0x5A, 0x90}, /* 0x44-0x47 */ + {0x5B, 0xD6}, {0x5B, 0xD8}, {0x5B, 0xD9}, {0x5C, 0x1F}, /* 0x48-0x4B */ + {0x5C, 0x33}, {0x5D, 0x71}, {0x5D, 0x63}, {0x5D, 0x4A}, /* 0x4C-0x4F */ + {0x5D, 0x65}, {0x5D, 0x72}, {0x5D, 0x6C}, {0x5D, 0x5E}, /* 0x50-0x53 */ + {0x5D, 0x68}, {0x5D, 0x67}, {0x5D, 0x62}, {0x5D, 0xF0}, /* 0x54-0x57 */ + {0x5E, 0x4F}, {0x5E, 0x4E}, {0x5E, 0x4A}, {0x5E, 0x4D}, /* 0x58-0x5B */ + {0x5E, 0x4B}, {0x5E, 0xC5}, {0x5E, 0xCC}, {0x5E, 0xC6}, /* 0x5C-0x5F */ + {0x5E, 0xCB}, {0x5E, 0xC7}, {0x5F, 0x40}, {0x5F, 0xAF}, /* 0x60-0x63 */ + {0x5F, 0xAD}, {0x60, 0xF7}, {0x61, 0x49}, {0x61, 0x4A}, /* 0x64-0x67 */ + {0x61, 0x2B}, {0x61, 0x45}, {0x61, 0x36}, {0x61, 0x32}, /* 0x68-0x6B */ + {0x61, 0x2E}, {0x61, 0x46}, {0x61, 0x2F}, {0x61, 0x4F}, /* 0x6C-0x6F */ + {0x61, 0x29}, {0x61, 0x40}, {0x62, 0x20}, {0x91, 0x68}, /* 0x70-0x73 */ + {0x62, 0x23}, {0x62, 0x25}, {0x62, 0x24}, {0x63, 0xC5}, /* 0x74-0x77 */ + {0x63, 0xF1}, {0x63, 0xEB}, {0x64, 0x10}, {0x64, 0x12}, /* 0x78-0x7B */ + {0x64, 0x09}, {0x64, 0x20}, {0x64, 0x24}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x64, 0x33}, {0x64, 0x43}, {0x64, 0x1F}, /* 0xA0-0xA3 */ + {0x64, 0x15}, {0x64, 0x18}, {0x64, 0x39}, {0x64, 0x37}, /* 0xA4-0xA7 */ + {0x64, 0x22}, {0x64, 0x23}, {0x64, 0x0C}, {0x64, 0x26}, /* 0xA8-0xAB */ + {0x64, 0x30}, {0x64, 0x28}, {0x64, 0x41}, {0x64, 0x35}, /* 0xAC-0xAF */ + {0x64, 0x2F}, {0x64, 0x0A}, {0x64, 0x1A}, {0x64, 0x40}, /* 0xB0-0xB3 */ + {0x64, 0x25}, {0x64, 0x27}, {0x64, 0x0B}, {0x63, 0xE7}, /* 0xB4-0xB7 */ + {0x64, 0x1B}, {0x64, 0x2E}, {0x64, 0x21}, {0x64, 0x0E}, /* 0xB8-0xBB */ + {0x65, 0x6F}, {0x65, 0x92}, {0x65, 0xD3}, {0x66, 0x86}, /* 0xBC-0xBF */ + {0x66, 0x8C}, {0x66, 0x95}, {0x66, 0x90}, {0x66, 0x8B}, /* 0xC0-0xC3 */ + {0x66, 0x8A}, {0x66, 0x99}, {0x66, 0x94}, {0x66, 0x78}, /* 0xC4-0xC7 */ + {0x67, 0x20}, {0x69, 0x66}, {0x69, 0x5F}, {0x69, 0x38}, /* 0xC8-0xCB */ + {0x69, 0x4E}, {0x69, 0x62}, {0x69, 0x71}, {0x69, 0x3F}, /* 0xCC-0xCF */ + {0x69, 0x45}, {0x69, 0x6A}, {0x69, 0x39}, {0x69, 0x42}, /* 0xD0-0xD3 */ + {0x69, 0x57}, {0x69, 0x59}, {0x69, 0x7A}, {0x69, 0x48}, /* 0xD4-0xD7 */ + {0x69, 0x49}, {0x69, 0x35}, {0x69, 0x6C}, {0x69, 0x33}, /* 0xD8-0xDB */ + {0x69, 0x3D}, {0x69, 0x65}, {0x68, 0xF0}, {0x69, 0x78}, /* 0xDC-0xDF */ + {0x69, 0x34}, {0x69, 0x69}, {0x69, 0x40}, {0x69, 0x6F}, /* 0xE0-0xE3 */ + {0x69, 0x44}, {0x69, 0x76}, {0x69, 0x58}, {0x69, 0x41}, /* 0xE4-0xE7 */ + {0x69, 0x74}, {0x69, 0x4C}, {0x69, 0x3B}, {0x69, 0x4B}, /* 0xE8-0xEB */ + {0x69, 0x37}, {0x69, 0x5C}, {0x69, 0x4F}, {0x69, 0x51}, /* 0xEC-0xEF */ + {0x69, 0x32}, {0x69, 0x52}, {0x69, 0x2F}, {0x69, 0x7B}, /* 0xF0-0xF3 */ + {0x69, 0x3C}, {0x6B, 0x46}, {0x6B, 0x45}, {0x6B, 0x43}, /* 0xF4-0xF7 */ + {0x6B, 0x42}, {0x6B, 0x48}, {0x6B, 0x41}, {0x6B, 0x9B}, /* 0xF8-0xFB */ + {0xFA, 0x0D}, {0x6B, 0xFB}, {0x6B, 0xFC}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6B, 0xF9}, {0x6B, 0xF7}, {0x6B, 0xF8}, {0x6E, 0x9B}, /* 0x40-0x43 */ + {0x6E, 0xD6}, {0x6E, 0xC8}, {0x6E, 0x8F}, {0x6E, 0xC0}, /* 0x44-0x47 */ + {0x6E, 0x9F}, {0x6E, 0x93}, {0x6E, 0x94}, {0x6E, 0xA0}, /* 0x48-0x4B */ + {0x6E, 0xB1}, {0x6E, 0xB9}, {0x6E, 0xC6}, {0x6E, 0xD2}, /* 0x4C-0x4F */ + {0x6E, 0xBD}, {0x6E, 0xC1}, {0x6E, 0x9E}, {0x6E, 0xC9}, /* 0x50-0x53 */ + {0x6E, 0xB7}, {0x6E, 0xB0}, {0x6E, 0xCD}, {0x6E, 0xA6}, /* 0x54-0x57 */ + {0x6E, 0xCF}, {0x6E, 0xB2}, {0x6E, 0xBE}, {0x6E, 0xC3}, /* 0x58-0x5B */ + {0x6E, 0xDC}, {0x6E, 0xD8}, {0x6E, 0x99}, {0x6E, 0x92}, /* 0x5C-0x5F */ + {0x6E, 0x8E}, {0x6E, 0x8D}, {0x6E, 0xA4}, {0x6E, 0xA1}, /* 0x60-0x63 */ + {0x6E, 0xBF}, {0x6E, 0xB3}, {0x6E, 0xD0}, {0x6E, 0xCA}, /* 0x64-0x67 */ + {0x6E, 0x97}, {0x6E, 0xAE}, {0x6E, 0xA3}, {0x71, 0x47}, /* 0x68-0x6B */ + {0x71, 0x54}, {0x71, 0x52}, {0x71, 0x63}, {0x71, 0x60}, /* 0x6C-0x6F */ + {0x71, 0x41}, {0x71, 0x5D}, {0x71, 0x62}, {0x71, 0x72}, /* 0x70-0x73 */ + {0x71, 0x78}, {0x71, 0x6A}, {0x71, 0x61}, {0x71, 0x42}, /* 0x74-0x77 */ + {0x71, 0x58}, {0x71, 0x43}, {0x71, 0x4B}, {0x71, 0x70}, /* 0x78-0x7B */ + {0x71, 0x5F}, {0x71, 0x50}, {0x71, 0x53}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x71, 0x44}, {0x71, 0x4D}, {0x71, 0x5A}, /* 0xA0-0xA3 */ + {0x72, 0x4F}, {0x72, 0x8D}, {0x72, 0x8C}, {0x72, 0x91}, /* 0xA4-0xA7 */ + {0x72, 0x90}, {0x72, 0x8E}, {0x73, 0x3C}, {0x73, 0x42}, /* 0xA8-0xAB */ + {0x73, 0x3B}, {0x73, 0x3A}, {0x73, 0x40}, {0x73, 0x4A}, /* 0xAC-0xAF */ + {0x73, 0x49}, {0x74, 0x44}, {0x74, 0x4A}, {0x74, 0x4B}, /* 0xB0-0xB3 */ + {0x74, 0x52}, {0x74, 0x51}, {0x74, 0x57}, {0x74, 0x40}, /* 0xB4-0xB7 */ + {0x74, 0x4F}, {0x74, 0x50}, {0x74, 0x4E}, {0x74, 0x42}, /* 0xB8-0xBB */ + {0x74, 0x46}, {0x74, 0x4D}, {0x74, 0x54}, {0x74, 0xE1}, /* 0xBC-0xBF */ + {0x74, 0xFF}, {0x74, 0xFE}, {0x74, 0xFD}, {0x75, 0x1D}, /* 0xC0-0xC3 */ + {0x75, 0x79}, {0x75, 0x77}, {0x69, 0x83}, {0x75, 0xEF}, /* 0xC4-0xC7 */ + {0x76, 0x0F}, {0x76, 0x03}, {0x75, 0xF7}, {0x75, 0xFE}, /* 0xC8-0xCB */ + {0x75, 0xFC}, {0x75, 0xF9}, {0x75, 0xF8}, {0x76, 0x10}, /* 0xCC-0xCF */ + {0x75, 0xFB}, {0x75, 0xF6}, {0x75, 0xED}, {0x75, 0xF5}, /* 0xD0-0xD3 */ + {0x75, 0xFD}, {0x76, 0x99}, {0x76, 0xB5}, {0x76, 0xDD}, /* 0xD4-0xD7 */ + {0x77, 0x55}, {0x77, 0x5F}, {0x77, 0x60}, {0x77, 0x52}, /* 0xD8-0xDB */ + {0x77, 0x56}, {0x77, 0x5A}, {0x77, 0x69}, {0x77, 0x67}, /* 0xDC-0xDF */ + {0x77, 0x54}, {0x77, 0x59}, {0x77, 0x6D}, {0x77, 0xE0}, /* 0xE0-0xE3 */ + {0x78, 0x87}, {0x78, 0x9A}, {0x78, 0x94}, {0x78, 0x8F}, /* 0xE4-0xE7 */ + {0x78, 0x84}, {0x78, 0x95}, {0x78, 0x85}, {0x78, 0x86}, /* 0xE8-0xEB */ + {0x78, 0xA1}, {0x78, 0x83}, {0x78, 0x79}, {0x78, 0x99}, /* 0xEC-0xEF */ + {0x78, 0x80}, {0x78, 0x96}, {0x78, 0x7B}, {0x79, 0x7C}, /* 0xF0-0xF3 */ + {0x79, 0x82}, {0x79, 0x7D}, {0x79, 0x79}, {0x7A, 0x11}, /* 0xF4-0xF7 */ + {0x7A, 0x18}, {0x7A, 0x19}, {0x7A, 0x12}, {0x7A, 0x17}, /* 0xF8-0xFB */ + {0x7A, 0x15}, {0x7A, 0x22}, {0x7A, 0x13}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_DF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7A, 0x1B}, {0x7A, 0x10}, {0x7A, 0xA3}, {0x7A, 0xA2}, /* 0x40-0x43 */ + {0x7A, 0x9E}, {0x7A, 0xEB}, {0x7B, 0x66}, {0x7B, 0x64}, /* 0x44-0x47 */ + {0x7B, 0x6D}, {0x7B, 0x74}, {0x7B, 0x69}, {0x7B, 0x72}, /* 0x48-0x4B */ + {0x7B, 0x65}, {0x7B, 0x73}, {0x7B, 0x71}, {0x7B, 0x70}, /* 0x4C-0x4F */ + {0x7B, 0x61}, {0x7B, 0x78}, {0x7B, 0x76}, {0x7B, 0x63}, /* 0x50-0x53 */ + {0x7C, 0xB2}, {0x7C, 0xB4}, {0x7C, 0xAF}, {0x7D, 0x88}, /* 0x54-0x57 */ + {0x7D, 0x86}, {0x7D, 0x80}, {0x7D, 0x8D}, {0x7D, 0x7F}, /* 0x58-0x5B */ + {0x7D, 0x85}, {0x7D, 0x7A}, {0x7D, 0x8E}, {0x7D, 0x7B}, /* 0x5C-0x5F */ + {0x7D, 0x83}, {0x7D, 0x7C}, {0x7D, 0x8C}, {0x7D, 0x94}, /* 0x60-0x63 */ + {0x7D, 0x84}, {0x7D, 0x7D}, {0x7D, 0x92}, {0x7F, 0x6D}, /* 0x64-0x67 */ + {0x7F, 0x6B}, {0x7F, 0x67}, {0x7F, 0x68}, {0x7F, 0x6C}, /* 0x68-0x6B */ + {0x7F, 0xA6}, {0x7F, 0xA5}, {0x7F, 0xA7}, {0x7F, 0xDB}, /* 0x6C-0x6F */ + {0x7F, 0xDC}, {0x80, 0x21}, {0x81, 0x64}, {0x81, 0x60}, /* 0x70-0x73 */ + {0x81, 0x77}, {0x81, 0x5C}, {0x81, 0x69}, {0x81, 0x5B}, /* 0x74-0x77 */ + {0x81, 0x62}, {0x81, 0x72}, {0x67, 0x21}, {0x81, 0x5E}, /* 0x78-0x7B */ + {0x81, 0x76}, {0x81, 0x67}, {0x81, 0x6F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x81, 0x44}, {0x81, 0x61}, {0x82, 0x1D}, /* 0xA0-0xA3 */ + {0x82, 0x49}, {0x82, 0x44}, {0x82, 0x40}, {0x82, 0x42}, /* 0xA4-0xA7 */ + {0x82, 0x45}, {0x84, 0xF1}, {0x84, 0x3F}, {0x84, 0x56}, /* 0xA8-0xAB */ + {0x84, 0x76}, {0x84, 0x79}, {0x84, 0x8F}, {0x84, 0x8D}, /* 0xAC-0xAF */ + {0x84, 0x65}, {0x84, 0x51}, {0x84, 0x40}, {0x84, 0x86}, /* 0xB0-0xB3 */ + {0x84, 0x67}, {0x84, 0x30}, {0x84, 0x4D}, {0x84, 0x7D}, /* 0xB4-0xB7 */ + {0x84, 0x5A}, {0x84, 0x59}, {0x84, 0x74}, {0x84, 0x73}, /* 0xB8-0xBB */ + {0x84, 0x5D}, {0x85, 0x07}, {0x84, 0x5E}, {0x84, 0x37}, /* 0xBC-0xBF */ + {0x84, 0x3A}, {0x84, 0x34}, {0x84, 0x7A}, {0x84, 0x43}, /* 0xC0-0xC3 */ + {0x84, 0x78}, {0x84, 0x32}, {0x84, 0x45}, {0x84, 0x29}, /* 0xC4-0xC7 */ + {0x83, 0xD9}, {0x84, 0x4B}, {0x84, 0x2F}, {0x84, 0x42}, /* 0xC8-0xCB */ + {0x84, 0x2D}, {0x84, 0x5F}, {0x84, 0x70}, {0x84, 0x39}, /* 0xCC-0xCF */ + {0x84, 0x4E}, {0x84, 0x4C}, {0x84, 0x52}, {0x84, 0x6F}, /* 0xD0-0xD3 */ + {0x84, 0xC5}, {0x84, 0x8E}, {0x84, 0x3B}, {0x84, 0x47}, /* 0xD4-0xD7 */ + {0x84, 0x36}, {0x84, 0x33}, {0x84, 0x68}, {0x84, 0x7E}, /* 0xD8-0xDB */ + {0x84, 0x44}, {0x84, 0x2B}, {0x84, 0x60}, {0x84, 0x54}, /* 0xDC-0xDF */ + {0x84, 0x6E}, {0x84, 0x50}, {0x87, 0x0B}, {0x87, 0x04}, /* 0xE0-0xE3 */ + {0x86, 0xF7}, {0x87, 0x0C}, {0x86, 0xFA}, {0x86, 0xD6}, /* 0xE4-0xE7 */ + {0x86, 0xF5}, {0x87, 0x4D}, {0x86, 0xF8}, {0x87, 0x0E}, /* 0xE8-0xEB */ + {0x87, 0x09}, {0x87, 0x01}, {0x86, 0xF6}, {0x87, 0x0D}, /* 0xEC-0xEF */ + {0x87, 0x05}, {0x88, 0xD6}, {0x88, 0xCB}, {0x88, 0xCD}, /* 0xF0-0xF3 */ + {0x88, 0xCE}, {0x88, 0xDE}, {0x88, 0xDB}, {0x88, 0xDA}, /* 0xF4-0xF7 */ + {0x88, 0xCC}, {0x88, 0xD0}, {0x89, 0x85}, {0x89, 0x9B}, /* 0xF8-0xFB */ + {0x89, 0xDF}, {0x89, 0xE5}, {0x89, 0xE4}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x89, 0xE1}, {0x89, 0xE0}, {0x89, 0xE2}, {0x89, 0xDC}, /* 0x40-0x43 */ + {0x89, 0xE6}, {0x8A, 0x76}, {0x8A, 0x86}, {0x8A, 0x7F}, /* 0x44-0x47 */ + {0x8A, 0x61}, {0x8A, 0x3F}, {0x8A, 0x77}, {0x8A, 0x82}, /* 0x48-0x4B */ + {0x8A, 0x84}, {0x8A, 0x75}, {0x8A, 0x83}, {0x8A, 0x81}, /* 0x4C-0x4F */ + {0x8A, 0x74}, {0x8A, 0x7A}, {0x8C, 0x3C}, {0x8C, 0x4B}, /* 0x50-0x53 */ + {0x8C, 0x4A}, {0x8C, 0x65}, {0x8C, 0x64}, {0x8C, 0x66}, /* 0x54-0x57 */ + {0x8C, 0x86}, {0x8C, 0x84}, {0x8C, 0x85}, {0x8C, 0xCC}, /* 0x58-0x5B */ + {0x8D, 0x68}, {0x8D, 0x69}, {0x8D, 0x91}, {0x8D, 0x8C}, /* 0x5C-0x5F */ + {0x8D, 0x8E}, {0x8D, 0x8F}, {0x8D, 0x8D}, {0x8D, 0x93}, /* 0x60-0x63 */ + {0x8D, 0x94}, {0x8D, 0x90}, {0x8D, 0x92}, {0x8D, 0xF0}, /* 0x64-0x67 */ + {0x8D, 0xE0}, {0x8D, 0xEC}, {0x8D, 0xF1}, {0x8D, 0xEE}, /* 0x68-0x6B */ + {0x8D, 0xD0}, {0x8D, 0xE9}, {0x8D, 0xE3}, {0x8D, 0xE2}, /* 0x6C-0x6F */ + {0x8D, 0xE7}, {0x8D, 0xF2}, {0x8D, 0xEB}, {0x8D, 0xF4}, /* 0x70-0x73 */ + {0x8F, 0x06}, {0x8E, 0xFF}, {0x8F, 0x01}, {0x8F, 0x00}, /* 0x74-0x77 */ + {0x8F, 0x05}, {0x8F, 0x07}, {0x8F, 0x08}, {0x8F, 0x02}, /* 0x78-0x7B */ + {0x8F, 0x0B}, {0x90, 0x52}, {0x90, 0x3F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x90, 0x44}, {0x90, 0x49}, {0x90, 0x3D}, /* 0xA0-0xA3 */ + {0x91, 0x10}, {0x91, 0x0D}, {0x91, 0x0F}, {0x91, 0x11}, /* 0xA4-0xA7 */ + {0x91, 0x16}, {0x91, 0x14}, {0x91, 0x0B}, {0x91, 0x0E}, /* 0xA8-0xAB */ + {0x91, 0x6E}, {0x91, 0x6F}, {0x92, 0x48}, {0x92, 0x52}, /* 0xAC-0xAF */ + {0x92, 0x30}, {0x92, 0x3A}, {0x92, 0x66}, {0x92, 0x33}, /* 0xB0-0xB3 */ + {0x92, 0x65}, {0x92, 0x5E}, {0x92, 0x83}, {0x92, 0x2E}, /* 0xB4-0xB7 */ + {0x92, 0x4A}, {0x92, 0x46}, {0x92, 0x6D}, {0x92, 0x6C}, /* 0xB8-0xBB */ + {0x92, 0x4F}, {0x92, 0x60}, {0x92, 0x67}, {0x92, 0x6F}, /* 0xBC-0xBF */ + {0x92, 0x36}, {0x92, 0x61}, {0x92, 0x70}, {0x92, 0x31}, /* 0xC0-0xC3 */ + {0x92, 0x54}, {0x92, 0x63}, {0x92, 0x50}, {0x92, 0x72}, /* 0xC4-0xC7 */ + {0x92, 0x4E}, {0x92, 0x53}, {0x92, 0x4C}, {0x92, 0x56}, /* 0xC8-0xCB */ + {0x92, 0x32}, {0x95, 0x9F}, {0x95, 0x9C}, {0x95, 0x9E}, /* 0xCC-0xCF */ + {0x95, 0x9B}, {0x96, 0x92}, {0x96, 0x93}, {0x96, 0x91}, /* 0xD0-0xD3 */ + {0x96, 0x97}, {0x96, 0xCE}, {0x96, 0xFA}, {0x96, 0xFD}, /* 0xD4-0xD7 */ + {0x96, 0xF8}, {0x96, 0xF5}, {0x97, 0x73}, {0x97, 0x77}, /* 0xD8-0xDB */ + {0x97, 0x78}, {0x97, 0x72}, {0x98, 0x0F}, {0x98, 0x0D}, /* 0xDC-0xDF */ + {0x98, 0x0E}, {0x98, 0xAC}, {0x98, 0xF6}, {0x98, 0xF9}, /* 0xE0-0xE3 */ + {0x99, 0xAF}, {0x99, 0xB2}, {0x99, 0xB0}, {0x99, 0xB5}, /* 0xE4-0xE7 */ + {0x9A, 0xAD}, {0x9A, 0xAB}, {0x9B, 0x5B}, {0x9C, 0xEA}, /* 0xE8-0xEB */ + {0x9C, 0xED}, {0x9C, 0xE7}, {0x9E, 0x80}, {0x9E, 0xFD}, /* 0xEC-0xEF */ + {0x50, 0xE6}, {0x50, 0xD4}, {0x50, 0xD7}, {0x50, 0xE8}, /* 0xF0-0xF3 */ + {0x50, 0xF3}, {0x50, 0xDB}, {0x50, 0xEA}, {0x50, 0xDD}, /* 0xF4-0xF7 */ + {0x50, 0xE4}, {0x50, 0xD3}, {0x50, 0xEC}, {0x50, 0xF0}, /* 0xF8-0xFB */ + {0x50, 0xEF}, {0x50, 0xE3}, {0x50, 0xE0}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x51, 0xD8}, {0x52, 0x80}, {0x52, 0x81}, {0x52, 0xE9}, /* 0x40-0x43 */ + {0x52, 0xEB}, {0x53, 0x30}, {0x53, 0xAC}, {0x56, 0x27}, /* 0x44-0x47 */ + {0x56, 0x15}, {0x56, 0x0C}, {0x56, 0x12}, {0x55, 0xFC}, /* 0x48-0x4B */ + {0x56, 0x0F}, {0x56, 0x1C}, {0x56, 0x01}, {0x56, 0x13}, /* 0x4C-0x4F */ + {0x56, 0x02}, {0x55, 0xFA}, {0x56, 0x1D}, {0x56, 0x04}, /* 0x50-0x53 */ + {0x55, 0xFF}, {0x55, 0xF9}, {0x58, 0x89}, {0x58, 0x7C}, /* 0x54-0x57 */ + {0x58, 0x90}, {0x58, 0x98}, {0x58, 0x86}, {0x58, 0x81}, /* 0x58-0x5B */ + {0x58, 0x7F}, {0x58, 0x74}, {0x58, 0x8B}, {0x58, 0x7A}, /* 0x5C-0x5F */ + {0x58, 0x87}, {0x58, 0x91}, {0x58, 0x8E}, {0x58, 0x76}, /* 0x60-0x63 */ + {0x58, 0x82}, {0x58, 0x88}, {0x58, 0x7B}, {0x58, 0x94}, /* 0x64-0x67 */ + {0x58, 0x8F}, {0x58, 0xFE}, {0x59, 0x6B}, {0x5A, 0xDC}, /* 0x68-0x6B */ + {0x5A, 0xEE}, {0x5A, 0xE5}, {0x5A, 0xD5}, {0x5A, 0xEA}, /* 0x6C-0x6F */ + {0x5A, 0xDA}, {0x5A, 0xED}, {0x5A, 0xEB}, {0x5A, 0xF3}, /* 0x70-0x73 */ + {0x5A, 0xE2}, {0x5A, 0xE0}, {0x5A, 0xDB}, {0x5A, 0xEC}, /* 0x74-0x77 */ + {0x5A, 0xDE}, {0x5A, 0xDD}, {0x5A, 0xD9}, {0x5A, 0xE8}, /* 0x78-0x7B */ + {0x5A, 0xDF}, {0x5B, 0x77}, {0x5B, 0xE0}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x5B, 0xE3}, {0x5C, 0x63}, {0x5D, 0x82}, /* 0xA0-0xA3 */ + {0x5D, 0x80}, {0x5D, 0x7D}, {0x5D, 0x86}, {0x5D, 0x7A}, /* 0xA4-0xA7 */ + {0x5D, 0x81}, {0x5D, 0x77}, {0x5D, 0x8A}, {0x5D, 0x89}, /* 0xA8-0xAB */ + {0x5D, 0x88}, {0x5D, 0x7E}, {0x5D, 0x7C}, {0x5D, 0x8D}, /* 0xAC-0xAF */ + {0x5D, 0x79}, {0x5D, 0x7F}, {0x5E, 0x58}, {0x5E, 0x59}, /* 0xB0-0xB3 */ + {0x5E, 0x53}, {0x5E, 0xD8}, {0x5E, 0xD1}, {0x5E, 0xD7}, /* 0xB4-0xB7 */ + {0x5E, 0xCE}, {0x5E, 0xDC}, {0x5E, 0xD5}, {0x5E, 0xD9}, /* 0xB8-0xBB */ + {0x5E, 0xD2}, {0x5E, 0xD4}, {0x5F, 0x44}, {0x5F, 0x43}, /* 0xBC-0xBF */ + {0x5F, 0x6F}, {0x5F, 0xB6}, {0x61, 0x2C}, {0x61, 0x28}, /* 0xC0-0xC3 */ + {0x61, 0x41}, {0x61, 0x5E}, {0x61, 0x71}, {0x61, 0x73}, /* 0xC4-0xC7 */ + {0x61, 0x52}, {0x61, 0x53}, {0x61, 0x72}, {0x61, 0x6C}, /* 0xC8-0xCB */ + {0x61, 0x80}, {0x61, 0x74}, {0x61, 0x54}, {0x61, 0x7A}, /* 0xCC-0xCF */ + {0x61, 0x5B}, {0x61, 0x65}, {0x61, 0x3B}, {0x61, 0x6A}, /* 0xD0-0xD3 */ + {0x61, 0x61}, {0x61, 0x56}, {0x62, 0x29}, {0x62, 0x27}, /* 0xD4-0xD7 */ + {0x62, 0x2B}, {0x64, 0x2B}, {0x64, 0x4D}, {0x64, 0x5B}, /* 0xD8-0xDB */ + {0x64, 0x5D}, {0x64, 0x74}, {0x64, 0x76}, {0x64, 0x72}, /* 0xDC-0xDF */ + {0x64, 0x73}, {0x64, 0x7D}, {0x64, 0x75}, {0x64, 0x66}, /* 0xE0-0xE3 */ + {0x64, 0xA6}, {0x64, 0x4E}, {0x64, 0x82}, {0x64, 0x5E}, /* 0xE4-0xE7 */ + {0x64, 0x5C}, {0x64, 0x4B}, {0x64, 0x53}, {0x64, 0x60}, /* 0xE8-0xEB */ + {0x64, 0x50}, {0x64, 0x7F}, {0x64, 0x3F}, {0x64, 0x6C}, /* 0xEC-0xEF */ + {0x64, 0x6B}, {0x64, 0x59}, {0x64, 0x65}, {0x64, 0x77}, /* 0xF0-0xF3 */ + {0x65, 0x73}, {0x65, 0xA0}, {0x66, 0xA1}, {0x66, 0xA0}, /* 0xF4-0xF7 */ + {0x66, 0x9F}, {0x67, 0x05}, {0x67, 0x04}, {0x67, 0x22}, /* 0xF8-0xFB */ + {0x69, 0xB1}, {0x69, 0xB6}, {0x69, 0xC9}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x69, 0xA0}, {0x69, 0xCE}, {0x69, 0x96}, {0x69, 0xB0}, /* 0x40-0x43 */ + {0x69, 0xAC}, {0x69, 0xBC}, {0x69, 0x91}, {0x69, 0x99}, /* 0x44-0x47 */ + {0x69, 0x8E}, {0x69, 0xA7}, {0x69, 0x8D}, {0x69, 0xA9}, /* 0x48-0x4B */ + {0x69, 0xBE}, {0x69, 0xAF}, {0x69, 0xBF}, {0x69, 0xC4}, /* 0x4C-0x4F */ + {0x69, 0xBD}, {0x69, 0xA4}, {0x69, 0xD4}, {0x69, 0xB9}, /* 0x50-0x53 */ + {0x69, 0xCA}, {0x69, 0x9A}, {0x69, 0xCF}, {0x69, 0xB3}, /* 0x54-0x57 */ + {0x69, 0x93}, {0x69, 0xAA}, {0x69, 0xA1}, {0x69, 0x9E}, /* 0x58-0x5B */ + {0x69, 0xD9}, {0x69, 0x97}, {0x69, 0x90}, {0x69, 0xC2}, /* 0x5C-0x5F */ + {0x69, 0xB5}, {0x69, 0xA5}, {0x69, 0xC6}, {0x6B, 0x4A}, /* 0x60-0x63 */ + {0x6B, 0x4D}, {0x6B, 0x4B}, {0x6B, 0x9E}, {0x6B, 0x9F}, /* 0x64-0x67 */ + {0x6B, 0xA0}, {0x6B, 0xC3}, {0x6B, 0xC4}, {0x6B, 0xFE}, /* 0x68-0x6B */ + {0x6E, 0xCE}, {0x6E, 0xF5}, {0x6E, 0xF1}, {0x6F, 0x03}, /* 0x6C-0x6F */ + {0x6F, 0x25}, {0x6E, 0xF8}, {0x6F, 0x37}, {0x6E, 0xFB}, /* 0x70-0x73 */ + {0x6F, 0x2E}, {0x6F, 0x09}, {0x6F, 0x4E}, {0x6F, 0x19}, /* 0x74-0x77 */ + {0x6F, 0x1A}, {0x6F, 0x27}, {0x6F, 0x18}, {0x6F, 0x3B}, /* 0x78-0x7B */ + {0x6F, 0x12}, {0x6E, 0xED}, {0x6F, 0x0A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x6F, 0x36}, {0x6F, 0x73}, {0x6E, 0xF9}, /* 0xA0-0xA3 */ + {0x6E, 0xEE}, {0x6F, 0x2D}, {0x6F, 0x40}, {0x6F, 0x30}, /* 0xA4-0xA7 */ + {0x6F, 0x3C}, {0x6F, 0x35}, {0x6E, 0xEB}, {0x6F, 0x07}, /* 0xA8-0xAB */ + {0x6F, 0x0E}, {0x6F, 0x43}, {0x6F, 0x05}, {0x6E, 0xFD}, /* 0xAC-0xAF */ + {0x6E, 0xF6}, {0x6F, 0x39}, {0x6F, 0x1C}, {0x6E, 0xFC}, /* 0xB0-0xB3 */ + {0x6F, 0x3A}, {0x6F, 0x1F}, {0x6F, 0x0D}, {0x6F, 0x1E}, /* 0xB4-0xB7 */ + {0x6F, 0x08}, {0x6F, 0x21}, {0x71, 0x87}, {0x71, 0x90}, /* 0xB8-0xBB */ + {0x71, 0x89}, {0x71, 0x80}, {0x71, 0x85}, {0x71, 0x82}, /* 0xBC-0xBF */ + {0x71, 0x8F}, {0x71, 0x7B}, {0x71, 0x86}, {0x71, 0x81}, /* 0xC0-0xC3 */ + {0x71, 0x97}, {0x72, 0x44}, {0x72, 0x53}, {0x72, 0x97}, /* 0xC4-0xC7 */ + {0x72, 0x95}, {0x72, 0x93}, {0x73, 0x43}, {0x73, 0x4D}, /* 0xC8-0xCB */ + {0x73, 0x51}, {0x73, 0x4C}, {0x74, 0x62}, {0x74, 0x73}, /* 0xCC-0xCF */ + {0x74, 0x71}, {0x74, 0x75}, {0x74, 0x72}, {0x74, 0x67}, /* 0xD0-0xD3 */ + {0x74, 0x6E}, {0x75, 0x00}, {0x75, 0x02}, {0x75, 0x03}, /* 0xD4-0xD7 */ + {0x75, 0x7D}, {0x75, 0x90}, {0x76, 0x16}, {0x76, 0x08}, /* 0xD8-0xDB */ + {0x76, 0x0C}, {0x76, 0x15}, {0x76, 0x11}, {0x76, 0x0A}, /* 0xDC-0xDF */ + {0x76, 0x14}, {0x76, 0xB8}, {0x77, 0x81}, {0x77, 0x7C}, /* 0xE0-0xE3 */ + {0x77, 0x85}, {0x77, 0x82}, {0x77, 0x6E}, {0x77, 0x80}, /* 0xE4-0xE7 */ + {0x77, 0x6F}, {0x77, 0x7E}, {0x77, 0x83}, {0x78, 0xB2}, /* 0xE8-0xEB */ + {0x78, 0xAA}, {0x78, 0xB4}, {0x78, 0xAD}, {0x78, 0xA8}, /* 0xEC-0xEF */ + {0x78, 0x7E}, {0x78, 0xAB}, {0x78, 0x9E}, {0x78, 0xA5}, /* 0xF0-0xF3 */ + {0x78, 0xA0}, {0x78, 0xAC}, {0x78, 0xA2}, {0x78, 0xA4}, /* 0xF4-0xF7 */ + {0x79, 0x98}, {0x79, 0x8A}, {0x79, 0x8B}, {0x79, 0x96}, /* 0xF8-0xFB */ + {0x79, 0x95}, {0x79, 0x94}, {0x79, 0x93}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x79, 0x97}, {0x79, 0x88}, {0x79, 0x92}, {0x79, 0x90}, /* 0x40-0x43 */ + {0x7A, 0x2B}, {0x7A, 0x4A}, {0x7A, 0x30}, {0x7A, 0x2F}, /* 0x44-0x47 */ + {0x7A, 0x28}, {0x7A, 0x26}, {0x7A, 0xA8}, {0x7A, 0xAB}, /* 0x48-0x4B */ + {0x7A, 0xAC}, {0x7A, 0xEE}, {0x7B, 0x88}, {0x7B, 0x9C}, /* 0x4C-0x4F */ + {0x7B, 0x8A}, {0x7B, 0x91}, {0x7B, 0x90}, {0x7B, 0x96}, /* 0x50-0x53 */ + {0x7B, 0x8D}, {0x7B, 0x8C}, {0x7B, 0x9B}, {0x7B, 0x8E}, /* 0x54-0x57 */ + {0x7B, 0x85}, {0x7B, 0x98}, {0x52, 0x84}, {0x7B, 0x99}, /* 0x58-0x5B */ + {0x7B, 0xA4}, {0x7B, 0x82}, {0x7C, 0xBB}, {0x7C, 0xBF}, /* 0x5C-0x5F */ + {0x7C, 0xBC}, {0x7C, 0xBA}, {0x7D, 0xA7}, {0x7D, 0xB7}, /* 0x60-0x63 */ + {0x7D, 0xC2}, {0x7D, 0xA3}, {0x7D, 0xAA}, {0x7D, 0xC1}, /* 0x64-0x67 */ + {0x7D, 0xC0}, {0x7D, 0xC5}, {0x7D, 0x9D}, {0x7D, 0xCE}, /* 0x68-0x6B */ + {0x7D, 0xC4}, {0x7D, 0xC6}, {0x7D, 0xCB}, {0x7D, 0xCC}, /* 0x6C-0x6F */ + {0x7D, 0xAF}, {0x7D, 0xB9}, {0x7D, 0x96}, {0x7D, 0xBC}, /* 0x70-0x73 */ + {0x7D, 0x9F}, {0x7D, 0xA6}, {0x7D, 0xAE}, {0x7D, 0xA9}, /* 0x74-0x77 */ + {0x7D, 0xA1}, {0x7D, 0xC9}, {0x7F, 0x73}, {0x7F, 0xE2}, /* 0x78-0x7B */ + {0x7F, 0xE3}, {0x7F, 0xE5}, {0x7F, 0xDE}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x80, 0x24}, {0x80, 0x5D}, {0x80, 0x5C}, /* 0xA0-0xA3 */ + {0x81, 0x89}, {0x81, 0x86}, {0x81, 0x83}, {0x81, 0x87}, /* 0xA4-0xA7 */ + {0x81, 0x8D}, {0x81, 0x8C}, {0x81, 0x8B}, {0x82, 0x15}, /* 0xA8-0xAB */ + {0x84, 0x97}, {0x84, 0xA4}, {0x84, 0xA1}, {0x84, 0x9F}, /* 0xAC-0xAF */ + {0x84, 0xBA}, {0x84, 0xCE}, {0x84, 0xC2}, {0x84, 0xAC}, /* 0xB0-0xB3 */ + {0x84, 0xAE}, {0x84, 0xAB}, {0x84, 0xB9}, {0x84, 0xB4}, /* 0xB4-0xB7 */ + {0x84, 0xC1}, {0x84, 0xCD}, {0x84, 0xAA}, {0x84, 0x9A}, /* 0xB8-0xBB */ + {0x84, 0xB1}, {0x84, 0xD0}, {0x84, 0x9D}, {0x84, 0xA7}, /* 0xBC-0xBF */ + {0x84, 0xBB}, {0x84, 0xA2}, {0x84, 0x94}, {0x84, 0xC7}, /* 0xC0-0xC3 */ + {0x84, 0xCC}, {0x84, 0x9B}, {0x84, 0xA9}, {0x84, 0xAF}, /* 0xC4-0xC7 */ + {0x84, 0xA8}, {0x84, 0xD6}, {0x84, 0x98}, {0x84, 0xB6}, /* 0xC8-0xCB */ + {0x84, 0xCF}, {0x84, 0xA0}, {0x84, 0xD7}, {0x84, 0xD4}, /* 0xCC-0xCF */ + {0x84, 0xD2}, {0x84, 0xDB}, {0x84, 0xB0}, {0x84, 0x91}, /* 0xD0-0xD3 */ + {0x86, 0x61}, {0x87, 0x33}, {0x87, 0x23}, {0x87, 0x28}, /* 0xD4-0xD7 */ + {0x87, 0x6B}, {0x87, 0x40}, {0x87, 0x2E}, {0x87, 0x1E}, /* 0xD8-0xDB */ + {0x87, 0x21}, {0x87, 0x19}, {0x87, 0x1B}, {0x87, 0x43}, /* 0xDC-0xDF */ + {0x87, 0x2C}, {0x87, 0x41}, {0x87, 0x3E}, {0x87, 0x46}, /* 0xE0-0xE3 */ + {0x87, 0x20}, {0x87, 0x32}, {0x87, 0x2A}, {0x87, 0x2D}, /* 0xE4-0xE7 */ + {0x87, 0x3C}, {0x87, 0x12}, {0x87, 0x3A}, {0x87, 0x31}, /* 0xE8-0xEB */ + {0x87, 0x35}, {0x87, 0x42}, {0x87, 0x26}, {0x87, 0x27}, /* 0xEC-0xEF */ + {0x87, 0x38}, {0x87, 0x24}, {0x87, 0x1A}, {0x87, 0x30}, /* 0xF0-0xF3 */ + {0x87, 0x11}, {0x88, 0xF7}, {0x88, 0xE7}, {0x88, 0xF1}, /* 0xF4-0xF7 */ + {0x88, 0xF2}, {0x88, 0xFA}, {0x88, 0xFE}, {0x88, 0xEE}, /* 0xF8-0xFB */ + {0x88, 0xFC}, {0x88, 0xF6}, {0x88, 0xFB}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x88, 0xF0}, {0x88, 0xEC}, {0x88, 0xEB}, {0x89, 0x9D}, /* 0x40-0x43 */ + {0x89, 0xA1}, {0x89, 0x9F}, {0x89, 0x9E}, {0x89, 0xE9}, /* 0x44-0x47 */ + {0x89, 0xEB}, {0x89, 0xE8}, {0x8A, 0xAB}, {0x8A, 0x99}, /* 0x48-0x4B */ + {0x8A, 0x8B}, {0x8A, 0x92}, {0x8A, 0x8F}, {0x8A, 0x96}, /* 0x4C-0x4F */ + {0x8C, 0x3D}, {0x8C, 0x68}, {0x8C, 0x69}, {0x8C, 0xD5}, /* 0x50-0x53 */ + {0x8C, 0xCF}, {0x8C, 0xD7}, {0x8D, 0x96}, {0x8E, 0x09}, /* 0x54-0x57 */ + {0x8E, 0x02}, {0x8D, 0xFF}, {0x8E, 0x0D}, {0x8D, 0xFD}, /* 0x58-0x5B */ + {0x8E, 0x0A}, {0x8E, 0x03}, {0x8E, 0x07}, {0x8E, 0x06}, /* 0x5C-0x5F */ + {0x8E, 0x05}, {0x8D, 0xFE}, {0x8E, 0x00}, {0x8E, 0x04}, /* 0x60-0x63 */ + {0x8F, 0x10}, {0x8F, 0x11}, {0x8F, 0x0E}, {0x8F, 0x0D}, /* 0x64-0x67 */ + {0x91, 0x23}, {0x91, 0x1C}, {0x91, 0x20}, {0x91, 0x22}, /* 0x68-0x6B */ + {0x91, 0x1F}, {0x91, 0x1D}, {0x91, 0x1A}, {0x91, 0x24}, /* 0x6C-0x6F */ + {0x91, 0x21}, {0x91, 0x1B}, {0x91, 0x7A}, {0x91, 0x72}, /* 0x70-0x73 */ + {0x91, 0x79}, {0x91, 0x73}, {0x92, 0xA5}, {0x92, 0xA4}, /* 0x74-0x77 */ + {0x92, 0x76}, {0x92, 0x9B}, {0x92, 0x7A}, {0x92, 0xA0}, /* 0x78-0x7B */ + {0x92, 0x94}, {0x92, 0xAA}, {0x92, 0x8D}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x92, 0xA6}, {0x92, 0x9A}, {0x92, 0xAB}, /* 0xA0-0xA3 */ + {0x92, 0x79}, {0x92, 0x97}, {0x92, 0x7F}, {0x92, 0xA3}, /* 0xA4-0xA7 */ + {0x92, 0xEE}, {0x92, 0x8E}, {0x92, 0x82}, {0x92, 0x95}, /* 0xA8-0xAB */ + {0x92, 0xA2}, {0x92, 0x7D}, {0x92, 0x88}, {0x92, 0xA1}, /* 0xAC-0xAF */ + {0x92, 0x8A}, {0x92, 0x86}, {0x92, 0x8C}, {0x92, 0x99}, /* 0xB0-0xB3 */ + {0x92, 0xA7}, {0x92, 0x7E}, {0x92, 0x87}, {0x92, 0xA9}, /* 0xB4-0xB7 */ + {0x92, 0x9D}, {0x92, 0x8B}, {0x92, 0x2D}, {0x96, 0x9E}, /* 0xB8-0xBB */ + {0x96, 0xA1}, {0x96, 0xFF}, {0x97, 0x58}, {0x97, 0x7D}, /* 0xBC-0xBF */ + {0x97, 0x7A}, {0x97, 0x7E}, {0x97, 0x83}, {0x97, 0x80}, /* 0xC0-0xC3 */ + {0x97, 0x82}, {0x97, 0x7B}, {0x97, 0x84}, {0x97, 0x81}, /* 0xC4-0xC7 */ + {0x97, 0x7F}, {0x97, 0xCE}, {0x97, 0xCD}, {0x98, 0x16}, /* 0xC8-0xCB */ + {0x98, 0xAD}, {0x98, 0xAE}, {0x99, 0x02}, {0x99, 0x00}, /* 0xCC-0xCF */ + {0x99, 0x07}, {0x99, 0x9D}, {0x99, 0x9C}, {0x99, 0xC3}, /* 0xD0-0xD3 */ + {0x99, 0xB9}, {0x99, 0xBB}, {0x99, 0xBA}, {0x99, 0xC2}, /* 0xD4-0xD7 */ + {0x99, 0xBD}, {0x99, 0xC7}, {0x9A, 0xB1}, {0x9A, 0xE3}, /* 0xD8-0xDB */ + {0x9A, 0xE7}, {0x9B, 0x3E}, {0x9B, 0x3F}, {0x9B, 0x60}, /* 0xDC-0xDF */ + {0x9B, 0x61}, {0x9B, 0x5F}, {0x9C, 0xF1}, {0x9C, 0xF2}, /* 0xE0-0xE3 */ + {0x9C, 0xF5}, {0x9E, 0xA7}, {0x50, 0xFF}, {0x51, 0x03}, /* 0xE4-0xE7 */ + {0x51, 0x30}, {0x50, 0xF8}, {0x51, 0x06}, {0x51, 0x07}, /* 0xE8-0xEB */ + {0x50, 0xF6}, {0x50, 0xFE}, {0x51, 0x0B}, {0x51, 0x0C}, /* 0xEC-0xEF */ + {0x50, 0xFD}, {0x51, 0x0A}, {0x52, 0x8B}, {0x52, 0x8C}, /* 0xF0-0xF3 */ + {0x52, 0xF1}, {0x52, 0xEF}, {0x56, 0x48}, {0x56, 0x42}, /* 0xF4-0xF7 */ + {0x56, 0x4C}, {0x56, 0x35}, {0x56, 0x41}, {0x56, 0x4A}, /* 0xF8-0xFB */ + {0x56, 0x49}, {0x56, 0x46}, {0x56, 0x58}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x56, 0x5A}, {0x56, 0x40}, {0x56, 0x33}, {0x56, 0x3D}, /* 0x40-0x43 */ + {0x56, 0x2C}, {0x56, 0x3E}, {0x56, 0x38}, {0x56, 0x2A}, /* 0x44-0x47 */ + {0x56, 0x3A}, {0x57, 0x1A}, {0x58, 0xAB}, {0x58, 0x9D}, /* 0x48-0x4B */ + {0x58, 0xB1}, {0x58, 0xA0}, {0x58, 0xA3}, {0x58, 0xAF}, /* 0x4C-0x4F */ + {0x58, 0xAC}, {0x58, 0xA5}, {0x58, 0xA1}, {0x58, 0xFF}, /* 0x50-0x53 */ + {0x5A, 0xFF}, {0x5A, 0xF4}, {0x5A, 0xFD}, {0x5A, 0xF7}, /* 0x54-0x57 */ + {0x5A, 0xF6}, {0x5B, 0x03}, {0x5A, 0xF8}, {0x5B, 0x02}, /* 0x58-0x5B */ + {0x5A, 0xF9}, {0x5B, 0x01}, {0x5B, 0x07}, {0x5B, 0x05}, /* 0x5C-0x5F */ + {0x5B, 0x0F}, {0x5C, 0x67}, {0x5D, 0x99}, {0x5D, 0x97}, /* 0x60-0x63 */ + {0x5D, 0x9F}, {0x5D, 0x92}, {0x5D, 0xA2}, {0x5D, 0x93}, /* 0x64-0x67 */ + {0x5D, 0x95}, {0x5D, 0xA0}, {0x5D, 0x9C}, {0x5D, 0xA1}, /* 0x68-0x6B */ + {0x5D, 0x9A}, {0x5D, 0x9E}, {0x5E, 0x69}, {0x5E, 0x5D}, /* 0x6C-0x6F */ + {0x5E, 0x60}, {0x5E, 0x5C}, {0x7D, 0xF3}, {0x5E, 0xDB}, /* 0x70-0x73 */ + {0x5E, 0xDE}, {0x5E, 0xE1}, {0x5F, 0x49}, {0x5F, 0xB2}, /* 0x74-0x77 */ + {0x61, 0x8B}, {0x61, 0x83}, {0x61, 0x79}, {0x61, 0xB1}, /* 0x78-0x7B */ + {0x61, 0xB0}, {0x61, 0xA2}, {0x61, 0x89}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x61, 0x9B}, {0x61, 0x93}, {0x61, 0xAF}, /* 0xA0-0xA3 */ + {0x61, 0xAD}, {0x61, 0x9F}, {0x61, 0x92}, {0x61, 0xAA}, /* 0xA4-0xA7 */ + {0x61, 0xA1}, {0x61, 0x8D}, {0x61, 0x66}, {0x61, 0xB3}, /* 0xA8-0xAB */ + {0x62, 0x2D}, {0x64, 0x6E}, {0x64, 0x70}, {0x64, 0x96}, /* 0xAC-0xAF */ + {0x64, 0xA0}, {0x64, 0x85}, {0x64, 0x97}, {0x64, 0x9C}, /* 0xB0-0xB3 */ + {0x64, 0x8F}, {0x64, 0x8B}, {0x64, 0x8A}, {0x64, 0x8C}, /* 0xB4-0xB7 */ + {0x64, 0xA3}, {0x64, 0x9F}, {0x64, 0x68}, {0x64, 0xB1}, /* 0xB8-0xBB */ + {0x64, 0x98}, {0x65, 0x76}, {0x65, 0x7A}, {0x65, 0x79}, /* 0xBC-0xBF */ + {0x65, 0x7B}, {0x65, 0xB2}, {0x65, 0xB3}, {0x66, 0xB5}, /* 0xC0-0xC3 */ + {0x66, 0xB0}, {0x66, 0xA9}, {0x66, 0xB2}, {0x66, 0xB7}, /* 0xC4-0xC7 */ + {0x66, 0xAA}, {0x66, 0xAF}, {0x6A, 0x00}, {0x6A, 0x06}, /* 0xC8-0xCB */ + {0x6A, 0x17}, {0x69, 0xE5}, {0x69, 0xF8}, {0x6A, 0x15}, /* 0xCC-0xCF */ + {0x69, 0xF1}, {0x69, 0xE4}, {0x6A, 0x20}, {0x69, 0xFF}, /* 0xD0-0xD3 */ + {0x69, 0xEC}, {0x69, 0xE2}, {0x6A, 0x1B}, {0x6A, 0x1D}, /* 0xD4-0xD7 */ + {0x69, 0xFE}, {0x6A, 0x27}, {0x69, 0xF2}, {0x69, 0xEE}, /* 0xD8-0xDB */ + {0x6A, 0x14}, {0x69, 0xF7}, {0x69, 0xE7}, {0x6A, 0x40}, /* 0xDC-0xDF */ + {0x6A, 0x08}, {0x69, 0xE6}, {0x69, 0xFB}, {0x6A, 0x0D}, /* 0xE0-0xE3 */ + {0x69, 0xFC}, {0x69, 0xEB}, {0x6A, 0x09}, {0x6A, 0x04}, /* 0xE4-0xE7 */ + {0x6A, 0x18}, {0x6A, 0x25}, {0x6A, 0x0F}, {0x69, 0xF6}, /* 0xE8-0xEB */ + {0x6A, 0x26}, {0x6A, 0x07}, {0x69, 0xF4}, {0x6A, 0x16}, /* 0xEC-0xEF */ + {0x6B, 0x51}, {0x6B, 0xA5}, {0x6B, 0xA3}, {0x6B, 0xA2}, /* 0xF0-0xF3 */ + {0x6B, 0xA6}, {0x6C, 0x01}, {0x6C, 0x00}, {0x6B, 0xFF}, /* 0xF4-0xF7 */ + {0x6C, 0x02}, {0x6F, 0x41}, {0x6F, 0x26}, {0x6F, 0x7E}, /* 0xF8-0xFB */ + {0x6F, 0x87}, {0x6F, 0xC6}, {0x6F, 0x92}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6F, 0x8D}, {0x6F, 0x89}, {0x6F, 0x8C}, {0x6F, 0x62}, /* 0x40-0x43 */ + {0x6F, 0x4F}, {0x6F, 0x85}, {0x6F, 0x5A}, {0x6F, 0x96}, /* 0x44-0x47 */ + {0x6F, 0x76}, {0x6F, 0x6C}, {0x6F, 0x82}, {0x6F, 0x55}, /* 0x48-0x4B */ + {0x6F, 0x72}, {0x6F, 0x52}, {0x6F, 0x50}, {0x6F, 0x57}, /* 0x4C-0x4F */ + {0x6F, 0x94}, {0x6F, 0x93}, {0x6F, 0x5D}, {0x6F, 0x00}, /* 0x50-0x53 */ + {0x6F, 0x61}, {0x6F, 0x6B}, {0x6F, 0x7D}, {0x6F, 0x67}, /* 0x54-0x57 */ + {0x6F, 0x90}, {0x6F, 0x53}, {0x6F, 0x8B}, {0x6F, 0x69}, /* 0x58-0x5B */ + {0x6F, 0x7F}, {0x6F, 0x95}, {0x6F, 0x63}, {0x6F, 0x77}, /* 0x5C-0x5F */ + {0x6F, 0x6A}, {0x6F, 0x7B}, {0x71, 0xB2}, {0x71, 0xAF}, /* 0x60-0x63 */ + {0x71, 0x9B}, {0x71, 0xB0}, {0x71, 0xA0}, {0x71, 0x9A}, /* 0x64-0x67 */ + {0x71, 0xA9}, {0x71, 0xB5}, {0x71, 0x9D}, {0x71, 0xA5}, /* 0x68-0x6B */ + {0x71, 0x9E}, {0x71, 0xA4}, {0x71, 0xA1}, {0x71, 0xAA}, /* 0x6C-0x6F */ + {0x71, 0x9C}, {0x71, 0xA7}, {0x71, 0xB3}, {0x72, 0x98}, /* 0x70-0x73 */ + {0x72, 0x9A}, {0x73, 0x58}, {0x73, 0x52}, {0x73, 0x5E}, /* 0x74-0x77 */ + {0x73, 0x5F}, {0x73, 0x60}, {0x73, 0x5D}, {0x73, 0x5B}, /* 0x78-0x7B */ + {0x73, 0x61}, {0x73, 0x5A}, {0x73, 0x59}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x73, 0x62}, {0x74, 0x87}, {0x74, 0x89}, /* 0xA0-0xA3 */ + {0x74, 0x8A}, {0x74, 0x86}, {0x74, 0x81}, {0x74, 0x7D}, /* 0xA4-0xA7 */ + {0x74, 0x85}, {0x74, 0x88}, {0x74, 0x7C}, {0x74, 0x79}, /* 0xA8-0xAB */ + {0x75, 0x08}, {0x75, 0x07}, {0x75, 0x7E}, {0x76, 0x25}, /* 0xAC-0xAF */ + {0x76, 0x1E}, {0x76, 0x19}, {0x76, 0x1D}, {0x76, 0x1C}, /* 0xB0-0xB3 */ + {0x76, 0x23}, {0x76, 0x1A}, {0x76, 0x28}, {0x76, 0x1B}, /* 0xB4-0xB7 */ + {0x76, 0x9C}, {0x76, 0x9D}, {0x76, 0x9E}, {0x76, 0x9B}, /* 0xB8-0xBB */ + {0x77, 0x8D}, {0x77, 0x8F}, {0x77, 0x89}, {0x77, 0x88}, /* 0xBC-0xBF */ + {0x78, 0xCD}, {0x78, 0xBB}, {0x78, 0xCF}, {0x78, 0xCC}, /* 0xC0-0xC3 */ + {0x78, 0xD1}, {0x78, 0xCE}, {0x78, 0xD4}, {0x78, 0xC8}, /* 0xC4-0xC7 */ + {0x78, 0xC3}, {0x78, 0xC4}, {0x78, 0xC9}, {0x79, 0x9A}, /* 0xC8-0xCB */ + {0x79, 0xA1}, {0x79, 0xA0}, {0x79, 0x9C}, {0x79, 0xA2}, /* 0xCC-0xCF */ + {0x79, 0x9B}, {0x6B, 0x76}, {0x7A, 0x39}, {0x7A, 0xB2}, /* 0xD0-0xD3 */ + {0x7A, 0xB4}, {0x7A, 0xB3}, {0x7B, 0xB7}, {0x7B, 0xCB}, /* 0xD4-0xD7 */ + {0x7B, 0xBE}, {0x7B, 0xAC}, {0x7B, 0xCE}, {0x7B, 0xAF}, /* 0xD8-0xDB */ + {0x7B, 0xB9}, {0x7B, 0xCA}, {0x7B, 0xB5}, {0x7C, 0xC5}, /* 0xDC-0xDF */ + {0x7C, 0xC8}, {0x7C, 0xCC}, {0x7C, 0xCB}, {0x7D, 0xF7}, /* 0xE0-0xE3 */ + {0x7D, 0xDB}, {0x7D, 0xEA}, {0x7D, 0xE7}, {0x7D, 0xD7}, /* 0xE4-0xE7 */ + {0x7D, 0xE1}, {0x7E, 0x03}, {0x7D, 0xFA}, {0x7D, 0xE6}, /* 0xE8-0xEB */ + {0x7D, 0xF6}, {0x7D, 0xF1}, {0x7D, 0xF0}, {0x7D, 0xEE}, /* 0xEC-0xEF */ + {0x7D, 0xDF}, {0x7F, 0x76}, {0x7F, 0xAC}, {0x7F, 0xB0}, /* 0xF0-0xF3 */ + {0x7F, 0xAD}, {0x7F, 0xED}, {0x7F, 0xEB}, {0x7F, 0xEA}, /* 0xF4-0xF7 */ + {0x7F, 0xEC}, {0x7F, 0xE6}, {0x7F, 0xE8}, {0x80, 0x64}, /* 0xF8-0xFB */ + {0x80, 0x67}, {0x81, 0xA3}, {0x81, 0x9F}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x81, 0x9E}, {0x81, 0x95}, {0x81, 0xA2}, {0x81, 0x99}, /* 0x40-0x43 */ + {0x81, 0x97}, {0x82, 0x16}, {0x82, 0x4F}, {0x82, 0x53}, /* 0x44-0x47 */ + {0x82, 0x52}, {0x82, 0x50}, {0x82, 0x4E}, {0x82, 0x51}, /* 0x48-0x4B */ + {0x85, 0x24}, {0x85, 0x3B}, {0x85, 0x0F}, {0x85, 0x00}, /* 0x4C-0x4F */ + {0x85, 0x29}, {0x85, 0x0E}, {0x85, 0x09}, {0x85, 0x0D}, /* 0x50-0x53 */ + {0x85, 0x1F}, {0x85, 0x0A}, {0x85, 0x27}, {0x85, 0x1C}, /* 0x54-0x57 */ + {0x84, 0xFB}, {0x85, 0x2B}, {0x84, 0xFA}, {0x85, 0x08}, /* 0x58-0x5B */ + {0x85, 0x0C}, {0x84, 0xF4}, {0x85, 0x2A}, {0x84, 0xF2}, /* 0x5C-0x5F */ + {0x85, 0x15}, {0x84, 0xF7}, {0x84, 0xEB}, {0x84, 0xF3}, /* 0x60-0x63 */ + {0x84, 0xFC}, {0x85, 0x12}, {0x84, 0xEA}, {0x84, 0xE9}, /* 0x64-0x67 */ + {0x85, 0x16}, {0x84, 0xFE}, {0x85, 0x28}, {0x85, 0x1D}, /* 0x68-0x6B */ + {0x85, 0x2E}, {0x85, 0x02}, {0x84, 0xFD}, {0x85, 0x1E}, /* 0x6C-0x6F */ + {0x84, 0xF6}, {0x85, 0x31}, {0x85, 0x26}, {0x84, 0xE7}, /* 0x70-0x73 */ + {0x84, 0xE8}, {0x84, 0xF0}, {0x84, 0xEF}, {0x84, 0xF9}, /* 0x74-0x77 */ + {0x85, 0x18}, {0x85, 0x20}, {0x85, 0x30}, {0x85, 0x0B}, /* 0x78-0x7B */ + {0x85, 0x19}, {0x85, 0x2F}, {0x86, 0x62}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x87, 0x56}, {0x87, 0x63}, {0x87, 0x64}, /* 0xA0-0xA3 */ + {0x87, 0x77}, {0x87, 0xE1}, {0x87, 0x73}, {0x87, 0x58}, /* 0xA4-0xA7 */ + {0x87, 0x54}, {0x87, 0x5B}, {0x87, 0x52}, {0x87, 0x61}, /* 0xA8-0xAB */ + {0x87, 0x5A}, {0x87, 0x51}, {0x87, 0x5E}, {0x87, 0x6D}, /* 0xAC-0xAF */ + {0x87, 0x6A}, {0x87, 0x50}, {0x87, 0x4E}, {0x87, 0x5F}, /* 0xB0-0xB3 */ + {0x87, 0x5D}, {0x87, 0x6F}, {0x87, 0x6C}, {0x87, 0x7A}, /* 0xB4-0xB7 */ + {0x87, 0x6E}, {0x87, 0x5C}, {0x87, 0x65}, {0x87, 0x4F}, /* 0xB8-0xBB */ + {0x87, 0x7B}, {0x87, 0x75}, {0x87, 0x62}, {0x87, 0x67}, /* 0xBC-0xBF */ + {0x87, 0x69}, {0x88, 0x5A}, {0x89, 0x05}, {0x89, 0x0C}, /* 0xC0-0xC3 */ + {0x89, 0x14}, {0x89, 0x0B}, {0x89, 0x17}, {0x89, 0x18}, /* 0xC4-0xC7 */ + {0x89, 0x19}, {0x89, 0x06}, {0x89, 0x16}, {0x89, 0x11}, /* 0xC8-0xCB */ + {0x89, 0x0E}, {0x89, 0x09}, {0x89, 0xA2}, {0x89, 0xA4}, /* 0xCC-0xCF */ + {0x89, 0xA3}, {0x89, 0xED}, {0x89, 0xF0}, {0x89, 0xEC}, /* 0xD0-0xD3 */ + {0x8A, 0xCF}, {0x8A, 0xC6}, {0x8A, 0xB8}, {0x8A, 0xD3}, /* 0xD4-0xD7 */ + {0x8A, 0xD1}, {0x8A, 0xD4}, {0x8A, 0xD5}, {0x8A, 0xBB}, /* 0xD8-0xDB */ + {0x8A, 0xD7}, {0x8A, 0xBE}, {0x8A, 0xC0}, {0x8A, 0xC5}, /* 0xDC-0xDF */ + {0x8A, 0xD8}, {0x8A, 0xC3}, {0x8A, 0xBA}, {0x8A, 0xBD}, /* 0xE0-0xE3 */ + {0x8A, 0xD9}, {0x8C, 0x3E}, {0x8C, 0x4D}, {0x8C, 0x8F}, /* 0xE4-0xE7 */ + {0x8C, 0xE5}, {0x8C, 0xDF}, {0x8C, 0xD9}, {0x8C, 0xE8}, /* 0xE8-0xEB */ + {0x8C, 0xDA}, {0x8C, 0xDD}, {0x8C, 0xE7}, {0x8D, 0xA0}, /* 0xEC-0xEF */ + {0x8D, 0x9C}, {0x8D, 0xA1}, {0x8D, 0x9B}, {0x8E, 0x20}, /* 0xF0-0xF3 */ + {0x8E, 0x23}, {0x8E, 0x25}, {0x8E, 0x24}, {0x8E, 0x2E}, /* 0xF4-0xF7 */ + {0x8E, 0x15}, {0x8E, 0x1B}, {0x8E, 0x16}, {0x8E, 0x11}, /* 0xF8-0xFB */ + {0x8E, 0x19}, {0x8E, 0x26}, {0x8E, 0x27}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8E, 0x14}, {0x8E, 0x12}, {0x8E, 0x18}, {0x8E, 0x13}, /* 0x40-0x43 */ + {0x8E, 0x1C}, {0x8E, 0x17}, {0x8E, 0x1A}, {0x8F, 0x2C}, /* 0x44-0x47 */ + {0x8F, 0x24}, {0x8F, 0x18}, {0x8F, 0x1A}, {0x8F, 0x20}, /* 0x48-0x4B */ + {0x8F, 0x23}, {0x8F, 0x16}, {0x8F, 0x17}, {0x90, 0x73}, /* 0x4C-0x4F */ + {0x90, 0x70}, {0x90, 0x6F}, {0x90, 0x67}, {0x90, 0x6B}, /* 0x50-0x53 */ + {0x91, 0x2F}, {0x91, 0x2B}, {0x91, 0x29}, {0x91, 0x2A}, /* 0x54-0x57 */ + {0x91, 0x32}, {0x91, 0x26}, {0x91, 0x2E}, {0x91, 0x85}, /* 0x58-0x5B */ + {0x91, 0x86}, {0x91, 0x8A}, {0x91, 0x81}, {0x91, 0x82}, /* 0x5C-0x5F */ + {0x91, 0x84}, {0x91, 0x80}, {0x92, 0xD0}, {0x92, 0xC3}, /* 0x60-0x63 */ + {0x92, 0xC4}, {0x92, 0xC0}, {0x92, 0xD9}, {0x92, 0xB6}, /* 0x64-0x67 */ + {0x92, 0xCF}, {0x92, 0xF1}, {0x92, 0xDF}, {0x92, 0xD8}, /* 0x68-0x6B */ + {0x92, 0xE9}, {0x92, 0xD7}, {0x92, 0xDD}, {0x92, 0xCC}, /* 0x6C-0x6F */ + {0x92, 0xEF}, {0x92, 0xC2}, {0x92, 0xE8}, {0x92, 0xCA}, /* 0x70-0x73 */ + {0x92, 0xC8}, {0x92, 0xCE}, {0x92, 0xE6}, {0x92, 0xCD}, /* 0x74-0x77 */ + {0x92, 0xD5}, {0x92, 0xC9}, {0x92, 0xE0}, {0x92, 0xDE}, /* 0x78-0x7B */ + {0x92, 0xE7}, {0x92, 0xD1}, {0x92, 0xD3}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x92, 0xB5}, {0x92, 0xE1}, {0x92, 0xC6}, /* 0xA0-0xA3 */ + {0x92, 0xB4}, {0x95, 0x7C}, {0x95, 0xAC}, {0x95, 0xAB}, /* 0xA4-0xA7 */ + {0x95, 0xAE}, {0x95, 0xB0}, {0x96, 0xA4}, {0x96, 0xA2}, /* 0xA8-0xAB */ + {0x96, 0xD3}, {0x97, 0x05}, {0x97, 0x08}, {0x97, 0x02}, /* 0xAC-0xAF */ + {0x97, 0x5A}, {0x97, 0x8A}, {0x97, 0x8E}, {0x97, 0x88}, /* 0xB0-0xB3 */ + {0x97, 0xD0}, {0x97, 0xCF}, {0x98, 0x1E}, {0x98, 0x1D}, /* 0xB4-0xB7 */ + {0x98, 0x26}, {0x98, 0x29}, {0x98, 0x28}, {0x98, 0x20}, /* 0xB8-0xBB */ + {0x98, 0x1B}, {0x98, 0x27}, {0x98, 0xB2}, {0x99, 0x08}, /* 0xBC-0xBF */ + {0x98, 0xFA}, {0x99, 0x11}, {0x99, 0x14}, {0x99, 0x16}, /* 0xC0-0xC3 */ + {0x99, 0x17}, {0x99, 0x15}, {0x99, 0xDC}, {0x99, 0xCD}, /* 0xC4-0xC7 */ + {0x99, 0xCF}, {0x99, 0xD3}, {0x99, 0xD4}, {0x99, 0xCE}, /* 0xC8-0xCB */ + {0x99, 0xC9}, {0x99, 0xD6}, {0x99, 0xD8}, {0x99, 0xCB}, /* 0xCC-0xCF */ + {0x99, 0xD7}, {0x99, 0xCC}, {0x9A, 0xB3}, {0x9A, 0xEC}, /* 0xD0-0xD3 */ + {0x9A, 0xEB}, {0x9A, 0xF3}, {0x9A, 0xF2}, {0x9A, 0xF1}, /* 0xD4-0xD7 */ + {0x9B, 0x46}, {0x9B, 0x43}, {0x9B, 0x67}, {0x9B, 0x74}, /* 0xD8-0xDB */ + {0x9B, 0x71}, {0x9B, 0x66}, {0x9B, 0x76}, {0x9B, 0x75}, /* 0xDC-0xDF */ + {0x9B, 0x70}, {0x9B, 0x68}, {0x9B, 0x64}, {0x9B, 0x6C}, /* 0xE0-0xE3 */ + {0x9C, 0xFC}, {0x9C, 0xFA}, {0x9C, 0xFD}, {0x9C, 0xFF}, /* 0xE4-0xE7 */ + {0x9C, 0xF7}, {0x9D, 0x07}, {0x9D, 0x00}, {0x9C, 0xF9}, /* 0xE8-0xEB */ + {0x9C, 0xFB}, {0x9D, 0x08}, {0x9D, 0x05}, {0x9D, 0x04}, /* 0xEC-0xEF */ + {0x9E, 0x83}, {0x9E, 0xD3}, {0x9F, 0x0F}, {0x9F, 0x10}, /* 0xF0-0xF3 */ + {0x51, 0x1C}, {0x51, 0x13}, {0x51, 0x17}, {0x51, 0x1A}, /* 0xF4-0xF7 */ + {0x51, 0x11}, {0x51, 0xDE}, {0x53, 0x34}, {0x53, 0xE1}, /* 0xF8-0xFB */ + {0x56, 0x70}, {0x56, 0x60}, {0x56, 0x6E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_E9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x56, 0x73}, {0x56, 0x66}, {0x56, 0x63}, {0x56, 0x6D}, /* 0x40-0x43 */ + {0x56, 0x72}, {0x56, 0x5E}, {0x56, 0x77}, {0x57, 0x1C}, /* 0x44-0x47 */ + {0x57, 0x1B}, {0x58, 0xC8}, {0x58, 0xBD}, {0x58, 0xC9}, /* 0x48-0x4B */ + {0x58, 0xBF}, {0x58, 0xBA}, {0x58, 0xC2}, {0x58, 0xBC}, /* 0x4C-0x4F */ + {0x58, 0xC6}, {0x5B, 0x17}, {0x5B, 0x19}, {0x5B, 0x1B}, /* 0x50-0x53 */ + {0x5B, 0x21}, {0x5B, 0x14}, {0x5B, 0x13}, {0x5B, 0x10}, /* 0x54-0x57 */ + {0x5B, 0x16}, {0x5B, 0x28}, {0x5B, 0x1A}, {0x5B, 0x20}, /* 0x58-0x5B */ + {0x5B, 0x1E}, {0x5B, 0xEF}, {0x5D, 0xAC}, {0x5D, 0xB1}, /* 0x5C-0x5F */ + {0x5D, 0xA9}, {0x5D, 0xA7}, {0x5D, 0xB5}, {0x5D, 0xB0}, /* 0x60-0x63 */ + {0x5D, 0xAE}, {0x5D, 0xAA}, {0x5D, 0xA8}, {0x5D, 0xB2}, /* 0x64-0x67 */ + {0x5D, 0xAD}, {0x5D, 0xAF}, {0x5D, 0xB4}, {0x5E, 0x67}, /* 0x68-0x6B */ + {0x5E, 0x68}, {0x5E, 0x66}, {0x5E, 0x6F}, {0x5E, 0xE9}, /* 0x6C-0x6F */ + {0x5E, 0xE7}, {0x5E, 0xE6}, {0x5E, 0xE8}, {0x5E, 0xE5}, /* 0x70-0x73 */ + {0x5F, 0x4B}, {0x5F, 0xBC}, {0x61, 0x9D}, {0x61, 0xA8}, /* 0x74-0x77 */ + {0x61, 0x96}, {0x61, 0xC5}, {0x61, 0xB4}, {0x61, 0xC6}, /* 0x78-0x7B */ + {0x61, 0xC1}, {0x61, 0xCC}, {0x61, 0xBA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x61, 0xBF}, {0x61, 0xB8}, {0x61, 0x8C}, /* 0xA0-0xA3 */ + {0x64, 0xD7}, {0x64, 0xD6}, {0x64, 0xD0}, {0x64, 0xCF}, /* 0xA4-0xA7 */ + {0x64, 0xC9}, {0x64, 0xBD}, {0x64, 0x89}, {0x64, 0xC3}, /* 0xA8-0xAB */ + {0x64, 0xDB}, {0x64, 0xF3}, {0x64, 0xD9}, {0x65, 0x33}, /* 0xAC-0xAF */ + {0x65, 0x7F}, {0x65, 0x7C}, {0x65, 0xA2}, {0x66, 0xC8}, /* 0xB0-0xB3 */ + {0x66, 0xBE}, {0x66, 0xC0}, {0x66, 0xCA}, {0x66, 0xCB}, /* 0xB4-0xB7 */ + {0x66, 0xCF}, {0x66, 0xBD}, {0x66, 0xBB}, {0x66, 0xBA}, /* 0xB8-0xBB */ + {0x66, 0xCC}, {0x67, 0x23}, {0x6A, 0x34}, {0x6A, 0x66}, /* 0xBC-0xBF */ + {0x6A, 0x49}, {0x6A, 0x67}, {0x6A, 0x32}, {0x6A, 0x68}, /* 0xC0-0xC3 */ + {0x6A, 0x3E}, {0x6A, 0x5D}, {0x6A, 0x6D}, {0x6A, 0x76}, /* 0xC4-0xC7 */ + {0x6A, 0x5B}, {0x6A, 0x51}, {0x6A, 0x28}, {0x6A, 0x5A}, /* 0xC8-0xCB */ + {0x6A, 0x3B}, {0x6A, 0x3F}, {0x6A, 0x41}, {0x6A, 0x6A}, /* 0xCC-0xCF */ + {0x6A, 0x64}, {0x6A, 0x50}, {0x6A, 0x4F}, {0x6A, 0x54}, /* 0xD0-0xD3 */ + {0x6A, 0x6F}, {0x6A, 0x69}, {0x6A, 0x60}, {0x6A, 0x3C}, /* 0xD4-0xD7 */ + {0x6A, 0x5E}, {0x6A, 0x56}, {0x6A, 0x55}, {0x6A, 0x4D}, /* 0xD8-0xDB */ + {0x6A, 0x4E}, {0x6A, 0x46}, {0x6B, 0x55}, {0x6B, 0x54}, /* 0xDC-0xDF */ + {0x6B, 0x56}, {0x6B, 0xA7}, {0x6B, 0xAA}, {0x6B, 0xAB}, /* 0xE0-0xE3 */ + {0x6B, 0xC8}, {0x6B, 0xC7}, {0x6C, 0x04}, {0x6C, 0x03}, /* 0xE4-0xE7 */ + {0x6C, 0x06}, {0x6F, 0xAD}, {0x6F, 0xCB}, {0x6F, 0xA3}, /* 0xE8-0xEB */ + {0x6F, 0xC7}, {0x6F, 0xBC}, {0x6F, 0xCE}, {0x6F, 0xC8}, /* 0xEC-0xEF */ + {0x6F, 0x5E}, {0x6F, 0xC4}, {0x6F, 0xBD}, {0x6F, 0x9E}, /* 0xF0-0xF3 */ + {0x6F, 0xCA}, {0x6F, 0xA8}, {0x70, 0x04}, {0x6F, 0xA5}, /* 0xF4-0xF7 */ + {0x6F, 0xAE}, {0x6F, 0xBA}, {0x6F, 0xAC}, {0x6F, 0xAA}, /* 0xF8-0xFB */ + {0x6F, 0xCF}, {0x6F, 0xBF}, {0x6F, 0xB8}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EA[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6F, 0xA2}, {0x6F, 0xC9}, {0x6F, 0xAB}, {0x6F, 0xCD}, /* 0x40-0x43 */ + {0x6F, 0xAF}, {0x6F, 0xB2}, {0x6F, 0xB0}, {0x71, 0xC5}, /* 0x44-0x47 */ + {0x71, 0xC2}, {0x71, 0xBF}, {0x71, 0xB8}, {0x71, 0xD6}, /* 0x48-0x4B */ + {0x71, 0xC0}, {0x71, 0xC1}, {0x71, 0xCB}, {0x71, 0xD4}, /* 0x4C-0x4F */ + {0x71, 0xCA}, {0x71, 0xC7}, {0x71, 0xCF}, {0x71, 0xBD}, /* 0x50-0x53 */ + {0x71, 0xD8}, {0x71, 0xBC}, {0x71, 0xC6}, {0x71, 0xDA}, /* 0x54-0x57 */ + {0x71, 0xDB}, {0x72, 0x9D}, {0x72, 0x9E}, {0x73, 0x69}, /* 0x58-0x5B */ + {0x73, 0x66}, {0x73, 0x67}, {0x73, 0x6C}, {0x73, 0x65}, /* 0x5C-0x5F */ + {0x73, 0x6B}, {0x73, 0x6A}, {0x74, 0x7F}, {0x74, 0x9A}, /* 0x60-0x63 */ + {0x74, 0xA0}, {0x74, 0x94}, {0x74, 0x92}, {0x74, 0x95}, /* 0x64-0x67 */ + {0x74, 0xA1}, {0x75, 0x0B}, {0x75, 0x80}, {0x76, 0x2F}, /* 0x68-0x6B */ + {0x76, 0x2D}, {0x76, 0x31}, {0x76, 0x3D}, {0x76, 0x33}, /* 0x6C-0x6F */ + {0x76, 0x3C}, {0x76, 0x35}, {0x76, 0x32}, {0x76, 0x30}, /* 0x70-0x73 */ + {0x76, 0xBB}, {0x76, 0xE6}, {0x77, 0x9A}, {0x77, 0x9D}, /* 0x74-0x77 */ + {0x77, 0xA1}, {0x77, 0x9C}, {0x77, 0x9B}, {0x77, 0xA2}, /* 0x78-0x7B */ + {0x77, 0xA3}, {0x77, 0x95}, {0x77, 0x99}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x77, 0x97}, {0x78, 0xDD}, {0x78, 0xE9}, /* 0xA0-0xA3 */ + {0x78, 0xE5}, {0x78, 0xEA}, {0x78, 0xDE}, {0x78, 0xE3}, /* 0xA4-0xA7 */ + {0x78, 0xDB}, {0x78, 0xE1}, {0x78, 0xE2}, {0x78, 0xED}, /* 0xA8-0xAB */ + {0x78, 0xDF}, {0x78, 0xE0}, {0x79, 0xA4}, {0x7A, 0x44}, /* 0xAC-0xAF */ + {0x7A, 0x48}, {0x7A, 0x47}, {0x7A, 0xB6}, {0x7A, 0xB8}, /* 0xB0-0xB3 */ + {0x7A, 0xB5}, {0x7A, 0xB1}, {0x7A, 0xB7}, {0x7B, 0xDE}, /* 0xB4-0xB7 */ + {0x7B, 0xE3}, {0x7B, 0xE7}, {0x7B, 0xDD}, {0x7B, 0xD5}, /* 0xB8-0xBB */ + {0x7B, 0xE5}, {0x7B, 0xDA}, {0x7B, 0xE8}, {0x7B, 0xF9}, /* 0xBC-0xBF */ + {0x7B, 0xD4}, {0x7B, 0xEA}, {0x7B, 0xE2}, {0x7B, 0xDC}, /* 0xC0-0xC3 */ + {0x7B, 0xEB}, {0x7B, 0xD8}, {0x7B, 0xDF}, {0x7C, 0xD2}, /* 0xC4-0xC7 */ + {0x7C, 0xD4}, {0x7C, 0xD7}, {0x7C, 0xD0}, {0x7C, 0xD1}, /* 0xC8-0xCB */ + {0x7E, 0x12}, {0x7E, 0x21}, {0x7E, 0x17}, {0x7E, 0x0C}, /* 0xCC-0xCF */ + {0x7E, 0x1F}, {0x7E, 0x20}, {0x7E, 0x13}, {0x7E, 0x0E}, /* 0xD0-0xD3 */ + {0x7E, 0x1C}, {0x7E, 0x15}, {0x7E, 0x1A}, {0x7E, 0x22}, /* 0xD4-0xD7 */ + {0x7E, 0x0B}, {0x7E, 0x0F}, {0x7E, 0x16}, {0x7E, 0x0D}, /* 0xD8-0xDB */ + {0x7E, 0x14}, {0x7E, 0x25}, {0x7E, 0x24}, {0x7F, 0x43}, /* 0xDC-0xDF */ + {0x7F, 0x7B}, {0x7F, 0x7C}, {0x7F, 0x7A}, {0x7F, 0xB1}, /* 0xE0-0xE3 */ + {0x7F, 0xEF}, {0x80, 0x2A}, {0x80, 0x29}, {0x80, 0x6C}, /* 0xE4-0xE7 */ + {0x81, 0xB1}, {0x81, 0xA6}, {0x81, 0xAE}, {0x81, 0xB9}, /* 0xE8-0xEB */ + {0x81, 0xB5}, {0x81, 0xAB}, {0x81, 0xB0}, {0x81, 0xAC}, /* 0xEC-0xEF */ + {0x81, 0xB4}, {0x81, 0xB2}, {0x81, 0xB7}, {0x81, 0xA7}, /* 0xF0-0xF3 */ + {0x81, 0xF2}, {0x82, 0x55}, {0x82, 0x56}, {0x82, 0x57}, /* 0xF4-0xF7 */ + {0x85, 0x56}, {0x85, 0x45}, {0x85, 0x6B}, {0x85, 0x4D}, /* 0xF8-0xFB */ + {0x85, 0x53}, {0x85, 0x61}, {0x85, 0x58}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EB[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x85, 0x40}, {0x85, 0x46}, {0x85, 0x64}, {0x85, 0x41}, /* 0x40-0x43 */ + {0x85, 0x62}, {0x85, 0x44}, {0x85, 0x51}, {0x85, 0x47}, /* 0x44-0x47 */ + {0x85, 0x63}, {0x85, 0x3E}, {0x85, 0x5B}, {0x85, 0x71}, /* 0x48-0x4B */ + {0x85, 0x4E}, {0x85, 0x6E}, {0x85, 0x75}, {0x85, 0x55}, /* 0x4C-0x4F */ + {0x85, 0x67}, {0x85, 0x60}, {0x85, 0x8C}, {0x85, 0x66}, /* 0x50-0x53 */ + {0x85, 0x5D}, {0x85, 0x54}, {0x85, 0x65}, {0x85, 0x6C}, /* 0x54-0x57 */ + {0x86, 0x63}, {0x86, 0x65}, {0x86, 0x64}, {0x87, 0x9B}, /* 0x58-0x5B */ + {0x87, 0x8F}, {0x87, 0x97}, {0x87, 0x93}, {0x87, 0x92}, /* 0x5C-0x5F */ + {0x87, 0x88}, {0x87, 0x81}, {0x87, 0x96}, {0x87, 0x98}, /* 0x60-0x63 */ + {0x87, 0x79}, {0x87, 0x87}, {0x87, 0xA3}, {0x87, 0x85}, /* 0x64-0x67 */ + {0x87, 0x90}, {0x87, 0x91}, {0x87, 0x9D}, {0x87, 0x84}, /* 0x68-0x6B */ + {0x87, 0x94}, {0x87, 0x9C}, {0x87, 0x9A}, {0x87, 0x89}, /* 0x6C-0x6F */ + {0x89, 0x1E}, {0x89, 0x26}, {0x89, 0x30}, {0x89, 0x2D}, /* 0x70-0x73 */ + {0x89, 0x2E}, {0x89, 0x27}, {0x89, 0x31}, {0x89, 0x22}, /* 0x74-0x77 */ + {0x89, 0x29}, {0x89, 0x23}, {0x89, 0x2F}, {0x89, 0x2C}, /* 0x78-0x7B */ + {0x89, 0x1F}, {0x89, 0xF1}, {0x8A, 0xE0}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x8A, 0xE2}, {0x8A, 0xF2}, {0x8A, 0xF4}, /* 0xA0-0xA3 */ + {0x8A, 0xF5}, {0x8A, 0xDD}, {0x8B, 0x14}, {0x8A, 0xE4}, /* 0xA4-0xA7 */ + {0x8A, 0xDF}, {0x8A, 0xF0}, {0x8A, 0xC8}, {0x8A, 0xDE}, /* 0xA8-0xAB */ + {0x8A, 0xE1}, {0x8A, 0xE8}, {0x8A, 0xFF}, {0x8A, 0xEF}, /* 0xAC-0xAF */ + {0x8A, 0xFB}, {0x8C, 0x91}, {0x8C, 0x92}, {0x8C, 0x90}, /* 0xB0-0xB3 */ + {0x8C, 0xF5}, {0x8C, 0xEE}, {0x8C, 0xF1}, {0x8C, 0xF0}, /* 0xB4-0xB7 */ + {0x8C, 0xF3}, {0x8D, 0x6C}, {0x8D, 0x6E}, {0x8D, 0xA5}, /* 0xB8-0xBB */ + {0x8D, 0xA7}, {0x8E, 0x33}, {0x8E, 0x3E}, {0x8E, 0x38}, /* 0xBC-0xBF */ + {0x8E, 0x40}, {0x8E, 0x45}, {0x8E, 0x36}, {0x8E, 0x3C}, /* 0xC0-0xC3 */ + {0x8E, 0x3D}, {0x8E, 0x41}, {0x8E, 0x30}, {0x8E, 0x3F}, /* 0xC4-0xC7 */ + {0x8E, 0xBD}, {0x8F, 0x36}, {0x8F, 0x2E}, {0x8F, 0x35}, /* 0xC8-0xCB */ + {0x8F, 0x32}, {0x8F, 0x39}, {0x8F, 0x37}, {0x8F, 0x34}, /* 0xCC-0xCF */ + {0x90, 0x76}, {0x90, 0x79}, {0x90, 0x7B}, {0x90, 0x86}, /* 0xD0-0xD3 */ + {0x90, 0xFA}, {0x91, 0x33}, {0x91, 0x35}, {0x91, 0x36}, /* 0xD4-0xD7 */ + {0x91, 0x93}, {0x91, 0x90}, {0x91, 0x91}, {0x91, 0x8D}, /* 0xD8-0xDB */ + {0x91, 0x8F}, {0x93, 0x27}, {0x93, 0x1E}, {0x93, 0x08}, /* 0xDC-0xDF */ + {0x93, 0x1F}, {0x93, 0x06}, {0x93, 0x0F}, {0x93, 0x7A}, /* 0xE0-0xE3 */ + {0x93, 0x38}, {0x93, 0x3C}, {0x93, 0x1B}, {0x93, 0x23}, /* 0xE4-0xE7 */ + {0x93, 0x12}, {0x93, 0x01}, {0x93, 0x46}, {0x93, 0x2D}, /* 0xE8-0xEB */ + {0x93, 0x0E}, {0x93, 0x0D}, {0x92, 0xCB}, {0x93, 0x1D}, /* 0xEC-0xEF */ + {0x92, 0xFA}, {0x93, 0x25}, {0x93, 0x13}, {0x92, 0xF9}, /* 0xF0-0xF3 */ + {0x92, 0xF7}, {0x93, 0x34}, {0x93, 0x02}, {0x93, 0x24}, /* 0xF4-0xF7 */ + {0x92, 0xFF}, {0x93, 0x29}, {0x93, 0x39}, {0x93, 0x35}, /* 0xF8-0xFB */ + {0x93, 0x2A}, {0x93, 0x14}, {0x93, 0x0C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EC[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x93, 0x0B}, {0x92, 0xFE}, {0x93, 0x09}, {0x93, 0x00}, /* 0x40-0x43 */ + {0x92, 0xFB}, {0x93, 0x16}, {0x95, 0xBC}, {0x95, 0xCD}, /* 0x44-0x47 */ + {0x95, 0xBE}, {0x95, 0xB9}, {0x95, 0xBA}, {0x95, 0xB6}, /* 0x48-0x4B */ + {0x95, 0xBF}, {0x95, 0xB5}, {0x95, 0xBD}, {0x96, 0xA9}, /* 0x4C-0x4F */ + {0x96, 0xD4}, {0x97, 0x0B}, {0x97, 0x12}, {0x97, 0x10}, /* 0x50-0x53 */ + {0x97, 0x99}, {0x97, 0x97}, {0x97, 0x94}, {0x97, 0xF0}, /* 0x54-0x57 */ + {0x97, 0xF8}, {0x98, 0x35}, {0x98, 0x2F}, {0x98, 0x32}, /* 0x58-0x5B */ + {0x99, 0x24}, {0x99, 0x1F}, {0x99, 0x27}, {0x99, 0x29}, /* 0x5C-0x5F */ + {0x99, 0x9E}, {0x99, 0xEE}, {0x99, 0xEC}, {0x99, 0xE5}, /* 0x60-0x63 */ + {0x99, 0xE4}, {0x99, 0xF0}, {0x99, 0xE3}, {0x99, 0xEA}, /* 0x64-0x67 */ + {0x99, 0xE9}, {0x99, 0xE7}, {0x9A, 0xB9}, {0x9A, 0xBF}, /* 0x68-0x6B */ + {0x9A, 0xB4}, {0x9A, 0xBB}, {0x9A, 0xF6}, {0x9A, 0xFA}, /* 0x6C-0x6F */ + {0x9A, 0xF9}, {0x9A, 0xF7}, {0x9B, 0x33}, {0x9B, 0x80}, /* 0x70-0x73 */ + {0x9B, 0x85}, {0x9B, 0x87}, {0x9B, 0x7C}, {0x9B, 0x7E}, /* 0x74-0x77 */ + {0x9B, 0x7B}, {0x9B, 0x82}, {0x9B, 0x93}, {0x9B, 0x92}, /* 0x78-0x7B */ + {0x9B, 0x90}, {0x9B, 0x7A}, {0x9B, 0x95}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9B, 0x7D}, {0x9B, 0x88}, {0x9D, 0x25}, /* 0xA0-0xA3 */ + {0x9D, 0x17}, {0x9D, 0x20}, {0x9D, 0x1E}, {0x9D, 0x14}, /* 0xA4-0xA7 */ + {0x9D, 0x29}, {0x9D, 0x1D}, {0x9D, 0x18}, {0x9D, 0x22}, /* 0xA8-0xAB */ + {0x9D, 0x10}, {0x9D, 0x19}, {0x9D, 0x1F}, {0x9E, 0x88}, /* 0xAC-0xAF */ + {0x9E, 0x86}, {0x9E, 0x87}, {0x9E, 0xAE}, {0x9E, 0xAD}, /* 0xB0-0xB3 */ + {0x9E, 0xD5}, {0x9E, 0xD6}, {0x9E, 0xFA}, {0x9F, 0x12}, /* 0xB4-0xB7 */ + {0x9F, 0x3D}, {0x51, 0x26}, {0x51, 0x25}, {0x51, 0x22}, /* 0xB8-0xBB */ + {0x51, 0x24}, {0x51, 0x20}, {0x51, 0x29}, {0x52, 0xF4}, /* 0xBC-0xBF */ + {0x56, 0x93}, {0x56, 0x8C}, {0x56, 0x8D}, {0x56, 0x86}, /* 0xC0-0xC3 */ + {0x56, 0x84}, {0x56, 0x83}, {0x56, 0x7E}, {0x56, 0x82}, /* 0xC4-0xC7 */ + {0x56, 0x7F}, {0x56, 0x81}, {0x58, 0xD6}, {0x58, 0xD4}, /* 0xC8-0xCB */ + {0x58, 0xCF}, {0x58, 0xD2}, {0x5B, 0x2D}, {0x5B, 0x25}, /* 0xCC-0xCF */ + {0x5B, 0x32}, {0x5B, 0x23}, {0x5B, 0x2C}, {0x5B, 0x27}, /* 0xD0-0xD3 */ + {0x5B, 0x26}, {0x5B, 0x2F}, {0x5B, 0x2E}, {0x5B, 0x7B}, /* 0xD4-0xD7 */ + {0x5B, 0xF1}, {0x5B, 0xF2}, {0x5D, 0xB7}, {0x5E, 0x6C}, /* 0xD8-0xDB */ + {0x5E, 0x6A}, {0x5F, 0xBE}, {0x5F, 0xBB}, {0x61, 0xC3}, /* 0xDC-0xDF */ + {0x61, 0xB5}, {0x61, 0xBC}, {0x61, 0xE7}, {0x61, 0xE0}, /* 0xE0-0xE3 */ + {0x61, 0xE5}, {0x61, 0xE4}, {0x61, 0xE8}, {0x61, 0xDE}, /* 0xE4-0xE7 */ + {0x64, 0xEF}, {0x64, 0xE9}, {0x64, 0xE3}, {0x64, 0xEB}, /* 0xE8-0xEB */ + {0x64, 0xE4}, {0x64, 0xE8}, {0x65, 0x81}, {0x65, 0x80}, /* 0xEC-0xEF */ + {0x65, 0xB6}, {0x65, 0xDA}, {0x66, 0xD2}, {0x6A, 0x8D}, /* 0xF0-0xF3 */ + {0x6A, 0x96}, {0x6A, 0x81}, {0x6A, 0xA5}, {0x6A, 0x89}, /* 0xF4-0xF7 */ + {0x6A, 0x9F}, {0x6A, 0x9B}, {0x6A, 0xA1}, {0x6A, 0x9E}, /* 0xF8-0xFB */ + {0x6A, 0x87}, {0x6A, 0x93}, {0x6A, 0x8E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_ED[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x6A, 0x95}, {0x6A, 0x83}, {0x6A, 0xA8}, {0x6A, 0xA4}, /* 0x40-0x43 */ + {0x6A, 0x91}, {0x6A, 0x7F}, {0x6A, 0xA6}, {0x6A, 0x9A}, /* 0x44-0x47 */ + {0x6A, 0x85}, {0x6A, 0x8C}, {0x6A, 0x92}, {0x6B, 0x5B}, /* 0x48-0x4B */ + {0x6B, 0xAD}, {0x6C, 0x09}, {0x6F, 0xCC}, {0x6F, 0xA9}, /* 0x4C-0x4F */ + {0x6F, 0xF4}, {0x6F, 0xD4}, {0x6F, 0xE3}, {0x6F, 0xDC}, /* 0x50-0x53 */ + {0x6F, 0xED}, {0x6F, 0xE7}, {0x6F, 0xE6}, {0x6F, 0xDE}, /* 0x54-0x57 */ + {0x6F, 0xF2}, {0x6F, 0xDD}, {0x6F, 0xE2}, {0x6F, 0xE8}, /* 0x58-0x5B */ + {0x71, 0xE1}, {0x71, 0xF1}, {0x71, 0xE8}, {0x71, 0xF2}, /* 0x5C-0x5F */ + {0x71, 0xE4}, {0x71, 0xF0}, {0x71, 0xE2}, {0x73, 0x73}, /* 0x60-0x63 */ + {0x73, 0x6E}, {0x73, 0x6F}, {0x74, 0x97}, {0x74, 0xB2}, /* 0x64-0x67 */ + {0x74, 0xAB}, {0x74, 0x90}, {0x74, 0xAA}, {0x74, 0xAD}, /* 0x68-0x6B */ + {0x74, 0xB1}, {0x74, 0xA5}, {0x74, 0xAF}, {0x75, 0x10}, /* 0x6C-0x6F */ + {0x75, 0x11}, {0x75, 0x12}, {0x75, 0x0F}, {0x75, 0x84}, /* 0x70-0x73 */ + {0x76, 0x43}, {0x76, 0x48}, {0x76, 0x49}, {0x76, 0x47}, /* 0x74-0x77 */ + {0x76, 0xA4}, {0x76, 0xE9}, {0x77, 0xB5}, {0x77, 0xAB}, /* 0x78-0x7B */ + {0x77, 0xB2}, {0x77, 0xB7}, {0x77, 0xB6}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x77, 0xB4}, {0x77, 0xB1}, {0x77, 0xA8}, /* 0xA0-0xA3 */ + {0x77, 0xF0}, {0x78, 0xF3}, {0x78, 0xFD}, {0x79, 0x02}, /* 0xA4-0xA7 */ + {0x78, 0xFB}, {0x78, 0xFC}, {0x78, 0xF2}, {0x79, 0x05}, /* 0xA8-0xAB */ + {0x78, 0xF9}, {0x78, 0xFE}, {0x79, 0x04}, {0x79, 0xAB}, /* 0xAC-0xAF */ + {0x79, 0xA8}, {0x7A, 0x5C}, {0x7A, 0x5B}, {0x7A, 0x56}, /* 0xB0-0xB3 */ + {0x7A, 0x58}, {0x7A, 0x54}, {0x7A, 0x5A}, {0x7A, 0xBE}, /* 0xB4-0xB7 */ + {0x7A, 0xC0}, {0x7A, 0xC1}, {0x7C, 0x05}, {0x7C, 0x0F}, /* 0xB8-0xBB */ + {0x7B, 0xF2}, {0x7C, 0x00}, {0x7B, 0xFF}, {0x7B, 0xFB}, /* 0xBC-0xBF */ + {0x7C, 0x0E}, {0x7B, 0xF4}, {0x7C, 0x0B}, {0x7B, 0xF3}, /* 0xC0-0xC3 */ + {0x7C, 0x02}, {0x7C, 0x09}, {0x7C, 0x03}, {0x7C, 0x01}, /* 0xC4-0xC7 */ + {0x7B, 0xF8}, {0x7B, 0xFD}, {0x7C, 0x06}, {0x7B, 0xF0}, /* 0xC8-0xCB */ + {0x7B, 0xF1}, {0x7C, 0x10}, {0x7C, 0x0A}, {0x7C, 0xE8}, /* 0xCC-0xCF */ + {0x7E, 0x2D}, {0x7E, 0x3C}, {0x7E, 0x42}, {0x7E, 0x33}, /* 0xD0-0xD3 */ + {0x98, 0x48}, {0x7E, 0x38}, {0x7E, 0x2A}, {0x7E, 0x49}, /* 0xD4-0xD7 */ + {0x7E, 0x40}, {0x7E, 0x47}, {0x7E, 0x29}, {0x7E, 0x4C}, /* 0xD8-0xDB */ + {0x7E, 0x30}, {0x7E, 0x3B}, {0x7E, 0x36}, {0x7E, 0x44}, /* 0xDC-0xDF */ + {0x7E, 0x3A}, {0x7F, 0x45}, {0x7F, 0x7F}, {0x7F, 0x7E}, /* 0xE0-0xE3 */ + {0x7F, 0x7D}, {0x7F, 0xF4}, {0x7F, 0xF2}, {0x80, 0x2C}, /* 0xE4-0xE7 */ + {0x81, 0xBB}, {0x81, 0xC4}, {0x81, 0xCC}, {0x81, 0xCA}, /* 0xE8-0xEB */ + {0x81, 0xC5}, {0x81, 0xC7}, {0x81, 0xBC}, {0x81, 0xE9}, /* 0xEC-0xEF */ + {0x82, 0x5B}, {0x82, 0x5A}, {0x82, 0x5C}, {0x85, 0x83}, /* 0xF0-0xF3 */ + {0x85, 0x80}, {0x85, 0x8F}, {0x85, 0xA7}, {0x85, 0x95}, /* 0xF4-0xF7 */ + {0x85, 0xA0}, {0x85, 0x8B}, {0x85, 0xA3}, {0x85, 0x7B}, /* 0xF8-0xFB */ + {0x85, 0xA4}, {0x85, 0x9A}, {0x85, 0x9E}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EE[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x85, 0x77}, {0x85, 0x7C}, {0x85, 0x89}, {0x85, 0xA1}, /* 0x40-0x43 */ + {0x85, 0x7A}, {0x85, 0x78}, {0x85, 0x57}, {0x85, 0x8E}, /* 0x44-0x47 */ + {0x85, 0x96}, {0x85, 0x86}, {0x85, 0x8D}, {0x85, 0x99}, /* 0x48-0x4B */ + {0x85, 0x9D}, {0x85, 0x81}, {0x85, 0xA2}, {0x85, 0x82}, /* 0x4C-0x4F */ + {0x85, 0x88}, {0x85, 0x85}, {0x85, 0x79}, {0x85, 0x76}, /* 0x50-0x53 */ + {0x85, 0x98}, {0x85, 0x90}, {0x85, 0x9F}, {0x86, 0x68}, /* 0x54-0x57 */ + {0x87, 0xBE}, {0x87, 0xAA}, {0x87, 0xAD}, {0x87, 0xC5}, /* 0x58-0x5B */ + {0x87, 0xB0}, {0x87, 0xAC}, {0x87, 0xB9}, {0x87, 0xB5}, /* 0x5C-0x5F */ + {0x87, 0xBC}, {0x87, 0xAE}, {0x87, 0xC9}, {0x87, 0xC3}, /* 0x60-0x63 */ + {0x87, 0xC2}, {0x87, 0xCC}, {0x87, 0xB7}, {0x87, 0xAF}, /* 0x64-0x67 */ + {0x87, 0xC4}, {0x87, 0xCA}, {0x87, 0xB4}, {0x87, 0xB6}, /* 0x68-0x6B */ + {0x87, 0xBF}, {0x87, 0xB8}, {0x87, 0xBD}, {0x87, 0xDE}, /* 0x6C-0x6F */ + {0x87, 0xB2}, {0x89, 0x35}, {0x89, 0x33}, {0x89, 0x3C}, /* 0x70-0x73 */ + {0x89, 0x3E}, {0x89, 0x41}, {0x89, 0x52}, {0x89, 0x37}, /* 0x74-0x77 */ + {0x89, 0x42}, {0x89, 0xAD}, {0x89, 0xAF}, {0x89, 0xAE}, /* 0x78-0x7B */ + {0x89, 0xF2}, {0x89, 0xF3}, {0x8B, 0x1E}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x8B, 0x18}, {0x8B, 0x16}, {0x8B, 0x11}, /* 0xA0-0xA3 */ + {0x8B, 0x05}, {0x8B, 0x0B}, {0x8B, 0x22}, {0x8B, 0x0F}, /* 0xA4-0xA7 */ + {0x8B, 0x12}, {0x8B, 0x15}, {0x8B, 0x07}, {0x8B, 0x0D}, /* 0xA8-0xAB */ + {0x8B, 0x08}, {0x8B, 0x06}, {0x8B, 0x1C}, {0x8B, 0x13}, /* 0xAC-0xAF */ + {0x8B, 0x1A}, {0x8C, 0x4F}, {0x8C, 0x70}, {0x8C, 0x72}, /* 0xB0-0xB3 */ + {0x8C, 0x71}, {0x8C, 0x6F}, {0x8C, 0x95}, {0x8C, 0x94}, /* 0xB4-0xB7 */ + {0x8C, 0xF9}, {0x8D, 0x6F}, {0x8E, 0x4E}, {0x8E, 0x4D}, /* 0xB8-0xBB */ + {0x8E, 0x53}, {0x8E, 0x50}, {0x8E, 0x4C}, {0x8E, 0x47}, /* 0xBC-0xBF */ + {0x8F, 0x43}, {0x8F, 0x40}, {0x90, 0x85}, {0x90, 0x7E}, /* 0xC0-0xC3 */ + {0x91, 0x38}, {0x91, 0x9A}, {0x91, 0xA2}, {0x91, 0x9B}, /* 0xC4-0xC7 */ + {0x91, 0x99}, {0x91, 0x9F}, {0x91, 0xA1}, {0x91, 0x9D}, /* 0xC8-0xCB */ + {0x91, 0xA0}, {0x93, 0xA1}, {0x93, 0x83}, {0x93, 0xAF}, /* 0xCC-0xCF */ + {0x93, 0x64}, {0x93, 0x56}, {0x93, 0x47}, {0x93, 0x7C}, /* 0xD0-0xD3 */ + {0x93, 0x58}, {0x93, 0x5C}, {0x93, 0x76}, {0x93, 0x49}, /* 0xD4-0xD7 */ + {0x93, 0x50}, {0x93, 0x51}, {0x93, 0x60}, {0x93, 0x6D}, /* 0xD8-0xDB */ + {0x93, 0x8F}, {0x93, 0x4C}, {0x93, 0x6A}, {0x93, 0x79}, /* 0xDC-0xDF */ + {0x93, 0x57}, {0x93, 0x55}, {0x93, 0x52}, {0x93, 0x4F}, /* 0xE0-0xE3 */ + {0x93, 0x71}, {0x93, 0x77}, {0x93, 0x7B}, {0x93, 0x61}, /* 0xE4-0xE7 */ + {0x93, 0x5E}, {0x93, 0x63}, {0x93, 0x67}, {0x93, 0x80}, /* 0xE8-0xEB */ + {0x93, 0x4E}, {0x93, 0x59}, {0x95, 0xC7}, {0x95, 0xC0}, /* 0xEC-0xEF */ + {0x95, 0xC9}, {0x95, 0xC3}, {0x95, 0xC5}, {0x95, 0xB7}, /* 0xF0-0xF3 */ + {0x96, 0xAE}, {0x96, 0xB0}, {0x96, 0xAC}, {0x97, 0x20}, /* 0xF4-0xF7 */ + {0x97, 0x1F}, {0x97, 0x18}, {0x97, 0x1D}, {0x97, 0x19}, /* 0xF8-0xFB */ + {0x97, 0x9A}, {0x97, 0xA1}, {0x97, 0x9C}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_EF[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x97, 0x9E}, {0x97, 0x9D}, {0x97, 0xD5}, {0x97, 0xD4}, /* 0x40-0x43 */ + {0x97, 0xF1}, {0x98, 0x41}, {0x98, 0x44}, {0x98, 0x4A}, /* 0x44-0x47 */ + {0x98, 0x49}, {0x98, 0x45}, {0x98, 0x43}, {0x99, 0x25}, /* 0x48-0x4B */ + {0x99, 0x2B}, {0x99, 0x2C}, {0x99, 0x2A}, {0x99, 0x33}, /* 0x4C-0x4F */ + {0x99, 0x32}, {0x99, 0x2F}, {0x99, 0x2D}, {0x99, 0x31}, /* 0x50-0x53 */ + {0x99, 0x30}, {0x99, 0x98}, {0x99, 0xA3}, {0x99, 0xA1}, /* 0x54-0x57 */ + {0x9A, 0x02}, {0x99, 0xFA}, {0x99, 0xF4}, {0x99, 0xF7}, /* 0x58-0x5B */ + {0x99, 0xF9}, {0x99, 0xF8}, {0x99, 0xF6}, {0x99, 0xFB}, /* 0x5C-0x5F */ + {0x99, 0xFD}, {0x99, 0xFE}, {0x99, 0xFC}, {0x9A, 0x03}, /* 0x60-0x63 */ + {0x9A, 0xBE}, {0x9A, 0xFE}, {0x9A, 0xFD}, {0x9B, 0x01}, /* 0x64-0x67 */ + {0x9A, 0xFC}, {0x9B, 0x48}, {0x9B, 0x9A}, {0x9B, 0xA8}, /* 0x68-0x6B */ + {0x9B, 0x9E}, {0x9B, 0x9B}, {0x9B, 0xA6}, {0x9B, 0xA1}, /* 0x6C-0x6F */ + {0x9B, 0xA5}, {0x9B, 0xA4}, {0x9B, 0x86}, {0x9B, 0xA2}, /* 0x70-0x73 */ + {0x9B, 0xA0}, {0x9B, 0xAF}, {0x9D, 0x33}, {0x9D, 0x41}, /* 0x74-0x77 */ + {0x9D, 0x67}, {0x9D, 0x36}, {0x9D, 0x2E}, {0x9D, 0x2F}, /* 0x78-0x7B */ + {0x9D, 0x31}, {0x9D, 0x38}, {0x9D, 0x30}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9D, 0x45}, {0x9D, 0x42}, {0x9D, 0x43}, /* 0xA0-0xA3 */ + {0x9D, 0x3E}, {0x9D, 0x37}, {0x9D, 0x40}, {0x9D, 0x3D}, /* 0xA4-0xA7 */ + {0x7F, 0xF5}, {0x9D, 0x2D}, {0x9E, 0x8A}, {0x9E, 0x89}, /* 0xA8-0xAB */ + {0x9E, 0x8D}, {0x9E, 0xB0}, {0x9E, 0xC8}, {0x9E, 0xDA}, /* 0xAC-0xAF */ + {0x9E, 0xFB}, {0x9E, 0xFF}, {0x9F, 0x24}, {0x9F, 0x23}, /* 0xB0-0xB3 */ + {0x9F, 0x22}, {0x9F, 0x54}, {0x9F, 0xA0}, {0x51, 0x31}, /* 0xB4-0xB7 */ + {0x51, 0x2D}, {0x51, 0x2E}, {0x56, 0x98}, {0x56, 0x9C}, /* 0xB8-0xBB */ + {0x56, 0x97}, {0x56, 0x9A}, {0x56, 0x9D}, {0x56, 0x99}, /* 0xBC-0xBF */ + {0x59, 0x70}, {0x5B, 0x3C}, {0x5C, 0x69}, {0x5C, 0x6A}, /* 0xC0-0xC3 */ + {0x5D, 0xC0}, {0x5E, 0x6D}, {0x5E, 0x6E}, {0x61, 0xD8}, /* 0xC4-0xC7 */ + {0x61, 0xDF}, {0x61, 0xED}, {0x61, 0xEE}, {0x61, 0xF1}, /* 0xC8-0xCB */ + {0x61, 0xEA}, {0x61, 0xF0}, {0x61, 0xEB}, {0x61, 0xD6}, /* 0xCC-0xCF */ + {0x61, 0xE9}, {0x64, 0xFF}, {0x65, 0x04}, {0x64, 0xFD}, /* 0xD0-0xD3 */ + {0x64, 0xF8}, {0x65, 0x01}, {0x65, 0x03}, {0x64, 0xFC}, /* 0xD4-0xD7 */ + {0x65, 0x94}, {0x65, 0xDB}, {0x66, 0xDA}, {0x66, 0xDB}, /* 0xD8-0xDB */ + {0x66, 0xD8}, {0x6A, 0xC5}, {0x6A, 0xB9}, {0x6A, 0xBD}, /* 0xDC-0xDF */ + {0x6A, 0xE1}, {0x6A, 0xC6}, {0x6A, 0xBA}, {0x6A, 0xB6}, /* 0xE0-0xE3 */ + {0x6A, 0xB7}, {0x6A, 0xC7}, {0x6A, 0xB4}, {0x6A, 0xAD}, /* 0xE4-0xE7 */ + {0x6B, 0x5E}, {0x6B, 0xC9}, {0x6C, 0x0B}, {0x70, 0x07}, /* 0xE8-0xEB */ + {0x70, 0x0C}, {0x70, 0x0D}, {0x70, 0x01}, {0x70, 0x05}, /* 0xEC-0xEF */ + {0x70, 0x14}, {0x70, 0x0E}, {0x6F, 0xFF}, {0x70, 0x00}, /* 0xF0-0xF3 */ + {0x6F, 0xFB}, {0x70, 0x26}, {0x6F, 0xFC}, {0x6F, 0xF7}, /* 0xF4-0xF7 */ + {0x70, 0x0A}, {0x72, 0x01}, {0x71, 0xFF}, {0x71, 0xF9}, /* 0xF8-0xFB */ + {0x72, 0x03}, {0x71, 0xFD}, {0x73, 0x76}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F0[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x74, 0xB8}, {0x74, 0xC0}, {0x74, 0xB5}, {0x74, 0xC1}, /* 0x40-0x43 */ + {0x74, 0xBE}, {0x74, 0xB6}, {0x74, 0xBB}, {0x74, 0xC2}, /* 0x44-0x47 */ + {0x75, 0x14}, {0x75, 0x13}, {0x76, 0x5C}, {0x76, 0x64}, /* 0x48-0x4B */ + {0x76, 0x59}, {0x76, 0x50}, {0x76, 0x53}, {0x76, 0x57}, /* 0x4C-0x4F */ + {0x76, 0x5A}, {0x76, 0xA6}, {0x76, 0xBD}, {0x76, 0xEC}, /* 0x50-0x53 */ + {0x77, 0xC2}, {0x77, 0xBA}, {0x78, 0xFF}, {0x79, 0x0C}, /* 0x54-0x57 */ + {0x79, 0x13}, {0x79, 0x14}, {0x79, 0x09}, {0x79, 0x10}, /* 0x58-0x5B */ + {0x79, 0x12}, {0x79, 0x11}, {0x79, 0xAD}, {0x79, 0xAC}, /* 0x5C-0x5F */ + {0x7A, 0x5F}, {0x7C, 0x1C}, {0x7C, 0x29}, {0x7C, 0x19}, /* 0x60-0x63 */ + {0x7C, 0x20}, {0x7C, 0x1F}, {0x7C, 0x2D}, {0x7C, 0x1D}, /* 0x64-0x67 */ + {0x7C, 0x26}, {0x7C, 0x28}, {0x7C, 0x22}, {0x7C, 0x25}, /* 0x68-0x6B */ + {0x7C, 0x30}, {0x7E, 0x5C}, {0x7E, 0x50}, {0x7E, 0x56}, /* 0x6C-0x6F */ + {0x7E, 0x63}, {0x7E, 0x58}, {0x7E, 0x62}, {0x7E, 0x5F}, /* 0x70-0x73 */ + {0x7E, 0x51}, {0x7E, 0x60}, {0x7E, 0x57}, {0x7E, 0x53}, /* 0x74-0x77 */ + {0x7F, 0xB5}, {0x7F, 0xB3}, {0x7F, 0xF7}, {0x7F, 0xF8}, /* 0x78-0x7B */ + {0x80, 0x75}, {0x81, 0xD1}, {0x81, 0xD2}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x81, 0xD0}, {0x82, 0x5F}, {0x82, 0x5E}, /* 0xA0-0xA3 */ + {0x85, 0xB4}, {0x85, 0xC6}, {0x85, 0xC0}, {0x85, 0xC3}, /* 0xA4-0xA7 */ + {0x85, 0xC2}, {0x85, 0xB3}, {0x85, 0xB5}, {0x85, 0xBD}, /* 0xA8-0xAB */ + {0x85, 0xC7}, {0x85, 0xC4}, {0x85, 0xBF}, {0x85, 0xCB}, /* 0xAC-0xAF */ + {0x85, 0xCE}, {0x85, 0xC8}, {0x85, 0xC5}, {0x85, 0xB1}, /* 0xB0-0xB3 */ + {0x85, 0xB6}, {0x85, 0xD2}, {0x86, 0x24}, {0x85, 0xB8}, /* 0xB4-0xB7 */ + {0x85, 0xB7}, {0x85, 0xBE}, {0x86, 0x69}, {0x87, 0xE7}, /* 0xB8-0xBB */ + {0x87, 0xE6}, {0x87, 0xE2}, {0x87, 0xDB}, {0x87, 0xEB}, /* 0xBC-0xBF */ + {0x87, 0xEA}, {0x87, 0xE5}, {0x87, 0xDF}, {0x87, 0xF3}, /* 0xC0-0xC3 */ + {0x87, 0xE4}, {0x87, 0xD4}, {0x87, 0xDC}, {0x87, 0xD3}, /* 0xC4-0xC7 */ + {0x87, 0xED}, {0x87, 0xD8}, {0x87, 0xE3}, {0x87, 0xA4}, /* 0xC8-0xCB */ + {0x87, 0xD7}, {0x87, 0xD9}, {0x88, 0x01}, {0x87, 0xF4}, /* 0xCC-0xCF */ + {0x87, 0xE8}, {0x87, 0xDD}, {0x89, 0x53}, {0x89, 0x4B}, /* 0xD0-0xD3 */ + {0x89, 0x4F}, {0x89, 0x4C}, {0x89, 0x46}, {0x89, 0x50}, /* 0xD4-0xD7 */ + {0x89, 0x51}, {0x89, 0x49}, {0x8B, 0x2A}, {0x8B, 0x27}, /* 0xD8-0xDB */ + {0x8B, 0x23}, {0x8B, 0x33}, {0x8B, 0x30}, {0x8B, 0x35}, /* 0xDC-0xDF */ + {0x8B, 0x47}, {0x8B, 0x2F}, {0x8B, 0x3C}, {0x8B, 0x3E}, /* 0xE0-0xE3 */ + {0x8B, 0x31}, {0x8B, 0x25}, {0x8B, 0x37}, {0x8B, 0x26}, /* 0xE4-0xE7 */ + {0x8B, 0x36}, {0x8B, 0x2E}, {0x8B, 0x24}, {0x8B, 0x3B}, /* 0xE8-0xEB */ + {0x8B, 0x3D}, {0x8B, 0x3A}, {0x8C, 0x42}, {0x8C, 0x75}, /* 0xEC-0xEF */ + {0x8C, 0x99}, {0x8C, 0x98}, {0x8C, 0x97}, {0x8C, 0xFE}, /* 0xF0-0xF3 */ + {0x8D, 0x04}, {0x8D, 0x02}, {0x8D, 0x00}, {0x8E, 0x5C}, /* 0xF4-0xF7 */ + {0x8E, 0x62}, {0x8E, 0x60}, {0x8E, 0x57}, {0x8E, 0x56}, /* 0xF8-0xFB */ + {0x8E, 0x5E}, {0x8E, 0x65}, {0x8E, 0x67}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F1[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8E, 0x5B}, {0x8E, 0x5A}, {0x8E, 0x61}, {0x8E, 0x5D}, /* 0x40-0x43 */ + {0x8E, 0x69}, {0x8E, 0x54}, {0x8F, 0x46}, {0x8F, 0x47}, /* 0x44-0x47 */ + {0x8F, 0x48}, {0x8F, 0x4B}, {0x91, 0x28}, {0x91, 0x3A}, /* 0x48-0x4B */ + {0x91, 0x3B}, {0x91, 0x3E}, {0x91, 0xA8}, {0x91, 0xA5}, /* 0x4C-0x4F */ + {0x91, 0xA7}, {0x91, 0xAF}, {0x91, 0xAA}, {0x93, 0xB5}, /* 0x50-0x53 */ + {0x93, 0x8C}, {0x93, 0x92}, {0x93, 0xB7}, {0x93, 0x9B}, /* 0x54-0x57 */ + {0x93, 0x9D}, {0x93, 0x89}, {0x93, 0xA7}, {0x93, 0x8E}, /* 0x58-0x5B */ + {0x93, 0xAA}, {0x93, 0x9E}, {0x93, 0xA6}, {0x93, 0x95}, /* 0x5C-0x5F */ + {0x93, 0x88}, {0x93, 0x99}, {0x93, 0x9F}, {0x93, 0x8D}, /* 0x60-0x63 */ + {0x93, 0xB1}, {0x93, 0x91}, {0x93, 0xB2}, {0x93, 0xA4}, /* 0x64-0x67 */ + {0x93, 0xA8}, {0x93, 0xB4}, {0x93, 0xA3}, {0x93, 0xA5}, /* 0x68-0x6B */ + {0x95, 0xD2}, {0x95, 0xD3}, {0x95, 0xD1}, {0x96, 0xB3}, /* 0x6C-0x6F */ + {0x96, 0xD7}, {0x96, 0xDA}, {0x5D, 0xC2}, {0x96, 0xDF}, /* 0x70-0x73 */ + {0x96, 0xD8}, {0x96, 0xDD}, {0x97, 0x23}, {0x97, 0x22}, /* 0x74-0x77 */ + {0x97, 0x25}, {0x97, 0xAC}, {0x97, 0xAE}, {0x97, 0xA8}, /* 0x78-0x7B */ + {0x97, 0xAB}, {0x97, 0xA4}, {0x97, 0xAA}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x97, 0xA2}, {0x97, 0xA5}, {0x97, 0xD7}, /* 0xA0-0xA3 */ + {0x97, 0xD9}, {0x97, 0xD6}, {0x97, 0xD8}, {0x97, 0xFA}, /* 0xA4-0xA7 */ + {0x98, 0x50}, {0x98, 0x51}, {0x98, 0x52}, {0x98, 0xB8}, /* 0xA8-0xAB */ + {0x99, 0x41}, {0x99, 0x3C}, {0x99, 0x3A}, {0x9A, 0x0F}, /* 0xAC-0xAF */ + {0x9A, 0x0B}, {0x9A, 0x09}, {0x9A, 0x0D}, {0x9A, 0x04}, /* 0xB0-0xB3 */ + {0x9A, 0x11}, {0x9A, 0x0A}, {0x9A, 0x05}, {0x9A, 0x07}, /* 0xB4-0xB7 */ + {0x9A, 0x06}, {0x9A, 0xC0}, {0x9A, 0xDC}, {0x9B, 0x08}, /* 0xB8-0xBB */ + {0x9B, 0x04}, {0x9B, 0x05}, {0x9B, 0x29}, {0x9B, 0x35}, /* 0xBC-0xBF */ + {0x9B, 0x4A}, {0x9B, 0x4C}, {0x9B, 0x4B}, {0x9B, 0xC7}, /* 0xC0-0xC3 */ + {0x9B, 0xC6}, {0x9B, 0xC3}, {0x9B, 0xBF}, {0x9B, 0xC1}, /* 0xC4-0xC7 */ + {0x9B, 0xB5}, {0x9B, 0xB8}, {0x9B, 0xD3}, {0x9B, 0xB6}, /* 0xC8-0xCB */ + {0x9B, 0xC4}, {0x9B, 0xB9}, {0x9B, 0xBD}, {0x9D, 0x5C}, /* 0xCC-0xCF */ + {0x9D, 0x53}, {0x9D, 0x4F}, {0x9D, 0x4A}, {0x9D, 0x5B}, /* 0xD0-0xD3 */ + {0x9D, 0x4B}, {0x9D, 0x59}, {0x9D, 0x56}, {0x9D, 0x4C}, /* 0xD4-0xD7 */ + {0x9D, 0x57}, {0x9D, 0x52}, {0x9D, 0x54}, {0x9D, 0x5F}, /* 0xD8-0xDB */ + {0x9D, 0x58}, {0x9D, 0x5A}, {0x9E, 0x8E}, {0x9E, 0x8C}, /* 0xDC-0xDF */ + {0x9E, 0xDF}, {0x9F, 0x01}, {0x9F, 0x00}, {0x9F, 0x16}, /* 0xE0-0xE3 */ + {0x9F, 0x25}, {0x9F, 0x2B}, {0x9F, 0x2A}, {0x9F, 0x29}, /* 0xE4-0xE7 */ + {0x9F, 0x28}, {0x9F, 0x4C}, {0x9F, 0x55}, {0x51, 0x34}, /* 0xE8-0xEB */ + {0x51, 0x35}, {0x52, 0x96}, {0x52, 0xF7}, {0x53, 0xB4}, /* 0xEC-0xEF */ + {0x56, 0xAB}, {0x56, 0xAD}, {0x56, 0xA6}, {0x56, 0xA7}, /* 0xF0-0xF3 */ + {0x56, 0xAA}, {0x56, 0xAC}, {0x58, 0xDA}, {0x58, 0xDD}, /* 0xF4-0xF7 */ + {0x58, 0xDB}, {0x59, 0x12}, {0x5B, 0x3D}, {0x5B, 0x3E}, /* 0xF8-0xFB */ + {0x5B, 0x3F}, {0x5D, 0xC3}, {0x5E, 0x70}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F2[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x5F, 0xBF}, {0x61, 0xFB}, {0x65, 0x07}, {0x65, 0x10}, /* 0x40-0x43 */ + {0x65, 0x0D}, {0x65, 0x09}, {0x65, 0x0C}, {0x65, 0x0E}, /* 0x44-0x47 */ + {0x65, 0x84}, {0x65, 0xDE}, {0x65, 0xDD}, {0x66, 0xDE}, /* 0x48-0x4B */ + {0x6A, 0xE7}, {0x6A, 0xE0}, {0x6A, 0xCC}, {0x6A, 0xD1}, /* 0x4C-0x4F */ + {0x6A, 0xD9}, {0x6A, 0xCB}, {0x6A, 0xDF}, {0x6A, 0xDC}, /* 0x50-0x53 */ + {0x6A, 0xD0}, {0x6A, 0xEB}, {0x6A, 0xCF}, {0x6A, 0xCD}, /* 0x54-0x57 */ + {0x6A, 0xDE}, {0x6B, 0x60}, {0x6B, 0xB0}, {0x6C, 0x0C}, /* 0x58-0x5B */ + {0x70, 0x19}, {0x70, 0x27}, {0x70, 0x20}, {0x70, 0x16}, /* 0x5C-0x5F */ + {0x70, 0x2B}, {0x70, 0x21}, {0x70, 0x22}, {0x70, 0x23}, /* 0x60-0x63 */ + {0x70, 0x29}, {0x70, 0x17}, {0x70, 0x24}, {0x70, 0x1C}, /* 0x64-0x67 */ + {0x70, 0x2A}, {0x72, 0x0C}, {0x72, 0x0A}, {0x72, 0x07}, /* 0x68-0x6B */ + {0x72, 0x02}, {0x72, 0x05}, {0x72, 0xA5}, {0x72, 0xA6}, /* 0x6C-0x6F */ + {0x72, 0xA4}, {0x72, 0xA3}, {0x72, 0xA1}, {0x74, 0xCB}, /* 0x70-0x73 */ + {0x74, 0xC5}, {0x74, 0xB7}, {0x74, 0xC3}, {0x75, 0x16}, /* 0x74-0x77 */ + {0x76, 0x60}, {0x77, 0xC9}, {0x77, 0xCA}, {0x77, 0xC4}, /* 0x78-0x7B */ + {0x77, 0xF1}, {0x79, 0x1D}, {0x79, 0x1B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x79, 0x21}, {0x79, 0x1C}, {0x79, 0x17}, /* 0xA0-0xA3 */ + {0x79, 0x1E}, {0x79, 0xB0}, {0x7A, 0x67}, {0x7A, 0x68}, /* 0xA4-0xA7 */ + {0x7C, 0x33}, {0x7C, 0x3C}, {0x7C, 0x39}, {0x7C, 0x2C}, /* 0xA8-0xAB */ + {0x7C, 0x3B}, {0x7C, 0xEC}, {0x7C, 0xEA}, {0x7E, 0x76}, /* 0xAC-0xAF */ + {0x7E, 0x75}, {0x7E, 0x78}, {0x7E, 0x70}, {0x7E, 0x77}, /* 0xB0-0xB3 */ + {0x7E, 0x6F}, {0x7E, 0x7A}, {0x7E, 0x72}, {0x7E, 0x74}, /* 0xB4-0xB7 */ + {0x7E, 0x68}, {0x7F, 0x4B}, {0x7F, 0x4A}, {0x7F, 0x83}, /* 0xB8-0xBB */ + {0x7F, 0x86}, {0x7F, 0xB7}, {0x7F, 0xFD}, {0x7F, 0xFE}, /* 0xBC-0xBF */ + {0x80, 0x78}, {0x81, 0xD7}, {0x81, 0xD5}, {0x82, 0x64}, /* 0xC0-0xC3 */ + {0x82, 0x61}, {0x82, 0x63}, {0x85, 0xEB}, {0x85, 0xF1}, /* 0xC4-0xC7 */ + {0x85, 0xED}, {0x85, 0xD9}, {0x85, 0xE1}, {0x85, 0xE8}, /* 0xC8-0xCB */ + {0x85, 0xDA}, {0x85, 0xD7}, {0x85, 0xEC}, {0x85, 0xF2}, /* 0xCC-0xCF */ + {0x85, 0xF8}, {0x85, 0xD8}, {0x85, 0xDF}, {0x85, 0xE3}, /* 0xD0-0xD3 */ + {0x85, 0xDC}, {0x85, 0xD1}, {0x85, 0xF0}, {0x85, 0xE6}, /* 0xD4-0xD7 */ + {0x85, 0xEF}, {0x85, 0xDE}, {0x85, 0xE2}, {0x88, 0x00}, /* 0xD8-0xDB */ + {0x87, 0xFA}, {0x88, 0x03}, {0x87, 0xF6}, {0x87, 0xF7}, /* 0xDC-0xDF */ + {0x88, 0x09}, {0x88, 0x0C}, {0x88, 0x0B}, {0x88, 0x06}, /* 0xE0-0xE3 */ + {0x87, 0xFC}, {0x88, 0x08}, {0x87, 0xFF}, {0x88, 0x0A}, /* 0xE4-0xE7 */ + {0x88, 0x02}, {0x89, 0x62}, {0x89, 0x5A}, {0x89, 0x5B}, /* 0xE8-0xEB */ + {0x89, 0x57}, {0x89, 0x61}, {0x89, 0x5C}, {0x89, 0x58}, /* 0xEC-0xEF */ + {0x89, 0x5D}, {0x89, 0x59}, {0x89, 0x88}, {0x89, 0xB7}, /* 0xF0-0xF3 */ + {0x89, 0xB6}, {0x89, 0xF6}, {0x8B, 0x50}, {0x8B, 0x48}, /* 0xF4-0xF7 */ + {0x8B, 0x4A}, {0x8B, 0x40}, {0x8B, 0x53}, {0x8B, 0x56}, /* 0xF8-0xFB */ + {0x8B, 0x54}, {0x8B, 0x4B}, {0x8B, 0x55}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F3[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8B, 0x51}, {0x8B, 0x42}, {0x8B, 0x52}, {0x8B, 0x57}, /* 0x40-0x43 */ + {0x8C, 0x43}, {0x8C, 0x77}, {0x8C, 0x76}, {0x8C, 0x9A}, /* 0x44-0x47 */ + {0x8D, 0x06}, {0x8D, 0x07}, {0x8D, 0x09}, {0x8D, 0xAC}, /* 0x48-0x4B */ + {0x8D, 0xAA}, {0x8D, 0xAD}, {0x8D, 0xAB}, {0x8E, 0x6D}, /* 0x4C-0x4F */ + {0x8E, 0x78}, {0x8E, 0x73}, {0x8E, 0x6A}, {0x8E, 0x6F}, /* 0x50-0x53 */ + {0x8E, 0x7B}, {0x8E, 0xC2}, {0x8F, 0x52}, {0x8F, 0x51}, /* 0x54-0x57 */ + {0x8F, 0x4F}, {0x8F, 0x50}, {0x8F, 0x53}, {0x8F, 0xB4}, /* 0x58-0x5B */ + {0x91, 0x40}, {0x91, 0x3F}, {0x91, 0xB0}, {0x91, 0xAD}, /* 0x5C-0x5F */ + {0x93, 0xDE}, {0x93, 0xC7}, {0x93, 0xCF}, {0x93, 0xC2}, /* 0x60-0x63 */ + {0x93, 0xDA}, {0x93, 0xD0}, {0x93, 0xF9}, {0x93, 0xEC}, /* 0x64-0x67 */ + {0x93, 0xCC}, {0x93, 0xD9}, {0x93, 0xA9}, {0x93, 0xE6}, /* 0x68-0x6B */ + {0x93, 0xCA}, {0x93, 0xD4}, {0x93, 0xEE}, {0x93, 0xE3}, /* 0x6C-0x6F */ + {0x93, 0xD5}, {0x93, 0xC4}, {0x93, 0xCE}, {0x93, 0xC0}, /* 0x70-0x73 */ + {0x93, 0xD2}, {0x93, 0xE7}, {0x95, 0x7D}, {0x95, 0xDA}, /* 0x74-0x77 */ + {0x95, 0xDB}, {0x96, 0xE1}, {0x97, 0x29}, {0x97, 0x2B}, /* 0x78-0x7B */ + {0x97, 0x2C}, {0x97, 0x28}, {0x97, 0x26}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x97, 0xB3}, {0x97, 0xB7}, {0x97, 0xB6}, /* 0xA0-0xA3 */ + {0x97, 0xDD}, {0x97, 0xDE}, {0x97, 0xDF}, {0x98, 0x5C}, /* 0xA4-0xA7 */ + {0x98, 0x59}, {0x98, 0x5D}, {0x98, 0x57}, {0x98, 0xBF}, /* 0xA8-0xAB */ + {0x98, 0xBD}, {0x98, 0xBB}, {0x98, 0xBE}, {0x99, 0x48}, /* 0xAC-0xAF */ + {0x99, 0x47}, {0x99, 0x43}, {0x99, 0xA6}, {0x99, 0xA7}, /* 0xB0-0xB3 */ + {0x9A, 0x1A}, {0x9A, 0x15}, {0x9A, 0x25}, {0x9A, 0x1D}, /* 0xB4-0xB7 */ + {0x9A, 0x24}, {0x9A, 0x1B}, {0x9A, 0x22}, {0x9A, 0x20}, /* 0xB8-0xBB */ + {0x9A, 0x27}, {0x9A, 0x23}, {0x9A, 0x1E}, {0x9A, 0x1C}, /* 0xBC-0xBF */ + {0x9A, 0x14}, {0x9A, 0xC2}, {0x9B, 0x0B}, {0x9B, 0x0A}, /* 0xC0-0xC3 */ + {0x9B, 0x0E}, {0x9B, 0x0C}, {0x9B, 0x37}, {0x9B, 0xEA}, /* 0xC4-0xC7 */ + {0x9B, 0xEB}, {0x9B, 0xE0}, {0x9B, 0xDE}, {0x9B, 0xE4}, /* 0xC8-0xCB */ + {0x9B, 0xE6}, {0x9B, 0xE2}, {0x9B, 0xF0}, {0x9B, 0xD4}, /* 0xCC-0xCF */ + {0x9B, 0xD7}, {0x9B, 0xEC}, {0x9B, 0xDC}, {0x9B, 0xD9}, /* 0xD0-0xD3 */ + {0x9B, 0xE5}, {0x9B, 0xD5}, {0x9B, 0xE1}, {0x9B, 0xDA}, /* 0xD4-0xD7 */ + {0x9D, 0x77}, {0x9D, 0x81}, {0x9D, 0x8A}, {0x9D, 0x84}, /* 0xD8-0xDB */ + {0x9D, 0x88}, {0x9D, 0x71}, {0x9D, 0x80}, {0x9D, 0x78}, /* 0xDC-0xDF */ + {0x9D, 0x86}, {0x9D, 0x8B}, {0x9D, 0x8C}, {0x9D, 0x7D}, /* 0xE0-0xE3 */ + {0x9D, 0x6B}, {0x9D, 0x74}, {0x9D, 0x75}, {0x9D, 0x70}, /* 0xE4-0xE7 */ + {0x9D, 0x69}, {0x9D, 0x85}, {0x9D, 0x73}, {0x9D, 0x7B}, /* 0xE8-0xEB */ + {0x9D, 0x82}, {0x9D, 0x6F}, {0x9D, 0x79}, {0x9D, 0x7F}, /* 0xEC-0xEF */ + {0x9D, 0x87}, {0x9D, 0x68}, {0x9E, 0x94}, {0x9E, 0x91}, /* 0xF0-0xF3 */ + {0x9E, 0xC0}, {0x9E, 0xFC}, {0x9F, 0x2D}, {0x9F, 0x40}, /* 0xF4-0xF7 */ + {0x9F, 0x41}, {0x9F, 0x4D}, {0x9F, 0x56}, {0x9F, 0x57}, /* 0xF8-0xFB */ + {0x9F, 0x58}, {0x53, 0x37}, {0x56, 0xB2}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F4[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x56, 0xB5}, {0x56, 0xB3}, {0x58, 0xE3}, {0x5B, 0x45}, /* 0x40-0x43 */ + {0x5D, 0xC6}, {0x5D, 0xC7}, {0x5E, 0xEE}, {0x5E, 0xEF}, /* 0x44-0x47 */ + {0x5F, 0xC0}, {0x5F, 0xC1}, {0x61, 0xF9}, {0x65, 0x17}, /* 0x48-0x4B */ + {0x65, 0x16}, {0x65, 0x15}, {0x65, 0x13}, {0x65, 0xDF}, /* 0x4C-0x4F */ + {0x66, 0xE8}, {0x66, 0xE3}, {0x66, 0xE4}, {0x6A, 0xF3}, /* 0x50-0x53 */ + {0x6A, 0xF0}, {0x6A, 0xEA}, {0x6A, 0xE8}, {0x6A, 0xF9}, /* 0x54-0x57 */ + {0x6A, 0xF1}, {0x6A, 0xEE}, {0x6A, 0xEF}, {0x70, 0x3C}, /* 0x58-0x5B */ + {0x70, 0x35}, {0x70, 0x2F}, {0x70, 0x37}, {0x70, 0x34}, /* 0x5C-0x5F */ + {0x70, 0x31}, {0x70, 0x42}, {0x70, 0x38}, {0x70, 0x3F}, /* 0x60-0x63 */ + {0x70, 0x3A}, {0x70, 0x39}, {0x70, 0x40}, {0x70, 0x3B}, /* 0x64-0x67 */ + {0x70, 0x33}, {0x70, 0x41}, {0x72, 0x13}, {0x72, 0x14}, /* 0x68-0x6B */ + {0x72, 0xA8}, {0x73, 0x7D}, {0x73, 0x7C}, {0x74, 0xBA}, /* 0x6C-0x6F */ + {0x76, 0xAB}, {0x76, 0xAA}, {0x76, 0xBE}, {0x76, 0xED}, /* 0x70-0x73 */ + {0x77, 0xCC}, {0x77, 0xCE}, {0x77, 0xCF}, {0x77, 0xCD}, /* 0x74-0x77 */ + {0x77, 0xF2}, {0x79, 0x25}, {0x79, 0x23}, {0x79, 0x27}, /* 0x78-0x7B */ + {0x79, 0x28}, {0x79, 0x24}, {0x79, 0x29}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x79, 0xB2}, {0x7A, 0x6E}, {0x7A, 0x6C}, /* 0xA0-0xA3 */ + {0x7A, 0x6D}, {0x7A, 0xF7}, {0x7C, 0x49}, {0x7C, 0x48}, /* 0xA4-0xA7 */ + {0x7C, 0x4A}, {0x7C, 0x47}, {0x7C, 0x45}, {0x7C, 0xEE}, /* 0xA8-0xAB */ + {0x7E, 0x7B}, {0x7E, 0x7E}, {0x7E, 0x81}, {0x7E, 0x80}, /* 0xAC-0xAF */ + {0x7F, 0xBA}, {0x7F, 0xFF}, {0x80, 0x79}, {0x81, 0xDB}, /* 0xB0-0xB3 */ + {0x81, 0xD9}, {0x82, 0x0B}, {0x82, 0x68}, {0x82, 0x69}, /* 0xB4-0xB7 */ + {0x86, 0x22}, {0x85, 0xFF}, {0x86, 0x01}, {0x85, 0xFE}, /* 0xB8-0xBB */ + {0x86, 0x1B}, {0x86, 0x00}, {0x85, 0xF6}, {0x86, 0x04}, /* 0xBC-0xBF */ + {0x86, 0x09}, {0x86, 0x05}, {0x86, 0x0C}, {0x85, 0xFD}, /* 0xC0-0xC3 */ + {0x88, 0x19}, {0x88, 0x10}, {0x88, 0x11}, {0x88, 0x17}, /* 0xC4-0xC7 */ + {0x88, 0x13}, {0x88, 0x16}, {0x89, 0x63}, {0x89, 0x66}, /* 0xC8-0xCB */ + {0x89, 0xB9}, {0x89, 0xF7}, {0x8B, 0x60}, {0x8B, 0x6A}, /* 0xCC-0xCF */ + {0x8B, 0x5D}, {0x8B, 0x68}, {0x8B, 0x63}, {0x8B, 0x65}, /* 0xD0-0xD3 */ + {0x8B, 0x67}, {0x8B, 0x6D}, {0x8D, 0xAE}, {0x8E, 0x86}, /* 0xD4-0xD7 */ + {0x8E, 0x88}, {0x8E, 0x84}, {0x8F, 0x59}, {0x8F, 0x56}, /* 0xD8-0xDB */ + {0x8F, 0x57}, {0x8F, 0x55}, {0x8F, 0x58}, {0x8F, 0x5A}, /* 0xDC-0xDF */ + {0x90, 0x8D}, {0x91, 0x43}, {0x91, 0x41}, {0x91, 0xB7}, /* 0xE0-0xE3 */ + {0x91, 0xB5}, {0x91, 0xB2}, {0x91, 0xB3}, {0x94, 0x0B}, /* 0xE4-0xE7 */ + {0x94, 0x13}, {0x93, 0xFB}, {0x94, 0x20}, {0x94, 0x0F}, /* 0xE8-0xEB */ + {0x94, 0x14}, {0x93, 0xFE}, {0x94, 0x15}, {0x94, 0x10}, /* 0xEC-0xEF */ + {0x94, 0x28}, {0x94, 0x19}, {0x94, 0x0D}, {0x93, 0xF5}, /* 0xF0-0xF3 */ + {0x94, 0x00}, {0x93, 0xF7}, {0x94, 0x07}, {0x94, 0x0E}, /* 0xF4-0xF7 */ + {0x94, 0x16}, {0x94, 0x12}, {0x93, 0xFA}, {0x94, 0x09}, /* 0xF8-0xFB */ + {0x93, 0xF8}, {0x94, 0x0A}, {0x93, 0xFF}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F5[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x93, 0xFC}, {0x94, 0x0C}, {0x93, 0xF6}, {0x94, 0x11}, /* 0x40-0x43 */ + {0x94, 0x06}, {0x95, 0xDE}, {0x95, 0xE0}, {0x95, 0xDF}, /* 0x44-0x47 */ + {0x97, 0x2E}, {0x97, 0x2F}, {0x97, 0xB9}, {0x97, 0xBB}, /* 0x48-0x4B */ + {0x97, 0xFD}, {0x97, 0xFE}, {0x98, 0x60}, {0x98, 0x62}, /* 0x4C-0x4F */ + {0x98, 0x63}, {0x98, 0x5F}, {0x98, 0xC1}, {0x98, 0xC2}, /* 0x50-0x53 */ + {0x99, 0x50}, {0x99, 0x4E}, {0x99, 0x59}, {0x99, 0x4C}, /* 0x54-0x57 */ + {0x99, 0x4B}, {0x99, 0x53}, {0x9A, 0x32}, {0x9A, 0x34}, /* 0x58-0x5B */ + {0x9A, 0x31}, {0x9A, 0x2C}, {0x9A, 0x2A}, {0x9A, 0x36}, /* 0x5C-0x5F */ + {0x9A, 0x29}, {0x9A, 0x2E}, {0x9A, 0x38}, {0x9A, 0x2D}, /* 0x60-0x63 */ + {0x9A, 0xC7}, {0x9A, 0xCA}, {0x9A, 0xC6}, {0x9B, 0x10}, /* 0x64-0x67 */ + {0x9B, 0x12}, {0x9B, 0x11}, {0x9C, 0x0B}, {0x9C, 0x08}, /* 0x68-0x6B */ + {0x9B, 0xF7}, {0x9C, 0x05}, {0x9C, 0x12}, {0x9B, 0xF8}, /* 0x6C-0x6F */ + {0x9C, 0x40}, {0x9C, 0x07}, {0x9C, 0x0E}, {0x9C, 0x06}, /* 0x70-0x73 */ + {0x9C, 0x17}, {0x9C, 0x14}, {0x9C, 0x09}, {0x9D, 0x9F}, /* 0x74-0x77 */ + {0x9D, 0x99}, {0x9D, 0xA4}, {0x9D, 0x9D}, {0x9D, 0x92}, /* 0x78-0x7B */ + {0x9D, 0x98}, {0x9D, 0x90}, {0x9D, 0x9B}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9D, 0xA0}, {0x9D, 0x94}, {0x9D, 0x9C}, /* 0xA0-0xA3 */ + {0x9D, 0xAA}, {0x9D, 0x97}, {0x9D, 0xA1}, {0x9D, 0x9A}, /* 0xA4-0xA7 */ + {0x9D, 0xA2}, {0x9D, 0xA8}, {0x9D, 0x9E}, {0x9D, 0xA3}, /* 0xA8-0xAB */ + {0x9D, 0xBF}, {0x9D, 0xA9}, {0x9D, 0x96}, {0x9D, 0xA6}, /* 0xAC-0xAF */ + {0x9D, 0xA7}, {0x9E, 0x99}, {0x9E, 0x9B}, {0x9E, 0x9A}, /* 0xB0-0xB3 */ + {0x9E, 0xE5}, {0x9E, 0xE4}, {0x9E, 0xE7}, {0x9E, 0xE6}, /* 0xB4-0xB7 */ + {0x9F, 0x30}, {0x9F, 0x2E}, {0x9F, 0x5B}, {0x9F, 0x60}, /* 0xB8-0xBB */ + {0x9F, 0x5E}, {0x9F, 0x5D}, {0x9F, 0x59}, {0x9F, 0x91}, /* 0xBC-0xBF */ + {0x51, 0x3A}, {0x51, 0x39}, {0x52, 0x98}, {0x52, 0x97}, /* 0xC0-0xC3 */ + {0x56, 0xC3}, {0x56, 0xBD}, {0x56, 0xBE}, {0x5B, 0x48}, /* 0xC4-0xC7 */ + {0x5B, 0x47}, {0x5D, 0xCB}, {0x5D, 0xCF}, {0x5E, 0xF1}, /* 0xC8-0xCB */ + {0x61, 0xFD}, {0x65, 0x1B}, {0x6B, 0x02}, {0x6A, 0xFC}, /* 0xCC-0xCF */ + {0x6B, 0x03}, {0x6A, 0xF8}, {0x6B, 0x00}, {0x70, 0x43}, /* 0xD0-0xD3 */ + {0x70, 0x44}, {0x70, 0x4A}, {0x70, 0x48}, {0x70, 0x49}, /* 0xD4-0xD7 */ + {0x70, 0x45}, {0x70, 0x46}, {0x72, 0x1D}, {0x72, 0x1A}, /* 0xD8-0xDB */ + {0x72, 0x19}, {0x73, 0x7E}, {0x75, 0x17}, {0x76, 0x6A}, /* 0xDC-0xDF */ + {0x77, 0xD0}, {0x79, 0x2D}, {0x79, 0x31}, {0x79, 0x2F}, /* 0xE0-0xE3 */ + {0x7C, 0x54}, {0x7C, 0x53}, {0x7C, 0xF2}, {0x7E, 0x8A}, /* 0xE4-0xE7 */ + {0x7E, 0x87}, {0x7E, 0x88}, {0x7E, 0x8B}, {0x7E, 0x86}, /* 0xE8-0xEB */ + {0x7E, 0x8D}, {0x7F, 0x4D}, {0x7F, 0xBB}, {0x80, 0x30}, /* 0xEC-0xEF */ + {0x81, 0xDD}, {0x86, 0x18}, {0x86, 0x2A}, {0x86, 0x26}, /* 0xF0-0xF3 */ + {0x86, 0x1F}, {0x86, 0x23}, {0x86, 0x1C}, {0x86, 0x19}, /* 0xF4-0xF7 */ + {0x86, 0x27}, {0x86, 0x2E}, {0x86, 0x21}, {0x86, 0x20}, /* 0xF8-0xFB */ + {0x86, 0x29}, {0x86, 0x1E}, {0x86, 0x25}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F6[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x88, 0x29}, {0x88, 0x1D}, {0x88, 0x1B}, {0x88, 0x20}, /* 0x40-0x43 */ + {0x88, 0x24}, {0x88, 0x1C}, {0x88, 0x2B}, {0x88, 0x4A}, /* 0x44-0x47 */ + {0x89, 0x6D}, {0x89, 0x69}, {0x89, 0x6E}, {0x89, 0x6B}, /* 0x48-0x4B */ + {0x89, 0xFA}, {0x8B, 0x79}, {0x8B, 0x78}, {0x8B, 0x45}, /* 0x4C-0x4F */ + {0x8B, 0x7A}, {0x8B, 0x7B}, {0x8D, 0x10}, {0x8D, 0x14}, /* 0x50-0x53 */ + {0x8D, 0xAF}, {0x8E, 0x8E}, {0x8E, 0x8C}, {0x8F, 0x5E}, /* 0x54-0x57 */ + {0x8F, 0x5B}, {0x8F, 0x5D}, {0x91, 0x46}, {0x91, 0x44}, /* 0x58-0x5B */ + {0x91, 0x45}, {0x91, 0xB9}, {0x94, 0x3F}, {0x94, 0x3B}, /* 0x5C-0x5F */ + {0x94, 0x36}, {0x94, 0x29}, {0x94, 0x3D}, {0x94, 0x3C}, /* 0x60-0x63 */ + {0x94, 0x30}, {0x94, 0x39}, {0x94, 0x2A}, {0x94, 0x37}, /* 0x64-0x67 */ + {0x94, 0x2C}, {0x94, 0x40}, {0x94, 0x31}, {0x95, 0xE5}, /* 0x68-0x6B */ + {0x95, 0xE4}, {0x95, 0xE3}, {0x97, 0x35}, {0x97, 0x3A}, /* 0x6C-0x6F */ + {0x97, 0xBF}, {0x97, 0xE1}, {0x98, 0x64}, {0x98, 0xC9}, /* 0x70-0x73 */ + {0x98, 0xC6}, {0x98, 0xC0}, {0x99, 0x58}, {0x99, 0x56}, /* 0x74-0x77 */ + {0x9A, 0x39}, {0x9A, 0x3D}, {0x9A, 0x46}, {0x9A, 0x44}, /* 0x78-0x7B */ + {0x9A, 0x42}, {0x9A, 0x41}, {0x9A, 0x3A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9A, 0x3F}, {0x9A, 0xCD}, {0x9B, 0x15}, /* 0xA0-0xA3 */ + {0x9B, 0x17}, {0x9B, 0x18}, {0x9B, 0x16}, {0x9B, 0x3A}, /* 0xA4-0xA7 */ + {0x9B, 0x52}, {0x9C, 0x2B}, {0x9C, 0x1D}, {0x9C, 0x1C}, /* 0xA8-0xAB */ + {0x9C, 0x2C}, {0x9C, 0x23}, {0x9C, 0x28}, {0x9C, 0x29}, /* 0xAC-0xAF */ + {0x9C, 0x24}, {0x9C, 0x21}, {0x9D, 0xB7}, {0x9D, 0xB6}, /* 0xB0-0xB3 */ + {0x9D, 0xBC}, {0x9D, 0xC1}, {0x9D, 0xC7}, {0x9D, 0xCA}, /* 0xB4-0xB7 */ + {0x9D, 0xCF}, {0x9D, 0xBE}, {0x9D, 0xC5}, {0x9D, 0xC3}, /* 0xB8-0xBB */ + {0x9D, 0xBB}, {0x9D, 0xB5}, {0x9D, 0xCE}, {0x9D, 0xB9}, /* 0xBC-0xBF */ + {0x9D, 0xBA}, {0x9D, 0xAC}, {0x9D, 0xC8}, {0x9D, 0xB1}, /* 0xC0-0xC3 */ + {0x9D, 0xAD}, {0x9D, 0xCC}, {0x9D, 0xB3}, {0x9D, 0xCD}, /* 0xC4-0xC7 */ + {0x9D, 0xB2}, {0x9E, 0x7A}, {0x9E, 0x9C}, {0x9E, 0xEB}, /* 0xC8-0xCB */ + {0x9E, 0xEE}, {0x9E, 0xED}, {0x9F, 0x1B}, {0x9F, 0x18}, /* 0xCC-0xCF */ + {0x9F, 0x1A}, {0x9F, 0x31}, {0x9F, 0x4E}, {0x9F, 0x65}, /* 0xD0-0xD3 */ + {0x9F, 0x64}, {0x9F, 0x92}, {0x4E, 0xB9}, {0x56, 0xC6}, /* 0xD4-0xD7 */ + {0x56, 0xC5}, {0x56, 0xCB}, {0x59, 0x71}, {0x5B, 0x4B}, /* 0xD8-0xDB */ + {0x5B, 0x4C}, {0x5D, 0xD5}, {0x5D, 0xD1}, {0x5E, 0xF2}, /* 0xDC-0xDF */ + {0x65, 0x21}, {0x65, 0x20}, {0x65, 0x26}, {0x65, 0x22}, /* 0xE0-0xE3 */ + {0x6B, 0x0B}, {0x6B, 0x08}, {0x6B, 0x09}, {0x6C, 0x0D}, /* 0xE4-0xE7 */ + {0x70, 0x55}, {0x70, 0x56}, {0x70, 0x57}, {0x70, 0x52}, /* 0xE8-0xEB */ + {0x72, 0x1E}, {0x72, 0x1F}, {0x72, 0xA9}, {0x73, 0x7F}, /* 0xEC-0xEF */ + {0x74, 0xD8}, {0x74, 0xD5}, {0x74, 0xD9}, {0x74, 0xD7}, /* 0xF0-0xF3 */ + {0x76, 0x6D}, {0x76, 0xAD}, {0x79, 0x35}, {0x79, 0xB4}, /* 0xF4-0xF7 */ + {0x7A, 0x70}, {0x7A, 0x71}, {0x7C, 0x57}, {0x7C, 0x5C}, /* 0xF8-0xFB */ + {0x7C, 0x59}, {0x7C, 0x5B}, {0x7C, 0x5A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F7[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7C, 0xF4}, {0x7C, 0xF1}, {0x7E, 0x91}, {0x7F, 0x4F}, /* 0x40-0x43 */ + {0x7F, 0x87}, {0x81, 0xDE}, {0x82, 0x6B}, {0x86, 0x34}, /* 0x44-0x47 */ + {0x86, 0x35}, {0x86, 0x33}, {0x86, 0x2C}, {0x86, 0x32}, /* 0x48-0x4B */ + {0x86, 0x36}, {0x88, 0x2C}, {0x88, 0x28}, {0x88, 0x26}, /* 0x4C-0x4F */ + {0x88, 0x2A}, {0x88, 0x25}, {0x89, 0x71}, {0x89, 0xBF}, /* 0x50-0x53 */ + {0x89, 0xBE}, {0x89, 0xFB}, {0x8B, 0x7E}, {0x8B, 0x84}, /* 0x54-0x57 */ + {0x8B, 0x82}, {0x8B, 0x86}, {0x8B, 0x85}, {0x8B, 0x7F}, /* 0x58-0x5B */ + {0x8D, 0x15}, {0x8E, 0x95}, {0x8E, 0x94}, {0x8E, 0x9A}, /* 0x5C-0x5F */ + {0x8E, 0x92}, {0x8E, 0x90}, {0x8E, 0x96}, {0x8E, 0x97}, /* 0x60-0x63 */ + {0x8F, 0x60}, {0x8F, 0x62}, {0x91, 0x47}, {0x94, 0x4C}, /* 0x64-0x67 */ + {0x94, 0x50}, {0x94, 0x4A}, {0x94, 0x4B}, {0x94, 0x4F}, /* 0x68-0x6B */ + {0x94, 0x47}, {0x94, 0x45}, {0x94, 0x48}, {0x94, 0x49}, /* 0x6C-0x6F */ + {0x94, 0x46}, {0x97, 0x3F}, {0x97, 0xE3}, {0x98, 0x6A}, /* 0x70-0x73 */ + {0x98, 0x69}, {0x98, 0xCB}, {0x99, 0x54}, {0x99, 0x5B}, /* 0x74-0x77 */ + {0x9A, 0x4E}, {0x9A, 0x53}, {0x9A, 0x54}, {0x9A, 0x4C}, /* 0x78-0x7B */ + {0x9A, 0x4F}, {0x9A, 0x48}, {0x9A, 0x4A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9A, 0x49}, {0x9A, 0x52}, {0x9A, 0x50}, /* 0xA0-0xA3 */ + {0x9A, 0xD0}, {0x9B, 0x19}, {0x9B, 0x2B}, {0x9B, 0x3B}, /* 0xA4-0xA7 */ + {0x9B, 0x56}, {0x9B, 0x55}, {0x9C, 0x46}, {0x9C, 0x48}, /* 0xA8-0xAB */ + {0x9C, 0x3F}, {0x9C, 0x44}, {0x9C, 0x39}, {0x9C, 0x33}, /* 0xAC-0xAF */ + {0x9C, 0x41}, {0x9C, 0x3C}, {0x9C, 0x37}, {0x9C, 0x34}, /* 0xB0-0xB3 */ + {0x9C, 0x32}, {0x9C, 0x3D}, {0x9C, 0x36}, {0x9D, 0xDB}, /* 0xB4-0xB7 */ + {0x9D, 0xD2}, {0x9D, 0xDE}, {0x9D, 0xDA}, {0x9D, 0xCB}, /* 0xB8-0xBB */ + {0x9D, 0xD0}, {0x9D, 0xDC}, {0x9D, 0xD1}, {0x9D, 0xDF}, /* 0xBC-0xBF */ + {0x9D, 0xE9}, {0x9D, 0xD9}, {0x9D, 0xD8}, {0x9D, 0xD6}, /* 0xC0-0xC3 */ + {0x9D, 0xF5}, {0x9D, 0xD5}, {0x9D, 0xDD}, {0x9E, 0xB6}, /* 0xC4-0xC7 */ + {0x9E, 0xF0}, {0x9F, 0x35}, {0x9F, 0x33}, {0x9F, 0x32}, /* 0xC8-0xCB */ + {0x9F, 0x42}, {0x9F, 0x6B}, {0x9F, 0x95}, {0x9F, 0xA2}, /* 0xCC-0xCF */ + {0x51, 0x3D}, {0x52, 0x99}, {0x58, 0xE8}, {0x58, 0xE7}, /* 0xD0-0xD3 */ + {0x59, 0x72}, {0x5B, 0x4D}, {0x5D, 0xD8}, {0x88, 0x2F}, /* 0xD4-0xD7 */ + {0x5F, 0x4F}, {0x62, 0x01}, {0x62, 0x03}, {0x62, 0x04}, /* 0xD8-0xDB */ + {0x65, 0x29}, {0x65, 0x25}, {0x65, 0x96}, {0x66, 0xEB}, /* 0xDC-0xDF */ + {0x6B, 0x11}, {0x6B, 0x12}, {0x6B, 0x0F}, {0x6B, 0xCA}, /* 0xE0-0xE3 */ + {0x70, 0x5B}, {0x70, 0x5A}, {0x72, 0x22}, {0x73, 0x82}, /* 0xE4-0xE7 */ + {0x73, 0x81}, {0x73, 0x83}, {0x76, 0x70}, {0x77, 0xD4}, /* 0xE8-0xEB */ + {0x7C, 0x67}, {0x7C, 0x66}, {0x7E, 0x95}, {0x82, 0x6C}, /* 0xEC-0xEF */ + {0x86, 0x3A}, {0x86, 0x40}, {0x86, 0x39}, {0x86, 0x3C}, /* 0xF0-0xF3 */ + {0x86, 0x31}, {0x86, 0x3B}, {0x86, 0x3E}, {0x88, 0x30}, /* 0xF4-0xF7 */ + {0x88, 0x32}, {0x88, 0x2E}, {0x88, 0x33}, {0x89, 0x76}, /* 0xF8-0xFB */ + {0x89, 0x74}, {0x89, 0x73}, {0x89, 0xFE}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F8[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x8B, 0x8C}, {0x8B, 0x8E}, {0x8B, 0x8B}, {0x8B, 0x88}, /* 0x40-0x43 */ + {0x8C, 0x45}, {0x8D, 0x19}, {0x8E, 0x98}, {0x8F, 0x64}, /* 0x44-0x47 */ + {0x8F, 0x63}, {0x91, 0xBC}, {0x94, 0x62}, {0x94, 0x55}, /* 0x48-0x4B */ + {0x94, 0x5D}, {0x94, 0x57}, {0x94, 0x5E}, {0x97, 0xC4}, /* 0x4C-0x4F */ + {0x97, 0xC5}, {0x98, 0x00}, {0x9A, 0x56}, {0x9A, 0x59}, /* 0x50-0x53 */ + {0x9B, 0x1E}, {0x9B, 0x1F}, {0x9B, 0x20}, {0x9C, 0x52}, /* 0x54-0x57 */ + {0x9C, 0x58}, {0x9C, 0x50}, {0x9C, 0x4A}, {0x9C, 0x4D}, /* 0x58-0x5B */ + {0x9C, 0x4B}, {0x9C, 0x55}, {0x9C, 0x59}, {0x9C, 0x4C}, /* 0x5C-0x5F */ + {0x9C, 0x4E}, {0x9D, 0xFB}, {0x9D, 0xF7}, {0x9D, 0xEF}, /* 0x60-0x63 */ + {0x9D, 0xE3}, {0x9D, 0xEB}, {0x9D, 0xF8}, {0x9D, 0xE4}, /* 0x64-0x67 */ + {0x9D, 0xF6}, {0x9D, 0xE1}, {0x9D, 0xEE}, {0x9D, 0xE6}, /* 0x68-0x6B */ + {0x9D, 0xF2}, {0x9D, 0xF0}, {0x9D, 0xE2}, {0x9D, 0xEC}, /* 0x6C-0x6F */ + {0x9D, 0xF4}, {0x9D, 0xF3}, {0x9D, 0xE8}, {0x9D, 0xED}, /* 0x70-0x73 */ + {0x9E, 0xC2}, {0x9E, 0xD0}, {0x9E, 0xF2}, {0x9E, 0xF3}, /* 0x74-0x77 */ + {0x9F, 0x06}, {0x9F, 0x1C}, {0x9F, 0x38}, {0x9F, 0x37}, /* 0x78-0x7B */ + {0x9F, 0x36}, {0x9F, 0x43}, {0x9F, 0x4F}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9F, 0x71}, {0x9F, 0x70}, {0x9F, 0x6E}, /* 0xA0-0xA3 */ + {0x9F, 0x6F}, {0x56, 0xD3}, {0x56, 0xCD}, {0x5B, 0x4E}, /* 0xA4-0xA7 */ + {0x5C, 0x6D}, {0x65, 0x2D}, {0x66, 0xED}, {0x66, 0xEE}, /* 0xA8-0xAB */ + {0x6B, 0x13}, {0x70, 0x5F}, {0x70, 0x61}, {0x70, 0x5D}, /* 0xAC-0xAF */ + {0x70, 0x60}, {0x72, 0x23}, {0x74, 0xDB}, {0x74, 0xE5}, /* 0xB0-0xB3 */ + {0x77, 0xD5}, {0x79, 0x38}, {0x79, 0xB7}, {0x79, 0xB6}, /* 0xB4-0xB7 */ + {0x7C, 0x6A}, {0x7E, 0x97}, {0x7F, 0x89}, {0x82, 0x6D}, /* 0xB8-0xBB */ + {0x86, 0x43}, {0x88, 0x38}, {0x88, 0x37}, {0x88, 0x35}, /* 0xBC-0xBF */ + {0x88, 0x4B}, {0x8B, 0x94}, {0x8B, 0x95}, {0x8E, 0x9E}, /* 0xC0-0xC3 */ + {0x8E, 0x9F}, {0x8E, 0xA0}, {0x8E, 0x9D}, {0x91, 0xBE}, /* 0xC4-0xC7 */ + {0x91, 0xBD}, {0x91, 0xC2}, {0x94, 0x6B}, {0x94, 0x68}, /* 0xC8-0xCB */ + {0x94, 0x69}, {0x96, 0xE5}, {0x97, 0x46}, {0x97, 0x43}, /* 0xCC-0xCF */ + {0x97, 0x47}, {0x97, 0xC7}, {0x97, 0xE5}, {0x9A, 0x5E}, /* 0xD0-0xD3 */ + {0x9A, 0xD5}, {0x9B, 0x59}, {0x9C, 0x63}, {0x9C, 0x67}, /* 0xD4-0xD7 */ + {0x9C, 0x66}, {0x9C, 0x62}, {0x9C, 0x5E}, {0x9C, 0x60}, /* 0xD8-0xDB */ + {0x9E, 0x02}, {0x9D, 0xFE}, {0x9E, 0x07}, {0x9E, 0x03}, /* 0xDC-0xDF */ + {0x9E, 0x06}, {0x9E, 0x05}, {0x9E, 0x00}, {0x9E, 0x01}, /* 0xE0-0xE3 */ + {0x9E, 0x09}, {0x9D, 0xFF}, {0x9D, 0xFD}, {0x9E, 0x04}, /* 0xE4-0xE7 */ + {0x9E, 0xA0}, {0x9F, 0x1E}, {0x9F, 0x46}, {0x9F, 0x74}, /* 0xE8-0xEB */ + {0x9F, 0x75}, {0x9F, 0x76}, {0x56, 0xD4}, {0x65, 0x2E}, /* 0xEC-0xEF */ + {0x65, 0xB8}, {0x6B, 0x18}, {0x6B, 0x19}, {0x6B, 0x17}, /* 0xF0-0xF3 */ + {0x6B, 0x1A}, {0x70, 0x62}, {0x72, 0x26}, {0x72, 0xAA}, /* 0xF4-0xF7 */ + {0x77, 0xD8}, {0x77, 0xD9}, {0x79, 0x39}, {0x7C, 0x69}, /* 0xF8-0xFB */ + {0x7C, 0x6B}, {0x7C, 0xF6}, {0x7E, 0x9A}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode c2u_F9[256] = { + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x00-0x03 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x04-0x07 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x08-0x0B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x0C-0x0F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x10-0x13 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x14-0x17 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x18-0x1B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x1C-0x1F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x20-0x23 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x24-0x27 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x28-0x2B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x2C-0x2F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x30-0x33 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x34-0x37 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x38-0x3B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x3C-0x3F */ + {0x7E, 0x98}, {0x7E, 0x9B}, {0x7E, 0x99}, {0x81, 0xE0}, /* 0x40-0x43 */ + {0x81, 0xE1}, {0x86, 0x46}, {0x86, 0x47}, {0x86, 0x48}, /* 0x44-0x47 */ + {0x89, 0x79}, {0x89, 0x7A}, {0x89, 0x7C}, {0x89, 0x7B}, /* 0x48-0x4B */ + {0x89, 0xFF}, {0x8B, 0x98}, {0x8B, 0x99}, {0x8E, 0xA5}, /* 0x4C-0x4F */ + {0x8E, 0xA4}, {0x8E, 0xA3}, {0x94, 0x6E}, {0x94, 0x6D}, /* 0x50-0x53 */ + {0x94, 0x6F}, {0x94, 0x71}, {0x94, 0x73}, {0x97, 0x49}, /* 0x54-0x57 */ + {0x98, 0x72}, {0x99, 0x5F}, {0x9C, 0x68}, {0x9C, 0x6E}, /* 0x58-0x5B */ + {0x9C, 0x6D}, {0x9E, 0x0B}, {0x9E, 0x0D}, {0x9E, 0x10}, /* 0x5C-0x5F */ + {0x9E, 0x0F}, {0x9E, 0x12}, {0x9E, 0x11}, {0x9E, 0xA1}, /* 0x60-0x63 */ + {0x9E, 0xF5}, {0x9F, 0x09}, {0x9F, 0x47}, {0x9F, 0x78}, /* 0x64-0x67 */ + {0x9F, 0x7B}, {0x9F, 0x7A}, {0x9F, 0x79}, {0x57, 0x1E}, /* 0x68-0x6B */ + {0x70, 0x66}, {0x7C, 0x6F}, {0x88, 0x3C}, {0x8D, 0xB2}, /* 0x6C-0x6F */ + {0x8E, 0xA6}, {0x91, 0xC3}, {0x94, 0x74}, {0x94, 0x78}, /* 0x70-0x73 */ + {0x94, 0x76}, {0x94, 0x75}, {0x9A, 0x60}, {0x9C, 0x74}, /* 0x74-0x77 */ + {0x9C, 0x73}, {0x9C, 0x71}, {0x9C, 0x75}, {0x9E, 0x14}, /* 0x78-0x7B */ + {0x9E, 0x13}, {0x9E, 0xF6}, {0x9F, 0x0A}, {0x00, 0x3F}, /* 0x7C-0x7F */ + + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x80-0x83 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x84-0x87 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x88-0x8B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x8C-0x8F */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x90-0x93 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x94-0x97 */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x98-0x9B */ + {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, {0x00, 0x3F}, /* 0x9C-0x9F */ + {0x00, 0x3F}, {0x9F, 0xA4}, {0x70, 0x68}, {0x70, 0x65}, /* 0xA0-0xA3 */ + {0x7C, 0xF7}, {0x86, 0x6A}, {0x88, 0x3E}, {0x88, 0x3D}, /* 0xA4-0xA7 */ + {0x88, 0x3F}, {0x8B, 0x9E}, {0x8C, 0x9C}, {0x8E, 0xA9}, /* 0xA8-0xAB */ + {0x8E, 0xC9}, {0x97, 0x4B}, {0x98, 0x73}, {0x98, 0x74}, /* 0xAC-0xAF */ + {0x98, 0xCC}, {0x99, 0x61}, {0x99, 0xAB}, {0x9A, 0x64}, /* 0xB0-0xB3 */ + {0x9A, 0x66}, {0x9A, 0x67}, {0x9B, 0x24}, {0x9E, 0x15}, /* 0xB4-0xB7 */ + {0x9E, 0x17}, {0x9F, 0x48}, {0x62, 0x07}, {0x6B, 0x1E}, /* 0xB8-0xBB */ + {0x72, 0x27}, {0x86, 0x4C}, {0x8E, 0xA8}, {0x94, 0x82}, /* 0xBC-0xBF */ + {0x94, 0x80}, {0x94, 0x81}, {0x9A, 0x69}, {0x9A, 0x68}, /* 0xC0-0xC3 */ + {0x9B, 0x2E}, {0x9E, 0x19}, {0x72, 0x29}, {0x86, 0x4B}, /* 0xC4-0xC7 */ + {0x8B, 0x9F}, {0x94, 0x83}, {0x9C, 0x79}, {0x9E, 0xB7}, /* 0xC8-0xCB */ + {0x76, 0x75}, {0x9A, 0x6B}, {0x9C, 0x7A}, {0x9E, 0x1D}, /* 0xCC-0xCF */ + {0x70, 0x69}, {0x70, 0x6A}, {0x9E, 0xA4}, {0x9F, 0x7E}, /* 0xD0-0xD3 */ + {0x9F, 0x49}, {0x9F, 0x98}, {0x78, 0x81}, {0x92, 0xB9}, /* 0xD4-0xD7 */ + {0x88, 0xCF}, {0x58, 0xBB}, {0x60, 0x52}, {0x7C, 0xA7}, /* 0xD8-0xDB */ + {0x5A, 0xFA}, {0x25, 0x54}, {0x25, 0x66}, {0x25, 0x57}, /* 0xDC-0xDF */ + {0x25, 0x60}, {0x25, 0x6C}, {0x25, 0x63}, {0x25, 0x5A}, /* 0xE0-0xE3 */ + {0x25, 0x69}, {0x25, 0x5D}, {0x25, 0x52}, {0x25, 0x64}, /* 0xE4-0xE7 */ + {0x25, 0x55}, {0x25, 0x5E}, {0x25, 0x6A}, {0x25, 0x61}, /* 0xE8-0xEB */ + {0x25, 0x58}, {0x25, 0x67}, {0x25, 0x5B}, {0x25, 0x53}, /* 0xEC-0xEF */ + {0x25, 0x65}, {0x25, 0x56}, {0x25, 0x5F}, {0x25, 0x6B}, /* 0xF0-0xF3 */ + {0x25, 0x62}, {0x25, 0x59}, {0x25, 0x68}, {0x25, 0x5C}, /* 0xF4-0xF7 */ + {0x25, 0x51}, {0x25, 0x50}, {0x25, 0x6D}, {0x25, 0x6E}, /* 0xF8-0xFB */ + {0x25, 0x70}, {0x25, 0x6F}, {0x25, 0x93}, {0x00, 0x3F}, /* 0xFC-0xFF */ +}; + +static struct nls_unicode *page_charset2uni[256] = { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, c2u_A1, c2u_A2, c2u_A3, c2u_A4, c2u_A5, c2u_A6, c2u_A7, + c2u_A8, c2u_A9, c2u_AA, c2u_AB, c2u_AC, c2u_AD, c2u_AE, c2u_AF, + c2u_B0, c2u_B1, c2u_B2, c2u_B3, c2u_B4, c2u_B5, c2u_B6, c2u_B7, + c2u_B8, c2u_B9, c2u_BA, c2u_BB, c2u_BC, c2u_BD, c2u_BE, c2u_BF, + c2u_C0, c2u_C1, c2u_C2, c2u_C3, c2u_C4, c2u_C5, c2u_C6, NULL, + NULL, c2u_C9, c2u_CA, c2u_CB, c2u_CC, c2u_CD, c2u_CE, c2u_CF, + c2u_D0, c2u_D1, c2u_D2, c2u_D3, c2u_D4, c2u_D5, c2u_D6, c2u_D7, + c2u_D8, c2u_D9, c2u_DA, c2u_DB, c2u_DC, c2u_DD, c2u_DE, c2u_DF, + c2u_E0, c2u_E1, c2u_E2, c2u_E3, c2u_E4, c2u_E5, c2u_E6, c2u_E7, + c2u_E8, c2u_E9, c2u_EA, c2u_EB, c2u_EC, c2u_ED, c2u_EE, c2u_EF, + c2u_F0, c2u_F1, c2u_F2, c2u_F3, c2u_F4, c2u_F5, c2u_F6, c2u_F7, + c2u_F8, c2u_F9, NULL, NULL, NULL, NULL, NULL, NULL, +}; + +static unsigned char u2c_02[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA3, 0xBE, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xA3, 0xBC, 0xA3, 0xBD, 0xA3, 0xBF, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xA1, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xA3, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_03[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xA3, 0x44, 0xA3, 0x45, 0xA3, 0x46, /* 0x90-0x93 */ + 0xA3, 0x47, 0xA3, 0x48, 0xA3, 0x49, 0xA3, 0x4A, /* 0x94-0x97 */ + 0xA3, 0x4B, 0xA3, 0x4C, 0xA3, 0x4D, 0xA3, 0x4E, /* 0x98-0x9B */ + 0xA3, 0x4F, 0xA3, 0x50, 0xA3, 0x51, 0xA3, 0x52, /* 0x9C-0x9F */ + 0xA3, 0x53, 0xA3, 0x54, 0x3F, 0x3F, 0xA3, 0x55, /* 0xA0-0xA3 */ + 0xA3, 0x56, 0xA3, 0x57, 0xA3, 0x58, 0xA3, 0x59, /* 0xA4-0xA7 */ + 0xA3, 0x5A, 0xA3, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xA3, 0x5C, 0xA3, 0x5D, 0xA3, 0x5E, /* 0xB0-0xB3 */ + 0xA3, 0x5F, 0xA3, 0x60, 0xA3, 0x61, 0xA3, 0x62, /* 0xB4-0xB7 */ + 0xA3, 0x63, 0xA3, 0x64, 0xA3, 0x65, 0xA3, 0x66, /* 0xB8-0xBB */ + 0xA3, 0x67, 0xA3, 0x68, 0xA3, 0x69, 0xA3, 0x6A, /* 0xBC-0xBF */ + 0xA3, 0x6B, 0xA3, 0x6C, 0x3F, 0x3F, 0xA3, 0x6D, /* 0xC0-0xC3 */ + 0xA3, 0x6E, 0xA3, 0x6F, 0xA3, 0x70, 0xA3, 0x71, /* 0xC4-0xC7 */ + 0xA3, 0x72, 0xA3, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_20[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0x56, /* 0x10-0x13 */ + 0xA1, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xA1, 0xA5, 0xA1, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xA1, 0xA7, 0xA1, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xA1, 0x4C, 0xA1, 0x4B, 0xA1, 0x45, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xAC, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xA1, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xB0, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_21[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0x4A, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA1, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xA2, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA2, 0xB9, 0xA2, 0xBA, 0xA2, 0xBB, 0xA2, 0xBC, /* 0x60-0x63 */ + 0xA2, 0xBD, 0xA2, 0xBE, 0xA2, 0xBF, 0xA2, 0xC0, /* 0x64-0x67 */ + 0xA2, 0xC1, 0xA2, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xA1, 0xF6, 0xA1, 0xF4, 0xA1, 0xF7, 0xA1, 0xF5, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xF8, 0xA1, 0xF9, /* 0x94-0x97 */ + 0xA1, 0xFB, 0xA1, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_22[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xA2, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD4, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xDB, 0xA1, 0xE8, /* 0x1C-0x1F */ + 0xA1, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xFD, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xA1, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xA1, 0xE4, 0xA1, 0xE5, 0xA1, 0xEC, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xED, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xA1, 0xEF, 0xA1, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xDC, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA1, 0xDA, 0xA1, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xD8, 0xA1, 0xD9, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xA1, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xA1, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xA1, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xE9, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_25[512] = { + 0xA2, 0x77, 0x3F, 0x3F, 0xA2, 0x78, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xA2, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xA2, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xA2, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xA2, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xA2, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xA2, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xA2, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xA2, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xA2, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF9, 0xF9, 0xF9, 0xF8, 0xF9, 0xE6, 0xF9, 0xEF, /* 0x50-0x53 */ + 0xF9, 0xDD, 0xF9, 0xE8, 0xF9, 0xF1, 0xF9, 0xDF, /* 0x54-0x57 */ + 0xF9, 0xEC, 0xF9, 0xF5, 0xF9, 0xE3, 0xF9, 0xEE, /* 0x58-0x5B */ + 0xF9, 0xF7, 0xF9, 0xE5, 0xF9, 0xE9, 0xF9, 0xF2, /* 0x5C-0x5F */ + 0xF9, 0xE0, 0xF9, 0xEB, 0xF9, 0xF4, 0xF9, 0xE2, /* 0x60-0x63 */ + 0xF9, 0xE7, 0xF9, 0xF0, 0xF9, 0xDE, 0xF9, 0xED, /* 0x64-0x67 */ + 0xF9, 0xF6, 0xF9, 0xE4, 0xF9, 0xEA, 0xF9, 0xF3, /* 0x68-0x6B */ + 0xF9, 0xE1, 0xF9, 0xFA, 0xF9, 0xFB, 0xF9, 0xFD, /* 0x6C-0x6F */ + 0xF9, 0xFC, 0xA2, 0xAC, 0xA2, 0xAD, 0xA2, 0xAE, /* 0x70-0x73 */ + 0xA1, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xA2, 0x62, 0xA2, 0x63, 0xA2, 0x64, /* 0x80-0x83 */ + 0xA2, 0x65, 0xA2, 0x66, 0xA2, 0x67, 0xA2, 0x68, /* 0x84-0x87 */ + 0xA2, 0x69, 0xA2, 0x70, 0xA2, 0x6F, 0xA2, 0x6E, /* 0x88-0x8B */ + 0xA2, 0x6D, 0xA2, 0x6C, 0xA2, 0x6B, 0xA2, 0x6A, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xFE, /* 0x90-0x93 */ + 0xA2, 0x76, 0xA2, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xA1, 0xBD, 0xA1, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xB6, 0xA1, 0xB5, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xA1, 0xBF, 0xA1, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xBB, 0xA1, 0xBA, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xB3, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xB7, 0xA1, 0xB4, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0xA8, 0xA2, 0xA9, /* 0xE0-0xE3 */ + 0xA2, 0xAB, 0xA2, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_26[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA1, 0xB9, 0xA1, 0xB8, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xA1, 0xF0, 0x3F, 0x3F, 0xA1, 0xF1, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_30[512] = { + 0xA1, 0x40, 0xA1, 0x42, 0xA1, 0x43, 0xA1, 0xB2, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xA1, 0x71, 0xA1, 0x72, 0xA1, 0x6D, 0xA1, 0x6E, /* 0x08-0x0B */ + 0xA1, 0x75, 0xA1, 0x76, 0xA1, 0x79, 0xA1, 0x7A, /* 0x0C-0x0F */ + 0xA1, 0x69, 0xA1, 0x6A, 0xA2, 0x45, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xA1, 0x65, 0xA1, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xA1, 0xA9, 0xA1, 0xAA, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xA2, 0xC3, 0xA2, 0xC4, 0xA2, 0xC5, /* 0x20-0x23 */ + 0xA2, 0xC6, 0xA2, 0xC7, 0xA2, 0xC8, 0xA2, 0xC9, /* 0x24-0x27 */ + 0xA2, 0xCA, 0xA2, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_31[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA3, 0x74, 0xA3, 0x75, 0xA3, 0x76, /* 0x04-0x07 */ + 0xA3, 0x77, 0xA3, 0x78, 0xA3, 0x79, 0xA3, 0x7A, /* 0x08-0x0B */ + 0xA3, 0x7B, 0xA3, 0x7C, 0xA3, 0x7D, 0xA3, 0x7E, /* 0x0C-0x0F */ + 0xA3, 0xA1, 0xA3, 0xA2, 0xA3, 0xA3, 0xA3, 0xA4, /* 0x10-0x13 */ + 0xA3, 0xA5, 0xA3, 0xA6, 0xA3, 0xA7, 0xA3, 0xA8, /* 0x14-0x17 */ + 0xA3, 0xA9, 0xA3, 0xAA, 0xA3, 0xAB, 0xA3, 0xAC, /* 0x18-0x1B */ + 0xA3, 0xAD, 0xA3, 0xAE, 0xA3, 0xAF, 0xA3, 0xB0, /* 0x1C-0x1F */ + 0xA3, 0xB1, 0xA3, 0xB2, 0xA3, 0xB3, 0xA3, 0xB4, /* 0x20-0x23 */ + 0xA3, 0xB5, 0xA3, 0xB6, 0xA3, 0xB7, 0xA3, 0xB8, /* 0x24-0x27 */ + 0xA3, 0xB9, 0xA3, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_32[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xC0, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_33[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0x55, 0xA2, 0x56, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xA2, 0x50, 0xA2, 0x51, 0xA2, 0x52, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xA2, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xA2, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA2, 0x53, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xA1, 0xEB, 0xA1, 0xEA, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xA2, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_4E[512] = { + 0xA4, 0x40, 0xA4, 0x42, 0x3F, 0x3F, 0xA4, 0x43, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0x45, /* 0x04-0x07 */ + 0xA4, 0x56, 0xA4, 0x54, 0xA4, 0x57, 0xA4, 0x55, /* 0x08-0x0B */ + 0xC9, 0x46, 0xA4, 0xA3, 0xC9, 0x4F, 0xC9, 0x4D, /* 0x0C-0x0F */ + 0xA4, 0xA2, 0xA4, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xA5, 0x42, 0xA5, 0x41, 0xA5, 0x40, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xA5, 0x43, 0xA4, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0xE0, 0xA5, 0xE1, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xC3, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0x58, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xA4, 0xA4, 0xC9, 0x50, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xA4, 0xA5, 0xC9, 0x63, 0xA6, 0xEA, 0xCB, 0xB1, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xA4, 0x59, 0xA4, 0xA6, 0x3F, 0x3F, 0xA5, 0x44, /* 0x38-0x3B */ + 0xC9, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0x40, 0xA4, 0x44, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xA4, 0x5B, 0x3F, 0x3F, 0xC9, 0x47, /* 0x44-0x47 */ + 0xA4, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xA7, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xA5, 0x45, 0xA5, 0x47, 0xA5, 0x46, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0xE2, 0xA5, 0xE3, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xC4, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xAD, 0xBC, 0xA4, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xC9, 0x41, 0xA4, 0x45, 0xA4, 0x5E, 0xA4, 0x5D, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xA5, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xC5, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xAE, 0xD4, 0x4B, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xC3, 0xDC, 0xB1, /* 0x80-0x83 */ + 0xDC, 0xB2, 0x3F, 0x3F, 0xA4, 0x46, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xA4, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xC6, /* 0x88-0x8B */ + 0xA4, 0x47, 0xC9, 0x48, 0xA4, 0x5F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xA4, 0xAA, 0xA4, 0xAC, 0xC9, 0x51, /* 0x90-0x93 */ + 0xA4, 0xAD, 0xA4, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xA5, 0xE5, 0x3F, 0x3F, 0xA8, 0xC7, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xC8, 0xAB, 0x45, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xA4, 0x60, 0xA4, 0xAE, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xA5, 0xE6, 0xA5, 0xE8, 0xA5, 0xE7, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xA6, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xC9, /* 0xA8-0xAB */ + 0xA8, 0xCA, 0xAB, 0x46, 0xAB, 0x47, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xBD, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xB3, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xF6, 0xD6, 0xA4, 0x48, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xA4, 0xB0, 0xA4, 0xAF, 0xC9, 0x52, 0xA4, 0xB1, /* 0xC0-0xC3 */ + 0xA4, 0xB7, 0x3F, 0x3F, 0xA4, 0xB2, 0xA4, 0xB3, /* 0xC4-0xC7 */ + 0xC9, 0x54, 0xC9, 0x53, 0xA4, 0xB5, 0xA4, 0xB6, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xA4, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xA5, 0x4A, 0xA5, 0x4B, 0xA5, 0x4C, 0xA5, 0x4D, /* 0xD4-0xD7 */ + 0xA5, 0x49, 0xA5, 0x50, 0xC9, 0x6A, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xC9, 0x66, 0xC9, 0x69, 0xA5, 0x51, 0xA5, 0x61, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xC9, 0x68, 0x3F, 0x3F, 0xA5, 0x4E, /* 0xE0-0xE3 */ + 0xA5, 0x4F, 0xA5, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xC9, 0x65, 0xC9, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xA5, 0xF5, 0xC9, 0xB0, 0xA5, 0xF2, 0xA5, 0xF6, /* 0xF0-0xF3 */ + 0xC9, 0xBA, 0xC9, 0xAE, 0xA5, 0xF3, 0xC9, 0xB2, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0xF4, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xA5, 0xF7, 0x3F, 0x3F, 0xA5, 0xE9, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_4F[512] = { + 0xC9, 0xB1, 0xA5, 0xF8, 0xC9, 0xB5, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xC9, 0xB9, 0xC9, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xC9, 0xB3, 0xA5, 0xEA, 0xA5, 0xEC, 0xA5, 0xF9, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xA5, 0xEE, 0xC9, 0xAB, 0xA5, 0xF1, /* 0x0C-0x0F */ + 0xA5, 0xEF, 0xA5, 0xF0, 0xC9, 0xBB, 0xC9, 0xB8, /* 0x10-0x13 */ + 0xC9, 0xAF, 0xA5, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xC9, 0xAC, 0xA5, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xC9, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0xB7, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xC9, 0xAD, 0xCA, 0x66, 0x3F, 0x3F, 0xA7, 0x42, /* 0x2C-0x2F */ + 0xA6, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0x67, /* 0x30-0x33 */ + 0xA6, 0xF1, 0x3F, 0x3F, 0xA7, 0x44, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xA6, 0xF9, 0x3F, 0x3F, 0xA6, 0xF8, 0xCA, 0x5B, /* 0x38-0x3B */ + 0xA6, 0xFC, 0xA6, 0xF7, 0xCA, 0x60, 0xCA, 0x68, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xCA, 0x64, 0x3F, 0x3F, 0xA6, 0xFA, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0xFD, 0xA6, 0xEE, /* 0x44-0x47 */ + 0xA7, 0x47, 0xCA, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xCB, 0xBD, 0xA6, 0xEC, 0xA7, 0x43, 0xA6, 0xED, /* 0x4C-0x4F */ + 0xA6, 0xF5, 0xA6, 0xF6, 0xCA, 0x62, 0xCA, 0x5E, /* 0x50-0x53 */ + 0xA6, 0xFB, 0xA6, 0xF3, 0xCA, 0x5A, 0xA6, 0xEF, /* 0x54-0x57 */ + 0xCA, 0x65, 0xA7, 0x45, 0xA7, 0x48, 0xA6, 0xF2, /* 0x58-0x5B */ + 0xA7, 0x40, 0xA7, 0x46, 0xA6, 0xF0, 0xCA, 0x63, /* 0x5C-0x5F */ + 0xA7, 0x41, 0xCA, 0x69, 0xCA, 0x5C, 0xA6, 0xFE, /* 0x60-0x63 */ + 0xCA, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0x61, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xA8, 0xD8, 0xCB, 0xBF, 0xCB, 0xCB, /* 0x68-0x6B */ + 0xA8, 0xD0, 0x3F, 0x3F, 0xCB, 0xCC, 0xA8, 0xCB, /* 0x6C-0x6F */ + 0xA8, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xCE, /* 0x70-0x73 */ + 0xCB, 0xB9, 0xA8, 0xD6, 0xCB, 0xB8, 0xCB, 0xBC, /* 0x74-0x77 */ + 0xCB, 0xC3, 0xCB, 0xC1, 0xA8, 0xDE, 0xA8, 0xD9, /* 0x78-0x7B */ + 0xCB, 0xB3, 0xCB, 0xB5, 0xA8, 0xDB, 0xA8, 0xCF, /* 0x7C-0x7F */ + + 0xCB, 0xB6, 0xCB, 0xC2, 0xCB, 0xC9, 0xA8, 0xD4, /* 0x80-0x83 */ + 0xCB, 0xBB, 0xCB, 0xB4, 0xA8, 0xD3, 0xCB, 0xB7, /* 0x84-0x87 */ + 0xA8, 0xD7, 0xCB, 0xBA, 0x3F, 0x3F, 0xA8, 0xD2, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xA8, 0xCD, 0x3F, 0x3F, 0xA8, 0xDC, /* 0x8C-0x8F */ + 0xCB, 0xC4, 0xA8, 0xDD, 0xCB, 0xC8, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xCB, 0xC6, 0xCB, 0xCA, 0xA8, 0xDA, 0xCB, 0xBE, /* 0x94-0x97 */ + 0xCB, 0xB2, 0x3F, 0x3F, 0xCB, 0xC0, 0xA8, 0xD1, /* 0x98-0x9B */ + 0xCB, 0xC5, 0xA8, 0xCC, 0xCB, 0xC7, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0x56, 0xAB, 0x4A, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xE0, 0xCD, 0xE8, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xAB, 0x49, 0xAB, 0x51, 0xAB, 0x5D, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xCD, 0xEE, 0xCD, 0xEC, 0xCD, 0xE7, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0x4B, /* 0xBC-0xBF */ + 0xCD, 0xED, 0xCD, 0xE3, 0xAB, 0x59, 0xAB, 0x50, /* 0xC0-0xC3 */ + 0xAB, 0x58, 0xCD, 0xDE, 0x3F, 0x3F, 0xCD, 0xEA, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xCD, 0xE1, 0xAB, 0x54, 0xCD, 0xE2, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xCD, 0xDD, 0xAB, 0x5B, 0xAB, 0x4E, /* 0xCC-0xCF */ + 0xAB, 0x57, 0xAB, 0x4D, 0x3F, 0x3F, 0xCD, 0xDF, /* 0xD0-0xD3 */ + 0xCD, 0xE4, 0x3F, 0x3F, 0xCD, 0xEB, 0xAB, 0x55, /* 0xD4-0xD7 */ + 0xAB, 0x52, 0xCD, 0xE6, 0xAB, 0x5A, 0xCD, 0xE9, /* 0xD8-0xDB */ + 0xCD, 0xE5, 0xAB, 0x4F, 0xAB, 0x5C, 0xAB, 0x53, /* 0xDC-0xDF */ + 0xAB, 0x4C, 0xAB, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xCD, 0xEF, 0x3F, 0x3F, 0xAD, 0xD7, 0xAD, 0xC1, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xAD, 0xD1, 0x3F, 0x3F, 0xAD, 0xD6, /* 0xF0-0xF3 */ + 0xD0, 0xD0, 0xD0, 0xCF, 0xD0, 0xD4, 0xD0, 0xD5, /* 0xF4-0xF7 */ + 0xAD, 0xC4, 0x3F, 0x3F, 0xAD, 0xCD, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xDA, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_50[512] = { + 0xAD, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xD0, 0xC9, 0xAD, 0xC7, 0xD0, 0xCA, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xAD, 0xDC, 0x3F, 0x3F, 0xAD, 0xD3, /* 0x08-0x0B */ + 0xAD, 0xBE, 0xAD, 0xBF, 0xD0, 0xDD, 0xB0, 0xBF, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xAD, 0xCC, 0xAD, 0xCB, 0xD0, 0xCB, /* 0x10-0x13 */ + 0xAD, 0xCF, 0xD4, 0x5B, 0xAD, 0xC6, 0xD0, 0xD6, /* 0x14-0x17 */ + 0xAD, 0xD5, 0xAD, 0xD4, 0xAD, 0xCA, 0xD0, 0xCE, /* 0x18-0x1B */ + 0xD0, 0xD7, 0x3F, 0x3F, 0xD0, 0xC8, 0xAD, 0xC9, /* 0x1C-0x1F */ + 0xD0, 0xD8, 0xAD, 0xD2, 0xD0, 0xCC, 0xAD, 0xC0, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xAD, 0xC3, 0xAD, 0xC2, 0xD0, 0xD9, /* 0x24-0x27 */ + 0xAD, 0xD0, 0xAD, 0xC5, 0xAD, 0xD9, 0xAD, 0xDB, /* 0x28-0x2B */ + 0xD0, 0xD3, 0xAD, 0xD8, 0x3F, 0x3F, 0xD0, 0xDB, /* 0x2C-0x2F */ + 0xD0, 0xCD, 0xD0, 0xDC, 0x3F, 0x3F, 0xD0, 0xD1, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xD0, 0xDA, 0x3F, 0x3F, 0xD0, 0xD2, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xAD, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xD4, 0x63, 0xD4, 0x57, 0x3F, 0x3F, 0xB0, 0xB3, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xD4, 0x5C, 0xD4, 0x62, 0xB0, 0xB2, /* 0x44-0x47 */ + 0xD4, 0x55, 0xB0, 0xB6, 0xD4, 0x59, 0xD4, 0x52, /* 0x48-0x4B */ + 0xB0, 0xB4, 0xD4, 0x56, 0xB0, 0xB9, 0xB0, 0xBE, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xD4, 0x67, 0x3F, 0x3F, 0xD4, 0x51, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xB0, 0xBA, 0x3F, 0x3F, 0xD4, 0x66, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xB5, 0xD4, 0x58, /* 0x58-0x5B */ + 0xB0, 0xB1, 0xD4, 0x53, 0xD4, 0x4F, 0xD4, 0x5D, /* 0x5C-0x5F */ + 0xD4, 0x50, 0xD4, 0x4E, 0xD4, 0x5A, 0xD4, 0x60, /* 0x60-0x63 */ + 0xD4, 0x61, 0xB0, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xD8, 0x5B, 0xD4, 0x5E, 0xD4, 0x4D, 0xD4, 0x5F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xB0, 0xC1, 0xD4, 0x64, 0xB0, 0xC0, /* 0x6C-0x6F */ + 0xD4, 0x4C, 0x3F, 0x3F, 0xD4, 0x54, 0xD4, 0x65, /* 0x70-0x73 */ + 0xB0, 0xBC, 0xB0, 0xBB, 0xB0, 0xB8, 0xB0, 0xBD, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xAF, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xB0, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xB3, 0xC8, 0x3F, 0x3F, 0xD8, 0x5E, 0xD8, 0x57, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xB3, 0xC5, 0x3F, 0x3F, 0xD8, 0x5F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0x55, /* 0x88-0x8B */ + 0xD8, 0x58, 0xB3, 0xC4, 0xD8, 0x59, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xB3, 0xC7, 0xD8, 0x5D, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xD8, 0x53, 0xD8, 0x52, 0xB3, 0xC9, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xB3, 0xCA, 0xB3, 0xC6, 0xB3, 0xCB, 0xD8, 0x51, /* 0x98-0x9B */ + 0xD8, 0x5C, 0xD8, 0x5A, 0xD8, 0x54, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xC3, 0xD8, 0x56, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xB6, 0xCA, 0xB6, 0xC4, 0xDC, 0xB7, 0xB6, 0xCD, /* 0xAC-0xAF */ + 0xDC, 0xBD, 0xDC, 0xC0, 0xB6, 0xC6, 0xB6, 0xC7, /* 0xB0-0xB3 */ + 0xDC, 0xBA, 0xB6, 0xC5, 0xDC, 0xC3, 0xB6, 0xCB, /* 0xB4-0xB7 */ + 0xDC, 0xC4, 0x3F, 0x3F, 0xDC, 0xBF, 0xB6, 0xCC, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xDC, 0xB4, 0xB6, 0xC9, 0xDC, 0xB5, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xDC, 0xBE, 0xDC, 0xBC, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xDC, 0xB8, 0xB6, 0xC8, 0xDC, 0xB6, 0xB6, 0xCE, /* 0xC4-0xC7 */ + 0xDC, 0xBB, 0xDC, 0xC2, 0xDC, 0xB9, 0xDC, 0xC1, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0xB6, 0xB9, 0xB3, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xB9, 0xB4, 0x3F, 0x3F, 0xE0, 0xF9, /* 0xD0-0xD3 */ + 0xE0, 0xF1, 0xB9, 0xB2, 0xB9, 0xAF, 0xE0, 0xF2, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0xB1, 0xE0, 0xF5, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xE0, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xE0, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xFD, /* 0xE0-0xE3 */ + 0xE0, 0xF8, 0xB9, 0xAE, 0xE0, 0xF0, 0xB9, 0xAC, /* 0xE4-0xE7 */ + 0xE0, 0xF3, 0xB9, 0xB7, 0xE0, 0xF6, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xE0, 0xFA, 0xB9, 0xB0, 0xB9, 0xAD, 0xE0, 0xFC, /* 0xEC-0xEF */ + 0xE0, 0xFB, 0xB9, 0xB5, 0x3F, 0x3F, 0xE0, 0xF4, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xBB, 0xF8, 0xE4, 0xEC, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xE4, 0xE9, 0xBB, 0xF9, 0x3F, 0x3F, 0xBB, 0xF7, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xE4, 0xF0, 0xE4, 0xED, 0xE4, 0xE6, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_51[512] = { + 0xBB, 0xF6, 0x3F, 0x3F, 0xBB, 0xFA, 0xE4, 0xE7, /* 0x00-0x03 */ + 0xBB, 0xF5, 0xBB, 0xFD, 0xE4, 0xEA, 0xE4, 0xEB, /* 0x04-0x07 */ + 0xBB, 0xFB, 0xBB, 0xFC, 0xE4, 0xF1, 0xE4, 0xEE, /* 0x08-0x0B */ + 0xE4, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xBE, 0xAA, 0xE8, 0xF8, 0xBE, 0xA7, 0xE8, 0xF5, /* 0x10-0x13 */ + 0xBE, 0xA9, 0xBE, 0xAB, 0x3F, 0x3F, 0xE8, 0xF6, /* 0x14-0x17 */ + 0xBE, 0xA8, 0x3F, 0x3F, 0xE8, 0xF7, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xE8, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0x76, /* 0x1C-0x1F */ + 0xEC, 0xBD, 0xC0, 0x77, 0xEC, 0xBB, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xEC, 0xBC, 0xEC, 0xBA, 0xEC, 0xB9, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xEC, 0xBE, 0xC0, 0x75, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xEF, 0xB8, 0xEF, 0xB9, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xE4, 0xE8, 0xEF, 0xB7, 0xC0, 0x78, 0xC3, 0x5F, /* 0x30-0x33 */ + 0xF1, 0xEB, 0xF1, 0xEC, 0x3F, 0x3F, 0xC4, 0xD7, /* 0x34-0x37 */ + 0xC4, 0xD8, 0xF5, 0xC1, 0xF5, 0xC0, 0xC5, 0x6C, /* 0x38-0x3B */ + 0xC5, 0x6B, 0xF7, 0xD0, 0x3F, 0x3F, 0xA4, 0x49, /* 0x3C-0x3F */ + 0xA4, 0x61, 0xA4, 0xB9, 0x3F, 0x3F, 0xA4, 0xB8, /* 0x40-0x43 */ + 0xA5, 0x53, 0xA5, 0x52, 0xA5, 0xFC, 0xA5, 0xFB, /* 0x44-0x47 */ + 0xA5, 0xFD, 0xA5, 0xFA, 0x3F, 0x3F, 0xA7, 0x4A, /* 0x48-0x4B */ + 0xA7, 0x49, 0xA7, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xE0, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xA8, 0xDF, 0xA8, 0xE1, 0x3F, 0x3F, 0xAB, 0x5E, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xA2, 0x59, 0xD0, 0xDE, 0xA2, 0x5A, /* 0x58-0x5B */ + 0xB0, 0xC2, 0xA2, 0x5C, 0xA2, 0x5B, 0xD8, 0x60, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xA2, 0x5D, 0xB9, 0xB8, 0xA2, 0x5E, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xA4, 0x4A, 0x3F, 0x3F, 0xA4, 0xBA, /* 0x64-0x67 */ + 0xA5, 0xFE, 0xA8, 0xE2, 0x3F, 0x3F, 0xA4, 0x4B, /* 0x68-0x6B */ + 0xA4, 0xBD, 0xA4, 0xBB, 0xA4, 0xBC, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xA6, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xA7, 0x4C, 0xA8, 0xE4, 0xA8, 0xE3, /* 0x74-0x77 */ + 0xA8, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xAD, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xBE, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0x4E, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xA5, 0x54, 0xA5, 0x55, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xA6, 0x41, 0x3F, 0x3F, 0xCA, 0x6A, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xAB, 0x60, 0xAB, 0x5F, 0xD0, 0xE0, /* 0x90-0x93 */ + 0xD0, 0xDF, 0xB0, 0xC3, 0x3F, 0x3F, 0xA4, 0xBE, /* 0x94-0x97 */ + 0xC9, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xCD, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xAB, 0x61, 0x3F, 0x3F, 0xAD, 0xE0, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xAD, 0xDE, 0xAD, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBE, 0xAD, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xA5, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xA6, 0x42, 0xC9, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0x4D, 0xA7, 0x4E, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xCA, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xCB, 0xCE, 0xA8, 0xE6, 0xCB, 0xCF, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xD0, 0xE2, 0xD0, 0xE3, 0xAD, 0xE3, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xD0, 0xE4, 0x3F, 0x3F, 0xD0, 0xE1, 0xAD, 0xE4, /* 0xC8-0xCB */ + 0xAD, 0xE2, 0xAD, 0xE1, 0xD0, 0xE5, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xD4, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xD8, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xC5, /* 0xD4-0xD7 */ + 0xE1, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xBB, 0xFE, 0xBE, 0xAE, 0xE8, 0xF9, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xA4, 0x4C, 0xA4, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xB0, 0xC4, 0xB3, 0xCD, 0x3F, 0x3F, 0xB9, 0xB9, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xC9, 0x42, 0xA4, 0xBF, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xA5, 0x59, 0xA5, 0x57, 0xA5, 0x58, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xA8, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_52[512] = { + 0xA4, 0x4D, 0xA4, 0x4E, 0x3F, 0x3F, 0xA4, 0x62, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xC0, 0xA4, 0xC1, /* 0x04-0x07 */ + 0xA4, 0xC2, 0xC9, 0xBE, 0xA5, 0x5A, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xC9, 0x6B, 0x3F, 0x3F, 0xA6, 0x46, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xC9, 0xBF, 0xA6, 0x44, 0xA6, 0x45, 0xC9, 0xBD, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0x47, 0xA6, 0x43, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xCA, 0x6C, 0xAA, 0xEC, 0xCA, 0x6D, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xCA, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xA7, 0x50, 0xA7, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xA7, 0x53, 0xA7, 0x51, 0xA7, 0x52, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xED, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xA8, 0xEC, 0xCB, 0xD4, 0xCB, 0xD1, 0xCB, 0xD2, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xCB, 0xD0, 0xA8, 0xEE, 0xA8, 0xEA, /* 0x34-0x37 */ + 0xA8, 0xE9, 0x3F, 0x3F, 0xA8, 0xEB, 0xA8, 0xE8, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xA8, 0xEF, 0x3F, 0x3F, 0xAB, 0x63, /* 0x40-0x43 */ + 0xCD, 0xF0, 0x3F, 0x3F, 0xCB, 0xD3, 0xAB, 0x68, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xCD, 0xF1, 0xAB, 0x64, 0xAB, 0x67, /* 0x48-0x4B */ + 0xAB, 0x66, 0xAB, 0x65, 0xAB, 0x62, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xE8, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xAD, 0xE7, 0xD0, 0xEB, 0xAD, 0xE5, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xE7, 0xAD, 0xE8, /* 0x58-0x5B */ + 0xAD, 0xE6, 0xAD, 0xE9, 0xD0, 0xE9, 0xD0, 0xEA, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xD0, 0xE6, 0xD0, 0xEC, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xB3, 0xD1, 0xB0, 0xC5, 0xD4, 0x69, /* 0x68-0x6B */ + 0xD4, 0x6B, 0xD4, 0x6A, 0xD4, 0x6C, 0xB0, 0xC6, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xCE, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xB3, 0xCF, 0xB3, 0xD0, 0x3F, 0x3F, 0xB6, 0xD0, /* 0x74-0x77 */ + 0xDC, 0xC7, 0x3F, 0x3F, 0xDC, 0xC6, 0xDC, 0xC8, /* 0x78-0x7B */ + 0xDC, 0xC9, 0xB6, 0xD1, 0x3F, 0x3F, 0xB6, 0xCF, /* 0x7C-0x7F */ + + 0xE1, 0x41, 0xE1, 0x42, 0xB9, 0xBB, 0xB9, 0xBA, /* 0x80-0x83 */ + 0xE3, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0x40, /* 0x84-0x87 */ + 0xBC, 0x41, 0xBC, 0x42, 0xBC, 0x44, 0xE4, 0xF2, /* 0x88-0x8B */ + 0xE4, 0xF3, 0xBC, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xBE, 0xAF, 0x3F, 0x3F, 0xBE, 0xB0, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xED, 0xF5, 0xC3, /* 0x94-0x97 */ + 0xF5, 0xC2, 0xF7, 0xD1, 0x3F, 0x3F, 0xA4, 0x4F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0x5C, /* 0x9C-0x9F */ + 0xA5, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0x48, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0xC0, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xA7, 0x55, 0xA7, 0x56, 0xA7, 0x54, /* 0xA8-0xAB */ + 0xA7, 0x57, 0xCA, 0x6F, 0xCA, 0x70, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xF1, /* 0xB8-0xBB */ + 0xCB, 0xD5, 0x3F, 0x3F, 0xA8, 0xF0, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xCD, 0xF2, 0xAB, 0x6C, 0xCD, 0xF3, 0xAB, 0x6B, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0x69, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xAB, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xD0, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xC7, 0xD4, 0x6E, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xB0, 0xCA, 0xD4, 0x6D, 0xB1, 0xE5, /* 0xD4-0xD7 */ + 0xB0, 0xC9, 0xB0, 0xC8, 0x3F, 0x3F, 0xB3, 0xD4, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xB3, 0xD3, 0xB3, 0xD2, 0xB6, 0xD2, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xD5, 0xB6, 0xD6, /* 0xE0-0xE3 */ + 0xB6, 0xD4, 0x3F, 0x3F, 0xB6, 0xD3, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xE1, 0x43, 0x3F, 0x3F, 0xE1, 0x44, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xF5, /* 0xEC-0xEF */ + 0xBC, 0x45, 0xE4, 0xF4, 0x3F, 0x3F, 0xBE, 0xB1, /* 0xF0-0xF3 */ + 0xEC, 0xBF, 0xC0, 0x79, 0x3F, 0x3F, 0xF1, 0xEE, /* 0xF4-0xF7 */ + 0xC4, 0x55, 0x3F, 0x3F, 0xA4, 0x63, 0xA4, 0xC3, /* 0xF8-0xFB */ + 0xC9, 0x56, 0x3F, 0x3F, 0xA4, 0xC4, 0xA4, 0xC5, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_53[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xA5, 0x5D, 0xA5, 0x5E, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xA6, 0x49, 0xCA, 0x71, 0xCB, 0xD6, 0xCB, 0xD7, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xAB, 0x6D, 0xD0, 0xEE, 0xB0, 0xCC, /* 0x0C-0x0F */ + 0xB0, 0xCB, 0xD8, 0x63, 0xD8, 0x62, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xA4, 0x50, 0xA4, 0xC6, 0xA5, 0x5F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xB0, 0xCD, 0xC9, 0x43, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xC9, 0x6C, 0xA5, 0x60, 0x3F, 0x3F, 0xC9, 0xC2, /* 0x1C-0x1F */ + 0xA6, 0x4B, 0xA6, 0x4A, 0xC9, 0xC1, 0xA7, 0x58, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xEA, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xD4, 0x6F, 0x3F, 0x3F, 0xB6, 0xD7, /* 0x2C-0x2F */ + 0xE1, 0x45, 0xB9, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xE8, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xFD, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xA4, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xCB, 0xD8, 0xCD, 0xF4, 0xB0, 0xD0, 0xB0, 0xCE, /* 0x3C-0x3F */ + 0xB0, 0xCF, 0xA4, 0x51, 0x3F, 0x3F, 0xA4, 0x64, /* 0x40-0x43 */ + 0xA2, 0xCD, 0xA4, 0xCA, 0x3F, 0x3F, 0xA4, 0xC9, /* 0x44-0x47 */ + 0xA4, 0xC8, 0xA5, 0x63, 0xA5, 0x62, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xC9, 0x6D, 0xC9, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xA8, 0xF5, 0xA8, 0xF2, 0xA8, 0xF4, /* 0x50-0x53 */ + 0xA8, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0x6E, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xD5, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xA4, 0x52, 0x3F, 0x3F, 0xA4, 0xCB, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xA5, 0x65, 0xA5, 0x64, 0x3F, 0x3F, 0xCA, 0x72, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xF6, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xC9, 0x57, 0x3F, 0x3F, 0xA5, 0x67, 0xA5, 0x66, /* 0x6C-0x6F */ + 0xA6, 0x4C, 0xA6, 0x4D, 0xCA, 0x73, 0xA7, 0x59, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xA7, 0x5A, 0x3F, 0x3F, 0xA8, 0xF7, /* 0x74-0x77 */ + 0xA8, 0xF8, 0xA8, 0xF9, 0x3F, 0x3F, 0xAB, 0x6F, /* 0x78-0x7B */ + 0xCD, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xEB, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0x44, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xA4, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0xC4, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0x74, 0xCA, 0x75, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xD9, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xCB, 0xDA, 0x3F, 0x3F, 0xCD, 0xF7, 0xCD, 0xF6, /* 0x94-0x97 */ + 0xCD, 0xF9, 0xCD, 0xF8, 0xAB, 0x70, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xD4, 0x70, 0xAD, 0xED, 0xD0, 0xEF, 0xAD, 0xEC, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xD8, 0x64, 0xB3, 0xD6, 0x3F, 0x3F, 0xD8, 0x65, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE1, 0x46, 0xB9, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0x46, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xF1, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xC9, 0x58, 0x3F, 0x3F, 0xA5, 0x68, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xD1, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xA4, 0x53, 0xA4, 0x65, 0xA4, 0xCE, 0xA4, 0xCD, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xA4, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xA8, 0xFB, 0x3F, 0x3F, 0xA8, 0xFA, 0xA8, 0xFC, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0x71, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xEE, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xE8, 0xFB, 0xC2, 0x4F, 0xA4, 0x66, /* 0xE0-0xE3 */ + 0xA5, 0x6A, 0xA5, 0x79, 0xA5, 0x74, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xA5, 0x6F, 0xA5, 0x6E, 0xA5, 0x75, 0xA5, 0x73, /* 0xE8-0xEB */ + 0xA5, 0x6C, 0xA5, 0x7A, 0xA5, 0x6D, 0xA5, 0x69, /* 0xEC-0xEF */ + 0xA5, 0x78, 0xA5, 0x77, 0xA5, 0x76, 0xA5, 0x6B, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xA5, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xA5, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0x7B, /* 0xF8-0xFB */ + 0xA5, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_54[512] = { + 0x3F, 0x3F, 0xA6, 0x53, 0x3F, 0x3F, 0xA6, 0x59, /* 0x00-0x03 */ + 0xA6, 0x55, 0x3F, 0x3F, 0xA6, 0x5B, 0xC9, 0xC5, /* 0x04-0x07 */ + 0xA6, 0x58, 0xA6, 0x4E, 0xA6, 0x51, 0xA6, 0x54, /* 0x08-0x0B */ + 0xA6, 0x50, 0xA6, 0x57, 0xA6, 0x5A, 0xA6, 0x4F, /* 0x0C-0x0F */ + 0xA6, 0x52, 0xA6, 0x56, 0xA6, 0x5C, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xCA, 0x7E, 0xCA, 0x7B, 0x3F, 0x3F, 0xA7, 0x67, /* 0x18-0x1B */ + 0xCA, 0x7C, 0xA7, 0x5B, 0xA7, 0x5D, 0xA7, 0x75, /* 0x1C-0x1F */ + 0xA7, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xCA, 0xA5, 0xCA, 0x7D, 0xA7, 0x5F, 0xA7, 0x61, /* 0x24-0x27 */ + 0xCA, 0xA4, 0xA7, 0x68, 0xCA, 0x78, 0xA7, 0x74, /* 0x28-0x2B */ + 0xA7, 0x76, 0xA7, 0x5C, 0xA7, 0x6D, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xCA, 0x76, 0xA7, 0x73, 0x3F, 0x3F, 0xA7, 0x64, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xA7, 0x6E, 0xA7, 0x6F, 0xCA, 0x77, /* 0x34-0x37 */ + 0xA7, 0x6C, 0xA7, 0x6A, 0x3F, 0x3F, 0xA7, 0x6B, /* 0x38-0x3B */ + 0xA7, 0x71, 0xCA, 0xA1, 0xA7, 0x5E, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xA7, 0x72, 0xCA, 0xA3, 0xA7, 0x66, 0xA7, 0x63, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xCA, 0x7A, 0xA7, 0x62, 0xCA, 0xA6, /* 0x44-0x47 */ + 0xA7, 0x65, 0x3F, 0x3F, 0xA7, 0x69, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0x60, 0xCA, 0xA2, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xCA, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xCB, 0xEB, 0xCB, 0xEA, 0xA9, 0x4F, 0xCB, 0xED, /* 0x60-0x63 */ + 0xCB, 0xEF, 0xCB, 0xE4, 0xCB, 0xE7, 0xCB, 0xEE, /* 0x64-0x67 */ + 0xA9, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xE1, /* 0x68-0x6B */ + 0xCB, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xE9, /* 0x6C-0x6F */ + 0xCE, 0x49, 0xA9, 0x4B, 0xCE, 0x4D, 0xA8, 0xFD, /* 0x70-0x73 */ + 0xCB, 0xE6, 0xA8, 0xFE, 0xA9, 0x4C, 0xA9, 0x45, /* 0x74-0x77 */ + 0xA9, 0x41, 0x3F, 0x3F, 0xCB, 0xE2, 0xA9, 0x44, /* 0x78-0x7B */ + 0xA9, 0x49, 0xA9, 0x52, 0xCB, 0xE3, 0xCB, 0xDC, /* 0x7C-0x7F */ + + 0xA9, 0x43, 0xCB, 0xDD, 0xCB, 0xDF, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xA9, 0x46, 0x3F, 0x3F, 0xA9, 0x48, 0xCB, 0xDB, /* 0x84-0x87 */ + 0xCB, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0x51, /* 0x88-0x8B */ + 0xA9, 0x4D, 0xCB, 0xE8, 0xA9, 0x53, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xA9, 0x4A, 0xCB, 0xDE, 0xA9, 0x47, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xA9, 0x42, 0xA9, 0x40, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xCB, 0xEC, 0x3F, 0x3F, 0xA9, 0x4E, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xCE, 0x48, 0xCD, 0xFB, 0xCE, 0x4B, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xCD, 0xFD, 0xAB, 0x78, 0xAB, 0xA8, /* 0xA4-0xA7 */ + 0xAB, 0x74, 0xAB, 0xA7, 0xAB, 0x7D, 0xAB, 0xA4, /* 0xA8-0xAB */ + 0xAB, 0x72, 0xCD, 0xFC, 0xCE, 0x43, 0xAB, 0xA3, /* 0xAC-0xAF */ + 0xCE, 0x4F, 0xAB, 0xA5, 0x3F, 0x3F, 0xAB, 0x79, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0x45, 0xCE, 0x42, /* 0xB4-0xB7 */ + 0xAB, 0x77, 0x3F, 0x3F, 0xCD, 0xFA, 0xAB, 0xA6, /* 0xB8-0xBB */ + 0xCE, 0x4A, 0xAB, 0x7C, 0xCE, 0x4C, 0xAB, 0xA9, /* 0xBC-0xBF */ + 0xAB, 0x73, 0xAB, 0x7E, 0xAB, 0x7B, 0xCE, 0x40, /* 0xC0-0xC3 */ + 0xAB, 0xA1, 0xCE, 0x46, 0xCE, 0x47, 0xAB, 0x7A, /* 0xC4-0xC7 */ + 0xAB, 0xA2, 0xAB, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0x75, 0xCD, 0xFE, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0x44, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0x4E, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xD1, 0x44, 0xAD, 0xFB, 0xD0, 0xF1, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xD0, 0xF6, 0xAD, 0xF4, 0xAE, 0x40, 0xD0, 0xF4, /* 0xE4-0xE7 */ + 0xAD, 0xEF, 0xAD, 0xF9, 0xAD, 0xFE, 0xD0, 0xFB, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xAD, 0xFA, 0xAD, 0xFD, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xD0, 0xFE, 0xAD, 0xF5, 0xD0, 0xF5, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0x42, /* 0xF4-0xF7 */ + 0xD1, 0x43, 0x3F, 0x3F, 0xAD, 0xF7, 0xD1, 0x41, /* 0xF8-0xFB */ + 0xAD, 0xF3, 0xAE, 0x43, 0x3F, 0x3F, 0xD0, 0xF8, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_55[512] = { + 0x3F, 0x3F, 0xAD, 0xF1, 0x3F, 0x3F, 0xD1, 0x46, /* 0x00-0x03 */ + 0xD0, 0xF9, 0xD0, 0xFD, 0xAD, 0xF6, 0xAE, 0x42, /* 0x04-0x07 */ + 0xD0, 0xFA, 0xAD, 0xFC, 0xD1, 0x40, 0xD1, 0x47, /* 0x08-0x0B */ + 0xD4, 0xA1, 0x3F, 0x3F, 0xD1, 0x45, 0xAE, 0x44, /* 0x0C-0x0F */ + 0xAD, 0xF0, 0xD0, 0xFC, 0xD0, 0xF3, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xAD, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xF2, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xF7, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xF0, 0xAE, 0x41, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0x77, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xB0, 0xE4, 0xD4, 0xA7, 0xB0, 0xE2, 0xB0, 0xDF, /* 0x2C-0x2F */ + 0xD4, 0x7C, 0xB0, 0xDB, 0xD4, 0xA2, 0xB0, 0xE6, /* 0x30-0x33 */ + 0xD4, 0x76, 0xD4, 0x7B, 0xD4, 0x7A, 0xAD, 0xF2, /* 0x34-0x37 */ + 0xB0, 0xE1, 0xD4, 0xA5, 0x3F, 0x3F, 0xD4, 0xA8, /* 0x38-0x3B */ + 0xD4, 0x73, 0x3F, 0x3F, 0xB3, 0xE8, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xD4, 0xA9, 0xB0, 0xE7, 0x3F, 0x3F, 0xB0, 0xD9, /* 0x40-0x43 */ + 0xB0, 0xD6, 0xD4, 0x7E, 0xB0, 0xD3, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xD4, 0xA6, 0x3F, 0x3F, 0xB0, 0xDA, 0xD4, 0xAA, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xD4, 0x74, 0xD4, 0xA4, 0xB0, 0xDD, /* 0x4C-0x4F */ + 0xD4, 0x75, 0xD4, 0x78, 0xD4, 0x7D, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xB0, 0xDE, 0xB0, 0xDC, 0xB0, 0xE8, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xB0, 0xE3, 0x3F, 0x3F, 0xB0, 0xD7, 0xB1, 0xD2, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xB0, 0xD8, 0xD4, 0x79, 0xB0, 0xE5, /* 0x60-0x63 */ + 0xB0, 0xE0, 0xD4, 0xA3, 0xB0, 0xD5, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xD4, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xD4, 0x71, 0xD4, 0x72, 0xD8, 0x6A, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xD7, /* 0x78-0x7B */ + 0xB3, 0xDA, 0xD8, 0x75, 0xB3, 0xEE, 0xD8, 0x78, /* 0x7C-0x7F */ + + 0xB3, 0xD8, 0xD8, 0x71, 0xB3, 0xDE, 0xB3, 0xE4, /* 0x80-0x83 */ + 0xB5, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xE2, /* 0x84-0x87 */ + 0xD8, 0x6E, 0xB3, 0xEF, 0xB3, 0xDB, 0xB3, 0xE3, /* 0x88-0x8B */ + 0xD8, 0x76, 0xDC, 0xD7, 0xD8, 0x7B, 0xD8, 0x6F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xD8, 0x66, 0xD8, 0x73, 0xD8, 0x6D, /* 0x90-0x93 */ + 0xB3, 0xE1, 0xD8, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xB3, 0xDD, 0xB3, 0xF1, 0xB3, 0xEA, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xB3, 0xDF, 0xB3, 0xDC, 0x3F, 0x3F, 0xB3, 0xE7, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xD8, 0x7A, 0xD8, 0x6C, 0xD8, 0x72, /* 0xA0-0xA3 */ + 0xD8, 0x74, 0xD8, 0x68, 0xD8, 0x77, 0xB3, 0xD9, /* 0xA4-0xA7 */ + 0xD8, 0x67, 0x3F, 0x3F, 0xB3, 0xE0, 0xB3, 0xF0, /* 0xA8-0xAB */ + 0xB3, 0xEC, 0xD8, 0x69, 0xB3, 0xE6, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xB3, 0xED, 0xB3, 0xE9, 0xB3, 0xE5, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xD8, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xEB, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xD5, /* 0xBC-0xBF */ + 0xDC, 0xD1, 0x3F, 0x3F, 0xDC, 0xE0, 0xDC, 0xCA, /* 0xC0-0xC3 */ + 0xDC, 0xD3, 0xB6, 0xE5, 0xB6, 0xE6, 0xB6, 0xDE, /* 0xC4-0xC7 */ + 0xDC, 0xDC, 0xB6, 0xE8, 0xDC, 0xCF, 0xDC, 0xCE, /* 0xC8-0xCB */ + 0xDC, 0xCC, 0xDC, 0xDE, 0xB6, 0xDC, 0xDC, 0xD8, /* 0xCC-0xCF */ + 0xDC, 0xCD, 0xB6, 0xDF, 0xDC, 0xD6, 0xB6, 0xDA, /* 0xD0-0xD3 */ + 0xDC, 0xD2, 0xDC, 0xD9, 0xDC, 0xDB, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xDC, 0xDF, 0xB6, 0xE3, 0xDC, 0xCB, /* 0xD8-0xDB */ + 0xB6, 0xDD, 0xDC, 0xD0, 0x3F, 0x3F, 0xB6, 0xD8, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xB6, 0xE4, 0xDC, 0xDA, 0xB6, 0xE0, /* 0xE0-0xE3 */ + 0xB6, 0xE1, 0xB6, 0xE7, 0xB6, 0xDB, 0xA2, 0x5F, /* 0xE4-0xE7 */ + 0xB6, 0xD9, 0xDC, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xE2, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xDD, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0xCD, 0xB9, 0xC8, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xE1, 0x55, 0xE1, 0x51, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xE1, 0x4B, 0xB9, 0xC2, 0xB9, 0xBE, 0xE1, 0x54, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_56[512] = { + 0xB9, 0xBF, 0xE1, 0x4E, 0xE1, 0x50, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xE1, 0x53, 0x3F, 0x3F, 0xB9, 0xC4, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xB9, 0xCB, 0xB9, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xE1, 0x49, 0xB9, 0xC6, 0xB9, 0xC7, 0xE1, 0x4C, /* 0x0C-0x0F */ + 0xB9, 0xCC, 0x3F, 0x3F, 0xE1, 0x4A, 0xE1, 0x4F, /* 0x10-0x13 */ + 0xB9, 0xC3, 0xE1, 0x48, 0xB9, 0xC9, 0xB9, 0xC1, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0xC0, /* 0x18-0x1B */ + 0xE1, 0x4D, 0xE1, 0x52, 0x3F, 0x3F, 0xB9, 0xCA, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x47, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xBC, 0x4D, 0xE5, 0x47, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xE5, 0x44, 0x3F, 0x3F, 0xBC, 0x47, 0xBC, 0x53, /* 0x2C-0x2F */ + 0xBC, 0x54, 0x3F, 0x3F, 0xBC, 0x4A, 0xE5, 0x42, /* 0x30-0x33 */ + 0xBC, 0x4C, 0xE4, 0xF9, 0xBC, 0x52, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xE5, 0x46, 0xBC, 0x49, 0xE5, 0x48, 0xBC, 0x48, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xE5, 0x43, 0xE5, 0x45, 0xBC, 0x4B, /* 0x3C-0x3F */ + 0xE5, 0x41, 0xE4, 0xFA, 0xE4, 0xF7, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xD8, 0x6B, 0xE4, 0xFD, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xE4, 0xF6, 0xE4, 0xFC, 0xE4, 0xFB, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xE4, 0xF8, 0x3F, 0x3F, 0xBC, 0x4F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0x4E, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0x50, /* 0x54-0x57 */ + 0xE4, 0xFE, 0xBE, 0xB2, 0xE5, 0x40, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x45, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xE8, 0xFD, 0x3F, 0x3F, 0xBE, 0xBE, 0xE9, 0x42, /* 0x60-0x63 */ + 0xBE, 0xB6, 0xBE, 0xBA, 0xE9, 0x41, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xBE, 0xB9, 0xBE, 0xB5, 0xBE, 0xB8, 0xBE, 0xB3, /* 0x68-0x6B */ + 0xBE, 0xBD, 0xE9, 0x43, 0xE8, 0xFE, 0xBE, 0xBC, /* 0x6C-0x6F */ + 0xE8, 0xFC, 0xBE, 0xBB, 0xE9, 0x44, 0xE9, 0x40, /* 0x70-0x73 */ + 0xBC, 0x51, 0x3F, 0x3F, 0xBE, 0xBF, 0xE9, 0x46, /* 0x74-0x77 */ + 0xBE, 0xB7, 0xBE, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xC6, 0xEC, 0xC8, /* 0x7C-0x7F */ + + 0xC0, 0x7B, 0xEC, 0xC9, 0xEC, 0xC7, 0xEC, 0xC5, /* 0x80-0x83 */ + 0xEC, 0xC4, 0xC0, 0x7D, 0xEC, 0xC3, 0xC0, 0x7E, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xEC, 0xC1, 0xEC, 0xC2, 0xC0, 0x7A, 0xC0, 0xA1, /* 0x8C-0x8F */ + 0xC0, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xC0, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xC2, 0x50, 0x3F, 0x3F, 0xEF, 0xBC, /* 0x94-0x97 */ + 0xEF, 0xBA, 0xEF, 0xBF, 0xEF, 0xBD, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xEF, 0xBB, 0xEF, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xC3, 0x60, 0xF1, 0xF2, 0xF1, 0xF3, /* 0xA4-0xA7 */ + 0xC4, 0x56, 0x3F, 0x3F, 0xF1, 0xF4, 0xF1, 0xF0, /* 0xA8-0xAB */ + 0xF1, 0xF5, 0xF1, 0xF1, 0xC2, 0x51, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xFE, 0xF4, 0x41, /* 0xB0-0xB3 */ + 0xC4, 0x59, 0xF4, 0x40, 0xC4, 0x58, 0xC4, 0x57, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xC4, 0x5A, 0xF5, 0xC5, 0xF5, 0xC6, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xC4, 0xDA, 0xC4, 0xD9, 0xC4, 0xDB, 0xF5, 0xC4, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xF6, 0xD8, 0xF6, 0xD7, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xC5, 0x6D, 0xC5, 0x6F, 0xC5, 0x6E, 0xF6, 0xD9, /* 0xC8-0xCB */ + 0xC5, 0xC8, 0xF8, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xC5, 0xF1, 0x3F, 0x3F, 0xF8, 0xA5, /* 0xD0-0xD3 */ + 0xF8, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0x49, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0x7D, 0xA5, 0x7C, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xA6, 0x5F, 0xA6, 0x5E, 0xC9, 0xC7, /* 0xDC-0xDF */ + 0xA6, 0x5D, 0xC9, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xA7, 0x79, 0xCA, 0xA9, 0x3F, 0x3F, 0xCA, 0xA8, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0x77, 0xA7, 0x7A, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xA7, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xA7, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xF0, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xCB, 0xF1, 0xA9, 0x54, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xAA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_57[512] = { + 0x3F, 0x3F, 0xD1, 0x48, 0xD1, 0x49, 0xAE, 0x45, /* 0x00-0x03 */ + 0xAE, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xAC, /* 0x04-0x07 */ + 0xB0, 0xE9, 0xB0, 0xEB, 0xD4, 0xAB, 0xB0, 0xEA, /* 0x08-0x0B */ + 0xD8, 0x7C, 0xB3, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xE9, 0xB6, 0xEA, /* 0x10-0x13 */ + 0xDC, 0xE1, 0x3F, 0x3F, 0xB9, 0xCF, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xB9, 0xCE, 0x3F, 0x3F, 0xE5, 0x49, 0xE9, 0x48, /* 0x18-0x1B */ + 0xE9, 0x47, 0x3F, 0x3F, 0xF9, 0x6B, 0xA4, 0x67, /* 0x1C-0x1F */ + 0xC9, 0x59, 0x3F, 0x3F, 0xC9, 0x6E, 0xC9, 0x6F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xA6, 0x62, 0xA6, 0x66, 0xC9, 0xC9, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xA6, 0x64, 0xA6, 0x63, 0xC9, 0xC8, 0xA6, 0x65, /* 0x2C-0x2F */ + 0xA6, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0x60, /* 0x30-0x33 */ + 0xC9, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xA6, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xA3, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xA7, 0x7D, 0xCA, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xCA, 0xAB, 0x3F, 0x3F, 0xA7, 0xA1, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xCA, 0xAD, 0xA7, 0x7B, 0xCA, 0xAE, /* 0x48-0x4B */ + 0xCA, 0xAC, 0xA7, 0x7E, 0xA7, 0xA2, 0xA7, 0xA5, /* 0x4C-0x4F */ + 0xA7, 0xA4, 0xA7, 0x7C, 0xCA, 0xAF, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xA9, 0x59, 0xCB, 0xFE, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xA9, 0x5B, 0x3F, 0x3F, 0xA9, 0x5A, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xCC, 0x40, 0xA9, 0x58, 0xA9, 0x57, 0xCB, 0xF5, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xCB, 0xF4, 0x3F, 0x3F, 0xCB, 0xF2, /* 0x6C-0x6F */ + 0xCB, 0xF7, 0xCB, 0xF6, 0xCB, 0xF3, 0xCB, 0xFC, /* 0x70-0x73 */ + 0xCB, 0xFD, 0xCB, 0xFA, 0xCB, 0xF8, 0xA9, 0x56, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xFB, /* 0x78-0x7B */ + 0xA9, 0x5C, 0xCC, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xCB, 0xF9, 0x3F, 0x3F, 0xAB, 0xAB, 0xA9, 0x55, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xAC, /* 0x88-0x8B */ + 0xCE, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0x5A, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xB2, /* 0x90-0x93 */ + 0xCE, 0x58, 0xCE, 0x5E, 0x3F, 0x3F, 0xCE, 0x55, /* 0x94-0x97 */ + 0xCE, 0x59, 0xCE, 0x5B, 0xCE, 0x5D, 0xCE, 0x57, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xCE, 0x56, 0xCE, 0x51, 0xCE, 0x52, /* 0x9C-0x9F */ + 0xAB, 0xAD, 0x3F, 0x3F, 0xAB, 0xAF, 0xAB, 0xAE, /* 0xA0-0xA3 */ + 0xCE, 0x53, 0xCE, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xB1, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xCE, 0x50, 0xD1, 0x53, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xD1, 0x52, 0xD1, 0x57, 0xD1, 0x4E, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xD1, 0x51, 0xD1, 0x50, 0x3F, 0x3F, 0xD1, 0x54, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xD1, 0x58, 0xAE, 0x47, 0xAE, 0x4A, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0x4F, 0xD1, 0x55, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAE, 0x49, /* 0xC8-0xCB */ + 0xD1, 0x4A, 0x3F, 0x3F, 0xAB, 0xB0, 0xD4, 0xBA, /* 0xCC-0xCF */ + 0xD1, 0x56, 0x3F, 0x3F, 0xD1, 0x4D, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xAE, 0x48, 0xD1, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xD4, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xEC, /* 0xDC-0xDF */ + 0xB0, 0xF0, 0xD4, 0xC1, 0xD4, 0xAF, 0xD4, 0xBD, /* 0xE0-0xE3 */ + 0xB0, 0xF1, 0xD4, 0xBF, 0x3F, 0x3F, 0xD4, 0xC5, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xD4, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xD4, 0xC0, 0xD4, 0xB4, 0xD4, 0xBC, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xD4, 0xCA, 0xD4, 0xC8, 0xD4, 0xBE, 0xD4, 0xB9, /* 0xF0-0xF3 */ + 0xD4, 0xB2, 0xD8, 0xA6, 0xD4, 0xB0, 0xB0, 0xF5, /* 0xF4-0xF7 */ + 0xD4, 0xB7, 0xB0, 0xF6, 0xB0, 0xF2, 0xD4, 0xAD, /* 0xF8-0xFB */ + 0xD4, 0xC3, 0xD4, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_58[512] = { + 0xD4, 0xB3, 0xD4, 0xC6, 0xB0, 0xF3, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD4, 0xCC, 0xB0, 0xED, 0xB0, 0xEF, 0xD4, 0xBB, /* 0x04-0x07 */ + 0xD4, 0xB6, 0xAE, 0x4B, 0xB0, 0xEE, 0xD4, 0xB8, /* 0x08-0x0B */ + 0xD4, 0xC7, 0xD4, 0xCB, 0xD4, 0xC2, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xD4, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xD4, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xD8, 0xA1, 0x3F, 0x3F, 0xD8, 0xAA, /* 0x18-0x1B */ + 0xD8, 0xA9, 0xB3, 0xFA, 0xD8, 0xA2, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xB3, 0xFB, 0xB3, 0xF9, 0x3F, 0x3F, 0xD8, 0xA4, /* 0x20-0x23 */ + 0xB3, 0xF6, 0xD8, 0xA8, 0x3F, 0x3F, 0xD8, 0xA3, /* 0x24-0x27 */ + 0xD8, 0xA5, 0xD8, 0x7D, 0xB3, 0xF4, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xD8, 0xB2, 0xD8, 0xB1, 0xD8, 0xAE, 0xB3, 0xF3, /* 0x2C-0x2F */ + 0xB3, 0xF7, 0xB3, 0xF8, 0xD1, 0x4B, 0xD8, 0xAB, /* 0x30-0x33 */ + 0xB3, 0xF5, 0xB0, 0xF4, 0xD8, 0xAD, 0xD8, 0x7E, /* 0x34-0x37 */ + 0xD8, 0xB0, 0xD8, 0xAF, 0x3F, 0x3F, 0xD8, 0xB3, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xDC, 0xEF, 0x3F, 0x3F, 0xD8, 0xAC, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xD8, 0xA7, 0xDC, 0xE7, 0xB6, 0xF4, 0xB6, 0xF7, /* 0x48-0x4B */ + 0xB6, 0xF2, 0xDC, 0xE6, 0xDC, 0xEA, 0xDC, 0xE5, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xB6, 0xEC, 0xB6, 0xF6, 0xDC, 0xE2, /* 0x50-0x53 */ + 0xB6, 0xF0, 0xDC, 0xE9, 0x3F, 0x3F, 0xB6, 0xEE, /* 0x54-0x57 */ + 0xB6, 0xED, 0xDC, 0xEC, 0xB6, 0xEF, 0xDC, 0xEE, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xDC, 0xEB, 0xB6, 0xEB, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xF5, 0xDC, 0xF0, /* 0x60-0x63 */ + 0xDC, 0xE4, 0xDC, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xDC, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xF1, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xB6, 0xF3, 0x3F, 0x3F, 0xDC, 0xE8, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xDC, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xE1, 0x5D, 0xB9, 0xD0, 0xE1, 0x63, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xB9, 0xD5, 0xE1, 0x5F, 0xE1, 0x66, /* 0x78-0x7B */ + 0xE1, 0x57, 0xB9, 0xD7, 0xB9, 0xD1, 0xE1, 0x5C, /* 0x7C-0x7F */ + + 0xBC, 0x55, 0xE1, 0x5B, 0xE1, 0x64, 0xB9, 0xD2, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xB9, 0xD6, 0xE1, 0x5A, 0xE1, 0x60, /* 0x84-0x87 */ + 0xE1, 0x65, 0xE1, 0x56, 0xB9, 0xD4, 0xE1, 0x5E, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x62, 0xE1, 0x68, /* 0x8C-0x8F */ + 0xE1, 0x58, 0xE1, 0x61, 0x3F, 0x3F, 0xB9, 0xD3, /* 0x90-0x93 */ + 0xE1, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xE1, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xBC, 0x59, 0xE5, 0x4B, 0xBC, 0x57, 0xBC, 0x56, /* 0x9C-0x9F */ + 0xE5, 0x4D, 0xE5, 0x52, 0x3F, 0x3F, 0xE5, 0x4E, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xE5, 0x51, 0xBC, 0x5C, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xBE, 0xA5, 0xBC, 0x5B, 0x3F, 0x3F, 0xE5, 0x4A, /* 0xA8-0xAB */ + 0xE5, 0x50, 0x3F, 0x3F, 0xBC, 0x5A, 0xE5, 0x4F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xE5, 0x4C, 0x3F, 0x3F, 0xBC, 0x58, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x4D, 0xF9, 0xD9, /* 0xB8-0xBB */ + 0xE9, 0x4F, 0xE9, 0x4A, 0xBE, 0xC1, 0xE9, 0x4C, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xBE, 0xC0, 0xE9, 0x4E, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xBE, 0xC3, 0xE9, 0x50, 0xBE, 0xC2, /* 0xC4-0xC7 */ + 0xE9, 0x49, 0xE9, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xA5, 0xEC, 0xCC, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xC0, 0xA4, 0xEC, 0xCD, 0xC0, 0xA3, /* 0xD0-0xD3 */ + 0xEC, 0xCB, 0xC0, 0xA2, 0xEC, 0xCA, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xC2, 0x53, 0xC2, 0x52, 0xF1, 0xF6, 0xF1, 0xF8, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xF1, 0xF7, 0xC3, 0x61, 0xC3, 0x62, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC3, 0x63, 0xF4, 0x42, /* 0xE0-0xE3 */ + 0xC4, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xD3, /* 0xE4-0xE7 */ + 0xF7, 0xD2, 0xC5, 0xF2, 0x3F, 0x3F, 0xA4, 0x68, /* 0xE8-0xEB */ + 0xA4, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xA7, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xCE, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xB3, 0xFC, 0xB3, 0xFD, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xDC, 0xF2, 0xB9, 0xD8, 0xE1, 0x69, 0xE5, 0x53, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_59[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0x5A, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xB0, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xCC, 0x42, 0xCE, 0x60, 0xD1, 0x59, 0xAE, 0x4C, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xF9, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xC4, 0xDC, 0xA4, 0x69, 0xA5, 0x7E, 0xC9, 0x70, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xA6, 0x67, 0xA6, 0x68, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xA9, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xB0, 0xF7, 0x3F, 0x3F, 0xB9, 0xDA, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xB9, 0xDB, 0xB9, 0xD9, 0x3F, 0x3F, 0xA4, 0x6A, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xA4, 0xD1, 0xA4, 0xD3, 0xA4, 0xD2, /* 0x28-0x2B */ + 0xC9, 0x5B, 0xA4, 0xD4, 0xA5, 0xA1, 0xC9, 0x71, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xA5, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0x69, /* 0x34-0x37 */ + 0xA6, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xC9, 0xCB, 0x3F, 0x3F, 0xA7, 0xA8, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xCA, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xA9, 0x61, 0xCC, 0x43, 0x3F, 0x3F, 0xA9, 0x5F, /* 0x44-0x47 */ + 0xA9, 0x60, 0xA9, 0x5E, 0xD1, 0x5A, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xB6, 0xAB, 0xB5, /* 0x4C-0x4F */ + 0xAB, 0xB7, 0xAB, 0xB4, 0x3F, 0x3F, 0xCE, 0x61, /* 0x50-0x53 */ + 0xA9, 0x62, 0xAB, 0xB3, 0x3F, 0x3F, 0xAE, 0x4D, /* 0x54-0x57 */ + 0xAE, 0x4E, 0x3F, 0x3F, 0xAE, 0x4F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xD4, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xB3, 0xFE, 0xD8, 0xB4, 0xB0, 0xF8, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xF8, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xB9, 0xDD, 0xB9, 0xDC, 0xE1, 0x6A, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xBC, 0x5D, 0xBE, 0xC4, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xEF, 0xC0, 0xF6, 0xDA, 0xF7, 0xD4, 0xA4, 0x6B, /* 0x70-0x73 */ + 0xA5, 0xA3, 0x3F, 0x3F, 0xA5, 0xA4, 0xC9, 0xD1, /* 0x74-0x77 */ + 0xA6, 0x6C, 0xA6, 0x6F, 0x3F, 0x3F, 0xC9, 0xCF, /* 0x78-0x7B */ + 0xC9, 0xCD, 0xA6, 0x6E, 0xC9, 0xD0, 0xC9, 0xD2, /* 0x7C-0x7F */ + + 0xC9, 0xCC, 0xA6, 0x71, 0xA6, 0x70, 0xA6, 0x6D, /* 0x80-0x83 */ + 0xA6, 0x6B, 0xC9, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xB3, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xA7, 0xB0, 0xCA, 0xB6, 0xCA, 0xB9, /* 0x8C-0x8F */ + 0xCA, 0xB8, 0x3F, 0x3F, 0xA7, 0xAA, 0xA7, 0xB2, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xAF, 0xCA, 0xB5, /* 0x94-0x97 */ + 0xCA, 0xB3, 0xA7, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xA7, 0xA9, 0xA7, 0xAC, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xCA, 0xB4, 0xCA, 0xBB, 0xCA, 0xB7, 0xA7, 0xAD, /* 0xA0-0xA3 */ + 0xA7, 0xB1, 0xA7, 0xB4, 0xCA, 0xB2, 0xCA, 0xBA, /* 0xA4-0xA7 */ + 0xA7, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0x67, 0xA9, 0x6F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xCC, 0x4F, 0xCC, 0x48, 0xA9, 0x70, /* 0xB0-0xB3 */ + 0xCC, 0x53, 0xCC, 0x44, 0xCC, 0x4B, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xA9, 0x66, 0xCC, 0x45, 0xA9, 0x64, /* 0xB8-0xBB */ + 0xCC, 0x4C, 0xCC, 0x50, 0xA9, 0x63, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xCC, 0x51, 0xCC, 0x4A, 0x3F, 0x3F, 0xCC, 0x4D, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xA9, 0x72, 0xA9, 0x69, 0xCC, 0x54, /* 0xC4-0xC7 */ + 0xCC, 0x52, 0x3F, 0x3F, 0xA9, 0x6E, 0xA9, 0x6C, /* 0xC8-0xCB */ + 0xCC, 0x49, 0xA9, 0x6B, 0xCC, 0x47, 0xCC, 0x46, /* 0xCC-0xCF */ + 0xA9, 0x6A, 0xA9, 0x68, 0xA9, 0x71, 0xA9, 0x6D, /* 0xD0-0xD3 */ + 0xA9, 0x65, 0x3F, 0x3F, 0xCC, 0x4E, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xAB, 0xB9, 0x3F, 0x3F, 0xAB, 0xC0, 0xCE, 0x6F, /* 0xD8-0xDB */ + 0xAB, 0xB8, 0xCE, 0x67, 0xCE, 0x63, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xCE, 0x73, 0xCE, 0x62, 0x3F, 0x3F, 0xAB, 0xBB, /* 0xE0-0xE3 */ + 0xCE, 0x6C, 0xAB, 0xBE, 0xAB, 0xC1, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xAB, 0xBC, 0xCE, 0x70, 0xAB, 0xBF, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xAE, 0x56, 0xCE, 0x76, 0xCE, 0x64, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xCE, 0x66, 0xCE, 0x6D, 0xCE, 0x71, /* 0xF0-0xF3 */ + 0xCE, 0x75, 0xCE, 0x72, 0xCE, 0x6B, 0xCE, 0x6E, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0x68, 0xAB, 0xC3, /* 0xF8-0xFB */ + 0xCE, 0x6A, 0xCE, 0x69, 0xCE, 0x74, 0xAB, 0xBA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5A[512] = { + 0xCE, 0x65, 0xAB, 0xC2, 0x3F, 0x3F, 0xAB, 0xBD, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xAE, 0x5C, 0xD1, 0x62, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xAE, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0x60, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xAE, 0x50, 0x3F, 0x3F, 0xAE, 0x55, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xD1, 0x5F, 0xD1, 0x5C, 0xD1, 0x61, /* 0x14-0x17 */ + 0xAE, 0x51, 0xD1, 0x5B, 0x3F, 0x3F, 0xAE, 0x54, /* 0x18-0x1B */ + 0xAE, 0x52, 0x3F, 0x3F, 0xD1, 0x63, 0xAE, 0x53, /* 0x1C-0x1F */ + 0xAE, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0xAE, 0x58, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xAE, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xAE, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xD1, 0x5D, 0xD1, 0x5E, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0x64, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xD4, 0xD4, 0xB0, 0xF9, 0xD8, 0xC2, /* 0x34-0x37 */ + 0xD4, 0xD3, 0xD4, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xB1, 0x40, 0x3F, 0x3F, 0xD4, 0xE4, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xB0, 0xFE, 0xB0, 0xFA, 0xD4, 0xED, 0xD4, 0xDD, /* 0x40-0x43 */ + 0xD4, 0xE0, 0x3F, 0x3F, 0xB1, 0x43, 0xD4, 0xEA, /* 0x44-0x47 */ + 0xD4, 0xE2, 0xB0, 0xFB, 0xB1, 0x44, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xD4, 0xE7, 0xD4, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xD4, 0xD6, 0xD4, 0xEB, 0xD4, 0xDF, 0xD4, 0xDA, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xD4, 0xD0, 0xD4, 0xEC, 0xD4, 0xDC, /* 0x54-0x57 */ + 0xD4, 0xCF, 0x3F, 0x3F, 0xB1, 0x42, 0xD4, 0xE1, /* 0x58-0x5B */ + 0xD4, 0xEE, 0xD4, 0xDE, 0xD4, 0xD2, 0xD4, 0xD7, /* 0x5C-0x5F */ + 0xD4, 0xCE, 0x3F, 0x3F, 0xB1, 0x41, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xD4, 0xDB, 0xD4, 0xD8, 0xB0, 0xFC, 0xD4, 0xD1, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xD4, 0xE9, 0xB0, 0xFD, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xD4, 0xD9, 0xD4, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xD4, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB4, 0x40, /* 0x74-0x77 */ + 0xD8, 0xBB, 0x3F, 0x3F, 0xD8, 0xB8, 0xD8, 0xC9, /* 0x78-0x7B */ + 0xD8, 0xBD, 0xD8, 0xCA, 0x3F, 0x3F, 0xB4, 0x42, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xC6, /* 0x80-0x83 */ + 0xD8, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xC4, 0xD8, 0xC7, /* 0x88-0x8B */ + 0xD8, 0xCB, 0x3F, 0x3F, 0xD4, 0xE3, 0xD8, 0xCD, /* 0x8C-0x8F */ + 0xDD, 0x47, 0x3F, 0x3F, 0xB4, 0x43, 0xD8, 0xCE, /* 0x90-0x93 */ + 0xD8, 0xB6, 0xD8, 0xC0, 0x3F, 0x3F, 0xD8, 0xC5, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB4, 0x41, 0xB4, 0x44, /* 0x98-0x9B */ + 0xD8, 0xCC, 0xD8, 0xCF, 0xD8, 0xBA, 0xD8, 0xB7, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xB9, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xD8, 0xBE, 0xD8, 0xBC, 0xB4, 0x45, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xD8, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xD8, 0xBF, 0x3F, 0x3F, 0xD8, 0xC1, 0xD8, 0xB5, /* 0xAC-0xAF */ + 0xDC, 0xFA, 0xDC, 0xF8, 0xB7, 0x42, 0xB7, 0x40, /* 0xB0-0xB3 */ + 0xDD, 0x43, 0xDC, 0xF9, 0xDD, 0x44, 0xDD, 0x40, /* 0xB4-0xB7 */ + 0xDC, 0xF7, 0xDD, 0x46, 0xDC, 0xF6, 0xDC, 0xFD, /* 0xB8-0xBB */ + 0xB6, 0xFE, 0xB6, 0xFD, 0xB6, 0xFC, 0xDC, 0xFB, /* 0xBC-0xBF */ + 0xDD, 0x41, 0xB6, 0xF9, 0xB7, 0x41, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xDC, 0xF4, 0x3F, 0x3F, 0xDC, 0xFE, 0xDC, 0xF3, /* 0xC4-0xC7 */ + 0xDC, 0xFC, 0xB6, 0xFA, 0xDD, 0x42, 0xDC, 0xF5, /* 0xC8-0xCB */ + 0xB6, 0xFB, 0xDD, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xE1, 0x6E, 0xB9, 0xE2, 0xB9, 0xE1, /* 0xD4-0xD7 */ + 0xB9, 0xE3, 0xE1, 0x7A, 0xE1, 0x70, 0xE1, 0x76, /* 0xD8-0xDB */ + 0xE1, 0x6B, 0xE1, 0x79, 0xE1, 0x78, 0xE1, 0x7C, /* 0xDC-0xDF */ + 0xE1, 0x75, 0xB9, 0xDE, 0xE1, 0x74, 0xB9, 0xE4, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xE1, 0x6D, 0xB9, 0xDF, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xE1, 0x7B, 0xB9, 0xE0, 0xE1, 0x6F, 0xE1, 0x72, /* 0xE8-0xEB */ + 0xE1, 0x77, 0xE1, 0x71, 0xE1, 0x6C, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0x73, /* 0xF0-0xF3 */ + 0xE5, 0x55, 0xBC, 0x61, 0xE5, 0x58, 0xE5, 0x57, /* 0xF4-0xF7 */ + 0xE5, 0x5A, 0xE5, 0x5C, 0xF9, 0xDC, 0xBC, 0x5F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xE5, 0x56, 0x3F, 0x3F, 0xE5, 0x54, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5B[512] = { + 0x3F, 0x3F, 0xE5, 0x5D, 0xE5, 0x5B, 0xE5, 0x59, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xE5, 0x5F, 0x3F, 0x3F, 0xE5, 0x5E, /* 0x04-0x07 */ + 0xBC, 0x63, 0xBC, 0x5E, 0x3F, 0x3F, 0xBC, 0x60, /* 0x08-0x0B */ + 0xBC, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x60, /* 0x0C-0x0F */ + 0xE9, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x56, /* 0x10-0x13 */ + 0xE9, 0x55, 0x3F, 0x3F, 0xE9, 0x58, 0xE9, 0x51, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xE9, 0x52, 0xE9, 0x5A, 0xE9, 0x53, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xBE, 0xC5, 0xE9, 0x5C, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xE9, 0x5B, 0xE9, 0x54, 0x3F, 0x3F, 0xEC, 0xD1, /* 0x20-0x23 */ + 0xC0, 0xA8, 0xEC, 0xCF, 0xEC, 0xD4, 0xEC, 0xD3, /* 0x24-0x27 */ + 0xE9, 0x59, 0x3F, 0x3F, 0xC0, 0xA7, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xEC, 0xD2, 0xEC, 0xCE, 0xEC, 0xD6, 0xEC, 0xD5, /* 0x2C-0x2F */ + 0xC0, 0xA6, 0x3F, 0x3F, 0xEC, 0xD0, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xBE, 0xC6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xC2, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xEF, 0xC1, 0xF1, 0xFA, 0xF1, 0xFB, 0xF1, 0xFC, /* 0x3C-0x3F */ + 0xC4, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0xC4, 0x5D, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xF4, 0x43, 0x3F, 0x3F, 0xF5, 0xC8, /* 0x44-0x47 */ + 0xF5, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xDB, /* 0x48-0x4B */ + 0xF6, 0xDC, 0xF7, 0xD5, 0xF8, 0xA7, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xA4, 0x6C, 0xA4, 0x6D, 0x3F, 0x3F, 0xA4, 0x6E, /* 0x50-0x53 */ + 0xA4, 0xD5, 0xA5, 0xA5, 0xC9, 0xD3, 0xA6, 0x72, /* 0x54-0x57 */ + 0xA6, 0x73, 0x3F, 0x3F, 0xA7, 0xB7, 0xA7, 0xB8, /* 0x58-0x5B */ + 0xA7, 0xB6, 0xA7, 0xB5, 0x3F, 0x3F, 0xA9, 0x73, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0x55, 0xA9, 0x75, /* 0x60-0x63 */ + 0xA9, 0x74, 0xCC, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xAB, 0xC4, 0x3F, 0x3F, 0xAE, 0x5D, /* 0x68-0x6B */ + 0xD1, 0x65, 0x3F, 0x3F, 0xD4, 0xF0, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xB1, 0x45, 0xB4, 0x47, 0xD4, 0xEF, 0xB4, 0x46, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xB9, 0xE5, 0x3F, 0x3F, 0xE1, 0x7D, /* 0x74-0x77 */ + 0xBE, 0xC7, 0x3F, 0x3F, 0xC0, 0xA9, 0xEC, 0xD7, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xC4, 0x5E, 0x3F, 0x3F, 0xC5, 0x70, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xC9, 0x72, 0x3F, 0x3F, 0xA5, 0xA6, /* 0x80-0x83 */ + 0xC9, 0x73, 0xA6, 0x76, 0x3F, 0x3F, 0xA6, 0x74, /* 0x84-0x87 */ + 0xA6, 0x75, 0xA6, 0x77, 0x3F, 0x3F, 0xA7, 0xBA, /* 0x88-0x8B */ + 0xA7, 0xB9, 0x3F, 0x3F, 0xCA, 0xBC, 0xA7, 0xBB, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xBD, 0xCC, 0x57, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xCC, 0x58, 0x3F, 0x3F, 0xA9, 0x76, /* 0x94-0x97 */ + 0xA9, 0x78, 0xA9, 0x7A, 0xA9, 0x77, 0xA9, 0x7B, /* 0x98-0x9B */ + 0xA9, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xC8, 0xAB, 0xC5, /* 0xA0-0xA3 */ + 0xAB, 0xC7, 0xAB, 0xC9, 0xAB, 0xC6, 0xD1, 0x66, /* 0xA4-0xA7 */ + 0xCE, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xD1, 0x68, 0xD1, 0x67, 0xAE, 0x63, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xAE, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAE, 0x60, /* 0xB0-0xB3 */ + 0xAE, 0x62, 0xAE, 0x64, 0xAE, 0x61, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xAE, 0x66, 0xAE, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0x4A, /* 0xBC-0xBF */ + 0xD4, 0xF2, 0xD4, 0xF1, 0xB1, 0x49, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xB1, 0x48, 0xB1, 0x47, 0xB1, 0x4B, 0xB1, 0x46, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0xD5, 0xD8, 0xD2, /* 0xC8-0xCB */ + 0xB4, 0x49, 0xD8, 0xD1, 0xD8, 0xD6, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xB4, 0x4B, 0xD8, 0xD4, 0xB4, 0x48, 0xB4, 0x4A, /* 0xD0-0xD3 */ + 0xD8, 0xD3, 0x3F, 0x3F, 0xDD, 0x48, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xDD, 0x49, 0xDD, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0xE6, 0xB9, 0xEE, /* 0xDC-0xDF */ + 0xE1, 0x7E, 0xB9, 0xE8, 0xB9, 0xEC, 0xE1, 0xA1, /* 0xE0-0xE3 */ + 0xB9, 0xED, 0xB9, 0xE9, 0xB9, 0xEA, 0xB9, 0xE7, /* 0xE4-0xE7 */ + 0xB9, 0xEB, 0xBC, 0x66, 0xD8, 0xD0, 0xBC, 0x67, /* 0xE8-0xEB */ + 0xBC, 0x65, 0x3F, 0x3F, 0xBC, 0x64, 0xE9, 0x5D, /* 0xEC-0xEF */ + 0xBE, 0xC8, 0xEC, 0xD8, 0xEC, 0xD9, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xC3, 0x64, 0xC4, 0x5F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xA4, 0x6F, 0x3F, 0x3F, 0xA6, 0x78, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5C[512] = { + 0x3F, 0x3F, 0xAB, 0xCA, 0x3F, 0x3F, 0xD1, 0x69, /* 0x00-0x03 */ + 0xAE, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0x4E, /* 0x04-0x07 */ + 0xB1, 0x4D, 0xB1, 0x4C, 0xB4, 0x4C, 0xB4, 0x4D, /* 0x08-0x0B */ + 0xD8, 0xD7, 0xB9, 0xEF, 0xBE, 0xC9, 0xA4, 0x70, /* 0x0C-0x0F */ + 0xC9, 0x5C, 0xA4, 0xD6, 0xC9, 0x74, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xC9, 0xD4, 0xA6, 0x79, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0x7C, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0x4B, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0x71, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xA4, 0xD7, 0xC9, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xCA, 0xBE, 0x3F, 0x3F, 0xCA, 0xBF, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xA7, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xD8, 0xD8, 0xB4, 0x4E, 0x3F, 0x3F, 0xDD, 0x4C, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xAA, /* 0x34-0x37 */ + 0xA4, 0x72, 0xA4, 0xA8, 0xA4, 0xD8, 0xC9, 0x75, /* 0x38-0x3B */ + 0xA5, 0xA7, 0x3F, 0x3F, 0xA7, 0xC0, 0xA7, 0xBF, /* 0x3C-0x3F */ + 0xA7, 0xBD, 0xA7, 0xBE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xCC, 0x59, 0xA9, 0x7E, 0xA9, 0xA1, 0xCC, 0x5A, /* 0x44-0x47 */ + 0xA9, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xCE, /* 0x48-0x4B */ + 0xCE, 0x78, 0xAB, 0xCD, 0xAB, 0xCB, 0xAB, 0xCC, /* 0x4C-0x4F */ + 0xAE, 0x6A, 0xAE, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xD1, 0x6B, 0xAE, 0x69, 0xD1, 0x6A, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xAE, 0x5E, 0xD4, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xB1, 0x50, 0xB1, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xB1, 0x4F, 0x3F, 0x3F, 0xB9, 0xF0, 0xE1, 0xA2, /* 0x60-0x63 */ + 0xBC, 0x68, 0xBC, 0x69, 0x3F, 0x3F, 0xE5, 0x61, /* 0x64-0x67 */ + 0xC0, 0xAB, 0xEF, 0xC2, 0xEF, 0xC3, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xC4, 0xDD, 0xF8, 0xA8, 0xC9, 0x4B, 0xA4, 0xD9, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xA4, 0x73, 0x3F, 0x3F, 0xC9, 0x77, /* 0x70-0x73 */ + 0xC9, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xA6, 0x7A, 0xC9, 0xD7, 0xC9, 0xD8, /* 0x78-0x7B */ + 0xC9, 0xD6, 0x3F, 0x3F, 0xC9, 0xD9, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xC7, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xCA, 0xC2, 0xCA, 0xC4, 0xCA, 0xC6, 0xCA, 0xC3, /* 0x88-0x8B */ + 0xA7, 0xC4, 0xCA, 0xC0, 0x3F, 0x3F, 0xCA, 0xC1, /* 0x8C-0x8F */ + 0xA7, 0xC1, 0xA7, 0xC2, 0xCA, 0xC5, 0xCA, 0xC8, /* 0x90-0x93 */ + 0xA7, 0xC3, 0xCA, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xCC, 0x68, 0x3F, 0x3F, 0xCC, 0x62, /* 0x9C-0x9F */ + 0xCC, 0x5D, 0xA9, 0xA3, 0xCC, 0x65, 0xCC, 0x63, /* 0xA0-0xA3 */ + 0xCC, 0x5C, 0xCC, 0x69, 0xCC, 0x6C, 0xCC, 0x67, /* 0xA4-0xA7 */ + 0xCC, 0x60, 0xA9, 0xA5, 0xCC, 0x66, 0xA9, 0xA6, /* 0xA8-0xAB */ + 0xCC, 0x61, 0xCC, 0x64, 0xCC, 0x5B, 0xCC, 0x5F, /* 0xAC-0xAF */ + 0xCC, 0x6B, 0xA9, 0xA7, 0x3F, 0x3F, 0xA9, 0xA8, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xCC, 0x5E, 0xCC, 0x6A, 0xA9, 0xA2, /* 0xB4-0xB7 */ + 0xA9, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xAB, 0xCE, 0xA4, /* 0xC4-0xC7 */ + 0xCE, 0xAA, 0xCE, 0xA3, 0xCE, 0xA5, 0xCE, 0x7D, /* 0xC8-0xCB */ + 0xCE, 0x7B, 0x3F, 0x3F, 0xCE, 0xAC, 0xCE, 0xA9, /* 0xCC-0xCF */ + 0xCE, 0x79, 0x3F, 0x3F, 0xAB, 0xD0, 0xCE, 0xA7, /* 0xD0-0xD3 */ + 0xCE, 0xA8, 0x3F, 0x3F, 0xCE, 0xA6, 0xCE, 0x7C, /* 0xD4-0xD7 */ + 0xCE, 0x7A, 0xAB, 0xCF, 0xCE, 0xA2, 0xCE, 0x7E, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xA1, 0xCE, 0xAD, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xAE, 0x6F, 0x3F, 0x3F, 0xAE, 0x6E, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xD1, 0x6C, 0xAE, 0x6B, 0xD1, 0x6E, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xAE, 0x70, 0xD1, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xAE, 0x73, 0x3F, 0x3F, 0xAE, 0x71, 0xD1, 0x70, /* 0xF4-0xF7 */ + 0xCE, 0xAE, 0xD1, 0x72, 0x3F, 0x3F, 0xAE, 0x6D, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xAE, 0x6C, 0x3F, 0x3F, 0xD1, 0x6D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5D[512] = { + 0xD1, 0x71, 0xAE, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0x53, 0xB1, 0x52, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0xF5, /* 0x08-0x0B */ + 0xD4, 0xF9, 0xD4, 0xFB, 0xB1, 0x54, 0xD4, 0xFE, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xB1, 0x58, 0xD5, 0x41, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xB1, 0x5A, 0x3F, 0x3F, 0xB1, 0x56, 0xB1, 0x5E, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xB1, 0x5B, 0xD4, 0xF7, 0xB1, 0x55, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xD4, 0xF6, 0xD4, 0xF4, 0xD5, 0x43, /* 0x1C-0x1F */ + 0xD4, 0xF8, 0x3F, 0x3F, 0xB1, 0x57, 0xD5, 0x42, /* 0x20-0x23 */ + 0xB1, 0x5C, 0xD4, 0xFD, 0xD4, 0xFC, 0xB1, 0x5D, /* 0x24-0x27 */ + 0xD4, 0xFA, 0xB1, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0x44, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xD5, 0x40, 0xD8, 0xE7, 0xD8, 0xEE, 0xD8, 0xE3, /* 0x30-0x33 */ + 0xB4, 0x51, 0xD8, 0xDF, 0xD8, 0xEF, 0xD8, 0xD9, /* 0x34-0x37 */ + 0xD8, 0xEC, 0xD8, 0xEA, 0xD8, 0xE4, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xD8, 0xED, 0xD8, 0xE6, 0x3F, 0x3F, 0xD8, 0xDE, /* 0x3C-0x3F */ + 0xD8, 0xF0, 0xD8, 0xDC, 0xD8, 0xE9, 0xD8, 0xDA, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xD8, 0xF1, 0x3F, 0x3F, 0xB4, 0x52, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xD8, 0xEB, 0xDD, 0x4F, 0xD8, 0xDD, /* 0x48-0x4B */ + 0xB4, 0x4F, 0x3F, 0x3F, 0xD8, 0xE1, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xB4, 0x50, 0xD8, 0xE0, 0xD8, 0xE5, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xD8, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xD8, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0x53, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0x56, 0xDD, 0x4E, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xDD, 0x50, 0x3F, 0x3F, 0xDD, 0x55, /* 0x64-0x67 */ + 0xDD, 0x54, 0xB7, 0x43, 0x3F, 0x3F, 0xD8, 0xDB, /* 0x68-0x6B */ + 0xDD, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0x44, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xDD, 0x4D, 0xDD, 0x51, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xA9, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xE1, 0xB0, 0xE1, 0xA7, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xE1, 0xAE, 0xE1, 0xA5, 0xE1, 0xAD, 0xE1, 0xB1, /* 0x7C-0x7F */ + + 0xE1, 0xA4, 0xE1, 0xA8, 0xE1, 0xA3, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xB9, 0xF1, 0x3F, 0x3F, 0xE1, 0xA6, 0xB9, 0xF2, /* 0x84-0x87 */ + 0xE1, 0xAC, 0xE1, 0xAB, 0xE1, 0xAA, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xE1, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x65, 0xE5, 0x67, /* 0x90-0x93 */ + 0xBC, 0x6B, 0xE5, 0x68, 0x3F, 0x3F, 0xE5, 0x63, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xE5, 0x62, 0xE5, 0x6C, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xE5, 0x6A, 0xBC, 0x6A, 0xE5, 0x6D, 0xE5, 0x64, /* 0x9C-0x9F */ + 0xE5, 0x69, 0xE5, 0x6B, 0xE5, 0x66, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x61, /* 0xA4-0xA7 */ + 0xE9, 0x66, 0xE9, 0x60, 0xE9, 0x65, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE9, 0x5E, 0xE9, 0x68, 0xE9, 0x64, 0xE9, 0x69, /* 0xAC-0xAF */ + 0xE9, 0x63, 0xE9, 0x5F, 0xE9, 0x67, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xE9, 0x6A, 0xE9, 0x62, 0x3F, 0x3F, 0xEC, 0xDA, /* 0xB4-0xB7 */ + 0xC0, 0xAF, 0x3F, 0x3F, 0xC0, 0xAD, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xC0, 0xAC, 0xC0, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xEF, 0xC4, 0x3F, 0x3F, 0xF1, 0x72, 0xF1, 0xFD, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0x44, 0xF4, 0x45, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xC4, 0x60, 0x3F, 0x3F, 0xF5, 0xC9, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xC4, 0xDE, 0x3F, 0x3F, 0xF5, 0xCA, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xF6, 0xDE, 0xC5, 0x72, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xC5, 0x71, 0xF6, 0xDD, 0xC5, 0xC9, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xF7, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xA4, 0x74, 0xA6, 0x7B, 0xC9, 0xDA, /* 0xDC-0xDF */ + 0xCA, 0xCA, 0xA8, 0xB5, 0xB1, 0x5F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xA4, 0x75, 0xA5, 0xAA, 0xA5, 0xA9, /* 0xE4-0xE7 */ + 0xA5, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xC5, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAE, 0x74, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xDD, 0x57, 0xA4, 0x76, 0xA4, 0x77, 0xA4, 0x78, /* 0xF0-0xF3 */ + 0xA4, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xD1, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xCE, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xB4, 0x53, 0xA4, 0x79, 0xC9, 0x5D, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0xAB, 0xA5, 0xAC, /* 0x00-0x03 */ + 0xC9, 0x78, 0x3F, 0x3F, 0xA6, 0x7C, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xCB, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xA7, 0xC6, 0x3F, 0x3F, 0xCA, 0xCC, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xA9, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xCC, 0x6E, 0xA9, 0xAC, 0xA9, 0xAB, 0xCC, 0x6D, /* 0x14-0x17 */ + 0xA9, 0xA9, 0xCC, 0x6F, 0xA9, 0xAA, 0xA9, 0xAD, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xAB, 0xD2, 0x3F, 0x3F, 0xAB, 0xD4, /* 0x1C-0x1F */ + 0xCE, 0xB3, 0xCE, 0xB0, 0xCE, 0xB1, 0xCE, 0xB2, /* 0x20-0x23 */ + 0xCE, 0xB4, 0xAB, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xD1, 0x74, 0xD1, 0x73, 0x3F, 0x3F, 0xAE, 0x76, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xAE, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0x62, /* 0x30-0x33 */ + 0xD5, 0x46, 0x3F, 0x3F, 0xB1, 0x61, 0xB1, 0x63, /* 0x34-0x37 */ + 0xB1, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xB4, 0x55, 0xD5, 0x45, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xB4, 0x56, 0xD8, 0xF3, 0x3F, 0x3F, 0xB4, 0x57, /* 0x40-0x43 */ + 0xD8, 0xF2, 0xB4, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0x5A, 0xDD, 0x5C, /* 0x48-0x4B */ + 0xB7, 0x45, 0xDD, 0x5B, 0xDD, 0x59, 0xDD, 0x58, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xB4, /* 0x50-0x53 */ + 0xB9, 0xF7, 0xB9, 0xF5, 0x3F, 0x3F, 0xB9, 0xF6, /* 0x54-0x57 */ + 0xE1, 0xB2, 0xE1, 0xB3, 0x3F, 0x3F, 0xB9, 0xF3, /* 0x58-0x5B */ + 0xE5, 0x71, 0xE5, 0x6F, 0x3F, 0x3F, 0xBC, 0x6D, /* 0x5C-0x5F */ + 0xE5, 0x70, 0xBC, 0x6E, 0xBC, 0x6C, 0xB9, 0xF4, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0x6D, 0xE9, 0x6B, /* 0x64-0x67 */ + 0xE9, 0x6C, 0xE5, 0x6E, 0xEC, 0xDC, 0xC0, 0xB0, /* 0x68-0x6B */ + 0xEC, 0xDB, 0xEF, 0xC5, 0xEF, 0xC6, 0xE9, 0x6E, /* 0x6C-0x6F */ + 0xF1, 0xFE, 0x3F, 0x3F, 0xA4, 0x7A, 0xA5, 0xAD, /* 0x70-0x73 */ + 0xA6, 0x7E, 0xC9, 0xDB, 0xA6, 0x7D, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xA9, 0xAF, 0xB7, 0x46, 0x3F, 0x3F, 0xA4, 0xDB, /* 0x78-0x7B */ + 0xA5, 0xAE, 0xAB, 0xD5, 0xB4, 0x58, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xC9, 0x79, 0x3F, 0x3F, 0xC9, 0x7A, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xC9, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xC8, /* 0x84-0x87 */ + 0xCA, 0xD0, 0xCA, 0xCE, 0xA7, 0xC9, 0xCA, 0xCD, /* 0x88-0x8B */ + 0xCA, 0xCF, 0xCA, 0xD1, 0x3F, 0x3F, 0xA7, 0xC7, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xA9, 0xB3, 0xA9, 0xB4, 0xA9, 0xB1, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0xB0, 0xCE, 0xB8, /* 0x98-0x9B */ + 0xA9, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xAB, 0xD6, 0x3F, 0x3F, 0xCE, 0xB7, 0xCE, 0xB9, /* 0xA0-0xA3 */ + 0xCE, 0xB6, 0xCE, 0xBA, 0xAB, 0xD7, 0xAE, 0x79, /* 0xA4-0xA7 */ + 0xD1, 0x75, 0x3F, 0x3F, 0xD1, 0x77, 0xAE, 0x77, /* 0xA8-0xAB */ + 0xD1, 0x78, 0xAE, 0x78, 0xD1, 0x76, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xCE, 0xB5, 0xD5, 0x47, 0xD5, 0x4A, 0xD5, 0x4B, /* 0xB0-0xB3 */ + 0xD5, 0x48, 0xB1, 0x67, 0xB1, 0x66, 0xB1, 0x64, /* 0xB4-0xB7 */ + 0xB1, 0x65, 0xD5, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0x68, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xB4, 0x5A, 0xB4, 0x5B, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xB4, 0x5C, 0xDD, 0x5D, 0xDD, 0x5F, 0xDD, 0x61, /* 0xC4-0xC7 */ + 0xB7, 0x48, 0xB7, 0x47, 0xB4, 0x59, 0xDD, 0x60, /* 0xC8-0xCB */ + 0xDD, 0x5E, 0x3F, 0x3F, 0xE1, 0xB8, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xE1, 0xB6, 0xE1, 0xBC, 0xB9, 0xF8, /* 0xD0-0xD3 */ + 0xE1, 0xBD, 0xE1, 0xBA, 0xB9, 0xF9, 0xE1, 0xB7, /* 0xD4-0xD7 */ + 0xE1, 0xB5, 0xE1, 0xBB, 0xBC, 0x70, 0xE5, 0x73, /* 0xD8-0xDB */ + 0xE1, 0xB9, 0xBC, 0x72, 0xE5, 0x74, 0xBC, 0x71, /* 0xDC-0xDF */ + 0xBC, 0x74, 0xE5, 0x75, 0xBC, 0x6F, 0xBC, 0x73, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xE9, 0x73, 0xE9, 0x71, 0xE9, 0x70, /* 0xE4-0xE7 */ + 0xE9, 0x72, 0xE9, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xC3, 0x66, 0x3F, 0x3F, 0xF4, 0x46, 0xF4, 0x47, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xF5, 0xCB, 0xF6, 0xDF, 0xC6, 0x55, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0xB5, 0xA7, 0xCA, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xD8, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0x7B, 0xA4, 0xDC, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_5F[512] = { + 0x3F, 0x3F, 0xA5, 0xAF, 0xC9, 0xDD, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xA7, 0xCB, 0xCA, 0xD2, 0x3F, 0x3F, 0xCE, 0xBB, /* 0x04-0x07 */ + 0xAB, 0xD9, 0x3F, 0x3F, 0xB9, 0xFA, 0xA4, 0x7C, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0xA1, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0x49, 0xA4, 0x7D, /* 0x10-0x13 */ + 0xA4, 0xDD, 0xA4, 0xDE, 0x3F, 0x3F, 0xA5, 0xB1, /* 0x14-0x17 */ + 0xA5, 0xB0, 0x3F, 0x3F, 0xC9, 0xDE, 0xA6, 0xA2, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xCA, 0xD3, 0x3F, 0x3F, 0xA7, 0xCC, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0x71, 0xCC, 0x72, /* 0x20-0x23 */ + 0xCC, 0x73, 0x3F, 0x3F, 0xA9, 0xB6, 0xA9, 0xB7, /* 0x24-0x27 */ + 0xCC, 0x70, 0xA9, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xAB, 0xDA, 0xCE, 0xBC, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xD1, 0x7A, 0xAE, 0x7A, 0x3F, 0x3F, 0xD1, 0x79, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xB1, 0x69, 0xD5, 0x4C, 0xB1, 0x6A, /* 0x34-0x37 */ + 0xD5, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xB4, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xDD, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xBF, /* 0x40-0x43 */ + 0xE1, 0xBE, 0x3F, 0x3F, 0xB9, 0xFB, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xBC, 0x75, 0xE5, 0x76, 0xBE, 0xCA, 0xE9, 0x74, /* 0x48-0x4B */ + 0xC0, 0xB1, 0x3F, 0x3F, 0xC5, 0x73, 0xF7, 0xD8, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xCC, 0x74, 0x3F, 0x3F, 0xCE, 0xBD, 0xB1, 0x6B, /* 0x54-0x57 */ + 0xD8, 0xF4, 0xB7, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xC2, 0x55, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA7, 0xCE, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xA7, 0xCD, 0xAB, 0xDB, 0x3F, 0x3F, 0xD1, 0x7B, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xB1, 0x6D, 0xB3, 0x43, 0xB1, 0x6E, /* 0x68-0x6B */ + 0xB1, 0x6C, 0xB4, 0x5E, 0x3F, 0x3F, 0xE1, 0xC0, /* 0x6C-0x6F */ + 0xB9, 0xFC, 0xBC, 0x76, 0x3F, 0x3F, 0xC9, 0x4C, /* 0x70-0x73 */ + 0xC9, 0xDF, 0x3F, 0x3F, 0xCA, 0xD5, 0xA7, 0xCF, /* 0x74-0x77 */ + 0xCA, 0xD4, 0xA7, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xA9, 0xBC, 0xCC, 0x77, 0xCC, 0x76, 0xA9, 0xBB, /* 0x7C-0x7F */ + + 0xA9, 0xB9, 0xA9, 0xBA, 0xCC, 0x75, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xAB, 0xDD, 0xCE, 0xBE, 0xAB, 0xE0, /* 0x84-0x87 */ + 0xAB, 0xDC, 0xAB, 0xE2, 0xAB, 0xDE, 0xAB, 0xDF, /* 0x88-0x8B */ + 0xAB, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xAE, 0x7D, 0xAE, 0x7C, 0xAE, 0x7B, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0x4F, 0xB1, 0x6F, /* 0x94-0x97 */ + 0xB1, 0x72, 0xB1, 0x70, 0x3F, 0x3F, 0xD5, 0x4E, /* 0x98-0x9B */ + 0xB1, 0x75, 0x3F, 0x3F, 0xB1, 0x71, 0xD5, 0x50, /* 0x9C-0x9F */ + 0xB1, 0x74, 0xB1, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xD8, 0xF6, 0xD8, 0xF5, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xB4, 0x61, 0xB4, 0x5F, 0xB4, 0x60, 0xD8, 0xF7, /* 0xA8-0xAB */ + 0xB7, 0x4B, 0xDD, 0x64, 0xB7, 0x4C, 0xDD, 0x63, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0x77, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xBC, 0x78, 0xE1, 0xC1, 0xBC, 0x77, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xB9, 0xFD, 0x3F, 0x3F, 0xEC, 0xDE, /* 0xB8-0xBB */ + 0xE9, 0x75, 0xC0, 0xB2, 0xEC, 0xDD, 0xF2, 0x40, /* 0xBC-0xBF */ + 0xF4, 0x48, 0xF4, 0x49, 0x3F, 0x3F, 0xA4, 0xDF, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xA5, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xC9, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xA7, 0xD2, 0xA7, 0xD4, 0x3F, 0x3F, 0xC9, 0xE2, /* 0xCC-0xCF */ + 0xCA, 0xD8, 0xCA, 0xD7, 0xCA, 0xD6, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xC9, 0xE1, 0xC9, 0xE0, 0xA6, 0xA4, 0xA7, 0xD3, /* 0xD4-0xD7 */ + 0xA7, 0xD1, 0xA6, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xA9, 0xBD, 0xCC, 0x78, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xA9, 0xBE, 0xCA, 0xDD, 0x3F, 0x3F, 0xCA, 0xDF, /* 0xE0-0xE3 */ + 0xCA, 0xDE, 0xCC, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xCA, 0xDA, 0x3F, 0x3F, 0xA7, 0xD8, 0xA7, 0xD6, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xCA, 0xD9, 0xCA, 0xDB, 0xCA, 0xE1, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xA7, 0xD5, 0x3F, 0x3F, 0xCA, 0xDC, /* 0xF0-0xF3 */ + 0xCA, 0xE5, 0xA9, 0xC0, 0x3F, 0x3F, 0xCA, 0xE2, /* 0xF4-0xF7 */ + 0xA7, 0xD7, 0x3F, 0x3F, 0xCA, 0xE0, 0xCA, 0xE3, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xA9, 0xBF, 0x3F, 0x3F, 0xA9, 0xC1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_60[512] = { + 0xCA, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xCC, 0xAF, 0xCC, 0xA2, 0xCC, 0x7E, /* 0x08-0x0B */ + 0xCC, 0xAE, 0xCC, 0xA9, 0xAB, 0xE7, 0xA9, 0xC2, /* 0x0C-0x0F */ + 0xCC, 0xAA, 0xCC, 0xAD, 0xAB, 0xE3, 0xCC, 0xAC, /* 0x10-0x13 */ + 0xA9, 0xC3, 0xA9, 0xC8, 0xA9, 0xC6, 0xCC, 0xA3, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xCC, 0x7C, 0xCC, 0xA5, 0xA9, 0xCD, /* 0x18-0x1B */ + 0xCC, 0xB0, 0xAB, 0xE4, 0xCC, 0xA6, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xAB, 0xE5, 0xA9, 0xC9, 0xCC, 0xA8, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xCE, 0xCD, 0xAB, 0xE6, 0xCC, 0x7B, 0xA9, 0xCA, /* 0x24-0x27 */ + 0xAB, 0xE8, 0xA9, 0xCB, 0xA9, 0xC7, 0xA9, 0xCC, /* 0x28-0x2B */ + 0xCC, 0xA7, 0xCC, 0x7A, 0xCC, 0xAB, 0xA9, 0xC4, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0x7D, 0xCC, 0xA4, /* 0x30-0x33 */ + 0xCC, 0xA1, 0xA9, 0xC5, 0x3F, 0x3F, 0xCE, 0xBF, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xCE, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xCE, 0xCA, 0xD1, 0xA1, 0xCE, 0xCB, 0xAB, 0xEE, /* 0x40-0x43 */ + 0xCE, 0xCE, 0xCE, 0xC4, 0xAB, 0xED, 0xCE, 0xC6, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xCE, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xCE, 0xC9, 0xAB, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xAE, 0xA3, 0x3F, 0x3F, 0xF9, 0xDA, 0xCE, 0xC5, /* 0x50-0x53 */ + 0xCE, 0xC1, 0xAE, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xCE, 0xCF, 0xAE, 0x7E, 0xD1, 0x7D, 0xCE, 0xC8, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xD1, 0x7C, 0xCE, 0xC3, 0xCE, 0xCC, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xEC, 0xAE, 0xA1, /* 0x60-0x63 */ + 0xAB, 0xF2, 0xAE, 0xA2, 0xCE, 0xD0, 0xD1, 0x7E, /* 0x64-0x67 */ + 0xAB, 0xEB, 0xAE, 0xA6, 0xAB, 0xF1, 0xAB, 0xF0, /* 0x68-0x6B */ + 0xAB, 0xEF, 0xAE, 0xA5, 0xCE, 0xD1, 0xAE, 0xA7, /* 0x6C-0x6F */ + 0xAB, 0xEA, 0x3F, 0x3F, 0xCE, 0xC2, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0x76, /* 0x7C-0x7F */ + + 0xD1, 0xA4, 0xD1, 0xA6, 0x3F, 0x3F, 0xD1, 0xA8, /* 0x80-0x83 */ + 0xAE, 0xA8, 0xAE, 0xAE, 0xD5, 0x53, 0xD1, 0xAC, /* 0x84-0x87 */ + 0xD1, 0xA3, 0xB1, 0x78, 0xD5, 0x51, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xAE, 0xAD, 0xAE, 0xAB, 0xD1, 0xAE, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xD5, 0x52, 0x3F, 0x3F, 0xD1, 0xA5, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xAE, 0xAC, 0xD1, 0xA9, 0xAE, 0xAF, 0xD1, 0xAB, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAE, 0xAA, 0xD1, 0xAA, /* 0x98-0x9B */ + 0xD1, 0xAD, 0xD1, 0xA7, 0x3F, 0x3F, 0xAE, 0xA9, /* 0x9C-0x9F */ + 0xB1, 0x79, 0x3F, 0x3F, 0xD1, 0xA2, 0xB1, 0x77, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xB1, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xD5, 0x55, 0xD5, 0x5E, 0xB4, 0x64, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xB1, 0x7C, 0xB1, 0xA3, 0xB4, 0x65, 0xD5, 0x60, /* 0xB4-0xB7 */ + 0xB1, 0xAA, 0xD8, 0xF9, 0xD5, 0x56, 0xB1, 0xA2, /* 0xB8-0xBB */ + 0xB1, 0xA5, 0xB1, 0x7E, 0xD5, 0x54, 0xD5, 0x62, /* 0xBC-0xBF */ + 0xD5, 0x65, 0xD9, 0x49, 0x3F, 0x3F, 0xD5, 0x63, /* 0xC0-0xC3 */ + 0xD8, 0xFD, 0xB1, 0xA1, 0xB1, 0xA8, 0xB1, 0xAC, /* 0xC4-0xC7 */ + 0xD5, 0x5D, 0xD8, 0xF8, 0xD5, 0x61, 0xB1, 0x7B, /* 0xC8-0xCB */ + 0xD8, 0xFA, 0xD5, 0x64, 0xD8, 0xFC, 0xD5, 0x59, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xB4, 0x62, 0x3F, 0x3F, 0xD5, 0x57, /* 0xD0-0xD3 */ + 0xD5, 0x58, 0xB1, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xB1, 0xA6, 0xD5, 0x5B, 0xB1, 0xAB, 0xD5, 0x5F, /* 0xD8-0xDB */ + 0xB1, 0xA4, 0xD5, 0x5C, 0x3F, 0x3F, 0xB1, 0xA9, /* 0xDC-0xDF */ + 0xB4, 0x66, 0xB4, 0x63, 0xD8, 0xFB, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xD5, 0x5A, 0x3F, 0x3F, 0xB1, 0x7D, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xB4, 0x6B, 0xB4, 0x6F, 0xD9, 0x40, 0xB7, 0x51, /* 0xF0-0xF3 */ + 0xB4, 0x6D, 0xD9, 0x44, 0xB4, 0x71, 0xDD, 0x65, /* 0xF4-0xF7 */ + 0xD9, 0x46, 0xB7, 0x53, 0xB4, 0x69, 0xB4, 0x6C, /* 0xF8-0xFB */ + 0xD9, 0x47, 0x3F, 0x3F, 0xD9, 0x48, 0xD9, 0x4E, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_61[512] = { + 0xB4, 0x73, 0xB7, 0x54, 0x3F, 0x3F, 0xD9, 0x4A, /* 0x00-0x03 */ + 0xD9, 0x4F, 0xD9, 0x43, 0xB7, 0x5E, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xB7, 0x55, 0xB4, 0x72, 0xD9, 0x41, 0xD9, 0x50, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xB7, 0x5D, 0xB4, 0x70, 0xB7, 0x4E, /* 0x0C-0x0F */ + 0xD9, 0x4D, 0x3F, 0x3F, 0xB4, 0x74, 0xD9, 0x45, /* 0x10-0x13 */ + 0xD8, 0xFE, 0xB4, 0x6A, 0xD9, 0x42, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xD9, 0x4B, 0x3F, 0x3F, 0xB7, 0x4D, 0xB7, 0x52, /* 0x18-0x1B */ + 0xB4, 0x67, 0xD9, 0x4C, 0x3F, 0x3F, 0xB7, 0x50, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB4, 0x68, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0x5C, /* 0x24-0x27 */ + 0xE1, 0xC3, 0xDD, 0x70, 0x3F, 0x3F, 0xDD, 0x68, /* 0x28-0x2B */ + 0xE1, 0xC2, 0x3F, 0x3F, 0xDD, 0x6C, 0xDD, 0x6E, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0x6B, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xB7, 0x5B, 0x3F, 0x3F, 0xDD, 0x6A, 0xB7, 0x5F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xD2, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0x5A, 0xBA, 0x40, /* 0x3C-0x3F */ + 0xDD, 0x71, 0xE1, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xB7, 0x58, 0xDD, 0x69, 0xDD, 0x6D, 0xB9, 0xFE, /* 0x44-0x47 */ + 0xB7, 0x4F, 0xDD, 0x66, 0xDD, 0x67, 0xBA, 0x41, /* 0x48-0x4B */ + 0xB7, 0x57, 0xB7, 0x59, 0xB7, 0x56, 0xDD, 0x6F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xC8, 0xE1, 0xC9, /* 0x50-0x53 */ + 0xE1, 0xCE, 0xBC, 0x7D, 0xE1, 0xD5, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xBA, 0x47, 0x3F, 0x3F, 0xBA, 0x46, 0xE1, 0xD0, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xBC, 0x7C, 0xE1, 0xC5, 0xBA, 0x45, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xE1, 0xD4, 0xBA, 0x43, 0xBA, 0x44, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xE1, 0xD1, 0xE5, 0xAA, 0xBC, 0x7A, /* 0x64-0x67 */ + 0xB4, 0x6E, 0x3F, 0x3F, 0xE1, 0xD3, 0xBC, 0xA3, /* 0x68-0x6B */ + 0xE1, 0xCB, 0x3F, 0x3F, 0xBC, 0x7B, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xBC, 0xA2, 0xE1, 0xC6, 0xE1, 0xCA, 0xE1, 0xC7, /* 0x70-0x73 */ + 0xE1, 0xCD, 0xBA, 0x48, 0xBC, 0x79, 0xBA, 0x42, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xE5, 0x7A, 0xE1, 0xCF, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xBC, 0xA1, 0x3F, 0x3F, 0xBC, 0xA4, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xE1, 0xCC, 0x3F, 0x3F, 0xBC, 0x7E, 0xE5, 0x79, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xE5, 0x7E, 0xBE, 0xCE, 0xE5, 0x78, /* 0x88-0x8B */ + 0xE9, 0xA3, 0xE5, 0xA9, 0xBC, 0xA8, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xBC, 0xA6, 0xBE, 0xCC, 0xE5, 0xA6, 0xE5, 0xA2, /* 0x90-0x93 */ + 0xBC, 0xAC, 0x3F, 0x3F, 0xE9, 0x78, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0xAA, 0xE5, 0xA1, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xE9, 0x76, 0x3F, 0x3F, 0xE5, 0xA5, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xE5, 0xA8, 0xE5, 0x7D, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xBC, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0xA5, /* 0xA4-0xA7 */ + 0xE9, 0x77, 0xBE, 0xCD, 0xE5, 0xA7, 0xBC, 0xA7, /* 0xA8-0xAB */ + 0xBC, 0xA9, 0xE5, 0xA4, 0xBC, 0xAD, 0xE5, 0xA3, /* 0xAC-0xAF */ + 0xE5, 0x7C, 0xE5, 0x7B, 0xBE, 0xCB, 0xE5, 0xAB, /* 0xB0-0xB3 */ + 0xE9, 0x7A, 0xEC, 0xE0, 0xBE, 0xD0, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xE9, 0xA2, 0x3F, 0x3F, 0xE9, 0x7E, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xEC, 0xE1, 0x3F, 0x3F, 0xBE, 0xD1, 0xE9, 0xA1, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xE9, 0x7C, 0xC0, 0xB4, 0xEC, 0xDF, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xE9, 0x79, 0xE9, 0x7B, 0xC0, 0xB5, /* 0xC4-0xC7 */ + 0xBE, 0xD3, 0xC0, 0xB3, 0xBE, 0xD2, 0xC0, 0xB7, /* 0xC8-0xCB */ + 0xE9, 0x7D, 0xBE, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xCF, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xEF, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xE7, 0xEF, 0xC8, /* 0xDC-0xDF */ + 0xEC, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0x56, /* 0xE0-0xE3 */ + 0xEC, 0xE5, 0xEC, 0xE4, 0xC0, 0xB6, 0xEC, 0xE2, /* 0xE4-0xE7 */ + 0xEC, 0xE6, 0xEF, 0xD0, 0xEF, 0xCC, 0xEF, 0xCE, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xEF, 0xC9, 0xEF, 0xCA, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xEF, 0xCD, 0xEF, 0xCB, 0xC3, 0x67, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xC3, 0x6A, 0xC3, 0x69, 0xC3, 0x68, /* 0xF4-0xF7 */ + 0xC4, 0x61, 0xF4, 0x4A, 0xC4, 0x62, 0xF2, 0x41, /* 0xF8-0xFB */ + 0xC4, 0xDF, 0xF5, 0xCC, 0xC4, 0xE0, 0xC5, 0x74, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_62[512] = { + 0xC5, 0xCA, 0xF7, 0xD9, 0x3F, 0x3F, 0xF7, 0xDA, /* 0x00-0x03 */ + 0xF7, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xBA, /* 0x04-0x07 */ + 0xA4, 0xE0, 0xC9, 0x7C, 0xA5, 0xB3, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xA6, 0xA6, 0xA6, 0xA7, 0xA6, 0xA5, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xA6, 0xA8, 0xA7, 0xDA, 0xA7, 0xD9, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xCC, 0xB1, 0xA9, 0xCF, 0xA9, 0xCE, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xD1, 0xAF, 0xB1, 0xAD, 0xB1, 0xAE, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB4, 0x75, /* 0x1C-0x1F */ + 0xDD, 0x72, 0xB7, 0x60, 0xB7, 0x61, 0xDD, 0x74, /* 0x20-0x23 */ + 0xDD, 0x76, 0xDD, 0x75, 0x3F, 0x3F, 0xE1, 0xD7, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xE1, 0xD6, 0xBA, 0x49, 0xE1, 0xD8, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xE5, 0xAC, 0xBC, 0xAE, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xBE, 0xD4, 0x3F, 0x3F, 0xC0, 0xB8, 0xC2, 0x57, /* 0x30-0x33 */ + 0xC0, 0xB9, 0x3F, 0x3F, 0xA4, 0xE1, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0xE6, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xCC, 0xB2, 0xA9, 0xD1, 0xA9, 0xD0, /* 0x3C-0x3F */ + 0xA9, 0xD2, 0xAB, 0xF3, 0xCE, 0xD2, 0xCE, 0xD3, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xB0, 0xAE, 0xB0, /* 0x44-0x47 */ + 0xB1, 0xAF, 0xB4, 0x76, 0xD9, 0x51, 0xA4, 0xE2, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xA4, 0x7E, 0xA4, 0xE3, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xC9, 0x7D, 0xA5, 0xB7, 0xA5, 0xB6, 0xA5, 0xB4, /* 0x50-0x53 */ + 0xA5, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xA6, 0xAB, 0xC9, 0xE9, 0xC9, 0xEB, 0xA6, 0xAA, /* 0x58-0x5B */ + 0xC9, 0xE3, 0x3F, 0x3F, 0xC9, 0xE4, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xC9, 0xEA, 0xC9, 0xE6, 0xC9, 0xE8, 0xA6, 0xA9, /* 0x60-0x63 */ + 0xC9, 0xE5, 0xC9, 0xEC, 0xC9, 0xE7, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xA7, 0xE1, 0xA7, 0xEA, 0xA7, 0xE8, /* 0x6C-0x6F */ + 0xCA, 0xF0, 0xCA, 0xED, 0xCA, 0xF5, 0xA7, 0xE6, /* 0x70-0x73 */ + 0xCA, 0xF6, 0x3F, 0x3F, 0xA7, 0xDF, 0xCA, 0xF3, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xA7, 0xE5, 0xCA, 0xEF, 0xCA, 0xEE, /* 0x78-0x7B */ + 0xA7, 0xE3, 0xCA, 0xF4, 0xA7, 0xE4, 0xA9, 0xD3, /* 0x7C-0x7F */ + + 0xA7, 0xDE, 0xCA, 0xF1, 0x3F, 0x3F, 0xCA, 0xE7, /* 0x80-0x83 */ + 0xA7, 0xDB, 0x3F, 0x3F, 0xA7, 0xEE, 0xCA, 0xEC, /* 0x84-0x87 */ + 0xCA, 0xF2, 0xA7, 0xE0, 0xA7, 0xE2, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xCA, 0xE8, 0x3F, 0x3F, 0xCA, 0xE9, 0xCA, 0xEA, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xA7, 0xED, 0xA7, 0xE7, 0xA7, 0xEC, /* 0x90-0x93 */ + 0xCA, 0xEB, 0xA7, 0xEB, 0xA7, 0xDD, 0xA7, 0xDC, /* 0x94-0x97 */ + 0xA7, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xA9, 0xE1, 0xCC, 0xBE, 0xCC, 0xB7, 0xA9, 0xDC, /* 0xA8-0xAB */ + 0xA9, 0xEF, 0xCC, 0xB3, 0xCC, 0xBA, 0xCC, 0xBC, /* 0xAC-0xAF */ + 0xCC, 0xBF, 0xA9, 0xEA, 0x3F, 0x3F, 0xCC, 0xBB, /* 0xB0-0xB3 */ + 0xCC, 0xB4, 0xA9, 0xE8, 0xCC, 0xB8, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xCC, 0xC0, 0xA9, 0xD9, 0x3F, 0x3F, 0xCC, 0xBD, /* 0xB8-0xBB */ + 0xA9, 0xE3, 0xA9, 0xE2, 0xCC, 0xB6, 0xA9, 0xD7, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0xD8, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xA9, 0xD6, 0x3F, 0x3F, 0xA9, 0xEE, 0xA9, 0xE6, /* 0xC4-0xC7 */ + 0xA9, 0xE0, 0xA9, 0xD4, 0xCC, 0xB9, 0xA9, 0xDF, /* 0xC8-0xCB */ + 0xA9, 0xD5, 0xA9, 0xE7, 0xA9, 0xF0, 0xCE, 0xD4, /* 0xCC-0xCF */ + 0xA9, 0xE4, 0xCC, 0xB5, 0xA9, 0xDA, 0xA9, 0xDD, /* 0xD0-0xD3 */ + 0xA9, 0xDE, 0x3F, 0x3F, 0xA9, 0xEC, 0xA9, 0xED, /* 0xD4-0xD7 */ + 0xA9, 0xEB, 0xA9, 0xE5, 0xA9, 0xE9, 0xA9, 0xDB, /* 0xD8-0xDB */ + 0xAB, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xDA, /* 0xE8-0xEB */ + 0xAC, 0x41, 0xAB, 0xF8, 0xAB, 0xFA, 0xAC, 0x40, /* 0xEC-0xEF */ + 0xCE, 0xE6, 0xAB, 0xFD, 0xD1, 0xB1, 0xAE, 0xB1, /* 0xF0-0xF3 */ + 0xAC, 0x43, 0xCE, 0xD7, 0xCE, 0xDF, 0xAB, 0xFE, /* 0xF4-0xF7 */ + 0xCE, 0xDE, 0xCE, 0xDB, 0xCE, 0xE3, 0xCE, 0xE5, /* 0xF8-0xFB */ + 0xAB, 0xF7, 0xAB, 0xFB, 0xAC, 0x42, 0xAE, 0xB3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_63[512] = { + 0xCE, 0xE0, 0xAB, 0xF9, 0xAC, 0x45, 0xCE, 0xD9, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0xFC, /* 0x04-0x07 */ + 0xAE, 0xB2, 0xAB, 0xF6, 0x3F, 0x3F, 0xCE, 0xD6, /* 0x08-0x0B */ + 0xCE, 0xDD, 0xCE, 0xD5, 0xCE, 0xD8, 0xCE, 0xDC, /* 0x0C-0x0F */ + 0xD1, 0xB2, 0xAC, 0x44, 0x3F, 0x3F, 0xCE, 0xE1, /* 0x10-0x13 */ + 0xCE, 0xE2, 0xCE, 0xE4, 0xAB, 0xF5, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xAE, 0xC1, 0xD1, 0xBE, 0xAE, 0xBF, 0xAE, 0xC0, /* 0x28-0x2B */ + 0xD1, 0xB4, 0xD1, 0xC4, 0x3F, 0x3F, 0xAE, 0xB6, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0x66, 0xD1, 0xC6, /* 0x30-0x33 */ + 0xD1, 0xC0, 0x3F, 0x3F, 0xD1, 0xB7, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xD1, 0xC9, 0xD1, 0xBA, 0xAE, 0xBC, 0xD5, 0x7D, /* 0x38-0x3B */ + 0xD1, 0xBD, 0xAE, 0xBE, 0xAE, 0xB5, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xD1, 0xCB, 0xD1, 0xBF, 0xAE, 0xB8, 0xD1, 0xB8, /* 0x40-0x43 */ + 0xD1, 0xB5, 0xD1, 0xB6, 0xAE, 0xB9, 0xD1, 0xC5, /* 0x44-0x47 */ + 0xD1, 0xCC, 0xAE, 0xBB, 0xD1, 0xBC, 0xD1, 0xBB, /* 0x48-0x4B */ + 0xAE, 0xC3, 0xAE, 0xC2, 0xAE, 0xB4, 0xAE, 0xBA, /* 0x4C-0x4F */ + 0xAE, 0xBD, 0xD1, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xD1, 0xC2, 0xAE, 0xB7, 0xD1, 0xB3, 0xD1, 0xCA, /* 0x54-0x57 */ + 0xD1, 0xC1, 0xD1, 0xC3, 0xD1, 0xC7, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xD5, 0x67, 0x3F, 0x3F, 0xB1, 0xB7, /* 0x64-0x67 */ + 0xB1, 0xCB, 0xB1, 0xCA, 0x3F, 0x3F, 0xB1, 0xBF, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xD5, 0x79, 0xD5, 0x75, 0xD5, 0x72, /* 0x6C-0x6F */ + 0xD5, 0xA6, 0xB1, 0xBA, 0xB1, 0xB2, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xD5, 0x77, 0xB4, 0xA8, 0xB1, 0xB6, /* 0x74-0x77 */ + 0xD5, 0xA1, 0x3F, 0x3F, 0xB1, 0xCC, 0xB1, 0xC9, /* 0x78-0x7B */ + 0xD5, 0x7B, 0xD5, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xB1, 0xC8, 0xD5, 0xA3, 0xD5, 0x69, 0xB1, 0xBD, /* 0x80-0x83 */ + 0xB1, 0xC1, 0xD5, 0xA2, 0x3F, 0x3F, 0xD5, 0x73, /* 0x84-0x87 */ + 0xB1, 0xC2, 0xB1, 0xBC, 0xD5, 0x68, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xB4, 0x78, 0xD5, 0xA5, 0xD5, 0x71, 0xB1, 0xC7, /* 0x8C-0x8F */ + 0xD5, 0x74, 0xD5, 0xA4, 0xB1, 0xC6, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xD9, 0x52, 0x3F, 0x3F, 0xB1, 0xB3, 0xD5, 0x6F, /* 0x94-0x97 */ + 0xB1, 0xB8, 0xB1, 0xC3, 0x3F, 0x3F, 0xB1, 0xBE, /* 0x98-0x9B */ + 0xD5, 0x78, 0xD5, 0x6E, 0xD5, 0x6C, 0xD5, 0x7E, /* 0x9C-0x9F */ + 0xB1, 0xB0, 0xB1, 0xC4, 0xB1, 0xB4, 0xB4, 0x77, /* 0xA0-0xA3 */ + 0xD5, 0x7C, 0xB1, 0xB5, 0x3F, 0x3F, 0xB1, 0xB1, /* 0xA4-0xA7 */ + 0xB1, 0xC0, 0xB1, 0xBB, 0xB1, 0xB9, 0xD5, 0x70, /* 0xA8-0xAB */ + 0xB1, 0xC5, 0xD5, 0x6D, 0xD5, 0x7A, 0xD5, 0x76, /* 0xAC-0xAF */ + 0xD9, 0x54, 0xD9, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xD5, 0x6B, 0xD9, 0x64, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xB4, 0x7A, 0x3F, 0x3F, 0xD9, 0x6A, 0xD9, 0x59, /* 0xC0-0xC3 */ + 0xD9, 0x67, 0xDD, 0x77, 0xB4, 0x7D, 0xD9, 0x6B, /* 0xC4-0xC7 */ + 0xD9, 0x6E, 0xB4, 0x7C, 0xD9, 0x5C, 0xD9, 0x6D, /* 0xC8-0xCB */ + 0xD9, 0x6C, 0xB4, 0x7E, 0xD9, 0x55, 0xB4, 0x79, /* 0xCC-0xCF */ + 0xB4, 0xA3, 0x3F, 0x3F, 0xB4, 0xA1, 0xD9, 0x69, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xD9, 0x5F, 0xB4, 0xA5, 0xD9, 0x70, /* 0xD4-0xD7 */ + 0xD9, 0x68, 0xD9, 0x71, 0xB4, 0xAD, 0xB4, 0xAB, /* 0xD8-0xDB */ + 0xD9, 0x66, 0xD9, 0x65, 0x3F, 0x3F, 0xD9, 0x63, /* 0xDC-0xDF */ + 0xD9, 0x5D, 0xB4, 0xA4, 0x3F, 0x3F, 0xB4, 0xA2, /* 0xE0-0xE3 */ + 0xD1, 0xB9, 0xD9, 0x56, 0x3F, 0x3F, 0xDD, 0xB7, /* 0xE4-0xE7 */ + 0xD9, 0x57, 0xB4, 0x7B, 0xB4, 0xAA, 0xDD, 0x79, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xB4, 0xA6, 0xB4, 0xA7, 0xD9, 0x58, /* 0xEC-0xEF */ + 0xD9, 0x6F, 0xDD, 0x78, 0xD9, 0x60, 0xD9, 0x5B, /* 0xF0-0xF3 */ + 0xB4, 0xA9, 0xD9, 0x61, 0xD9, 0x5E, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xB4, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_64[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0x70, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xDD, 0x7C, 0xDD, 0xB1, 0xDD, 0xB6, /* 0x08-0x0B */ + 0xDD, 0xAA, 0xB7, 0x6C, 0xDD, 0xBB, 0xB7, 0x69, /* 0x0C-0x0F */ + 0xDD, 0x7A, 0x3F, 0x3F, 0xDD, 0x7B, 0xB7, 0x62, /* 0x10-0x13 */ + 0xB7, 0x6B, 0xDD, 0xA4, 0xB7, 0x6E, 0xB7, 0x6F, /* 0x14-0x17 */ + 0xDD, 0xA5, 0x3F, 0x3F, 0xDD, 0xB2, 0xDD, 0xB8, /* 0x18-0x1B */ + 0xB7, 0x6A, 0x3F, 0x3F, 0xB7, 0x64, 0xDD, 0xA3, /* 0x1C-0x1F */ + 0xDD, 0x7D, 0xDD, 0xBA, 0xDD, 0xA8, 0xDD, 0xA9, /* 0x20-0x23 */ + 0xDD, 0x7E, 0xDD, 0xB4, 0xDD, 0xAB, 0xDD, 0xB5, /* 0x24-0x27 */ + 0xDD, 0xAD, 0x3F, 0x3F, 0xB7, 0x65, 0xE1, 0xD9, /* 0x28-0x2B */ + 0xB7, 0x68, 0xB7, 0x66, 0xDD, 0xB9, 0xDD, 0xB0, /* 0x2C-0x2F */ + 0xDD, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xA1, /* 0x30-0x33 */ + 0xBA, 0x53, 0xDD, 0xAF, 0xB7, 0x6D, 0xDD, 0xA7, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xDD, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xB7, 0x67, 0xB7, 0x63, 0xE1, 0xEE, /* 0x3C-0x3F */ + 0xDD, 0xB3, 0xDD, 0xAE, 0x3F, 0x3F, 0xDD, 0xA2, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xE9, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xE1, 0xDA, 0xE1, 0xE5, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xE1, 0xEC, 0xBA, 0x51, 0xB4, 0xAC, 0xE1, 0xEA, /* 0x50-0x53 */ + 0xBA, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xBA, 0x4B, 0xE1, 0xF1, 0x3F, 0x3F, 0xE1, 0xDB, /* 0x58-0x5B */ + 0xE1, 0xE8, 0xE1, 0xDC, 0xE1, 0xE7, 0xBA, 0x4F, /* 0x5C-0x5F */ + 0xE1, 0xEB, 0xD9, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xE1, 0xF2, 0xE1, 0xE3, 0xBA, 0x52, /* 0x64-0x67 */ + 0xE5, 0xBA, 0xBC, 0xAF, 0x3F, 0x3F, 0xE1, 0xF0, /* 0x68-0x6B */ + 0xE1, 0xEF, 0xBA, 0x54, 0xE5, 0xAD, 0xBC, 0xB0, /* 0x6C-0x6F */ + 0xE5, 0xAE, 0x3F, 0x3F, 0xE1, 0xDF, 0xE1, 0xE0, /* 0x70-0x73 */ + 0xE1, 0xDD, 0xE1, 0xE2, 0xE1, 0xDE, 0xE1, 0xF3, /* 0x74-0x77 */ + 0xBA, 0x4E, 0xBC, 0xB1, 0xBA, 0x50, 0xBA, 0x55, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xE1, 0xE1, 0x3F, 0x3F, 0xE1, 0xED, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xE1, 0xE6, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xE5, 0xB1, 0x3F, 0x3F, 0xBA, 0x4A, /* 0x84-0x87 */ + 0xBC, 0xB4, 0xE9, 0xAA, 0xE5, 0xB6, 0xE5, 0xB5, /* 0x88-0x8B */ + 0xE5, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xB4, /* 0x8C-0x8F */ + 0xBC, 0xB5, 0x3F, 0x3F, 0xBC, 0xBB, 0xBC, 0xB8, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xBC, 0xB9, 0xE5, 0xAF, 0xE5, 0xB2, /* 0x94-0x97 */ + 0xE5, 0xBC, 0xBC, 0xC1, 0xBC, 0xBF, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xE5, 0xB3, 0xD9, 0x5A, 0xBC, 0xB2, 0xE5, 0xB9, /* 0x9C-0x9F */ + 0xE5, 0xB0, 0x3F, 0x3F, 0xBC, 0xC2, 0xE5, 0xB8, /* 0xA0-0xA3 */ + 0xBA, 0x4D, 0xBC, 0xB7, 0xE1, 0xE4, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xBC, 0xBA, 0x3F, 0x3F, 0xBC, 0xBE, /* 0xA8-0xAB */ + 0xBC, 0xC0, 0xBC, 0xBD, 0xBC, 0xBC, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xBC, 0xB6, 0xE5, 0xBB, 0xBC, 0xB3, 0xBC, 0xC3, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xBE, 0xD8, /* 0xB8-0xBB */ + 0xBE, 0xD9, 0xE9, 0xA9, 0xBE, 0xE2, 0xBE, 0xDF, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xBE, 0xD6, 0xBE, 0xDD, 0xE9, 0xAB, /* 0xC0-0xC3 */ + 0xBE, 0xDB, 0xBE, 0xD5, 0x3F, 0x3F, 0xBE, 0xDC, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xE9, 0xA8, 0xC0, 0xBB, 0xBE, 0xD7, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xBE, 0xDE, 0xC0, 0xBA, 0xE9, 0xA7, /* 0xCC-0xCF */ + 0xE9, 0xA6, 0x3F, 0x3F, 0xBE, 0xE0, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xBE, 0xE1, 0x3F, 0x3F, 0xE9, 0xA5, 0xE9, 0xA4, /* 0xD4-0xD7 */ + 0xC0, 0xBC, 0xE9, 0xAE, 0xBE, 0xDA, 0xE9, 0xAC, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xC0, 0xBD, 0x3F, 0x3F, 0xC0, 0xC2, 0xEC, 0xEA, /* 0xE0-0xE3 */ + 0xEC, 0xEC, 0x3F, 0x3F, 0xC0, 0xBF, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xEC, 0xED, 0xEC, 0xE9, 0x3F, 0x3F, 0xEC, 0xEB, /* 0xE8-0xEB */ + 0xC0, 0xC0, 0xC0, 0xC3, 0x3F, 0x3F, 0xEC, 0xE8, /* 0xEC-0xEF */ + 0xC0, 0xBE, 0xC0, 0xC1, 0xC2, 0x59, 0xE9, 0xAD, /* 0xF0-0xF3 */ + 0xC2, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0x5E, /* 0xF4-0xF7 */ + 0xEF, 0xD4, 0x3F, 0x3F, 0xC2, 0x5C, 0xC2, 0x5D, /* 0xF8-0xFB */ + 0xEF, 0xD7, 0xEF, 0xD3, 0xC2, 0x5A, 0xEF, 0xD1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_65[512] = { + 0xC3, 0x6B, 0xEF, 0xD5, 0x3F, 0x3F, 0xEF, 0xD6, /* 0x00-0x03 */ + 0xEF, 0xD2, 0x3F, 0x3F, 0xC2, 0x5B, 0xF2, 0x42, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF2, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xF2, 0x46, 0xF2, 0x44, 0xF2, 0x47, 0xC3, 0x6C, /* 0x0C-0x0F */ + 0xF2, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0x4E, /* 0x10-0x13 */ + 0xC4, 0x64, 0xF4, 0x4D, 0xF4, 0x4C, 0xF4, 0x4B, /* 0x14-0x17 */ + 0xC4, 0x63, 0xC4, 0x65, 0x3F, 0x3F, 0xF5, 0xCD, /* 0x18-0x1B */ + 0xC4, 0xE2, 0xC4, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xF6, 0xE1, 0xF6, 0xE0, 0xF6, 0xE3, 0xC5, 0xCB, /* 0x20-0x23 */ + 0xC5, 0x75, 0xF7, 0xDD, 0xF6, 0xE2, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xF7, 0xDC, 0xC5, 0xCD, 0xC5, 0xCC, /* 0x28-0x2B */ + 0xC5, 0xF3, 0xF8, 0xA9, 0xF8, 0xEF, 0xA4, 0xE4, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0x72, 0xE9, 0xAF, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0xAC, 0xCA, 0xF7, /* 0x34-0x37 */ + 0xA7, 0xF1, 0xA7, 0xEF, 0x3F, 0x3F, 0xA7, 0xF0, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xCC, 0xC1, 0xA9, 0xF1, 0xAC, 0x46, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xCE, 0xE7, 0x3F, 0x3F, 0xCE, 0xE8, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xAC, 0x47, 0xD1, 0xCE, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xAE, 0xC4, 0xAE, 0xC5, 0xD1, 0xCD, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0xD3, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xB1, 0xCF, 0x3F, 0x3F, 0xD5, 0xA7, /* 0x50-0x53 */ + 0xB1, 0xD6, 0xB1, 0xD5, 0xB1, 0xCE, 0xB1, 0xD1, /* 0x54-0x57 */ + 0xB1, 0xD4, 0xB1, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xD9, 0x76, 0xB1, 0xCD, 0xB4, 0xAF, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB4, 0xB1, 0xB4, 0xB2, /* 0x60-0x63 */ + 0xD9, 0x75, 0xD9, 0x78, 0xB4, 0xB0, 0xD9, 0x73, /* 0x64-0x67 */ + 0xD9, 0x77, 0x3F, 0x3F, 0xD9, 0x74, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xB7, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xBC, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBA, 0x56, 0xE1, 0xF4, /* 0x70-0x73 */ + 0xBE, 0xE3, 0xBC, 0xC4, 0xE5, 0xBD, 0xBC, 0xC5, /* 0x74-0x77 */ + 0xBC, 0xC6, 0xE5, 0xBF, 0xE5, 0xBE, 0xE5, 0xC0, /* 0x78-0x7B */ + 0xE9, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xB0, /* 0x7C-0x7F */ + + 0xEC, 0xEF, 0xEC, 0xEE, 0xC0, 0xC4, 0xC0, 0xC5, /* 0x80-0x83 */ + 0xF2, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0xA4, 0xE5, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xD9, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xB4, 0xB4, 0xB4, 0xB3, 0xDD, 0xBD, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xEF, 0xD8, 0xC4, 0xE3, 0xF7, 0xDE, 0xA4, 0xE6, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xAE, 0xC6, 0x3F, 0x3F, 0xB1, 0xD8, /* 0x98-0x9B */ + 0xB1, 0xD7, 0xD9, 0x7A, 0xD9, 0x7B, 0xB7, 0x72, /* 0x9C-0x9F */ + 0xE1, 0xF5, 0xBA, 0x57, 0xE9, 0xB2, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xA4, 0xE7, 0xA5, 0xB8, 0x3F, 0x3F, 0xA9, 0xF2, /* 0xA4-0xA7 */ + 0xCC, 0xC2, 0x3F, 0x3F, 0xCE, 0xE9, 0xAC, 0x48, /* 0xA8-0xAB */ + 0xB1, 0xD9, 0x3F, 0x3F, 0xD9, 0x7C, 0xB4, 0xB5, /* 0xAC-0xAF */ + 0xB7, 0x73, 0x3F, 0x3F, 0xE5, 0xC1, 0xE5, 0xC2, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xF0, 0xC2, 0x5F, /* 0xB4-0xB7 */ + 0xF8, 0xF0, 0xA4, 0xE8, 0x3F, 0x3F, 0xCC, 0xC3, /* 0xB8-0xBB */ + 0xA9, 0xF3, 0xAC, 0x49, 0x3F, 0x3F, 0xCE, 0xEA, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xAE, 0xC7, 0xD1, 0xD2, 0xD1, 0xD0, /* 0xC0-0xC3 */ + 0xD1, 0xD1, 0xAE, 0xC8, 0xD1, 0xCF, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0xDB, /* 0xC8-0xCB */ + 0xB1, 0xDC, 0xD5, 0xA8, 0xB1, 0xDD, 0xB1, 0xDA, /* 0xCC-0xCF */ + 0xD9, 0x7D, 0x3F, 0x3F, 0xD9, 0x7E, 0xDD, 0xBE, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBA, 0x59, 0xBA, 0x58, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xF1, 0xEF, 0xD9, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xF2, 0x4A, 0xF2, 0x49, 0xF4, 0x4F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xC9, 0x5E, 0xAC, 0x4A, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xA4, 0xE9, 0xA5, 0xB9, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xA6, 0xAE, 0xA6, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xA6, 0xAF, 0xA6, 0xB0, 0xC9, 0xEE, 0xC9, 0xED, /* 0xEC-0xEF */ + 0xCA, 0xF8, 0xA7, 0xF2, 0xCA, 0xFB, 0xCA, 0xFA, /* 0xF0-0xF3 */ + 0xCA, 0xF9, 0xCA, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA9, 0xF4, 0xCC, 0xC9, /* 0xF8-0xFB */ + 0xCC, 0xC5, 0xCC, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_66[512] = { + 0xA9, 0xFB, 0x3F, 0x3F, 0xA9, 0xF9, 0xCC, 0xCA, /* 0x00-0x03 */ + 0xCC, 0xC6, 0xCC, 0xCD, 0xA9, 0xF8, 0xAA, 0x40, /* 0x04-0x07 */ + 0xCC, 0xC8, 0xCC, 0xC4, 0xA9, 0xFE, 0xCC, 0xCB, /* 0x08-0x0B */ + 0xA9, 0xF7, 0xCC, 0xCC, 0xA9, 0xFA, 0xA9, 0xFC, /* 0x0C-0x0F */ + 0xCC, 0xD0, 0xCC, 0xCF, 0xCC, 0xC7, 0xA9, 0xF6, /* 0x10-0x13 */ + 0xA9, 0xF5, 0xA9, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xCE, 0xEF, 0xCE, 0xF5, 0x3F, 0x3F, 0xAC, 0x50, /* 0x1C-0x1F */ + 0xAC, 0x4D, 0xCE, 0xEC, 0xCE, 0xF1, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xAC, 0x53, 0xAC, 0x4B, 0xCE, 0xF0, 0xAC, 0x4E, /* 0x24-0x27 */ + 0xAC, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0xCE, 0xF3, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xAC, 0x4C, 0xCE, 0xF8, 0xAC, 0x4F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xAC, 0x52, 0xCE, 0xED, 0xCE, 0xF2, /* 0x30-0x33 */ + 0xCE, 0xF6, 0xCE, 0xEE, 0xCE, 0xEB, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xCE, 0xF7, 0xCE, 0xF4, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xAE, 0xD0, 0xAE, 0xC9, 0xAE, 0xCC, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xAE, 0xCF, 0x3F, 0x3F, 0xD1, 0xD5, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xAE, 0xCA, 0xD1, 0xD3, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xAE, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0xAE, 0xCB, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xD1, 0xD6, 0xAE, 0xCD, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xD5, 0xAC, 0xB1, 0xDF, 0xD5, 0xAB, /* 0x58-0x5B */ + 0xD5, 0xAD, 0xB1, 0xDE, 0xB1, 0xE3, 0xD1, 0xD4, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xD5, 0xAA, 0xD5, 0xAE, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xB1, 0xE0, 0xD5, 0xA9, 0xB1, 0xE2, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xB1, 0xE1, 0x3F, 0x3F, 0xD9, 0xA7, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xD9, 0xA2, 0x3F, 0x3F, 0xB4, 0xB6, 0xB4, 0xBA, /* 0x6C-0x6F */ + 0xB4, 0xB7, 0xD9, 0xA5, 0xD9, 0xA8, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xB4, 0xB8, 0x3F, 0x3F, 0xB4, 0xB9, 0xB4, 0xBE, /* 0x74-0x77 */ + 0xDD, 0xC7, 0xD9, 0xA6, 0xB4, 0xBC, 0xD9, 0xA3, /* 0x78-0x7B */ + 0xD9, 0xA1, 0x3F, 0x3F, 0xB4, 0xBD, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xD9, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xB7, 0x79, 0x3F, 0x3F, 0xDD, 0xBF, 0xB7, 0x76, /* 0x84-0x87 */ + 0xB7, 0x77, 0xB7, 0x75, 0xDD, 0xC4, 0xDD, 0xC3, /* 0x88-0x8B */ + 0xDD, 0xC0, 0xB7, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xDD, 0xC2, 0xB4, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xDD, 0xC6, 0xDD, 0xC1, 0xB7, 0x78, 0xB7, 0x74, /* 0x94-0x97 */ + 0xB7, 0x7A, 0xDD, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xBA, 0x5C, 0x3F, 0x3F, 0xE1, 0xF8, /* 0x9C-0x9F */ + 0xE1, 0xF7, 0xE1, 0xF6, 0xBA, 0x5A, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xBA, 0x5B, 0xE5, 0xC5, 0xE5, 0xC8, 0xBC, 0xC8, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0xC7, 0xE5, 0xC9, /* 0xAC-0xAF */ + 0xE5, 0xC4, 0xBC, 0xCA, 0xE5, 0xC6, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xBC, 0xC9, 0xE5, 0xC3, 0x3F, 0x3F, 0xE5, 0xC7, /* 0xB4-0xB7 */ + 0xBE, 0xE9, 0xBE, 0xE6, 0xE9, 0xBB, 0xE9, 0xBA, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xE9, 0xB9, 0xE9, 0xB4, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xE9, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xBE, 0xE7, 0x3F, 0x3F, 0xBE, 0xE4, 0xBE, 0xE8, /* 0xC4-0xC7 */ + 0xE9, 0xB3, 0xBE, 0xE5, 0xE9, 0xB6, 0xE9, 0xB7, /* 0xC8-0xCB */ + 0xE9, 0xBC, 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xB8, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xF2, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xC7, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xEF, 0xDC, 0xC0, 0xC6, 0xEF, 0xDA, 0xEF, 0xDB, /* 0xD8-0xDB */ + 0xC2, 0x60, 0xC3, 0x6E, 0xF2, 0x4B, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xC3, 0x6D, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0x51, /* 0xE0-0xE3 */ + 0xF4, 0x52, 0x3F, 0x3F, 0xC4, 0x66, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xF4, 0x50, 0xC4, 0xE4, 0x3F, 0x3F, 0xF7, 0xDF, /* 0xE8-0xEB */ + 0xC5, 0xCE, 0xF8, 0xAA, 0xF8, 0xAB, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xA4, 0xEA, 0x3F, 0x3F, 0xA6, 0xB1, 0xA6, 0xB2, /* 0xF0-0xF3 */ + 0xA7, 0xF3, 0x3F, 0x3F, 0xCC, 0xD1, 0xAC, 0x54, /* 0xF4-0xF7 */ + 0xAE, 0xD1, 0xB1, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xB0, 0xD2, 0x3F, 0x3F, 0xB4, 0xBF, 0xB4, 0xC0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_67[512] = { + 0xB3, 0xCC, 0xD9, 0xA9, 0x3F, 0x3F, 0xB7, 0x7C, /* 0x00-0x03 */ + 0xE1, 0xFA, 0xE1, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xA4, 0xEB, 0xA6, 0xB3, 0xCC, 0xD2, 0xAA, 0x42, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xAA, 0x41, 0x3F, 0x3F, 0xCE, 0xF9, /* 0x0C-0x0F */ + 0xCE, 0xFA, 0x3F, 0x3F, 0xD1, 0xD7, 0xD1, 0xD8, /* 0x10-0x13 */ + 0xAE, 0xD2, 0xAE, 0xD3, 0x3F, 0x3F, 0xAE, 0xD4, /* 0x14-0x17 */ + 0xD5, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0xE6, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xB4, 0xC2, 0x3F, 0x3F, 0xB4, 0xC1, /* 0x1C-0x1F */ + 0xDD, 0xC8, 0xDF, 0x7A, 0xE1, 0xFB, 0xE9, 0xBD, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0x61, 0xC4, 0x67, /* 0x24-0x27 */ + 0xA4, 0xEC, 0x3F, 0x3F, 0xA5, 0xBC, 0xA5, 0xBD, /* 0x28-0x2B */ + 0xA5, 0xBB, 0xA5, 0xBE, 0xA5, 0xBA, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xA6, 0xB6, 0x3F, 0x3F, 0xC9, 0xF6, /* 0x30-0x33 */ + 0xA6, 0xB5, 0xA6, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xC9, 0xF1, 0xC9, 0xF0, 0xC9, 0xF3, 0xC9, 0xF2, /* 0x38-0x3B */ + 0xC9, 0xF5, 0xA6, 0xB4, 0xC9, 0xEF, 0xC9, 0xF4, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xCA, 0xFD, 0xA7, 0xFD, 0xCA, 0xFE, /* 0x44-0x47 */ + 0xCB, 0x43, 0xA7, 0xFC, 0x3F, 0x3F, 0xCB, 0x47, /* 0x48-0x4B */ + 0xCB, 0x42, 0xCB, 0x45, 0xA7, 0xF5, 0xA7, 0xF6, /* 0x4C-0x4F */ + 0xA7, 0xF7, 0xA7, 0xF8, 0x3F, 0x3F, 0xA8, 0x40, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xCB, 0x41, 0xA7, 0xFA, 0xA8, 0x41, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xCB, 0x40, 0xCB, 0x46, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xA7, 0xF9, 0xCB, 0x44, 0xA7, 0xFB, 0xA7, 0xF4, /* 0x5C-0x5F */ + 0xA7, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAA, 0x57, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xCC, 0xD4, 0xAA, 0x43, 0x3F, 0x3F, 0xAA, 0x4D, /* 0x6C-0x6F */ + 0xAA, 0x4E, 0xAA, 0x46, 0xAA, 0x58, 0xAA, 0x48, /* 0x70-0x73 */ + 0xCC, 0xDC, 0xAA, 0x53, 0xCC, 0xD7, 0xAA, 0x49, /* 0x74-0x77 */ + 0xCC, 0xE6, 0xCC, 0xE7, 0xCC, 0xDF, 0xCC, 0xD8, /* 0x78-0x7B */ + 0xAA, 0x56, 0xCC, 0xE4, 0xAA, 0x51, 0xAA, 0x4F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xCC, 0xE5, 0x3F, 0x3F, 0xCC, 0xE3, /* 0x80-0x83 */ + 0xCC, 0xDB, 0xCC, 0xD3, 0xCC, 0xDA, 0xAA, 0x4A, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xAA, 0x50, 0x3F, 0x3F, 0xAA, 0x44, /* 0x88-0x8B */ + 0xCC, 0xDE, 0xCC, 0xDD, 0xCC, 0xD5, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xAA, 0x52, 0xCC, 0xE1, 0xCC, 0xD6, 0xAA, 0x55, /* 0x90-0x93 */ + 0xCC, 0xE8, 0xAA, 0x45, 0x3F, 0x3F, 0xAA, 0x4C, /* 0x94-0x97 */ + 0xCC, 0xD9, 0xCC, 0xE2, 0xAA, 0x54, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xAA, 0x47, 0xAA, 0x4B, 0x3F, 0x3F, 0xCC, 0xE0, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0x5B, 0xAC, 0x5C, /* 0xAC-0xAF */ + 0xAC, 0x69, 0x3F, 0x3F, 0xCF, 0x56, 0xCF, 0x4C, /* 0xB0-0xB3 */ + 0xAC, 0x62, 0xCF, 0x4A, 0xAC, 0x5B, 0xCF, 0x45, /* 0xB4-0xB7 */ + 0xAC, 0x65, 0xCF, 0x52, 0xCE, 0xFE, 0xCF, 0x41, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xCF, 0x44, 0xCE, 0xFB, 0xCF, 0x51, 0xCF, 0x61, /* 0xC0-0xC3 */ + 0xAC, 0x60, 0xCF, 0x46, 0xCF, 0x58, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xCE, 0xFD, 0xCF, 0x5F, 0xCF, 0x60, 0xCF, 0x63, /* 0xC8-0xCB */ + 0xCF, 0x5A, 0xCF, 0x4B, 0xCF, 0x53, 0xAC, 0x66, /* 0xCC-0xCF */ + 0xAC, 0x59, 0xAC, 0x61, 0xAC, 0x6D, 0xAC, 0x56, /* 0xD0-0xD3 */ + 0xAC, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xCF, 0x43, 0xAC, 0x6A, 0xAC, 0x63, 0xCF, 0x5D, /* 0xD8-0xDB */ + 0xCF, 0x40, 0xAC, 0x6C, 0xAC, 0x67, 0xCF, 0x49, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAC, 0x6B, 0xCF, 0x50, /* 0xE0-0xE3 */ + 0xCF, 0x48, 0xAC, 0x64, 0xCF, 0x5C, 0xCF, 0x54, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xAC, 0x5E, 0xCF, 0x62, 0xCF, 0x47, /* 0xE8-0xEB */ + 0xAC, 0x5A, 0xCF, 0x59, 0xCF, 0x4F, 0xAC, 0x5F, /* 0xEC-0xEF */ + 0xCF, 0x55, 0xAC, 0x57, 0xCE, 0xFC, 0xAC, 0x68, /* 0xF0-0xF3 */ + 0xAE, 0xE3, 0xAC, 0x5D, 0xCF, 0x4E, 0xCF, 0x4D, /* 0xF4-0xF7 */ + 0xCF, 0x42, 0x3F, 0x3F, 0xCF, 0x5E, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xCF, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0xAC, 0x55, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_68[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xEC, 0xAE, 0xEA, /* 0x10-0x13 */ + 0xD1, 0xED, 0x3F, 0x3F, 0xD1, 0xE1, 0xAE, 0xDF, /* 0x14-0x17 */ + 0xAE, 0xEB, 0x3F, 0x3F, 0xD1, 0xDA, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xD1, 0xE3, 0xD1, 0xEB, 0x3F, 0x3F, 0xD1, 0xD9, /* 0x1C-0x1F */ + 0xD1, 0xF4, 0xAE, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xD1, 0xF3, 0xD1, 0xEE, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xD1, 0xEF, 0xAE, 0xDD, 0xAE, 0xE8, 0xD1, 0xE5, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xD1, 0xE6, 0xD1, 0xF0, 0xD1, 0xE7, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xD1, 0xE2, 0xD1, 0xDC, 0xD1, 0xDD, /* 0x30-0x33 */ + 0xD1, 0xEA, 0xD1, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xAE, 0xD6, 0xAE, 0xDA, 0xD1, 0xF2, 0xD1, 0xDE, /* 0x38-0x3B */ + 0xAE, 0xE6, 0xAE, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xAE, 0xE5, 0xAE, 0xEC, 0xAE, 0xDB, 0xAE, 0xE7, /* 0x40-0x43 */ + 0xD1, 0xE9, 0xAE, 0xE9, 0xAE, 0xD8, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xAE, 0xD7, 0xD1, 0xDB, 0x3F, 0x3F, 0xD1, 0xDF, /* 0x48-0x4B */ + 0xAE, 0xE0, 0xD1, 0xF1, 0xD1, 0xE8, 0xD1, 0xE0, /* 0x4C-0x4F */ + 0xAE, 0xE4, 0xAE, 0xE1, 0x3F, 0x3F, 0xAE, 0xD9, /* 0x50-0x53 */ + 0xAE, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xC4, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xD5, 0xB4, 0xD5, 0xB5, 0xD5, 0xB9, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xD5, 0xC8, 0xD5, 0xC5, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xD5, 0xBE, 0xD5, 0xBD, 0xB1, 0xED, 0xD5, 0xC1, /* 0x74-0x77 */ + 0xD5, 0xD0, 0xD5, 0xB0, 0x3F, 0x3F, 0xD5, 0xD1, /* 0x78-0x7B */ + 0xD5, 0xC3, 0xD5, 0xD5, 0xD5, 0xC9, 0xB1, 0xEC, /* 0x7C-0x7F */ + + 0xD5, 0xC7, 0xB1, 0xE7, 0xB1, 0xFC, 0xB1, 0xF2, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xB1, 0xF6, 0xB1, 0xF5, 0xD5, 0xB1, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xD5, 0xCE, 0xD5, 0xD4, 0xD5, 0xCC, /* 0x88-0x8B */ + 0xD5, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xC0, /* 0x8C-0x8F */ + 0xD5, 0xB2, 0xD5, 0xD2, 0xD5, 0xC2, 0xB1, 0xEA, /* 0x90-0x93 */ + 0xB1, 0xF7, 0x3F, 0x3F, 0xD5, 0xCB, 0xB1, 0xF0, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD5, 0xCA, /* 0x98-0x9B */ + 0xD5, 0xB3, 0xB1, 0xF8, 0x3F, 0x3F, 0xB1, 0xFA, /* 0x9C-0x9F */ + 0xD5, 0xCD, 0xB1, 0xFB, 0xB1, 0xE9, 0xD5, 0xBA, /* 0xA0-0xA3 */ + 0xD5, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0xEF, /* 0xA4-0xA7 */ + 0xB1, 0xF9, 0xD5, 0xBC, 0xD5, 0xC6, 0xD5, 0xB7, /* 0xA8-0xAB */ + 0xD5, 0xBB, 0xB1, 0xF4, 0xD5, 0xB6, 0xB1, 0xE8, /* 0xAC-0xAF */ + 0xB1, 0xF1, 0xB1, 0xEE, 0xD5, 0xBF, 0xAE, 0xDE, /* 0xB0-0xB3 */ + 0xD9, 0xC0, 0xB1, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xB1, 0xF3, 0x3F, 0x3F, 0xD9, 0xC3, 0xD9, 0xD9, /* 0xC4-0xC7 */ + 0xD9, 0xCE, 0xB4, 0xD6, 0x3F, 0x3F, 0xB4, 0xD1, /* 0xC8-0xCB */ + 0xD9, 0xBD, 0xB4, 0xD2, 0xD9, 0xCD, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xD9, 0xC6, 0xD9, 0xD3, 0xB4, 0xCE, 0xD9, 0xAB, /* 0xD0-0xD3 */ + 0xD9, 0xD5, 0xB4, 0xC4, 0xD9, 0xB3, 0xB4, 0xC7, /* 0xD4-0xD7 */ + 0xB4, 0xC6, 0x3F, 0x3F, 0xB4, 0xD7, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xD9, 0xAD, 0xD9, 0xCF, 0xD9, 0xD0, 0xB4, 0xC9, /* 0xDC-0xDF */ + 0xB4, 0xC5, 0xD9, 0xBB, 0x3F, 0x3F, 0xB4, 0xD0, /* 0xE0-0xE3 */ + 0xD9, 0xB6, 0x3F, 0x3F, 0xD9, 0xD1, 0xB4, 0xCC, /* 0xE4-0xE7 */ + 0xD9, 0xC9, 0xD9, 0xD6, 0xD9, 0xB0, 0xD9, 0xB5, /* 0xE8-0xEB */ + 0xD9, 0xAF, 0x3F, 0x3F, 0xB4, 0xCB, 0xD9, 0xC2, /* 0xEC-0xEF */ + 0xDD, 0xDE, 0xD9, 0xB1, 0xB4, 0xCF, 0xD9, 0xBA, /* 0xF0-0xF3 */ + 0xD9, 0xD2, 0xB4, 0xCA, 0xD9, 0xB7, 0xD9, 0xB4, /* 0xF4-0xF7 */ + 0xD9, 0xC5, 0xB4, 0xCD, 0xB4, 0xC3, 0xB4, 0xD9, /* 0xF8-0xFB */ + 0xD9, 0xC8, 0xD9, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_69[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD9, 0xAC, 0xB4, 0xC8, 0xD9, 0xD4, 0xD9, 0xBC, /* 0x04-0x07 */ + 0xD9, 0xBE, 0x3F, 0x3F, 0xD9, 0xCB, 0xD9, 0xCA, /* 0x08-0x0B */ + 0xD9, 0xAA, 0xB4, 0xD3, 0xB4, 0xD5, 0xD9, 0xB2, /* 0x0C-0x0F */ + 0xD9, 0xB9, 0xD9, 0xC1, 0xB4, 0xD4, 0xD9, 0xB8, /* 0x10-0x13 */ + 0xD9, 0xC4, 0xD9, 0xD7, 0x3F, 0x3F, 0xD9, 0xCC, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xD9, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xAE, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDD, 0xF2, /* 0x2C-0x2F */ + 0xB7, 0xA6, 0x3F, 0x3F, 0xDD, 0xF0, 0xDD, 0xDB, /* 0x30-0x33 */ + 0xDD, 0xE0, 0xDD, 0xD9, 0x3F, 0x3F, 0xDD, 0xEC, /* 0x34-0x37 */ + 0xDD, 0xCB, 0xDD, 0xD2, 0x3F, 0x3F, 0xDD, 0xEA, /* 0x38-0x3B */ + 0xDD, 0xF4, 0xDD, 0xDC, 0x3F, 0x3F, 0xDD, 0xCF, /* 0x3C-0x3F */ + 0xDD, 0xE2, 0xDD, 0xE7, 0xDD, 0xD3, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xDD, 0xE4, 0xDD, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xDD, 0xD7, 0xDD, 0xD8, 0xB7, 0xA8, 0xDD, 0xEB, /* 0x48-0x4B */ + 0xDD, 0xE9, 0x3F, 0x3F, 0xDD, 0xCC, 0xDD, 0xEE, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xDD, 0xEF, 0xDD, 0xF1, 0xB7, 0xAC, /* 0x50-0x53 */ + 0xB7, 0xA4, 0x3F, 0x3F, 0xD5, 0xB8, 0xDD, 0xD4, /* 0x54-0x57 */ + 0xDD, 0xE6, 0xDD, 0xD5, 0xB7, 0xA1, 0xB7, 0xB1, /* 0x58-0x5B */ + 0xDD, 0xED, 0xB7, 0xAF, 0xB7, 0xAB, 0xDD, 0xCA, /* 0x5C-0x5F */ + 0xB7, 0xA3, 0x3F, 0x3F, 0xDD, 0xCD, 0xB7, 0xB0, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xDD, 0xDD, 0xDD, 0xC9, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xB7, 0xA9, 0xDD, 0xE1, 0xDD, 0xD1, 0xB7, 0xAA, /* 0x68-0x6B */ + 0xDD, 0xDA, 0xB7, 0x7E, 0xB4, 0xD8, 0xDD, 0xE3, /* 0x6C-0x6F */ + 0xD9, 0xBF, 0xDD, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xDD, 0xE8, 0xB7, 0xA5, 0xDD, 0xE5, 0xB7, 0xA2, /* 0x74-0x77 */ + 0xDD, 0xDF, 0xB7, 0xAD, 0xDD, 0xD6, 0xDD, 0xF3, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0xA7, 0xDE, 0xC6, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0xAE, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xE2, 0x4A, 0xE2, 0x48, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xE2, 0x5E, 0xE2, 0x46, 0x3F, 0x3F, 0xE2, 0x58, /* 0x90-0x93 */ + 0xB7, 0x7D, 0xBA, 0x5F, 0xE2, 0x42, 0xE2, 0x5D, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xE2, 0x47, 0xE2, 0x55, 0xBA, 0x64, /* 0x98-0x9B */ + 0xBA, 0x5D, 0x3F, 0x3F, 0xE2, 0x5B, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xE2, 0x40, 0xE2, 0x5A, 0x3F, 0x3F, 0xBA, 0x6F, /* 0xA0-0xA3 */ + 0xE2, 0x51, 0xE2, 0x61, 0xBA, 0x6D, 0xE2, 0x49, /* 0xA4-0xA7 */ + 0xBA, 0x5E, 0xE2, 0x4B, 0xE2, 0x59, 0xBA, 0x67, /* 0xA8-0xAB */ + 0xE2, 0x44, 0xBA, 0x6B, 0xBA, 0x61, 0xE2, 0x4D, /* 0xAC-0xAF */ + 0xE2, 0x43, 0xE1, 0xFC, 0x3F, 0x3F, 0xE2, 0x57, /* 0xB0-0xB3 */ + 0xBA, 0x68, 0xE2, 0x60, 0xE1, 0xFD, 0xBA, 0x65, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xE2, 0x53, 0x3F, 0x3F, 0xBA, 0x66, /* 0xB8-0xBB */ + 0xE2, 0x45, 0xE2, 0x50, 0xE2, 0x4C, 0xE2, 0x4E, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xBA, 0x60, 0xE2, 0x5F, 0xBA, 0x6E, /* 0xC0-0xC3 */ + 0xE2, 0x4F, 0x3F, 0x3F, 0xE2, 0x62, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xE1, 0xFE, 0xE2, 0x54, 0xBA, 0x63, /* 0xC8-0xCB */ + 0xBA, 0x6C, 0xBA, 0x6A, 0xE2, 0x41, 0xE2, 0x56, /* 0xCC-0xCF */ + 0xBA, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0xBA, 0x62, /* 0xD0-0xD3 */ + 0xE2, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xE2, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xD5, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xE5, 0xD1, 0xE5, 0xCD, 0xE5, 0xE1, 0xE5, 0xDE, /* 0xE4-0xE7 */ + 0xBC, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xE5, /* 0xE8-0xEB */ + 0xE5, 0xD4, 0xBC, 0xD8, 0xE5, 0xDB, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xE5, 0xD0, 0xE5, 0xDA, 0xBC, 0xD5, /* 0xF0-0xF3 */ + 0xE5, 0xEE, 0x3F, 0x3F, 0xE5, 0xEB, 0xE5, 0xDD, /* 0xF4-0xF7 */ + 0xE5, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0xE5, 0xE2, /* 0xF8-0xFB */ + 0xE5, 0xE4, 0xBC, 0xD1, 0xE5, 0xD8, 0xE5, 0xD3, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6A[512] = { + 0xE5, 0xCA, 0xBC, 0xCE, 0xBC, 0xD6, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xE5, 0xE7, 0xBC, 0xD7, 0xE5, 0xCB, 0xE5, 0xED, /* 0x04-0x07 */ + 0xE5, 0xE0, 0xE5, 0xE6, 0xBC, 0xD4, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE5, 0xE3, 0x3F, 0x3F, 0xE5, 0xEA, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xBC, 0xD9, 0x3F, 0x3F, 0xBC, 0xD3, /* 0x10-0x13 */ + 0xE5, 0xDC, 0xE5, 0xCF, 0xE5, 0xEF, 0xE5, 0xCC, /* 0x14-0x17 */ + 0xE5, 0xE8, 0xBC, 0xD0, 0x3F, 0x3F, 0xE5, 0xD6, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xE5, 0xD7, 0xBC, 0xCF, 0xBC, 0xCC, /* 0x1C-0x1F */ + 0xE5, 0xD2, 0xBC, 0xD2, 0x3F, 0x3F, 0xBC, 0xCB, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xE5, 0xE9, 0xE5, 0xEC, 0xE5, 0xD9, /* 0x24-0x27 */ + 0xE9, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xC2, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xE9, 0xBE, 0xBE, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xBE, 0xEB, 0xBE, 0xF0, 0xBE, 0xEC, 0xE9, 0xCC, /* 0x38-0x3B */ + 0xE9, 0xD7, 0xBE, 0xEA, 0xE9, 0xC4, 0xE9, 0xCD, /* 0x3C-0x3F */ + 0xE5, 0xDF, 0xE9, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xBE, 0xF1, 0x3F, 0x3F, 0xE9, 0xDD, 0xBE, 0xF5, /* 0x44-0x47 */ + 0xBE, 0xF8, 0xE9, 0xC0, 0x3F, 0x3F, 0xBE, 0xF4, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xE9, 0xDB, 0xE9, 0xDC, 0xE9, 0xD2, /* 0x4C-0x4F */ + 0xE9, 0xD1, 0xE9, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xE9, 0xD3, 0xE9, 0xDA, 0xE9, 0xD9, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xBE, 0xEF, 0xBE, 0xED, 0xE9, 0xCB, 0xE9, 0xC8, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xE9, 0xC5, 0xE9, 0xD8, 0xBE, 0xF7, /* 0x5C-0x5F */ + 0xE9, 0xD6, 0xBE, 0xF3, 0xBE, 0xF2, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xE9, 0xD0, 0x3F, 0x3F, 0xE9, 0xBF, 0xE9, 0xC1, /* 0x64-0x67 */ + 0xE9, 0xC3, 0xE9, 0xD5, 0xE9, 0xCF, 0xBE, 0xEE, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xE9, 0xC6, 0x3F, 0x3F, 0xE9, 0xD4, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xC7, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xCF, 0xED, 0x45, /* 0x7C-0x7F */ + + 0xC0, 0xC8, 0xEC, 0xF5, 0x3F, 0x3F, 0xED, 0x41, /* 0x80-0x83 */ + 0xC0, 0xCA, 0xED, 0x48, 0x3F, 0x3F, 0xEC, 0xFC, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xEC, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xED, 0x49, 0xEC, 0xF3, 0xEC, 0xFE, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xC0, 0xD1, 0xED, 0x44, 0xED, 0x4A, 0xEC, 0xFD, /* 0x90-0x93 */ + 0xC0, 0xC9, 0xED, 0x40, 0xEC, 0xF4, 0xC0, 0xD0, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0x47, 0xEC, 0xF9, /* 0x98-0x9B */ + 0xC0, 0xCC, 0x3F, 0x3F, 0xEC, 0xFB, 0xEC, 0xF8, /* 0x9C-0x9F */ + 0xC0, 0xD2, 0xEC, 0xFA, 0xC0, 0xCB, 0xC0, 0xCE, /* 0xA0-0xA3 */ + 0xED, 0x43, 0xEC, 0xF6, 0xED, 0x46, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xED, 0x42, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xC2, 0x63, 0xEF, 0xE7, 0xC2, 0x68, 0xC2, 0x69, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0x62, /* 0xB0-0xB3 */ + 0xEF, 0xE6, 0x3F, 0x3F, 0xEF, 0xE3, 0xEF, 0xE4, /* 0xB4-0xB7 */ + 0xC2, 0x66, 0xEF, 0xDE, 0xEF, 0xE2, 0xC2, 0x65, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xEF, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0x67, 0xC2, 0x64, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xEF, 0xDD, 0xEF, 0xE1, 0xEF, 0xE5, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0x51, /* 0xC8-0xCB */ + 0xF2, 0x4E, 0xF2, 0x57, 0x3F, 0x3F, 0xF2, 0x56, /* 0xCC-0xCF */ + 0xF2, 0x54, 0xF2, 0x4F, 0x3F, 0x3F, 0xC3, 0x72, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xF2, 0x50, 0xC3, 0x71, 0xC0, 0xCD, /* 0xD8-0xDB */ + 0xF2, 0x53, 0xC3, 0x70, 0xF2, 0x58, 0xF2, 0x52, /* 0xDC-0xDF */ + 0xF2, 0x4D, 0xEF, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xC3, 0x6F, 0x3F, 0x3F, 0xF2, 0x4C, /* 0xE4-0xE7 */ + 0xF4, 0x56, 0x3F, 0x3F, 0xF4, 0x55, 0xF2, 0x55, /* 0xE8-0xEB */ + 0xC4, 0x68, 0x3F, 0x3F, 0xF4, 0x59, 0xF4, 0x5A, /* 0xEC-0xEF */ + 0xF4, 0x54, 0xF4, 0x58, 0x3F, 0x3F, 0xF4, 0x53, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xF5, 0xD1, 0xF4, 0x57, 0xC4, 0xE7, 0xC4, 0xE5, /* 0xF8-0xFB */ + 0xF5, 0xCF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6B[512] = { + 0xF5, 0xD2, 0x3F, 0x3F, 0xF5, 0xCE, 0xF5, 0xD0, /* 0x00-0x03 */ + 0xC4, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xF6, 0xE5, 0xF6, 0xE6, 0xC5, 0x76, 0xF6, 0xE4, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xE2, /* 0x0C-0x0F */ + 0xC5, 0xCF, 0xF7, 0xE0, 0xF7, 0xE1, 0xF8, 0xAC, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC6, 0x56, 0xF8, 0xF3, /* 0x14-0x17 */ + 0xF8, 0xF1, 0xF8, 0xF2, 0xF8, 0xF4, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xBB, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xA4, 0xED, 0xA6, 0xB8, 0x3F, 0x3F, 0xAA, 0x59, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xCC, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xCF, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xD1, 0xF5, 0xD1, 0xF7, 0x3F, 0x3F, 0xD1, 0xF6, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xD1, 0xF8, 0xB1, 0xFD, 0xD5, 0xD7, /* 0x30-0x33 */ + 0xD1, 0xF9, 0x3F, 0x3F, 0xD5, 0xD6, 0xD5, 0xD8, /* 0x34-0x37 */ + 0xD5, 0xD9, 0xD9, 0xDA, 0xB4, 0xDB, 0xD9, 0xDB, /* 0x38-0x3B */ + 0xD9, 0xDD, 0xB4, 0xDC, 0xB4, 0xDA, 0xD9, 0xDC, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xDD, 0xFA, 0xDD, 0xF8, 0xDD, 0xF7, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xDD, 0xF6, 0xDD, 0xF5, 0xB7, 0xB2, /* 0x44-0x47 */ + 0xDD, 0xF9, 0xBA, 0x70, 0xE2, 0x63, 0xE2, 0x65, /* 0x48-0x4B */ + 0xBA, 0x71, 0xE2, 0x64, 0xBC, 0xDB, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xBC, 0xDA, 0xE5, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xE9, 0xDF, 0xE9, 0xDE, 0xE9, 0xE0, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xBE, 0xF9, 0x3F, 0x3F, 0xED, 0x4B, /* 0x58-0x5B */ + 0xC0, 0xD3, 0x3F, 0x3F, 0xEF, 0xE8, 0xC2, 0x6A, /* 0x5C-0x5F */ + 0xF2, 0x59, 0xC5, 0x77, 0xA4, 0xEE, 0xA5, 0xBF, /* 0x60-0x63 */ + 0xA6, 0xB9, 0xA8, 0x42, 0xAA, 0x5A, 0xAA, 0x5B, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAC, 0x6E, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xD1, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0xB3, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xD1, 0xBE, 0xFA, /* 0x74-0x77 */ + 0xC2, 0x6B, 0xA4, 0xEF, 0x3F, 0x3F, 0xA6, 0xBA, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xEB, 0xAA, 0x5C, /* 0x7C-0x7F */ + + 0xCC, 0xEA, 0x3F, 0x3F, 0xCF, 0x65, 0xAC, 0x6F, /* 0x80-0x83 */ + 0xCF, 0x66, 0x3F, 0x3F, 0xAC, 0x70, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xD1, 0xFC, 0xAE, 0xEE, 0xAE, 0xED, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xD5, 0xDE, 0xD5, 0xDC, 0xD5, 0xDD, 0xD5, 0xDB, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xD5, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xD9, 0xDE, 0xD9, 0xE1, 0xB4, 0xDE, 0xD9, 0xDF, /* 0x94-0x97 */ + 0xB4, 0xDD, 0xD9, 0xE0, 0x3F, 0x3F, 0xDD, 0xFB, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x66, 0xE2, 0x67, /* 0x9C-0x9F */ + 0xE2, 0x68, 0x3F, 0x3F, 0xE5, 0xF3, 0xE5, 0xF2, /* 0xA0-0xA3 */ + 0xBC, 0xDC, 0xE5, 0xF1, 0xE5, 0xF4, 0xE9, 0xE1, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xE2, 0xE9, 0xE3, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xED, 0x4C, 0xC0, 0xD4, 0xC2, 0x6C, /* 0xAC-0xAF */ + 0xF2, 0x5A, 0x3F, 0x3F, 0xC4, 0xE8, 0xC9, 0x5F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xAC, 0x71, 0xCF, 0x67, 0xAE, 0xEF, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB1, 0xFE, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xB4, 0xDF, 0xD9, 0xE2, 0x3F, 0x3F, 0xB7, 0xB5, /* 0xBC-0xBF */ + 0xB7, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x69, /* 0xC0-0xC3 */ + 0xE2, 0x6A, 0xBC, 0xDD, 0xBC, 0xDE, 0xE9, 0xE5, /* 0xC4-0xC7 */ + 0xE9, 0xE4, 0xEF, 0xE9, 0xF7, 0xE3, 0xA4, 0xF0, /* 0xC8-0xCB */ + 0xC9, 0x60, 0xA5, 0xC0, 0x3F, 0x3F, 0xA8, 0x43, /* 0xCC-0xCF */ + 0xCB, 0x48, 0x3F, 0x3F, 0xAC, 0x72, 0xB7, 0xB6, /* 0xD0-0xD3 */ + 0xA4, 0xF1, 0x3F, 0x3F, 0xCF, 0x68, 0xAC, 0x73, /* 0xD4-0xD7 */ + 0xCF, 0x69, 0x3F, 0x3F, 0xC0, 0xD5, 0xA4, 0xF2, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCC, 0xEC, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xCF, 0x6A, 0x3F, 0x3F, 0xD2, 0x42, 0xD2, 0x41, /* 0xE0-0xE3 */ + 0xD1, 0xFE, 0x3F, 0x3F, 0xD1, 0xFD, 0xD2, 0x43, /* 0xE4-0xE7 */ + 0xD2, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0x40, /* 0xE8-0xEB */ + 0xB2, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, 0xB4, 0xE0, /* 0xEC-0xEF */ + 0xD9, 0xE3, 0x3F, 0x3F, 0xD9, 0xE4, 0xD9, 0xE5, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0x41, /* 0xF4-0xF7 */ + 0xDE, 0x42, 0xDE, 0x40, 0x3F, 0x3F, 0xDD, 0xFD, /* 0xF8-0xFB */ + 0xDD, 0xFE, 0xB7, 0xB7, 0xE2, 0x6B, 0xE5, 0xF7, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6C[512] = { + 0xE5, 0xF6, 0xE5, 0xF5, 0xE5, 0xF8, 0xE9, 0xE7, /* 0x00-0x03 */ + 0xE9, 0xE6, 0xBE, 0xFB, 0xE9, 0xE8, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xC0, 0xD6, 0xED, 0x4D, 0x3F, 0x3F, 0xEF, 0xEA, /* 0x08-0x0B */ + 0xF2, 0x5B, 0xF6, 0xE7, 0x3F, 0x3F, 0xA4, 0xF3, /* 0x0C-0x0F */ + 0xA5, 0xC2, 0xA5, 0xC1, 0x3F, 0x3F, 0xAA, 0x5D, /* 0x10-0x13 */ + 0xC9, 0x61, 0xC9, 0x7E, 0xA6, 0xBB, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xC9, 0xF7, 0xCB, 0x49, 0xCB, 0x4A, 0xAA, 0x5E, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xCC, 0xED, 0x3F, 0x3F, 0xAC, 0x74, /* 0x1C-0x1F */ + 0xCF, 0x6B, 0xCF, 0x6C, 0x3F, 0x3F, 0xAE, 0xF0, /* 0x20-0x23 */ + 0xAE, 0xF4, 0xD2, 0x44, 0xAE, 0xF3, 0xAE, 0xF1, /* 0x24-0x27 */ + 0xAE, 0xF2, 0x3F, 0x3F, 0xD5, 0xDF, 0xB2, 0x42, /* 0x28-0x2B */ + 0xB4, 0xE3, 0x3F, 0x3F, 0xB4, 0xE1, 0xB4, 0xE2, /* 0x2C-0x2F */ + 0xD9, 0xE6, 0x3F, 0x3F, 0x3F, 0x3F, 0xBA, 0x72, /* 0x30-0x33 */ + 0xA4, 0xF4, 0x3F, 0x3F, 0xC9, 0xA1, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xA5, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0xA4, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0xC6, 0xC9, 0xA3, /* 0x3C-0x3F */ + 0xA5, 0xC5, 0xA5, 0xC4, 0xA8, 0x44, 0xC9, 0xA2, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0xF8, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC9, 0xFC, 0xC9, 0xFE, /* 0x48-0x4B */ + 0xCA, 0x40, 0xA6, 0xC5, 0xA6, 0xC6, 0xC9, 0xFB, /* 0x4C-0x4F */ + 0xA6, 0xC1, 0x3F, 0x3F, 0xC9, 0xF9, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xC9, 0xFD, 0xA6, 0xC2, 0x3F, 0x3F, 0xA6, 0xBD, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xA6, 0xBE, 0x3F, 0x3F, 0xA6, 0xC4, /* 0x58-0x5B */ + 0xC9, 0xFA, 0xA6, 0xBC, 0xA8, 0x45, 0xA6, 0xBF, /* 0x5C-0x5F */ + 0xA6, 0xC0, 0xA6, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xCB, 0x5B, 0xCB, 0x59, 0xCB, 0x4C, /* 0x64-0x67 */ + 0xA8, 0x51, 0xCB, 0x53, 0xA8, 0x4C, 0xCB, 0x4D, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xCB, 0x55, 0x3F, 0x3F, 0xCB, 0x52, /* 0x6C-0x6F */ + 0xA8, 0x4F, 0xCB, 0x51, 0xA8, 0x56, 0xCB, 0x5A, /* 0x70-0x73 */ + 0xA8, 0x58, 0x3F, 0x3F, 0xA8, 0x5A, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xCB, 0x4B, 0x3F, 0x3F, 0xA8, 0x4D, 0xCB, 0x5C, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xA8, 0x54, 0xA8, 0x57, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xCD, 0x45, 0xA8, 0x47, 0xA8, 0x5E, 0xA8, 0x55, /* 0x80-0x83 */ + 0xCB, 0x4E, 0xA8, 0x4A, 0xA8, 0x59, 0xCB, 0x56, /* 0x84-0x87 */ + 0xA8, 0x48, 0xA8, 0x49, 0xCD, 0x43, 0xCB, 0x4F, /* 0x88-0x8B */ + 0xA8, 0x50, 0xA8, 0x5B, 0xCB, 0x5D, 0xCB, 0x50, /* 0x8C-0x8F */ + 0xA8, 0x4E, 0x3F, 0x3F, 0xA8, 0x53, 0xCC, 0xEE, /* 0x90-0x93 */ + 0xA8, 0x5C, 0xCB, 0x57, 0xA8, 0x52, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xA8, 0x5D, 0xA8, 0x46, 0xCB, 0x54, 0xA8, 0x4B, /* 0x98-0x9B */ + 0xCB, 0x58, 0xCD, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAA, 0x6A, /* 0xA8-0xAB */ + 0xAA, 0x7A, 0xCC, 0xF5, 0xAA, 0x71, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xCD, 0x4B, 0xAA, 0x62, 0x3F, 0x3F, 0xAA, 0x65, /* 0xB0-0xB3 */ + 0xCD, 0x42, 0x3F, 0x3F, 0xCC, 0xF3, 0xCC, 0xF7, /* 0xB4-0xB7 */ + 0xAA, 0x6D, 0xAA, 0x6F, 0xCC, 0xFA, 0xAA, 0x76, /* 0xB8-0xBB */ + 0xAA, 0x68, 0xAA, 0x66, 0xAA, 0x67, 0xAA, 0x75, /* 0xBC-0xBF */ + 0xCD, 0x47, 0xAA, 0x70, 0xCC, 0xF9, 0xCC, 0xFB, /* 0xC0-0xC3 */ + 0xAA, 0x6E, 0xAA, 0x73, 0xCC, 0xFC, 0xCD, 0x4A, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xAC, 0x75, 0xAA, 0x79, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xAA, 0x63, 0xCD, 0x49, 0x3F, 0x3F, 0xCD, 0x4D, /* 0xCC-0xCF */ + 0xCC, 0xF8, 0xCD, 0x4F, 0xCD, 0x40, 0xAA, 0x6C, /* 0xD0-0xD3 */ + 0xCC, 0xF4, 0xAA, 0x6B, 0xAA, 0x7D, 0xAA, 0x72, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xCC, 0xF2, 0xCF, 0x75, 0xAA, 0x78, /* 0xD8-0xDB */ + 0xAA, 0x7C, 0xCD, 0x41, 0xCD, 0x46, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xAA, 0x7E, 0xAA, 0x77, 0xAA, 0x69, 0xAA, 0x5F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xAA, 0x64, 0x3F, 0x3F, 0xCC, 0xF6, /* 0xE4-0xE7 */ + 0xAA, 0x60, 0xCD, 0x4E, 0x3F, 0x3F, 0xCC, 0xF0, /* 0xE8-0xEB */ + 0xCC, 0xEF, 0xCC, 0xFD, 0xCC, 0xF1, 0xAA, 0x7B, /* 0xEC-0xEF */ + 0xAE, 0xF5, 0xAA, 0x74, 0xCC, 0xFE, 0xAA, 0x61, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xAC, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xCD, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6D[512] = { + 0xCF, 0x7C, 0xCF, 0xA1, 0x3F, 0x3F, 0xCF, 0xA4, /* 0x00-0x03 */ + 0xCF, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xA7, /* 0x04-0x07 */ + 0xCF, 0xAA, 0xCF, 0xAC, 0xCF, 0x74, 0xAC, 0x76, /* 0x08-0x0B */ + 0xAC, 0x7B, 0xD2, 0x49, 0xAC, 0xAD, 0xCF, 0xA5, /* 0x0C-0x0F */ + 0xCF, 0xAD, 0xCF, 0x7B, 0xCF, 0x73, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0x64, 0xAC, 0x7E, /* 0x14-0x17 */ + 0xCF, 0xA2, 0xCF, 0x78, 0xCF, 0x7A, 0xAC, 0xA5, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xCF, 0x7D, 0xAC, 0x7D, 0xCF, 0x70, /* 0x1C-0x1F */ + 0xCF, 0xA8, 0x3F, 0x3F, 0xCF, 0xAB, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xAC, 0x7A, 0x3F, 0x3F, 0xAC, 0xA8, /* 0x24-0x27 */ + 0xCF, 0x6D, 0xAC, 0xAA, 0xAC, 0x78, 0xAC, 0xAE, /* 0x28-0x2B */ + 0xCF, 0xA9, 0xCF, 0x6F, 0xAC, 0xAB, 0xD2, 0x5E, /* 0x2C-0x2F */ + 0xCD, 0x48, 0xAC, 0x7C, 0xAC, 0x77, 0xCF, 0x76, /* 0x30-0x33 */ + 0xCF, 0x6E, 0xAC, 0xAC, 0xAC, 0xA4, 0xCF, 0xA3, /* 0x34-0x37 */ + 0xAC, 0xA9, 0xAC, 0xA7, 0xCF, 0x79, 0xAC, 0xA1, /* 0x38-0x3B */ + 0xCF, 0x71, 0xAC, 0xA2, 0xAC, 0xA3, 0xCF, 0x72, /* 0x3C-0x3F */ + 0xCF, 0xA6, 0xAC, 0x79, 0xCF, 0x7E, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xD2, 0x4C, 0xAE, 0xFD, 0xAF, 0x43, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0x55, 0xD2, 0x5B, /* 0x5C-0x5F */ + 0xD2, 0x57, 0xD2, 0x4A, 0xD2, 0x4D, 0xD2, 0x46, /* 0x60-0x63 */ + 0xD2, 0x47, 0xAF, 0x4A, 0xAE, 0xFA, 0xD2, 0x56, /* 0x64-0x67 */ + 0xD2, 0x5F, 0xAF, 0x45, 0xAE, 0xF6, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xAF, 0x40, 0xD2, 0x4E, 0xAF, 0x42, 0xD2, 0x4F, /* 0x6C-0x6F */ + 0xD2, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xAF, 0x44, 0xD2, 0x68, 0xD2, 0x48, 0xAE, 0xFC, /* 0x74-0x77 */ + 0xAE, 0xFB, 0xAF, 0x48, 0xD2, 0x45, 0xD2, 0x66, /* 0x78-0x7B */ + 0xD2, 0x5A, 0xD2, 0x67, 0xD2, 0x61, 0xD2, 0x53, /* 0x7C-0x7F */ + + 0xD2, 0x62, 0x3F, 0x3F, 0xD2, 0x5C, 0xD2, 0x65, /* 0x80-0x83 */ + 0xD2, 0x63, 0xAF, 0x49, 0xD2, 0x54, 0xAE, 0xF9, /* 0x84-0x87 */ + 0xAE, 0xF8, 0xAF, 0x41, 0xAF, 0x47, 0xD2, 0x60, /* 0x88-0x8B */ + 0xAF, 0x46, 0xD2, 0x51, 0xB2, 0x43, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xD2, 0x69, 0xD2, 0x50, 0xD2, 0x4B, 0xAE, 0xFE, /* 0x90-0x93 */ + 0xAF, 0x4B, 0xAE, 0xF7, 0x3F, 0x3F, 0xD2, 0x58, /* 0x94-0x97 */ + 0xD2, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0x65, 0xD5, 0xE1, /* 0xA8-0xAB */ + 0xD5, 0xE5, 0x3F, 0x3F, 0xB2, 0x52, 0xB2, 0x50, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0x47, 0xD5, 0xE3, /* 0xB0-0xB3 */ + 0xD5, 0xE2, 0xB2, 0x5B, 0x3F, 0x3F, 0xD5, 0xE8, /* 0xB4-0xB7 */ + 0xB2, 0x55, 0x3F, 0x3F, 0xD5, 0xFA, 0xD6, 0x47, /* 0xB8-0xBB */ + 0xB2, 0x44, 0xD5, 0xF7, 0xD5, 0xF0, 0xB2, 0x67, /* 0xBC-0xBF */ + 0xD5, 0xE0, 0x3F, 0x3F, 0xD5, 0xFC, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xB2, 0x64, 0xB2, 0x58, 0xB2, 0x63, 0xB2, 0x4E, /* 0xC4-0xC7 */ + 0xD5, 0xEC, 0xD5, 0xFE, 0xD5, 0xF6, 0xB2, 0x4F, /* 0xC8-0xCB */ + 0xB2, 0x49, 0xD6, 0x45, 0x3F, 0x3F, 0xD5, 0xFD, /* 0xCC-0xCF */ + 0xD6, 0x40, 0xB2, 0x51, 0xB2, 0x59, 0xD6, 0x42, /* 0xD0-0xD3 */ + 0xD5, 0xEA, 0xD5, 0xFB, 0xD5, 0xEF, 0xD6, 0x44, /* 0xD4-0xD7 */ + 0xB2, 0x5E, 0xB2, 0x46, 0xB2, 0x5C, 0xD5, 0xF4, /* 0xD8-0xDB */ + 0xD5, 0xF2, 0xD5, 0xF3, 0xB2, 0x53, 0xD5, 0xEE, /* 0xDC-0xDF */ + 0xD5, 0xED, 0xB2, 0x48, 0xD5, 0xE7, 0xD6, 0x46, /* 0xE0-0xE3 */ + 0xB2, 0x4A, 0xD5, 0xF1, 0xB2, 0x68, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xB2, 0x62, 0xD5, 0xE6, 0xB2, 0x5F, 0xB2, 0x5D, /* 0xE8-0xEB */ + 0xB2, 0x66, 0xD5, 0xF8, 0xB2, 0x61, 0xD2, 0x52, /* 0xEC-0xEF */ + 0xD5, 0xF9, 0xB2, 0x60, 0xD6, 0x41, 0xB2, 0x45, /* 0xF0-0xF3 */ + 0xD5, 0xF5, 0xB2, 0x57, 0xD5, 0xE9, 0xB2, 0x56, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xB2, 0x54, 0xB2, 0x4C, 0xB2, 0x4B, /* 0xF8-0xFB */ + 0xD9, 0xE7, 0xD6, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6E[512] = { + 0xD5, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xFC, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xB2, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xB5, 0x41, 0xB2, 0x5A, 0xB4, 0xEE, /* 0x18-0x1B */ + 0xD9, 0xF6, 0xB4, 0xFC, 0x3F, 0x3F, 0xD9, 0xEA, /* 0x1C-0x1F */ + 0xB4, 0xEB, 0xB4, 0xE7, 0xDA, 0x49, 0xB4, 0xED, /* 0x20-0x23 */ + 0xB4, 0xF1, 0xB4, 0xEC, 0xB4, 0xF5, 0xDA, 0x4D, /* 0x24-0x27 */ + 0xDA, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, 0xD9, 0xF1, /* 0x28-0x2B */ + 0xB4, 0xFA, 0xB4, 0xF4, 0xD9, 0xFD, 0xB4, 0xE4, /* 0x2C-0x2F */ + 0xDA, 0x4A, 0xDA, 0x43, 0xB4, 0xE8, 0xD9, 0xF7, /* 0x30-0x33 */ + 0xB4, 0xF7, 0xDA, 0x55, 0xDA, 0x56, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xB4, 0xE5, 0xDA, 0x48, 0xB4, 0xF9, 0xD9, 0xFB, /* 0x38-0x3B */ + 0xD9, 0xED, 0xD9, 0xEE, 0xB4, 0xFD, 0xD9, 0xF2, /* 0x3C-0x3F */ + 0xD9, 0xF9, 0xD9, 0xF3, 0x3F, 0x3F, 0xB4, 0xFB, /* 0x40-0x43 */ + 0xB5, 0x44, 0xD9, 0xEF, 0xD9, 0xE8, 0xD9, 0xE9, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xD9, 0xEB, 0xB4, 0xEA, 0xD9, 0xF8, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xB4, 0xF8, 0xB5, 0x42, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xD9, 0xFA, 0xDA, 0x53, 0xDA, 0x4B, /* 0x50-0x53 */ + 0xB4, 0xE6, 0xDA, 0x51, 0xB4, 0xF2, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xB4, 0xF0, 0x3F, 0x3F, 0xDA, 0x57, 0xB4, 0xEF, /* 0x58-0x5B */ + 0xDA, 0x41, 0xD9, 0xF4, 0xD9, 0xFE, 0xB5, 0x47, /* 0x5C-0x5F */ + 0xDA, 0x45, 0xDA, 0x42, 0xD9, 0xF0, 0xB5, 0x43, /* 0x60-0x63 */ + 0xDA, 0x4F, 0xDA, 0x4C, 0xDA, 0x54, 0xB4, 0xE9, /* 0x64-0x67 */ + 0xDA, 0x40, 0xB5, 0x46, 0x3F, 0x3F, 0xDA, 0x47, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB4, 0xF3, 0xB4, 0xF6, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xDA, 0x46, 0xB5, 0x45, 0xD9, 0xF5, /* 0x70-0x73 */ + 0xD5, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0x50, /* 0x74-0x77 */ + 0xDA, 0x4E, 0xDA, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xD9, 0xEC, 0xB5, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xDE, 0x61, 0xDE, 0x60, 0xDE, 0x46, /* 0x8C-0x8F */ + 0xB7, 0xBD, 0x3F, 0x3F, 0xDE, 0x5F, 0xDE, 0x49, /* 0x90-0x93 */ + 0xDE, 0x4A, 0x3F, 0x3F, 0xB7, 0xC7, 0xDE, 0x68, /* 0x94-0x97 */ + 0xB7, 0xC2, 0xDE, 0x5E, 0x3F, 0x3F, 0xDE, 0x43, /* 0x98-0x9B */ + 0xB7, 0xC8, 0xB7, 0xBE, 0xDE, 0x52, 0xDE, 0x48, /* 0x9C-0x9F */ + 0xDE, 0x4B, 0xDE, 0x63, 0xB7, 0xB8, 0xDE, 0x6A, /* 0xA0-0xA3 */ + 0xDE, 0x62, 0xB7, 0xC1, 0xDE, 0x57, 0xB7, 0xCC, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0xCB, 0xB7, 0xC5, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0x69, 0xB7, 0xB9, /* 0xAC-0xAF */ + 0xDE, 0x55, 0xDE, 0x4C, 0xDE, 0x59, 0xDE, 0x65, /* 0xB0-0xB3 */ + 0xB7, 0xCD, 0x3F, 0x3F, 0xB7, 0xBB, 0xDE, 0x54, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xDE, 0x4D, 0xB7, 0xC4, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xB7, 0xC3, 0xDE, 0x50, 0xDE, 0x5A, 0xDE, 0x64, /* 0xBC-0xBF */ + 0xDE, 0x47, 0xDE, 0x51, 0xB7, 0xBC, 0xDE, 0x5B, /* 0xC0-0xC3 */ + 0xB7, 0xC9, 0xB7, 0xC0, 0xDE, 0x4E, 0xB7, 0xBF, /* 0xC4-0xC7 */ + 0xDE, 0x45, 0xDE, 0x53, 0xDE, 0x67, 0xB4, 0xFE, /* 0xC8-0xCB */ + 0xBA, 0xB0, 0xDE, 0x56, 0xE2, 0x6C, 0xDE, 0x58, /* 0xCC-0xCF */ + 0xDE, 0x66, 0xB7, 0xC6, 0xDE, 0x4F, 0xB7, 0xBA, /* 0xD0-0xD3 */ + 0xB7, 0xCA, 0xBC, 0xF0, 0xDE, 0x44, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xDE, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xDE, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xAA, /* 0xE8-0xEB */ + 0xBA, 0xAD, 0xE2, 0x7D, 0xE2, 0xA4, 0xBA, 0xA2, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xE2, 0x6E, 0xBA, 0xAF, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xBA, 0x77, 0xE2, 0x6D, 0xE2, 0xB0, 0xBA, 0xB1, /* 0xF4-0xF7 */ + 0xE2, 0x71, 0xE2, 0xA3, 0x3F, 0x3F, 0xE2, 0x73, /* 0xF8-0xFB */ + 0xE2, 0xB3, 0xE2, 0xAF, 0xBA, 0x75, 0xBA, 0xA1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_6F[512] = { + 0xE6, 0x53, 0xBA, 0xAE, 0xBA, 0x7D, 0xE2, 0x6F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xE2, 0xAE, 0xBA, 0xA3, 0xE2, 0xAB, /* 0x04-0x07 */ + 0xE2, 0xB8, 0xE2, 0x75, 0xE2, 0x7E, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE2, 0xB6, 0xE2, 0xAC, 0xBA, 0x7C, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x7C, 0xBA, 0x76, /* 0x10-0x13 */ + 0xBA, 0x74, 0xBA, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xE2, 0x7A, 0xE2, 0x77, 0xE2, 0x78, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xE2, 0xB2, 0x3F, 0x3F, 0xE2, 0xB7, 0xE2, 0xB5, /* 0x1C-0x1F */ + 0xBA, 0x7A, 0xE2, 0xB9, 0xBA, 0x7E, 0xBA, 0xA7, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xE2, 0x70, 0xE5, 0xFA, 0xE2, 0x79, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xBA, 0x78, 0xBA, 0xAC, 0xBA, 0xA9, /* 0x28-0x2B */ + 0xBA, 0x7B, 0xE2, 0xA5, 0xE2, 0x74, 0xBA, 0xAA, /* 0x2C-0x2F */ + 0xE2, 0xA7, 0xBA, 0xA4, 0xBA, 0xA6, 0xBA, 0x73, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xE2, 0xA9, 0xE2, 0xA1, 0xE2, 0x72, /* 0x34-0x37 */ + 0xBA, 0xA5, 0xE2, 0xB1, 0xE2, 0xB4, 0xE2, 0x7B, /* 0x38-0x3B */ + 0xE2, 0xA8, 0x3F, 0x3F, 0xBA, 0x79, 0xBC, 0xDF, /* 0x3C-0x3F */ + 0xE2, 0xA6, 0xE5, 0xF9, 0x3F, 0x3F, 0xE2, 0xAD, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0x76, 0xE6, 0x44, /* 0x4C-0x4F */ + 0xE6, 0x4E, 0xBC, 0xE2, 0xE6, 0x4D, 0xE6, 0x59, /* 0x50-0x53 */ + 0xBC, 0xE4, 0xE6, 0x4B, 0x3F, 0x3F, 0xE6, 0x4F, /* 0x54-0x57 */ + 0xBC, 0xEF, 0x3F, 0x3F, 0xE6, 0x46, 0xBC, 0xE7, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xE6, 0x52, 0xE9, 0xF0, 0xBC, 0xF3, /* 0x5C-0x5F */ + 0xBC, 0xF2, 0xE6, 0x54, 0xE6, 0x43, 0xE6, 0x5E, /* 0x60-0x63 */ + 0xBC, 0xED, 0x3F, 0x3F, 0xBC, 0xE3, 0xE6, 0x57, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xE6, 0x5B, 0xE6, 0x60, 0xE6, 0x55, /* 0x68-0x6B */ + 0xE6, 0x49, 0xBC, 0xE6, 0xBC, 0xE9, 0xBC, 0xF1, /* 0x6C-0x6F */ + 0xBC, 0xEC, 0x3F, 0x3F, 0xE6, 0x4C, 0xE2, 0xA2, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x48, 0xE6, 0x5F, /* 0x74-0x77 */ + 0xBC, 0xE8, 0x3F, 0x3F, 0xBC, 0xEB, 0xE6, 0x61, /* 0x78-0x7B */ + 0xBC, 0xE0, 0xE6, 0x56, 0xE5, 0xFB, 0xE6, 0x5C, /* 0x7C-0x7F */ + + 0xC0, 0xDF, 0x3F, 0x3F, 0xE6, 0x4A, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xBC, 0xE1, 0xE6, 0x45, 0xBC, 0xE5, 0xE5, 0xFC, /* 0x84-0x87 */ + 0xBA, 0xAB, 0xE6, 0x41, 0x3F, 0x3F, 0xE6, 0x5A, /* 0x88-0x8B */ + 0xE6, 0x42, 0xE6, 0x40, 0xBC, 0xEA, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xE6, 0x58, 0x3F, 0x3F, 0xE5, 0xFE, 0xE6, 0x51, /* 0x90-0x93 */ + 0xE6, 0x50, 0xE6, 0x5D, 0xE6, 0x47, 0xBC, 0xEE, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE9, 0xF3, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xBF, 0x49, 0xBE, 0xFE, 0xEA, 0x40, 0xE9, 0xEB, /* 0xA0-0xA3 */ + 0xBF, 0x41, 0xE9, 0xF7, 0xBF, 0x48, 0xBF, 0x43, /* 0xA4-0xA7 */ + 0xE9, 0xF5, 0xED, 0x4F, 0xE9, 0xFB, 0xEA, 0x42, /* 0xA8-0xAB */ + 0xE9, 0xFA, 0xE9, 0xE9, 0xE9, 0xF8, 0xEA, 0x44, /* 0xAC-0xAF */ + 0xEA, 0x46, 0xBE, 0xFD, 0xEA, 0x45, 0xBF, 0x44, /* 0xB0-0xB3 */ + 0xBF, 0x4A, 0x3F, 0x3F, 0xBF, 0x47, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xE9, 0xFE, 0xBF, 0x46, 0xE9, 0xF9, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xE9, 0xED, 0xE9, 0xF2, 0x3F, 0x3F, 0xE9, 0xFD, /* 0xBC-0xBF */ + 0xBF, 0x45, 0xBF, 0x42, 0xBE, 0xFC, 0xBF, 0x40, /* 0xC0-0xC3 */ + 0xE9, 0xF1, 0x3F, 0x3F, 0xE5, 0xFD, 0xE9, 0xEC, /* 0xC4-0xC7 */ + 0xE9, 0xEF, 0xEA, 0x41, 0xE9, 0xF4, 0xE9, 0xEA, /* 0xC8-0xCB */ + 0xED, 0x4E, 0xEA, 0x43, 0xE9, 0xEE, 0xE9, 0xFC, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xED, 0x51, 0xC0, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xC0, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xDB, /* 0xD8-0xDB */ + 0xED, 0x53, 0xED, 0x59, 0xED, 0x57, 0xC0, 0xD9, /* 0xDC-0xDF */ + 0xC0, 0xDA, 0xC0, 0xE1, 0xED, 0x5A, 0xED, 0x52, /* 0xE0-0xE3 */ + 0xC0, 0xDC, 0x3F, 0x3F, 0xED, 0x56, 0xED, 0x55, /* 0xE4-0xE7 */ + 0xED, 0x5B, 0xC0, 0xE2, 0x3F, 0x3F, 0xC0, 0xDD, /* 0xE8-0xEB */ + 0xC0, 0xE0, 0xED, 0x54, 0xC0, 0xE4, 0xC0, 0xDE, /* 0xEC-0xEF */ + 0xC0, 0xE5, 0xC0, 0xD8, 0xED, 0x58, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xED, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0xF7, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0x71, 0xEF, 0xF4, /* 0xF8-0xFB */ + 0xEF, 0xF6, 0x3F, 0x3F, 0xC2, 0x6F, 0xEF, 0xF2, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_70[512] = { + 0xEF, 0xF3, 0xEF, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xE9, 0xF6, 0xEF, 0xEF, 0xC2, 0x70, 0xEF, 0xEB, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xC2, 0x6D, 0xEF, 0xF8, 0xC2, 0x6E, /* 0x08-0x0B */ + 0xEF, 0xEC, 0xEF, 0xED, 0xEF, 0xF1, 0xC2, 0x73, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xC2, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xEF, 0xF0, 0xC3, 0x78, 0xF2, 0x5F, 0xF2, 0x65, /* 0x14-0x17 */ + 0xC3, 0x79, 0xF2, 0x5C, 0xC3, 0x76, 0xC3, 0x73, /* 0x18-0x1B */ + 0xF2, 0x67, 0xC3, 0x77, 0x3F, 0x3F, 0xC3, 0x74, /* 0x1C-0x1F */ + 0xF2, 0x5E, 0xF2, 0x61, 0xF2, 0x62, 0xF2, 0x63, /* 0x20-0x23 */ + 0xF2, 0x66, 0x3F, 0x3F, 0xEF, 0xF5, 0xF2, 0x5D, /* 0x24-0x27 */ + 0xC3, 0x75, 0xF2, 0x64, 0xF2, 0x68, 0xF2, 0x60, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0x5D, /* 0x2C-0x2F */ + 0xC4, 0x6A, 0xF4, 0x60, 0xC4, 0x6B, 0xF4, 0x68, /* 0x30-0x33 */ + 0xF4, 0x5F, 0xF4, 0x5C, 0x3F, 0x3F, 0xF4, 0x5E, /* 0x34-0x37 */ + 0xF4, 0x62, 0xF4, 0x65, 0xF4, 0x64, 0xF4, 0x67, /* 0x38-0x3B */ + 0xF4, 0x5B, 0x3F, 0x3F, 0xC4, 0x69, 0xF4, 0x63, /* 0x3C-0x3F */ + 0xF4, 0x66, 0xF4, 0x69, 0xF4, 0x61, 0xF5, 0xD3, /* 0x40-0x43 */ + 0xF5, 0xD4, 0xF5, 0xD8, 0xF5, 0xD9, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xF5, 0xD6, 0xF5, 0xD7, 0xF5, 0xD5, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xC4, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xC5, 0x78, 0xF6, 0xEB, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xF6, 0xE8, 0xF6, 0xE9, 0xF6, 0xEA, /* 0x54-0x57 */ + 0xC5, 0x79, 0x3F, 0x3F, 0xF7, 0xE5, 0xF7, 0xE4, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xF8, 0xAF, 0xC5, 0xF4, 0xF8, 0xAD, /* 0x5C-0x5F */ + 0xF8, 0xB0, 0xF8, 0xAE, 0xF8, 0xF5, 0xC6, 0x57, /* 0x60-0x63 */ + 0xC6, 0x65, 0xF9, 0xA3, 0xF9, 0x6C, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF9, 0xA2, 0xF9, 0xD0, 0xF9, 0xD1, 0xA4, 0xF5, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xA6, 0xC7, 0xCA, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xCB, 0x5E, 0x3F, 0x3F, 0xA8, 0x5F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xA8, 0x62, 0x3F, 0x3F, 0xCB, 0x5F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xA8, 0x60, 0xA8, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0x58, 0xCD, 0x5A, /* 0x80-0x83 */ + 0xCD, 0x55, 0xCD, 0x52, 0xCD, 0x54, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAA, 0xA4, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAA, 0xA2, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xCD, 0x56, 0xAA, 0xA3, 0xCD, 0x53, /* 0x90-0x93 */ + 0xCD, 0x50, 0xAA, 0xA1, 0xCD, 0x57, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xCD, 0x51, 0xAA, 0xA5, 0xCD, 0x59, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xAF, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xCF, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xAC, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xCF, 0xB6, 0x3F, 0x3F, 0xAC, 0xAF, /* 0xA8-0xAB */ + 0xAC, 0xB2, 0xAC, 0xB4, 0xAC, 0xB6, 0xAC, 0xB3, /* 0xAC-0xAF */ + 0xCF, 0xB2, 0xCF, 0xB1, 0x3F, 0x3F, 0xAC, 0xB1, /* 0xB0-0xB3 */ + 0xCF, 0xB4, 0xCF, 0xB5, 0x3F, 0x3F, 0xCF, 0xAE, /* 0xB4-0xB7 */ + 0xAC, 0xB5, 0x3F, 0x3F, 0xAC, 0xB0, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xB0, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xD2, 0x77, 0xD2, 0x78, 0xD2, 0x79, /* 0xC4-0xC7 */ + 0xAF, 0x50, 0x3F, 0x3F, 0xAF, 0x4C, 0xD2, 0x6E, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xD2, 0x76, 0xD2, 0x7B, 0xAF, 0x51, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xD2, 0x6C, 0xD2, 0x72, 0xD2, 0x6B, /* 0xD0-0xD3 */ + 0xD2, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0x71, /* 0xD4-0xD7 */ + 0xAF, 0x4D, 0xAF, 0x4F, 0xD2, 0x7A, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xD2, 0x6A, 0xD2, 0x6D, 0xD2, 0x73, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xD2, 0x74, 0xD2, 0x7C, 0xD2, 0x70, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xAF, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0x6D, /* 0xEC-0xEF */ + 0xD6, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0x50, /* 0xF0-0xF3 */ + 0xD6, 0x4C, 0x3F, 0x3F, 0xD6, 0x58, 0xD6, 0x4A, /* 0xF4-0xF7 */ + 0xD6, 0x57, 0xB2, 0x69, 0xD6, 0x48, 0xDA, 0x5B, /* 0xF8-0xFB */ + 0xD6, 0x52, 0xB2, 0x6C, 0x3F, 0x3F, 0xD6, 0x53, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_71[512] = { + 0xD6, 0x56, 0x3F, 0x3F, 0xD6, 0x5A, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD6, 0x4F, 0x3F, 0x3F, 0xD6, 0x54, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xB2, 0x6A, 0xB2, 0x6B, 0xD6, 0x59, /* 0x08-0x0B */ + 0xD6, 0x4D, 0xD6, 0x49, 0xD6, 0x5B, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xD6, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0x55, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0x4B, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xB5, 0x48, 0xB5, 0x49, 0xDA, 0x65, /* 0x18-0x1B */ + 0xB5, 0x4F, 0x3F, 0x3F, 0xDA, 0x59, 0xDA, 0x62, /* 0x1C-0x1F */ + 0xDA, 0x58, 0xB5, 0x4C, 0xDA, 0x60, 0xDA, 0x5E, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xDA, 0x5F, 0xB5, 0x4A, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xDA, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0x5C, 0xDA, 0x5A, /* 0x2C-0x2F */ + 0xB5, 0x4B, 0xDA, 0x5D, 0xDA, 0x61, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB5, 0x4D, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0x64, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xDE, 0x70, 0xDE, 0x77, 0xDE, 0x79, /* 0x40-0x43 */ + 0xDE, 0xA1, 0x3F, 0x3F, 0xB7, 0xDA, 0xDE, 0x6B, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xB7, 0xD2, 0x3F, 0x3F, 0xDE, 0x7A, /* 0x48-0x4B */ + 0xB7, 0xD7, 0xDE, 0xA2, 0xB7, 0xCE, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xDE, 0x7D, 0x3F, 0x3F, 0xDE, 0x6D, 0xDE, 0x7E, /* 0x50-0x53 */ + 0xDE, 0x6C, 0x3F, 0x3F, 0xB7, 0xDC, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xDE, 0x78, 0xB7, 0xCF, 0xDE, 0xA3, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xB7, 0xD4, 0xDE, 0x71, 0xB7, 0xD9, 0xDE, 0x7C, /* 0x5C-0x5F */ + 0xDE, 0x6F, 0xDE, 0x76, 0xDE, 0x72, 0xDE, 0x6E, /* 0x60-0x63 */ + 0xB7, 0xD1, 0xB7, 0xD8, 0xB7, 0xD6, 0xB7, 0xD3, /* 0x64-0x67 */ + 0xB7, 0xDB, 0xB7, 0xD0, 0xDE, 0x75, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xB7, 0xD5, 0x3F, 0x3F, 0xB5, 0x4E, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xDE, 0x7B, 0x3F, 0x3F, 0xDE, 0x73, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xDE, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xC1, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xBA, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xE2, 0xBD, 0xE2, 0xC3, 0xE2, 0xBF, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xBA, 0xB6, 0xE2, 0xBE, 0xE2, 0xC2, 0xE2, 0xBA, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xE2, 0xBC, 0xBA, 0xB5, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xC0, /* 0x8C-0x8F */ + 0xE2, 0xBB, 0x3F, 0x3F, 0xBA, 0xB7, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xBA, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xC4, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xBA, 0xB3, 0xE6, 0x67, 0xE6, 0x64, /* 0x98-0x9B */ + 0xE6, 0x70, 0xE6, 0x6A, 0xE6, 0x6C, 0xBC, 0xF4, /* 0x9C-0x9F */ + 0xE6, 0x66, 0xE6, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xE6, 0x6D, 0xE6, 0x6B, 0x3F, 0x3F, 0xE6, 0x71, /* 0xA4-0xA7 */ + 0xBC, 0xF7, 0xE6, 0x68, 0xE6, 0x6F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xBC, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0x63, /* 0xAC-0xAF */ + 0xE6, 0x65, 0xBC, 0xF6, 0xE6, 0x62, 0xE6, 0x72, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xE6, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xEA, 0x4A, 0xBF, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xEA, 0x55, 0xEA, 0x53, 0xBF, 0x4B, 0xEA, 0x49, /* 0xBC-0xBF */ + 0xEA, 0x4C, 0xEA, 0x4D, 0xEA, 0x48, 0xBF, 0x55, /* 0xC0-0xC3 */ + 0xBF, 0x56, 0xEA, 0x47, 0xEA, 0x56, 0xEA, 0x51, /* 0xC4-0xC7 */ + 0xBF, 0x4F, 0xBF, 0x4C, 0xEA, 0x50, 0xEA, 0x4E, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBF, 0x52, 0xEA, 0x52, /* 0xCC-0xCF */ + 0xBF, 0x4D, 0x3F, 0x3F, 0xBF, 0x4E, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xEA, 0x4F, 0xBF, 0x50, 0xEA, 0x4B, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xEA, 0x54, 0xBF, 0x53, 0xEA, 0x57, 0xEA, 0x58, /* 0xD8-0xDB */ + 0xBF, 0x54, 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xE7, /* 0xDC-0xDF */ + 0xC0, 0xEE, 0xED, 0x5C, 0xED, 0x62, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xED, 0x60, 0xC0, 0xEA, 0xC0, 0xE9, 0xC0, 0xE6, /* 0xE4-0xE7 */ + 0xED, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xC0, 0xEC, 0xC0, 0xEB, 0xC0, 0xE8, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xED, 0x61, 0xED, 0x5D, 0xED, 0x5F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xC0, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xC2, 0x77, 0xEF, 0xFB, 0x3F, 0x3F, 0xC2, 0x74, /* 0xF8-0xFB */ + 0xC2, 0x75, 0xEF, 0xFD, 0xC2, 0x76, 0xEF, 0xFA, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_72[512] = { + 0x3F, 0x3F, 0xEF, 0xF9, 0xF2, 0x6C, 0xEF, 0xFC, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xF2, 0x6D, 0xC3, 0x7A, 0xF2, 0x6B, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0x6A, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xF2, 0x69, 0xC3, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xC4, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0x6A, /* 0x10-0x13 */ + 0xF4, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF5, 0xDC, 0xF5, 0xDB, 0xC4, 0xEA, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xF5, 0xDA, 0xF6, 0xEC, 0xF6, 0xED, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0xE6, 0xF8, 0xB1, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xF6, 0xF9, 0xBC, /* 0x24-0x27 */ + 0xC6, 0x79, 0xF9, 0xC6, 0xA4, 0xF6, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xAA, 0xA6, 0xAA, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xAC, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xC0, 0xEF, 0xA4, 0xF7, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xAA, 0xA8, 0xAF, 0x52, 0xB7, 0xDD, 0xA4, 0xF8, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xB2, 0x6E, 0xBA, 0xB8, 0xC9, 0x62, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xCF, 0xB7, 0xD2, 0x7D, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xE2, 0xC5, 0x3F, 0x3F, 0xC0, 0xF0, 0xA4, 0xF9, /* 0x44-0x47 */ + 0xAA, 0xA9, 0xCF, 0xB8, 0xCF, 0xB9, 0xDA, 0x66, /* 0x48-0x4B */ + 0xB5, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xA4, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0xDE, 0xE2, 0xC6, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0xF8, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xC3, 0x7C, 0xA4, 0xFA, 0xDA, 0x67, 0xA4, 0xFB, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xA6, 0xC9, 0xCA, 0x42, 0xA6, 0xC8, /* 0x5C-0x5F */ + 0xA8, 0x65, 0xA8, 0x64, 0xA8, 0x63, 0xCB, 0x60, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAA, 0xAA, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xAA, 0xAB, 0xCD, 0x5B, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xCF, 0xBA, 0x3F, 0x3F, 0xCF, 0xBD, 0xAC, 0xBA, /* 0x6C-0x6F */ + 0xCF, 0xBB, 0x3F, 0x3F, 0xAC, 0xB9, 0xCF, 0xBC, /* 0x70-0x73 */ + 0xAC, 0xBB, 0x3F, 0x3F, 0xD2, 0xA2, 0xD2, 0xA1, /* 0x74-0x77 */ + 0xD2, 0x7E, 0xAF, 0x53, 0x3F, 0x3F, 0xD6, 0x5D, /* 0x78-0x7B */ + 0xD6, 0x5E, 0xB2, 0x6F, 0xD6, 0x5C, 0xD6, 0x5F, /* 0x7C-0x7F */ + + 0xB5, 0x52, 0xB2, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xB5, 0x51, 0xDA, 0x6B, 0xDA, 0x6A, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xDA, 0x68, 0xDA, 0x69, 0x3F, 0x3F, 0xDA, 0x6C, /* 0x88-0x8B */ + 0xDE, 0xA6, 0xDE, 0xA5, 0xDE, 0xA9, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xDE, 0xA8, 0xDE, 0xA7, 0xBA, 0xB9, 0xE2, 0xC9, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xE2, 0xC8, 0xBA, 0xBA, 0xE2, 0xC7, /* 0x94-0x97 */ + 0xE6, 0x73, 0x3F, 0x3F, 0xE6, 0x74, 0xBC, 0xF9, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xEA, 0x59, 0xEA, 0x5A, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xF2, 0x72, 0xC3, 0x7D, 0xF2, 0x71, /* 0xA0-0xA3 */ + 0xF2, 0x70, 0xF2, 0x6E, 0xF2, 0x6F, 0xC4, 0xEB, /* 0xA4-0xA7 */ + 0xF4, 0x6C, 0xF6, 0xEE, 0xF8, 0xF7, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xA4, 0xFC, 0x3F, 0x3F, 0xC9, 0xA5, 0xA5, 0xC7, /* 0xAC-0xAF */ + 0xC9, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xCA, 0x43, 0xCA, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0x66, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xCB, 0x62, 0x3F, 0x3F, 0xCB, 0x61, /* 0xBC-0xBF */ + 0xAA, 0xAC, 0xCB, 0x65, 0xA8, 0x67, 0xCB, 0x63, /* 0xC0-0xC3 */ + 0xA8, 0x66, 0xCB, 0x67, 0xCB, 0x64, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xCD, 0x5F, 0xCF, 0xBE, 0xCD, 0x5D, /* 0xC8-0xCB */ + 0xCD, 0x64, 0x3F, 0x3F, 0xAA, 0xAD, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xAA, 0xB0, 0xCD, 0x65, 0xCD, 0x61, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xCD, 0x62, 0x3F, 0x3F, 0xCD, 0x5C, 0xAA, 0xAF, /* 0xD4-0xD7 */ + 0xCD, 0x5E, 0xAA, 0xAE, 0xCD, 0x63, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xCD, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xC2, /* 0xDC-0xDF */ + 0xAC, 0xBD, 0xAC, 0xBE, 0x3F, 0x3F, 0xCF, 0xC5, /* 0xE0-0xE3 */ + 0xCF, 0xBF, 0x3F, 0x3F, 0xCF, 0xC4, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xCF, 0xC0, 0xAC, 0xBC, 0xCF, 0xC3, 0xCF, 0xC1, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xA8, /* 0xF0-0xF3 */ + 0xD2, 0xA5, 0x3F, 0x3F, 0xD2, 0xA7, 0xAF, 0x58, /* 0xF4-0xF7 */ + 0xAF, 0x57, 0xAF, 0x55, 0xD2, 0xA4, 0xD2, 0xA9, /* 0xF8-0xFB */ + 0xAF, 0x54, 0xAF, 0x56, 0xD2, 0xA6, 0xD6, 0x67, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_73[512] = { + 0xD2, 0xA3, 0xD2, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0x62, /* 0x04-0x07 */ + 0xD6, 0x66, 0x3F, 0x3F, 0xD6, 0x65, 0xDA, 0x6E, /* 0x08-0x0B */ + 0xDA, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0x68, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xD6, 0x63, 0xDA, 0x6D, 0xB2, 0x74, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0x73, 0xD6, 0x61, /* 0x14-0x17 */ + 0xD6, 0x64, 0xB2, 0x75, 0x3F, 0x3F, 0xB2, 0x72, /* 0x18-0x1B */ + 0xB2, 0x71, 0xD6, 0x60, 0xD6, 0x69, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0x70, 0xDA, 0x77, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xB5, 0x54, 0xDA, 0x76, 0xDA, 0x73, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xB5, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xDA, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xDA, 0x6F, 0xDA, 0x71, 0xDA, 0x74, 0xDA, 0x72, /* 0x30-0x33 */ + 0xB5, 0x55, 0xDA, 0x78, 0xB5, 0x53, 0xB7, 0xDF, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xAD, 0xDE, 0xAC, /* 0x38-0x3B */ + 0xDE, 0xAA, 0x3F, 0x3F, 0xB7, 0xE2, 0xB7, 0xE1, /* 0x3C-0x3F */ + 0xDE, 0xAE, 0x3F, 0x3F, 0xDE, 0xAB, 0xE2, 0xCA, /* 0x40-0x43 */ + 0xBA, 0xBB, 0xB7, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xDE, 0xB0, 0xDE, 0xAF, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xE2, 0xCD, 0xE2, 0xCB, 0xBC, 0xFA, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xBA, 0xBC, 0xE2, 0xCC, 0xE6, 0x76, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xBC, 0xFB, /* 0x54-0x57 */ + 0xE6, 0x75, 0xE6, 0x7E, 0xE6, 0x7D, 0xE6, 0x7B, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xE6, 0x7A, 0xE6, 0x77, 0xE6, 0x78, /* 0x5C-0x5F */ + 0xE6, 0x79, 0xE6, 0x7C, 0xE6, 0xA1, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xEA, 0x5F, 0xEA, 0x5C, 0xEA, 0x5D, /* 0x64-0x67 */ + 0xBF, 0x57, 0xEA, 0x5B, 0xEA, 0x61, 0xEA, 0x60, /* 0x68-0x6B */ + 0xEA, 0x5E, 0x3F, 0x3F, 0xED, 0x64, 0xED, 0x65, /* 0x6C-0x6F */ + 0xC0, 0xF1, 0x3F, 0x3F, 0xC0, 0xF2, 0xED, 0x63, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xC2, 0x79, 0xEF, 0xFE, 0xC2, 0x78, /* 0x74-0x77 */ + 0xC3, 0x7E, 0x3F, 0x3F, 0xC3, 0xA1, 0xC4, 0x6D, /* 0x78-0x7B */ + 0xF4, 0x6E, 0xF4, 0x6D, 0xF5, 0xDD, 0xF6, 0xEF, /* 0x7C-0x7F */ + + 0xC5, 0x7A, 0xF7, 0xE8, 0xF7, 0xE7, 0xF7, 0xE9, /* 0x80-0x83 */ + 0xA5, 0xC8, 0xCF, 0xC6, 0xAF, 0x59, 0xB2, 0x76, /* 0x84-0x87 */ + 0xD6, 0x6A, 0xA5, 0xC9, 0xC9, 0xA7, 0xA4, 0xFD, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCA, 0x45, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0x6C, 0xCB, 0x6A, /* 0x90-0x93 */ + 0xCB, 0x6B, 0xCB, 0x68, 0xA8, 0x68, 0xCB, 0x69, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xCD, 0x6D, 0x3F, 0x3F, 0xAA, 0xB3, /* 0x9C-0x9F */ + 0xCD, 0x6B, 0xCD, 0x67, 0xCD, 0x6A, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xCD, 0x66, 0xAA, 0xB5, 0xCD, 0x69, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xAA, 0xB2, 0xAA, 0xB1, 0x3F, 0x3F, 0xAA, 0xB4, /* 0xA8-0xAB */ + 0xCD, 0x6C, 0xCD, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAC, 0xC2, 0xAC, 0xC5, /* 0xB0-0xB3 */ + 0xCF, 0xCE, 0xCF, 0xCD, 0xCF, 0xCC, 0xAC, 0xBF, /* 0xB4-0xB7 */ + 0xCF, 0xD5, 0xCF, 0xCB, 0x3F, 0x3F, 0xAC, 0xC1, /* 0xB8-0xBB */ + 0xD2, 0xAF, 0x3F, 0x3F, 0xCF, 0xD2, 0xCF, 0xD0, /* 0xBC-0xBF */ + 0xAC, 0xC4, 0x3F, 0x3F, 0xCF, 0xC8, 0xCF, 0xD3, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xCF, 0xCA, 0xCF, 0xD4, 0xCF, 0xD1, /* 0xC4-0xC7 */ + 0xCF, 0xC9, 0x3F, 0x3F, 0xAC, 0xC0, 0xCF, 0xD6, /* 0xC8-0xCB */ + 0xCF, 0xC7, 0xAC, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xB4, 0xD2, 0xAB, /* 0xD0-0xD3 */ + 0xD2, 0xB6, 0x3F, 0x3F, 0xD2, 0xAE, 0xD2, 0xB9, /* 0xD4-0xD7 */ + 0xD2, 0xBA, 0xD2, 0xAC, 0xD2, 0xB8, 0xD2, 0xB5, /* 0xD8-0xDB */ + 0xD2, 0xB3, 0xD2, 0xB7, 0xAF, 0x5F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xAF, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xB1, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xD2, 0xAD, 0x3F, 0x3F, 0xD2, 0xB0, /* 0xE4-0xE7 */ + 0xD2, 0xBB, 0xD2, 0xB2, 0xAF, 0x5E, 0xCF, 0xCF, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xAF, 0x5A, 0xAF, 0x5C, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xD6, 0x78, 0xD6, 0x6D, 0xD6, 0x6B, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xD6, 0x6C, 0x3F, 0x3F, 0xD6, 0x73, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xD6, 0x74, 0xD6, 0x70, 0xB2, 0x7B, 0xD6, 0x75, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_74[512] = { + 0xD6, 0x72, 0xD6, 0x6F, 0x3F, 0x3F, 0xB2, 0x79, /* 0x00-0x03 */ + 0xD6, 0x6E, 0xB2, 0x77, 0xB2, 0x7A, 0xD6, 0x71, /* 0x04-0x07 */ + 0xD6, 0x79, 0xAF, 0x5B, 0xB2, 0x78, 0xD6, 0x77, /* 0x08-0x0B */ + 0xD6, 0x76, 0xB2, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0x7E, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xA1, 0xB5, 0x60, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xDA, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xDA, 0xA9, 0xDA, 0xA2, 0xB5, 0x5A, 0xDA, 0xA6, /* 0x20-0x23 */ + 0xDA, 0xA5, 0xB5, 0x5B, 0xB5, 0x61, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xB5, 0x62, 0xDA, 0xA8, 0xB5, 0x58, 0xDA, 0x7D, /* 0x28-0x2B */ + 0xDA, 0x7B, 0xDA, 0xA3, 0xDA, 0x7A, 0xB5, 0x5F, /* 0x2C-0x2F */ + 0xDA, 0x7C, 0xDA, 0xA4, 0xDA, 0xAA, 0xB5, 0x59, /* 0x30-0x33 */ + 0xB5, 0x5E, 0xB5, 0x5C, 0xB5, 0x5D, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB5, 0x57, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0xE9, /* 0x3C-0x3F */ + 0xDE, 0xB7, 0xB7, 0xE8, 0xDE, 0xBB, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xDE, 0xB1, 0x3F, 0x3F, 0xDE, 0xBC, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xB2, 0xDE, 0xB3, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xDE, 0xBD, 0xDE, 0xBA, 0xDE, 0xB8, /* 0x4C-0x4F */ + 0xDE, 0xB9, 0xDE, 0xB5, 0xDE, 0xB4, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xDE, 0xBE, 0xB7, 0xE5, 0x3F, 0x3F, 0xDE, 0xB6, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xB7, 0xEA, 0xB7, 0xE4, 0xB7, 0xEB, /* 0x58-0x5B */ + 0xB7, 0xEC, 0x3F, 0x3F, 0xB7, 0xE7, 0xB7, 0xE6, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xCE, 0xBA, 0xBE, /* 0x60-0x63 */ + 0xBA, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xD3, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xBC, 0xFC, 0xBA, 0xBF, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xBA, 0xC1, 0xE2, 0xD4, 0xB7, 0xE3, /* 0x6C-0x6F */ + 0xBA, 0xC0, 0xE2, 0xD0, 0xE2, 0xD2, 0xE2, 0xCF, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xE2, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xE6, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xE6, 0xAA, 0xE6, 0xA7, 0xBD, 0x40, 0xEA, 0x62, /* 0x7C-0x7F */ + + 0xBD, 0x41, 0xE6, 0xA6, 0x3F, 0x3F, 0xBC, 0xFE, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xE6, 0xA8, 0xE6, 0xA5, 0xE6, 0xA2, /* 0x84-0x87 */ + 0xE6, 0xA9, 0xE6, 0xA3, 0xE6, 0xA4, 0xBC, 0xFD, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xED, 0x69, 0x3F, 0x3F, 0xEA, 0x66, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xEA, 0x65, 0xEA, 0x67, 0x3F, 0x3F, 0xED, 0x66, /* 0x94-0x97 */ + 0xBF, 0x5A, 0x3F, 0x3F, 0xEA, 0x63, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xBF, 0x58, 0x3F, 0x3F, 0xBF, 0x5C, 0xBF, 0x5B, /* 0x9C-0x9F */ + 0xEA, 0x64, 0xEA, 0x68, 0x3F, 0x3F, 0xBF, 0x59, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xED, 0x6D, 0xC0, 0xF5, 0xC2, 0x7A, /* 0xA4-0xA7 */ + 0xC0, 0xF6, 0xC0, 0xF3, 0xED, 0x6A, 0xED, 0x68, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xED, 0x6B, 0x3F, 0x3F, 0xED, 0x6E, /* 0xAC-0xAF */ + 0xC0, 0xF4, 0xED, 0x6C, 0xED, 0x67, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xF0, 0x42, 0xF0, 0x45, 0xF2, 0x75, /* 0xB4-0xB7 */ + 0xF0, 0x40, 0x3F, 0x3F, 0xF4, 0x6F, 0xF0, 0x46, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xC3, 0xA2, 0xF0, 0x44, 0xC2, 0x7B, /* 0xBC-0xBF */ + 0xF0, 0x41, 0xF0, 0x43, 0xF0, 0x47, 0xF2, 0x76, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xF2, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC3, 0xA3, 0xF2, 0x73, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC4, 0x6E, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xC4, 0xED, 0xF6, 0xF1, 0xC4, 0xEC, 0xF6, 0xF3, /* 0xD4-0xD7 */ + 0xF6, 0xF0, 0xF6, 0xF2, 0xC5, 0xD0, 0xF8, 0xB2, /* 0xD8-0xDB */ + 0xA5, 0xCA, 0xCD, 0x6E, 0xD2, 0xBC, 0xD2, 0xBD, /* 0xDC-0xDF */ + 0xB2, 0x7D, 0xDE, 0xBF, 0xBF, 0x5D, 0xC3, 0xA4, /* 0xE0-0xE3 */ + 0xC5, 0x7B, 0xF8, 0xB3, 0xA5, 0xCB, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xCD, 0x6F, 0xA2, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xCF, 0xD7, 0x3F, 0x3F, 0xCF, 0xD8, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xD2, 0xBE, 0xD2, 0xBF, 0xB2, 0x7E, 0xB2, 0xA1, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xAB, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xDE, 0xC2, 0xDE, 0xC1, 0xDE, 0xC0, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_75[512] = { + 0xE2, 0xD5, 0x3F, 0x3F, 0xE2, 0xD6, 0xE2, 0xD7, /* 0x00-0x03 */ + 0xBA, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xAD, /* 0x04-0x07 */ + 0xE6, 0xAC, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x69, /* 0x08-0x0B */ + 0xBF, 0x5E, 0xBF, 0x5F, 0x3F, 0x3F, 0xED, 0x72, /* 0x0C-0x0F */ + 0xED, 0x6F, 0xED, 0x70, 0xED, 0x71, 0xF0, 0x49, /* 0x10-0x13 */ + 0xF0, 0x48, 0xC2, 0x7C, 0xF2, 0x77, 0xF5, 0xDE, /* 0x14-0x17 */ + 0xA5, 0xCC, 0x3F, 0x3F, 0xAC, 0xC6, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xB2, 0xA2, 0xDE, 0xC3, 0x3F, 0x3F, 0xA5, 0xCD, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xD2, 0xC0, 0xB2, 0xA3, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xB5, 0x63, 0xB5, 0x64, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xA5, 0xCE, 0xA5, 0xCF, 0xCA, 0x46, 0xA8, 0x6A, /* 0x28-0x2B */ + 0xA8, 0x69, 0xAC, 0xC7, 0xCF, 0xD9, 0xDA, 0xAC, /* 0x2C-0x2F */ + 0xA5, 0xD0, 0xA5, 0xD1, 0xA5, 0xD2, 0xA5, 0xD3, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x6B, /* 0x34-0x37 */ + 0xA8, 0x6C, 0xCB, 0x6E, 0xCB, 0x6D, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xAA, 0xB6, 0xCD, 0x72, 0xCD, 0x70, /* 0x3C-0x3F */ + 0xCD, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xDA, /* 0x44-0x47 */ + 0xCF, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0xAC, 0xCB, /* 0x48-0x4B */ + 0xAC, 0xC9, 0x3F, 0x3F, 0xAC, 0xCA, 0xAC, 0xC8, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xAF, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xAF, 0x64, 0xAF, 0x63, 0xD2, 0xC1, /* 0x58-0x5B */ + 0xAF, 0x62, 0xAF, 0x61, 0x3F, 0x3F, 0xD2, 0xC2, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0xA6, 0xD6, 0x7B, /* 0x60-0x63 */ + 0xD6, 0x7A, 0xB2, 0xA4, 0xB2, 0xA5, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB5, 0x66, 0xB5, 0x65, /* 0x68-0x6B */ + 0xDA, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xAD, /* 0x6C-0x6F */ + 0xB2, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB7, 0xED, 0xDE, 0xC5, /* 0x74-0x77 */ + 0xB7, 0xEE, 0xDE, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xE2, 0xD8, 0xE6, 0xAE, 0xBD, 0x42, /* 0x7C-0x7F */ + + 0xEA, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xED, 0x73, 0x3F, 0x3F, 0xC3, 0xA6, 0xC3, 0xA5, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0x7C, 0xA5, 0xD4, /* 0x88-0x8B */ + 0xCD, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0xA8, /* 0x8C-0x8F */ + 0xE2, 0xD9, 0xBA, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xCB, 0x6F, 0xCB, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xCD, 0x74, 0xAA, 0xB8, 0xAA, 0xB9, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xAA, 0xB7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAC, 0xCF, 0xAC, 0xD0, /* 0xA0-0xA3 */ + 0xAC, 0xCD, 0xAC, 0xCE, 0x3F, 0x3F, 0xCF, 0xDC, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCF, 0xDD, 0xAC, 0xCC, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xD2, 0xC3, 0x3F, 0x3F, 0xAF, 0x68, 0xAF, 0x69, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xB2, 0xAB, 0xD2, 0xC9, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xAF, 0x6E, 0xAF, 0x6C, 0xD2, 0xCA, 0xD2, 0xC5, /* 0xB8-0xBB */ + 0xAF, 0x6B, 0xAF, 0x6A, 0xAF, 0x65, 0xD2, 0xC8, /* 0xBC-0xBF */ + 0xD2, 0xC7, 0xD2, 0xC4, 0xAF, 0x6D, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xD2, 0xC6, 0xAF, 0x66, 0x3F, 0x3F, 0xAF, 0x67, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0xAC, 0xD6, 0xA1, /* 0xC8-0xCB */ + 0xD6, 0xA2, 0xB2, 0xAD, 0xD6, 0x7C, 0xD6, 0x7E, /* 0xCC-0xCF */ + 0xD6, 0xA4, 0xD6, 0xA3, 0xD6, 0x7D, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xB2, 0xA9, 0xB2, 0xAA, 0x3F, 0x3F, 0xDA, 0xB6, /* 0xD4-0xD7 */ + 0xB5, 0x6B, 0xB5, 0x6A, 0xDA, 0xB0, 0xB5, 0x68, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xDA, 0xB3, 0xB5, 0x6C, 0xDA, 0xB4, /* 0xDC-0xDF */ + 0xB5, 0x6D, 0xDA, 0xB1, 0xB5, 0x67, 0xB5, 0x69, /* 0xE0-0xE3 */ + 0xDA, 0xB5, 0x3F, 0x3F, 0xDA, 0xB2, 0xDA, 0xAF, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xDE, 0xD2, 0x3F, 0x3F, 0xDE, 0xC7, /* 0xEC-0xEF */ + 0xB7, 0xF0, 0xB7, 0xF3, 0xB7, 0xF2, 0xB7, 0xF7, /* 0xF0-0xF3 */ + 0xB7, 0xF6, 0xDE, 0xD3, 0xDE, 0xD1, 0xDE, 0xCA, /* 0xF4-0xF7 */ + 0xDE, 0xCE, 0xDE, 0xCD, 0xB7, 0xF4, 0xDE, 0xD0, /* 0xF8-0xFB */ + 0xDE, 0xCC, 0xDE, 0xD4, 0xDE, 0xCB, 0xB7, 0xF5, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_76[512] = { + 0xB7, 0xEF, 0xB7, 0xF1, 0x3F, 0x3F, 0xDE, 0xC9, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xE2, 0xDB, 0xBA, 0xC7, 0xE2, 0xDF, 0xBA, 0xC6, /* 0x08-0x0B */ + 0xE2, 0xDC, 0xBA, 0xC5, 0x3F, 0x3F, 0xDE, 0xC8, /* 0x0C-0x0F */ + 0xDE, 0xCF, 0xE2, 0xDE, 0x3F, 0x3F, 0xBA, 0xC8, /* 0x10-0x13 */ + 0xE2, 0xE0, 0xE2, 0xDD, 0xE2, 0xDA, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xE6, 0xB1, 0xE6, 0xB5, 0xE6, 0xB7, /* 0x18-0x1B */ + 0xE6, 0xB3, 0xE6, 0xB2, 0xE6, 0xB0, 0xBD, 0x45, /* 0x1C-0x1F */ + 0xBD, 0x43, 0xBD, 0x48, 0xBD, 0x49, 0xE6, 0xB4, /* 0x20-0x23 */ + 0xBD, 0x46, 0xE6, 0xAF, 0xBD, 0x47, 0xBA, 0xC4, /* 0x24-0x27 */ + 0xE6, 0xB6, 0xBD, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xEA, 0x6C, 0x3F, 0x3F, 0xEA, 0x6B, /* 0x2C-0x2F */ + 0xEA, 0x73, 0xEA, 0x6D, 0xEA, 0x72, 0xEA, 0x6F, /* 0x30-0x33 */ + 0xBF, 0x60, 0xEA, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xBF, 0x61, 0x3F, 0x3F, 0xBF, 0x62, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xEA, 0x70, 0xEA, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xF8, 0xED, 0x74, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0xF7, 0xED, 0x77, /* 0x44-0x47 */ + 0xED, 0x75, 0xED, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xC0, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF0, 0x4D, 0x3F, 0x3F, 0xC2, 0xA1, 0xF0, 0x4E, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0x7D, 0xF0, 0x4F, /* 0x54-0x57 */ + 0xC2, 0x7E, 0xF0, 0x4C, 0xF0, 0x50, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xF0, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, 0xC3, 0xA7, /* 0x5C-0x5F */ + 0xF2, 0x78, 0xC3, 0xA8, 0xC4, 0x6F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xF0, 0x4B, 0xC4, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xC4, 0xEE, 0xF5, 0xDF, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xC5, 0x7E, 0xF6, 0xF4, 0xC5, 0x7D, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xF7, 0xEA, 0xC5, 0xF5, 0xC5, 0xF6, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xF9, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xAC, 0xD1, 0xCF, 0xDE, 0x3F, 0x3F, 0xB5, 0x6E, /* 0x78-0x7B */ + 0xB5, 0x6F, 0xA5, 0xD5, 0xA6, 0xCA, 0xCA, 0x47, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xCB, 0x71, 0xA8, 0x6D, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xAA, 0xBA, 0x3F, 0x3F, 0xAC, 0xD2, 0xAC, 0xD3, /* 0x84-0x87 */ + 0xAC, 0xD4, 0xD6, 0xA6, 0xD2, 0xCB, 0xAF, 0x6F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0xAE, 0xD6, 0xA5, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xB8, 0xB5, 0x71, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xDA, 0xB7, 0xB5, 0x70, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xDE, 0xD5, 0xBD, 0x4A, 0xE6, 0xBB, /* 0x98-0x9B */ + 0xE6, 0xB8, 0xE6, 0xB9, 0xE6, 0xBA, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xED, 0x78, 0x3F, 0x3F, 0xF0, 0x51, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0x71, 0xF4, 0x70, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xF6, 0xF5, 0xA5, 0xD6, 0xCD, 0x75, /* 0xAC-0xAF */ + 0xAF, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xB5, 0x72, 0xDE, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xE2, 0xE1, 0x3F, 0x3F, 0xBD, 0x4B, 0xEA, 0x74, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xF0, 0x52, 0xF4, 0x72, 0xA5, 0xD7, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAA, 0xBB, 0xAC, 0xD7, /* 0xC0-0xC3 */ + 0xCF, 0xDF, 0xAC, 0xD8, 0xAC, 0xD6, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xAC, 0xD5, 0xD2, 0xCC, 0xAF, 0x71, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xAF, 0x72, 0xAF, 0x73, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0xB0, 0xD6, 0xA7, /* 0xD0-0xD3 */ + 0xB2, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xB9, 0xB2, 0xB1, /* 0xD8-0xDB */ + 0xB5, 0x73, 0xDE, 0xD7, 0xB7, 0xF8, 0xB7, 0xF9, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xBA, 0xC9, 0x3F, 0x3F, 0xBA, 0xCA, /* 0xE0-0xE3 */ + 0xBD, 0x4C, 0xBF, 0x64, 0xEA, 0x75, 0xBF, 0x63, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xED, 0x79, 0xC0, 0xFA, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xF0, 0x53, 0xF4, 0x73, 0xA5, 0xD8, 0xA8, 0x6E, /* 0xEC-0xEF */ + 0xCD, 0x78, 0xCD, 0x77, 0xAA, 0xBC, 0xCD, 0x76, /* 0xF0-0xF3 */ + 0xAA, 0xBD, 0xCD, 0x79, 0x3F, 0x3F, 0xCF, 0xE5, /* 0xF4-0xF7 */ + 0xAC, 0xDB, 0xAC, 0xDA, 0xCF, 0xE7, 0xCF, 0xE6, /* 0xF8-0xFB */ + 0xAC, 0xDF, 0x3F, 0x3F, 0xAC, 0xDE, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_77[512] = { + 0x3F, 0x3F, 0xAC, 0xD9, 0x3F, 0x3F, 0xCF, 0xE1, /* 0x00-0x03 */ + 0xCF, 0xE2, 0xCF, 0xE3, 0x3F, 0x3F, 0xAC, 0xE0, /* 0x04-0x07 */ + 0xCF, 0xE0, 0xAC, 0xDC, 0xCF, 0xE4, 0xAC, 0xDD, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xD2, 0xCF, 0xD2, 0xD3, 0xD2, 0xD1, 0xD2, 0xD0, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xD2, 0xD4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xD2, 0xD5, 0xD2, 0xD6, 0xD2, 0xCE, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xD2, 0xCD, 0x3F, 0x3F, 0xAF, 0x75, /* 0x1C-0x1F */ + 0xAF, 0x76, 0x3F, 0x3F, 0xD2, 0xD7, 0xD2, 0xD2, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xD6, 0xB0, 0x3F, 0x3F, 0xD2, 0xD8, /* 0x24-0x27 */ + 0xAF, 0x77, 0xAF, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xD6, 0xAA, 0x3F, 0x3F, 0xD6, 0xA9, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xD6, 0xAB, 0xD6, 0xAC, 0xD6, 0xAE, /* 0x30-0x33 */ + 0xD6, 0xAD, 0xD6, 0xB2, 0xB2, 0xB5, 0xB2, 0xB2, /* 0x34-0x37 */ + 0xB2, 0xB6, 0xD6, 0xA8, 0xB2, 0xB7, 0xD6, 0xB1, /* 0x38-0x3B */ + 0xB2, 0xB4, 0xD6, 0xAF, 0xB2, 0xB3, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xDA, 0xBC, 0xDA, 0xBE, 0xDA, 0xBA, 0xDA, 0xBB, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xBF, 0xDA, 0xC1, /* 0x48-0x4B */ + 0xDA, 0xC2, 0xDA, 0xBD, 0xDA, 0xC0, 0xB5, 0x74, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDE, 0xDB, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xDE, 0xE0, 0xDE, 0xD8, 0xDE, 0xDC, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xDE, 0xE1, 0xDE, 0xDD, 0xB7, 0xFA, /* 0x58-0x5B */ + 0xB8, 0x43, 0x3F, 0x3F, 0xB7, 0xFD, 0xDE, 0xD9, /* 0x5C-0x5F */ + 0xDE, 0xDA, 0xBA, 0xCE, 0xB8, 0x46, 0xB7, 0xFE, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xB8, 0x44, 0xB7, 0xFC, 0xDE, 0xDF, /* 0x64-0x67 */ + 0xB8, 0x45, 0xDE, 0xDE, 0xB8, 0x41, 0xB7, 0xFB, /* 0x68-0x6B */ + 0xB8, 0x42, 0xDE, 0xE2, 0xE2, 0xE6, 0xE2, 0xE8, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xB8, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xE2, 0xE3, 0xBA, 0xCC, 0xE2, 0xE9, 0xBA, 0xCD, /* 0x7C-0x7F */ + + 0xE2, 0xE7, 0xE2, 0xE2, 0xE2, 0xE5, 0xE2, 0xEA, /* 0x80-0x83 */ + 0xBA, 0xCB, 0xE2, 0xE4, 0x3F, 0x3F, 0xBD, 0x4E, /* 0x84-0x87 */ + 0xE6, 0xBF, 0xE6, 0xBE, 0x3F, 0x3F, 0xBD, 0x51, /* 0x88-0x8B */ + 0xBD, 0x4F, 0xE6, 0xBC, 0xBD, 0x4D, 0xE6, 0xBD, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xBD, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xEA, 0x7D, 0x3F, 0x3F, 0xEA, 0xA1, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xEA, 0x7E, 0xEA, 0x76, 0xEA, 0x7A, /* 0x98-0x9B */ + 0xEA, 0x79, 0xEA, 0x77, 0xBF, 0x66, 0xBF, 0x67, /* 0x9C-0x9F */ + 0xBF, 0x65, 0xEA, 0x78, 0xEA, 0x7B, 0xEA, 0x7C, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xBF, 0x68, 0x3F, 0x3F, 0xC1, 0x40, /* 0xA4-0xA7 */ + 0xED, 0xA3, 0x3F, 0x3F, 0xC0, 0xFC, 0xED, 0x7B, /* 0xA8-0xAB */ + 0xC0, 0xFE, 0xC1, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xC0, 0xFD, 0xED, 0xA2, 0xED, 0x7C, 0xC0, 0xFB, /* 0xB0-0xB3 */ + 0xED, 0xA1, 0xED, 0x7A, 0xED, 0x7E, 0xED, 0x7D, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0x55, 0xC2, 0xA4, /* 0xB8-0xBB */ + 0xC2, 0xA5, 0xC2, 0xA2, 0x3F, 0x3F, 0xC2, 0xA3, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0x54, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xF2, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0xC3, 0xA9, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xF2, 0x79, 0xF2, 0x7A, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xF4, 0x74, 0xF4, 0x77, 0xF4, 0x75, 0xF4, 0x76, /* 0xCC-0xCF */ + 0xF5, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, 0xC4, 0xEF, /* 0xD0-0xD3 */ + 0xF7, 0xEB, 0xF8, 0xB4, 0x3F, 0x3F, 0xC5, 0xF7, /* 0xD4-0xD7 */ + 0xF8, 0xF8, 0xF8, 0xF9, 0xC6, 0x66, 0xA5, 0xD9, /* 0xD8-0xDB */ + 0xAC, 0xE1, 0x3F, 0x3F, 0xDA, 0xC3, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xDE, 0xE3, 0x3F, 0x3F, 0xA5, 0xDA, 0xA8, 0x6F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xAA, 0xBE, 0x3F, 0x3F, 0xCF, 0xE8, /* 0xE4-0xE7 */ + 0xCF, 0xE9, 0xAF, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xDA, 0xC4, 0xB5, 0x75, 0xB8, 0x47, 0xC1, 0x42, /* 0xEC-0xEF */ + 0xED, 0xA4, 0xF2, 0x7C, 0xF4, 0x78, 0xA5, 0xDB, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xA1, /* 0xF4-0xF7 */ + 0xCD, 0x7A, 0xCD, 0x7C, 0xCD, 0x7E, 0xCD, 0x7D, /* 0xF8-0xFB */ + 0xCD, 0x7B, 0xAA, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_78[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0xAC, 0xE2, 0xCF, 0xF2, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xCF, 0xED, 0xCF, 0xEA, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xCF, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xAC, 0xE4, 0xAC, 0xE5, 0xCF, 0xF0, 0xCF, 0xEF, /* 0x0C-0x0F */ + 0xCF, 0xEE, 0xCF, 0xEB, 0xCF, 0xEC, 0xCF, 0xF3, /* 0x10-0x13 */ + 0xAC, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xAF, 0x7C, 0x3F, 0x3F, 0xAF, 0xA4, /* 0x1C-0x1F */ + 0xAF, 0xA3, 0xD2, 0xE1, 0xD2, 0xDB, 0xD2, 0xD9, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xAF, 0xA1, 0xD6, 0xB9, 0xAF, 0x7A, /* 0x24-0x27 */ + 0xD2, 0xDE, 0xD2, 0xE2, 0xD2, 0xE4, 0xD2, 0xE0, /* 0x28-0x2B */ + 0xD2, 0xDA, 0xAF, 0xA2, 0xD2, 0xDF, 0xD2, 0xDD, /* 0x2C-0x2F */ + 0xAF, 0x79, 0xD2, 0xE5, 0xAF, 0xA5, 0xD2, 0xE3, /* 0x30-0x33 */ + 0xAF, 0x7D, 0xD2, 0xDC, 0x3F, 0x3F, 0xAF, 0x7E, /* 0x34-0x37 */ + 0xAF, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0xB9, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xD6, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xD6, 0xB3, 0xD6, 0xB5, 0xD6, 0xB7, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xD6, 0xB8, 0xD6, 0xB6, 0xB2, 0xBA, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xD6, 0xBB, 0x3F, 0x3F, 0xD6, 0xB4, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xDA, 0xC8, 0xB5, 0x76, 0xDA, 0xD0, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xDA, 0xC5, 0x3F, 0x3F, 0xDA, 0xD1, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xDA, 0xC6, 0xDA, 0xC7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xDA, 0xCF, 0xDA, 0xCE, 0xDA, 0xCB, 0xB2, 0xB8, /* 0x68-0x6B */ + 0xB5, 0x77, 0xDA, 0xC9, 0xDA, 0xCC, 0xB5, 0x78, /* 0x6C-0x6F */ + 0xDA, 0xCD, 0xDA, 0xCA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xDE, 0xEE, 0x3F, 0x3F, 0xDE, 0xF2, /* 0x78-0x7B */ + 0xB8, 0x4E, 0x3F, 0x3F, 0xE2, 0xF0, 0xB8, 0x51, /* 0x7C-0x7F */ + + 0xDE, 0xF0, 0xF9, 0xD6, 0x3F, 0x3F, 0xDE, 0xED, /* 0x80-0x83 */ + 0xDE, 0xE8, 0xDE, 0xEA, 0xDE, 0xEB, 0xDE, 0xE4, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xB8, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xB8, 0x4C, 0x3F, 0x3F, 0xB8, 0x48, 0xDE, 0xE7, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xB8, 0x4F, 0x3F, 0x3F, 0xB8, 0x50, /* 0x90-0x93 */ + 0xDE, 0xE6, 0xDE, 0xE9, 0xDE, 0xF1, 0xB8, 0x4A, /* 0x94-0x97 */ + 0xB8, 0x4B, 0xDE, 0xEF, 0xDE, 0xE5, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE2, 0xF2, 0xBA, 0xD0, /* 0x9C-0x9F */ + 0xE2, 0xF4, 0xDE, 0xEC, 0xE2, 0xF6, 0xBA, 0xD4, /* 0xA0-0xA3 */ + 0xE2, 0xF7, 0xE2, 0xF3, 0x3F, 0x3F, 0xBA, 0xD1, /* 0xA4-0xA7 */ + 0xE2, 0xEF, 0xBA, 0xD3, 0xE2, 0xEC, 0xE2, 0xF1, /* 0xA8-0xAB */ + 0xE2, 0xF5, 0xE2, 0xEE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xB8, 0x49, 0x3F, 0x3F, 0xE2, 0xEB, 0xBA, 0xD2, /* 0xB0-0xB3 */ + 0xE2, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBD, 0x54, 0xE6, 0xC1, /* 0xB8-0xBB */ + 0xBD, 0x58, 0x3F, 0x3F, 0xBD, 0x56, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xBA, 0xCF, 0x3F, 0x3F, 0xE6, 0xC8, /* 0xC0-0xC3 */ + 0xE6, 0xC9, 0xBD, 0x53, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xE6, 0xC7, 0xE6, 0xCA, 0xBD, 0x55, 0xBD, 0x52, /* 0xC8-0xCB */ + 0xE6, 0xC3, 0xE6, 0xC0, 0xE6, 0xC5, 0xE6, 0xC2, /* 0xCC-0xCF */ + 0xBD, 0x59, 0xE6, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xE6, 0xC6, 0xBD, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBF, 0x6A, 0xEA, 0xA8, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xEA, 0xA2, 0xEA, 0xA6, 0xEA, 0xAC, /* 0xDC-0xDF */ + 0xEA, 0xAD, 0xEA, 0xA9, 0xEA, 0xAA, 0xEA, 0xA7, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xEA, 0xA4, 0x3F, 0x3F, 0xBF, 0x6C, /* 0xE4-0xE7 */ + 0xBF, 0x69, 0xEA, 0xA3, 0xEA, 0xA5, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xBF, 0x6B, 0xEA, 0xAB, 0x3F, 0x3F, 0xC1, 0x46, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xAA, 0xED, 0xA5, /* 0xF0-0xF3 */ + 0xC1, 0x45, 0x3F, 0x3F, 0x3F, 0x3F, 0xC1, 0x43, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xED, 0xAC, 0xC1, 0x44, 0xED, 0xA8, /* 0xF8-0xFB */ + 0xED, 0xA9, 0xED, 0xA6, 0xED, 0xAD, 0xF0, 0x56, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_79[512] = { + 0x3F, 0x3F, 0xC1, 0x47, 0xED, 0xA7, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xED, 0xAE, 0xED, 0xAB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF0, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xF0, 0x57, 0x3F, 0x3F, 0xC2, 0xA6, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xF0, 0x5B, 0xF0, 0x5D, 0xF0, 0x5C, 0xF0, 0x58, /* 0x10-0x13 */ + 0xF0, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xA3, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xC3, 0xAA, 0x3F, 0x3F, 0xF2, 0x7E, /* 0x18-0x1B */ + 0xF2, 0xA2, 0xF2, 0x7D, 0xF2, 0xA4, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xF2, 0xA1, 0x3F, 0x3F, 0xF4, 0x7A, /* 0x20-0x23 */ + 0xF4, 0x7D, 0xF4, 0x79, 0xC4, 0x71, 0xF4, 0x7B, /* 0x24-0x27 */ + 0xF4, 0x7C, 0xF4, 0x7E, 0xC4, 0x72, 0xC4, 0x74, /* 0x28-0x2B */ + 0xC4, 0x73, 0xF5, 0xE1, 0x3F, 0x3F, 0xF5, 0xE3, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xF5, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF6, 0xF6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xF8, 0xB5, 0xF8, 0xFA, 0xA5, 0xDC, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xCB, 0x72, 0xAA, 0xC0, 0xCD, 0xA3, /* 0x3C-0x3F */ + 0xAA, 0xC1, 0xAA, 0xC2, 0xCD, 0xA2, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xCF, 0xF8, 0xCF, 0xF7, 0xAC, 0xE6, 0xAC, 0xE9, /* 0x44-0x47 */ + 0xAC, 0xE8, 0xAC, 0xE7, 0xCF, 0xF4, 0xCF, 0xF6, /* 0x48-0x4B */ + 0xCF, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0xD2, 0xE8, /* 0x4C-0x4F */ + 0xAF, 0xA7, 0xD2, 0xEC, 0xD2, 0xEB, 0xD2, 0xEA, /* 0x50-0x53 */ + 0xD2, 0xE6, 0xAF, 0xA6, 0xAF, 0xAA, 0xAF, 0xAD, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAF, 0xAE, 0xD2, 0xE7, /* 0x58-0x5B */ + 0xD2, 0xE9, 0xAF, 0xAC, 0xAF, 0xAB, 0xAF, 0xA9, /* 0x5C-0x5F */ + 0xAF, 0xA8, 0xD6, 0xC2, 0x3F, 0x3F, 0xD6, 0xC0, /* 0x60-0x63 */ + 0xD6, 0xBC, 0xB2, 0xBB, 0x3F, 0x3F, 0xD6, 0xBD, /* 0x64-0x67 */ + 0xB2, 0xBC, 0xD6, 0xBE, 0xD6, 0xBF, 0xD6, 0xC1, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xB2, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xDA, 0xD5, 0x3F, 0x3F, 0xDA, 0xD4, 0xDA, 0xD3, /* 0x70-0x73 */ + 0xDA, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xDE, 0xF6, 0xB8, 0x52, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xDE, 0xF3, 0xDE, 0xF5, 0x3F, 0x3F, 0xB8, 0x53, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xB8, 0x54, 0xDE, 0xF4, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xE3, 0x41, 0x3F, 0x3F, 0xE2, 0xF9, 0xE2, 0xFA, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xBA, 0xD7, 0xBA, 0xD5, 0xBA, 0xD6, /* 0x8C-0x8F */ + 0xE3, 0x43, 0x3F, 0x3F, 0xE3, 0x42, 0xE2, 0xFE, /* 0x90-0x93 */ + 0xE2, 0xFD, 0xE2, 0xFC, 0xE2, 0xFB, 0xE3, 0x40, /* 0x94-0x97 */ + 0xE2, 0xF8, 0x3F, 0x3F, 0xE6, 0xCB, 0xE6, 0xD0, /* 0x98-0x9B */ + 0xE6, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xE6, 0xCD, 0xE6, 0xCC, 0xE6, 0xCF, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xEA, 0xAE, 0x3F, 0x3F, 0xBF, 0x6D, 0xC1, 0x48, /* 0xA4-0xA7 */ + 0xED, 0xB0, 0x3F, 0x3F, 0xC1, 0x49, 0xED, 0xAF, /* 0xA8-0xAB */ + 0xF0, 0x5F, 0xF0, 0x5E, 0xC2, 0xA7, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xF2, 0xA5, 0xC3, 0xAB, 0xF4, 0xA1, 0xC5, 0xA1, /* 0xB0-0xB3 */ + 0xF6, 0xF7, 0x3F, 0x3F, 0xF8, 0xB7, 0xF8, 0xB6, /* 0xB4-0xB7 */ + 0xC9, 0xA8, 0xAC, 0xEA, 0xAC, 0xEB, 0xD6, 0xC3, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xB8, 0x56, 0xA5, 0xDD, 0xA8, 0x72, /* 0xBC-0xBF */ + 0xA8, 0x71, 0xA8, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xCD, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xAA, 0xC4, 0xAA, 0xC3, 0x3F, 0x3F, 0xAC, 0xEE, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xCF, 0xFA, 0xCF, 0xFD, 0xCF, 0xFB, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xAC, 0xEC, 0xAC, 0xED, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xCF, 0xF9, 0xCF, 0xFC, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xAF, 0xB5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xD2, 0xF3, 0xD2, 0xF5, 0xD2, 0xF4, 0xAF, 0xB2, /* 0xDC-0xDF */ + 0xD2, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xAF, 0xB0, /* 0xE0-0xE3 */ + 0xAF, 0xAF, 0x3F, 0x3F, 0xAF, 0xB3, 0xAF, 0xB1, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xAF, 0xB4, 0xD2, 0xF2, 0xD2, 0xED, /* 0xE8-0xEB */ + 0xD2, 0xEE, 0xD2, 0xF1, 0xD2, 0xF0, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xC6, 0xD6, 0xC7, /* 0xF4-0xF7 */ + 0xD6, 0xC5, 0x3F, 0x3F, 0xD6, 0xC4, 0xB2, 0xBE, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7A[512] = { + 0xB5, 0x7D, 0x3F, 0x3F, 0xDA, 0xD6, 0xDA, 0xD8, /* 0x00-0x03 */ + 0xDA, 0xDA, 0xB5, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xB5, 0x7A, 0x3F, 0x3F, 0xDA, 0xD7, 0xB5, 0x7B, /* 0x08-0x0B */ + 0xDA, 0xD9, 0xB5, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xDF, 0x41, 0xDE, 0xF7, 0xDE, 0xFA, 0xDE, 0xFE, /* 0x10-0x13 */ + 0xB8, 0x5A, 0xDE, 0xFC, 0x3F, 0x3F, 0xDE, 0xFB, /* 0x14-0x17 */ + 0xDE, 0xF8, 0xDE, 0xF9, 0xB8, 0x58, 0xDF, 0x40, /* 0x18-0x1B */ + 0xB8, 0x57, 0x3F, 0x3F, 0xB8, 0x5C, 0xB8, 0x5B, /* 0x1C-0x1F */ + 0xB8, 0x59, 0x3F, 0x3F, 0xDE, 0xFD, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x49, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xE3, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x44, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBA, 0xD8, 0xE3, 0x47, /* 0x2C-0x2F */ + 0xE3, 0x46, 0xBA, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xBD, 0x5E, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xE6, 0xD2, 0x3F, 0x3F, 0xBD, 0x5F, /* 0x38-0x3B */ + 0xBD, 0x5B, 0xBD, 0x5D, 0x3F, 0x3F, 0xBD, 0x5A, /* 0x3C-0x3F */ + 0xBD, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xEA, 0xAF, 0x3F, 0x3F, 0xBF, 0x70, 0xEA, 0xB1, /* 0x44-0x47 */ + 0xEA, 0xB0, 0x3F, 0x3F, 0xE3, 0x45, 0xBF, 0x72, /* 0x48-0x4B */ + 0xBF, 0x71, 0xBF, 0x6E, 0xBF, 0x6F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xED, 0xB5, 0x3F, 0x3F, 0xED, 0xB3, 0xC1, 0x4A, /* 0x54-0x57 */ + 0xED, 0xB4, 0x3F, 0x3F, 0xED, 0xB6, 0xED, 0xB2, /* 0x58-0x5B */ + 0xED, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0x60, /* 0x5C-0x5F */ + 0xC2, 0xAA, 0xC2, 0xA8, 0xC2, 0xA9, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xA6, /* 0x64-0x67 */ + 0xF2, 0xA7, 0xC3, 0xAD, 0x3F, 0x3F, 0xC3, 0xAC, /* 0x68-0x6B */ + 0xF4, 0xA3, 0xF4, 0xA4, 0xF4, 0xA2, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xF6, 0xF8, 0xF6, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xA5, 0xDE, 0xCA, 0x48, 0xA8, 0x73, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xCD, 0xA5, 0xAA, 0xC6, 0xAA, 0xC5, 0xCD, 0xA6, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0x40, 0xAC, 0xEF, /* 0x7C-0x7F */ + + 0xCF, 0xFE, 0xAC, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xAF, 0xB6, 0xD2, 0xF8, 0xD2, 0xF6, 0xD2, 0xFC, /* 0x84-0x87 */ + 0xAF, 0xB7, 0xD2, 0xF7, 0xD2, 0xFB, 0xD2, 0xF9, /* 0x88-0x8B */ + 0xD2, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xC8, /* 0x8C-0x8F */ + 0xD6, 0xCA, 0x3F, 0x3F, 0xB2, 0xBF, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xD6, 0xC9, 0xB2, 0xC0, 0xB5, 0xA2, 0xB5, 0xA1, /* 0x94-0x97 */ + 0xB5, 0x7E, 0xDA, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0x44, 0xB8, 0x5D, /* 0x9C-0x9F */ + 0xB8, 0x5E, 0x3F, 0x3F, 0xDF, 0x43, 0xDF, 0x42, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xE3, 0x4A, 0xBA, 0xDB, 0xBA, 0xDA, 0xE3, 0x4B, /* 0xA8-0xAB */ + 0xE3, 0x4C, 0x3F, 0x3F, 0xBD, 0x61, 0xBD, 0x60, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xEA, 0xB5, 0xE6, 0xD3, 0xE6, 0xD5, /* 0xB0-0xB3 */ + 0xE6, 0xD4, 0xEA, 0xB4, 0xEA, 0xB2, 0xEA, 0xB6, /* 0xB4-0xB7 */ + 0xEA, 0xB3, 0x3F, 0x3F, 0xBF, 0x73, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xED, 0xB7, 0xC1, 0x4B, /* 0xBC-0xBF */ + 0xED, 0xB8, 0xED, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xC2, 0xAB, 0xC2, 0xAC, 0x3F, 0x3F, 0xC4, 0x75, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0xD1, 0xA5, 0xDF, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xD0, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xD2, 0xFD, 0xAF, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xBA, /* 0xDC-0xDF */ + 0xB3, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0xB5, 0xA4, /* 0xE0-0xE3 */ + 0xDA, 0xDD, 0xB5, 0xA3, 0xDA, 0xDC, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0x45, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xBA, 0xDC, 0xE3, 0x4D, 0xBA, 0xDD, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC4, 0x76, 0xF4, 0xA5, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xA6, 0xCB, 0xAA, 0xC7, 0xCD, 0xA7, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xAC, 0xF2, 0x3F, 0x3F, 0xAC, 0xF1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7B[512] = { + 0xD0, 0x42, 0xD0, 0x43, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xD3, 0x40, 0xD3, 0x42, 0xAF, 0xB9, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xD3, 0x44, 0xD3, 0x47, 0xD3, 0x45, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0x46, 0xD3, 0x43, /* 0x0C-0x0F */ + 0xD2, 0xFE, 0xAF, 0xBA, 0xD3, 0x48, 0xD3, 0x41, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xD6, 0xD3, 0xB2, 0xC6, 0xD6, 0xDC, 0xB2, 0xC3, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xD6, 0xD5, 0xB2, 0xC7, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xB2, 0xC1, 0x3F, 0x3F, 0xD6, 0xD0, 0xD6, 0xDD, /* 0x20-0x23 */ + 0xD6, 0xD1, 0xD6, 0xCE, 0xB2, 0xC5, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xB2, 0xC2, 0x3F, 0x3F, 0xD6, 0xD4, 0xD6, 0xD7, /* 0x28-0x2B */ + 0xB2, 0xC4, 0xD6, 0xD8, 0xB2, 0xC8, 0xD6, 0xD9, /* 0x2C-0x2F */ + 0xD6, 0xCF, 0xD6, 0xD6, 0xD6, 0xDA, 0xD6, 0xD2, /* 0x30-0x33 */ + 0xD6, 0xCD, 0xD6, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xD6, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xDF, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xDA, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xDA, 0xE0, 0xDA, 0xE6, 0xB5, 0xA7, 0xD6, 0xCC, /* 0x44-0x47 */ + 0xDA, 0xE1, 0xB5, 0xA5, 0xDA, 0xDE, 0xB5, 0xAC, /* 0x48-0x4B */ + 0xDA, 0xE2, 0xB5, 0xAB, 0xDA, 0xE3, 0xB5, 0xAD, /* 0x4C-0x4F */ + 0xB5, 0xA8, 0xB5, 0xAE, 0xB5, 0xA9, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xB5, 0xAA, 0x3F, 0x3F, 0xB5, 0xA6, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xDA, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xB8, 0x61, 0xDF, 0x50, 0x3F, 0x3F, 0xDF, 0x53, /* 0x60-0x63 */ + 0xDF, 0x47, 0xDF, 0x4C, 0xDF, 0x46, 0xB8, 0x63, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xDF, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xDF, 0x48, 0xB8, 0x62, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xDF, 0x4F, 0xDF, 0x4E, 0xDF, 0x4B, 0xDF, 0x4D, /* 0x70-0x73 */ + 0xDF, 0x49, 0xBA, 0xE1, 0xDF, 0x52, 0xB8, 0x5F, /* 0x74-0x77 */ + 0xDF, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x5D, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xBA, 0xE8, 0xE3, 0x58, 0x3F, 0x3F, 0xBA, 0xE7, /* 0x84-0x87 */ + 0xE3, 0x4E, 0x3F, 0x3F, 0xE3, 0x50, 0xBA, 0xE0, /* 0x88-0x8B */ + 0xE3, 0x55, 0xE3, 0x54, 0xE3, 0x57, 0xBA, 0xE5, /* 0x8C-0x8F */ + 0xE3, 0x52, 0xE3, 0x51, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xBA, 0xE4, 0xBA, 0xDF, 0xE3, 0x53, 0xBA, 0xE2, /* 0x94-0x97 */ + 0xE3, 0x59, 0xE3, 0x5B, 0x3F, 0x3F, 0xE3, 0x56, /* 0x98-0x9B */ + 0xE3, 0x4F, 0xBA, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xBD, 0x69, 0xBA, 0xDE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xE3, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE6, 0xD9, 0xBD, 0x62, 0x3F, 0x3F, 0xE6, 0xDB, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xBD, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xBD, 0x65, 0xE6, 0xDE, 0x3F, 0x3F, 0xE6, 0xD6, /* 0xB4-0xB7 */ + 0xBA, 0xE6, 0xE6, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xD8, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xB8, 0x60, 0xBD, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xBD, 0x64, 0x3F, 0x3F, 0xBD, 0x66, 0xBD, 0x67, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xBF, 0x76, 0xE6, 0xDD, 0xE6, 0xD7, /* 0xC8-0xCB */ + 0xBD, 0x6A, 0x3F, 0x3F, 0xE6, 0xDA, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xEA, 0xC0, 0xEA, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xEA, 0xC5, 0xBF, 0x74, 0xEA, 0xBD, 0xBF, 0x78, /* 0xD8-0xDB */ + 0xEA, 0xC3, 0xEA, 0xBA, 0xEA, 0xB7, 0xEA, 0xC6, /* 0xDC-0xDF */ + 0xC1, 0x51, 0xBF, 0x79, 0xEA, 0xC2, 0xEA, 0xB8, /* 0xE0-0xE3 */ + 0xBF, 0x77, 0xEA, 0xBC, 0xBF, 0x7B, 0xEA, 0xB9, /* 0xE4-0xE7 */ + 0xEA, 0xBE, 0xBF, 0x7A, 0xEA, 0xC1, 0xEA, 0xC4, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xED, 0xCB, 0xED, 0xCC, 0xED, 0xBC, 0xED, 0xC3, /* 0xF0-0xF3 */ + 0xED, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0xC1, 0x4F, /* 0xF4-0xF7 */ + 0xED, 0xC8, 0xEA, 0xBF, 0x3F, 0x3F, 0xED, 0xBF, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xED, 0xC9, 0xC1, 0x4E, 0xED, 0xBE, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7C[512] = { + 0xED, 0xBD, 0xED, 0xC7, 0xED, 0xC4, 0xED, 0xC6, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xED, 0xBA, 0xED, 0xCA, 0xC1, 0x4C, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xED, 0xC5, 0xED, 0xCE, 0xED, 0xC2, /* 0x08-0x0B */ + 0xC1, 0x50, 0xC1, 0x4D, 0xED, 0xC0, 0xED, 0xBB, /* 0x0C-0x0F */ + 0xED, 0xCD, 0xBF, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF0, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xF0, 0x61, 0xF0, 0x67, 0xC2, 0xB0, 0xF0, 0x65, /* 0x1C-0x1F */ + 0xF0, 0x64, 0xC2, 0xB2, 0xF0, 0x6A, 0xC2, 0xB1, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xF0, 0x6B, 0xF0, 0x68, 0xC2, 0xAE, /* 0x24-0x27 */ + 0xF0, 0x69, 0xF0, 0x62, 0xC2, 0xAF, 0xC2, 0xAD, /* 0x28-0x2B */ + 0xF2, 0xAB, 0xF0, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xF0, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xA8, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC3, 0xB2, /* 0x34-0x37 */ + 0xC3, 0xB0, 0xF2, 0xAA, 0x3F, 0x3F, 0xF2, 0xAC, /* 0x38-0x3B */ + 0xF2, 0xA9, 0xC3, 0xB1, 0xC3, 0xAE, 0xC3, 0xAF, /* 0x3C-0x3F */ + 0xC3, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, 0xC4, 0x78, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xF4, 0xAA, 0x3F, 0x3F, 0xF4, 0xA9, /* 0x44-0x47 */ + 0xF4, 0xA7, 0xF4, 0xA6, 0xF4, 0xA8, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xC4, 0x77, 0xC4, 0x79, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xC4, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xE5, /* 0x50-0x53 */ + 0xF5, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xFA, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xF6, 0xFC, 0xF6, 0xFE, 0xF6, 0xFD, /* 0x58-0x5B */ + 0xF6, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0xA3, /* 0x5C-0x5F */ + 0xC5, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0xD3, /* 0x60-0x63 */ + 0xC5, 0xD2, 0xC5, 0xD4, 0xF7, 0xED, 0xF7, 0xEC, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xF8, 0xFB, 0xF8, 0xB8, 0xF8, 0xFC, /* 0x68-0x6B */ + 0xC6, 0x58, 0x3F, 0x3F, 0xC6, 0x59, 0xF9, 0x6D, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC6, 0x7E, 0xA6, 0xCC, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xCD, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xD0, 0x45, 0xD0, 0x46, 0xD0, 0x44, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xAC, 0xF3, 0x3F, 0x3F, 0xD0, 0x47, /* 0x7C-0x7F */ + + 0xD0, 0x48, 0xD0, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xD3, 0x49, 0xD3, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xD3, 0x4D, 0xAF, 0xBB, 0xD3, 0x4B, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xD3, 0x4C, 0xD3, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xD3, 0x4A, 0xB2, 0xC9, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xD6, 0xDE, 0xB2, 0xCB, 0xD6, 0xE0, 0xB2, 0xCA, /* 0x94-0x97 */ + 0xD6, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xE8, 0xB5, 0xAF, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xDA, 0xEA, 0xDA, 0xE7, 0xD6, 0xE1, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xB5, 0xB0, 0x3F, 0x3F, 0xF9, 0xDB, /* 0xA4-0xA7 */ + 0xDA, 0xE9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0x56, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xB8, 0x64, 0xDF, 0x54, 0xB8, 0x65, /* 0xB0-0xB3 */ + 0xDF, 0x55, 0xB8, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xBA, 0xE9, 0xE3, 0x61, 0xE3, 0x5E, /* 0xB8-0xBB */ + 0xE3, 0x60, 0xBA, 0xEA, 0xBA, 0xEB, 0xE3, 0x5F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xE6, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xE6, 0xE0, 0x3F, 0x3F, 0xBD, 0x6B, 0xE6, 0xE2, /* 0xC8-0xCB */ + 0xE6, 0xE1, 0x3F, 0x3F, 0xA2, 0x61, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xEA, 0xCA, 0xEA, 0xCB, 0xEA, 0xC7, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xEA, 0xC8, 0xBF, 0x7C, 0xBF, 0x7D, 0xEA, 0xC9, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xC1, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xC1, 0x53, 0xC1, 0x58, 0xC1, 0x54, 0xC1, 0x56, /* 0xDC-0xDF */ + 0xC1, 0x52, 0x3F, 0x3F, 0xC1, 0x55, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0xB3, /* 0xE4-0xE7 */ + 0xED, 0xCF, 0x3F, 0x3F, 0xF2, 0xAE, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xF2, 0xAD, 0x3F, 0x3F, 0xF4, 0xAB, 0xC4, 0x7A, /* 0xEC-0xEF */ + 0xC4, 0x7B, 0xF7, 0x41, 0xF5, 0xE6, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xF7, 0x40, 0x3F, 0x3F, 0xF8, 0xFD, 0xF9, 0xA4, /* 0xF4-0xF7 */ + 0xA6, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0x74, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xCD, 0xA9, 0xAA, 0xC8, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7D[512] = { + 0xAC, 0xF6, 0xD0, 0x4C, 0xAC, 0xF4, 0xD0, 0x4A, /* 0x00-0x03 */ + 0xAC, 0xF9, 0xAC, 0xF5, 0xAC, 0xFA, 0xAC, 0xF8, /* 0x04-0x07 */ + 0xD0, 0x4B, 0xAC, 0xF7, 0xAF, 0xBF, 0xAF, 0xBE, /* 0x08-0x0B */ + 0xD3, 0x5A, 0xAF, 0xC7, 0xD3, 0x53, 0xD3, 0x59, /* 0x0C-0x0F */ + 0xAF, 0xC3, 0xD3, 0x52, 0xD3, 0x58, 0xD3, 0x56, /* 0x10-0x13 */ + 0xAF, 0xC2, 0xAF, 0xC4, 0xD3, 0x55, 0xAF, 0xBD, /* 0x14-0x17 */ + 0xD3, 0x54, 0xAF, 0xC8, 0xAF, 0xC5, 0xAF, 0xC9, /* 0x18-0x1B */ + 0xAF, 0xC6, 0xD3, 0x51, 0xD3, 0x50, 0xD3, 0x57, /* 0x1C-0x1F */ + 0xAF, 0xC0, 0xAF, 0xBC, 0xAF, 0xC1, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xD6, 0xF0, 0xD6, 0xE9, 0x3F, 0x3F, 0xB5, 0xB5, /* 0x28-0x2B */ + 0xD6, 0xE8, 0x3F, 0x3F, 0xB2, 0xCF, 0xB2, 0xD6, /* 0x2C-0x2F */ + 0xB2, 0xD3, 0xB2, 0xD9, 0xB2, 0xD8, 0xB2, 0xD4, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xD6, 0xE2, 0xD6, 0xE5, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xD6, 0xE4, 0xB2, 0xD0, 0xD6, 0xE6, 0xD6, 0xEF, /* 0x38-0x3B */ + 0xB2, 0xD1, 0xD6, 0xE3, 0xD6, 0xEC, 0xD6, 0xED, /* 0x3C-0x3F */ + 0xB2, 0xD2, 0xD6, 0xEA, 0xB2, 0xD7, 0xB2, 0xCD, /* 0x40-0x43 */ + 0xB2, 0xD5, 0xD6, 0xE7, 0xB2, 0xCC, 0xD6, 0xEB, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD6, 0xEE, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDA, 0xFB, 0xDA, 0xF2, /* 0x4C-0x4F */ + 0xB5, 0xB2, 0xDA, 0xF9, 0xDA, 0xF6, 0xDA, 0xEE, /* 0x50-0x53 */ + 0xDA, 0xF7, 0xB5, 0xB4, 0xDA, 0xEF, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xDA, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0xB8, 0x6C, /* 0x58-0x5B */ + 0xDA, 0xF4, 0x3F, 0x3F, 0xB5, 0xB1, 0xDA, 0xFA, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xB5, 0xB8, 0xB5, 0xBA, 0xDA, 0xED, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB5, 0xB9, 0xDA, 0xF0, /* 0x64-0x67 */ + 0xB5, 0xB3, 0xDA, 0xF8, 0xDA, 0xF1, 0xDA, 0xF5, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xDA, 0xF3, 0xB5, 0xB6, 0xDA, 0xEC, /* 0x6C-0x6F */ + 0xB5, 0xBB, 0xB2, 0xCE, 0xB5, 0xB7, 0xB5, 0xBC, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xB8, 0x68, 0xDF, 0x5D, 0xDF, 0x5F, /* 0x78-0x7B */ + 0xDF, 0x61, 0xDF, 0x65, 0x3F, 0x3F, 0xDF, 0x5B, /* 0x7C-0x7F */ + + 0xDF, 0x59, 0xB8, 0x6A, 0x3F, 0x3F, 0xDF, 0x60, /* 0x80-0x83 */ + 0xDF, 0x64, 0xDF, 0x5C, 0xDF, 0x58, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xDF, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xDF, 0x62, 0xDF, 0x5A, 0xDF, 0x5E, 0xB8, 0x6B, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xB8, 0x69, 0xDF, 0x66, 0xB8, 0x67, /* 0x90-0x93 */ + 0xDF, 0x63, 0x3F, 0x3F, 0xE3, 0x72, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xBA, 0xEE, 0xE3, 0x6A, 0xBD, 0x78, 0xE3, 0x74, /* 0x9C-0x9F */ + 0xBA, 0xF1, 0xE3, 0x78, 0xBA, 0xF7, 0xE3, 0x65, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0x75, 0xE3, 0x62, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xE3, 0x77, 0xE3, 0x66, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xBA, 0xFE, 0xBA, 0xFB, 0xE3, 0x76, 0xE3, 0x70, /* 0xAC-0xAF */ + 0xBA, 0xED, 0xBA, 0xF5, 0xBA, 0xF4, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xBA, 0xF3, 0xBA, 0xF9, 0x3F, 0x3F, 0xE3, 0x63, /* 0xB4-0xB7 */ + 0xBA, 0xFA, 0xE3, 0x71, 0xBA, 0xF6, 0xBA, 0xEC, /* 0xB8-0xBB */ + 0xE3, 0x73, 0xBA, 0xEF, 0xBA, 0xF0, 0xBA, 0xF8, /* 0xBC-0xBF */ + 0xE3, 0x68, 0xE3, 0x67, 0xE3, 0x64, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xE3, 0x6C, 0xE3, 0x69, 0xE3, 0x6D, 0xBA, 0xFD, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xE3, 0x79, 0xBA, 0xF2, 0xE3, 0x6E, /* 0xC8-0xCB */ + 0xE3, 0x6F, 0x3F, 0x3F, 0xE3, 0x6B, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBA, 0xFC, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE7, /* 0xD4-0xD7 */ + 0xBD, 0x70, 0xBD, 0x79, 0xBD, 0x75, 0xE6, 0xE4, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xBD, 0x72, 0xBD, 0x76, 0xE6, 0xF0, /* 0xDC-0xDF */ + 0xBD, 0x6C, 0xE6, 0xE8, 0x3F, 0x3F, 0xBD, 0x74, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xEB, 0xE6, 0xE6, /* 0xE4-0xE7 */ + 0xBD, 0x73, 0xBD, 0x77, 0xE6, 0xE5, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xBD, 0x71, 0x3F, 0x3F, 0xE6, 0xEF, 0xBD, 0x6E, /* 0xEC-0xEF */ + 0xE6, 0xEE, 0xE6, 0xED, 0xBD, 0x7A, 0xE5, 0x72, /* 0xF0-0xF3 */ + 0xBD, 0x6D, 0x3F, 0x3F, 0xE6, 0xEC, 0xE6, 0xE3, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xBD, 0x7B, 0xE6, 0xEA, 0xBD, 0x6F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7E[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xE9, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xBF, 0xA2, 0xBF, 0xA7, 0xBF, 0x7E, 0xEA, 0xD8, /* 0x08-0x0B */ + 0xEA, 0xCF, 0xEA, 0xDB, 0xEA, 0xD3, 0xEA, 0xD9, /* 0x0C-0x0F */ + 0xBF, 0xA8, 0xBF, 0xA1, 0xEA, 0xCC, 0xEA, 0xD2, /* 0x10-0x13 */ + 0xEA, 0xDC, 0xEA, 0xD5, 0xEA, 0xDA, 0xEA, 0xCE, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xD6, 0xBF, 0xA3, /* 0x18-0x1B */ + 0xEA, 0xD4, 0xBF, 0xA6, 0xBF, 0xA5, 0xEA, 0xD0, /* 0x1C-0x1F */ + 0xEA, 0xD1, 0xEA, 0xCD, 0xEA, 0xD7, 0xBF, 0xA4, /* 0x20-0x23 */ + 0xEA, 0xDE, 0xEA, 0xDD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xED, 0xDA, 0xED, 0xD6, 0xC1, 0x5F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xED, 0xD0, 0xC1, 0x59, 0xC1, 0x69, /* 0x2C-0x2F */ + 0xED, 0xDC, 0xC1, 0x61, 0xC1, 0x5D, 0xED, 0xD3, /* 0x30-0x33 */ + 0xC1, 0x64, 0xC1, 0x67, 0xED, 0xDE, 0xC1, 0x5C, /* 0x34-0x37 */ + 0xED, 0xD5, 0xC1, 0x65, 0xED, 0xE0, 0xED, 0xDD, /* 0x38-0x3B */ + 0xED, 0xD1, 0xC1, 0x60, 0xC1, 0x5A, 0xC1, 0x68, /* 0x3C-0x3F */ + 0xED, 0xD8, 0xC1, 0x63, 0xED, 0xD2, 0xC1, 0x5E, /* 0x40-0x43 */ + 0xED, 0xDF, 0xC1, 0x62, 0xC1, 0x5B, 0xED, 0xD9, /* 0x44-0x47 */ + 0xC1, 0x66, 0xED, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xED, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF0, 0x6E, 0xF0, 0x74, 0xC2, 0xB9, 0xF0, 0x77, /* 0x50-0x53 */ + 0xC2, 0xB4, 0xC2, 0xB5, 0xF0, 0x6F, 0xF0, 0x76, /* 0x54-0x57 */ + 0xF0, 0x71, 0xC2, 0xBA, 0xC2, 0xB7, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xF0, 0x6D, 0x3F, 0x3F, 0xC2, 0xB6, 0xF0, 0x73, /* 0x5C-0x5F */ + 0xF0, 0x75, 0xC2, 0xB8, 0xF0, 0x72, 0xF0, 0x70, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF2, 0xB8, 0xC3, 0xB7, 0xC3, 0xB8, 0xC3, 0xB4, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xC3, 0xB5, 0x3F, 0x3F, 0xF2, 0xB4, /* 0x6C-0x6F */ + 0xF2, 0xB2, 0x3F, 0x3F, 0xF2, 0xB6, 0xC3, 0xBA, /* 0x70-0x73 */ + 0xF2, 0xB7, 0xF2, 0xB0, 0xF2, 0xAF, 0xF2, 0xB3, /* 0x74-0x77 */ + 0xF2, 0xB1, 0xC3, 0xB6, 0xF2, 0xB5, 0xF4, 0xAC, /* 0x78-0x7B */ + 0xC4, 0x7E, 0xC4, 0x7D, 0xF4, 0xAD, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xF4, 0xAF, 0xF4, 0xAE, 0xC4, 0xA1, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0xEB, 0xF5, 0xE8, /* 0x84-0x87 */ + 0xF5, 0xE9, 0x3F, 0x3F, 0xF5, 0xE7, 0xF5, 0xEA, /* 0x88-0x8B */ + 0xC4, 0xF2, 0xF5, 0xEC, 0x3F, 0x3F, 0xC4, 0xF1, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xF7, 0x42, 0x3F, 0x3F, 0xC5, 0xD5, /* 0x90-0x93 */ + 0xC5, 0xD7, 0xF7, 0xEE, 0xC5, 0xD6, 0xF8, 0xB9, /* 0x94-0x97 */ + 0xF9, 0x40, 0xF9, 0x42, 0xF8, 0xFE, 0xF9, 0x41, /* 0x98-0x9B */ + 0xC6, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_7F[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0xCE, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xAC, 0xFB, 0xD2, 0x6F, 0xAF, 0xCA, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xB2, 0xDA, 0xDA, 0xFC, 0xDA, 0xFD, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xDF, /* 0x40-0x43 */ + 0xC1, 0x6A, 0xED, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xC2, 0xBB, 0x3F, 0x3F, 0xF2, 0xBA, 0xF2, 0xB9, /* 0x48-0x4B */ + 0xC4, 0xA2, 0xF5, 0xED, 0x3F, 0x3F, 0xF7, 0x43, /* 0x4C-0x4F */ + 0xC5, 0xF8, 0xCA, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xAA, 0xC9, 0xA8, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xD0, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0x60, /* 0x58-0x5B */ + 0xD3, 0x5B, 0xD3, 0x5F, 0xD3, 0x5D, 0xAF, 0xCB, /* 0x5C-0x5F */ + 0xD3, 0x5E, 0xD3, 0x5C, 0x3F, 0x3F, 0xD6, 0xF1, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xDA, 0xFE, 0xDB, 0x40, 0xDF, 0x69, /* 0x64-0x67 */ + 0xDF, 0x6A, 0xB8, 0x6E, 0xB8, 0x6F, 0xDF, 0x68, /* 0x68-0x6B */ + 0xDF, 0x6B, 0xDF, 0x67, 0xB8, 0x6D, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xBB, 0x40, 0x3F, 0x3F, 0xB8, 0x70, 0xE3, 0x7A, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xBD, 0x7C, 0xE6, 0xF1, 0xBD, 0x7D, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xBF, 0xA9, 0xEA, 0xE2, 0xEA, 0xE0, /* 0x78-0x7B */ + 0xEA, 0xE1, 0xED, 0xE4, 0xED, 0xE3, 0xED, 0xE2, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xBB, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xC3, 0xB9, 0xF2, 0xBC, 0xF7, 0x44, /* 0x84-0x87 */ + 0xC5, 0xF9, 0xF8, 0xBA, 0xA6, 0xCF, 0xAA, 0xCB, /* 0x88-0x8B */ + 0xAA, 0xCA, 0xD0, 0x4F, 0xAC, 0xFC, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xD0, 0x4E, 0xD3, 0x62, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xAF, 0xCC, 0xD6, 0xF2, 0xD3, 0x61, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0xDC, 0xD6, 0xF5, /* 0x98-0x9B */ + 0xD6, 0xF3, 0xD6, 0xF4, 0xB2, 0xDB, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xDB, 0x42, 0xDB, 0x43, 0xDB, 0x41, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xB8, 0x73, 0xDF, 0x6D, 0xDF, 0x6C, 0xDF, 0x6E, /* 0xA4-0xA7 */ + 0xB8, 0x72, 0xB8, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE6, 0xF2, 0xE6, 0xF4, 0x3F, 0x3F, 0xBD, 0x7E, /* 0xAC-0xAF */ + 0xE6, 0xF3, 0xEA, 0xE3, 0xBF, 0xAA, 0xF0, 0x79, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xF0, 0x78, 0xC3, 0xBB, 0xF2, 0xBD, /* 0xB4-0xB7 */ + 0xC3, 0xBD, 0xC3, 0xBC, 0xF4, 0xB0, 0xF5, 0xEE, /* 0xB8-0xBB */ + 0xC4, 0xF3, 0xA6, 0xD0, 0xD0, 0x50, 0xAC, 0xFD, /* 0xBC-0xBF */ + 0xD3, 0x65, 0xAF, 0xCE, 0xD3, 0x64, 0xD3, 0x63, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xAF, 0xCD, 0x3F, 0x3F, 0xD6, 0xFB, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xD6, 0xFD, 0xD6, 0xF6, 0xD6, 0xF7, /* 0xC8-0xCB */ + 0xB2, 0xDD, 0xD6, 0xF8, 0xB2, 0xDE, 0xD6, 0xFC, /* 0xCC-0xCF */ + 0xD6, 0xF9, 0xD6, 0xFA, 0xB2, 0xDF, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xB5, 0xBE, 0xB5, 0xBF, 0x3F, 0x3F, 0xDB, 0x44, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0x6F, /* 0xD8-0xDB */ + 0xDF, 0x70, 0x3F, 0x3F, 0xE3, 0x7E, 0xBB, 0x43, /* 0xDC-0xDF */ + 0xBB, 0x41, 0xBB, 0x42, 0xE3, 0x7B, 0xE3, 0x7C, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xE3, 0x7D, 0xE6, 0xF9, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xE6, 0xFA, 0xBD, 0xA1, 0xE6, 0xF7, 0xE6, 0xF6, /* 0xE8-0xEB */ + 0xE6, 0xF8, 0xE6, 0xF5, 0xBF, 0xAD, 0xEA, 0xE4, /* 0xEC-0xEF */ + 0xBF, 0xAB, 0xBF, 0xAC, 0xED, 0xE6, 0xC1, 0x6B, /* 0xF0-0xF3 */ + 0xED, 0xE5, 0xEF, 0xA8, 0x3F, 0x3F, 0xF0, 0x7A, /* 0xF4-0xF7 */ + 0xF0, 0x7B, 0xC2, 0xBC, 0x3F, 0x3F, 0xC2, 0xBD, /* 0xF8-0xFB */ + 0xC1, 0x6C, 0xF2, 0xBE, 0xF2, 0xBF, 0xF4, 0xB1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_80[512] = { + 0xC4, 0xA3, 0xA6, 0xD1, 0x3F, 0x3F, 0xA6, 0xD2, /* 0x00-0x03 */ + 0xAC, 0xFE, 0xAA, 0xCC, 0xAF, 0xCF, 0xD0, 0x51, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB5, 0xC0, /* 0x08-0x0B */ + 0xA6, 0xD3, 0xAD, 0x41, 0xD0, 0x52, 0xD0, 0x53, /* 0x0C-0x0F */ + 0xAD, 0x40, 0xAD, 0x42, 0xA6, 0xD4, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xD0, 0x54, 0xAF, 0xD1, 0xD3, 0x66, 0xAF, 0xD3, /* 0x14-0x17 */ + 0xAF, 0xD0, 0xAF, 0xD2, 0x3F, 0x3F, 0xD7, 0x41, /* 0x18-0x1B */ + 0xB2, 0xE0, 0x3F, 0x3F, 0xD7, 0x40, 0xD6, 0xFE, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xDF, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xE3, 0xA1, 0x3F, 0x3F, 0xBD, 0xA2, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xBF, 0xAE, 0xEA, 0xE6, 0xEA, 0xE5, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xED, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xF5, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0xD5, /* 0x30-0x33 */ + 0xCB, 0x73, 0xCD, 0xAA, 0xAD, 0x43, 0xD0, 0x55, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xD3, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xAF, 0xD4, 0xD3, 0x67, 0xAF, 0xD5, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0x43, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB2, 0xE2, 0xD7, 0x42, /* 0x44-0x47 */ + 0xD7, 0x44, 0x3F, 0x3F, 0xB2, 0xE1, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0x46, /* 0x4C-0x4F */ + 0xDB, 0x47, 0xDB, 0x45, 0xB5, 0xC1, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB8, 0x74, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xB8, 0x75, 0x3F, 0x3F, 0xBB, 0x45, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xE3, 0xA3, 0xE3, 0xA2, 0xBB, 0x44, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xE6, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, 0xE6, 0xFC, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xEA, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0xC1, 0x70, /* 0x6C-0x6F */ + 0xC1, 0x6F, 0xC1, 0x6D, 0xC1, 0x6E, 0xC1, 0x71, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xF0, 0x7C, 0xC2, 0xBF, 0xC2, 0xBE, /* 0x74-0x77 */ + 0xF2, 0xC0, 0xF4, 0xB2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xC5, 0xA5, 0xC5, 0xA4, 0xA6, 0xD6, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xD1, 0xFB, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xB8, 0x77, 0xB5, 0xC2, 0xB8, 0x76, 0xBB, 0x46, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xA6, 0xD7, 0xC9, 0xA9, 0xA6, 0xD8, /* 0x88-0x8B */ + 0xA6, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xAB, /* 0x8C-0x8F */ + 0xCB, 0x76, 0x3F, 0x3F, 0xCB, 0x77, 0xA8, 0x77, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xCB, 0x74, 0xA8, 0x76, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xA8, 0x79, 0xCB, 0x75, 0xA8, 0x7B, 0xA8, 0x7A, /* 0x98-0x9B */ + 0xCB, 0x78, 0xA8, 0x78, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xAA, 0xD1, 0xAA, 0xCF, 0xCD, 0xAD, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xAA, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xAA, 0xD3, 0xAA, 0xD5, 0xAA, 0xD2, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xCD, 0xB0, 0xCD, 0xAC, 0xAA, 0xD6, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xAA, 0xD0, 0xA8, 0x7C, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xAA, 0xD4, 0xCD, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xCD, 0xAE, 0x3F, 0x3F, 0xAA, 0xCD, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0x5B, 0xAD, 0x47, /* 0xC0-0xC3 */ + 0xAD, 0x48, 0xD0, 0x5D, 0x3F, 0x3F, 0xD0, 0x57, /* 0xC4-0xC7 */ + 0xD0, 0x5A, 0xD0, 0x63, 0xD0, 0x61, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xAD, 0x49, 0xD0, 0x67, 0xAD, 0x4C, 0xD0, 0x64, /* 0xCC-0xCF */ + 0xD0, 0x5C, 0xD0, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xDB, 0x49, 0xD0, 0x62, 0xAD, 0x44, 0xD0, 0x65, /* 0xD4-0xD7 */ + 0xD0, 0x56, 0xD0, 0x5F, 0xAD, 0x46, 0xAD, 0x4B, /* 0xD8-0xDB */ + 0xD0, 0x60, 0xAD, 0x4F, 0xAD, 0x4D, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xD0, 0x58, 0xAD, 0x4A, 0x3F, 0x3F, 0xD0, 0x5E, /* 0xE0-0xE3 */ + 0xAD, 0x4E, 0xAD, 0x45, 0xD0, 0x66, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xAF, 0xDA, 0x3F, 0x3F, 0xAF, 0xE3, /* 0xEC-0xEF */ + 0xAF, 0xD8, 0xAF, 0xD6, 0xD3, 0x6A, 0xAF, 0xDE, /* 0xF0-0xF3 */ + 0xAF, 0xDB, 0xD3, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xAF, 0xDD, 0xD3, 0x6B, 0xD3, 0x69, 0xD3, 0x6E, /* 0xF8-0xFB */ + 0xAF, 0xE2, 0xAF, 0xE0, 0xDB, 0x48, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_81[512] = { + 0xD3, 0x6F, 0xD3, 0x6D, 0xAF, 0xD7, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xAF, 0xD9, 0xAF, 0xDC, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xAF, 0xDF, 0x3F, 0x3F, 0xAF, 0xE1, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xD7, 0x4E, 0xB2, 0xE4, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xD7, 0x45, 0xD7, 0x47, 0x3F, 0x3F, 0xD7, 0x48, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xD7, 0x50, 0xD7, 0x4C, 0xD7, 0x4A, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xD7, 0x4D, 0xD7, 0x51, 0xB2, 0xE5, /* 0x20-0x23 */ + 0xB2, 0xE9, 0xD7, 0x46, 0x3F, 0x3F, 0xD7, 0x4F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xB2, 0xE7, 0x3F, 0x3F, 0xB2, 0xE6, /* 0x28-0x2B */ + 0xD7, 0x4B, 0xD7, 0x49, 0x3F, 0x3F, 0xB2, 0xE3, /* 0x2C-0x2F */ + 0xB2, 0xE8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xB5, 0xC8, 0xDB, 0x51, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xDB, 0x4F, 0xB5, 0xCA, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0x4A, /* 0x40-0x43 */ + 0xDF, 0xA1, 0x3F, 0x3F, 0xB5, 0xC9, 0xDB, 0x4E, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0x4B, 0xB5, 0xC5, /* 0x48-0x4B */ + 0xB5, 0xCB, 0xDB, 0x50, 0xB5, 0xC7, 0xDB, 0x4D, /* 0x4C-0x4F */ + 0xBB, 0x47, 0xB5, 0xC6, 0xDB, 0x4C, 0xB5, 0xCC, /* 0x50-0x53 */ + 0xB5, 0xC4, 0xB5, 0xC3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0x77, /* 0x58-0x5B */ + 0xDF, 0x75, 0x3F, 0x3F, 0xDF, 0x7B, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xDF, 0x73, 0xDF, 0xA2, 0xDF, 0x78, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xDF, 0x72, 0xB8, 0x7B, 0xB8, 0xA3, 0xDF, 0x7D, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xDF, 0x76, 0x3F, 0x3F, 0xB8, 0x7E, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB8, 0x7C, 0xDF, 0x7E, /* 0x6C-0x6F */ + 0xB8, 0x79, 0xB8, 0x78, 0xDF, 0x79, 0xB8, 0x7D, /* 0x70-0x73 */ + 0xB5, 0xCD, 0x3F, 0x3F, 0xDF, 0x7C, 0xDF, 0x74, /* 0x74-0x77 */ + 0xB8, 0x7A, 0xB8, 0xA1, 0xB8, 0xA2, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xBB, 0x4C, /* 0x7C-0x7F */ + + 0xBB, 0x48, 0x3F, 0x3F, 0xBB, 0x4D, 0xE3, 0xA6, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xA5, 0xE3, 0xA7, /* 0x84-0x87 */ + 0xBB, 0x4A, 0xE3, 0xA4, 0xBB, 0x4B, 0xE3, 0xAA, /* 0x88-0x8B */ + 0xE3, 0xA9, 0xE3, 0xA8, 0x3F, 0x3F, 0xBB, 0x49, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xE7, 0x41, 0x3F, 0x3F, 0xE7, 0x44, /* 0x94-0x97 */ + 0xBD, 0xA8, 0xE7, 0x43, 0xBD, 0xA7, 0xBD, 0xA3, /* 0x98-0x9B */ + 0xBD, 0xA4, 0xBD, 0xA5, 0xE7, 0x40, 0xE6, 0xFE, /* 0x9C-0x9F */ + 0xBD, 0xA6, 0x3F, 0x3F, 0xE7, 0x42, 0xE6, 0xFD, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xE9, 0xEA, 0xF3, /* 0xA4-0xA7 */ + 0xBF, 0xB1, 0xBF, 0xB0, 0x3F, 0x3F, 0xEA, 0xED, /* 0xA8-0xAB */ + 0xEA, 0xEF, 0x3F, 0x3F, 0xEA, 0xEA, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xEA, 0xEE, 0xEA, 0xE8, 0xEA, 0xF1, 0xBF, 0xAF, /* 0xB0-0xB3 */ + 0xEA, 0xF0, 0xEA, 0xEC, 0x3F, 0x3F, 0xEA, 0xF2, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xEA, 0xEB, 0xC1, 0x74, 0xED, 0xE8, /* 0xB8-0xBB */ + 0xED, 0xEE, 0xC1, 0x78, 0xC1, 0x7A, 0xC1, 0x77, /* 0xBC-0xBF */ + 0xC1, 0x76, 0x3F, 0x3F, 0xC1, 0x75, 0xC1, 0x73, /* 0xC0-0xC3 */ + 0xED, 0xE9, 0xED, 0xEC, 0xC1, 0x72, 0xED, 0xED, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xC1, 0x79, 0xED, 0xEB, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xED, 0xEA, 0xC2, 0xC0, 0x3F, 0x3F, 0xC2, 0xC1, /* 0xCC-0xCF */ + 0xF0, 0xA1, 0xF0, 0x7D, 0xF0, 0x7E, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xF2, 0xC2, 0x3F, 0x3F, 0xF2, 0xC1, /* 0xD4-0xD7 */ + 0xC3, 0xBE, 0xF4, 0xB4, 0xC4, 0xA4, 0xF4, 0xB3, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xF5, 0xF0, 0xF7, 0x45, 0xC5, 0xA6, /* 0xDC-0xDF */ + 0xF9, 0x43, 0xF9, 0x44, 0xC5, 0xD8, 0xA6, 0xDA, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xAA, 0xD7, 0xDB, 0x52, 0xBB, 0x4E, /* 0xE4-0xE7 */ + 0xC1, 0x7B, 0xED, 0xEF, 0xA6, 0xDB, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xAF, 0xE5, 0xAF, 0xE4, 0xDB, 0x53, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0xF4, 0xA6, 0xDC, /* 0xF0-0xF3 */ + 0xAD, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0x54, /* 0xF4-0xF7 */ + 0xDB, 0x55, 0xDB, 0x56, 0xBB, 0x4F, 0xBF, 0xB2, /* 0xF8-0xFB */ + 0xA6, 0xDD, 0x3F, 0x3F, 0xAA, 0xD8, 0xD0, 0x68, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_82[512] = { + 0xAF, 0xE6, 0xD3, 0x70, 0xB2, 0xEA, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xDB, 0x57, 0xB8, 0xA4, 0x3F, 0x3F, 0xBB, 0x50, /* 0x04-0x07 */ + 0xBF, 0xB3, 0xC1, 0x7C, 0xC2, 0xC2, 0xF4, 0xB5, /* 0x08-0x0B */ + 0xA6, 0xDE, 0xAA, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xAF, 0xE7, 0xD7, 0x52, 0xB5, 0xCE, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xBB, 0x51, 0xE3, 0xAB, 0xE7, 0x45, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0xDF, /* 0x18-0x1B */ + 0xB5, 0xCF, 0xDF, 0xA3, 0xBB, 0x52, 0xA6, 0xE0, /* 0x1C-0x1F */ + 0xCD, 0xB1, 0xD0, 0x69, 0xAD, 0x51, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xD3, 0x72, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xAF, 0xEA, 0x3F, 0x3F, 0xAF, 0xE8, 0xAF, 0xE9, /* 0x28-0x2B */ + 0xAF, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0x71, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0x57, 0xD7, 0x54, /* 0x30-0x33 */ + 0xD7, 0x56, 0xB2, 0xEB, 0xB2, 0xED, 0xB2, 0xEC, /* 0x34-0x37 */ + 0xD7, 0x53, 0xB2, 0xEE, 0xD7, 0x55, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xDB, 0x58, 0xDB, 0x59, 0x3F, 0x3F, 0xDB, 0x5A, /* 0x3C-0x3F */ + 0xDF, 0xA6, 0x3F, 0x3F, 0xDF, 0xA7, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xDF, 0xA5, 0xDF, 0xA8, 0x3F, 0x3F, 0xB8, 0xA5, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xDF, 0xA4, 0x3F, 0x3F, 0xBB, 0x53, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x4A, 0xE7, 0x46, /* 0x4C-0x4F */ + 0xE7, 0x49, 0xE7, 0x4B, 0xE7, 0x48, 0xE7, 0x47, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xEA, 0xF5, 0xEA, 0xF6, 0xEA, 0xF7, /* 0x54-0x57 */ + 0xBF, 0xB4, 0xBF, 0xB5, 0xED, 0xF1, 0xED, 0xF0, /* 0x58-0x5B */ + 0xED, 0xF2, 0x3F, 0x3F, 0xF0, 0xA3, 0xF0, 0xA2, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xF2, 0xC4, 0x3F, 0x3F, 0xF2, 0xC5, /* 0x60-0x63 */ + 0xF2, 0xC3, 0x3F, 0x3F, 0xC4, 0xA5, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF4, 0xB6, 0xF4, 0xB7, 0x3F, 0x3F, 0xF7, 0x46, /* 0x68-0x6B */ + 0xF7, 0xEF, 0xF8, 0xBB, 0xA6, 0xE1, 0xA8, 0x7D, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xC1, 0x7D, 0xA6, 0xE2, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xD7, 0x58, 0xDB, 0x5B, 0x3F, 0x3F, 0xC6, 0x41, /* 0x74-0x77 */ + 0xCA, 0x4A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xCA, 0x4B, 0xCA, 0x4D, 0xA6, 0xE3, 0xCA, 0x4E, /* 0x7C-0x7F */ + + 0xCA, 0x4C, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xA2, /* 0x80-0x83 */ + 0xCB, 0xA3, 0xCB, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xA1, 0xA8, 0xA1, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xA8, 0xA2, 0xCB, 0x7C, 0xCB, 0x7A, /* 0x8C-0x8F */ + 0xCB, 0x79, 0xCB, 0x7D, 0xA8, 0x7E, 0xCB, 0x7E, /* 0x90-0x93 */ + 0xD0, 0x6A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xCD, 0xB6, 0xAA, 0xDC, 0xCD, 0xB5, 0xCD, 0xB7, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xAA, 0xDB, 0xCD, 0xBC, 0xAA, 0xDF, /* 0x9C-0x9F */ + 0xCD, 0xB2, 0xCD, 0xC0, 0xCD, 0xC6, 0xAA, 0xE6, /* 0xA0-0xA3 */ + 0xCD, 0xC3, 0xAA, 0xE3, 0x3F, 0x3F, 0xCD, 0xB9, /* 0xA4-0xA7 */ + 0xCD, 0xBF, 0xCD, 0xC1, 0x3F, 0x3F, 0xCD, 0xB4, /* 0xA8-0xAB */ + 0xAA, 0xE2, 0xAA, 0xDD, 0xCD, 0xBA, 0xAA, 0xE4, /* 0xAC-0xAF */ + 0xAA, 0xE7, 0xAA, 0xE1, 0x3F, 0x3F, 0xAA, 0xDA, /* 0xB0-0xB3 */ + 0xCD, 0xBE, 0xCD, 0xB8, 0xCD, 0xC5, 0xAA, 0xE9, /* 0xB4-0xB7 */ + 0xAA, 0xE5, 0xAA, 0xE0, 0xCD, 0xBD, 0xAF, 0xEC, /* 0xB8-0xBB */ + 0xCD, 0xBB, 0xAA, 0xDE, 0xAA, 0xE8, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xCD, 0xB3, 0x3F, 0x3F, 0xCD, 0xC2, 0xCD, 0xC4, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xAD, 0x62, 0xAD, 0x5C, 0xAD, 0x64, /* 0xD0-0xD3 */ + 0xAD, 0x61, 0xD0, 0x71, 0xD0, 0x74, 0xAD, 0x5D, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xD0, 0x6B, 0x3F, 0x3F, 0xAD, 0x56, /* 0xD8-0xDB */ + 0xAD, 0x60, 0x3F, 0x3F, 0xAD, 0x63, 0xAD, 0x65, /* 0xDC-0xDF */ + 0xD0, 0xA2, 0xD0, 0x77, 0x3F, 0x3F, 0xAD, 0x55, /* 0xE0-0xE3 */ + 0xD0, 0xA1, 0xAD, 0x59, 0xAD, 0x57, 0xAD, 0x52, /* 0xE4-0xE7 */ + 0xD0, 0x6F, 0x3F, 0x3F, 0xD0, 0x7E, 0xD0, 0x73, /* 0xE8-0xEB */ + 0xD0, 0x76, 0xD0, 0xA5, 0x3F, 0x3F, 0xAD, 0x66, /* 0xEC-0xEF */ + 0xD0, 0x7D, 0xAD, 0x5E, 0xD0, 0x78, 0xD0, 0xA4, /* 0xF0-0xF3 */ + 0xD0, 0x75, 0xD0, 0x79, 0xD0, 0x7C, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xD0, 0x6D, 0xD0, 0xA3, 0xD0, 0x7B, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0x6C, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_83[512] = { + 0xD0, 0x70, 0xAD, 0x5F, 0xAD, 0x5A, 0xAD, 0x53, /* 0x00-0x03 */ + 0xAD, 0x58, 0xAD, 0x54, 0xAD, 0x67, 0xD0, 0x6E, /* 0x04-0x07 */ + 0xD3, 0xA5, 0xAD, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xD0, 0x7A, 0xCE, 0x41, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0xA8, 0xAF, 0xFA, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xD3, 0x76, 0x3F, 0x3F, 0xD3, 0xA3, /* 0x18-0x1B */ + 0xD3, 0x7D, 0x3F, 0x3F, 0xD3, 0xB2, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xD3, 0xAA, 0x3F, 0x3F, 0xD3, 0x7E, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xD3, 0xA9, 0xD3, 0x78, 0xD3, 0x7C, 0xD3, 0xB5, /* 0x24-0x27 */ + 0xAF, 0xFD, 0xD3, 0xAD, 0xD3, 0xA4, 0xAF, 0xED, /* 0x28-0x2B */ + 0xD3, 0xB3, 0xD3, 0x74, 0x3F, 0x3F, 0xD3, 0xAC, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xAF, 0xFC, 0xAF, 0xF7, 0xD3, 0x73, /* 0x30-0x33 */ + 0xAF, 0xF5, 0xAF, 0xF4, 0xAF, 0xF9, 0xD3, 0xAB, /* 0x34-0x37 */ + 0xAF, 0xF1, 0xAF, 0xF8, 0xD0, 0x72, 0xDB, 0x5C, /* 0x38-0x3B */ + 0xD3, 0xA6, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3, 0x7A, /* 0x3C-0x3F */ + 0xAF, 0xFB, 0xD3, 0x7B, 0xD3, 0xA1, 0xAF, 0xFE, /* 0x40-0x43 */ + 0xD3, 0x75, 0xD3, 0xAF, 0x3F, 0x3F, 0xD3, 0xAE, /* 0x44-0x47 */ + 0xD3, 0xB6, 0xAF, 0xF3, 0xAF, 0xF0, 0xD3, 0xB4, /* 0x48-0x4B */ + 0xD3, 0xB0, 0xD3, 0xA7, 0xD3, 0xA2, 0xAF, 0xF6, /* 0x4C-0x4F */ + 0xAF, 0xF2, 0xD3, 0x77, 0xAF, 0xEE, 0xD3, 0xB1, /* 0x50-0x53 */ + 0xAF, 0xEF, 0x3F, 0x3F, 0xD3, 0x79, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0x5E, /* 0x70-0x73 */ + 0xD7, 0x60, 0xD7, 0x65, 0xD7, 0x79, 0xB2, 0xFC, /* 0x74-0x77 */ + 0xB2, 0xF2, 0x3F, 0x3F, 0xD7, 0x5D, 0xB2, 0xFD, /* 0x78-0x7B */ + 0xB2, 0xFE, 0xD7, 0x68, 0xD7, 0x6F, 0xD7, 0x75, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xD7, 0x62, 0x3F, 0x3F, 0xD7, 0x69, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x40, 0xD7, 0x77, /* 0x84-0x87 */ + 0xD7, 0x72, 0xB2, 0xFA, 0xB2, 0xF8, 0xD7, 0x6E, /* 0x88-0x8B */ + 0xD7, 0x6A, 0xD7, 0x5C, 0xB2, 0xEF, 0xD7, 0x61, /* 0x8C-0x8F */ + 0xD7, 0x59, 0x3F, 0x3F, 0xB2, 0xF7, 0xB2, 0xF9, /* 0x90-0x93 */ + 0xD7, 0x66, 0xD7, 0x63, 0xB2, 0xF4, 0xD7, 0x73, /* 0x94-0x97 */ + 0xB2, 0xF1, 0xD7, 0x64, 0xD7, 0x7A, 0xD7, 0x6C, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xD7, 0x6B, 0xB2, 0xF0, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xB2, 0xFB, 0x3F, 0x3F, 0xB2, 0xF3, 0xD7, 0x5A, /* 0xA0-0xA3 */ + 0xD7, 0x5F, 0xD7, 0x70, 0xD7, 0x76, 0xB3, 0x41, /* 0xA4-0xA7 */ + 0xD7, 0x5B, 0xD7, 0x67, 0xD7, 0x6D, 0xB2, 0xF6, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0x78, 0xD7, 0x71, /* 0xAC-0xAF */ + 0xD7, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xB2, 0xF5, 0x3F, 0x3F, 0xDB, 0x6C, /* 0xBC-0xBF */ + 0xDB, 0x60, 0xB5, 0xD7, 0xDB, 0x7D, 0xDB, 0xA7, /* 0xC0-0xC3 */ + 0xDB, 0xAA, 0xB5, 0xD5, 0xDB, 0x68, 0xDB, 0xA3, /* 0xC4-0xC7 */ + 0xDB, 0x69, 0xDB, 0x77, 0xB5, 0xE2, 0xDB, 0x73, /* 0xC8-0xCB */ + 0xB5, 0xDF, 0x3F, 0x3F, 0xDB, 0x74, 0xDB, 0x5D, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xDB, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xB5, 0xE8, 0xDB, 0xA1, 0xDB, 0x75, 0xDB, 0xAC, /* 0xD4-0xD7 */ + 0xDB, 0x70, 0xDF, 0xC8, 0x3F, 0x3F, 0xDB, 0xAF, /* 0xD8-0xDB */ + 0xB5, 0xE6, 0xDB, 0x6E, 0xDB, 0x7A, 0xB5, 0xE9, /* 0xDC-0xDF */ + 0xB5, 0xD4, 0xDB, 0x72, 0xDB, 0xAD, 0xDB, 0x6B, /* 0xE0-0xE3 */ + 0xDB, 0x64, 0xDB, 0x6F, 0x3F, 0x3F, 0xDB, 0x63, /* 0xE4-0xE7 */ + 0xDB, 0x61, 0xB5, 0xD0, 0xDB, 0xA5, 0xDB, 0x6A, /* 0xE8-0xEB */ + 0xDB, 0xA8, 0x3F, 0x3F, 0xDB, 0xA9, 0xB5, 0xD8, /* 0xEC-0xEF */ + 0xB5, 0xDD, 0xB5, 0xD9, 0xB5, 0xE1, 0xDB, 0x7E, /* 0xF0-0xF3 */ + 0xB5, 0xDA, 0xDB, 0x76, 0xDB, 0x66, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xB5, 0xD2, 0xDB, 0x5E, 0xDB, 0xA2, 0xDB, 0xAB, /* 0xF8-0xFB */ + 0xDB, 0x65, 0xB5, 0xE0, 0xDB, 0xB0, 0xDB, 0x71, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_84[512] = { + 0x3F, 0x3F, 0xDB, 0x6D, 0x3F, 0x3F, 0xB5, 0xD1, /* 0x00-0x03 */ + 0xB5, 0xE5, 0x3F, 0x3F, 0xDB, 0x7C, 0xB5, 0xE7, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xDB, 0x78, 0xB5, 0xDC, 0xB5, 0xD6, /* 0x08-0x0B */ + 0xB5, 0xDE, 0xB5, 0xD3, 0xB5, 0xE4, 0xDB, 0x79, /* 0x0C-0x0F */ + 0xDB, 0x67, 0xDB, 0x7B, 0xDB, 0x62, 0xDB, 0xA6, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xAE, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0x5F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xDF, 0xC7, 0x3F, 0x3F, 0xDF, 0xDD, /* 0x28-0x2B */ + 0xB8, 0x55, 0xDF, 0xCC, 0x3F, 0x3F, 0xDF, 0xCA, /* 0x2C-0x2F */ + 0xDF, 0xB5, 0xB8, 0xA9, 0xDF, 0xC5, 0xDF, 0xD9, /* 0x30-0x33 */ + 0xDF, 0xC1, 0xB8, 0xB1, 0xDF, 0xD8, 0xDF, 0xBF, /* 0x34-0x37 */ + 0xB5, 0xE3, 0xDF, 0xCF, 0xDF, 0xC0, 0xDF, 0xD6, /* 0x38-0x3B */ + 0xB8, 0xB0, 0xB8, 0xA8, 0x3F, 0x3F, 0xDF, 0xAA, /* 0x3C-0x3F */ + 0xDF, 0xB2, 0x3F, 0x3F, 0xDF, 0xCB, 0xDF, 0xC3, /* 0x40-0x43 */ + 0xDF, 0xDC, 0xDF, 0xC6, 0xB8, 0xB6, 0xDF, 0xD7, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xB8, 0xAD, 0x3F, 0x3F, 0xDF, 0xC9, /* 0x48-0x4B */ + 0xDF, 0xD1, 0xDF, 0xB6, 0xDF, 0xD0, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xDF, 0xE1, 0xDF, 0xB1, 0xDF, 0xD2, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xDF, 0xDF, 0x3F, 0x3F, 0xDF, 0xAB, 0xB5, 0xDB, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xDF, 0xB9, 0xDF, 0xB8, 0xB8, 0xAF, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xDF, 0xBC, 0xDF, 0xBE, 0xDF, 0xCD, /* 0x5C-0x5F */ + 0xDF, 0xDE, 0xB8, 0xB2, 0x3F, 0x3F, 0xB8, 0xB3, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xDF, 0xB0, 0xB8, 0xAB, 0xDF, 0xB4, /* 0x64-0x67 */ + 0xDF, 0xDA, 0xB8, 0xB4, 0x3F, 0x3F, 0xB8, 0xAC, /* 0x68-0x6B */ + 0xB8, 0xAE, 0xB8, 0xB5, 0xDF, 0xE0, 0xDF, 0xD3, /* 0x6C-0x6F */ + 0xDF, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xBB, /* 0x70-0x73 */ + 0xDF, 0xBA, 0xB8, 0xAA, 0xDF, 0xAC, 0xB8, 0xA7, /* 0x74-0x77 */ + 0xDF, 0xC4, 0xDF, 0xAD, 0xDF, 0xC2, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xDF, 0xB7, 0xDF, 0xDB, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0xB8, 0xA6, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xB3, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xDF, 0xAF, 0xDF, 0xD5, 0xDF, 0xAE, /* 0x8C-0x8F */ + 0xBB, 0x60, 0xE3, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xE3, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xAC, /* 0x94-0x97 */ + 0xE3, 0xCA, 0xBB, 0x58, 0xE3, 0xBB, 0xE3, 0xC5, /* 0x98-0x9B */ + 0xBB, 0x5B, 0xE3, 0xBE, 0xBB, 0x59, 0xE3, 0xAF, /* 0x9C-0x9F */ + 0xE3, 0xCD, 0xE3, 0xAE, 0xE3, 0xC1, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xE3, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xBF, /* 0xA4-0xA7 */ + 0xE3, 0xC8, 0xE3, 0xC6, 0xE3, 0xBA, 0xE3, 0xB5, /* 0xA8-0xAB */ + 0xE3, 0xB3, 0x3F, 0x3F, 0xE3, 0xB4, 0xE3, 0xC7, /* 0xAC-0xAF */ + 0xE3, 0xD2, 0xE3, 0xBC, 0xBB, 0x5A, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xE3, 0xB7, 0x3F, 0x3F, 0xE3, 0xCB, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xBB, 0x5D, 0xE3, 0xB6, 0xE3, 0xB0, 0xE3, 0xC0, /* 0xB8-0xBB */ + 0xBB, 0x61, 0x3F, 0x3F, 0x3F, 0x3F, 0xBB, 0x55, /* 0xBC-0xBF */ + 0xBB, 0x5E, 0xE3, 0xB8, 0xE3, 0xB2, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xBB, 0x57, 0xDF, 0xD4, 0xBB, 0x56, 0xE3, 0xC3, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xBB, 0x54, 0xBB, 0x63, 0xBB, 0x5C, /* 0xC8-0xCB */ + 0xE3, 0xC4, 0xE3, 0xB9, 0xE3, 0xB1, 0xE3, 0xCC, /* 0xCC-0xCF */ + 0xE3, 0xBD, 0xBB, 0x62, 0xE3, 0xD0, 0xBB, 0x5F, /* 0xD0-0xD3 */ + 0xE3, 0xCF, 0x3F, 0x3F, 0xE3, 0xC9, 0xE3, 0xCE, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xD1, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x73, /* 0xE4-0xE7 */ + 0xE7, 0x74, 0xE7, 0x67, 0xE7, 0x66, 0xE7, 0x62, /* 0xE8-0xEB */ + 0xBD, 0xB4, 0x3F, 0x3F, 0xBD, 0xAC, 0xE7, 0x76, /* 0xEC-0xEF */ + 0xE7, 0x75, 0xDF, 0xA9, 0xE7, 0x5F, 0xE7, 0x63, /* 0xF0-0xF3 */ + 0xE7, 0x5D, 0x3F, 0x3F, 0xE7, 0x70, 0xE7, 0x61, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xE7, 0x77, 0xE7, 0x5A, 0xE7, 0x58, /* 0xF8-0xFB */ + 0xE7, 0x64, 0xE7, 0x6E, 0xE7, 0x69, 0xBD, 0xB6, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_85[512] = { + 0xE7, 0x4F, 0x3F, 0x3F, 0xE7, 0x6D, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBD, 0xB7, 0xDF, 0xBD, /* 0x04-0x07 */ + 0xE7, 0x5B, 0xE7, 0x52, 0xE7, 0x55, 0xE7, 0x7B, /* 0x08-0x0B */ + 0xE7, 0x5C, 0xE7, 0x53, 0xE7, 0x51, 0xE7, 0x4E, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xBD, 0xB0, 0xE7, 0x65, 0xBD, 0xAF, /* 0x10-0x13 */ + 0xBD, 0xB3, 0xE7, 0x60, 0xE7, 0x68, 0xBD, 0xA9, /* 0x14-0x17 */ + 0xE7, 0x78, 0xE7, 0x7C, 0xBD, 0xAB, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xE7, 0x57, 0xE7, 0x6B, 0xE7, 0x6F, 0xE7, 0x54, /* 0x1C-0x1F */ + 0xE7, 0x79, 0xBD, 0xB2, 0x3F, 0x3F, 0xBD, 0xB1, /* 0x20-0x23 */ + 0xE7, 0x4C, 0xBD, 0xB5, 0xE7, 0x72, 0xE7, 0x56, /* 0x24-0x27 */ + 0xE7, 0x6A, 0xE7, 0x50, 0xE7, 0x5E, 0xE7, 0x59, /* 0x28-0x2B */ + 0xBD, 0xAD, 0xBD, 0xAE, 0xE7, 0x6C, 0xE7, 0x7D, /* 0x2C-0x2F */ + 0xE7, 0x7A, 0xE7, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0x4D, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xBD, 0xAA, 0xEB, 0x49, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xEB, 0x40, 0xEB, 0x43, 0x3F, 0x3F, 0xBF, 0xBB, /* 0x40-0x43 */ + 0xEB, 0x45, 0xEA, 0xF9, 0xEB, 0x41, 0xEB, 0x47, /* 0x44-0x47 */ + 0xBF, 0xB8, 0xBF, 0xBC, 0xBF, 0xB6, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xEA, 0xFB, 0xEB, 0x4C, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xEB, 0x46, 0x3F, 0x3F, 0xEA, 0xFC, /* 0x50-0x53 */ + 0xEB, 0x55, 0xEB, 0x4F, 0xEA, 0xF8, 0xEE, 0x46, /* 0x54-0x57 */ + 0xEA, 0xFE, 0xBF, 0xB7, 0x3F, 0x3F, 0xEB, 0x4A, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xEB, 0x54, 0xBF, 0xBF, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xEB, 0x51, 0xEA, 0xFD, 0xEB, 0x44, 0xEB, 0x48, /* 0x60-0x63 */ + 0xEB, 0x42, 0xEB, 0x56, 0xEB, 0x53, 0xEB, 0x50, /* 0x64-0x67 */ + 0xBF, 0xB9, 0xBF, 0xBA, 0xBF, 0xBE, 0xEA, 0xFA, /* 0x68-0x6B */ + 0xEB, 0x57, 0xBF, 0xBD, 0xEB, 0x4D, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xEB, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xEB, 0x4E, 0xEE, 0x53, 0xEE, 0x40, /* 0x74-0x77 */ + 0xEE, 0x45, 0xEE, 0x52, 0xEE, 0x44, 0xED, 0xFB, /* 0x78-0x7B */ + 0xEE, 0x41, 0x3F, 0x3F, 0xC1, 0xA2, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xED, 0xF4, 0xEE, 0x4D, 0xEE, 0x4F, 0xED, 0xF3, /* 0x80-0x83 */ + 0xC1, 0xA1, 0xEE, 0x51, 0xEE, 0x49, 0xC1, 0xA8, /* 0x84-0x87 */ + 0xEE, 0x50, 0xEE, 0x42, 0xC1, 0xAA, 0xED, 0xF9, /* 0x88-0x8B */ + 0xEB, 0x52, 0xEE, 0x4A, 0xEE, 0x47, 0xED, 0xF5, /* 0x8C-0x8F */ + 0xEE, 0x55, 0xC1, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xC1, 0xA5, 0xED, 0xF7, 0xEE, 0x48, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xEE, 0x54, 0xEE, 0x4B, 0xED, 0xFD, 0xC1, 0xA7, /* 0x98-0x9B */ + 0xC1, 0xA3, 0xEE, 0x4C, 0xED, 0xFE, 0xEE, 0x56, /* 0x9C-0x9F */ + 0xED, 0xF8, 0xEE, 0x43, 0xEE, 0x4E, 0xED, 0xFA, /* 0xA0-0xA3 */ + 0xED, 0xFC, 0x3F, 0x3F, 0xC2, 0xCB, 0xED, 0xF6, /* 0xA4-0xA7 */ + 0xC1, 0xA9, 0xC2, 0xC4, 0xC1, 0x7E, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC1, 0xA6, /* 0xAC-0xAF */ + 0xC2, 0xC8, 0xF0, 0xB3, 0x3F, 0x3F, 0xF0, 0xA9, /* 0xB0-0xB3 */ + 0xF0, 0xA4, 0xF0, 0xAA, 0xF0, 0xB4, 0xF0, 0xB8, /* 0xB4-0xB7 */ + 0xF0, 0xB7, 0xC2, 0xCA, 0xC2, 0xC9, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xF0, 0xAB, 0xF0, 0xB9, 0xF0, 0xAE, /* 0xBC-0xBF */ + 0xF0, 0xA6, 0x3F, 0x3F, 0xF0, 0xA8, 0xF0, 0xA7, /* 0xC0-0xC3 */ + 0xF0, 0xAD, 0xF0, 0xB2, 0xF0, 0xA5, 0xF0, 0xAC, /* 0xC4-0xC7 */ + 0xF0, 0xB1, 0xC2, 0xC7, 0x3F, 0x3F, 0xF0, 0xAF, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xC2, 0xC5, 0xF0, 0xB0, 0xC2, 0xC3, /* 0xCC-0xCF */ + 0xC2, 0xC6, 0xF2, 0xD5, 0xF0, 0xB5, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xC3, 0xC2, 0x3F, 0x3F, 0xF2, 0xCD, /* 0xD4-0xD7 */ + 0xF2, 0xD1, 0xF2, 0xC9, 0xF2, 0xCC, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xF2, 0xD4, 0xC3, 0xC0, 0xF2, 0xD9, 0xF2, 0xD2, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xF2, 0xCA, 0xF2, 0xDA, 0xF2, 0xD3, /* 0xE0-0xE3 */ + 0xC3, 0xC3, 0xC3, 0xC4, 0xF2, 0xD7, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xF2, 0xCB, 0xC3, 0xBF, 0xC3, 0xC1, 0xF2, 0xC6, /* 0xE8-0xEB */ + 0xF2, 0xCE, 0xF2, 0xC8, 0x3F, 0x3F, 0xF2, 0xD8, /* 0xEC-0xEF */ + 0xF2, 0xD6, 0xF2, 0xC7, 0xF2, 0xCF, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xBE, 0xC3, 0xC5, /* 0xF4-0xF7 */ + 0xF2, 0xD0, 0xC4, 0xA7, 0xC4, 0xA9, 0xC4, 0xA6, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xF4, 0xC3, 0xF4, 0xBB, 0xF4, 0xB9, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_86[512] = { + 0xF4, 0xBD, 0xF4, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xF4, 0xBF, 0xF4, 0xC1, 0xC4, 0xAA, 0xC4, 0xAC, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF4, 0xC0, 0xC4, 0xAD, 0xC4, 0xAB, /* 0x08-0x0B */ + 0xF4, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xC4, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC4, 0xF4, /* 0x14-0x17 */ + 0xF5, 0xF1, 0xF5, 0xF7, 0xC4, 0xF6, 0xF4, 0xBC, /* 0x18-0x1B */ + 0xF5, 0xF6, 0x3F, 0x3F, 0xF5, 0xFD, 0xF5, 0xF4, /* 0x1C-0x1F */ + 0xF5, 0xFB, 0xF5, 0xFA, 0xF4, 0xB8, 0xF5, 0xF5, /* 0x20-0x23 */ + 0xF0, 0xB6, 0xF5, 0xFE, 0xF5, 0xF3, 0xF5, 0xF8, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xF5, 0xFC, 0xF5, 0xF2, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xF7, 0x4A, 0xC4, 0xF5, 0xF5, 0xF9, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xF7, 0xF4, 0xF7, 0x4B, 0xF7, 0x49, /* 0x30-0x33 */ + 0xF7, 0x47, 0xF7, 0x48, 0xF7, 0x4C, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xC5, 0xD9, 0xF7, 0xF2, 0xF7, 0xF0, 0xF7, 0xF5, /* 0x38-0x3B */ + 0xF7, 0xF3, 0x3F, 0x3F, 0xF7, 0xF6, 0xC5, 0xDA, /* 0x3C-0x3F */ + 0xF7, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xBC, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0x45, 0xF9, 0x46, /* 0x44-0x47 */ + 0xF9, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xC7, /* 0x48-0x4B */ + 0xF9, 0xBD, 0xCA, 0x4F, 0xAA, 0xEA, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xAD, 0x68, 0x3F, 0x3F, 0xD3, 0xB8, 0xD3, 0xB7, /* 0x50-0x53 */ + 0xB0, 0x40, 0xB3, 0x42, 0xD7, 0x7C, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xD7, 0x7B, 0x3F, 0x3F, 0xB5, 0xEA, /* 0x58-0x5B */ + 0xB8, 0xB8, 0x3F, 0x3F, 0xB8, 0xB7, 0xB8, 0xB9, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xE3, 0xD4, 0xE7, 0x7E, 0xEB, 0x58, /* 0x60-0x63 */ + 0xEB, 0x5A, 0xEB, 0x59, 0x3F, 0x3F, 0xC1, 0xAB, /* 0x64-0x67 */ + 0xEE, 0x57, 0xF0, 0xBA, 0xF9, 0xA5, 0xA6, 0xE4, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xCD, 0xC9, 0xCD, 0xCA, 0xCD, 0xC8, /* 0x6C-0x6F */ + 0xCD, 0xC7, 0xAA, 0xEB, 0x3F, 0x3F, 0xD0, 0xA9, /* 0x70-0x73 */ + 0xD0, 0xA7, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xA6, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xAD, 0x69, 0xAD, 0x6B, 0xAD, 0x6A, /* 0x78-0x7B */ + 0xD0, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xD3, 0xC4, 0xD3, 0xC1, 0xD3, 0xBF, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0x41, 0xD3, 0xC2, /* 0x88-0x8B */ + 0xB0, 0x46, 0xD3, 0xBC, 0xD3, 0xCB, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xD3, 0xCD, 0xD3, 0xBD, 0x3F, 0x3F, 0xB0, 0x43, /* 0x90-0x93 */ + 0xD3, 0xCE, 0xD3, 0xC9, 0xD3, 0xBB, 0xD3, 0xC0, /* 0x94-0x97 */ + 0xD3, 0xCA, 0xD3, 0xC6, 0xD3, 0xC3, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xB0, 0x48, 0xD3, 0xCC, 0xD3, 0xBE, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xD3, 0xC7, 0xD3, 0xB9, 0xB0, 0x47, /* 0xA0-0xA3 */ + 0xB0, 0x44, 0xD3, 0xC5, 0x3F, 0x3F, 0xD3, 0xC8, /* 0xA4-0xA7 */ + 0xD3, 0xBA, 0xB0, 0x45, 0xB0, 0x42, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x4C, /* 0xAC-0xAF */ + 0xD7, 0xA5, 0xB3, 0x4B, 0x3F, 0x3F, 0xD7, 0xA8, /* 0xB0-0xB3 */ + 0xD7, 0xAB, 0xB3, 0x48, 0xB3, 0x46, 0xD7, 0x7E, /* 0xB4-0xB7 */ + 0xD7, 0xA9, 0xD7, 0xA7, 0xD7, 0xA4, 0xD7, 0xAC, /* 0xB8-0xBB */ + 0xD7, 0xAD, 0xD7, 0xAF, 0xD7, 0xB0, 0xD7, 0x7D, /* 0xBC-0xBF */ + 0xB3, 0x45, 0xD7, 0xA2, 0xD7, 0xA1, 0xD7, 0xAE, /* 0xC0-0xC3 */ + 0xB3, 0x47, 0xD7, 0xA3, 0xB3, 0x49, 0xB3, 0x44, /* 0xC4-0xC7 */ + 0xD7, 0xA6, 0xB3, 0x4D, 0x3F, 0x3F, 0xB3, 0x4A, /* 0xC8-0xCB */ + 0xD7, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xB5, 0xF1, 0xDB, 0xBF, 0x3F, 0x3F, 0xDB, 0xB4, /* 0xD0-0xD3 */ + 0xB5, 0xEE, 0x3F, 0x3F, 0xDF, 0xE7, 0xDB, 0xBD, /* 0xD4-0xD7 */ + 0xDB, 0xB1, 0xB5, 0xEC, 0xDB, 0xB6, 0xB5, 0xEF, /* 0xD8-0xDB */ + 0xDB, 0xBA, 0xDB, 0xB8, 0xB5, 0xF2, 0xB5, 0xEB, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xB2, 0xDB, 0xB5, /* 0xE0-0xE3 */ + 0xB5, 0xF0, 0x3F, 0x3F, 0xDB, 0xB3, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xDB, 0xBE, 0xDB, 0xBC, 0xDB, 0xB7, 0xDB, 0xB9, /* 0xE8-0xEB */ + 0xDB, 0xBB, 0xB5, 0xED, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xDF, 0xE8, 0xDF, 0xEE, 0xDF, 0xE4, /* 0xF4-0xF7 */ + 0xDF, 0xEA, 0xB8, 0xBA, 0xDF, 0xE6, 0xB8, 0xC0, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB8, 0xBF, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_87[512] = { + 0xB8, 0xBE, 0xDF, 0xED, 0xB8, 0xC1, 0xB8, 0xC2, /* 0x00-0x03 */ + 0xDF, 0xE3, 0xDF, 0xF0, 0xB8, 0xC3, 0xB8, 0xBD, /* 0x04-0x07 */ + 0xB8, 0xBC, 0xDF, 0xEC, 0xB8, 0xC4, 0xDF, 0xE2, /* 0x08-0x0B */ + 0xDF, 0xE5, 0xDF, 0xEF, 0xDF, 0xEB, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xE3, 0xF4, 0xE3, 0xE9, 0xB8, 0xBB, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xBB, 0x6A, 0xE3, 0xDD, 0xE3, 0xF2, 0xE3, 0xDE, /* 0x18-0x1B */ + 0xBB, 0x65, 0x3F, 0x3F, 0xE3, 0xDB, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xE3, 0xE4, 0xE3, 0xDC, 0xBB, 0x67, 0xE3, 0xD6, /* 0x20-0x23 */ + 0xE3, 0xF1, 0xBB, 0x68, 0xE3, 0xEE, 0xE3, 0xEF, /* 0x24-0x27 */ + 0xE3, 0xD7, 0xBB, 0x6D, 0xE3, 0xE6, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xE3, 0xE0, 0xE3, 0xE7, 0xE3, 0xDA, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xE3, 0xF3, 0xE3, 0xEB, 0xE3, 0xE5, 0xE3, 0xD5, /* 0x30-0x33 */ + 0xBB, 0x69, 0xE3, 0xEC, 0x3F, 0x3F, 0xBB, 0x6C, /* 0x34-0x37 */ + 0xE3, 0xF0, 0x3F, 0x3F, 0xE3, 0xEA, 0xBB, 0x66, /* 0x38-0x3B */ + 0xE3, 0xE8, 0x3F, 0x3F, 0xE3, 0xE2, 0xBB, 0x64, /* 0x3C-0x3F */ + 0xE3, 0xD9, 0xE3, 0xE1, 0xE3, 0xED, 0xE3, 0xDF, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xE3, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xBD, 0xC1, 0xDF, 0xE9, 0xE7, 0xB2, 0xE7, 0xBB, /* 0x4C-0x4F */ + 0xE7, 0xB1, 0xE7, 0xAD, 0xE7, 0xAA, 0xBD, 0xC2, /* 0x50-0x53 */ + 0xE7, 0xA8, 0xBB, 0x6B, 0xE7, 0xA1, 0xBD, 0xC0, /* 0x54-0x57 */ + 0xE7, 0xA7, 0xBD, 0xBF, 0xE7, 0xAC, 0xE7, 0xA9, /* 0x58-0x5B */ + 0xE7, 0xB9, 0xE7, 0xB4, 0xE7, 0xAE, 0xE7, 0xB3, /* 0x5C-0x5F */ + 0xBD, 0xBB, 0xE7, 0xAB, 0xE7, 0xBE, 0xE7, 0xA2, /* 0x60-0x63 */ + 0xE7, 0xA3, 0xE7, 0xBA, 0xBD, 0xBC, 0xE7, 0xBF, /* 0x64-0x67 */ + 0xBD, 0xBE, 0xE7, 0xC0, 0xE7, 0xB0, 0xE3, 0xD8, /* 0x68-0x6B */ + 0xE7, 0xB6, 0xE7, 0xAF, 0xE7, 0xB8, 0xE7, 0xB5, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xA6, /* 0x70-0x73 */ + 0xBD, 0xB9, 0xE7, 0xBD, 0xBD, 0xBA, 0xE7, 0xA4, /* 0x74-0x77 */ + 0xBD, 0xBD, 0xEB, 0x64, 0xE7, 0xB7, 0xE7, 0xBC, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xEB, 0x61, 0xBD, 0xB8, 0xBF, 0xC0, /* 0x80-0x83 */ + 0xEB, 0x6B, 0xEB, 0x67, 0x3F, 0x3F, 0xEB, 0x65, /* 0x84-0x87 */ + 0xEB, 0x60, 0xEB, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xBF, 0xC4, 0x3F, 0x3F, 0xEB, 0x5C, /* 0x8C-0x8F */ + 0xEB, 0x68, 0xEB, 0x69, 0xEB, 0x5F, 0xEB, 0x5E, /* 0x90-0x93 */ + 0xEB, 0x6C, 0x3F, 0x3F, 0xEB, 0x62, 0xEB, 0x5D, /* 0x94-0x97 */ + 0xEB, 0x63, 0x3F, 0x3F, 0xEB, 0x6E, 0xEB, 0x5B, /* 0x98-0x9B */ + 0xEB, 0x6D, 0xEB, 0x6A, 0xBF, 0xC2, 0xBF, 0xC1, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBF, 0xC3, 0xEB, 0x66, /* 0xA0-0xA3 */ + 0xF0, 0xCB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0x59, 0xC1, 0xB1, /* 0xA8-0xAB */ + 0xEE, 0x5D, 0xEE, 0x5A, 0xEE, 0x61, 0xEE, 0x67, /* 0xAC-0xAF */ + 0xEE, 0x5C, 0x3F, 0x3F, 0xEE, 0x70, 0xC1, 0xAE, /* 0xB0-0xB3 */ + 0xEE, 0x6A, 0xEE, 0x5F, 0xEE, 0x6B, 0xEE, 0x66, /* 0xB4-0xB7 */ + 0xEE, 0x6D, 0xEE, 0x5E, 0xC1, 0xB3, 0xC1, 0xB2, /* 0xB8-0xBB */ + 0xEE, 0x60, 0xEE, 0x6E, 0xEE, 0x58, 0xEE, 0x6C, /* 0xBC-0xBF */ + 0xC1, 0xAC, 0x3F, 0x3F, 0xEE, 0x64, 0xEE, 0x63, /* 0xC0-0xC3 */ + 0xEE, 0x68, 0xEE, 0x5B, 0xC1, 0xB0, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xC1, 0xB4, 0xEE, 0x62, 0xEE, 0x69, 0xC1, 0xB5, /* 0xC8-0xCB */ + 0xEE, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xC1, 0xAD, 0xC1, 0xAF, 0xF0, 0xC7, /* 0xD0-0xD3 */ + 0xF0, 0xC5, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xCC, /* 0xD4-0xD7 */ + 0xF0, 0xC9, 0xF0, 0xCD, 0x3F, 0x3F, 0xF0, 0xBE, /* 0xD8-0xDB */ + 0xF0, 0xC6, 0xF0, 0xD1, 0xEE, 0x6F, 0xF0, 0xC2, /* 0xDC-0xDF */ + 0xC2, 0xCF, 0xE7, 0xA5, 0xF0, 0xBD, 0xF0, 0xCA, /* 0xE0-0xE3 */ + 0xF0, 0xC4, 0xF0, 0xC1, 0xF0, 0xBC, 0xF0, 0xBB, /* 0xE4-0xE7 */ + 0xF0, 0xD0, 0x3F, 0x3F, 0xF0, 0xC0, 0xF0, 0xBF, /* 0xE8-0xEB */ + 0xC2, 0xCD, 0xF0, 0xC8, 0x3F, 0x3F, 0xC2, 0xCC, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0xCE, 0xF0, 0xC3, /* 0xF0-0xF3 */ + 0xF0, 0xCF, 0x3F, 0x3F, 0xF2, 0xDE, 0xF2, 0xDF, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xC3, 0xC9, 0xF2, 0xDC, 0xC3, 0xC6, /* 0xF8-0xFB */ + 0xF2, 0xE4, 0x3F, 0x3F, 0xC3, 0xCA, 0xF2, 0xE6, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_88[512] = { + 0xF2, 0xDB, 0xF0, 0xCE, 0xF2, 0xE8, 0xF2, 0xDD, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xC3, 0xC7, 0xF2, 0xE3, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xF2, 0xE5, 0xF2, 0xE0, 0xF2, 0xE7, 0xF2, 0xE2, /* 0x08-0x0B */ + 0xF2, 0xE1, 0xC3, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xF4, 0xC5, 0xF4, 0xC6, 0x3F, 0x3F, 0xF4, 0xC8, /* 0x10-0x13 */ + 0xC4, 0xAE, 0xC4, 0xAF, 0xF4, 0xC9, 0xF4, 0xC7, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF4, 0xC4, 0x3F, 0x3F, 0xF6, 0x42, /* 0x18-0x1B */ + 0xF6, 0x45, 0xF6, 0x41, 0x3F, 0x3F, 0xC4, 0xFA, /* 0x1C-0x1F */ + 0xF6, 0x43, 0xC4, 0xF9, 0xC4, 0xF8, 0xC4, 0xF7, /* 0x20-0x23 */ + 0xF6, 0x44, 0xF7, 0x51, 0xF7, 0x4F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xF7, 0x4E, 0xF6, 0x40, 0xF7, 0x50, 0xF6, 0x46, /* 0x28-0x2B */ + 0xF7, 0x4D, 0x3F, 0x3F, 0xF7, 0xF9, 0xF7, 0xD7, /* 0x2C-0x2F */ + 0xF7, 0xF7, 0xC5, 0xDB, 0xF7, 0xF8, 0xF7, 0xFA, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF8, 0xBF, 0xC5, 0xFA, 0xF8, 0xBE, /* 0x34-0x37 */ + 0xF8, 0xBD, 0xC5, 0xFB, 0x3F, 0x3F, 0xC6, 0x5A, /* 0x38-0x3B */ + 0xF9, 0x6E, 0xF9, 0xA7, 0xF9, 0xA6, 0xF9, 0xA8, /* 0x3C-0x3F */ + 0xA6, 0xE5, 0xD0, 0xAA, 0x3F, 0x3F, 0xD3, 0xCF, /* 0x40-0x43 */ + 0xD3, 0xD0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xDB, 0xC0, 0x3F, 0x3F, 0xF6, 0x47, 0xF8, 0xC0, /* 0x48-0x4B */ + 0xA6, 0xE6, 0xAD, 0x6C, 0xD0, 0xAB, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xB1, 0xB3, 0x4E, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xDB, 0xC2, 0xDB, 0xC1, 0xB5, 0xF3, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xB8, 0xC5, 0xE7, 0xC1, 0xBD, 0xC3, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xBD, 0xC4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xBF, 0xC5, 0xC5, 0xFC, 0xA6, 0xE7, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xAC, /* 0x64-0x67 */ + 0xAA, 0xED, 0xD0, 0xAE, 0xD0, 0xAD, 0xAD, 0x6D, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xD3, 0xD1, 0x3F, 0x3F, 0xD3, 0xD8, /* 0x6C-0x6F */ + 0xB0, 0x49, 0xD3, 0xD6, 0xD3, 0xD4, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xD3, 0xDB, 0xD3, 0xD2, 0xD3, 0xD3, 0xB0, 0x4A, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xB0, 0x4E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xD3, 0xDC, 0xB0, 0x4D, 0xD3, 0xDA, 0xD3, 0xD7, /* 0x7C-0x7F */ + + 0xD3, 0xD5, 0xB0, 0x4B, 0xB0, 0x4C, 0xD3, 0xD9, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xB3, 0x50, 0xD7, 0xB2, 0x3F, 0x3F, 0xB3, 0x55, /* 0x88-0x8B */ + 0xD7, 0xC2, 0xB3, 0x54, 0xD7, 0xC4, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xD7, 0xB8, 0xB3, 0x52, 0xD7, 0xC3, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xD7, 0xB3, 0xB3, 0x53, 0xD7, 0xBF, /* 0x94-0x97 */ + 0xD7, 0xBB, 0xD7, 0xBD, 0xD7, 0xB7, 0xD7, 0xBE, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x4F, 0xD7, 0xBA, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xD7, 0xB9, 0xD7, 0xB5, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xD7, 0xC0, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xBC, /* 0xA4-0xA7 */ + 0xD7, 0xB4, 0x3F, 0x3F, 0xD7, 0xB6, 0xB3, 0x51, /* 0xA8-0xAB */ + 0xD7, 0xC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xB5, 0xF6, 0xDB, 0xCD, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xDB, 0xC9, 0xDB, 0xCB, /* 0xB4-0xB7 */ + 0xDB, 0xC6, 0xDB, 0xC5, 0xDB, 0xC3, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xDB, 0xCA, 0xDB, 0xCC, 0xDB, 0xC8, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xDB, 0xC7, 0xB5, 0xF4, 0xB5, 0xF5, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xDB, 0xCF, 0xB8, 0xCD, 0xDF, 0xF2, /* 0xC8-0xCB */ + 0xDF, 0xF8, 0xDF, 0xF3, 0xDF, 0xF4, 0xF9, 0xD8, /* 0xCC-0xCF */ + 0xDF, 0xF9, 0x3F, 0x3F, 0xB8, 0xCF, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xB8, 0xC7, 0xB8, 0xCE, 0xDF, 0xF1, 0xDB, 0xC4, /* 0xD4-0xD7 */ + 0xB8, 0xCA, 0xB8, 0xC8, 0xDF, 0xF7, 0xDF, 0xF6, /* 0xD8-0xDB */ + 0xB8, 0xC9, 0xB8, 0xCB, 0xDF, 0xF5, 0xB8, 0xC6, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xB8, 0xCC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE3, 0xF6, /* 0xE4-0xE7 */ + 0xBB, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x42, /* 0xE8-0xEB */ + 0xE4, 0x41, 0x3F, 0x3F, 0xE3, 0xFB, 0xBB, 0x76, /* 0xEC-0xEF */ + 0xE4, 0x40, 0xE3, 0xF7, 0xE3, 0xF8, 0xBB, 0x6E, /* 0xF0-0xF3 */ + 0xBB, 0x70, 0x3F, 0x3F, 0xE3, 0xFD, 0xE3, 0xF5, /* 0xF4-0xF7 */ + 0xBB, 0x72, 0xBB, 0x71, 0xE3, 0xF9, 0xE3, 0xFE, /* 0xF8-0xFB */ + 0xE3, 0xFC, 0xBB, 0x73, 0xE3, 0xFA, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_89[512] = { + 0x3F, 0x3F, 0xDB, 0xCE, 0xBB, 0x6F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xE7, 0xC2, 0xE7, 0xC9, 0xBD, 0xC6, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xE7, 0xCD, 0xBD, 0xCA, 0xE7, 0xC5, /* 0x08-0x0B */ + 0xE7, 0xC3, 0x3F, 0x3F, 0xE7, 0xCC, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xBD, 0xC5, 0xE7, 0xCB, 0xBD, 0xC7, 0xBD, 0xC8, /* 0x10-0x13 */ + 0xE7, 0xC4, 0xBD, 0xC9, 0xE7, 0xCA, 0xE7, 0xC6, /* 0x14-0x17 */ + 0xE7, 0xC7, 0xE7, 0xC8, 0xBB, 0x75, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0x70, 0xEB, 0x7C, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xBF, 0xCA, 0xEB, 0x77, 0xEB, 0x79, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xBF, 0xC8, 0xEB, 0x71, 0xEB, 0x75, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xEB, 0x78, 0xBF, 0xC6, 0xBF, 0xC9, /* 0x28-0x2B */ + 0xEB, 0x7B, 0xEB, 0x73, 0xEB, 0x74, 0xEB, 0x7A, /* 0x2C-0x2F */ + 0xEB, 0x72, 0xEB, 0x76, 0xBF, 0xC7, 0xEE, 0x72, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xEE, 0x71, 0xC1, 0xB7, 0xEE, 0x77, /* 0x34-0x37 */ + 0xC1, 0xB9, 0x3F, 0x3F, 0x3F, 0x3F, 0xC1, 0xB6, /* 0x38-0x3B */ + 0xEE, 0x73, 0xC1, 0xBA, 0xEE, 0x74, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xEE, 0x75, 0xEE, 0x78, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xC1, 0xB8, 0x3F, 0x3F, 0xF0, 0xD6, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xF0, 0xD9, 0x3F, 0x3F, 0xF0, 0xD3, /* 0x48-0x4B */ + 0xF0, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0xD4, /* 0x4C-0x4F */ + 0xF0, 0xD7, 0xF0, 0xD8, 0xEE, 0x76, 0xF0, 0xD2, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC3, 0xCD, 0xF2, 0xEC, /* 0x54-0x57 */ + 0xF2, 0xEF, 0xF2, 0xF1, 0xF2, 0xEA, 0xF2, 0xEB, /* 0x58-0x5B */ + 0xF2, 0xEE, 0xF2, 0xF0, 0xC3, 0xCE, 0xC3, 0xCC, /* 0x5C-0x5F */ + 0xC3, 0xCB, 0xF2, 0xED, 0xF2, 0xE9, 0xF4, 0xCA, /* 0x60-0x63 */ + 0xC4, 0xB0, 0x3F, 0x3F, 0xF4, 0xCB, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xF6, 0x49, 0xC4, 0xFB, 0xF6, 0x4B, /* 0x68-0x6B */ + 0xC4, 0xFC, 0xF6, 0x48, 0xF6, 0x4A, 0xC5, 0xA8, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xF7, 0x52, 0xC5, 0xA7, 0xF7, 0xFD, /* 0x70-0x73 */ + 0xF7, 0xFC, 0x3F, 0x3F, 0xF7, 0xFB, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xF9, 0x48, 0xF9, 0x49, 0xF9, 0x4B, /* 0x78-0x7B */ + 0xF9, 0x4A, 0x3F, 0x3F, 0xCA, 0x50, 0xA6, 0xE8, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xAD, 0x6E, 0xD7, 0xC5, 0xB5, 0xF7, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xDF, 0xFA, 0xC2, 0xD0, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xF2, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA3, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x57, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x56, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xDB, 0xD0, 0xB5, 0xF8, 0xDB, 0xD2, /* 0x94-0x97 */ + 0xDB, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0xDF, 0xFB, /* 0x98-0x9B */ + 0xB8, 0xD0, 0xE4, 0x43, 0xE4, 0x46, 0xE4, 0x45, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xE4, 0x44, 0xE7, 0xCE, 0xE7, 0xD0, /* 0xA0-0xA3 */ + 0xE7, 0xCF, 0x3F, 0x3F, 0xBF, 0xCC, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBF, 0xCB, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xC1, 0xBB, 0xEE, 0x79, 0xEE, 0x7B, 0xEE, 0x7A, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0xD1, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF2, 0xF4, 0xF2, 0xF3, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xF4, 0xCC, 0xC4, 0xB1, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xC4, 0xFD, 0xF7, 0x54, 0xF7, 0x53, /* 0xBC-0xBF */ + 0xC6, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA4, 0xD0, 0xAF, /* 0xD0-0xD3 */ + 0xAD, 0x6F, 0xD7, 0xC8, 0xD7, 0xC6, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xD7, 0xC7, 0xDB, 0xD4, 0xDB, 0xD5, /* 0xD8-0xDB */ + 0xE0, 0x43, 0xDB, 0xD3, 0x3F, 0x3F, 0xDF, 0xFC, /* 0xDC-0xDF */ + 0xE0, 0x41, 0xE0, 0x40, 0xE0, 0x42, 0xB8, 0xD1, /* 0xE0-0xE3 */ + 0xDF, 0xFE, 0xDF, 0xFD, 0xE0, 0x44, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xE4, 0x49, 0xE4, 0x47, 0x3F, 0x3F, 0xE4, 0x48, /* 0xE8-0xEB */ + 0xE7, 0xD3, 0xE7, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xE7, 0xD2, 0xEB, 0x7D, 0xEE, 0x7C, 0xEE, 0x7D, /* 0xF0-0xF3 */ + 0xC2, 0xD2, 0x3F, 0x3F, 0xF2, 0xF5, 0xF4, 0xCD, /* 0xF4-0xF7 */ + 0xC4, 0xB2, 0x3F, 0x3F, 0xF6, 0x4C, 0xF7, 0x55, /* 0xF8-0xFB */ + 0xC5, 0xA9, 0x3F, 0x3F, 0xF7, 0xFE, 0xF9, 0x4C, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8A[512] = { + 0xA8, 0xA5, 0x3F, 0x3F, 0xAD, 0x71, 0xAD, 0x72, /* 0x00-0x03 */ + 0xD0, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xB1, /* 0x04-0x07 */ + 0xAD, 0x70, 0x3F, 0x3F, 0xB0, 0x54, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xB0, 0x52, 0x3F, 0x3F, 0xB0, 0x51, 0xB0, 0x58, /* 0x0C-0x0F */ + 0xB0, 0x50, 0xB0, 0x59, 0xD3, 0xDD, 0xB0, 0x56, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xB0, 0x53, 0xB0, 0x57, 0xB0, 0x55, /* 0x14-0x17 */ + 0xB0, 0x4F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x5F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xB3, 0x59, 0xD7, 0xCC, 0xB3, 0x5E, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x60, 0xB3, 0x5A, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xB3, 0x5B, 0x3F, 0x3F, 0xD7, 0xCA, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x58, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xD7, 0xCB, 0xB3, 0x5D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xD7, 0xC9, 0xB3, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xB6, 0x44, 0x3F, 0x3F, 0xB6, 0x46, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xDB, 0xD8, 0xB6, 0x45, 0xB5, 0xF9, /* 0x38-0x3B */ + 0xB5, 0xFD, 0x3F, 0x3F, 0xB8, 0xE4, 0xE0, 0x49, /* 0x3C-0x3F */ + 0xDB, 0xDA, 0xB5, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xDB, 0xDD, 0xDB, 0xDE, 0xB6, 0x43, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xDB, 0xE0, 0x3F, 0x3F, 0xDB, 0xE2, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xDB, 0xE3, 0xDB, 0xD7, 0xDB, 0xD6, 0xDB, 0xE4, /* 0x4C-0x4F */ + 0xB6, 0x42, 0xDB, 0xE1, 0xDB, 0xDF, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xB6, 0x40, 0xB5, 0xFB, 0xB6, 0x47, 0xDB, 0xDB, /* 0x54-0x57 */ + 0xDB, 0xDC, 0xDB, 0xD9, 0x3F, 0x3F, 0xB6, 0x41, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB5, 0xFC, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xB5, 0xFA, 0xE0, 0x48, 0xB8, 0xDF, 0xB8, 0xDA, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB8, 0xD5, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xB8, 0xE5, 0xB8, 0xD6, 0x3F, 0x3F, 0xB8, 0xD2, /* 0x68-0x6B */ + 0xB8, 0xE1, 0xB8, 0xDE, 0xB8, 0xE0, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xB8, 0xD7, 0xB8, 0xDC, 0xB8, 0xD3, 0xB8, 0xD4, /* 0x70-0x73 */ + 0xE0, 0x50, 0xE0, 0x4D, 0xE0, 0x45, 0xE0, 0x4A, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xB8, 0xE2, 0xE0, 0x51, 0xB8, 0xE3, /* 0x78-0x7B */ + 0xB8, 0xD9, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0x47, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xE0, 0x4F, 0xE0, 0x4B, 0xE0, 0x4E, /* 0x80-0x83 */ + 0xE0, 0x4C, 0xB8, 0xDD, 0xE0, 0x46, 0xB8, 0xD8, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x4C, /* 0x88-0x8B */ + 0xBB, 0x78, 0xBB, 0x7B, 0x3F, 0x3F, 0xE4, 0x4E, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xBB, 0xA5, 0xE4, 0x4D, 0xBB, 0x7D, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xBD, 0xCF, 0xE4, 0x4F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xBB, 0xA4, 0xE4, 0x4B, 0xBB, 0xA6, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBB, 0x79, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xB8, 0xDB, 0xBB, 0x7C, 0x3F, 0x3F, 0xBB, 0x7A, /* 0xA0-0xA3 */ + 0xBB, 0x7E, 0xBB, 0xA2, 0xBB, 0x77, 0xBB, 0xA7, /* 0xA4-0xA7 */ + 0xBB, 0xA3, 0x3F, 0x3F, 0xBB, 0xA1, 0xE4, 0x4A, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xBD, 0xD6, 0x3F, 0x3F, 0xBD, 0xD2, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBD, 0xD9, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xE7, 0xD6, 0xBD, 0xDA, 0xE7, 0xE2, 0xE7, 0xDB, /* 0xB8-0xBB */ + 0xBD, 0xCB, 0xE7, 0xE3, 0xE7, 0xDD, 0xBD, 0xD5, /* 0xBC-0xBF */ + 0xE7, 0xDE, 0x3F, 0x3F, 0xBD, 0xD4, 0xE7, 0xE1, /* 0xC0-0xC3 */ + 0xBD, 0xCE, 0xE7, 0xDF, 0xE7, 0xD5, 0xBD, 0xCD, /* 0xC4-0xC7 */ + 0xEB, 0xAA, 0xBD, 0xD3, 0x3F, 0x3F, 0xBD, 0xD0, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xBD, 0xD8, 0x3F, 0x3F, 0xE7, 0xD4, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xE7, 0xD8, 0xBD, 0xCC, 0xE7, 0xD7, /* 0xD0-0xD3 */ + 0xE7, 0xD9, 0xE7, 0xDA, 0xBD, 0xD7, 0xE7, 0xDC, /* 0xD4-0xD7 */ + 0xE7, 0xE0, 0xE7, 0xE4, 0x3F, 0x3F, 0xBD, 0xDB, /* 0xD8-0xDB */ + 0xBF, 0xD2, 0xEB, 0xA5, 0xEB, 0xAB, 0xEB, 0xA8, /* 0xDC-0xDF */ + 0xEB, 0x7E, 0xEB, 0xAC, 0xEB, 0xA1, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xEB, 0xA7, 0x3F, 0x3F, 0xBF, 0xCD, 0xBF, 0xD3, /* 0xE4-0xE7 */ + 0xEB, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0xBF, 0xCF, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xBF, 0xD9, 0xBF, 0xD4, 0xEB, 0xAF, /* 0xEC-0xEF */ + 0xEB, 0xA9, 0xBF, 0xD0, 0xEB, 0xA2, 0xBF, 0xDA, /* 0xF0-0xF3 */ + 0xEB, 0xA3, 0xEB, 0xA4, 0xBF, 0xDB, 0xBF, 0xD8, /* 0xF4-0xF7 */ + 0xBD, 0xD1, 0x3F, 0x3F, 0xBF, 0xCE, 0xEB, 0xB0, /* 0xF8-0xFB */ + 0xBF, 0xDC, 0x3F, 0x3F, 0xBF, 0xD5, 0xEB, 0xAE, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8B[512] = { + 0xBF, 0xD1, 0xBF, 0xD6, 0xBF, 0xD7, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xC1, 0xC3, 0xEE, 0xA4, 0xEE, 0xAD, 0xEE, 0xAA, /* 0x04-0x07 */ + 0xEE, 0xAC, 0x3F, 0x3F, 0xC1, 0xC0, 0xEE, 0xA5, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xEE, 0xAB, 0xC1, 0xBC, 0xEE, 0xA7, /* 0x0C-0x0F */ + 0xC1, 0xC4, 0xEE, 0xA3, 0xEE, 0xA8, 0xEE, 0xAF, /* 0x10-0x13 */ + 0xEB, 0xA6, 0xEE, 0xA9, 0xEE, 0xA2, 0xC1, 0xBD, /* 0x14-0x17 */ + 0xEE, 0xA1, 0xC1, 0xBE, 0xEE, 0xB0, 0xC1, 0xBF, /* 0x18-0x1B */ + 0xEE, 0xAE, 0xC1, 0xC2, 0xEE, 0x7E, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xC1, 0xC1, 0x3F, 0x3F, 0xEE, 0xA6, 0xF0, 0xDC, /* 0x20-0x23 */ + 0xF0, 0xEA, 0xF0, 0xE5, 0xF0, 0xE7, 0xF0, 0xDB, /* 0x24-0x27 */ + 0xC2, 0xD3, 0x3F, 0x3F, 0xF0, 0xDA, 0xC2, 0xD6, /* 0x28-0x2B */ + 0xC2, 0xD5, 0x3F, 0x3F, 0xF0, 0xE9, 0xF0, 0xE1, /* 0x2C-0x2F */ + 0xF0, 0xDE, 0xF0, 0xE4, 0x3F, 0x3F, 0xF0, 0xDD, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF0, 0xDF, 0xF0, 0xE8, 0xF0, 0xE6, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xC2, 0xD4, 0xF0, 0xED, 0xF0, 0xEB, /* 0x38-0x3B */ + 0xF0, 0xE2, 0xF0, 0xEC, 0xF0, 0xE3, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xF2, 0xF9, 0xC3, 0xCF, 0xF3, 0x41, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xF6, 0x4F, 0xC3, 0xD6, 0xF0, 0xE0, /* 0x44-0x47 */ + 0xF2, 0xF7, 0xC3, 0xD2, 0xF2, 0xF8, 0xF2, 0xFD, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC3, 0xD4, 0xC3, 0xD5, /* 0x4C-0x4F */ + 0xF2, 0xF6, 0xF3, 0x40, 0xF3, 0x42, 0xF2, 0xFA, /* 0x50-0x53 */ + 0xF2, 0xFC, 0xF2, 0xFE, 0xF2, 0xFB, 0xF3, 0x43, /* 0x54-0x57 */ + 0xC3, 0xD1, 0xC3, 0xD7, 0xC3, 0xD3, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xC3, 0xD0, 0xF4, 0xD0, 0x3F, 0x3F, 0xC4, 0xB7, /* 0x5C-0x5F */ + 0xF4, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0xF4, 0xD2, /* 0x60-0x63 */ + 0x3F, 0x3F, 0xF4, 0xD3, 0xC4, 0xB5, 0xF4, 0xD4, /* 0x64-0x67 */ + 0xF4, 0xD1, 0x3F, 0x3F, 0xF4, 0xCF, 0xC4, 0xB8, /* 0x68-0x6B */ + 0xC4, 0xB4, 0xF4, 0xD5, 0x3F, 0x3F, 0xC4, 0xB6, /* 0x6C-0x6F */ + 0xC4, 0xB3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xC4, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0x40, /* 0x74-0x77 */ + 0xF6, 0x4E, 0xF6, 0x4D, 0xF6, 0x50, 0xF6, 0x51, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xC5, 0x41, 0xF7, 0x56, 0xF7, 0x5B, /* 0x7C-0x7F */ + + 0xC5, 0xAA, 0x3F, 0x3F, 0xF7, 0x58, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xF7, 0x57, 0xF7, 0x5A, 0xF7, 0x59, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xF8, 0x43, 0x3F, 0x3F, 0xC5, 0xDC, 0xF8, 0x42, /* 0x88-0x8B */ + 0xF8, 0x40, 0x3F, 0x3F, 0xF8, 0x41, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0xFE, 0xC5, 0xFD, /* 0x90-0x93 */ + 0xF8, 0xC1, 0xF8, 0xC2, 0xC6, 0x40, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xF9, 0x4D, 0xF9, 0x4E, 0xC6, 0x67, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xC6, 0x6D, 0x3F, 0x3F, 0xF9, 0xA9, 0xF9, 0xC8, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8C[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xA6, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xD7, 0xCD, 0x3F, 0x3F, 0xD7, 0xCE, /* 0x38-0x3B */ + 0xE0, 0x52, 0xE4, 0x50, 0xE7, 0xE5, 0xC1, 0xC6, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xC1, 0xC5, 0xF0, 0xEE, 0xF3, 0x44, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xF8, 0x44, 0xA8, 0xA7, 0xD3, 0xDE, /* 0x44-0x47 */ + 0xB0, 0x5A, 0xB3, 0x61, 0xE0, 0x54, 0xE0, 0x53, /* 0x48-0x4B */ + 0xBD, 0xDC, 0xE7, 0xE6, 0xBD, 0xDD, 0xEE, 0xB1, /* 0x4C-0x4F */ + 0xC2, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xC6, 0x76, 0xA8, 0xA8, 0xCD, 0xCB, 0xD3, 0xDF, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x62, 0x3F, 0x3F, /* 0x58-0x5B */ + 0xD7, 0xCF, 0xD7, 0xD0, 0x3F, 0x3F, 0xDB, 0xE5, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xB6, 0x48, 0xB8, 0xE6, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xE0, 0x56, 0xE0, 0x55, 0xE0, 0x57, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xE4, 0x51, 0xE4, 0x52, 0xBB, 0xA8, 0xBF, 0xDD, /* 0x68-0x6B */ + 0xBD, 0xDE, 0xBF, 0xDE, 0x3F, 0x3F, 0xEE, 0xB5, /* 0x6C-0x6F */ + 0xEE, 0xB2, 0xEE, 0xB4, 0xEE, 0xB3, 0xC1, 0xC7, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xF0, 0xEF, 0xF3, 0x46, 0xF3, 0x45, /* 0x74-0x77 */ + 0xCB, 0xA4, 0xB0, 0x5C, 0xB0, 0x5B, 0xD3, 0xE0, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xD7, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xDB, 0xE7, 0xDB, 0xE6, 0xB6, 0x49, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xE0, 0x59, 0xE0, 0x5A, 0xE0, 0x58, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xB8, 0xE8, 0xB8, 0xE7, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xBB, 0xAA, 0xBB, 0xA9, 0x3F, 0x3F, 0xE7, 0xE7, /* 0x8C-0x8F */ + 0xEB, 0xB3, 0xEB, 0xB1, 0xEB, 0xB2, 0xBF, 0xDF, /* 0x90-0x93 */ + 0xEE, 0xB7, 0xEE, 0xB6, 0x3F, 0x3F, 0xF0, 0xF2, /* 0x94-0x97 */ + 0xF0, 0xF1, 0xF0, 0xF0, 0xF3, 0x47, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xF9, 0xAA, 0xA8, 0xA9, 0xAD, 0x73, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xAD, 0x74, 0xB0, 0x5D, 0xB0, 0x5E, 0xD3, 0xE2, /* 0xA0-0xA3 */ + 0xD3, 0xE1, 0xD7, 0xD2, 0x3F, 0x3F, 0xB3, 0x68, /* 0xA4-0xA7 */ + 0xB3, 0x66, 0xB3, 0x63, 0xB3, 0x67, 0xB3, 0x65, /* 0xA8-0xAB */ + 0xB3, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0x4A, /* 0xAC-0xAF */ + 0xDB, 0xEA, 0x3F, 0x3F, 0xB8, 0xED, 0xB6, 0x4C, /* 0xB0-0xB3 */ + 0xB6, 0x51, 0xDB, 0xEC, 0xB6, 0x53, 0xB6, 0x52, /* 0xB4-0xB7 */ + 0xB6, 0x55, 0xDB, 0xEB, 0xDB, 0xE8, 0xB6, 0x4F, /* 0xB8-0xBB */ + 0xB6, 0x4B, 0xB6, 0x4D, 0xDB, 0xE9, 0xB6, 0x54, /* 0xBC-0xBF */ + 0xB6, 0x50, 0xB6, 0x4E, 0xB8, 0xEF, 0xB8, 0xEE, /* 0xC0-0xC3 */ + 0xB8, 0xEC, 0xB8, 0xF0, 0x3F, 0x3F, 0xB8, 0xEA, /* 0xC4-0xC7 */ + 0xB8, 0xEB, 0x3F, 0x3F, 0xB8, 0xE9, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xE0, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x54, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xBB, 0xAC, 0xBB, 0xAD, 0xBB, 0xAB, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xE4, 0x53, 0x3F, 0x3F, 0xE4, 0x55, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xE7, 0xEA, 0xE7, 0xEC, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xBD, 0xE7, 0xE7, 0xED, 0xBD, 0xE0, 0xE7, 0xE9, /* 0xDC-0xDF */ + 0xBD, 0xDF, 0xBD, 0xE9, 0xBD, 0xE5, 0xBD, 0xE6, /* 0xE0-0xE3 */ + 0xBD, 0xE2, 0xE7, 0xE8, 0xBD, 0xE1, 0xE7, 0xEE, /* 0xE4-0xE7 */ + 0xE7, 0xEB, 0x3F, 0x3F, 0xBD, 0xE8, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xBD, 0xE3, 0xBD, 0xE4, 0xEB, 0xB5, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xEB, 0xB7, 0xEB, 0xB6, 0x3F, 0x3F, 0xEB, 0xB8, /* 0xF0-0xF3 */ + 0xBF, 0xE0, 0xEB, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xC1, 0xCB, 0xEE, 0xB8, 0xC1, 0xC8, 0xC1, 0xCC, /* 0xF8-0xFB */ + 0xC1, 0xCA, 0xC1, 0xC9, 0xF0, 0xF3, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8D[512] = { + 0xF0, 0xF6, 0x3F, 0x3F, 0xF0, 0xF5, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xF0, 0xF4, 0xC2, 0xD8, 0xF3, 0x48, 0xF3, 0x49, /* 0x04-0x07 */ + 0xC3, 0xD8, 0xF3, 0x4A, 0xC3, 0xD9, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xC4, 0xBA, 0x3F, 0x3F, 0xC4, 0xB9, /* 0x0C-0x0F */ + 0xF6, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0x42, /* 0x10-0x13 */ + 0xF6, 0x53, 0xF7, 0x5C, 0xC5, 0xAB, 0xC5, 0xAC, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF8, 0x45, 0x3F, 0x3F, 0xC6, 0x42, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xA8, 0xAA, 0x3F, 0x3F, 0xB3, 0x6A, 0xB3, 0x69, /* 0x64-0x67 */ + 0xE0, 0x5C, 0xE0, 0x5D, 0x3F, 0x3F, 0xBB, 0xAE, /* 0x68-0x6B */ + 0xEB, 0xB9, 0xBD, 0xEA, 0xEB, 0xBA, 0xEE, 0xB9, /* 0x6C-0x6F */ + 0xA8, 0xAB, 0x3F, 0x3F, 0xD0, 0xB2, 0xAD, 0x76, /* 0x70-0x73 */ + 0xAD, 0x75, 0x3F, 0x3F, 0xD3, 0xE3, 0xB0, 0x5F, /* 0x74-0x77 */ + 0xD3, 0xE4, 0xD7, 0xD5, 0x3F, 0x3F, 0xD7, 0xD4, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xD7, 0xD3, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xDB, 0xEE, 0xB6, 0x58, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xDB, 0xED, 0xB6, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xDB, 0xEF, 0xB6, 0x56, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xE0, 0x5F, 0xE0, 0x62, 0xE0, 0x60, 0xE0, 0x61, /* 0x8C-0x8F */ + 0xE0, 0x65, 0xE0, 0x5E, 0xE0, 0x66, 0xE0, 0x63, /* 0x90-0x93 */ + 0xE0, 0x64, 0xBB, 0xB0, 0xE4, 0x56, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xBB, 0xAF, 0x3F, 0x3F, 0xE7, 0xF2, /* 0x98-0x9B */ + 0xE7, 0xF0, 0x3F, 0x3F, 0x3F, 0x3F, 0xBD, 0xEB, /* 0x9C-0x9F */ + 0xE7, 0xEF, 0xE7, 0xF1, 0x3F, 0x3F, 0xBD, 0xEC, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xEB, 0xBB, 0x3F, 0x3F, 0xEB, 0xBC, /* 0xA4-0xA7 */ + 0xC1, 0xCD, 0x3F, 0x3F, 0xF3, 0x4C, 0xF3, 0x4E, /* 0xA8-0xAB */ + 0xF3, 0x4B, 0xF3, 0x4D, 0xF4, 0xD6, 0xF6, 0x54, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0x6F, 0xA8, 0xAC, /* 0xB0-0xB3 */ + 0xAD, 0x77, 0xD3, 0xE5, 0xD3, 0xE7, 0xD3, 0xE6, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xD7, 0xD8, 0xB3, 0x6C, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xD7, 0xD6, 0x3F, 0x3F, 0xB3, 0x6B, 0xD7, 0xD9, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xD7, 0xDA, 0xD7, 0xD7, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xDB, 0xFB, 0xB6, 0x60, 0xDB, 0xF3, /* 0xC4-0xC7 */ + 0xDB, 0xF9, 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0x5B, /* 0xC8-0xCB */ + 0xB6, 0x5E, 0xDB, 0xF2, 0xB6, 0x59, 0xDB, 0xF6, /* 0xCC-0xCF */ + 0xE0, 0x6C, 0xB6, 0x5D, 0x3F, 0x3F, 0xDB, 0xF1, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xDB, 0xF7, 0xDB, 0xF4, 0xDB, 0xFA, /* 0xD4-0xD7 */ + 0xDB, 0xF0, 0xDB, 0xF8, 0xB6, 0x5C, 0xB6, 0x5F, /* 0xD8-0xDB */ + 0xDB, 0xF5, 0xB6, 0x5A, 0x3F, 0x3F, 0xB8, 0xF2, /* 0xDC-0xDF */ + 0xE0, 0x68, 0xB8, 0xF1, 0xE0, 0x6F, 0xE0, 0x6E, /* 0xE0-0xE3 */ + 0xB8, 0xF8, 0x3F, 0x3F, 0xB8, 0xF9, 0xE0, 0x70, /* 0xE4-0xE7 */ + 0xB8, 0xF3, 0xE0, 0x6D, 0xB8, 0xF7, 0xE0, 0x72, /* 0xE8-0xEB */ + 0xE0, 0x69, 0x3F, 0x3F, 0xE0, 0x6B, 0xB8, 0xF4, /* 0xEC-0xEF */ + 0xE0, 0x67, 0xE0, 0x6A, 0xE0, 0x71, 0xB8, 0xF5, /* 0xF0-0xF3 */ + 0xE0, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB8, 0xF6, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xBB, 0xB1, 0xE4, 0x5B, 0xE4, 0x61, 0xE4, 0x59, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8E[512] = { + 0xE4, 0x62, 0x3F, 0x3F, 0xE4, 0x58, 0xE4, 0x5D, /* 0x00-0x03 */ + 0xE4, 0x63, 0xE4, 0x60, 0xE4, 0x5F, 0xE4, 0x5E, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xE4, 0x57, 0xE4, 0x5C, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE4, 0x5A, 0x3F, 0x3F, 0xBD, 0xF1, /* 0x0C-0x0F */ + 0xBD, 0xEE, 0xE7, 0xFB, 0xE8, 0x41, 0xE8, 0x43, /* 0x10-0x13 */ + 0xE8, 0x40, 0xE7, 0xF8, 0xE7, 0xFA, 0xE8, 0x45, /* 0x14-0x17 */ + 0xE8, 0x42, 0xE7, 0xFC, 0xE8, 0x46, 0xE7, 0xF9, /* 0x18-0x1B */ + 0xE8, 0x44, 0xBD, 0xEF, 0xBD, 0xF5, 0xBD, 0xF3, /* 0x1C-0x1F */ + 0xE7, 0xF3, 0xBD, 0xF4, 0xBD, 0xF0, 0xE7, 0xF4, /* 0x20-0x23 */ + 0xE7, 0xF6, 0xE7, 0xF5, 0xE7, 0xFD, 0xE7, 0xFE, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xBD, 0xF2, 0x3F, 0x3F, 0xBD, 0xED, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE7, 0xF7, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xEB, 0xC6, 0xBF, 0xE2, 0x3F, 0x3F, 0xEB, 0xBD, /* 0x30-0x33 */ + 0xBF, 0xE3, 0xBF, 0xE6, 0xEB, 0xC2, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xEB, 0xBF, 0xBF, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xEB, 0xC3, 0xEB, 0xC4, 0xEB, 0xBE, 0xEB, 0xC7, /* 0x3C-0x3F */ + 0xEB, 0xC0, 0xEB, 0xC5, 0xBF, 0xE4, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xBF, 0xE1, 0xEB, 0xC1, 0x3F, 0x3F, 0xEE, 0xBF, /* 0x44-0x47 */ + 0xC1, 0xD0, 0xC1, 0xCE, 0xC1, 0xD1, 0xC1, 0xCF, /* 0x48-0x4B */ + 0xEE, 0xBE, 0xEE, 0xBB, 0xEE, 0xBA, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xEE, 0xBD, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xBC, /* 0x50-0x53 */ + 0xF1, 0x45, 0xC2, 0xDE, 0xF0, 0xFB, 0xF0, 0xFA, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xC2, 0xD9, 0xF1, 0x41, 0xF1, 0x40, /* 0x58-0x5B */ + 0xF0, 0xF7, 0xF1, 0x43, 0xF0, 0xFC, 0xC2, 0xDD, /* 0x5C-0x5F */ + 0xF0, 0xF9, 0xF1, 0x42, 0xF0, 0xF8, 0xC2, 0xDA, /* 0x60-0x63 */ + 0xC2, 0xDC, 0xF0, 0xFD, 0xC2, 0xDB, 0xF0, 0xFE, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xF1, 0x44, 0xF3, 0x52, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xC3, 0xDE, 0xF3, 0x4F, 0x3F, 0x3F, 0xF3, 0x53, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC3, 0xDB, 0xF3, 0x51, /* 0x70-0x73 */ + 0xC3, 0xE0, 0x3F, 0x3F, 0xC3, 0xDD, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xF3, 0x50, 0x3F, 0x3F, 0xC3, 0xDF, 0xF3, 0x54, /* 0x78-0x7B */ + 0xC3, 0xDA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0xC4, 0xBC, 0xC4, 0xBE, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xF4, 0xD9, 0xC4, 0xBD, 0xF4, 0xD7, 0xC3, 0xDC, /* 0x84-0x87 */ + 0xF4, 0xD8, 0xC4, 0xBB, 0xC5, 0x43, 0xC5, 0x45, /* 0x88-0x8B */ + 0xF6, 0x56, 0xC5, 0x44, 0xF6, 0x55, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xF7, 0x61, 0xC5, 0xAD, 0xF7, 0x60, 0xC5, 0xAE, /* 0x90-0x93 */ + 0xF7, 0x5E, 0xF7, 0x5D, 0xF7, 0x62, 0xF7, 0x63, /* 0x94-0x97 */ + 0xF8, 0x46, 0x3F, 0x3F, 0xF7, 0x5F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xF8, 0xC6, 0xF8, 0xC3, 0xF8, 0xC4, /* 0x9C-0x9F */ + 0xF8, 0xC5, 0xC6, 0x5C, 0x3F, 0x3F, 0xF9, 0x51, /* 0xA0-0xA3 */ + 0xF9, 0x50, 0xF9, 0x4F, 0xF9, 0x70, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xF9, 0xBE, 0xF9, 0xAB, 0xC6, 0x6E, 0xA8, 0xAD, /* 0xA8-0xAB */ + 0xB0, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB8, 0xFA, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBD, 0xF6, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xEB, 0xC8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xC2, 0xDF, 0x3F, 0x3F, 0xF3, 0x55, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xF9, 0xAC, 0xA8, 0xAE, 0xAA, 0xEE, /* 0xC8-0xCB */ + 0xAD, 0x79, 0xAD, 0x78, 0x3F, 0x3F, 0xB0, 0x63, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xD3, 0xE8, 0xB0, 0x61, 0xD3, 0xE9, /* 0xD0-0xD3 */ + 0xB0, 0x62, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xDF, /* 0xD4-0xD7 */ + 0xD7, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0x6D, /* 0xD8-0xDB */ + 0xD7, 0xDE, 0xD7, 0xDD, 0xD7, 0xDC, 0xB3, 0x6E, /* 0xDC-0xDF */ + 0xD7, 0xE0, 0xD7, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xDC, 0x43, 0xDC, 0x41, 0xDC, 0x45, /* 0xE4-0xE7 */ + 0xDC, 0x46, 0xDC, 0x4C, 0x3F, 0x3F, 0xDC, 0x48, /* 0xE8-0xEB */ + 0xDC, 0x4A, 0x3F, 0x3F, 0xDC, 0x42, 0xDB, 0xFC, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xDC, 0x49, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xDC, 0x4B, 0xDC, 0x44, 0xDC, 0x47, 0xDB, 0xFD, /* 0xF4-0xF7 */ + 0xB6, 0x62, 0xDC, 0x40, 0xDB, 0xFE, 0xB6, 0x61, /* 0xF8-0xFB */ + 0xB6, 0x63, 0x3F, 0x3F, 0xB8, 0xFD, 0xE0, 0x75, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_8F[512] = { + 0xE0, 0x77, 0xE0, 0x76, 0xE0, 0x7B, 0xB8, 0xFB, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xE0, 0x78, 0xE0, 0x74, 0xE0, 0x79, /* 0x04-0x07 */ + 0xE0, 0x7A, 0xB8, 0xFC, 0xB8, 0xFE, 0xE0, 0x7C, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE4, 0x67, 0xE4, 0x66, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xE4, 0x64, 0xE4, 0x65, 0xBB, 0xB3, 0xBB, 0xB5, /* 0x10-0x13 */ + 0xBB, 0xB2, 0xBB, 0xB4, 0xE8, 0x4D, 0xE8, 0x4E, /* 0x14-0x17 */ + 0xE8, 0x49, 0x3F, 0x3F, 0xE8, 0x4A, 0xBD, 0xF8, /* 0x18-0x1B */ + 0xBD, 0xFD, 0xBD, 0xF7, 0xBD, 0xFE, 0xBD, 0xF9, /* 0x1C-0x1F */ + 0xE8, 0x4B, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x4C, /* 0x20-0x23 */ + 0xE8, 0x48, 0xBE, 0x40, 0xBD, 0xFB, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xBD, 0xFA, 0xBD, 0xFC, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xE8, 0x47, 0x3F, 0x3F, 0xEB, 0xCA, 0xBF, 0xE8, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xCC, 0xBF, 0xEA, /* 0x30-0x33 */ + 0xEB, 0xCF, 0xEB, 0xCB, 0xEB, 0xC9, 0xEB, 0xCE, /* 0x34-0x37 */ + 0xBF, 0xE9, 0xEB, 0xCD, 0x3F, 0x3F, 0xBF, 0xE7, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC1, 0xD3, 0xC1, 0xD6, /* 0x3C-0x3F */ + 0xEE, 0xC1, 0x3F, 0x3F, 0xC1, 0xD4, 0xEE, 0xC0, /* 0x40-0x43 */ + 0xC1, 0xD2, 0xC1, 0xD5, 0xF1, 0x46, 0xF1, 0x47, /* 0x44-0x47 */ + 0xF1, 0x48, 0xC2, 0xE0, 0x3F, 0x3F, 0xF1, 0x49, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xC2, 0xE1, 0xC3, 0xE2, 0xF3, 0x58, /* 0x4C-0x4F */ + 0xF3, 0x59, 0xF3, 0x57, 0xF3, 0x56, 0xF3, 0x5A, /* 0x50-0x53 */ + 0xC3, 0xE1, 0xF4, 0xDD, 0xF4, 0xDB, 0xF4, 0xDC, /* 0x54-0x57 */ + 0xF4, 0xDE, 0xF4, 0xDA, 0xF4, 0xDF, 0xF6, 0x58, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xF6, 0x59, 0xF6, 0x57, 0xC5, 0x46, /* 0x5C-0x5F */ + 0xF7, 0x64, 0xC5, 0xAF, 0xF7, 0x65, 0xF8, 0x48, /* 0x60-0x63 */ + 0xF8, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xAF, /* 0x98-0x9B */ + 0xB6, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0x40, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xBB, 0xB6, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBF, 0xEC, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xBF, 0xEB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xC3, 0xE3, 0xC4, 0x7C, 0xC5, 0x47, /* 0xAC-0xAF */ + 0xA8, 0xB0, 0xB0, 0x64, 0xB9, 0x41, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xF3, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xA6, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xB1, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xA8, 0xB4, 0xA8, 0xB3, 0xA8, 0xB2, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xCB, 0xA5, 0x3F, 0x3F, 0xCD, 0xCD, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xCD, 0xCF, 0xAA, 0xEF, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0xAA, 0xF1, 0xCD, 0xCC, 0xCD, 0xCE, /* 0xD0-0xD3 */ + 0xAA, 0xF0, 0xCD, 0xD1, 0xCD, 0xD0, 0xCD, 0xD2, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xD0, 0xB6, 0xD0, 0xB4, 0xAD, 0x7C, 0xD0, 0xB3, /* 0xE0-0xE3 */ + 0xAD, 0xA3, 0xAD, 0x7E, 0xAD, 0x7B, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xAD, 0xA4, 0x3F, 0x3F, 0xAD, 0x7D, 0xAD, 0xA2, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xAD, 0xA1, 0xD0, 0xB5, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xAD, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xB0, 0x6A, 0xD3, 0xEB, 0xD3, 0xF1, 0xB0, 0x67, /* 0xF4-0xF7 */ + 0xB0, 0x6E, 0x3F, 0x3F, 0xB0, 0x69, 0xD3, 0xEE, /* 0xF8-0xFB */ + 0xD3, 0xF0, 0xB0, 0x6C, 0xD3, 0xEA, 0xD3, 0xED, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_90[512] = { + 0xB0, 0x68, 0xB0, 0x65, 0xD3, 0xEC, 0xB0, 0x6B, /* 0x00-0x03 */ + 0xD3, 0xEF, 0xB0, 0x6D, 0xB0, 0x66, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD7, 0xE3, /* 0x08-0x0B */ + 0xD7, 0xE6, 0xB3, 0x70, 0x3F, 0x3F, 0xB3, 0x7A, /* 0x0C-0x0F */ + 0xB3, 0x76, 0xD7, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xB3, 0x7E, 0xB3, 0x77, 0xB3, 0x7C, 0xB3, 0x72, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xB3, 0x6F, 0xB3, 0x71, 0xB3, 0x7D, /* 0x18-0x1B */ + 0xD7, 0xE5, 0xB3, 0x75, 0xB3, 0x78, 0xB3, 0x74, /* 0x1C-0x1F */ + 0xB3, 0x79, 0xD7, 0xE7, 0xB3, 0x7B, 0xB3, 0x73, /* 0x20-0x23 */ + 0xD7, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xDC, 0x4D, 0xB6, 0x65, 0xDC, 0x4F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xB6, 0x67, 0xB6, 0x69, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xDC, 0x4E, 0xB6, 0x66, 0xB6, 0x6A, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xB6, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xB9, 0x47, 0xE0, 0xA3, 0xB9, 0x4F, 0xE0, 0x7E, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xB9, 0x50, 0xB9, 0x45, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xE0, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0x4A, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xE0, 0xA2, 0xB9, 0x43, 0xB9, 0x42, /* 0x48-0x4B */ + 0x3F, 0x3F, 0xB9, 0x4D, 0xB9, 0x4C, 0xB9, 0x4B, /* 0x4C-0x4F */ + 0xB9, 0x49, 0xB9, 0x4E, 0xE0, 0x7D, 0xB9, 0x44, /* 0x50-0x53 */ + 0xB9, 0x46, 0xB9, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xBB, 0xB8, 0xBB, 0xBB, 0x3F, 0x3F, 0xBB, 0xBF, /* 0x58-0x5B */ + 0xBB, 0xB9, 0xBB, 0xBE, 0xBB, 0xBC, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xBB, 0xB7, 0x3F, 0x3F, 0xBB, 0xBD, 0xBB, 0xBA, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0x52, /* 0x64-0x67 */ + 0xBE, 0x43, 0xBE, 0x41, 0x3F, 0x3F, 0xE8, 0x53, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xBE, 0x44, 0xBE, 0x42, 0xE8, 0x51, /* 0x6C-0x6F */ + 0xE8, 0x50, 0x3F, 0x3F, 0xBF, 0xF0, 0xE8, 0x4F, /* 0x70-0x73 */ + 0xBF, 0xEE, 0xBF, 0xED, 0xEB, 0xD0, 0xBE, 0x45, /* 0x74-0x77 */ + 0xBF, 0xEF, 0xEB, 0xD1, 0xBF, 0xF2, 0xEB, 0xD2, /* 0x78-0x7B */ + 0xBF, 0xF1, 0xC1, 0xD8, 0xEE, 0xC3, 0xC1, 0xD7, /* 0x7C-0x7F */ + + 0xC1, 0xDC, 0xC1, 0xDA, 0xC1, 0xDB, 0xC2, 0xE3, /* 0x80-0x83 */ + 0xC1, 0xD9, 0xEE, 0xC2, 0xEB, 0xD3, 0xC2, 0xE2, /* 0x84-0x87 */ + 0xC2, 0xE4, 0x3F, 0x3F, 0xC3, 0xE4, 0xC3, 0xE5, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xF4, 0xE0, 0x3F, 0x3F, 0xC5, 0xDE, /* 0x8C-0x8F */ + 0xC5, 0xDD, 0xA8, 0xB6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xCA, 0x55, 0xB0, 0x6F, 0x3F, 0x3F, 0xCA, 0x52, /* 0x94-0x97 */ + 0xCA, 0x53, 0xCA, 0x51, 0x3F, 0x3F, 0xCA, 0x54, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xCB, 0xAA, 0xCB, 0xA7, /* 0x9C-0x9F */ + 0xCB, 0xAC, 0xCB, 0xA8, 0xA8, 0xB7, 0xA8, 0xBA, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xCB, 0xA9, 0xA8, 0xB9, 0xCB, 0xAB, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xA8, 0xB8, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCD, 0xD5, /* 0xAC-0xAF */ + 0xCD, 0xD7, 0xAA, 0xF4, 0xCD, 0xD3, 0xCD, 0xD6, /* 0xB0-0xB3 */ + 0xCD, 0xD4, 0xAA, 0xF2, 0xAA, 0xF5, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xAA, 0xF3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xD0, 0xB8, 0xD0, 0xBC, 0xD0, 0xB9, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xAD, 0xA7, 0x3F, 0x3F, 0xAD, 0xA8, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xD0, 0xBB, 0x3F, 0x3F, 0xD0, 0xBD, /* 0xC4-0xC7 */ + 0xD0, 0xBF, 0x3F, 0x3F, 0xAD, 0xA5, 0xD0, 0xBE, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xA6, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xD7, 0xEE, 0xD0, 0xBA, 0xD3, 0xF2, 0xD3, 0xFB, /* 0xD4-0xD7 */ + 0xD3, 0xF9, 0xD3, 0xF4, 0xD3, 0xF5, 0xD3, 0xFA, /* 0xD8-0xDB */ + 0xD3, 0xFC, 0xB0, 0x71, 0x3F, 0x3F, 0xD3, 0xF7, /* 0xDC-0xDF */ + 0xD3, 0xF3, 0xB0, 0x70, 0xB0, 0x72, 0xD3, 0xF6, /* 0xE0-0xE3 */ + 0xD3, 0xFD, 0xD3, 0xF8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xB3, 0xA1, 0xD7, 0xF1, 0xD7, 0xE9, 0xD7, 0xEF, /* 0xE8-0xEB */ + 0xD7, 0xF0, 0xB3, 0xA2, 0x3F, 0x3F, 0xD7, 0xE8, /* 0xEC-0xEF */ + 0xD7, 0xEA, 0xD0, 0xB7, 0xD7, 0xEC, 0xD7, 0xED, /* 0xF0-0xF3 */ + 0xD7, 0xEB, 0xB6, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xDC, 0x56, 0xEB, 0xD4, 0xDC, 0x57, /* 0xF8-0xFB */ + 0xDC, 0x54, 0xB3, 0xA3, 0xB6, 0x6E, 0xDC, 0x53, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_91[512] = { + 0xDC, 0x59, 0xDC, 0x58, 0xB6, 0x6B, 0xDC, 0x5C, /* 0x00-0x03 */ + 0xDC, 0x52, 0xDC, 0x5B, 0xDC, 0x50, 0xDC, 0x5A, /* 0x04-0x07 */ + 0xDC, 0x55, 0xB6, 0x6D, 0x3F, 0x3F, 0xE0, 0xAA, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xE0, 0xA5, 0xE0, 0xAB, 0xE0, 0xA6, /* 0x0C-0x0F */ + 0xE0, 0xA4, 0xE0, 0xA7, 0xB9, 0x51, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xE0, 0xA9, 0x3F, 0x3F, 0xE0, 0xA8, 0xB9, 0x52, /* 0x14-0x17 */ + 0xBB, 0xC1, 0xBB, 0xC0, 0xE4, 0x6E, 0xE4, 0x71, /* 0x18-0x1B */ + 0xE4, 0x69, 0xE4, 0x6D, 0xBB, 0xC2, 0xE4, 0x6C, /* 0x1C-0x1F */ + 0xE4, 0x6A, 0xE4, 0x70, 0xE4, 0x6B, 0xE4, 0x68, /* 0x20-0x23 */ + 0xE4, 0x6F, 0x3F, 0x3F, 0xE8, 0x59, 0xBE, 0x48, /* 0x24-0x27 */ + 0xF1, 0x4A, 0xE8, 0x56, 0xE8, 0x57, 0xE8, 0x55, /* 0x28-0x2B */ + 0xDC, 0x51, 0xBE, 0x47, 0xE8, 0x5A, 0xE8, 0x54, /* 0x2C-0x2F */ + 0xBE, 0x46, 0xBE, 0x49, 0xE8, 0x58, 0xEB, 0xD5, /* 0x30-0x33 */ + 0xBF, 0xF3, 0xEB, 0xD6, 0xEB, 0xD7, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xEE, 0xC4, 0xC1, 0xDD, 0xF1, 0x4B, 0xF1, 0x4C, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0x4D, 0xF3, 0x5D, /* 0x3C-0x3F */ + 0xF3, 0x5C, 0xF4, 0xE2, 0x3F, 0x3F, 0xF4, 0xE1, /* 0x40-0x43 */ + 0xF6, 0x5B, 0xF6, 0x5C, 0xF6, 0x5A, 0xF7, 0x66, /* 0x44-0x47 */ + 0xC5, 0xB0, 0xA8, 0xBB, 0xAD, 0xAA, 0xAD, 0xA9, /* 0x48-0x4B */ + 0xB0, 0x75, 0xB0, 0x74, 0xD4, 0x40, 0xD4, 0x41, /* 0x4C-0x4F */ + 0xD3, 0xFE, 0x3F, 0x3F, 0xB0, 0x73, 0xD7, 0xF5, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xD7, 0xF6, 0xD7, 0xF2, 0xB3, 0xA4, /* 0x54-0x57 */ + 0xD7, 0xF3, 0x3F, 0x3F, 0xD7, 0xF4, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0x5F, /* 0x5C-0x5F */ + 0xDC, 0x61, 0xDC, 0x5D, 0xDC, 0x60, 0xB6, 0x6F, /* 0x60-0x63 */ + 0xDC, 0x5E, 0xB6, 0x70, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xDD, 0x73, 0xB9, 0x55, 0xB9, 0x54, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xB9, 0x53, 0x3F, 0x3F, 0xE0, 0xAC, 0xE0, 0xAD, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x73, 0xE4, 0x75, /* 0x70-0x73 */ + 0xBB, 0xC6, 0xBB, 0xC3, 0x3F, 0x3F, 0xBB, 0xC5, /* 0x74-0x77 */ + 0xBB, 0xC4, 0xE4, 0x74, 0xE4, 0x72, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xE8, 0x61, 0xE8, 0x5E, 0xE8, 0x5F, 0xBE, 0x4D, /* 0x80-0x83 */ + 0xE8, 0x60, 0xE8, 0x5B, 0xE8, 0x5C, 0xBE, 0x4A, /* 0x84-0x87 */ + 0x3F, 0x3F, 0xBE, 0x4B, 0xE8, 0x5D, 0xBE, 0x4C, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xEB, 0xDB, 0x3F, 0x3F, 0xEB, 0xDC, /* 0x8C-0x8F */ + 0xEB, 0xD9, 0xEB, 0xDA, 0xBF, 0xF4, 0xEB, 0xD8, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xEE, 0xC8, 0xEE, 0xC5, 0xEE, 0xC7, /* 0x98-0x9B */ + 0xC1, 0xE0, 0xEE, 0xCB, 0xC1, 0xDF, 0xEE, 0xC9, /* 0x9C-0x9F */ + 0xEE, 0xCC, 0xEE, 0xCA, 0xEE, 0xC6, 0xC1, 0xDE, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xF1, 0x4F, 0x3F, 0x3F, 0xF1, 0x50, /* 0xA4-0xA7 */ + 0xF1, 0x4E, 0x3F, 0x3F, 0xF1, 0x52, 0xC2, 0xE5, /* 0xA8-0xAB */ + 0xC2, 0xE6, 0xF3, 0x5F, 0xC3, 0xE7, 0xF1, 0x51, /* 0xAC-0xAF */ + 0xF3, 0x5E, 0xC3, 0xE6, 0xF4, 0xE5, 0xF4, 0xE6, /* 0xB0-0xB3 */ + 0xC4, 0xBF, 0xF4, 0xE4, 0x3F, 0x3F, 0xF4, 0xE3, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xF6, 0x5D, 0xC5, 0x48, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0xF8, 0x49, 0xF8, 0xC8, 0xF8, 0xC7, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xC6, 0x43, 0xC6, 0x5D, 0xF8, 0xC9, 0xF9, 0x71, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xC6, 0x6F, 0xA8, 0xBC, 0xAA, 0xF6, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xB9, 0x56, 0x3F, 0x3F, 0xC4, 0xC0, /* 0xC8-0xCB */ + 0xA8, 0xBD, 0xAD, 0xAB, 0xB3, 0xA5, 0xB6, 0x71, /* 0xCC-0xCF */ + 0xC2, 0xE7, 0xAA, 0xF7, 0x3F, 0x3F, 0xD0, 0xC1, /* 0xD0-0xD3 */ + 0xD0, 0xC0, 0xD4, 0x42, 0x3F, 0x3F, 0xB0, 0x78, /* 0xD4-0xD7 */ + 0xB0, 0x76, 0xB0, 0x7A, 0xD4, 0x44, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xB0, 0x79, 0xB0, 0x77, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0x43, 0xB3, 0xA8, /* 0xE0-0xE3 */ + 0xD7, 0xFC, 0x3F, 0x3F, 0xB3, 0xA7, 0xB3, 0xA9, /* 0xE4-0xE7 */ + 0xD8, 0x42, 0xB3, 0xAB, 0xD7, 0xFE, 0xD8, 0x40, /* 0xE8-0xEB */ + 0xD7, 0xF7, 0xB3, 0xAA, 0xD8, 0x43, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xD7, 0xF9, 0x3F, 0x3F, 0xD7, 0xFA, /* 0xF0-0xF3 */ + 0xD7, 0xF8, 0xB3, 0xA6, 0x3F, 0x3F, 0xD8, 0x41, /* 0xF4-0xF7 */ + 0xD7, 0xFB, 0xD7, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xDC, 0x6D, 0x3F, 0x3F, 0xDC, 0x6C, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_92[512] = { + 0xDC, 0x6A, 0xDC, 0x62, 0xDC, 0x71, 0xDC, 0x65, /* 0x00-0x03 */ + 0xDC, 0x6F, 0xDC, 0x76, 0xDC, 0x6E, 0xB6, 0x79, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xB6, 0x75, 0xDC, 0x63, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xDC, 0x69, 0xB6, 0x77, 0x3F, 0x3F, 0xDC, 0x68, /* 0x0C-0x0F */ + 0xB6, 0x78, 0xB6, 0x7A, 0xDC, 0x6B, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xB6, 0x72, 0xB6, 0x73, 0xDC, 0x77, 0xDC, 0x75, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xDC, 0x74, 0xDC, 0x66, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xDC, 0x72, 0x3F, 0x3F, 0xB6, 0x76, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0x74, /* 0x20-0x23 */ + 0xDC, 0x73, 0xDC, 0x64, 0xDC, 0x67, 0xDC, 0x70, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xE4, 0xBA, 0xE0, 0xB7, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xE0, 0xB0, 0xE0, 0xC3, 0xE0, 0xCC, 0xE0, 0xB3, /* 0x30-0x33 */ + 0xB9, 0x61, 0x3F, 0x3F, 0xE0, 0xC0, 0xB9, 0x57, /* 0x34-0x37 */ + 0xB9, 0x59, 0xB9, 0x65, 0xE0, 0xB1, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xB9, 0x5A, 0xB9, 0x5C, 0xB9, 0x66, /* 0x3C-0x3F */ + 0xB9, 0x5B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xB9, 0x64, 0xE0, 0xB9, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xE0, 0xAE, 0xB9, 0x62, 0xE0, 0xB8, 0xB9, 0x5E, /* 0x48-0x4B */ + 0xE0, 0xCA, 0xB9, 0x63, 0xE0, 0xC8, 0xE0, 0xBC, /* 0x4C-0x4F */ + 0xE0, 0xC6, 0xB9, 0x60, 0xE0, 0xAF, 0xE0, 0xC9, /* 0x50-0x53 */ + 0xE0, 0xC4, 0x3F, 0x3F, 0xE0, 0xCB, 0xB9, 0x58, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0x67, 0xB9, 0x5D, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xB5, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xE0, 0xBD, 0xE0, 0xC1, 0x3F, 0x3F, 0xE0, 0xC5, /* 0x60-0x63 */ + 0xB9, 0x5F, 0xE0, 0xB4, 0xE0, 0xB2, 0xE0, 0xBE, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE0, 0xBB, 0xE0, 0xBA, 0x3F, 0x3F, 0xE0, 0xBF, /* 0x6C-0x6F */ + 0xE0, 0xC2, 0x3F, 0x3F, 0xE0, 0xC7, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0x78, 0x3F, 0x3F, /* 0x74-0x77 */ + 0xBB, 0xC7, 0xE4, 0xA4, 0xE4, 0x7A, 0xBB, 0xCC, /* 0x78-0x7B */ + 0xBB, 0xD0, 0xE4, 0xAD, 0xE4, 0xB5, 0xE4, 0xA6, /* 0x7C-0x7F */ + + 0xBB, 0xC8, 0x3F, 0x3F, 0xE4, 0xAA, 0xE0, 0xB6, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xBB, 0xC9, 0xE4, 0xB1, 0xE4, 0xB6, /* 0x84-0x87 */ + 0xE4, 0xAE, 0x3F, 0x3F, 0xE4, 0xB0, 0xE4, 0xB9, /* 0x88-0x8B */ + 0xE4, 0xB2, 0xE4, 0x7E, 0xE4, 0xA9, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xBB, 0xD1, 0x3F, 0x3F, 0xBB, 0xCD, /* 0x90-0x93 */ + 0xE4, 0x7C, 0xE4, 0xAB, 0xBB, 0xCB, 0xE4, 0xA5, /* 0x94-0x97 */ + 0xBB, 0xCA, 0xE4, 0xB3, 0xE4, 0xA2, 0xE4, 0x79, /* 0x98-0x9B */ + 0xBB, 0xCE, 0xE4, 0xB8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xE4, 0x7B, 0xE4, 0xAF, 0xE4, 0xAC, 0xE4, 0xA7, /* 0xA0-0xA3 */ + 0xE4, 0x77, 0xE4, 0x76, 0xE4, 0xA1, 0xE4, 0xB4, /* 0xA4-0xA7 */ + 0xBB, 0xCF, 0xE4, 0xB7, 0xE4, 0x7D, 0xE4, 0xA3, /* 0xA8-0xAB */ + 0xBE, 0x52, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBE, 0x5A, 0xBE, 0x55, /* 0xB0-0xB3 */ + 0xE8, 0xA4, 0xE8, 0xA1, 0xE8, 0x67, 0xBE, 0x50, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xF9, 0xD7, 0x3F, 0x3F, 0xBE, 0x4F, /* 0xB8-0xBB */ + 0xBE, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xE8, 0x65, 0xBE, 0x54, 0xE8, 0x71, 0xE8, 0x63, /* 0xC0-0xC3 */ + 0xE8, 0x64, 0xBE, 0x4E, 0xE8, 0xA3, 0xBE, 0x58, /* 0xC4-0xC7 */ + 0xE8, 0x74, 0xE8, 0x79, 0xE8, 0x73, 0xEB, 0xEE, /* 0xC8-0xCB */ + 0xE8, 0x6F, 0xE8, 0x77, 0xE8, 0x75, 0xE8, 0x68, /* 0xCC-0xCF */ + 0xE8, 0x62, 0xE8, 0x7D, 0xBE, 0x57, 0xE8, 0x7E, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xE8, 0x78, 0x3F, 0x3F, 0xE8, 0x6D, /* 0xD4-0xD7 */ + 0xE8, 0x6B, 0xE8, 0x66, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0xE8, 0x6E, 0xE8, 0x7B, 0xE8, 0x6A, /* 0xDC-0xDF */ + 0xE8, 0x7A, 0xE8, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xBE, 0x53, 0x3F, 0x3F, 0xE8, 0x76, 0xE8, 0x7C, /* 0xE4-0xE7 */ + 0xE8, 0x72, 0xE8, 0x6C, 0xBE, 0x51, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xA8, 0xE8, 0x70, /* 0xEC-0xEF */ + 0xBE, 0x59, 0xE8, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xF4, /* 0xF4-0xF7 */ + 0xBF, 0xF7, 0xEB, 0xF3, 0xEB, 0xF0, 0xEC, 0x44, /* 0xF8-0xFB */ + 0xBF, 0xFB, 0x3F, 0x3F, 0xEC, 0x41, 0xEB, 0xF8, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_93[512] = { + 0xEC, 0x43, 0xEB, 0xE9, 0xEB, 0xF6, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xBF, 0xFD, 0x3F, 0x3F, 0xEB, 0xE1, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xEB, 0xDF, 0xEC, 0x42, 0x3F, 0x3F, 0xEC, 0x40, /* 0x08-0x0B */ + 0xEB, 0xFE, 0xEB, 0xED, 0xEB, 0xEC, 0xEB, 0xE2, /* 0x0C-0x0F */ + 0xC0, 0x40, 0x3F, 0x3F, 0xEB, 0xE8, 0xEB, 0xF2, /* 0x10-0x13 */ + 0xEB, 0xFD, 0xC0, 0x43, 0xEC, 0x45, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xC1, 0xE8, 0xC0, 0x45, 0xBF, 0xFE, 0xEB, 0xE6, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xEB, 0xEF, 0xEB, 0xDE, 0xEB, 0xE0, /* 0x1C-0x1F */ + 0xBF, 0xF5, 0xC0, 0x42, 0xBF, 0xFA, 0xEB, 0xE7, /* 0x20-0x23 */ + 0xEB, 0xF7, 0xEB, 0xF1, 0xC0, 0x41, 0xEB, 0xDD, /* 0x24-0x27 */ + 0xC1, 0xE3, 0xEB, 0xF9, 0xEB, 0xFC, 0xBF, 0xFC, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xEB, 0xEB, 0xC0, 0x44, 0xBF, 0xF9, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xBF, 0xF8, /* 0x30-0x33 */ + 0xEB, 0xF5, 0xEB, 0xFB, 0xBF, 0xF6, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xEB, 0xE4, 0xEB, 0xFA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xEB, 0xE5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEB, 0xEA, 0xEE, 0xD2, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xEE, 0xD7, 0xC1, 0xE5, 0xC1, 0xE7, /* 0x48-0x4B */ + 0xEE, 0xDD, 0xC1, 0xE1, 0xEE, 0xEC, 0xEE, 0xE3, /* 0x4C-0x4F */ + 0xEE, 0xD8, 0xEE, 0xD9, 0xEE, 0xE2, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xC1, 0xEE, 0xEE, 0xE1, 0xEE, 0xD1, 0xEE, 0xE0, /* 0x54-0x57 */ + 0xEE, 0xD4, 0xEE, 0xED, 0xC1, 0xED, 0xC1, 0xEB, /* 0x58-0x5B */ + 0xEE, 0xD5, 0x3F, 0x3F, 0xEE, 0xE8, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xEE, 0xDA, 0xEE, 0xE7, 0x3F, 0x3F, 0xEE, 0xE9, /* 0x60-0x63 */ + 0xEE, 0xD0, 0xC1, 0xE6, 0x3F, 0x3F, 0xEE, 0xEA, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xDE, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xC1, 0xEA, 0xEE, 0xDB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xC1, 0xEC, 0xEE, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xC1, 0xE4, 0xEE, 0xD6, 0xEE, 0xE5, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xEE, 0xDF, 0xEB, 0xE3, 0xEE, 0xE6, /* 0x78-0x7B */ + 0xEE, 0xD3, 0x3F, 0x3F, 0xC1, 0xE9, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xEE, 0xEB, 0x3F, 0x3F, 0xC1, 0xE2, 0xEE, 0xCE, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xF1, 0x60, 0xF1, 0x59, 0xC2, 0xE9, 0x3F, 0x3F, /* 0x88-0x8B */ + 0xF1, 0x54, 0xF1, 0x63, 0xF1, 0x5B, 0xEE, 0xDC, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xF1, 0x65, 0xF1, 0x55, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xC2, 0xE8, 0xF1, 0x5F, 0xC2, 0xEA, 0xC2, 0xF2, /* 0x94-0x97 */ + 0xC2, 0xF0, 0xF1, 0x61, 0xC2, 0xF1, 0xF1, 0x57, /* 0x98-0x9B */ + 0x3F, 0x3F, 0xF1, 0x58, 0xF1, 0x5D, 0xF1, 0x62, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xEE, 0xCD, 0xC2, 0xEB, 0xF1, 0x6A, /* 0xA0-0xA3 */ + 0xF1, 0x67, 0xF1, 0x6B, 0xF1, 0x5E, 0xF1, 0x5A, /* 0xA4-0xA7 */ + 0xF1, 0x68, 0xF3, 0x6A, 0xF1, 0x5C, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xC2, 0xEE, 0x3F, 0x3F, 0xC2, 0xED, 0xEE, 0xCF, /* 0xAC-0xAF */ + 0xC2, 0xEF, 0xF1, 0x64, 0xF1, 0x66, 0xC2, 0xEC, /* 0xB0-0xB3 */ + 0xF1, 0x69, 0xF1, 0x53, 0x3F, 0x3F, 0xF1, 0x56, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xF3, 0x73, 0x3F, 0x3F, 0xF3, 0x63, 0xC3, 0xEB, /* 0xC0-0xC3 */ + 0xF3, 0x71, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0x61, /* 0xC4-0xC7 */ + 0xC3, 0xEC, 0x3F, 0x3F, 0xF3, 0x6C, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xF3, 0x68, 0xC3, 0xF1, 0xF3, 0x72, 0xF3, 0x62, /* 0xCC-0xCF */ + 0xF3, 0x65, 0xC3, 0xE9, 0xF3, 0x74, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0xF3, 0x6D, 0xF3, 0x70, 0xC3, 0xEF, 0xC3, 0xF4, /* 0xD4-0xD7 */ + 0xC3, 0xF2, 0xF3, 0x69, 0xF3, 0x64, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xC3, 0xED, 0xC3, 0xEE, 0xF3, 0x60, 0xC3, 0xEA, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xC3, 0xE8, 0xC3, 0xF0, 0xF3, 0x6F, /* 0xE0-0xE3 */ + 0xC3, 0xF3, 0x3F, 0x3F, 0xF3, 0x6B, 0xF3, 0x75, /* 0xE4-0xE7 */ + 0xC3, 0xF5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xF3, 0x67, 0x3F, 0x3F, 0xF3, 0x6E, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xF4, 0xF3, 0xF5, 0x42, 0xF4, 0xF5, /* 0xF4-0xF7 */ + 0xF4, 0xFC, 0xF3, 0x66, 0xF4, 0xFA, 0xF4, 0xE9, /* 0xF8-0xFB */ + 0xF5, 0x40, 0xC4, 0xC3, 0xF4, 0xED, 0xF4, 0xFE, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_94[512] = { + 0xF4, 0xF4, 0x3F, 0x3F, 0x3F, 0x3F, 0xC4, 0xC2, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0x44, 0xF4, 0xF6, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF4, 0xFB, 0xF4, 0xFD, 0xF4, 0xE7, /* 0x08-0x0B */ + 0xF5, 0x41, 0xF4, 0xF2, 0xF4, 0xF7, 0xF4, 0xEB, /* 0x0C-0x0F */ + 0xF4, 0xEF, 0xF5, 0x43, 0xF4, 0xF9, 0xF4, 0xE8, /* 0x10-0x13 */ + 0xF4, 0xEC, 0xF4, 0xEE, 0xF4, 0xF8, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xC4, 0xC1, 0xF4, 0xF1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xF4, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xF4, 0xF0, 0xF6, 0x61, 0xF6, 0x66, 0xC5, 0x4F, /* 0x28-0x2B */ + 0xF6, 0x68, 0x3F, 0x3F, 0xC5, 0x49, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xF6, 0x64, 0xF6, 0x6A, 0xC5, 0x4E, 0xC5, 0x4A, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xC5, 0x4B, 0xF6, 0x60, 0xF6, 0x67, /* 0x34-0x37 */ + 0xC5, 0x4D, 0xF6, 0x65, 0xC5, 0x4C, 0xF6, 0x5F, /* 0x38-0x3B */ + 0xF6, 0x63, 0xF6, 0x62, 0x3F, 0x3F, 0xF6, 0x5E, /* 0x3C-0x3F */ + 0xF6, 0x69, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xC5, 0xB1, 0xF7, 0x6D, 0xF7, 0x70, 0xF7, 0x6C, /* 0x44-0x47 */ + 0xF7, 0x6E, 0xF7, 0x6F, 0xF7, 0x69, 0xF7, 0x6A, /* 0x48-0x4B */ + 0xF7, 0x67, 0x3F, 0x3F, 0x3F, 0x3F, 0xF7, 0x6B, /* 0x4C-0x4F */ + 0xF7, 0x68, 0xC5, 0xB2, 0xC5, 0xB3, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0xF8, 0x4B, 0x3F, 0x3F, 0xF8, 0x4D, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0xF8, 0x4C, 0xF8, 0x4E, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xC5, 0xE0, 0x3F, 0x3F, 0xF8, 0x4A, 0xC5, 0xDF, /* 0x60-0x63 */ + 0xC5, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xF8, 0xCB, 0xF8, 0xCC, 0xC6, 0x44, 0xF8, 0xCA, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xF9, 0x53, 0xF9, 0x52, 0xF9, 0x54, /* 0x6C-0x6F */ + 0xC6, 0x5F, 0xF9, 0x55, 0xC6, 0x5E, 0xF9, 0x56, /* 0x70-0x73 */ + 0xF9, 0x72, 0xF9, 0x75, 0xF9, 0x74, 0xC6, 0x68, /* 0x74-0x77 */ + 0xF9, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xC6, 0x72, 0xC6, 0x70, 0xC6, 0x71, 0xC6, 0x77, /* 0x7C-0x7F */ + + 0xF9, 0xC0, 0xF9, 0xC1, 0xF9, 0xBF, 0xF9, 0xC9, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_95[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAA, 0xF8, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0x44, 0xDC, 0x78, /* 0x78-0x7B */ + 0xE8, 0xA5, 0xF3, 0x76, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xAA, 0xF9, 0x3F, 0x3F, 0xAD, 0xAC, 0xB0, 0x7B, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0x45, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xD8, 0x46, 0xB3, 0xAC, 0x3F, 0x3F, 0xB6, 0x7D, /* 0x88-0x8B */ + 0xDC, 0x7A, 0xDC, 0x79, 0xB6, 0xA3, 0xB6, 0x7C, /* 0x8C-0x8F */ + 0xDC, 0x7B, 0xB6, 0x7E, 0xB6, 0xA2, 0xB6, 0xA1, /* 0x90-0x93 */ + 0xB6, 0x7B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xB9, 0x68, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xD0, /* 0x98-0x9B */ + 0xE0, 0xCE, 0x3F, 0x3F, 0xE0, 0xCF, 0xE0, 0xCD, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xBB, 0xD2, 0x3F, 0x3F, 0xBB, 0xD5, /* 0xA0-0xA3 */ + 0xBB, 0xD7, 0xBB, 0xD6, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xBB, 0xD3, 0xBB, 0xD4, 0x3F, 0x3F, 0xE8, 0xA7, /* 0xA8-0xAB */ + 0xE8, 0xA6, 0xBE, 0x5B, 0xE8, 0xA8, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xE8, 0xA9, 0xBE, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xEC, 0x4D, 0xEC, 0x4B, 0xEE, 0xF3, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xEC, 0x49, 0xEC, 0x4A, 0xC0, 0x46, /* 0xB8-0xBB */ + 0xEC, 0x46, 0xEC, 0x4E, 0xEC, 0x48, 0xEC, 0x4C, /* 0xBC-0xBF */ + 0xEE, 0xEF, 0x3F, 0x3F, 0x3F, 0x3F, 0xEE, 0xF1, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xEE, 0xF2, 0xC1, 0xF3, 0xEE, 0xEE, /* 0xC4-0xC7 */ + 0xC1, 0xF2, 0xEE, 0xF0, 0xC1, 0xEF, 0xC1, 0xF0, /* 0xC8-0xCB */ + 0xC1, 0xF1, 0xEC, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0xC2, 0xF5, 0xF1, 0x6E, 0xF1, 0x6C, 0xF1, 0x6D, /* 0xD0-0xD3 */ + 0xC2, 0xF3, 0xC2, 0xF6, 0xC2, 0xF4, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0x77, 0xF3, 0x78, /* 0xD8-0xDB */ + 0xC3, 0xF6, 0x3F, 0x3F, 0xF5, 0x45, 0xF5, 0x47, /* 0xDC-0xDF */ + 0xF5, 0x46, 0xC4, 0xC4, 0xC5, 0x50, 0xF6, 0x6D, /* 0xE0-0xE3 */ + 0xF6, 0x6C, 0xF6, 0x6B, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_96[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xAA, 0xFA, 0x3F, 0x3F, 0xC9, 0xAA, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xCA, 0x58, 0xA6, 0xE9, 0xCA, 0x56, 0xCA, 0x59, /* 0x20-0x23 */ + 0xCA, 0x57, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xCB, 0xAE, 0x3F, 0x3F, 0xA8, 0xC1, 0x3F, 0x3F, /* 0x28-0x2B */ + 0xA8, 0xC2, 0xCB, 0xB0, 0xA8, 0xBF, 0xCB, 0xAF, /* 0x2C-0x2F */ + 0xCB, 0xAD, 0xA8, 0xC0, 0xA8, 0xBE, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xCD, 0xD8, 0xCD, 0xDB, 0xAA, 0xFD, /* 0x38-0x3B */ + 0xCD, 0xDA, 0xCD, 0xD9, 0x3F, 0x3F, 0xAA, 0xFC, /* 0x3C-0x3F */ + 0xAA, 0xFB, 0x3F, 0x3F, 0xAB, 0x40, 0xCD, 0xDC, /* 0x40-0x43 */ + 0xAA, 0xFE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xD0, 0xC6, 0xAD, 0xAE, /* 0x48-0x4B */ + 0xAD, 0xAF, 0xAD, 0xB0, 0xD0, 0xC7, 0xD0, 0xC3, /* 0x4C-0x4F */ + 0xAD, 0xAD, 0xD0, 0xC4, 0x3F, 0x3F, 0xD0, 0xC5, /* 0x50-0x53 */ + 0xD0, 0xC2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xB0, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xA1, /* 0x58-0x5B */ + 0xD4, 0x45, 0xB0, 0xA2, 0xB0, 0xA5, 0xD4, 0x46, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xB0, 0x7E, 0xB0, 0x7C, 0xB0, 0x7D, /* 0x60-0x63 */ + 0xB0, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xAD, 0xD8, 0x49, /* 0x68-0x6B */ + 0xB3, 0xB5, 0xD8, 0x48, 0x3F, 0x3F, 0xD8, 0x4B, /* 0x6C-0x6F */ + 0xB3, 0xB1, 0xD8, 0x4A, 0xB6, 0xAB, 0xB3, 0xAF, /* 0x70-0x73 */ + 0xB3, 0xB2, 0xB3, 0xAE, 0xB3, 0xB3, 0xB3, 0xB4, /* 0x74-0x77 */ + 0xB3, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xD8, 0x47, 0xB6, 0xA7, 0xDC, 0x7D, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xDC, 0xA3, 0x3F, 0x3F, 0x3F, 0x3F, 0xDC, 0xA2, /* 0x80-0x83 */ + 0xB6, 0xAC, 0xB6, 0xA8, 0xB6, 0xA9, 0xDC, 0x7C, /* 0x84-0x87 */ + 0xDC, 0x7E, 0xDC, 0xA1, 0xB6, 0xA4, 0xB6, 0xA6, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xB6, 0xAA, 0xB6, 0xA5, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xE0, 0xD3, 0xE0, 0xD1, 0xE0, 0xD2, /* 0x90-0x93 */ + 0xB9, 0x6A, 0xB9, 0x6B, 0x3F, 0x3F, 0xE0, 0xD4, /* 0x94-0x97 */ + 0xB9, 0x69, 0xBB, 0xD8, 0x3F, 0x3F, 0xBB, 0xDA, /* 0x98-0x9B */ + 0xBB, 0xD9, 0x3F, 0x3F, 0xE4, 0xBB, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xE4, 0xBC, 0xE8, 0xAB, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xE8, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0x47, /* 0xA4-0xA7 */ + 0xC0, 0x48, 0xEC, 0x4F, 0xC0, 0x49, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xEE, 0xF6, 0x3F, 0x3F, 0xEE, 0xF4, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xEE, 0xF5, 0xC1, 0xF4, 0x3F, 0x3F, 0xF1, 0x6F, /* 0xB0-0xB3 */ + 0xC3, 0xF7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xC1, 0xF5, 0xAB, 0x41, 0x3F, 0x3F, 0xB0, 0xA6, /* 0xB8-0xBB */ + 0xD4, 0x47, 0x3F, 0x3F, 0x3F, 0x3F, 0xD8, 0x4C, /* 0xBC-0xBF */ + 0xB3, 0xB6, 0xB6, 0xAD, 0xDC, 0xA4, 0xDC, 0xA6, /* 0xC0-0xC3 */ + 0xB6, 0xAF, 0xB6, 0xAE, 0xB6, 0xB0, 0xB6, 0xB1, /* 0xC4-0xC7 */ + 0xDC, 0xA5, 0xB9, 0x6E, 0xB9, 0x6F, 0xB9, 0x6D, /* 0xC8-0xCB */ + 0xBB, 0xDB, 0xB9, 0x6C, 0xE0, 0xD5, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBB, 0xDC, 0xE8, 0xAC, /* 0xD0-0xD3 */ + 0xEC, 0x50, 0xC0, 0x4A, 0xC1, 0xF6, 0xF1, 0x70, /* 0xD4-0xD7 */ + 0xF1, 0x74, 0xC2, 0xF9, 0xF1, 0x71, 0xC2, 0xFA, /* 0xD8-0xDB */ + 0xC2, 0xF8, 0xF1, 0x75, 0xC2, 0xFB, 0xF1, 0x73, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xF3, 0x79, 0xC2, 0xF7, 0xC3, 0xF8, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xF8, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xAB, 0x42, 0xB3, 0xB8, 0xB3, 0xB7, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xB2, /* 0xEC-0xEF */ + 0xDC, 0xA8, 0xDC, 0xA7, 0xB6, 0xB3, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0xE0, 0xD9, 0xB9, 0x73, 0xB9, 0x70, /* 0xF4-0xF7 */ + 0xE0, 0xD8, 0xB9, 0x72, 0xE0, 0xD6, 0xB9, 0x71, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xE0, 0xD7, 0x3F, 0x3F, 0xE4, 0xBD, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_97[512] = { + 0xBB, 0xDD, 0x3F, 0x3F, 0xE8, 0xAF, 0x3F, 0x3F, /* 0x00-0x03 */ + 0xBE, 0x5D, 0xE8, 0xAD, 0xBE, 0x5E, 0xBE, 0x5F, /* 0x04-0x07 */ + 0xE8, 0xAE, 0xBE, 0x60, 0x3F, 0x3F, 0xEC, 0x51, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xC0, 0x4E, 0xC0, 0x4B, 0xC0, 0x50, /* 0x0C-0x0F */ + 0xEC, 0x53, 0xC0, 0x4C, 0xEC, 0x52, 0xC0, 0x4F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0x4D, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xEE, 0xF9, 0xEE, 0xFB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xC1, 0xF7, 0xEE, 0xFA, 0xC1, 0xF8, 0xEE, 0xF8, /* 0x1C-0x1F */ + 0xEE, 0xF7, 0x3F, 0x3F, 0xF1, 0x77, 0xF1, 0x76, /* 0x20-0x23 */ + 0xC2, 0xFC, 0xF1, 0x78, 0xF3, 0x7E, 0xC3, 0xFA, /* 0x24-0x27 */ + 0xF3, 0x7D, 0xF3, 0x7A, 0xC3, 0xF9, 0xF3, 0x7B, /* 0x28-0x2B */ + 0xF3, 0x7C, 0x3F, 0x3F, 0xF5, 0x48, 0xF5, 0x49, /* 0x2C-0x2F */ + 0xC4, 0xC5, 0x3F, 0x3F, 0xC5, 0x53, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF6, 0x6E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0xC5, 0x51, 0xC5, 0x52, 0xF6, 0x6F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xC5, 0xB4, 0xC5, 0xB5, 0xF7, 0x71, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC6, 0x45, 0xF8, 0xCF, /* 0x40-0x43 */ + 0xC6, 0x47, 0x3F, 0x3F, 0xF8, 0xCE, 0xF8, 0xD0, /* 0x44-0x47 */ + 0xC6, 0x46, 0xF9, 0x57, 0x3F, 0x3F, 0xF9, 0xAD, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAB, 0x43, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0x74, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xE4, 0xBE, 0x3F, 0x3F, 0xE8, 0xB0, 0xC0, 0x51, /* 0x58-0x5B */ + 0xC0, 0x52, 0x3F, 0x3F, 0xAB, 0x44, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0xBE, 0x61, 0xC3, 0xFB, 0xAD, 0xB1, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0x53, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xC5, 0xE2, 0xAD, 0xB2, 0xD8, 0x4D, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xDC, 0xA9, 0x3F, 0x3F, 0xDC, 0xAB, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0xDC, 0xAA, 0x3F, 0x3F, 0xE0, 0xDD, 0xE0, 0xDA, /* 0x70-0x73 */ + 0xB9, 0x75, 0x3F, 0x3F, 0xB9, 0x76, 0xE0, 0xDB, /* 0x74-0x77 */ + 0xE0, 0xDC, 0x3F, 0x3F, 0xE4, 0xC0, 0xE4, 0xC5, /* 0x78-0x7B */ + 0xBB, 0xDE, 0xE4, 0xBF, 0xE4, 0xC1, 0xE4, 0xC8, /* 0x7C-0x7F */ + + 0xE4, 0xC3, 0xE4, 0xC7, 0xE4, 0xC4, 0xE4, 0xC2, /* 0x80-0x83 */ + 0xE4, 0xC6, 0xBB, 0xDF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0xE8, 0xB3, 0x3F, 0x3F, 0xE8, 0xB1, 0xBE, 0x63, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xBE, 0x62, 0xE8, 0xB2, 0xBE, 0x64, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xEC, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0x55, /* 0x94-0x97 */ + 0xC0, 0x54, 0xEC, 0x54, 0xEE, 0xFC, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xEE, 0xFE, 0xEF, 0x41, 0xEF, 0x40, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xC1, 0xF9, 0xEE, 0xFD, 0xF1, 0xA1, 0xC2, 0xFD, /* 0xA0-0xA3 */ + 0xF1, 0x7D, 0xF1, 0xA2, 0xC2, 0xFE, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xF1, 0x7B, 0x3F, 0x3F, 0xF1, 0x7E, 0xF1, 0x7C, /* 0xA8-0xAB */ + 0xF1, 0x79, 0xC3, 0x40, 0xF1, 0x7A, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xA1, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xA3, 0xF3, 0xA2, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xF5, 0x4A, 0x3F, 0x3F, 0xF5, 0x4B, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0x70, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xC5, 0xB7, 0x3F, 0x3F, 0xC5, 0xB6, /* 0xC0-0xC3 */ + 0xF8, 0x4F, 0xF8, 0x50, 0xC6, 0x48, 0xF8, 0xD1, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xC6, 0x69, 0x3F, 0x3F, 0xAD, 0xB3, /* 0xC8-0xCB */ + 0xB6, 0xB4, 0xE4, 0xCA, 0xE4, 0xC9, 0xE8, 0xB5, /* 0xCC-0xCF */ + 0xE8, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, 0xC1, 0xFA, /* 0xD0-0xD3 */ + 0xEF, 0x43, 0xEF, 0x42, 0xF1, 0xA5, 0xF1, 0xA3, /* 0xD4-0xD7 */ + 0xF1, 0xA6, 0xF1, 0xA4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xC3, 0xFC, 0xF3, 0xA4, 0xF3, 0xA5, 0xF3, 0xA6, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xF6, 0x71, 0x3F, 0x3F, 0xF7, 0x72, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xF8, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xAD, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xEC, 0x57, 0xEF, 0x44, 0x3F, 0x3F, 0xAD, 0xB5, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBB, 0xE0, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0xEC, 0x58, 0xC3, 0x41, 0xF1, 0xA7, 0xC3, 0xFD, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xF5, 0x4C, 0xF5, 0x4D, 0xC5, 0x54, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_98[512] = { + 0xF8, 0x51, 0xAD, 0xB6, 0xB3, 0xBB, 0xB3, 0xBC, /* 0x00-0x03 */ + 0xD8, 0x4E, 0xB6, 0xB5, 0xB6, 0xB6, 0xDC, 0xAC, /* 0x04-0x07 */ + 0xB6, 0xB7, 0x3F, 0x3F, 0xB9, 0x7A, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xB9, 0x7C, 0xE0, 0xDF, 0xE0, 0xE0, 0xE0, 0xDE, /* 0x0C-0x0F */ + 0xB9, 0x77, 0xB9, 0x78, 0xB9, 0x7B, 0xB9, 0x79, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xCB, 0xBB, 0xE1, /* 0x14-0x17 */ + 0xBB, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xBC, /* 0x18-0x1B */ + 0xBE, 0x67, 0xE8, 0xB7, 0xE8, 0xB6, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xE8, 0xBB, 0xBE, 0x65, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xC0, 0x5B, 0x3F, 0x3F, 0xE8, 0xB8, 0xE8, 0xBD, /* 0x24-0x27 */ + 0xE8, 0xBA, 0xE8, 0xB9, 0x3F, 0x3F, 0xBE, 0x66, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xC0, 0x59, 0x3F, 0x3F, 0xEC, 0x5A, /* 0x2C-0x2F */ + 0xC0, 0x55, 0x3F, 0x3F, 0xEC, 0x5B, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xEC, 0x59, 0x3F, 0x3F, 0xC0, 0x58, /* 0x34-0x37 */ + 0xC0, 0x56, 0xC0, 0x5A, 0x3F, 0x3F, 0xC0, 0x57, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xEF, 0x45, 0x3F, 0x3F, 0xEF, 0x4A, /* 0x40-0x43 */ + 0xEF, 0x46, 0xEF, 0x49, 0xC1, 0xFB, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xED, 0xD4, 0xEF, 0x48, 0xEF, 0x47, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xC3, 0x44, 0xC3, 0x42, 0xC3, 0x45, 0xC3, 0x43, /* 0x4C-0x4F */ + 0xF1, 0xA8, 0xF1, 0xA9, 0xF1, 0xAA, 0xC3, 0x46, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xAA, /* 0x54-0x57 */ + 0xC4, 0x40, 0xF3, 0xA8, 0x3F, 0x3F, 0xC4, 0x41, /* 0x58-0x5B */ + 0xF3, 0xA7, 0xF3, 0xA9, 0xC3, 0xFE, 0xF5, 0x51, /* 0x5C-0x5F */ + 0xF5, 0x4E, 0x3F, 0x3F, 0xF5, 0x4F, 0xF5, 0x50, /* 0x60-0x63 */ + 0xF6, 0x72, 0xC5, 0x56, 0x3F, 0x3F, 0xC5, 0x55, /* 0x64-0x67 */ + 0x3F, 0x3F, 0xF7, 0x74, 0xF7, 0x73, 0xC5, 0xB8, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0xE3, /* 0x6C-0x6F */ + 0xC6, 0x49, 0xC6, 0x60, 0xF9, 0x58, 0xF9, 0xAE, /* 0x70-0x73 */ + 0xF9, 0xAF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xAD, 0xB7, 0xDC, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xE0, 0xE1, 0xE4, 0xCC, 0xE4, 0xCD, 0xBB, 0xE3, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xBB, 0xE4, 0xE8, 0xBE, 0xBE, 0x68, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC1, 0xFC, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xF1, 0xAB, 0x3F, 0x3F, 0xC3, 0x47, 0xF3, 0xAD, /* 0xB8-0xBB */ + 0xC4, 0x42, 0xF3, 0xAC, 0xF3, 0xAE, 0xF3, 0xAB, /* 0xBC-0xBF */ + 0xF6, 0x75, 0xF5, 0x52, 0xF5, 0x53, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0xC4, 0xC6, 0x3F, 0x3F, 0xF6, 0x74, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xF6, 0x73, 0x3F, 0x3F, 0xF7, 0x75, /* 0xC8-0xCB */ + 0xF9, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xB8, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xB9, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB0, 0xA7, 0xD4, 0x48, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xD8, 0x4F, 0x3F, 0x3F, 0xB6, 0xB8, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xB6, 0xBB, 0xB6, 0xB9, 0xDC, 0xAE, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xB6, 0xBD, 0x3F, 0x3F, 0xB6, 0xBA, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB6, 0xBC, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xB9, 0x7E, 0x3F, 0x3F, 0xE0, 0xE2, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xE0, 0xE3, 0xE8, 0xC0, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0xB9, 0x7D, 0xB9, 0xA1, 0xB9, 0xA2, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_99[512] = { + 0xE4, 0xCF, 0x3F, 0x3F, 0xE4, 0xCE, 0xBB, 0xE5, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xBB, 0xE6, 0x3F, 0x3F, 0xE4, 0xD0, /* 0x04-0x07 */ + 0xE8, 0xBF, 0xBB, 0xE8, 0xBE, 0x69, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xBB, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xC0, 0x5C, 0xE8, 0xC1, 0xBE, 0x6B, 0xBE, 0x6A, /* 0x10-0x13 */ + 0xE8, 0xC2, 0xE8, 0xC5, 0xE8, 0xC3, 0xE8, 0xC4, /* 0x14-0x17 */ + 0xBE, 0x6C, 0x3F, 0x3F, 0xC0, 0x61, 0xC0, 0x5F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0x5E, 0xEC, 0x5D, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xC0, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0xEC, 0x5C, 0xEF, 0x4B, 0x3F, 0x3F, 0xEC, 0x5E, /* 0x24-0x27 */ + 0xC0, 0x5D, 0xEC, 0x5F, 0xEF, 0x4E, 0xEF, 0x4C, /* 0x28-0x2B */ + 0xEF, 0x4D, 0xEF, 0x52, 0xC3, 0x4B, 0xEF, 0x51, /* 0x2C-0x2F */ + 0xEF, 0x54, 0xEF, 0x53, 0xEF, 0x50, 0xEF, 0x4F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xC1, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xAE, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xF1, 0xAD, 0xC3, 0x4A, 0xC3, 0x48, 0xC3, 0x49, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xF1, 0xAC, 0x3F, 0x3F, 0xF3, 0xB1, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xC4, 0x43, 0x3F, 0x3F, 0xF3, 0xB0, /* 0x44-0x47 */ + 0xF3, 0xAF, 0xC4, 0x44, 0x3F, 0x3F, 0xF5, 0x58, /* 0x48-0x4B */ + 0xF5, 0x57, 0x3F, 0x3F, 0xF5, 0x55, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF5, 0x54, 0xC4, 0xC8, 0xC4, 0xC7, 0xF5, 0x59, /* 0x50-0x53 */ + 0xF7, 0x76, 0xC5, 0xB9, 0xF6, 0x77, 0xC5, 0x57, /* 0x54-0x57 */ + 0xF6, 0x76, 0xF5, 0x56, 0x3F, 0x3F, 0xF7, 0x77, /* 0x58-0x5B */ + 0xC5, 0xE4, 0x3F, 0x3F, 0xC6, 0x61, 0xF9, 0x59, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0xF9, 0xB1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xAD, 0xBA, 0xD8, 0x50, /* 0x94-0x97 */ + 0xEF, 0x55, 0xAD, 0xBB, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xE4, 0xD2, 0xE4, 0xD1, 0xEC, 0x60, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0xEF, 0x57, 0x3F, 0x3F, 0xEF, 0x56, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0xC3, 0x4C, 0xF3, 0xB2, 0xF3, 0xB3, /* 0xA4-0xA7 */ + 0xC4, 0xC9, 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xB2, /* 0xA8-0xAB */ + 0xB0, 0xA8, 0xB6, 0xBF, 0xB6, 0xBE, 0xE0, 0xE4, /* 0xAC-0xAF */ + 0xE0, 0xE6, 0xB9, 0xA4, 0xE0, 0xE5, 0xB9, 0xA3, /* 0xB0-0xB3 */ + 0xB9, 0xA5, 0xE0, 0xE7, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0xE4, 0xD4, 0xE4, 0xD6, 0xE4, 0xD5, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xE4, 0xD8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xBB, 0xE9, 0xE4, 0xD7, 0xE4, 0xD3, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xD9, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0xE8, 0xCC, 0x3F, 0x3F, 0xE8, 0xCF, /* 0xC8-0xCB */ + 0xE8, 0xD1, 0xE8, 0xC7, 0xE8, 0xCB, 0xE8, 0xC8, /* 0xCC-0xCF */ + 0xBE, 0x6E, 0xBE, 0x71, 0xBE, 0x73, 0xE8, 0xC9, /* 0xD0-0xD3 */ + 0xE8, 0xCA, 0xBE, 0x72, 0xE8, 0xCD, 0xE8, 0xD0, /* 0xD4-0xD7 */ + 0xE8, 0xCE, 0xBE, 0x74, 0x3F, 0x3F, 0xBE, 0x70, /* 0xD8-0xDB */ + 0xE8, 0xC6, 0xBE, 0x6D, 0x3F, 0x3F, 0xBE, 0x6F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0x63, 0xEC, 0x66, /* 0xE0-0xE3 */ + 0xEC, 0x64, 0xEC, 0x63, 0x3F, 0x3F, 0xEC, 0x69, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xEC, 0x68, 0xEC, 0x67, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0xEC, 0x62, 0xC0, 0x62, 0xEC, 0x61, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xEC, 0x65, 0xC0, 0x64, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0xEF, 0x5A, 0x3F, 0x3F, 0xEF, 0x5E, 0xEF, 0x5B, /* 0xF4-0xF7 */ + 0xEF, 0x5D, 0xEF, 0x5C, 0xEF, 0x59, 0xEF, 0x5F, /* 0xF8-0xFB */ + 0xEF, 0x62, 0xEF, 0x60, 0xEF, 0x61, 0xC2, 0x40, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9A[512] = { + 0x3F, 0x3F, 0xC1, 0xFE, 0xEF, 0x58, 0xEF, 0x63, /* 0x00-0x03 */ + 0xF1, 0xB3, 0xF1, 0xB6, 0xF1, 0xB8, 0xF1, 0xB7, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF1, 0xB1, 0xF1, 0xB5, 0xF1, 0xB0, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xF1, 0xB2, 0xC3, 0x4D, 0xF1, 0xAF, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0xF1, 0xB4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xF3, 0xC0, 0xF3, 0xB5, 0xC4, 0x45, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xC4, 0x46, 0xF3, 0xB4, 0xF3, 0xB9, /* 0x18-0x1B */ + 0xF3, 0xBF, 0xF3, 0xB7, 0xF3, 0xBE, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xF3, 0xBB, 0x3F, 0x3F, 0xF3, 0xBA, 0xF3, 0xBD, /* 0x20-0x23 */ + 0xF3, 0xB8, 0xF3, 0xB6, 0x3F, 0x3F, 0xF3, 0xBC, /* 0x24-0x27 */ + 0x3F, 0x3F, 0xF5, 0x60, 0xF5, 0x5E, 0xC4, 0xCA, /* 0x28-0x2B */ + 0xF5, 0x5D, 0xF5, 0x63, 0xF5, 0x61, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xC4, 0xCB, 0xF5, 0x5C, 0xF5, 0x5A, 0x3F, 0x3F, /* 0x30-0x33 */ + 0xF5, 0x5B, 0xC4, 0xCD, 0xF5, 0x5F, 0xC4, 0xCC, /* 0x34-0x37 */ + 0xF5, 0x62, 0xF6, 0x78, 0xF6, 0x7E, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xF6, 0x79, 0xC5, 0x5B, 0xF6, 0xA1, /* 0x3C-0x3F */ + 0xC5, 0x5A, 0xF6, 0x7D, 0xF6, 0x7C, 0xC5, 0x59, /* 0x40-0x43 */ + 0xF6, 0x7B, 0xC5, 0x58, 0xF6, 0x7A, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xF7, 0x7D, 0xF7, 0xA1, 0xF7, 0x7E, 0x3F, 0x3F, /* 0x48-0x4B */ + 0xF7, 0x7B, 0xC5, 0xBB, 0xF7, 0x78, 0xF7, 0x7C, /* 0x4C-0x4F */ + 0xF7, 0xA3, 0x3F, 0x3F, 0xF7, 0xA2, 0xF7, 0x79, /* 0x50-0x53 */ + 0xF7, 0x7A, 0xC5, 0xBA, 0xF8, 0x52, 0xC5, 0xE7, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xF8, 0x53, 0xC5, 0xE5, 0xC5, 0xE6, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xD3, 0xC6, 0x4A, /* 0x5C-0x5F */ + 0xF9, 0x76, 0x3F, 0x3F, 0xC6, 0x6A, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xF9, 0xB3, 0xC6, 0x6B, 0xF9, 0xB4, 0xF9, 0xB5, /* 0x64-0x67 */ + 0xF9, 0xC3, 0xF9, 0xC2, 0xC6, 0x7A, 0xF9, 0xCD, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xB0, 0xA9, 0x3F, 0x3F, 0x3F, 0x3F, 0xE0, 0xE9, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xE0, 0xE8, 0x3F, 0x3F, 0xBB, 0xEA, /* 0xAC-0xAF */ + 0xBB, 0xEB, 0xE4, 0xDA, 0x3F, 0x3F, 0xE8, 0xD2, /* 0xB0-0xB3 */ + 0xEC, 0x6C, 0x3F, 0x3F, 0x3F, 0x3F, 0xBE, 0x75, /* 0xB4-0xB7 */ + 0xC0, 0x65, 0xEC, 0x6A, 0x3F, 0x3F, 0xEC, 0x6D, /* 0xB8-0xBB */ + 0xC0, 0x66, 0x3F, 0x3F, 0xEF, 0x64, 0xEC, 0x6B, /* 0xBC-0xBF */ + 0xF1, 0xB9, 0xC3, 0x4E, 0xF3, 0xC1, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0x66, 0xF5, 0x64, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0x65, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0xF6, 0xA2, 0x3F, 0x3F, 0xC5, 0x5C, /* 0xCC-0xCF */ + 0xF7, 0xA4, 0xC5, 0xEA, 0xC5, 0xBC, 0xC5, 0xE8, /* 0xD0-0xD3 */ + 0xC5, 0xE9, 0xF8, 0xD4, 0xC6, 0x62, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xB0, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0xF1, 0xBA, 0x3F, 0x3F, 0x3F, 0x3F, 0xD4, 0x49, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xB9, 0xA6, 0x3F, 0x3F, 0xE4, 0xDB, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBB, 0xEC, 0xE4, 0xDC, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE8, 0xD4, /* 0xE8-0xEB */ + 0xE8, 0xD3, 0xC0, 0x68, 0xBE, 0x76, 0xBE, 0x77, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xE8, 0xD7, 0xE8, 0xD6, 0xE8, 0xD5, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0x6E, 0xEC, 0x71, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xEC, 0x70, 0xEC, 0x6F, 0xC0, 0x67, /* 0xF8-0xFB */ + 0xEF, 0x68, 0xEF, 0x66, 0xEF, 0x65, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9B[512] = { + 0x3F, 0x3F, 0xEF, 0x67, 0x3F, 0x3F, 0xC3, 0x4F, /* 0x00-0x03 */ + 0xF1, 0xBC, 0xF1, 0xBD, 0xC3, 0x50, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xF1, 0xBB, 0x3F, 0x3F, 0xF3, 0xC3, 0xF3, 0xC2, /* 0x08-0x0B */ + 0xF3, 0xC5, 0xC4, 0x47, 0xF3, 0xC4, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xF5, 0x67, 0xF5, 0x69, 0xF5, 0x68, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xF6, 0xA3, 0xF6, 0xA6, 0xF6, 0xA4, /* 0x14-0x17 */ + 0xF6, 0xA5, 0xF7, 0xA5, 0xC5, 0xBD, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0x54, 0xF8, 0x55, /* 0x1C-0x1F */ + 0xF8, 0x56, 0x3F, 0x3F, 0xC6, 0x4B, 0xC6, 0x63, /* 0x20-0x23 */ + 0xF9, 0xB6, 0xB0, 0xAB, 0x3F, 0x3F, 0xBE, 0x78, /* 0x24-0x27 */ + 0xC0, 0x69, 0xF1, 0xBE, 0x3F, 0x3F, 0xF7, 0xA6, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xC4, 0xD4, 0x4A, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xC6, 0x7B, 0xB0, 0xAC, 0xEC, 0x72, /* 0x30-0x33 */ + 0x3F, 0x3F, 0xF1, 0xBF, 0x3F, 0x3F, 0xF3, 0xC6, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xA7, 0xF7, 0xA7, /* 0x38-0x3B */ + 0xB0, 0xAD, 0x3F, 0x3F, 0xE4, 0xDD, 0xE4, 0xDE, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xBB, 0xED, 0xBB, 0xEE, 0xE8, 0xD9, /* 0x40-0x43 */ + 0xBE, 0x7A, 0xBE, 0x79, 0xE8, 0xD8, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xEF, 0x69, 0x3F, 0x3F, 0xF1, 0xC0, 0xF1, 0xC2, /* 0x48-0x4B */ + 0xF1, 0xC1, 0xC3, 0x53, 0xC3, 0x52, 0xC3, 0x51, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xC5, 0x5E, 0xF6, 0xA8, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xC5, 0x5D, 0xF7, 0xA9, 0xF7, 0xA8, 0x3F, 0x3F, /* 0x54-0x57 */ + 0xC6, 0x4C, 0xF8, 0xD5, 0xB3, 0xBD, 0xE0, 0xEA, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xE4, 0xE1, /* 0x5C-0x5F */ + 0xE4, 0xDF, 0xE4, 0xE0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0xE8, 0xE2, 0x3F, 0x3F, 0xE8, 0xDD, 0xE8, 0xDA, /* 0x64-0x67 */ + 0xE8, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0xE8, 0xE3, 0x3F, 0x3F, 0x3F, 0x3F, 0xBE, 0x7C, /* 0x6C-0x6F */ + 0xE8, 0xE0, 0xE8, 0xDC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xE8, 0xDB, 0xE8, 0xDF, 0xE8, 0xDE, 0xBE, 0x7B, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0x7D, 0xEC, 0x78, /* 0x78-0x7B */ + 0xEC, 0x76, 0xEC, 0xA1, 0xEC, 0x77, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0xEC, 0x73, 0x3F, 0x3F, 0xEC, 0x79, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0xEC, 0x74, 0xEF, 0x72, 0xEC, 0x75, /* 0x84-0x87 */ + 0xEC, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xEC, 0x7C, 0xC0, 0x6A, 0xEC, 0x7B, 0xEC, 0x7A, /* 0x90-0x93 */ + 0x3F, 0x3F, 0xEC, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0x6A, 0xEF, 0x6D, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0x6C, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xEF, 0x74, 0xEF, 0x6F, 0xEF, 0x73, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xEF, 0x71, 0xEF, 0x70, 0xEF, 0x6E, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0xEF, 0x6B, 0x3F, 0x3F, 0xC2, 0x43, 0xC2, 0x42, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xC2, 0x44, 0xC2, 0x41, 0xEF, 0x75, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0xF1, 0xC8, 0xF1, 0xCB, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0xF1, 0xC9, 0xF1, 0xCD, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0xF1, 0xCE, 0x3F, 0x3F, 0xF1, 0xC6, /* 0xBC-0xBF */ + 0xC3, 0x58, 0xF1, 0xC7, 0x3F, 0x3F, 0xF1, 0xC5, /* 0xC0-0xC3 */ + 0xF1, 0xCC, 0x3F, 0x3F, 0xF1, 0xC4, 0xF1, 0xC3, /* 0xC4-0xC7 */ + 0xC3, 0x57, 0xC3, 0x55, 0xC3, 0x54, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xCA, /* 0xD0-0xD3 */ + 0xF3, 0xCF, 0xF3, 0xD5, 0xC4, 0x4A, 0xF3, 0xD0, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0xF3, 0xD3, 0xF3, 0xD7, 0xC4, 0x4B, /* 0xD8-0xDB */ + 0xF3, 0xD2, 0x3F, 0x3F, 0xF3, 0xCA, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xF3, 0xC9, 0xF3, 0xD6, 0xF3, 0xCD, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xF3, 0xCB, 0xF3, 0xD4, 0xF3, 0xCC, 0xC4, 0x49, /* 0xE4-0xE7 */ + 0xC4, 0x48, 0x3F, 0x3F, 0xF3, 0xC7, 0xF3, 0xC8, /* 0xE8-0xEB */ + 0xF3, 0xD1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0xF3, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0x6C, /* 0xF4-0xF7 */ + 0xF5, 0x6F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xC3, 0x56, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9C[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0xF5, 0x6D, 0xF5, 0x73, 0xF5, 0x71, /* 0x04-0x07 */ + 0xF5, 0x6B, 0xF5, 0x76, 0x3F, 0x3F, 0xF5, 0x6A, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xC4, 0xCF, 0xF5, 0x72, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0x6E, 0xC4, 0xCE, /* 0x10-0x13 */ + 0xF5, 0x75, 0x3F, 0x3F, 0x3F, 0x3F, 0xF5, 0x74, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0xF6, 0xAB, 0xF6, 0xAA, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0xF6, 0xB1, 0x3F, 0x3F, 0xF6, 0xAD, /* 0x20-0x23 */ + 0xF6, 0xB0, 0xC5, 0x60, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xF6, 0xAE, 0xF6, 0xAF, 0x3F, 0x3F, 0xF6, 0xA9, /* 0x28-0x2B */ + 0xF6, 0xAC, 0xC5, 0x5F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0xC5, 0xBF, 0xF7, 0xB4, 0xF7, 0xAF, /* 0x30-0x33 */ + 0xF7, 0xB3, 0x3F, 0x3F, 0xF7, 0xB6, 0xF7, 0xB2, /* 0x34-0x37 */ + 0x3F, 0x3F, 0xF7, 0xAE, 0x3F, 0x3F, 0xC5, 0xC1, /* 0x38-0x3B */ + 0xF7, 0xB1, 0xF7, 0xB5, 0xC5, 0xC0, 0xF7, 0xAC, /* 0x3C-0x3F */ + 0xF5, 0x70, 0xF7, 0xB0, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0xF7, 0xAD, 0x3F, 0x3F, 0xF7, 0xAA, 0x3F, 0x3F, /* 0x44-0x47 */ + 0xF7, 0xAB, 0xC5, 0xBE, 0xF8, 0x5A, 0xF8, 0x5C, /* 0x48-0x4B */ + 0xF8, 0x5F, 0xF8, 0x5B, 0xF8, 0x60, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0xF8, 0x59, 0x3F, 0x3F, 0xF8, 0x57, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xC5, 0xEB, 0xF8, 0x5D, 0xC5, 0xED, 0xC5, 0xEC, /* 0x54-0x57 */ + 0xF8, 0x58, 0xF8, 0x5E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xDA, 0xC6, 0x4D, /* 0x5C-0x5F */ + 0xF8, 0xDB, 0x3F, 0x3F, 0xF8, 0xD9, 0xF8, 0xD6, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xD8, 0xF8, 0xD7, /* 0x64-0x67 */ + 0xF9, 0x5A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0xF9, 0x5C, 0xF9, 0x5B, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0xF9, 0x79, 0x3F, 0x3F, 0xF9, 0x78, /* 0x70-0x73 */ + 0xF9, 0x77, 0xF9, 0x7A, 0x3F, 0x3F, 0xC6, 0x73, /* 0x74-0x77 */ + 0xC6, 0x74, 0xF9, 0xCA, 0xF9, 0xCE, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xB3, 0xBE, 0xDC, 0xAF, 0xE0, 0xED, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0xB9, 0xA7, 0xE0, 0xEB, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xE0, 0xEC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0xE4, 0xE2, 0xE4, 0xE3, 0xBB, 0xF1, /* 0xF0-0xF3 */ + 0xBB, 0xEF, 0xE4, 0xE4, 0xBB, 0xF0, 0xE8, 0xE8, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xE8, 0xEB, 0xE8, 0xE5, 0xE8, 0xEC, /* 0xF8-0xFB */ + 0xE8, 0xE4, 0xE8, 0xE6, 0x3F, 0x3F, 0xE8, 0xE7, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9D[512] = { + 0xE8, 0xEA, 0x3F, 0x3F, 0x3F, 0x3F, 0xBE, 0xA1, /* 0x00-0x03 */ + 0xE8, 0xEF, 0xE8, 0xEE, 0xBE, 0x7D, 0xE8, 0xE9, /* 0x04-0x07 */ + 0xE8, 0xED, 0xBE, 0x7E, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0xEC, 0xAC, 0x3F, 0x3F, 0xC0, 0x6F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0xEC, 0xA7, 0xC0, 0x6B, 0x3F, 0x3F, 0xEC, 0xA4, /* 0x14-0x17 */ + 0xEC, 0xAA, 0xEC, 0xAD, 0x3F, 0x3F, 0xC0, 0x70, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xEC, 0xA9, 0xEC, 0xA6, 0xEC, 0xAE, /* 0x1C-0x1F */ + 0xEC, 0xA5, 0x3F, 0x3F, 0xEC, 0xAB, 0xC0, 0x6C, /* 0x20-0x23 */ + 0x3F, 0x3F, 0xEC, 0xA3, 0xC0, 0x6D, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xC0, 0x6E, 0xEC, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0xEF, 0xA9, 0xEF, 0x7A, 0xEF, 0x7B, /* 0x2C-0x2F */ + 0xEF, 0x7E, 0xEF, 0x7C, 0x3F, 0x3F, 0xEF, 0x76, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0x79, 0xEF, 0xA5, /* 0x34-0x37 */ + 0xEF, 0x7D, 0x3F, 0x3F, 0x3F, 0x3F, 0xC2, 0x45, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xEF, 0xA7, 0xEF, 0xA4, 0xC2, 0x46, /* 0x3C-0x3F */ + 0xEF, 0xA6, 0xEF, 0x77, 0xEF, 0xA2, 0xEF, 0xA3, /* 0x40-0x43 */ + 0x3F, 0x3F, 0xEF, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xD2, 0xF1, 0xD4, /* 0x48-0x4B */ + 0xF1, 0xD7, 0x3F, 0x3F, 0x3F, 0x3F, 0xF1, 0xD1, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0xC3, 0x59, 0xF1, 0xD9, 0xF1, 0xD0, /* 0x50-0x53 */ + 0xF1, 0xDA, 0x3F, 0x3F, 0xF1, 0xD6, 0xF1, 0xD8, /* 0x54-0x57 */ + 0xF1, 0xDC, 0xF1, 0xD5, 0xF1, 0xDD, 0xF1, 0xD3, /* 0x58-0x5B */ + 0xF1, 0xCF, 0xC3, 0x5A, 0x3F, 0x3F, 0xF1, 0xDB, /* 0x5C-0x5F */ + 0xC3, 0x5B, 0xC4, 0x4D, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xEF, 0x78, /* 0x64-0x67 */ + 0xF3, 0xF1, 0xF3, 0xE8, 0xC4, 0x4F, 0xF3, 0xE4, /* 0x68-0x6B */ + 0xC4, 0x50, 0x3F, 0x3F, 0x3F, 0x3F, 0xF3, 0xED, /* 0x6C-0x6F */ + 0xF3, 0xE7, 0xF3, 0xDD, 0xC4, 0x4E, 0xF3, 0xEA, /* 0x70-0x73 */ + 0xF3, 0xE5, 0xF3, 0xE6, 0x3F, 0x3F, 0xF3, 0xD8, /* 0x74-0x77 */ + 0xF3, 0xDF, 0xF3, 0xEE, 0x3F, 0x3F, 0xF3, 0xEB, /* 0x78-0x7B */ + 0x3F, 0x3F, 0xF3, 0xE3, 0x3F, 0x3F, 0xF3, 0xEF, /* 0x7C-0x7F */ + + 0xF3, 0xDE, 0xF3, 0xD9, 0xF3, 0xEC, 0x3F, 0x3F, /* 0x80-0x83 */ + 0xF3, 0xDB, 0xF3, 0xE9, 0xF3, 0xE0, 0xF3, 0xF0, /* 0x84-0x87 */ + 0xF3, 0xDC, 0xC4, 0x4C, 0xF3, 0xDA, 0xF3, 0xE1, /* 0x88-0x8B */ + 0xF3, 0xE2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xF5, 0x7D, 0x3F, 0x3F, 0xF5, 0x7B, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xF5, 0xA2, 0x3F, 0x3F, 0xF5, 0xAE, 0xF5, 0xA5, /* 0x94-0x97 */ + 0xF5, 0x7C, 0xF5, 0x78, 0xF5, 0xA7, 0xF5, 0x7E, /* 0x98-0x9B */ + 0xF5, 0xA3, 0xF5, 0x7A, 0xF5, 0xAA, 0xF5, 0x77, /* 0x9C-0x9F */ + 0xF5, 0xA1, 0xF5, 0xA6, 0xF5, 0xA8, 0xF5, 0xAB, /* 0xA0-0xA3 */ + 0xF5, 0x79, 0x3F, 0x3F, 0xF5, 0xAF, 0xF5, 0xB0, /* 0xA4-0xA7 */ + 0xF5, 0xA9, 0xF5, 0xAD, 0xF5, 0xA4, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0xF6, 0xC1, 0xF6, 0xC4, 0x3F, 0x3F, 0xC5, 0x61, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0xF6, 0xC3, 0xF6, 0xC8, 0xF6, 0xC6, /* 0xB0-0xB3 */ + 0xC5, 0x62, 0xF6, 0xBD, 0xF6, 0xB3, 0xF6, 0xB2, /* 0xB4-0xB7 */ + 0xC5, 0x64, 0xF6, 0xBF, 0xF6, 0xC0, 0xF6, 0xBC, /* 0xB8-0xBB */ + 0xF6, 0xB4, 0x3F, 0x3F, 0xF6, 0xB9, 0xF5, 0xAC, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0xF6, 0xB5, 0xC5, 0x63, 0xF6, 0xBB, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0xF6, 0xBA, 0x3F, 0x3F, 0xF6, 0xB6, /* 0xC4-0xC7 */ + 0xF6, 0xC2, 0x3F, 0x3F, 0xF6, 0xB7, 0xF7, 0xBB, /* 0xC8-0xCB */ + 0xF6, 0xC5, 0xF6, 0xC7, 0xF6, 0xBE, 0xF6, 0xB8, /* 0xCC-0xCF */ + 0xF7, 0xBC, 0xF7, 0xBE, 0xF7, 0xB8, 0xC5, 0xC2, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0xF7, 0xC5, 0xF7, 0xC3, 0xC5, 0xC3, /* 0xD4-0xD7 */ + 0xF7, 0xC2, 0xF7, 0xC1, 0xF7, 0xBA, 0xF7, 0xB7, /* 0xD8-0xDB */ + 0xF7, 0xBD, 0xF7, 0xC6, 0xF7, 0xB9, 0xF7, 0xBF, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0xF8, 0x69, 0xF8, 0x6E, 0xF8, 0x64, /* 0xE0-0xE3 */ + 0xF8, 0x67, 0xC5, 0xEE, 0xF8, 0x6B, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0xF8, 0x72, 0xF7, 0xC0, 0x3F, 0x3F, 0xF8, 0x65, /* 0xE8-0xEB */ + 0xF8, 0x6F, 0xF8, 0x73, 0xF8, 0x6A, 0xF8, 0x63, /* 0xEC-0xEF */ + 0xF8, 0x6D, 0x3F, 0x3F, 0xF8, 0x6C, 0xF8, 0x71, /* 0xF0-0xF3 */ + 0xF8, 0x70, 0xF7, 0xC4, 0xF8, 0x68, 0xF8, 0x62, /* 0xF4-0xF7 */ + 0xF8, 0x66, 0xC6, 0x4E, 0xC6, 0x4F, 0xF8, 0x61, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0xF8, 0xE6, 0xF8, 0xDD, 0xF8, 0xE5, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9E[512] = { + 0xF8, 0xE2, 0xF8, 0xE3, 0xF8, 0xDC, 0xF8, 0xDF, /* 0x00-0x03 */ + 0xF8, 0xE7, 0xF8, 0xE1, 0xF8, 0xE0, 0xF8, 0xDE, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF8, 0xE4, 0x3F, 0x3F, 0xF9, 0x5D, /* 0x08-0x0B */ + 0x3F, 0x3F, 0xF9, 0x5E, 0x3F, 0x3F, 0xF9, 0x60, /* 0x0C-0x0F */ + 0xF9, 0x5F, 0xF9, 0x62, 0xF9, 0x61, 0xF9, 0x7C, /* 0x10-0x13 */ + 0xF9, 0x7B, 0xF9, 0xB7, 0x3F, 0x3F, 0xF9, 0xB8, /* 0x14-0x17 */ + 0x3F, 0x3F, 0xF9, 0xC5, 0xC6, 0x78, 0xC6, 0x7C, /* 0x18-0x1B */ + 0x3F, 0x3F, 0xF9, 0xCF, 0xC6, 0x7D, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0xB3, 0xBF, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0xC4, 0xD0, 0xF6, 0xC9, 0x3F, 0x3F, /* 0x78-0x7B */ + 0xC6, 0x50, 0xC6, 0x51, 0x3F, 0x3F, 0xB3, 0xC0, /* 0x7C-0x7F */ + + 0xE0, 0xEE, 0x3F, 0x3F, 0xB9, 0xA8, 0xE8, 0xF0, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xEC, 0xB0, 0xEC, 0xB1, /* 0x84-0x87 */ + 0xEC, 0xAF, 0xEF, 0xAB, 0xEF, 0xAA, 0xC2, 0x47, /* 0x88-0x8B */ + 0xF1, 0xDF, 0xEF, 0xAC, 0xF1, 0xDE, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0xF3, 0xF3, 0xC4, 0x51, 0xC4, 0x53, /* 0x90-0x93 */ + 0xF3, 0xF2, 0x3F, 0x3F, 0x3F, 0x3F, 0xC4, 0x52, /* 0x94-0x97 */ + 0x3F, 0x3F, 0xF5, 0xB1, 0xF5, 0xB3, 0xF5, 0xB2, /* 0x98-0x9B */ + 0xF6, 0xCA, 0xC5, 0x65, 0x3F, 0x3F, 0xC5, 0xEF, /* 0x9C-0x9F */ + 0xF8, 0xE8, 0xF9, 0x63, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xF9, 0xD2, 0xB3, 0xC1, 0x3F, 0x3F, 0xE4, 0xE5, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0xBE, 0xA2, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0xEC, 0xB3, 0xEC, 0xB2, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0xEF, 0xAD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0xC4, 0x54, 0xC4, 0xD1, 0xF7, 0xC7, 0xF9, 0xCB, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xB3, 0xC2, /* 0xB8-0xBB */ + 0xBB, 0xF2, 0x3F, 0x3F, 0xBE, 0xA3, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0xF3, 0xF4, 0x3F, 0x3F, 0xF8, 0x74, 0xB6, 0xC0, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0xEF, 0xAE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0xC6, 0x64, 0xB6, 0xC1, 0xBE, 0xA4, 0xC2, 0x48, /* 0xCC-0xCF */ + 0xF8, 0x75, 0xB6, 0xC2, 0x3F, 0x3F, 0xE8, 0xF1, /* 0xD0-0xD3 */ + 0xC0, 0x72, 0xEC, 0xB4, 0xEC, 0xB5, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0xC0, 0x71, 0x3F, 0x3F, 0xEF, 0xAF, 0xC2, 0x4C, /* 0xD8-0xDB */ + 0xC2, 0x4A, 0xC2, 0x4B, 0xC2, 0x49, 0xF1, 0xE0, /* 0xDC-0xDF */ + 0xC3, 0x5C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0xF5, 0xB5, 0xF5, 0xB4, 0xF5, 0xB7, 0xF5, 0xB6, /* 0xE4-0xE7 */ + 0xC4, 0xD2, 0x3F, 0x3F, 0x3F, 0x3F, 0xF6, 0xCB, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0xF6, 0xCD, 0xF6, 0xCC, 0xC5, 0x66, /* 0xEC-0xEF */ + 0xF7, 0xC8, 0x3F, 0x3F, 0xF8, 0x76, 0xF8, 0x77, /* 0xF0-0xF3 */ + 0xC5, 0xF0, 0xF9, 0x64, 0xF9, 0x7D, 0xC6, 0x75, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0xDC, 0xB0, 0xEC, 0xB6, 0xEF, 0xB0, /* 0xF8-0xFB */ + 0xF3, 0xF5, 0xE0, 0xEF, 0x3F, 0x3F, 0xEF, 0xB1, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_9F[512] = { + 0xF1, 0xE2, 0xF1, 0xE1, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0x78, 0xC6, 0x52, /* 0x04-0x07 */ + 0x3F, 0x3F, 0xF9, 0x65, 0xF9, 0x7E, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xB9, 0xA9, 0xE8, 0xF2, /* 0x0C-0x0F */ + 0xE8, 0xF3, 0x3F, 0x3F, 0xEC, 0xB7, 0xB9, 0xAA, /* 0x10-0x13 */ + 0x3F, 0x3F, 0xC3, 0x5D, 0xF1, 0xE3, 0x3F, 0x3F, /* 0x14-0x17 */ + 0xF6, 0xCF, 0xC5, 0x67, 0xF6, 0xD0, 0xF6, 0xCE, /* 0x18-0x1B */ + 0xF8, 0x79, 0x3F, 0x3F, 0xF8, 0xE9, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0xB9, 0xAB, 0x3F, 0x3F, 0xEF, 0xB4, 0xEF, 0xB3, /* 0x20-0x23 */ + 0xEF, 0xB2, 0xF1, 0xE4, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0xF1, 0xE8, 0xF1, 0xE7, 0xF1, 0xE6, 0xF1, 0xE5, /* 0x28-0x2B */ + 0xC3, 0x5E, 0xF3, 0xF6, 0xF5, 0xB9, 0xC4, 0xD3, /* 0x2C-0x2F */ + 0xF5, 0xB8, 0xF6, 0xD1, 0xF7, 0xCB, 0xF7, 0xCA, /* 0x30-0x33 */ + 0xC5, 0xC4, 0xF7, 0xC9, 0xF8, 0x7C, 0xF8, 0x7B, /* 0x34-0x37 */ + 0xF8, 0x7A, 0x3F, 0x3F, 0x3F, 0x3F, 0xBB, 0xF3, /* 0x38-0x3B */ + 0x3F, 0x3F, 0xEC, 0xB8, 0xC2, 0x4D, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0xF3, 0xF7, 0xF3, 0xF8, 0xF7, 0xCC, 0xF8, 0x7D, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF8, 0xEA, 0xF9, 0x66, /* 0x44-0x47 */ + 0xF9, 0xB9, 0xF9, 0xD4, 0xBB, 0xF4, 0xC2, 0x4E, /* 0x48-0x4B */ + 0xF1, 0xE9, 0xF3, 0xF9, 0xF6, 0xD2, 0xF8, 0x7E, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xBE, 0xA6, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xEF, 0xB5, 0xF1, 0xEA, 0xF3, 0xFA, 0xF3, 0xFB, /* 0x54-0x57 */ + 0xF3, 0xFC, 0xF5, 0xBE, 0x3F, 0x3F, 0xF5, 0xBA, /* 0x58-0x5B */ + 0xC5, 0x68, 0xF5, 0xBD, 0xF5, 0xBC, 0xC4, 0xD4, /* 0x5C-0x5F */ + 0xF5, 0xBB, 0xC4, 0xD6, 0x3F, 0x3F, 0xC4, 0xD5, /* 0x60-0x63 */ + 0xF6, 0xD4, 0xF6, 0xD3, 0xC5, 0x69, 0xC5, 0x6A, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xC5, 0xC6, 0xF7, 0xCD, /* 0x68-0x6B */ + 0xC5, 0xC5, 0x3F, 0x3F, 0xF8, 0xA3, 0xF8, 0xA4, /* 0x6C-0x6F */ + 0xF8, 0xA2, 0xF8, 0xA1, 0xC6, 0x54, 0x3F, 0x3F, /* 0x70-0x73 */ + 0xF8, 0xEB, 0xF8, 0xEC, 0xF8, 0xED, 0xC6, 0x53, /* 0x74-0x77 */ + 0xF9, 0x67, 0xF9, 0x6A, 0xF9, 0x69, 0xF9, 0x68, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0xF9, 0xD3, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0xC0, 0x73, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0xC3, 0x65, 0xF5, 0xBF, 0xF6, 0xD5, 0x3F, 0x3F, /* 0x90-0x93 */ + 0xC5, 0xC7, 0xF7, 0xCE, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0xF9, 0xD5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0xC0, 0x74, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0xEF, 0xB6, 0x3F, 0x3F, 0xF7, 0xCF, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0xF9, 0xA1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FA[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0xC9, 0x4A, 0xDD, 0xFC, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x30-0x33 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x34-0x37 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x38-0x3B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x40-0x43 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x48-0x4B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x4C-0x4F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x54-0x57 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x58-0x5B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FE[512] = { + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x00-0x03 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x04-0x07 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x08-0x0B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x0C-0x0F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x10-0x13 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x14-0x17 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x18-0x1B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x1C-0x1F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x20-0x23 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x24-0x27 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x28-0x2B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x2C-0x2F */ + 0xA1, 0x4A, 0xA1, 0x57, 0x3F, 0x3F, 0xA1, 0x59, /* 0x30-0x33 */ + 0xA1, 0x5B, 0xA1, 0x5F, 0xA1, 0x60, 0xA1, 0x63, /* 0x34-0x37 */ + 0xA1, 0x64, 0xA1, 0x67, 0xA1, 0x68, 0xA1, 0x6B, /* 0x38-0x3B */ + 0xA1, 0x6C, 0xA1, 0x6F, 0xA1, 0x70, 0xA1, 0x73, /* 0x3C-0x3F */ + 0xA1, 0x74, 0xA1, 0x77, 0xA1, 0x78, 0xA1, 0x7B, /* 0x40-0x43 */ + 0xA1, 0x7C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x44-0x47 */ + 0x3F, 0x3F, 0xA1, 0xC6, 0xA1, 0xC7, 0xA1, 0xCA, /* 0x48-0x4B */ + 0xA1, 0xCB, 0xA1, 0xC8, 0xA1, 0xC9, 0xA1, 0x5C, /* 0x4C-0x4F */ + 0xA1, 0x4D, 0xA1, 0x4E, 0xA1, 0x4F, 0x3F, 0x3F, /* 0x50-0x53 */ + 0xA1, 0x51, 0xA1, 0x52, 0xA1, 0x53, 0xA1, 0x54, /* 0x54-0x57 */ + 0x3F, 0x3F, 0xA1, 0x7D, 0xA1, 0x7E, 0xA1, 0xA1, /* 0x58-0x5B */ + 0xA1, 0xA2, 0xA1, 0xA3, 0xA1, 0xA4, 0xA1, 0xCC, /* 0x5C-0x5F */ + 0xA1, 0xCD, 0xA1, 0xCE, 0xA1, 0xDE, 0xA1, 0xDF, /* 0x60-0x63 */ + 0xA1, 0xE0, 0xA1, 0xE1, 0xA1, 0xE2, 0x3F, 0x3F, /* 0x64-0x67 */ + 0xA2, 0x42, 0xA2, 0x4C, 0xA2, 0x4D, 0xA2, 0x4E, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char u2c_FF[512] = { + 0x3F, 0x3F, 0xA1, 0x49, 0x3F, 0x3F, 0xA1, 0xAD, /* 0x00-0x03 */ + 0xA2, 0x43, 0xA2, 0x48, 0xA1, 0xAE, 0x3F, 0x3F, /* 0x04-0x07 */ + 0xA1, 0x5D, 0xA1, 0x5E, 0xA1, 0xAF, 0xA1, 0xCF, /* 0x08-0x0B */ + 0xA1, 0x41, 0xA1, 0xD0, 0xA1, 0x44, 0xA1, 0xFE, /* 0x0C-0x0F */ + 0xA2, 0xAF, 0xA2, 0xB0, 0xA2, 0xB1, 0xA2, 0xB2, /* 0x10-0x13 */ + 0xA2, 0xB3, 0xA2, 0xB4, 0xA2, 0xB5, 0xA2, 0xB6, /* 0x14-0x17 */ + 0xA2, 0xB7, 0xA2, 0xB8, 0xA1, 0x47, 0xA1, 0x46, /* 0x18-0x1B */ + 0xA1, 0xD5, 0xA1, 0xD7, 0xA1, 0xD6, 0xA1, 0x48, /* 0x1C-0x1F */ + 0xA2, 0x49, 0xA2, 0xCF, 0xA2, 0xD0, 0xA2, 0xD1, /* 0x20-0x23 */ + 0xA2, 0xD2, 0xA2, 0xD3, 0xA2, 0xD4, 0xA2, 0xD5, /* 0x24-0x27 */ + 0xA2, 0xD6, 0xA2, 0xD7, 0xA2, 0xD8, 0xA2, 0xD9, /* 0x28-0x2B */ + 0xA2, 0xDA, 0xA2, 0xDB, 0xA2, 0xDC, 0xA2, 0xDD, /* 0x2C-0x2F */ + 0xA2, 0xDE, 0xA2, 0xDF, 0xA2, 0xE0, 0xA2, 0xE1, /* 0x30-0x33 */ + 0xA2, 0xE2, 0xA2, 0xE3, 0xA2, 0xE4, 0xA2, 0xE5, /* 0x34-0x37 */ + 0xA2, 0xE6, 0xA2, 0xE7, 0xA2, 0xE8, 0x3F, 0x3F, /* 0x38-0x3B */ + 0xA2, 0x40, 0x3F, 0x3F, 0x3F, 0x3F, 0xA1, 0xC4, /* 0x3C-0x3F */ + 0x3F, 0x3F, 0xA2, 0xE9, 0xA2, 0xEA, 0xA2, 0xEB, /* 0x40-0x43 */ + 0xA2, 0xEC, 0xA2, 0xED, 0xA2, 0xEE, 0xA2, 0xEF, /* 0x44-0x47 */ + 0xA2, 0xF0, 0xA2, 0xF1, 0xA2, 0xF2, 0xA2, 0xF3, /* 0x48-0x4B */ + 0xA2, 0xF4, 0xA2, 0xF5, 0xA2, 0xF6, 0xA2, 0xF7, /* 0x4C-0x4F */ + 0xA2, 0xF8, 0xA2, 0xF9, 0xA2, 0xFA, 0xA2, 0xFB, /* 0x50-0x53 */ + 0xA2, 0xFC, 0xA2, 0xFD, 0xA2, 0xFE, 0xA3, 0x40, /* 0x54-0x57 */ + 0xA3, 0x41, 0xA3, 0x42, 0xA3, 0x43, 0xA1, 0x61, /* 0x58-0x5B */ + 0xA1, 0x55, 0xA1, 0x62, 0xA1, 0xE3, 0x3F, 0x3F, /* 0x5C-0x5F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x60-0x63 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x64-0x67 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x68-0x6B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x6C-0x6F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x70-0x73 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x74-0x77 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x78-0x7B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x7C-0x7F */ + + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x80-0x83 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x84-0x87 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x88-0x8B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x8C-0x8F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x90-0x93 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x94-0x97 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x98-0x9B */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0x9C-0x9F */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA0-0xA3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA4-0xA7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xA8-0xAB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xAC-0xAF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB0-0xB3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB4-0xB7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xB8-0xBB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xBC-0xBF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC0-0xC3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC4-0xC7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xC8-0xCB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xCC-0xCF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD0-0xD3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD4-0xD7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xD8-0xDB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xDC-0xDF */ + 0xA2, 0x46, 0xA2, 0x47, 0x3F, 0x3F, 0xA1, 0xC3, /* 0xE0-0xE3 */ + 0x3F, 0x3F, 0xA2, 0x44, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE4-0xE7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xE8-0xEB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xEC-0xEF */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF0-0xF3 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF4-0xF7 */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xF8-0xFB */ + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 0xFC-0xFF */ +}; + +static unsigned char *page_uni2charset[256] = { + NULL, NULL, u2c_02, u2c_03, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u2c_20, u2c_21, u2c_22, NULL, NULL, u2c_25, u2c_26, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + u2c_30, u2c_31, u2c_32, u2c_33, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, u2c_4E, u2c_4F, + u2c_50, u2c_51, u2c_52, u2c_53, u2c_54, u2c_55, u2c_56, u2c_57, + u2c_58, u2c_59, u2c_5A, u2c_5B, u2c_5C, u2c_5D, u2c_5E, u2c_5F, + u2c_60, u2c_61, u2c_62, u2c_63, u2c_64, u2c_65, u2c_66, u2c_67, + u2c_68, u2c_69, u2c_6A, u2c_6B, u2c_6C, u2c_6D, u2c_6E, u2c_6F, + u2c_70, u2c_71, u2c_72, u2c_73, u2c_74, u2c_75, u2c_76, u2c_77, + u2c_78, u2c_79, u2c_7A, u2c_7B, u2c_7C, u2c_7D, u2c_7E, u2c_7F, + u2c_80, u2c_81, u2c_82, u2c_83, u2c_84, u2c_85, u2c_86, u2c_87, + u2c_88, u2c_89, u2c_8A, u2c_8B, u2c_8C, u2c_8D, u2c_8E, u2c_8F, + u2c_90, u2c_91, u2c_92, u2c_93, u2c_94, u2c_95, u2c_96, u2c_97, + u2c_98, u2c_99, u2c_9A, u2c_9B, u2c_9C, u2c_9D, u2c_9E, u2c_9F, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, u2c_FA, NULL, NULL, NULL, u2c_FE, u2c_FF, }; + +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + uni2charset = page_uni2charset[ch]; + *outlen = 0; + if (uni2charset){ + if (boundlen <= 1) + return; + out[0] = uni2charset[cl*2]; + out[1] = uni2charset[cl*2+1]; + *outlen = 1; + } else if (ch==0 && cl) + out[0] = cl; + else + out[0] = '?'; + (*outlen)++; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + unsigned char ch, cl; + struct nls_unicode *charset2uni; + + ch = rawstring[0]; + cl = rawstring[1]; + charset2uni = page_charset2uni[ch]; + if (charset2uni && cl){ + *uni1 = charset2uni[cl].uni2; + *uni2 = charset2uni[cl].uni1; + *offset = 2; + } else{ + *uni1 = ch; + *uni2 = 0x00; + *offset = 1; + } + return; +} + +static void inc_use_count(void) +{ + MOD_INC_USE_COUNT; +} + +static void dec_use_count(void) +{ + MOD_DEC_USE_COUNT; +} + +static struct nls_table table = { + "cp950", + uni2char, + char2uni, + inc_use_count, + dec_use_count, + NULL +}; + +int __init init_nls_cp950(void) +{ + return register_nls(&table); +} + +#ifdef MODULE +int init_module(void) +{ + return init_nls_cp950(); +} + + +void cleanup_module(void) +{ + unregister_nls(&table); + 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: 8 + * c-brace-imaginary-offset: 0 + * c-brace-offset: -8 + * c-argdecl-indent: 8 + * c-label-offset: -8 + * c-continued-statement-offset: 8 + * c-continued-brace-offset: 0 + * End: + */ diff -urN v2.2.15/linux/fs/nls/nls_iso8859-1.c linux/fs/nls/nls_iso8859-1.c --- v2.2.15/linux/fs/nls/nls_iso8859-1.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-1.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -172,6 +173,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -184,14 +209,14 @@ static struct nls_table table = { "iso8859-1", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_1(void) +int __init init_nls_iso8859_1(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-14.c linux/fs/nls/nls_iso8859-14.c --- v2.2.15/linux/fs/nls/nls_iso8859-14.c Wed Aug 25 17:29:49 1999 +++ linux/fs/nls/nls_iso8859-14.c Wed Jun 7 14:26:44 2000 @@ -16,6 +16,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -219,6 +220,30 @@ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -231,14 +256,14 @@ static struct nls_table table = { "iso8859-14", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_14(void) +int __init init_nls_iso8859_14(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-15.c linux/fs/nls/nls_iso8859-15.c --- v2.2.15/linux/fs/nls/nls_iso8859-15.c Fri Dec 18 08:09:51 1998 +++ linux/fs/nls/nls_iso8859-15.c Wed Jun 7 14:26:44 2000 @@ -9,6 +9,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -212,6 +213,30 @@ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -224,14 +249,14 @@ static struct nls_table table = { "iso8859-15", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_15(void) +int __init init_nls_iso8859_15(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-2.c linux/fs/nls/nls_iso8859-2.c --- v2.2.15/linux/fs/nls/nls_iso8859-2.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-2.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -244,6 +245,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -256,14 +281,14 @@ static struct nls_table table = { "iso8859-2", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_2(void) +int __init init_nls_iso8859_2(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-3.c linux/fs/nls/nls_iso8859-3.c --- v2.2.15/linux/fs/nls/nls_iso8859-3.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-3.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -244,6 +245,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -256,14 +281,14 @@ static struct nls_table table = { "iso8859-3", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_3(void) +int __init init_nls_iso8859_3(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-4.c linux/fs/nls/nls_iso8859-4.c --- v2.2.15/linux/fs/nls/nls_iso8859-4.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-4.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -244,6 +245,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -256,14 +281,14 @@ static struct nls_table table = { "iso8859-4", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_4(void) +int __init init_nls_iso8859_4(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-5.c linux/fs/nls/nls_iso8859-5.c --- v2.2.15/linux/fs/nls/nls_iso8859-5.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-5.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -248,6 +249,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -260,14 +285,14 @@ static struct nls_table table = { "iso8859-5", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_5(void) +int __init init_nls_iso8859_5(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-6.c linux/fs/nls/nls_iso8859-6.c --- v2.2.15/linux/fs/nls/nls_iso8859-6.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-6.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -208,6 +209,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -220,14 +245,14 @@ static struct nls_table table = { "iso8859-6", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_6(void) +int __init init_nls_iso8859_6(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-7.c linux/fs/nls/nls_iso8859-7.c --- v2.2.15/linux/fs/nls/nls_iso8859-7.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-7.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -284,6 +285,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -296,14 +321,14 @@ static struct nls_table table = { "iso8859-7", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_7(void) +int __init init_nls_iso8859_7(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-8.c linux/fs/nls/nls_iso8859-8.c --- v2.2.15/linux/fs/nls/nls_iso8859-8.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-8.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -248,6 +249,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -260,14 +285,14 @@ static struct nls_table table = { "iso8859-8", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_8(void) +int __init init_nls_iso8859_8(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_iso8859-9.c linux/fs/nls/nls_iso8859-9.c --- v2.2.15/linux/fs/nls/nls_iso8859-9.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_iso8859-9.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -208,6 +209,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -220,14 +245,14 @@ static struct nls_table table = { "iso8859-9", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_iso8859_9(void) +int __init init_nls_iso8859_9(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/nls/nls_koi8-r.c linux/fs/nls/nls_koi8-r.c --- v2.2.15/linux/fs/nls/nls_koi8-r.c Sun Jan 25 10:05:47 1998 +++ linux/fs/nls/nls_koi8-r.c Wed Jun 7 14:26:44 2000 @@ -11,6 +11,7 @@ #include #include #include +#include static struct nls_unicode charset2uni[256] = { /* 0x00*/ @@ -320,6 +321,30 @@ }; #endif +static void uni2char(unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen) +{ + unsigned char *uni2charset; + + if (boundlen <= 0) + return; + + uni2charset = page_uni2charset[ch]; + if (uni2charset && uni2charset[cl]) + out[0] = uni2charset[cl]; + else + out[0] = '?'; + *outlen = 1; + return; +} + +static void char2uni(unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2) +{ + *uni1 = charset2uni[*rawstring].uni1; + *uni2 = charset2uni[*rawstring].uni2; + *offset = 1; + return; +} + static void inc_use_count(void) { MOD_INC_USE_COUNT; @@ -332,14 +357,14 @@ static struct nls_table table = { "koi8-r", - page_uni2charset, - charset2uni, + uni2char, + char2uni, inc_use_count, dec_use_count, NULL }; -int init_nls_koi8_r(void) +int __init init_nls_koi8_r(void) { return register_nls(&table); } diff -urN v2.2.15/linux/fs/ntfs/fs.c linux/fs/ntfs/fs.c --- v2.2.15/linux/fs/ntfs/fs.c Fri Apr 23 21:20:38 1999 +++ linux/fs/ntfs/fs.c Wed Jun 7 14:26:44 2000 @@ -360,8 +360,11 @@ if((vol->nct & (nct_uni_xlate | nct_map | nct_utf8))==0) /* default to UTF-8 */ vol->nct=nct_utf8; - if(!vol->nls_map) + if(!vol->nls_map){ vol->nls_map=load_nls_default(); + if (vol->nls_map) + vol->nct=nct_map | (vol->nct&nct_uni_xlate); + } return 1; needs_arg: diff -urN v2.2.15/linux/fs/ntfs/support.c linux/fs/ntfs/support.c --- v2.2.15/linux/fs/ntfs/support.c Mon Apr 12 10:05:58 1999 +++ linux/fs/ntfs/support.c Wed Jun 7 14:26:44 2000 @@ -218,7 +218,7 @@ int *out_len) { int i,o,val; - char *result,*buf; + char *result,*buf,tmp[20]; struct nls_table* nls=vol->nls_map; result=ntfs_malloc(in_len+1); @@ -237,11 +237,18 @@ continue; } }else{ - uni_page=nls->page_uni2charset[ch]; - if(uni_page && uni_page[cl]){ - result[o++]=uni_page[cl]; - continue; + int len, i1; + nls->uni2char(ch, cl, tmp, 20, &len); + if (len > 1){ + buf=ntfs_malloc(*out_len + len - 1); + memcpy(buf, result, o); + ntfs_free(result); + result=buf; + *out_len+=(len-1); } + for (i1=0;i1nct & nct_uni_xlate))goto inval; /* realloc */ @@ -290,11 +297,16 @@ *out=result=ntfs_malloc(2*in_len); if(!result)return ENOMEM; *out_len=in_len; - for(i=o=0;inct & nct_uni_xlate)==0){ - cl=nls->charset2uni[(unsigned char)in[i]].uni1; - ch=nls->charset2uni[(unsigned char)in[i]].uni2; + int len; + unsigned char clc=cl, chc=ch; + nls->char2uni(&in[i], &len, &chc, &clc); + cl = chc; + ch = clc; + *out_len -= (len-1); + i += (len-1); }else{ unsigned char c1,c2,c3; *out_len-=3; diff -urN v2.2.15/linux/fs/proc/array.c linux/fs/proc/array.c --- v2.2.15/linux/fs/proc/array.c Wed May 3 17:16:46 2000 +++ linux/fs/proc/array.c Wed Jun 7 14:26:44 2000 @@ -276,7 +276,8 @@ "disk_wblk %u %u %u %u\n" "page %u %u\n" #ifdef CONFIG_ARCH_S390 - "swap %u %u\n", + "swap %u %u\n" + "intr 1 0", #else "swap %u %u\n" "intr %u", @@ -291,7 +292,8 @@ "disk_wblk %u %u %u %u\n" "page %u %u\n" #ifdef CONFIG_ARCH_S390 - "swap %u %u\n", + "swap %u %u\n" + "intr 1 0", #else "swap %u %u\n" "intr %u", @@ -649,6 +651,26 @@ fp = rw->ins[6] + bias; } while (++count < 16); } +#elif defined (__s390__) + { + unsigned long ksp, backchain, ip; + unsigned long stack_page; + int count = 0; + + stack_page = (unsigned long)p; + ksp = p->tss.ksp; + if (!stack_page || ksp < stack_page || ksp >= 8188+stack_page) + return 0; + backchain = (*(unsigned long *) ksp) & 0x7fffffff; + do { + if (backchain < stack_page || backchain >= 8188+stack_page) + return 0; + ip = (*(unsigned long *) (backchain+56)) & 0x7fffffff; + if (ip < first_sched || ip >= last_sched) + return ip; + backchain = (*(unsigned long *) backchain) & 0x7fffffff; + } while (count++ < 16); + } #endif return 0; @@ -1464,7 +1486,7 @@ case PROC_PID_CPU: return 0; } - if ((current->fsuid == euid && ok) || capable(CAP_DAC_OVERRIDE)) + if(capable(CAP_DAC_OVERRIDE) || (current->fsuid == euid && ok)) return 0; return 1; } diff -urN v2.2.15/linux/fs/proc/generic.c linux/fs/proc/generic.c --- v2.2.15/linux/fs/proc/generic.c Mon Aug 24 13:02:44 1998 +++ linux/fs/proc/generic.c Wed Jun 7 14:26:44 2000 @@ -198,9 +198,13 @@ { switch (orig) { case 0: + if (offset < 0) + return -EINVAL; file->f_pos = offset; return(file->f_pos); case 1: + if (offset + file->f_pos < 0) + return -EINVAL; file->f_pos += offset; return(file->f_pos); case 2: diff -urN v2.2.15/linux/fs/proc/proc_tty.c linux/fs/proc/proc_tty.c --- v2.2.15/linux/fs/proc/proc_tty.c Tue Aug 4 10:57:13 1998 +++ linux/fs/proc/proc_tty.c Wed Jun 7 14:26:44 2000 @@ -93,7 +93,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } @@ -123,7 +123,7 @@ *eof = 1; if (off >= len+begin) return 0; - *start = page + (begin-off); + *start = page + (off-begin); return ((count < begin+len-off) ? count : begin+len-off); } diff -urN v2.2.15/linux/fs/read_write.c linux/fs/read_write.c --- v2.2.15/linux/fs/read_write.c Tue Jan 4 10:12:23 2000 +++ linux/fs/read_write.c Wed Jun 7 14:26:44 2000 @@ -214,6 +214,9 @@ for (i = 0 ; i < count ; i++) tot_len += iov[i].iov_len; + if((long) tot_len <0) + return -EINVAL; + inode = file->f_dentry->d_inode; /* VERIFY_WRITE actually means a read, as we write to user space */ ret = locks_verify_area((type == VERIFY_WRITE diff -urN v2.2.15/linux/fs/smbfs/cache.c linux/fs/smbfs/cache.c --- v2.2.15/linux/fs/smbfs/cache.c Sun Mar 7 15:25:23 1999 +++ linux/fs/smbfs/cache.c Wed Jun 7 14:26:44 2000 @@ -58,9 +58,9 @@ */ for (i = 0; i < cachep->pages; i++, index++) { #ifdef SMBFS_PARANOIA -if (index->block) -printk("smb_get_dircache: cache %s/%s has existing block!\n", -dentry->d_parent->d_name.name, dentry->d_name.name); + if (index->block) + printk(KERN_DEBUG "smb_get_dircache: cache %s/%s has existing block!\n", + dentry->d_parent->d_name.name, dentry->d_name.name); #endif offset = PAGE_SIZE + (i << PAGE_SHIFT); block = (struct cache_block *) get_cached_page(inode, @@ -182,8 +182,8 @@ goto out_full; index++; #ifdef SMBFS_PARANOIA -if (index->block) -printk("smb_add_to_cache: new index already has block!\n"); + if (index->block) + printk(KERN_DEBUG "smb_add_to_cache: new index already has block!\n"); #endif /* @@ -257,8 +257,8 @@ int result; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_refill_dircache: cache %s/%s, blocks=%d\n", -dentry->d_parent->d_name.name, dentry->d_name.name, cachep->pages); + printk(KERN_DEBUG "smb_refill_dircache: cache %s/%s, blocks=%d\n", + dentry->d_parent->d_name.name, dentry->d_name.name, cachep->pages); #endif /* * Fill the cache, starting at position 2. @@ -269,7 +269,7 @@ if (result < 0) { #ifdef SMBFS_PARANOIA -printk("smb_refill_dircache: readdir failed, result=%d\n", result); + printk(KERN_DEBUG "smb_refill_dircache: readdir failed, result=%d\n", result); #endif goto out; } @@ -281,7 +281,7 @@ if (!(inode->u.smbfs_i.cache_valid & SMB_F_CACHEVALID)) { #ifdef SMBFS_PARANOIA -printk("smb_refill_dircache: cache invalidated, retrying\n"); + printk(KERN_DEBUG "smb_refill_dircache: cache invalidated, retrying\n"); #endif goto retry; } @@ -290,6 +290,7 @@ if (!result) { cachep->valid = 1; + cachep->mtime = dentry->d_inode->i_mtime; } #ifdef SMBFS_DEBUG_VERBOSE printk("smb_refill_cache: cache %s/%s status=%d, entries=%d\n", diff -urN v2.2.15/linux/fs/smbfs/dir.c linux/fs/smbfs/dir.c --- v2.2.15/linux/fs/smbfs/dir.c Sat May 8 17:56:37 1999 +++ linux/fs/smbfs/dir.c Wed Jun 7 14:26:44 2000 @@ -80,13 +80,28 @@ { struct dentry *dentry = filp->f_dentry; struct inode *dir = dentry->d_inode; - struct cache_head *cachep; + struct cache_head *cachep = NULL; int result; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_readdir: reading %s/%s, f_pos=%d\n", -dentry->d_parent->d_name.name, dentry->d_name.name, (int) filp->f_pos); + printk("smb_readdir: reading %s/%s, f_pos=%d\n", + dentry->d_parent->d_name.name, dentry->d_name.name, (int) filp->f_pos); #endif + + result = 0; + switch ((unsigned int) filp->f_pos) + { + case 0: + if (filldir(dirent, ".", 1, 0, dir->i_ino) < 0) + goto out; + filp->f_pos = 1; + case 1: + if (filldir(dirent, "..", 2, 1, + dentry->d_parent->d_inode->i_ino) < 0) + goto out; + filp->f_pos = 2; + } + /* * Make sure our inode is up-to-date. */ @@ -103,26 +118,16 @@ /* * Make sure the cache is up-to-date. */ - if (!cachep->valid) + if (!cachep->valid || + (cachep->mtime != dentry->d_inode->i_mtime && + filp->f_pos == 2)) { result = smb_refill_dircache(cachep, dentry); if (result) - goto out_free; + goto out; } result = 0; - switch ((unsigned int) filp->f_pos) - { - case 0: - if (filldir(dirent, ".", 1, 0, dir->i_ino) < 0) - goto out_free; - filp->f_pos = 1; - case 1: - if (filldir(dirent, "..", 2, 1, - dentry->d_parent->d_inode->i_ino) < 0) - goto out_free; - filp->f_pos = 2; - } while (1) { @@ -152,9 +157,10 @@ /* * Release the dircache. */ -out_free: - smb_free_dircache(cachep); out: + if (cachep) { + smb_free_dircache(cachep); + } return result; } @@ -172,16 +178,6 @@ printk("smb_dir_open: (%s/%s)\n", dentry->d_parent->d_name.name, file->f_dentry->d_name.name); #endif - /* - * Directory timestamps in the core protocol aren't updated - * when a file is added, so we give them a very short TTL. - */ - if (server->opt.protocol < SMB_PROTOCOL_LANMAN2) - { - unsigned long age = jiffies - dir->u.smbfs_i.oldmtime; - if (age > 2*HZ) - smb_invalid_dir_cache(dir); - } if (server->conn_pid) error = smb_revalidate_inode(dentry); @@ -231,8 +227,8 @@ if (is_bad_inode(inode)) { #ifdef SMBFS_PARANOIA -printk("smb_lookup_validate: %s/%s has dud inode\n", -dentry->d_parent->d_name.name, dentry->d_name.name); + printk(KERN_DEBUG "smb_lookup_validate: %s/%s has dud inode\n", + dentry->d_parent->d_name.name, dentry->d_name.name); #endif valid = 0; } else if (!valid) @@ -295,8 +291,8 @@ if (is_bad_inode(dentry->d_inode)) { #ifdef SMBFS_PARANOIA -printk("smb_delete_dentry: bad inode, unhashing %s/%s\n", -dentry->d_parent->d_name.name, dentry->d_name.name); + printk(KERN_DEBUG "smb_delete_dentry: bad inode, unhashing %s/%s\n", + dentry->d_parent->d_name.name, dentry->d_name.name); #endif d_drop(dentry); } @@ -337,9 +333,9 @@ error = smb_proc_getattr(dentry, &finfo); #ifdef SMBFS_PARANOIA -if (error && error != -ENOENT) -printk("smb_lookup: find %s/%s failed, error=%d\n", -dentry->d_parent->d_name.name, dentry->d_name.name, error); + if (error && error != -ENOENT) + printk(KERN_DEBUG "smb_lookup: find %s/%s failed, error=%d\n", + dentry->d_parent->d_name.name, dentry->d_name.name, error); #endif inode = NULL; @@ -404,8 +400,8 @@ if (have_id) { #ifdef SMBFS_PARANOIA -printk("smb_instantiate: %s/%s failed, error=%d, closing %u\n", -dentry->d_parent->d_name.name, dentry->d_name.name, error, fileid); + printk(KERN_DEBUG "smb_instantiate: %s/%s failed, error=%d, closing %u\n", + dentry->d_parent->d_name.name, dentry->d_name.name, error, fileid); #endif smb_close_fileid(dentry, fileid); } @@ -424,7 +420,6 @@ dentry->d_parent->d_name.name, dentry->d_name.name, mode); #endif - smb_invalid_dir_cache(dir); error = smb_proc_create(dentry, 0, CURRENT_TIME, &fileid); if (!error) { @@ -432,8 +427,8 @@ } else { #ifdef SMBFS_PARANOIA -printk("smb_create: %s/%s failed, error=%d\n", -dentry->d_parent->d_name.name, dentry->d_name.name, error); + printk(KERN_DEBUG "smb_create: %s/%s failed, error=%d\n", + dentry->d_parent->d_name.name, dentry->d_name.name, error); #endif } return error; @@ -445,7 +440,6 @@ { int error; - smb_invalid_dir_cache(dir); error = smb_proc_mkdir(dentry); if (!error) { @@ -472,7 +466,6 @@ if (!list_empty(&dentry->d_hash)) goto out; - smb_invalid_dir_cache(dir); error = smb_proc_rmdir(dentry); out: @@ -489,7 +482,6 @@ */ smb_close(dentry->d_inode); - smb_invalid_dir_cache(dir); error = smb_proc_unlink(dentry); if (!error) { @@ -518,8 +510,8 @@ if (error) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_rename: unlink %s/%s, error=%d\n", -new_dentry->d_parent->d_name.name, new_dentry->d_name.name, error); + printk(KERN_DEBUG "smb_rename: unlink %s/%s, error=%d\n", + new_dentry->d_parent->d_name.name, new_dentry->d_name.name, error); #endif goto out; } @@ -527,8 +519,6 @@ d_delete(new_dentry); } - smb_invalid_dir_cache(old_dir); - smb_invalid_dir_cache(new_dir); error = smb_proc_mv(old_dentry, new_dentry); if (!error) { diff -urN v2.2.15/linux/fs/smbfs/file.c linux/fs/smbfs/file.c --- v2.2.15/linux/fs/smbfs/file.c Wed May 3 17:16:47 2000 +++ linux/fs/smbfs/file.c Wed Jun 7 14:26:44 2000 @@ -71,7 +71,7 @@ if (result < 0) { #ifdef SMBFS_PARANOIA -printk("smb_readpage_sync: %s/%s open failed, error=%d\n", +printk(KERN_DEBUG "smb_readpage_sync: %s/%s open failed, error=%d\n", dentry->d_parent->d_name.name, dentry->d_name.name, result); #endif goto io_error; @@ -112,7 +112,7 @@ pr_debug("SMB: smb_readpage %08lx\n", page_address(page)); #ifdef SMBFS_PARANOIA if (test_bit(PG_locked, &page->flags)) - printk("smb_readpage: page already locked!\n"); + printk(KERN_DEBUG "smb_readpage: page already locked!\n"); #endif set_bit(PG_locked, &page->flags); atomic_inc(&page->count); @@ -136,7 +136,7 @@ offset += page->offset; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_writepage_sync: file %s/%s, count=%d@%ld, wsize=%d\n", +printk(KERN_DEBUG "smb_writepage_sync: file %s/%s, count=%d@%ld, wsize=%d\n", dentry->d_parent->d_name.name, dentry->d_name.name, count, offset, wsize); #endif @@ -150,7 +150,7 @@ /* N.B. what if result < wsize?? */ #ifdef SMBFS_PARANOIA if (result < wsize) -printk("smb_writepage_sync: short write, wsize=%d, result=%d\n", wsize, result); +printk(KERN_DEBUG "smb_writepage_sync: short write, wsize=%d, result=%d\n", wsize, result); #endif buffer += wsize; offset += wsize; @@ -179,7 +179,7 @@ #ifdef SMBFS_PARANOIA if (test_bit(PG_locked, &page->flags)) - printk("smb_writepage: page already locked!\n"); + printk(KERN_DEBUG "smb_writepage: page already locked!\n"); #endif set_bit(PG_locked, &page->flags); atomic_inc(&page->count); @@ -208,7 +208,7 @@ ssize_t status; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_file_read: file %s/%s, count=%lu@%lu\n", +printk(KERN_DEBUG "smb_file_read: file %s/%s, count=%lu@%lu\n", dentry->d_parent->d_name.name, dentry->d_name.name, (unsigned long) count, (unsigned long) *ppos); #endif @@ -217,14 +217,14 @@ if (status) { #ifdef SMBFS_PARANOIA -printk("smb_file_read: %s/%s validation failed, error=%d\n", +printk(KERN_DEBUG "smb_file_read: %s/%s validation failed, error=%d\n", dentry->d_parent->d_name.name, dentry->d_name.name, status); #endif goto out; } #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_file_read: before read, size=%ld, pages=%ld, flags=%x, atime=%ld\n", +printk(KERN_DEBUG "smb_file_read: before read, size=%ld, pages=%ld, flags=%x, atime=%ld\n", dentry->d_inode->i_size, dentry->d_inode->i_nrpages, dentry->d_inode->i_flags, dentry->d_inode->i_atime); #endif @@ -240,7 +240,7 @@ int status; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_file_mmap: file %s/%s, address %lu - %lu\n", +printk(KERN_DEBUG "smb_file_mmap: file %s/%s, address %lu - %lu\n", dentry->d_parent->d_name.name, dentry->d_name.name, vma->vm_start, vma->vm_end); #endif @@ -248,7 +248,7 @@ if (status) { #ifdef SMBFS_PARANOIA -printk("smb_file_mmap: %s/%s validation failed, error=%d\n", +printk(KERN_DEBUG "smb_file_mmap: %s/%s validation failed, error=%d\n", dentry->d_parent->d_name.name, dentry->d_name.name, status); #endif goto out; @@ -268,7 +268,7 @@ ssize_t result; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_file_write: file %s/%s, count=%lu@%lu, pages=%ld\n", +printk(KERN_DEBUG "smb_file_write: file %s/%s, count=%lu@%lu, pages=%ld\n", dentry->d_parent->d_name.name, dentry->d_name.name, (unsigned long) count, (unsigned long) *ppos, dentry->d_inode->i_nrpages); #endif @@ -277,7 +277,7 @@ if (result) { #ifdef SMBFS_PARANOIA -printk("smb_file_write: %s/%s validation failed, error=%d\n", +printk(KERN_DEBUG "smb_file_write: %s/%s validation failed, error=%d\n", dentry->d_parent->d_name.name, dentry->d_name.name, result); #endif goto out; @@ -291,7 +291,7 @@ { result = generic_file_write(file, buf, count, ppos); #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_file_write: pos=%ld, size=%ld, mtime=%ld, atime=%ld\n", +printk(KERN_DEBUG "smb_file_write: pos=%ld, size=%ld, mtime=%ld, atime=%ld\n", (long) file->f_pos, dentry->d_inode->i_size, dentry->d_inode->i_mtime, dentry->d_inode->i_atime); #endif @@ -304,7 +304,7 @@ smb_file_open(struct inode *inode, struct file * file) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_file_open: opening %s/%s, d_count=%d\n", +printk(KERN_DEBUG "smb_file_open: opening %s/%s, d_count=%d\n", file->f_dentry->d_parent->d_name.name, file->f_dentry->d_name.name, file->f_dentry->d_count); #endif @@ -317,7 +317,7 @@ struct dentry * dentry = file->f_dentry; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_file_release: closing %s/%s, d_count=%d\n", +printk(KERN_DEBUG "smb_file_release: closing %s/%s, d_count=%d\n", dentry->d_parent->d_name.name, dentry->d_name.name, dentry->d_count); #endif @@ -340,7 +340,7 @@ int error = 0; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_file_permission: mode=%x, mask=%x\n", mode, mask); +printk(KERN_DEBUG "smb_file_permission: mode=%x, mask=%x\n", mode, mask); #endif /* Look at user permissions */ mode >>= 6; diff -urN v2.2.15/linux/fs/smbfs/inode.c linux/fs/smbfs/inode.c --- v2.2.15/linux/fs/smbfs/inode.c Sun Jun 13 19:54:06 1999 +++ linux/fs/smbfs/inode.c Wed Jun 7 14:26:44 2000 @@ -204,7 +204,7 @@ * subsequent lookup validations will fail. */ #ifdef SMBFS_PARANOIA -printk("smb_refresh_inode: %s/%s changed mode, %07o to %07o\n", +printk(KERN_DEBUG "smb_refresh_inode: %s/%s changed mode, %07o to %07o\n", dentry->d_parent->d_name.name, dentry->d_name.name, inode->i_mode, fattr.f_mode); #endif @@ -255,7 +255,7 @@ if (time_before(jiffies, inode->u.smbfs_i.oldmtime + HZ/10)) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_revalidate_inode: up-to-date, jiffies=%lu, oldtime=%lu\n", +printk(KERN_DEBUG "smb_revalidate_inode: up-to-date, jiffies=%lu, oldtime=%lu\n", jiffies, inode->u.smbfs_i.oldmtime); #endif goto out; @@ -270,14 +270,12 @@ if (error || inode->i_mtime != last_time) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_revalidate: %s/%s changed, old=%ld, new=%ld\n", +printk(KERN_DEBUG "smb_revalidate: %s/%s changed, old=%ld, new=%ld\n", dentry->d_parent->d_name.name, dentry->d_name.name, (long) last_time, (long) inode->i_mtime); #endif if (!S_ISDIR(inode->i_mode)) invalidate_inode_pages(inode); - else - smb_invalid_dir_cache(inode); } out: return error; @@ -304,7 +302,7 @@ { pr_debug("smb_delete_inode\n"); if (smb_close(ino)) - printk("smb_delete_inode: could not close inode %ld\n", + printk(KERN_DEBUG "smb_delete_inode: could not close inode %ld\n", ino->i_ino); clear_inode(ino); } @@ -381,13 +379,6 @@ mnt->dir_mode &= (S_IRWXU | S_IRWXG | S_IRWXO); mnt->dir_mode |= S_IFDIR; sb->u.smbfs_sb.mnt = mnt; - /* - * Display the enabled options - */ - if (mnt->version & SMB_FIX_OLDATTR) - printk("SMBFS: Using core getattr (Win 95 speedup)\n"); - else if (mnt->version & SMB_FIX_DIRATTR) - printk("SMBFS: Using dir ff getattr\n"); /* * Keep the super block locked while we get the root inode. @@ -419,7 +410,7 @@ printk(KERN_ERR "SMBFS: need mount version %d\n", SMB_MOUNT_VERSION); goto out_fail; out_no_data: - printk("smb_read_super: missing data argument\n"); + printk(KERN_DEBUG "smb_read_super: missing data argument\n"); out_fail: sb->s_dev = 0; MOD_DEC_USE_COUNT; @@ -471,7 +462,7 @@ if ((attr->ia_valid & ATTR_SIZE) != 0) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_notify_change: changing %s/%s, old size=%ld, new size=%ld\n", +printk(KERN_DEBUG "smb_notify_change: changing %s/%s, old size=%ld, new size=%ld\n", dentry->d_parent->d_name.name, dentry->d_name.name, (long) inode->i_size, (long) attr->ia_size); #endif @@ -510,9 +501,7 @@ if ((attr->ia_valid & ATTR_ATIME) != 0) { fattr.f_atime = attr->ia_atime; - /* Earlier protocols don't have an access time */ - if (server->opt.protocol >= SMB_PROTOCOL_LANMAN2) - changed = 1; + changed = 1; } if (changed) { @@ -529,8 +518,8 @@ if ((attr->ia_valid & ATTR_MODE) != 0) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_notify_change: %s/%s mode change, old=%x, new=%lx\n", -dentry->d_parent->d_name.name, dentry->d_name.name, fattr.f_mode,attr->ia_mode); + printk(KERN_DEBUG "smb_notify_change: %s/%s mode change, old=%x, new=%lx\n", + dentry->d_parent->d_name.name, dentry->d_name.name, fattr.f_mode,attr->ia_mode); #endif changed = 0; if (attr->ia_mode & S_IWUSR) diff -urN v2.2.15/linux/fs/smbfs/proc.c linux/fs/smbfs/proc.c --- v2.2.15/linux/fs/smbfs/proc.c Tue Jan 4 10:12:23 2000 +++ linux/fs/smbfs/proc.c Wed Jun 7 14:26:44 2000 @@ -12,6 +12,11 @@ * - don't sleep every time with win95 on a FINDNEXT * - fixed loop_count bug * - got rid of resume_key + * Jan 2000, cpg@aladdin.de + * - added posix semantics for unlink + * March 2000, tridge + * - removed support for old protocol levels. It didn't work anyway and + * was cluttering things up a lot. */ #include @@ -34,6 +39,7 @@ /* #define SMBFS_DEBUG_TIMESTAMP 1 */ /* #define SMBFS_DEBUG_VERBOSE 1 */ /* #define pr_debug printk */ +#define SMBFS_POSIX_UNLINK 1 #define SMB_VWV(packet) ((packet) + SMB_HEADER_LEN) #define SMB_CMD(packet) (*(packet+8)) @@ -49,39 +55,19 @@ static int smb_proc_setattr_ext(struct smb_sb_info *, struct inode *, struct smb_fattr *); -static inline int -min(int a, int b) -{ - return a < b ? a : b; -} - -static void -str_upper(char *name, int len) -{ - while (len--) - { - if (*name >= 'a' && *name <= 'z') - *name -= ('a' - 'A'); - name++; - } -} +static int +smb_proc_setattr_core(struct smb_sb_info *server, struct dentry *dentry, + __u16 attr); -static void -str_lower(char *name, int len) -{ - while (len--) - { - if (*name >= 'A' && *name <= 'Z') - *name += ('a' - 'A'); - name++; - } -} +static int +smb_proc_do_getattr(struct dentry *dir, struct smb_fattr *fattr,struct smb_sb_info *server); +/* reverse a string inline. This is used by the dircache walking routines */ static void reverse_string(char *buf, int len) { char c; char *end = buf+len-1; - while(buf < end) { + while (buf < end) { c = *buf; *(buf++) = *end; *(end--) = c; @@ -163,13 +149,8 @@ static char *smb_encode_path(struct smb_sb_info *server, char *buf, struct dentry *dir, struct qstr *name) { - char *start = buf; - buf += smb_build_path(dir, name, buf); - if (server->opt.protocol <= SMB_PROTOCOL_COREPLUS) - str_upper(start, buf - start); - return buf; } @@ -542,7 +523,7 @@ if (server->state == CONN_VALID) { #ifdef SMBFS_PARANOIA -printk("smb_retry: new pid=%d, generation=%d\n", +printk(KERN_DEBUG "smb_retry: new pid=%d, generation=%d\n", server->conn_pid, server->generation); #endif result = 1; @@ -587,7 +568,7 @@ if (smb_valid_packet(s->packet) != 0) { #ifdef SMBFS_PARANOIA -printk("smb_request_ok: invalid packet!\n"); +printk(KERN_DEBUG "smb_request_ok: invalid packet!\n"); #endif goto out; } @@ -601,7 +582,7 @@ { result = -smb_errno(s); if (!result) - printk("smb_request_ok: rcls=%d, err=%d mapped to 0\n", + printk(KERN_DEBUG "smb_request_ok: rcls=%d, err=%d mapped to 0\n", s->rcls, s->err); /* * Exit now even if the error was squashed ... @@ -630,7 +611,7 @@ int error; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_newconn: fd=%d, pid=%d\n", opt->fd, current->pid); +printk(KERN_DEBUG "smb_newconn: fd=%d, pid=%d\n", opt->fd, current->pid); #endif /* * Make sure we don't already have a pid ... @@ -644,6 +625,11 @@ !capable(CAP_SYS_ADMIN)) goto out; + if (opt->protocol < SMB_PROTOCOL_NT1) { + printk(KERN_NOTICE " smbfs: protocols older than NT1 are not suppported\n"); + goto out; + } + error = -EBADF; filp = fget(opt->fd); if (!filp) @@ -666,17 +652,16 @@ /* now that we have an established connection we can detect the server type and enable bug workarounds */ - if (server->opt.protocol == SMB_PROTOCOL_NT1 && - (server->opt.max_xmit < 0x1000) && + if ((server->opt.max_xmit < 0x1000) && !(server->opt.capabilities & SMB_CAP_NT_SMBS)) { server->mnt->version |= SMB_FIX_WIN95; #ifdef SMBFS_DEBUG_VERBOSE - printk("smb_newconn: detected WIN95 server\n"); + printk(KERN_NOTICE "smb_newconn: detected WIN95 server\n"); #endif } #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_newconn: protocol=%d, max_xmit=%d, pid=%d capabilities=0x%x\n", +printk(KERN_DEBUG "smb_newconn: protocol=%d, max_xmit=%d, pid=%d capabilities=0x%x\n", server->opt.protocol, server->opt.max_xmit, server->conn_pid, server->opt.capabilities); #endif @@ -701,7 +686,7 @@ __u8 *buf = server->packet; if (xmit_len > server->packet_size) -printk("smb_setup_header: Aieee, xmit len > packet! len=%d, size=%d\n", +printk(KERN_DEBUG "smb_setup_header: Aieee, xmit len > packet! len=%d, size=%d\n", xmit_len, server->packet_size); p = smb_encode_smb_length(p, xmit_len - 4); @@ -721,11 +706,8 @@ WSET(buf, smb_uid, server->opt.server_uid); WSET(buf, smb_mid, 1); - if (server->opt.protocol > SMB_PROTOCOL_CORE) - { - *(buf+smb_flg) = 0x8; - WSET(buf, smb_flg2, 0x3); - } + *(buf+smb_flg) = 0x8; + WSET(buf, smb_flg2, 0x3); *p++ = wct; /* wct */ p += 2 * wct; WSET(p, 0, bcc); @@ -784,7 +766,7 @@ (error == -EACCES || error == -ETXTBSY || error == -EROFS)) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_open: %s/%s R/W failed, error=%d, retrying R/O\n", +printk(KERN_DEBUG "smb_proc_open: %s/%s R/W failed, error=%d, retrying R/O\n", DENTRY_PATH(dentry), error); #endif mode = read_only; @@ -818,7 +800,7 @@ result = -ENOENT; if (!inode) { - printk("smb_open: no inode for dentry %s/%s\n", + printk(KERN_DEBUG "smb_open: no inode for dentry %s/%s\n", DENTRY_PATH(dentry)); goto out; } @@ -839,7 +821,7 @@ if (result) { #ifdef SMBFS_PARANOIA -printk("smb_open: %s/%s open failed, result=%d\n", +printk(KERN_DEBUG "smb_open: %s/%s open failed, result=%d\n", DENTRY_PATH(dentry), result); #endif goto out; @@ -858,7 +840,7 @@ inode->u.smbfs_i.access != SMB_O_RDWR) { #ifdef SMBFS_PARANOIA -printk("smb_open: %s/%s access denied, access=%x, wish=%x\n", +printk(KERN_DEBUG "smb_open: %s/%s access denied, access=%x, wish=%x\n", DENTRY_PATH(dentry), inode->u.smbfs_i.access, wish); #endif result = -EACCES; @@ -911,9 +893,7 @@ * If the file is open with write permissions, * update the time stamps to sync mtime and atime. */ - if ((server->opt.protocol >= SMB_PROTOCOL_LANMAN2) && - !(ino->u.smbfs_i.access == SMB_O_RDONLY)) - { + if (ino->u.smbfs_i.access != SMB_O_RDONLY) { struct smb_fattr fattr; smb_get_inode_attr(ino, &fattr); smb_proc_setattr_ext(server, ino, &fattr); @@ -923,11 +903,8 @@ ino->i_mtime); ino->u.smbfs_i.cache_valid &= ~SMB_F_LOCALWRITE; /* - * Force a revalidation after closing ... some servers - * don't post the size until the file has been closed. + * Force a revalidation after closing */ - if (server->opt.protocol < SMB_PROTOCOL_NT1) - ino->u.smbfs_i.oldmtime = 0; ino->u.smbfs_i.closed = jiffies; } return result; @@ -974,7 +951,7 @@ if (dentry->d_count <= 1) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_close_dentry: closing %s/%s, count=%d\n", +printk(KERN_DEBUG "smb_close_dentry: closing %s/%s, count=%d\n", DENTRY_PATH(dentry), dentry->d_count); #endif smb_proc_close_inode(server, ino); @@ -982,7 +959,7 @@ smb_unlock_server(server); } #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_close_dentry: closed %s/%s, count=%d\n", +printk(KERN_DEBUG "smb_close_dentry: closed %s/%s, count=%d\n", DENTRY_PATH(dentry), dentry->d_count); #endif } @@ -1042,7 +1019,7 @@ out: #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_read: file %s/%s, count=%d, result=%d\n", +printk(KERN_DEBUG "smb_proc_read: file %s/%s, count=%d, result=%d\n", DENTRY_PATH(dentry), count, result); #endif smb_unlock_server(server); @@ -1057,7 +1034,7 @@ __u8 *p; #if SMBFS_DEBUG_VERBOSE -printk("smb_proc_write: file %s/%s, count=%d@%ld, packet_size=%d\n", +printk(KERN_DEBUG "smb_proc_write: file %s/%s, count=%d@%ld, packet_size=%d\n", DENTRY_PATH(dentry), count, offset, server->packet_size); #endif smb_lock_server(server); @@ -1184,11 +1161,36 @@ return smb_proc_generic_command(dentry, SMBrmdir); } + +/* + * Note: called with the server locked. + * removes readonly attribute from a file. Used by unlink to give posix semantics + */ +static int +smb_set_rw(struct dentry *dentry,struct smb_sb_info *server) +{ + int result; + struct smb_fattr fattr; + + /* first get current attribute */ + + result = smb_proc_do_getattr(dentry, &fattr, server); + if (result < 0) return result; + + /* if RONLY attribute is set, remove it */ + if (fattr.attr & aRONLY) { /* read only attribute is set */ + fattr.attr &= ~aRONLY; + result = smb_proc_setattr_core(server, dentry, fattr.attr); + } + return result; +} + int smb_proc_unlink(struct dentry *dentry) { struct smb_sb_info *server = server_from_dentry(dentry); char *p; + int flag = 0; int result; smb_lock_server(server); @@ -1202,6 +1204,27 @@ if ((result = smb_request_ok(server, SMBunlink, 0, 0)) < 0) { +#if SMBFS_POSIX_UNLINK + if (result == -EACCES && !flag) { + /* Posix semantics is for the read-only state + of a file to be ignored in unlink(). In the + SMB world a unlink() is refused on a + read-only file. To make things easier for + unix users we try to override the files + permission if the unlink fails with the + right error. + + This introduces a race condition that could + lead to a file being written by someone who + shouldn't have access, but as far as I can + tell that is unavoidable */ + result = smb_set_rw(dentry,server); /* remove RONLY attribute */ + if (result == 0) { + flag = 1; + goto retry; /* and try again */ + } + } +#endif if (smb_retry(server)) goto retry; goto out; @@ -1285,178 +1308,10 @@ smb_finish_dirent(server, fattr); } -/* - * Note that we are now returning the name as a reference to avoid - * an extra copy, and that the upper/lower casing is done in place. - * - * Bugs Noted: - * (1) Pathworks servers may pad the name with extra spaces. - */ -static __u8 * -smb_decode_dirent(struct smb_sb_info *server, __u8 *p, - struct cache_dirent *entry) -{ - int len; - - /* - * SMB doesn't have a concept of inode numbers ... - */ - entry->ino = 0; - - p += SMB_STATUS_SIZE; /* reserved (search_status) */ - entry->name = p + 9; - len = strlen(entry->name); - if (len > 12) - { - len = 12; - } - /* - * Trim trailing blanks for Pathworks servers - */ - while (len > 2 && entry->name[len-1] == ' ') - len--; - entry->len = len; - - switch (server->opt.case_handling) - { - case SMB_CASE_UPPER: - str_upper(entry->name, len); - break; - case SMB_CASE_LOWER: - str_lower(entry->name, len); - break; - default: - break; - } - pr_debug("smb_decode_dirent: len=%d, name=%s\n", len, entry->name); - return p + 22; -} - -/* This routine is used to read in directory entries from the network. - Note that it is for short directory name seeks, i.e.: protocol < - SMB_PROTOCOL_LANMAN2 */ - -static int -smb_proc_readdir_short(struct smb_sb_info *server, struct dentry *dir, int fpos, - void *cachep) -{ - char *p; - int result; - int i, first, entries_seen, entries; - int entries_asked = (server->opt.max_xmit - 100) / SMB_DIRINFO_SIZE; - __u16 bcc; - __u16 count; - char status[SMB_STATUS_SIZE]; - static struct qstr mask = { "*.*", 3, 0 }; - -#ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_readdir_short: %s/%s, pos=%d\n", - DENTRY_PATH(dir), fpos); -#endif - - smb_lock_server(server); - - /* N.B. We need to reinitialize the cache to restart */ - retry: - smb_init_dircache(cachep); - first = 1; - entries = 0; - entries_seen = 2; /* implicit . and .. */ - - while (1) - { - p = smb_setup_header(server, SMBsearch, 2, 0); - WSET(server->packet, smb_vwv0, entries_asked); - WSET(server->packet, smb_vwv1, aDIR); - *p++ = 4; - if (first == 1) - { - p = smb_encode_path(server, p, dir, &mask); - *p++ = 5; - WSET(p, 0, 0); - p += 2; - first = 0; - } else - { - *p++ = 0; - *p++ = 5; - WSET(p, 0, SMB_STATUS_SIZE); - p += 2; - memcpy(p, status, SMB_STATUS_SIZE); - p += SMB_STATUS_SIZE; - } - - smb_setup_bcc(server, p); - - result = smb_request_ok(server, SMBsearch, 1, -1); - if (result < 0) - { - if ((server->rcls == ERRDOS) && - (server->err == ERRnofiles)) - break; - if (smb_retry(server)) - goto retry; - goto unlock_return; - } - p = SMB_VWV(server->packet); - count = WVAL(p, 0); - if (count <= 0) - break; - - result = -EIO; - bcc = WVAL(p, 2); - if (bcc != count * SMB_DIRINFO_SIZE + 3) - goto unlock_return; - p += 7; - - /* Read the last entry into the status field. */ - memcpy(status, - SMB_BUF(server->packet) + 3 + - (count - 1) * SMB_DIRINFO_SIZE, - SMB_STATUS_SIZE); - - /* Now we are ready to parse smb directory entries. */ - - for (i = 0; i < count; i++) - { - struct cache_dirent this_ent, *entry = &this_ent; - - p = smb_decode_dirent(server, p, entry); - if (entries_seen == 2 && entry->name[0] == '.') - { - if (entry->len == 1) - continue; - if (entry->name[1] == '.' && entry->len == 2) - continue; - } - if (entries_seen >= fpos) - { - pr_debug("smb_proc_readdir: fpos=%u\n", - entries_seen); - smb_add_to_cache(cachep, entry, entries_seen); - entries++; - } else - { -#ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_readdir: skipped, seen=%d, i=%d, fpos=%d\n", -entries_seen, i, fpos); -#endif - } - entries_seen++; - } - } - result = entries; - - unlock_return: - smb_unlock_server(server); - return result; -} /* - * Interpret a long filename structure using the specified info level: - * level 1 for anything below NT1 protocol - * level 260 for NT1 protocol - * + * Interpret a long filename structure using info level 260 + * We return a reference to the name string to avoid copying, and perform * any needed upper/lower casing in place. @@ -1465,7 +1320,7 @@ */ static char * smb_decode_long_dirent(struct smb_sb_info *server, char *p, - struct cache_dirent *entry, int level) + struct cache_dirent *entry) { char *result; unsigned int len = 0; @@ -1475,46 +1330,18 @@ */ entry->ino = 0; - switch (level) - { - case 1: - len = *((unsigned char *) p + 22); - entry->len = len; - entry->name = p + 23; - result = p + 24 + len; - break; - - case 260: /* SMB_FIND_FILE_BOTH_DIRECTORY_INFO = 0x104 */ - result = p + WVAL(p, 0); - len = DVAL(p, 60); - if (len > 255) len = 255; - /* NT4 null terminates */ - entry->name = p + 94; - if (len && entry->name[len-1] == '\0') - len--; - entry->len = len; + result = p + WVAL(p, 0); + len = DVAL(p, 60); + if (len > 255) len = 255; + /* NT4 null terminates */ + entry->name = p + 94; + if (len && entry->name[len-1] == '\0') + len--; + entry->len = len; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_decode_long_dirent: info 260 at %p, len=%d, name=%s\n", - p, entry->len, entry->name); + printk(KERN_DEBUG "smb_decode_long_dirent: info 260 at %p, len=%d, name=%s\n", + p, entry->len, entry->name); #endif - break; - - default: - printk("smb_decode_long_dirent: Unknown level %d\n", level); - result = p + WVAL(p, 0); - } - - switch (server->opt.case_handling) - { - case SMB_CASE_UPPER: - str_upper(entry->name, len); - break; - case SMB_CASE_LOWER: - str_lower(entry->name, len); - break; - default: - break; - } return result; } @@ -1539,8 +1366,6 @@ char *p, *mask, *param = server->temp_buf; __u16 command; int first, entries, entries_seen; - - /* Both NT and OS/2 accept info level 1 (but see note below). */ int info_level = 260; const int max_matches = 512; @@ -1555,12 +1380,6 @@ int mask_len, i, result; static struct qstr star = { "*", 1, 0 }; - /* - * use info level 1 for older servers that don't do 260 - */ - if (server->opt.protocol < SMB_PROTOCOL_NT1) - info_level = 1; - smb_lock_server(server); retry: @@ -1571,7 +1390,7 @@ mask_len = smb_encode_path(server, mask, dir, &star) - mask; first = 1; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_readdir_long: starting fpos=%d, mask=%s\n", fpos, mask); +printk(KERN_DEBUG "smb_proc_readdir_long: starting fpos=%d, mask=%s\n", fpos, mask); #endif /* * We must reinitialize the dircache when retrying. @@ -1609,7 +1428,7 @@ command = TRANSACT2_FINDNEXT; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_readdir_long: handle=0x%X, mask=%s\n", +printk(KERN_DEBUG "smb_proc_readdir_long: handle=0x%X, mask=%s\n", ff_dir_handle, mask); #endif WSET(param, 0, ff_dir_handle); /* search handle */ @@ -1630,12 +1449,12 @@ if (smb_retry(server)) { #ifdef SMBFS_PARANOIA -printk("smb_proc_readdir_long: error=%d, retrying\n", result); +printk(KERN_DEBUG "smb_proc_readdir_long: error=%d, retrying\n", result); #endif goto retry; } #ifdef SMBFS_PARANOIA -printk("smb_proc_readdir_long: error=%d, breaking\n", result); +printk(KERN_DEBUG "smb_proc_readdir_long: error=%d, breaking\n", result); #endif entries = result; break; @@ -1653,7 +1472,7 @@ if (server->rcls != 0) { #ifdef SMBFS_PARANOIA -printk("smb_proc_readdir_long: name=%s, entries=%d, rcls=%d, err=%d\n", +printk(KERN_DEBUG "smb_proc_readdir_long: name=%s, entries=%d, rcls=%d, err=%d\n", mask, entries, server->rcls, server->err); #endif entries = -smb_errno(server); @@ -1685,8 +1504,7 @@ { struct cache_dirent this_ent, *entry = &this_ent; - p = smb_decode_long_dirent(server, p, entry, - info_level); + p = smb_decode_long_dirent(server, p, entry); /* ignore . and .. from the server */ if (entries_seen == 2 && entry->name[0] == '.') @@ -1705,7 +1523,7 @@ } #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_readdir_long: received %d entries, eos=%d\n", +printk(KERN_DEBUG "smb_proc_readdir_long: received %d entries, eos=%d\n", ff_searchcount, ff_eos); #endif first = 0; @@ -1722,98 +1540,7 @@ struct smb_sb_info *server; server = server_from_dentry(dir); - if (server->opt.protocol >= SMB_PROTOCOL_LANMAN2) - return smb_proc_readdir_long(server, dir, fpos, cachep); - else - return smb_proc_readdir_short(server, dir, fpos, cachep); -} - -/* - * This version uses the trans2 TRANSACT2_FINDFIRST message - * to get the attribute data. - * Note: called with the server locked. - * - * Bugs Noted: - */ -static int -smb_proc_getattr_ff(struct smb_sb_info *server, struct dentry *dentry, - struct smb_fattr *fattr) -{ - char *param = server->temp_buf, *mask = param + 12; - __u16 date, time; - unsigned char *resp_data = NULL; - unsigned char *resp_param = NULL; - int resp_data_len = 0; - int resp_param_len = 0; - int mask_len, result; - -retry: - mask_len = smb_encode_path(server, mask, dentry, NULL) - mask; -#ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_getattr_ff: name=%s, len=%d\n", mask, mask_len); -#endif - WSET(param, 0, aSYSTEM | aHIDDEN | aDIR); - WSET(param, 2, 1); /* max count */ - WSET(param, 4, 1); /* close after this call */ - WSET(param, 6, 1); /* info_level */ - DSET(param, 8, 0); - - result = smb_trans2_request(server, TRANSACT2_FINDFIRST, - 0, NULL, 12 + mask_len + 1, param, - &resp_data_len, &resp_data, - &resp_param_len, &resp_param); - if (result < 0) - { - if (smb_retry(server)) - goto retry; - goto out; - } - if (server->rcls != 0) - { - result = -smb_errno(server); -#ifdef SMBFS_PARANOIA -if (result != -ENOENT) -printk("smb_proc_getattr_ff: error for %s, rcls=%d, err=%d\n", -mask, server->rcls, server->err); -#endif - goto out; - } - /* Make sure we got enough data ... */ - result = -EINVAL; - if (resp_data_len < 22 || WVAL(resp_param, 2) != 1) - { -#ifdef SMBFS_PARANOIA -printk("smb_proc_getattr_ff: bad result for %s, len=%d, count=%d\n", -mask, resp_data_len, WVAL(resp_param, 2)); -#endif - goto out; - } - - /* - * Decode the response into the fattr ... - */ - date = WVAL(resp_data, 0); - time = WVAL(resp_data, 2); - fattr->f_ctime = date_dos2unix(server, date, time); - - date = WVAL(resp_data, 4); - time = WVAL(resp_data, 6); - fattr->f_atime = date_dos2unix(server, date, time); - - date = WVAL(resp_data, 8); - time = WVAL(resp_data, 10); - fattr->f_mtime = date_dos2unix(server, date, time); -#ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_getattr_ff: name=%s, date=%x, time=%x, mtime=%ld\n", -mask, date, time, fattr->f_mtime); -#endif - fattr->f_size = DVAL(resp_data, 12); - /* ULONG allocation size */ - fattr->attr = WVAL(resp_data, 20); - result = 0; - -out: - return result; + return smb_proc_readdir_long(server, dir, fpos, cachep); } /* @@ -1839,12 +1566,21 @@ goto out; } fattr->attr = WVAL(server->packet, smb_vwv0); - fattr->f_mtime = local2utc(server, DVAL(server->packet, smb_vwv1)); - fattr->f_size = DVAL(server->packet, smb_vwv3); - fattr->f_ctime = fattr->f_mtime; + fattr->f_ctime = local2utc(server, DVAL(server->packet, smb_vwv1)); + + /* uggh. If its a directory then its a ctime, otherwise its a + mtime. In order for the dircache to work with Win9X we + have to set the mtime to the current time for directories */ + if (fattr->attr & aDIR) { + fattr->f_mtime = CURRENT_TIME; + } else { + fattr->f_mtime = fattr->f_ctime; + } + fattr->f_atime = fattr->f_mtime; + fattr->f_size = DVAL(server->packet, smb_vwv3); #ifdef SMBFS_DEBUG_TIMESTAMP -printk("getattr_core: %s/%s, mtime=%ld\n", +printk(KERN_DEBUG "getattr_core: %s/%s, mtime=%ld\n", DENTRY_PATH(dir), fattr->f_mtime); #endif result = 0; @@ -1890,7 +1626,7 @@ if (server->rcls != 0) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_getattr_trans2: for %s: result=%d, rcls=%d, err=%d\n", +printk(KERN_DEBUG "smb_proc_getattr_trans2: for %s: result=%d, rcls=%d, err=%d\n", ¶m[6], result, server->rcls, server->err); #endif result = -smb_errno(server); @@ -1900,7 +1636,7 @@ if (resp_data_len < 22) { #ifdef SMBFS_PARANOIA -printk("smb_proc_getattr_trans2: not enough data for %s, len=%d\n", +printk(KERN_DEBUG "smb_proc_getattr_trans2: not enough data for %s, len=%d\n", ¶m[6], resp_data_len); #endif goto out; @@ -1926,7 +1662,7 @@ time = WVAL(resp_data, 8 + off_time); attr->f_mtime = date_dos2unix(server, date, time); #ifdef SMBFS_DEBUG_TIMESTAMP -printk("getattr_trans2: %s/%s, date=%x, time=%x, mtime=%ld\n", +printk(KERN_DEBUG "getattr_trans2: %s/%s, date=%x, time=%x, mtime=%ld\n", DENTRY_PATH(dir), date, time, attr->f_mtime); #endif attr->f_size = DVAL(resp_data, 12); @@ -1937,35 +1673,41 @@ return result; } -int -smb_proc_getattr(struct dentry *dir, struct smb_fattr *fattr) +/* + * Note: called with the server locked. + * + * get the file attribute + */ +static int +smb_proc_do_getattr(struct dentry *dir, struct smb_fattr *fattr,struct smb_sb_info *server) { - struct smb_sb_info *server = server_from_dentry(dir); int result; - smb_lock_server(server); smb_init_dirent(server, fattr); /* * Select whether to use core or trans2 getattr. - */ - if (server->opt.protocol >= SMB_PROTOCOL_LANMAN2) { - /* - * Win 95 appears to break with the trans2 getattr. - */ - if (server->mnt->version & (SMB_FIX_OLDATTR|SMB_FIX_WIN95)) - goto core_attr; - if (server->mnt->version & SMB_FIX_DIRATTR) - result = smb_proc_getattr_ff(server, dir, fattr); - else - result = smb_proc_getattr_trans2(server, dir, fattr); - } else { - core_attr: + * Win 95 appears to break with the trans2 getattr. + */ + if (server->mnt->version & SMB_FIX_WIN95) { result = smb_proc_getattr_core(server, dir, fattr); + } else { + result = smb_proc_getattr_trans2(server, dir, fattr); } smb_finish_dirent(server, fattr); + return result; +} + + +int +smb_proc_getattr(struct dentry *dir, struct smb_fattr *fattr) +{ + struct smb_sb_info *server = server_from_dentry(dir); + int result; + smb_lock_server(server); + result = smb_proc_do_getattr(dir, fattr, server); smb_unlock_server(server); return result; } @@ -2029,7 +1771,7 @@ int result; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_setattr: setting %s/%s, open=%d\n", +printk(KERN_DEBUG "smb_proc_setattr: setting %s/%s, open=%d\n", DENTRY_PATH(dir), smb_is_open(dir->d_inode)); #endif smb_lock_server(server); @@ -2062,7 +1804,7 @@ WSET(server->packet, smb_vwv5, date); WSET(server->packet, smb_vwv6, time); #ifdef SMBFS_DEBUG_TIMESTAMP -printk("smb_proc_setattr_ext: date=%d, time=%d, mtime=%ld\n", +printk(KERN_DEBUG "smb_proc_setattr_ext: date=%d, time=%d, mtime=%ld\n", date, time, fattr->f_mtime); #endif @@ -2112,7 +1854,7 @@ WSET(data, 8, date); WSET(data, 10, time); #ifdef SMBFS_DEBUG_TIMESTAMP -printk("setattr_trans2: %s/%s, date=%x, time=%x, mtime=%ld\n", +printk(KERN_DEBUG "setattr_trans2: %s/%s, date=%x, time=%x, mtime=%ld\n", DENTRY_PATH(dir), date, time, fattr->f_mtime); #endif DSET(data, 12, 0); /* size */ @@ -2159,13 +1901,12 @@ int result; #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_proc_settime: setting %s/%s, open=%d\n", +printk(KERN_DEBUG "smb_proc_settime: setting %s/%s, open=%d\n", DENTRY_PATH(dentry), smb_is_open(inode)); #endif smb_lock_server(server); /* setting the time on a Win95 server fails (tridge) */ - if (server->opt.protocol >= SMB_PROTOCOL_LANMAN2 && - !(server->mnt->version & SMB_FIX_WIN95)) + if (!(server->mnt->version & SMB_FIX_WIN95)) { if (smb_is_open(inode) && inode->u.smbfs_i.access != SMB_O_RDONLY) diff -urN v2.2.15/linux/fs/smbfs/sock.c linux/fs/smbfs/sock.c --- v2.2.15/linux/fs/smbfs/sock.c Wed May 3 17:16:47 2000 +++ linux/fs/smbfs/sock.c Wed Jun 7 14:26:44 2000 @@ -119,7 +119,7 @@ if (job->sk->dead) { #ifdef SMBFS_PARANOIA - printk("smb_data_callback: sock dead!\n"); + printk(KERN_DEBUG "smb_data_callback: sock dead!\n"); #endif break; } @@ -182,7 +182,7 @@ { #ifdef SMBFS_PARANOIA if (!smb_valid_socket(file->f_dentry->d_inode)) - printk("smb_server_sock: bad socket!\n"); + printk(KERN_DEBUG "smb_server_sock: bad socket!\n"); #endif return &file->f_dentry->d_inode->u.socket_i; } @@ -201,7 +201,7 @@ socket = server_sock(server); if (!socket) { - printk("smb_catch_keepalive: did not get valid server!\n"); + printk(KERN_DEBUG "smb_catch_keepalive: did not get valid server!\n"); server->data_ready = NULL; goto out; } @@ -243,21 +243,21 @@ socket = server_sock(server); if (!socket) { - printk("smb_dont_catch_keepalive: did not get valid server!\n"); + printk(KERN_DEBUG "smb_dont_catch_keepalive: did not get valid server!\n"); goto out; } sk = socket->sk; if (sk == NULL) { - printk("smb_dont_catch_keepalive: sk == NULL"); + printk(KERN_DEBUG "smb_dont_catch_keepalive: sk == NULL"); goto out; } /* Is this really an error?? */ if (server->data_ready == NULL) { - printk("smb_dont_catch_keepalive: " + printk(KERN_DEBUG "smb_dont_catch_keepalive: " "server->data_ready == NULL\n"); goto out; } @@ -291,11 +291,11 @@ if (file) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_close_socket: closing socket %p\n", server_sock(server)); +printk(KERN_DEBUG "smb_close_socket: closing socket %p\n", server_sock(server)); #endif #ifdef SMBFS_PARANOIA if (server_sock(server)->sk->data_ready == smb_data_ready) -printk("smb_close_socket: still catching keepalives!\n"); +printk(KERN_DEBUG "smb_close_socket: still catching keepalives!\n"); #endif server->sock_file = NULL; fput(file); @@ -372,7 +372,7 @@ if (result < 0) { #ifdef SMBFS_PARANOIA -printk("smb_get_length: recv error = %d\n", -result); +printk(KERN_DEBUG "smb_get_length: recv error = %d\n", -result); #endif return result; } @@ -388,7 +388,7 @@ default: #ifdef SMBFS_PARANOIA -printk("smb_get_length: Invalid NBT packet, code=%x\n", peek_buf[0]); +printk(KERN_DEBUG "smb_get_length: Invalid NBT packet, code=%x\n", peek_buf[0]); #endif return -EIO; } @@ -449,7 +449,7 @@ if (result < 0) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_receive: receive error: %d\n", result); +printk(KERN_DEBUG "smb_receive: receive error: %d\n", result); #endif goto out; } @@ -458,7 +458,7 @@ #ifdef SMBFS_DEBUG_VERBOSE if (server->rcls != 0) -printk("smb_receive: rcls=%d, err=%d\n", server->rcls, server->err); +printk(KERN_DEBUG "smb_receive: rcls=%d, err=%d\n", server->rcls, server->err); #endif out: return result; @@ -522,7 +522,7 @@ if (parm_count == parm_tot && data_count == data_tot) { #ifdef SMBFS_DEBUG_VERBOSE -printk("smb_receive_trans2: fast track, parm=%u %u %u, data=%u %u %u\n", +printk(KERN_DEBUG "smb_receive_trans2: fast track, parm=%u %u %u, data=%u %u %u\n", parm_disp, parm_offset, parm_count, data_disp, data_offset, data_count); #endif *parm = base + parm_offset; @@ -562,7 +562,7 @@ memcpy(*data + data_disp, base + data_offset, data_count); #ifdef SMBFS_PARANOIA -printk("smb_receive_trans2: copied, parm=%u of %u, data=%u of %u\n", +printk(KERN_DEBUG "smb_receive_trans2: copied, parm=%u of %u, data=%u of %u\n", parm_len, parm_tot, data_len, data_tot); #endif /* @@ -587,7 +587,7 @@ } else { #ifdef SMBFS_PARANOIA -printk("smb_receive_trans2: copying data, old size=%d, new size=%u\n", +printk(KERN_DEBUG "smb_receive_trans2: copying data, old size=%d, new size=%u\n", server->packet_size, buf_len); #endif memcpy(inbuf, rcv_buf, parm_len + data_len); @@ -603,23 +603,23 @@ out_no_mem: #ifdef SMBFS_PARANOIA - printk("smb_receive_trans2: couldn't allocate data area\n"); + printk(KERN_DEBUG "smb_receive_trans2: couldn't allocate data area\n"); #endif result = -ENOMEM; goto out; out_too_long: - printk("smb_receive_trans2: data/param too long, data=%d, parm=%d\n", + printk(KERN_DEBUG "smb_receive_trans2: data/param too long, data=%d, parm=%d\n", data_tot, parm_tot); goto out_error; out_data_grew: - printk("smb_receive_trans2: data/params grew!\n"); + printk(KERN_DEBUG "smb_receive_trans2: data/params grew!\n"); goto out_error; out_bad_parm: - printk("smb_receive_trans2: invalid parms, disp=%d, cnt=%d, tot=%d\n", + printk(KERN_DEBUG "smb_receive_trans2: invalid parms, disp=%d, cnt=%d, tot=%d\n", parm_disp, parm_count, parm_tot); goto out_error; out_bad_data: - printk("smb_receive_trans2: invalid data, disp=%d, cnt=%d, tot=%d\n", + printk(KERN_DEBUG "smb_receive_trans2: invalid data, disp=%d, cnt=%d, tot=%d\n", data_disp, data_count, data_tot); out_error: result = -EIO; @@ -684,7 +684,7 @@ int result2 = smb_catch_keepalive(server); if (result2 < 0) { - printk("smb_request: catch keepalive failed\n"); + printk(KERN_DEBUG "smb_request: catch keepalive failed\n"); result = result2; } } @@ -696,7 +696,7 @@ if (server->rcls) { int error = smb_errno(server); if (error == EBADSLT) { - printk("smb_request: tree ID invalid\n"); + printk(KERN_DEBUG "smb_request: tree ID invalid\n"); result = error; goto bad_conn; } @@ -708,16 +708,16 @@ bad_conn: #ifdef SMBFS_PARANOIA -printk("smb_request: result %d, setting invalid\n", result); +printk(KERN_DEBUG "smb_request: result %d, setting invalid\n", result); #endif server->state = CONN_INVALID; smb_invalidate_inodes(server); goto out; bad_no_packet: - printk("smb_request: no packet!\n"); + printk(KERN_DEBUG "smb_request: no packet!\n"); goto out; bad_no_conn: - printk("smb_request: connection %d not valid!\n", server->state); + printk(KERN_DEBUG "smb_request: connection %d not valid!\n", server->state); goto out; } @@ -879,7 +879,7 @@ if (server->rcls) { int error = smb_errno(server); if (error == EBADSLT) { - printk("smb_request: tree ID invalid\n"); + printk(KERN_DEBUG "smb_request: tree ID invalid\n"); result = error; goto bad_conn; } @@ -890,7 +890,7 @@ bad_conn: #ifdef SMBFS_PARANOIA -printk("smb_trans2_request: result=%d, setting invalid\n", result); +printk(KERN_DEBUG "smb_trans2_request: result=%d, setting invalid\n", result); #endif server->state = CONN_INVALID; smb_invalidate_inodes(server); diff -urN v2.2.15/linux/fs/ufs/inode.c linux/fs/ufs/inode.c --- v2.2.15/linux/fs/ufs/inode.c Tue Jan 4 10:12:23 2000 +++ linux/fs/ufs/inode.c Wed Jun 7 14:26:44 2000 @@ -336,6 +336,7 @@ goto repeat; } else { + brelse (bh); return NULL; } } diff -urN v2.2.15/linux/fs/vfat/namei.c linux/fs/vfat/namei.c --- v2.2.15/linux/fs/vfat/namei.c Tue Jan 4 10:12:24 2000 +++ linux/fs/vfat/namei.c Wed Jun 7 14:26:44 2000 @@ -675,10 +675,11 @@ ip += 4; i += 4; } else { - *op++ = nls->charset2uni[*ip].uni1; - *op++ = nls->charset2uni[*ip].uni2; - ip++; - i++; + int llen; + nls->char2uni(ip, &llen, op, op+1); + op += 2; + ip += llen; + i += llen; } } } else { diff -urN v2.2.15/linux/include/asm-alpha/byteorder.h linux/include/asm-alpha/byteorder.h --- v2.2.15/linux/include/asm-alpha/byteorder.h Sat Jun 6 18:52:04 1998 +++ linux/include/asm-alpha/byteorder.h Wed Jun 7 14:26:44 2000 @@ -7,7 +7,7 @@ with the standard macros. And since it can schedule, it does even better in the end. */ -#if defined(__GNUC__) && __GNUC_MINOR__ < 91 +#if defined(__GNUC__) && __GNUC__ == 2 && __GNUC_MINOR__ < 91 static __inline__ __const__ __u32 ___arch__swab32(__u32 x) { diff -urN v2.2.15/linux/include/asm-alpha/compiler.h linux/include/asm-alpha/compiler.h --- v2.2.15/linux/include/asm-alpha/compiler.h Sun Aug 9 12:09:06 1998 +++ linux/include/asm-alpha/compiler.h Wed Jun 7 14:26:44 2000 @@ -13,7 +13,7 @@ * EGCS (of varying versions) does a good job of using insxl and extxl. */ -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) #define __kernel_insbl(val, shift) \ (((unsigned long)(val) & 0xfful) << ((shift) * 8)) #define __kernel_inswl(val, shift) \ @@ -29,7 +29,7 @@ __kir; }) #endif -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 92 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 92) #define __kernel_extbl(val, shift) (((val) >> (((shift) & 7) * 8)) & 0xfful) #define __kernel_extwl(val, shift) (((val) >> (((shift) & 7) * 8)) & 0xfffful) #else diff -urN v2.2.15/linux/include/asm-alpha/console.h linux/include/asm-alpha/console.h --- v2.2.15/linux/include/asm-alpha/console.h Mon Oct 12 11:40:13 1998 +++ linux/include/asm-alpha/console.h Wed Jun 7 14:26:44 2000 @@ -22,6 +22,8 @@ #define CCB_GET_ENV 0x22 #define CCB_SAVE_ENV 0x23 +#define CCB_PSWITCH 0x30 +#define CCB_BIOS_EMUL 0x32 /* * Environment variable numbers */ @@ -36,20 +38,33 @@ #define ENV_BOOT_RESET 0x09 #define ENV_DUMP_DEV 0x0A #define ENV_ENABLE_AUDIT 0x0B -#define ENV_LICENCE 0x0C +#define ENV_LICENSE 0x0C #define ENV_CHAR_SET 0x0D #define ENV_LANGUAGE 0x0E #define ENV_TTY_DEV 0x0F +#define NO_SRM_CONSOLE -1L + #ifdef __KERNEL__ -extern long srm_dispatch(long code, ...); -extern void srm_puts(const char *); +#ifndef __ASSEMBLY__ +extern long callback_puts(long unit, const char *s, long length); +extern long callback_open(const char *device, long length); +extern long callback_close(long unit); +extern long callback_read(long channel, long count, const char *buf, long lbn); +extern long callback_getenv(long id, const char *buf, unsigned long buf_size); + +extern int srm_fixup(unsigned long new_callback_addr, + unsigned long new_hwrpb_addr); +extern long srm_puts(const char *, long len); extern long srm_printk(const char *, ...) __attribute__ ((format (printf, 1, 2))); struct crb_struct; struct hwrpb_struct; -extern long srm_fixup(struct crb_struct *, struct hwrpb_struct *); + +extern int callback_init_done; +extern void * callback_init(void *); +#endif /* __ASSEMBLY__ */ #endif /* __KERNEL__ */ #endif /* __AXP_CONSOLE_H */ diff -urN v2.2.15/linux/include/asm-alpha/core_tsunami.h linux/include/asm-alpha/core_tsunami.h --- v2.2.15/linux/include/asm-alpha/core_tsunami.h Wed May 3 17:16:47 2000 +++ linux/include/asm-alpha/core_tsunami.h Wed Jun 7 14:26:44 2000 @@ -80,6 +80,7 @@ tsunami_64 mpr2; tsunami_64 mpr3; tsunami_64 mctl; + tsunami_64 __pad1; tsunami_64 ttr; tsunami_64 tdr; tsunami_64 dim2; diff -urN v2.2.15/linux/include/asm-alpha/hwrpb.h linux/include/asm-alpha/hwrpb.h --- v2.2.15/linux/include/asm-alpha/hwrpb.h Wed May 3 17:16:47 2000 +++ linux/include/asm-alpha/hwrpb.h Wed Jun 7 14:26:44 2000 @@ -190,6 +190,8 @@ unsigned long dsr_offset; /* "Dynamic System Recognition Data Block Table" */ }; +#define HWRPB_MEMBER_ID(v) (((v) >> 10) & 0x3f) + #ifdef __KERNEL__ extern struct hwrpb_struct *hwrpb; diff -urN v2.2.15/linux/include/asm-alpha/pgtable.h linux/include/asm-alpha/pgtable.h --- v2.2.15/linux/include/asm-alpha/pgtable.h Wed May 3 17:16:47 2000 +++ linux/include/asm-alpha/pgtable.h Wed Jun 7 14:26:44 2000 @@ -9,6 +9,7 @@ * in (currently 8192). */ #include +#include #include #include /* For TASK_SIZE */ @@ -219,7 +220,8 @@ /* Number of pointers that fit on a page: this will go away. */ #define PTRS_PER_PAGE (1UL << (PAGE_SHIFT-3)) -#define VMALLOC_START 0xFFFFFE0000000000 +#define CONSOLE_REMAP_START 0xFFFFFE0000000000 +#define VMALLOC_START (CONSOLE_REMAP_START + PMD_SIZE) #define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (~0UL) diff -urN v2.2.15/linux/include/asm-alpha/string.h linux/include/asm-alpha/string.h --- v2.2.15/linux/include/asm-alpha/string.h Sun Aug 9 12:09:06 1998 +++ linux/include/asm-alpha/string.h Wed Jun 7 14:26:44 2000 @@ -14,7 +14,7 @@ /* For backward compatibility with modules. Unused otherwise. */ extern void * __memcpy(void *, const void *, size_t); -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) #define memcpy __builtin_memcpy #endif @@ -22,7 +22,7 @@ extern void * __constant_c_memset(void *, unsigned long, size_t); extern void * __memset(void *, int, size_t); -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) #define memset(s, c, n) \ (__builtin_constant_p(c) \ ? (__builtin_constant_p(n) && (c) == 0 \ diff -urN v2.2.15/linux/include/asm-alpha/system.h linux/include/asm-alpha/system.h --- v2.2.15/linux/include/asm-alpha/system.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-alpha/system.h Wed Jun 7 14:26:44 2000 @@ -137,6 +137,9 @@ #define draina() \ __asm__ __volatile__ ("call_pal %0 #draina" : : "i" (PAL_draina) : "memory") +#define __halt() \ +__asm__ __volatile__ ("call_pal %0 #halt" : : "i" (PAL_halt)) + enum implver_enum { IMPLVER_EV4, IMPLVER_EV5, diff -urN v2.2.15/linux/include/asm-alpha/uaccess.h linux/include/asm-alpha/uaccess.h --- v2.2.15/linux/include/asm-alpha/uaccess.h Tue Oct 26 17:53:42 1999 +++ linux/include/asm-alpha/uaccess.h Wed Jun 7 14:26:44 2000 @@ -530,7 +530,7 @@ }; /* Returns 0 if exception not found and fixup.unit otherwise. */ -extern unsigned search_exception_table(unsigned long); +extern unsigned search_exception_table(unsigned long, unsigned long); /* Returns the new pc */ #define fixup_exception(map_reg, fixup_unit, pc) \ diff -urN v2.2.15/linux/include/asm-alpha/unaligned.h linux/include/asm-alpha/unaligned.h --- v2.2.15/linux/include/asm-alpha/unaligned.h Sat Jun 6 18:52:04 1998 +++ linux/include/asm-alpha/unaligned.h Wed Jun 7 14:26:44 2000 @@ -31,7 +31,7 @@ extern inline unsigned long __uldq(const unsigned long * r11) { -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) const struct __una_u64 *ptr = (const struct __una_u64 *) r11; return ptr->x; #else @@ -50,7 +50,7 @@ extern inline unsigned long __uldl(const unsigned int * r11) { -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) const struct __una_u32 *ptr = (const struct __una_u32 *) r11; return ptr->x; #else @@ -69,7 +69,7 @@ extern inline unsigned long __uldw(const unsigned short * r11) { -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) const struct __una_u16 *ptr = (const struct __una_u16 *) r11; return ptr->x; #else @@ -92,7 +92,7 @@ extern inline void __ustq(unsigned long r5, unsigned long * r11) { -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) struct __una_u64 *ptr = (struct __una_u64 *) r11; ptr->x = r5; #else @@ -117,7 +117,7 @@ extern inline void __ustl(unsigned long r5, unsigned int * r11) { -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) struct __una_u32 *ptr = (struct __una_u32 *) r11; ptr->x = r5; #else @@ -142,7 +142,7 @@ extern inline void __ustw(unsigned long r5, unsigned short * r11) { -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) struct __una_u16 *ptr = (struct __una_u16 *) r11; ptr->x = r5; #else diff -urN v2.2.15/linux/include/asm-i386/softirq.h linux/include/asm-i386/softirq.h --- v2.2.15/linux/include/asm-i386/softirq.h Tue Oct 26 17:53:42 1999 +++ linux/include/asm-i386/softirq.h Wed Jun 7 14:26:44 2000 @@ -9,6 +9,10 @@ #define get_active_bhs() (bh_mask & bh_active) #define clear_active_bhs(x) atomic_clear_mask((x),&bh_active) +#if defined (__SMP__) || DEBUG_SPINLOCKS > 0 +extern spinlock_t i386_bh_lock; +#endif + #ifdef __SMP__ /* @@ -18,7 +22,6 @@ */ extern atomic_t global_bh_lock; extern atomic_t global_bh_count; -extern spinlock_t i386_bh_lock; extern void synchronize_bh(void); diff -urN v2.2.15/linux/include/asm-i386/uaccess.h linux/include/asm-i386/uaccess.h --- v2.2.15/linux/include/asm-i386/uaccess.h Tue Oct 26 17:53:42 1999 +++ linux/include/asm-i386/uaccess.h Wed Jun 7 14:26:44 2000 @@ -42,7 +42,7 @@ unsigned long flag,sum; \ asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" \ :"=&r" (flag), "=r" (sum) \ - :"1" (addr),"g" (size),"g" (current->addr_limit.seg)); \ + :"1" (addr),"g" ((int)size),"g" (current->addr_limit.seg)); \ flag; }) #ifdef CONFIG_X86_WP_WORKS_OK diff -urN v2.2.15/linux/include/asm-mips/init.h linux/include/asm-mips/init.h --- v2.2.15/linux/include/asm-mips/init.h Mon Aug 9 12:04:41 1999 +++ linux/include/asm-mips/init.h Wed Jun 7 14:26:44 2000 @@ -15,7 +15,7 @@ __arginit __init; \ __arginit -#if __GNUC__ >= 2 && __GNUC_MINOR__ >= 8 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) #define __initlocaldata __initdata #else #define __initlocaldata diff -urN v2.2.15/linux/include/asm-ppc/byteorder.h linux/include/asm-ppc/byteorder.h --- v2.2.15/linux/include/asm-ppc/byteorder.h Wed Sep 30 10:14:33 1998 +++ linux/include/asm-ppc/byteorder.h Wed Jun 7 14:26:44 2000 @@ -38,7 +38,7 @@ /* alas, egcs sounds like it has a bug in this code that doesn't use the inline asm correctly, and can cause file corruption. Until I hear that it's fixed, I can live without the extra speed. I hope. */ -#if !(__GNUC__ >= 2 && __GNUC_MINOR__ >= 90) +#if !((__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 90)) #if 0 # define __arch_swab16(x) ld_le16(&x) # define __arch_swab32(x) ld_le32(&x) diff -urN v2.2.15/linux/include/asm-ppc/init.h linux/include/asm-ppc/init.h --- v2.2.15/linux/include/asm-ppc/init.h Wed Dec 30 10:56:58 1998 +++ linux/include/asm-ppc/init.h Wed Jun 7 14:26:44 2000 @@ -1,7 +1,7 @@ #ifndef _PPC_INIT_H #define _PPC_INIT_H -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 90 /* egcs */ +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 90) /* egcs */ #define __init __attribute__ ((__section__ (".text.init"))) #define __initdata __attribute__ ((__section__ (".data.init"))) #define __initfunc(__arginit) \ diff -urN v2.2.15/linux/include/asm-s390/current.h linux/include/asm-s390/current.h --- v2.2.15/linux/include/asm-s390/current.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/current.h Wed Jun 7 14:26:44 2000 @@ -20,7 +20,7 @@ struct task_struct *current; __asm__("lhi %0,-8192\n\t" "nr %0,15" - : "=r" (current) ); + : "=&r" (current) ); return current; } diff -urN v2.2.15/linux/include/asm-s390/ebcdic.h linux/include/asm-s390/ebcdic.h --- v2.2.15/linux/include/asm-s390/ebcdic.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/ebcdic.h Wed Jun 7 14:26:44 2000 @@ -14,6 +14,8 @@ #include #endif +extern __u8 _ascebc_500[]; /* ASCII -> EBCDIC 500 conversion table */ +extern __u8 _ebcasc_500[]; /* EBCDIC 500 -> ASCII conversion table */ extern __u8 _ascebc[]; /* ASCII -> EBCDIC conversion table */ extern __u8 _ebcasc[]; /* EBCDIC -> ASCII conversion table */ extern __u8 _ebc_tolower[]; /* EBCDIC -> lowercase */ @@ -44,6 +46,8 @@ #define ASCEBC(addr,nr) codepage_convert(_ascebc, addr, nr) #define EBCASC(addr,nr) codepage_convert(_ebcasc, addr, nr) +#define ASCEBC_500(addr,nr) codepage_convert(_ascebc_500, addr, nr) +#define EBCASC_500(addr,nr) codepage_convert(_ebcasc_500, addr, nr) #define EBC_TOLOWER(addr,nr) codepage_convert(_ebc_tolower, addr, nr) #define EBC_TOUPPER(addr,nr) codepage_convert(_ebc_toupper, addr, nr) diff -urN v2.2.15/linux/include/asm-s390/irq.h linux/include/asm-s390/irq.h --- v2.2.15/linux/include/asm-s390/irq.h Wed May 3 17:16:51 2000 +++ linux/include/asm-s390/irq.h Wed Jun 7 14:26:44 2000 @@ -66,7 +66,7 @@ /* ... per MSCH, however, if facility */ /* ... is not installed, this results */ /* ... in an operand exception. */ - } pmcw_t; + } __attribute__ ((packed)) pmcw_t; /* * subchannel status word @@ -92,7 +92,7 @@ unsigned int dstat : 8; /* device status */ unsigned int cstat : 8; /* subchannel status */ unsigned int count : 16; /* residual count */ - } scsw_t; + } __attribute__ ((packed)) scsw_t; #define SCSW_FCTL_CLEAR_FUNC 0x1 #define SCSW_FCTL_HALT_FUNC 0x2 @@ -137,7 +137,7 @@ pmcw_t pmcw; /* path management control word */ scsw_t scsw; /* subchannel status word */ char mda[12]; /* model dependent area */ - } schib_t; + } schib_t __attribute__ ((packed,aligned(4))); typedef struct { char cmd_code;/* command code */ @@ -154,12 +154,15 @@ #define CCW_FLAG_IDA 0x04 #define CCW_FLAG_SUSPEND 0x02 +#define CCW_CMD_READ_IPL 0x02 +#define CCW_CMD_NOOP 0x03 #define CCW_CMD_BASIC_SENSE 0x04 #define CCW_CMD_TIC 0x08 -#define CCW_CMD_SENSE_ID 0xE4 -#define CCW_CMD_NOOP 0x03 +#define CCW_CMD_SENSE_PGID 0x34 +#define CCW_CMD_SUSPEND_RECONN 0x5B #define CCW_CMD_RDC 0x64 -#define CCW_CMD_READ_IPL 0x02 +#define CCW_CMD_SET_PGID 0xAF +#define CCW_CMD_SENSE_ID 0xE4 #define SENSE_MAX_COUNT 0x20 @@ -290,22 +293,6 @@ unsigned int intparm; /* interruption parameter */ } tpi_info_t; - -/* - * This is the "IRQ descriptor", which contains various information - * about the irq, including what kind of hardware handling it has, - * whether it is disabled etc etc. - * - * Pad this out to 32 bytes for cache and indexing reasons. - */ -typedef struct { - unsigned int status; /* IRQ status - IRQ_INPROGRESS, IRQ_DISABLED */ - struct hw_interrupt_type *handler; /* handle/enable/disable functions */ - struct irqaction *action; /* IRQ action list */ - unsigned int unused[3]; - spinlock_t irq_lock; - } irq_desc_t; - // // command information word (CIW) layout // @@ -333,7 +320,7 @@ unsigned char dev_model; /* device model */ unsigned char unused; /* padding byte */ /* extended part */ - ciw_t ciw[62]; /* variable # of CIWs */ + ciw_t ciw[16]; /* variable # of CIWs */ } __attribute__ ((packed,aligned(4))) senseid_t; /* @@ -374,23 +361,98 @@ #define DEVSTAT_START_FUNCTION 0x00000004 #define DEVSTAT_HALT_FUNCTION 0x00000008 #define DEVSTAT_STATUS_PENDING 0x00000010 +#define DEVSTAT_REVALIDATE 0x00000020 +#define DEVSTAT_DEVICE_GONE 0x00000040 #define DEVSTAT_DEVICE_OWNED 0x00000080 +#define DEVSTAT_CLEAR_FUNCTION 0x00000100 +#define DEVSTAT_PCI 0x00000200 +#define DEVSTAT_SUSPENDED 0x00000400 #define DEVSTAT_FINAL_STATUS 0x80000000 +#define INTPARM_STATUS_PENDING 0xFFFFFFFF + +typedef void (* io_handler_func1_t) ( int irq, + devstat_t *devstat, + struct pt_regs *rgs); + +typedef void (* io_handler_func_t) ( int irq, + __u32 intparm ); + +typedef void ( * not_oper_handler_func_t)( int irq, + int status ); + +struct s390_irqaction { + io_handler_func_t handler; + unsigned long flags; + const char *name; + devstat_t *dev_id; +}; + + +/* + * This is the "IRQ descriptor", which contains various information + * about the irq, including what kind of hardware handling it has, + * whether it is disabled etc etc. + * + * Pad this out to 32 bytes for cache and indexing reasons. + */ +typedef struct { + unsigned int status; /* IRQ status - IRQ_INPROGRESS, IRQ_DISABLED */ + struct hw_interrupt_type *handler; /* handle/enable/disable functions */ + struct s390_irqaction *action; /* IRQ action list */ + } irq_desc_t; + +typedef struct { + __u8 state1 : 2; /* path state value 1 */ + __u8 state2 : 2; /* path state value 2 */ + __u8 state3 : 1; /* path state value 3 */ + __u8 resvd : 3; /* reserved */ + } __attribute__ ((packed)) path_state_t; + +typedef struct { + union { + __u8 fc; /* SPID function code */ + path_state_t ps; /* SNID path state */ + } inf; + __u32 cpu_addr : 16; /* CPU address */ + __u32 cpu_id : 24; /* CPU identification */ + __u32 cpu_model : 16; /* CPU model */ + __u32 tod_high; /* high word TOD clock */ + } __attribute__ ((packed)) pgid_t; + +#define SPID_FUNC_SINGLE_PATH 0x00 +#define SPID_FUNC_MULTI_PATH 0x80 +#define SPID_FUNC_ESTABLISH 0x00 +#define SPID_FUNC_RESIGN 0x40 +#define SPID_FUNC_DISBAND 0x20 + +#define SNID_STATE1_RESET 0 +#define SNID_STATE1_UNGROUPED 2 +#define SNID_STATE1_GROUPED 3 + +#define SNID_STATE2_NOT_RESVD 0 +#define SNID_STATE2_RESVD_ELSE 2 +#define SNID_STATE2_RESVD_SELF 3 + +#define SNID_STATE3_MULTI_PATH 1 +#define SNID_STATE3_SINGLE_PATH 0 + /* * Flags used as input parameters for do_IO() */ -#define DOIO_EARLY_NOTIFICATION 0x01 /* allow for I/O completion ... */ +#define DOIO_EARLY_NOTIFICATION 0x0001 /* allow for I/O completion ... */ /* ... notification after ... */ /* ... primary interrupt status */ #define DOIO_RETURN_CHAN_END DOIO_EARLY_NOTIFICATION -#define DOIO_VALID_LPM 0x02 /* LPM input parameter is valid */ -#define DOIO_WAIT_FOR_INTERRUPT 0x04 /* wait synchronously for interrupt */ -#define DOIO_REPORT_ALL 0x08 /* report all interrupt conditions */ -#define DOIO_ALLOW_SUSPEND 0x10 /* allow for channel prog. suspend */ -#define DOIO_DENY_PREFETCH 0x20 /* don't allow for CCW prefetch */ -#define DOIO_SUPPRESS_INTER 0x40 /* suppress intermediate inter. */ +#define DOIO_VALID_LPM 0x0002 /* LPM input parameter is valid */ +#define DOIO_WAIT_FOR_INTERRUPT 0x0004 /* wait synchronously for interrupt */ +#define DOIO_REPORT_ALL 0x0008 /* report all interrupt conditions */ +#define DOIO_ALLOW_SUSPEND 0x0010 /* allow for channel prog. suspend */ +#define DOIO_DENY_PREFETCH 0x0020 /* don't allow for CCW prefetch */ +#define DOIO_SUPPRESS_INTER 0x0040 /* suppress intermediate inter. */ /* ... for suspended CCWs */ +#define DOIO_TIMEOUT 0x0080 /* 3 secs. timeout for sync. I/O */ +#define DOIO_DONT_CALL_INTHDLR 0x0100 /* don't call interrupt handler */ /* * do_IO() @@ -420,12 +482,17 @@ unsigned char lpm, /* logical path mask */ unsigned long flag); /* flags : see above */ +void do_crw_pending( void ); /* CRW handler */ + int resume_IO( int irq); /* IRQ aka. subchannel number */ int halt_IO( int irq, /* IRQ aka. subchannel number */ unsigned long intparm, /* dummy intparm */ - unsigned int flag); /* possible DOIO_WAIT_FOR_INTERRUPT */ + unsigned long flag); /* possible DOIO_WAIT_FOR_INTERRUPT */ +int clear_IO( int irq, /* IRQ aka. subchannel number */ + unsigned long intparm, /* dummy intparm */ + unsigned long flag); /* possible DOIO_WAIT_FOR_INTERRUPT */ int process_IRQ( struct pt_regs regs, unsigned int irq, @@ -454,9 +521,18 @@ int get_irq_next ( int irq ); int read_dev_chars( int irq, void **buffer, int length ); -int read_conf_data( int irq, void **buffer, int *length ); +int read_conf_data( int irq, void **buffer, int *length, __u8 lpm ); + +int s390_DevicePathVerification( int irq, __u8 domask ); + +int s390_request_irq_special( int irq, + io_handler_func_t io_handler, + not_oper_handler_func_t not_oper_handler, + unsigned long irqflags, + const char *devname, + void *dev_id); -extern int handle_IRQ_event(unsigned int, int cpu, struct pt_regs *); +extern int handle_IRQ_event( unsigned int irq, int cpu, struct pt_regs *); extern int set_cons_dev(int irq); extern int reset_cons_dev(int irq); @@ -722,14 +798,16 @@ #include #define s390irq_spin_lock(irq) \ - spin_lock(&(ioinfo[irq]->irq_desc.irq_lock)) + spin_lock(&(ioinfo[irq]->irq_lock)) #define s390irq_spin_unlock(irq) \ - spin_unlock(&(ioinfo[irq]->irq_desc.irq_lock)) + spin_unlock(&(ioinfo[irq]->irq_lock)) #define s390irq_spin_lock_irqsave(irq,flags) \ - spin_lock_irqsave(&(ioinfo[irq]->irq_desc.irq_lock), flags) + spin_lock_irqsave(&(ioinfo[irq]->irq_lock), flags) + #define s390irq_spin_unlock_irqrestore(irq,flags) \ - spin_unlock_irqrestore(&(ioinfo[irq]->irq_desc.irq_lock), flags) + spin_unlock_irqrestore(&(ioinfo[irq]->irq_lock), flags) + #endif diff -urN v2.2.15/linux/include/asm-s390/lowcore.h linux/include/asm-s390/lowcore.h --- v2.2.15/linux/include/asm-s390/lowcore.h Wed May 3 17:16:51 2000 +++ linux/include/asm-s390/lowcore.h Wed Jun 7 14:26:44 2000 @@ -32,8 +32,9 @@ #define __LC_SUBCHANNEL_NR 0x0BA #define __LC_IO_INT_PARM 0x0BC #define __LC_MCCK_CODE 0x0E8 -#define __LC_CREGS_SAVE_AREA 0x1C0 -#define __LC_AREGS_SAVE_AREA 0x120 +#define __LC_AREGS_SAVE_AREA 0x200 +#define __LC_CREGS_SAVE_AREA 0x240 +#define __LC_RETURN_PSW 0x280 #define __LC_SYNC_IO_WORD 0x400 @@ -51,24 +52,25 @@ #define _EXT_PSW_MASK 0x04080000 #define _PGM_PSW_MASK 0x04080000 #define _SVC_PSW_MASK 0x04080000 -#define _MCCK_PSW_MASK 0x040A0000 +#define _MCCK_PSW_MASK 0x04080000 #define _IO_PSW_MASK 0x04080000 -#define _USER_PSW_MASK 0x070DC000/* DAT, IO, EXT, Home-space */ -#define _PSW_IO_WAIT 0x020A0000/* IO, Wait */ +#define _USER_PSW_MASK 0x0709C000/* DAT, IO, EXT, Home-space */ #define _WAIT_PSW_MASK 0x070E0000/* DAT, IO, EXT, Wait, Home-space */ #define _DW_PSW_MASK 0x000A0000/* disabled wait PSW mask */ + #define _PRIMARY_MASK 0x0000 /* MASK for SACF */ #define _SECONDARY_MASK 0x0100 /* MASK for SACF */ #define _ACCESS_MASK 0x0200 /* MASK for SACF */ #define _HOME_MASK 0x0300 /* MASK for SACF */ -#define _PSW_PRIM_SPACE_MODE 0x04000000 -#define _PSW_SEC_SPACE_MODE 0x04008000 -#define _PSW_ACC_REG_MODE 0x04004000 -#define _PSW_HOME_SPACE_MODE 0x0400C000 - -#define _PSW_WAIT_MASK_BIT 0x00020000 -#define _PSW_IO_MASK_BIT 0x02000000 +#define _PSW_PRIM_SPACE_MODE 0x00000000 +#define _PSW_SEC_SPACE_MODE 0x00008000 +#define _PSW_ACC_REG_MODE 0x00004000 +#define _PSW_HOME_SPACE_MODE 0x0000C000 + +#define _PSW_WAIT_MASK_BIT 0x00020000 /* Wait bit */ +#define _PSW_IO_MASK_BIT 0x02000000 /* IO bit */ +#define _PSW_IO_WAIT 0x02020000 /* IO & Wait bit */ /* we run in 31 Bit mode */ #define _ADDR_31 0x80000000 @@ -124,17 +126,19 @@ __u32 failing_storage_address; /* 0x0f8 */ __u8 pad5[0x100-0xfc]; /* 0x0fc */ __u32 st_status_fixed_logout[4];/* 0x100 */ - __u8 pad6[0x120-0x110]; /* 0x110 */ - __u32 access_regs_save_area[16];/* 0x120 */ + __u8 pad6[0x160-0x110]; /* 0x110 */ __u32 floating_pt_save_area[8]; /* 0x160 */ __u32 gpregs_save_area[16]; /* 0x180 */ - __u32 cregs_save_area[16]; /* 0x1c0 */ + __u8 pad7[0x200-0x1c0]; /* 0x1c0 */ - __u8 pad7[0x400-0x200]; /* 0x200 */ + __u32 access_regs_save_area[16];/* 0x200 */ + __u32 cregs_save_area[16]; /* 0x240 */ + psw_t return_psw; /* 0x280 */ + __u8 pad8[0x400-0x288]; /* 0x288 */ __u32 sync_io_word; /* 0x400 */ - __u8 pad8[0xc00-0x404]; /* 0x404 */ + __u8 pad9[0xc00-0x404]; /* 0x404 */ /* System info area */ __u32 save_area[16]; /* 0xc00 */ diff -urN v2.2.15/linux/include/asm-s390/pgtable.h linux/include/asm-s390/pgtable.h --- v2.2.15/linux/include/asm-s390/pgtable.h Wed May 3 17:16:51 2000 +++ linux/include/asm-s390/pgtable.h Wed Jun 7 14:26:44 2000 @@ -58,21 +58,6 @@ #define __flush_tlb() \ do { __asm__ __volatile__("ptlb": : :"memory"); } while (0) - -static inline void __flush_global_tlb(void) -{ - int cs1=0,dum=0; - int *adr; - long long dummy=0; - adr = (int*) (((int)(((int*) &dummy)+1) & 0xfffffffc)|1); - __asm__ __volatile__("lr 2,%0\n\t" - "lr 3,%1\n\t" - "lr 4,%2\n\t" - ".long 0xb2500024" : - : "d" (cs1), "d" (dum), "d" (adr) - : "2", "3", "4"); -} - static inline void __flush_tlb_one(struct mm_struct *mm, unsigned long addr); @@ -94,11 +79,15 @@ __flush_tlb(); } +#if 0 /* Arggh, ipte doesn't work correctly !! */ static inline void flush_tlb_page(struct vm_area_struct *vma, - unsigned long addr) + unsigned long va) { - __flush_tlb_one(vma->vm_mm,addr); + __flush_tlb_one(vma->vm_mm,va); } +#else +#define flush_tlb_page(vma, va) flush_tlb_all() +#endif static inline void flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end) @@ -115,6 +104,28 @@ #include +static inline void __flush_global_tlb_csp(void) +{ + int cs1=0,dum=0; + int *adr; + long long dummy=0; + adr = (int*) (((int)(((int*) &dummy)+1) & 0xfffffffc)|1); + __asm__ __volatile__("lr 2,%0\n\t" + "lr 3,%1\n\t" + "lr 4,%2\n\t" + "csp 2,4" : + : "d" (cs1), "d" (dum), "d" (adr) + : "2", "3", "4"); +} + +static inline void __flush_global_tlb(void) +{ + if (MACHINE_HAS_CSP) + __flush_global_tlb_csp(); + else + smp_ext_call_sync_others(ec_ptlb, NULL); +} + #define local_flush_tlb() \ __flush_tlb() @@ -127,8 +138,9 @@ static inline void flush_tlb_current_task(void) { - if ((atomic_read(¤t->mm->count) != 1) || - (current->mm->cpu_vm_mask != (1UL << smp_processor_id()))) { + if ((smp_num_cpus > 1) && + ((atomic_read(¤t->mm->count) != 1) || + (current->mm->cpu_vm_mask != (1UL << smp_processor_id())))) { current->mm->cpu_vm_mask = (1UL << smp_processor_id()); __flush_global_tlb(); } else { @@ -142,8 +154,9 @@ static inline void flush_tlb_mm(struct mm_struct * mm) { - if ((atomic_read(&mm->count) != 1) || - (mm->cpu_vm_mask != (1UL << smp_processor_id()))) { + if ((smp_num_cpus > 1) && + ((atomic_read(&mm->count) != 1) || + (mm->cpu_vm_mask != (1UL << smp_processor_id())))) { mm->cpu_vm_mask = (1UL << smp_processor_id()); __flush_global_tlb(); } else { @@ -151,17 +164,22 @@ } } +#if 0 /* Arggh, ipte doesn't work correctly !! */ static inline void flush_tlb_page(struct vm_area_struct * vma, unsigned long va) { __flush_tlb_one(vma->vm_mm,va); } +#else +#define flush_tlb_page(vma, va) flush_tlb_all() +#endif static inline void flush_tlb_range(struct mm_struct * mm, unsigned long start, unsigned long end) { - if ((atomic_read(&mm->count) != 1) || - (mm->cpu_vm_mask != (1UL << smp_processor_id()))) { + if ((smp_num_cpus > 1) && + ((atomic_read(&mm->count) != 1) || + (mm->cpu_vm_mask != (1UL << smp_processor_id())))) { mm->cpu_vm_mask = (1UL << smp_processor_id()); __flush_global_tlb(); } else { @@ -290,8 +308,7 @@ /* * No mapping available */ -#define PAGE_NONE __pgprot(_PAGE_INVALID ) - +#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_INVALID) #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED) #define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_RO) #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_RO) @@ -386,7 +403,8 @@ } while (0) -extern inline int pte_none(pte_t pte) { return ((pte_val(pte) & (_PAGE_INVALID | _PAGE_RO)) == +extern inline int pte_none(pte_t pte) { return ((pte_val(pte) & + (_PAGE_INVALID | _PAGE_RO | _PAGE_PRESENT)) == _PAGE_INVALID); } extern inline int pte_present(pte_t pte) { return pte_val(pte) & _PAGE_PRESENT; } extern inline void pte_clear(pte_t *ptep) { pte_val(*ptep) = _PAGE_INVALID; } @@ -612,22 +630,27 @@ extern inline pte_t * pte_alloc_kernel(pmd_t * pmd, unsigned long address) { address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); - if (pmd_none(*pmd)) { - pte_t * page = (pte_t *) get_pte_fast(); - if (!page) - return get_pte_kernel_slow(pmd, address); - pmd_val(pmd[0]) = _KERNPG_TABLE + __pa(page); - pmd_val(pmd[1]) = _KERNPG_TABLE + __pa(page+1024); - pmd_val(pmd[2]) = _KERNPG_TABLE + __pa(page+2048); - pmd_val(pmd[3]) = _KERNPG_TABLE + __pa(page+3072); - return page + address; - } - if (pmd_bad(*pmd)) { - __bad_pte_kernel(pmd); - return NULL; - } + if (pmd_none(*pmd)) + goto getnew; + if (pmd_bad(*pmd)) + goto fix; return (pte_t *) pmd_page(*pmd) + address; +getnew: +{ + unsigned long page = (unsigned long) get_pte_fast(); + + if (!page) + return get_pte_kernel_slow(pmd, address); + pmd_val(pmd[0]) = _KERNPG_TABLE + __pa(page); + pmd_val(pmd[1]) = _KERNPG_TABLE + __pa(page+1024); + pmd_val(pmd[2]) = _KERNPG_TABLE + __pa(page+2048); + pmd_val(pmd[3]) = _KERNPG_TABLE + __pa(page+3072); + return (pte_t *) page + address; +} +fix: + __bad_pte_kernel(pmd); + return NULL; } extern inline pte_t * pte_alloc(pmd_t * pmd, unsigned long address) diff -urN v2.2.15/linux/include/asm-s390/processor.h linux/include/asm-s390/processor.h --- v2.2.15/linux/include/asm-s390/processor.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/processor.h Wed Jun 7 14:26:44 2000 @@ -82,6 +82,8 @@ /* perform syscall argument validation (get/set_fs) */ mm_segment_t fs; per_struct per_info;/* Must be aligned on an 4 byte boundary*/ + addr_t ieee_instruction_pointer; + /* Used to give failing instruction back to user for ieee exceptions */ }; typedef struct thread_struct thread_struct; @@ -156,6 +158,7 @@ #define PSW_PER_MASK 0x40000000UL #define USER_STD_MASK 0x00000080UL #define PSW_PROBLEM_STATE 0x00010000UL +#define PSW_ENABLED_STATE 0x03000000UL /* * Function to drop a processor into disabled wait state diff -urN v2.2.15/linux/include/asm-s390/ptrace.h linux/include/asm-s390/ptrace.h --- v2.2.15/linux/include/asm-s390/ptrace.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/ptrace.h Wed Jun 7 14:26:44 2000 @@ -1,3 +1,4 @@ + /* * include/asm-s390/ptrace.h * @@ -27,14 +28,14 @@ struct pt_regs { S390_REGS - long trap; + __u32 trap; }; #if CONFIG_REMOTE_DEBUG typedef struct { S390_REGS - long trap; + __u32 trap; __u32 crs[16]; s390_fp_regs fp_regs; } gdb_pt_regs; @@ -133,6 +134,8 @@ * this is the way intel does it */ per_struct per_info; + addr_t ieee_instruction_pointer; + /* Used to give failing instruction back to user for ieee exceptions */ }; typedef struct user_regs_struct user_regs_struct; @@ -269,8 +272,9 @@ PT_CR_9=pt_off(per_info.control_regs.words.cr[0]), PT_CR_10=pt_off(per_info.control_regs.words.cr[1]), PT_CR_11=pt_off(per_info.control_regs.words.cr[2]), - PT_LASTOFF=PT_CR_11, - PT_ENDREGS=offsetof(user_regs_struct,per_info.lowcore.words.perc_atmid) + PT_IEEE_IP=pt_off(ieee_instruction_pointer), + PT_LASTOFF=PT_IEEE_IP, + PT_ENDREGS=sizeof(user_regs_struct)-1 }; #define PTRACE_AREA \ diff -urN v2.2.15/linux/include/asm-s390/queue.h linux/include/asm-s390/queue.h --- v2.2.15/linux/include/asm-s390/queue.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/queue.h Wed Jun 7 14:26:44 2000 @@ -2,18 +2,21 @@ * include/asm-s390/queue.h * * S390 version - * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) * * A little set of queue utilies. */ #include +#include typedef struct queue { struct queue *next; } queue; +typedef queue list; + typedef struct { queue *head; @@ -56,9 +59,103 @@ return(head); } +static __inline__ void init_list(list **lhead) +{ + *lhead=NULL; +} + +static __inline__ void add_to_list(list **lhead,list *member) +{ + member->next=*lhead; + *lhead=member; +} + +static __inline__ void add_to_list_tail(list **lhead,list *member) +{ + list *curr,*prev; + if(*lhead==NULL) + *lhead=member; + else + { + prev=*lhead; + for(curr=(*lhead)->next;curr!=NULL;curr=curr->next) + prev=curr; + prev->next=member; + } +} +static __inline__ void add_to_list_tail_null(list **lhead,list *member) +{ + member->next=NULL; + add_to_list_tail_null(lhead,member); +} + + +static __inline__ int is_in_list(list *lhead,list *member) +{ + list *curr; + + for(curr=lhead;curr!=NULL;curr=curr->next) + if(curr==member) + return(TRUE); + return(FALSE); +} + +static __inline__ int get_prev(list *lhead,list *member,list **prev) +{ + list *curr; + + *prev=NULL; + for(curr=lhead;curr!=NULL;curr=curr->next) + { + if(curr==member) + return(TRUE); + *prev=curr; + } + *prev=NULL; + return(FALSE); +} + + + +static __inline__ int remove_from_list(list **lhead,list *member) +{ + list *prev; + + if(get_prev(*lhead,member,&prev)) + { + + if(prev) + prev->next=member->next; + else + *lhead=member->next; + return(TRUE); + } + return(FALSE); +} +static __inline__ int remove_from_queue(qheader *qhead,queue *member) +{ + queue *prev; + if(get_prev(qhead->head,(list *)member,(list **)&prev)) + { + if(prev) + { + prev->next=member->next; + if(prev->next==NULL) + qhead->tail=prev; + } + else + { + if(qhead->head==qhead->tail) + qhead->tail=NULL; + qhead->head=member->next; + } + return(TRUE); + } + return(FALSE); +} diff -urN v2.2.15/linux/include/asm-s390/s390-regs-common.h linux/include/asm-s390/s390-regs-common.h --- v2.2.15/linux/include/asm-s390/s390-regs-common.h Wed May 3 17:16:51 2000 +++ linux/include/asm-s390/s390-regs-common.h Wed Jun 7 14:26:44 2000 @@ -69,6 +69,12 @@ freg_t fprs[NUM_FPRS]; } s390_fp_regs; +#define FPC_DXC_MASK 0x0000FF00 +#define FPC_EXCEPTION_MASK 0xF8000000 +#define FPC_FLAGS_MASK 0x00F80000 +#define FPC_RM_MASK 0x00000003 + + /* gdb structures & the kernel have this much always in common */ diff -urN v2.2.15/linux/include/asm-s390/s390_ext.h linux/include/asm-s390/s390_ext.h --- v2.2.15/linux/include/asm-s390/s390_ext.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-s390/s390_ext.h Wed Jun 7 14:26:44 2000 @@ -0,0 +1,30 @@ +#ifndef _S390_EXTINT_H +#define _S390_EXTINT_H + +/* + * include/asm-s390/s390_ext.h + * + * S390 version + * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com), + * Martin Schwidefsky (schwidefsky@de.ibm.com) + */ + +typedef void (*ext_int_handler_t)(struct pt_regs *regs, __u16 code); + +/* + * Warning: if you change ext_int_info_t you have to change the + * external interrupt handler in entry.S too. + */ +typedef struct ext_int_info_t { + struct ext_int_info_t *next; + ext_int_handler_t handler; + __u16 code; +} __attribute__ ((packed)) ext_int_info_t; + +extern ext_int_info_t *ext_int_hash[]; + +int register_external_interrupt(__u16 code, ext_int_handler_t handler); +int unregister_external_interrupt(__u16 code, ext_int_handler_t handler); + +#endif diff -urN v2.2.15/linux/include/asm-s390/s390dyn.h linux/include/asm-s390/s390dyn.h --- v2.2.15/linux/include/asm-s390/s390dyn.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-s390/s390dyn.h Wed Jun 7 14:26:44 2000 @@ -0,0 +1,55 @@ +/* + * arch/s390/kernel/s390dyn.h + * S/390 data definitions for dynamic device attachment + * + * S390 version + * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation + * Author(s): Ingo Adlung (adlung@de.ibm.com) + */ + +#ifndef __s390dyn_h +#define __s390dyn_h + +struct _devreg; + +typedef int (* oper_handler_func_t)( int irq, + struct _devreg *dreg); + +typedef struct _devreg { + union { + int devno; + + struct _hc { + __u16 ctype; + __u8 cmode; + __u16 dtype; + __u8 dmode; + } hc; /* has controller info */ + + struct _hnc { + __u16 dtype; + __u8 dmode; + __u16 res1; + __u8 res2; + } hnc; /* has no controller info */ + } ci; + + int flag; + oper_handler_func_t oper_func; + struct _devreg *prev; + struct _devreg *next; +} devreg_t; + +#define DEVREG_EXACT_MATCH 0x00000001 +#define DEVREG_MATCH_DEV_TYPE 0x00000002 +#define DEVREG_MATCH_CU_TYPE 0x00000004 +#define DEVREG_NO_CU_INFO 0x00000008 + +#define DEVREG_TYPE_DEVNO 0x80000000 +#define DEVREG_TYPE_DEVCHARS 0x40000000 + +int s390_device_register ( devreg_t *drinfo ); +int s390_device_unregister( devreg_t *dreg ); +devreg_t * s390_search_devreg ( ioinfo_t *ioinfo ); + +#endif /* __s390dyn */ diff -urN v2.2.15/linux/include/asm-s390/s390io.h linux/include/asm-s390/s390io.h --- v2.2.15/linux/include/asm-s390/s390io.h Wed May 3 17:16:51 2000 +++ linux/include/asm-s390/s390io.h Wed Jun 7 14:26:44 2000 @@ -18,6 +18,10 @@ typedef struct _ioinfo { unsigned int irq; /* aka. subchannel number */ spinlock_t irq_lock; /* irq lock */ + + struct _ioinfo *prev; + struct _ioinfo *next; + union { unsigned int info; struct { @@ -41,27 +45,35 @@ unsigned int consns : 1; /* concurrent sense is available */ unsigned int delsense : 1; /* delayed SENSE required */ unsigned int s_pend : 1; /* status pending condition */ - unsigned int unused : 16; /* unused */ + unsigned int pgid : 1; /* "path group ID" is valid */ + unsigned int pgid_supp : 1; /* "path group ID" command is supported */ + unsigned int esid : 1; /* Ext. SenseID supported by HW */ + unsigned int rcd : 1; /* RCD supported by HW */ + unsigned int repnone : 1; /* don't call IRQ handler on interrupt */ + unsigned int newreq : 1; /* new register interface */ + unsigned int dval : 1; /* device number valid */ + unsigned int unused : (sizeof(unsigned int)*8 - 23); /* unused */ } __attribute__ ((packed)) flags; } ui; + unsigned long u_intparm; /* user interruption parameter */ senseid_t senseid; /* SenseID info */ irq_desc_t irq_desc; /* irq descriptor */ - unsigned int lpm; /* logical path mask to be used ... */ - /* ... from do_IO() parms. Only ... */ - /* ... valid if vlpm is set too. */ + not_oper_handler_func_t nopfunc; /* not oper handler */ + __u8 ulpm; /* logical path mask used for I/O */ + __u8 opm; /* path mask of operational paths */ + __u16 devno; /* device number */ + pgid_t pgid; /* path group ID */ schib_t schib; /* subchannel information block */ orb_t orb; /* operation request block */ devstat_t devstat; /* device status */ ccw1_t *qcpa; /* queued channel program */ ccw1_t senseccw; /* ccw for sense command */ + __u8 sense_data[32];/* buffer for basic sense */ unsigned int stctl; /* accumulated status control from irb */ - unsigned int qintparm; /* queued interruption parameter */ + unsigned long qintparm; /* queued interruption parameter */ unsigned long qflag; /* queued flags */ - unsigned char qlpm; /* queued logical path mask */ - - struct _ioinfo *prev; - struct _ioinfo *next; + __u8 qlpm; /* queued logical path mask */ } __attribute__ ((aligned(8))) ioinfo_t; diff -urN v2.2.15/linux/include/asm-s390/s390mach.h linux/include/asm-s390/s390mach.h --- v2.2.15/linux/include/asm-s390/s390mach.h Wed Dec 31 16:00:00 1969 +++ linux/include/asm-s390/s390mach.h Wed Jun 7 14:26:44 2000 @@ -0,0 +1,107 @@ +/* + * arch/s390/kernel/s390mach.h + * S/390 data definitions for machine check processing + * + * S390 version + * Copyright (C) 1999, 2000 IBM Deutschland Entwicklung GmbH, + * IBM Corporation + * Author(s): Ingo Adlung (adlung@de.ibm.com) + */ + +#ifndef __s390mach_h +#define __s390mach_h + +#include + +typedef struct _mci { + __u32 to_be_defined_1 : 9; + __u32 cp : 1; /* channel-report pending */ + __u32 to_be_defined_2 : 22; + __u32 to_be_defined_3; + } mci_t; + +// +// machine-check-interruption code +// +typedef struct _mcic { + union _mcc { + __u64 mcl; /* machine check int. code - long info */ + mci_t mcd; /* machine check int. code - details */ + } mcc; +} __attribute__ ((packed)) mcic_t; + +// +// Channel Report Word +// +typedef struct _crw { + __u32 res1 : 1; /* reserved zero */ + __u32 slct : 1; /* solicited */ + __u32 oflw : 1; /* overflow */ + __u32 chn : 1; /* chained */ + __u32 rsc : 4; /* reporting source code */ + __u32 anc : 1; /* ancillary report */ + __u32 res2 : 1; /* reserved zero */ + __u32 erc : 6; /* error-recovery code */ + __u32 rsid : 16; /* reporting-source ID */ +} __attribute__ ((packed)) crw_t; + +#define CRW_RSC_MONITOR 0x2 /* monitoring facility */ +#define CRW_RSC_SCH 0x3 /* subchannel */ +#define CRW_RSC_CPATH 0x4 /* channel path */ +#define CRW_RSC_CONFIG 0x9 /* configuration-alert facility */ +#define CRW_RSC_CSS 0xB /* channel subsystem */ + +#define CRW_ERC_EVENT 0x00 /* event information pending */ +#define CRW_ERC_AVAIL 0x01 /* available */ +#define CRW_ERC_INIT 0x02 /* initialized */ +#define CRW_ERC_TERROR 0x03 /* temporary error */ +#define CRW_ERC_IPARM 0x04 /* installed parm initialized */ +#define CRW_ERC_TERM 0x05 /* terminal */ +#define CRW_ERC_PERRN 0x06 /* perm. error, fac. not init */ +#define CRW_ERC_PERRI 0x07 /* perm. error, facility init */ +#define CRW_ERC_PMOD 0x08 /* installed parameters modified */ + +#define MAX_CRW_PENDING 100 +#define MAX_MACH_PENDING 100 + +// +// CRW Entry +// +typedef struct _crwe { + crw_t crw; + struct _crwe *crwe_next; +} __attribute__ ((packed)) crwe_t; + +typedef struct _mache { + spinlock_t lock; + unsigned int status; + mcic_t mcic; + union _mc { + crwe_t *crwe; /* CRW if applicable */ + } mc; + struct _mache *next; + struct _mache *prev; +} mache_t; + +#define MCHCHK_STATUS_TO_PROCESS 0x00000001 +#define MCHCHK_STATUS_IN_PROGRESS 0x00000002 +#define MCHCHK_STATUS_WAITING 0x00000004 + +void s390_init_machine_check( void ); +void __init s390_do_machine_check ( void ); +void s390_do_crw_pending ( crwe_t *pcrwe ); + +extern __inline__ int stcrw( __u32 *pcrw ) +{ + int ccode; + + __asm__ __volatile__( + "STCRW 0(%1)\n\t" + "IPM %0\n\t" + "SRL %0,28\n\t" + : "=d" (ccode) : "a" (pcrw) + : "cc", "1" ); + return ccode; +} + +#endif /* __s390mach */ diff -urN v2.2.15/linux/include/asm-s390/setup.h linux/include/asm-s390/setup.h --- v2.2.15/linux/include/asm-s390/setup.h Wed May 3 17:16:51 2000 +++ linux/include/asm-s390/setup.h Wed Jun 7 14:26:44 2000 @@ -41,6 +41,7 @@ #define MACHINE_IS_VM (MACHINE_FLAGS & 1) #define MACHINE_HAS_IEEE (MACHINE_FLAGS & 2) #define MACHINE_IS_P390 (MACHINE_FLAGS & 4) +#define MACHINE_HAS_CSP (MACHINE_FLAGS & 8) #define RAMDISK_ORIGIN 0x800000 #define RAMDISK_BLKSIZE 0x1000 diff -urN v2.2.15/linux/include/asm-s390/sigp.h linux/include/asm-s390/sigp.h --- v2.2.15/linux/include/asm-s390/sigp.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/sigp.h Wed Jun 7 14:26:44 2000 @@ -149,6 +149,7 @@ ec_set_ctl, ec_get_ctl, ec_set_ctl_masked, + ec_ptlb, ec_cmd_last } ec_cmd_sig; diff -urN v2.2.15/linux/include/asm-s390/spinlock.h linux/include/asm-s390/spinlock.h --- v2.2.15/linux/include/asm-s390/spinlock.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/spinlock.h Wed Jun 7 14:26:44 2000 @@ -94,7 +94,7 @@ extern inline void spin_lock(spinlock_t *lp) { - __asm__ __volatile(" lhi 1,-1\n" + __asm__ __volatile(" basr 1,0\n" "0: slr 0,0\n" " cs 0,1,%1\n" " jl 0b" @@ -106,10 +106,10 @@ { unsigned long result; __asm__ __volatile(" slr %1,%1\n" - " lhi 0,-1\n" - "0: cs %1,0,%0" + " basr 1,0\n" + "0: cs %1,1,%0" : "=m" (lp->lock), "=&d" (result) - : "0" (lp->lock) : "0"); + : "0" (lp->lock) : "1"); return !result; } diff -urN v2.2.15/linux/include/asm-s390/stat.h linux/include/asm-s390/stat.h --- v2.2.15/linux/include/asm-s390/stat.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/stat.h Wed Jun 7 14:26:44 2000 @@ -9,6 +9,10 @@ #ifndef _S390_STAT_H #define _S390_STAT_H +#ifndef _LINUX_TYPES_H +#include +#endif + struct __old_kernel_stat { unsigned short st_dev; unsigned short st_ino; @@ -24,23 +28,23 @@ }; struct stat { - unsigned short st_dev; - unsigned short __pad1; - unsigned long st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; - unsigned short __pad2; - unsigned long st_size; - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime; + dev_t st_dev; + unsigned short int __pad1; + ino_t st_ino; + mode_t st_mode; + short st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + unsigned short int __pad2; + off_t st_size; + off_t st_blksize; + off_t st_blocks; + time_t st_atime; unsigned long __unused1; - unsigned long st_mtime; + time_t st_mtime; unsigned long __unused2; - unsigned long st_ctime; + time_t st_ctime; unsigned long __unused3; unsigned long __unused4; unsigned long __unused5; diff -urN v2.2.15/linux/include/asm-s390/termios.h linux/include/asm-s390/termios.h --- v2.2.15/linux/include/asm-s390/termios.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/termios.h Wed Jun 7 14:26:44 2000 @@ -76,18 +76,19 @@ /* * Translate a "termio" structure into a "termios". Ugh. */ -#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \ - unsigned short __tmp; \ - get_user(__tmp,&(termio)->x); \ - *(unsigned short *) &(termios)->x = __tmp; \ -} #define user_termio_to_kernel_termios(termios, termio) \ ({ \ - SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ - SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ - SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ - SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ + unsigned short tmp; \ + get_user(tmp, &(termio)->c_iflag); \ + (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \ + get_user(tmp, &(termio)->c_oflag); \ + (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \ + get_user(tmp, &(termio)->c_cflag); \ + (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \ + get_user(tmp, &(termio)->c_lflag); \ + (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \ + get_user((termios)->c_line, &(termio)->c_line); \ copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ }) diff -urN v2.2.15/linux/include/asm-s390/types.h linux/include/asm-s390/types.h --- v2.2.15/linux/include/asm-s390/types.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/types.h Wed Jun 7 14:26:44 2000 @@ -53,11 +53,12 @@ #define BITS_PER_LONG 32 -#endif /* __KERNEL__ */ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif + +#endif /* __KERNEL__ */ #endif diff -urN v2.2.15/linux/include/asm-s390/uaccess.h linux/include/asm-s390/uaccess.h --- v2.2.15/linux/include/asm-s390/uaccess.h Wed May 3 17:16:51 2000 +++ linux/include/asm-s390/uaccess.h Wed Jun 7 14:26:44 2000 @@ -432,7 +432,7 @@ static inline long strncpy_from_user(char *dst, const char *src, long count) { - int len; + long len; __asm__ __volatile__ ( " iac 1\n" " slr %0,%0\n" " lr 2,%1\n" @@ -471,7 +471,8 @@ * * Return 0 for error */ -static inline long strnlen_user(const char * src, long n) +static inline unsigned long +strnlen_user(const char * src, unsigned long n) { __asm__ __volatile__ (" iac 1\n" " alr %0,%1\n" @@ -500,7 +501,7 @@ : "cc", "0", "1", "4" ); return n; } -#define strlen_user(str) strnlen_user(str, ~0UL >> 1) +#define strlen_user(str) strnlen_user(str, ~0UL) /* * Zero Userspace @@ -518,7 +519,7 @@ "0: mvcle 4,2,0\n" " jo 0b\n" "1: sacf 0(1)\n" - " lr %0,3\n" + " lr %0,5\n" ".section __ex_table,\"a\"\n" " .align 4\n" " .long 0b,1b\n" diff -urN v2.2.15/linux/include/asm-s390/unistd.h linux/include/asm-s390/unistd.h --- v2.2.15/linux/include/asm-s390/unistd.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-s390/unistd.h Wed Jun 7 14:26:44 2000 @@ -19,7 +19,6 @@ #define __NR_write 4 #define __NR_open 5 #define __NR_close 6 -#define __NR_waitpid 7 #define __NR_creat 8 #define __NR_link 9 #define __NR_unlink 10 @@ -29,8 +28,6 @@ #define __NR_mknod 14 #define __NR_chmod 15 #define __NR_lchown 16 -#define __NR_break 17 -#define __NR_oldstat 18 #define __NR_lseek 19 #define __NR_getpid 20 #define __NR_mount 21 @@ -40,14 +37,10 @@ #define __NR_stime 25 #define __NR_ptrace 26 #define __NR_alarm 27 -#define __NR_oldfstat 28 #define __NR_pause 29 #define __NR_utime 30 -#define __NR_stty 31 -#define __NR_gtty 32 #define __NR_access 33 #define __NR_nice 34 -#define __NR_ftime 35 #define __NR_sync 36 #define __NR_kill 37 #define __NR_rename 38 @@ -56,7 +49,6 @@ #define __NR_dup 41 #define __NR_pipe 42 #define __NR_times 43 -#define __NR_prof 44 #define __NR_brk 45 #define __NR_setgid 46 #define __NR_getgid 47 @@ -65,13 +57,9 @@ #define __NR_getegid 50 #define __NR_acct 51 #define __NR_umount2 52 -#define __NR_lock 53 #define __NR_ioctl 54 #define __NR_fcntl 55 -#define __NR_mpx 56 #define __NR_setpgid 57 -#define __NR_ulimit 58 -#define __NR_oldolduname 59 #define __NR_umask 60 #define __NR_chroot 61 #define __NR_ustat 62 @@ -80,8 +68,6 @@ #define __NR_getpgrp 65 #define __NR_setsid 66 #define __NR_sigaction 67 -#define __NR_sgetmask 68 -#define __NR_ssetmask 69 #define __NR_setreuid 70 #define __NR_setregid 71 #define __NR_sigsuspend 72 @@ -94,9 +80,7 @@ #define __NR_settimeofday 79 #define __NR_getgroups 80 #define __NR_setgroups 81 -#define __NR_select 82 #define __NR_symlink 83 -#define __NR_oldlstat 84 #define __NR_readlink 85 #define __NR_uselib 86 #define __NR_swapon 87 @@ -110,7 +94,6 @@ #define __NR_fchown 95 #define __NR_getpriority 96 #define __NR_setpriority 97 -#define __NR_profil 98 #define __NR_statfs 99 #define __NR_fstatfs 100 #define __NR_ioperm 101 @@ -121,11 +104,8 @@ #define __NR_stat 106 #define __NR_lstat 107 #define __NR_fstat 108 -#define __NR_olduname 109 -#define __NR_iopl 110 #define __NR_vhangup 111 #define __NR_idle 112 -#define __NR_vm86old 113 #define __NR_wait4 114 #define __NR_swapoff 115 #define __NR_sysinfo 116 @@ -135,7 +115,6 @@ #define __NR_clone 120 #define __NR_setdomainname 121 #define __NR_uname 122 -#define __NR_modify_ldt 123 #define __NR_adjtimex 124 #define __NR_mprotect 125 #define __NR_sigprocmask 126 @@ -178,7 +157,6 @@ #define __NR_mremap 163 #define __NR_setresuid 164 #define __NR_getresuid 165 -#define __NR_vm86 166 #define __NR_query_module 167 #define __NR_poll 168 #define __NR_nfsservctl 169 @@ -200,8 +178,6 @@ #define __NR_capset 185 #define __NR_sigaltstack 186 #define __NR_sendfile 187 -#define __NR_getpmsg 188 /* some people actually want streams */ -#define __NR_putpmsg 189 /* some people actually want streams */ #define __NR_vfork 190 /* user-visible error numbers are in the range -1 - -122: see */ @@ -349,8 +325,14 @@ static inline _syscall3(int,open,const char *,file,int,flag,int,mode) static inline _syscall1(int,close,int,fd) static inline _syscall1(int,_exit,int,exitcode) -static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) static inline _syscall1(int,delete_module,const char *,name) +static inline _syscall2(long,stat,char *,filename,struct stat *,statbuf) + +extern int sys_wait4(int, int *, int, struct rusage *); +static inline pid_t waitpid(int pid, int * wait_stat, int flags) +{ + return sys_wait4(pid, wait_stat, flags, NULL); +} static inline pid_t wait(int * wait_stat) { diff -urN v2.2.15/linux/include/asm-sparc/audioio.h linux/include/asm-sparc/audioio.h --- v2.2.15/linux/include/asm-sparc/audioio.h Wed Nov 18 09:06:05 1998 +++ linux/include/asm-sparc/audioio.h Wed Jun 7 14:26:44 2000 @@ -298,6 +298,9 @@ int input_count, input_active, recording_count; struct wait_queue *input_read_wait; + /* Select/poll waiters. */ + struct wait_queue *poll_wait; + /* Hack to make it look like we support variable size buffers. */ int buffer_size; }; diff -urN v2.2.15/linux/include/asm-sparc/head.h linux/include/asm-sparc/head.h --- v2.2.15/linux/include/asm-sparc/head.h Tue Jan 4 10:12:24 2000 +++ linux/include/asm-sparc/head.h Wed Jun 7 14:26:44 2000 @@ -1,4 +1,4 @@ -/* $Id: head.h,v 1.36.2.2 1999/12/01 23:55:47 davem Exp $ */ +/* $Id: head.h,v 1.36.2.3 2000/05/26 22:19:39 ecd Exp $ */ #ifndef __SPARC_HEAD_H #define __SPARC_HEAD_H @@ -95,7 +95,7 @@ /* The Get PSR software trap for userland. */ #define GETPSR_TRAP \ - mov %psr, %o0; jmpl %l2, %g0; rett %l2 + 4; nop; + mov %psr, %i0; jmp %l2; rett %l2 + 4; nop; /* This is for hard interrupts from level 1-14, 15 is non-maskable (nmi) and * gets handled with another macro. diff -urN v2.2.15/linux/include/asm-sparc64/audioio.h linux/include/asm-sparc64/audioio.h --- v2.2.15/linux/include/asm-sparc64/audioio.h Wed Nov 18 09:06:05 1998 +++ linux/include/asm-sparc64/audioio.h Wed Jun 7 14:26:44 2000 @@ -298,6 +298,9 @@ int input_count, input_active, recording_count; struct wait_queue *input_read_wait; + /* Select/poll waiters. */ + struct wait_queue *poll_wait; + /* Hack to make it look like we support variable size buffers. */ int buffer_size; }; diff -urN v2.2.15/linux/include/asm-sparc64/envctrl.h linux/include/asm-sparc64/envctrl.h --- v2.2.15/linux/include/asm-sparc64/envctrl.h Tue Aug 4 16:03:35 1998 +++ linux/include/asm-sparc64/envctrl.h Wed Jun 7 14:26:44 2000 @@ -1,17 +1,101 @@ -/* $Id: envctrl.h,v 1.1 1998/05/16 17:26:07 ecd Exp $ +/* $Id: envctrl.h,v 1.1.2.1 2000/05/02 04:23:33 davem Exp $ * * envctrl.h: Definitions for access to the i2c environment * monitoring on Ultrasparc systems. * * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) + * Copyright (C) 2000 Vinh Truong (vinh.truong@eng.sun.com) + * VT - Add all ioctl commands and environment status definitions + * VT - Add application note */ - #ifndef _SPARC64_ENVCTRL_H #define _SPARC64_ENVCTRL_H 1 #include -#define I2CIOCSADR _IOW('p', 0x40, int) -#define I2CIOCGADR _IOR('p', 0x41, int) +/* Application note: + * + * The driver supports 4 operations: open(), close(), ioctl(), read() + * The device name is /dev/envctrl. + * Below is sample usage: + * + * fd = open("/dev/envtrl", O_RDONLY); + * if (ioctl(fd, ENVCTRL_READ_SHUTDOWN_TEMPERATURE, 0) < 0) + * printf("error\n"); + * ret = read(fd, buf, 10); + * close(fd); + * + * Notice in the case of cpu voltage and temperature, the default is + * cpu0. If we need to know the info of cpu1, cpu2, cpu3, we need to + * pass in cpu number in ioctl() last parameter. For example, to + * get the voltage of cpu2: + * + * ioctlbuf[0] = 2; + * if (ioctl(fd, ENVCTRL_READ_CPU_VOLTAGE, ioctlbuf) < 0) + * printf("error\n"); + * ret = read(fd, buf, 10); + * + * All the return values are in ascii. So check read return value + * and do appropriate conversions in your application. + */ + +/* IOCTL commands */ + +/* Note: these commands reflect possible monitor features. + * Some boards choose to support some of the features only. + */ +#define ENVCTRL_RD_CPU_TEMPERATURE _IOR('p', 0x40, int) +#define ENVCTRL_RD_CPU_VOLTAGE _IOR('p', 0x41, int) +#define ENVCTRL_RD_FAN_STATUS _IOR('p', 0x42, int) +#define ENVCTRL_RD_WARNING_TEMPERATURE _IOR('p', 0x43, int) +#define ENVCTRL_RD_SHUTDOWN_TEMPERATURE _IOR('p', 0x44, int) +#define ENVCTRL_RD_VOLTAGE_STATUS _IOR('p', 0x45, int) +#define ENVCTRL_RD_SCSI_TEMPERATURE _IOR('p', 0x46, int) +#define ENVCTRL_RD_ETHERNET_TEMPERATURE _IOR('p', 0x47, int) +#define ENVCTRL_RD_MTHRBD_TEMPERATURE _IOR('p', 0x48, int) + +/* Read return values for a voltage status request. */ +#define ENVCTRL_VOLTAGE_POWERSUPPLY_GOOD 0x01 +#define ENVCTRL_VOLTAGE_BAD 0x02 +#define ENVCTRL_POWERSUPPLY_BAD 0x03 +#define ENVCTRL_VOLTAGE_POWERSUPPLY_BAD 0x04 + +/* Read return values for a fan status request. + * A failure match means either the fan fails or + * the fan is not connected. Some boards have optional + * connectors to connect extra fans. + * + * There are maximum 8 monitor fans. Some are cpu fans + * some are system fans. The mask below only indicates + * fan by order number. + * Below is a sample application: + * + * if (ioctl(fd, ENVCTRL_READ_FAN_STATUS, 0) < 0) { + * printf("ioctl fan failed\n"); + * } + * if (read(fd, rslt, 1) <= 0) { + * printf("error or fan not monitored\n"); + * } else { + * if (rslt[0] == ENVCTRL_ALL_FANS_GOOD) { + * printf("all fans good\n"); + * } else if (rslt[0] == ENVCTRL_ALL_FANS_BAD) { + * printf("all fans bad\n"); + * } else { + * if (rslt[0] & ENVCTRL_FAN0_FAILURE_MASK) { + * printf("fan 0 failed or not connected\n"); + * } + * ...... + */ + +#define ENVCTRL_ALL_FANS_GOOD 0x00 +#define ENVCTRL_FAN0_FAILURE_MASK 0x01 +#define ENVCTRL_FAN1_FAILURE_MASK 0x02 +#define ENVCTRL_FAN2_FAILURE_MASK 0x04 +#define ENVCTRL_FAN3_FAILURE_MASK 0x08 +#define ENVCTRL_FAN4_FAILURE_MASK 0x10 +#define ENVCTRL_FAN5_FAILURE_MASK 0x20 +#define ENVCTRL_FAN6_FAILURE_MASK 0x40 +#define ENVCTRL_FAN7_FAILURE_MASK 0x80 +#define ENVCTRL_ALL_FANS_BAD 0xFF #endif /* !(_SPARC64_ENVCTRL_H) */ diff -urN v2.2.15/linux/include/asm-sparc64/string.h linux/include/asm-sparc64/string.h --- v2.2.15/linux/include/asm-sparc64/string.h Tue Oct 27 09:52:21 1998 +++ linux/include/asm-sparc64/string.h Wed Jun 7 14:26:44 2000 @@ -1,4 +1,4 @@ -/* $Id: string.h,v 1.14 1998/10/20 03:09:18 jj Exp $ +/* $Id: string.h,v 1.14.2.1 2000/05/27 04:46:42 davem Exp $ * string.h: External definitions for optimized assembly string * routines for the Linux Kernel. * @@ -113,7 +113,7 @@ extern __kernel_size_t __strlen(const char *); -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91) extern __kernel_size_t strlen(const char *); #else /* !EGCS */ /* Ugly but it works around a bug in our original sparc64-linux-gcc. */ diff -urN v2.2.15/linux/include/linux/ac97_codec.h linux/include/linux/ac97_codec.h --- v2.2.15/linux/include/linux/ac97_codec.h Wed Dec 31 16:00:00 1969 +++ linux/include/linux/ac97_codec.h Wed Jun 7 14:26:44 2000 @@ -0,0 +1,177 @@ +#ifndef _AC97_CODEC_H_ +#define _AC97_CODEC_H_ + +#include +#include + +/* AC97 1.0 */ +#define AC97_RESET 0x0000 // +#define AC97_MASTER_VOL_STEREO 0x0002 // Line Out +#define AC97_HEADPHONE_VOL 0x0004 // +#define AC97_MASTER_VOL_MONO 0x0006 // TAD Output +#define AC97_MASTER_TONE 0x0008 // +#define AC97_PCBEEP_VOL 0x000a // none +#define AC97_PHONE_VOL 0x000c // TAD Input (mono) +#define AC97_MIC_VOL 0x000e // MIC Input (mono) +#define AC97_LINEIN_VOL 0x0010 // Line Input (stereo) +#define AC97_CD_VOL 0x0012 // CD Input (stereo) +#define AC97_VIDEO_VOL 0x0014 // none +#define AC97_AUX_VOL 0x0016 // Aux Input (stereo) +#define AC97_PCMOUT_VOL 0x0018 // Wave Output (stereo) +#define AC97_RECORD_SELECT 0x001a // +#define AC97_RECORD_GAIN 0x001c +#define AC97_RECORD_GAIN_MIC 0x001e +#define AC97_GENERAL_PURPOSE 0x0020 +#define AC97_3D_CONTROL 0x0022 +#define AC97_MODEM_RATE 0x0024 +#define AC97_POWER_CONTROL 0x0026 + +/* AC'97 2.0 */ +#define AC97_EXTENDED_ID 0x0028 /* Extended Audio ID */ +#define AC97_EXTENDED_STATUS 0x002A /* Extended Audio Status */ +#define AC97_PCM_FRONT_DAC_RATE 0x002C /* PCM Front DAC Rate */ +#define AC97_PCM_SURR_DAC_RATE 0x002E /* PCM Surround DAC Rate */ +#define AC97_PCM_LFE_DAC_RATE 0x0030 /* PCM LFE DAC Rate */ +#define AC97_PCM_LR_DAC_RATE 0x0032 /* PCM LR DAC Rate */ +#define AC97_PCM_MIC_ADC_RATE 0x0034 /* PCM MIC ADC Rate */ +#define AC97_CENTER_LFE_MASTER 0x0036 /* Center + LFE Master Volume */ +#define AC97_SURROUND_MASTER 0x0038 /* Surround (Rear) Master Volume */ +#define AC97_RESERVED_3A 0x003A /* Reserved */ + +/* range 0x3c-0x58 - MODEM */ +#define AC97_EXTENDED_MODEM_ID 0x003C +#define AC97_EXTEND_MODEM_STAT 0x003E +#define AC97_LINE1_RATE 0x0040 +#define AC97_LINE2_RATE 0x0042 +#define AC97_HANDSET_RATE 0x0044 +#define AC97_LINE1_LEVEL 0x0046 +#define AC97_LINE2_LEVEL 0x0048 +#define AC97_HANDSET_LEVEL 0x004A +#define AC97_GPIO_CONFIG 0x004C +#define AC97_GPIO_POLARITY 0x004E +#define AC97_GPIO_STICKY 0x0050 +#define AC97_GPIO_WAKE_UP 0x0052 +#define AC97_GPIO_STATUS 0x0054 +#define AC97_MISC_MODEM_STAT 0x0056 +#define AC97_RESERVED_58 0x0058 + +/* registers 0x005a - 0x007a are vendor reserved */ + +#define AC97_VENDOR_ID1 0x007c +#define AC97_VENDOR_ID2 0x007e + +/* volume control bit defines */ +#define AC97_MUTE 0x8000 +#define AC97_MICBOOST 0x0040 +#define AC97_LEFTVOL 0x3f00 +#define AC97_RIGHTVOL 0x003f + +/* record mux defines */ +#define AC97_RECMUX_MIC 0x0000 +#define AC97_RECMUX_CD 0x0101 +#define AC97_RECMUX_VIDEO 0x0202 +#define AC97_RECMUX_AUX 0x0303 +#define AC97_RECMUX_LINE 0x0404 +#define AC97_RECMUX_STEREO_MIX 0x0505 +#define AC97_RECMUX_MONO_MIX 0x0606 +#define AC97_RECMUX_PHONE 0x0707 + +/* general purpose register bit defines */ +#define AC97_GP_LPBK 0x0080 /* Loopback mode */ +#define AC97_GP_MS 0x0100 /* Mic Select 0=Mic1, 1=Mic2 */ +#define AC97_GP_MIX 0x0200 /* Mono output select 0=Mix, 1=Mic */ +#define AC97_GP_RLBK 0x0400 /* Remote Loopback - Modem line codec */ +#define AC97_GP_LLBK 0x0800 /* Local Loopback - Modem Line codec */ +#define AC97_GP_LD 0x1000 /* Loudness 1=on */ +#define AC97_GP_3D 0x2000 /* 3D Enhancement 1=on */ +#define AC97_GP_ST 0x4000 /* Stereo Enhancement 1=on */ +#define AC97_GP_POP 0x8000 /* Pcm Out Path, 0=pre 3D, 1=post 3D */ + +/* powerdown control and status bit defines */ + +/* status */ +#define AC97_PWR_MDM 0x0010 /* Modem section ready */ +#define AC97_PWR_REF 0x0008 /* Vref nominal */ +#define AC97_PWR_ANL 0x0004 /* Analog section ready */ +#define AC97_PWR_DAC 0x0002 /* DAC section ready */ +#define AC97_PWR_ADC 0x0001 /* ADC section ready */ + +/* control */ +#define AC97_PWR_PR0 0x0100 /* ADC and Mux powerdown */ +#define AC97_PWR_PR1 0x0200 /* DAC powerdown */ +#define AC97_PWR_PR2 0x0400 /* Output mixer powerdown (Vref on) */ +#define AC97_PWR_PR3 0x0800 /* Output mixer powerdown (Vref off) */ +#define AC97_PWR_PR4 0x1000 /* AC-link powerdown */ +#define AC97_PWR_PR5 0x2000 /* Internal Clk disable */ +#define AC97_PWR_PR6 0x4000 /* HP amp powerdown */ +#define AC97_PWR_PR7 0x8000 /* Modem off - if supported */ + +/* useful power states */ +#define AC97_PWR_D0 0x0000 /* everything on */ +#define AC97_PWR_D1 AC97_PWR_PR0|AC97_PWR_PR1|AC97_PWR_PR4 +#define AC97_PWR_D2 AC97_PWR_PR0|AC97_PWR_PR1|AC97_PWR_PR2|AC97_PWR_PR3|AC97_PWR_PR4 +#define AC97_PWR_D3 AC97_PWR_PR0|AC97_PWR_PR1|AC97_PWR_PR2|AC97_PWR_PR3|AC97_PWR_PR4 +#define AC97_PWR_ANLOFF AC97_PWR_PR2|AC97_PWR_PR3 /* analog section off */ + +/* Total number of defined registers. */ +#define AC97_REG_CNT 64 + + +/* OSS interface to the ac97s.. */ +#define AC97_STEREO_MASK (SOUND_MASK_VOLUME|SOUND_MASK_PCM|\ + SOUND_MASK_LINE|SOUND_MASK_CD|\ + SOUND_MASK_ALTPCM|SOUND_MASK_IGAIN|\ + SOUND_MASK_LINE1|SOUND_MASK_VIDEO) + +#define AC97_SUPPORTED_MASK (AC97_STEREO_MASK | \ + SOUND_MASK_BASS|SOUND_MASK_TREBLE|\ + SOUND_MASK_SPEAKER|SOUND_MASK_MIC|\ + SOUND_MASK_PHONEIN|SOUND_MASK_PHONEOUT) + +#define AC97_RECORD_MASK (SOUND_MASK_MIC|\ + SOUND_MASK_CD|SOUND_MASK_IGAIN|SOUND_MASK_VIDEO|\ + SOUND_MASK_LINE1| SOUND_MASK_LINE|\ + SOUND_MASK_PHONEIN) + +#define supported_mixer(CODEC,FOO) ((CODEC)->supported_mixers & (1<> PARTN_BITS) diff -urN v2.2.15/linux/include/linux/blkdev.h linux/include/linux/blkdev.h --- v2.2.15/linux/include/linux/blkdev.h Mon Aug 9 12:04:41 1999 +++ linux/include/linux/blkdev.h Wed Jun 7 14:26:44 2000 @@ -32,11 +32,40 @@ struct buffer_head * bh; struct buffer_head * bhtail; struct request * next; + int elevator_latency; }; typedef void (request_fn_proc) (void); typedef struct request ** (queue_proc) (kdev_t dev); +typedef struct elevator_s +{ + int read_latency; + int write_latency; + int max_bomb_segments; + unsigned int queue_ID; +} elevator_t; + +#define ELEVATOR_DEFAULTS \ +((elevator_t) { \ + 128, /* read_latency */ \ + 8192, /* write_latency */ \ + 4, /* max_bomb_segments */ \ + 0 /* queue_ID */ \ + }) + +extern int blkelv_ioctl(kdev_t, unsigned long, unsigned long); + +typedef struct blkelv_ioctl_arg_s { + int queue_ID; + int read_latency; + int write_latency; + int max_bomb_segments; +} blkelv_ioctl_arg_t; + +#define BLKELVGET _IOR(0x12,106,sizeof(blkelv_ioctl_arg_t)) +#define BLKELVSET _IOW(0x12,107,sizeof(blkelv_ioctl_arg_t)) + struct blk_dev_struct { request_fn_proc *request_fn; /* @@ -47,6 +76,8 @@ struct request *current_request; struct request plug; struct tq_struct plug_tq; + + elevator_t elevator; }; struct sec_size { diff -urN v2.2.15/linux/include/linux/capability.h linux/include/linux/capability.h --- v2.2.15/linux/include/linux/capability.h Tue Oct 26 17:53:42 1999 +++ linux/include/linux/capability.h Wed Jun 7 14:26:44 2000 @@ -4,13 +4,16 @@ * Andrew G. Morgan * Alexander Kjeldaas * with help from Aleph1, Roland Buresund and Andrew Main. + * + * See here for the libcap library ("POSIX draft" compliance): + * + * ftp://linux.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.2/ */ #ifndef _LINUX_CAPABILITY_H #define _LINUX_CAPABILITY_H #include -#include /* User-level do most of the mapping between kernel and user capabilities based on the version tag given by the kernel. The @@ -168,8 +171,8 @@ #define CAP_IPC_OWNER 15 -/* Insert and remove kernel modules */ - +/* Insert and remove kernel modules - modify kernel without limit */ +/* Modify cap_bset */ #define CAP_SYS_MODULE 16 /* Allow ioperm/iopl access */ @@ -288,12 +291,12 @@ #define CAP_EMPTY_SET to_cap_t(0) #define CAP_FULL_SET to_cap_t(~0) #define CAP_INIT_EFF_SET to_cap_t(~0 & ~CAP_TO_MASK(CAP_SETPCAP)) -#define CAP_INIT_INH_SET to_cap_t(~0 & ~CAP_TO_MASK(CAP_SETPCAP)) +#define CAP_INIT_INH_SET to_cap_t(0) #define CAP_TO_MASK(x) (1 << (x)) #define cap_raise(c, flag) (cap_t(c) |= CAP_TO_MASK(flag)) #define cap_lower(c, flag) (cap_t(c) &= ~CAP_TO_MASK(flag)) -#define cap_raised(c, flag) (cap_t(c) & CAP_TO_MASK(flag) & cap_bset) +#define cap_raised(c, flag) (cap_t(c) & CAP_TO_MASK(flag)) static inline kernel_cap_t cap_combine(kernel_cap_t a, kernel_cap_t b) { diff -urN v2.2.15/linux/include/linux/cdrom.h linux/include/linux/cdrom.h --- v2.2.15/linux/include/linux/cdrom.h Sun Mar 21 18:37:56 1999 +++ linux/include/linux/cdrom.h Wed Jun 7 14:26:44 2000 @@ -5,12 +5,14 @@ * 1994, 1995 Eberhard Moenkeberg, emoenke@gwdg.de * 1996 David van Leeuwen, david@tm.tno.nl * 1997, 1998 Erik Andersen, andersee@debian.org - * 1998, 1999 Jens Axboe, axboe@image.dk + * 1998-2000 Jens Axboe, axboe@suse.de */ #ifndef _LINUX_CDROM_H #define _LINUX_CDROM_H +#include + /******************************************************* * As of Linux 2.1.x, all Linux CD-ROM application programs will use this * (and only this) include file. It is my hope to provide Linux with @@ -94,16 +96,26 @@ #define CDROMPLAYBLK 0x5317 /* (struct cdrom_blk) */ /* - * These ioctls are used only used in optcd.c + * These ioctls are only used in optcd.c */ #define CDROMREADALL 0x5318 /* read all 2646 bytes */ -#define CDROMCLOSETRAY 0x5319 /* pendant of CDROMEJECT */ + +/* + * These ioctls are (now) only in ide-cd.c for controlling + * drive spindown time. They should be implemented in the + * Uniform driver, via generic packet commands, GPCMD_MODE_SELECT_10, + * GPCMD_MODE_SENSE_10 and the GPMODE_POWER_PAGE... + * -Erik + */ +#define CDROMGETSPINDOWN 0x531d +#define CDROMSETSPINDOWN 0x531e /* * These ioctls are implemented through the uniform CD-ROM driver * They _will_ be adopted by all CD-ROM drivers, when all the CD-ROM * drivers are eventually ported to the uniform CD-ROM driver interface. */ +#define CDROMCLOSETRAY 0x5319 /* pendant of CDROMEJECT */ #define CDROM_SET_OPTIONS 0x5320 /* Set behavior options */ #define CDROM_CLEAR_OPTIONS 0x5321 /* Clear behavior options */ #define CDROM_SELECT_SPEED 0x5322 /* Set the CD-ROM speed */ @@ -119,6 +131,15 @@ /* This ioctl is only used by sbpcd at the moment */ #define CDROMAUDIOBUFSIZ 0x5382 /* set the audio buffer size */ +/* DVD-ROM Specific ioctls */ +#define DVD_READ_STRUCT 0x5390 /* Read structure */ +#define DVD_WRITE_STRUCT 0x5391 /* Write structure */ +#define DVD_AUTH 0x5392 /* Authentication */ + +#define CDROM_SEND_PACKET 0x5393 /* send a packet to the drive */ +#define CDROM_NEXT_WRITABLE 0x5394 /* get next writable block */ +#define CDROM_LAST_WRITTEN 0x5395 /* get last block written on disc */ + /******************************************************* * CDROM IOCTL structures *******************************************************/ @@ -126,9 +147,9 @@ /* Address in MSF format */ struct cdrom_msf0 { - u_char minute; - u_char second; - u_char frame; + __u8 minute; + __u8 second; + __u8 frame; }; /* Address in either MSF or logical format */ @@ -141,48 +162,48 @@ /* This struct is used by the CDROMPLAYMSF ioctl */ struct cdrom_msf { - u_char cdmsf_min0; /* start minute */ - u_char cdmsf_sec0; /* start second */ - u_char cdmsf_frame0; /* start frame */ - u_char cdmsf_min1; /* end minute */ - u_char cdmsf_sec1; /* end second */ - u_char cdmsf_frame1; /* end frame */ + __u8 cdmsf_min0; /* start minute */ + __u8 cdmsf_sec0; /* start second */ + __u8 cdmsf_frame0; /* start frame */ + __u8 cdmsf_min1; /* end minute */ + __u8 cdmsf_sec1; /* end second */ + __u8 cdmsf_frame1; /* end frame */ }; /* This struct is used by the CDROMPLAYTRKIND ioctl */ struct cdrom_ti { - u_char cdti_trk0; /* start track */ - u_char cdti_ind0; /* start index */ - u_char cdti_trk1; /* end track */ - u_char cdti_ind1; /* end index */ + __u8 cdti_trk0; /* start track */ + __u8 cdti_ind0; /* start index */ + __u8 cdti_trk1; /* end track */ + __u8 cdti_ind1; /* end index */ }; /* This struct is used by the CDROMREADTOCHDR ioctl */ struct cdrom_tochdr { - u_char cdth_trk0; /* start track */ - u_char cdth_trk1; /* end track */ + __u8 cdth_trk0; /* start track */ + __u8 cdth_trk1; /* end track */ }; /* This struct is used by the CDROMVOLCTRL and CDROMVOLREAD ioctls */ struct cdrom_volctrl { - u_char channel0; - u_char channel1; - u_char channel2; - u_char channel3; + __u8 channel0; + __u8 channel1; + __u8 channel2; + __u8 channel3; }; /* This struct is used by the CDROMSUBCHNL ioctl */ struct cdrom_subchnl { - u_char cdsc_format; - u_char cdsc_audiostatus; - u_char cdsc_adr: 4; - u_char cdsc_ctrl: 4; - u_char cdsc_trk; - u_char cdsc_ind; + __u8 cdsc_format; + __u8 cdsc_audiostatus; + __u8 cdsc_adr: 4; + __u8 cdsc_ctrl: 4; + __u8 cdsc_trk; + __u8 cdsc_ind; union cdrom_addr cdsc_absaddr; union cdrom_addr cdsc_reladdr; }; @@ -191,12 +212,12 @@ /* This struct is used by the CDROMREADTOCENTRY ioctl */ struct cdrom_tocentry { - u_char cdte_track; - u_char cdte_adr :4; - u_char cdte_ctrl :4; - u_char cdte_format; + __u8 cdte_track; + __u8 cdte_adr :4; + __u8 cdte_ctrl :4; + __u8 cdte_format; union cdrom_addr cdte_addr; - u_char cdte_datamode; + __u8 cdte_datamode; }; /* This struct is used by the CDROMREADMODE1, and CDROMREADMODE2 ioctls */ @@ -211,9 +232,9 @@ struct cdrom_read_audio { union cdrom_addr addr; /* frame address */ - u_char addr_format; /* CDROM_LBA or CDROM_MSF */ + __u8 addr_format; /* CDROM_LBA or CDROM_MSF */ int nframes; /* number of 2352-byte-frames to read at once */ - u_char *buf; /* frame buffer (size: nframes*2352 bytes) */ + __u8 *buf; /* frame buffer (size: nframes*2352 bytes) */ }; /* This struct is used with the CDROMMULTISESSION ioctl */ @@ -222,8 +243,8 @@ union cdrom_addr addr; /* frame address: start-of-last-session (not the new "frame 16"!). Only valid if the "xa_flag" is true. */ - u_char xa_flag; /* 1: "is XA disk" */ - u_char addr_format; /* CDROM_LBA or CDROM_MSF */ + __u8 xa_flag; /* 1: "is XA disk" */ + __u8 addr_format; /* CDROM_LBA or CDROM_MSF */ }; /* This struct is used with the CDROM_GET_MCN ioctl. @@ -233,7 +254,7 @@ */ struct cdrom_mcn { - u_char medium_catalog_number[14]; /* 13 ASCII digits, null-terminated */ + __u8 medium_catalog_number[14]; /* 13 ASCII digits, null-terminated */ }; /* This is used by the CDROMPLAYBLK ioctl */ @@ -243,6 +264,29 @@ unsigned short len; }; +#define CDROM_PACKET_SIZE 12 + +/* + * These are for 2.3/4 only, but lets have them in 2.2 as well so that + * apps don't need to check for versions. + */ +#define CGC_DATA_UNKNOWN 0 +#define CGC_DATA_WRITE 1 +#define CGC_DATA_READ 2 +#define CGC_DATA_NONE 3 + +/* for CDROM_PACKET_COMMAND ioctl */ +struct cdrom_generic_command +{ + unsigned char cmd[CDROM_PACKET_SIZE]; + unsigned char *buffer; + unsigned int buflen; + int stat; + struct request_sense *sense; + unsigned char data_direction; + void *reserved[3]; +}; + /* * A CD-ROM physical sector size is 2048, 2052, 2056, 2324, 2332, 2336, @@ -321,14 +365,6 @@ #define CDROM_AUDIO_ERROR 0x14 /* audio play stopped due to error */ #define CDROM_AUDIO_NO_STATUS 0x15 /* no current audio status to return */ -/* CD-ROM-specific SCSI command opcodes */ -#define SCMD_READ_TOC 0x43 /* read table of contents */ -#define SCMD_PLAYAUDIO_MSF 0x47 /* play data at time offset */ -#define SCMD_PLAYAUDIO_TI 0x48 /* play data at track/index */ -#define SCMD_PAUSE_RESUME 0x4B /* pause/resume audio */ -#define SCMD_READ_SUBCHANNEL 0x42 /* read SC info on playing disc */ -#define SCMD_PLAYAUDIO10 0x45 /* play data at logical block */ - /* capability flags used with the uniform CD-ROM driver */ #define CDC_CLOSE_TRAY 0x1 /* caddy systems _can't_ close */ #define CDC_OPEN_TRAY 0x2 /* but _can_ eject. */ @@ -342,6 +378,12 @@ #define CDC_RESET 0x200 /* hard reset device */ #define CDC_IOCTLS 0x400 /* driver has non-standard ioctls */ #define CDC_DRIVE_STATUS 0x800 /* driver implements drive status */ +#define CDC_GENERIC_PACKET 0x1000 /* driver implements generic packets */ +#define CDC_CD_R 0x2000 /* drive is a CD-R */ +#define CDC_CD_RW 0x4000 /* drive is a CD-RW */ +#define CDC_DVD 0x8000 /* drive is a DVD */ +#define CDC_DVD_R 0x10000 /* drive can write DVD-R */ +#define CDC_DVD_RAM 0x20000 /* drive can write DVD-RAM */ /* drive status possibilities returned by CDROM_DRIVE_STATUS ioctl */ #define CDS_NO_INFO 0 /* if not implemented */ @@ -370,7 +412,311 @@ #define CDSL_NONE ((int) (~0U>>1)-1) #define CDSL_CURRENT ((int) (~0U>>1)) +/* For partition based multisession access. IDE can handle 64 partitions + * per drive - SCSI CD-ROM's use minors to differentiate between the + * various drives, so we can't do multisessions the same way there. + * Use the -o session=x option to mount on them. + */ +#define CD_PART_MAX 64 +#define CD_PART_MASK (CD_PART_MAX - 1) + +/********************************************************************* + * Generic Packet commands, MMC commands, and such + *********************************************************************/ + + /* The generic packet command opcodes for CD/DVD Logical Units, + * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */ +#define GPCMD_BLANK 0xa1 +#define GPCMD_CLOSE_TRACK 0x5b +#define GPCMD_FLUSH_CACHE 0x35 +#define GPCMD_FORMAT_UNIT 0x04 +#define GPCMD_GET_CONFIGURATION 0x46 +#define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a +#define GPCMD_GET_PERFORMANCE 0xac +#define GPCMD_INQUIRY 0x12 +#define GPCMD_LOAD_UNLOAD 0xa6 +#define GPCMD_MECHANISM_STATUS 0xbd +#define GPCMD_MODE_SELECT_10 0x55 +#define GPCMD_MODE_SENSE_10 0x5a +#define GPCMD_PAUSE_RESUME 0x4b +#define GPCMD_PLAY_AUDIO_10 0x45 +#define GPCMD_PLAY_AUDIO_MSF 0x47 +#define GPCMD_PLAY_CD 0xbc +#define GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e +#define GPCMD_READ_10 0x28 +#define GPCMD_READ_12 0xa8 +#define GPCMD_READ_CDVD_CAPACITY 0x25 +#define GPCMD_READ_CD 0xbe +#define GPCMD_READ_CD_MSF 0xb9 +#define GPCMD_READ_DISC_INFO 0x51 +#define GPCMD_READ_DVD_STRUCTURE 0xad +#define GPCMD_READ_FORMAT_CAPACITIES 0x23 +#define GPCMD_READ_HEADER 0x44 +#define GPCMD_READ_TRACK_RZONE_INFO 0x52 +#define GPCMD_READ_SUBCHANNEL 0x42 +#define GPCMD_READ_TOC_PMA_ATIP 0x43 +#define GPCMD_REPAIR_RZONE_TRACK 0x58 +#define GPCMD_REPORT_KEY 0xa4 +#define GPCMD_REQUEST_SENSE 0x03 +#define GPCMD_RESERVE_RZONE_TRACK 0x53 +#define GPCMD_SCAN 0xba +#define GPCMD_SEEK 0x2b +#define GPCMD_SEND_DVD_STRUCTURE 0xad +#define GPCMD_SEND_EVENT 0xa2 +#define GPCMD_SEND_KEY 0xa3 +#define GPCMD_SEND_OPC 0x54 +#define GPCMD_SET_READ_AHEAD 0xa7 +#define GPCMD_SET_STREAMING 0xb6 +#define GPCMD_START_STOP_UNIT 0x1b +#define GPCMD_STOP_PLAY_SCAN 0x4e +#define GPCMD_TEST_UNIT_READY 0x00 +#define GPCMD_VERIFY_10 0x2f +#define GPCMD_WRITE_10 0x2a +#define GPCMD_WRITE_AND_VERIFY_10 0x2e +/* This is listed as optional in ATAPI 2.6, but is (curiously) + * missing from Mt. Fuji, Table 57. It _is_ mentioned in Mt. Fuji + * Table 377 as an MMC command for SCSi devices though... Most ATAPI + * drives support it. */ +#define GPCMD_SET_SPEED 0xbb +/* This seems to be a SCSI specific CD-ROM opcode + * to play data at track/index */ +#define GPCMD_PLAYAUDIO_TI 0x48 +/* + * From MS Media Status Notification Support Specification. For + * older drives only. + */ +#define GPCMD_GET_MEDIA_STATUS 0xda + +/* Mode page codes for mode sense/set */ +#define GPMODE_R_W_ERROR_PAGE 0x01 +#define GPMODE_WRITE_PARMS_PAGE 0x05 +#define GPMODE_AUDIO_CTL_PAGE 0x0e +#define GPMODE_POWER_PAGE 0x1a +#define GPMODE_FAULT_FAIL_PAGE 0x1c +#define GPMODE_TO_PROTECT_PAGE 0x1d +#define GPMODE_CAPABILITIES_PAGE 0x2a +#define GPMODE_ALL_PAGES 0x3f +/* Not in Mt. Fuji, but in ATAPI 2.6 -- depricated now in favor + * of MODE_SENSE_POWER_PAGE */ +#define GPMODE_CDROM_PAGE 0x0d + + + +/* DVD struct types */ +#define DVD_STRUCT_PHYSICAL 0x00 +#define DVD_STRUCT_COPYRIGHT 0x01 +#define DVD_STRUCT_DISCKEY 0x02 +#define DVD_STRUCT_BCA 0x03 +#define DVD_STRUCT_MANUFACT 0x04 + +struct dvd_layer { + __u8 book_version : 4; + __u8 book_type : 4; + __u8 min_rate : 4; + __u8 disc_size : 4; + __u8 layer_type : 4; + __u8 track_path : 1; + __u8 nlayers : 2; + __u8 track_density : 4; + __u8 linear_density : 4; + __u8 bca : 1; + __u32 start_sector; + __u32 end_sector; + __u32 end_sector_l0; +}; + +struct dvd_physical { + __u8 type; + __u8 layer_num; + struct dvd_layer layer[4]; +}; + +struct dvd_copyright { + __u8 type; + + __u8 layer_num; + __u8 cpst; + __u8 rmi; +}; + +struct dvd_disckey { + __u8 type; + + unsigned agid : 2; + __u8 value[2048]; +}; + +struct dvd_bca { + __u8 type; + + int len; + __u8 value[188]; +}; + +struct dvd_manufact { + __u8 type; + + __u8 layer_num; + int len; + __u8 value[2048]; +}; + +typedef union { + __u8 type; + + struct dvd_physical physical; + struct dvd_copyright copyright; + struct dvd_disckey disckey; + struct dvd_bca bca; + struct dvd_manufact manufact; +} dvd_struct; + +/* + * DVD authentication ioctl + */ + +/* Authentication states */ +#define DVD_LU_SEND_AGID 0 +#define DVD_HOST_SEND_CHALLENGE 1 +#define DVD_LU_SEND_KEY1 2 +#define DVD_LU_SEND_CHALLENGE 3 +#define DVD_HOST_SEND_KEY2 4 + +/* Termination states */ +#define DVD_AUTH_ESTABLISHED 5 +#define DVD_AUTH_FAILURE 6 + +/* Other functions */ +#define DVD_LU_SEND_TITLE_KEY 7 +#define DVD_LU_SEND_ASF 8 +#define DVD_INVALIDATE_AGID 9 +#define DVD_LU_SEND_RPC_STATE 10 +#define DVD_HOST_SEND_RPC_STATE 11 + +/* State data */ +typedef __u8 dvd_key[5]; /* 40-bit value, MSB is first elem. */ +typedef __u8 dvd_challenge[10]; /* 80-bit value, MSB is first elem. */ + +struct dvd_lu_send_agid { + __u8 type; + unsigned agid : 2; +}; + +struct dvd_host_send_challenge { + __u8 type; + unsigned agid : 2; + + dvd_challenge chal; +}; + +struct dvd_send_key { + __u8 type; + unsigned agid : 2; + + dvd_key key; +}; + +struct dvd_lu_send_challenge { + __u8 type; + unsigned agid : 2; + + dvd_challenge chal; +}; + +#define DVD_CPM_NO_COPYRIGHT 0 +#define DVD_CPM_COPYRIGHTED 1 + +#define DVD_CP_SEC_NONE 0 +#define DVD_CP_SEC_EXIST 1 + +#define DVD_CGMS_UNRESTRICTED 0 +#define DVD_CGMS_SINGLE 2 +#define DVD_CGMS_RESTRICTED 3 + +struct dvd_lu_send_title_key { + __u8 type; + unsigned agid : 2; + + dvd_key title_key; + int lba; + unsigned cpm : 1; + unsigned cp_sec : 1; + unsigned cgms : 2; +}; + +struct dvd_lu_send_asf { + __u8 type; + unsigned agid : 2; + + unsigned asf : 1; +}; + +struct dvd_host_send_rpcstate { + __u8 type; + __u8 pdrc; +}; + +struct dvd_lu_send_rpcstate { + __u8 type : 2; + __u8 vra : 3; + __u8 ucca : 3; + __u8 region_mask; + __u8 rpc_scheme; +}; + +typedef union { + __u8 type; + + struct dvd_lu_send_agid lsa; + struct dvd_host_send_challenge hsc; + struct dvd_send_key lsk; + struct dvd_lu_send_challenge lsc; + struct dvd_send_key hsk; + struct dvd_lu_send_title_key lstk; + struct dvd_lu_send_asf lsasf; + struct dvd_host_send_rpcstate hrpcs; + struct dvd_lu_send_rpcstate lrpcs; +} dvd_authinfo; + +struct request_sense { +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 valid : 1; + __u8 error_code : 7; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 error_code : 7; + __u8 valid : 1; +#endif + __u8 segment_number; +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 reserved1 : 2; + __u8 ili : 1; + __u8 reserved2 : 1; + __u8 sense_key : 4; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 sense_key : 4; + __u8 reserved2 : 1; + __u8 ili : 1; + __u8 reserved1 : 2; +#endif + __u8 information[4]; + __u8 add_sense_len; + __u8 command_info[4]; + __u8 asc; + __u8 ascq; + __u8 fruc; + __u8 sks[3]; + __u8 asb[46]; +}; + #ifdef __KERNEL__ + +struct cdrom_write_settings { + unsigned char fpacket; /* fixed/variable packets */ + unsigned long packet_size; /* write out this number of packets */ + unsigned long nwa; /* next writeable address */ + unsigned char writeable; /* cdrom is writeable */ +}; + /* Uniform cdrom data structures for cdrom.c */ struct cdrom_device_info { struct cdrom_device_ops *ops; /* link to device_ops */ @@ -382,11 +728,14 @@ int speed; /* maximum speed for reading data */ int capacity; /* number of discs in jukebox */ /* device-related storage */ - int options : 30; /* options flags */ - unsigned mc_flags : 2; /* media change buffer flags */ + int options : 30; /* options flags */ + unsigned mc_flags : 2; /* media change buffer flags */ int use_count; /* number of times device opened */ char name[20]; /* name of the device type */ - +/* per-device flags */ + __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */ + __u8 reserved : 6; /* not used yet */ + struct cdrom_write_settings write; }; struct cdrom_device_ops { @@ -413,6 +762,9 @@ /* driver specifications */ const int capability; /* capability flags */ int n_minors; /* number of active minor devices */ + /* handle uniform packets for scsi type devices (scsi,atapi) */ + int (*generic_packet) (struct cdrom_device_info *, + struct cdrom_generic_command *); }; /* the general file operations structure: */ @@ -420,6 +772,7 @@ extern int register_cdrom(struct cdrom_device_info *cdi); extern int unregister_cdrom(struct cdrom_device_info *cdi); + typedef struct { int data; int audio; @@ -427,7 +780,252 @@ int xa; long error; } tracktype; + extern void cdrom_count_tracks(struct cdrom_device_info *cdi,tracktype* tracks); +extern int cdrom_get_next_writable(kdev_t dev, long *next_writable); +extern int cdrom_get_last_written(kdev_t dev, long *last_written); +extern int cdrom_number_of_slots(struct cdrom_device_info *cdi); +extern int cdrom_select_disc(struct cdrom_device_info *cdi, int slot); +extern int cdrom_mode_select(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc); +extern int cdrom_mode_sense(struct cdrom_device_info *cdi, + struct cdrom_generic_command *cgc, + int page_code, int page_control); +extern void init_cdrom_command(struct cdrom_generic_command *cgc, + void *buffer, int len); + + +typedef struct { + __u16 disc_information_length; +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 reserved1 : 3; + __u8 erasable : 1; + __u8 border_status : 2; + __u8 disc_border : 2; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 disc_border : 2; + __u8 border_status : 2; + __u8 erasable : 1; + __u8 reserved1 : 3; +#else +#error "Please fix " +#endif + __u8 n_first_track; + __u8 n_sessions_lsb; + __u8 first_track_lsb; + __u8 last_track_lsb; +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 did_v : 1; + __u8 dbc_v : 1; + __u8 uru : 1; + __u8 reserved2 : 5; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 reserved2 : 5; + __u8 uru : 1; + __u8 dbc_v : 1; + __u8 did_v : 1; +#endif + __u8 disc_type; + __u8 n_sessions_msb; + __u8 first_track_msb; + __u8 last_track_msb; + __u32 disc_id; + __u32 lead_in; + __u32 lead_out; + __u8 disc_bar_code[8]; + __u8 reserved3; + __u8 n_opc; +} disc_information; + +typedef struct { + __u16 track_information_length; + __u8 track_lsb; + __u8 session_lsb; + __u8 reserved1; +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 reserved2 : 2; + __u8 damage : 1; + __u8 copy : 1; + __u8 track_mode : 4; + __u8 rt : 1; + __u8 blank : 1; + __u8 packet : 1; + __u8 fp : 1; + __u8 data_mode : 4; + __u8 reserved3 : 6; + __u8 lra_v : 1; + __u8 nwa_v : 1; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 track_mode : 4; + __u8 copy : 1; + __u8 damage : 1; + __u8 reserved2 : 2; + __u8 data_mode : 4; + __u8 fp : 1; + __u8 packet : 1; + __u8 blank : 1; + __u8 rt : 1; + __u8 nwa_v : 1; + __u8 lra_v : 1; + __u8 reserved3 : 6; +#endif + __u32 track_start; + __u32 next_writable; + __u32 free_blocks; + __u32 fixed_packet_size; + __u32 track_size; + __u32 last_rec_address; +} track_information; + +/* The SCSI spec says there could be 256 slots. */ +#define CDROM_MAX_SLOTS 256 + +struct cdrom_mechstat_header { +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 fault : 1; + __u8 changer_state : 2; + __u8 curslot : 5; + __u8 mech_state : 3; + __u8 door_open : 1; + __u8 reserved1 : 4; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 curslot : 5; + __u8 changer_state : 2; + __u8 fault : 1; + __u8 reserved1 : 4; + __u8 door_open : 1; + __u8 mech_state : 3; +#endif + __u8 curlba[3]; + __u8 nslots; + __u16 slot_tablelen; +}; + +struct cdrom_slot { +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 disc_present : 1; + __u8 reserved1 : 6; + __u8 change : 1; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 change : 1; + __u8 reserved1 : 6; + __u8 disc_present : 1; +#endif + __u8 reserved2[3]; +}; + +struct cdrom_changer_info { + struct cdrom_mechstat_header hdr; + struct cdrom_slot slots[CDROM_MAX_SLOTS]; +}; + +typedef enum { + mechtype_caddy = 0, + mechtype_tray = 1, + mechtype_popup = 2, + mechtype_individual_changer = 4, + mechtype_cartridge_changer = 5 +} mechtype_t; + +struct mode_page_header { + __u16 mode_data_length; + __u8 medium_type; + __u8 reserved1; + __u8 reserved2; + __u8 reserved3; + __u16 desc_length; +}; + +typedef struct { + struct mode_page_header header; +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 ps : 1; + __u8 reserved1 : 1; + __u8 page_code : 6; + __u8 page_length; + __u8 reserved2 : 1; + __u8 bufe : 1; + __u8 ls_v : 1; + __u8 test_write : 1; + __u8 write_type : 4; + __u8 multi_session : 2; /* or border, DVD */ + __u8 fp : 1; + __u8 copy : 1; + __u8 track_mode : 4; + __u8 reserved3 : 4; + __u8 data_block_type : 4; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 page_code : 6; + __u8 reserved1 : 1; + __u8 ps : 1; + __u8 page_length; + __u8 write_type : 4; + __u8 test_write : 1; + __u8 ls_v : 1; + __u8 bufe : 1; + __u8 reserved2 : 1; + __u8 track_mode : 4; + __u8 copy : 1; + __u8 fp : 1; + __u8 multi_session : 2; /* or border, DVD */ + __u8 data_block_type : 4; + __u8 reserved3 : 4; +#endif + __u8 link_size; + __u8 reserved4; +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 reserved5 : 2; + __u8 app_code : 6; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 app_code : 6; + __u8 reserved5 : 2; +#endif + __u8 session_format; + __u8 reserved6; + __u32 packet_size; + __u16 audio_pause; + __u8 mcn[16]; + __u8 isrc[16]; + __u8 subhdr0; + __u8 subhdr1; + __u8 subhdr2; + __u8 subhdr3; +} __attribute__((packed)) write_param_page; + +struct modesel_head +{ + __u8 reserved1; + __u8 medium; + __u8 reserved2; + __u8 block_desc_length; + __u8 density; + __u8 number_of_blocks_hi; + __u8 number_of_blocks_med; + __u8 number_of_blocks_lo; + __u8 reserved3; + __u8 block_length_hi; + __u8 block_length_med; + __u8 block_length_lo; +}; + +typedef struct { + __u16 report_key_length; + __u8 reserved1; + __u8 reserved2; +#if defined(__BIG_ENDIAN_BITFIELD) + __u8 type_code : 2; + __u8 vra : 3; + __u8 ucca : 3; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 ucca : 3; + __u8 vra : 3; + __u8 type_code : 2; +#endif + __u8 region_mask; + __u8 rpc_scheme; + __u8 reserved3; +} rpc_state_t; + #endif /* End of kernel only stuff */ #endif /* _LINUX_CDROM_H */ diff -urN v2.2.15/linux/include/linux/cyclades.h linux/include/linux/cyclades.h --- v2.2.15/linux/include/linux/cyclades.h Wed May 3 17:16:51 2000 +++ linux/include/linux/cyclades.h Wed Jun 7 14:26:44 2000 @@ -7,6 +7,10 @@ * * This file contains the general definitions for the cyclades.c driver *$Log: cyclades.h,v $ + *Revision 3.1 2000/04/19 18:52:52 ivan + *converted address fields to unsigned long and added fields for physical + *addresses on cyclades_card structure; + * *Revision 3.0 1998/11/02 14:20:59 ivan *added nports field on cyclades_card structure; * @@ -500,8 +504,10 @@ /* Per card data structure */ struct cyclades_card { - long base_addr; - long ctl_addr; + unsigned long base_phys; + unsigned long ctl_phys; + unsigned long base_addr; + unsigned long ctl_addr; int irq; int num_chips; /* 0 if card absent, -1 if Z/PCI, else Y */ int first_line; /* minor number of first channel on card */ diff -urN v2.2.15/linux/include/linux/dasd.h linux/include/linux/dasd.h --- v2.2.15/linux/include/linux/dasd.h Wed Dec 31 16:00:00 1969 +++ linux/include/linux/dasd.h Wed Jun 7 14:26:44 2000 @@ -0,0 +1,241 @@ + +#ifndef DASD_H +#define DASD_H + +/* First of all the external stuff */ +#include +#include +#include + +#define IOCTL_LETTER 'D' +/* Format the volume or an extent */ +#define BIODASDFORMAT _IOW(IOCTL_LETTER,0,format_data_t) +/* Disable the volume (for Linux) */ +#define BIODASDDISABLE _IO(IOCTL_LETTER,1) +/* Enable the volume (for Linux) */ +#define BIODASDENABLE _IO(IOCTL_LETTER,2) +/* Stuff for reading and writing the Label-Area to/from user space */ +#define BIODASDGTVLBL _IOR(IOCTL_LETTER,3,dasd_volume_label_t) +#define BIODASDSTVLBL _IOW(IOCTL_LETTER,4,dasd_volume_label_t) +#define BIODASDRWTB _IOWR(IOCTL_LETTER,5,int) +#define BIODASDRSID _IOR(IOCTL_LETTER,6,senseid_t) +#define BIODASDRLB _IOR(IOCTL_LETTER,7,int) +#define BLKGETBSZ _IOR(IOCTL_LETTER,8,int) + +typedef struct { + int start_unit; + int stop_unit; + int blksize; +} format_data_t; + +typedef +union { + char bytes[512]; + struct { + /* 80 Bytes of Label data */ + char identifier[4]; /* e.g. "LNX1", "VOL1" or "CMS1" */ + char label[6]; /* Given by user */ + char security; + char vtoc[5]; /* Null in "LNX1"-labelled partitions */ + char reserved0[5]; + long ci_size; + long blk_per_ci; + long lab_per_ci; + char reserved1[4]; + char owner[0xe]; + char no_part; + char reserved2[0x1c]; + /* 16 Byte of some information on the dasd */ + short blocksize; + char nopart; + char unused; + long unused2[3]; + /* 7*10 = 70 Bytes of partition data */ + struct { + char type; + long start; + long size; + char unused; + } part[7]; + } __attribute__ ((packed)) label; +} dasd_volume_label_t; + +typedef union { + struct { + unsigned long no; + unsigned int ct; + } __attribute__ ((packed)) input; + struct { + unsigned long noct; + } __attribute__ ((packed)) output; +} __attribute__ ((packed)) dasd_xlate_t; + +int dasd_init (void); +#ifdef MODULE +int init_module (void); +void cleanup_module (void); +#endif /* MODULE */ + +/* Definitions for blk.h */ +/* #define DASD_MAGIC 0x44415344 is ascii-"DASD" */ +/* #define dasd_MAGIC 0x64617364; is ascii-"dasd" */ +#define DASD_MAGIC 0xC4C1E2C4 /* is ebcdic-"DASD" */ +#define dasd_MAGIC 0x8481A284 /* is ebcdic-"dasd" */ +#define MDSK_MAGIC 0xD4C4E2D2 /* is ebcdic-"MDSK" */ +#define mdsk_MAGIC 0x9484A292 /* is ebcdic-"mdsk" */ +#define ERP_MAGIC 0xC5D9D740 /* is ebcdic-"ERP" */ +#define erp_MAGIC 0x45999740 /* is ebcdic-"erp" */ + +#define DASD_NAME "dasd" +#define DASD_PARTN_BITS 2 +#define DASD_MAX_DEVICES (256>>DASD_PARTN_BITS) + +#define MAJOR_NR DASD_MAJOR +#define PARTN_BITS DASD_PARTN_BITS + +#ifdef __KERNEL__ +/* Now lets turn to the internal sbtuff */ +/* + define the debug levels: + - 0 No debugging output to console or syslog + - 1 Log internal errors to syslog, ignore check conditions + - 2 Log internal errors and check conditions to syslog + - 3 Log internal errors to console, log check conditions to syslog + - 4 Log internal errors and check conditions to console + - 5 panic on internal errors, log check conditions to console + - 6 panic on both, internal errors and check conditions + */ +#define DASD_DEBUG 4 + +#define DASD_PROFILE +/* + define the level of paranoia + - 0 quite sure, that things are going right + - 1 sanity checking, only to avoid panics + - 2 normal sanity checking + - 3 extensive sanity checks + - 4 exhaustive debug messages + */ +#define DASD_PARANOIA 2 + +/* + define the depth of flow control, which is logged as a check condition + - 0 No flow control messages + - 1 Entry of functions logged like check condition + - 2 Entry and exit of functions logged like check conditions + - 3 Internal structure broken down + - 4 unrolling of loops,... + */ +#define DASD_FLOW_CONTROL 0 + +#if DASD_DEBUG > 0 +#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) +#define PRINT_INFO(x...) printk ( KERN_INFO PRINTK_HEADER x ) +#define PRINT_WARN(x...) printk ( KERN_WARNING PRINTK_HEADER x ) +#define PRINT_ERR(x...) printk ( KERN_ERR PRINTK_HEADER x ) +#define PRINT_FATAL(x...) panic ( PRINTK_HEADER x ) +#else +#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) +#define PRINT_INFO(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) +#define PRINT_WARN(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) +#define PRINT_ERR(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) +#define PRINT_FATAL(x...) printk ( KERN_DEBUG PRINTK_HEADER x ) +#endif /* DASD_DEBUG */ + +#define INTERNAL_ERRMSG(x,y...) \ +"Internal error: in file " __FILE__ " line: %d: " x, __LINE__, y +#define INTERNAL_CHKMSG(x,y...) \ +"Inconsistency: in file " __FILE__ " line: %d: " x, __LINE__, y +#define INTERNAL_FLWMSG(x,y...) \ +"Flow control: file " __FILE__ " line: %d: " x, __LINE__, y + +#if DASD_DEBUG > 4 +#define INTERNAL_ERROR(x...) PRINT_FATAL ( INTERNAL_ERRMSG ( x ) ) +#elif DASD_DEBUG > 2 +#define INTERNAL_ERROR(x...) PRINT_ERR ( INTERNAL_ERRMSG ( x ) ) +#elif DASD_DEBUG > 0 +#define INTERNAL_ERROR(x...) PRINT_WARN ( INTERNAL_ERRMSG ( x ) ) +#else +#define INTERNAL_ERROR(x...) +#endif /* DASD_DEBUG */ + +#if DASD_DEBUG > 5 +#define INTERNAL_CHECK(x...) PRINT_FATAL ( INTERNAL_CHKMSG ( x ) ) +#elif DASD_DEBUG > 3 +#define INTERNAL_CHECK(x...) PRINT_ERR ( INTERNAL_CHKMSG ( x ) ) +#elif DASD_DEBUG > 1 +#define INTERNAL_CHECK(x...) PRINT_WARN ( INTERNAL_CHKMSG ( x ) ) +#else +#define INTERNAL_CHECK(x...) +#endif /* DASD_DEBUG */ + +#if DASD_DEBUG > 3 +#define INTERNAL_FLOW(x...) PRINT_ERR ( INTERNAL_FLWMSG ( x ) ) +#elif DASD_DEBUG > 2 +#define INTERNAL_FLOW(x...) PRINT_WARN ( INTERNAL_FLWMSG ( x ) ) +#else +#define INTERNAL_FLOW(x...) +#endif /* DASD_DEBUG */ + +#if DASD_FLOW_CONTROL > 0 +#define FUNCTION_ENTRY(x) INTERNAL_FLOW( x "entered %s\n","" ); +#else +#define FUNCTION_ENTRY(x) +#endif /* DASD_FLOW_CONTROL */ + +#if DASD_FLOW_CONTROL > 1 +#define FUNCTION_EXIT(x) INTERNAL_FLOW( x "exited %s\n","" ); +#else +#define FUNCTION_EXIT(x) +#endif /* DASD_FLOW_CONTROL */ + +#if DASD_FLOW_CONTROL > 2 +#define FUNCTION_CONTROL(x...) INTERNAL_FLOW( x ); +#else +#define FUNCTION_CONTROL(x...) +#endif /* DASD_FLOW_CONTROL */ + +#if DASD_FLOW_CONTROL > 3 +#define LOOP_CONTROL(x...) INTERNAL_FLOW( x ); +#else +#define LOOP_CONTROL(x...) +#endif /* DASD_FLOW_CONTROL */ + +#define DASD_DO_IO_SLEEP 0x01 +#define DASD_DO_IO_NOLOCK 0x02 +#define DASD_DO_IO_NODEC 0x04 + +#define DASD_NOT_FORMATTED 0x01 + +extern struct wait_queue *dasd_waitq; + +#undef DEBUG_DASD_MALLOC +#ifdef DEBUG_DASD_MALLOC +void *b; +#define kmalloc(x...) (PRINT_INFO(" kmalloc %p\n",b=kmalloc(x)),b) +#define kfree(x) PRINT_INFO(" kfree %p\n",x);kfree(x) +#define get_free_page(x...) (PRINT_INFO(" gfp %p\n",b=get_free_page(x)),b) +#define __get_free_pages(x...) (PRINT_INFO(" gfps %p\n",b=__get_free_pages(x)),b) +#endif /* DEBUG_DASD_MALLOC */ + +#endif /* __KERNEL__ */ +#endif /* DASD_H */ + +/* + * 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: + */ diff -urN v2.2.15/linux/include/linux/fs.h linux/include/linux/fs.h --- v2.2.15/linux/include/linux/fs.h Tue Jan 4 10:12:24 2000 +++ linux/include/linux/fs.h Wed Jun 7 14:26:44 2000 @@ -154,6 +154,10 @@ #define BLKSECTSET _IO(0x12,102)/* set max sectors per request (ll_rw_blk.c) */ #define BLKSECTGET _IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */ #define BLKSSZGET _IO(0x12,104) /* get block device sector size */ +#if 0 +#define BLKELVGET _IOR(0x12,106,sizeof(blkelv_ioctl_arg_t))/* elevator get */ +#define BLKELVSET _IOW(0x12,107,sizeof(blkelv_ioctl_arg_t))/* elevator set */ +#endif #define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ #define FIBMAP _IO(0x00,1) /* bmap access */ diff -urN v2.2.15/linux/include/linux/hdlc.h linux/include/linux/hdlc.h --- v2.2.15/linux/include/linux/hdlc.h Wed Dec 31 16:00:00 1969 +++ linux/include/linux/hdlc.h Wed Jun 7 14:26:44 2000 @@ -0,0 +1,286 @@ +/* + * Generic HDLC support routines for Linux + * + * Copyright (C) 1999, 2000 Krzysztof Halasa + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef __HDLC_H +#define __HDLC_H + +/* Ioctls */ +#define HDLCSETMODE (0x89FC) /* FIXME */ +#define HDLCPVC (0x89FD) +#define HDLCSETLINE (0x89FE) /* Handled by low-level driver */ +#define HDLCRUN (0x89FF) + +/* Modes */ +#define MODE_NONE 0x00000000 /* Not initialized */ +#define MODE_DCE 0x00000080 /* DCE */ +#define MODE_HDLC 0x00000100 /* Raw HDLC frames */ +#define MODE_CISCO 0x00000200 +#define MODE_PPP 0x00000400 +#define MODE_FR 0x00000800 /* Any LMI */ +#define MODE_FR_ANSI 0x00000801 +#define MODE_FR_CCITT 0x00000802 +#define MODE_X25 0x00001000 +#define MODE_MASK 0x0000FF00 +#define MODE_SOFT 0x80000000 /* Driver modes, using hardware HDLC */ + +/* Setline values */ +#define LINE_EXT_CLOCK 0 /* External clock */ +#define LINE_V35 1 +#define LINE_RS232 2 +#define LINE_X21 3 +#define LINE_LOOPBACK 4 /* On-card loopback */ +#define LINE_NOLOOPBACK 5 +#define LINE_MIN_CLOCK 75 /* This & higher values are real clock rates */ + + +#define HDLC_MAX_MTU 1600 +/* Allow max 10 bytes for FR header */ +#define PVC_MAX_MTU (HDLC_MAX_MTU - 10) + +#ifdef __KERNEL__ + +#include +#include + +#define MAXLEN_LMISTAT 20 /* max size status enquiry frame */ + +#define LINK_STATE_RELIABLE 0x01 +#define LINK_STATE_REQUEST 0x02 /* full stat sent (DCE) / req pending (DTE) */ +#define LINK_STATE_CHANGED 0x04 /* change in PVCs state, send full report */ +#define LINK_STATE_FULLREP_SENT 0x08 /* full report sent */ + +#define PVC_STATE_NEW 0x01 +#define PVC_STATE_ACTIVE 0x02 +#define PVC_STATE_FECN 0x08 /* FECN condition */ +#define PVC_STATE_BECN 0x10 /* BECN condition */ + + +#define FR_UI 0x03 +#define FR_PAD 0x00 + +#define NLPID_IP 0xCC +#define NLPID_IPV6 0x8E +#define NLPID_SNAP 0x80 +#define NLPID_PAD 0x00 +#define NLPID_Q933 0x08 + + +#define LMI_DLCI 0 /* LMI DLCI */ +#define LMI_PROTO 0x08 +#define LMI_CALLREF 0x00 /* Call Reference */ +#define LMI_ANSI_LOCKSHIFT 0x95 /* ANSI lockshift */ +#define LMI_REPTYPE 1 /* report type */ +#define LMI_CCITT_REPTYPE 0x51 +#define LMI_ALIVE 3 /* keep alive */ +#define LMI_CCITT_ALIVE 0x53 +#define LMI_PVCSTAT 7 /* pvc status */ +#define LMI_CCITT_PVCSTAT 0x57 +#define LMI_FULLREP 0 /* full report */ +#define LMI_INTEGRITY 1 /* link integrity report */ +#define LMI_SINGLE 2 /* single pvc report */ +#define LMI_STATUS_ENQUIRY 0x75 +#define LMI_STATUS 0x7D /* reply */ + +#define LMI_REPT_LEN 1 /* report type element length */ +#define LMI_INTEG_LEN 2 /* link integrity element length */ + +#define LMI_LENGTH 13 /* standard LMI frame length */ +#define LMI_ANSI_LENGTH 14 + + + +typedef struct { + unsigned ea1 : 1; + unsigned cr : 1; + unsigned dlcih: 6; + + unsigned ea2 : 1; + unsigned de : 1; + unsigned becn : 1; + unsigned fecn : 1; + unsigned dlcil: 4; +}__attribute__ ((packed)) fr_hdr; + + + +typedef struct { /* Used in Cisco and PPP mode */ + u8 address; + u8 control; + u16 protocol; +}__attribute__ ((packed)) hdlc_header; + + + +typedef struct { + u32 type; /* code */ + u32 par1; + u32 par2; + u16 rel; /* reliability */ + u32 time; +}__attribute__ ((packed)) cisco_packet; + + + +typedef struct pvc_device_struct { + struct device netdev; /* PVC net device - must be first */ + struct net_device_stats stats; + struct hdlc_device_struct *master; + struct pvc_device_struct *next; + + u8 state; + u8 newstate; + char name[IFNAMSIZ]; +}pvc_device; + + + +typedef struct { + u32 last_errors; /* last errors bit list */ + int last_poll; /* ! */ + u8 T391; /* ! link integrity verification polling timer */ + u8 T392; /* ! polling verification timer */ + u8 N391; /* full status polling counter */ + u8 N392; /* error threshold */ + u8 N393; /* monitored events count */ + u8 N391cnt; + + u8 state; /* ! */ + u8 txseq; /* ! TX sequence number */ + u8 rxseq; /* ! RX sequence number */ +}fr_lmi; /* ! means used in Cisco HDLC as well */ + + +typedef struct hdlc_device_struct { + /* to be initialized by hardware driver: */ + struct device dev; /* master net device - must be first */ + struct net_device_stats stats; + + struct ppp_device pppdev; /* to be removed in 2.3 */ + struct ppp_device *syncppp_ptr; + + /* set_mode may be NULL if HDLC-only board */ + int (*set_mode)(struct hdlc_device_struct *hdlc, int mode); + int (*open)(struct hdlc_device_struct *hdlc); + void (*close)(struct hdlc_device_struct *hdlc); + int (*ioctl)(struct hdlc_device_struct *hdlc, struct ifreq *ifr, + int cmd); + + /* Only in "hardware" FR modes etc. - may be NULL */ + int (*create_pvc)(pvc_device *pvc); + void (*destroy_pvc)(pvc_device *pvc); + int (*open_pvc)(pvc_device *pvc); + void (*close_pvc)(pvc_device *pvc); + + /* for hdlc.c internal use only */ + pvc_device *first_pvc; + u16 pvc_count; + char name[IFNAMSIZ]; + int mode; + + struct timer_list timer; + fr_lmi lmi; +}hdlc_device; + + +int register_hdlc_device(hdlc_device *device); +void unregister_hdlc_device(hdlc_device *device); +void hdlc_netif_rx(hdlc_device *hdlc, struct sk_buff *skb, int dlci); + + +extern __inline__ struct device* hdlc_to_dev(hdlc_device *hdlc) +{ + return &hdlc->dev; +} + + +extern __inline__ hdlc_device* dev_to_hdlc(struct device *dev) +{ + return (hdlc_device*)dev; +} + + +extern __inline__ pvc_device* dev_to_pvc(struct device *dev) +{ + return (pvc_device*)dev; +} + + +extern __inline__ u16 status_to_dlci(hdlc_device *hdlc, u8 *status, u8 *state) +{ + *state &= ~(PVC_STATE_ACTIVE | PVC_STATE_NEW); + if (status[2] & 0x08) + *state |= PVC_STATE_NEW; + else if (status[2] & 0x02) + *state |= PVC_STATE_ACTIVE; + + return ((status[0] & 0x3F)<<4) | ((status[1] & 0x78)>>3); +} + + +extern __inline__ void dlci_to_status(hdlc_device *hdlc, u16 dlci, u8 *status, + u8 state) +{ + status[0] = (dlci>>4) & 0x3F; + status[1] = ((dlci<<3) & 0x78) | 0x80; + status[2] = 0x80; + + if (state & PVC_STATE_NEW) + status[2] |= 0x08; + else if (state & PVC_STATE_ACTIVE) + status[2] |= 0x02; +} + + + +extern __inline__ u16 netdev_dlci(struct device *dev) +{ + return ntohs(*(u16*)dev->dev_addr); +} + + + +extern __inline__ u16 q922_to_dlci(u8 *hdr) +{ + return ((hdr[0] & 0xFC)<<2) | ((hdr[1] & 0xF0)>>4); +} + + + +extern __inline__ void dlci_to_q922(u8 *hdr, u16 dlci) +{ + hdr[0] = (dlci>>2) & 0xFC; + hdr[1] = ((dlci<<4) & 0xF0) | 0x01; +} + + + +extern __inline__ int mode_is(hdlc_device *hdlc, int mask) +{ + return (hdlc->mode & mask) == mask; +} + + + +extern __inline__ pvc_device* find_pvc(hdlc_device *hdlc, u16 dlci) +{ + pvc_device *pvc=hdlc->first_pvc; + + while (pvc) { + if (netdev_dlci(&pvc->netdev) == dlci) + return pvc; + pvc=pvc->next; + } + + return NULL; +} + +#endif /* __KERNEL */ +#endif /* __HDLC_H */ diff -urN v2.2.15/linux/include/linux/i2o-dev.h linux/include/linux/i2o-dev.h --- v2.2.15/linux/include/linux/i2o-dev.h Wed Dec 31 16:00:00 1969 +++ linux/include/linux/i2o-dev.h Wed Jun 7 14:26:44 2000 @@ -0,0 +1,397 @@ +/* + * I2O user space accessible structures/APIs + * + * (c) Copyright 1999, 2000 Red Hat Software + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + ************************************************************************* + * + * This header file defines the I2O APIs that are available to both + * the kernel and user level applications. Kernel specific structures + * are defined in i2o_osm. OSMs should include _only_ i2o_osm.h which + * automatically includs this file. + * + */ + +#ifndef _I2O_DEV_H +#define _I2O_DEV_H + +/* How many controllers are we allowing */ +#define MAX_I2O_CONTROLLERS 32 + +#include + +/* + * I2O Control IOCTLs and structures + */ +#define I2O_MAGIC_NUMBER 'i' +#define I2OGETIOPS _IOR(I2O_MAGIC_NUMBER,0,u8[MAX_I2O_CONTROLLERS]) +#define I2OHRTGET _IOWR(I2O_MAGIC_NUMBER,1,struct i2o_cmd_hrtlct) +#define I2OLCTGET _IOWR(I2O_MAGIC_NUMBER,2,struct i2o_cmd_hrtlct) +#define I2OPARMSET _IOWR(I2O_MAGIC_NUMBER,3,struct i2o_cmd_psetget) +#define I2OPARMGET _IOWR(I2O_MAGIC_NUMBER,4,struct i2o_cmd_psetget) +#define I2OSWDL _IOWR(I2O_MAGIC_NUMBER,5,struct i2o_sw_xfer) +#define I2OSWUL _IOWR(I2O_MAGIC_NUMBER,6,struct i2o_sw_xfer) +#define I2OSWDEL _IOWR(I2O_MAGIC_NUMBER,7,struct i2o_sw_xfer) +#define I2OVALIDATE _IOR(I2O_MAGIC_NUMBER,8,u32) +#define I2OHTML _IOWR(I2O_MAGIC_NUMBER,9,struct i2o_html) +#define I2OEVTREG _IOW(I2O_MAGIC_NUMBER,10,struct i2o_evt_id) +#define I2OEVTGET _IOR(I2O_MAGIC_NUMBER,11,struct i2o_evt_info) + +struct i2o_cmd_hrtlct +{ + unsigned int iop; /* IOP unit number */ + void *resbuf; /* Buffer for result */ + unsigned int *reslen; /* Buffer length in bytes */ +}; + +struct i2o_cmd_psetget +{ + unsigned int iop; /* IOP unit number */ + unsigned int tid; /* Target device TID */ + void *opbuf; /* Operation List buffer */ + unsigned int oplen; /* Operation List buffer length in bytes */ + void *resbuf; /* Result List buffer */ + unsigned int *reslen; /* Result List buffer length in bytes */ +}; + +struct i2o_sw_xfer +{ + unsigned int iop; /* IOP unit number */ + unsigned char flags; /* Flags field */ + unsigned char sw_type; /* Software type */ + unsigned int sw_id; /* Software ID */ + void *buf; /* Pointer to software buffer */ + unsigned int *swlen; /* Length of software data */ + unsigned int *maxfrag; /* Maximum fragment count */ + unsigned int *curfrag; /* Current fragment count */ +}; + +struct i2o_html +{ + unsigned int iop; /* IOP unit number */ + unsigned int tid; /* Target device ID */ + unsigned int page; /* HTML page */ + void *resbuf; /* Buffer for reply HTML page */ + unsigned int *reslen; /* Length in bytes of reply buffer */ + void *qbuf; /* Pointer to HTTP query string */ + unsigned int qlen; /* Length in bytes of query string buffer */ +}; + +#define I2O_EVT_Q_LEN 32 + +struct i2o_evt_id +{ + unsigned int iop; + unsigned int tid; + unsigned int evt_mask; +}; + +/* Event data size = frame size - message header + evt indicator */ +#define I2O_EVT_DATA_SIZE 88 + +struct i2o_evt_info +{ + struct i2o_evt_id id; + unsigned char evt_data[I2O_EVT_DATA_SIZE]; + unsigned int data_size; +}; + +struct i2o_evt_get +{ + struct i2o_evt_info info; + int pending; + int lost; +}; + + +/************************************************************************** + * HRT related constants and structures + **************************************************************************/ +#define I2O_BUS_LOCAL 0 +#define I2O_BUS_ISA 1 +#define I2O_BUS_EISA 2 +#define I2O_BUS_MCA 3 +#define I2O_BUS_PCI 4 +#define I2O_BUS_PCMCIA 5 +#define I2O_BUS_NUBUS 6 +#define I2O_BUS_CARDBUS 7 +#define I2O_BUS_UNKNOWN 0x80 + +#ifndef __KERNEL__ + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; + +#endif /* __KERNEL__ */ + +typedef struct _i2o_pci_bus { + u8 PciFunctionNumber; + u8 PciDeviceNumber; + u8 PciBusNumber; + u8 reserved; + u16 PciVendorID; + u16 PciDeviceID; +} i2o_pci_bus; + +typedef struct _i2o_local_bus { + u16 LbBaseIOPort; + u16 reserved; + u32 LbBaseMemoryAddress; +} i2o_local_bus; + +typedef struct _i2o_isa_bus { + u16 IsaBaseIOPort; + u8 CSN; + u8 reserved; + u32 IsaBaseMemoryAddress; +} i2o_isa_bus; + +typedef struct _i2o_eisa_bus_info { + u16 EisaBaseIOPort; + u8 reserved; + u8 EisaSlotNumber; + u32 EisaBaseMemoryAddress; +} i2o_eisa_bus; + +typedef struct _i2o_mca_bus { + u16 McaBaseIOPort; + u8 reserved; + u8 McaSlotNumber; + u32 McaBaseMemoryAddress; +} i2o_mca_bus; + +typedef struct _i2o_other_bus { + u16 BaseIOPort; + u16 reserved; + u32 BaseMemoryAddress; +} i2o_other_bus; + +typedef struct _i2o_hrt_entry { + u32 adapter_id; + u32 parent_tid:12; + u32 state:4; + u32 bus_num:8; + u32 bus_type:8; + union { + i2o_pci_bus pci_bus; + i2o_local_bus local_bus; + i2o_isa_bus isa_bus; + i2o_eisa_bus eisa_bus; + i2o_mca_bus mca_bus; + i2o_other_bus other_bus; + } bus; +} i2o_hrt_entry; + +typedef struct _i2o_hrt { + u16 num_entries; + u8 entry_len; + u8 hrt_version; + u32 change_ind; + i2o_hrt_entry hrt_entry[1]; +} i2o_hrt; + +typedef struct _i2o_lct_entry { + u32 entry_size:16; + u32 tid:12; + u32 reserved:4; + u32 change_ind; + u32 device_flags; + u32 class_id:12; + u32 version:4; + u32 vendor_id:16; + u32 sub_class; + u32 user_tid:12; + u32 parent_tid:12; + u32 bios_info:8; + u8 identity_tag[8]; + u32 event_capabilities; +} i2o_lct_entry; + +typedef struct _i2o_lct { + u32 table_size:16; + u32 boot_tid:12; + u32 lct_ver:4; + u32 iop_flags; + u32 change_ind; + i2o_lct_entry lct_entry[1]; +} i2o_lct; + +typedef struct _i2o_status_block { + u16 org_id; + u16 reserved; + u16 iop_id:12; + u16 reserved1:4; + u16 host_unit_id; + u16 segment_number:12; + u16 i2o_version:4; + u8 iop_state; + u8 msg_type; + u16 inbound_frame_size; + u8 init_code; + u8 reserved2; + u32 max_inbound_frames; + u32 cur_inbound_frames; + u32 max_outbound_frames; + char product_id[24]; + u32 expected_lct_size; + u32 iop_capabilities; + u32 desired_mem_size; + u32 current_mem_size; + u32 current_mem_base; + u32 desired_io_size; + u32 current_io_size; + u32 current_io_base; + u32 reserved3:24; + u32 cmd_status:8; +} i2o_status_block; + +/* Event indicator mask flags */ +#define I2O_EVT_IND_STATE_CHANGE 0x80000000 +#define I2O_EVT_IND_GENERAL_WARNING 0x40000000 +#define I2O_EVT_IND_CONFIGURATION_FLAG 0x20000000 +#define I2O_EVT_IND_LOCK_RELEASE 0x10000000 +#define I2O_EVT_IND_CAPABILITY_CHANGE 0x08000000 +#define I2O_EVT_IND_DEVICE_RESET 0x04000000 +#define I2O_EVT_IND_EVT_MASK_MODIFIED 0x02000000 +#define I2O_EVT_IND_FIELD_MODIFIED 0x01000000 +#define I2O_EVT_IND_VENDOR_EVT 0x00800000 +#define I2O_EVT_IND_DEVICE_STATE 0x00400000 + +/* Executive event indicitors */ +#define I2O_EVT_IND_EXEC_RESOURCE_LIMITS 0x00000001 +#define I2O_EVT_IND_EXEC_CONNECTION_FAIL 0x00000002 +#define I2O_EVT_IND_EXEC_ADAPTER_FAULT 0x00000004 +#define I2O_EVT_IND_EXEC_POWER_FAIL 0x00000008 +#define I2O_EVT_IND_EXEC_RESET_PENDING 0x00000010 +#define I2O_EVT_IND_EXEC_RESET_IMMINENT 0x00000020 +#define I2O_EVT_IND_EXEC_HW_FAIL 0x00000040 +#define I2O_EVT_IND_EXEC_XCT_CHANGE 0x00000080 +#define I2O_EVT_IND_EXEC_NEW_LCT_ENTRY 0x00000100 +#define I2O_EVT_IND_EXEC_MODIFIED_LCT 0x00000200 +#define I2O_EVT_IND_EXEC_DDM_AVAILABILITY 0x00000400 + +/* Random Block Storage Event Indicators */ +#define I2O_EVT_IND_BSA_VOLUME_LOAD 0x00000001 +#define I2O_EVT_IND_BSA_VOLUME_UNLOAD 0x00000002 +#define I2O_EVT_IND_BSA_VOLUME_UNLOAD_REQ 0x00000004 +#define I2O_EVT_IND_BSA_CAPACITY_CHANGE 0x00000008 +#define I2O_EVT_IND_BSA_SCSI_SMART 0x00000010 + +/* Event data for generic events */ +#define I2O_EVT_STATE_CHANGE_NORMAL 0x00 +#define I2O_EVT_STATE_CHANGE_SUSPENDED 0x01 +#define I2O_EVT_STATE_CHANGE_RESTART 0x02 +#define I2O_EVT_STATE_CHANGE_NA_RECOVER 0x03 +#define I2O_EVT_STATE_CHANGE_NA_NO_RECOVER 0x04 +#define I2O_EVT_STATE_CHANGE_QUIESCE_REQUEST 0x05 +#define I2O_EVT_STATE_CHANGE_FAILED 0x10 +#define I2O_EVT_STATE_CHANGE_FAULTED 0x11 + +#define I2O_EVT_GEN_WARNING_NORMAL 0x00 +#define I2O_EVT_GEN_WARNING_ERROR_THRESHOLD 0x01 +#define I2O_EVT_GEN_WARNING_MEDIA_FAULT 0x02 + +#define I2O_EVT_CAPABILITY_OTHER 0x01 +#define I2O_EVT_CAPABILITY_CHANGED 0x02 + +#define I2O_EVT_SENSOR_STATE_CHANGED 0x01 + +/* + * I2O classes / subclasses + */ + +/* Class ID and Code Assignments + * (LCT.ClassID.Version field) + */ +#define I2O_CLASS_VERSION_10 0x00 +#define I2O_CLASS_VERSION_11 0x01 + +/* Class code names + * (from v1.5 Table 6-1 Class Code Assignments.) + */ + +#define I2O_CLASS_EXECUTIVE 0x000 +#define I2O_CLASS_DDM 0x001 +#define I2O_CLASS_RANDOM_BLOCK_STORAGE 0x010 +#define I2O_CLASS_SEQUENTIAL_STORAGE 0x011 +#define I2O_CLASS_LAN 0x020 +#define I2O_CLASS_WAN 0x030 +#define I2O_CLASS_FIBRE_CHANNEL_PORT 0x040 +#define I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL 0x041 +#define I2O_CLASS_SCSI_PERIPHERAL 0x051 +#define I2O_CLASS_ATE_PORT 0x060 +#define I2O_CLASS_ATE_PERIPHERAL 0x061 +#define I2O_CLASS_FLOPPY_CONTROLLER 0x070 +#define I2O_CLASS_FLOPPY_DEVICE 0x071 +#define I2O_CLASS_BUS_ADAPTER_PORT 0x080 +#define I2O_CLASS_PEER_TRANSPORT_AGENT 0x090 +#define I2O_CLASS_PEER_TRANSPORT 0x091 + +/* + * Rest of 0x092 - 0x09f reserved for peer-to-peer classes + */ + +#define I2O_CLASS_MATCH_ANYCLASS 0xffffffff + +/* + * Subclasses + */ + +#define I2O_SUBCLASS_i960 0x001 +#define I2O_SUBCLASS_HDM 0x020 +#define I2O_SUBCLASS_ISM 0x021 + +/* Operation functions */ + +#define I2O_PARAMS_FIELD_GET 0x0001 +#define I2O_PARAMS_LIST_GET 0x0002 +#define I2O_PARAMS_MORE_GET 0x0003 +#define I2O_PARAMS_SIZE_GET 0x0004 +#define I2O_PARAMS_TABLE_GET 0x0005 +#define I2O_PARAMS_FIELD_SET 0x0006 +#define I2O_PARAMS_LIST_SET 0x0007 +#define I2O_PARAMS_ROW_ADD 0x0008 +#define I2O_PARAMS_ROW_DELETE 0x0009 +#define I2O_PARAMS_TABLE_CLEAR 0x000A + +/* + * I2O serial number conventions / formats + * (circa v1.5) + */ + +#define I2O_SNFORMAT_UNKNOWN 0 +#define I2O_SNFORMAT_BINARY 1 +#define I2O_SNFORMAT_ASCII 2 +#define I2O_SNFORMAT_UNICODE 3 +#define I2O_SNFORMAT_LAN48_MAC 4 +#define I2O_SNFORMAT_WAN 5 + +/* + * Plus new in v2.0 (Yellowstone pdf doc) + */ + +#define I2O_SNFORMAT_LAN64_MAC 6 +#define I2O_SNFORMAT_DDM 7 +#define I2O_SNFORMAT_IEEE_REG64 8 +#define I2O_SNFORMAT_IEEE_REG128 9 +#define I2O_SNFORMAT_UNKNOWN2 0xff + +/* + * I2O Get Status State values + */ + +#define ADAPTER_STATE_INITIALIZING 0x01 +#define ADAPTER_STATE_RESET 0x02 +#define ADAPTER_STATE_HOLD 0x04 +#define ADAPTER_STATE_READY 0x05 +#define ADAPTER_STATE_OPERATIONAL 0x08 +#define ADAPTER_STATE_FAILED 0x10 +#define ADAPTER_STATE_FAULTED 0x11 + +#endif /* _I2O_DEV_H */ diff -urN v2.2.15/linux/include/linux/i2o.h linux/include/linux/i2o.h --- v2.2.15/linux/include/linux/i2o.h Wed May 3 17:16:51 2000 +++ linux/include/linux/i2o.h Wed Jun 7 14:26:44 2000 @@ -1,277 +1,49 @@ #ifndef _I2O_H #define _I2O_H - -/* - * Tunable parameters first - */ - -/* How many different OSM's are we allowing */ -#define MAX_I2O_MODULES 64 -/* How many controllers are we allowing */ -#define MAX_I2O_CONTROLLERS 32 - -#include - -/* - * I2O Control IOCTLs and structures +/* I2O kernel space accessible structures/APIs + * + * (c) Copyright 1999, 2000 Red Hat Software + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + ************************************************************************* + * + * This header file defined the I2O APIs/structures for use by + * the I2O kernel modules. + * */ -#define I2O_MAGIC_NUMBER 'i' -#define I2OGETIOPS _IOR(I2O_MAGIC_NUMBER,0,u8[MAX_I2O_CONTROLLERS]) -#define I2OHRTGET _IOWR(I2O_MAGIC_NUMBER,1,struct i2o_cmd_hrtlct) -#define I2OLCTGET _IOWR(I2O_MAGIC_NUMBER,2,struct i2o_cmd_hrtlct) -#define I2OPARMSET _IOWR(I2O_MAGIC_NUMBER,3,struct i2o_cmd_psetget) -#define I2OPARMGET _IOWR(I2O_MAGIC_NUMBER,4,struct i2o_cmd_psetget) -#define I2OSWDL _IOWR(I2O_MAGIC_NUMBER,5,struct i2o_sw_xfer) -#define I2OSWUL _IOWR(I2O_MAGIC_NUMBER,6,struct i2o_sw_xfer) -#define I2OSWDEL _IOWR(I2O_MAGIC_NUMBER,7,struct i2o_sw_xfer) -#define I2OVALIDATE _IOR(I2O_MAGIC_NUMBER,8,u32) -#define I2OHTML _IOWR(I2O_MAGIC_NUMBER,9,struct i2o_html) -#define I2OEVTREG _IOW(I2O_MAGIC_NUMBER,10,struct i2o_evt_id) -#define I2OEVTGET _IOR(I2O_MAGIC_NUMBER,11,struct i2o_evt_info) - -struct i2o_cmd_hrtlct -{ - unsigned int iop; /* IOP unit number */ - void *resbuf; /* Buffer for result */ - unsigned int *reslen; /* Buffer length in bytes */ -}; - -struct i2o_cmd_psetget -{ - unsigned int iop; /* IOP unit number */ - unsigned int tid; /* Target device TID */ - void *opbuf; /* Operation List buffer */ - unsigned int oplen; /* Operation List buffer length in bytes */ - void *resbuf; /* Result List buffer */ - unsigned int *reslen; /* Result List buffer length in bytes */ -}; - -struct i2o_sw_xfer -{ - unsigned int iop; /* IOP unit number */ - unsigned char flags; /* Flags field */ - unsigned char sw_type; /* Software type */ - unsigned int sw_id; /* Software ID */ - void *buf; /* Pointer to software buffer */ - unsigned int *swlen; /* Length of software data */ - unsigned int *maxfrag; /* Maximum fragment count */ - unsigned int *curfrag; /* Current fragment count */ -}; - -struct i2o_html -{ - unsigned int iop; /* IOP unit number */ - unsigned int tid; /* Target device ID */ - unsigned int page; /* HTML page */ - void *resbuf; /* Buffer for reply HTML page */ - unsigned int *reslen; /* Length in bytes of reply buffer */ - void *qbuf; /* Pointer to HTTP query string */ - unsigned int qlen; /* Length in bytes of query string buffer */ -}; -#define I2O_EVT_Q_LEN 32 +#ifdef __KERNEL__ /* This file to be included by kernel only */ -struct i2o_evt_id -{ - unsigned int iop; - unsigned int tid; - unsigned int evt_mask; -}; - -// -// Event data size = frame size - message header + evt indicator -#define I2O_EVT_DATA_SIZE 88 - -struct i2o_evt_info -{ - struct i2o_evt_id id; - unsigned char evt_data[I2O_EVT_DATA_SIZE]; - unsigned int data_size; -}; +#include -struct i2o_evt_get -{ - struct i2o_evt_info info; - int pending; - int lost; -}; +#include /* Needed for MUTEX init macros */ +#include +#include +#include -/************************************************************************** - * HRT related constants and structures - **************************************************************************/ -#define I2O_BUS_LOCAL 0 -#define I2O_BUS_ISA 1 -#define I2O_BUS_EISA 2 -#define I2O_BUS_MCA 3 -#define I2O_BUS_PCI 4 -#define I2O_BUS_PCMCIA 5 -#define I2O_BUS_NUBUS 6 -#define I2O_BUS_CARDBUS 7 -#define I2O_BUS_UNKNOWN 0x80 - -#ifndef __KERNEL__ -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -#endif /* __KERNEL__ */ - -typedef struct _i2o_pci_bus { - u8 PciFunctionNumber; - u8 PciDeviceNumber; - u8 PciBusNumber; - u8 reserved; - u16 PciVendorID; - u16 PciDeviceID; -} i2o_pci_bus; - -typedef struct _i2o_local_bus { - u16 LbBaseIOPort; - u16 reserved; - u32 LbBaseMemoryAddress; -} i2o_local_bus; - -typedef struct _i2o_isa_bus { - u16 IsaBaseIOPort; - u8 CSN; - u8 reserved; - u32 IsaBaseMemoryAddress; -} i2o_isa_bus; - -typedef struct _i2o_eisa_bus_info { - u16 EisaBaseIOPort; - u8 reserved; - u8 EisaSlotNumber; - u32 EisaBaseMemoryAddress; -} i2o_eisa_bus; - -typedef struct _i2o_mca_bus { - u16 McaBaseIOPort; - u8 reserved; - u8 McaSlotNumber; - u32 McaBaseMemoryAddress; -} i2o_mca_bus; - -typedef struct _i2o_other_bus { - u16 BaseIOPort; - u16 reserved; - u32 BaseMemoryAddress; -} i2o_other_bus; - -typedef struct _i2o_hrt_entry { - u32 adapter_id; - u32 parent_tid:12; - u32 state:4; - u32 bus_num:8; - u32 bus_type:8; - union { - i2o_pci_bus pci_bus; - i2o_local_bus local_bus; - i2o_isa_bus isa_bus; - i2o_eisa_bus eisa_bus; - i2o_mca_bus mca_bus; - i2o_other_bus other_bus; - } bus; -} i2o_hrt_entry; +/* + * Tunable parameters first + */ -typedef struct _i2o_hrt { - u16 num_entries; - u8 entry_len; - u8 hrt_version; - u32 change_ind; - i2o_hrt_entry hrt_entry[1]; -} i2o_hrt; - -typedef struct _i2o_lct_entry { - u32 entry_size:16; - u32 tid:12; - u32 reserved:4; - u32 change_ind; - u32 device_flags; - u32 class_id:12; - u32 version:4; - u32 vendor_id:16; - u32 sub_class; - u32 user_tid:12; - u32 parent_tid:12; - u32 bios_info:8; - u8 identity_tag[8]; - u32 event_capabilities; -} i2o_lct_entry; - -typedef struct _i2o_lct { - u32 table_size:16; - u32 boot_tid:12; - u32 lct_ver:4; - u32 iop_flags; - u32 current_change_ind; - i2o_lct_entry lct_entry[1]; -} i2o_lct; - -typedef struct _i2o_status_block { - u16 org_id; - u16 reserved; - u16 iop_id:12; - u16 reserved1:4; - u16 host_unit_id; - u16 segment_number:12; - u16 i2o_version:4; - u8 iop_state; - u8 msg_type; - u16 inbound_frame_size; - u8 init_code; - u8 reserved2; - u32 max_inbound_frames; - u32 cur_inbound_frames; - u32 max_outbound_frames; - char product_id[24]; - u32 expected_lct_size; - u32 iop_capabilities; - u32 desired_mem_size; - u32 current_mem_size; - u32 current_mem_base; - u32 desired_io_size; - u32 current_io_size; - u32 current_io_base; - u32 reserved3:24; - u32 cmd_status:8; -} i2o_status_block; - -/* Event indicator mask flags */ -#define I2O_EVT_IND_STATE_CHANGE 0x80000000 -#define I2O_EVT_IND_GENERAL_WARNING 0x40000000 -#define I2O_EVT_IND_CONFIGURATION_FLAG 0x20000000 -#define I2O_EVT_IND_LOCK_RELEASE 0x10000000 -#define I2O_EVT_IND_CAPABILITY_CHANGE 0x08000000 -#define I2O_EVT_IND_DEVICE_RESET 0x04000000 -#define I2O_EVT_IND_EVT_MASK_MODIFIED 0x02000000 -#define I2O_EVT_IND_FIELD_MODIFIED 0x01000000 -#define I2O_EVT_IND_VENDOR_EVT 0x00800000 -#define I2O_EVT_IND_DEVICE_STATE 0x00400000 - -/* Event data for generic events */ -#define I2O_EVT_STATE_CHANGE_NORMAL 0x00 -#define I2O_EVT_STATE_CHANGE_SUSPENDED 0x01 -#define I2O_EVT_STATE_CHANGE_RESTART 0x02 -#define I2O_EVT_STATE_CHANGE_NA_RECOVER 0x03 -#define I2O_EVT_STATE_CHANGE_NA_NO_RECOVER 0x04 -#define I2O_EVT_STATE_CHANGE_QUIESCE_REQUEST 0x05 -#define I2O_EVT_STATE_CHANGE_FAILED 0x10 -#define I2O_EVT_STATE_CHANGE_FAULTED 0x11 - -#define I2O_EVT_GEN_WARNING_NORMAL 0x00 -#define I2O_EVT_GEN_WARNING_ERROR_THRESHOLD 0x01 -#define I2O_EVT_GEN_WARNING_MEDIA_FAULT 0x02 +/* How many different OSM's are we allowing */ +#define MAX_I2O_MODULES 64 #define I2O_EVT_CAPABILITY_OTHER 0x01 #define I2O_EVT_CAPABILITY_CHANGED 0x02 #define I2O_EVT_SENSOR_STATE_CHANGED 0x01 -#ifdef __KERNEL__ /* ioctl stuff only thing exported to users */ +//#ifdef __KERNEL__ /* ioctl stuff only thing exported to users */ #define I2O_MAX_MANAGERS 4 +#include /* Needed for MUTEX init macros */ + /* * I2O Interface Objects */ @@ -303,7 +75,7 @@ struct i2o_device { - i2o_lct_entry *lct_data;/* Device LCT information */ + i2o_lct_entry lct_data;/* Device LCT information */ u32 flags; int i2oversion; /* I2O version supported. Actually there * should be high and low version */ @@ -356,8 +128,14 @@ volatile u32 *reply_port; volatile u32 *irq_mask; /* Interrupt port */ + /* Dynamic LCT related data */ + struct semaphore lct_sem; + int lct_pid; + int lct_running; + i2o_status_block *status_block; /* IOP status block */ - i2o_lct *lct; + i2o_lct *lct; /* Logical Config Table */ + i2o_lct *dlct; /* Temp LCT */ i2o_hrt *hrt; u32 mem_offset; /* MFA offset */ @@ -390,7 +168,19 @@ struct i2o_handler { + /* Message reply handler */ + void (*reply)(struct i2o_handler *, struct i2o_controller *, struct i2o_message *); + + /* New device notification handler */ + void (*new_dev_notify)(struct i2o_controller *, struct i2o_device *); + + /* Device deltion handler */ + void (*dev_del_notify)(struct i2o_controller *, struct i2o_device *); + + /* Reboot notification handler */ + void (*reboot_notify)(void); + char *name; int context; /* Low 8 bits of the transaction info */ u32 class; /* I2O classes that this driver handles */ @@ -509,8 +299,10 @@ extern int i2o_install_handler(struct i2o_handler *); extern int i2o_remove_handler(struct i2o_handler *); -extern int i2o_claim_device(struct i2o_device *, struct i2o_handler *, u32); -extern int i2o_release_device(struct i2o_device *, struct i2o_handler *, u32); +extern int i2o_claim_device(struct i2o_device *, struct i2o_handler *); +extern int i2o_release_device(struct i2o_device *, struct i2o_handler *); +extern int i2o_device_notify_on(struct i2o_device *, struct i2o_handler *); +extern int i2o_device_notify_off(struct i2o_device *, struct i2o_handler *); extern int i2o_post_this(struct i2o_controller *, u32 *, int); extern int i2o_post_wait(struct i2o_controller *, u32 *, int, int); @@ -525,9 +317,10 @@ extern int i2o_clear_table(struct i2o_controller *, int, int); extern int i2o_row_add_table(struct i2o_controller *, int, int, int, void *, int); +extern int i2o_row_delete_table(struct i2o_controller *, int, int, int, void *, int); -extern int i2o_event_register(struct i2o_controller *, int, int, u32); -extern int i2o_event_ack(struct i2o_controller *, int, int, u32, void *, int); +extern int i2o_event_register(struct i2o_controller *, u32, u32,u32, u32); +extern int i2o_event_ack(struct i2o_controller *, u32 *); extern void i2o_run_queue(struct i2o_controller *); extern void i2o_report_status(const char *, const char *, u32 *); @@ -843,6 +636,12 @@ #define I2O_POST_WAIT_OK 0 #define I2O_POST_WAIT_TIMEOUT -ETIMEDOUT + +#define DECLARE_MUTEX(name) struct semaphore name=MUTEX + +typedef struct wait_queue *wait_queue_head_t; +#define DECLARE_WAIT_QUEUE_HEAD(wait)\ + wait_queue_head_t wait #endif /* __KERNEL__ */ diff -urN v2.2.15/linux/include/linux/init.h linux/include/linux/init.h --- v2.2.15/linux/include/linux/init.h Sun Dec 27 23:08:10 1998 +++ linux/include/linux/init.h Wed Jun 7 14:26:44 2000 @@ -59,7 +59,7 @@ #define __INITDATA #endif -#if __GNUC__ >= 2 && __GNUC_MINOR__ >= 8 +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) #define __initlocaldata __initdata #else #define __initlocaldata diff -urN v2.2.15/linux/include/linux/isdn.h linux/include/linux/isdn.h --- v2.2.15/linux/include/linux/isdn.h Wed May 3 17:16:51 2000 +++ linux/include/linux/isdn.h Wed Jun 7 14:26:44 2000 @@ -606,7 +606,6 @@ #define ISDN_TIMER_MODEMXMIT 8 #define ISDN_TIMER_NETDIAL 16 #define ISDN_TIMER_NETHANGUP 32 -#define ISDN_TIMER_IPPP 64 #define ISDN_TIMER_KEEPALIVE 128 /* Cisco-Keepalive */ #define ISDN_TIMER_CARRIER 256 /* Wait for Carrier */ #define ISDN_TIMER_FAST (ISDN_TIMER_MODEMREAD | ISDN_TIMER_MODEMPLUS | \ @@ -742,8 +741,8 @@ void *next; /* Pointer to next isdn-interface */ struct device dev; /* interface to upper levels */ #ifdef CONFIG_ISDN_PPP - struct mpqueue *mp_last; - struct ippp_bundle ib; + ippp_bundle * pb; /* pointer to the common bundle structure + * with the the per-bundle data */ #endif #ifdef CONFIG_ISDN_X25 struct concap_proto *cprot; /* connection oriented encapsulation protocol */ diff -urN v2.2.15/linux/include/linux/isdn_ppp.h linux/include/linux/isdn_ppp.h --- v2.2.15/linux/include/linux/isdn_ppp.h Tue Oct 26 17:53:42 1999 +++ linux/include/linux/isdn_ppp.h Wed Jun 7 14:26:44 2000 @@ -52,6 +52,8 @@ #define MP_END_FRAG 0x40 #define MP_BEGIN_FRAG 0x80 +#define MP_MAX_QUEUE_LEN 16 + #define ISDN_PPP_COMP_MAX_OPTIONS 16 #define IPPP_COMP_FLAG_XMIT 0x1 @@ -66,6 +68,8 @@ #ifdef __KERNEL__ +#include + /* * We need a way for the decompressor to influence the generation of CCP * Reset-Requests in a variety of ways. The decompressor is already returning @@ -134,35 +138,28 @@ extern int isdn_ppp_dial_slave(char *); extern int isdn_ppp_hangup_slave(char *); -struct ippp_bundle { +typedef struct { + unsigned long seqerrs; + unsigned long frame_drops; + unsigned long overflows; + unsigned long max_queue_len; +} isdn_mppp_stats; + +typedef struct { int mp_mrru; /* unused */ - struct mpqueue *last; /* currently defined in isdn_net_dev */ - int min; /* currently calculated 'on the fly' */ - long next_num; /* we wanna see this seq.-number next */ - struct sqqueue *sq; - int modify:1; /* set to 1 while modifying sqqueue */ - int bundled:1; /* bundle active ? */ -}; + struct sk_buff * frags; /* fragments sl list -- use skb->next */ + long frames; /* number of frames in the frame list */ + unsigned int seq; /* last processed packet seq #: any packets + * with smaller seq # will be dropped + * unconditionally */ + spinlock_t lock; + int ref_ct; + /* statistics */ + isdn_mppp_stats stats; +} ippp_bundle; #define NUM_RCV_BUFFS 64 -struct sqqueue { - struct sqqueue *next; - long sqno_start; - long sqno_end; - struct sk_buff *skb; - long timer; -}; - -struct mpqueue { - struct mpqueue *next; - struct mpqueue *last; - long sqno; - struct sk_buff *skb; - int BEbyte; - unsigned long time; -}; - struct ippp_buf_queue { struct ippp_buf_queue *next; struct ippp_buf_queue *last; @@ -217,9 +214,8 @@ struct isdn_net_local_s *lp; int unit; int minor; - long last_link_seqno; + unsigned int last_link_seqno; long mp_seqno; - long range; #ifdef CONFIG_ISDN_PPP_VJ unsigned char *cbuf; struct slcompress *slcomp; diff -urN v2.2.15/linux/include/linux/linkage.h linux/include/linux/linkage.h --- v2.2.15/linux/include/linux/linkage.h Tue Dec 1 11:28:24 1998 +++ linux/include/linux/linkage.h Wed Jun 7 14:26:44 2000 @@ -7,7 +7,7 @@ #define CPP_ASMLINKAGE #endif -#if defined __i386__ && (__GNUC__ > 2 || __GNUC_MINOR__ > 7) +#if defined __i386__ && (__GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ > 7) #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) #else #define asmlinkage CPP_ASMLINKAGE diff -urN v2.2.15/linux/include/linux/major.h linux/include/linux/major.h --- v2.2.15/linux/include/linux/major.h Wed May 3 17:16:52 2000 +++ linux/include/linux/major.h Wed Jun 7 14:26:44 2000 @@ -67,6 +67,8 @@ #define CM206_CDROM_MAJOR 32 #define IDE2_MAJOR 33 #define IDE3_MAJOR 34 +#define XPRAM_MAJOR 35 /* expanded storage on S/390 = "slow ram" */ + /* proposed by Peter */ #define NETLINK_MAJOR 36 #define PS2ESDI_MAJOR 36 #define IDETAPE_MAJOR 37 diff -urN v2.2.15/linux/include/linux/msdos_fs.h linux/include/linux/msdos_fs.h --- v2.2.15/linux/include/linux/msdos_fs.h Mon Aug 9 12:04:41 1999 +++ linux/include/linux/msdos_fs.h Wed Jun 7 14:26:44 2000 @@ -69,7 +69,7 @@ #define MSDOS_DOT ". " /* ".", padded to MSDOS_NAME chars */ #define MSDOS_DOTDOT ".. " /* "..", padded to MSDOS_NAME chars */ -#define MSDOS_FAT12 4078 /* maximum number of clusters in a 12 bit FAT */ +#define MSDOS_FAT12 4084 /* maximum number of clusters in a 12 bit FAT */ #define EOF_FAT12 0xFF8 /* standard EOF */ #define EOF_FAT16 0xFFF8 diff -urN v2.2.15/linux/include/linux/nls.h linux/include/linux/nls.h --- v2.2.15/linux/include/linux/nls.h Thu Jan 7 09:25:02 1999 +++ linux/include/linux/nls.h Wed Jun 7 14:26:44 2000 @@ -5,8 +5,8 @@ struct nls_table { char *charset; - unsigned char **page_uni2charset; - struct nls_unicode *charset2uni; + void (*uni2char) (unsigned char ch, unsigned char cl, unsigned char *out, int boundlen, int *outlen); + void (*char2uni) (unsigned char *rawstring, int *offset, unsigned char *uni1, unsigned char *uni2); void (*inc_use_count) (void); void (*dec_use_count) (void); @@ -36,6 +36,7 @@ extern int init_nls_iso8859_7(void); extern int init_nls_iso8859_8(void); extern int init_nls_iso8859_9(void); +extern int init_nls_iso8859_14(void); extern int init_nls_iso8859_15(void); extern int init_nls_cp437(void); extern int init_nls_cp737(void); @@ -53,4 +54,8 @@ extern int init_nls_cp866(void); extern int init_nls_cp869(void); extern int init_nls_cp874(void); +extern int init_nls_cp932(void); +extern int init_nls_cp936(void); +extern int init_nls_cp949(void); +extern int init_nls_cp950(void); extern int init_nls_koi8_r(void); diff -urN v2.2.15/linux/include/linux/pci.h linux/include/linux/pci.h --- v2.2.15/linux/include/linux/pci.h Wed May 3 17:16:52 2000 +++ linux/include/linux/pci.h Wed Jun 7 14:26:44 2000 @@ -272,6 +272,7 @@ #define PCI_CLASS_SERIAL_SSA 0x0c02 #define PCI_CLASS_SERIAL_USB 0x0c03 #define PCI_CLASS_SERIAL_FIBER 0x0c04 +#define PCI_CLASS_SERIAL_SMBUS 0x0c05 #define PCI_BASE_CLASS_INTELLIGENT 0x0e #define PCI_CLASS_INTELLIGENT_I2O 0x0e00 @@ -860,9 +861,17 @@ #define PCI_DEVICE_ID_RENDITION_VERITE 0x0001 #define PCI_DEVICE_ID_RENDITION_VERITE2100 0x2000 -#define PCI_VENDOR_ID_RCC 0x1166 -#define PCI_DEVICE_ID_RCC_HE 0x0008 -#define PCI_DEVICE_ID_RCC_LE 0x0009 +#define PCI_VENDOR_ID_SERVERWORKS 0x1166 +#define PCI_DEVICE_ID_SERVERWORKS_HE 0x0008 +#define PCI_DEVICE_ID_SERVERWORKS_LE 0x0009 +#define PCI_DEVICE_ID_SERVERWORKS_CIOB30 0x0010 +#define PCI_DEVICE_ID_SERVERWORKS_CMIC_HE 0x0011 +#define PCI_DEVICE_ID_SERVERWORKS_CSB5 0x0201 + +#define PCI_VENDOR_ID_SBE 0x1176 +#define PCI_DEVICE_ID_SBE_WANXL100 0x0301 +#define PCI_DEVICE_ID_SBE_WANXL200 0x0302 +#define PCI_DEVICE_ID_SBE_WANXL400 0x0104 #define PCI_VENDOR_ID_TOSHIBA 0x1179 #define PCI_DEVICE_ID_TOSHIBA_601 0x0601 @@ -1031,8 +1040,14 @@ #define PCI_DEVICE_ID_LAVA_DUAL_PAR_A 0x8002 /* The Lava Dual Parallel is */ #define PCI_DEVICE_ID_LAVA_DUAL_PAR_B 0x8003 /* two PCI devices on a card */ +#define PCI_VENDOR_ID_TIMEDIA 0x1409 +#define PCI_DEVICE_ID_TIMEDIA_1889 0x7168 + #define PCI_VENDOR_ID_AFAVLAB 0x14db #define PCI_DEVICE_ID_AFAVLAB_TK9902 0x2120 + +#define PCI_VENDOR_ID_TIMEDIA 0x1409 +#define PCI_DEVICE_ID_TIMEDIA_4008A 0x7268 #define PCI_VENDOR_ID_SYMPHONY 0x1c1c #define PCI_DEVICE_ID_SYMPHONY_101 0x0001 diff -urN v2.2.15/linux/include/linux/proc_fs.h linux/include/linux/proc_fs.h --- v2.2.15/linux/include/linux/proc_fs.h Wed May 3 17:16:52 2000 +++ linux/include/linux/proc_fs.h Wed Jun 7 14:26:44 2000 @@ -146,6 +146,7 @@ PROC_NET_IPFW_CHAIN_NAMES, PROC_NET_AT_AARP, PROC_NET_BRIDGE, + PROC_NET_PNP, PROC_NET_LAST }; diff -urN v2.2.15/linux/include/linux/quotaops.h linux/include/linux/quotaops.h --- v2.2.15/linux/include/linux/quotaops.h Tue Oct 26 17:53:42 1999 +++ linux/include/linux/quotaops.h Wed Jun 7 14:26:44 2000 @@ -98,7 +98,7 @@ { int error = -EDQUOT; - if (dentry->d_inode->i_sb->dq_op) { + if (dentry->d_inode->i_sb && dentry->d_inode->i_sb->dq_op) { dentry->d_inode->i_sb->dq_op->initialize(dentry->d_inode, -1); error = dentry->d_inode->i_sb->dq_op->transfer(dentry, iattr, current->fsuid); } else { diff -urN v2.2.15/linux/include/linux/smb_fs.h linux/include/linux/smb_fs.h --- v2.2.15/linux/include/linux/smb_fs.h Sun Jun 13 19:54:06 1999 +++ linux/include/linux/smb_fs.h Wed Jun 7 14:26:44 2000 @@ -192,6 +192,7 @@ int entries; /* total entries */ int pages; /* number of data pages */ int idx; /* index of current data page */ + time_t mtime; /* the last mtime of our dir inode */ struct cache_index index[NINDEX]; }; diff -urN v2.2.15/linux/include/linux/sysctl.h linux/include/linux/sysctl.h --- v2.2.15/linux/include/linux/sysctl.h Wed May 3 17:16:52 2000 +++ linux/include/linux/sysctl.h Wed Jun 7 14:26:44 2000 @@ -435,7 +435,12 @@ /* /proc/sys/dev/cdrom */ enum { - DEV_CDROM_INFO=1 + DEV_CDROM_INFO=1, + DEV_CDROM_AUTOCLOSE=2, + DEV_CDROM_AUTOEJECT=3, + DEV_CDROM_DEBUG=4, + DEV_CDROM_LOCK=5, + DEV_CDROM_CHECK_MEDIA=6 }; #ifdef __KERNEL__ diff -urN v2.2.15/linux/include/linux/timex.h linux/include/linux/timex.h --- v2.2.15/linux/include/linux/timex.h Tue May 11 10:35:44 1999 +++ linux/include/linux/timex.h Wed Jun 7 14:26:44 2000 @@ -136,6 +136,10 @@ * Pick up the architecture specific timex specifications */ #include +/* + * Pick up the definition of timeval + */ +#include /* LATCH is used in the interval timer and ftape setup. */ #define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */ diff -urN v2.2.15/linux/include/net/ipconfig.h linux/include/net/ipconfig.h --- v2.2.15/linux/include/net/ipconfig.h Mon Jan 4 15:31:35 1999 +++ linux/include/net/ipconfig.h Wed Jun 7 14:26:44 2000 @@ -6,16 +6,30 @@ * Automatic IP Layer Configuration */ -extern __u32 root_server_addr; -extern u8 root_server_path[]; -extern u32 ic_myaddr; -extern u32 ic_servaddr; -extern u32 ic_gateway; -extern u32 ic_netmask; -extern int ic_enable; -extern int ic_host_name_set; -extern int ic_set_manually; -extern int ic_proto_enabled; +/* The following are initdata: */ -#define IC_BOOTP 1 -#define IC_RARP 2 +extern int ic_enable; /* Enable or disable the whole shebang */ + +extern int ic_proto_enabled; /* Protocols enabled (see IC_xxx) */ +extern int ic_host_name_set; /* Host name set by ipconfig? */ + +extern u32 ic_myaddr; /* My IP address */ +extern u32 ic_netmask; /* Netmask for local subnet */ +extern u32 ic_gateway; /* Gateway IP address */ + +extern u32 ic_servaddr; /* Boot server IP address */ + +extern u32 root_server_addr; /* Address of NFS server */ +extern u8 root_server_path[]; /* Path to mount as root */ + +/* The following are persistent (not initdata): */ + +extern int ic_proto_used; /* Protocol used, if any */ +extern u32 ic_nameserver; /* DNS server IP address */ +extern u8 ic_domain[]; /* DNS (not NIS) domain name */ + +/* bits in ic_proto_{enabled,used} */ +#define IC_PROTO 0xFF /* Protocols mask: */ +#define IC_BOOTP 0x01 /* BOOTP (or DHCP, see below) */ +#define IC_RARP 0x02 /* RARP */ +#define IC_USE_DHCP 0x100 /* If on, use DHCP instead of BOOTP */ diff -urN v2.2.15/linux/include/net/irda/irlan_common.h linux/include/net/irda/irlan_common.h --- v2.2.15/linux/include/net/irda/irlan_common.h Wed May 3 17:16:52 2000 +++ linux/include/net/irda/irlan_common.h Wed Jun 7 14:26:44 2000 @@ -6,10 +6,10 @@ * Status: Experimental. * Author: Dag Brattli * Created at: Sun Aug 31 20:14:37 1997 - * Modified at: Sun Oct 31 19:41:24 1999 + * Modified at: Fri Apr 21 11:11:38 2000 * Modified by: Dag Brattli * - * Copyright (c) 1998-1999 Dag Brattli , + * Copyright (c) 1998-2000 Dag Brattli , * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -165,25 +165,23 @@ int magic; char ifname[9]; - struct device dev; /* Ethernet device structure*/ - struct enet_statistics stats; + struct device dev; /* Ethernet device structure*/ + struct net_device_stats stats; - __u32 saddr; /* Source device address */ - __u32 daddr; /* Destination device address */ - int netdev_registered; - int notify_irmanager; - - int media; /* Media type */ - __u8 version[2]; /* IrLAN version */ + __u32 saddr; /* Source device address */ + __u32 daddr; /* Destination device address */ + int disconnect_reason; /* Why we got disconnected */ + + int media; /* Media type */ + __u8 version[2]; /* IrLAN version */ - struct tsap_cb *tsap_data; + struct tsap_cb *tsap_data; /* Data TSAP */ - int master; /* Master instance? */ - int use_udata; /* Use Unit Data transfers */ + int use_udata; /* Use Unit Data transfers */ - __u8 stsap_sel_data; /* Source data TSAP selector */ - __u8 dtsap_sel_data; /* Destination data TSAP selector */ - __u8 dtsap_sel_ctrl; /* Destination ctrl TSAP selector */ + __u8 stsap_sel_data; /* Source data TSAP selector */ + __u8 dtsap_sel_data; /* Destination data TSAP selector */ + __u8 dtsap_sel_ctrl; /* Destination ctrl TSAP selector */ struct irlan_client_cb client; /* Client specific fields */ struct irlan_provider_cb provider; /* Provider specific fields */ @@ -194,7 +192,7 @@ struct timer_list watchdog_timer; }; -struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr, int netdev); +struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr); void irlan_close(struct irlan_cb *self); void irlan_close_tsaps(struct irlan_cb *self); void irlan_mod_inc_use_count(void); @@ -202,7 +200,6 @@ int irlan_register_netdev(struct irlan_cb *self); void irlan_ias_register(struct irlan_cb *self, __u8 tsap_sel); -void irlan_start_watchdog_timer(struct irlan_cb *self, int timeout); void irlan_open_data_tsap(struct irlan_cb *self); diff -urN v2.2.15/linux/include/net/slhc.h linux/include/net/slhc.h --- v2.2.15/linux/include/net/slhc.h Tue Feb 6 22:55:43 1996 +++ linux/include/net/slhc.h Wed Dec 31 16:00:00 1969 @@ -1,6 +0,0 @@ -#ifndef __NET_SLHC_H -#define __NET_SLHC_H - -extern void slhc_install(void); - -#endif diff -urN v2.2.15/linux/include/scsi/sg.h linux/include/scsi/sg.h --- v2.2.15/linux/include/scsi/sg.h Tue Jan 4 10:12:25 2000 +++ linux/include/scsi/sg.h Wed Jun 7 14:26:44 2000 @@ -9,13 +9,18 @@ Original driver (sg.h): * Copyright (C) 1992 Lawrence Foard 2.x extensions to driver: -* Copyright (C) 1998, 1999 Douglas Gilbert +* Copyright (C) 1998 - 2000 Douglas Gilbert - - Version: 2.1.36 (991008) + Version: 2.1.38 (20000527) This version for 2.2.x series kernels D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au) + Changes since 2.1.37 (20000504) + - fine tune state machine to stop read() race + - switch to numeric device description (e.g. sg0 instead of sga) + Changes since 2.1.36 (991008) + - fix 0 length scatter gather requests + alignment + - activate SG_SCSI_RESET ioctl() [to work needs mid level changes] Changes since 2.1.34 (990603) - skipped 2.1.35 (never fully released) - add queuing info into struct sg_scsi_id @@ -35,19 +40,24 @@ - clean up logging of pointers to use %p (for 64 bit architectures) - rework usage of get_user/copy_to_user family of kernel calls - "disown" scsi_command blocks before releasing them - Changes since 2.1.30 (990320) - - memory tweaks: change flags on kmalloc (GFP_KERNEL to GFP_ATOMIC) - - increase max allowable mid-level pool usage +Map of SG verions to the Linux kernels in which they appear: + ---------- ---------------------------------- + original all kernels < 2.2.6 + 2.1.31 2.2.6 and 2.2.7 + 2.1.32 2.2.8 and 2.2.9 + 2.1.34 2.2.10 to 2.2.13 + 2.1.36 2.2.14 and 2.2.15 + 2.1.38 2.2.16 + 3.0.15 optional version 3 sg driver for 2.2 series + 3.1.15 late 2.3 series approaching 2.4 New features and changes: - - per file descriptor (fd) write-read sequencing and command queues. - - command queuing supported (SG_MAX_QUEUE is maximum per fd). + - per file descriptor (fd) write-read sequencing + - command queuing supported - scatter-gather supported (allowing potentially megabyte transfers). - - the SCSI target, host and driver status are returned - in unused fields of sg_header (maintaining its original size). - - asynchronous notification support added (SIGPOLL, SIGIO) for - read()s (write()s should never block). + - more SCSI status information returned + - asynchronous notification support added (SIGPOLL, SIGIO) - pack_id logic added so read() can wait for a specific pack_id. - uses memory > ISA_DMA_THRESHOLD if adapter allows it (e.g. a pci scsi adapter). @@ -68,61 +78,21 @@ calling the ioctl of the same name is a more flexible and safer approach. - adds several ioctl calls, see ioctl section below. - - Good documentation on the original "sg" device interface and usage can be - found in the Linux HOWTO document: "SCSI Programming HOWTO" (version 0.5) - by Heiko Eissfeldt; last updated 7 May 1996. Here is a quick summary of - sg basics: - An SG device is accessed by writing SCSI commands plus any associated - outgoing data to it; the resulting status codes and any incoming data - are then obtained by a read call. The device can be opened O_NONBLOCK - (non-blocking) and poll() used to monitor its progress. The device may be - opened O_EXCL which excludes other "sg" users from this device (but not - "sd", "st" or "sr" users). The buffer given to the write() call is made - up as follows: - - struct sg_header image (see below) - - scsi command (6, 10 or 12 bytes long) - - data to be written to the device (if any) - - The buffer received from the corresponding read() call contains: - - struct sg_header image (check results + sense_buffer) - - data read back from device (if any) - - The given SCSI command has its LUN field overwritten internally by the - value associated with the device that has been opened. - - This device currently uses "indirect IO" in the sense that data is - DMAed into kernel buffers from the hardware and afterwards is - transferred into the user space (or vice versa if you are writing). - Transfer speeds or up to 20 to 30MBytes/sec have been measured using - indirect IO. For faster throughputs "direct IO" which cuts out the - double handling of data is required. This will also need a new interface. - - Grabbing memory for those kernel buffers used in this driver for DMA may - cause the dreaded ENOMEM error. This error seems to be more prevalent - under early 2.2.x kernels than under the 2.0.x kernel series. For a given - (large) transfer the memory obtained by this driver must be contiguous or - scatter-gather must be used (if supported by the adapter). [Furthermore, - ISA SCSI adapters can only use memory below the 16MB level on a i386.] - - When a "sg" device is open()ed O_RDWR then this driver will attempt to - reserve a buffer of SG_DEF_RESERVED_SIZE that will be used by subsequent - write()s on this file descriptor as long as: - - it is not already in use (eg when command queuing is in use) - - the write() does not call for a buffer size larger than the - reserved size. - In these cases the write() will attempt to find the memory it needs for - DMA buffers dynamically and in the worst case will fail with ENOMEM. - The amount of memory actually reserved depends on various dynamic factors - and can be checked with the SG_GET_RESERVED_SIZE ioctl(). [In a very - tight memory situation it may yield 0!] The size of the reserved buffer - can be changed with the SG_SET_RESERVED_SIZE ioctl(). It should be - followed with a call to the SG_GET_RESERVED_SIZE ioctl() to find out how - much was actually reserved. - More documentation plus test and utility programs can be found at - http://www.torque.net/sg + Documentation + ============= + A web site for SG device drivers can be found at: + http://www.torque.net/sg [alternatively check the MAINTAINERS file] + The main documents are still based on 2.x versions: + http://www.torque.net/sg/p/scsi-generic.txt + http://www.torque.net/sg/p/scsi-generic_long.txt + The first document can also be found in the kernel source tree, probably at: + /usr/src/linux/Documentation/scsi-generic.txt . + Documentation on the changes and additions in 3.x version of the sg driver + can be found at: http://www.torque.net/sg/p/scsi-generic_v3.txt + Utility and test programs are also available at that web site. */ + #define SG_MAX_SENSE 16 /* too little, unlikely to change in 2.2.x */ @@ -213,9 +183,13 @@ #define SG_NEXT_CMD_LEN 0x2283 /* override SCSI command length with given number on the next write() on this file descriptor */ -/* Returns -EBUSY if occupied else takes as input: 0 -> do nothing, - 1 -> device reset or 2 -> bus reset (not operational yet) */ +/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */ #define SG_SCSI_RESET 0x2284 +/* Associated values that can be given to SG_SCSI_RESET follow */ +#define SG_SCSI_RESET_NOTHING 0 +#define SG_SCSI_RESET_DEVICE 1 +#define SG_SCSI_RESET_BUS 2 +#define SG_SCSI_RESET_HOST 3 #define SG_SCATTER_SZ (8 * 4096) /* PAGE_SIZE not available to user */ diff -urN v2.2.15/linux/init/main.c linux/init/main.c --- v2.2.15/linux/init/main.c Wed May 3 17:16:53 2000 +++ linux/init/main.c Wed Jun 7 14:26:44 2000 @@ -47,7 +47,11 @@ #endif #ifdef CONFIG_DASD -#include "../drivers/s390/block/dasd.h" +#include +#endif + +#ifdef CONFIG_BLK_DEV_XPRAM +#include "../drivers/s390/block/xpram.h" #endif #ifdef CONFIG_MAC @@ -190,14 +194,21 @@ #ifdef CONFIG_3215 extern void con3215_setup(char *str, int *ints); #endif -#ifdef CONFIG_3215 -extern void con3215_setup(char *str, int *ints); -#endif #ifdef CONFIG_MDISK extern void mdisk_setup(char *str, int *ints); #endif #ifdef CONFIG_DASD extern void dasd_setup(char *str, int *ints); +#ifdef CONFIG_DASD_MDSK +extern void dasd_mdsk_setup(char *str, int *ints); +#endif +#endif +#ifdef CONFIG_BLK_DEV_XPRAM +extern void xpram_setup(char *str, int *ints); +#endif +#ifdef CONFIG_ARCH_S390 +extern void vmhalt_setup(char *str, int *ints); +extern void vmpoff_setup(char *str, int *ints); #endif extern void floppy_setup(char *str, int *ints); extern void st_setup(char *str, int *ints); @@ -319,6 +330,10 @@ #ifdef CONFIG_RISCOM8 extern void riscom8_setup(char *str, int *ints); #endif + +extern void n2_setup(char *str, int *ints); +extern void c101_setup(char *str, int *ints); + #ifdef CONFIG_SPECIALIX extern void specialix_setup(char *str, int *ints); #endif @@ -598,6 +613,58 @@ { "dasdf", (DASD_MAJOR << MINORBITS) + (5 << 2) }, { "dasdg", (DASD_MAJOR << MINORBITS) + (6 << 2) }, { "dasdh", (DASD_MAJOR << MINORBITS) + (7 << 2) }, + { "dasdi", (DASD_MAJOR << MINORBITS) + (8 << 2) }, + { "dasdj", (DASD_MAJOR << MINORBITS) + (9 << 2) }, + { "dasdk", (DASD_MAJOR << MINORBITS) + (11 << 2) }, + { "dasdl", (DASD_MAJOR << MINORBITS) + (12 << 2) }, + { "dasdm", (DASD_MAJOR << MINORBITS) + (13 << 2) }, + { "dasdn", (DASD_MAJOR << MINORBITS) + (14 << 2) }, + { "dasdo", (DASD_MAJOR << MINORBITS) + (15 << 2) }, + { "dasdp", (DASD_MAJOR << MINORBITS) + (16 << 2) }, + { "dasdq", (DASD_MAJOR << MINORBITS) + (17 << 2) }, + { "dasdr", (DASD_MAJOR << MINORBITS) + (18 << 2) }, + { "dasds", (DASD_MAJOR << MINORBITS) + (19 << 2) }, + { "dasdt", (DASD_MAJOR << MINORBITS) + (20 << 2) }, + { "dasdu", (DASD_MAJOR << MINORBITS) + (21 << 2) }, + { "dasdv", (DASD_MAJOR << MINORBITS) + (22 << 2) }, + { "dasdw", (DASD_MAJOR << MINORBITS) + (23 << 2) }, + { "dasdx", (DASD_MAJOR << MINORBITS) + (24 << 2) }, + { "dasdy", (DASD_MAJOR << MINORBITS) + (25 << 2) }, + { "dasdz", (DASD_MAJOR << MINORBITS) + (26 << 2) }, +#endif +#ifdef CONFIG_BLK_DEV_XPRAM + { "xpram0", (XPRAM_MAJOR << MINORBITS) }, + { "xpram1", (XPRAM_MAJOR << MINORBITS) + 1 }, + { "xpram2", (XPRAM_MAJOR << MINORBITS) + 2 }, + { "xpram3", (XPRAM_MAJOR << MINORBITS) + 3 }, + { "xpram4", (XPRAM_MAJOR << MINORBITS) + 4 }, + { "xpram5", (XPRAM_MAJOR << MINORBITS) + 5 }, + { "xpram6", (XPRAM_MAJOR << MINORBITS) + 6 }, + { "xpram7", (XPRAM_MAJOR << MINORBITS) + 7 }, + { "xpram8", (XPRAM_MAJOR << MINORBITS) + 8 }, + { "xpram9", (XPRAM_MAJOR << MINORBITS) + 9 }, + { "xpram10", (XPRAM_MAJOR << MINORBITS) + 10 }, + { "xpram11", (XPRAM_MAJOR << MINORBITS) + 11 }, + { "xpram12", (XPRAM_MAJOR << MINORBITS) + 12 }, + { "xpram13", (XPRAM_MAJOR << MINORBITS) + 13 }, + { "xpram14", (XPRAM_MAJOR << MINORBITS) + 14 }, + { "xpram15", (XPRAM_MAJOR << MINORBITS) + 15 }, + { "xpram16", (XPRAM_MAJOR << MINORBITS) + 16 }, + { "xpram17", (XPRAM_MAJOR << MINORBITS) + 17 }, + { "xpram18", (XPRAM_MAJOR << MINORBITS) + 18 }, + { "xpram19", (XPRAM_MAJOR << MINORBITS) + 19 }, + { "xpram20", (XPRAM_MAJOR << MINORBITS) + 20 }, + { "xpram21", (XPRAM_MAJOR << MINORBITS) + 21 }, + { "xpram22", (XPRAM_MAJOR << MINORBITS) + 22 }, + { "xpram23", (XPRAM_MAJOR << MINORBITS) + 23 }, + { "xpram24", (XPRAM_MAJOR << MINORBITS) + 24 }, + { "xpram25", (XPRAM_MAJOR << MINORBITS) + 25 }, + { "xpram26", (XPRAM_MAJOR << MINORBITS) + 26 }, + { "xpram27", (XPRAM_MAJOR << MINORBITS) + 27 }, + { "xpram28", (XPRAM_MAJOR << MINORBITS) + 28 }, + { "xpram29", (XPRAM_MAJOR << MINORBITS) + 29 }, + { "xpram30", (XPRAM_MAJOR << MINORBITS) + 30 }, + { "xpram31", (XPRAM_MAJOR << MINORBITS) + 31 }, #endif { NULL, 0 } }; @@ -653,6 +720,7 @@ { "noapic", ioapic_setup }, { "pirq=", ioapic_pirq_setup }, #endif + #endif #ifdef CONFIG_BLK_DEV_RAM { "ramdisk_start=", ramdisk_start_setup }, @@ -663,6 +731,7 @@ #ifdef CONFIG_BLK_DEV_INITRD { "noinitrd", no_initrd }, #endif +#endif #ifdef CONFIG_CTC { "ctc=", ctc_setup } , @@ -671,8 +740,6 @@ { "iucv=", iucv_setup } , #endif -#endif - #ifdef CONFIG_FB { "video=", video_setup }, #endif @@ -1017,8 +1084,11 @@ #ifdef CONFIG_APM { "apm=", apm_setup }, #endif -#ifdef CONFIG_3215 - { "condev=", con3215_setup }, +#ifdef CONFIG_N2 + { "n2=", n2_setup }, +#endif +#ifdef CONFIG_C101 + { "c101=", c101_setup }, #endif #ifdef CONFIG_3215 { "condev=", con3215_setup }, @@ -1028,6 +1098,16 @@ #endif #ifdef CONFIG_DASD { "dasd=", dasd_setup }, +#ifdef CONFIG_DASD_MDSK + { "dasd_force_diag=", dasd_mdsk_setup }, +#endif +#endif +#ifdef CONFIG_BLK_DEV_XPRAM + { "xpram_parts=", xpram_setup }, +#endif +#ifdef CONFIG_ARCH_S390 + { "vmhalt=", vmhalt_setup }, + { "vmpoff=", vmpoff_setup }, #endif { 0, 0 } }; @@ -1150,6 +1230,7 @@ static void __init parse_options(char *line) { char *next; + char *quote; int args, envs; if (!*line) @@ -1158,8 +1239,25 @@ envs = 1; /* TERM is set to 'linux' by default */ next = line; while ((line = next) != NULL) { - if ((next = strchr(line,' ')) != NULL) - *next++ = 0; + /* On S/390 we want to be able to pass an options that + * contains blanks. For example vmhalt="IPL CMS". + * To allow that I added code that prevents blanks in + * quotes to be recognized as delimiter. -- Martin + */ + quote = strchr(line,'"'); + next = strchr(line, ' '); + while (next != NULL && quote != NULL && quote < next) { + /* we found a left quote before the next blank + * now we have to find the matching right quote + */ + next = strchr(quote+1, '"'); + if (next != NULL) { + quote = strchr(next+1, '"'); + next = strchr(next+1, ' '); + } + } + if (next != NULL) + *next++ = 0; /* * check for kernel options first.. */ @@ -1454,7 +1552,9 @@ /* Set up devices .. */ device_setup(); - +#if CONFIG_CHANDEV + chandev_init(); +#endif /* .. executable formats .. */ binfmt_setup(); diff -urN v2.2.15/linux/ipc/shm.c linux/ipc/shm.c --- v2.2.15/linux/ipc/shm.c Wed May 3 17:16:53 2000 +++ linux/ipc/shm.c Wed Jun 7 14:26:44 2000 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -517,7 +518,7 @@ shmd->vm_ops = &shm_vm_ops; shp->u.shm_nattch++; /* prevent destruction */ - if ((err = shm_map (shmd))) { + if (shp->u.shm_nattch > 0xffff - NR_TASKS || (err = shm_map (shmd))) { if (--shp->u.shm_nattch <= 0 && shp->u.shm_perm.mode & SHM_DEST) killseg(id); kmem_cache_free(vm_area_cachep, shmd); @@ -549,8 +550,11 @@ printk("shm_open: unused id=%d PANIC\n", id); return; } + if (!++shp->u.shm_nattch) { + shp->u.shm_nattch--; + return; /* XXX: should be able to report failure */ + } insert_attach(shp,shmd); /* insert shmd into shp->attaches */ - shp->u.shm_nattch++; shp->u.shm_atime = CURRENT_TIME; shp->u.shm_lpid = current->pid; } diff -urN v2.2.15/linux/kernel/capability.c linux/kernel/capability.c --- v2.2.15/linux/kernel/capability.c Mon Aug 9 12:04:41 1999 +++ linux/kernel/capability.c Wed Jun 7 14:26:44 2000 @@ -8,6 +8,8 @@ #include #include +kernel_cap_t cap_bset = CAP_INIT_EFF_SET; + /* Note: never hold tasklist_lock while spinning for this one */ spinlock_t task_capability_lock; @@ -16,8 +18,6 @@ * capability set pointers may be NULL -- indicating that that set is * uninteresting and/or not to be changed. */ - -kernel_cap_t cap_bset = CAP_FULL_SET; asmlinkage int sys_capget(cap_user_header_t header, cap_user_data_t dataptr) { diff -urN v2.2.15/linux/kernel/kmod.c linux/kernel/kmod.c --- v2.2.15/linux/kernel/kmod.c Tue Jan 4 10:12:25 2000 +++ linux/kernel/kmod.c Wed Jun 7 14:26:44 2000 @@ -7,6 +7,9 @@ Modified to avoid chroot and file sharing problems. Mikael Pettersson + + Back port check for modprobe loops from 2.3. + Keith Owens May 2000 */ #define __KERNEL_SYSCALLS__ @@ -41,16 +44,20 @@ dput(fs->pwd); fs->root = dget(init_task.fs->root); fs->pwd = dget(init_task.fs->pwd); + fs->umask = 0022; unlock_kernel(); } -static int exec_modprobe(void * module_name) +int exec_usermodehelper(char *program_path, char *argv[], char *envp[]) { - static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }; - char *argv[] = { modprobe_path, "-s", "-k", (char*)module_name, NULL }; int i; + current->session = 1; + current->pgrp = 1; + + use_init_fs_context(); + /* Prevent parent user process from sending signals to child. Otherwise, if the modprobe program does not exist, it might be possible to get a user defined signal handler to execute @@ -62,10 +69,6 @@ flush_signal_handlers(current); spin_unlock_irq(¤t->sigmask_lock); - /* Copy root dir and cwd from init */ - use_init_fs_context(); - - /* Close our copies of user's open files */ for (i = 0; i < current->files->max_fds; i++ ) { if (current->files->fd[i]) close(i); } @@ -73,33 +76,57 @@ /* Drop the "current user" thing */ free_uid(current); - /* Give kmod all privileges.. */ + /* Give kmod all effective privileges.. */ current->uid = current->euid = current->fsuid = 0; - cap_set_full(current->cap_inheritable); cap_set_full(current->cap_effective); /* Allow execve args to be in kernel space. */ set_fs(KERNEL_DS); /* Go, go, go... */ - if (execve(modprobe_path, argv, envp) < 0) { + if (execve(program_path, argv, envp) < 0) + return -errno; + return 0; +} + +static int exec_modprobe(void * module_name) +{ + static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }; + char *argv[] = { modprobe_path, "-s", "-k", (char*)module_name, NULL }; + int ret; + + ret = exec_usermodehelper(modprobe_path, argv, envp); + if (ret) { printk(KERN_ERR "kmod: failed to exec %s -s -k %s, errno = %d\n", modprobe_path, (char*) module_name, errno); - return -errno; } - return 0; + return ret; } -/* - request_module: the function that everyone calls when they need - a module. -*/ +/** + * request_module - try to load a kernel module + * @module_name: Name of module + * + * Load a module using the user mode module loader. The function returns + * zero on success or a negative errno code on failure. Note that a + * successful module load does not mean the module did not then unload + * and exit on an error of its own. Callers must check that the service + * they requested is now available not blindly invoke it. + * + * If module auto-loading support is disabled then this function + * becomes a no-operation. + */ + int request_module(const char * module_name) { int pid; int waitpid_result; sigset_t tmpsig; + int i; + static atomic_t kmod_concurrent = ATOMIC_INIT(0); +#define MAX_KMOD_CONCURRENT 50 /* Completely arbitrary value - KAO */ + static int kmod_loop_msg; /* Don't allow request_module() before the root fs is mounted! */ if ( ! current->fs->root ) { @@ -108,9 +135,31 @@ return -EPERM; } + /* If modprobe needs a service that is in a module, we get a recursive + * loop. Limit the number of running kmod threads to NR_TASKS/2 or + * MAX_KMOD_CONCURRENT, whichever is the smaller. A cleaner method + * would be to run the parents of this process, counting how many times + * kmod was invoked. That would mean accessing the internals of the + * process tables to get the command line, proc_pid_cmdline is static + * and it is not worth changing the proc code just to handle this case. + * KAO. + */ + i = NR_TASKS/2; + if (i > MAX_KMOD_CONCURRENT) + i = MAX_KMOD_CONCURRENT; + atomic_inc(&kmod_concurrent); + if (atomic_read(&kmod_concurrent) > i) { + if (kmod_loop_msg++ < 5) + printk(KERN_ERR + "kmod: runaway modprobe loop assumed and stopped\n"); + atomic_dec(&kmod_concurrent); + return -ENOMEM; + } + pid = kernel_thread(exec_modprobe, (void*) module_name, 0); if (pid < 0) { printk(KERN_ERR "request_module[%s]: fork failed, errno %d\n", module_name, -pid); + atomic_dec(&kmod_concurrent); return pid; } @@ -122,6 +171,7 @@ spin_unlock_irq(¤t->sigmask_lock); waitpid_result = waitpid(pid, NULL, __WCLONE); + atomic_dec(&kmod_concurrent); /* Allow signals again.. */ spin_lock_irq(¤t->sigmask_lock); @@ -130,8 +180,8 @@ spin_unlock_irq(¤t->sigmask_lock); if (waitpid_result != pid) { - printk (KERN_ERR "kmod: waitpid(%d,NULL,0) failed, returning %d.\n", - pid, waitpid_result); + printk(KERN_ERR "request_module[%s]: waitpid(%d,...) failed, errno %d\n", + module_name, pid, -waitpid_result); } return 0; } diff -urN v2.2.15/linux/kernel/ksyms.c linux/kernel/ksyms.c --- v2.2.15/linux/kernel/ksyms.c Wed May 3 17:16:53 2000 +++ linux/kernel/ksyms.c Wed Jun 7 14:26:44 2000 @@ -405,9 +405,7 @@ EXPORT_SYMBOL(add_mouse_randomness); EXPORT_SYMBOL(fasync_helper); -#ifdef CONFIG_BLK_DEV_MD -EXPORT_SYMBOL(disk_name); /* for md.c */ -#endif +EXPORT_SYMBOL(disk_name); /* for md.c and others */ /* binfmt_aout */ EXPORT_SYMBOL(get_write_access); diff -urN v2.2.15/linux/kernel/sched.c linux/kernel/sched.c --- v2.2.15/linux/kernel/sched.c Tue Jan 4 10:12:25 2000 +++ linux/kernel/sched.c Wed Jun 7 14:26:44 2000 @@ -498,17 +498,19 @@ (struct timer_vec *)&tv1, &tv2, &tv3, &tv4, &tv5 }; +static struct timer_list ** run_timer_list_running; + #define NOOF_TVECS (sizeof(tvecs) / sizeof(tvecs[0])) static unsigned long timer_jiffies = 0; static inline void insert_timer(struct timer_list *timer, - struct timer_list **vec, int idx) + struct timer_list **vec) { - if ((timer->next = vec[idx])) - vec[idx]->prev = timer; - vec[idx] = timer; - timer->prev = (struct timer_list *)&vec[idx]; + if ((timer->next = *vec)) + (*vec)->prev = timer; + *vec = timer; + timer->prev = (struct timer_list *)vec; } static inline void internal_add_timer(struct timer_list *timer) @@ -518,31 +520,36 @@ */ unsigned long expires = timer->expires; unsigned long idx = expires - timer_jiffies; + struct timer_list ** vec; - if (idx < TVR_SIZE) { + if (run_timer_list_running) + vec = run_timer_list_running; + else if (idx < TVR_SIZE) { int i = expires & TVR_MASK; - insert_timer(timer, tv1.vec, i); + vec = tv1.vec + i; } else if (idx < 1 << (TVR_BITS + TVN_BITS)) { int i = (expires >> TVR_BITS) & TVN_MASK; - insert_timer(timer, tv2.vec, i); + vec = tv2.vec + i; } else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) { int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK; - insert_timer(timer, tv3.vec, i); + vec = tv3.vec + i; } else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) { int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK; - insert_timer(timer, tv4.vec, i); + vec = tv4.vec + i; } else if ((signed long) idx < 0) { /* can happen if you add a timer with expires == jiffies, * or you set a timer to go off in the past */ - insert_timer(timer, tv1.vec, tv1.index); + vec = tv1.vec + tv1.index; } else if (idx <= 0xffffffffUL) { int i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK; - insert_timer(timer, tv5.vec, i); + vec = tv5.vec + i; } else { /* Can only get here on architectures with 64-bit jiffies */ timer->next = timer->prev = timer; + return; } + insert_timer(timer, vec); } spinlock_t timerlist_lock = SPIN_LOCK_UNLOCKED; @@ -1128,13 +1135,14 @@ { spin_lock_irq(&timerlist_lock); while ((long)(jiffies - timer_jiffies) >= 0) { - struct timer_list *timer; + struct timer_list *timer, * queued = NULL; if (!tv1.index) { int n = 1; do { cascade_timers(tvecs[n]); } while (tvecs[n]->index == 1 && ++n < NOOF_TVECS); } + run_timer_list_running = &queued; while ((timer = tv1.vec[tv1.index])) { void (*fn)(unsigned long) = timer->function; unsigned long data = timer->data; @@ -1144,8 +1152,15 @@ fn(data); spin_lock_irq(&timerlist_lock); } + run_timer_list_running = NULL; ++timer_jiffies; tv1.index = (tv1.index + 1) & TVR_MASK; + while (queued) + { + timer = queued; + queued = queued->next; + internal_add_timer(timer); + } } spin_unlock_irq(&timerlist_lock); } diff -urN v2.2.15/linux/kernel/sysctl.c linux/kernel/sysctl.c --- v2.2.15/linux/kernel/sysctl.c Wed May 3 17:16:53 2000 +++ linux/kernel/sysctl.c Wed Jun 7 14:26:44 2000 @@ -801,8 +801,11 @@ int proc_dointvec_bset(ctl_table *table, int write, struct file *filp, void *buffer, size_t *lenp) { + if (!capable(CAP_SYS_MODULE)) { + return -EPERM; + } return do_proc_dointvec(table,write,filp,buffer,lenp,1, - (current->pid == 1) ? OP_SET : OP_AND); + (current->pid == 1) ? OP_SET : OP_AND); } diff -urN v2.2.15/linux/mm/filemap.c linux/mm/filemap.c --- v2.2.15/linux/mm/filemap.c Wed May 3 17:16:53 2000 +++ linux/mm/filemap.c Wed Jun 7 14:26:44 2000 @@ -142,7 +142,8 @@ struct page * page; int count; - count = limit >> priority; + /* Make sure we scan all pages twice at priority 0. */ + count = (limit << 1) >> priority; page = mem_map + clock; do { diff -urN v2.2.15/linux/mm/mmap.c linux/mm/mmap.c --- v2.2.15/linux/mm/mmap.c Tue Jan 4 10:12:26 2000 +++ linux/mm/mmap.c Wed Jun 7 14:26:44 2000 @@ -197,6 +197,8 @@ if (mm->def_flags & VM_LOCKED) { unsigned long locked = mm->locked_vm << PAGE_SHIFT; locked += len; + if (locked < len) + return -EAGAIN; if ((current->rlim[RLIMIT_MEMLOCK].rlim_cur < RLIM_INFINITY) && (locked > current->rlim[RLIMIT_MEMLOCK].rlim_cur)) return -EAGAIN; @@ -289,6 +291,8 @@ goto free_vma; /* Check against address space limit. */ + if ((mm->total_vm << PAGE_SHIFT) + len < len) + goto free_vma; if ((current->rlim[RLIMIT_AS].rlim_cur < RLIM_INFINITY) && ((mm->total_vm << PAGE_SHIFT) + len > current->rlim[RLIMIT_AS].rlim_cur)) diff -urN v2.2.15/linux/mm/page_alloc.c linux/mm/page_alloc.c --- v2.2.15/linux/mm/page_alloc.c Wed May 3 17:16:53 2000 +++ linux/mm/page_alloc.c Wed Jun 7 14:26:44 2000 @@ -182,6 +182,8 @@ unsigned long __get_free_pages(int gfp_mask, unsigned long order) { unsigned long flags; + static unsigned long last_woke_kswapd = 0; + static atomic_t free_before_allocate = ATOMIC_INIT(0); if (order >= NR_MEM_LISTS) goto nopage; @@ -206,28 +208,41 @@ int freed; extern struct wait_queue * kswapd_wait; - if (nr_free_pages >= freepages.high) - { - /* share RO cachelines in fast path */ - if (current->trashing_mem) - current->trashing_mem = 0; + if (nr_free_pages > freepages.high) goto ok_to_allocate; + + /* Maybe wake up kswapd for background swapping. */ + if (time_before(last_woke_kswapd + HZ, jiffies)) { + last_woke_kswapd = jiffies; + wake_up_interruptible(&kswapd_wait); } - else - { - if (nr_free_pages < freepages.low) - wake_up_interruptible(&kswapd_wait); - if (nr_free_pages > freepages.min && !current->trashing_mem) + + /* Somebody needs to free pages so we free some of our own. */ + if (atomic_read(&free_before_allocate)) { + current->flags |= PF_MEMALLOC; + freed = try_to_free_pages(gfp_mask); + current->flags &= ~PF_MEMALLOC; + if (freed) goto ok_to_allocate; } - current->trashing_mem = 1; - current->flags |= PF_MEMALLOC; - freed = try_to_free_pages(gfp_mask); - current->flags &= ~PF_MEMALLOC; + /* Do we have to help kswapd or can we proceed? */ + if (nr_free_pages < (freepages.low + freepages.low) / 2) { + wake_up_interruptible(&kswapd_wait); + + /* Help kswapd a bit... */ + current->flags |= PF_MEMALLOC; + atomic_inc(&free_before_allocate); + freed = try_to_free_pages(gfp_mask); + atomic_dec(&free_before_allocate); + current->flags &= ~PF_MEMALLOC; + + if (nr_free_pages > freepages.min) + goto ok_to_allocate; - if (!freed && !(gfp_mask & (__GFP_MED | __GFP_HIGH))) - goto nopage; + if (!freed && !(gfp_mask & (__GFP_MED | __GFP_HIGH))) + goto nopage; + } } ok_to_allocate: spin_lock_irqsave(&page_alloc_lock, flags); diff -urN v2.2.15/linux/mm/page_io.c linux/mm/page_io.c --- v2.2.15/linux/mm/page_io.c Mon Dec 28 13:56:29 1998 +++ linux/mm/page_io.c Wed Jun 7 14:26:44 2000 @@ -86,9 +86,22 @@ if (PageSwapCache(page)) { /* Make sure we are the only process doing I/O with this swap page. */ - while (test_and_set_bit(offset,p->swap_lockmap)) { - run_task_queue(&tq_disk); - sleep_on(&lock_queue); + if (test_and_set_bit(offset, p->swap_lockmap)) + { + struct wait_queue __wait; + + __wait.task = current; + add_wait_queue(&lock_queue, &__wait); + for (;;) { + current->state = TASK_UNINTERRUPTIBLE; + mb(); + if (!test_and_set_bit(offset, p->swap_lockmap)) + break; + run_task_queue(&tq_disk); + schedule(); + } + current->state = TASK_RUNNING; + remove_wait_queue(&lock_queue, &__wait); } /* diff -urN v2.2.15/linux/mm/vmscan.c linux/mm/vmscan.c --- v2.2.15/linux/mm/vmscan.c Wed May 3 17:16:53 2000 +++ linux/mm/vmscan.c Wed Jun 7 14:26:44 2000 @@ -333,6 +333,7 @@ for (; counter >= 0; counter--) { max_cnt = 0; + assign = 0; pbest = NULL; select: read_lock(&tasklist_lock); @@ -377,10 +378,17 @@ * cluster them so that we get good swap-out behaviour. See * the "free_memory()" macro for details. */ +#define FLUSH_COUNT 8 static int do_try_to_free_pages(unsigned int gfp_mask) { - int priority; - int count = SWAP_CLUSTER_MAX; + int priority, count, swapcount; + int flushcount = FLUSH_COUNT; + int ret = 0; + + /* Kswapd does nothing but freeing pages so we can do big bites. */ + if (gfp_mask == GFP_KSWAPD) + flushcount = SWAP_CLUSTER_MAX; + count = flushcount; lock_kernel(); @@ -390,6 +398,7 @@ priority = 6; do { while (shrink_mmap(priority, gfp_mask)) { + ret = 1; if (!--count) goto done; } @@ -397,23 +406,36 @@ /* Try to get rid of some shared memory pages.. */ if (gfp_mask & __GFP_IO) { while (shm_swap(priority, gfp_mask)) { + ret = 1; if (!--count) goto done; } } /* Then, try to page stuff out.. */ + swapcount = flushcount; while (swap_out(priority, gfp_mask)) { - if (!--count) - goto done; + if (!--swapcount) + break; } shrink_dcache_memory(priority, gfp_mask); } while (--priority >= 0); + + /* End with a shrink_mmap() to make sure we free something. */ + while (shrink_mmap(0, gfp_mask)) { + ret = 1; + if (!--count) + goto done; + } done: unlock_kernel(); - return priority >= 0; + if (!ret) + printk("VM: do_try_to_free_pages failed for %s...\n", + current->comm); + /* Return success if we freed a page. */ + return ret; } /* @@ -485,10 +507,18 @@ * the processes needing more memory will wake us * up on a more timely basis. */ + int failed = 0; +sleep: interruptible_sleep_on(&kswapd_wait); + /* Enough free pages? -> call do_try_to_free_pages only once. */ + if (nr_free_pages > freepages.low) { + do_try_to_free_pages(GFP_KSWAPD); + goto sleep; + } + /* Not enough free pages? -> free pages agressively. */ while (nr_free_pages < freepages.high) { - if (do_try_to_free_pages(GFP_KSWAPD)) + if (do_try_to_free_pages(GFP_KSWAPD) && failed++ < 10) { if (tsk->need_resched) schedule(); diff -urN v2.2.15/linux/net/appletalk/aarp.c linux/net/appletalk/aarp.c --- v2.2.15/linux/net/appletalk/aarp.c Wed May 3 17:16:53 2000 +++ linux/net/appletalk/aarp.c Wed Jun 7 14:26:44 2000 @@ -486,6 +486,8 @@ void aarp_probe_network(struct atalk_iface *atif) { + struct device *dev = atif->dev; + if(atif->dev->type == ARPHRD_LOCALTLK || atif->dev->type == ARPHRD_PPP) aarp_send_probe_phase1(atif); else @@ -501,6 +503,13 @@ current->state = TASK_INTERRUPTIBLE; schedule_timeout(HZ/10); + /* + * our atif may no longer be valid, if the device + * was brought down while we waited! + */ + if (atalk_find_dev(dev) != atif) + return; + if (atif->status & ATIF_PROBE_FAIL) break; } @@ -512,6 +521,7 @@ struct aarp_entry *entry; unsigned int count; int hash; + struct device *dev = atif->dev; /* * we don't currently support LocalTalk or PPP for proxy AARP; @@ -550,6 +560,13 @@ */ current->state = TASK_INTERRUPTIBLE; schedule_timeout(HZ/10); + + /* + * our atif may no longer be valid, if the device was brought + * down while we waited! + */ + if (atalk_find_dev(dev) != atif) + return -ENODEV; if (entry->status & ATIF_PROBE_FAIL) break; diff -urN v2.2.15/linux/net/appletalk/ddp.c linux/net/appletalk/ddp.c --- v2.2.15/linux/net/appletalk/ddp.c Mon Aug 9 12:04:41 1999 +++ linux/net/appletalk/ddp.c Wed Jun 7 14:26:44 2000 @@ -337,6 +337,7 @@ int probe_net=ntohs(atif->address.s_net); int probe_node=atif->address.s_node; int netct, nodect; + struct device *dev = atif->dev; /* * Offset the network we start probing with. @@ -373,6 +374,13 @@ * Probe a proposed address. */ aarp_probe_network(atif); + + /* + * The atif might have been deleted while + * in aarp_probe_network! + */ + if (atalk_find_dev(dev) != atif) + return -ENODEV; if(!(atif->status & ATIF_PROBE_FAIL)) { atif->status &= ~ATIF_PROBE; @@ -399,6 +407,7 @@ int probe_net=ntohs(atif->address.s_net); // we probe the interface's network int probe_node=ATADDR_ANYNODE; // we'll take anything int netct, nodect; + struct device *dev = atif->dev; /* * Offset the network we start probing with. @@ -435,6 +444,13 @@ * Tell AARP to probe a proposed address. */ int probe_result = aarp_proxy_probe_network(atif, proxy_addr); + + /* + * The atif might have been deleted while + * in aarp_proxy_probe_network! + */ + if (atalk_find_dev(dev) != atif) + return -ENODEV; if (probe_result == 0) return 0; diff -urN v2.2.15/linux/net/core/dev.c linux/net/core/dev.c --- v2.2.15/linux/net/core/dev.c Wed May 3 17:16:53 2000 +++ linux/net/core/dev.c Wed Jun 7 14:26:44 2000 @@ -81,7 +81,6 @@ #include #include #include -#include #include #include #include @@ -96,6 +95,10 @@ #ifdef CONFIG_PLIP extern int plip_init(void); #endif +extern void n2_init(void); +extern void c101_init(void); +extern int wanxl_init(void); +extern void sync_ppp_init(void); NET_PROFILE_DEFINE(dev_queue_xmit) NET_PROFILE_DEFINE(net_bh) @@ -1963,18 +1966,6 @@ #if defined(CONFIG_COMX) comx_init(); #endif - /* - * SLHC if present needs attaching so other people see it - * even if not opened. - */ - -#ifdef CONFIG_INET -#if (defined(CONFIG_SLIP) && defined(CONFIG_SLIP_COMPRESSED)) \ - || defined(CONFIG_PPP) \ - || (defined(CONFIG_ISDN) && defined(CONFIG_ISDN_PPP)) - slhc_install(); -#endif -#endif #ifdef CONFIG_NET_PROFILE net_profile_init(); @@ -2038,6 +2029,19 @@ * Register any statically linked ethernet devices with the bridge */ br_spacedevice_register(); +#endif + +#ifdef CONFIG_N2 + n2_init(); +#endif +#ifdef CONFIG_C101 + c101_init(); +#endif +#ifdef CONFIG_WANXL + wanxl_init(); +#endif +#ifdef CONFIG_HDLC + sync_ppp_init(); #endif #ifdef CONFIG_IP_PNP diff -urN v2.2.15/linux/net/ipv4/Config.in linux/net/ipv4/Config.in --- v2.2.15/linux/net/ipv4/Config.in Tue Oct 26 17:53:42 1999 +++ linux/net/ipv4/Config.in Wed Jun 7 14:26:44 2000 @@ -17,6 +17,7 @@ fi bool 'IP: kernel level autoconfiguration' CONFIG_IP_PNP if [ "$CONFIG_IP_PNP" = "y" ]; then + bool ' DHCP support' CONFIG_IP_PNP_DHCP bool ' BOOTP support' CONFIG_IP_PNP_BOOTP bool ' RARP support' CONFIG_IP_PNP_RARP # not yet ready.. diff -urN v2.2.15/linux/net/ipv4/arp.c linux/net/ipv4/arp.c --- v2.2.15/linux/net/ipv4/arp.c Wed May 3 17:16:53 2000 +++ linux/net/ipv4/arp.c Wed Jun 7 14:26:44 2000 @@ -1,6 +1,6 @@ /* linux/net/inet/arp.c * - * Version: $Id: arp.c,v 1.77.2.5 1999/12/14 10:32:39 davem Exp $ + * Version: $Id: arp.c,v 1.77.2.6 2000/05/27 04:46:43 davem Exp $ * * Copyright (C) 1994 by Florian La Roche * @@ -65,6 +65,7 @@ * clean up the APFDDI & gen. FDDI bits. * Alexey Kuznetsov: new arp state machine; * now it is in net/core/neighbour.c. + * Krzysztof Halasa: Added Frame Relay ARP support. * Julian Anastasov: "hidden" flag: hide the * interface and don't reply for it */ @@ -618,7 +619,7 @@ #endif } - /* Undertsand only these message types */ + /* Understand only these message types */ if (arp->ar_op != __constant_htons(ARPOP_REPLY) && arp->ar_op != __constant_htons(ARPOP_REQUEST)) @@ -634,12 +635,19 @@ tha=arp_ptr; arp_ptr += dev->addr_len; memcpy(&tip, arp_ptr, 4); + /* * Check for bad requests for 127.x.x.x and requests for multicast * addresses. If this is one such, delete it. */ if (LOOPBACK(tip) || MULTICAST(tip)) goto out; + +/* + * Special case: We must set Frame Relay source Q.922 address + */ + if (dev_type == ARPHRD_DLCI) + sha = dev->broadcast; /* * Process entry. The idea here is we want to send a reply if it is a diff -urN v2.2.15/linux/net/ipv4/icmp.c linux/net/ipv4/icmp.c --- v2.2.15/linux/net/ipv4/icmp.c Tue Jan 4 10:12:26 2000 +++ linux/net/ipv4/icmp.c Wed Jun 7 14:26:44 2000 @@ -3,7 +3,7 @@ * * Alan Cox, * - * Version: $Id: icmp.c,v 1.52.2.4 1999/11/16 02:28:40 davem Exp $ + * Version: $Id: icmp.c,v 1.52.2.5 2000/04/08 02:45:56 davem Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -494,9 +494,12 @@ daddr = icmp_param->replyopts.faddr; if (ip_route_output(&rt, daddr, rt->rt_spec_dst, RT_TOS(skb->nh.iph->tos), 0)) return; - ip_build_xmit(sk, icmp_glue_bits, icmp_param, - icmp_param->data_len+sizeof(struct icmphdr), - &ipc, rt, MSG_DONTWAIT); + if (icmpv4_xrlim_allow(rt, icmp_param->icmph.type, + icmp_param->icmph.code)) { + ip_build_xmit(sk, icmp_glue_bits, icmp_param, + icmp_param->data_len+sizeof(struct icmphdr), + &ipc, rt, MSG_DONTWAIT); + } ip_rt_put(rt); } diff -urN v2.2.15/linux/net/ipv4/ip_masq_mod.c linux/net/ipv4/ip_masq_mod.c --- v2.2.15/linux/net/ipv4/ip_masq_mod.c Mon Aug 9 12:04:41 1999 +++ linux/net/ipv4/ip_masq_mod.c Wed Jun 7 14:26:44 2000 @@ -23,6 +23,8 @@ #include #include +#include + #include #ifdef CONFIG_KMOD #include @@ -87,28 +89,28 @@ { struct ip_masq_mod **mmod_p; - write_lock_bh(&masq_mod_lock); + spin_lock_irq(&masq_mod_lock); for (mmod_p = &ip_masq_mod_lkp_base; *mmod_p ; mmod_p = &(*mmod_p)->next) if (mmod == (*mmod_p)) { *mmod_p = mmod->next; mmod->next = NULL; - write_unlock_bh(&masq_mod_lock); + spin_unlock_irq(&masq_mod_lock); return 0; } - write_unlock_bh(&masq_mod_lock); + spin_unlock_irq(&masq_mod_lock); return -EINVAL; } int ip_masq_mod_lkp_link(struct ip_masq_mod *mmod) { - write_lock_bh(&masq_mod_lock); + spin_lock_irq(&masq_mod_lock); mmod->next = ip_masq_mod_lkp_base; ip_masq_mod_lkp_base=mmod; - write_unlock_bh(&masq_mod_lock); + spin_unlock_irq(&masq_mod_lock); return 0; } diff -urN v2.2.15/linux/net/ipv4/ipconfig.c linux/net/ipv4/ipconfig.c --- v2.2.15/linux/net/ipv4/ipconfig.c Mon Aug 9 12:04:41 1999 +++ linux/net/ipv4/ipconfig.c Wed Jun 7 14:26:44 2000 @@ -1,10 +1,10 @@ /* * $Id: ipconfig.c,v 1.20.2.1 1999/06/28 11:33:27 davem Exp $ * - * Automatic Configuration of IP -- use BOOTP or RARP or user-supplied - * information to configure own IP address and routes. + * Automatic Configuration of IP -- use DHCP, BOOTP, RARP, or + * user-supplied information to configure own IP address and routes. * - * Copyright (C) 1996--1998 Martin Mares + * Copyright (C) 1996-1998 Martin Mares * * Derived from network configuration code in fs/nfs/nfsroot.c, * originally Copyright (C) 1995, 1996 Gero Kuhlmann and me. @@ -12,6 +12,10 @@ * BOOTP rewritten to construct and analyse packets itself instead * of misusing the IP layer. num_bugs_causing_wrong_arp_replies--; * -- MJ, December 1998 + * + * DHCP support added. To users this looks like a whole separate + * protocol, but we know it's just a bag on the side of BOOTP. + * -- Chip Salzenberg , May 2000 */ #include @@ -20,8 +24,9 @@ #include #include #include -#include #include +#include +#include #include #include #include @@ -49,48 +54,88 @@ #define DBG(x) do { } while(0) #endif -/* Define the timeout for waiting for a RARP/BOOTP reply */ -#define CONF_BASE_TIMEOUT (HZ*5) /* Initial timeout: 5 seconds */ -#define CONF_RETRIES 10 /* 10 retries */ +#define SELF "IP-Config: " + +#if defined(CONFIG_IP_PNP_DHCP) +#define IPCONFIG_DHCP +#endif +#if defined(CONFIG_IP_PNP_BOOTP) || defined(CONFIG_IP_PNP_DHCP) +#define IPCONFIG_BOOTP +#endif +#if defined(CONFIG_IP_PNP_RARP) +#define IPCONFIG_RARP +#endif +#if defined(IPCONFIG_BOOTP) || defined(IPCONFIG_RARP) +#define IPCONFIG_DYNAMIC +#endif + +/* Define the friendly delay before and after opening net devices */ +#define CONF_PRE_OPEN (HZ/2) /* Before opening: 1/2 second */ +#define CONF_POST_OPEN (1*HZ) /* After opening: 1 second */ + +/* Define the timeout for waiting for a DHCP/BOOTP/RARP reply */ +#define CONF_OPEN_RETRIES 3 /* (Re)open devices three times */ +#define CONF_SEND_RETRIES 3 /* Send requests three times */ +#define CONF_BASE_TIMEOUT (HZ*2) /* Initial timeout: 2 seconds */ #define CONF_TIMEOUT_RANDOM (HZ) /* Maximum amount of randomization */ -#define CONF_TIMEOUT_MULT *5/4 /* Rate of timeout growth */ +#define CONF_TIMEOUT_MULT *7/4 /* Rate of timeout growth */ #define CONF_TIMEOUT_MAX (HZ*30) /* Maximum allowed timeout */ -/* IP configuration */ -static char user_dev_name[IFNAMSIZ] __initdata = { 0, };/* Name of user-selected boot device */ -u32 ic_myaddr __initdata = INADDR_NONE; /* My IP address */ -u32 ic_servaddr __initdata = INADDR_NONE; /* Server IP address */ -u32 ic_gateway __initdata = INADDR_NONE; /* Gateway IP address */ -u32 ic_netmask __initdata = INADDR_NONE; /* Netmask for local subnet */ -int ic_enable __initdata = 1; /* Automatic IP configuration enabled */ -int ic_host_name_set __initdata = 0; /* Host name configured manually */ -int ic_set_manually __initdata = 0; /* IPconfig parameters set manually */ - -u32 root_server_addr __initdata = INADDR_NONE; /* Address of boot server */ -u8 root_server_path[256] __initdata = { 0, }; /* Path to mount as root */ -#if defined(CONFIG_IP_PNP_BOOTP) || defined(CONFIG_IP_PNP_RARP) +/* + * Public IP configuration + */ -#define CONFIG_IP_PNP_DYNAMIC +int ic_enable __initdata = 1; /* Automatic IP cfg enabled? */ -static int ic_proto_enabled __initdata = 0 /* Protocols enabled */ -#ifdef CONFIG_IP_PNP_BOOTP +/* Protocol choice */ +static int ic_proto_enabled __initdata = 0 +#ifdef IPCONFIG_BOOTP | IC_BOOTP #endif -#ifdef CONFIG_IP_PNP_RARP +#ifdef CONFIG_IP_PNP_DHCP + | IC_USE_DHCP +#endif +#ifdef IPCONFIG_RARP | IC_RARP #endif ; -static int ic_got_reply __initdata = 0; /* Protocol(s) we got reply from */ -#else +int ic_host_name_set __initdata = 0; /* Host name set by us? */ + +u32 ic_myaddr __initdata = INADDR_NONE; /* My IP address */ +u32 ic_netmask __initdata = INADDR_NONE; /* Netmask for local subnet */ +u32 ic_gateway __initdata = INADDR_NONE; /* Gateway IP address */ -static int ic_proto_enabled __initdata = 0; +u32 ic_servaddr __initdata = INADDR_NONE; /* Boot server IP address */ -#endif +u32 root_server_addr __initdata = INADDR_NONE; /* Address of NFS server */ +u8 root_server_path[256] __initdata = { 0, }; /* Path to mount as root */ + +/* Persistent data: */ + +int ic_proto_used = 0; /* Protocol used, if any */ +u32 ic_nameserver = INADDR_NONE; /* DNS Server IP address */ +u8 ic_domain[64] = { 0, }; /* DNS (not NIS) domain name */ +/* + * Private state. + */ + +/* Name of user-selected boot device */ +static char user_dev_name[IFNAMSIZ] __initdata = { 0, }; + +/* Protocols supported by available interfaces */ static int ic_proto_have_if __initdata = 0; +#ifdef IPCONFIG_DYNAMIC +static volatile int ic_got_reply = 0; /* Protocol(s) we got reply from */ +#endif +#ifdef IPCONFIG_DHCP +static int ic_dhcp_msgtype __initdata = 0; /* Last incoming msg type */ +#endif + + /* * Network devices */ @@ -121,7 +166,7 @@ if (dev->mtu >= 364) able |= IC_BOOTP; else - printk(KERN_WARNING "BOOTP: Ignoring device %s, MTU %d too small", dev->name, dev->mtu); + printk(KERN_WARNING "DHCP/BOOTP: Ignoring device %s, MTU %d too small", dev->name, dev->mtu); if (!(dev->flags & IFF_NOARP)) able |= IC_RARP; able &= ic_proto_enabled; @@ -129,7 +174,8 @@ continue; oflags = dev->flags; if (dev_change_flags(dev, oflags | IFF_UP) < 0) { - printk(KERN_ERR "IP-Config: Failed to open %s\n", dev->name); + printk(KERN_ERR SELF + "Can't open %s\n", dev->name); continue; } if (!(d = kmalloc(sizeof(struct ic_device), GFP_KERNEL))) @@ -140,15 +186,17 @@ d->flags = oflags; d->able = able; ic_proto_have_if |= able; - DBG(("IP-Config: Opened %s (able=%d)\n", dev->name, able)); + DBG((SELF "%s UP (able=%d)\n", dev->name, able)); } *last = NULL; if (!ic_first_dev) { if (user_dev_name[0]) - printk(KERN_ERR "IP-Config: Device `%s' not found.\n", user_dev_name); + printk(KERN_ERR SELF + "No such device: %s\n", user_dev_name); else - printk(KERN_ERR "IP-Config: No network devices available.\n"); + printk(KERN_ERR SELF + "No network devices available\n"); return -1; } return 0; @@ -164,8 +212,8 @@ next = d->next; dev = d->dev; if (dev != ic_dev) { - DBG(("IP-Config: Downing %s\n", dev->name)); dev_change_flags(dev, d->flags); + DBG((SELF "%s DOWN\n", dev->name)); } kfree_s(d, sizeof(struct ic_device)); } @@ -219,17 +267,20 @@ strcpy(ir.ifr_ifrn.ifrn_name, ic_dev->name); set_sockaddr(sin, ic_myaddr, 0); if ((err = ic_dev_ioctl(SIOCSIFADDR, &ir)) < 0) { - printk(KERN_ERR "IP-Config: Unable to set interface address (%d).\n", err); + printk(KERN_ERR SELF + "Can't set interface address: Error %d\n", err); return -1; } set_sockaddr(sin, ic_netmask, 0); if ((err = ic_dev_ioctl(SIOCSIFNETMASK, &ir)) < 0) { - printk(KERN_ERR "IP-Config: Unable to set interface netmask (%d).\n", err); + printk(KERN_ERR SELF + "Can't set netmask: Error %d\n", err); return -1; } set_sockaddr(sin, ic_myaddr | ~ic_netmask, 0); if ((err = ic_dev_ioctl(SIOCSIFBRDADDR, &ir)) < 0) { - printk(KERN_ERR "IP-Config: Unable to set interface broadcast address (%d).\n", err); + printk(KERN_ERR SELF + "Can't set broadcast address: Error %d\n", err); return -1; } return 0; @@ -245,7 +296,8 @@ memset(&rm, 0, sizeof(rm)); if ((ic_gateway ^ ic_myaddr) & ic_netmask) { - printk(KERN_ERR "IP-Config: Gateway not on directly connected network.\n"); + printk(KERN_ERR SELF + "Gateway not on directly connected network\n"); return -1; } set_sockaddr((struct sockaddr_in *) &rm.rt_dst, 0, 0); @@ -253,7 +305,8 @@ set_sockaddr((struct sockaddr_in *) &rm.rt_gateway, ic_gateway, 0); rm.rt_flags = RTF_UP | RTF_GATEWAY; if ((err = ic_route_ioctl(SIOCADDRT, &rm)) < 0) { - printk(KERN_ERR "IP-Config: Cannot add default route (%d).\n", err); + printk(KERN_ERR SELF + "Can't add default route: Error %d\n", err); return -1; } } @@ -286,10 +339,12 @@ else if (IN_CLASSC(ntohl(ic_myaddr))) ic_netmask = htonl(IN_CLASSC_NET); else { - printk(KERN_ERR "IP-Config: Unable to guess netmask for address %08x\n", ic_myaddr); + printk(KERN_ERR SELF + "Can't guess netmask for %s\n", + in_ntoa(ic_myaddr)); return -1; } - printk("IP-Config: Guessing netmask %s\n", in_ntoa(ic_netmask)); + printk(SELF "Guessing netmask: %s\n", in_ntoa(ic_netmask)); } return 0; @@ -299,7 +354,7 @@ * RARP support. */ -#ifdef CONFIG_IP_PNP_RARP +#ifdef IPCONFIG_RARP static int ic_rarp_recv(struct sk_buff *skb, struct device *dev, struct packet_type *pt); @@ -366,16 +421,14 @@ goto drop; /* Victory! The packet is what we were looking for! */ - if (!ic_got_reply) { - ic_got_reply = IC_RARP; - ic_dev = dev; - if (ic_myaddr == INADDR_NONE) - ic_myaddr = tip; - ic_servaddr = sip; - } + ic_dev = dev; + if (ic_myaddr == INADDR_NONE) + ic_myaddr = tip; + ic_servaddr = sip; + ic_got_reply = IC_RARP; - /* And throw the packet out... */ drop: + /* and throw the packet out */ kfree_skb(skb); return 0; } @@ -399,10 +452,10 @@ #endif /* - * BOOTP support. + * DHCP/BOOTP support. */ -#ifdef CONFIG_IP_PNP_BOOTP +#ifdef IPCONFIG_BOOTP struct bootp_pkt { /* BOOTP packet format */ struct iphdr iph; /* IP header */ @@ -416,20 +469,32 @@ u16 flags; /* Just what it says */ u32 client_ip; /* Client's IP address if known */ u32 your_ip; /* Assigned IP address */ - u32 server_ip; /* Server's IP address */ + u32 server_ip; /* (Next, e.g. NFS) Server's IP address */ u32 relay_ip; /* IP address of BOOTP relay */ u8 hw_addr[16]; /* Client's HW address */ - u8 serv_name[64]; /* Server host name */ - u8 boot_file[128]; /* Name of boot file */ - u8 vendor_area[128]; /* Area for extensions */ + char server_name[64]; /* Server host name */ + char boot_file[128]; /* Name of boot file */ + u8 exten[312]; /* DHCP options / BOOTP vendor extensions */ }; -#define BOOTP_REQUEST 1 -#define BOOTP_REPLY 2 +/* packet ops */ +#define BOOTP_REQUEST 1 +#define BOOTP_REPLY 2 + +/* DHCP message types */ +#define DHCPDISCOVER 1 +#define DHCPOFFER 2 +#define DHCPREQUEST 3 +#define DHCPDECLINE 4 +#define DHCPACK 5 +#define DHCPNAK 6 +#define DHCPRELEASE 7 +#define DHCPINFORM 8 static u32 ic_bootp_xid; -static int ic_bootp_recv(struct sk_buff *skb, struct device *dev, struct packet_type *pt); +static int ic_bootp_recv(struct sk_buff *skb, struct device *dev, + struct packet_type *pt); static struct packet_type bootp_packet_type __initdata = { __constant_htons(ETH_P_IP), @@ -441,20 +506,76 @@ /* - * Initialize BOOTP extension fields in the request. + * Initialize DHCP/BOOTP extension fields in the request. */ -static void __init ic_bootp_init_ext(u8 *e) + +static const u8 ic_bootp_cookie[4] = { 99, 130, 83, 99 }; + +#ifdef IPCONFIG_DHCP + +static void __init +ic_dhcp_init_options(u8 *options) { - *e++ = 99; /* RFC1048 Magic Cookie */ - *e++ = 130; - *e++ = 83; - *e++ = 99; + u8 msgtype = ((ic_dhcp_msgtype == DHCPOFFER) + ? DHCPREQUEST : DHCPDISCOVER); + u8 *e = options; + +#ifdef IPCONFIG_DEBUG + printk("DHCP: Sending message type %d\n", msgtype); +#endif + + memcpy(e, ic_bootp_cookie, 4); /* RFC1048 Magic Cookie */ + e += 4; + + *e++ = 53; /* DHCP message type */ + *e++ = 1; + *e++ = msgtype; + + if (msgtype == DHCPREQUEST) { + *e++ = 50; /* Requested IP address */ + *e++ = 4; + memcpy(e, &ic_myaddr, 4); + e += 4; + } + + /* always? */ + { + static const u8 ic_req_params[] = { + 1, /* Subnet mask */ + 3, /* Default gateway */ + 6, /* DNS server */ + 12, /* Host name */ + 15, /* Domain name */ + 17, /* Boot path */ + 40, /* NIS domain name */ + }; + + *e++ = 55; /* Parameter request list */ + *e++ = sizeof(ic_req_params); + memcpy(e, ic_req_params, sizeof(ic_req_params)); + e += sizeof(ic_req_params); + } + + *e++ = 255; /* End of the list */ +} + +#endif /* IPCONFIG_DHCP */ + +static void __init +ic_bootp_init_ext(u8 *ext) +{ + u8 *e = ext; + memcpy(e, ic_bootp_cookie, 4); /* RFC1048 Magic Cookie */ + e += 4; *e++ = 1; /* Subnet mask request */ *e++ = 4; e += 4; *e++ = 3; /* Default gateway request */ *e++ = 4; e += 4; + *e++ = 5; /* Name server reqeust */ + *e++ = 8; + e += 8; *e++ = 12; /* Host name request */ *e++ = 32; e += 32; @@ -462,36 +583,39 @@ *e++ = 32; e += 32; *e++ = 17; /* Boot path */ - *e++ = 32; - e += 32; - *e = 255; /* End of the list */ + *e++ = 40; + e += 40; + *e++ = 255; /* End of the list */ } /* - * Initialize the BOOTP mechanism. + * Initialize the DHCP/BOOTP mechanism. */ -static inline void ic_bootp_init(void) +static inline void +ic_bootp_init(void) { get_random_bytes(&ic_bootp_xid, sizeof(u32)); - DBG(("BOOTP: XID=%08x\n", ic_bootp_xid)); + DBG(("DHCP/BOOTP: XID=%08x\n", ic_bootp_xid)); dev_add_pack(&bootp_packet_type); } /* - * BOOTP cleanup. + * DHCP/BOOTP cleanup. */ -static inline void ic_bootp_cleanup(void) +static inline void +ic_bootp_cleanup(void) { dev_remove_pack(&bootp_packet_type); } /* - * Send BOOTP request to single interface. + * Send DHCP/BOOTP request to single interface. */ -static void __init ic_bootp_send_if(struct ic_device *d, u32 jiffies) +static void __init +ic_bootp_send_if(struct ic_device *d, u32 jiffies) { struct device *dev = d->dev; struct sk_buff *skb; @@ -524,14 +648,23 @@ b->udph.len = htons(sizeof(struct bootp_pkt) - sizeof(struct iphdr)); /* UDP checksum not calculated -- explicitly allowed in BOOTP RFC */ - /* Construct BOOTP header */ + /* Construct DHCP/BOOTP header */ b->op = BOOTP_REQUEST; b->htype = dev->type; b->hlen = dev->addr_len; + b->your_ip = INADDR_NONE; + b->server_ip = INADDR_NONE; memcpy(b->hw_addr, dev->dev_addr, dev->addr_len); b->secs = htons(jiffies / HZ); b->xid = ic_bootp_xid; - ic_bootp_init_ext(b->vendor_area); + + /* add DHCP options or BOOTP extensions */ +#ifdef IPCONFIG_DHCP + if (ic_proto_enabled & IC_USE_DHCP) + ic_dhcp_init_options(b->exten); + else +#endif + ic_bootp_init_ext(b->exten); /* Chain packet down the line... */ skb->dev = dev; @@ -544,15 +677,16 @@ /* - * Send BOOTP requests to all interfaces. + * Send DHCP/BOOTP requests to all interfaces. */ static void __init ic_bootp_send(u32 jiffies) { struct ic_device *d; - for(d=ic_first_dev; d; d=d->next) + for(d = ic_first_dev; d; d=d->next) { if (d->able & IC_BOOTP) ic_bootp_send_if(d, jiffies); + } } @@ -565,21 +699,20 @@ return 0; if (len > max-1) len = max-1; - strncpy(dest, src, len); + memcpy(dest, src, len); dest[len] = '\0'; return 1; } - /* - * Process BOOTP extension. + * Process BOOTP extensions. */ static void __init ic_do_bootp_ext(u8 *ext) { #ifdef IPCONFIG_DEBUG u8 *c; - printk("BOOTP: Got extension %02x",*ext); + printk("DHCP/BOOTP: Got extension %d:",*ext); for(c=ext+2; cfrag_off & htons(IP_OFFSET|IP_MF)) { - printk(KERN_ERR "BOOTP: Ignoring fragmented reply.\n"); + printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented reply.\n"); goto drop; } @@ -650,35 +790,86 @@ goto drop; } - /* Extract basic fields */ - ic_myaddr = b->your_ip; - ic_servaddr = b->server_ip; - ic_got_reply = IC_BOOTP; - ic_dev = dev; - /* Parse extensions */ - if (b->vendor_area[0] == 99 && /* Check magic cookie */ - b->vendor_area[1] == 130 && - b->vendor_area[2] == 83 && - b->vendor_area[3] == 99) { - u8 *ext = &b->vendor_area[4]; + if (!memcmp(b->exten, ic_bootp_cookie, 4)) { u8 *end = (u8 *) b + ntohs(b->iph.tot_len); + u8 *ext; + +#ifdef IPCONFIG_DHCP + + u32 server_id = INADDR_NONE; + ic_dhcp_msgtype = 0; + + ext = &b->exten[4]; while (ext < end && *ext != 0xff) { - if (*ext == 0) /* Padding */ - ext++; - else { - u8 *opt = ext; - ext += ext[1] + 2; - if (ext <= end) - ic_do_bootp_ext(opt); + u8 *opt = ext++; + if (*opt == 0) /* Padding */ + continue; + ext += *ext + 1; + if (ext >= end) + break; + switch (*opt) { + case 53: /* Message type */ + if (opt[1]) + ic_dhcp_msgtype = opt[2]; + break; + case 54: /* Server ID (IP address) */ + if (opt[1] >= 4) + memcpy(&server_id, opt + 2, 4); + break; } } + +#ifdef IPCONFIG_DEBUG + printk("DHCP: Got message type %d\n", ic_dhcp_msgtype); +#endif + + switch (ic_dhcp_msgtype) { + case DHCPOFFER: + /* Let's accept that offer. */ + ic_myaddr = b->your_ip; + ic_servaddr = server_id; +#ifdef IPCONFIG_DEBUG + printk("DHCP: Offered address %s", in_ntoa(ic_myaddr)); + printk(" by server %s\n", in_ntoa(ic_servaddr)); +#endif + goto drop; + + case DHCPACK: + /* Yeah! */ + break; + + default: + /* Urque. Forget it*/ + ic_myaddr = INADDR_NONE; + ic_servaddr = INADDR_NONE; + goto drop; + } + +#endif /* IPCONFIG_DHCP */ + + ext = &b->exten[4]; + while (ext < end && *ext != 0xff) { + u8 *opt = ext++; + if (*opt == 0) /* Padding */ + continue; + ext += *ext + 1; + if (ext < end) + ic_do_bootp_ext(opt); + } } + ic_dev = dev; + ic_myaddr = b->your_ip; + ic_servaddr = b->server_ip; if (ic_gateway == INADDR_NONE && b->relay_ip) ic_gateway = b->relay_ip; + if (ic_nameserver == INADDR_NONE) + ic_nameserver = ic_servaddr; + ic_got_reply = IC_BOOTP; drop: + /* and throw the packet out */ kfree_skb(skb); return 0; } @@ -688,36 +879,35 @@ /* - * Dynamic IP configuration -- BOOTP and RARP. + * Dynamic IP configuration -- DHCP, BOOTP, RARP. */ -#ifdef CONFIG_IP_PNP_DYNAMIC +#ifdef IPCONFIG_DYNAMIC static int __init ic_dynamic(void) { int retries; unsigned long timeout, jiff; unsigned long start_jiffies; - int do_rarp = ic_proto_have_if & IC_RARP; int do_bootp = ic_proto_have_if & IC_BOOTP; + int do_rarp = ic_proto_have_if & IC_RARP; /* - * If neither BOOTP nor RARP was selected, return with an error. This - * routine gets only called when some pieces of information are mis- - * sing, and without BOOTP and RARP we are not able to get that in- - * formation. + * If none of DHCP/BOOTP/RARP was selected, return with an error. + * This routine gets only called when some pieces of information + * are missing, and without BOOTP and RARP we are unable to get it. */ if (!ic_proto_enabled) { - printk(KERN_ERR "IP-Config: Incomplete network configuration information.\n"); + printk(KERN_ERR SELF + "Incomplete network configuration information\n"); return -1; } -#ifdef CONFIG_IP_PNP_BOOTP +#ifdef IPCONFIG_BOOTP if ((ic_proto_enabled ^ ic_proto_have_if) & IC_BOOTP) - printk(KERN_ERR "BOOTP: No suitable device found.\n"); + printk(KERN_ERR "DHCP/BOOTP: No suitable device found.\n"); #endif - -#ifdef CONFIG_IP_PNP_RARP +#ifdef IPCONFIG_RARP if ((ic_proto_enabled ^ ic_proto_have_if) & IC_RARP) printk(KERN_ERR "RARP: No suitable device found.\n"); #endif @@ -727,16 +917,16 @@ return -1; /* - * Setup RARP and BOOTP protocols + * Setup protocols */ -#ifdef CONFIG_IP_PNP_RARP - if (do_rarp) - ic_rarp_init(); -#endif -#ifdef CONFIG_IP_PNP_BOOTP +#ifdef IPCONFIG_BOOTP if (do_bootp) ic_bootp_init(); #endif +#ifdef IPCONFIG_RARP + if (do_rarp) + ic_rarp_init(); +#endif /* * Send requests and wait, until we get an answer. This loop @@ -746,61 +936,109 @@ * [Actually we could now, but the nothing else running note still * applies.. - AC] */ - printk(KERN_NOTICE "Sending %s%s%s requests...", - do_bootp ? "BOOTP" : "", - do_bootp && do_rarp ? " and " : "", - do_rarp ? "RARP" : ""); + printk(KERN_NOTICE "Sending %s%s%s requests ", + do_bootp + ? ((ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP") : "", + (do_bootp && do_rarp) ? " and " : "", + do_rarp ? "RARP" : ""); start_jiffies = jiffies; - retries = CONF_RETRIES; + retries = CONF_SEND_RETRIES; get_random_bytes(&timeout, sizeof(timeout)); timeout = CONF_BASE_TIMEOUT + (timeout % (unsigned) CONF_TIMEOUT_RANDOM); for(;;) { -#ifdef CONFIG_IP_PNP_BOOTP +#ifdef IPCONFIG_BOOTP if (do_bootp) ic_bootp_send(jiffies - start_jiffies); #endif -#ifdef CONFIG_IP_PNP_RARP +#ifdef IPCONFIG_RARP if (do_rarp) ic_rarp_send(); #endif printk("."); + jiff = jiffies + timeout; while (jiffies < jiff && !ic_got_reply) ; +#ifdef IPCONFIG_DHCP + if ((ic_got_reply & IC_BOOTP) + && (ic_proto_enabled & IC_USE_DHCP) + && ic_dhcp_msgtype != DHCPACK) + { + printk(","); + ic_got_reply = 0; + continue; + } +#endif /* IPCONFIG_DHCP */ + if (ic_got_reply) { printk(" OK\n"); break; } + if (! --retries) { printk(" timed out!\n"); break; } + timeout = timeout CONF_TIMEOUT_MULT; if (timeout > CONF_TIMEOUT_MAX) timeout = CONF_TIMEOUT_MAX; } -#ifdef CONFIG_IP_PNP_RARP - if (do_rarp) - ic_rarp_cleanup(); -#endif -#ifdef CONFIG_IP_PNP_BOOTP +#ifdef IPCONFIG_BOOTP if (do_bootp) ic_bootp_cleanup(); #endif +#ifdef IPCONFIG_RARP + if (do_rarp) + ic_rarp_cleanup(); +#endif if (!ic_got_reply) return -1; - printk("IP-Config: Got %s answer from %s, ", - (ic_got_reply & IC_BOOTP) ? "BOOTP" : "RARP", - in_ntoa(ic_servaddr)); - printk("my address is %s\n", in_ntoa(ic_myaddr)); + printk(SELF "Got %s answer from %s\n", + ((ic_got_reply & IC_RARP) ? "RARP" + : (ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP"), + in_ntoa(ic_servaddr)); return 0; } -#endif +#endif /* IPCONFIG_DYNAMIC */ + +#ifdef CONFIG_PROC_FS + +static int pnp_get_info(char *buffer, char **start, + off_t offset, int length, int dummy) +{ + int len; + + if (ic_proto_used & IC_PROTO) + sprintf(buffer, "#PROTO: %s\n", + (ic_proto_used & IC_RARP) ? "RARP" + : (ic_proto_used & IC_USE_DHCP) ? "DHCP" : "BOOTP"); + else + strcpy(buffer, "#MANUAL\n"); + len = strlen(buffer); + + if (ic_domain[0]) + len += sprintf(buffer + len, + "domain %s\n", ic_domain); + if (ic_nameserver != INADDR_NONE) + len += sprintf(buffer + len, + "nameserver %s\n", in_ntoa(ic_nameserver)); + + if (offset > len) + offset = len; + *start = buffer + offset; + + if (offset + length > len) + length = len - offset; + return length; +} + +#endif /* CONFIG_PROC_FS */ /* * IP Autoconfig dispatcher. @@ -808,15 +1046,38 @@ int __init ip_auto_config(void) { + int retries = CONF_OPEN_RETRIES; + unsigned long jiff; + +#ifdef CONFIG_PROC_FS + proc_net_register(&(struct proc_dir_entry) { + PROC_NET_PNP, 3, "pnp", + S_IFREG | S_IRUGO, 1, 0, 0, + 0, &proc_net_inode_operations, + pnp_get_info + }); +#endif /* CONFIG_PROC_FS */ + if (!ic_enable) return 0; - DBG(("IP-Config: Entered.\n")); + DBG((SELF "BEGIN\n")); + + try_try_again: + /* Give hardware a chance to settle */ + jiff = jiffies + CONF_PRE_OPEN; + while (jiffies < jiff) + ; /* Setup all network devices */ if (ic_open_devs() < 0) return -1; + /* Give drivers a chance to settle */ + jiff = jiffies + CONF_POST_OPEN; + while (jiffies < jiff) + ; + /* * If the config information is insufficient (e.g., our IP address or * IP address of the boot server is missing or we have multiple network @@ -827,20 +1088,57 @@ #ifdef CONFIG_ROOT_NFS (root_server_addr == INADDR_NONE && ic_servaddr == INADDR_NONE) || #endif - ic_first_dev->next) { -#ifdef CONFIG_IP_PNP_DYNAMIC + ic_first_dev->next) + { + +#ifdef IPCONFIG_DYNAMIC + if (ic_dynamic() < 0) { - printk(KERN_ERR "IP-Config: Auto-configuration of network failed.\n"); ic_close_devs(); + + /* + * I don't know why, but sometimes the + * eepro100 driver (at least) gets upset and + * doesn't work the first time it's opened. + * But then if you close it and reopen it, it + * works just fine. So we need to try that at + * least once before giving up. + * + * Also, if the root will be NFS-mounted, we + * have nowhere to go if DHCP fails. So we + * just have to keep trying forever. + * + * -- Chip + */ +#ifdef CONFIG_ROOT_NFS + if (ROOT_DEV == MKDEV(UNNAMED_MAJOR, 255)) { + printk(KERN_ERR SELF + "Retrying forever (NFS root)...\n"); + goto try_try_again; + } +#endif + + if (--retries) { + printk(KERN_ERR SELF + "Reopening network devices...\n"); + goto try_try_again; + } + + /* Oh, well. At least we tried. */ return -1; } -#else - printk(KERN_ERR "IP-Config: Incomplete network configuration information.\n"); + +#else /* !DYNAMIC */ + + printk(KERN_ERR SELF "Not enough information\n"); ic_close_devs(); return -1; -#endif + +#endif /* IPCONFIG_DYNAMIC */ + } else { - ic_dev = ic_first_dev->dev; /* Device selected manually or only one device -> use it */ + /* Device selected manually or only one device -> use it */ + ic_dev = ic_first_dev->dev; } /* @@ -857,10 +1155,30 @@ if (ic_setup_if() < 0 || ic_setup_routes() < 0) return -1; - DBG(("IP-Config: device=%s, local=%08x, server=%08x, boot=%08x, gw=%08x, mask=%08x\n", - ic_dev->name, ic_myaddr, ic_servaddr, root_server_addr, ic_gateway, ic_netmask)); - DBG(("IP-Config: host=%s, domain=%s, path=`%s'\n", system_utsname.nodename, - system_utsname.domainname, root_server_path)); + /* + * Record which protocol was actually used. + */ +#ifdef IPCONFIG_DYNAMIC + ic_proto_used = ic_got_reply | (ic_proto_enabled & IC_USE_DHCP); +#endif + +#ifndef IPCONFIG_SILENT + /* + * Clue in the operator. + */ + printk(SELF "Complete:"); + printk("\n device=%s", ic_dev->name); + printk(", addr=%s", in_ntoa(ic_myaddr)); + printk(", mask=%s", in_ntoa(ic_netmask)); + printk(", gw=%s", in_ntoa(ic_gateway)); + printk(",\n host=%s, domain=%s, nis-domain=%s", + system_utsname.nodename, ic_domain, system_utsname.domainname); + printk(",\n bootserver=%s", in_ntoa(ic_servaddr)); + printk(", rootserver=%s", in_ntoa(root_server_addr)); + printk(", rootpath=%s", root_server_path); + printk("\n"); +#endif /* !SILENT */ + return 0; } @@ -869,7 +1187,7 @@ * command line parameter. It consists of option fields separated by colons in * the following order: * - * :::::: + * :::::: * * Any of the fields can be empty which means to use a default value: * - address given by BOOTP or RARP @@ -880,28 +1198,38 @@ * - in ASCII notation, or the name returned * by BOOTP * - use all available devices - * - use both protocols to determine my own address + * : + * dhcp|bootp|rarp - use given protocol + * both or empty - use both BOOTP and RARP (not DHCP) + * off or none - don't do autoconfig at all */ static int __init ic_proto_name(char *name) { - if (!strcmp(name, "off")) { + if (!strcmp(name, "off") || !strcmp(name, "none")) { ic_proto_enabled = 0; return 1; } +#ifdef CONFIG_IP_PNP_DHCP + else if (!strcmp(name, "dhcp")) { + ic_proto_enabled &= ~IC_RARP; + return 1; + } +#endif #ifdef CONFIG_IP_PNP_BOOTP else if (!strcmp(name, "bootp")) { - ic_proto_enabled &= ~IC_RARP; + ic_proto_enabled &= ~(IC_RARP | IC_USE_DHCP); return 1; } #endif #ifdef CONFIG_IP_PNP_RARP else if (!strcmp(name, "rarp")) { - ic_proto_enabled &= ~IC_BOOTP; + ic_proto_enabled &= ~(IC_BOOTP | IC_USE_DHCP); return 1; } #endif -#ifdef CONFIG_IP_PNP_DYNAMIC +#ifdef IPCONFIG_DYNAMIC else if (!strcmp(name, "both")) { + ic_proto_enabled &= ~IC_USE_DHCP; /* backward compat :-( */ return 1; } #endif @@ -913,8 +1241,7 @@ char *cp, *ip, *dp; int num = 0; - ic_set_manually = 1; - if (!strcmp(addrs, "off")) { + if (!strcmp(addrs, "off") || !strcmp(addrs, "none")) { ic_enable = 0; return; } @@ -927,7 +1254,7 @@ if ((cp = strchr(ip, ':'))) *cp++ = '\0'; if (strlen(ip) > 0) { - DBG(("IP-Config: Parameter #%d: `%s'\n", num, ip)); + DBG((SELF "Param #%d: `%s'\n", num, ip)); switch (num) { case 0: if ((ic_myaddr = in_aton(ip)) == INADDR_ANY) diff -urN v2.2.15/linux/net/ipv4/proc.c linux/net/ipv4/proc.c --- v2.2.15/linux/net/ipv4/proc.c Wed May 3 17:16:53 2000 +++ linux/net/ipv4/proc.c Wed Jun 7 14:26:44 2000 @@ -134,7 +134,7 @@ if(timer_active == 0) timer_expires = jiffies; sprintf(tmpbuf, "%4d: %08lX:%04X %08lX:%04X" - " %02X %08X:%08X %02X:%08lX %08X %5d %8d %ld", + " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu", i, src, srcp, dest, destp, sp->state, (tw_bucket ? 0 : diff -urN v2.2.15/linux/net/ipv4/syncookies.c linux/net/ipv4/syncookies.c --- v2.2.15/linux/net/ipv4/syncookies.c Tue Jan 4 10:12:26 2000 +++ linux/net/ipv4/syncookies.c Wed Jun 7 14:26:44 2000 @@ -9,7 +9,7 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * $Id: syncookies.c,v 1.7.2.3 1999/12/07 03:11:07 davem Exp $ + * $Id: syncookies.c,v 1.7.2.4 2000/04/17 05:57:01 davem Exp $ * * Missing: IPv6 support. */ @@ -104,11 +104,19 @@ { struct tcp_opt *tp = &sk->tp_pinfo.af_tcp; + tp->syn_backlog++; + sk = tp->af_specific->syn_recv_sock(sk, skb, req, dst); - req->sk = sk; - - /* Queue up for accept() */ - tcp_synq_queue(tp, req); + if (sk) { + req->sk = sk; + + /* Queue up for accept() */ + tcp_synq_queue(tp, req); + } else { + tp->syn_backlog--; + (*req->class->destructor)(req); + tcp_openreq_free(req); + } return sk; } diff -urN v2.2.15/linux/net/ipv4/sysctl_net_ipv4.c linux/net/ipv4/sysctl_net_ipv4.c --- v2.2.15/linux/net/ipv4/sysctl_net_ipv4.c Wed May 3 17:16:53 2000 +++ linux/net/ipv4/sysctl_net_ipv4.c Wed Jun 7 14:26:44 2000 @@ -1,7 +1,7 @@ /* * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem. * - * $Id: sysctl_net_ipv4.c,v 1.38.2.2 1999/09/22 16:33:30 davem Exp $ + * $Id: sysctl_net_ipv4.c,v 1.38.2.3 2000/04/17 05:46:06 davem Exp $ * * Begun April 1, 1996, Mike Shaver. * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS] diff -urN v2.2.15/linux/net/ipv4/tcp.c linux/net/ipv4/tcp.c --- v2.2.15/linux/net/ipv4/tcp.c Wed May 3 17:16:53 2000 +++ linux/net/ipv4/tcp.c Wed Jun 7 14:26:44 2000 @@ -5,7 +5,7 @@ * * Implementation of the Transmission Control Protocol(TCP). * - * Version: $Id: tcp.c,v 1.140.2.10 2000/03/21 20:54:13 davem Exp $ + * Version: $Id: tcp.c,v 1.140.2.11 2000/04/17 05:57:01 davem Exp $ * * Authors: Ross Biro, * Fred N. van Kempen, @@ -1484,15 +1484,18 @@ while(req) { struct open_request *iter; - if (req->sk) - tcp_close(req->sk, 0); - iter = req; req = req->dl_next; + if (iter->sk) { + tcp_close(iter->sk, 0); + sk->ack_backlog--; + } else { + tcp_dec_slow_timer(TCP_SLT_SYNACK); + sk->tp_pinfo.af_tcp.syn_backlog--; + } (*iter->class->destructor)(iter); - tcp_dec_slow_timer(TCP_SLT_SYNACK); - sk->ack_backlog--; + tcp_openreq_free(iter); } diff -urN v2.2.15/linux/net/ipv4/tcp_input.c linux/net/ipv4/tcp_input.c --- v2.2.15/linux/net/ipv4/tcp_input.c Wed May 3 17:16:53 2000 +++ linux/net/ipv4/tcp_input.c Wed Jun 7 14:26:44 2000 @@ -5,7 +5,7 @@ * * Implementation of the Transmission Control Protocol(TCP). * - * Version: $Id: tcp_input.c,v 1.164.2.12 2000/01/31 20:43:36 davem Exp $ + * Version: $Id: tcp_input.c,v 1.164.2.15 2000/05/27 04:01:49 davem Exp $ * * Authors: Ross Biro, * Fred N. van Kempen, @@ -55,6 +55,7 @@ * work without delayed acks. * Andi Kleen: Process packets with PSH set in the * fast path. + * Vincent Zweije Fix TIME-WAIT FIN ACK bug. */ #include @@ -295,6 +296,7 @@ sk->dport = 0; sk->daddr = 0; sk->num = 0; + tcp_clear_xmit_timer(sk, TIME_RETRANS); } sk->shutdown = SHUTDOWN_MASK; if (!sk->dead) @@ -1017,7 +1019,7 @@ } /* Ack old packets if necessary */ if (!after(TCP_SKB_CB(skb)->end_seq, tw->rcv_nxt) && - (th->doff * 4) > len) + (len > (th->doff * 4) || th->fin)) return TCP_TW_ACK; return 0; } @@ -2022,10 +2024,10 @@ } sk = tp->af_specific->syn_recv_sock(sk, skb, req, NULL); - tcp_dec_slow_timer(TCP_SLT_SYNACK); if (sk == NULL) return NULL; + tcp_dec_slow_timer(TCP_SLT_SYNACK); req->expires = 0UL; req->sk = sk; } diff -urN v2.2.15/linux/net/ipv4/tcp_output.c linux/net/ipv4/tcp_output.c --- v2.2.15/linux/net/ipv4/tcp_output.c Wed May 3 17:16:53 2000 +++ linux/net/ipv4/tcp_output.c Wed Jun 7 14:26:44 2000 @@ -596,6 +596,7 @@ (skb->len < (cur_mss >> 1)) && (skb->next != tp->send_head) && (skb->next != (struct sk_buff *)&sk->write_queue) && + (skb->next != tp->retrans_head) && (sysctl_tcp_retrans_collapse != 0)) tcp_retrans_try_collapse(sk, skb, cur_mss); diff -urN v2.2.15/linux/net/ipv4/tcp_timer.c linux/net/ipv4/tcp_timer.c --- v2.2.15/linux/net/ipv4/tcp_timer.c Wed May 3 17:16:53 2000 +++ linux/net/ipv4/tcp_timer.c Wed Jun 7 14:26:44 2000 @@ -5,7 +5,7 @@ * * Implementation of the Transmission Control Protocol(TCP). * - * Version: $Id: tcp_timer.c,v 1.62.2.6 2000/01/13 04:28:06 davem Exp $ + * Version: $Id: tcp_timer.c,v 1.62.2.9 2000/05/27 04:04:43 davem Exp $ * * Authors: Ross Biro, * Fred N. van Kempen, @@ -178,6 +178,7 @@ sk->dport = 0; sk->daddr = 0; sk->num = 0; + tcp_clear_xmit_timer(sk, TIME_RETRANS); } return ret; @@ -429,6 +430,15 @@ if (atomic_read(&sk->sock_readers)) { /* Try again later */ tcp_reset_xmit_timer(sk, TIME_RETRANS, HZ/20); + return; + } + + /* Unfortunately, here in 2.2.x on SMP this timer can race + * with the user level context. It is fixed properly in 2.3.x + * and later, but for now we have to use this hack. + */ + if (tp->packets_out == 0) { + tcp_clear_xmit_timer(sk, TIME_RETRANS); return; } diff -urN v2.2.15/linux/net/ipv4/udp.c linux/net/ipv4/udp.c --- v2.2.15/linux/net/ipv4/udp.c Wed May 3 17:16:53 2000 +++ linux/net/ipv4/udp.c Wed Jun 7 14:26:44 2000 @@ -5,7 +5,7 @@ * * The User Datagram Protocol (UDP). * - * Version: $Id: udp.c,v 1.66.2.3 1999/08/07 10:56:36 davem Exp $ + * Version: $Id: udp.c,v 1.66.2.4 2000/03/10 00:16:05 davem Exp $ * * Authors: Ross Biro, * Fred N. van Kempen, diff -urN v2.2.15/linux/net/ipx/af_ipx.c linux/net/ipx/af_ipx.c --- v2.2.15/linux/net/ipx/af_ipx.c Tue Oct 26 17:53:42 1999 +++ linux/net/ipx/af_ipx.c Wed Jun 7 14:26:44 2000 @@ -601,8 +601,7 @@ memcpy(skb2->h.raw, skb->h.raw, skb->len); } kfree_skb(skb); - - return (NULL); + return(skb2); } static int ipxitf_send(ipx_interface *intrfc, struct sk_buff *skb, char *node) diff -urN v2.2.15/linux/net/irda/af_irda.c linux/net/irda/af_irda.c --- v2.2.15/linux/net/irda/af_irda.c Wed May 3 17:16:53 2000 +++ linux/net/irda/af_irda.c Wed Jun 7 14:26:44 2000 @@ -6,11 +6,11 @@ * Status: Stable * Author: Dag Brattli * Created at: Sun May 31 10:12:43 1998 - * Modified at: Sat Dec 25 21:10:23 1999 + * Modified at: Tue Apr 11 19:06:24 2000 * Modified by: Dag Brattli * Sources: af_netroom.c, af_ax25.c, af_rose.c, af_x25.c etc. * - * Copyright (c) 1999 Dag Brattli + * Copyright (c) 1999-2000 Dag Brattli * Copyright (c) 1999 Jean Tourrilhes * All Rights Reserved. * @@ -1907,6 +1907,9 @@ return -EFAULT; break; case IRLMP_MAX_SDU_SIZE: + IRDA_DEBUG(2, __FUNCTION__ "(), max_data_size=%d\n", + self->max_data_size); + val = self->max_data_size; len = sizeof(int); if (put_user(len, optlen)) diff -urN v2.2.15/linux/net/irda/ircomm/ircomm_tty.c linux/net/irda/ircomm/ircomm_tty.c --- v2.2.15/linux/net/irda/ircomm/ircomm_tty.c Wed May 3 17:16:54 2000 +++ linux/net/irda/ircomm/ircomm_tty.c Wed Jun 7 14:26:44 2000 @@ -1347,7 +1347,7 @@ done: if (offset >= count+begin) return 0; - *start = buf + (begin-offset); + *start = buf + (offset-begin); return ((len < begin+count-offset) ? len : begin+count-offset); } diff -urN v2.2.15/linux/net/irda/irlan/irlan_client.c linux/net/irda/irlan/irlan_client.c --- v2.2.15/linux/net/irda/irlan/irlan_client.c Wed May 3 17:16:54 2000 +++ linux/net/irda/irlan/irlan_client.c Wed Jun 7 14:26:44 2000 @@ -6,13 +6,13 @@ * Status: Experimental. * Author: Dag Brattli * Created at: Sun Aug 31 20:14:37 1997 - * Modified at: Tue Dec 14 15:47:02 1999 + * Modified at: Fri Apr 21 14:57:47 2000 * Modified by: Dag Brattli * Sources: skeleton.c by Donald Becker * slip.c by Laurence Culhane, * Fred N. van Kempen, * - * Copyright (c) 1998-1999 Dag Brattli , + * Copyright (c) 1998-2000 Dag Brattli , * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -99,13 +99,11 @@ /* * Function irlan_client_wakeup (self, saddr, daddr) * - * Wake up client - * + * Wake up client. This function is called when a remote IrLAN device + * is discovered, or .. */ void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr) -{ - struct irmanager_event mgr_event; - +{ IRDA_DEBUG(1, __FUNCTION__ "()\n"); ASSERT(self != NULL, return;); @@ -117,42 +115,32 @@ */ if ((self->client.state != IRLAN_IDLE) || (self->provider.access_type == ACCESS_DIRECT)) + { + IRDA_DEBUG(0, __FUNCTION__ "(), already awake!\n"); return; + } - /* saddr may have changed! */ + /* Addresses may have changed! */ self->saddr = saddr; - - /* Before we try to connect, we check if network device is up. If it - * is up, that means that the "user" really wants to connect. If not - * we notify the user about the possibility of an IrLAN connection - */ - if (self->dev.start) { - /* Open TSAPs */ - irlan_client_open_ctrl_tsap(self); - irlan_open_data_tsap(self); - - irlan_do_client_event(self, IRLAN_DISCOVERY_INDICATION, NULL); - } else if (self->notify_irmanager) { - /* - * Tell irmanager that the device can now be - * configured but only if the device was not taken - * down by the user - */ - mgr_event.event = EVENT_IRLAN_START; - sprintf(mgr_event.devname, "%s", self->ifname); - irmanager_notify(&mgr_event); - - /* - * We set this so that we only notify once, since if - * configuration of the network device fails, the user - * will have to sort it out first anyway. No need to - * try again. - */ - self->notify_irmanager = FALSE; + self->daddr = daddr; + +#if 0 + if (!self->dev.start) { + IRDA_DEBUG(0, __FUNCTION__ "(), not started yet\n"); + return; + } +#endif + if (self->disconnect_reason == LM_USER_REQUEST) { + IRDA_DEBUG(0, __FUNCTION__ "(), still stopped by user\n"); + return; } - /* Restart watchdog timer */ - irlan_start_watchdog_timer(self, IRLAN_TIMEOUT); + /* Open TSAPs */ + irlan_client_open_ctrl_tsap(self); + irlan_open_data_tsap(self); + + irlan_do_client_event(self, IRLAN_DISCOVERY_INDICATION, NULL); + /* Start kick timer */ irlan_client_start_kick_timer(self, 2*HZ); } @@ -176,29 +164,16 @@ saddr = discovery->saddr; daddr = discovery->daddr; - /* - * Check if we already dealing with this provider. - */ - self = (struct irlan_cb *) hashbin_find(irlan, daddr, NULL); + /* Find instance */ + self = (struct irlan_cb *) hashbin_get_first(irlan); if (self) { ASSERT(self->magic == IRLAN_MAGIC, return;); - + IRDA_DEBUG(1, __FUNCTION__ "(), Found instance (%08x)!\n", - daddr); + daddr); irlan_client_wakeup(self, saddr, daddr); - - return; } - - /* - * We have no instance for daddr, so start a new one - */ - IRDA_DEBUG(1, __FUNCTION__ "(), starting new instance!\n"); - self = irlan_open(saddr, daddr, TRUE); - - /* Restart watchdog timer */ - irlan_start_watchdog_timer(self, IRLAN_TIMEOUT); } /* diff -urN v2.2.15/linux/net/irda/irlan/irlan_common.c linux/net/irda/irlan/irlan_common.c --- v2.2.15/linux/net/irda/irlan/irlan_common.c Wed May 3 17:16:54 2000 +++ linux/net/irda/irlan/irlan_common.c Wed Jun 7 14:26:44 2000 @@ -6,10 +6,10 @@ * Status: Experimental. * Author: Dag Brattli * Created at: Sun Aug 31 20:14:37 1997 - * Modified at: Sun Dec 26 21:53:10 1999 + * Modified at: Fri Apr 21 14:55:31 2000 * Modified by: Dag Brattli * - * Copyright (c) 1997, 1999 Dag Brattli , + * Copyright (c) 1997, 1999-2000 Dag Brattli , * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -50,6 +50,13 @@ #include #include +/* + * Send gratuitous ARP when connected to a new AP or not. May be a clever + * thing to do, but for some reason the machine crashes if you use DHCP. So + * lets not use it by default. + */ +#undef CONFIG_IRLAN_SEND_GRATUITOUS_ARP + /* extern char sysctl_devname[]; */ /* @@ -65,7 +72,7 @@ static char *irlan_state[] = { "IRLAN_IDLE", "IRLAN_QUERY", - "IRLAN_CONN", + "IRLAN_CONN", "IRLAN_INFO", "IRLAN_MEDIA", "IRLAN_OPEN", @@ -103,59 +110,6 @@ #endif /* CONFIG_PROC_FS */ /* - * Function irlan_watchdog_timer_expired (data) - * - * Something has gone wrong during the connection establishment - * - */ -void irlan_watchdog_timer_expired(void *data) -{ - struct irmanager_event mgr_event; - struct irlan_cb *self; - - IRDA_DEBUG(0, __FUNCTION__ "()\n"); - - self = (struct irlan_cb *) data; - - ASSERT(self != NULL, return;); - ASSERT(self->magic == IRLAN_MAGIC, return;); - - /* Check if device still configured */ - if (self->dev.start) { - IRDA_DEBUG(0, __FUNCTION__ - "(), notifying irmanager to stop irlan!\n"); - mgr_event.event = EVENT_IRLAN_STOP; - sprintf(mgr_event.devname, "%s", self->ifname); - irmanager_notify(&mgr_event); - - /* - * We set this to false, so that irlan_dev_close known that - * notify_irmanager should actually be set to TRUE again - * instead of FALSE, since this close has not been initiated - * by the user. - */ - self->notify_irmanager = FALSE; - } else { - IRDA_DEBUG(0, __FUNCTION__ "(), closing instance!\n"); - /*irlan_close(self);*/ - } -} - -/* - * Function irlan_start_watchdog_timer (self, timeout) - * - * - * - */ -void irlan_start_watchdog_timer(struct irlan_cb *self, int timeout) -{ - IRDA_DEBUG(4, __FUNCTION__ "()\n"); - - irda_start_timer(&self->watchdog_timer, timeout, (void *) self, - irlan_watchdog_timer_expired); -} - -/* * Function irlan_init (void) * * Initialize IrLAN layer @@ -178,8 +132,6 @@ create_proc_entry("irlan", 0, proc_irda)->get_info = irlan_proc_read; #endif /* CONFIG_PROC_FS */ - IRDA_DEBUG(4, __FUNCTION__ "()\n"); - hints = irlmp_service_to_hint(S_LAN); /* Register with IrLMP as a client */ @@ -189,12 +141,11 @@ /* Register with IrLMP as a service */ skey = irlmp_register_service(hints); - /* Start the master IrLAN instance */ - new = irlan_open(DEV_ADDR_ANY, DEV_ADDR_ANY, FALSE); + /* Start the master IrLAN instance (the only one for now) */ + new = irlan_open(DEV_ADDR_ANY, DEV_ADDR_ANY); /* The master will only open its (listen) control TSAP */ irlan_provider_open_ctrl_tsap(new); - new->master = TRUE; /* Do some fast discovery! */ irlmp_discovery_request(DISCOVERY_DEFAULT_SLOTS); @@ -207,7 +158,6 @@ IRDA_DEBUG(4, __FUNCTION__ "()\n"); irlmp_unregister_client(ckey); - irlmp_unregister_service(skey); #ifdef CONFIG_PROC_FS @@ -244,8 +194,6 @@ IRDA_DEBUG(2, __FUNCTION__ "(), register_netdev() failed!\n"); return -1; } - self->netdev_registered = TRUE; - return 0; } @@ -255,7 +203,7 @@ * Open new instance of a client/provider, we should only register the * network device if this instance is ment for a particular client/provider */ -struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr, int netdev) +struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr) { struct irlan_cb *self; @@ -290,8 +238,6 @@ self->provider.access_type = access; self->media = MEDIA_802_3; - self->notify_irmanager = TRUE; - init_timer(&self->watchdog_timer); init_timer(&self->client.kick_timer); @@ -302,19 +248,16 @@ irlan_next_client_state(self, IRLAN_IDLE); irlan_next_provider_state(self, IRLAN_IDLE); - /* Register network device now, or wait until some later time? */ - if (netdev) - irlan_register_netdev(self); + irlan_register_netdev(self); return self; } /* - * Function irlan_close (self) + * Function __irlan_close (self) * * This function closes and deallocates the IrLAN client instances. Be * aware that other functions which calles client_close() must call * hashbin_remove() first!!! - * */ static void __irlan_close(struct irlan_cb *self) { @@ -335,49 +278,13 @@ iriap_close(self->client.iriap); /* Remove frames queued on the control channel */ - while ((skb = skb_dequeue(&self->client.txq))) { + while ((skb = skb_dequeue(&self->client.txq))) dev_kfree_skb(skb); - } - - if (self->netdev_registered) { - unregister_netdev(&self->dev); - self->netdev_registered = FALSE; - } - self->magic = 0; - kfree(self); -} - -/* - * Function irlan_close (self) - * - * Close instance - * - */ -void irlan_close(struct irlan_cb *self) -{ - struct irlan_cb *entry; - - IRDA_DEBUG(0, __FUNCTION__ "()\n"); - - ASSERT(self != NULL, return;); - ASSERT(self->magic == IRLAN_MAGIC, return;); - - /* Check if device is still configured */ - if (self->dev.start) { - IRDA_DEBUG(0, __FUNCTION__ - "(), Device still configured, closing later!\n"); - - /* Give it a chance to reconnect */ - irlan_start_watchdog_timer(self, IRLAN_TIMEOUT); - return; - } - IRDA_DEBUG(2, __FUNCTION__ "(), daddr=%08x\n", self->daddr); - entry = hashbin_remove(irlan, self->daddr, NULL); - - ASSERT(entry == self, return;); + unregister_netdev(&self->dev); - __irlan_close(self); + self->magic = 0; + kfree(self); } /* @@ -422,6 +329,7 @@ } /* Ready to transfer Ethernet frames (at last) */ self->dev.tbusy = 0; + self->disconnect_reason = 0; /* Clear reason */ } void irlan_connect_confirm(void *instance, void *sap, struct qos_info *qos, @@ -456,8 +364,12 @@ /* Ready to transfer Ethernet frames */ self->dev.tbusy = 0; + self->dev.start = 1; + self->disconnect_reason = 0; /* Clear reason */ +#ifdef CONFIG_IRLAN_SEND_GRATUITOUS_ARP irlan_eth_send_gratuitous_arp(&self->dev); +#endif } /* @@ -486,26 +398,29 @@ IRDA_DEBUG(2, "IrLAN, data channel disconnected by peer!\n"); - switch(reason) { + /* Save reason, so we know if we should try to reconnect or not */ + self->disconnect_reason = reason; + + switch (reason) { case LM_USER_REQUEST: /* User request */ - irlan_close(self); + IRDA_DEBUG(2, __FUNCTION__ "(), user request\n"); break; case LM_LAP_DISCONNECT: /* Unexpected IrLAP disconnect */ - irlan_start_watchdog_timer(self, IRLAN_TIMEOUT); + IRDA_DEBUG(2, __FUNCTION__ "(), Unexpected IrLAP disconnect\n"); break; case LM_CONNECT_FAILURE: /* Failed to establish IrLAP connection */ - IRDA_DEBUG(2, __FUNCTION__ "(), LM_CONNECT_FAILURE not impl\n"); + IRDA_DEBUG(2, __FUNCTION__ "(), IrLAP connect failed\n"); break; case LM_LAP_RESET: /* IrLAP reset */ - IRDA_DEBUG(2, __FUNCTION__ "(), LM_CONNECT_FAILURE not impl\n"); + IRDA_DEBUG(2, __FUNCTION__ "(), IrLAP reset\n"); break; case LM_INIT_DISCONNECT: - IRDA_DEBUG(2, __FUNCTION__ "(), LM_CONNECT_FAILURE not impl\n"); + IRDA_DEBUG(2, __FUNCTION__ "(), IrLMP connect failed\n"); break; default: + ERROR(__FUNCTION__ "(), Unknown disconnect reason\n"); break; - } - + } irlan_do_client_event(self, IRLAN_LMP_DISCONNECT, NULL); irlan_do_provider_event(self, IRLAN_LMP_DISCONNECT, NULL); } @@ -556,9 +471,7 @@ ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); - /* - * Disconnect and close all open TSAP connections - */ + /* Disconnect and close all open TSAP connections */ if (self->tsap_data) { irttp_disconnect_request(self->tsap_data, NULL, P_NORMAL); irttp_close_tsap(self->tsap_data); @@ -636,7 +549,7 @@ { struct sk_buff *skb; - IRDA_DEBUG(3, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, __FUNCTION__ "()\n"); if (irda_lock(&self->client.tx_busy) == FALSE) return -EBUSY; @@ -655,7 +568,7 @@ dev_kfree_skb(skb); return -1; } - IRDA_DEBUG(3, __FUNCTION__ "(), sending ...\n"); + IRDA_DEBUG(2, __FUNCTION__ "(), sending ...\n"); return irttp_data_request(self->client.tsap_ctrl, skb); } @@ -744,7 +657,6 @@ /* self->use_udata = TRUE; */ - /* irttp_data_request(self->client.tsap_ctrl, skb); */ irlan_ctrl_data_request(self, skb); } @@ -813,7 +725,6 @@ irlan_insert_string_param(skb, "FILTER_TYPE", "DIRECTED"); irlan_insert_string_param(skb, "FILTER_MODE", "FILTER"); - /* irttp_data_request(self->client.tsap_ctrl, skb); */ irlan_ctrl_data_request(self, skb); } @@ -855,7 +766,6 @@ else irlan_insert_string_param(skb, "FILTER_MODE", "NONE"); - /* irttp_data_request(self->client.tsap_ctrl, skb); */ irlan_ctrl_data_request(self, skb); } @@ -895,7 +805,6 @@ else irlan_insert_string_param(skb, "FILTER_MODE", "NONE"); - /* irttp_data_request(self->client.tsap_ctrl, skb); */ irlan_ctrl_data_request(self, skb); } @@ -933,7 +842,6 @@ irlan_insert_string_param(skb, "FILTER_TYPE", "DIRECTED"); irlan_insert_string_param(skb, "FILTER_OPERATION", "DYNAMIC"); - /* irttp_data_request(self->client.tsap_ctrl, skb); */ irlan_ctrl_data_request(self, skb); } @@ -969,7 +877,6 @@ irlan_insert_string_param(skb, "MEDIA", "802.3"); - /* irttp_data_request(self->client.tsap_ctrl, skb); */ irlan_ctrl_data_request(self, skb); } @@ -1173,35 +1080,35 @@ while (self != NULL) { ASSERT(self->magic == IRLAN_MAGIC, return len;); - /* Don't display the master server */ - if (self->master == 0) { - len += sprintf(buf+len, "ifname: %s,\n", - self->ifname); - len += sprintf(buf+len, "client state: %s, ", - irlan_state[ self->client.state]); - len += sprintf(buf+len, "provider state: %s,\n", - irlan_state[ self->provider.state]); - len += sprintf(buf+len, "saddr: %#08x, ", - self->saddr); - len += sprintf(buf+len, "daddr: %#08x\n", - self->daddr); - len += sprintf(buf+len, "version: %d.%d,\n", - self->version[1], self->version[0]); - len += sprintf(buf+len, "access type: %s\n", - irlan_access[self->client.access_type]); - len += sprintf(buf+len, "media: %s\n", - irlan_media[self->media]); - - len += sprintf(buf+len, "local filter:\n"); - len += sprintf(buf+len, "remote filter: "); - len += irlan_print_filter(self->client.filter_type, - buf+len); - - len += sprintf(buf+len, "tx busy: %s\n", - self->dev.tbusy ? "TRUE" : "FALSE"); - - len += sprintf(buf+len, "\n"); - } + len += sprintf(buf+len, "ifname: %s,\n", + self->ifname); + len += sprintf(buf+len, "client state: %s, ", + irlan_state[ self->client.state]); + len += sprintf(buf+len, "provider state: %s,\n", + irlan_state[ self->provider.state]); + len += sprintf(buf+len, "saddr: %#08x, ", + self->saddr); + len += sprintf(buf+len, "daddr: %#08x\n", + self->daddr); + len += sprintf(buf+len, "version: %d.%d,\n", + self->version[1], self->version[0]); + len += sprintf(buf+len, "access type: %s\n", + irlan_access[self->client.access_type]); + len += sprintf(buf+len, "media: %s\n", + irlan_media[self->media]); + + len += sprintf(buf+len, "local filter:\n"); + len += sprintf(buf+len, "remote filter: "); + len += irlan_print_filter(self->client.filter_type, + buf+len); + + len += sprintf(buf+len, "client tx busy: %s\n", + self->client.tx_busy ? "TRUE" : "FALSE"); + + len += sprintf(buf+len, "dev tx busy: %s\n", + self->dev.tbusy ? "TRUE" : "FALSE"); + + len += sprintf(buf+len, "\n"); self = (struct irlan_cb *) hashbin_get_next(irlan); } diff -urN v2.2.15/linux/net/irda/irlan/irlan_eth.c linux/net/irda/irlan/irlan_eth.c --- v2.2.15/linux/net/irda/irlan/irlan_eth.c Wed May 3 17:16:54 2000 +++ linux/net/irda/irlan/irlan_eth.c Wed Jun 7 14:26:44 2000 @@ -6,7 +6,7 @@ * Status: Experimental. * Author: Dag Brattli * Created at: Thu Oct 15 08:37:58 1998 - * Modified at: Sun Jan 16 22:43:41 2000 + * Modified at: Fri Apr 21 14:54:42 2000 * Modified by: Dag Brattli * Sources: skeleton.c by Donald Becker * slip.c by Laurence Culhane, @@ -47,7 +47,6 @@ */ int irlan_eth_init(struct device *dev) { - struct irmanager_event mgr_event; struct irlan_cb *self; IRDA_DEBUG(2, __FUNCTION__"()\n"); @@ -86,22 +85,6 @@ get_random_bytes(dev->dev_addr+5, 1); } - /* - * Network device has now been registered, so tell irmanager about - * it, so it can be configured with network parameters - */ - mgr_event.event = EVENT_IRLAN_START; - sprintf(mgr_event.devname, "%s", self->ifname); - irmanager_notify(&mgr_event); - - /* - * We set this so that we only notify once, since if - * configuration of the network device fails, the user - * will have to sort it out first anyway. No need to - * try again. - */ - self->notify_irmanager = FALSE; - return 0; } @@ -124,13 +107,12 @@ ASSERT(self != NULL, return -1;); /* Ready to play! */ -/* dev->tbusy = 0; */ /* Wait until data link is ready */ + dev->tbusy = 1; /* Wait until data link is ready */ dev->interrupt = 0; - dev->start = 1; - - self->notify_irmanager = TRUE; + dev->start = 0; /* We are now open, so time to do some work */ + self->disconnect_reason = 0; irlan_client_wakeup(self, self->saddr, self->daddr); irlan_mod_inc_use_count(); @@ -149,7 +131,8 @@ int irlan_eth_close(struct device *dev) { struct irlan_cb *self = (struct irlan_cb *) dev->priv; - + struct sk_buff *skb; + IRDA_DEBUG(2, __FUNCTION__ "()\n"); /* Stop device */ @@ -159,19 +142,16 @@ irlan_mod_dec_use_count(); irlan_close_data_channel(self); - irlan_close_tsaps(self); irlan_do_client_event(self, IRLAN_LMP_DISCONNECT, NULL); irlan_do_provider_event(self, IRLAN_LMP_DISCONNECT, NULL); - irlan_start_watchdog_timer(self, IRLAN_TIMEOUT); - - /* Device closed by user! */ - if (self->notify_irmanager) - self->notify_irmanager = FALSE; - else - self->notify_irmanager = TRUE; + /* Remove frames queued on the control channel */ + while ((skb = skb_dequeue(&self->client.txq))) { + dev_kfree_skb(skb); + } + self->client.tx_busy = 0; return 0; } @@ -352,7 +332,7 @@ dev, in_dev->ifa_list->ifa_address, NULL, dev->dev_addr, NULL); -#endif /* CONFIG_INET */ +#endif /* CONFIG_INET */ } /* diff -urN v2.2.15/linux/net/irda/irlan/irlan_provider.c linux/net/irda/irlan/irlan_provider.c --- v2.2.15/linux/net/irda/irlan/irlan_provider.c Wed May 3 17:16:54 2000 +++ linux/net/irda/irlan/irlan_provider.c Wed Jun 7 14:26:44 2000 @@ -6,13 +6,13 @@ * Status: Experimental. * Author: Dag Brattli * Created at: Sun Aug 31 20:14:37 1997 - * Modified at: Sat Oct 30 12:52:10 1999 + * Modified at: Mon Apr 3 14:28:19 2000 * Modified by: Dag Brattli * Sources: skeleton.c by Donald Becker * slip.c by Laurence Culhane, * Fred N. van Kempen, * - * Copyright (c) 1998-1999 Dag Brattli , + * Copyright (c) 1998-2000 Dag Brattli , * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -116,14 +116,14 @@ /* * Function irlan_provider_connect_indication (handle, skb, priv) * - * Got connection from peer IrLAN layer + * Got connection from peer IrLAN client * */ static void irlan_provider_connect_indication(void *instance, void *sap, struct qos_info *qos, __u32 max_sdu_size, __u8 max_header_size, - struct sk_buff *skb) + struct sk_buff *skb) { struct irlan_cb *self, *new; struct tsap_cb *tsap; @@ -137,82 +137,24 @@ ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); - self->provider.max_sdu_size = max_sdu_size; - self->provider.max_header_size = max_header_size; - ASSERT(tsap == self->provider.tsap_ctrl,return;); ASSERT(self->provider.state == IRLAN_IDLE, return;); daddr = irttp_get_daddr(tsap); saddr = irttp_get_saddr(tsap); + self->provider.max_sdu_size = max_sdu_size; + self->provider.max_header_size = max_header_size; - /* Check if we already dealing with this client or peer */ - new = (struct irlan_cb *) hashbin_find(irlan, daddr, NULL); - if (new) { - ASSERT(new->magic == IRLAN_MAGIC, return;); - IRDA_DEBUG(0, __FUNCTION__ "(), found instance!\n"); - - /* Update saddr, since client may have moved to a new link */ - new->saddr = saddr; - IRDA_DEBUG(2, __FUNCTION__ "(), saddr=%08x\n", new->saddr); - - /* Make sure that any old provider control TSAP is removed */ - if ((new != self) && new->provider.tsap_ctrl) { - irttp_disconnect_request(new->provider.tsap_ctrl, - NULL, P_NORMAL); - irttp_close_tsap(new->provider.tsap_ctrl); - new->provider.tsap_ctrl = NULL; - } - } else { - /* This must be the master instance, so start a new instance */ - IRDA_DEBUG(0, __FUNCTION__ "(), starting new provider!\n"); - - new = irlan_open(saddr, daddr, TRUE); - } - - /* - * Check if the connection came in on the master server, or the - * slave server. If it came on the slave, then everything is - * really, OK (reconnect), if not we need to dup the connection and - * hand it over to the slave. - */ - if (new != self) { - - /* Now attach up the new "socket" */ - new->provider.tsap_ctrl = irttp_dup(self->provider.tsap_ctrl, - new); - if (!new->provider.tsap_ctrl) { - IRDA_DEBUG(0, __FUNCTION__ "(), dup failed!\n"); - return; - } - - /* new->stsap_sel = new->tsap->stsap_sel; */ - new->dtsap_sel_ctrl = new->provider.tsap_ctrl->dtsap_sel; - - /* Clean up the original one to keep it in listen state */ - self->provider.tsap_ctrl->dtsap_sel = LSAP_ANY; - self->provider.tsap_ctrl->lsap->dlsap_sel = LSAP_ANY; - self->provider.tsap_ctrl->lsap->lsap_state = LSAP_DISCONNECTED; - - /* - * Use the new instance from here instead of the master - * struct! - */ - self = new; - } - /* Check if network device has been registered */ - if (!self->netdev_registered) - irlan_register_netdev(self); - irlan_do_provider_event(self, IRLAN_CONNECT_INDICATION, NULL); /* * If we are in peer mode, the client may not have got the discovery * indication it needs to make progress. If the client is still in - * IDLE state, we must kick it to + * IDLE state, we must kick it. */ if ((self->provider.access_type == ACCESS_PEER) && - (self->client.state == IRLAN_IDLE)) { + (self->client.state == IRLAN_IDLE)) + { irlan_client_wakeup(self, self->saddr, self->daddr); } } @@ -231,11 +173,6 @@ /* Just accept */ irttp_connect_response(tsap, IRLAN_MTU, NULL); - - /* Check if network device has been registered */ - if (!self->netdev_registered) - irlan_register_netdev(self); - } void irlan_provider_disconnect_indication(void *instance, void *sap, diff -urN v2.2.15/linux/net/irda/irlap_event.c linux/net/irda/irlap_event.c --- v2.2.15/linux/net/irda/irlap_event.c Wed May 3 17:16:54 2000 +++ linux/net/irda/irlap_event.c Wed Jun 7 14:26:44 2000 @@ -6,11 +6,11 @@ * Status: Experimental. * Author: Dag Brattli * Created at: Sat Aug 16 00:59:29 1997 - * Modified at: Mon Jan 17 09:07:36 2000 + * Modified at: Fri Apr 21 11:26:48 2000 * Modified by: Dag Brattli * * Copyright (c) 1998-2000 Dag Brattli , - * Thomas Davis + * Copyright (c) 1998 Thomas Davis * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -374,6 +374,7 @@ self->s = info->s; irlap_send_discovery_xid_frame(self, info->S, info->s, TRUE, info->discovery); + self->frame_sent = FALSE; self->s++; irlap_start_slot_timer(self, self->slot_timeout); @@ -384,12 +385,8 @@ /* Assert that this is not the final slot */ if (info->s <= info->S) { - /* self->daddr = info->daddr; */ self->slot = irlap_generate_rand_time_slot(info->S, info->s); - IRDA_DEBUG(4, "XID_CMD: S=%d, s=%d, slot %d\n", info->S, - info->s, self->slot); - if (self->slot == info->s) { discovery_rsp = irlmp_get_discovery_response(); discovery_rsp->daddr = info->daddr; @@ -455,7 +452,6 @@ default: IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n", irlap_event[event]); - if (skb) dev_kfree_skb(skb); @@ -504,6 +500,19 @@ dev_kfree_skb(skb); break; case SLOT_TIMER_EXPIRED: + /* + * Wait a little longer if we detect an incomming frame. This + * is not mentioned in the spec, but is a good thing to do, + * since we want to work even with devices that violate the + * timing requirements. + */ + if (irda_device_is_receiving(self->netdev)) { + IRDA_DEBUG(1, __FUNCTION__ + "(), device is slow to answer, " + "waiting some more!\n"); + irlap_start_slot_timer(self, MSECS_TO_JIFFIES(10)); + return ret; + } if (self->s < self->S) { irlap_send_discovery_xid_frame(self, self->S, self->s, TRUE, @@ -535,7 +544,6 @@ default: IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n", irlap_event[event]); - if (skb) dev_kfree_skb(skb); @@ -571,9 +579,8 @@ break; case RECV_DISCOVERY_XID_CMD: ASSERT(info != NULL, return -1;); - /* - * Last frame? - */ + + /* Last frame? */ if (info->s == 0xff) { del_timer(&self->query_timer); @@ -864,7 +871,7 @@ * that is not possible since we must be sure * that we poll the other side. Since we have * used up our time, the poll timer should - * trigger anyway now,so we just wait for it + * trigger anyway now, so we just wait for it * DB */ return -EPROTO; @@ -1296,7 +1303,7 @@ * of receiving a frame (page 45, IrLAP). Check that * we only do this once for each frame. */ - if (irda_device_is_receiving(self->netdev) && + if (irda_device_is_receiving(self->netdev) && !self->add_wait) { IRDA_DEBUG(1, "FINAL_TIMER_EXPIRED when receiving a " @@ -1423,7 +1430,7 @@ irlap_next_state( self, LAP_PCLOSE); break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %s\n", + IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n", irlap_event[event]); if (skb) dev_kfree_skb(skb); @@ -1951,8 +1958,8 @@ dev_kfree_skb(skb); break; case RECV_TEST_CMD: - /* Remove test frame header */ - skb_pull(skb, sizeof(struct test_frame)); + /* Remove test frame header (only LAP header in NRM) */ + skb_pull(skb, LAP_ADDR_HEADER + LAP_CTRL_HEADER); irlap_wait_min_turn_around(self, &self->qos_tx); irlap_start_wd_timer(self, self->wd_timeout); diff -urN v2.2.15/linux/net/irda/irlap_frame.c linux/net/irda/irlap_frame.c --- v2.2.15/linux/net/irda/irlap_frame.c Wed May 3 17:16:54 2000 +++ linux/net/irda/irlap_frame.c Wed Jun 7 14:26:44 2000 @@ -6,7 +6,7 @@ * Status: Stable * Author: Dag Brattli * Created at: Tue Aug 19 10:27:26 1997 - * Modified at: Wed Jan 5 08:59:04 2000 + * Modified at: Thu Apr 13 02:40:49 2000 * Modified by: Dag Brattli * * Copyright (c) 1998-2000 Dag Brattli , @@ -1212,7 +1212,7 @@ struct test_frame *frame; __u8 *info; - skb = dev_alloc_skb(32); + skb = dev_alloc_skb(cmd->len+sizeof(struct test_frame)); if (!skb) return; @@ -1225,10 +1225,10 @@ frame->saddr = cpu_to_le32(self->saddr); frame->daddr = cpu_to_le32(daddr); } else - frame = (struct test_frame *) skb_put(skb, LAP_MAX_HEADER); + frame = (struct test_frame *) skb_put(skb, LAP_ADDR_HEADER + LAP_CTRL_HEADER); frame->caddr = caddr; - frame->control = TEST_RSP; + frame->control = TEST_RSP | PF_BIT; /* Copy info */ info = skb_put(skb, cmd->len); diff -urN v2.2.15/linux/net/irda/qos.c linux/net/irda/qos.c --- v2.2.15/linux/net/irda/qos.c Wed May 3 17:16:54 2000 +++ linux/net/irda/qos.c Wed Jun 7 14:26:44 2000 @@ -6,7 +6,7 @@ * Status: Stable * Author: Dag Brattli * Created at: Tue Sep 9 00:00:26 1997 - * Modified at: Sun Jan 30 14:29:16 2000 + * Modified at: Fri Apr 14 00:30:04 2000 * Modified by: Dag Brattli * * Copyright (c) 1998-2000 Dag Brattli , @@ -375,7 +375,6 @@ self->qos_tx.baud_rate.bits = final; self->qos_rx.baud_rate.bits = final; } - return 0; } @@ -626,6 +625,7 @@ * * Returns value to index in array, easy! * + */ __u32 index_value(int index, __u32 *array) { diff -urN v2.2.15/linux/net/netsyms.c linux/net/netsyms.c --- v2.2.15/linux/net/netsyms.c Tue Jan 4 10:12:27 2000 +++ linux/net/netsyms.c Wed Jun 7 14:26:44 2000 @@ -79,6 +79,11 @@ #include "../drivers/net/8390.h" #endif +#if defined(CONFIG_HDLC) +#include "../drivers/net/syncppp.h" +#include +#endif + extern int (*rarp_ioctl_hook)(int,void*); #ifdef CONFIG_IPX_MODULE @@ -435,9 +440,19 @@ EXPORT_SYMBOL(fc_freedev); #endif +#ifdef CONFIG_HDLC +EXPORT_SYMBOL(hdlc_netif_rx); +EXPORT_SYMBOL(register_hdlc_device); +EXPORT_SYMBOL(unregister_hdlc_device); +#endif + /* Device callback registration */ EXPORT_SYMBOL(register_netdevice_notifier); EXPORT_SYMBOL(unregister_netdevice_notifier); +#ifdef CONFIG_INET +EXPORT_SYMBOL(register_inetaddr_notifier); +EXPORT_SYMBOL(unregister_inetaddr_notifier); +#endif /* support for loadable net drivers */ #ifdef CONFIG_NET diff -urN v2.2.15/linux/net/unix/af_unix.c linux/net/unix/af_unix.c --- v2.2.15/linux/net/unix/af_unix.c Wed May 3 17:16:54 2000 +++ linux/net/unix/af_unix.c Wed Jun 7 14:26:44 2000 @@ -8,7 +8,7 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Version: $Id: af_unix.c,v 1.76.2.2 1999/08/07 10:56:48 davem Exp $ + * Version: $Id: af_unix.c,v 1.76.2.4 2000/05/27 04:46:44 davem Exp $ * * Fixes: * Linus Torvalds : Assorted bug cures. @@ -43,6 +43,7 @@ * number of socks to 2*max_files and * the number of skb queueable in the * dgram receiver. + * Malcolm Beattie : Set peercred for socketpair * * Known differences from reference BSD that was tested: * @@ -814,6 +815,9 @@ unix_lock(skb); unix_peer(ska)=skb; unix_peer(skb)=ska; + ska->peercred.pid = skb->peercred.pid = current->pid; + ska->peercred.uid = skb->peercred.uid = current->euid; + ska->peercred.gid = skb->peercred.gid = current->egid; if (ska->type != SOCK_DGRAM) { diff -urN v2.2.15/linux/scripts/Configure linux/scripts/Configure --- v2.2.15/linux/scripts/Configure Mon Feb 1 12:03:20 1999 +++ linux/scripts/Configure Wed Jun 7 14:26:44 2000 @@ -143,6 +143,10 @@ # define_bool define value # function define_bool () { + define_tristate $1 $2 +} + +function define_tristate () { case "$2" in "y") echo "$1=y" >>$CONFIG @@ -213,11 +217,11 @@ while :; do readln "$1 ($2) [$defprompt] " "$def" "$old" case "$ans" in - [yY] | [yY]es ) define_bool "$2" "y" + [yY] | [yY]es ) define_tristate "$2" "y" break ;; - [nN] | [nN]o ) define_bool "$2" "n" + [nN] | [nN]o ) define_tristate "$2" "n" break ;; - [mM] ) define_bool "$2" "m" + [mM] ) define_tristate "$2" "m" break ;; * ) help "$2" ;; @@ -246,7 +250,7 @@ while [ $# -gt 0 ]; do case "$1" in n) - define_bool "$var" "n" + define_tristate "$var" "n" return ;; m) @@ -268,9 +272,9 @@ while :; do readln "$ques ($var) [$defprompt] " "$def" "$old" case "$ans" in - [nN] | [nN]o ) define_bool "$var" "n" + [nN] | [nN]o ) define_tristate "$var" "n" break ;; - [mM] ) define_bool "$var" "m" + [mM] ) define_tristate "$var" "m" break ;; [yY] | [yY]es ) echo echo " This answer is not allowed, because it is not consistent with" @@ -290,6 +294,43 @@ fi } +function dep_bool () { + ques=$1 + var=$2 + shift 2 + while [ $# -gt 0 ]; do + case "$1" in + m | n) + define_bool "$var" "n" + return + ;; + esac + shift + done + + bool "$ques" "$var" +} + +function dep_mbool () { + ques=$1 + var=$2 + shift 2 + while [ $# -gt 0 ]; do + case "$1" in + n) + define_bool "$var" "n" + return + ;; + m) + eval "$var=y" + ;; + esac + shift + done + + bool "$ques" "$var" +} + # # define_int sets the value of a integer argument # @@ -368,9 +409,9 @@ # define_string define value # function define_string () { - echo "$1="'"'$2'"' >>$CONFIG - echo "#define $1 "'"'$2'"' >>$CONFIG_H - eval "$1=$2" + echo "$1=\"$2\"" >>$CONFIG + echo "#define $1 \"$2\"" >>$CONFIG_H + eval "$1=\"$2\"" } # diff -urN v2.2.15/linux/scripts/Menuconfig linux/scripts/Menuconfig --- v2.2.15/linux/scripts/Menuconfig Wed May 3 17:16:54 2000 +++ linux/scripts/Menuconfig Wed Jun 7 14:26:44 2000 @@ -68,6 +68,12 @@ # # 24 January 1999, Michael Elizabeth Chastain, # - Improve the exit message (Jeff Ronne). +# +# 06 July 1999, Andrzej M. Krzysztofowicz, +# - Support for multiple conditions in dep_tristate(). +# - Implemented new functions: define_tristate(), define_int(), define_hex(), +# define_string(), dep_bool(). +# # @@ -132,6 +138,22 @@ eval $1=$2 } +function define_tristate () { + eval $1=$2 +} + +function define_hex () { + eval $1=$2 +} + +function define_int () { + eval $1=$2 +} + +function define_string () { + eval $1="$2" +} + # # Create a boolean (Yes/No) function for our current menu # which calls our local bool function. @@ -188,13 +210,72 @@ # else in the kernel. # function dep_tristate () { - if [ "$3" = "y" ]; then - tristate "$1" "$2" - else if [ "$3" = "m" ]; then - mod_bool "$1" "$2" + ques="$1" + var="$2" + dep=y + shift 2 + while [ $# -gt 0 ]; do + if [ "$1" = y ]; then + shift + elif [ "$1" = m ]; then + dep=m + shift + else + dep=n + shift $# + fi + done + if [ "$dep" = y ]; then + tristate "$ques" "$var" + elif [ "$dep" = m ]; then + mod_bool "$ques" "$var" else - define_bool "$2" n - fi; fi + define_tristate "$var" n + fi +} + +# +# Same as above, but now only Y and N are allowed as dependency +# (i.e. third and next arguments). +# +function dep_bool () { + ques="$1" + var="$2" + dep=y + shift 2 + while [ $# -gt 0 ]; do + if [ "$1" = y ]; then + shift + else + dep=n + shift $# + fi + done + if [ "$dep" = y ]; then + bool "$ques" "$var" + else + define_bool "$var" n + fi +} + +function dep_mbool () { + ques="$1" + var="$2" + dep=y + shift 2 + while [ $# -gt 0 ]; do + if [ "$1" = y -o "$1" = m ]; then + shift + else + dep=n + shift $# + fi + done + if [ "$dep" = y ]; then + bool "$ques" "$var" + else + define_bool "$var" n + fi } # @@ -988,13 +1069,51 @@ function tristate () { set_x_info "$2" "n" - eval define_bool "$2" "$x" + eval define_tristate "$2" "$x" } function dep_tristate () { set_x_info "$2" "n" - if [ "$3" = "m" -a "$x" = "y" ]; then x="m"; fi - define_bool "$2" "$x" + var="$2" + shift 2 + while [ $# -gt 0 ]; do + if [ "$1" = y ]; then + shift + elif [ "$1" = m -a "$x" != n ]; then + x=m; shift + else + x=n; shift $# + fi + done + define_tristate "$var" "$x" + } + + function dep_bool () { + set_x_info "$2" "n" + var="$2" + shift 2 + while [ $# -gt 0 ]; do + if [ "$1" = y ]; then + shift + else + x=n; shift $# + fi + done + define_bool "$var" "$x" + } + + function dep_mbool () { + set_x_info "$2" "n" + var="$2" + shift 2 + while [ $# -gt 0 ]; do + if [ "$1" = y -o "$1" = m ]; then + shift + else + x=n; shift $# + fi + done + define_bool "$var" "$x" } function int () { @@ -1015,7 +1134,29 @@ echo "#define $2 \"$x\"" >>$CONFIG_H } + function define_hex () { + eval $1="$2" + echo "$1=$2" >>$CONFIG + echo "#define $1 0x${2##*[x,X]}" >>$CONFIG_H + } + + function define_int () { + eval $1="$2" + echo "$1=$2" >>$CONFIG + echo "#define $1 ($2)" >>$CONFIG_H + } + + function define_string () { + eval $1="$2" + echo "$1=\"$2\"" >>$CONFIG + echo "#define $1 \"$2\"" >>$CONFIG_H + } + function define_bool () { + define_tristate "$1" "$2" + } + + function define_tristate () { eval $1="$2" case "$2" in diff -urN v2.2.15/linux/scripts/header.tk linux/scripts/header.tk --- v2.2.15/linux/scripts/header.tk Mon Feb 1 12:03:20 1999 +++ linux/scripts/header.tk Wed Jun 7 14:26:44 2000 @@ -32,7 +32,7 @@ proc vfix { var } { global $var if [ catch {eval concat $$var} ] { - set $var 0 + set $var 4 } } @@ -42,6 +42,7 @@ set CONSTANT_Y 1 set CONSTANT_M 2 set CONSTANT_N 0 +set CONSTANT_E 4 # # Create a "reference" object to steal colors from. @@ -67,9 +68,11 @@ proc menu_option { w menu_num text } { global menus_per_column - if { $menu_num <= $menus_per_column } then { + global processed_top_level + set processed_top_level [expr $processed_top_level + 1] + if { $processed_top_level <= $menus_per_column } then { set myframe left - } elseif { $menu_num <= [expr 2 * $menus_per_column] } then { + } elseif { $processed_top_level <= [expr 2 * $menus_per_column] } then { set myframe middle } else { set myframe right @@ -211,7 +214,7 @@ } close $file1 update_choices - update_mainmenu .rdupd + update_mainmenu } proc write_comment { file1 file2 text } { puts $file1 "" @@ -223,17 +226,51 @@ puts $file2 " */" } -proc write_tristate { file1 file2 varname variable dep } { - if { $variable == 0 } \ - then { puts $file1 "# $varname is not set"; \ - puts $file2 "#undef $varname"} \ - elseif { $variable == 2 || ($dep == 2 && $variable == 1) } \ +proc effective_dep { deplist } { + global CONFIG_MODULES + set depend 1 + foreach i $deplist { + if {$i == 0} then {set depend 0} + if {$i == 2 && $depend == 1} then {set depend 2} + } + if {$depend == 2 && $CONFIG_MODULES == 0} then {set depend 0} + return $depend +} + +proc sync_tristate { var dep } { + global CONFIG_MODULES + if {$dep == 0 && ($var == 1 || $var == 2)} then { + set var 0 + } elseif {$dep == 2 && $var == 1} then { + set var 2 + } elseif {$var == 2 && $CONFIG_MODULES == 0} then { + if {$dep == 1} then {set var 1} else {set var 0} + } + return $var +} + +proc sync_bool { var dep modset } { + set var [sync_tristate $var $dep] + if {$dep == 2 && $var == 2} then { + set var $modset + } + return $var +} + +proc write_tristate { file1 file2 varname variable deplist modset } { + set variable [sync_tristate $variable [effective_dep $deplist]] + if { $variable == 2 } \ + then { set variable $modset } + if { $variable == 1 } \ + then { puts $file1 "$varname=y"; \ + puts $file2 "#define $varname 1" } \ + elseif { $variable == 2 } \ then { puts $file1 "$varname=m"; \ puts $file2 "#undef $varname"; \ puts $file2 "#define ${varname}_MODULE 1" } \ - elseif { $variable == 1 && $dep != 2 } \ - then { puts $file1 "$varname=y"; \ - puts $file2 "#define $varname 1" } \ + elseif { $variable == 0 } \ + then { puts $file1 "# $varname is not set"; \ + puts $file2 "#undef $varname"} \ else { \ puts stdout "ERROR - Attempting to write value for unconfigured variable ($varname)." \ } @@ -245,7 +282,7 @@ puts $file2 "#undef $varname"} \ else { puts $file1 "$varname=$variable"; \ - puts $file2 "#define $varname $variable"; \ + puts $file2 "#define $varname ($variable)"; \ } } @@ -255,7 +292,8 @@ puts $file2 "#undef $varname"} \ else { puts $file1 "$varname=$variable"; \ - puts $file2 "#define $varname 0x$variable"; \ + puts -nonewline $file2 "#define $varname 0x"; \ + puts $file2 [exec echo $variable | sed s/^0\[xX\]//]; \ } } @@ -274,7 +312,7 @@ $w.x$line.l configure -activefore [cget $w.x$line.l -fg] \ -activeback [cget $w.x$line.l -bg] button $w.x$line.help -text "Help" -relief raised \ - -command "dohelp .dohelp $helpidx" + -command "dohelp .dohelp $helpidx .menu$mnum" pack $w.x$line.help -side right -fill y pack $w.x$line.l -side right -fill both -expand on } @@ -282,28 +320,28 @@ proc toggle_switch2 {w mnum line text variable} { frame $w.x$line -relief sunken radiobutton $w.x$line.y -text "y" -variable $variable -value 1 \ - -relief groove -width 2 -command "update_menu$mnum .menu$mnum" + -relief groove -width 2 -command "update_active" radiobutton $w.x$line.m -text "-" -variable $variable -value 2 \ - -relief groove -width 2 -command "update_menu$mnum .menu$mnum" + -relief groove -width 2 -command "update_active" radiobutton $w.x$line.n -text "n" -variable $variable -value 0 \ - -relief groove -width 2 -command "update_menu$mnum .menu$mnum" - + -relief groove -width 2 -command "update_active" + option_name $w $mnum $line $text $variable - + pack $w.x$line.n $w.x$line.m $w.x$line.y -side right -fill y } proc toggle_switch3 {w mnum line text variable} { frame $w.x$line -relief sunken radiobutton $w.x$line.y -text "y" -variable $variable -value 1 \ - -relief groove -width 2 -command "update_menu$mnum .menu$mnum" + -relief groove -width 2 -command "update_active" radiobutton $w.x$line.m -text "m" -variable $variable -value 2 \ - -relief groove -width 2 -command "update_menu$mnum .menu$mnum" + -relief groove -width 2 -command "update_active" radiobutton $w.x$line.n -text "n" -variable $variable -value 0 \ - -relief groove -width 2 -command "update_menu$mnum .menu$mnum" - + -relief groove -width 2 -command "update_active" + option_name $w $mnum $line $text $variable - + global CONFIG_MODULES if {($CONFIG_MODULES == 0)} then { $w.x$line.m configure -state disabled @@ -322,10 +360,14 @@ pack $w.x$line -anchor w -fill both -expand on } -proc dep_tristate {w mnum line text variable depend } { +proc dep_tristate {w mnum line text variable } { tristate $w $mnum $line $text $variable } +proc dep_bool {w mnum line text variable } { + bool $w $mnum $line $text $variable +} + proc int { w mnum line text variable } { frame $w.x$line entry $w.x$line.x -width 18 -relief sunken -borderwidth 2 \ @@ -358,11 +400,48 @@ pack $w.x$line -anchor w -fill both -expand on } -proc comment {w line text } { -#nothing done for comments now. +proc menusplit {w m n} { + if { $n > 2 } then { + update idletasks + set menuoptsize [expr [$m yposition 2] - [$m yposition 1]] + set maxsize [winfo screenheight $w] + set splitpoint [expr $maxsize * 4 / 5 / $menuoptsize - 1] + for {set i [expr $splitpoint + 1]} {$i <= $n} {incr i $splitpoint} { + $m entryconfigure $i -columnbreak 1 + } + } +} + +proc menutitle {text menu w} { + wm title $w "$text" +} + +proc submenu { w mnum line text subnum } { + frame $w.x$line + button $w.x$line.l -text "" -width 15 -relief groove + $w.x$line.l configure -activefore [cget $w.x$line.l -fg] \ + -activeback [cget $w.x$line.l -bg] -state disabled + button $w.x$line.m -text "$text" -relief raised -anchor w \ + -command "catch {destroy .menu$subnum}; menu$subnum .menu$subnum \"$text\"" + pack $w.x$line.l -side left -fill both + pack $w.x$line.m -anchor w -side right -fill both -expand on + pack $w.x$line -anchor w -fill both -expand on +} + +proc comment {w mnum line text } { + frame $w.x$line + button $w.x$line.l -text "" -width 15 -relief groove + $w.x$line.l configure -activefore [cget $w.x$line.l -fg] \ + -activeback [cget $w.x$line.l -bg] -state disabled + button $w.x$line.m -text "$text" -relief groove -anchor w + $w.x$line.m configure -activefore [cget $w.x$line.m -fg] \ + -activeback [cget $w.x$line.m -bg] + pack $w.x$line.l -side left -fill both + pack $w.x$line.m -anchor w -side right -fill both -expand on + pack $w.x$line -anchor w -fill both -expand on } -proc dohelp {w var } { +proc dohelp {w var parent} { catch {destroy $w} toplevel $w -class Dialog @@ -388,45 +467,73 @@ " Documentation/Configure.help] set found [expr [string length "$message"] > 0] } - + frame $w.f1 + pack $w.f1 -fill both -expand on + + # Do the OK button + # + set oldFocus [focus] + frame $w.f2 + button $w.f2.ok -text "OK" \ + -width 10 -command "destroy $w; catch {focus $oldFocus}" + pack $w.f2.ok -side bottom -pady 6 -anchor n + pack $w.f2 -side bottom -padx 10 -anchor s + + scrollbar $w.f1.vscroll -command "$w.f1.canvas yview" + pack $w.f1.vscroll -side right -fill y + + canvas $w.f1.canvas -relief flat -borderwidth 0 \ + -yscrollcommand "$w.f1.vscroll set" + frame $w.f1.f + pack $w.f1.canvas -side right -fill y -expand on if { $found == 0 } then { if { $filefound == 0 } then { - message $w.f1.m -width 750 -aspect 300 -relief flat -text \ + message $w.f1.f.m -width 750 -aspect 300 -relief flat -text \ "No help available - unable to open file Documentation/Configure.help. This file should have come with your kernel." } else { - message $w.f1.m -width 400 -aspect 300 -relief flat -text \ + message $w.f1.f.m -width 400 -aspect 300 -relief flat -text \ "No help available for $var" } label $w.f1.bm -bitmap error wm title $w "RTFM" } else { - text $w.f1.m -width 73 -relief flat -wrap word - $w.f1.m insert 0.0 $message - $w.f1.m conf -state disabled -height [$w.f1.m index end] + text $w.f1.f.m -width 73 -relief flat -wrap word + $w.f1.f.m insert 0.0 $message + $w.f1.f.m conf -state disabled -height [$w.f1.f.m index end] label $w.f1.bm -bitmap info wm title $w "Configuration help" } - pack $w.f1.bm $w.f1.m -side left -padx 10 - pack $w.f1 -side top - set oldFocus [focus] - - # Do the OK button - # - frame $w.f2 - button $w.f2.ok -text "OK" \ - -width 10 -command "destroy $w; focus $oldFocus" - pack $w.f2.ok -side bottom -pady 6 -anchor n - pack $w.f2 -side bottom -padx 10 -anchor s + pack $w.f1.f.m -side left + pack $w.f1.bm $w.f1.f -side left -padx 10 - # Finish off the window - # focus $w - global winx; global winy - set winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30] + set winx [expr [winfo x $parent]+20] + set winy [expr [winfo y $parent]+20] wm geometry $w +$winx+$winy + set sizok [expr [winfo reqheight $w.f2.ok] + 12] + set maxy [expr [winfo screenheight .] * 3 / 4] + set canvtotal [winfo reqheight $w.f1.f.m] + if [expr $sizok + $canvtotal < $maxy] { + set sizy $canvtotal + } else { + set sizy [expr $maxy - $sizok] + } + $w.f1.canvas configure -height $sizy -width [winfo reqwidth $w.f1.f.m] \ + -scrollregion "0 0 [winfo reqwidth $w.f1.f.m] \ + [winfo reqheight $w.f1.f.m]" + $w.f1.canvas create window 0 0 -anchor nw -window $w.f1.f + update idletasks + + set maxy [winfo screenheight .] + if [expr $sizok + $canvtotal < $maxy] { + set sizy [expr $sizok + $canvtotal] + } else { + set sizy $maxy + } + wm maxsize $w [winfo width $w] $sizy } proc wrapup {w } { @@ -458,6 +565,55 @@ } +proc unregister_active {num} { + global active_menus + set index [lsearch -exact $active_menus $num] + if {$index != -1} then {set active_menus [lreplace $active_menus $index $index]} +} + +proc update_active {} { + global active_menus total_menus + set max 0 + if {[llength $active_menus] > 0} then { + set max [lindex $active_menus end] + update_define [toplevel_menu [lindex $active_menus 0]] $max 0 + } + foreach i $active_menus { + if {[winfo exists .menu$i] == 0} then { + unregister_active $i + } else { + update_menu$i + } + } + update_define [expr $max + 1] $total_menus 1 + update_mainmenu +} + +proc configure_entry {w option items} { + foreach i $items { + $w.$i configure -state $option + } +} + +proc validate_int {name val default} { + if {([exec echo $val | sed s/^-//g | tr -d \[:digit:\] ] != "")} then { + global $name; set $name $default + } +} + +proc validate_hex {name val default} { + if {([exec echo $val | tr -d \[:xdigit:\] ] != "")} then { + global $name; set $name $default + } +} + +proc update_define {first last allow_update} { + for {set i $first} {$i <= $last} {incr i} { + update_define_menu$i + if {$allow_update == 1} then update + } +} + # # Next set up the particulars for the top level menu, and define a few # buttons which we will stick down at the bottom. @@ -468,3 +624,5 @@ frame .f0.middle frame .f0.right +set active_menus [list] +set processed_top_level 0 diff -urN v2.2.15/linux/scripts/mkdep.c linux/scripts/mkdep.c --- v2.2.15/linux/scripts/mkdep.c Mon Aug 9 12:04:41 1999 +++ linux/scripts/mkdep.c Wed Jun 7 14:26:44 2000 @@ -8,9 +8,20 @@ * I make simple dependency lines for #include <*.h> and #include "*.h". * I also find instances of CONFIG_FOO and generate dependencies * like include/config/foo.h. + * + * 1 August 1999, Michael Elizabeth Chastain, + * - Keith Owens reported a bug in smart config processing. There used + * to be an optimization for "#define CONFIG_FOO ... #ifdef CONFIG_FOO", + * so that the file would not depend on CONFIG_FOO because the file defines + * this symbol itself. But this optimization is bogus! Consider this code: + * "#if 0 \n #define CONFIG_FOO \n #endif ... #ifdef CONFIG_FOO". Here + * the definition is inactivated, but I still used it. It turns out this + * actually happens a few times in the kernel source. The simple way to + * fix this problem is to remove this particular optimization. */ #include +#include #include #include #include @@ -66,7 +77,7 @@ while (len_config + len > size_config) { str_config = realloc(str_config, size_config *= 2); if (str_config == NULL) - { perror("malloc"); exit(1); } + { perror("malloc config"); exit(1); } } } @@ -93,22 +104,11 @@ /* * Add a new value to the configuration string. */ -void define_config(int convert, const char * name, int len) +void define_config(const char * name, int len) { grow_config(len + 1); memcpy(str_config+len_config, name, len); - - if (convert) { - int i; - for (i = 0; i < len; i++) { - char c = str_config[len_config+i]; - if (isupper(c)) c = tolower(c); - if (c == '_') c = '/'; - str_config[len_config+i] = c; - } - } - len_config += len; str_config[len_config++] = '\n'; } @@ -121,7 +121,56 @@ void clear_config(void) { len_config = 0; - define_config(0, "", 0); + define_config("", 0); +} + + + +/* + * This records all the precious .h filenames. No need for a hash, + * it's a long string of values enclosed in tab and newline. + */ +char * str_precious = NULL; +int size_precious = 0; +int len_precious = 0; + + + +/* + * Grow the precious string to a desired length. + * Usually the first growth is plenty. + */ +void grow_precious(int len) +{ + if (str_precious == NULL) { + len_precious = 0; + size_precious = 4096; + str_precious = malloc(4096); + if (str_precious == NULL) + { perror("malloc precious"); exit(1); } + } + + while (len_precious + len > size_precious) { + str_precious = realloc(str_precious, size_precious *= 2); + if (str_precious == NULL) + { perror("malloc"); exit(1); } + } +} + + + +/* + * Add a new value to the precious string. + */ +void define_precious(const char * filename) +{ + int len = strlen(filename); + grow_precious(len + 4); + *(str_precious+len_precious++) = '\t'; + memcpy(str_precious+len_precious, filename, len); + len_precious += len; + memcpy(str_precious+len_precious, " \\\n", 3); + len_precious += 3; } @@ -137,7 +186,7 @@ return; if (len >= 7 && !memcmp(name, "config/", 7)) - define_config(0, name+7, len-7-2); + define_config(name+7, len-7-2); memcpy(path->buffer+path->len, name, len); path->buffer[path->len+len] = '\0'; @@ -176,7 +225,7 @@ if (is_defined_config(pc, len)) return; - define_config(0, pc, len); + define_config(pc, len); if (!hasdep) { hasdep = 1; @@ -193,7 +242,8 @@ * Thus, there is one memory access per sizeof(unsigned long) characters. */ -#if defined(__alpha__) || defined(__i386__) || defined(__MIPSEL__) || defined(__arm__) +#if defined(__alpha__) || defined(__i386__) || defined(__ia64__) || defined(__MIPSEL__) \ + || defined(__arm__) #define LE_MACHINE #endif @@ -360,7 +410,13 @@ GETNEXT NOTCASE('f', __start); goto pound_define_undef; -/* #\s*(define|undef)\s*CONFIG_(\w*) */ +/* + * #\s*(define|undef)\s*CONFIG_(\w*) + * + * this does not define the word, because it could be inside another + * conditional (#if 0). But I do parse the word so that this instance + * does not count as a use. -- mec + */ pound_define_undef: GETNEXT CASE(' ', pound_define_undef); @@ -379,7 +435,6 @@ GETNEXT if (isalnum(current) || current == '_') goto pound_define_undef_CONFIG_word; - define_config(1, map_dot, next - map_dot - 1); goto __start; /* \ + * - kvariables removed; all variables are stored in a single table now + * - some elimination of options non-valid for current architecture + * implemented. + * - negation (!) eliminated from conditions + * * TO DO: * - xconfig is at the end of its life cycle. Contact if * you are interested in working on the replacement. @@ -28,73 +34,89 @@ /* - * Transform op_variable to op_kvariable. - * - * This works, but it's gross, speed-wise. It would benefit greatly - * from a simple hash table that maps names to cfg. - * - * Note well: this is actually better than the loop structure xconfig - * has been staggering along with for three years, which performs - * this whole procedure inside *another* loop on active conditionals. + * Mark variables which are defined anywhere. */ -void transform_to_kvariable( struct kconfig * scfg ) +static void mark_variables( struct kconfig * scfg ) { struct kconfig * cfg; + int i; + for ( i = 1; i <= max_varnum; i++ ) + vartable[i].defined = 0; for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { - struct condition * cond; - - for ( cond = cfg->cond; cond != NULL; cond = cond->next ) + if ( cfg->token == token_bool + || cfg->token == token_choice_item + || cfg->token == token_define_bool + || cfg->token == token_define_hex + || cfg->token == token_define_int + || cfg->token == token_define_string + || cfg->token == token_define_tristate + || cfg->token == token_dep_bool + || cfg->token == token_dep_mbool + || cfg->token == token_dep_tristate + || cfg->token == token_hex + || cfg->token == token_int + || cfg->token == token_string + || cfg->token == token_tristate + || cfg->token == token_unset ) { - if ( cond->op == op_variable ) + if ( cfg->nameindex > 0 ) /* paranoid */ { - /* Here's where it gets DISGUSTING. */ - struct kconfig * cfg1; + vartable[cfg->nameindex].defined = 1; + } + } + } +} + + + +static void free_cond( struct condition *cond ) +{ + struct condition *tmp, *tmp1; + for ( tmp = cond; tmp; tmp = tmp1 ) + { + tmp1 = tmp->next; + free( (void*)tmp ); + } +} + - for ( cfg1 = scfg; cfg1 != NULL; cfg1 = cfg1->next ) + +/* + * Remove the bang operator from a condition to avoid priority problems. + * "!" has different priorities as "test" command argument and in + * a tk script. + */ +static struct condition * remove_bang( struct condition * condition ) +{ + struct condition * conda, * condb, * prev = NULL; + + for ( conda = condition; conda; conda = conda->next ) + { + if ( conda->op == op_bang && conda->next && + ( condb = conda->next->next ) ) + { + if ( condb->op == op_eq || condb->op == op_neq ) + { + condb->op = (condb->op == op_eq) ? op_neq : op_eq; + conda->op = op_nuked; + if ( prev ) { - if ( cfg1->token == token_bool - || cfg1->token == token_choice_item - || cfg1->token == token_dep_tristate - || cfg1->token == token_hex - || cfg1->token == token_int - || cfg1->token == token_string - || cfg1->token == token_tristate ) - { - if ( strcmp( cond->str, cfg1->optionname ) == 0 ) - { - cond->op = op_kvariable; - cond->str = NULL; - cond->cfg = cfg1; - break; - } - } + prev->next = conda->next; } - } - -#if 0 - /* - * Maybe someday this will be useful, but right now it - * gives a lot of false positives on files like - * drivers/video/Config.in that are meant for more - * than one architecture. Turn it on if you want to play - * with it though; it does work. -- mec - */ - if ( cond->op == op_variable ) - { - if ( strcmp( cond->str, "ARCH" ) != 0 - && strcmp( cond->str, "CONSTANT_Y" ) != 0 - && strcmp( cond->str, "CONSTANT_M" ) != 0 - && strcmp( cond->str, "CONSTANT_N" ) != 0 ) + else { - fprintf( stderr, "warning: $%s used but not defined\n", - cond->str ); + condition = conda->next; } + conda->next = NULL; + free_cond( conda ); + conda = condb; } -#endif } + prev = conda; } + return condition; } @@ -103,27 +125,65 @@ * Make a new condition chain by joining the current condition stack with * the "&&" operator for glue. */ -struct condition * join_condition_stack( struct condition * conditions [], +static struct condition * join_condition_stack( struct condition * conditions [], int depth ) { struct condition * cond_list; struct condition * cond_last; - int i; + int i, is_first = 1; cond_list = cond_last = NULL; + + for ( i = 0; i < depth; i++ ) + { + if ( conditions[i]->op == op_false ) + { + struct condition * cnew; + + /* It is always false condition */ + cnew = malloc( sizeof(*cnew) ); + memset( cnew, 0, sizeof(*cnew) ); + cnew->op = op_false; + cond_list = cond_last = cnew; + goto join_done; + } + } for ( i = 0; i < depth; i++ ) { struct condition * cond; struct condition * cnew; + int add_paren; + + /* omit always true conditions */ + if ( conditions[i]->op == op_true ) + continue; + + /* if i have another condition, add an '&&' operator */ + if ( !is_first ) + { + cnew = malloc( sizeof(*cnew) ); + memset( cnew, 0, sizeof(*cnew) ); + cnew->op = op_and; + cond_last->next = cnew; + cond_last = cnew; + } - /* add a '(' */ - cnew = malloc( sizeof(*cnew) ); - memset( cnew, 0, sizeof(*cnew) ); - cnew->op = op_lparen; - if ( cond_last == NULL ) - { cond_list = cond_last = cnew; } + if ( conditions[i]->op != op_lparen ) + { + /* add a '(' */ + add_paren = 1; + cnew = malloc( sizeof(*cnew) ); + memset( cnew, 0, sizeof(*cnew) ); + cnew->op = op_lparen; + if ( cond_last == NULL ) + { cond_list = cond_last = cnew; } + else + { cond_last->next = cnew; cond_last = cnew; } + } else - { cond_last->next = cnew; cond_last = cnew; } + { + add_paren = 0; + } /* duplicate the chain */ for ( cond = conditions [i]; cond != NULL; cond = cond->next ) @@ -132,27 +192,23 @@ cnew->next = NULL; cnew->op = cond->op; cnew->str = cond->str ? strdup( cond->str ) : NULL; - cnew->cfg = cond->cfg; - cond_last->next = cnew; - cond_last = cnew; + cnew->nameindex = cond->nameindex; + if ( cond_last == NULL ) + { cond_list = cond_last = cnew; } + else + { cond_last->next = cnew; cond_last = cnew; } } - /* add a ')' */ - cnew = malloc( sizeof(*cnew) ); - memset( cnew, 0, sizeof(*cnew) ); - cnew->op = op_rparen; - cond_last->next = cnew; - cond_last = cnew; - - /* if i have another condition, add an '&&' operator */ - if ( i < depth - 1 ) + if ( add_paren ) { + /* add a ')' */ cnew = malloc( sizeof(*cnew) ); memset( cnew, 0, sizeof(*cnew) ); - cnew->op = op_and; + cnew->op = op_rparen; cond_last->next = cnew; cond_last = cnew; } + is_first = 0; } /* @@ -171,7 +227,7 @@ cond1e = cond1d->next; if ( cond1e == NULL ) break; cond1f = cond1e->next; if ( cond1f == NULL ) break; - if ( cond1b->op == op_kvariable + if ( cond1b->op == op_variable && ( cond1c->op == op_eq || cond1c->op == op_neq ) && cond1d->op == op_constant && cond1e->op == op_rparen ) @@ -189,8 +245,8 @@ cond2f = cond2e->next; /* look for match */ - if ( cond2b->op == op_kvariable - && cond2b->cfg == cond1b->cfg + if ( cond2b->op == op_variable + && cond2b->nameindex == cond1b->nameindex && cond2c->op == cond1c->op && cond2d->op == op_constant && strcmp( cond2d->str, cond1d->str ) == 0 @@ -219,64 +275,159 @@ } } +join_done: return cond_list; } +static char * current_arch = NULL; + /* - * This is the main transformation function. + * Eliminating conditions with ARCH = . */ -void fix_conditionals( struct kconfig * scfg ) +static struct condition *eliminate_other_arch( struct condition *list ) { - struct kconfig * cfg; - - /* - * Transform op_variable to op_kvariable. - */ - transform_to_kvariable( scfg ); - - /* - * Transform conditions that use variables from "choice" statements. - * Choice values appear to the user as a collection of booleans, and the - * script can test the individual booleans. But internally, all I have is - * the N-way value of an unnamed temporary for the whole statement. So I - * have to tranform '"$CONFIG_M386" != "y"' - * into '"$tmpvar_N" != "CONFIG_M386"'. - */ - for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) + struct condition *cond1a = list, *cond1b = NULL, *cond1c = NULL, *cond1d = NULL; + if ( current_arch == NULL ) + current_arch = getenv( "ARCH" ); + if ( current_arch == NULL ) { - struct condition * cond; - - for ( cond = cfg->cond; cond != NULL; cond = cond->next ) + fprintf( stderr, "error: ARCH undefined\n" ); + exit( 1 ); + } + if ( cond1a->op == op_variable + && ! strcmp( vartable[cond1a->nameindex].name, "ARCH" ) ) + { + cond1b = cond1a->next; if ( cond1b == NULL ) goto done; + cond1c = cond1b->next; if ( cond1c == NULL ) goto done; + cond1d = cond1c->next; + if ( cond1c->op == op_constant && cond1d == NULL ) { - if ( cond->op == op_kvariable && cond->cfg->token == token_choice_item ) + if ( (cond1b->op == op_eq && strcmp( cond1c->str, current_arch )) + || (cond1b->op == op_neq && ! strcmp( cond1c->str, current_arch )) ) { - /* - * Look two more tokens down for the comparison token. - * It has to be "y" for this trick to work. - * - * If you get this error, don't even think about relaxing the - * strcmp test. You will produce incorrect TK code. Instead, - * look for the place in your Config.in script where you are - * comparing a 'choice' variable to a value other than 'y', - * and rewrite the comparison to be '= "y"' or '!= "y"'. - */ - struct condition * cond2 = cond->next->next; - const char * label; - - if ( strcmp( cond2->str, "y" ) != 0 ) + /* This is for another architecture */ + cond1a->op = op_false; + cond1a->next = NULL; + free_cond( cond1b ); + return cond1a; + } + else if ( (cond1b->op == op_neq && strcmp( cond1c->str, current_arch )) + || (cond1b->op == op_eq && ! strcmp( cond1c->str, current_arch )) ) + { + /* This is for current architecture */ + cond1a->op = op_true; + cond1a->next = NULL; + free_cond( cond1b ); + return cond1a; + } + } + else if ( cond1c->op == op_constant && cond1d->op == op_or ) + { + if ( (cond1b->op == op_eq && strcmp( cond1c->str, current_arch )) + || (cond1b->op == op_neq && ! strcmp( cond1c->str, current_arch )) ) + { + /* This is for another architecture */ + cond1b = cond1d->next; + cond1d->next = NULL; + free_cond( cond1a ); + return eliminate_other_arch( cond1b ); + } + else if ( (cond1b->op == op_neq && strcmp( cond1c->str, current_arch )) + || (cond1b->op == op_eq && ! strcmp( cond1c->str, current_arch )) ) + { + /* This is for current architecture */ + cond1a->op = op_true; + cond1a->next = NULL; + free_cond( cond1b ); + return cond1a; + } + } + else if ( cond1c->op == op_constant && cond1d->op == op_and ) + { + if ( (cond1b->op == op_eq && strcmp( cond1c->str, current_arch )) + || (cond1b->op == op_neq && ! strcmp( cond1c->str, current_arch )) ) + { + /* This is for another architecture */ + int l_par = 0; + + for ( cond1c = cond1d->next; cond1c; cond1c = cond1c->next ) { - fprintf( stderr, "tkparse choked in fix_choice_cond\n" ); - exit( 1 ); + if ( cond1c->op == op_lparen ) + l_par++; + else if ( cond1c->op == op_rparen ) + l_par--; + else if ( cond1c->op == op_or && l_par == 0 ) + /* Expression too complex - don't touch */ + return cond1a; + else if ( l_par < 0 ) + { + fprintf( stderr, "incorrect condition: programming error ?\n" ); + exit( 1 ); + } } + cond1a->op = op_false; + cond1a->next = NULL; + free_cond( cond1b ); + return cond1a; + } + else if ( (cond1b->op == op_neq && strcmp( cond1c->str, current_arch )) + || (cond1b->op == op_eq && ! strcmp( cond1c->str, current_arch )) ) + { + /* This is for current architecture */ + cond1b = cond1d->next; + cond1d->next = NULL; + free_cond( cond1a ); + return eliminate_other_arch( cond1b ); + } + } + } + if ( cond1a->op == op_variable && ! vartable[cond1a->nameindex].defined ) + { + cond1b = cond1a->next; if ( cond1b == NULL ) goto done; + cond1c = cond1b->next; if ( cond1c == NULL ) goto done; + cond1d = cond1c->next; - label = cond->cfg->label; - cond->cfg = cond->cfg->cfg_parent; - cond2->str = strdup( label ); + if ( cond1c->op == op_constant + && ( cond1d == NULL || cond1d->op == op_and ) ) /*???*/ + { + if ( cond1b->op == op_eq && strcmp( cond1c->str, "" ) ) + { + cond1a->op = op_false; + cond1a->next = NULL; + free_cond( cond1b ); + return cond1a; + } + } + else if ( cond1c->op == op_constant && cond1d->op == op_or ) + { + if ( cond1b->op == op_eq && strcmp( cond1c->str, "" ) ) + { + cond1b = cond1d->next; + cond1d->next = NULL; + free_cond( cond1a ); + return eliminate_other_arch( cond1b ); } } } +done: + return list; +} + + + +/* + * This is the main transformation function. + */ +void fix_conditionals( struct kconfig * scfg ) +{ + struct kconfig * cfg; + + /* + * Transform op_variable to op_kvariable. + */ + mark_variables( scfg ); /* * Walk the statement list, maintaining a stack of current conditions. @@ -290,16 +441,19 @@ { struct condition * cond_stack [32]; int depth = 0; + struct kconfig * prev = NULL; for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { + int good = 1; switch ( cfg->token ) { default: break; case token_if: - cond_stack [depth++] = cfg->cond; + cond_stack [depth++] = + remove_bang( eliminate_other_arch( cfg->cond ) ); cfg->cond = NULL; break; @@ -325,6 +479,8 @@ case op_or: cond->op = op_and1; break; case op_neq: cond->op = op_eq; break; case op_eq: cond->op = op_neq; break; + case op_true: cond->op = op_false;break; + case op_false:cond->op = op_true; break; } } } @@ -336,25 +492,111 @@ case token_bool: case token_choice_item: + case token_choice_header: case token_comment: case token_define_bool: + case token_define_hex: + case token_define_int: + case token_define_string: + case token_define_tristate: + case token_endmenu: case token_hex: case token_int: case token_mainmenu_option: case token_string: case token_tristate: + case token_unset: cfg->cond = join_condition_stack( cond_stack, depth ); + if ( cfg->cond && cfg->cond->op == op_false ) + { + good = 0; + if ( prev ) + prev->next = cfg->next; + else + scfg = cfg->next; + } break; + case token_dep_bool: + case token_dep_mbool: case token_dep_tristate: /* * Same as the other simple statements, plus an additional * condition for the dependency. */ - cond_stack [depth] = cfg->cond; - cfg->cond = join_condition_stack( cond_stack, depth+1 ); + if ( cfg->cond ) + { + cond_stack [depth] = eliminate_other_arch( cfg->cond ); + cfg->cond = join_condition_stack( cond_stack, depth+1 ); + } + else + { + cfg->cond = join_condition_stack( cond_stack, depth ); + } + if ( cfg->cond && cfg->cond->op == op_false ) + { + good = 0; + if ( prev ) + prev->next = cfg->next; + else + scfg = cfg->next; + } break; } + if ( good ) + prev = cfg; } } } + + + +#if 0 +void dump_condition( struct condition *list ) +{ + struct condition *tmp; + for ( tmp = list; tmp; tmp = tmp->next ) + { + switch (tmp->op) + { + default: + break; + case op_variable: + printf( " %s", vartable[tmp->nameindex].name ); + break; + case op_constant: + printf( " %s", tmp->str ); + break; + case op_eq: + printf( " =" ); + break; + case op_bang: + printf( " !" ); + break; + case op_neq: + printf( " !=" ); + break; + case op_and: + case op_and1: + printf( " -a" ); + break; + case op_or: + printf( " -o" ); + break; + case op_true: + printf( " TRUE" ); + break; + case op_false: + printf( " FALSE" ); + break; + case op_lparen: + printf( " (" ); + break; + case op_rparen: + printf( " )" ); + break; + } + } + printf( "\n" ); +} +#endif diff -urN v2.2.15/linux/scripts/tkgen.c linux/scripts/tkgen.c --- v2.2.15/linux/scripts/tkgen.c Sun May 2 09:51:16 1999 +++ linux/scripts/tkgen.c Wed Jun 7 14:26:44 2000 @@ -92,33 +92,58 @@ * * 23 January 1999, Michael Elizabeth Chastain * - Remove bug-compatible code. + * + * 07 July 1999, Andrzej M. Krzysztofowicz + * Some bugfixes, including + * - disabling "m" options when CONFIG_MODULES is set to "n" as well as "y" + * option in dep_tristate when dependency is set to "m", + * - deactivating choices which should not be available, + * - basic validation for int and hex introduced if the entered one is not + * valid, + * - updates of all opened menus instead of the active only. I was afraid + * that it would slow down updates, but I don't even see any speed difference + * on my machine. If it slows you can still work with only a single menu + * opened, + * - fixed error when focussing non-existent window (especially Help windows), + * Higher level submenus implemented. */ #include +#include #include +#include #include "tkparse.h" - /* * Total number of menus. */ static int tot_menu_num = 0; - +/* + * Pointers to mainmenu_option and endmenu of each menu. + */ +struct kconfig * menu_first [100]; +struct kconfig * menu_last [100]; /* * Generate portion of wish script for the beginning of a submenu. * The guts get filled in with the various options. */ -static void start_proc( char * label, int menu_num, int flag ) +static void start_proc( char * label, int menu_num, int toplevel ) { - if ( flag ) + if ( toplevel ) printf( "menu_option menu%d %d \"%s\"\n", menu_num, menu_num, label ); printf( "proc menu%d {w title} {\n", menu_num ); - printf( "\tcatch {destroy $w}\n" ); + printf( "\tset oldFocus [focus]\n" ); + if ( menu_first[menu_num]->menu_number != 0 ) + printf( "\tcatch {focus .menu%d}\n", + menu_first[menu_num]->menu_number ); + printf( "\tcatch {destroy $w; unregister_active %d}\n", menu_num ); printf( "\ttoplevel $w -class Dialog\n" ); printf( "\twm withdraw $w\n" ); + printf( "\tglobal active_menus\n" ); + printf( "\tset active_menus [lsort -integer [linsert $active_menus end %d]]\n", menu_num ); printf( "\tmessage $w.m -width 400 -aspect 300 -text \\\n" ); printf( "\t\t\"%s\" -relief raised\n", label ); printf( "\tpack $w.m -pady 10 -side top -padx 10\n" ); @@ -127,16 +152,41 @@ /* * Attach the "Prev", "Next" and "OK" buttons at the end of the window. */ - printf( "\tset oldFocus [focus]\n" ); printf( "\tframe $w.f\n" ); - printf( "\tbutton $w.f.back -text \"Main Menu\" \\\n" ); - printf( "\t\t-width 15 -command \"destroy $w; focus $oldFocus; update_mainmenu $w\"\n" ); + if ( toplevel ) + printf( "\tbutton $w.f.back -text \"Main Menu\" \\\n" ); + else + printf( "\tbutton $w.f.back -text \"OK\" \\\n" ); + printf( "\t\t-width 15 -command \"catch {focus $oldFocus}; destroy $w; unregister_active %d\"\n", + menu_num ); printf( "\tbutton $w.f.next -text \"Next\" \\\n" ); - printf( "\t\t-width 15 -command \" destroy $w; focus $oldFocus; menu%d .menu%d \\\"$title\\\"\"\n", menu_num+1, menu_num+1 ); + printf( "\t\t-width 15 -command \"catch {focus $oldFocus}; " ); + /* + * We are checking which windows should be destroyed and which are + * common parrents with the next one. Remember that menu_num field + * in mainmenu_option record reports number of its *parent* menu. + */ + if ( menu_num < tot_menu_num + && menu_first[menu_num + 1]->menu_number != menu_num ) + { + int to_destr; + + printf( "destroy $w; unregister_active %d; ", menu_num ); + to_destr = menu_first[menu_num]->menu_number; + while ( to_destr > 0 && menu_first[menu_num + 1]->menu_number != to_destr ) + { + printf( "catch {destroy .menu%d}; unregister_active %d; ", + to_destr, to_destr ); + to_destr = menu_first[to_destr]->menu_number; + } + } + printf( "menu%d .menu%d \\\"$title\\\"\"\n", + menu_num+1, menu_num+1 ); if ( menu_num == tot_menu_num ) printf( "\t$w.f.next configure -state disabled\n" ); printf( "\tbutton $w.f.prev -text \"Prev\" \\\n" ); - printf( "\t\t-width 15 -command \" destroy $w; focus $oldFocus; menu%d .menu%d \\\"$title\\\"\"\n", menu_num-1, menu_num-1 ); + printf( "\t\t-width 15 -command \"catch {focus $oldFocus}; destroy $w; unregister_active %d; menu%d .menu%d \\\"$title\\\"\"\n", + menu_num, menu_num-1, menu_num-1 ); if ( menu_num == 1 ) printf( "\t$w.f.prev configure -state disabled\n" ); printf( "\tpack $w.f.back $w.f.next $w.f.prev -side left -expand on\n" ); @@ -177,12 +227,11 @@ * a global declaration so we know whether we need to insert one for a * given function or not. */ -void clear_globalflags( struct kconfig * scfg ) +static void clear_globalflags(void) { - struct kconfig * cfg; - - for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) - cfg->global_written = 0; + int i; + for ( i = 1; i <= max_varnum; i++ ) + vartable[i].global_written = 0; } @@ -194,7 +243,7 @@ */ void global( const char *var ) { - printf( "\tglobal %s; vfix %s\n", var, var ); + printf( "\tglobal %s\n", var ); } @@ -207,6 +256,23 @@ int menu_num, int line_num ) { struct condition * cond; + struct dependency * tmp; + struct kconfig * cfg1; + + if ( line_num >= -1 ) + { + if ( cfg->token == token_define_bool || cfg->token == token_define_hex + || cfg->token == token_define_int || cfg->token == token_define_string + || cfg->token == token_define_tristate || cfg->token == token_unset ) + return; + if ( cfg->token == token_comment && line_num == -1 ) + return; + } + else + { + if ( cfg->token == token_string || cfg->token == token_mainmenu_option ) + return; + } /* * First write any global declarations we need for this conditional. @@ -219,14 +285,10 @@ break; case op_variable: - global( cond->str ); - break; - - case op_kvariable: - if ( ! cond->cfg->global_written ) + if ( ! vartable[cond->nameindex].global_written ) { - cond->cfg->global_written = 1; - global( cond->cfg->optionname ); + vartable[cond->nameindex].global_written = 1; + global( vartable[cond->nameindex].name ); } break; } @@ -235,10 +297,10 @@ /* * Now write this option. */ - if ( ! cfg->global_written && cfg->optionname != NULL ) + if ( cfg->nameindex > 0 && ! vartable[cfg->nameindex].global_written ) { - cfg->global_written = 1; - global( cfg->optionname ); + vartable[cfg->nameindex].global_written = 1; + global( vartable[cfg->nameindex].name ); } /* @@ -262,156 +324,324 @@ case op_rparen: printf( ")" ); break; case op_variable: - printf( "$%s", cond->str ); - break; - - case op_kvariable: - printf( "$%s", cond->cfg->optionname ); + printf( "$%s", vartable[cond->nameindex].name ); break; case op_constant: if ( strcmp( cond->str, "y" ) == 0 ) printf( "1" ); else if ( strcmp( cond->str, "n" ) == 0 ) printf( "0" ); else if ( strcmp( cond->str, "m" ) == 0 ) printf( "2" ); + else if ( strcmp( cond->str, "" ) == 0 ) printf( "4" ); else printf( "\"%s\"", cond->str ); break; } } - printf( "} then { " ); + printf( "} then {" ); /* * Generate a procedure call to write the value. * This code depends on procedures in header.tk. */ - switch ( cfg->token ) + if ( line_num >= -1 ) { - default: - printf( " }\n" ); - break; + int modtoyes = 0; - case token_bool: - printf( ".menu%d.config.f.x%d.y configure -state normal;", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.n configure -state normal;", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.l configure -state normal;", - menu_num, line_num ); - printf( "set %s [expr $%s&15];", - cfg->optionname, cfg->optionname ); - printf( "} else { "); - printf( ".menu%d.config.f.x%d.y configure -state disabled;", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.n configure -state disabled;", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.l configure -state disabled;", - menu_num, line_num ); - printf( "set %s [expr $%s|16];}\n", - cfg->optionname, cfg->optionname ); - break; + switch ( cfg->token ) + { + default: + printf( " }\n" ); + break; - case token_choice_header: - fprintf( stderr, "Internal error on token_choice_header\n" ); - exit( 1 ); + case token_dep_mbool: + modtoyes = 1; + case token_dep_bool: + printf( "\n" ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + if ( ! vartable[get_varnum( tmp->name )].global_written ) + { + global( tmp->name ); + } + printf( "\tset tmpvar_dep [effective_dep [list" ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + printf( " $%s", tmp->name ); + printf( "]];set %s [sync_bool $%s $tmpvar_dep %d];", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name, + modtoyes ); + printf( "if {$tmpvar_dep != 1" ); + if (modtoyes) + printf( " && $tmpvar_dep != 2" ); + printf( "} then {configure_entry .menu%d.config.f.x%d disabled {y};", + menu_num, line_num ); + printf( "} else {" ); + printf( "configure_entry .menu%d.config.f.x%d normal {y};", + menu_num, line_num ); + printf( "}; " ); + case token_bool: + if ( cfg->token == token_bool ) + printf( "\n\t" ); + printf( "configure_entry .menu%d.config.f.x%d normal {n l", + menu_num, line_num ); + if ( cfg->token == token_bool ) + printf( " y" ); + printf( "}" ); + printf( "} else {"); + printf( "configure_entry .menu%d.config.f.x%d disabled {y n l}}\n", + menu_num, line_num ); + break; - case token_choice_item: - fprintf( stderr, "Internal error on token_choice_item\n" ); - exit( 1 ); + case token_choice_header: + printf( "configure_entry .menu%d.config.f.x%d normal {x l}", + menu_num, line_num ); + printf( "} else {" ); + printf( "configure_entry .menu%d.config.f.x%d disabled {x l}", + menu_num, line_num ); + printf( "}\n" ); + break; - case token_define_bool: - printf( "set %s %s } \n", - cfg->optionname, cfg->value ); - break; + case token_choice_item: + fprintf( stderr, "Internal error on token_choice_item\n" ); + exit( 1 ); - case token_dep_tristate: - case token_tristate: - if ( cfg->token == token_dep_tristate ) - { - global( cfg->depend ); - printf( "if { $%s != 1 && $%s != 0 } then {", - cfg->depend, cfg->depend ); - printf( ".menu%d.config.f.x%d.y configure -state disabled;", + case token_dep_tristate: + printf( "\n" ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + if ( ! vartable[get_varnum( tmp->name )].global_written ) + { + global( tmp->name ); + } + printf( "\tset tmpvar_dep [effective_dep [list" ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + printf( " $%s", tmp->name ); + printf( "]];set %s [sync_tristate $%s $tmpvar_dep];", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); + printf( "\tif {$tmpvar_dep != 1} then {" ); + printf( "configure_entry .menu%d.config.f.x%d disabled {y}", menu_num, line_num ); printf( "} else {" ); - printf( ".menu%d.config.f.x%d.y configure -state normal;", - menu_num, line_num); + printf( "configure_entry .menu%d.config.f.x%d normal {y}", + menu_num, line_num ); printf( "}; " ); - } - else - { - printf( ".menu%d.config.f.x%d.y configure -state normal;", + printf( "if {$tmpvar_dep == 0} then {" ); + printf( "configure_entry .menu%d.config.f.x%d disabled {m}", menu_num, line_num ); + printf( "} else {" ); + printf( "configure_entry .menu%d.config.f.x%d normal {m}", + menu_num, line_num ); + printf( "}; " ); + case token_tristate: + if ( cfg->token == token_tristate ) + { + printf( "\n\tconfigure_entry .menu%d.config.f.x%d normal {y}; ", + menu_num, line_num ); + } + printf( "if {($CONFIG_MODULES == 1)} then {" ); + printf( "configure_entry .menu%d.config.f.x%d normal {m}} else {", + menu_num, line_num ); + printf( "configure_entry .menu%d.config.f.x%d disabled {m}}; ", + menu_num, line_num ); + printf( "configure_entry .menu%d.config.f.x%d normal {n l}", + menu_num, line_num ); + + /* + * Or in a bit to the variable - this causes all of the radiobuttons + * to be deselected (i.e. not be red). + */ + printf( "} else {" ); + printf( "configure_entry .menu%d.config.f.x%d disabled {y n m l}}\n", + menu_num, line_num ); + break; + + case token_hex: + case token_int: + case token_string: + printf( ".menu%d.config.f.x%d.x configure -state normal -foreground [ cget .ref -foreground ]; ", + menu_num, line_num ); + printf( ".menu%d.config.f.x%d.l configure -state normal; ", + menu_num, line_num ); + printf( "} else {" ); + printf( ".menu%d.config.f.x%d.x configure -state disabled -foreground [ cget .ref -disabledforeground ]; ", + menu_num, line_num ); + printf( ".menu%d.config.f.x%d.l configure -state disabled}\n", + menu_num, line_num ); + break; + + case token_comment: + case token_mainmenu_option: + if ( line_num >= 0 ) + { + printf( "configure_entry .menu%d.config.f.x%d normal {m}", + menu_num, line_num ); + printf( "} else {" ); + printf( "configure_entry .menu%d.config.f.x%d disabled {m}}\n", + menu_num, line_num ); + } + else + printf( ".f0.x%d configure -state normal } else { .f0.x%d configure -state disabled }\n", + menu_num, menu_num ); + break; } + } + else + { + int modtoyes = 0; + + switch ( cfg->token ) + { + default: + printf( " }\n" ); + break; + + case token_dep_mbool: + modtoyes = 1; + case token_dep_bool: + printf( "\n" ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + if ( ! vartable[get_varnum( tmp->name )].global_written ) + { + global( tmp->name ); + } + printf( "\tset tmpvar_dep [effective_dep [list" ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + printf( " $%s", tmp->name ); + printf( "]];set %s [sync_bool $%s $tmpvar_dep %d];", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name, + modtoyes ); + case token_bool: + if ( cfg->token == token_bool ) + printf( "\n\t" ); + printf( "set %s [expr $%s&15]", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); + printf( "} else {"); + printf( "set %s [expr $%s|16]}\n", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); + break; + + case token_choice_header: + printf( "} else {" ); + for ( cfg1 = cfg->next; + cfg1 != NULL && cfg1->token == token_choice_item; + cfg1 = cfg1->next ) + printf( "set %s 4;", vartable[cfg1->nameindex].name ); + printf( "}\n" ); + break; - printf( ".menu%d.config.f.x%d.n configure -state normal;", - menu_num, line_num ); - printf( "global CONFIG_MODULES; if {($CONFIG_MODULES == 1)} then { .menu%d.config.f.x%d.m configure -state normal };", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.l configure -state normal;", - menu_num, line_num ); + case token_choice_item: + fprintf( stderr, "Internal error on token_choice_item\n" ); + exit( 1 ); + case token_define_bool: + case token_define_tristate: + if ( ! vartable[get_varnum( cfg->value )].global_written ) + { + global( cfg->value ); + } + printf( "set %s $%s }\n", + vartable[cfg->nameindex].name, cfg->value ); + break; + + case token_define_hex: + case token_define_int: + printf( "set %s %s }\n", + vartable[cfg->nameindex].name, cfg->value ); + break; + + case token_define_string: + printf( "set %s \"%s\" }\n", + vartable[cfg->nameindex].name, cfg->value ); + break; + + case token_dep_tristate: + printf( "\n" ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + if ( ! vartable[get_varnum( tmp->name )].global_written ) + { + global( tmp->name ); + } + printf( "\tset tmpvar_dep [effective_dep [list" ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + printf( " $%s", tmp->name ); + printf( "]]; set %s [sync_tristate $%s $tmpvar_dep]; ", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); + case token_tristate: + if ( cfg->token == token_tristate ) + printf( "if {($CONFIG_MODULES == 0) && ($%s == 2)} then {set %s 1}; ", + vartable[cfg->nameindex].name, + vartable[cfg->nameindex].name ); /* * Or in a bit to the variable - this causes all of the radiobuttons * to be deselected (i.e. not be red). */ - printf( "set %s [expr $%s&15];", - cfg->optionname, cfg->optionname ); - printf( "} else { " ); - printf( ".menu%d.config.f.x%d.y configure -state disabled;", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.n configure -state disabled;", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.m configure -state disabled;", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.l configure -state disabled;", - menu_num, line_num ); + printf( "set %s [expr $%s&15]", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); + printf( "} else {" ); /* * Clear the disable bit to enable the correct radiobutton. */ - printf( "set %s [expr $%s|16];}\n", - cfg->optionname, cfg->optionname ); - break; + printf( "set %s [expr $%s|16]}\n", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); + break; - case token_hex: - case token_int: - case token_string: - printf( ".menu%d.config.f.x%d.x configure -state normal -foreground [ cget .ref -foreground ]; ", - menu_num, line_num); - printf( ".menu%d.config.f.x%d.l configure -state normal; ", - menu_num, line_num); - printf( "} else { " ); - printf( ".menu%d.config.f.x%d.x configure -state disabled -foreground [ cget .ref -disabledforeground ];", - menu_num, line_num ); - printf( ".menu%d.config.f.x%d.l configure -state disabled;}\n", - menu_num, line_num ); - break; + case token_hex: + case token_int: + if ( cfg->value && *cfg->value == '$' ) + { + int index = get_varnum( cfg->value+1 ); + printf( "\n" ); + if ( ! vartable[index].global_written ) + { + global( vartable[index].name ); + } + printf( "\t" ); + } + if ( cfg->token == token_hex ) + printf( "validate_hex " ); + else if ( cfg->token == token_int ) + printf( "validate_int " ); + printf( "%s \"$%s\" %s}\n", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name, + cfg->value ); + break; - case token_mainmenu_option: - printf( ".f0.x%d configure -state normal } else { .f0.x%d configure -state disabled }\n", - menu_num, menu_num ); - break; + case token_unset: + printf( "set %s 4}\n", vartable[cfg->nameindex].name ); + break; + } } } - /* * Generate a line that writes a variable to the output file. */ void generate_writeconfig( struct kconfig * cfg ) { struct condition * cond; - + struct dependency * tmp; + int depmod = 2; + /* * Generate global declaration for this symbol. */ if ( cfg->token != token_comment ) { - if ( ! cfg->global_written ) + if ( cfg->nameindex > 0 && ! vartable[cfg->nameindex].global_written ) { - cfg->global_written = 1; - printf( "\tglobal %s\n", cfg->optionname ); + vartable[cfg->nameindex].global_written = 1; + global( vartable[cfg->nameindex].name ); + } + if ( cfg->token == token_define_tristate || cfg->token == token_define_bool ) + { + if ( ! vartable[get_varnum( cfg->value )].global_written ) + { + vartable[get_varnum( cfg->value )].global_written = 1; + global( cfg->value ); + } + } + else if ( cfg->nameindex <= 0 && cfg->token == token_choice_header ) + { + printf( "\tglobal tmpvar_%d\n", -(cfg->nameindex) ); } } @@ -426,14 +656,10 @@ break; case op_variable: - global( cond->str ); - break; - - case op_kvariable: - if ( ! cond->cfg->global_written ) + if ( ! vartable[cond->nameindex].global_written ) { - cond->cfg->global_written = 1; - global( cond->cfg->optionname ); + vartable[cond->nameindex].global_written = 1; + global( vartable[cond->nameindex].name ); } break; } @@ -442,7 +668,6 @@ /* * Generate indentation. */ - if ( cfg->token != token_choice_header ) printf( "\t" ); /* @@ -466,17 +691,14 @@ case op_rparen: printf( ")" ); break; case op_variable: - printf( "$%s", cond->str ); - break; - - case op_kvariable: - printf( "$%s", cond->cfg->optionname ); + printf( "$%s", vartable[cond->nameindex].name ); break; case op_constant: if ( strcmp( cond->str, "n" ) == 0 ) printf( "0" ); else if ( strcmp( cond->str, "y" ) == 0 ) printf( "1" ); else if ( strcmp( cond->str, "m" ) == 0 ) printf( "2" ); + else if ( strcmp( cond->str, "" ) == 0 ) printf( "4" ); else printf( "\"%s\"", cond->str ); break; @@ -499,10 +721,8 @@ case token_bool: case token_tristate: - if ( cfg->cond ) - printf( " " ); - printf( "write_tristate $cfg $autocfg %s $%s $notmod", - cfg->optionname, cfg->optionname ); + printf( "write_tristate $cfg $autocfg %s $%s [list $notmod] 2", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); @@ -520,12 +740,15 @@ cfg1 != NULL && cfg1->token == token_choice_item; cfg1 = cfg1->next ) { - printf("\tif { $%s == \"%s\" } then { write_tristate $cfg $autocfg %s 1 $notmod } else { write_tristate $cfg $autocfg %s 0 $notmod }\n", - cfg->optionname, cfg1->label, - cfg1->optionname, - cfg1->optionname ); + printf("\n\tif { $tmpvar_%d == \"%s\" } then { write_tristate $cfg $autocfg %s 1 [list $notmod] 2 } else { write_tristate $cfg $autocfg %s 0 [list $notmod] 2 }", + -(cfg->nameindex), cfg1->label, + vartable[cfg1->nameindex].name, + vartable[cfg1->nameindex].name ); } } + if ( cfg->cond != NULL ) + printf( "}" ); + printf( "\n" ); break; case token_choice_item: @@ -541,53 +764,76 @@ break; case token_define_bool: + case token_define_tristate: if ( cfg->cond == NULL ) { - printf( "write_tristate $cfg $autocfg %s $%s $notmod\n", - cfg->optionname, cfg->optionname ); + printf( "write_tristate $cfg $autocfg %s $%s [list $notmod] 2\n", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); } else { - printf( "write_tristate $cfg $autocfg %s %s $notmod }\n", - cfg->optionname, cfg->value ); + printf( "write_tristate $cfg $autocfg %s $%s [list $notmod] 2 }\n", + vartable[cfg->nameindex].name, cfg->value ); } break; + case token_dep_mbool: + depmod = 1; + case token_dep_bool: case token_dep_tristate: - if ( cfg->cond ) - printf( " " ); - printf( "write_tristate $cfg $autocfg %s $%s $%s", - cfg->optionname, cfg->optionname, cfg->depend ); + printf( "write_tristate $cfg $autocfg %s $%s [list", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); + for ( tmp = cfg->depend; tmp; tmp = tmp->next ) + printf( " $%s", tmp->name ); + printf( "] %d", depmod ); if ( cfg->cond != NULL ) printf( " }" ); - printf( " \n" ); + printf( "\n" ); break; - case token_hex: + case token_define_hex: + printf( "write_hex $cfg $autocfg %s %s $notmod", + vartable[cfg->nameindex].name, cfg->value ); + if ( cfg->cond != NULL ) + printf( " }" ); + printf( "\n" ); + break; + + case token_define_int: + printf( "write_int $cfg $autocfg %s %s $notmod", + vartable[cfg->nameindex].name, cfg->value ); + if ( cfg->cond != NULL ) + printf( " }" ); + printf( "\n" ); + break; + + case token_define_string: + printf( "write_string $cfg $autocfg %s \"%s\" $notmod", + vartable[cfg->nameindex].name, cfg->value ); if ( cfg->cond != NULL ) - printf( " " ); + printf( " }" ); + printf( "\n" ); + break; + + case token_hex: printf( "write_hex $cfg $autocfg %s $%s $notmod", - cfg->optionname, cfg->optionname ); + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_int: - if ( cfg->cond != NULL ) - printf( " " ); printf( "write_int $cfg $autocfg %s $%s $notmod", - cfg->optionname, cfg->optionname ); + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_string: - if ( cfg->cond != NULL ) - printf( " " ); - printf( "write_string $cfg $autocfg %s $%s $notmod", - cfg->optionname, cfg->optionname ); + printf( "write_string $cfg $autocfg %s \"$%s\" $notmod", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); @@ -595,6 +841,113 @@ } } +static void generate_update_var( struct kconfig * scfg, int menu_num ) +{ + struct kconfig * cfg; + + if ( menu_num>0 ) + { + printf( "proc update_define_menu%d {} {\n", menu_num ); + printf( "\tupdate_define_mainmenu\n" ); + } + else + printf( "proc update_define_mainmenu {} {\n" ); + clear_globalflags(); + global( "CONFIG_MODULES" ); + vartable[ get_varnum( "CONFIG_MODULES" ) ].global_written = 1; + for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) + { + if ( cfg->menu_number == menu_num && (cfg->token == token_define_bool || cfg->token == token_define_tristate + || cfg->token == token_define_hex || cfg->token == token_define_int + || cfg->token == token_define_string || cfg->token == token_unset + || cfg->token == token_tristate) ) + { + if ( ! vartable[cfg->nameindex].global_written ) + { + vartable[cfg->nameindex].global_written = 1; + global( vartable[cfg->nameindex].name ); + } + } + } + + for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) + { + char tmp[20]; + struct kconfig * cfg1; + + if ( cfg->menu_number == menu_num ) + { + switch ( cfg->token ) + { + default: + case token_choice_item: + break; + case token_choice_header: + sprintf( tmp, "tmpvar_%d", -(cfg->nameindex) ); + global( tmp ); + for ( cfg1 = cfg->next; + cfg1 != NULL && cfg1->token == token_choice_item; + cfg1 = cfg1->next ) + { + vartable[cfg1->nameindex].global_written = 1; + global( vartable[cfg1->nameindex].name ); + printf( "\tif {$tmpvar_%d == \"%s\"} then {set %s 1} else {set %s 0}\n", + -(cfg->nameindex), cfg1->label, + vartable[cfg1->nameindex].name, + vartable[cfg1->nameindex].name ); + } + break; + case token_bool: + case token_define_bool: + case token_define_tristate: + case token_define_hex: + case token_define_int: + case token_define_string: + case token_dep_bool: + case token_dep_tristate: + case token_dep_mbool: + case token_int: + case token_hex: + case token_mainmenu_option: + case token_tristate: + case token_unset: + if ( cfg->cond != NULL ) + generate_if( cfg, cfg->cond, menu_num, -2 ); + else switch ( cfg->token ) + { + case token_tristate: + printf( "\n\tif {($CONFIG_MODULES == 0)} then {if {($%s == 2)} then {set %s 1}}\n", + vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); + break; + case token_define_bool: + case token_define_tristate: + if ( ! vartable[get_varnum( cfg->value )].global_written ) + { + vartable[get_varnum( cfg->value )].global_written = 1; + global( cfg->value ); + } + printf( "\tset %s $%s\n", vartable[cfg->nameindex].name, + cfg->value ); + break; + case token_define_hex: + case token_define_int: + printf( "\tset %s %s\n", vartable[cfg->nameindex].name, + cfg->value ); + break; + case token_define_string: + printf( "\tset %s \"%s\"\n", vartable[cfg->nameindex].name, + cfg->value ); + break; + case token_unset: + printf( "\tset %s 4\n", vartable[cfg->nameindex].name ); + default: + break; + } + } + } + } + printf( "}\n\n\n" ); +} /* @@ -603,13 +956,24 @@ static void end_proc( struct kconfig * scfg, int menu_num ) { struct kconfig * cfg; + int i; printf( "\n\n\n" ); printf( "\tfocus $w\n" ); - printf( "\tupdate_menu%d $w.config.f\n", - menu_num ); + printf( "\tupdate_active\n" ); printf( "\tglobal winx; global winy\n" ); - printf( "\tset winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30]\n" ); + if ( menu_first[menu_num]->menu_number != 0 ) + { + printf( "\tif {[winfo exists .menu%d] == 0} then ", + menu_first[menu_num]->menu_number ); + printf( "{menu%d .menu%d \"%s\"}\n", + menu_first[menu_num]->menu_number, menu_first[menu_num]->menu_number, + menu_first[menu_first[menu_num]->menu_number]->label ); + printf( "\tset winx [expr [winfo x .menu%d]+30]; set winy [expr [winfo y .menu%d]+30]\n", + menu_first[menu_num]->menu_number, menu_first[menu_num]->menu_number ); + } + else + printf( "\tset winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30]\n" ); printf( "\twm geometry $w +$winx+$winy\n" ); /* @@ -660,27 +1024,12 @@ * widgets, and will be called first when the window is mapped, * and each time one of the buttons in the window are clicked. */ - printf( "proc update_menu%d {w} {\n", menu_num ); - printf( "\tupdate_define\n" ); + printf( "proc update_menu%d {} {\n", menu_num ); /* * Clear all of the booleans that are defined in this menu. */ - clear_globalflags( scfg ); - for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) - { - if ( cfg->menu_number == menu_num && cfg->token == token_define_bool - && cfg->optionname != NULL ) - { - if ( ! cfg->global_written ) - { - cfg->global_written = 1; - printf( "\tglobal %s\n", cfg->optionname ); - printf( "\tset %s 0\n", cfg->optionname ); - } - } - } - + clear_globalflags(); for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { if ( cfg->menu_number == menu_num @@ -688,28 +1037,47 @@ && cfg->token != token_choice_item ) { if ( cfg->cond != NULL ) + { + int i; + if ( (cfg->token == token_tristate || cfg->token == token_dep_tristate) + && ! vartable[i = get_varnum( "CONFIG_MODULES" )].global_written ) + { + global( "CONFIG_MODULES" ); + vartable[i].global_written = 1; + } generate_if( cfg, cfg->cond, cfg->menu_number, cfg->menu_line ); + } else { - /* - * Treat tristate like conditional here. - */ - if ( cfg->token == token_dep_tristate ) + if ( cfg->token == token_tristate ) { - global( cfg->depend ); - printf( "\tif {$%s != 1 && $%s != 0 } then { .menu%d.config.f.x%d.y configure -state disabled } else { .menu%d.config.f.x%d.y configure -state normal}\n", - cfg->depend, cfg->depend, + if ( ! vartable[cfg->nameindex].global_written ) + { + vartable[cfg->nameindex].global_written = 1; + printf( "\tglobal %s\n", vartable[cfg->nameindex].name ); + } + if ( ! vartable[i = get_varnum( "CONFIG_MODULES" )].global_written ) + { + global( "CONFIG_MODULES" ); + vartable[i].global_written = 1; + } + printf( "\n\tif {($CONFIG_MODULES == 1)} then {configure_entry .menu%d.config.f.x%d normal {m}} else {configure_entry .menu%d.config.f.x%d disabled {m}}\n", menu_num, cfg->menu_line, menu_num, cfg->menu_line ); } } } + else if ( cfg->token == token_mainmenu_option + && cfg->menu_number == menu_num + && cfg->cond != NULL ) + { + generate_if( cfg, cfg->cond, menu_num, cfg->menu_line ); + } } - printf("}\n\n\n"); -} - + generate_update_var( scfg, menu_num ); +} /* * This is the top level function for generating the tk script. @@ -718,18 +1086,20 @@ { int menu_depth; int menu_num [64]; - struct kconfig * menu_first [256]; - struct kconfig * menu_last [256]; - int imenu; + int imenu, i; + int top_level_num = 0; struct kconfig * cfg; struct kconfig * cfg1 = NULL; const char * name = "No Name"; /* - * Thread the menu pointers so I can walk each menu separately. - */ + * Mark begin and end of each menu so I can omit submenus when walking + * over a parent menu. + */ tot_menu_num = 0; menu_depth = 0; + menu_num [0] = 0; + for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { switch ( cfg->token ) @@ -744,14 +1114,22 @@ case token_mainmenu_option: if ( ++menu_depth >= 64 ) { fprintf( stderr, "menus too deep\n" ); exit( 1 ); } - if ( ++tot_menu_num >= 256 ) + if ( ++tot_menu_num >= 100 ) { fprintf( stderr, "too many menus\n" ); exit( 1 ); } menu_num [menu_depth] = tot_menu_num; menu_first [tot_menu_num] = cfg; menu_last [tot_menu_num] = cfg; + /* + * Note, that menu_number is set to the number of parent + * (upper level) menu. + */ + cfg->menu_number = menu_num[menu_depth - 1]; + if ( menu_depth == 1 ) + ++top_level_num; break; case token_endmenu: + menu_last [menu_num [menu_depth]] = cfg; /* flatten menus with proper scoping */ if ( --menu_depth < 0 ) { fprintf( stderr, "unmatched endmenu\n" ); exit( 1 ); } @@ -760,19 +1138,26 @@ case token_bool: case token_choice_header: case token_choice_item: + case token_comment: + case token_dep_bool: case token_dep_tristate: + case token_dep_mbool: case token_hex: case token_int: case token_string: case token_tristate: + cfg->menu_number = menu_num[menu_depth]; if ( menu_depth == 0 ) { fprintf( stderr, "statement not in menu\n" ); exit( 1 ); } - menu_last [menu_num [menu_depth]]->menu_next = cfg; - menu_last [menu_num [menu_depth]] = cfg; - cfg->menu_next = NULL; break; case token_define_bool: + case token_define_hex: + case token_define_int: + case token_define_string: + case token_define_tristate: + case token_unset: + cfg->menu_number = menu_num[menu_depth]; break; } } @@ -784,7 +1169,21 @@ * one blank button * add two to round up for division */ - printf( "set menus_per_column %d\n\n", (tot_menu_num + 4 + 1 + 2) / 3 ); + printf( "set menus_per_column %d\n", (top_level_num + 4 + 1 + 2) / 3 ); + printf( "set total_menus %d\n\n", tot_menu_num ); + + printf( "proc toplevel_menu {num} {\n" ); + for ( imenu = 1; imenu <= tot_menu_num; ++imenu ) + { + int parent = 1; + + if ( menu_first[imenu]->menu_number == 0 ) + parent = menu_first[imenu]->menu_number; + else + printf( "\tif {$num == %d} then {return %d}\n", + imenu, menu_first[imenu]->menu_number ); + } + printf( "\treturn $num\n}\n\n" ); /* * Generate the menus. @@ -793,24 +1192,50 @@ for ( imenu = 1; imenu <= tot_menu_num; ++imenu ) { int menu_line = 0; + int nr_submenu = imenu; + int menu_name_omitted = 0; + int opt_count = 0; + + clear_globalflags(); + start_proc( menu_first[imenu]->label, imenu, + !menu_first[imenu]->menu_number ); - clear_globalflags( scfg ); - start_proc( menu_first[imenu]->label, imenu, 1 ); - - for ( cfg = menu_first[imenu]; cfg != NULL; cfg = cfg->menu_next ) + for ( cfg = menu_first[imenu]->next; cfg != NULL && cfg != menu_last[imenu]; cfg = cfg->next ) { - cfg->menu_number = imenu; - switch ( cfg->token ) { default: break; + case token_mainmenu_option: + while ( menu_first[++nr_submenu]->menu_number > imenu ) + ; + cfg->menu_line = menu_line++; + printf( "\tsubmenu $w.config.f %d %d \"%s\" %d\n", + cfg->menu_number, cfg->menu_line, cfg->label, nr_submenu ); + cfg = menu_last[nr_submenu]; + break; + + case token_comment: + if ( !cfg->menu_line && !menu_name_omitted ) + { + cfg->menu_line = -1; + menu_name_omitted = 1; + } + else + { + menu_name_omitted = 1; + cfg->menu_line = menu_line++; + printf( "\tcomment $w.config.f %d %d \"%s\"\n", + cfg->menu_number, cfg->menu_line, cfg->label ); + } + break; + case token_bool: cfg->menu_line = menu_line++; printf( "\tbool $w.config.f %d %d \"%s\" %s\n", cfg->menu_number, cfg->menu_line, cfg->label, - cfg->optionname ); + vartable[cfg->nameindex].name ); break; case token_choice_header: @@ -819,54 +1244,70 @@ * help text from Documentation/Configure.help. */ cfg->menu_line = menu_line++; - printf( "\tglobal %s\n", cfg->optionname ); - printf( "\tminimenu $w.config.f %d %d \"%s\" %s %s\n", + printf( "\tglobal tmpvar_%d\n", -(cfg->nameindex) ); + printf( "\tminimenu $w.config.f %d %d \"%s\" tmpvar_%d %s\n", cfg->menu_number, cfg->menu_line, cfg->label, - cfg->optionname, cfg->next->optionname ); - printf( "\tmenu $w.config.f.x%d.x.menu\n", cfg->menu_line ); + -(cfg->nameindex), vartable[cfg->next->nameindex].name ); + printf( "\tmenu $w.config.f.x%d.x.menu -tearoffcommand \"menutitle \\\"%s\\\"\"\n", + cfg->menu_line, cfg->label ); cfg1 = cfg; + opt_count = 0; break; case token_choice_item: /* note: no menu line; uses choice header menu line */ - printf( "\t$w.config.f.x%d.x.menu add radiobutton -label \"%s\" -variable %s -value \"%s\" -command \"update_menu%d .menu%d.config.f\"\n", - cfg1->menu_line, cfg->label, cfg1->optionname, - cfg->label, cfg1->menu_number, cfg1->menu_number ); + printf( "\t$w.config.f.x%d.x.menu add radiobutton -label \"%s\" -variable tmpvar_%d -value \"%s\" -command \"update_active\"\n", + cfg1->menu_line, cfg->label, -(cfg1->nameindex), + cfg->label ); + opt_count++; + if ( cfg->next && cfg->next->token != token_choice_item ) { + /* last option in the menu */ + printf( "\tmenusplit $w $w.config.f.x%d.x.menu %d\n", + cfg1->menu_line, opt_count ); + } + break; + + case token_dep_bool: + case token_dep_mbool: + cfg->menu_line = menu_line++; + printf( "\tdep_bool $w.config.f %d %d \"%s\" %s\n", + cfg->menu_number, cfg->menu_line, cfg->label, + vartable[cfg->nameindex].name ); break; case token_dep_tristate: cfg->menu_line = menu_line++; - printf( "\tdep_tristate $w.config.f %d %d \"%s\" %s %s\n", + printf( "\tdep_tristate $w.config.f %d %d \"%s\" %s\n", cfg->menu_number, cfg->menu_line, cfg->label, - cfg->optionname, cfg->depend ); + vartable[cfg->nameindex].name ); break; case token_hex: cfg->menu_line = menu_line++; printf( "\thex $w.config.f %d %d \"%s\" %s\n", cfg->menu_number, cfg->menu_line, cfg->label, - cfg->optionname ); + vartable[cfg->nameindex].name ); break; case token_int: cfg->menu_line = menu_line++; printf( "\tint $w.config.f %d %d \"%s\" %s\n", cfg->menu_number, cfg->menu_line, cfg->label, - cfg->optionname ); + vartable[cfg->nameindex].name ); break; case token_string: cfg->menu_line = menu_line++; printf( "\tistring $w.config.f %d %d \"%s\" %s\n", cfg->menu_number, cfg->menu_line, cfg->label, - cfg->optionname ); + vartable[cfg->nameindex].name ); break; case token_tristate: cfg->menu_line = menu_line++; printf( "\ttristate $w.config.f %d %d \"%s\" %s\n", cfg->menu_number, cfg->menu_line, cfg->label, - cfg->optionname ); + vartable[cfg->nameindex].name ); break; } } @@ -875,36 +1316,21 @@ } /* - * The top level menu also needs an update function. When we exit a + * The top level menu also needs an update function. When we update a * submenu, we may need to disable one or more of the submenus on * the top level menu, and this procedure will ensure that things are * correct. */ - clear_globalflags( scfg ); - printf( "proc update_mainmenu {w} {\n" ); - for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) + clear_globalflags(); + printf( "proc update_mainmenu {} {\n" ); + for ( imenu = 1; imenu <= tot_menu_num; imenu++ ) { - if ( cfg->token == token_mainmenu_option && cfg->cond != NULL ) - generate_if( cfg, cfg->cond, cfg->menu_number, cfg->menu_line ); + if ( menu_first[imenu]->cond != NULL && menu_first[imenu]->menu_number == 0 ) + generate_if( menu_first[imenu], menu_first[imenu]->cond, imenu, -1 ); } printf( "}\n\n\n" ); -#if 0 - /* - * Generate code to set the variables that are "defined". - */ - for ( cfg = config; cfg != NULL; cfg = cfg->next ) - { - if ( cfg->token == token_define_bool ) - { - if ( cfg->cond != NULL ) - generate_if( cfg, cfg->cond, menu_num, cfg->menu_line ); - else - printf( "\twrite_define %s %s\n", cfg->optionname, cfg->value ); - } - } - #endif - + clear_globalflags(); /* * Generate code to load the default settings into the variables. * The script in tail.tk will attempt to load .config, @@ -919,27 +1345,51 @@ case token_bool: case token_choice_item: + case token_dep_bool: case token_dep_tristate: + case token_dep_mbool: case token_tristate: - printf( "set %s 0\n", cfg->optionname ); + if ( ! vartable[cfg->nameindex].global_written ) + { + printf( "set %s 0\n", vartable[cfg->nameindex].name ); + vartable[cfg->nameindex].global_written = 1; + } break; case token_choice_header: - printf( "set %s \"(not set)\"\n", cfg->optionname ); + printf( "set tmpvar_%d \"(not set)\"\n", -(cfg->nameindex) ); break; case token_hex: case token_int: - printf( "set %s %s\n", cfg->optionname, cfg->value ? cfg->value : "0"); + if ( ! vartable[cfg->nameindex].global_written ) + { + printf( "set %s %s\n", vartable[cfg->nameindex].name, cfg->value ? cfg->value : "0" ); + vartable[cfg->nameindex].global_written = 1; + } break; case token_string: - printf( "set %s \"%s\"\n", cfg->optionname, cfg->value ? cfg->value : ""); + if ( ! vartable[cfg->nameindex].global_written ) + { + printf( "set %s \"%s\"\n", vartable[cfg->nameindex].name, cfg->value ); + vartable[cfg->nameindex].global_written = 1; + } break; } } /* + * Define to an empty value all other variables (which are never defined) + */ + for ( i = 1; i <= max_varnum; i++ ) + { + if ( ! vartable[i].global_written + && strncmp( vartable[i].name, "CONSTANT_", 9 ) ) + printf( "set %s 4\n", vartable[i].name ); + } + + /* * Generate a function to write all of the variables to a file. */ printf( "proc writeconfig {file1 file2} {\n" ); @@ -956,7 +1406,7 @@ printf( "\tputs $autocfg \" */\"\n" ); printf( "\tputs $autocfg \"#define AUTOCONF_INCLUDED\"\n" ); - clear_globalflags( scfg ); + clear_globalflags(); for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { switch ( cfg->token ) @@ -968,7 +1418,13 @@ case token_choice_header: case token_comment: case token_define_bool: + case token_define_hex: + case token_define_int: + case token_define_string: + case token_define_tristate: + case token_dep_bool: case token_dep_tristate: + case token_dep_mbool: case token_hex: case token_int: case token_string: @@ -996,7 +1452,8 @@ cfg1 = cfg1->next ) { printf( "\tglobal %s; set %s 0\n", - cfg1->optionname, cfg1->optionname ); + vartable[cfg1->nameindex].name, + vartable[cfg1->nameindex].name ); } } } @@ -1007,41 +1464,22 @@ { if ( cfg->token == token_choice_header ) { - printf( "\tglobal %s\n", cfg->optionname ); + printf( "\tglobal tmpvar_%d\n", -(cfg->nameindex) ); + printf("\tset tmpvar_%d \"%s\"\n", -(cfg->nameindex), cfg->value); for ( cfg1 = cfg->next; cfg1 != NULL && cfg1->token == token_choice_item; cfg1 = cfg1->next ) { - printf( "\tglobal %s\n", cfg1->optionname ); - printf( "\tif { $%s == 1 } then { set %s \"%s\" }\n", - cfg1->optionname, cfg->optionname, cfg1->label ); + printf( "\tglobal %s\n", vartable[cfg1->nameindex].name ); + printf( "\tif { $%s == 1 } then { set tmpvar_%d \"%s\" }\n", + vartable[cfg1->nameindex].name, + -(cfg->nameindex), cfg1->label ); } } } printf( "}\n\n\n" ); - printf( "proc update_define { } {\n" ); - clear_globalflags( scfg ); - for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) - { - if ( cfg->token == token_define_bool ) - { - cfg->global_written = 1; - printf( "\tglobal %s\n", cfg->optionname ); - } - } - - for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) - { - if( cfg->token == token_define_bool ) - { - if ( cfg->cond == NULL ) - printf( "\tset %s %s\n", cfg->optionname, cfg->value ); - else - generate_if( cfg, cfg->cond, -1, 0 ); - } - } - printf( "}\n\n\n" ); + generate_update_var( scfg, 0 ); /* * That's it. We are done. The output of this file will have header.tk diff -urN v2.2.15/linux/scripts/tkparse.c linux/scripts/tkparse.c --- v2.2.15/linux/scripts/tkparse.c Sun May 2 09:51:16 1999 +++ linux/scripts/tkparse.c Wed Jun 7 14:26:44 2000 @@ -29,6 +29,17 @@ * 23 January 1999, Michael Elizabeth Chastain, * - Remove bug-compatible code. * + * 07 July 1999, Andrzej M. Krzysztofowicz, + * - Submenus implemented, + * - plenty of option updating/displaying fixes, + * - dep_bool, define_hex, define_int, define_string, define_tristate and + * undef implemented, + * - dep_tristate fixed to support multiple dependencies, + * - handling of variables with an empty value implemented, + * - value checking for int and hex fields, + * - more checking during condition parsing; choice variables are treated as + * all others now, + * * TO DO: * - xconfig is at the end of its life cycle. Contact if * you are interested in working on the replacement. @@ -51,8 +62,6 @@ int my_strcmp( const char * s1, const char * s2 ) { return strcmp( s1, s2 ); } #define strcmp my_strcmp - - /* * Report a syntax error. */ @@ -65,6 +74,30 @@ /* + * Find index of a specyfic variable in the symbol table. + * Create a new entry if it does not exist yet. + */ +#define VARTABLE_SIZE 2048 +struct variable vartable[VARTABLE_SIZE]; +int max_varnum = 0; + +int get_varnum( char * name ) +{ + int i; + + for ( i = 1; i <= max_varnum; i++ ) + if ( strcmp( vartable[i].name, name ) == 0 ) + return i; + if (max_varnum > VARTABLE_SIZE-1) + syntax_error( "Too many variables defined." ); + vartable[++max_varnum].name = malloc( strlen( name )+1 ); + strcpy( vartable[max_varnum].name, name ); + return max_varnum; +} + + + +/* * Get a string. */ static const char * get_string( const char * pnt, char ** label ) @@ -97,7 +130,7 @@ static const char * get_qstring( const char * pnt, char ** label ) { char quote_char; - char newlabel [1024]; + char newlabel [2048]; char * pnt1; /* advance to the open quote */ @@ -138,6 +171,29 @@ } + +/* + * Get a quoted or unquoted string. It is recognized by the first + * non-white character. '"' and '"' are not allowed inside the string. + */ +static const char * get_qnqstring( const char * pnt, char ** label ) +{ + char quote_char; + + while ( *pnt == ' ' || *pnt == '\t' ) + pnt++; + + if ( *pnt == '\0' ) + return pnt; + quote_char = *pnt; + if ( quote_char == '"' || quote_char == '\'' ) + return get_qstring( pnt, label ); + else + return get_string( pnt, label ); +} + + + /* * Tokenize an 'if' statement condition. */ @@ -145,6 +201,7 @@ { struct condition * list; struct condition * last; + struct condition * prev; /* eat the open bracket */ while ( *pnt == ' ' || *pnt == '\t' ) @@ -170,30 +227,53 @@ cond = malloc( sizeof(*cond) ); memset( cond, 0, sizeof(*cond) ); if ( last == NULL ) - { list = last = cond; } + { list = last = cond; prev = NULL; } else - { last->next = cond; last = cond; } + { prev = last; last->next = cond; last = cond; } /* determine the token value */ if ( *pnt == '-' && pnt[1] == 'a' ) - { cond->op = op_and; pnt += 2; continue; } + { + if ( ! prev || ( prev->op != op_variable && prev->op != op_constant ) ) + syntax_error( "incorrect argument" ); + cond->op = op_and; pnt += 2; continue; + } if ( *pnt == '-' && pnt[1] == 'o' ) - { cond->op = op_or; pnt += 2; continue; } + { + if ( ! prev || ( prev->op != op_variable && prev->op != op_constant ) ) + syntax_error( "incorrect argument" ); + cond->op = op_or; pnt += 2; continue; + } if ( *pnt == '!' && pnt[1] == '=' ) - { cond->op = op_neq; pnt += 2; continue; } + { + if ( ! prev || ( prev->op != op_variable && prev->op != op_constant ) ) + syntax_error( "incorrect argument" ); + cond->op = op_neq; pnt += 2; continue; + } if ( *pnt == '=' ) - { cond->op = op_eq; pnt += 1; continue; } + { + if ( ! prev || ( prev->op != op_variable && prev->op != op_constant ) ) + syntax_error( "incorrect argument" ); + cond->op = op_eq; pnt += 1; continue; + } if ( *pnt == '!' ) - { cond->op = op_bang; pnt += 1; continue; } + { + if ( prev && ( prev->op != op_and && prev->op != op_or + && prev->op != op_bang ) ) + syntax_error( "incorrect argument" ); + cond->op = op_bang; pnt += 1; continue; + } if ( *pnt == '"' ) { const char * word; + if ( prev && ( prev->op == op_variable || prev->op == op_constant ) ) + syntax_error( "incorrect argument" ); /* advance to the word */ pnt++; if ( *pnt == '$' ) @@ -217,7 +297,15 @@ char * str = malloc( pnt - word + 1 ); memcpy( str, word, pnt - word ); str [pnt - word] = '\0'; - cond->str = str; + if ( cond->op == op_variable ) + { + cond->nameindex = get_varnum( str ); + free( str ); + } + else /* op_constant */ + { + cond->str = str; + } } pnt++; @@ -241,6 +329,7 @@ for ( ; ; ) { struct kconfig * cfg; + char * buffer = malloc( 64 ); /* skip whitespace */ while ( *pnt == ' ' || *pnt == '\t' ) @@ -262,7 +351,8 @@ pnt = get_string( pnt, &cfg->label ); while ( *pnt == ' ' || *pnt == '\t' ) pnt++; - pnt = get_string( pnt, &cfg->optionname ); + pnt = get_string( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); } return pnt; @@ -270,8 +360,6 @@ - - /* * Tokenize one line. */ @@ -280,6 +368,8 @@ static struct kconfig * last_menuoption = NULL; enum e_token token; struct kconfig * cfg; + struct dependency ** dep_ptr; + char * buffer = malloc( 64 ); /* skip white space */ while ( *pnt == ' ' || *pnt == '\t' ) @@ -313,6 +403,12 @@ case 'd': match_token( token_define_bool, "define_bool" ); + match_token( token_define_hex, "define_hex" ); + match_token( token_define_int, "define_int" ); + match_token( token_define_string, "define_string" ); + match_token( token_define_tristate, "define_tristate" ); + match_token( token_dep_bool, "dep_bool" ); + match_token( token_dep_mbool, "dep_mbool" ); match_token( token_dep_tristate, "dep_tristate" ); break; @@ -371,11 +467,13 @@ syntax_error( "bogus 'then'" ); } +#if 0 if ( token == token_unset ) { fprintf( stderr, "Ignoring 'unset' command\n" ); return; } +#endif if ( token == token_UNKNOWN ) syntax_error( "unknown command" ); @@ -404,8 +502,9 @@ case token_bool: case token_tristate: - pnt = get_qstring ( pnt, &cfg->label ); - pnt = get_string ( pnt, &cfg->optionname ); + pnt = get_qstring ( pnt, &cfg->label ); + pnt = get_string ( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); break; case token_choice_header: @@ -417,9 +516,7 @@ pnt = get_qstring ( pnt, &choice_list ); pnt = get_string ( pnt, &cfg->value ); - cfg->optionname = malloc( 32 ); - sprintf( cfg->optionname, "tmpvar_%d", choose_number++ ); - + cfg->nameindex = -(choose_number++); tokenize_choices( cfg, choice_list ); free( choice_list ); } @@ -430,62 +527,144 @@ if ( last_menuoption != NULL ) { pnt = get_qstring(pnt, &cfg->label); + if (cfg->label == NULL) + syntax_error( "missing comment text" ); last_menuoption->label = cfg->label; last_menuoption = NULL; } break; case token_define_bool: - pnt = get_string( pnt, &cfg->optionname ); + case token_define_tristate: + pnt = get_string( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); while ( *pnt == ' ' || *pnt == '\t' ) pnt++; - if ( *pnt == 'n' || *pnt == 'N' ) cfg->value = "0"; - else if ( *pnt == 'y' || *pnt == 'Y' ) cfg->value = "1"; - else if ( *pnt == 'm' || *pnt == 'M' ) cfg->value = "2"; + if ( ( pnt[0] == 'Y' || pnt[0] == 'M' || pnt[0] == 'N' + || pnt[0] == 'y' || pnt[0] == 'm' || pnt[0] == 'n' ) + && ( pnt[1] == '\0' || pnt[1] == ' ' || pnt[1] == '\t' ) ) + { + if ( *pnt == 'n' || *pnt == 'N' ) cfg->value = strdup( "CONSTANT_N" ); + else if ( *pnt == 'y' || *pnt == 'Y' ) cfg->value = strdup( "CONSTANT_Y" ); + else if ( *pnt == 'm' || *pnt == 'M' ) cfg->value = strdup( "CONSTANT_M" ); + } + else if ( *pnt == '$' ) + { + pnt++; + pnt = get_string( pnt, &cfg->value ); + } else { syntax_error( "unknown define_bool value" ); } + get_varnum( cfg->value ); + break; + + case token_define_hex: + case token_define_int: + pnt = get_string( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); + pnt = get_string( pnt, &cfg->value ); break; + case token_define_string: + pnt = get_string( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); + pnt = get_qnqstring( pnt, &cfg->value ); + if (cfg->value == NULL) + syntax_error( "missing value" ); + break; + + case token_dep_bool: + case token_dep_mbool: case token_dep_tristate: - pnt = get_qstring ( pnt, &cfg->label ); - pnt = get_string ( pnt, &cfg->optionname ); + pnt = get_qstring ( pnt, &cfg->label ); + pnt = get_string ( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); while ( *pnt == ' ' || *pnt == '\t' ) pnt++; - if ( ( pnt[0] == 'Y' || pnt[0] == 'M' || pnt[0] == 'N' - || pnt[0] == 'y' || pnt[0] == 'm' || pnt[0] == 'n' ) - && ( pnt[1] == '\0' || pnt[1] == ' ' || pnt[1] == '\t' ) ) - { - /* dep_tristate 'foo' CONFIG_FOO m */ - if ( pnt[0] == 'Y' || pnt[0] == 'y' ) - cfg->depend = strdup( "CONSTANT_Y" ); - else if ( pnt[0] == 'M' || pnt[0] == 'm' ) - cfg->depend = strdup( "CONSTANT_M" ); + dep_ptr = &(cfg->depend); + + do { + *dep_ptr = (struct dependency *) malloc( sizeof( struct dependency ) ); + (*dep_ptr)->next = NULL; + + if ( ( pnt[0] == 'Y' || pnt[0] == 'M' || pnt[0] == 'N' + || pnt[0] == 'y' || pnt[0] == 'm' || pnt[0] == 'n' ) + && ( pnt[1] == '\0' || pnt[1] == ' ' || pnt[1] == '\t' ) ) + { + /* dep_tristate 'foo' CONFIG_FOO m */ + if ( pnt[0] == 'Y' || pnt[0] == 'y' ) + (*dep_ptr)->name = strdup( "CONSTANT_Y" ); + else if ( pnt[0] == 'N' || pnt[0] == 'n' ) + (*dep_ptr)->name = strdup( "CONSTANT_N" ); + else + (*dep_ptr)->name = strdup( "CONSTANT_M" ); + pnt++; + get_varnum( (*dep_ptr)->name ); + } + else if ( *pnt == '$' ) + { + pnt++; + pnt = get_string( pnt, &(*dep_ptr)->name ); + get_varnum( (*dep_ptr)->name ); + } else - cfg->depend = strdup( "CONSTANT_N" ); - pnt++; - } - else if ( *pnt == '$' ) - { - pnt++; - pnt = get_string( pnt, &cfg->depend ); - } - else - { - syntax_error( "can't handle dep_tristate condition" ); - } + { + syntax_error( "can't handle dep_bool/dep_mbool/dep_tristate condition" ); + } + dep_ptr = &(*dep_ptr)->next; + while ( *pnt == ' ' || *pnt == '\t' ) + pnt++; + } while ( *pnt ); /* - * Create a conditional for this object's dependency. + * Create a conditional for this object's dependencies. */ { char fake_if [1024]; - sprintf( fake_if, "[ \"$%s\" = \"y\" -o \"$%s\" = \"m\" ]; then", - cfg->depend, cfg->depend ); - cfg->cond = tokenize_if( fake_if ); + struct dependency * dep; + struct condition ** cond_ptr; + int first = 1; + + cond_ptr = &(cfg->cond); + for ( dep = cfg->depend; dep; dep = dep->next ) + { + if ( token == token_dep_tristate + && ! strcmp( dep->name, "CONSTANT_M" ) ) + { + continue; + } + if ( first ) + { + first = 0; + } + else + { + *cond_ptr = malloc( sizeof(struct condition) ); + memset( *cond_ptr, 0, sizeof(struct condition) ); + (*cond_ptr)->op = op_and; + cond_ptr = &(*cond_ptr)->next; + } + *cond_ptr = malloc( sizeof(struct condition) ); + memset( *cond_ptr, 0, sizeof(struct condition) ); + (*cond_ptr)->op = op_lparen; + if ( token == token_dep_bool ) + sprintf( fake_if, "[ \"$%s\" = \"y\" -o \"$%s\" = \"\" ]; then", + dep->name, dep->name ); + else + sprintf( fake_if, "[ \"$%s\" = \"y\" -o \"$%s\" = \"m\" -o \"$%s\" = \"\" ]; then", + dep->name, dep->name, dep->name ); + (*cond_ptr)->next = tokenize_if( fake_if ); + while ( *cond_ptr ) + cond_ptr = &(*cond_ptr)->next; + *cond_ptr = malloc( sizeof(struct condition) ); + memset( *cond_ptr, 0, sizeof(struct condition) ); + (*cond_ptr)->op = op_rparen; + cond_ptr = &(*cond_ptr)->next; + } } break; @@ -496,15 +675,19 @@ case token_hex: case token_int: - pnt = get_qstring ( pnt, &cfg->label ); - pnt = get_string ( pnt, &cfg->optionname ); - pnt = get_string ( pnt, &cfg->value ); + pnt = get_qstring ( pnt, &cfg->label ); + pnt = get_string ( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); + pnt = get_string ( pnt, &cfg->value ); break; case token_string: - pnt = get_qstring ( pnt, &cfg->label ); - pnt = get_string ( pnt, &cfg->optionname ); - pnt = get_qstring ( pnt, &cfg->value ); + pnt = get_qstring ( pnt, &cfg->label ); + pnt = get_string ( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); + pnt = get_qnqstring ( pnt, &cfg->value ); + if (cfg->value == NULL) + syntax_error( "missing initial value" ); break; case token_if: @@ -521,8 +704,25 @@ else pnt = get_qstring( pnt, &cfg->label ); break; - } + case token_unset: + pnt = get_string( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); + while ( *pnt == ' ' || *pnt == '\t' ) + pnt++; + while (*pnt) + { + cfg->next = (struct kconfig *) malloc( sizeof(struct kconfig) ); + memset( cfg->next, 0, sizeof(struct kconfig) ); + cfg = cfg->next; + cfg->token = token_unset; + pnt = get_string( pnt, &buffer ); + cfg->nameindex = get_varnum( buffer ); + while ( *pnt == ' ' || *pnt == '\t' ) + pnt++; + } + break; + } return; } @@ -533,7 +733,7 @@ */ static void do_source( const char * filename ) { - char buffer [1024]; + char buffer [2048]; FILE * infile; const char * old_file; int old_lineno; diff -urN v2.2.15/linux/scripts/tkparse.h linux/scripts/tkparse.h --- v2.2.15/linux/scripts/tkparse.h Mon Feb 1 12:03:19 1999 +++ linux/scripts/tkparse.h Wed Jun 7 14:26:44 2000 @@ -14,6 +14,12 @@ token_choice_item, token_comment, token_define_bool, + token_define_hex, + token_define_int, + token_define_string, + token_define_tristate, + token_dep_bool, + token_dep_mbool, token_dep_tristate, token_else, token_endmenu, @@ -46,7 +52,8 @@ op_rparen, op_constant, op_variable, - op_kvariable, + op_true, + op_false, op_nuked }; @@ -55,21 +62,29 @@ * Some operators take strings: * * op_constant "foo" - * op_variable "$ARCH", "$CONFIG_PMAC" - * op_kvariable "$CONFIG_EXPERIMENTAL" + * op_variable "$ARCH", "$CONFIG_PMAC", "$CONFIG_EXPERIMENTAL" * * Most "$..." constructs refer to a variable which is defined somewhere - * in the script, so they become op_kvariable's instead. Note that it - * is legal to test variables which are never defined, such as variables - * that are meaningful only on other architectures. + * in the script. Note that it is legal to test variables which are never + * defined, such as variables that are meaningful only on other architectures. */ struct condition { - struct condition * next; - enum operator op; - const char * str; /* op_constant, op_variable */ - struct kconfig * cfg; /* op_kvariable */ + struct condition * next; + enum operator op; + const char * str; /* op_constant */ + int nameindex; /* op_variable */ +}; + +/* + * Dependency list for dep_bool, dep_mbool, dep_tristate + */ + +struct dependency +{ + char * name; + struct dependency * next; }; /* @@ -80,21 +95,28 @@ { struct kconfig * next; enum e_token token; - char * optionname; + int nameindex; char * label; char * value; struct condition * cond; - char * depend; /* token_dep_tristate */ + struct dependency * depend; /* token_dep_tristate */ struct kconfig * cfg_parent; /* token_choice_item */ /* used only in tkgen.c */ - char global_written; int menu_number; int menu_line; struct kconfig * menu_next; }; +struct variable +{ + char * name; + char defined; + char global_written; +}; +extern struct variable vartable[]; +extern int max_varnum; /* * Prototypes @@ -102,3 +124,4 @@ extern void fix_conditionals ( struct kconfig * scfg ); /* tkcond.c */ extern void dump_tk_script ( struct kconfig * scfg ); /* tkgen.c */ +extern int get_varnum ( char * name ); /* tkparse.c */