summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTae-Young Chung <ty83.chung@samsung.com>2015-08-02 05:51:58 (GMT)
committerTae-Young Chung <ty83.chung@samsung.com>2015-08-02 05:52:41 (GMT)
commit6b95e4f11a5ac5c9fbc89f9d0982787ddc24f929 (patch)
tree7f9464bdc97f155bd7910d9c21c6221feaf95354
parentb58273ff2547cde2ab6edcf2fca0530726f3efcc (diff)
downloadlibzint-6b95e4f11a5ac5c9fbc89f9d0982787ddc24f929.zip
libzint-6b95e4f11a5ac5c9fbc89f9d0982787ddc24f929.tar.gz
libzint-6b95e4f11a5ac5c9fbc89f9d0982787ddc24f929.tar.bz2
Add Zint Barcode Generatorrefs/changes/18/45118/1
Change-Id: I5fe674ec5ee8ba7249edd988822990974e01da06 Signed-off-by: Tae-Young Chung <ty83.chung@samsung.com>
-rw-r--r--CMakeLists.txt44
-rw-r--r--Makefile14
-rw-r--r--SetPaths.cmake236
-rw-r--r--backend/2of5.c117
-rw-r--r--backend/CMakeLists.txt25
-rw-r--r--backend/DEVELOPER45
-rw-r--r--backend/LICENSE13
-rw-r--r--backend/Makefile54
-rw-r--r--backend/Makefile.mingw93
-rw-r--r--backend/code.c188
-rw-r--r--backend/code128.c1013
-rw-r--r--backend/common.c386
-rw-r--r--backend/common.h81
-rw-r--r--backend/dllversion.c31
-rw-r--r--backend/font.h1702
-rw-r--r--backend/gb2312.h7478
-rw-r--r--backend/gs1.c322
-rw-r--r--backend/gs1.h46
-rw-r--r--backend/large.c238
-rw-r--r--backend/large.h51
-rw-r--r--backend/library.c722
-rw-r--r--backend/libzint.la40
-rw-r--r--backend/libzint.rc40
-rw-r--r--backend/maxipng.h149
-rw-r--r--backend/png.c1146
-rw-r--r--backend/ps.c772
-rw-r--r--backend/qr.c2361
-rw-r--r--backend/qr.h167
-rw-r--r--backend/reedsol.c171
-rw-r--r--backend/reedsol.h51
-rw-r--r--backend/render.c792
-rw-r--r--backend/sjis.h6886
-rw-r--r--backend/upcean.c808
-rw-r--r--backend/zint.def27
-rw-r--r--backend/zint.h257
-rw-r--r--cmake/modules/FindZint.cmake51
-rw-r--r--cmake_uninstall.cmake.in21
-rw-r--r--packaging/zint.spec76
-rw-r--r--readme104
-rw-r--r--readme-cmake6
-rw-r--r--readme-vsx.txt30
41 files changed, 26854 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..a225ab7
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,44 @@
+# (c) 2008 by BogDan Vatra < bogdan@licentia.eu >
+
+cmake_minimum_required(VERSION 2.6)
+project(zint-package)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+#set(CMAKE_VERBOSE_MAKEFILE ON)
+#comment or remove the above line before release
+
+add_definitions (-DZINT_VERSION=\"${ZINT_VERSION}\" -Wno-unused-variable -Wall )
+
+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules" )
+
+include (SetPaths.cmake)
+
+INCLUDE (CheckCXXCompilerFlag)
+
+if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
+ check_cxx_compiler_flag("-Wall" CXX_COMPILER_FLAG_WALL)
+ if (CXX_COMPILER_FLAG_WALL)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-variable -Wall")
+ endif (CXX_COMPILER_FLAG_WALL)
+endif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
+
+add_subdirectory(backend)
+
+CONFIGURE_FILE(
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+ IMMEDIATE @ONLY)
+
+ADD_CUSTOM_TARGET(uninstall
+ "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
+
+install(FILES cmake/modules/FindZint.cmake DESTINATION /usr/share/cmake/Modules COMPONENT Devel)
+
+# This needs to be run very last so other parts of the scripts can take
+# advantage of this.
+IF(NOT ZINT_HAS_BEEN_RUN_BEFORE)
+ SET(ZINT_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before")
+ENDIF(NOT ZINT_HAS_BEEN_RUN_BEFORE)
+
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..965f935
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,14 @@
+# Make libzint and zint together
+
+zint:
+ $(MAKE) -C backend/
+
+install:
+ $(MAKE) install -C backend/
+
+uninstall:
+ $(MAKE) uninstall -C backend/
+
+clean:
+ $(MAKE) clean -C backend/
+
diff --git a/SetPaths.cmake b/SetPaths.cmake
new file mode 100644
index 0000000..193aabc
--- /dev/null
+++ b/SetPaths.cmake
@@ -0,0 +1,236 @@
+# - Find include and library dirs, and define a some macros
+#
+# This module defines a bunch of variables used as locations for install directories.
+# They can be relative (to CMAKE_INSTALL_PREFIX) or absolute.
+# Under Windows they are always relative.
+#
+# BIN_INSTALL_DIR - the directory where executables will be installed (default is prefix/bin)
+# BUNDLE_INSTALL_DIR - Mac only: the directory where application bundles will be installed (default is /Applications/KDE4 )
+# SBIN_INSTALL_DIR - the directory where system executables will be installed (default is prefix/sbin)
+# LIB_INSTALL_DIR - the directory where libraries will be installed (default is prefix/lib)
+# CONFIG_INSTALL_DIR - the config file install dir
+# DATA_INSTALL_DIR - the parent directory where applications can install their data
+# HTML_INSTALL_DIR - the HTML install dir for documentation
+# ICON_INSTALL_DIR - the icon install dir (default prefix/share/icons/)
+# INFO_INSTALL_DIR - the kde info install dir (default prefix/info)
+# KCFG_INSTALL_DIR - the install dir for kconfig files
+# LOCALE_INSTALL_DIR - the install dir for translations
+# MAN_INSTALL_DIR - the kde man page install dir (default prefix/man/)
+# MIME_INSTALL_DIR - the install dir for the mimetype desktop files
+# PLUGIN_INSTALL_DIR - the subdirectory relative to the install prefix where plugins will be installed (default is ${KDE4_LIB_INSTALL_DIR}/kde4)
+# SERVICES_INSTALL_DIR - the install dir for service (desktop, protocol, ...) files
+# SERVICETYPES_INSTALL_DIR - the install dir for servicestypes desktop files
+# SOUND_INSTALL_DIR - the install dir for sound files
+# TEMPLATES_INSTALL_DIR - the install dir for templates (Create new file...)
+# WALLPAPER_INSTALL_DIR - the install dir for wallpapers
+# DEMO_INSTALL_DIR - the install dir for demos
+# KCONF_UPDATE_INSTALL_DIR - the kconf_update install dir
+# XDG_APPS_INSTALL_DIR - the XDG apps dir
+# XDG_DIRECTORY_INSTALL_DIR- the XDG directory
+# XDG_MIME_INSTALL_DIR - the XDG mimetypes install dir
+# DBUS_INTERFACES_INSTALL_DIR - the directory where dbus interfaces be installed (default is prefix/share/dbus-1/interfaces)
+# DBUS_SERVICES_INSTALL_DIR - the directory where dbus services be installed (default is prefix/share/dbus-1/services )
+#
+# A note on the possible values for CMAKE_BUILD_TYPE and how KDE handles
+# the flags for those buildtypes. FindKDE4Internal supports the values
+# Debug, Release, Relwithdebinfo, Profile and Debugfull
+#
+# Release
+# optimised for speed, qDebug/kDebug turned off, no debug symbols
+# Release with debug info
+# optimised for speed, debugging symbols on (-g)
+# Debug
+# optimised but debuggable, debugging on (-g)
+# (-fno-reorder-blocks -fno-schedule-insns -fno-inline)
+# DebugFull
+# no optimisation, full debugging on (-g3)
+# Profile
+# DebugFull + -ftest-coverage -fprofile-arcs
+#
+# It is expected that the "Debug" build type be still debuggable with gdb
+# without going all over the place, but still produce better performance.
+# It's also important to note that gcc cannot detect all warning conditions
+# unless the optimiser is active.
+#
+
+# Copyright (c) 2006-2008, Alexander Neundorf <neundorf@kde.org>
+# Copyright (c) 2006, Laurent Montel, <montel@kde.org>
+# Copyright (c) 2008, BogDan Vatra, <bogdan@licentia.eu>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+
+########## the following are directories where stuff will be installed to ###########
+#
+# this has to be after find_xxx() block above
+
+if (WIN32)
+# use relative install prefix to avoid hardcoded install paths in cmake_install.cmake files
+
+ set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}" ) # The subdirectory relative to the install prefix where libraries will be installed (default is ${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX})
+
+ set(EXEC_INSTALL_PREFIX "" ) # Base directory for executables and libraries
+ set(SHARE_INSTALL_PREFIX "share" ) # Base directory for files which go to share/
+ set(BIN_INSTALL_DIR "bin" ) # The install dir for executables (default ${EXEC_INSTALL_PREFIX}/bin)
+ set(SBIN_INSTALL_DIR "sbin" ) # The install dir for system executables (default ${EXEC_INSTALL_PREFIX}/sbin)
+
+ set(LIBEXEC_INSTALL_DIR "${BIN_INSTALL_DIR}" ) # The subdirectory relative to the install prefix where libraries will be installed (default is ${BIN_INSTALL_DIR})
+ set(INCLUDE_INSTALL_DIR "include" ) # The subdirectory to the header prefix
+
+ set(PLUGIN_INSTALL_DIR "lib${LIB_SUFFIX}/kde4" ) # "The subdirectory relative to the install prefix where plugins will be installed (default is ${LIB_INSTALL_DIR}/kde4)
+ set(CONFIG_INSTALL_DIR "share/config" ) # The config file install dir
+ set(DATA_INSTALL_DIR "share/apps" ) # The parent directory where applications can install their data
+ set(HTML_INSTALL_DIR "share/doc/HTML" ) # The HTML install dir for documentation
+ set(ICON_INSTALL_DIR "share/icons" ) # The icon install dir (default ${SHARE_INSTALL_PREFIX}/share/icons/)
+ set(KCFG_INSTALL_DIR "share/config.kcfg" ) # The install dir for kconfig files
+ set(LOCALE_INSTALL_DIR "share/locale" ) # The install dir for translations
+ set(MIME_INSTALL_DIR "share/mimelnk" ) # The install dir for the mimetype desktop files
+ set(SERVICES_INSTALL_DIR "share/kde4/services" ) # The install dir for service (desktop, protocol, ...) files
+ set(SERVICETYPES_INSTALL_DIR "share/kde4/servicetypes" ) # The install dir for servicestypes desktop files
+ set(SOUND_INSTALL_DIR "share/sounds" ) # The install dir for sound files
+ set(TEMPLATES_INSTALL_DIR "share/templates" ) # The install dir for templates (Create new file...)
+ set(WALLPAPER_INSTALL_DIR "share/wallpapers" ) # The install dir for wallpapers
+ set(DEMO_INSTALL_DIR "share/demos" ) # The install dir for demos
+ set(KCONF_UPDATE_INSTALL_DIR "share/apps/kconf_update" ) # The kconf_update install dir
+ set(AUTOSTART_INSTALL_DIR "share/autostart" ) # The install dir for autostart files
+
+ set(XDG_APPS_INSTALL_DIR "share/applications/kde4" ) # The XDG apps dir
+ set(XDG_DIRECTORY_INSTALL_DIR "share/desktop-directories" ) # The XDG directory
+ set(XDG_MIME_INSTALL_DIR "share/mime/packages" ) # The install dir for the xdg mimetypes
+
+ set(SYSCONF_INSTALL_DIR "etc" ) # The kde sysconfig install dir (default /etc)
+ set(MAN_INSTALL_DIR "share/man" ) # The kde man install dir (default ${SHARE_INSTALL_PREFIX}/man/)
+ set(INFO_INSTALL_DIR "share/info" ) # The kde info install dir (default ${SHARE_INSTALL_PREFIX}/info)")
+ set(DBUS_INTERFACES_INSTALL_DIR "share/dbus-1/interfaces" ) # The kde dbus interfaces install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/interfaces)")
+ set(DBUS_SERVICES_INSTALL_DIR "share/dbus-1/services" ) # The kde dbus services install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/services)")
+
+else (WIN32)
+
+ # This macro implements some very special logic how to deal with the cache.
+ # By default the various install locations inherit their value from their "parent" variable
+ # so if you set CMAKE_INSTALL_PREFIX, then EXEC_INSTALL_PREFIX, PLUGIN_INSTALL_DIR will
+ # calculate their value by appending subdirs to CMAKE_INSTALL_PREFIX .
+ # This would work completely without using the cache.
+ # But if somebody wants e.g. a different EXEC_INSTALL_PREFIX this value has to go into
+ # the cache, otherwise it will be forgotten on the next cmake run.
+ # Once a variable is in the cache, it doesn't depend on its "parent" variables
+ # anymore and you can only change it by editing it directly.
+ # this macro helps in this regard, because as long as you don't set one of the
+ # variables explicitely to some location, it will always calculate its value from its
+ # parents. So modifying CMAKE_INSTALL_PREFIX later on will have the desired effect.
+ # But once you decide to set e.g. EXEC_INSTALL_PREFIX to some special location
+ # this will go into the cache and it will no longer depend on CMAKE_INSTALL_PREFIX.
+ #
+ # additionally if installing to the same location as kdelibs, the other install
+ # directories are reused from the installed kdelibs
+ macro(_SET_FANCY _var _value _comment)
+ set(predefinedvalue "${_value}")
+
+ if (NOT DEFINED ${_var})
+ set(${_var} ${predefinedvalue})
+ else (NOT DEFINED ${_var})
+ set(${_var} "${${_var}}" CACHE PATH "${_comment}")
+ endif (NOT DEFINED ${_var})
+ endmacro(_SET_FANCY)
+
+ if(APPLE)
+ set(BUNDLE_INSTALL_DIR "/Applications/KDE4" CACHE PATH "Directory where application bundles will be installed to on OSX" )
+ endif(APPLE)
+
+ _set_fancy(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" "Base directory for executables and libraries")
+ _set_fancy(SHARE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share" "Base directory for files which go to share/")
+ _set_fancy(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" "The install dir for executables (default ${EXEC_INSTALL_PREFIX}/bin)")
+ _set_fancy(SBIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/sbin" "The install dir for system executables (default ${EXEC_INSTALL_PREFIX}/sbin)")
+ _set_fancy(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}" "The subdirectory relative to the install prefix where libraries will be installed (default is ${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX})")
+ _set_fancy(LIBEXEC_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4/libexec" "The subdirectory relative to the install prefix where libraries will be installed (default is ${LIB_INSTALL_DIR}/kde4/libexec)")
+ _set_fancy(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" "The subdirectory to the header prefix")
+
+ _set_fancy(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4" "The subdirectory relative to the install prefix where plugins will be installed (default is ${LIB_INSTALL_DIR}/kde4)")
+ _set_fancy(CONFIG_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/config" "The config file install dir")
+ _set_fancy(DATA_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/apps" "The parent directory where applications can install their data")
+ _set_fancy(HTML_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/doc/HTML" "The HTML install dir for documentation")
+ _set_fancy(ICON_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/icons" "The icon install dir (default ${SHARE_INSTALL_PREFIX}/share/icons/)")
+ _set_fancy(KCFG_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/config.kcfg" "The install dir for kconfig files")
+ _set_fancy(LOCALE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/locale" "The install dir for translations")
+ _set_fancy(MIME_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/mimelnk" "The install dir for the mimetype desktop files")
+ _set_fancy(SERVICES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/kde4/services" "The install dir for service (desktop, protocol, ...) files")
+ _set_fancy(SERVICETYPES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/kde4/servicetypes" "The install dir for servicestypes desktop files")
+ _set_fancy(SOUND_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/sounds" "The install dir for sound files")
+ _set_fancy(TEMPLATES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/templates" "The install dir for templates (Create new file...)")
+ _set_fancy(WALLPAPER_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/wallpapers" "The install dir for wallpapers")
+ _set_fancy(DEMO_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/demos" "The install dir for demos")
+ _set_fancy(KCONF_UPDATE_INSTALL_DIR "${DATA_INSTALL_DIR}/kconf_update" "The kconf_update install dir")
+ _set_fancy(AUTOSTART_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/autostart" "The install dir for autostart files")
+
+ _set_fancy(XDG_APPS_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/applications/kde4" "The XDG apps dir")
+ _set_fancy(XDG_DIRECTORY_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/desktop-directories" "The XDG directory")
+ _set_fancy(XDG_MIME_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/mime/packages" "The install dir for the xdg mimetypes")
+
+ _set_fancy(SYSCONF_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/etc" "The kde sysconfig install dir (default ${CMAKE_INSTALL_PREFIX}/etc)")
+ _set_fancy(MAN_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/man" "The kde man install dir (default ${SHARE_INSTALL_PREFIX}/man/)")
+ _set_fancy(INFO_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/info" "The kde info install dir (default ${SHARE_INSTALL_PREFIX}/info)")
+ _set_fancy(DBUS_INTERFACES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/interfaces" "The kde dbus interfaces install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/interfaces)")
+ _set_fancy(DBUS_SERVICES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/services" "The kde dbus services install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/services)")
+
+endif (WIN32)
+
+
+# The INSTALL_TARGETS_DEFAULT_ARGS variable should be used when libraries are installed.
+# The arguments are also ok for regular executables, i.e. executables which don't go
+# into sbin/ or libexec/, but for installing executables the basic syntax
+# INSTALL(TARGETS kate DESTINATION "${BIN_INSTALL_DIR}")
+# is enough, so using this variable there doesn't help a lot.
+# The variable must not be used for installing plugins.
+# Usage is like this:
+# install(TARGETS kdecore kdeui ${INSTALL_TARGETS_DEFAULT_ARGS} )
+#
+# This will install libraries correctly under UNIX, OSX and Windows (i.e. dll's go
+# into bin/.
+# Later on it will be possible to extend this for installing OSX frameworks
+# The COMPONENT Devel argument has the effect that static libraries belong to the
+# "Devel" install component. If we use this also for all install() commands
+# for header files, it will be possible to install
+# -everything: make install OR cmake -P cmake_install.cmake
+# -only the development files: cmake -DCOMPONENT=Devel -P cmake_install.cmake
+# -everything except the development files: cmake -DCOMPONENT=Unspecified -P cmake_install.cmake
+# This can then also be used for packaging with cpack.
+
+set(INSTALL_TARGETS_DEFAULT_ARGS RUNTIME DESTINATION "${BIN_INSTALL_DIR}"
+ LIBRARY DESTINATION "${LIB_INSTALL_DIR}"
+ ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" COMPONENT Devel )
+
+
+set(CMAKE_SYSTEM_INCLUDE_PATH ${CMAKE_SYSTEM_INCLUDE_PATH}
+ "${INCLUDE_INSTALL_DIR}")
+
+set(CMAKE_SYSTEM_PROGRAM_PATH ${CMAKE_SYSTEM_PROGRAM_PATH}
+ "${BIN_INSTALL_DIR}" )
+
+set(CMAKE_SYSTEM_LIBRARY_PATH ${CMAKE_SYSTEM_LIBRARY_PATH}
+ "${LIB_INSTALL_DIR}" )
+
+
+######################################################
+# and now the platform specific stuff
+######################################################
+
+# Set a default build type for single-configuration
+# CMake generators if no build type is set.
+if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE RelWithDebInfo)
+endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
+
+
+
+# setup default RPATH/install_name handling, may be overridden by KDE4_HANDLE_RPATH_FOR_[LIBRARY|EXECUTABLE]
+# default is to build with RPATH for the install dir, so it doesn't need to relink
+if (UNIX)
+ # add our LIB_INSTALL_DIR to the RPATH and use the RPATH figured out by cmake when compiling
+ set(CMAKE_INSTALL_RPATH ${LIB_INSTALL_DIR} )
+ set(CMAKE_SKIP_BUILD_RPATH TRUE)
+ set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
+ set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+endif (UNIX)
+
diff --git a/backend/2of5.c b/backend/2of5.c
new file mode 100644
index 0000000..df07f46
--- /dev/null
+++ b/backend/2of5.c
@@ -0,0 +1,117 @@
+/* 2of5.c - Handles Code 2 of 5 barcodes */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "common.h"
+#ifdef _MSC_VER
+#include <malloc.h>
+#endif
+
+static const char *C25MatrixTable[10] = {"113311", "311131", "131131", "331111", "113131", "313111",
+ "133111", "111331", "311311", "131311"};
+
+static const char *C25IndustTable[10] = {"1111313111", "3111111131", "1131111131", "3131111111", "1111311131",
+ "3111311111", "1131311111", "1111113131", "3111113111", "1131113111"};
+
+static const char *C25InterTable[10] = {"11331", "31113", "13113", "33111", "11313", "31311", "13311", "11133",
+ "31131", "13131"};
+
+static inline char check_digit(unsigned int count)
+{
+ return itoc((10 - (count % 10)) % 10);
+}
+
+int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length)
+{ /* Code 2 of 5 Interleaved */
+
+ int i, j, k, error_number;
+ char bars[7], spaces[7], mixed[14], dest[1000];
+#ifndef _MSC_VER
+ unsigned char temp[length + 2];
+#else
+ unsigned char* temp = (unsigned char *)_alloca((length + 2) * sizeof(unsigned char));
+#endif
+
+ error_number = 0;
+
+ if(length > 89) {
+ strcpy(symbol->errtxt, "Input too long");
+ return ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Invalid characters in data");
+ return error_number;
+ }
+
+ ustrcpy(temp, (unsigned char *) "");
+ /* Input must be an even number of characters for Interlaced 2 of 5 to work:
+ if an odd number of characters has been entered then add a leading zero */
+ if (length & 1)
+ {
+ ustrcpy(temp, (unsigned char *) "0");
+ length++;
+ }
+ uconcat(temp, source);
+
+ /* start character */
+ strcpy(dest, "1111");
+
+ for(i = 0; i < length; i+=2 )
+ {
+ /* look up the bars and the spaces and put them in two strings */
+ strcpy(bars, "");
+ lookup(NEON, C25InterTable, temp[i], bars);
+ strcpy(spaces, "");
+ lookup(NEON, C25InterTable, temp[i + 1], spaces);
+
+ /* then merge (interlace) the strings together */
+ k = 0;
+ for(j = 0; j <= 4; j++)
+ {
+ mixed[k] = bars[j]; k++;
+ mixed[k] = spaces[j]; k++;
+ }
+ mixed[k] = '\0';
+ concat (dest, mixed);
+ }
+
+ /* Stop character */
+ concat (dest, "311");
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, temp);
+ return error_number;
+
+}
diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt
new file mode 100644
index 0000000..be1a810
--- /dev/null
+++ b/backend/CMakeLists.txt
@@ -0,0 +1,25 @@
+# (c) 2008 by BogDan Vatra < bogdan@licentia.eu >
+
+project(zint)
+
+set(zint_COMMON_SRCS common.c library.c render.c ps.c large.c reedsol.c gs1.c png.c)
+set(zint_ONEDIM_SRCS code.c code128.c 2of5.c upcean.c)
+set(zint_TWODIM_SRCS qr.c)
+set(zint_SRCS ${zint_COMMON_SRCS} ${zint_ONEDIM_SRCS} ${zint_TWODIM_SRCS} )
+
+add_definitions (-DNO_PNG)
+
+add_library(zint SHARED ${zint_SRCS})
+
+SET_TARGET_PROPERTIES(zint
+ PROPERTIES
+ VERSION ${FULLVER}
+ SOVERSION ${MAJORVER}
+ CLEAN_DIRECT_OUTPUT 1
+)
+
+target_link_libraries(zint -lm)
+
+install(TARGETS zint ${INSTALL_TARGETS_DEFAULT_ARGS} )
+install(FILES zint.h DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel)
+install(FILES LICENSE DESTINATION ${SHARE_INSTALL_PREFIX}/zint)
diff --git a/backend/DEVELOPER b/backend/DEVELOPER
new file mode 100644
index 0000000..7db3a77
--- /dev/null
+++ b/backend/DEVELOPER
@@ -0,0 +1,45 @@
+Contents
+--------
+
+Here is a guide to which bit of source code does what.
+
+2of5.c:
+ Matrix 2 of 5
+ Industrial 2 of 5
+ IATA 2 of 5
+ Data Logic
+ Interleaved 2 of 5
+ ITF-14
+ Deutche Post Leitcode
+ Deutche Post Identcode
+
+code128.c:
+ Code 128
+ Code 128 Subset B
+ NVE-18
+ GS1-128 (UCC/EAN-128)
+ EAN-14
+
+code.c:
+ Code 11
+ Code 39
+ Pharmazentral Nummer (PZN)
+ Extended Code 39 (Code 39+)
+ Code 93
+ LOGMARS
+ Channel Code
+
+qr.c:
+ QR Code
+ Micro QR Code
+
+upcean.c:
+ UPC-A
+ UPC-E
+ EAN-2 add-on
+ EAN-5 add-on
+ EAN-8
+ EAN-13
+ SBN (verification)
+ ISBN (verification)
+ ISBN-13 (verification)
diff --git a/backend/LICENSE b/backend/LICENSE
new file mode 100644
index 0000000..723ef63
--- /dev/null
+++ b/backend/LICENSE
@@ -0,0 +1,13 @@
+ZINT was originally developed by Robin Stuart and licensed under the terms of the GPL (Gnu
+Public License). In 2013 Robin Stuart and all developers that contributed to the code agreed
+to change the license to a less restrictive one (see ZINT mailing list of May 2013 for
+related mails) under the following conditions:
+- the names of original copyright holder Robin Stuart and contributors are not removed,
+ neither from sources nor from the manual
+- the documentation is done in British English (as Robin said: "Oh, and please don't
+ replace the word "colour" with "color" in the documentation - that really annoys me!")
+
+Change to BSD-license is done for backend and therefore for ZINT shared library only, for
+the frontends and Qt4-backend the GPL is still valid. Since BSD-license is GPL-compatible
+this gives the possibility to include ZINT library in own products or link against it from
+own software.
diff --git a/backend/Makefile b/backend/Makefile
new file mode 100644
index 0000000..2f339dd
--- /dev/null
+++ b/backend/Makefile
@@ -0,0 +1,54 @@
+# Linux makefile for libzint
+#
+# make compiles
+# make install copies to /usr/local/lib
+# make uninstall removes library
+# make clean cleans up a previous compilation and any object or editor files
+#
+
+ZINT_VERSION:=-DZINT_VERSION=\"2.4.3.0\"
+
+
+CC := gcc
+INCLUDE := -I/usr/include
+CFLAGS := -g
+
+prefix := /usr
+includedir := $(prefix)/include
+libdir := $(prefix)/lib
+DESTDIR :=
+
+COMMON:= common.c render.c png.c library.c ps.c large.c reedsol.c gs1.c svg.c
+COMMON_OBJ:= common.o render.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o
+ONEDIM:= code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c
+ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o
+POSTAL:= postal.c auspost.c imail.c
+POSTAL_OBJ:= postal.o auspost.o imail.o
+TWODIM:= code16k.c dmatrix.c pdf417.c qr.c maxicode.c composite.c aztec.c code49.c code1.c gridmtx.c
+TWODIM_OBJ:= code16k.o dmatrix.o pdf417.o qr.o maxicode.o composite.o aztec.o code49.o code1.o gridmtx.o
+LIBS:= `libpng15-config --I_opts --L_opts --ldflags` -lz -lm
+
+libzint: code.c code128.c 2of5.c upcean.c medical.c telepen.c plessey.c postal.c auspost.c imail.c code16k.c dmatrix.c reedsol.c pdf417.c maxicode.c rss.c common.c render.c png.c library.c ps.c qr.c large.c composite.c aztec.c gs1.c svg.c code49.c code1.c gridmtx.c
+ $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(ONEDIM)
+ $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(POSTAL)
+ $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(TWODIM)
+ $(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c $(COMMON)
+ $(CC) $(CFLAGS) $(ZINT_VERSION) -shared -Wl,-soname,libzint.so -o libzint.so.2.4.3 $(INCLUDE) $(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) $(POSTAL_OBJ) $(LIBS)
+ ln -s libzint.so.* libzint.so
+
+.PHONY: install uninstall clean dist
+
+install:
+ test "$(UID)" = "0" && ldconfig -n $(PWD) || true
+ install -d $(DESTDIR)$(libdir)
+ mv libzint.* $(DESTDIR)$(libdir)
+ install -D -p --mode=0644 zint.h $(DESTDIR)$(includedir)/zint.h
+
+uninstall:
+ rm $(DESTDIR)$(libdir)/libzint.*
+ rm $(DESTDIR)$(includedir)/zint.h
+
+clean:
+ rm -f libzint.* *.o *.a *~
+
+
diff --git a/backend/Makefile.mingw b/backend/Makefile.mingw
new file mode 100644
index 0000000..87fc946
--- /dev/null
+++ b/backend/Makefile.mingw
@@ -0,0 +1,93 @@
+# Linux makefile for libzint
+#
+# make compiles with QR Code support
+# make install copies to /usr/lib
+# make uninstall removes library
+# make clean cleans up a previous compilation and any object or editor files
+#
+
+ZINT_VERSION:=-DZINT_VERSION=\"2.4.3.0\"
+
+
+CC:= gcc -m32
+LD:= ld
+AR:= ar rc
+RANLIB:= ranlib
+INCLUDE:= -I/mingw/include
+CFLAGS:= -O2 -fms-extensions -mms-bitfields -fno-exceptions -fomit-frame-pointer -Wall
+LDFLAGS = -Wl,--major-image-version=2 -Wl,--minor-image-version=43
+RC:= windres
+RCFLAGS:= -v -F pe-i386 --define GCC_WINDRES
+
+prefix := /mingw
+includedir := $(prefix)/include
+libdir := $(prefix)/lib
+bindir := $(prefix)/bin
+DESTDIR :=
+APP:=zint
+DLL:=$(APP).dll
+DLLIMP:=lib$(DLL).a
+STATLIB:=lib$(APP).a
+TOOLLIB:=lib$(APP).la
+
+COMMON_OBJ:= common.o render.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o
+ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o
+POSTAL_OBJ:= postal.o auspost.o imail.o
+TWODIM_OBJ:= code16k.o dmatrix.o pdf417.o qr.o maxicode.o composite.o aztec.o code49.o code1.o gridmtx.o
+
+LIB_OBJ:= $(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) $(POSTAL_OBJ)
+DLL_OBJ:= $(LIB_OBJ:.o=.lo) dllversion.lo
+
+ifeq ($(NO_PNG),true)
+DEFINES+= -DNO_PNG
+else
+DEFINES_DLL+= -DPNG_DLL -DZLIB_DLL
+LIBS+= -lpng -lz
+endif
+
+LIBS+= -lm
+
+all: $(DLL) $(STATLIB)
+DLL: $(DLL)
+static: $(STATLIB)
+
+%.lo:%.c
+ @echo Compiling $< ...
+ $(CC) $(CFLAGS) $(DEFINES) $(DEFINES_DLL) -DDLL_EXPORT -DPIC $(ZINT_VERSION) -c -o $@ $<
+
+%.o:%.c
+ @echo Compiling $< ...
+ $(CC) $(CFLAGS) $(DEFINES) $(ZINT_VERSION) -c -o $@ $<
+
+libzint.o: libzint.rc
+ $(RC) $(RCFLAGS) -o $@ $<
+
+$(DLL):$(DLL_OBJ) libzint.o
+ @echo Linking $@...
+ $(CC) -shared -Wl,--out-implib,$(DLLIMP) $(LDFLAGS) -o $@ zint.def $(DLL_OBJ) libzint.o $(LIBS)
+
+$(STATLIB): $(LIB_OBJ)
+ @echo Linking $@...
+ $(AR) $@ $(LIB_OBJ)
+ -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
+
+.PHONY: install uninstall clean dist
+
+install:
+ cp -fp $(DLLIMP) $(DESTDIR)$(libdir)
+ cp -fp $(STATLIB) $(DESTDIR)$(libdir)
+ cp -fp $(TOOLLIB) $(DESTDIR)$(libdir)
+ cp -fp zint.h $(DESTDIR)$(includedir)/zint.h
+ cp -fp $(DLL) $(DESTDIR)$(bindir)
+
+uninstall:
+ rm $(DESTDIR)$(libdir)/$(DLLIMP)
+ rm $(DESTDIR)$(libdir)/$(STATLIB)
+ rm $(DESTDIR)$(libdir)/$(TOOLLIB)
+ rm $(DESTDIR)$(includedir)/zint.h
+ rm $(DESTDIR)$(bindir)/$(DLL)
+
+clean:
+ rm -f *.lib *.dll *.o *.a *~ *.res *.exe *.lo *.bak
+
+
diff --git a/backend/code.c b/backend/code.c
new file mode 100644
index 0000000..9d30e5a
--- /dev/null
+++ b/backend/code.c
@@ -0,0 +1,188 @@
+/* code.c - Handles Code 11, 39, 39+ and 93 */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+/* In version 0.5 this file was 1,553 lines long! */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "common.h"
+
+#define SODIUM "0123456789-"
+#define SILVER "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd"
+
+static const char *C11Table[11] = {"111121", "211121", "121121", "221111", "112121", "212111", "122111",
+ "111221", "211211", "211111", "112111"};
+
+
+/* Code 39 tables checked against ISO/IEC 16388:2007 */
+
+/* Incorporates Table A1 */
+
+static const char *C39Table[43] = { "1112212111", "2112111121", "1122111121", "2122111111", "1112211121",
+ "2112211111", "1122211111", "1112112121", "2112112111", "1122112111", "2111121121",
+ "1121121121", "2121121111", "1111221121", "2111221111", "1121221111", "1111122121",
+ "2111122111", "1121122111", "1111222111", "2111111221", "1121111221", "2121111211",
+ "1111211221", "2111211211", "1121211211", "1111112221", "2111112211", "1121112211",
+ "1111212211", "2211111121", "1221111121", "2221111111", "1211211121", "2211211111",
+ "1221211111", "1211112121", "2211112111", "1221112111", "1212121111", "1212111211",
+ "1211121211", "1112121211"};
+/* Code 39 character assignments (Table 1) */
+
+static const char *EC39Ctrl[128] = {"%U", "$A", "$B", "$C", "$D", "$E", "$F", "$G", "$H", "$I", "$J", "$K",
+ "$L", "$M", "$N", "$O", "$P", "$Q", "$R", "$S", "$T", "$U", "$V", "$W", "$X", "$Y", "$Z",
+ "%A", "%B", "%C", "%D", "%E", " ", "/A", "/B", "/C", "/D", "/E", "/F", "/G", "/H", "/I", "/J",
+ "/K", "/L", "-", ".", "/O", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/Z", "%F",
+ "%G", "%H", "%I", "%J", "%V", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "%K", "%L", "%M", "%N", "%O",
+ "%W", "+A", "+B", "+C", "+D", "+E", "+F", "+G", "+H", "+I", "+J", "+K", "+L", "+M", "+N", "+O",
+ "+P", "+Q", "+R", "+S", "+T", "+U", "+V", "+W", "+X", "+Y", "+Z", "%P", "%Q", "%R", "%S", "%T"};
+/* Encoding the full ASCII character set in Code 39 (Table A2) */
+
+static const char *C93Ctrl[128] = {"bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK",
+ "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ",
+ "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "cD", "cE", "cF", "cG", "cH", "cI", "cJ",
+ "cK", "cL", "cM", "cN", "cO", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF",
+ "bG", "bH", "bI", "bJ", "bV", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bK", "bL", "bM", "bN", "bO",
+ "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO",
+ "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT"};
+
+static const char *C93Table[47] = {"131112", "111213", "111312", "111411", "121113", "121212", "121311",
+ "111114", "131211", "141111", "211113", "211212", "211311", "221112", "221211", "231111",
+ "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122",
+ "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221",
+ "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131",
+ "121221", "312111", "311121", "122211"};
+
+/* Global Variables for Channel Code */
+int S[11], B[11];
+long value;
+long target_value;
+char pattern[30];
+
+int c39(struct zint_symbol *symbol, unsigned char source[], int length)
+{ /* Code 39 */
+ unsigned int i;
+ unsigned int counter;
+ char check_digit;
+ int error_number;
+ char dest[775];
+ char localstr[2] = { 0 };
+
+ error_number = 0;
+ counter = 0;
+
+ if((symbol->option_2 < 0) || (symbol->option_2 > 1)) {
+ symbol->option_2 = 0;
+ }
+
+ if((symbol->symbology == BARCODE_LOGMARS) && (length > 59)) {
+ strcpy(symbol->errtxt, "Input too long");
+ return ERROR_TOO_LONG;
+ } else if(length > 74) {
+ strcpy(symbol->errtxt, "Input too long");
+ return ERROR_TOO_LONG;
+ }
+ to_upper(source);
+ error_number = is_sane(SILVER , source, length);
+ if(error_number == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Invalid characters in data");
+ return error_number;
+ }
+
+ /* Start character */
+ strcpy(dest, "1211212111");
+
+ for(i = 0; i < length; i++) {
+ lookup(SILVER, C39Table, source[i], dest);
+ counter += posn(SILVER, source[i]);
+ }
+
+ if((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) {
+
+ counter = counter % 43;
+ if(counter < 10) {
+ check_digit = itoc(counter);
+ } else {
+ if(counter < 36) {
+ check_digit = (counter - 10) + 'A';
+ } else {
+ switch(counter) {
+ case 36: check_digit = '-'; break;
+ case 37: check_digit = '.'; break;
+ case 38: check_digit = ' '; break;
+ case 39: check_digit = '$'; break;
+ case 40: check_digit = '/'; break;
+ case 41: check_digit = '+'; break;
+ case 42: check_digit = 37; break;
+ default: check_digit = ' '; break; /* Keep compiler happy */
+ }
+ }
+ }
+ lookup(SILVER, C39Table, check_digit, dest);
+
+ /* Display a space check digit as _, otherwise it looks like an error */
+ if(check_digit == ' ') {
+ check_digit = '_';
+ }
+
+ localstr[0] = check_digit;
+ localstr[1] = '\0';
+ }
+
+ /* Stop character */
+ concat (dest, "121121211");
+
+ if((symbol->symbology == BARCODE_LOGMARS) || (symbol->symbology == BARCODE_HIBC_39)) {
+ /* LOGMARS uses wider 'wide' bars than normal Code 39 */
+ counter = strlen(dest);
+ for(i = 0; i < counter; i++) {
+ if(dest[i] == '2') {
+ dest[i] = '3';
+ }
+ }
+ }
+
+ expand(symbol, dest);
+
+ if(symbol->symbology == BARCODE_CODE39) {
+ ustrcpy(symbol->text, (unsigned char*)"*");
+ uconcat(symbol->text, source);
+ uconcat(symbol->text, (unsigned char*)localstr);
+ uconcat(symbol->text, (unsigned char*)"*");
+ } else {
+ ustrcpy(symbol->text, source);
+ uconcat(symbol->text, (unsigned char*)localstr);
+ }
+ return error_number;
+}
diff --git a/backend/code128.c b/backend/code128.c
new file mode 100644
index 0000000..f0f985d
--- /dev/null
+++ b/backend/code128.c
@@ -0,0 +1,1013 @@
+/* code128.c - Handles Code 128 and derivatives */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+ Bugfixes thanks to Christian Sakowski and BogDan Vatra
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+#include <malloc.h>
+#endif
+#include "common.h"
+#include "gs1.h"
+
+#define TRUE 1
+#define FALSE 0
+#define SHIFTA 90
+#define LATCHA 91
+#define SHIFTB 92
+#define LATCHB 93
+#define SHIFTC 94
+#define LATCHC 95
+#define AORB 96
+#define ABORC 97
+
+#define DPDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*"
+
+static int list[2][170];
+
+/* Code 128 tables checked against ISO/IEC 15417:2007 */
+
+static const char *C128Table[107] = {"212222", "222122", "222221", "121223", "121322", "131222", "122213",
+ "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222",
+ "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222",
+ "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323",
+ "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133",
+ "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113",
+ "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111",
+ "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214",
+ "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112",
+ "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112",
+ "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311",
+ "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
+ "2331112"};
+/* Code 128 character encodation - Table 1 */
+
+int parunmodd(unsigned char llyth)
+{
+ int modd;
+ modd = 0;
+
+ if(llyth <= 31) { modd = SHIFTA; }
+ else if((llyth >= 48) && (llyth <= 57)) { modd = ABORC; }
+ else if(llyth <= 95) { modd = AORB; }
+ else if(llyth <= 127) { modd = SHIFTB; }
+ else if(llyth <= 159) { modd = SHIFTA; }
+ else if(llyth <= 223) { modd = AORB; }
+ else { modd = SHIFTB; }
+
+ return modd;
+}
+
+/**
+ * bring together same type blocks
+ */
+void grwp(int *indexliste)
+{
+ int i, j;
+
+ /* bring together same type blocks */
+ if(*(indexliste) > 1) {
+ i = 1;
+ while(i < *(indexliste)) {
+ if(list[1][i - 1] == list[1][i]) {
+ /* bring together */
+ list[0][i - 1] = list[0][i - 1] + list[0][i];
+ j = i + 1;
+
+ /* decreace the list */
+ while(j < *(indexliste)) {
+ list[0][j - 1] = list[0][j];
+ list[1][j - 1] = list[1][j];
+ j++;
+ }
+ *(indexliste) = *(indexliste) - 1;
+ i--;
+ }
+ i++;
+ }
+ }
+}
+
+/**
+ * Implements rules from ISO 15417 Annex E
+ */
+void dxsmooth(int *indexliste)
+{ /* Implements rules from ISO 15417 Annex E */
+ int i, current, last, next, length;
+
+ for(i = 0; i < *(indexliste); i++) {
+ current = list[1][i];
+ length = list[0][i];
+ if(i != 0) { last = list[1][i - 1]; } else { last = FALSE; }
+ if(i != *(indexliste) - 1) { next = list[1][i + 1]; } else { next = FALSE; }
+
+ if(i == 0) { /* first block */
+ if((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { /* Rule 1a */ list[1][i] = LATCHC; }
+ if(current == ABORC) {
+ if(length >= 4) {/* Rule 1b */ list[1][i] = LATCHC; } else { list[1][i] = AORB; current = AORB; }
+ }
+ if(current == SHIFTA) { /* Rule 1c */ list[1][i] = LATCHA; }
+ if((current == AORB) && (next == SHIFTA)) { /* Rule 1c */ list[1][i] = LATCHA; current = LATCHA; }
+ if(current == AORB) { /* Rule 1d */ list[1][i] = LATCHB; }
+ } else {
+ if((current == ABORC) && (length >= 4)) { /* Rule 3 */ list[1][i] = LATCHC; current = LATCHC; }
+ if(current == ABORC) { list[1][i] = AORB; current = AORB; }
+ if((current == AORB) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; }
+ if((current == AORB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; }
+ if((current == AORB) && (next == SHIFTA)) { list[1][i] = LATCHA; current = LATCHA; }
+ if((current == AORB) && (next == SHIFTB)) { list[1][i] = LATCHB; current = LATCHB; }
+ if(current == AORB) { list[1][i] = LATCHB; current = LATCHB; }
+ if((current == SHIFTA) && (length > 1)) { /* Rule 4 */ list[1][i] = LATCHA; current = LATCHA; }
+ if((current == SHIFTB) && (length > 1)) { /* Rule 5 */ list[1][i] = LATCHB; current = LATCHB; }
+ if((current == SHIFTA) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; }
+ if((current == SHIFTB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; }
+ if((current == SHIFTA) && (last == LATCHC)) { list[1][i] = LATCHA; current = LATCHA; }
+ if((current == SHIFTB) && (last == LATCHC)) { list[1][i] = LATCHB; current = LATCHB; }
+ } /* Rule 2 is implimented elsewhere, Rule 6 is implied */
+ }
+ grwp(indexliste);
+
+}
+
+/**
+ * Translate Code 128 Set A characters into barcodes.
+ * This set handles all control characters NULL to US.
+ */
+void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars)
+{ /* Translate Code 128 Set A characters into barcodes */
+ /* This set handles all control characters NULL to US */
+
+ if(source > 127) {
+ if(source < 160) {
+ concat(dest, C128Table[(source - 128) + 64]);
+ values[(*bar_chars)] = (source - 128) + 64;
+ } else {
+ concat(dest, C128Table[(source - 128) - 32]);
+ values[(*bar_chars)] = (source - 128) - 32;
+ }
+ } else {
+ if(source < 32) {
+ concat(dest, C128Table[source + 64]);
+ values[(*bar_chars)] = source + 64;
+ } else {
+ concat(dest, C128Table[source - 32]);
+ values[(*bar_chars)] = source - 32;
+ }
+ }
+ (*bar_chars)++;
+}
+
+/**
+ * Translate Code 128 Set B characters into barcodes.
+ * This set handles all characters which are not part of long numbers and not
+ * control characters.
+ */
+void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars)
+{
+ if(source > 127) {
+ concat(dest, C128Table[source - 32 - 128]);
+ values[(*bar_chars)] = source - 32 - 128;
+ } else {
+ concat(dest, C128Table[source - 32]);
+ values[(*bar_chars)] = source - 32;
+ }
+ (*bar_chars)++;
+}
+
+void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars)
+{ /* Translate Code 128 Set C characters into barcodes */
+ /* This set handles numbers in a compressed form */
+ int weight;
+
+ weight = (10 * ctoi(source_a)) + ctoi(source_b);
+ concat(dest, C128Table[weight]);
+ values[(*bar_chars)] = weight;
+ (*bar_chars)++;
+}
+
+int code_128(struct zint_symbol *symbol, unsigned char source[], int length)
+{ /* Handle Code 128 and NVE-18 */
+ int i, j, k,values[170] = { 0 }, bar_characters, read, total_sum;
+ int error_number, indexchaine, indexliste, sourcelen, f_state;
+ char set[170] = { ' ' }, fset[170] = { ' ' }, mode, last_set, current_set = ' ';
+ float glyph_count;
+ char dest[1000];
+
+ error_number = 0;
+ strcpy(dest, "");
+
+ sourcelen = length;
+
+ j = 0;
+ bar_characters = 0;
+ f_state = 0;
+
+ if(sourcelen > 160) {
+ /* This only blocks rediculously long input - the actual length of the
+ resulting barcode depends on the type of data, so this is trapped later */
+ strcpy(symbol->errtxt, "Input too long");
+ return ERROR_TOO_LONG;
+ }
+
+ /* Detect extended ASCII characters */
+ for(i = 0; i < sourcelen; i++) {
+ if(source[i] >= 128)
+ fset[i] = 'f';
+ }
+ fset[i] = '\0';
+
+ /* Decide when to latch to extended mode - Annex E note 3 */
+ j = 0;
+ for(i = 0; i < sourcelen; i++) {
+ if(fset[i] == 'f') {
+ j++;
+ } else {
+ j = 0;
+ }
+
+ if(j >= 5) {
+ for(k = i; k > (i - 5); k--) {
+ fset[k] = 'F';
+ }
+ }
+
+ if((j >= 3) && (i == (sourcelen - 1))) {
+ for(k = i; k > (i - 3); k--) {
+ fset[k] = 'F';
+ }
+ }
+ }
+
+ /* Decide if it is worth reverting to 646 encodation for a few characters as described in 4.3.4.2 (d) */
+ for(i = 1; i < sourcelen; i++) {
+ if((fset[i - 1] == 'F') && (fset[i] == ' ')) {
+ /* Detected a change from 8859-1 to 646 - count how long for */
+ for(j = 0; (fset[i + j] == ' ') && ((i + j) < sourcelen); j++);
+ if((j < 5) || ((j < 3) && ((i + j) == (sourcelen - 1)))) {
+ /* Uses the same figures recommended by Annex E note 3 */
+ /* Change to shifting back rather than latching back */
+ for(k = 0; k < j; k++) {
+ fset[i + k] = 'n';
+ }
+ }
+ }
+ }
+
+ /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
+ indexliste = 0;
+ indexchaine = 0;
+
+ mode = parunmodd(source[indexchaine]);
+ if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) {
+ mode = AORB;
+ }
+
+ for(i = 0; i < 170; i++) {
+ list[0][i] = 0;
+ }
+
+ do {
+ list[1][indexliste] = mode;
+ while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) {
+ list[0][indexliste]++;
+ indexchaine++;
+ mode = parunmodd(source[indexchaine]);
+ if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) {
+ mode = AORB;
+ }
+ }
+ indexliste++;
+ } while (indexchaine < sourcelen);
+
+ dxsmooth(&indexliste);
+
+ /* Resolve odd length LATCHC blocks */
+ if((list[1][0] == LATCHC) && (list[0][0] & 1)) {
+ /* Rule 2 */
+ list[0][1]++;
+ list[0][0]--;
+ if(indexliste == 1) {
+ list[0][1] = 1;
+ list[1][1] = LATCHB;
+ indexliste = 2;
+ }
+ }
+ if(indexliste > 1) {
+ for(i = 1; i < indexliste; i++) {
+ if((list[1][i] == LATCHC) && (list[0][i] & 1)) {
+ /* Rule 3b */
+ list[0][i - 1]++;
+ list[0][i]--;
+ }
+ }
+ }
+
+ /* Put set data into set[] */
+
+ read = 0;
+ for(i = 0; i < indexliste; i++) {
+ for(j = 0; j < list[0][i]; j++) {
+ switch(list[1][i]) {
+ case SHIFTA: set[read] = 'a'; break;
+ case LATCHA: set[read] = 'A'; break;
+ case SHIFTB: set[read] = 'b'; break;
+ case LATCHB: set[read] = 'B'; break;
+ case LATCHC: set[read] = 'C'; break;
+ }
+ read++;
+ }
+ }
+
+ /* Adjust for strings which start with shift characters - make them latch instead */
+ if(set[0] == 'a') {
+ i = 0;
+ do {
+ set[i] = 'A';
+ i++;
+ } while (set[i] == 'a');
+ }
+
+ if(set[0] == 'b') {
+ i = 0;
+ do {
+ set[i] = 'B';
+ i++;
+ } while (set[i] == 'b');
+ }
+
+ /* Now we can calculate how long the barcode is going to be - and stop it from
+ being too long */
+ last_set = ' ';
+ glyph_count = 0.0;
+ for(i = 0; i < sourcelen; i++) {
+ if((set[i] == 'a') || (set[i] == 'b')) {
+ glyph_count = glyph_count + 1.0;
+ }
+ if((fset[i] == 'f') || (fset[i] == 'n')) {
+ glyph_count = glyph_count + 1.0;
+ }
+ if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
+ if(set[i] != last_set) {
+ last_set = set[i];
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+ if(i == 0) {
+ if(fset[i] == 'F') {
+ glyph_count = glyph_count + 2.0;
+ }
+ } else {
+ if((fset[i] == 'F') && (fset[i - 1] != 'F')) {
+ glyph_count = glyph_count + 2.0;
+ }
+ if((fset[i] != 'F') && (fset[i - 1] == 'F')) {
+ glyph_count = glyph_count + 2.0;
+ }
+ }
+
+ if(set[i] == 'C') {
+ glyph_count = glyph_count + 0.5;
+ } else {
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+ if(glyph_count > 80.0) {
+ strcpy(symbol->errtxt, "Input too long");
+ return ERROR_TOO_LONG;
+ }
+
+ /* So now we know what start character to use - we can get on with it! */
+ if(symbol->output_options & READER_INIT) {
+ /* Reader Initialisation mode */
+ switch(set[0]) {
+ case 'A': /* Start A */
+ concat(dest, C128Table[103]);
+ values[0] = 103;
+ current_set = 'A';
+ concat(dest, C128Table[96]); /* FNC3 */
+ values[1] = 96;
+ bar_characters++;
+ break;
+ case 'B': /* Start B */
+ concat(dest, C128Table[104]);
+ values[0] = 104;
+ current_set = 'B';
+ concat(dest, C128Table[96]); /* FNC3 */
+ values[1] = 96;
+ bar_characters++;
+ break;
+ case 'C': /* Start C */
+ concat(dest, C128Table[104]); /* Start B */
+ values[0] = 105;
+ concat(dest, C128Table[96]); /* FNC3 */
+ values[1] = 96;
+ concat(dest, C128Table[99]); /* Code C */
+ values[2] = 99;
+ bar_characters += 2;
+ current_set = 'C';
+ break;
+ }
+ } else {
+ /* Normal mode */
+ switch(set[0]) {
+ case 'A': /* Start A */
+ concat(dest, C128Table[103]);
+ values[0] = 103;
+ current_set = 'A';
+ break;
+ case 'B': /* Start B */
+ concat(dest, C128Table[104]);
+ values[0] = 104;
+ current_set = 'B';
+ break;
+ case 'C': /* Start C */
+ concat(dest, C128Table[105]);
+ values[0] = 105;
+ current_set = 'C';
+ break;
+ }
+ }
+ bar_characters++;
+ last_set = set[0];
+
+ if(fset[0] == 'F') {
+ switch(current_set) {
+ case 'A':
+ concat(dest, C128Table[101]);
+ concat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ concat(dest, C128Table[100]);
+ concat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 1;
+ }
+
+ /* Encode the data */
+ read = 0;
+ do {
+
+ if((read != 0) && (set[read] != current_set))
+ { /* Latch different code set */
+ switch(set[read])
+ {
+ case 'A': concat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ bar_characters++;
+ current_set = 'A';
+ break;
+ case 'B': concat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ bar_characters++;
+ current_set = 'B';
+ break;
+ case 'C': concat(dest, C128Table[99]);
+ values[bar_characters] = 99;
+ bar_characters++;
+ current_set = 'C';
+ break;
+ }
+ }
+
+ if(read != 0) {
+ if((fset[read] == 'F') && (f_state == 0)) {
+ /* Latch beginning of extended mode */
+ switch(current_set) {
+ case 'A':
+ concat(dest, C128Table[101]);
+ concat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ concat(dest, C128Table[100]);
+ concat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 1;
+ }
+ if((fset[read] == ' ') && (f_state == 1)) {
+ /* Latch end of extended mode */
+ switch(current_set) {
+ case 'A':
+ concat(dest, C128Table[101]);
+ concat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ concat(dest, C128Table[100]);
+ concat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 0;
+ }
+ }
+
+ if((fset[read] == 'f') || (fset[read] == 'n')) {
+ /* Shift to or from extended mode */
+ switch(current_set) {
+ case 'A':
+ concat(dest, C128Table[101]); /* FNC 4 */
+ values[bar_characters] = 101;
+ break;
+ case 'B':
+ concat(dest, C128Table[100]); /* FNC 4 */
+ values[bar_characters] = 100;
+ break;
+ }
+ bar_characters++;
+ }
+
+ if((set[read] == 'a') || (set[read] == 'b')) {
+ /* Insert shift character */
+ concat(dest, C128Table[98]);
+ values[bar_characters] = 98;
+ bar_characters++;
+ }
+
+ switch(set[read])
+ { /* Encode data characters */
+ case 'a':
+ case 'A': c128_set_a(source[read], dest, values, &bar_characters);
+ read++;
+ break;
+ case 'b':
+ case 'B': c128_set_b(source[read], dest, values, &bar_characters);
+ read++;
+ break;
+ case 'C': c128_set_c(source[read], source[read + 1], dest, values, &bar_characters);
+ read += 2;
+ break;
+ }
+
+ } while (read < sourcelen);
+
+ /* check digit calculation */
+ total_sum = 0;
+ /*for(i = 0; i < bar_characters; i++) {
+ printf("%d\n", values[i]);
+ }*/
+
+ for(i = 0; i < bar_characters; i++)
+ {
+ if(i > 0)
+ {
+ values[i] *= i;
+ }
+ total_sum += values[i];
+ }
+ concat(dest, C128Table[total_sum%103]);
+
+ /* Stop character */
+ concat(dest, C128Table[106]);
+ expand(symbol, dest);
+ return error_number;
+}
+
+int ean_128(struct zint_symbol *symbol, unsigned char source[], int length)
+{ /* Handle EAN-128 (Now known as GS1-128) */
+ int i, j,values[170], bar_characters, read, total_sum;
+ int error_number, indexchaine, indexliste;
+ char set[170], mode, last_set;
+ float glyph_count;
+ char dest[1000];
+ int separator_row, linkage_flag, c_count;
+#ifndef _MSC_VER
+ char reduced[length + 1];
+#else
+ char* reduced = (char*)_alloca(length + 1);
+#endif
+ error_number = 0;
+ strcpy(dest, "");
+ linkage_flag = 0;
+
+ j = 0;
+ bar_characters = 0;
+ separator_row = 0;
+
+ memset(values, 0, sizeof(values));
+ memset(set, ' ', sizeof(set));
+
+ if(length > 160) {
+ /* This only blocks rediculously long input - the actual length of the
+ resulting barcode depends on the type of data, so this is trapped later */
+ strcpy(symbol->errtxt, "Input too long");
+ return ERROR_TOO_LONG;
+ }
+ for(i = 0; i < length; i++) {
+ if(source[i] == '\0') {
+ /* Null characters not allowed! */
+ strcpy(symbol->errtxt, "NULL character in input data");
+ return ERROR_INVALID_DATA;
+ }
+ }
+
+ /* if part of a composite symbol make room for the separator pattern */
+ if(symbol->symbology == BARCODE_EAN128_CC) {
+ separator_row = symbol->rows;
+ symbol->row_height[symbol->rows] = 1;
+ symbol->rows += 1;
+ }
+
+ if(symbol->input_mode != GS1_MODE) {
+ /* GS1 data has not been checked yet */
+ error_number = gs1_verify(symbol, source, length, reduced);
+ if(error_number != 0) { return error_number; }
+ }
+
+ /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
+ indexliste = 0;
+ indexchaine = 0;
+
+ mode = parunmodd(reduced[indexchaine]);
+ if(reduced[indexchaine] == '[') {
+ mode = ABORC;
+ }
+
+ for(i = 0; i < 170; i++) {
+ list[0][i] = 0;
+ }
+
+ do {
+ list[1][indexliste] = mode;
+ while ((list[1][indexliste] == mode) && (indexchaine < strlen(reduced))) {
+ list[0][indexliste]++;
+ indexchaine++;
+ mode = parunmodd(reduced[indexchaine]);
+ if(reduced[indexchaine] == '[') { mode = ABORC; }
+ }
+ indexliste++;
+ } while (indexchaine < strlen(reduced));
+
+ dxsmooth(&indexliste);
+
+ /* Put set data into set[] */
+ read = 0;
+ for(i = 0; i < indexliste; i++) {
+ for(j = 0; j < list[0][i]; j++) {
+ switch(list[1][i]) {
+ case SHIFTA: set[read] = 'a'; break;
+ case LATCHA: set[read] = 'A'; break;
+ case SHIFTB: set[read] = 'b'; break;
+ case LATCHB: set[read] = 'B'; break;
+ case LATCHC: set[read] = 'C'; break;
+ }
+ read++;
+ }
+ }
+
+ /* Watch out for odd-length Mode C blocks */
+ c_count = 0;
+ for(i = 0; i < read; i++) {
+ if(set[i] == 'C') {
+ if(reduced[i] == '[') {
+ if(c_count & 1) {
+ if((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ c_count = 0;
+ } else {
+ c_count++;
+ }
+ } else {
+ if(c_count & 1) {
+ if((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ c_count = 0;
+ }
+ }
+ if(c_count & 1) {
+ if((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ for(i = 1; i < read - 1; i++) {
+ if((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) {
+ set[i] = 'B';
+ }
+ }
+
+ /* for(i = 0; i < read; i++) {
+ printf("char %c mode %c\n", reduced[i], set[i]);
+ } */
+
+ /* Now we can calculate how long the barcode is going to be - and stop it from
+ being too long */
+ last_set = ' ';
+ glyph_count = 0.0;
+ for(i = 0; i < strlen(reduced); i++) {
+ if((set[i] == 'a') || (set[i] == 'b')) {
+ glyph_count = glyph_count + 1.0;
+ }
+ if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
+ if(set[i] != last_set) {
+ last_set = set[i];
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+
+ if((set[i] == 'C') && (reduced[i] != '[')) {
+ glyph_count = glyph_count + 0.5;
+ } else {
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+ if(glyph_count > 80.0) {
+ strcpy(symbol->errtxt, "Input too long");
+ return ERROR_TOO_LONG;
+ }
+
+ /* So now we know what start character to use - we can get on with it! */
+ switch(set[0])
+ {
+ case 'A': /* Start A */
+ concat(dest, C128Table[103]);
+ values[0] = 103;
+ break;
+ case 'B': /* Start B */
+ concat(dest, C128Table[104]);
+ values[0] = 104;
+ break;
+ case 'C': /* Start C */
+ concat(dest, C128Table[105]);
+ values[0] = 105;
+ break;
+ }
+ bar_characters++;
+
+ concat(dest, C128Table[102]);
+ values[1] = 102;
+ bar_characters++;
+
+ /* Encode the data */
+ read = 0;
+ do {
+
+ if((read != 0) && (set[read] != set[read - 1]))
+ { /* Latch different code set */
+ switch(set[read])
+ {
+ case 'A': concat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ bar_characters++;
+ break;
+ case 'B': concat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ bar_characters++;
+ break;
+ case 'C': concat(dest, C128Table[99]);
+ values[bar_characters] = 99;
+ bar_characters++;
+ break;
+ }
+ }
+
+ if((set[read] == 'a') || (set[read] == 'b')) {
+ /* Insert shift character */
+ concat(dest, C128Table[98]);
+ values[bar_characters] = 98;
+ bar_characters++;
+ }
+
+ if(reduced[read] != '[') {
+ switch(set[read])
+ { /* Encode data characters */
+ case 'A':
+ case 'a':
+ c128_set_a(reduced[read], dest, values, &bar_characters);
+ read++;
+ break;
+ case 'B':
+ case 'b':
+ c128_set_b(reduced[read], dest, values, &bar_characters);
+ read++;
+ break;
+ case 'C':
+ c128_set_c(reduced[read], reduced[read + 1], dest, values, &bar_characters);
+ read += 2;
+ break;
+ }
+ } else {
+ concat(dest, C128Table[102]);
+ values[bar_characters] = 102;
+ bar_characters++;
+ read++;
+ }
+ } while (read < strlen(reduced));
+
+ /* "...note that the linkage flag is an extra code set character between
+ the last data character and the Symbol Check Character" (GS1 Specification) */
+
+ /* Linkage flags in GS1-128 are determined by ISO/IEC 24723 section 7.4 */
+
+ switch(symbol->option_1) {
+ case 1:
+ case 2:
+ /* CC-A or CC-B 2D component */
+ switch(set[strlen(reduced) - 1]) {
+ case 'A': linkage_flag = 100; break;
+ case 'B': linkage_flag = 99; break;
+ case 'C': linkage_flag = 101; break;
+ }
+ break;
+ case 3:
+ /* CC-C 2D component */
+ switch(set[strlen(reduced) - 1]) {
+ case 'A': linkage_flag = 99; break;
+ case 'B': linkage_flag = 101; break;
+ case 'C': linkage_flag = 100; break;
+ }
+ break;
+ }
+
+ if(linkage_flag != 0) {
+ concat(dest, C128Table[linkage_flag]);
+ values[bar_characters] = linkage_flag;
+ bar_characters++;
+ }
+
+ /*for(i = 0; i < bar_characters; i++) {
+ printf("[%d] ", values[i]);
+ }
+ printf("\n");*/
+
+ /* check digit calculation */
+ total_sum = 0;
+ for(i = 0; i < bar_characters; i++)
+ {
+ if(i > 0)
+ {
+ values[i] *= i;
+
+ }
+ total_sum += values[i];
+ }
+ concat(dest, C128Table[total_sum%103]);
+ values[bar_characters] = total_sum % 103;
+ bar_characters++;
+
+ /* Stop character */
+ concat(dest, C128Table[106]);
+ values[bar_characters] = 106;
+ bar_characters++;
+ expand(symbol, dest);
+
+ /* Add the separator pattern for composite symbols */
+ if(symbol->symbology == BARCODE_EAN128_CC) {
+ for(i = 0; i < symbol->width; i++) {
+ if(!(module_is_set(symbol, separator_row + 1, i))) {
+ set_module(symbol, separator_row, i);
+ }
+ }
+ }
+
+ for(i = 0; i < length; i++) {
+ if((source[i] != '[') && (source[i] != ']')) {
+ symbol->text[i] = source[i];
+ }
+ if(source[i] == '[') {
+ symbol->text[i] = '(';
+ }
+ if(source[i] == ']') {
+ symbol->text[i] = ')';
+ }
+ }
+
+ return error_number;
+}
+
+int nve_18(struct zint_symbol *symbol, unsigned char source[], int length)
+{
+ /* Add check digit if encoding an NVE18 symbol */
+ int error_number, zeroes, i, nve_check, total_sum, sourcelen;
+ unsigned char ean128_equiv[25];
+
+ memset(ean128_equiv, 0, 25);
+ sourcelen = length;
+
+ if(sourcelen > 17) {
+ strcpy(symbol->errtxt, "Input too long");
+ return ERROR_TOO_LONG;
+ }
+
+ error_number = is_sane(NEON, source, length);
+ if(error_number == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Invalid characters in data");
+ return error_number;
+ }
+ zeroes = 17 - sourcelen;
+ strcpy((char *)ean128_equiv, "[00]");
+ memset(ean128_equiv + 4, '0', zeroes);
+ strcpy((char*)ean128_equiv + 4 + zeroes, (char*)source);
+
+ total_sum = 0;
+ for(i = sourcelen - 1; i >= 0; i--)
+ {
+ total_sum += ctoi(source[i]);
+
+ if(!(i & 1)) {
+ total_sum += 2 * ctoi(source[i]);
+ }
+ }
+ nve_check = 10 - total_sum % 10;
+ if(nve_check == 10) { nve_check = 0; }
+ ean128_equiv[21] = itoc(nve_check);
+ ean128_equiv[22] = '\0';
+
+ error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));
+
+ return error_number;
+}
+
+int ean_14(struct zint_symbol *symbol, unsigned char source[], int length)
+{
+ /* EAN-14 - A version of EAN-128 */
+ int i, count, check_digit;
+ int error_number, zeroes;
+ unsigned char ean128_equiv[20];
+
+ if(length > 13) {
+ strcpy(symbol->errtxt, "Input wrong length");
+ return ERROR_TOO_LONG;
+ }
+
+ error_number = is_sane(NEON, source, length);
+ if(error_number == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Invalid character in data");
+ return error_number;
+ }
+
+ zeroes = 13 - length;
+ strcpy((char*)ean128_equiv, "[01]");
+ memset(ean128_equiv + 4, '0', zeroes);
+ ustrcpy(ean128_equiv + 4 + zeroes, source);
+
+ count = 0;
+ for (i = length - 1; i >= 0; i--) {
+ count += ctoi(source[i]);
+
+ if (!(i & 1)) {
+ count += 2 * ctoi(source[i]);
+ }
+ }
+ check_digit = 10 - (count % 10);
+ if (check_digit == 10) { check_digit = 0; }
+ ean128_equiv[17] = itoc(check_digit);
+ ean128_equiv[18] = '\0';
+
+ error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));
+
+ return error_number;
+}
diff --git a/backend/common.c b/backend/common.c
new file mode 100644
index 0000000..72cc3ca
--- /dev/null
+++ b/backend/common.c
@@ -0,0 +1,386 @@
+/* common.c - Contains functions needed for a number of barcodes */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "common.h"
+
+int ustrlen(const unsigned char data[]) {
+ /* Local replacement for strlen() with unsigned char strings */
+ int i;
+ for (i=0;data[i];i++);
+
+ return i;
+}
+
+void ustrcpy(unsigned char target[],const unsigned char source[]) {
+ /* Local replacement for strcpy() with unsigned char strings */
+ int i, len;
+
+ len = ustrlen(source);
+ for(i = 0; i < len; i++) {
+ target[i] = source[i];
+ }
+ target[i] = '\0';
+}
+
+void concat(char dest[],const char source[])
+{ /* Concatinates dest[] with the contents of source[], copying /0 as well */
+ unsigned int i, j, n;
+
+ j = strlen(dest);
+ n = strlen(source);
+ for(i = 0; i <= n; i++) {
+ dest[i + j] = source[i]; }
+}
+
+void uconcat(unsigned char dest[], const unsigned char source[])
+{ /* Concatinates dest[] with the contents of source[], copying /0 as well */
+ unsigned int i, j;
+
+ j = ustrlen(dest);
+ for(i = 0; i <= ustrlen(source); i++) {
+ dest[i + j] = source[i]; }
+}
+
+
+int ctoi(char source)
+{ /* Converts a character 0-9 to its equivalent integer value */
+ if((source >= '0') && (source <= '9'))
+ return (source - '0');
+ return(source - 'A' + 10);
+}
+
+char itoc(int source)
+{ /* Converts an integer value to its hexadecimal character */
+ if ((source >= 0) && (source <= 9)) {
+ return ('0' + source); }
+ else {
+ return ('A' + (source - 10)); }
+}
+
+void to_upper(unsigned char source[])
+{ /* Converts lower case characters to upper case in a string source[] */
+ unsigned int i, src_len = ustrlen(source);
+
+ for (i = 0; i < src_len; i++) {
+ if ((source[i] >= 'a') && (source[i] <= 'z')) {
+ source [i] = (source[i] - 'a') + 'A'; }
+ }
+}
+
+int is_sane(char test_string[], unsigned char source[], int length)
+{ /* Verifies that a string only uses valid characters */
+ unsigned int i, j, latch;
+ unsigned int lt = strlen(test_string);
+
+ for(i = 0; i < length; i++) {
+ latch = FALSE;
+ for(j = 0; j < lt; j++) {
+ if (source[i] == test_string[j]) {
+ latch = TRUE;
+ break;
+ }
+ }
+ if (!(latch)) {
+ return ERROR_INVALID_DATA;
+ }
+ }
+
+ return 0;
+}
+
+int posn(char set_string[], char data)
+{ /* Returns the position of data in set_string */
+ unsigned int i, n = strlen(set_string);
+
+ for(i = 0; i < n; i++) {
+ if (data == set_string[i]) { return i; } }
+ return 0;
+}
+
+void lookup(char set_string[],const char *table[], char data, char dest[])
+{ /* Replaces huge switch statements for looking up in tables */
+ unsigned int i, n = strlen(set_string);
+
+ for(i = 0; i < n; i++) {
+ if (data == set_string[i]) { concat(dest, table[i]); } }
+}
+
+int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord)
+{
+ return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1;
+#if 0
+ switch(x_sub) {
+ case 0: if((symbol->encoded_data[y_coord][x_char] & 0x01) != 0) { result = 1; } break;
+ case 1: if((symbol->encoded_data[y_coord][x_char] & 0x02) != 0) { result = 1; } break;
+ case 2: if((symbol->encoded_data[y_coord][x_char] & 0x04) != 0) { result = 1; } break;
+ case 3: if((symbol->encoded_data[y_coord][x_char] & 0x08) != 0) { result = 1; } break;
+ case 4: if((symbol->encoded_data[y_coord][x_char] & 0x10) != 0) { result = 1; } break;
+ case 5: if((symbol->encoded_data[y_coord][x_char] & 0x20) != 0) { result = 1; } break;
+ case 6: if((symbol->encoded_data[y_coord][x_char] & 0x40) != 0) { result = 1; } break;
+ }
+
+ return result;
+#endif
+}
+
+void set_module(struct zint_symbol *symbol, int y_coord, int x_coord)
+{
+ symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7);
+#if 0
+ int x_char, x_sub;
+
+
+ x_char = x_coord / 7;
+ x_sub = x_coord % 7;
+
+ switch(x_sub) {
+ case 0: symbol->encoded_data[y_coord][x_char] += 0x01; break;
+ case 1: symbol->encoded_data[y_coord][x_char] += 0x02; break;
+ case 2: symbol->encoded_data[y_coord][x_char] += 0x04; break;
+ case 3: symbol->encoded_data[y_coord][x_char] += 0x08; break;
+ case 4: symbol->encoded_data[y_coord][x_char] += 0x10; break;
+ case 5: symbol->encoded_data[y_coord][x_char] += 0x20; break;
+ case 6: symbol->encoded_data[y_coord][x_char] += 0x40; break;
+ } /* The last binary digit is reserved for colour barcodes */
+#endif
+}
+
+void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord)
+{
+ symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7));
+#if 0
+ int x_char, x_sub;
+
+ x_char = x_coord / 7;
+ x_sub = x_coord % 7;
+
+ switch(x_sub) {
+ case 0: symbol->encoded_data[y_coord][x_char] -= 0x01; break;
+ case 1: symbol->encoded_data[y_coord][x_char] -= 0x02; break;
+ case 2: symbol->encoded_data[y_coord][x_char] -= 0x04; break;
+ case 3: symbol->encoded_data[y_coord][x_char] -= 0x08; break;
+ case 4: symbol->encoded_data[y_coord][x_char] -= 0x10; break;
+ case 5: symbol->encoded_data[y_coord][x_char] -= 0x20; break;
+ case 6: symbol->encoded_data[y_coord][x_char] -= 0x40; break;
+ } /* The last binary digit is reserved for colour barcodes */
+#endif
+}
+
+void expand(struct zint_symbol *symbol, char data[])
+{ /* Expands from a width pattern to a bit pattern */
+
+ unsigned int reader, n = strlen(data);
+ int writer, i;
+ char latch;
+
+ writer = 0;
+ latch = '1';
+
+ for(reader = 0; reader < n; reader++) {
+ for(i = 0; i < ctoi(data[reader]); i++) {
+ if(latch == '1') { set_module(symbol, symbol->rows, writer); }
+ writer++;
+ }
+
+ latch = (latch == '1' ? '0' : '1');
+ }
+
+ if(symbol->symbology != BARCODE_PHARMA) {
+ if(writer > symbol->width) {
+ symbol->width = writer;
+ }
+ } else {
+ /* Pharmacode One ends with a space - adjust for this */
+ if(writer > symbol->width + 2) {
+ symbol->width = writer - 2;
+ }
+ }
+ symbol->rows = symbol->rows + 1;
+}
+
+int is_stackable(int symbology) {
+ /* Indicates which symbologies can have row binding */
+ if(symbology < BARCODE_PDF417) { return 1; }
+ if(symbology == BARCODE_CODE128B) { return 1; }
+ if(symbology == BARCODE_ISBNX) { return 1; }
+ if(symbology == BARCODE_EAN14) { return 1; }
+ if(symbology == BARCODE_NVE18) { return 1; }
+ if(symbology == BARCODE_KOREAPOST) { return 1; }
+ if(symbology == BARCODE_PLESSEY) { return 1; }
+ if(symbology == BARCODE_TELEPEN_NUM) { return 1; }
+ if(symbology == BARCODE_ITF14) { return 1; }
+ if(symbology == BARCODE_CODE32) { return 1; }
+
+ return 0;
+}
+
+int is_extendable(int symbology) {
+ /* Indicates which symbols can have addon */
+ if(symbology == BARCODE_EANX) { return 1; }
+ if(symbology == BARCODE_UPCA) { return 1; }
+ if(symbology == BARCODE_UPCE) { return 1; }
+ if(symbology == BARCODE_ISBNX) { return 1; }
+ if(symbology == BARCODE_UPCA_CC) { return 1; }
+ if(symbology == BARCODE_UPCE_CC) { return 1; }
+ if(symbology == BARCODE_EANX_CC) { return 1; }
+
+ return 0;
+}
+
+int roundup(float input)
+{
+ float remainder;
+ int integer_part;
+
+ integer_part = (int)input;
+ remainder = input - integer_part;
+
+ if(remainder > 0.1) {
+ integer_part++;
+ }
+
+ return integer_part;
+}
+
+int istwodigits(unsigned char source[], int position)
+{
+ if((source[position] >= '0') && (source[position] <= '9')) {
+ if((source[position + 1] >= '0') && (source[position + 1] <= '9')) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+float froundup(float input)
+{
+ float fraction, output = 0.0;
+
+ fraction = input - (int)input;
+ if(fraction > 0.01) { output = (input - fraction) + 1.0; } else { output = input; }
+
+ return output;
+}
+
+int latin1_process(unsigned char source[], unsigned char preprocessed[], int *length)
+{
+ int j, i, next;
+
+ /* Convert Unicode to Latin-1 for those symbologies which only support Latin-1 */
+ j = 0;
+ i = 0;
+ if (length && *length) {
+ do {
+ next = -1;
+ if(source[i] < 128) {
+ preprocessed[j] = source[i];
+ j++;
+ next = i + 1;
+ } else {
+ if(source[i] == 0xC2) {
+ preprocessed[j] = source[i + 1];
+ j++;
+ next = i + 2;
+ }
+ if(source[i] == 0xC3) {
+ preprocessed[j] = source[i + 1] + 64;
+ j++;
+ next = i + 2;
+ }
+ }
+ if(next == -1) {
+ return ERROR_INVALID_DATA;
+ }
+ i = next;
+ } while(i < *length);
+ preprocessed[j] = '\0';
+ *length = j;
+ }
+
+ return 0;
+}
+
+int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length)
+{
+ int bpos, jpos, error_number;
+ int next;
+
+ bpos = 0;
+ jpos = 0;
+ error_number = 0;
+ next = 0;
+
+ do {
+ if(source[bpos] <= 0x7f) {
+ /* 1 byte mode (7-bit ASCII) */
+ vals[jpos] = source[bpos];
+ next = bpos + 1;
+ jpos++;
+ } else {
+ if((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) {
+ strcpy(symbol->errtxt, "Corrupt Unicode data");
+ return ERROR_INVALID_DATA;
+ }
+ if((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) {
+ strcpy(symbol->errtxt, "Overlong encoding not supported");
+ return ERROR_INVALID_DATA;
+ }
+
+ if((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) {
+ /* 2 byte mode */
+ vals[jpos] = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f);
+ next = bpos + 2;
+ jpos++;
+ } else
+ if((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) {
+ /* 3 byte mode */
+ vals[jpos] = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f);
+ next = bpos + 3;
+ jpos ++;
+ } else
+ if(source[bpos] >= 0xf0) {
+ strcpy(symbol->errtxt, "Unicode sequences of more than 3 bytes not supported");
+ return ERROR_INVALID_DATA;
+ }
+ }
+
+ bpos = next;
+
+ } while(bpos < *length);
+ *length = jpos;
+
+ return error_number;
+}
+
diff --git a/backend/common.h b/backend/common.h
new file mode 100644
index 0000000..d7fead9
--- /dev/null
+++ b/backend/common.h
@@ -0,0 +1,81 @@
+/* common.h - Header for all common functions in common.c */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+/* Used in some logic */
+#ifndef __COMMON_H
+#define __COMMON_H
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+/* The most commonly used set */
+#define NEON "0123456789"
+
+#include "zint.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+extern int ustrlen(const unsigned char source[]);
+extern void ustrcpy(unsigned char target[], const unsigned char source[]);
+extern void concat(char dest[], const char source[]);
+extern void uconcat(unsigned char dest[], const unsigned char source[]);
+extern int ctoi(char source);
+extern char itoc(int source);
+extern void to_upper(unsigned char source[]);
+extern int is_sane(char test_string[], unsigned char source[], int length);
+extern void lookup(char set_string[],const char *table[], char data, char dest[]);
+extern int posn(char set_string[], char data);
+extern void expand(struct zint_symbol *symbol, char data[]);
+extern int is_stackable(int symbology);
+extern int is_extendable(int symbology);
+extern int roundup(float input);
+extern int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord);
+extern void set_module(struct zint_symbol *symbol, int y_coord, int x_coord);
+extern void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord);
+extern int istwodigits(unsigned char source[], int position);
+extern float froundup(float input);
+extern int parunmodd(unsigned char llyth);
+extern int latin1_process(unsigned char source[], unsigned char preprocessed[], int *length);
+extern int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __COMMON_H */
diff --git a/backend/dllversion.c b/backend/dllversion.c
new file mode 100644
index 0000000..50f1653
--- /dev/null
+++ b/backend/dllversion.c
@@ -0,0 +1,31 @@
+/* Sed: http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/versions.asp */
+#if defined (_WIN32) && (defined(_USRDLL) || defined(DLL_EXPORT) || defined(PIC))
+#include <windows.h>
+#include <shlwapi.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+__declspec(dllexport) HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi);
+
+#ifdef __cplusplus
+}
+#endif
+
+HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi)
+{
+ if (!pdvi || (sizeof(*pdvi) != pdvi->info1.cbSize))
+ return (E_INVALIDARG);
+
+ pdvi->info1.dwMajorVersion = 2;
+ pdvi->info1.dwMinorVersion = 4;
+ pdvi->info1.dwBuildNumber = 2;
+ pdvi->info1.dwPlatformID = DLLVER_PLATFORM_WINDOWS;
+ if (sizeof(DLLVERSIONINFO2) == pdvi->info1.cbSize)
+ pdvi->ullVersion = MAKEDLLVERULL(2, 4, 2, 0);
+
+ return S_OK;
+}
+#endif /* _WIN32 */
diff --git a/backend/font.h b/backend/font.h
new file mode 100644
index 0000000..4ce6364
--- /dev/null
+++ b/backend/font.h
@@ -0,0 +1,1702 @@
+/* font.h - Font for PNG images */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+/* This file contains the pixel-by-pixel representation of the "Misc Fixed" font
+ at 10 point size processed by the Gimp */
+
+static const int ascii_font[9310] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,
+ 0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,
+ 0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,
+ 0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,
+ 1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,
+ 0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1,
+ 1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1,
+ 1,0,0,0,1,1,1,0,0,1,1,1,1,1,1,0,
+ 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,
+ 0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1,
+ 1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,
+ 1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,
+ 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0,
+ 0,1,1,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1,
+ 0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0,
+ 1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1,
+ 1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,
+ 1,0,0,0,0,1,0,0,1,0,0,0,1,0,1,1,
+ 1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,
+ 0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,0,
+ 1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,
+ 0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,
+ 1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,
+ 0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,
+ 0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,
+ 1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,
+ 0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,1,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,
+ 0,1,0,0,1,0,0,1,0,1,0,1,0,0,1,1,
+ 0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,
+ 1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,1,0,0,0,0,1,0,1,0,0,1,1,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,
+ 0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,
+ 0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,
+ 1,1,1,0,1,0,0,1,0,1,0,0,1,1,1,0,
+ 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,
+ 0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 1,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,
+ 1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,
+ 0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0,
+ 0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,
+ 0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,0,0,1,0,1,1,1,0,0,0,1,1,
+ 1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1,
+ 0,0,0,0,1,0,0,0,0,0,1,1,1,0,1,0,
+ 1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,
+ 0,0,1,1,0,1,0,0,0,1,0,0,0,0,0,1,
+ 0,0,0,0,1,1,0,1,0,0,1,0,1,1,1,0,
+ 0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,
+ 1,1,1,0,1,0,1,0,1,1,1,0,0,0,1,1,
+ 1,1,0,0,1,1,1,1,1,0,0,1,0,0,0,0,
+ 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,1,
+ 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,
+ 1,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,
+ 1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,0,
+ 0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,
+ 0,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+ 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1,
+ 0,0,0,0,1,0,1,1,1,1,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,0,
+ 0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,
+ 1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,
+ 0,0,0,1,0,1,1,0,1,0,1,0,1,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,
+ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,
+ 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0,
+ 1,0,1,1,1,1,1,0,0,1,0,0,0,1,0,0,
+ 1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,0,1,0,1,1,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,1,0,0,0,1,0,1,
+ 0,0,0,1,1,0,1,1,0,0,0,1,0,1,0,0,
+ 0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,
+ 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
+ 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,
+ 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,
+ 0,1,0,0,1,0,0,0,1,1,1,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1,
+ 1,1,1,1,1,0,1,0,0,0,1,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,1,1,1,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,1,
+ 0,1,0,0,0,0,1,0,1,1,1,1,1,0,0,1,
+ 0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,
+ 1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,
+ 0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0,
+ 0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 1,0,0,1,0,0,0,1,0,0,1,0,1,0,1,0,
+ 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,
+ 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,
+ 1,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1,
+ 0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+ 0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,0,
+ 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,
+ 1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0,
+ 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,
+ 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,
+ 1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0,
+ 0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,
+ 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,1,0,0,1,0,0,1,0,1,0,0,1,1,0,0,
+ 1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,
+ 0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,1,1,1,1,1,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,
+ 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,
+ 0,0,1,0,1,0,1,0,0,0,1,0,0,1,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0,
+ 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0,
+ 0,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,
+ 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,
+ 1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,
+ 1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,
+ 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,
+ 0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,
+ 0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,
+ 0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0,
+ 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,
+ 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,1,0,0,0,1,0,1,
+ 0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,1,0,0,1,0,1,0,0,0,1,
+ 1,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0,
+ 1,0,0,0,0,1,0,0,1,1,1,0,1,0,0,1,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1,
+ 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,
+ 0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,
+ 1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,
+ 1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,1,
+ 0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,
+ 0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,1,
+ 0,0,0,0,1,0,1,1,1,1,0,0,0,0,1,1,
+ 1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,
+ 1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,
+ 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1,
+ 1,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1,
+ 1,1,0,1,0,0,0,0,1,0,1,0,0,0,0,1,
+ 0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0,
+ 1,1,1,1,0,0,1,0,0,0,0,1,0,0,1,1,
+ 1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1,
+ 0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,
+ 1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,0,1,0,1,1,1,0,0,0,1,1,
+ 1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1,
+ 0,0,0,0,1,0,0,0,0,1,0,1,1,1,0,0,
+ 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1,
+ 0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,1,
+ 1,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1,
+ 0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,
+ 1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,
+ 1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,
+ 1,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,
+ 1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1,
+ 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,
+ 0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
+ 0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,
+ 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0
+};
+
+static const int ascii_ext_font[9310] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,
+ 0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,
+ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,
+ 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0,
+ 1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,
+ 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1,
+ 0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1,
+ 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,
+ 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,
+ 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,1,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,1,1,1,1,1,0,0,1,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,
+ 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,
+ 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,
+ 0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,
+ 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
+ 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,
+ 0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,
+ 0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,
+ 0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,
+ 1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,
+ 0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,
+ 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,
+ 1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,
+ 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,
+ 0,0,1,1,1,1,1,0,0,1,0,0,0,1,0,1,
+ 1,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1,
+ 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,
+ 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,
+ 0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,
+ 1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,
+ 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,
+ 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1,
+ 0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1,
+ 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,
+ 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,1,
+ 0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,
+ 0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,
+ 0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,
+ 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,
+ 0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,
+ 0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,
+ 1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,0,
+ 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,
+ 0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,
+ 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1,
+ 0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,
+ 1,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,
+ 0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1,
+ 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1,
+ 0,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,
+ 1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,
+ 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,
+ 0,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,
+ 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,
+ 1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1,
+ 0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,
+ 0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,1,
+ 0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,
+ 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,
+ 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,
+ 0,1,1,1,1,0,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,1,0,0,0,0,1,0,1,0,1,1,1,0,
+ 0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1,
+ 0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,1,
+ 1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,
+ 1,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,1,1,0,1,0,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,1,1,1,1,0,0,1,1,
+ 0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,
+ 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1,
+ 0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,
+ 1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,1,0,0,0,0,1,0,1,1,0,0,0,1,
+ 0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,1,
+ 1,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,
+ 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,
+ 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,
+ 1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,0,
+ 0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,1,
+ 0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,1,
+ 1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,
+ 1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,
+ 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,
+ 1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,
+ 1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,
+ 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,
+ 0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,
+ 0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,
+ 1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,
+ 1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,
+ 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1,
+ 0,0,1,0,0,0,1,0,0,
+ 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,
+ 1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,
+ 0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,
+ 1,1,1,1,0,1,0,1,0,0,0,0,0,1,1,1,
+ 1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,
+ 1,1,0,0,0,1,1,0,1,0,0,1,0,0,1,1,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,
+ 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,
+ 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,
+ 0,0,1,0,0,0,1,0,0,1,1,0,0,1,0,0,
+ 1,1,0,0,1,0,0,1,1,0,0,1,0,0,1,1,
+ 0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0,
+ 1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,
+ 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,
+ 1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,
+ 0,0,1,0,0,1,0,0,0,
+ 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,
+ 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1,
+ 0,1,0,0,1,0,0,0,1,0,0,1,0,1,0,1,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,
+ 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,0,
+ 0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,0,
+ 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1,
+ 0,0,0,1,0,1,0,0,0,
+ 0,0,1,0,0,0,1,0,1,0,0,1,0,0,1,1,
+ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,
+ 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,1,
+ 1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,1,
+ 0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,
+ 0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,
+ 1,1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,
+ 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,1,
+ 0,0,0,1,1,0,1,0,0,0,1,1,0,1,0,0,
+ 0,1,1,0,1,0,0,0,1,1,0,1,0,0,0,1,
+ 1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,
+ 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 1,1,0,0,0,1,0,1,0,0,0,1,1,0,1,0,
+ 0,0,1,1,0,1,0,0,0,1,1,0,1,0,0,0,
+ 1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1,
+ 0,0,0,1,1,1,0,0,0,
+ 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,
+ 0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,
+ 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
+ 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,1,
+ 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,
+ 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,
+ 1,0,1,0,0,1,1,1,0,0,1,1,1,1,0,0,
+ 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,
+ 1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,
+ 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,
+ 0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,1,
+ 0,0,0,1,1,0,0,1,1,1,1,0,0,0,1,1,
+ 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,
+ 0,0,0,1,1,1,1,0,0,1,0,0,0,0,0,1,
+ 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,
+ 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,
+ 1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,
+ 0,1,1,1,1,1,0,0,0,1,1,1,0,1,0,0,
+ 1,1,1,0,1,0,0,1,1,1,0,1,0,0,1,1,
+ 1,0,1,0,0,1,1,1,0,1,0,0,1,1,1,0,
+ 1,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,
+ 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,
+ 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,
+ 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,
+ 0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1,
+ 0,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1,
+ 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,
+ 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,
+ 0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,1,
+ 1,1,0,1,0,0,1,1,1,0,1,0,0,1,1,1,
+ 0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0,
+ 0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,
+ 0,1,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,1,0,0,0,0,0
+};
+
+static const int small_font[] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,1,1,0,0,1,1,1,1,0,0,
+ 0,1,0,0,1,1,1,1,0,0,1,1,0,0,1,1,
+ 1,1,0,0,1,1,0,0,0,1,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,
+ 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,1,
+ 1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,1,
+ 1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,
+ 1,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,
+ 0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0,
+ 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,
+ 1,1,1,0,1,0,0,1,0,1,0,0,1,0,1,0,
+ 0,1,0,1,0,0,1,0,0,1,0,1,0,1,1,1,
+ 1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+ 1,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,0,0,
+ 0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,
+ 1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,
+ 1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,
+ 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,
+ 0,1,1,0,0,1,0,0,1,0,0,0,0,1,0,0,
+ 1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,
+ 0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,1,
+ 0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,
+ 0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,
+ 1,0,1,0,1,0,0,1,0,0,0,0,1,1,1,1,
+ 0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0,
+ 0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,
+ 1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,
+ 0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,
+ 0,1,0,1,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,
+ 0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,
+ 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,
+ 0,0,1,0,0,0,0,0,1,0,0,1,1,0,0,1,
+ 0,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0,
+ 1,0,0,0,1,1,0,0,1,0,0,1,0,0,1,1,
+ 0,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1,
+ 0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0,
+ 1,0,0,1,0,1,1,1,0,0,1,0,0,0,0,1,
+ 0,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,
+ 0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,
+ 1,0,1,1,0,0,0,1,0,0,0,0,1,1,1,1,
+ 0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0,
+ 0,1,0,0,1,1,0,0,0,1,0,1,0,0,0,1,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,1,1,0,1,1,1,0,0,0,1,1,0,0,0,
+ 1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,1,
+ 1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0,
+ 1,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,
+ 0,1,1,1,0,0,0,1,1,0,0,1,1,1,0,0,
+ 0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,1,
+ 1,1,0,0,1,0,0,1,0,0,1,0,1,0,1,0,
+ 0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,1,
+ 1,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,
+ 1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1,
+ 1,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,
+ 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,1,
+ 1,1,1,0,0,0,0,1,0,1,0,0,1,0,0,0,
+ 1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,1,0,0,1,0,1,1,0,
+ 1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1,
+ 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,
+ 1,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,
+ 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,1,
+ 0,1,0,1,1,0,1,0,0,1,0,1,1,1,0,0,
+ 1,0,0,1,0,1,1,1,0,0,0,0,1,0,0,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1,
+ 1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,
+ 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,
+ 0,0,1,0,1,0,1,1,0,1,1,1,0,0,1,0,
+ 0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,
+ 1,0,1,1,0,0,0,0,0,1,0,0,1,1,1,1,
+ 0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,1,0,0,0,0,
+ 1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0,
+ 0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,1,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,
+ 0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,
+ 0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,0,
+ 0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,
+ 0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,
+ 0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,1,
+ 0,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1,
+ 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,
+ 0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,
+ 1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,1,
+ 0,1,0,1,1,0,1,0,0,1,0,1,0,0,0,0,
+ 1,1,0,1,0,1,0,1,0,0,1,0,0,1,0,0,
+ 0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1,
+ 1,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,
+ 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,1,1,0,1,0,0,1,0,1,0,0,0,0,1,
+ 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,1,
+ 1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,
+ 1,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1,
+ 0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,0,0,0,0,1,1,0,0,
+ 1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,1,
+ 1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,0,
+ 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,
+ 1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,
+ 1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,1,1,1,0,1,1,1,1,0,0,1,1,0,0,0,
+ 0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,
+ 0,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,
+ 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,
+ 1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,1,
+ 1,1,0,0,1,1,1,1,0,1,0,0,0,0,0,1,
+ 1,1,0,1,0,0,1,0,0,1,1,1,0,0,1,1,
+ 0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1,
+ 0,1,0,0,1,0,0,1,1,0,0,1,0,0,0,0,
+ 0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,0,
+ 0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,
+ 0,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1,
+ 1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,
+ 0,1,0,1,0,1,1,1,0,0,0,1,1,0,0,0,
+ 1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,
+ 0,0,0,1,0,0,1,0,0,1,1,1,0,0,1,0,
+ 1,0,1,0,0,1,0,0,1,1,1,0,1,0,0,1,
+ 0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0,
+ 0,1,1,1,0,1,0,0,0,0,1,1,1,0,0,0,
+ 0,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1,
+ 1,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1,
+ 1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0
+};
+
+static const int small_font_extended[] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,
+ 1,1,0,0,1,0,1,0,0,1,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,1,1,0,1,1,1,1,0,0,0,1,0,0,
+ 0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,
+ 0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,
+ 0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,
+ 0,0,1,0,0,1,1,0,0,0,1,1,1,0,0,1,
+ 1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1,
+ 1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1,
+ 0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0,
+ 1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0,
+ 1,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,
+ 0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+ 0,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,
+ 0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,
+ 0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,
+ 0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,
+ 1,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,
+ 0,0,0,1,1,0,0,0,1,0,1,0,0,0,1,0,
+ 0,0,0,0,0,0,0,1,0,1,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,1,
+ 0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,
+ 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0,
+ 0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,
+ 1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,
+ 0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,
+ 1,1,0,0,0,1,1,0,0,1,0,1,0,0,1,0,
+ 0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,0,1,1,0,0,0,0,
+ 0,0,0,1,0,1,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1,
+ 0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0,
+ 0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,
+ 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,
+ 0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0,
+ 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,
+ 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,
+ 1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,1,1,1,0,0,1,0,0,0,0,
+ 1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,
+ 1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,1,
+ 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0,
+ 1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,1,0,0,1,0,1,1,0,1,0,0,1,
+ 1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,
+ 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,
+ 0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,1,1,0,1,0,
+ 0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,
+ 0,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,0,
+ 1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,
+ 0,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+ 0,1,0,0,1,0,1,0,1,0,0,0,1,1,1,0,
+ 0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,
+ 1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0,
+ 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,
+ 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,
+ 0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,
+ 1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,
+ 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,
+ 0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,
+ 0,1,1,1,0,0,1,0,0,1,0,
+ 0,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0,
+ 1,0,1,0,0,1,1,1,0,0,0,0,0,0,0,1,
+ 0,1,0,0,0,0,0,0,1,1,0,0,1,0,0,0,
+ 0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,0,
+ 0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,
+ 0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1,
+ 1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,
+ 0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,1,
+ 0,1,1,0,1,0,0,1,0,0,0,1,1,1,1,0,
+ 1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,
+ 1,1,1,0,1,1,1,1,0,1,1,1,0,0,1,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,
+ 1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,
+ 1,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0,
+ 0,1,1,1,0,0,1,0,0,1,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1,
+ 0,0,0,1,0,1,1,0,1,0,1,1,0,1,0,1,
+ 1,0,1,0,1,1,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,
+ 1,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,
+ 0,1,0,0,1,0,1,0,0,1,0,
+ 0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,
+ 1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,
+ 1,1,0,0,0,0,0,0,1,0,1,0,1,0,0,0,
+ 0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,
+ 0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,1,
+ 0,0,0,1,1,0,0,1,0,1,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0,
+ 0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,
+ 1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,
+ 1,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0,
+ 0,1,0,0,0,0,1,0,0,1,0,1,0,1,1,0,
+ 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,
+ 0,1,1,0,1,0,1,1,0,1,0,1,0,0,0,1,
+ 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,
+ 0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,
+ 0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,
+ 0,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,
+ 0,1,0,0,1,0,0,1,0,1,0,
+ 0,0,1,0,0,0,1,1,1,0,1,0,1,1,0,1,
+ 0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,
+ 0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,1,1,0,0,0,1,0,1,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,
+ 0,0,1,1,1,0,0,0,1,0,0,1,0,0,1,0,
+ 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,
+ 0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1,
+ 1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1,
+ 1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1,
+ 0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0,
+ 1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0,
+ 1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,
+ 0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,1,
+ 0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,0,
+ 0,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0,
+ 0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,
+ 1,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0,
+ 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,
+ 0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1,
+ 0,0,1,1,1,0,0,1,1,1,0,0,1,1,0,0,
+ 1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0,
+ 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,
+ 1,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,
+ 1,0,0,1,1,1,0,0,1,1,1,0,0,0,1,0,
+ 0,1,1,1,0,0,0,0,1,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,1,0,0,0,0,0,1,0,0,0
+};
diff --git a/backend/gb2312.h b/backend/gb2312.h
new file mode 100644
index 0000000..572ff3b
--- /dev/null
+++ b/backend/gb2312.h
@@ -0,0 +1,7478 @@
+/* gb2312.h - Unicode to GB 2312-1980 lookup table
+
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+static const unsigned long int gb2312_lookup[] = {
+ 0x00A4, 0xA1E8,
+ 0x00A7, 0xA1EC,
+ 0x00A8, 0xA1A7,
+ 0x00B0, 0xA1E3,
+ 0x00B1, 0xA1C0,
+ 0x00B7, 0xA1A4,
+ 0x00D7, 0xA1C1,
+ 0x00E0, 0xA8A4,
+ 0x00E1, 0xA8A2,
+ 0x00E8, 0xA8A8,
+ 0x00E9, 0xA8A6,
+ 0x00EA, 0xA8BA,
+ 0x00EC, 0xA8AC,
+ 0x00ED, 0xA8AA,
+ 0x00F2, 0xA8B0,
+ 0x00F3, 0xA8AE,
+ 0x00F7, 0xA1C2,
+ 0x00F9, 0xA8B4,
+ 0x00FA, 0xA8B2,
+ 0x00FC, 0xA8B9,
+ 0x0101, 0xA8A1,
+ 0x0113, 0xA8A5,
+ 0x011B, 0xA8A7,
+ 0x012B, 0xA8A9,
+ 0x014D, 0xA8AD,
+ 0x016B, 0xA8B1,
+ 0x01CE, 0xA8A3,
+ 0x01D0, 0xA8AB,
+ 0x01D2, 0xA8AF,
+ 0x01D4, 0xA8B3,
+ 0x01D6, 0xA8B5,
+ 0x01D8, 0xA8B6,
+ 0x01DA, 0xA8B7,
+ 0x01DC, 0xA8B8,
+ 0x02C7, 0xA1A6,
+ 0x02C9, 0xA1A5,
+ 0x0391, 0xA6A1,
+ 0x0392, 0xA6A2,
+ 0x0393, 0xA6A3,
+ 0x0394, 0xA6A4,
+ 0x0395, 0xA6A5,
+ 0x0396, 0xA6A6,
+ 0x0397, 0xA6A7,
+ 0x0398, 0xA6A8,
+ 0x0399, 0xA6A9,
+ 0x039A, 0xA6AA,
+ 0x039B, 0xA6AB,
+ 0x039C, 0xA6AC,
+ 0x039D, 0xA6AD,
+ 0x039E, 0xA6AE,
+ 0x039F, 0xA6AF,
+ 0x03A0, 0xA6B0,
+ 0x03A1, 0xA6B1,
+ 0x03A3, 0xA6B2,
+ 0x03A4, 0xA6B3,
+ 0x03A5, 0xA6B4,
+ 0x03A6, 0xA6B5,
+ 0x03A7, 0xA6B6,
+ 0x03A8, 0xA6B7,
+ 0x03A9, 0xA6B8,
+ 0x03B1, 0xA6C1,
+ 0x03B2, 0xA6C2,
+ 0x03B3, 0xA6C3,
+ 0x03B4, 0xA6C4,
+ 0x03B5, 0xA6C5,
+ 0x03B6, 0xA6C6,
+ 0x03B7, 0xA6C7,
+ 0x03B8, 0xA6C8,
+ 0x03B9, 0xA6C9,
+ 0x03BA, 0xA6CA,
+ 0x03BB, 0xA6CB,
+ 0x03BC, 0xA6CC,
+ 0x03BD, 0xA6CD,
+ 0x03BE, 0xA6CE,
+ 0x03BF, 0xA6CF,
+ 0x03C0, 0xA6D0,
+ 0x03C1, 0xA6D1,
+ 0x03C3, 0xA6D2,
+ 0x03C4, 0xA6D3,
+ 0x03C5, 0xA6D4,
+ 0x03C6, 0xA6D5,
+ 0x03C7, 0xA6D6,
+ 0x03C8, 0xA6D7,
+ 0x03C9, 0xA6D8,
+ 0x0401, 0xA7A7,
+ 0x0410, 0xA7A1,
+ 0x0411, 0xA7A2,
+ 0x0412, 0xA7A3,
+ 0x0413, 0xA7A4,
+ 0x0414, 0xA7A5,
+ 0x0415, 0xA7A6,
+ 0x0416, 0xA7A8,
+ 0x0417, 0xA7A9,
+ 0x0418, 0xA7AA,
+ 0x0419, 0xA7AB,
+ 0x041A, 0xA7AC,
+ 0x041B, 0xA7AD,
+ 0x041C, 0xA7AE,
+ 0x041D, 0xA7AF,
+ 0x041E, 0xA7B0,
+ 0x041F, 0xA7B1,
+ 0x0420, 0xA7B2,
+ 0x0421, 0xA7B3,
+ 0x0422, 0xA7B4,
+ 0x0423, 0xA7B5,
+ 0x0424, 0xA7B6,
+ 0x0425, 0xA7B7,
+ 0x0426, 0xA7B8,
+ 0x0427, 0xA7B9,
+ 0x0428, 0xA7BA,
+ 0x0429, 0xA7BB,
+ 0x042A, 0xA7BC,
+ 0x042B, 0xA7BD,
+ 0x042C, 0xA7BE,
+ 0x042D, 0xA7BF,
+ 0x042E, 0xA7C0,
+ 0x042F, 0xA7C1,
+ 0x0430, 0xA7D1,
+ 0x0431, 0xA7D2,
+ 0x0432, 0xA7D3,
+ 0x0433, 0xA7D4,
+ 0x0434, 0xA7D5,
+ 0x0435, 0xA7D6,
+ 0x0436, 0xA7D8,
+ 0x0437, 0xA7D9,
+ 0x0438, 0xA7DA,
+ 0x0439, 0xA7DB,
+ 0x043A, 0xA7DC,
+ 0x043B, 0xA7DD,
+ 0x043C, 0xA7DE,
+ 0x043D, 0xA7DF,
+ 0x043E, 0xA7E0,
+ 0x043F, 0xA7E1,
+ 0x0440, 0xA7E2,
+ 0x0441, 0xA7E3,
+ 0x0442, 0xA7E4,
+ 0x0443, 0xA7E5,
+ 0x0444, 0xA7E6,
+ 0x0445, 0xA7E7,
+ 0x0446, 0xA7E8,
+ 0x0447, 0xA7E9,
+ 0x0448, 0xA7EA,
+ 0x0449, 0xA7EB,
+ 0x044A, 0xA7EC,
+ 0x044B, 0xA7ED,
+ 0x044C, 0xA7EE,
+ 0x044D, 0xA7EF,
+ 0x044E, 0xA7F0,
+ 0x044F, 0xA7F1,
+ 0x0451, 0xA7D7,
+ 0x2014, 0xA1AA,
+ 0x2016, 0xA1AC,
+ 0x2018, 0xA1AE,
+ 0x2019, 0xA1AF,
+ 0x201C, 0xA1B0,
+ 0x201D, 0xA1B1,
+ 0x2026, 0xA1AD,
+ 0x2030, 0xA1EB,
+ 0x2032, 0xA1E4,
+ 0x2033, 0xA1E5,
+ 0x203B, 0xA1F9,
+ 0x2103, 0xA1E6,
+ 0x2116, 0xA1ED,
+ 0x2160, 0xA2F1,
+ 0x2161, 0xA2F2,
+ 0x2162, 0xA2F3,
+ 0x2163, 0xA2F4,
+ 0x2164, 0xA2F5,
+ 0x2165, 0xA2F6,
+ 0x2166, 0xA2F7,
+ 0x2167, 0xA2F8,
+ 0x2168, 0xA2F9,
+ 0x2169, 0xA2FA,
+ 0x216A, 0xA2FB,
+ 0x216B, 0xA2FC,
+ 0x2190, 0xA1FB,
+ 0x2191, 0xA1FC,
+ 0x2192, 0xA1FA,
+ 0x2193, 0xA1FD,
+ 0x2208, 0xA1CA,
+ 0x220F, 0xA1C7,
+ 0x2211, 0xA1C6,
+ 0x221A, 0xA1CC,
+ 0x221D, 0xA1D8,
+ 0x221E, 0xA1DE,
+ 0x2220, 0xA1CF,
+ 0x2225, 0xA1CE,
+ 0x2227, 0xA1C4,
+ 0x2228, 0xA1C5,
+ 0x2229, 0xA1C9,
+ 0x222A, 0xA1C8,
+ 0x222B, 0xA1D2,
+ 0x222E, 0xA1D3,
+ 0x2234, 0xA1E0,
+ 0x2235, 0xA1DF,
+ 0x2236, 0xA1C3,
+ 0x2237, 0xA1CB,
+ 0x223D, 0xA1D7,
+ 0x2248, 0xA1D6,
+ 0x224C, 0xA1D5,
+ 0x2260, 0xA1D9,
+ 0x2261, 0xA1D4,
+ 0x2264, 0xA1DC,
+ 0x2265, 0xA1DD,
+ 0x226E, 0xA1DA,
+ 0x226F, 0xA1DB,
+ 0x2299, 0xA1D1,
+ 0x22A5, 0xA1CD,
+ 0x2312, 0xA1D0,
+ 0x2460, 0xA2D9,
+ 0x2461, 0xA2DA,
+ 0x2462, 0xA2DB,
+ 0x2463, 0xA2DC,
+ 0x2464, 0xA2DD,
+ 0x2465, 0xA2DE,
+ 0x2466, 0xA2DF,
+ 0x2467, 0xA2E0,
+ 0x2468, 0xA2E1,
+ 0x2469, 0xA2E2,
+ 0x2474, 0xA2C5,
+ 0x2475, 0xA2C6,
+ 0x2476, 0xA2C7,
+ 0x2477, 0xA2C8,
+ 0x2478, 0xA2C9,
+ 0x2479, 0xA2CA,
+ 0x247A, 0xA2CB,
+ 0x247B, 0xA2CC,
+ 0x247C, 0xA2CD,
+ 0x247D, 0xA2CE,
+ 0x247E, 0xA2CF,
+ 0x247F, 0xA2D0,
+ 0x2480, 0xA2D1,
+ 0x2481, 0xA2D2,
+ 0x2482, 0xA2D3,
+ 0x2483, 0xA2D4,
+ 0x2484, 0xA2D5,
+ 0x2485, 0xA2D6,
+ 0x2486, 0xA2D7,
+ 0x2487, 0xA2D8,
+ 0x2488, 0xA2B1,
+ 0x2489, 0xA2B2,
+ 0x248A, 0xA2B3,
+ 0x248B, 0xA2B4,
+ 0x248C, 0xA2B5,
+ 0x248D, 0xA2B6,
+ 0x248E, 0xA2B7,
+ 0x248F, 0xA2B8,
+ 0x2490, 0xA2B9,
+ 0x2491, 0xA2BA,
+ 0x2492, 0xA2BB,
+ 0x2493, 0xA2BC,
+ 0x2494, 0xA2BD,
+ 0x2495, 0xA2BE,
+ 0x2496, 0xA2BF,
+ 0x2497, 0xA2C0,
+ 0x2498, 0xA2C1,
+ 0x2499, 0xA2C2,
+ 0x249A, 0xA2C3,
+ 0x249B, 0xA2C4,
+ 0x2500, 0xA9A4,
+ 0x2501, 0xA9A5,
+ 0x2502, 0xA9A6,
+ 0x2503, 0xA9A7,
+ 0x2504, 0xA9A8,
+ 0x2505, 0xA9A9,
+ 0x2506, 0xA9AA,
+ 0x2507, 0xA9AB,
+ 0x2508, 0xA9AC,
+ 0x2509, 0xA9AD,
+ 0x250A, 0xA9AE,
+ 0x250B, 0xA9AF,
+ 0x250C, 0xA9B0,
+ 0x250D, 0xA9B1,
+ 0x250E, 0xA9B2,
+ 0x250F, 0xA9B3,
+ 0x2510, 0xA9B4,
+ 0x2511, 0xA9B5,
+ 0x2512, 0xA9B6,
+ 0x2513, 0xA9B7,
+ 0x2514, 0xA9B8,
+ 0x2515, 0xA9B9,
+ 0x2516, 0xA9BA,
+ 0x2517, 0xA9BB,
+ 0x2518, 0xA9BC,
+ 0x2519, 0xA9BD,
+ 0x251A, 0xA9BE,
+ 0x251B, 0xA9BF,
+ 0x251C, 0xA9C0,
+ 0x251D, 0xA9C1,
+ 0x251E, 0xA9C2,
+ 0x251F, 0xA9C3,
+ 0x2520, 0xA9C4,
+ 0x2521, 0xA9C5,
+ 0x2522, 0xA9C6,
+ 0x2523, 0xA9C7,
+ 0x2524, 0xA9C8,
+ 0x2525, 0xA9C9,
+ 0x2526, 0xA9CA,
+ 0x2527, 0xA9CB,
+ 0x2528, 0xA9CC,
+ 0x2529, 0xA9CD,
+ 0x252A, 0xA9CE,
+ 0x252B, 0xA9CF,
+ 0x252C, 0xA9D0,
+ 0x252D, 0xA9D1,
+ 0x252E, 0xA9D2,
+ 0x252F, 0xA9D3,
+ 0x2530, 0xA9D4,
+ 0x2531, 0xA9D5,
+ 0x2532, 0xA9D6,
+ 0x2533, 0xA9D7,
+ 0x2534, 0xA9D8,
+ 0x2535, 0xA9D9,
+ 0x2536, 0xA9DA,
+ 0x2537, 0xA9DB,
+ 0x2538, 0xA9DC,
+ 0x2539, 0xA9DD,
+ 0x253A, 0xA9DE,
+ 0x253B, 0xA9DF,
+ 0x253C, 0xA9E0,
+ 0x253D, 0xA9E1,
+ 0x253E, 0xA9E2,
+ 0x253F, 0xA9E3,
+ 0x2540, 0xA9E4,
+ 0x2541, 0xA9E5,
+ 0x2542, 0xA9E6,
+ 0x2543, 0xA9E7,
+ 0x2544, 0xA9E8,
+ 0x2545, 0xA9E9,
+ 0x2546, 0xA9EA,
+ 0x2547, 0xA9EB,
+ 0x2548, 0xA9EC,
+ 0x2549, 0xA9ED,
+ 0x254A, 0xA9EE,
+ 0x254B, 0xA9EF,
+ 0x25A0, 0xA1F6,
+ 0x25A1, 0xA1F5,
+ 0x25B2, 0xA1F8,
+ 0x25B3, 0xA1F7,
+ 0x25C6, 0xA1F4,
+ 0x25C7, 0xA1F3,
+ 0x25CB, 0xA1F0,
+ 0x25CE, 0xA1F2,
+ 0x25CF, 0xA1F1,
+ 0x2605, 0xA1EF,
+ 0x2606, 0xA1EE,
+ 0x2640, 0xA1E2,
+ 0x2642, 0xA1E1,
+ 0x3000, 0xA1A1,
+ 0x3001, 0xA1A2,
+ 0x3002, 0xA1A3,
+ 0x3003, 0xA1A8,
+ 0x3005, 0xA1A9,
+ 0x3008, 0xA1B4,
+ 0x3009, 0xA1B5,
+ 0x300A, 0xA1B6,
+ 0x300B, 0xA1B7,
+ 0x300C, 0xA1B8,
+ 0x300D, 0xA1B9,
+ 0x300E, 0xA1BA,
+ 0x300F, 0xA1BB,
+ 0x3010, 0xA1BE,
+ 0x3011, 0xA1BF,
+ 0x3013, 0xA1FE,
+ 0x3014, 0xA1B2,
+ 0x3015, 0xA1B3,
+ 0x3016, 0xA1BC,
+ 0x3017, 0xA1BD,
+ 0x3041, 0xA4A1,
+ 0x3042, 0xA4A2,
+ 0x3043, 0xA4A3,
+ 0x3044, 0xA4A4,
+ 0x3045, 0xA4A5,
+ 0x3046, 0xA4A6,
+ 0x3047, 0xA4A7,
+ 0x3048, 0xA4A8,
+ 0x3049, 0xA4A9,
+ 0x304A, 0xA4AA,
+ 0x304B, 0xA4AB,
+ 0x304C, 0xA4AC,
+ 0x304D, 0xA4AD,
+ 0x304E, 0xA4AE,
+ 0x304F, 0xA4AF,
+ 0x3050, 0xA4B0,
+ 0x3051, 0xA4B1,
+ 0x3052, 0xA4B2,
+ 0x3053, 0xA4B3,
+ 0x3054, 0xA4B4,
+ 0x3055, 0xA4B5,
+ 0x3056, 0xA4B6,
+ 0x3057, 0xA4B7,
+ 0x3058, 0xA4B8,
+ 0x3059, 0xA4B9,
+ 0x305A, 0xA4BA,
+ 0x305B, 0xA4BB,
+ 0x305C, 0xA4BC,
+ 0x305D, 0xA4BD,
+ 0x305E, 0xA4BE,
+ 0x305F, 0xA4BF,
+ 0x3060, 0xA4C0,
+ 0x3061, 0xA4C1,
+ 0x3062, 0xA4C2,
+ 0x3063, 0xA4C3,
+ 0x3064, 0xA4C4,
+ 0x3065, 0xA4C5,
+ 0x3066, 0xA4C6,
+ 0x3067, 0xA4C7,
+ 0x3068, 0xA4C8,
+ 0x3069, 0xA4C9,
+ 0x306A, 0xA4CA,
+ 0x306B, 0xA4CB,
+ 0x306C, 0xA4CC,
+ 0x306D, 0xA4CD,
+ 0x306E, 0xA4CE,
+ 0x306F, 0xA4CF,
+ 0x3070, 0xA4D0,
+ 0x3071, 0xA4D1,
+ 0x3072, 0xA4D2,
+ 0x3073, 0xA4D3,
+ 0x3074, 0xA4D4,
+ 0x3075, 0xA4D5,
+ 0x3076, 0xA4D6,
+ 0x3077, 0xA4D7,
+ 0x3078, 0xA4D8,
+ 0x3079, 0xA4D9,
+ 0x307A, 0xA4DA,
+ 0x307B, 0xA4DB,
+ 0x307C, 0xA4DC,
+ 0x307D, 0xA4DD,
+ 0x307E, 0xA4DE,
+ 0x307F, 0xA4DF,
+ 0x3080, 0xA4E0,
+ 0x3081, 0xA4E1,
+ 0x3082, 0xA4E2,
+ 0x3083, 0xA4E3,
+ 0x3084, 0xA4E4,
+ 0x3085, 0xA4E5,
+ 0x3086, 0xA4E6,
+ 0x3087, 0xA4E7,
+ 0x3088, 0xA4E8,
+ 0x3089, 0xA4E9,
+ 0x308A, 0xA4EA,
+ 0x308B, 0xA4EB,
+ 0x308C, 0xA4EC,
+ 0x308D, 0xA4ED,
+ 0x308E, 0xA4EE,
+ 0x308F, 0xA4EF,
+ 0x3090, 0xA4F0,
+ 0x3091, 0xA4F1,
+ 0x3092, 0xA4F2,
+ 0x3093, 0xA4F3,
+ 0x30A1, 0xA5A1,
+ 0x30A2, 0xA5A2,
+ 0x30A3, 0xA5A3,
+ 0x30A4, 0xA5A4,
+ 0x30A5, 0xA5A5,
+ 0x30A6, 0xA5A6,
+ 0x30A7, 0xA5A7,
+ 0x30A8, 0xA5A8,
+ 0x30A9, 0xA5A9,
+ 0x30AA, 0xA5AA,
+ 0x30AB, 0xA5AB,
+ 0x30AC, 0xA5AC,
+ 0x30AD, 0xA5AD,
+ 0x30AE, 0xA5AE,
+ 0x30AF, 0xA5AF,
+ 0x30B0, 0xA5B0,
+ 0x30B1, 0xA5B1,
+ 0x30B2, 0xA5B2,
+ 0x30B3, 0xA5B3,
+ 0x30B4, 0xA5B4,
+ 0x30B5, 0xA5B5,
+ 0x30B6, 0xA5B6,
+ 0x30B7, 0xA5B7,
+ 0x30B8, 0xA5B8,
+ 0x30B9, 0xA5B9,
+ 0x30BA, 0xA5BA,
+ 0x30BB, 0xA5BB,
+ 0x30BC, 0xA5BC,
+ 0x30BD, 0xA5BD,
+ 0x30BE, 0xA5BE,
+ 0x30BF, 0xA5BF,
+ 0x30C0, 0xA5C0,
+ 0x30C1, 0xA5C1,
+ 0x30C2, 0xA5C2,
+ 0x30C3, 0xA5C3,
+ 0x30C4, 0xA5C4,
+ 0x30C5, 0xA5C5,
+ 0x30C6, 0xA5C6,
+ 0x30C7, 0xA5C7,
+ 0x30C8, 0xA5C8,
+ 0x30C9, 0xA5C9,
+ 0x30CA, 0xA5CA,
+ 0x30CB, 0xA5CB,
+ 0x30CC, 0xA5CC,
+ 0x30CD, 0xA5CD,
+ 0x30CE, 0xA5CE,
+ 0x30CF, 0xA5CF,
+ 0x30D0, 0xA5D0,
+ 0x30D1, 0xA5D1,
+ 0x30D2, 0xA5D2,
+ 0x30D3, 0xA5D3,
+ 0x30D4, 0xA5D4,
+ 0x30D5, 0xA5D5,
+ 0x30D6, 0xA5D6,
+ 0x30D7, 0xA5D7,
+ 0x30D8, 0xA5D8,
+ 0x30D9, 0xA5D9,
+ 0x30DA, 0xA5DA,
+ 0x30DB, 0xA5DB,
+ 0x30DC, 0xA5DC,
+ 0x30DD, 0xA5DD,
+ 0x30DE, 0xA5DE,
+ 0x30DF, 0xA5DF,
+ 0x30E0, 0xA5E0,
+ 0x30E1, 0xA5E1,
+ 0x30E2, 0xA5E2,
+ 0x30E3, 0xA5E3,
+ 0x30E4, 0xA5E4,
+ 0x30E5, 0xA5E5,
+ 0x30E6, 0xA5E6,
+ 0x30E7, 0xA5E7,
+ 0x30E8, 0xA5E8,
+ 0x30E9, 0xA5E9,
+ 0x30EA, 0xA5EA,
+ 0x30EB, 0xA5EB,
+ 0x30EC, 0xA5EC,
+ 0x30ED, 0xA5ED,
+ 0x30EE, 0xA5EE,
+ 0x30EF, 0xA5EF,
+ 0x30F0, 0xA5F0,
+ 0x30F1, 0xA5F1,
+ 0x30F2, 0xA5F2,
+ 0x30F3, 0xA5F3,
+ 0x30F4, 0xA5F4,
+ 0x30F5, 0xA5F5,
+ 0x30F6, 0xA5F6,
+ 0x3105, 0xA8C5,
+ 0x3106, 0xA8C6,
+ 0x3107, 0xA8C7,
+ 0x3108, 0xA8C8,
+ 0x3109, 0xA8C9,
+ 0x310A, 0xA8CA,
+ 0x310B, 0xA8CB,
+ 0x310C, 0xA8CC,
+ 0x310D, 0xA8CD,
+ 0x310E, 0xA8CE,
+ 0x310F, 0xA8CF,
+ 0x3110, 0xA8D0,
+ 0x3111, 0xA8D1,
+ 0x3112, 0xA8D2,
+ 0x3113, 0xA8D3,
+ 0x3114, 0xA8D4,
+ 0x3115, 0xA8D5,
+ 0x3116, 0xA8D6,
+ 0x3117, 0xA8D7,
+ 0x3118, 0xA8D8,
+ 0x3119, 0xA8D9,
+ 0x311A, 0xA8DA,
+ 0x311B, 0xA8DB,
+ 0x311C, 0xA8DC,
+ 0x311D, 0xA8DD,
+ 0x311E, 0xA8DE,
+ 0x311F, 0xA8DF,
+ 0x3120, 0xA8E0,
+ 0x3121, 0xA8E1,
+ 0x3122, 0xA8E2,
+ 0x3123, 0xA8E3,
+ 0x3124, 0xA8E4,
+ 0x3125, 0xA8E5,
+ 0x3126, 0xA8E6,
+ 0x3127, 0xA8E7,
+ 0x3128, 0xA8E8,
+ 0x3129, 0xA8E9,
+ 0x3220, 0xA2E5,
+ 0x3221, 0xA2E6,
+ 0x3222, 0xA2E7,
+ 0x3223, 0xA2E8,
+ 0x3224, 0xA2E9,
+ 0x3225, 0xA2EA,
+ 0x3226, 0xA2EB,
+ 0x3227, 0xA2EC,
+ 0x3228, 0xA2ED,
+ 0x3229, 0xA2EE,
+ 0x4E00, 0xD2BB,
+ 0x4E01, 0xB6A1,
+ 0x4E03, 0xC6DF,
+ 0x4E07, 0xCDF2,
+ 0x4E08, 0xD5C9,
+ 0x4E09, 0xC8FD,
+ 0x4E0A, 0xC9CF,
+ 0x4E0B, 0xCFC2,
+ 0x4E0C, 0xD8A2,
+ 0x4E0D, 0xB2BB,
+ 0x4E0E, 0xD3EB,
+ 0x4E10, 0xD8A4,
+ 0x4E11, 0xB3F3,
+ 0x4E13, 0xD7A8,
+ 0x4E14, 0xC7D2,
+ 0x4E15, 0xD8A7,
+ 0x4E16, 0xCAC0,
+ 0x4E18, 0xC7F0,
+ 0x4E19, 0xB1FB,
+ 0x4E1A, 0xD2B5,
+ 0x4E1B, 0xB4D4,
+ 0x4E1C, 0xB6AB,
+ 0x4E1D, 0xCBBF,
+ 0x4E1E, 0xD8A9,
+ 0x4E22, 0xB6AA,
+ 0x4E24, 0xC1BD,
+ 0x4E25, 0xD1CF,
+ 0x4E27, 0xC9A5,
+ 0x4E28, 0xD8AD,
+ 0x4E2A, 0xB8F6,
+ 0x4E2B, 0xD1BE,
+ 0x4E2C, 0xE3DC,
+ 0x4E2D, 0xD6D0,
+ 0x4E30, 0xB7E1,
+ 0x4E32, 0xB4AE,
+ 0x4E34, 0xC1D9,
+ 0x4E36, 0xD8BC,
+ 0x4E38, 0xCDE8,
+ 0x4E39, 0xB5A4,
+ 0x4E3A, 0xCEAA,
+ 0x4E3B, 0xD6F7,
+ 0x4E3D, 0xC0F6,
+ 0x4E3E, 0xBED9,
+ 0x4E3F, 0xD8AF,
+ 0x4E43, 0xC4CB,
+ 0x4E45, 0xBEC3,
+ 0x4E47, 0xD8B1,
+ 0x4E48, 0xC3B4,
+ 0x4E49, 0xD2E5,
+ 0x4E4B, 0xD6AE,
+ 0x4E4C, 0xCEDA,
+ 0x4E4D, 0xD5A7,
+ 0x4E4E, 0xBAF5,
+ 0x4E4F, 0xB7A6,
+ 0x4E50, 0xC0D6,
+ 0x4E52, 0xC6B9,
+ 0x4E53, 0xC5D2,
+ 0x4E54, 0xC7C7,
+ 0x4E56, 0xB9D4,
+ 0x4E58, 0xB3CB,
+ 0x4E59, 0xD2D2,
+ 0x4E5C, 0xD8BF,
+ 0x4E5D, 0xBEC5,
+ 0x4E5E, 0xC6F2,
+ 0x4E5F, 0xD2B2,
+ 0x4E60, 0xCFB0,
+ 0x4E61, 0xCFE7,
+ 0x4E66, 0xCAE9,
+ 0x4E69, 0xD8C0,
+ 0x4E70, 0xC2F2,
+ 0x4E71, 0xC2D2,
+ 0x4E73, 0xC8E9,
+ 0x4E7E, 0xC7AC,
+ 0x4E86, 0xC1CB,
+ 0x4E88, 0xD3E8,
+ 0x4E89, 0xD5F9,
+ 0x4E8B, 0xCAC2,
+ 0x4E8C, 0xB6FE,
+ 0x4E8D, 0xD8A1,
+ 0x4E8E, 0xD3DA,
+ 0x4E8F, 0xBFF7,
+ 0x4E91, 0xD4C6,
+ 0x4E92, 0xBBA5,
+ 0x4E93, 0xD8C1,
+ 0x4E94, 0xCEE5,
+ 0x4E95, 0xBEAE,
+ 0x4E98, 0xD8A8,
+ 0x4E9A, 0xD1C7,
+ 0x4E9B, 0xD0A9,
+ 0x4E9F, 0xD8BD,
+ 0x4EA0, 0xD9EF,
+ 0x4EA1, 0xCDF6,
+ 0x4EA2, 0xBFBA,
+ 0x4EA4, 0xBDBB,
+ 0x4EA5, 0xBAA5,
+ 0x4EA6, 0xD2E0,
+ 0x4EA7, 0xB2FA,
+ 0x4EA8, 0xBAE0,
+ 0x4EA9, 0xC4B6,
+ 0x4EAB, 0xCFED,
+ 0x4EAC, 0xBEA9,
+ 0x4EAD, 0xCDA4,
+ 0x4EAE, 0xC1C1,
+ 0x4EB2, 0xC7D7,
+ 0x4EB3, 0xD9F1,
+ 0x4EB5, 0xD9F4,
+ 0x4EBA, 0xC8CB,
+ 0x4EBB, 0xD8E9,
+ 0x4EBF, 0xD2DA,
+ 0x4EC0, 0xCAB2,
+ 0x4EC1, 0xC8CA,
+ 0x4EC2, 0xD8EC,
+ 0x4EC3, 0xD8EA,
+ 0x4EC4, 0xD8C6,
+ 0x4EC5, 0xBDF6,
+ 0x4EC6, 0xC6CD,
+ 0x4EC7, 0xB3F0,
+ 0x4EC9, 0xD8EB,
+ 0x4ECA, 0xBDF1,
+ 0x4ECB, 0xBDE9,
+ 0x4ECD, 0xC8D4,
+ 0x4ECE, 0xB4D3,
+ 0x4ED1, 0xC2D8,
+ 0x4ED3, 0xB2D6,
+ 0x4ED4, 0xD7D0,
+ 0x4ED5, 0xCACB,
+ 0x4ED6, 0xCBFB,
+ 0x4ED7, 0xD5CC,
+ 0x4ED8, 0xB8B6,
+ 0x4ED9, 0xCFC9,
+ 0x4EDD, 0xD9DA,
+ 0x4EDE, 0xD8F0,
+ 0x4EDF, 0xC7AA,
+ 0x4EE1, 0xD8EE,
+ 0x4EE3, 0xB4FA,
+ 0x4EE4, 0xC1EE,
+ 0x4EE5, 0xD2D4,
+ 0x4EE8, 0xD8ED,
+ 0x4EEA, 0xD2C7,
+ 0x4EEB, 0xD8EF,
+ 0x4EEC, 0xC3C7,
+ 0x4EF0, 0xD1F6,
+ 0x4EF2, 0xD6D9,
+ 0x4EF3, 0xD8F2,
+ 0x4EF5, 0xD8F5,
+ 0x4EF6, 0xBCFE,
+ 0x4EF7, 0xBCDB,
+ 0x4EFB, 0xC8CE,
+ 0x4EFD, 0xB7DD,
+ 0x4EFF, 0xB7C2,
+ 0x4F01, 0xC6F3,
+ 0x4F09, 0xD8F8,
+ 0x4F0A, 0xD2C1,
+ 0x4F0D, 0xCEE9,
+ 0x4F0E, 0xBCBF,
+ 0x4F0F, 0xB7FC,
+ 0x4F10, 0xB7A5,
+ 0x4F11, 0xD0DD,
+ 0x4F17, 0xD6DA,
+ 0x4F18, 0xD3C5,
+ 0x4F19, 0xBBEF,
+ 0x4F1A, 0xBBE1,
+ 0x4F1B, 0xD8F1,
+ 0x4F1E, 0xC9A1,
+ 0x4F1F, 0xCEB0,
+ 0x4F20, 0xB4AB,
+ 0x4F22, 0xD8F3,
+ 0x4F24, 0xC9CB,
+ 0x4F25, 0xD8F6,
+ 0x4F26, 0xC2D7,
+ 0x4F27, 0xD8F7,
+ 0x4F2A, 0xCEB1,
+ 0x4F2B, 0xD8F9,
+ 0x4F2F, 0xB2AE,
+ 0x4F30, 0xB9C0,
+ 0x4F32, 0xD9A3,
+ 0x4F34, 0xB0E9,
+ 0x4F36, 0xC1E6,
+ 0x4F38, 0xC9EC,
+ 0x4F3A, 0xCBC5,
+ 0x4F3C, 0xCBC6,
+ 0x4F3D, 0xD9A4,
+ 0x4F43, 0xB5E8,
+ 0x4F46, 0xB5AB,
+ 0x4F4D, 0xCEBB,
+ 0x4F4E, 0xB5CD,
+ 0x4F4F, 0xD7A1,
+ 0x4F50, 0xD7F4,
+ 0x4F51, 0xD3D3,
+ 0x4F53, 0xCCE5,
+ 0x4F55, 0xBACE,
+ 0x4F57, 0xD9A2,
+ 0x4F58, 0xD9DC,
+ 0x4F59, 0xD3E0,
+ 0x4F5A, 0xD8FD,
+ 0x4F5B, 0xB7F0,
+ 0x4F5C, 0xD7F7,
+ 0x4F5D, 0xD8FE,
+ 0x4F5E, 0xD8FA,
+ 0x4F5F, 0xD9A1,
+ 0x4F60, 0xC4E3,
+ 0x4F63, 0xD3B6,
+ 0x4F64, 0xD8F4,
+ 0x4F65, 0xD9DD,
+ 0x4F67, 0xD8FB,
+ 0x4F69, 0xC5E5,
+ 0x4F6C, 0xC0D0,
+ 0x4F6F, 0xD1F0,
+ 0x4F70, 0xB0DB,
+ 0x4F73, 0xBCD1,
+ 0x4F74, 0xD9A6,
+ 0x4F76, 0xD9A5,
+ 0x4F7B, 0xD9AC,
+ 0x4F7C, 0xD9AE,
+ 0x4F7E, 0xD9AB,
+ 0x4F7F, 0xCAB9,
+ 0x4F83, 0xD9A9,
+ 0x4F84, 0xD6B6,
+ 0x4F88, 0xB3DE,
+ 0x4F89, 0xD9A8,
+ 0x4F8B, 0xC0FD,
+ 0x4F8D, 0xCACC,
+ 0x4F8F, 0xD9AA,
+ 0x4F91, 0xD9A7,
+ 0x4F94, 0xD9B0,
+ 0x4F97, 0xB6B1,
+ 0x4F9B, 0xB9A9,
+ 0x4F9D, 0xD2C0,
+ 0x4FA0, 0xCFC0,
+ 0x4FA3, 0xC2C2,
+ 0x4FA5, 0xBDC4,
+ 0x4FA6, 0xD5EC,
+ 0x4FA7, 0xB2E0,
+ 0x4FA8, 0xC7C8,
+ 0x4FA9, 0xBFEB,
+ 0x4FAA, 0xD9AD,
+ 0x4FAC, 0xD9AF,
+ 0x4FAE, 0xCEEA,
+ 0x4FAF, 0xBAEE,
+ 0x4FB5, 0xC7D6,
+ 0x4FBF, 0xB1E3,
+ 0x4FC3, 0xB4D9,
+ 0x4FC4, 0xB6ED,
+ 0x4FC5, 0xD9B4,
+ 0x4FCA, 0xBFA1,
+ 0x4FCE, 0xD9DE,
+ 0x4FCF, 0xC7CE,
+ 0x4FD0, 0xC0FE,
+ 0x4FD1, 0xD9B8,
+ 0x4FD7, 0xCBD7,
+ 0x4FD8, 0xB7FD,
+ 0x4FDA, 0xD9B5,
+ 0x4FDC, 0xD9B7,
+ 0x4FDD, 0xB1A3,
+ 0x4FDE, 0xD3E1,
+ 0x4FDF, 0xD9B9,
+ 0x4FE1, 0xD0C5,
+ 0x4FE3, 0xD9B6,
+ 0x4FE6, 0xD9B1,
+ 0x4FE8, 0xD9B2,
+ 0x4FE9, 0xC1A9,
+ 0x4FEA, 0xD9B3,
+ 0x4FED, 0xBCF3,
+ 0x4FEE, 0xD0DE,
+ 0x4FEF, 0xB8A9,
+ 0x4FF1, 0xBEE3,
+ 0x4FF3, 0xD9BD,
+ 0x4FF8, 0xD9BA,
+ 0x4FFA, 0xB0B3,
+ 0x4FFE, 0xD9C2,
+ 0x500C, 0xD9C4,
+ 0x500D, 0xB1B6,
+ 0x500F, 0xD9BF,
+ 0x5012, 0xB5B9,
+ 0x5014, 0xBEF3,
+ 0x5018, 0xCCC8,
+ 0x5019, 0xBAF2,
+ 0x501A, 0xD2D0,
+ 0x501C, 0xD9C3,
+ 0x501F, 0xBDE8,
+ 0x5021, 0xB3AB,
+ 0x5025, 0xD9C5,
+ 0x5026, 0xBEEB,
+ 0x5028, 0xD9C6,
+ 0x5029, 0xD9BB,
+ 0x502A, 0xC4DF,
+ 0x502C, 0xD9BE,
+ 0x502D, 0xD9C1,
+ 0x502E, 0xD9C0,
+ 0x503A, 0xD5AE,
+ 0x503C, 0xD6B5,
+ 0x503E, 0xC7E3,
+ 0x5043, 0xD9C8,
+ 0x5047, 0xBCD9,
+ 0x5048, 0xD9CA,
+ 0x504C, 0xD9BC,
+ 0x504E, 0xD9CB,
+ 0x504F, 0xC6AB,
+ 0x5055, 0xD9C9,
+ 0x505A, 0xD7F6,
+ 0x505C, 0xCDA3,
+ 0x5065, 0xBDA1,
+ 0x506C, 0xD9CC,
+ 0x5076, 0xC5BC,
+ 0x5077, 0xCDB5,
+ 0x507B, 0xD9CD,
+ 0x507E, 0xD9C7,
+ 0x507F, 0xB3A5,
+ 0x5080, 0xBFFE,
+ 0x5085, 0xB8B5,
+ 0x5088, 0xC0FC,
+ 0x508D, 0xB0F8,
+ 0x50A3, 0xB4F6,
+ 0x50A5, 0xD9CE,
+ 0x50A7, 0xD9CF,
+ 0x50A8, 0xB4A2,
+ 0x50A9, 0xD9D0,
+ 0x50AC, 0xB4DF,
+ 0x50B2, 0xB0C1,
+ 0x50BA, 0xD9D1,
+ 0x50BB, 0xC9B5,
+ 0x50CF, 0xCFF1,
+ 0x50D6, 0xD9D2,
+ 0x50DA, 0xC1C5,
+ 0x50E6, 0xD9D6,
+ 0x50E7, 0xC9AE,
+ 0x50EC, 0xD9D5,
+ 0x50ED, 0xD9D4,
+ 0x50EE, 0xD9D7,
+ 0x50F3, 0xCBDB,
+ 0x50F5, 0xBDA9,
+ 0x50FB, 0xC6A7,
+ 0x5106, 0xD9D3,
+ 0x5107, 0xD9D8,
+ 0x510B, 0xD9D9,
+ 0x5112, 0xC8E5,
+ 0x5121, 0xC0DC,
+ 0x513F, 0xB6F9,
+ 0x5140, 0xD8A3,
+ 0x5141, 0xD4CA,
+ 0x5143, 0xD4AA,
+ 0x5144, 0xD0D6,
+ 0x5145, 0xB3E4,
+ 0x5146, 0xD5D7,
+ 0x5148, 0xCFC8,
+ 0x5149, 0xB9E2,
+ 0x514B, 0xBFCB,
+ 0x514D, 0xC3E2,
+ 0x5151, 0xB6D2,
+ 0x5154, 0xCDC3,
+ 0x5155, 0xD9EE,
+ 0x5156, 0xD9F0,
+ 0x515A, 0xB5B3,
+ 0x515C, 0xB6B5,
+ 0x5162, 0xBEA4,
+ 0x5165, 0xC8EB,
+ 0x5168, 0xC8AB,
+ 0x516B, 0xB0CB,
+ 0x516C, 0xB9AB,
+ 0x516D, 0xC1F9,
+ 0x516E, 0xD9E2,
+ 0x5170, 0xC0BC,
+ 0x5171, 0xB9B2,
+ 0x5173, 0xB9D8,
+ 0x5174, 0xD0CB,
+ 0x5175, 0xB1F8,
+ 0x5176, 0xC6E4,
+ 0x5177, 0xBEDF,
+ 0x5178, 0xB5E4,
+ 0x5179, 0xD7C8,
+ 0x517B, 0xD1F8,
+ 0x517C, 0xBCE6,
+ 0x517D, 0xCADE,
+ 0x5180, 0xBCBD,
+ 0x5181, 0xD9E6,
+ 0x5182, 0xD8E7,
+ 0x5185, 0xC4DA,
+ 0x5188, 0xB8D4,
+ 0x5189, 0xC8BD,
+ 0x518C, 0xB2E1,
+ 0x518D, 0xD4D9,
+ 0x5192, 0xC3B0,
+ 0x5195, 0xC3E1,
+ 0x5196, 0xDAA2,
+ 0x5197, 0xC8DF,
+ 0x5199, 0xD0B4,
+ 0x519B, 0xBEFC,
+ 0x519C, 0xC5A9,
+ 0x51A0, 0xB9DA,
+ 0x51A2, 0xDAA3,
+ 0x51A4, 0xD4A9,
+ 0x51A5, 0xDAA4,
+ 0x51AB, 0xD9FB,
+ 0x51AC, 0xB6AC,
+ 0x51AF, 0xB7EB,
+ 0x51B0, 0xB1F9,
+ 0x51B1, 0xD9FC,
+ 0x51B2, 0xB3E5,
+ 0x51B3, 0xBEF6,
+ 0x51B5, 0xBFF6,
+ 0x51B6, 0xD2B1,
+ 0x51B7, 0xC0E4,
+ 0x51BB, 0xB6B3,
+ 0x51BC, 0xD9FE,
+ 0x51BD, 0xD9FD,
+ 0x51C0, 0xBEBB,
+ 0x51C4, 0xC6E0,
+ 0x51C6, 0xD7BC,
+ 0x51C7, 0xDAA1,
+ 0x51C9, 0xC1B9,
+ 0x51CB, 0xB5F2,
+ 0x51CC, 0xC1E8,
+ 0x51CF, 0xBCF5,
+ 0x51D1, 0xB4D5,
+ 0x51DB, 0xC1DD,
+ 0x51DD, 0xC4FD,
+ 0x51E0, 0xBCB8,
+ 0x51E1, 0xB7B2,
+ 0x51E4, 0xB7EF,
+ 0x51EB, 0xD9EC,
+ 0x51ED, 0xC6BE,
+ 0x51EF, 0xBFAD,
+ 0x51F0, 0xBBCB,
+ 0x51F3, 0xB5CA,
+ 0x51F5, 0xDBC9,
+ 0x51F6, 0xD0D7,
+ 0x51F8, 0xCDB9,
+ 0x51F9, 0xB0BC,
+ 0x51FA, 0xB3F6,
+ 0x51FB, 0xBBF7,
+ 0x51FC, 0xDBCA,
+ 0x51FD, 0xBAAF,
+ 0x51FF, 0xD4E4,
+ 0x5200, 0xB5B6,
+ 0x5201, 0xB5F3,
+ 0x5202, 0xD8D6,
+ 0x5203, 0xC8D0,
+ 0x5206, 0xB7D6,
+ 0x5207, 0xC7D0,
+ 0x5208, 0xD8D7,
+ 0x520A, 0xBFAF,
+ 0x520D, 0xDBBB,
+ 0x520E, 0xD8D8,
+ 0x5211, 0xD0CC,
+ 0x5212, 0xBBAE,
+ 0x5216, 0xEBBE,
+ 0x5217, 0xC1D0,
+ 0x5218, 0xC1F5,
+ 0x5219, 0xD4F2,
+ 0x521A, 0xB8D5,
+ 0x521B, 0xB4B4,
+ 0x521D, 0xB3F5,
+ 0x5220, 0xC9BE,
+ 0x5224, 0xC5D0,
+ 0x5228, 0xC5D9,
+ 0x5229, 0xC0FB,
+ 0x522B, 0xB1F0,
+ 0x522D, 0xD8D9,
+ 0x522E, 0xB9CE,
+ 0x5230, 0xB5BD,
+ 0x5233, 0xD8DA,
+ 0x5236, 0xD6C6,
+ 0x5237, 0xCBA2,
+ 0x5238, 0xC8AF,
+ 0x5239, 0xC9B2,
+ 0x523A, 0xB4CC,
+ 0x523B, 0xBFCC,
+ 0x523D, 0xB9F4,
+ 0x523F, 0xD8DB,
+ 0x5240, 0xD8DC,
+ 0x5241, 0xB6E7,
+ 0x5242, 0xBCC1,
+ 0x5243, 0xCCEA,
+ 0x524A, 0xCFF7,
+ 0x524C, 0xD8DD,
+ 0x524D, 0xC7B0,
+ 0x5250, 0xB9D0,
+ 0x5251, 0xBDA3,
+ 0x5254, 0xCCDE,
+ 0x5256, 0xC6CA,
+ 0x525C, 0xD8E0,
+ 0x525E, 0xD8DE,
+ 0x5261, 0xD8DF,
+ 0x5265, 0xB0FE,
+ 0x5267, 0xBEE7,
+ 0x5269, 0xCAA3,
+ 0x526A, 0xBCF4,
+ 0x526F, 0xB8B1,
+ 0x5272, 0xB8EE,
+ 0x527D, 0xD8E2,
+ 0x527F, 0xBDCB,
+ 0x5281, 0xD8E4,
+ 0x5282, 0xD8E3,
+ 0x5288, 0xC5FC,
+ 0x5290, 0xD8E5,
+ 0x5293, 0xD8E6,
+ 0x529B, 0xC1A6,
+ 0x529D, 0xC8B0,
+ 0x529E, 0xB0EC,
+ 0x529F, 0xB9A6,
+ 0x52A0, 0xBCD3,
+ 0x52A1, 0xCEF1,
+ 0x52A2, 0xDBBD,
+ 0x52A3, 0xC1D3,
+ 0x52A8, 0xB6AF,
+ 0x52A9, 0xD6FA,
+ 0x52AA, 0xC5AC,
+ 0x52AB, 0xBDD9,
+ 0x52AC, 0xDBBE,
+ 0x52AD, 0xDBBF,
+ 0x52B1, 0xC0F8,
+ 0x52B2, 0xBEA2,
+ 0x52B3, 0xC0CD,
+ 0x52BE, 0xDBC0,
+ 0x52BF, 0xCAC6,
+ 0x52C3, 0xB2AA,
+ 0x52C7, 0xD3C2,
+ 0x52C9, 0xC3E3,
+ 0x52CB, 0xD1AB,
+ 0x52D0, 0xDBC2,
+ 0x52D2, 0xC0D5,
+ 0x52D6, 0xDBC3,
+ 0x52D8, 0xBFB1,
+ 0x52DF, 0xC4BC,
+ 0x52E4, 0xC7DA,
+ 0x52F0, 0xDBC4,
+ 0x52F9, 0xD9E8,
+ 0x52FA, 0xC9D7,
+ 0x52FE, 0xB9B4,
+ 0x52FF, 0xCEF0,
+ 0x5300, 0xD4C8,
+ 0x5305, 0xB0FC,
+ 0x5306, 0xB4D2,
+ 0x5308, 0xD0D9,
+ 0x530D, 0xD9E9,
+ 0x530F, 0xDECB,
+ 0x5310, 0xD9EB,
+ 0x5315, 0xD8B0,
+ 0x5316, 0xBBAF,
+ 0x5317, 0xB1B1,
+ 0x5319, 0xB3D7,
+ 0x531A, 0xD8CE,
+ 0x531D, 0xD4D1,
+ 0x5320, 0xBDB3,
+ 0x5321, 0xBFEF,
+ 0x5323, 0xCFBB,
+ 0x5326, 0xD8D0,
+ 0x532A, 0xB7CB,
+ 0x532E, 0xD8D1,
+ 0x5339, 0xC6A5,
+ 0x533A, 0xC7F8,
+ 0x533B, 0xD2BD,
+ 0x533E, 0xD8D2,
+ 0x533F, 0xC4E4,
+ 0x5341, 0xCAAE,
+ 0x5343, 0xC7A7,
+ 0x5345, 0xD8A6,
+ 0x5347, 0xC9FD,
+ 0x5348, 0xCEE7,
+ 0x5349, 0xBBDC,
+ 0x534A, 0xB0EB,
+ 0x534E, 0xBBAA,
+ 0x534F, 0xD0AD,
+ 0x5351, 0xB1B0,
+ 0x5352, 0xD7E4,
+ 0x5353, 0xD7BF,
+ 0x5355, 0xB5A5,
+ 0x5356, 0xC2F4,
+ 0x5357, 0xC4CF,
+ 0x535A, 0xB2A9,
+ 0x535C, 0xB2B7,
+ 0x535E, 0xB1E5,
+ 0x535F, 0xDFB2,
+ 0x5360, 0xD5BC,
+ 0x5361, 0xBFA8,
+ 0x5362, 0xC2AC,
+ 0x5363, 0xD8D5,
+ 0x5364, 0xC2B1,
+ 0x5366, 0xD8D4,
+ 0x5367, 0xCED4,
+ 0x5369, 0xDAE0,
+ 0x536B, 0xCEC0,
+ 0x536E, 0xD8B4,
+ 0x536F, 0xC3AE,
+ 0x5370, 0xD3A1,
+ 0x5371, 0xCEA3,
+ 0x5373, 0xBCB4,
+ 0x5374, 0xC8B4,
+ 0x5375, 0xC2D1,
+ 0x5377, 0xBEED,
+ 0x5378, 0xD0B6,
+ 0x537A, 0xDAE1,
+ 0x537F, 0xC7E4,
+ 0x5382, 0xB3A7,
+ 0x5384, 0xB6F2,
+ 0x5385, 0xCCFC,
+ 0x5386, 0xC0FA,
+ 0x5389, 0xC0F7,
+ 0x538B, 0xD1B9,
+ 0x538C, 0xD1E1,
+ 0x538D, 0xD8C7,
+ 0x5395, 0xB2DE,
+ 0x5398, 0xC0E5,
+ 0x539A, 0xBAF1,
+ 0x539D, 0xD8C8,
+ 0x539F, 0xD4AD,
+ 0x53A2, 0xCFE1,
+ 0x53A3, 0xD8C9,
+ 0x53A5, 0xD8CA,
+ 0x53A6, 0xCFC3,
+ 0x53A8, 0xB3F8,
+ 0x53A9, 0xBEC7,
+ 0x53AE, 0xD8CB,
+ 0x53B6, 0xDBCC,
+ 0x53BB, 0xC8A5,
+ 0x53BF, 0xCFD8,
+ 0x53C1, 0xC8FE,
+ 0x53C2, 0xB2CE,
+ 0x53C8, 0xD3D6,
+ 0x53C9, 0xB2E6,
+ 0x53CA, 0xBCB0,
+ 0x53CB, 0xD3D1,
+ 0x53CC, 0xCBAB,
+ 0x53CD, 0xB7B4,
+ 0x53D1, 0xB7A2,
+ 0x53D4, 0xCAE5,
+ 0x53D6, 0xC8A1,
+ 0x53D7, 0xCADC,
+ 0x53D8, 0xB1E4,
+ 0x53D9, 0xD0F0,
+ 0x53DB, 0xC5D1,
+ 0x53DF, 0xDBC5,
+ 0x53E0, 0xB5FE,
+ 0x53E3, 0xBFDA,
+ 0x53E4, 0xB9C5,
+ 0x53E5, 0xBEE4,
+ 0x53E6, 0xC1ED,
+ 0x53E8, 0xDFB6,
+ 0x53E9, 0xDFB5,
+ 0x53EA, 0xD6BB,
+ 0x53EB, 0xBDD0,
+ 0x53EC, 0xD5D9,
+ 0x53ED, 0xB0C8,
+ 0x53EE, 0xB6A3,
+ 0x53EF, 0xBFC9,
+ 0x53F0, 0xCCA8,
+ 0x53F1, 0xDFB3,
+ 0x53F2, 0xCAB7,
+ 0x53F3, 0xD3D2,
+ 0x53F5, 0xD8CF,
+ 0x53F6, 0xD2B6,
+ 0x53F7, 0xBAC5,
+ 0x53F8, 0xCBBE,
+ 0x53F9, 0xCCBE,
+ 0x53FB, 0xDFB7,
+ 0x53FC, 0xB5F0,
+ 0x53FD, 0xDFB4,
+ 0x5401, 0xD3F5,
+ 0x5403, 0xB3D4,
+ 0x5404, 0xB8F7,
+ 0x5406, 0xDFBA,
+ 0x5408, 0xBACF,
+ 0x5409, 0xBCAA,
+ 0x540A, 0xB5F5,
+ 0x540C, 0xCDAC,
+ 0x540D, 0xC3FB,
+ 0x540E, 0xBAF3,
+ 0x540F, 0xC0F4,
+ 0x5410, 0xCDC2,
+ 0x5411, 0xCFF2,
+ 0x5412, 0xDFB8,
+ 0x5413, 0xCFC5,
+ 0x5415, 0xC2C0,
+ 0x5416, 0xDFB9,
+ 0x5417, 0xC2F0,
+ 0x541B, 0xBEFD,
+ 0x541D, 0xC1DF,
+ 0x541E, 0xCDCC,
+ 0x541F, 0xD2F7,
+ 0x5420, 0xB7CD,
+ 0x5421, 0xDFC1,
+ 0x5423, 0xDFC4,
+ 0x5426, 0xB7F1,
+ 0x5427, 0xB0C9,
+ 0x5428, 0xB6D6,
+ 0x5429, 0xB7D4,
+ 0x542B, 0xBAAC,
+ 0x542C, 0xCCFD,
+ 0x542D, 0xBFD4,
+ 0x542E, 0xCBB1,
+ 0x542F, 0xC6F4,
+ 0x5431, 0xD6A8,
+ 0x5432, 0xDFC5,
+ 0x5434, 0xCEE2,
+ 0x5435, 0xB3B3,
+ 0x5438, 0xCEFC,
+ 0x5439, 0xB4B5,
+ 0x543B, 0xCEC7,
+ 0x543C, 0xBAF0,
+ 0x543E, 0xCEE1,
+ 0x5440, 0xD1BD,
+ 0x5443, 0xDFC0,
+ 0x5446, 0xB4F4,
+ 0x5448, 0xB3CA,
+ 0x544A, 0xB8E6,
+ 0x544B, 0xDFBB,
+ 0x5450, 0xC4C5,
+ 0x5452, 0xDFBC,
+ 0x5453, 0xDFBD,
+ 0x5454, 0xDFBE,
+ 0x5455, 0xC5BB,
+ 0x5456, 0xDFBF,
+ 0x5457, 0xDFC2,
+ 0x5458, 0xD4B1,
+ 0x5459, 0xDFC3,
+ 0x545B, 0xC7BA,
+ 0x545C, 0xCED8,
+ 0x5462, 0xC4D8,
+ 0x5464, 0xDFCA,
+ 0x5466, 0xDFCF,
+ 0x5468, 0xD6DC,
+ 0x5471, 0xDFC9,
+ 0x5472, 0xDFDA,
+ 0x5473, 0xCEB6,
+ 0x5475, 0xBAC7,
+ 0x5476, 0xDFCE,
+ 0x5477, 0xDFC8,
+ 0x5478, 0xC5DE,
+ 0x547B, 0xC9EB,
+ 0x547C, 0xBAF4,
+ 0x547D, 0xC3FC,
+ 0x5480, 0xBED7,
+ 0x5482, 0xDFC6,
+ 0x5484, 0xDFCD,
+ 0x5486, 0xC5D8,
+ 0x548B, 0xD5A6,
+ 0x548C, 0xBACD,
+ 0x548E, 0xBECC,
+ 0x548F, 0xD3BD,
+ 0x5490, 0xB8C0,
+ 0x5492, 0xD6E4,
+ 0x5494, 0xDFC7,
+ 0x5495, 0xB9BE,
+ 0x5496, 0xBFA7,
+ 0x5499, 0xC1FC,
+ 0x549A, 0xDFCB,
+ 0x549B, 0xDFCC,
+ 0x549D, 0xDFD0,
+ 0x54A3, 0xDFDB,
+ 0x54A4, 0xDFE5,
+ 0x54A6, 0xDFD7,
+ 0x54A7, 0xDFD6,
+ 0x54A8, 0xD7C9,
+ 0x54A9, 0xDFE3,
+ 0x54AA, 0xDFE4,
+ 0x54AB, 0xE5EB,
+ 0x54AC, 0xD2A7,
+ 0x54AD, 0xDFD2,
+ 0x54AF, 0xBFA9,
+ 0x54B1, 0xD4DB,
+ 0x54B3, 0xBFC8,
+ 0x54B4, 0xDFD4,
+ 0x54B8, 0xCFCC,
+ 0x54BB, 0xDFDD,
+ 0x54BD, 0xD1CA,
+ 0x54BF, 0xDFDE,
+ 0x54C0, 0xB0A7,
+ 0x54C1, 0xC6B7,
+ 0x54C2, 0xDFD3,
+ 0x54C4, 0xBAE5,
+ 0x54C6, 0xB6DF,
+ 0x54C7, 0xCDDB,
+ 0x54C8, 0xB9FE,
+ 0x54C9, 0xD4D5,
+ 0x54CC, 0xDFDF,
+ 0x54CD, 0xCFEC,
+ 0x54CE, 0xB0A5,
+ 0x54CF, 0xDFE7,
+ 0x54D0, 0xDFD1,
+ 0x54D1, 0xD1C6,
+ 0x54D2, 0xDFD5,
+ 0x54D3, 0xDFD8,
+ 0x54D4, 0xDFD9,
+ 0x54D5, 0xDFDC,
+ 0x54D7, 0xBBA9,
+ 0x54D9, 0xDFE0,
+ 0x54DA, 0xDFE1,
+ 0x54DC, 0xDFE2,
+ 0x54DD, 0xDFE6,
+ 0x54DE, 0xDFE8,
+ 0x54DF, 0xD3B4,
+ 0x54E5, 0xB8E7,
+ 0x54E6, 0xC5B6,
+ 0x54E7, 0xDFEA,
+ 0x54E8, 0xC9DA,
+ 0x54E9, 0xC1A8,
+ 0x54EA, 0xC4C4,
+ 0x54ED, 0xBFDE,
+ 0x54EE, 0xCFF8,
+ 0x54F2, 0xD5DC,
+ 0x54F3, 0xDFEE,
+ 0x54FA, 0xB2B8,
+ 0x54FC, 0xBADF,
+ 0x54FD, 0xDFEC,
+ 0x54FF, 0xDBC1,
+ 0x5501, 0xD1E4,
+ 0x5506, 0xCBF4,
+ 0x5507, 0xB4BD,
+ 0x5509, 0xB0A6,
+ 0x550F, 0xDFF1,
+ 0x5510, 0xCCC6,
+ 0x5511, 0xDFF2,
+ 0x5514, 0xDFED,
+ 0x551B, 0xDFE9,
+ 0x5520, 0xDFEB,
+ 0x5522, 0xDFEF,
+ 0x5523, 0xDFF0,
+ 0x5524, 0xBBBD,
+ 0x5527, 0xDFF3,
+ 0x552A, 0xDFF4,
+ 0x552C, 0xBBA3,
+ 0x552E, 0xCADB,
+ 0x552F, 0xCEA8,
+ 0x5530, 0xE0A7,
+ 0x5531, 0xB3AA,
+ 0x5533, 0xE0A6,
+ 0x5537, 0xE0A1,
+ 0x553C, 0xDFFE,
+ 0x553E, 0xCDD9,
+ 0x553F, 0xDFFC,
+ 0x5541, 0xDFFA,
+ 0x5543, 0xBFD0,
+ 0x5544, 0xD7C4,
+ 0x5546, 0xC9CC,
+ 0x5549, 0xDFF8,
+ 0x554A, 0xB0A1,
+ 0x5550, 0xDFFD,
+ 0x5555, 0xDFFB,
+ 0x5556, 0xE0A2,
+ 0x555C, 0xE0A8,
+ 0x5561, 0xB7C8,
+ 0x5564, 0xC6A1,
+ 0x5565, 0xC9B6,
+ 0x5566, 0xC0B2,
+ 0x5567, 0xDFF5,
+ 0x556A, 0xC5BE,
+ 0x556C, 0xD8C4,
+ 0x556D, 0xDFF9,
+ 0x556E, 0xC4F6,
+ 0x5575, 0xE0A3,
+ 0x5576, 0xE0A4,
+ 0x5577, 0xE0A5,
+ 0x5578, 0xD0A5,
+ 0x557B, 0xE0B4,
+ 0x557C, 0xCCE4,
+ 0x557E, 0xE0B1,
+ 0x5580, 0xBFA6,
+ 0x5581, 0xE0AF,
+ 0x5582, 0xCEB9,
+ 0x5583, 0xE0AB,
+ 0x5584, 0xC9C6,
+ 0x5587, 0xC0AE,
+ 0x5588, 0xE0AE,
+ 0x5589, 0xBAED,
+ 0x558A, 0xBAB0,
+ 0x558B, 0xE0A9,
+ 0x558F, 0xDFF6,
+ 0x5591, 0xE0B3,
+ 0x5594, 0xE0B8,
+ 0x5598, 0xB4AD,
+ 0x5599, 0xE0B9,
+ 0x559C, 0xCFB2,
+ 0x559D, 0xBAC8,
+ 0x559F, 0xE0B0,
+ 0x55A7, 0xD0FA,
+ 0x55B1, 0xE0AC,
+ 0x55B3, 0xD4FB,
+ 0x55B5, 0xDFF7,
+ 0x55B7, 0xC5E7,
+ 0x55B9, 0xE0AD,
+ 0x55BB, 0xD3F7,
+ 0x55BD, 0xE0B6,
+ 0x55BE, 0xE0B7,
+ 0x55C4, 0xE0C4,
+ 0x55C5, 0xD0E1,
+ 0x55C9, 0xE0BC,
+ 0x55CC, 0xE0C9,
+ 0x55CD, 0xE0CA,
+ 0x55D1, 0xE0BE,
+ 0x55D2, 0xE0AA,
+ 0x55D3, 0xC9A4,
+ 0x55D4, 0xE0C1,
+ 0x55D6, 0xE0B2,
+ 0x55DC, 0xCAC8,
+ 0x55DD, 0xE0C3,
+ 0x55DF, 0xE0B5,
+ 0x55E1, 0xCECB,
+ 0x55E3, 0xCBC3,
+ 0x55E4, 0xE0CD,
+ 0x55E5, 0xE0C6,
+ 0x55E6, 0xE0C2,
+ 0x55E8, 0xE0CB,
+ 0x55EA, 0xE0BA,
+ 0x55EB, 0xE0BF,
+ 0x55EC, 0xE0C0,
+ 0x55EF, 0xE0C5,
+ 0x55F2, 0xE0C7,
+ 0x55F3, 0xE0C8,
+ 0x55F5, 0xE0CC,
+ 0x55F7, 0xE0BB,
+ 0x55FD, 0xCBD4,
+ 0x55FE, 0xE0D5,
+ 0x5600, 0xE0D6,
+ 0x5601, 0xE0D2,
+ 0x5608, 0xE0D0,
+ 0x5609, 0xBCCE,
+ 0x560C, 0xE0D1,
+ 0x560E, 0xB8C2,
+ 0x560F, 0xD8C5,
+ 0x5618, 0xD0EA,
+ 0x561B, 0xC2EF,
+ 0x561E, 0xE0CF,
+ 0x561F, 0xE0BD,
+ 0x5623, 0xE0D4,
+ 0x5624, 0xE0D3,
+ 0x5627, 0xE0D7,
+ 0x562C, 0xE0DC,
+ 0x562D, 0xE0D8,
+ 0x5631, 0xD6F6,
+ 0x5632, 0xB3B0,
+ 0x5634, 0xD7EC,
+ 0x5636, 0xCBBB,
+ 0x5639, 0xE0DA,
+ 0x563B, 0xCEFB,
+ 0x563F, 0xBAD9,
+ 0x564C, 0xE0E1,
+ 0x564D, 0xE0DD,
+ 0x564E, 0xD2AD,
+ 0x5654, 0xE0E2,
+ 0x5657, 0xE0DB,
+ 0x5658, 0xE0D9,
+ 0x5659, 0xE0DF,
+ 0x565C, 0xE0E0,
+ 0x5662, 0xE0DE,
+ 0x5664, 0xE0E4,
+ 0x5668, 0xC6F7,
+ 0x5669, 0xD8AC,
+ 0x566A, 0xD4EB,
+ 0x566B, 0xE0E6,
+ 0x566C, 0xCAC9,
+ 0x5671, 0xE0E5,
+ 0x5676, 0xB8C1,
+ 0x567B, 0xE0E7,
+ 0x567C, 0xE0E8,
+ 0x5685, 0xE0E9,
+ 0x5686, 0xE0E3,
+ 0x568E, 0xBABF,
+ 0x568F, 0xCCE7,
+ 0x5693, 0xE0EA,
+ 0x56A3, 0xCFF9,
+ 0x56AF, 0xE0EB,
+ 0x56B7, 0xC8C2,
+ 0x56BC, 0xBDC0,
+ 0x56CA, 0xC4D2,
+ 0x56D4, 0xE0EC,
+ 0x56D7, 0xE0ED,
+ 0x56DA, 0xC7F4,
+ 0x56DB, 0xCBC4,
+ 0x56DD, 0xE0EE,
+ 0x56DE, 0xBBD8,
+ 0x56DF, 0xD8B6,
+ 0x56E0, 0xD2F2,
+ 0x56E1, 0xE0EF,
+ 0x56E2, 0xCDC5,
+ 0x56E4, 0xB6DA,
+ 0x56EB, 0xE0F1,
+ 0x56ED, 0xD4B0,
+ 0x56F0, 0xC0A7,
+ 0x56F1, 0xB4D1,
+ 0x56F4, 0xCEA7,
+ 0x56F5, 0xE0F0,
+ 0x56F9, 0xE0F2,
+ 0x56FA, 0xB9CC,
+ 0x56FD, 0xB9FA,
+ 0x56FE, 0xCDBC,
+ 0x56FF, 0xE0F3,
+ 0x5703, 0xC6D4,
+ 0x5704, 0xE0F4,
+ 0x5706, 0xD4B2,
+ 0x5708, 0xC8A6,
+ 0x5709, 0xE0F6,
+ 0x570A, 0xE0F5,
+ 0x571C, 0xE0F7,
+ 0x571F, 0xCDC1,
+ 0x5723, 0xCAA5,
+ 0x5728, 0xD4DA,
+ 0x5729, 0xDBD7,
+ 0x572A, 0xDBD9,
+ 0x572C, 0xDBD8,
+ 0x572D, 0xB9E7,
+ 0x572E, 0xDBDC,
+ 0x572F, 0xDBDD,
+ 0x5730, 0xB5D8,
+ 0x5733, 0xDBDA,
+ 0x5739, 0xDBDB,
+ 0x573A, 0xB3A1,
+ 0x573B, 0xDBDF,
+ 0x573E, 0xBBF8,
+ 0x5740, 0xD6B7,
+ 0x5742, 0xDBE0,
+ 0x5747, 0xBEF9,
+ 0x574A, 0xB7BB,
+ 0x574C, 0xDBD0,
+ 0x574D, 0xCCAE,
+ 0x574E, 0xBFB2,
+ 0x574F, 0xBBB5,
+ 0x5750, 0xD7F8,
+ 0x5751, 0xBFD3,
+ 0x5757, 0xBFE9,
+ 0x575A, 0xBCE1,
+ 0x575B, 0xCCB3,
+ 0x575C, 0xDBDE,
+ 0x575D, 0xB0D3,
+ 0x575E, 0xCEEB,
+ 0x575F, 0xB7D8,
+ 0x5760, 0xD7B9,
+ 0x5761, 0xC6C2,
+ 0x5764, 0xC0A4,
+ 0x5766, 0xCCB9,
+ 0x5768, 0xDBE7,
+ 0x5769, 0xDBE1,
+ 0x576A, 0xC6BA,
+ 0x576B, 0xDBE3,
+ 0x576D, 0xDBE8,
+ 0x576F, 0xC5F7,
+ 0x5773, 0xDBEA,
+ 0x5776, 0xDBE9,
+ 0x5777, 0xBFC0,
+ 0x577B, 0xDBE6,
+ 0x577C, 0xDBE5,
+ 0x5782, 0xB4B9,
+ 0x5783, 0xC0AC,
+ 0x5784, 0xC2A2,
+ 0x5785, 0xDBE2,
+ 0x5786, 0xDBE4,
+ 0x578B, 0xD0CD,
+ 0x578C, 0xDBED,
+ 0x5792, 0xC0DD,
+ 0x5793, 0xDBF2,
+ 0x579B, 0xB6E2,
+ 0x57A0, 0xDBF3,
+ 0x57A1, 0xDBD2,
+ 0x57A2, 0xB9B8,
+ 0x57A3, 0xD4AB,
+ 0x57A4, 0xDBEC,
+ 0x57A6, 0xBFD1,
+ 0x57A7, 0xDBF0,
+ 0x57A9, 0xDBD1,
+ 0x57AB, 0xB5E6,
+ 0x57AD, 0xDBEB,
+ 0x57AE, 0xBFE5,
+ 0x57B2, 0xDBEE,
+ 0x57B4, 0xDBF1,
+ 0x57B8, 0xDBF9,
+ 0x57C2, 0xB9A1,
+ 0x57C3, 0xB0A3,
+ 0x57CB, 0xC2F1,
+ 0x57CE, 0xB3C7,
+ 0x57CF, 0xDBEF,
+ 0x57D2, 0xDBF8,
+ 0x57D4, 0xC6D2,
+ 0x57D5, 0xDBF4,
+ 0x57D8, 0xDBF5,
+ 0x57D9, 0xDBF7,
+ 0x57DA, 0xDBF6,
+ 0x57DD, 0xDBFE,
+ 0x57DF, 0xD3F2,
+ 0x57E0, 0xB2BA,
+ 0x57E4, 0xDBFD,
+ 0x57ED, 0xDCA4,
+ 0x57EF, 0xDBFB,
+ 0x57F4, 0xDBFA,
+ 0x57F8, 0xDBFC,
+ 0x57F9, 0xC5E0,
+ 0x57FA, 0xBBF9,
+ 0x57FD, 0xDCA3,
+ 0x5800, 0xDCA5,
+ 0x5802, 0xCCC3,
+ 0x5806, 0xB6D1,
+ 0x5807, 0xDDC0,
+ 0x580B, 0xDCA1,
+ 0x580D, 0xDCA2,
+ 0x5811, 0xC7B5,
+ 0x5815, 0xB6E9,
+ 0x5819, 0xDCA7,
+ 0x581E, 0xDCA6,
+ 0x5820, 0xDCA9,
+ 0x5821, 0xB1A4,
+ 0x5824, 0xB5CC,
+ 0x582A, 0xBFB0,
+ 0x5830, 0xD1DF,
+ 0x5835, 0xB6C2,
+ 0x5844, 0xDCA8,
+ 0x584C, 0xCBFA,
+ 0x584D, 0xEBF3,
+ 0x5851, 0xCBDC,
+ 0x5854, 0xCBFE,
+ 0x5858, 0xCCC1,
+ 0x585E, 0xC8FB,
+ 0x5865, 0xDCAA,
+ 0x586B, 0xCCEE,
+ 0x586C, 0xDCAB,
+ 0x587E, 0xDBD3,
+ 0x5880, 0xDCAF,
+ 0x5881, 0xDCAC,
+ 0x5883, 0xBEB3,
+ 0x5885, 0xCAFB,
+ 0x5889, 0xDCAD,
+ 0x5892, 0xC9CA,
+ 0x5893, 0xC4B9,
+ 0x5899, 0xC7BD,
+ 0x589A, 0xDCAE,
+ 0x589E, 0xD4F6,
+ 0x589F, 0xD0E6,
+ 0x58A8, 0xC4AB,
+ 0x58A9, 0xB6D5,
+ 0x58BC, 0xDBD4,
+ 0x58C1, 0xB1DA,
+ 0x58C5, 0xDBD5,
+ 0x58D1, 0xDBD6,
+ 0x58D5, 0xBABE,
+ 0x58E4, 0xC8C0,
+ 0x58EB, 0xCABF,
+ 0x58EC, 0xC8C9,
+ 0x58EE, 0xD7B3,
+ 0x58F0, 0xC9F9,
+ 0x58F3, 0xBFC7,
+ 0x58F6, 0xBAF8,
+ 0x58F9, 0xD2BC,
+ 0x5902, 0xE2BA,
+ 0x5904, 0xB4A6,
+ 0x5907, 0xB1B8,
+ 0x590D, 0xB8B4,
+ 0x590F, 0xCFC4,
+ 0x5914, 0xD9E7,
+ 0x5915, 0xCFA6,
+ 0x5916, 0xCDE2,
+ 0x5919, 0xD9ED,
+ 0x591A, 0xB6E0,
+ 0x591C, 0xD2B9,
+ 0x591F, 0xB9BB,
+ 0x5924, 0xE2B9,
+ 0x5925, 0xE2B7,
+ 0x5927, 0xB4F3,
+ 0x5929, 0xCCEC,
+ 0x592A, 0xCCAB,
+ 0x592B, 0xB7F2,
+ 0x592D, 0xD8B2,
+ 0x592E, 0xD1EB,
+ 0x592F, 0xBABB,
+ 0x5931, 0xCAA7,
+ 0x5934, 0xCDB7,
+ 0x5937, 0xD2C4,
+ 0x5938, 0xBFE4,
+ 0x5939, 0xBCD0,
+ 0x593A, 0xB6E1,
+ 0x593C, 0xDEC5,
+ 0x5941, 0xDEC6,
+ 0x5942, 0xDBBC,
+ 0x5944, 0xD1D9,
+ 0x5947, 0xC6E6,
+ 0x5948, 0xC4CE,
+ 0x5949, 0xB7EE,
+ 0x594B, 0xB7DC,
+ 0x594E, 0xBFFC,
+ 0x594F, 0xD7E0,
+ 0x5951, 0xC6F5,
+ 0x5954, 0xB1BC,
+ 0x5955, 0xDEC8,
+ 0x5956, 0xBDB1,
+ 0x5957, 0xCCD7,
+ 0x5958, 0xDECA,
+ 0x595A, 0xDEC9,
+ 0x5960, 0xB5EC,
+ 0x5962, 0xC9DD,
+ 0x5965, 0xB0C2,
+ 0x5973, 0xC5AE,
+ 0x5974, 0xC5AB,
+ 0x5976, 0xC4CC,
+ 0x5978, 0xBCE9,
+ 0x5979, 0xCBFD,
+ 0x597D, 0xBAC3,
+ 0x5981, 0xE5F9,
+ 0x5982, 0xC8E7,
+ 0x5983, 0xE5FA,
+ 0x5984, 0xCDFD,
+ 0x5986, 0xD7B1,
+ 0x5987, 0xB8BE,
+ 0x5988, 0xC2E8,
+ 0x598A, 0xC8D1,
+ 0x598D, 0xE5FB,
+ 0x5992, 0xB6CA,
+ 0x5993, 0xBCCB,
+ 0x5996, 0xD1FD,
+ 0x5997, 0xE6A1,
+ 0x5999, 0xC3EE,
+ 0x599E, 0xE6A4,
+ 0x59A3, 0xE5FE,
+ 0x59A4, 0xE6A5,
+ 0x59A5, 0xCDD7,
+ 0x59A8, 0xB7C1,
+ 0x59A9, 0xE5FC,
+ 0x59AA, 0xE5FD,
+ 0x59AB, 0xE6A3,
+ 0x59AE, 0xC4DD,
+ 0x59AF, 0xE6A8,
+ 0x59B2, 0xE6A7,
+ 0x59B9, 0xC3C3,
+ 0x59BB, 0xC6DE,
+ 0x59BE, 0xE6AA,
+ 0x59C6, 0xC4B7,
+ 0x59CA, 0xE6A2,
+ 0x59CB, 0xCABC,
+ 0x59D0, 0xBDE3,
+ 0x59D1, 0xB9C3,
+ 0x59D2, 0xE6A6,
+ 0x59D3, 0xD0D5,
+ 0x59D4, 0xCEAF,
+ 0x59D7, 0xE6A9,
+ 0x59D8, 0xE6B0,
+ 0x59DA, 0xD2A6,
+ 0x59DC, 0xBDAA,
+ 0x59DD, 0xE6AD,
+ 0x59E3, 0xE6AF,
+ 0x59E5, 0xC0D1,
+ 0x59E8, 0xD2CC,
+ 0x59EC, 0xBCA7,
+ 0x59F9, 0xE6B1,
+ 0x59FB, 0xD2F6,
+ 0x59FF, 0xD7CB,
+ 0x5A01, 0xCDFE,
+ 0x5A03, 0xCDDE,
+ 0x5A04, 0xC2A6,
+ 0x5A05, 0xE6AB,
+ 0x5A06, 0xE6AC,
+ 0x5A07, 0xBDBF,
+ 0x5A08, 0xE6AE,
+ 0x5A09, 0xE6B3,
+ 0x5A0C, 0xE6B2,
+ 0x5A11, 0xE6B6,
+ 0x5A13, 0xE6B8,
+ 0x5A18, 0xC4EF,
+ 0x5A1C, 0xC4C8,
+ 0x5A1F, 0xBEEA,
+ 0x5A20, 0xC9EF,
+ 0x5A23, 0xE6B7,
+ 0x5A25, 0xB6F0,
+ 0x5A29, 0xC3E4,
+ 0x5A31, 0xD3E9,
+ 0x5A32, 0xE6B4,
+ 0x5A34, 0xE6B5,
+ 0x5A36, 0xC8A2,
+ 0x5A3C, 0xE6BD,
+ 0x5A40, 0xE6B9,
+ 0x5A46, 0xC6C5,
+ 0x5A49, 0xCDF1,
+ 0x5A4A, 0xE6BB,
+ 0x5A55, 0xE6BC,
+ 0x5A5A, 0xBBE9,
+ 0x5A62, 0xE6BE,
+ 0x5A67, 0xE6BA,
+ 0x5A6A, 0xC0B7,
+ 0x5A74, 0xD3A4,
+ 0x5A75, 0xE6BF,
+ 0x5A76, 0xC9F4,
+ 0x5A77, 0xE6C3,
+ 0x5A7A, 0xE6C4,
+ 0x5A7F, 0xD0F6,
+ 0x5A92, 0xC3BD,
+ 0x5A9A, 0xC3C4,
+ 0x5A9B, 0xE6C2,
+ 0x5AAA, 0xE6C1,
+ 0x5AB2, 0xE6C7,
+ 0x5AB3, 0xCFB1,
+ 0x5AB5, 0xEBF4,
+ 0x5AB8, 0xE6CA,
+ 0x5ABE, 0xE6C5,
+ 0x5AC1, 0xBCDE,
+ 0x5AC2, 0xC9A9,
+ 0x5AC9, 0xBCB5,
+ 0x5ACC, 0xCFD3,
+ 0x5AD2, 0xE6C8,
+ 0x5AD4, 0xE6C9,
+ 0x5AD6, 0xE6CE,
+ 0x5AD8, 0xE6D0,
+ 0x5ADC, 0xE6D1,
+ 0x5AE0, 0xE6CB,
+ 0x5AE1, 0xB5D5,
+ 0x5AE3, 0xE6CC,
+ 0x5AE6, 0xE6CF,
+ 0x5AE9, 0xC4DB,
+ 0x5AEB, 0xE6C6,
+ 0x5AF1, 0xE6CD,
+ 0x5B09, 0xE6D2,
+ 0x5B16, 0xE6D4,
+ 0x5B17, 0xE6D3,
+ 0x5B32, 0xE6D5,
+ 0x5B34, 0xD9F8,
+ 0x5B37, 0xE6D6,
+ 0x5B40, 0xE6D7,
+ 0x5B50, 0xD7D3,
+ 0x5B51, 0xE6DD,
+ 0x5B53, 0xE6DE,
+ 0x5B54, 0xBFD7,
+ 0x5B55, 0xD4D0,
+ 0x5B57, 0xD7D6,
+ 0x5B58, 0xB4E6,
+ 0x5B59, 0xCBEF,
+ 0x5B5A, 0xE6DA,
+ 0x5B5B, 0xD8C3,
+ 0x5B5C, 0xD7CE,
+ 0x5B5D, 0xD0A2,
+ 0x5B5F, 0xC3CF,
+ 0x5B62, 0xE6DF,
+ 0x5B63, 0xBCBE,
+ 0x5B64, 0xB9C2,
+ 0x5B65, 0xE6DB,
+ 0x5B66, 0xD1A7,
+ 0x5B69, 0xBAA2,
+ 0x5B6A, 0xC2CF,
+ 0x5B6C, 0xD8AB,
+ 0x5B70, 0xCAEB,
+ 0x5B71, 0xE5EE,
+ 0x5B73, 0xE6DC,
+ 0x5B75, 0xB7F5,
+ 0x5B7A, 0xC8E6,
+ 0x5B7D, 0xC4F5,
+ 0x5B80, 0xE5B2,
+ 0x5B81, 0xC4FE,
+ 0x5B83, 0xCBFC,
+ 0x5B84, 0xE5B3,
+ 0x5B85, 0xD5AC,
+ 0x5B87, 0xD3EE,
+ 0x5B88, 0xCAD8,
+ 0x5B89, 0xB0B2,
+ 0x5B8B, 0xCBCE,
+ 0x5B8C, 0xCDEA,
+ 0x5B8F, 0xBAEA,
+ 0x5B93, 0xE5B5,
+ 0x5B95, 0xE5B4,
+ 0x5B97, 0xD7DA,
+ 0x5B98, 0xB9D9,
+ 0x5B99, 0xD6E6,
+ 0x5B9A, 0xB6A8,
+ 0x5B9B, 0xCDF0,
+ 0x5B9C, 0xD2CB,
+ 0x5B9D, 0xB1A6,
+ 0x5B9E, 0xCAB5,
+ 0x5BA0, 0xB3E8,
+ 0x5BA1, 0xC9F3,
+ 0x5BA2, 0xBFCD,
+ 0x5BA3, 0xD0FB,
+ 0x5BA4, 0xCAD2,
+ 0x5BA5, 0xE5B6,
+ 0x5BA6, 0xBBC2,
+ 0x5BAA, 0xCFDC,
+ 0x5BAB, 0xB9AC,
+ 0x5BB0, 0xD4D7,
+ 0x5BB3, 0xBAA6,
+ 0x5BB4, 0xD1E7,
+ 0x5BB5, 0xCFFC,
+ 0x5BB6, 0xBCD2,
+ 0x5BB8, 0xE5B7,
+ 0x5BB9, 0xC8DD,
+ 0x5BBD, 0xBFED,
+ 0x5BBE, 0xB1F6,
+ 0x5BBF, 0xCBDE,
+ 0x5BC2, 0xBCC5,
+ 0x5BC4, 0xBCC4,
+ 0x5BC5, 0xD2FA,
+ 0x5BC6, 0xC3DC,
+ 0x5BC7, 0xBFDC,
+ 0x5BCC, 0xB8BB,
+ 0x5BD0, 0xC3C2,
+ 0x5BD2, 0xBAAE,
+ 0x5BD3, 0xD4A2,
+ 0x5BDD, 0xC7DE,
+ 0x5BDE, 0xC4AF,
+ 0x5BDF, 0xB2EC,
+ 0x5BE1, 0xB9D1,
+ 0x5BE4, 0xE5BB,
+ 0x5BE5, 0xC1C8,
+ 0x5BE8, 0xD5AF,
+ 0x5BEE, 0xE5BC,
+ 0x5BF0, 0xE5BE,
+ 0x5BF8, 0xB4E7,
+ 0x5BF9, 0xB6D4,
+ 0x5BFA, 0xCBC2,
+ 0x5BFB, 0xD1B0,
+ 0x5BFC, 0xB5BC,
+ 0x5BFF, 0xCAD9,
+ 0x5C01, 0xB7E2,
+ 0x5C04, 0xC9E4,
+ 0x5C06, 0xBDAB,
+ 0x5C09, 0xCEBE,
+ 0x5C0A, 0xD7F0,
+ 0x5C0F, 0xD0A1,
+ 0x5C11, 0xC9D9,
+ 0x5C14, 0xB6FB,
+ 0x5C15, 0xE6D8,
+ 0x5C16, 0xBCE2,
+ 0x5C18, 0xB3BE,
+ 0x5C1A, 0xC9D0,
+ 0x5C1C, 0xE6D9,
+ 0x5C1D, 0xB3A2,
+ 0x5C22, 0xDECC,
+ 0x5C24, 0xD3C8,
+ 0x5C25, 0xDECD,
+ 0x5C27, 0xD2A2,
+ 0x5C2C, 0xDECE,
+ 0x5C31, 0xBECD,
+ 0x5C34, 0xDECF,
+ 0x5C38, 0xCAAC,
+ 0x5C39, 0xD2FC,
+ 0x5C3A, 0xB3DF,
+ 0x5C3B, 0xE5EA,
+ 0x5C3C, 0xC4E1,
+ 0x5C3D, 0xBEA1,
+ 0x5C3E, 0xCEB2,
+ 0x5C3F, 0xC4F2,
+ 0x5C40, 0xBED6,
+ 0x5C41, 0xC6A8,
+ 0x5C42, 0xB2E3,
+ 0x5C45, 0xBED3,
+ 0x5C48, 0xC7FC,
+ 0x5C49, 0xCCEB,
+ 0x5C4A, 0xBDEC,
+ 0x5C4B, 0xCEDD,
+ 0x5C4E, 0xCABA,
+ 0x5C4F, 0xC6C1,
+ 0x5C50, 0xE5EC,
+ 0x5C51, 0xD0BC,
+ 0x5C55, 0xD5B9,
+ 0x5C59, 0xE5ED,
+ 0x5C5E, 0xCAF4,
+ 0x5C60, 0xCDC0,
+ 0x5C61, 0xC2C5,
+ 0x5C63, 0xE5EF,
+ 0x5C65, 0xC2C4,
+ 0x5C66, 0xE5F0,
+ 0x5C6E, 0xE5F8,
+ 0x5C6F, 0xCDCD,
+ 0x5C71, 0xC9BD,
+ 0x5C79, 0xD2D9,
+ 0x5C7A, 0xE1A8,
+ 0x5C7F, 0xD3EC,
+ 0x5C81, 0xCBEA,
+ 0x5C82, 0xC6F1,
+ 0x5C88, 0xE1AC,
+ 0x5C8C, 0xE1A7,
+ 0x5C8D, 0xE1A9,
+ 0x5C90, 0xE1AA,
+ 0x5C91, 0xE1AF,
+ 0x5C94, 0xB2ED,
+ 0x5C96, 0xE1AB,
+ 0x5C97, 0xB8DA,
+ 0x5C98, 0xE1AD,
+ 0x5C99, 0xE1AE,
+ 0x5C9A, 0xE1B0,
+ 0x5C9B, 0xB5BA,
+ 0x5C9C, 0xE1B1,
+ 0x5CA2, 0xE1B3,
+ 0x5CA3, 0xE1B8,
+ 0x5CA9, 0xD1D2,
+ 0x5CAB, 0xE1B6,
+ 0x5CAC, 0xE1B5,
+ 0x5CAD, 0xC1EB,
+ 0x5CB1, 0xE1B7,
+ 0x5CB3, 0xD4C0,
+ 0x5CB5, 0xE1B2,
+ 0x5CB7, 0xE1BA,
+ 0x5CB8, 0xB0B6,
+ 0x5CBD, 0xE1B4,
+ 0x5CBF, 0xBFF9,
+ 0x5CC1, 0xE1B9,
+ 0x5CC4, 0xE1BB,
+ 0x5CCB, 0xE1BE,
+ 0x5CD2, 0xE1BC,
+ 0x5CD9, 0xD6C5,
+ 0x5CE1, 0xCFBF,
+ 0x5CE4, 0xE1BD,
+ 0x5CE5, 0xE1BF,
+ 0x5CE6, 0xC2CD,
+ 0x5CE8, 0xB6EB,
+ 0x5CEA, 0xD3F8,
+ 0x5CED, 0xC7CD,
+ 0x5CF0, 0xB7E5,
+ 0x5CFB, 0xBEFE,
+ 0x5D02, 0xE1C0,
+ 0x5D03, 0xE1C1,
+ 0x5D06, 0xE1C7,
+ 0x5D07, 0xB3E7,
+ 0x5D0E, 0xC6E9,
+ 0x5D14, 0xB4DE,
+ 0x5D16, 0xD1C2,
+ 0x5D1B, 0xE1C8,
+ 0x5D1E, 0xE1C6,
+ 0x5D24, 0xE1C5,
+ 0x5D26, 0xE1C3,
+ 0x5D27, 0xE1C2,
+ 0x5D29, 0xB1C0,
+ 0x5D2D, 0xD5B8,
+ 0x5D2E, 0xE1C4,
+ 0x5D34, 0xE1CB,
+ 0x5D3D, 0xE1CC,
+ 0x5D3E, 0xE1CA,
+ 0x5D47, 0xEFFA,
+ 0x5D4A, 0xE1D3,
+ 0x5D4B, 0xE1D2,
+ 0x5D4C, 0xC7B6,
+ 0x5D58, 0xE1C9,
+ 0x5D5B, 0xE1CE,
+ 0x5D5D, 0xE1D0,
+ 0x5D69, 0xE1D4,
+ 0x5D6B, 0xE1D1,
+ 0x5D6C, 0xE1CD,
+ 0x5D6F, 0xE1CF,
+ 0x5D74, 0xE1D5,
+ 0x5D82, 0xE1D6,
+ 0x5D99, 0xE1D7,
+ 0x5D9D, 0xE1D8,
+ 0x5DB7, 0xE1DA,
+ 0x5DC5, 0xE1DB,
+ 0x5DCD, 0xCEA1,
+ 0x5DDB, 0xE7DD,
+ 0x5DDD, 0xB4A8,
+ 0x5DDE, 0xD6DD,
+ 0x5DE1, 0xD1B2,
+ 0x5DE2, 0xB3B2,
+ 0x5DE5, 0xB9A4,
+ 0x5DE6, 0xD7F3,
+ 0x5DE7, 0xC7C9,
+ 0x5DE8, 0xBEDE,
+ 0x5DE9, 0xB9AE,
+ 0x5DEB, 0xCED7,
+ 0x5DEE, 0xB2EE,
+ 0x5DEF, 0xDBCF,
+ 0x5DF1, 0xBCBA,
+ 0x5DF2, 0xD2D1,
+ 0x5DF3, 0xCBC8,
+ 0x5DF4, 0xB0CD,
+ 0x5DF7, 0xCFEF,
+ 0x5DFD, 0xD9E3,
+ 0x5DFE, 0xBDED,
+ 0x5E01, 0xB1D2,
+ 0x5E02, 0xCAD0,
+ 0x5E03, 0xB2BC,
+ 0x5E05, 0xCBA7,
+ 0x5E06, 0xB7AB,
+ 0x5E08, 0xCAA6,
+ 0x5E0C, 0xCFA3,
+ 0x5E0F, 0xE0F8,
+ 0x5E10, 0xD5CA,
+ 0x5E11, 0xE0FB,
+ 0x5E14, 0xE0FA,
+ 0x5E15, 0xC5C1,
+ 0x5E16, 0xCCFB,
+ 0x5E18, 0xC1B1,
+ 0x5E19, 0xE0F9,
+ 0x5E1A, 0xD6E3,
+ 0x5E1B, 0xB2AF,
+ 0x5E1C, 0xD6C4,
+ 0x5E1D, 0xB5DB,
+ 0x5E26, 0xB4F8,
+ 0x5E27, 0xD6A1,
+ 0x5E2D, 0xCFAF,
+ 0x5E2E, 0xB0EF,
+ 0x5E31, 0xE0FC,
+ 0x5E37, 0xE1A1,
+ 0x5E38, 0xB3A3,
+ 0x5E3B, 0xE0FD,
+ 0x5E3C, 0xE0FE,
+ 0x5E3D, 0xC3B1,
+ 0x5E42, 0xC3DD,
+ 0x5E44, 0xE1A2,
+ 0x5E45, 0xB7F9,
+ 0x5E4C, 0xBBCF,
+ 0x5E54, 0xE1A3,
+ 0x5E55, 0xC4BB,
+ 0x5E5B, 0xE1A4,
+ 0x5E5E, 0xE1A5,
+ 0x5E61, 0xE1A6,
+ 0x5E62, 0xB4B1,
+ 0x5E72, 0xB8C9,
+ 0x5E73, 0xC6BD,
+ 0x5E74, 0xC4EA,
+ 0x5E76, 0xB2A2,
+ 0x5E78, 0xD0D2,
+ 0x5E7A, 0xE7DB,
+ 0x5E7B, 0xBBC3,
+ 0x5E7C, 0xD3D7,
+ 0x5E7D, 0xD3C4,
+ 0x5E7F, 0xB9E3,
+ 0x5E80, 0xE2CF,
+ 0x5E84, 0xD7AF,
+ 0x5E86, 0xC7EC,
+ 0x5E87, 0xB1D3,
+ 0x5E8A, 0xB4B2,
+ 0x5E8B, 0xE2D1,
+ 0x5E8F, 0xD0F2,
+ 0x5E90, 0xC2AE,
+ 0x5E91, 0xE2D0,
+ 0x5E93, 0xBFE2,
+ 0x5E94, 0xD3A6,
+ 0x5E95, 0xB5D7,
+ 0x5E96, 0xE2D2,
+ 0x5E97, 0xB5EA,
+ 0x5E99, 0xC3ED,
+ 0x5E9A, 0xB8FD,
+ 0x5E9C, 0xB8AE,
+ 0x5E9E, 0xC5D3,
+ 0x5E9F, 0xB7CF,
+ 0x5EA0, 0xE2D4,
+ 0x5EA5, 0xE2D3,
+ 0x5EA6, 0xB6C8,
+ 0x5EA7, 0xD7F9,
+ 0x5EAD, 0xCDA5,
+ 0x5EB3, 0xE2D8,
+ 0x5EB5, 0xE2D6,
+ 0x5EB6, 0xCAFC,
+ 0x5EB7, 0xBFB5,
+ 0x5EB8, 0xD3B9,
+ 0x5EB9, 0xE2D5,
+ 0x5EBE, 0xE2D7,
+ 0x5EC9, 0xC1AE,
+ 0x5ECA, 0xC0C8,
+ 0x5ED1, 0xE2DB,
+ 0x5ED2, 0xE2DA,
+ 0x5ED3, 0xC0AA,
+ 0x5ED6, 0xC1CE,
+ 0x5EDB, 0xE2DC,
+ 0x5EE8, 0xE2DD,
+ 0x5EEA, 0xE2DE,
+ 0x5EF4, 0xDBC8,
+ 0x5EF6, 0xD1D3,
+ 0x5EF7, 0xCDA2,
+ 0x5EFA, 0xBDA8,
+ 0x5EFE, 0xDEC3,
+ 0x5EFF, 0xD8A5,
+ 0x5F00, 0xBFAA,
+ 0x5F01, 0xDBCD,
+ 0x5F02, 0xD2EC,
+ 0x5F03, 0xC6FA,
+ 0x5F04, 0xC5AA,
+ 0x5F08, 0xDEC4,
+ 0x5F0A, 0xB1D7,
+ 0x5F0B, 0xDFAE,
+ 0x5F0F, 0xCABD,
+ 0x5F11, 0xDFB1,
+ 0x5F13, 0xB9AD,
+ 0x5F15, 0xD2FD,
+ 0x5F17, 0xB8A5,
+ 0x5F18, 0xBAEB,
+ 0x5F1B, 0xB3DA,
+ 0x5F1F, 0xB5DC,
+ 0x5F20, 0xD5C5,
+ 0x5F25, 0xC3D6,
+ 0x5F26, 0xCFD2,
+ 0x5F27, 0xBBA1,
+ 0x5F29, 0xE5F3,
+ 0x5F2A, 0xE5F2,
+ 0x5F2D, 0xE5F4,
+ 0x5F2F, 0xCDE4,
+ 0x5F31, 0xC8F5,
+ 0x5F39, 0xB5AF,
+ 0x5F3A, 0xC7BF,
+ 0x5F3C, 0xE5F6,
+ 0x5F40, 0xECB0,
+ 0x5F50, 0xE5E6,
+ 0x5F52, 0xB9E9,
+ 0x5F53, 0xB5B1,
+ 0x5F55, 0xC2BC,
+ 0x5F56, 0xE5E8,
+ 0x5F57, 0xE5E7,
+ 0x5F58, 0xE5E9,
+ 0x5F5D, 0xD2CD,
+ 0x5F61, 0xE1EA,
+ 0x5F62, 0xD0CE,
+ 0x5F64, 0xCDAE,
+ 0x5F66, 0xD1E5,
+ 0x5F69, 0xB2CA,
+ 0x5F6A, 0xB1EB,
+ 0x5F6C, 0xB1F2,
+ 0x5F6D, 0xC5ED,
+ 0x5F70, 0xD5C3,
+ 0x5F71, 0xD3B0,
+ 0x5F73, 0xE1DC,
+ 0x5F77, 0xE1DD,
+ 0x5F79, 0xD2DB,
+ 0x5F7B, 0xB3B9,
+ 0x5F7C, 0xB1CB,
+ 0x5F80, 0xCDF9,
+ 0x5F81, 0xD5F7,
+ 0x5F82, 0xE1DE,
+ 0x5F84, 0xBEB6,
+ 0x5F85, 0xB4FD,
+ 0x5F87, 0xE1DF,
+ 0x5F88, 0xBADC,
+ 0x5F89, 0xE1E0,
+ 0x5F8A, 0xBBB2,
+ 0x5F8B, 0xC2C9,
+ 0x5F8C, 0xE1E1,
+ 0x5F90, 0xD0EC,
+ 0x5F92, 0xCDBD,
+ 0x5F95, 0xE1E2,
+ 0x5F97, 0xB5C3,
+ 0x5F98, 0xC5C7,
+ 0x5F99, 0xE1E3,
+ 0x5F9C, 0xE1E4,
+ 0x5FA1, 0xD3F9,
+ 0x5FA8, 0xE1E5,
+ 0x5FAA, 0xD1AD,
+ 0x5FAD, 0xE1E6,
+ 0x5FAE, 0xCEA2,
+ 0x5FB5, 0xE1E7,
+ 0x5FB7, 0xB5C2,
+ 0x5FBC, 0xE1E8,
+ 0x5FBD, 0xBBD5,
+ 0x5FC3, 0xD0C4,
+ 0x5FC4, 0xE2E0,
+ 0x5FC5, 0xB1D8,
+ 0x5FC6, 0xD2E4,
+ 0x5FC9, 0xE2E1,
+ 0x5FCC, 0xBCC9,
+ 0x5FCD, 0xC8CC,
+ 0x5FCF, 0xE2E3,
+ 0x5FD0, 0xECFE,
+ 0x5FD1, 0xECFD,
+ 0x5FD2, 0xDFAF,
+ 0x5FD6, 0xE2E2,
+ 0x5FD7, 0xD6BE,
+ 0x5FD8, 0xCDFC,
+ 0x5FD9, 0xC3A6,
+ 0x5FDD, 0xE3C3,
+ 0x5FE0, 0xD6D2,
+ 0x5FE1, 0xE2E7,
+ 0x5FE4, 0xE2E8,
+ 0x5FE7, 0xD3C7,
+ 0x5FEA, 0xE2EC,
+ 0x5FEB, 0xBFEC,
+ 0x5FED, 0xE2ED,
+ 0x5FEE, 0xE2E5,
+ 0x5FF1, 0xB3C0,
+ 0x5FF5, 0xC4EE,
+ 0x5FF8, 0xE2EE,
+ 0x5FFB, 0xD0C3,
+ 0x5FFD, 0xBAF6,
+ 0x5FFE, 0xE2E9,
+ 0x5FFF, 0xB7DE,
+ 0x6000, 0xBBB3,
+ 0x6001, 0xCCAC,
+ 0x6002, 0xCBCB,
+ 0x6003, 0xE2E4,
+ 0x6004, 0xE2E6,
+ 0x6005, 0xE2EA,
+ 0x6006, 0xE2EB,
+ 0x600A, 0xE2F7,
+ 0x600D, 0xE2F4,
+ 0x600E, 0xD4F5,
+ 0x600F, 0xE2F3,
+ 0x6012, 0xC5AD,
+ 0x6014, 0xD5FA,
+ 0x6015, 0xC5C2,
+ 0x6016, 0xB2C0,
+ 0x6019, 0xE2EF,
+ 0x601B, 0xE2F2,
+ 0x601C, 0xC1AF,
+ 0x601D, 0xCBBC,
+ 0x6020, 0xB5A1,
+ 0x6021, 0xE2F9,
+ 0x6025, 0xBCB1,
+ 0x6026, 0xE2F1,
+ 0x6027, 0xD0D4,
+ 0x6028, 0xD4B9,
+ 0x6029, 0xE2F5,
+ 0x602A, 0xB9D6,
+ 0x602B, 0xE2F6,
+ 0x602F, 0xC7D3,
+ 0x6035, 0xE2F0,
+ 0x603B, 0xD7DC,
+ 0x603C, 0xEDA1,
+ 0x603F, 0xE2F8,
+ 0x6041, 0xEDA5,
+ 0x6042, 0xE2FE,
+ 0x6043, 0xCAD1,
+ 0x604B, 0xC1B5,
+ 0x604D, 0xBBD0,
+ 0x6050, 0xBFD6,
+ 0x6052, 0xBAE3,
+ 0x6055, 0xCBA1,
+ 0x6059, 0xEDA6,
+ 0x605A, 0xEDA3,
+ 0x605D, 0xEDA2,
+ 0x6062, 0xBBD6,
+ 0x6063, 0xEDA7,
+ 0x6064, 0xD0F4,
+ 0x6067, 0xEDA4,
+ 0x6068, 0xBADE,
+ 0x6069, 0xB6F7,
+ 0x606A, 0xE3A1,
+ 0x606B, 0xB6B2,
+ 0x606C, 0xCCF1,
+ 0x606D, 0xB9A7,
+ 0x606F, 0xCFA2,
+ 0x6070, 0xC7A1,
+ 0x6073, 0xBFD2,
+ 0x6076, 0xB6F1,
+ 0x6078, 0xE2FA,
+ 0x6079, 0xE2FB,
+ 0x607A, 0xE2FD,
+ 0x607B, 0xE2FC,
+ 0x607C, 0xC4D5,
+ 0x607D, 0xE3A2,
+ 0x607F, 0xD3C1,
+ 0x6083, 0xE3A7,
+ 0x6084, 0xC7C4,
+ 0x6089, 0xCFA4,
+ 0x608C, 0xE3A9,
+ 0x608D, 0xBAB7,
+ 0x6092, 0xE3A8,
+ 0x6094, 0xBBDA,
+ 0x6096, 0xE3A3,
+ 0x609A, 0xE3A4,
+ 0x609B, 0xE3AA,
+ 0x609D, 0xE3A6,
+ 0x609F, 0xCEF2,
+ 0x60A0, 0xD3C6,
+ 0x60A3, 0xBBBC,
+ 0x60A6, 0xD4C3,
+ 0x60A8, 0xC4FA,
+ 0x60AB, 0xEDA8,
+ 0x60AC, 0xD0FC,
+ 0x60AD, 0xE3A5,
+ 0x60AF, 0xC3F5,
+ 0x60B1, 0xE3AD,
+ 0x60B2, 0xB1AF,
+ 0x60B4, 0xE3B2,
+ 0x60B8, 0xBCC2,
+ 0x60BB, 0xE3AC,
+ 0x60BC, 0xB5BF,
+ 0x60C5, 0xC7E9,
+ 0x60C6, 0xE3B0,
+ 0x60CA, 0xBEAA,
+ 0x60CB, 0xCDEF,
+ 0x60D1, 0xBBF3,
+ 0x60D5, 0xCCE8,
+ 0x60D8, 0xE3AF,
+ 0x60DA, 0xE3B1,
+ 0x60DC, 0xCFA7,
+ 0x60DD, 0xE3AE,
+ 0x60DF, 0xCEA9,
+ 0x60E0, 0xBBDD,
+ 0x60E6, 0xB5EB,
+ 0x60E7, 0xBEE5,
+ 0x60E8, 0xB2D2,
+ 0x60E9, 0xB3CD,
+ 0x60EB, 0xB1B9,
+ 0x60EC, 0xE3AB,
+ 0x60ED, 0xB2D1,
+ 0x60EE, 0xB5AC,
+ 0x60EF, 0xB9DF,
+ 0x60F0, 0xB6E8,
+ 0x60F3, 0xCFEB,
+ 0x60F4, 0xE3B7,
+ 0x60F6, 0xBBCC,
+ 0x60F9, 0xC8C7,
+ 0x60FA, 0xD0CA,
+ 0x6100, 0xE3B8,
+ 0x6101, 0xB3EE,
+ 0x6106, 0xEDA9,
+ 0x6108, 0xD3FA,
+ 0x6109, 0xD3E4,
+ 0x610D, 0xEDAA,
+ 0x610E, 0xE3B9,
+ 0x610F, 0xD2E2,
+ 0x6115, 0xE3B5,
+ 0x611A, 0xD3DE,
+ 0x611F, 0xB8D0,
+ 0x6120, 0xE3B3,
+ 0x6123, 0xE3B6,
+ 0x6124, 0xB7DF,
+ 0x6126, 0xE3B4,
+ 0x6127, 0xC0A2,
+ 0x612B, 0xE3BA,
+ 0x613F, 0xD4B8,
+ 0x6148, 0xB4C8,
+ 0x614A, 0xE3BB,
+ 0x614C, 0xBBC5,
+ 0x614E, 0xC9F7,
+ 0x6151, 0xC9E5,
+ 0x6155, 0xC4BD,
+ 0x615D, 0xEDAB,
+ 0x6162, 0xC2FD,
+ 0x6167, 0xBBDB,
+ 0x6168, 0xBFAE,
+ 0x6170, 0xCEBF,
+ 0x6175, 0xE3BC,
+ 0x6177, 0xBFB6,
+ 0x618B, 0xB1EF,
+ 0x618E, 0xD4F7,
+ 0x6194, 0xE3BE,
+ 0x619D, 0xEDAD,
+ 0x61A7, 0xE3BF,
+ 0x61A8, 0xBAA9,
+ 0x61A9, 0xEDAC,
+ 0x61AC, 0xE3BD,
+ 0x61B7, 0xE3C0,
+ 0x61BE, 0xBAB6,
+ 0x61C2, 0xB6AE,
+ 0x61C8, 0xD0B8,
+ 0x61CA, 0xB0C3,
+ 0x61CB, 0xEDAE,
+ 0x61D1, 0xEDAF,
+ 0x61D2, 0xC0C1,
+ 0x61D4, 0xE3C1,
+ 0x61E6, 0xC5B3,
+ 0x61F5, 0xE3C2,
+ 0x61FF, 0xDCB2,
+ 0x6206, 0xEDB0,
+ 0x6208, 0xB8EA,
+ 0x620A, 0xCEEC,
+ 0x620B, 0xEAA7,
+ 0x620C, 0xD0E7,
+ 0x620D, 0xCAF9,
+ 0x620E, 0xC8D6,
+ 0x620F, 0xCFB7,
+ 0x6210, 0xB3C9,
+ 0x6211, 0xCED2,
+ 0x6212, 0xBDE4,
+ 0x6215, 0xE3DE,
+ 0x6216, 0xBBF2,
+ 0x6217, 0xEAA8,
+ 0x6218, 0xD5BD,
+ 0x621A, 0xC6DD,
+ 0x621B, 0xEAA9,
+ 0x621F, 0xEAAA,
+ 0x6221, 0xEAAC,
+ 0x6222, 0xEAAB,
+ 0x6224, 0xEAAE,
+ 0x6225, 0xEAAD,
+ 0x622A, 0xBDD8,
+ 0x622C, 0xEAAF,
+ 0x622E, 0xC2BE,
+ 0x6233, 0xB4C1,
+ 0x6234, 0xB4F7,
+ 0x6237, 0xBBA7,
+ 0x623D, 0xECE6,
+ 0x623E, 0xECE5,
+ 0x623F, 0xB7BF,
+ 0x6240, 0xCBF9,
+ 0x6241, 0xB1E2,
+ 0x6243, 0xECE7,
+ 0x6247, 0xC9C8,
+ 0x6248, 0xECE8,
+ 0x6249, 0xECE9,
+ 0x624B, 0xCAD6,
+ 0x624C, 0xDED0,
+ 0x624D, 0xB2C5,
+ 0x624E, 0xD4FA,
+ 0x6251, 0xC6CB,
+ 0x6252, 0xB0C7,
+ 0x6253, 0xB4F2,
+ 0x6254, 0xC8D3,
+ 0x6258, 0xCDD0,
+ 0x625B, 0xBFB8,
+ 0x6263, 0xBFDB,
+ 0x6266, 0xC7A4,
+ 0x6267, 0xD6B4,
+ 0x6269, 0xC0A9,
+ 0x626A, 0xDED1,
+ 0x626B, 0xC9A8,
+ 0x626C, 0xD1EF,
+ 0x626D, 0xC5A4,
+ 0x626E, 0xB0E7,
+ 0x626F, 0xB3B6,
+ 0x6270, 0xC8C5,
+ 0x6273, 0xB0E2,
+ 0x6276, 0xB7F6,
+ 0x6279, 0xC5FA,
+ 0x627C, 0xB6F3,
+ 0x627E, 0xD5D2,
+ 0x627F, 0xB3D0,
+ 0x6280, 0xBCBC,
+ 0x6284, 0xB3AD,
+ 0x6289, 0xBEF1,
+ 0x628A, 0xB0D1,
+ 0x6291, 0xD2D6,
+ 0x6292, 0xCAE3,
+ 0x6293, 0xD7A5,
+ 0x6295, 0xCDB6,
+ 0x6296, 0xB6B6,
+ 0x6297, 0xBFB9,
+ 0x6298, 0xD5DB,
+ 0x629A, 0xB8A7,
+ 0x629B, 0xC5D7,
+ 0x629F, 0xDED2,
+ 0x62A0, 0xBFD9,
+ 0x62A1, 0xC2D5,
+ 0x62A2, 0xC7C0,
+ 0x62A4, 0xBBA4,
+ 0x62A5, 0xB1A8,
+ 0x62A8, 0xC5EA,
+ 0x62AB, 0xC5FB,
+ 0x62AC, 0xCCA7,
+ 0x62B1, 0xB1A7,
+ 0x62B5, 0xB5D6,
+ 0x62B9, 0xC4A8,
+ 0x62BB, 0xDED3,
+ 0x62BC, 0xD1BA,
+ 0x62BD, 0xB3E9,
+ 0x62BF, 0xC3F2,
+ 0x62C2, 0xB7F7,
+ 0x62C4, 0xD6F4,
+ 0x62C5, 0xB5A3,
+ 0x62C6, 0xB2F0,
+ 0x62C7, 0xC4B4,
+ 0x62C8, 0xC4E9,
+ 0x62C9, 0xC0AD,
+ 0x62CA, 0xDED4,
+ 0x62CC, 0xB0E8,
+ 0x62CD, 0xC5C4,
+ 0x62CE, 0xC1E0,
+ 0x62D0, 0xB9D5,
+ 0x62D2, 0xBEDC,
+ 0x62D3, 0xCDD8,
+ 0x62D4, 0xB0CE,
+ 0x62D6, 0xCDCF,
+ 0x62D7, 0xDED6,
+ 0x62D8, 0xBED0,
+ 0x62D9, 0xD7BE,
+ 0x62DA, 0xDED5,
+ 0x62DB, 0xD5D0,
+ 0x62DC, 0xB0DD,
+ 0x62DF, 0xC4E2,
+ 0x62E2, 0xC2A3,
+ 0x62E3, 0xBCF0,
+ 0x62E5, 0xD3B5,
+ 0x62E6, 0xC0B9,
+ 0x62E7, 0xC5A1,
+ 0x62E8, 0xB2A6,
+ 0x62E9, 0xD4F1,
+ 0x62EC, 0xC0A8,
+ 0x62ED, 0xCAC3,
+ 0x62EE, 0xDED7,
+ 0x62EF, 0xD5FC,
+ 0x62F1, 0xB9B0,
+ 0x62F3, 0xC8AD,
+ 0x62F4, 0xCBA9,
+ 0x62F6, 0xDED9,
+ 0x62F7, 0xBFBD,
+ 0x62FC, 0xC6B4,
+ 0x62FD, 0xD7A7,
+ 0x62FE, 0xCAB0,
+ 0x62FF, 0xC4C3,
+ 0x6301, 0xB3D6,
+ 0x6302, 0xB9D2,
+ 0x6307, 0xD6B8,
+ 0x6308, 0xEAFC,
+ 0x6309, 0xB0B4,
+ 0x630E, 0xBFE6,
+ 0x6311, 0xCCF4,
+ 0x6316, 0xCDDA,
+ 0x631A, 0xD6BF,
+ 0x631B, 0xC2CE,
+ 0x631D, 0xCECE,
+ 0x631E, 0xCCA2,
+ 0x631F, 0xD0AE,
+ 0x6320, 0xC4D3,
+ 0x6321, 0xB5B2,
+ 0x6322, 0xDED8,
+ 0x6323, 0xD5F5,
+ 0x6324, 0xBCB7,
+ 0x6325, 0xBBD3,
+ 0x6328, 0xB0A4,
+ 0x632A, 0xC5B2,
+ 0x632B, 0xB4EC,
+ 0x632F, 0xD5F1,
+ 0x6332, 0xEAFD,
+ 0x6339, 0xDEDA,
+ 0x633A, 0xCDA6,
+ 0x633D, 0xCDEC,
+ 0x6342, 0xCEE6,
+ 0x6343, 0xDEDC,
+ 0x6345, 0xCDB1,
+ 0x6346, 0xC0A6,
+ 0x6349, 0xD7BD,
+ 0x634B, 0xDEDB,
+ 0x634C, 0xB0C6,
+ 0x634D, 0xBAB4,
+ 0x634E, 0xC9D3,
+ 0x634F, 0xC4F3,
+ 0x6350, 0xBEE8,
+ 0x6355, 0xB2B6,
+ 0x635E, 0xC0CC,
+ 0x635F, 0xCBF0,
+ 0x6361, 0xBCF1,
+ 0x6362, 0xBBBB,
+ 0x6363, 0xB5B7,
+ 0x6367, 0xC5F5,
+ 0x6369, 0xDEE6,
+ 0x636D, 0xDEE3,
+ 0x636E, 0xBEDD,
+ 0x6371, 0xDEDF,
+ 0x6376, 0xB4B7,
+ 0x6377, 0xBDDD,
+ 0x637A, 0xDEE0,
+ 0x637B, 0xC4ED,
+ 0x6380, 0xCFC6,
+ 0x6382, 0xB5E0,
+ 0x6387, 0xB6DE,
+ 0x6388, 0xCADA,
+ 0x6389, 0xB5F4,
+ 0x638A, 0xDEE5,
+ 0x638C, 0xD5C6,
+ 0x638E, 0xDEE1,
+ 0x638F, 0xCCCD,
+ 0x6390, 0xC6FE,
+ 0x6392, 0xC5C5,
+ 0x6396, 0xD2B4,
+ 0x6398, 0xBEF2,
+ 0x63A0, 0xC2D3,
+ 0x63A2, 0xCCBD,
+ 0x63A3, 0xB3B8,
+ 0x63A5, 0xBDD3,
+ 0x63A7, 0xBFD8,
+ 0x63A8, 0xCDC6,
+ 0x63A9, 0xD1DA,
+ 0x63AA, 0xB4EB,
+ 0x63AC, 0xDEE4,
+ 0x63AD, 0xDEDD,
+ 0x63AE, 0xDEE7,
+ 0x63B0, 0xEAFE,
+ 0x63B3, 0xC2B0,
+ 0x63B4, 0xDEE2,
+ 0x63B7, 0xD6C0,
+ 0x63B8, 0xB5A7,
+ 0x63BA, 0xB2F4,
+ 0x63BC, 0xDEE8,
+ 0x63BE, 0xDEF2,
+ 0x63C4, 0xDEED,
+ 0x63C6, 0xDEF1,
+ 0x63C9, 0xC8E0,
+ 0x63CD, 0xD7E1,
+ 0x63CE, 0xDEEF,
+ 0x63CF, 0xC3E8,
+ 0x63D0, 0xCCE1,
+ 0x63D2, 0xB2E5,
+ 0x63D6, 0xD2BE,
+ 0x63DE, 0xDEEE,
+ 0x63E0, 0xDEEB,
+ 0x63E1, 0xCED5,
+ 0x63E3, 0xB4A7,
+ 0x63E9, 0xBFAB,
+ 0x63EA, 0xBEBE,
+ 0x63ED, 0xBDD2,
+ 0x63F2, 0xDEE9,
+ 0x63F4, 0xD4AE,
+ 0x63F6, 0xDEDE,
+ 0x63F8, 0xDEEA,
+ 0x63FD, 0xC0BF,
+ 0x63FF, 0xDEEC,
+ 0x6400, 0xB2F3,
+ 0x6401, 0xB8E9,
+ 0x6402, 0xC2A7,
+ 0x6405, 0xBDC1,
+ 0x640B, 0xDEF5,
+ 0x640C, 0xDEF8,
+ 0x640F, 0xB2AB,
+ 0x6410, 0xB4A4,
+ 0x6413, 0xB4EA,
+ 0x6414, 0xC9A6,
+ 0x641B, 0xDEF6,
+ 0x641C, 0xCBD1,
+ 0x641E, 0xB8E3,
+ 0x6420, 0xDEF7,
+ 0x6421, 0xDEFA,
+ 0x6426, 0xDEF9,
+ 0x642A, 0xCCC2,
+ 0x642C, 0xB0E1,
+ 0x642D, 0xB4EE,
+ 0x6434, 0xE5BA,
+ 0x643A, 0xD0AF,
+ 0x643D, 0xB2EB,
+ 0x643F, 0xEBA1,
+ 0x6441, 0xDEF4,
+ 0x6444, 0xC9E3,
+ 0x6445, 0xDEF3,
+ 0x6446, 0xB0DA,
+ 0x6447, 0xD2A1,
+ 0x6448, 0xB1F7,
+ 0x644A, 0xCCAF,
+ 0x6452, 0xDEF0,
+ 0x6454, 0xCBA4,
+ 0x6458, 0xD5AA,
+ 0x645E, 0xDEFB,
+ 0x6467, 0xB4DD,
+ 0x6469, 0xC4A6,
+ 0x646D, 0xDEFD,
+ 0x6478, 0xC3FE,
+ 0x6479, 0xC4A1,
+ 0x647A, 0xDFA1,
+ 0x6482, 0xC1CC,
+ 0x6484, 0xDEFC,
+ 0x6485, 0xBEEF,
+ 0x6487, 0xC6B2,
+ 0x6491, 0xB3C5,
+ 0x6492, 0xC8F6,
+ 0x6495, 0xCBBA,
+ 0x6496, 0xDEFE,
+ 0x6499, 0xDFA4,
+ 0x649E, 0xD7B2,
+ 0x64A4, 0xB3B7,
+ 0x64A9, 0xC1C3,
+ 0x64AC, 0xC7CB,
+ 0x64AD, 0xB2A5,
+ 0x64AE, 0xB4E9,
+ 0x64B0, 0xD7AB,
+ 0x64B5, 0xC4EC,
+ 0x64B7, 0xDFA2,
+ 0x64B8, 0xDFA3,
+ 0x64BA, 0xDFA5,
+ 0x64BC, 0xBAB3,
+ 0x64C0, 0xDFA6,
+ 0x64C2, 0xC0DE,
+ 0x64C5, 0xC9C3,
+ 0x64CD, 0xB2D9,
+ 0x64CE, 0xC7E6,
+ 0x64D0, 0xDFA7,
+ 0x64D2, 0xC7DC,
+ 0x64D7, 0xDFA8,
+ 0x64D8, 0xEBA2,
+ 0x64DE, 0xCBD3,
+ 0x64E2, 0xDFAA,
+ 0x64E4, 0xDFA9,
+ 0x64E6, 0xB2C1,
+ 0x6500, 0xC5CA,
+ 0x6509, 0xDFAB,
+ 0x6512, 0xD4DC,
+ 0x6518, 0xC8C1,
+ 0x6525, 0xDFAC,
+ 0x652B, 0xBEF0,
+ 0x652E, 0xDFAD,
+ 0x652F, 0xD6A7,
+ 0x6534, 0xEAB7,
+ 0x6535, 0xEBB6,
+ 0x6536, 0xCAD5,
+ 0x6538, 0xD8FC,
+ 0x6539, 0xB8C4,
+ 0x653B, 0xB9A5,
+ 0x653E, 0xB7C5,
+ 0x653F, 0xD5FE,
+ 0x6545, 0xB9CA,
+ 0x6548, 0xD0A7,
+ 0x6549, 0xF4CD,
+ 0x654C, 0xB5D0,
+ 0x654F, 0xC3F4,
+ 0x6551, 0xBEC8,
+ 0x6555, 0xEBB7,
+ 0x6556, 0xB0BD,
+ 0x6559, 0xBDCC,
+ 0x655B, 0xC1B2,
+ 0x655D, 0xB1D6,
+ 0x655E, 0xB3A8,
+ 0x6562, 0xB8D2,
+ 0x6563, 0xC9A2,
+ 0x6566, 0xB6D8,
+ 0x656B, 0xEBB8,
+ 0x656C, 0xBEB4,
+ 0x6570, 0xCAFD,
+ 0x6572, 0xC7C3,
+ 0x6574, 0xD5FB,
+ 0x6577, 0xB7F3,
+ 0x6587, 0xCEC4,
+ 0x658B, 0xD5AB,
+ 0x658C, 0xB1F3,
+ 0x6590, 0xECB3,
+ 0x6591, 0xB0DF,
+ 0x6593, 0xECB5,
+ 0x6597, 0xB6B7,
+ 0x6599, 0xC1CF,
+ 0x659B, 0xF5FA,
+ 0x659C, 0xD0B1,
+ 0x659F, 0xD5E5,
+ 0x65A1, 0xCED3,
+ 0x65A4, 0xBDEF,
+ 0x65A5, 0xB3E2,
+ 0x65A7, 0xB8AB,
+ 0x65A9, 0xD5B6,
+ 0x65AB, 0xEDBD,
+ 0x65AD, 0xB6CF,
+ 0x65AF, 0xCBB9,
+ 0x65B0, 0xD0C2,
+ 0x65B9, 0xB7BD,
+ 0x65BC, 0xECB6,
+ 0x65BD, 0xCAA9,
+ 0x65C1, 0xC5D4,
+ 0x65C3, 0xECB9,
+ 0x65C4, 0xECB8,
+ 0x65C5, 0xC2C3,
+ 0x65C6, 0xECB7,
+ 0x65CB, 0xD0FD,
+ 0x65CC, 0xECBA,
+ 0x65CE, 0xECBB,
+ 0x65CF, 0xD7E5,
+ 0x65D2, 0xECBC,
+ 0x65D6, 0xECBD,
+ 0x65D7, 0xC6EC,
+ 0x65E0, 0xCEDE,
+ 0x65E2, 0xBCC8,
+ 0x65E5, 0xC8D5,
+ 0x65E6, 0xB5A9,
+ 0x65E7, 0xBEC9,
+ 0x65E8, 0xD6BC,
+ 0x65E9, 0xD4E7,
+ 0x65EC, 0xD1AE,
+ 0x65ED, 0xD0F1,
+ 0x65EE, 0xEAB8,
+ 0x65EF, 0xEAB9,
+ 0x65F0, 0xEABA,
+ 0x65F1, 0xBAB5,
+ 0x65F6, 0xCAB1,
+ 0x65F7, 0xBFF5,
+ 0x65FA, 0xCDFA,
+ 0x6600, 0xEAC0,
+ 0x6602, 0xB0BA,
+ 0x6603, 0xEABE,
+ 0x6606, 0xC0A5,
+ 0x660A, 0xEABB,
+ 0x660C, 0xB2FD,
+ 0x660E, 0xC3F7,
+ 0x660F, 0xBBE8,
+ 0x6613, 0xD2D7,
+ 0x6614, 0xCEF4,
+ 0x6615, 0xEABF,
+ 0x6619, 0xEABC,
+ 0x661D, 0xEAC3,
+ 0x661F, 0xD0C7,
+ 0x6620, 0xD3B3,
+ 0x6625, 0xB4BA,
+ 0x6627, 0xC3C1,
+ 0x6628, 0xD7F2,
+ 0x662D, 0xD5D1,
+ 0x662F, 0xCAC7,
+ 0x6631, 0xEAC5,
+ 0x6634, 0xEAC4,
+ 0x6635, 0xEAC7,
+ 0x6636, 0xEAC6,
+ 0x663C, 0xD6E7,
+ 0x663E, 0xCFD4,
+ 0x6641, 0xEACB,
+ 0x6643, 0xBBCE,
+ 0x664B, 0xBDFA,
+ 0x664C, 0xC9CE,
+ 0x664F, 0xEACC,
+ 0x6652, 0xC9B9,
+ 0x6653, 0xCFFE,
+ 0x6654, 0xEACA,
+ 0x6655, 0xD4CE,
+ 0x6656, 0xEACD,
+ 0x6657, 0xEACF,
+ 0x665A, 0xCDED,
+ 0x665F, 0xEAC9,
+ 0x6661, 0xEACE,
+ 0x6664, 0xCEEE,
+ 0x6666, 0xBBDE,
+ 0x6668, 0xB3BF,
+ 0x666E, 0xC6D5,
+ 0x666F, 0xBEB0,
+ 0x6670, 0xCEFA,
+ 0x6674, 0xC7E7,
+ 0x6676, 0xBEA7,
+ 0x6677, 0xEAD0,
+ 0x667A, 0xD6C7,
+ 0x667E, 0xC1C0,
+ 0x6682, 0xD4DD,
+ 0x6684, 0xEAD1,
+ 0x6687, 0xCFBE,
+ 0x668C, 0xEAD2,
+ 0x6691, 0xCAEE,
+ 0x6696, 0xC5AF,
+ 0x6697, 0xB0B5,
+ 0x669D, 0xEAD4,
+ 0x66A7, 0xEAD3,
+ 0x66A8, 0xF4DF,
+ 0x66AE, 0xC4BA,
+ 0x66B4, 0xB1A9,
+ 0x66B9, 0xE5DF,
+ 0x66BE, 0xEAD5,
+ 0x66D9, 0xCAEF,
+ 0x66DB, 0xEAD6,
+ 0x66DC, 0xEAD7,
+ 0x66DD, 0xC6D8,
+ 0x66E6, 0xEAD8,
+ 0x66E9, 0xEAD9,
+ 0x66F0, 0xD4BB,
+ 0x66F2, 0xC7FA,
+ 0x66F3, 0xD2B7,
+ 0x66F4, 0xB8FC,
+ 0x66F7, 0xEAC2,
+ 0x66F9, 0xB2DC,
+ 0x66FC, 0xC2FC,
+ 0x66FE, 0xD4F8,
+ 0x66FF, 0xCCE6,
+ 0x6700, 0xD7EE,
+ 0x6708, 0xD4C2,
+ 0x6709, 0xD3D0,
+ 0x670A, 0xEBC3,
+ 0x670B, 0xC5F3,
+ 0x670D, 0xB7FE,
+ 0x6710, 0xEBD4,
+ 0x6714, 0xCBB7,
+ 0x6715, 0xEBDE,
+ 0x6717, 0xC0CA,
+ 0x671B, 0xCDFB,
+ 0x671D, 0xB3AF,
+ 0x671F, 0xC6DA,
+ 0x6726, 0xEBFC,
+ 0x6728, 0xC4BE,
+ 0x672A, 0xCEB4,
+ 0x672B, 0xC4A9,
+ 0x672C, 0xB1BE,
+ 0x672D, 0xD4FD,
+ 0x672F, 0xCAF5,
+ 0x6731, 0xD6EC,
+ 0x6734, 0xC6D3,
+ 0x6735, 0xB6E4,
+ 0x673A, 0xBBFA,
+ 0x673D, 0xD0E0,
+ 0x6740, 0xC9B1,
+ 0x6742, 0xD4D3,
+ 0x6743, 0xC8A8,
+ 0x6746, 0xB8CB,
+ 0x6748, 0xE8BE,
+ 0x6749, 0xC9BC,
+ 0x674C, 0xE8BB,
+ 0x674E, 0xC0EE,
+ 0x674F, 0xD0D3,
+ 0x6750, 0xB2C4,
+ 0x6751, 0xB4E5,
+ 0x6753, 0xE8BC,
+ 0x6756, 0xD5C8,
+ 0x675C, 0xB6C5,
+ 0x675E, 0xE8BD,
+ 0x675F, 0xCAF8,
+ 0x6760, 0xB8DC,
+ 0x6761, 0xCCF5,
+ 0x6765, 0xC0B4,
+ 0x6768, 0xD1EE,
+ 0x6769, 0xE8BF,
+ 0x676A, 0xE8C2,
+ 0x676D, 0xBABC,
+ 0x676F, 0xB1AD,
+ 0x6770, 0xBDDC,
+ 0x6772, 0xEABD,
+ 0x6773, 0xE8C3,
+ 0x6775, 0xE8C6,
+ 0x6777, 0xE8CB,
+ 0x677C, 0xE8CC,
+ 0x677E, 0xCBC9,
+ 0x677F, 0xB0E5,
+ 0x6781, 0xBCAB,
+ 0x6784, 0xB9B9,
+ 0x6787, 0xE8C1,
+ 0x6789, 0xCDF7,
+ 0x678B, 0xE8CA,
+ 0x6790, 0xCEF6,
+ 0x6795, 0xD5ED,
+ 0x6797, 0xC1D6,
+ 0x6798, 0xE8C4,
+ 0x679A, 0xC3B6,
+ 0x679C, 0xB9FB,
+ 0x679D, 0xD6A6,
+ 0x679E, 0xE8C8,
+ 0x67A2, 0xCAE0,
+ 0x67A3, 0xD4E6,
+ 0x67A5, 0xE8C0,
+ 0x67A7, 0xE8C5,
+ 0x67A8, 0xE8C7,
+ 0x67AA, 0xC7B9,
+ 0x67AB, 0xB7E3,
+ 0x67AD, 0xE8C9,
+ 0x67AF, 0xBFDD,
+ 0x67B0, 0xE8D2,
+ 0x67B3, 0xE8D7,
+ 0x67B5, 0xE8D5,
+ 0x67B6, 0xBCDC,
+ 0x67B7, 0xBCCF,
+ 0x67B8, 0xE8DB,
+ 0x67C1, 0xE8DE,
+ 0x67C3, 0xE8DA,
+ 0x67C4, 0xB1FA,
+ 0x67CF, 0xB0D8,
+ 0x67D0, 0xC4B3,
+ 0x67D1, 0xB8CC,
+ 0x67D2, 0xC6E2,
+ 0x67D3, 0xC8BE,
+ 0x67D4, 0xC8E1,
+ 0x67D8, 0xE8CF,
+ 0x67D9, 0xE8D4,
+ 0x67DA, 0xE8D6,
+ 0x67DC, 0xB9F1,
+ 0x67DD, 0xE8D8,
+ 0x67DE, 0xD7F5,
+ 0x67E0, 0xC4FB,
+ 0x67E2, 0xE8DC,
+ 0x67E5, 0xB2E9,
+ 0x67E9, 0xE8D1,
+ 0x67EC, 0xBCED,
+ 0x67EF, 0xBFC2,
+ 0x67F0, 0xE8CD,
+ 0x67F1, 0xD6F9,
+ 0x67F3, 0xC1F8,
+ 0x67F4, 0xB2F1,
+ 0x67FD, 0xE8DF,
+ 0x67FF, 0xCAC1,
+ 0x6800, 0xE8D9,
+ 0x6805, 0xD5A4,
+ 0x6807, 0xB1EA,
+ 0x6808, 0xD5BB,
+ 0x6809, 0xE8CE,
+ 0x680A, 0xE8D0,
+ 0x680B, 0xB6B0,
+ 0x680C, 0xE8D3,
+ 0x680E, 0xE8DD,
+ 0x680F, 0xC0B8,
+ 0x6811, 0xCAF7,
+ 0x6813, 0xCBA8,
+ 0x6816, 0xC6DC,
+ 0x6817, 0xC0F5,
+ 0x681D, 0xE8E9,
+ 0x6821, 0xD0A3,
+ 0x6829, 0xE8F2,
+ 0x682A, 0xD6EA,
+ 0x6832, 0xE8E0,
+ 0x6833, 0xE8E1,
+ 0x6837, 0xD1F9,
+ 0x6838, 0xBACB,
+ 0x6839, 0xB8F9,
+ 0x683C, 0xB8F1,
+ 0x683D, 0xD4D4,
+ 0x683E, 0xE8EF,
+ 0x6840, 0xE8EE,
+ 0x6841, 0xE8EC,
+ 0x6842, 0xB9F0,
+ 0x6843, 0xCCD2,
+ 0x6844, 0xE8E6,
+ 0x6845, 0xCEA6,
+ 0x6846, 0xBFF2,
+ 0x6848, 0xB0B8,
+ 0x6849, 0xE8F1,
+ 0x684A, 0xE8F0,
+ 0x684C, 0xD7C0,
+ 0x684E, 0xE8E4,
+ 0x6850, 0xCDA9,
+ 0x6851, 0xC9A3,
+ 0x6853, 0xBBB8,
+ 0x6854, 0xBDDB,
+ 0x6855, 0xE8EA,
+ 0x6860, 0xE8E2,
+ 0x6861, 0xE8E3,
+ 0x6862, 0xE8E5,
+ 0x6863, 0xB5B5,
+ 0x6864, 0xE8E7,
+ 0x6865, 0xC7C5,
+ 0x6866, 0xE8EB,
+ 0x6867, 0xE8ED,
+ 0x6868, 0xBDB0,
+ 0x6869, 0xD7AE,
+ 0x686B, 0xE8F8,
+ 0x6874, 0xE8F5,
+ 0x6876, 0xCDB0,
+ 0x6877, 0xE8F6,
+ 0x6881, 0xC1BA,
+ 0x6883, 0xE8E8,
+ 0x6885, 0xC3B7,
+ 0x6886, 0xB0F0,
+ 0x688F, 0xE8F4,
+ 0x6893, 0xE8F7,
+ 0x6897, 0xB9A3,
+ 0x68A2, 0xC9D2,
+ 0x68A6, 0xC3CE,
+ 0x68A7, 0xCEE0,
+ 0x68A8, 0xC0E6,
+ 0x68AD, 0xCBF3,
+ 0x68AF, 0xCCDD,
+ 0x68B0, 0xD0B5,
+ 0x68B3, 0xCAE1,
+ 0x68B5, 0xE8F3,
+ 0x68C0, 0xBCEC,
+ 0x68C2, 0xE8F9,
+ 0x68C9, 0xC3DE,
+ 0x68CB, 0xC6E5,
+ 0x68CD, 0xB9F7,
+ 0x68D2, 0xB0F4,
+ 0x68D5, 0xD7D8,
+ 0x68D8, 0xBCAC,
+ 0x68DA, 0xC5EF,
+ 0x68E0, 0xCCC4,
+ 0x68E3, 0xE9A6,
+ 0x68EE, 0xC9AD,
+ 0x68F0, 0xE9A2,
+ 0x68F1, 0xC0E2,
+ 0x68F5, 0xBFC3,
+ 0x68F9, 0xE8FE,
+ 0x68FA, 0xB9D7,
+ 0x68FC, 0xE8FB,
+ 0x6901, 0xE9A4,
+ 0x6905, 0xD2CE,
+ 0x690B, 0xE9A3,
+ 0x690D, 0xD6B2,
+ 0x690E, 0xD7B5,
+ 0x6910, 0xE9A7,
+ 0x6912, 0xBDB7,
+ 0x691F, 0xE8FC,
+ 0x6920, 0xE8FD,
+ 0x6924, 0xE9A1,
+ 0x692D, 0xCDD6,
+ 0x6930, 0xD2AC,
+ 0x6934, 0xE9B2,
+ 0x6939, 0xE9A9,
+ 0x693D, 0xB4AA,
+ 0x693F, 0xB4BB,
+ 0x6942, 0xE9AB,
+ 0x6954, 0xD0A8,
+ 0x6957, 0xE9A5,
+ 0x695A, 0xB3FE,
+ 0x695D, 0xE9AC,
+ 0x695E, 0xC0E3,
+ 0x6960, 0xE9AA,
+ 0x6963, 0xE9B9,
+ 0x6966, 0xE9B8,
+ 0x696B, 0xE9AE,
+ 0x696E, 0xE8FA,
+ 0x6971, 0xE9A8,
+ 0x6977, 0xBFAC,
+ 0x6978, 0xE9B1,
+ 0x6979, 0xE9BA,
+ 0x697C, 0xC2A5,
+ 0x6980, 0xE9AF,
+ 0x6982, 0xB8C5,
+ 0x6984, 0xE9AD,
+ 0x6986, 0xD3DC,
+ 0x6987, 0xE9B4,
+ 0x6988, 0xE9B5,
+ 0x6989, 0xE9B7,
+ 0x698D, 0xE9C7,
+ 0x6994, 0xC0C6,
+ 0x6995, 0xE9C5,
+ 0x6998, 0xE9B0,
+ 0x699B, 0xE9BB,
+ 0x699C, 0xB0F1,
+ 0x69A7, 0xE9BC,
+ 0x69A8, 0xD5A5,
+ 0x69AB, 0xE9BE,
+ 0x69AD, 0xE9BF,
+ 0x69B1, 0xE9C1,
+ 0x69B4, 0xC1F1,
+ 0x69B7, 0xC8B6,
+ 0x69BB, 0xE9BD,
+ 0x69C1, 0xE9C2,
+ 0x69CA, 0xE9C3,
+ 0x69CC, 0xE9B3,
+ 0x69CE, 0xE9B6,
+ 0x69D0, 0xBBB1,
+ 0x69D4, 0xE9C0,
+ 0x69DB, 0xBCF7,
+ 0x69DF, 0xE9C4,
+ 0x69E0, 0xE9C6,
+ 0x69ED, 0xE9CA,
+ 0x69F2, 0xE9CE,
+ 0x69FD, 0xB2DB,
+ 0x69FF, 0xE9C8,
+ 0x6A0A, 0xB7AE,
+ 0x6A17, 0xE9CB,
+ 0x6A18, 0xE9CC,
+ 0x6A1F, 0xD5C1,
+ 0x6A21, 0xC4A3,
+ 0x6A28, 0xE9D8,
+ 0x6A2A, 0xBAE1,
+ 0x6A2F, 0xE9C9,
+ 0x6A31, 0xD3A3,
+ 0x6A35, 0xE9D4,
+ 0x6A3D, 0xE9D7,
+ 0x6A3E, 0xE9D0,
+ 0x6A44, 0xE9CF,
+ 0x6A47, 0xC7C1,
+ 0x6A50, 0xE9D2,
+ 0x6A58, 0xE9D9,
+ 0x6A59, 0xB3C8,
+ 0x6A5B, 0xE9D3,
+ 0x6A61, 0xCFF0,
+ 0x6A65, 0xE9CD,
+ 0x6A71, 0xB3F7,
+ 0x6A79, 0xE9D6,
+ 0x6A7C, 0xE9DA,
+ 0x6A80, 0xCCB4,
+ 0x6A84, 0xCFAD,
+ 0x6A8E, 0xE9D5,
+ 0x6A90, 0xE9DC,
+ 0x6A91, 0xE9DB,
+ 0x6A97, 0xE9DE,
+ 0x6AA0, 0xE9D1,
+ 0x6AA9, 0xE9DD,
+ 0x6AAB, 0xE9DF,
+ 0x6AAC, 0xC3CA,
+ 0x6B20, 0xC7B7,
+ 0x6B21, 0xB4CE,
+ 0x6B22, 0xBBB6,
+ 0x6B23, 0xD0C0,
+ 0x6B24, 0xECA3,
+ 0x6B27, 0xC5B7,
+ 0x6B32, 0xD3FB,
+ 0x6B37, 0xECA4,
+ 0x6B39, 0xECA5,
+ 0x6B3A, 0xC6DB,
+ 0x6B3E, 0xBFEE,
+ 0x6B43, 0xECA6,
+ 0x6B46, 0xECA7,
+ 0x6B47, 0xD0AA,
+ 0x6B49, 0xC7B8,
+ 0x6B4C, 0xB8E8,
+ 0x6B59, 0xECA8,
+ 0x6B62, 0xD6B9,
+ 0x6B63, 0xD5FD,
+ 0x6B64, 0xB4CB,
+ 0x6B65, 0xB2BD,
+ 0x6B66, 0xCEE4,
+ 0x6B67, 0xC6E7,
+ 0x6B6A, 0xCDE1,
+ 0x6B79, 0xB4F5,
+ 0x6B7B, 0xCBC0,
+ 0x6B7C, 0xBCDF,
+ 0x6B81, 0xE9E2,
+ 0x6B82, 0xE9E3,
+ 0x6B83, 0xD1EA,
+ 0x6B84, 0xE9E5,
+ 0x6B86, 0xB4F9,
+ 0x6B87, 0xE9E4,
+ 0x6B89, 0xD1B3,
+ 0x6B8A, 0xCAE2,
+ 0x6B8B, 0xB2D0,
+ 0x6B8D, 0xE9E8,
+ 0x6B92, 0xE9E6,
+ 0x6B93, 0xE9E7,
+ 0x6B96, 0xD6B3,
+ 0x6B9A, 0xE9E9,
+ 0x6B9B, 0xE9EA,
+ 0x6BA1, 0xE9EB,
+ 0x6BAA, 0xE9EC,
+ 0x6BB3, 0xECAF,
+ 0x6BB4, 0xC5B9,
+ 0x6BB5, 0xB6CE,
+ 0x6BB7, 0xD2F3,
+ 0x6BBF, 0xB5EE,
+ 0x6BC1, 0xBBD9,
+ 0x6BC2, 0xECB1,
+ 0x6BC5, 0xD2E3,
+ 0x6BCB, 0xCEE3,
+ 0x6BCD, 0xC4B8,
+ 0x6BCF, 0xC3BF,
+ 0x6BD2, 0xB6BE,
+ 0x6BD3, 0xD8B9,
+ 0x6BD4, 0xB1C8,
+ 0x6BD5, 0xB1CF,
+ 0x6BD6, 0xB1D1,
+ 0x6BD7, 0xC5FE,
+ 0x6BD9, 0xB1D0,
+ 0x6BDB, 0xC3AB,
+ 0x6BE1, 0xD5B1,
+ 0x6BEA, 0xEBA4,
+ 0x6BEB, 0xBAC1,
+ 0x6BEF, 0xCCBA,
+ 0x6BF3, 0xEBA5,
+ 0x6BF5, 0xEBA7,
+ 0x6BF9, 0xEBA8,
+ 0x6BFD, 0xEBA6,
+ 0x6C05, 0xEBA9,
+ 0x6C06, 0xEBAB,
+ 0x6C07, 0xEBAA,
+ 0x6C0D, 0xEBAC,
+ 0x6C0F, 0xCACF,
+ 0x6C10, 0xD8B5,
+ 0x6C11, 0xC3F1,
+ 0x6C13, 0xC3A5,
+ 0x6C14, 0xC6F8,
+ 0x6C15, 0xEBAD,
+ 0x6C16, 0xC4CA,
+ 0x6C18, 0xEBAE,
+ 0x6C19, 0xEBAF,
+ 0x6C1A, 0xEBB0,
+ 0x6C1B, 0xB7D5,
+ 0x6C1F, 0xB7FA,
+ 0x6C21, 0xEBB1,
+ 0x6C22, 0xC7E2,
+ 0x6C24, 0xEBB3,
+ 0x6C26, 0xBAA4,
+ 0x6C27, 0xD1F5,
+ 0x6C28, 0xB0B1,
+ 0x6C29, 0xEBB2,
+ 0x6C2A, 0xEBB4,
+ 0x6C2E, 0xB5AA,
+ 0x6C2F, 0xC2C8,
+ 0x6C30, 0xC7E8,
+ 0x6C32, 0xEBB5,
+ 0x6C34, 0xCBAE,
+ 0x6C35, 0xE3DF,
+ 0x6C38, 0xD3C0,
+ 0x6C3D, 0xD9DB,
+ 0x6C40, 0xCDA1,
+ 0x6C41, 0xD6AD,
+ 0x6C42, 0xC7F3,
+ 0x6C46, 0xD9E0,
+ 0x6C47, 0xBBE3,
+ 0x6C49, 0xBABA,
+ 0x6C4A, 0xE3E2,
+ 0x6C50, 0xCFAB,
+ 0x6C54, 0xE3E0,
+ 0x6C55, 0xC9C7,
+ 0x6C57, 0xBAB9,
+ 0x6C5B, 0xD1B4,
+ 0x6C5C, 0xE3E1,
+ 0x6C5D, 0xC8EA,
+ 0x6C5E, 0xB9AF,
+ 0x6C5F, 0xBDAD,
+ 0x6C60, 0xB3D8,
+ 0x6C61, 0xCEDB,
+ 0x6C64, 0xCCC0,
+ 0x6C68, 0xE3E8,
+ 0x6C69, 0xE3E9,
+ 0x6C6A, 0xCDF4,
+ 0x6C70, 0xCCAD,
+ 0x6C72, 0xBCB3,
+ 0x6C74, 0xE3EA,
+ 0x6C76, 0xE3EB,
+ 0x6C79, 0xD0DA,
+ 0x6C7D, 0xC6FB,
+ 0x6C7E, 0xB7DA,
+ 0x6C81, 0xC7DF,
+ 0x6C82, 0xD2CA,
+ 0x6C83, 0xCED6,
+ 0x6C85, 0xE3E4,
+ 0x6C86, 0xE3EC,
+ 0x6C88, 0xC9F2,
+ 0x6C89, 0xB3C1,
+ 0x6C8C, 0xE3E7,
+ 0x6C8F, 0xC6E3,
+ 0x6C90, 0xE3E5,
+ 0x6C93, 0xEDB3,
+ 0x6C94, 0xE3E6,
+ 0x6C99, 0xC9B3,
+ 0x6C9B, 0xC5E6,
+ 0x6C9F, 0xB9B5,
+ 0x6CA1, 0xC3BB,
+ 0x6CA3, 0xE3E3,
+ 0x6CA4, 0xC5BD,
+ 0x6CA5, 0xC1A4,
+ 0x6CA6, 0xC2D9,
+ 0x6CA7, 0xB2D7,
+ 0x6CA9, 0xE3ED,
+ 0x6CAA, 0xBBA6,
+ 0x6CAB, 0xC4AD,
+ 0x6CAD, 0xE3F0,
+ 0x6CAE, 0xBEDA,
+ 0x6CB1, 0xE3FB,
+ 0x6CB2, 0xE3F5,
+ 0x6CB3, 0xBAD3,
+ 0x6CB8, 0xB7D0,
+ 0x6CB9, 0xD3CD,
+ 0x6CBB, 0xD6CE,
+ 0x6CBC, 0xD5D3,
+ 0x6CBD, 0xB9C1,
+ 0x6CBE, 0xD5B4,
+ 0x6CBF, 0xD1D8,
+ 0x6CC4, 0xD0B9,
+ 0x6CC5, 0xC7F6,
+ 0x6CC9, 0xC8AA,
+ 0x6CCA, 0xB2B4,
+ 0x6CCC, 0xC3DA,
+ 0x6CD0, 0xE3EE,
+ 0x6CD3, 0xE3FC,
+ 0x6CD4, 0xE3EF,
+ 0x6CD5, 0xB7A8,
+ 0x6CD6, 0xE3F7,
+ 0x6CD7, 0xE3F4,
+ 0x6CDB, 0xB7BA,
+ 0x6CDE, 0xC5A2,
+ 0x6CE0, 0xE3F6,
+ 0x6CE1, 0xC5DD,
+ 0x6CE2, 0xB2A8,
+ 0x6CE3, 0xC6FC,
+ 0x6CE5, 0xC4E0,
+ 0x6CE8, 0xD7A2,
+ 0x6CEA, 0xC0E1,
+ 0x6CEB, 0xE3F9,
+ 0x6CEE, 0xE3FA,
+ 0x6CEF, 0xE3FD,
+ 0x6CF0, 0xCCA9,
+ 0x6CF1, 0xE3F3,
+ 0x6CF3, 0xD3BE,
+ 0x6CF5, 0xB1C3,
+ 0x6CF6, 0xEDB4,
+ 0x6CF7, 0xE3F1,
+ 0x6CF8, 0xE3F2,
+ 0x6CFA, 0xE3F8,
+ 0x6CFB, 0xD0BA,
+ 0x6CFC, 0xC6C3,
+ 0x6CFD, 0xD4F3,
+ 0x6CFE, 0xE3FE,
+ 0x6D01, 0xBDE0,
+ 0x6D04, 0xE4A7,
+ 0x6D07, 0xE4A6,
+ 0x6D0B, 0xD1F3,
+ 0x6D0C, 0xE4A3,
+ 0x6D0E, 0xE4A9,
+ 0x6D12, 0xC8F7,
+ 0x6D17, 0xCFB4,
+ 0x6D19, 0xE4A8,
+ 0x6D1A, 0xE4AE,
+ 0x6D1B, 0xC2E5,
+ 0x6D1E, 0xB6B4,
+ 0x6D25, 0xBDF2,
+ 0x6D27, 0xE4A2,
+ 0x6D2A, 0xBAE9,
+ 0x6D2B, 0xE4AA,
+ 0x6D2E, 0xE4AC,
+ 0x6D31, 0xB6FD,
+ 0x6D32, 0xD6DE,
+ 0x6D33, 0xE4B2,
+ 0x6D35, 0xE4AD,
+ 0x6D39, 0xE4A1,
+ 0x6D3B, 0xBBEE,
+ 0x6D3C, 0xCDDD,
+ 0x6D3D, 0xC7A2,
+ 0x6D3E, 0xC5C9,
+ 0x6D41, 0xC1F7,
+ 0x6D43, 0xE4A4,
+ 0x6D45, 0xC7B3,
+ 0x6D46, 0xBDAC,
+ 0x6D47, 0xBDBD,
+ 0x6D48, 0xE4A5,
+ 0x6D4A, 0xD7C7,
+ 0x6D4B, 0xB2E2,
+ 0x6D4D, 0xE4AB,
+ 0x6D4E, 0xBCC3,
+ 0x6D4F, 0xE4AF,
+ 0x6D51, 0xBBEB,
+ 0x6D52, 0xE4B0,
+ 0x6D53, 0xC5A8,
+ 0x6D54, 0xE4B1,
+ 0x6D59, 0xD5E3,
+ 0x6D5A, 0xBFA3,
+ 0x6D5C, 0xE4BA,
+ 0x6D5E, 0xE4B7,
+ 0x6D60, 0xE4BB,
+ 0x6D63, 0xE4BD,
+ 0x6D66, 0xC6D6,
+ 0x6D69, 0xBAC6,
+ 0x6D6A, 0xC0CB,
+ 0x6D6E, 0xB8A1,
+ 0x6D6F, 0xE4B4,
+ 0x6D74, 0xD4A1,
+ 0x6D77, 0xBAA3,
+ 0x6D78, 0xBDFE,
+ 0x6D7C, 0xE4BC,
+ 0x6D82, 0xCDBF,
+ 0x6D85, 0xC4F9,
+ 0x6D88, 0xCFFB,
+ 0x6D89, 0xC9E6,
+ 0x6D8C, 0xD3BF,
+ 0x6D8E, 0xCFD1,
+ 0x6D91, 0xE4B3,
+ 0x6D93, 0xE4B8,
+ 0x6D94, 0xE4B9,
+ 0x6D95, 0xCCE9,
+ 0x6D9B, 0xCCCE,
+ 0x6D9D, 0xC0D4,
+ 0x6D9E, 0xE4B5,
+ 0x6D9F, 0xC1B0,
+ 0x6DA0, 0xE4B6,
+ 0x6DA1, 0xCED0,
+ 0x6DA3, 0xBBC1,
+ 0x6DA4, 0xB5D3,
+ 0x6DA6, 0xC8F3,
+ 0x6DA7, 0xBDA7,
+ 0x6DA8, 0xD5C7,
+ 0x6DA9, 0xC9AC,
+ 0x6DAA, 0xB8A2,
+ 0x6DAB, 0xE4CA,
+ 0x6DAE, 0xE4CC,
+ 0x6DAF, 0xD1C4,
+ 0x6DB2, 0xD2BA,
+ 0x6DB5, 0xBAAD,
+ 0x6DB8, 0xBAD4,
+ 0x6DBF, 0xE4C3,
+ 0x6DC0, 0xB5ED,
+ 0x6DC4, 0xD7CD,
+ 0x6DC5, 0xE4C0,
+ 0x6DC6, 0xCFFD,
+ 0x6DC7, 0xE4BF,
+ 0x6DCB, 0xC1DC,
+ 0x6DCC, 0xCCCA,
+ 0x6DD1, 0xCAE7,
+ 0x6DD6, 0xC4D7,
+ 0x6DD8, 0xCCD4,
+ 0x6DD9, 0xE4C8,
+ 0x6DDD, 0xE4C7,
+ 0x6DDE, 0xE4C1,
+ 0x6DE0, 0xE4C4,
+ 0x6DE1, 0xB5AD,
+ 0x6DE4, 0xD3D9,
+ 0x6DE6, 0xE4C6,
+ 0x6DEB, 0xD2F9,
+ 0x6DEC, 0xB4E3,
+ 0x6DEE, 0xBBB4,
+ 0x6DF1, 0xC9EE,
+ 0x6DF3, 0xB4BE,
+ 0x6DF7, 0xBBEC,
+ 0x6DF9, 0xD1CD,
+ 0x6DFB, 0xCCED,
+ 0x6DFC, 0xEDB5,
+ 0x6E05, 0xC7E5,
+ 0x6E0A, 0xD4A8,
+ 0x6E0C, 0xE4CB,
+ 0x6E0D, 0xD7D5,
+ 0x6E0E, 0xE4C2,
+ 0x6E10, 0xBDA5,
+ 0x6E11, 0xE4C5,
+ 0x6E14, 0xD3E6,
+ 0x6E16, 0xE4C9,
+ 0x6E17, 0xC9F8,
+ 0x6E1A, 0xE4BE,
+ 0x6E1D, 0xD3E5,
+ 0x6E20, 0xC7FE,
+ 0x6E21, 0xB6C9,
+ 0x6E23, 0xD4FC,
+ 0x6E24, 0xB2B3,
+ 0x6E25, 0xE4D7,
+ 0x6E29, 0xCEC2,
+ 0x6E2B, 0xE4CD,
+ 0x6E2D, 0xCEBC,
+ 0x6E2F, 0xB8DB,
+ 0x6E32, 0xE4D6,
+ 0x6E34, 0xBFCA,
+ 0x6E38, 0xD3CE,
+ 0x6E3A, 0xC3EC,
+ 0x6E43, 0xC5C8,
+ 0x6E44, 0xE4D8,
+ 0x6E4D, 0xCDC4,
+ 0x6E4E, 0xE4CF,
+ 0x6E53, 0xE4D4,
+ 0x6E54, 0xE4D5,
+ 0x6E56, 0xBAFE,
+ 0x6E58, 0xCFE6,
+ 0x6E5B, 0xD5BF,
+ 0x6E5F, 0xE4D2,
+ 0x6E6B, 0xE4D0,
+ 0x6E6E, 0xE4CE,
+ 0x6E7E, 0xCDE5,
+ 0x6E7F, 0xCAAA,
+ 0x6E83, 0xC0A3,
+ 0x6E85, 0xBDA6,
+ 0x6E86, 0xE4D3,
+ 0x6E89, 0xB8C8,
+ 0x6E8F, 0xE4E7,
+ 0x6E90, 0xD4B4,
+ 0x6E98, 0xE4DB,
+ 0x6E9C, 0xC1EF,
+ 0x6E9F, 0xE4E9,
+ 0x6EA2, 0xD2E7,
+ 0x6EA5, 0xE4DF,
+ 0x6EA7, 0xE4E0,
+ 0x6EAA, 0xCFAA,
+ 0x6EAF, 0xCBDD,
+ 0x6EB1, 0xE4DA,
+ 0x6EB2, 0xE4D1,
+ 0x6EB4, 0xE4E5,
+ 0x6EB6, 0xC8DC,
+ 0x6EB7, 0xE4E3,
+ 0x6EBA, 0xC4E7,
+ 0x6EBB, 0xE4E2,
+ 0x6EBD, 0xE4E1,
+ 0x6EC1, 0xB3FC,
+ 0x6EC2, 0xE4E8,
+ 0x6EC7, 0xB5E1,
+ 0x6ECB, 0xD7CC,
+ 0x6ECF, 0xE4E6,
+ 0x6ED1, 0xBBAC,
+ 0x6ED3, 0xD7D2,
+ 0x6ED4, 0xCCCF,
+ 0x6ED5, 0xEBF8,
+ 0x6ED7, 0xE4E4,
+ 0x6EDA, 0xB9F6,
+ 0x6EDE, 0xD6CD,
+ 0x6EDF, 0xE4D9,
+ 0x6EE0, 0xE4DC,
+ 0x6EE1, 0xC2FA,
+ 0x6EE2, 0xE4DE,
+ 0x6EE4, 0xC2CB,
+ 0x6EE5, 0xC0C4,
+ 0x6EE6, 0xC2D0,
+ 0x6EE8, 0xB1F5,
+ 0x6EE9, 0xCCB2,
+ 0x6EF4, 0xB5CE,
+ 0x6EF9, 0xE4EF,
+ 0x6F02, 0xC6AF,
+ 0x6F06, 0xC6E1,
+ 0x6F09, 0xE4F5,
+ 0x6F0F, 0xC2A9,
+ 0x6F13, 0xC0EC,
+ 0x6F14, 0xD1DD,
+ 0x6F15, 0xE4EE,
+ 0x6F20, 0xC4AE,
+ 0x6F24, 0xE4ED,
+ 0x6F29, 0xE4F6,
+ 0x6F2A, 0xE4F4,
+ 0x6F2B, 0xC2FE,
+ 0x6F2D, 0xE4DD,
+ 0x6F2F, 0xE4F0,
+ 0x6F31, 0xCAFE,
+ 0x6F33, 0xD5C4,
+ 0x6F36, 0xE4F1,
+ 0x6F3E, 0xD1FA,
+ 0x6F46, 0xE4EB,
+ 0x6F47, 0xE4EC,
+ 0x6F4B, 0xE4F2,
+ 0x6F4D, 0xCEAB,
+ 0x6F58, 0xC5CB,
+ 0x6F5C, 0xC7B1,
+ 0x6F5E, 0xC2BA,
+ 0x6F62, 0xE4EA,
+ 0x6F66, 0xC1CA,
+ 0x6F6D, 0xCCB6,
+ 0x6F6E, 0xB3B1,
+ 0x6F72, 0xE4FB,
+ 0x6F74, 0xE4F3,
+ 0x6F78, 0xE4FA,
+ 0x6F7A, 0xE4FD,
+ 0x6F7C, 0xE4FC,
+ 0x6F84, 0xB3CE,
+ 0x6F88, 0xB3BA,
+ 0x6F89, 0xE4F7,
+ 0x6F8C, 0xE4F9,
+ 0x6F8D, 0xE4F8,
+ 0x6F8E, 0xC5EC,
+ 0x6F9C, 0xC0BD,
+ 0x6FA1, 0xD4E8,
+ 0x6FA7, 0xE5A2,
+ 0x6FB3, 0xB0C4,
+ 0x6FB6, 0xE5A4,
+ 0x6FB9, 0xE5A3,
+ 0x6FC0, 0xBCA4,
+ 0x6FC2, 0xE5A5,
+ 0x6FC9, 0xE5A1,
+ 0x6FD1, 0xE4FE,
+ 0x6FD2, 0xB1F4,
+ 0x6FDE, 0xE5A8,
+ 0x6FE0, 0xE5A9,
+ 0x6FE1, 0xE5A6,
+ 0x6FEE, 0xE5A7,
+ 0x6FEF, 0xE5AA,
+ 0x7011, 0xC6D9,
+ 0x701A, 0xE5AB,
+ 0x701B, 0xE5AD,
+ 0x7023, 0xE5AC,
+ 0x7035, 0xE5AF,
+ 0x7039, 0xE5AE,
+ 0x704C, 0xB9E0,
+ 0x704F, 0xE5B0,
+ 0x705E, 0xE5B1,
+ 0x706B, 0xBBF0,
+ 0x706C, 0xECE1,
+ 0x706D, 0xC3F0,
+ 0x706F, 0xB5C6,
+ 0x7070, 0xBBD2,
+ 0x7075, 0xC1E9,
+ 0x7076, 0xD4EE,
+ 0x7078, 0xBEC4,
+ 0x707C, 0xD7C6,
+ 0x707E, 0xD4D6,
+ 0x707F, 0xB2D3,
+ 0x7080, 0xECBE,
+ 0x7085, 0xEAC1,
+ 0x7089, 0xC2AF,
+ 0x708A, 0xB4B6,
+ 0x708E, 0xD1D7,
+ 0x7092, 0xB3B4,
+ 0x7094, 0xC8B2,
+ 0x7095, 0xBFBB,
+ 0x7096, 0xECC0,
+ 0x7099, 0xD6CB,
+ 0x709C, 0xECBF,
+ 0x709D, 0xECC1,
+ 0x70AB, 0xECC5,
+ 0x70AC, 0xBEE6,
+ 0x70AD, 0xCCBF,
+ 0x70AE, 0xC5DA,
+ 0x70AF, 0xBEBC,
+ 0x70B1, 0xECC6,
+ 0x70B3, 0xB1FE,
+ 0x70B7, 0xECC4,
+ 0x70B8, 0xD5A8,
+ 0x70B9, 0xB5E3,
+ 0x70BB, 0xECC2,
+ 0x70BC, 0xC1B6,
+ 0x70BD, 0xB3E3,
+ 0x70C0, 0xECC3,
+ 0x70C1, 0xCBB8,
+ 0x70C2, 0xC0C3,
+ 0x70C3, 0xCCFE,
+ 0x70C8, 0xC1D2,
+ 0x70CA, 0xECC8,
+ 0x70D8, 0xBAE6,
+ 0x70D9, 0xC0D3,
+ 0x70DB, 0xD6F2,
+ 0x70DF, 0xD1CC,
+ 0x70E4, 0xBFBE,
+ 0x70E6, 0xB7B3,
+ 0x70E7, 0xC9D5,
+ 0x70E8, 0xECC7,
+ 0x70E9, 0xBBE2,
+ 0x70EB, 0xCCCC,
+ 0x70EC, 0xBDFD,
+ 0x70ED, 0xC8C8,
+ 0x70EF, 0xCFA9,
+ 0x70F7, 0xCDE9,
+ 0x70F9, 0xC5EB,
+ 0x70FD, 0xB7E9,
+ 0x7109, 0xD1C9,
+ 0x710A, 0xBAB8,
+ 0x7110, 0xECC9,
+ 0x7113, 0xECCA,
+ 0x7115, 0xBBC0,
+ 0x7116, 0xECCB,
+ 0x7118, 0xECE2,
+ 0x7119, 0xB1BA,
+ 0x711A, 0xB7D9,
+ 0x7126, 0xBDB9,
+ 0x712F, 0xECCC,
+ 0x7130, 0xD1E6,
+ 0x7131, 0xECCD,
+ 0x7136, 0xC8BB,
+ 0x7145, 0xECD1,
+ 0x714A, 0xECD3,
+ 0x714C, 0xBBCD,
+ 0x714E, 0xBCE5,
+ 0x715C, 0xECCF,
+ 0x715E, 0xC9B7,
+ 0x7164, 0xC3BA,
+ 0x7166, 0xECE3,
+ 0x7167, 0xD5D5,
+ 0x7168, 0xECD0,
+ 0x716E, 0xD6F3,
+ 0x7172, 0xECD2,
+ 0x7173, 0xECCE,
+ 0x7178, 0xECD4,
+ 0x717A, 0xECD5,
+ 0x717D, 0xC9BF,
+ 0x7184, 0xCFA8,
+ 0x718A, 0xD0DC,
+ 0x718F, 0xD1AC,
+ 0x7194, 0xC8DB,
+ 0x7198, 0xECD6,
+ 0x7199, 0xCEF5,
+ 0x719F, 0xCAEC,
+ 0x71A0, 0xECDA,
+ 0x71A8, 0xECD9,
+ 0x71AC, 0xB0BE,
+ 0x71B3, 0xECD7,
+ 0x71B5, 0xECD8,
+ 0x71B9, 0xECE4,
+ 0x71C3, 0xC8BC,
+ 0x71CE, 0xC1C7,
+ 0x71D4, 0xECDC,
+ 0x71D5, 0xD1E0,
+ 0x71E0, 0xECDB,
+ 0x71E5, 0xD4EF,
+ 0x71E7, 0xECDD,
+ 0x71EE, 0xDBC6,
+ 0x71F9, 0xECDE,
+ 0x7206, 0xB1AC,
+ 0x721D, 0xECDF,
+ 0x7228, 0xECE0,
+ 0x722A, 0xD7A6,
+ 0x722C, 0xC5C0,
+ 0x7230, 0xEBBC,
+ 0x7231, 0xB0AE,
+ 0x7235, 0xBEF4,
+ 0x7236, 0xB8B8,
+ 0x7237, 0xD2AF,
+ 0x7238, 0xB0D6,
+ 0x7239, 0xB5F9,
+ 0x723B, 0xD8B3,
+ 0x723D, 0xCBAC,
+ 0x723F, 0xE3DD,
+ 0x7247, 0xC6AC,
+ 0x7248, 0xB0E6,
+ 0x724C, 0xC5C6,
+ 0x724D, 0xEBB9,
+ 0x7252, 0xEBBA,
+ 0x7256, 0xEBBB,
+ 0x7259, 0xD1C0,
+ 0x725B, 0xC5A3,
+ 0x725D, 0xEAF2,
+ 0x725F, 0xC4B2,
+ 0x7261, 0xC4B5,
+ 0x7262, 0xC0CE,
+ 0x7266, 0xEAF3,
+ 0x7267, 0xC4C1,
+ 0x7269, 0xCEEF,
+ 0x726E, 0xEAF0,
+ 0x726F, 0xEAF4,
+ 0x7272, 0xC9FC,
+ 0x7275, 0xC7A3,
+ 0x7279, 0xCCD8,
+ 0x727A, 0xCEFE,
+ 0x727E, 0xEAF5,
+ 0x727F, 0xEAF6,
+ 0x7280, 0xCFAC,
+ 0x7281, 0xC0E7,
+ 0x7284, 0xEAF7,
+ 0x728A, 0xB6BF,
+ 0x728B, 0xEAF8,
+ 0x728D, 0xEAF9,
+ 0x728F, 0xEAFA,
+ 0x7292, 0xEAFB,
+ 0x729F, 0xEAF1,
+ 0x72AC, 0xC8AE,
+ 0x72AD, 0xE1EB,
+ 0x72AF, 0xB7B8,
+ 0x72B0, 0xE1EC,
+ 0x72B4, 0xE1ED,
+ 0x72B6, 0xD7B4,
+ 0x72B7, 0xE1EE,
+ 0x72B8, 0xE1EF,
+ 0x72B9, 0xD3CC,
+ 0x72C1, 0xE1F1,
+ 0x72C2, 0xBFF1,
+ 0x72C3, 0xE1F0,
+ 0x72C4, 0xB5D2,
+ 0x72C8, 0xB1B7,
+ 0x72CD, 0xE1F3,
+ 0x72CE, 0xE1F2,
+ 0x72D0, 0xBAFC,
+ 0x72D2, 0xE1F4,
+ 0x72D7, 0xB9B7,
+ 0x72D9, 0xBED1,
+ 0x72DE, 0xC4FC,
+ 0x72E0, 0xBADD,
+ 0x72E1, 0xBDC6,
+ 0x72E8, 0xE1F5,
+ 0x72E9, 0xE1F7,
+ 0x72EC, 0xB6C0,
+ 0x72ED, 0xCFC1,
+ 0x72EE, 0xCAA8,
+ 0x72EF, 0xE1F6,
+ 0x72F0, 0xD5F8,
+ 0x72F1, 0xD3FC,
+ 0x72F2, 0xE1F8,
+ 0x72F3, 0xE1FC,
+ 0x72F4, 0xE1F9,
+ 0x72F7, 0xE1FA,
+ 0x72F8, 0xC0EA,
+ 0x72FA, 0xE1FE,
+ 0x72FB, 0xE2A1,
+ 0x72FC, 0xC0C7,
+ 0x7301, 0xE1FB,
+ 0x7303, 0xE1FD,
+ 0x730A, 0xE2A5,
+ 0x730E, 0xC1D4,
+ 0x7313, 0xE2A3,
+ 0x7315, 0xE2A8,
+ 0x7316, 0xB2FE,
+ 0x7317, 0xE2A2,
+ 0x731B, 0xC3CD,
+ 0x731C, 0xB2C2,
+ 0x731D, 0xE2A7,
+ 0x731E, 0xE2A6,
+ 0x7321, 0xE2A4,
+ 0x7322, 0xE2A9,
+ 0x7325, 0xE2AB,
+ 0x7329, 0xD0C9,
+ 0x732A, 0xD6ED,
+ 0x732B, 0xC3A8,
+ 0x732C, 0xE2AC,
+ 0x732E, 0xCFD7,
+ 0x7331, 0xE2AE,
+ 0x7334, 0xBAEF,
+ 0x7337, 0xE9E0,
+ 0x7338, 0xE2AD,
+ 0x7339, 0xE2AA,
+ 0x733E, 0xBBAB,
+ 0x733F, 0xD4B3,
+ 0x734D, 0xE2B0,
+ 0x7350, 0xE2AF,
+ 0x7352, 0xE9E1,
+ 0x7357, 0xE2B1,
+ 0x7360, 0xE2B2,
+ 0x736C, 0xE2B3,
+ 0x736D, 0xCCA1,
+ 0x736F, 0xE2B4,
+ 0x737E, 0xE2B5,
+ 0x7384, 0xD0FE,
+ 0x7387, 0xC2CA,
+ 0x7389, 0xD3F1,
+ 0x738B, 0xCDF5,
+ 0x738E, 0xE7E0,
+ 0x7391, 0xE7E1,
+ 0x7396, 0xBEC1,
+ 0x739B, 0xC2EA,
+ 0x739F, 0xE7E4,
+ 0x73A2, 0xE7E3,
+ 0x73A9, 0xCDE6,
+ 0x73AB, 0xC3B5,
+ 0x73AE, 0xE7E2,
+ 0x73AF, 0xBBB7,
+ 0x73B0, 0xCFD6,
+ 0x73B2, 0xC1E1,
+ 0x73B3, 0xE7E9,
+ 0x73B7, 0xE7E8,
+ 0x73BA, 0xE7F4,
+ 0x73BB, 0xB2A3,
+ 0x73C0, 0xE7EA,
+ 0x73C2, 0xE7E6,
+ 0x73C8, 0xE7EC,
+ 0x73C9, 0xE7EB,
+ 0x73CA, 0xC9BA,
+ 0x73CD, 0xD5E4,
+ 0x73CF, 0xE7E5,
+ 0x73D0, 0xB7A9,
+ 0x73D1, 0xE7E7,
+ 0x73D9, 0xE7EE,
+ 0x73DE, 0xE7F3,
+ 0x73E0, 0xD6E9,
+ 0x73E5, 0xE7ED,
+ 0x73E7, 0xE7F2,
+ 0x73E9, 0xE7F1,
+ 0x73ED, 0xB0E0,
+ 0x73F2, 0xE7F5,
+ 0x7403, 0xC7F2,
+ 0x7405, 0xC0C5,
+ 0x7406, 0xC0ED,
+ 0x7409, 0xC1F0,
+ 0x740A, 0xE7F0,
+ 0x740F, 0xE7F6,
+ 0x7410, 0xCBF6,
+ 0x741A, 0xE8A2,
+ 0x741B, 0xE8A1,
+ 0x7422, 0xD7C1,
+ 0x7425, 0xE7FA,
+ 0x7426, 0xE7F9,
+ 0x7428, 0xE7FB,
+ 0x742A, 0xE7F7,
+ 0x742C, 0xE7FE,
+ 0x742E, 0xE7FD,
+ 0x7430, 0xE7FC,
+ 0x7433, 0xC1D5,
+ 0x7434, 0xC7D9,
+ 0x7435, 0xC5FD,
+ 0x7436, 0xC5C3,
+ 0x743C, 0xC7ED,
+ 0x7441, 0xE8A3,
+ 0x7455, 0xE8A6,
+ 0x7457, 0xE8A5,
+ 0x7459, 0xE8A7,
+ 0x745A, 0xBAF7,
+ 0x745B, 0xE7F8,
+ 0x745C, 0xE8A4,
+ 0x745E, 0xC8F0,
+ 0x745F, 0xC9AA,
+ 0x746D, 0xE8A9,
+ 0x7470, 0xB9E5,
+ 0x7476, 0xD1FE,
+ 0x7477, 0xE8A8,
+ 0x747E, 0xE8AA,
+ 0x7480, 0xE8AD,
+ 0x7481, 0xE8AE,
+ 0x7483, 0xC1A7,
+ 0x7487, 0xE8AF,
+ 0x748B, 0xE8B0,
+ 0x748E, 0xE8AC,
+ 0x7490, 0xE8B4,
+ 0x749C, 0xE8AB,
+ 0x749E, 0xE8B1,
+ 0x74A7, 0xE8B5,
+ 0x74A8, 0xE8B2,
+ 0x74A9, 0xE8B3,
+ 0x74BA, 0xE8B7,
+ 0x74D2, 0xE8B6,
+ 0x74DC, 0xB9CF,
+ 0x74DE, 0xF0AC,
+ 0x74E0, 0xF0AD,
+ 0x74E2, 0xC6B0,
+ 0x74E3, 0xB0EA,
+ 0x74E4, 0xC8BF,
+ 0x74E6, 0xCDDF,
+ 0x74EE, 0xCECD,
+ 0x74EF, 0xEAB1,
+ 0x74F4, 0xEAB2,
+ 0x74F6, 0xC6BF,
+ 0x74F7, 0xB4C9,
+ 0x74FF, 0xEAB3,
+ 0x7504, 0xD5E7,
+ 0x750D, 0xDDF9,
+ 0x750F, 0xEAB4,
+ 0x7511, 0xEAB5,
+ 0x7513, 0xEAB6,
+ 0x7518, 0xB8CA,
+ 0x7519, 0xDFB0,
+ 0x751A, 0xC9F5,
+ 0x751C, 0xCCF0,
+ 0x751F, 0xC9FA,
+ 0x7525, 0xC9FB,
+ 0x7528, 0xD3C3,
+ 0x7529, 0xCBA6,
+ 0x752B, 0xB8A6,
+ 0x752C, 0xF0AE,
+ 0x752D, 0xB1C2,
+ 0x752F, 0xE5B8,
+ 0x7530, 0xCCEF,
+ 0x7531, 0xD3C9,
+ 0x7532, 0xBCD7,
+ 0x7533, 0xC9EA,
+ 0x7535, 0xB5E7,
+ 0x7537, 0xC4D0,
+ 0x7538, 0xB5E9,
+ 0x753A, 0xEEAE,
+ 0x753B, 0xBBAD,
+ 0x753E, 0xE7DE,
+ 0x7540, 0xEEAF,
+ 0x7545, 0xB3A9,
+ 0x7548, 0xEEB2,
+ 0x754B, 0xEEB1,
+ 0x754C, 0xBDE7,
+ 0x754E, 0xEEB0,
+ 0x754F, 0xCEB7,
+ 0x7554, 0xC5CF,
+ 0x7559, 0xC1F4,
+ 0x755A, 0xDBCE,
+ 0x755B, 0xEEB3,
+ 0x755C, 0xD0F3,
+ 0x7565, 0xC2D4,
+ 0x7566, 0xC6E8,
+ 0x756A, 0xB7AC,
+ 0x7572, 0xEEB4,
+ 0x7574, 0xB3EB,
+ 0x7578, 0xBBFB,
+ 0x7579, 0xEEB5,
+ 0x757F, 0xE7DC,
+ 0x7583, 0xEEB6,
+ 0x7586, 0xBDAE,
+ 0x758B, 0xF1E2,
+ 0x758F, 0xCAE8,
+ 0x7591, 0xD2C9,
+ 0x7592, 0xF0DA,
+ 0x7594, 0xF0DB,
+ 0x7596, 0xF0DC,
+ 0x7597, 0xC1C6,
+ 0x7599, 0xB8ED,
+ 0x759A, 0xBECE,
+ 0x759D, 0xF0DE,
+ 0x759F, 0xC5B1,
+ 0x75A0, 0xF0DD,
+ 0x75A1, 0xD1F1,
+ 0x75A3, 0xF0E0,
+ 0x75A4, 0xB0CC,
+ 0x75A5, 0xBDEA,
+ 0x75AB, 0xD2DF,
+ 0x75AC, 0xF0DF,
+ 0x75AE, 0xB4AF,
+ 0x75AF, 0xB7E8,
+ 0x75B0, 0xF0E6,
+ 0x75B1, 0xF0E5,
+ 0x75B2, 0xC6A3,
+ 0x75B3, 0xF0E1,
+ 0x75B4, 0xF0E2,
+ 0x75B5, 0xB4C3,
+ 0x75B8, 0xF0E3,
+ 0x75B9, 0xD5EE,
+ 0x75BC, 0xCCDB,
+ 0x75BD, 0xBED2,
+ 0x75BE, 0xBCB2,
+ 0x75C2, 0xF0E8,
+ 0x75C3, 0xF0E7,
+ 0x75C4, 0xF0E4,
+ 0x75C5, 0xB2A1,
+ 0x75C7, 0xD6A2,
+ 0x75C8, 0xD3B8,
+ 0x75C9, 0xBEB7,
+ 0x75CA, 0xC8AC,
+ 0x75CD, 0xF0EA,
+ 0x75D2, 0xD1F7,
+ 0x75D4, 0xD6CC,
+ 0x75D5, 0xBADB,
+ 0x75D6, 0xF0E9,
+ 0x75D8, 0xB6BB,
+ 0x75DB, 0xCDB4,
+ 0x75DE, 0xC6A6,
+ 0x75E2, 0xC1A1,
+ 0x75E3, 0xF0EB,
+ 0x75E4, 0xF0EE,
+ 0x75E6, 0xF0ED,
+ 0x75E7, 0xF0F0,
+ 0x75E8, 0xF0EC,
+ 0x75EA, 0xBBBE,
+ 0x75EB, 0xF0EF,
+ 0x75F0, 0xCCB5,
+ 0x75F1, 0xF0F2,
+ 0x75F4, 0xB3D5,
+ 0x75F9, 0xB1D4,
+ 0x75FC, 0xF0F3,
+ 0x75FF, 0xF0F4,
+ 0x7600, 0xF0F6,
+ 0x7601, 0xB4E1,
+ 0x7603, 0xF0F1,
+ 0x7605, 0xF0F7,
+ 0x760A, 0xF0FA,
+ 0x760C, 0xF0F8,
+ 0x7610, 0xF0F5,
+ 0x7615, 0xF0FD,
+ 0x7617, 0xF0F9,
+ 0x7618, 0xF0FC,
+ 0x7619, 0xF0FE,
+ 0x761B, 0xF1A1,
+ 0x761F, 0xCEC1,
+ 0x7620, 0xF1A4,
+ 0x7622, 0xF1A3,
+ 0x7624, 0xC1F6,
+ 0x7625, 0xF0FB,
+ 0x7626, 0xCADD,
+ 0x7629, 0xB4F1,
+ 0x762A, 0xB1F1,
+ 0x762B, 0xCCB1,
+ 0x762D, 0xF1A6,
+ 0x7630, 0xF1A7,
+ 0x7633, 0xF1AC,
+ 0x7634, 0xD5CE,
+ 0x7635, 0xF1A9,
+ 0x7638, 0xC8B3,
+ 0x763C, 0xF1A2,
+ 0x763E, 0xF1AB,
+ 0x763F, 0xF1A8,
+ 0x7640, 0xF1A5,
+ 0x7643, 0xF1AA,
+ 0x764C, 0xB0A9,
+ 0x764D, 0xF1AD,
+ 0x7654, 0xF1AF,
+ 0x7656, 0xF1B1,
+ 0x765C, 0xF1B0,
+ 0x765E, 0xF1AE,
+ 0x7663, 0xD1A2,
+ 0x766B, 0xF1B2,
+ 0x766F, 0xF1B3,
+ 0x7678, 0xB9EF,
+ 0x767B, 0xB5C7,
+ 0x767D, 0xB0D7,
+ 0x767E, 0xB0D9,
+ 0x7682, 0xD4ED,
+ 0x7684, 0xB5C4,
+ 0x7686, 0xBDD4,
+ 0x7687, 0xBBCA,
+ 0x7688, 0xF0A7,
+ 0x768B, 0xB8DE,
+ 0x768E, 0xF0A8,
+ 0x7691, 0xB0A8,
+ 0x7693, 0xF0A9,
+ 0x7696, 0xCDEE,
+ 0x7699, 0xF0AA,
+ 0x76A4, 0xF0AB,
+ 0x76AE, 0xC6A4,
+ 0x76B1, 0xD6E5,
+ 0x76B2, 0xF1E4,
+ 0x76B4, 0xF1E5,
+ 0x76BF, 0xC3F3,
+ 0x76C2, 0xD3DB,
+ 0x76C5, 0xD6D1,
+ 0x76C6, 0xC5E8,
+ 0x76C8, 0xD3AF,
+ 0x76CA, 0xD2E6,
+ 0x76CD, 0xEEC1,
+ 0x76CE, 0xB0BB,
+ 0x76CF, 0xD5B5,
+ 0x76D0, 0xD1CE,
+ 0x76D1, 0xBCE0,
+ 0x76D2, 0xBAD0,
+ 0x76D4, 0xBFF8,
+ 0x76D6, 0xB8C7,
+ 0x76D7, 0xB5C1,
+ 0x76D8, 0xC5CC,
+ 0x76DB, 0xCAA2,
+ 0x76DF, 0xC3CB,
+ 0x76E5, 0xEEC2,
+ 0x76EE, 0xC4BF,
+ 0x76EF, 0xB6A2,
+ 0x76F1, 0xEDEC,
+ 0x76F2, 0xC3A4,
+ 0x76F4, 0xD6B1,
+ 0x76F8, 0xCFE0,
+ 0x76F9, 0xEDEF,
+ 0x76FC, 0xC5CE,
+ 0x76FE, 0xB6DC,
+ 0x7701, 0xCAA1,
+ 0x7704, 0xEDED,
+ 0x7707, 0xEDF0,
+ 0x7708, 0xEDF1,
+ 0x7709, 0xC3BC,
+ 0x770B, 0xBFB4,
+ 0x770D, 0xEDEE,
+ 0x7719, 0xEDF4,
+ 0x771A, 0xEDF2,
+ 0x771F, 0xD5E6,
+ 0x7720, 0xC3DF,
+ 0x7722, 0xEDF3,
+ 0x7726, 0xEDF6,
+ 0x7728, 0xD5A3,
+ 0x7729, 0xD1A3,
+ 0x772D, 0xEDF5,
+ 0x772F, 0xC3D0,
+ 0x7735, 0xEDF7,
+ 0x7736, 0xBFF4,
+ 0x7737, 0xBEEC,
+ 0x7738, 0xEDF8,
+ 0x773A, 0xCCF7,
+ 0x773C, 0xD1DB,
+ 0x7740, 0xD7C5,
+ 0x7741, 0xD5F6,
+ 0x7743, 0xEDFC,
+ 0x7747, 0xEDFB,
+ 0x7750, 0xEDF9,
+ 0x7751, 0xEDFA,
+ 0x775A, 0xEDFD,
+ 0x775B, 0xBEA6,
+ 0x7761, 0xCBAF,
+ 0x7762, 0xEEA1,
+ 0x7763, 0xB6BD,
+ 0x7765, 0xEEA2,
+ 0x7766, 0xC4C0,
+ 0x7768, 0xEDFE,
+ 0x776B, 0xBDDE,
+ 0x776C, 0xB2C7,
+ 0x7779, 0xB6C3,
+ 0x777D, 0xEEA5,
+ 0x777E, 0xD8BA,
+ 0x777F, 0xEEA3,
+ 0x7780, 0xEEA6,
+ 0x7784, 0xC3E9,
+ 0x7785, 0xB3F2,
+ 0x778C, 0xEEA7,
+ 0x778D, 0xEEA4,
+ 0x778E, 0xCFB9,
+ 0x7791, 0xEEA8,
+ 0x7792, 0xC2F7,
+ 0x779F, 0xEEA9,
+ 0x77A0, 0xEEAA,
+ 0x77A2, 0xDEAB,
+ 0x77A5, 0xC6B3,
+ 0x77A7, 0xC7C6,
+ 0x77A9, 0xD6F5,
+ 0x77AA, 0xB5C9,
+ 0x77AC, 0xCBB2,
+ 0x77B0, 0xEEAB,
+ 0x77B3, 0xCDAB,
+ 0x77B5, 0xEEAC,
+ 0x77BB, 0xD5B0,
+ 0x77BD, 0xEEAD,
+ 0x77BF, 0xF6C4,
+ 0x77CD, 0xDBC7,
+ 0x77D7, 0xB4A3,
+ 0x77DB, 0xC3AC,
+ 0x77DC, 0xF1E6,
+ 0x77E2, 0xCAB8,
+ 0x77E3, 0xD2D3,
+ 0x77E5, 0xD6AA,
+ 0x77E7, 0xEFF2,
+ 0x77E9, 0xBED8,
+ 0x77EB, 0xBDC3,
+ 0x77EC, 0xEFF3,
+ 0x77ED, 0xB6CC,
+ 0x77EE, 0xB0AB,
+ 0x77F3, 0xCAAF,
+ 0x77F6, 0xEDB6,
+ 0x77F8, 0xEDB7,
+ 0x77FD, 0xCEF9,
+ 0x77FE, 0xB7AF,
+ 0x77FF, 0xBFF3,
+ 0x7800, 0xEDB8,
+ 0x7801, 0xC2EB,
+ 0x7802, 0xC9B0,
+ 0x7809, 0xEDB9,
+ 0x780C, 0xC6F6,
+ 0x780D, 0xBFB3,
+ 0x7811, 0xEDBC,
+ 0x7812, 0xC5F8,
+ 0x7814, 0xD1D0,
+ 0x7816, 0xD7A9,
+ 0x7817, 0xEDBA,
+ 0x7818, 0xEDBB,
+ 0x781A, 0xD1E2,
+ 0x781C, 0xEDBF,
+ 0x781D, 0xEDC0,
+ 0x781F, 0xEDC4,
+ 0x7823, 0xEDC8,
+ 0x7825, 0xEDC6,
+ 0x7826, 0xEDCE,
+ 0x7827, 0xD5E8,
+ 0x7829, 0xEDC9,
+ 0x782C, 0xEDC7,
+ 0x782D, 0xEDBE,
+ 0x7830, 0xC5E9,
+ 0x7834, 0xC6C6,
+ 0x7837, 0xC9E9,
+ 0x7838, 0xD4D2,
+ 0x7839, 0xEDC1,
+ 0x783A, 0xEDC2,
+ 0x783B, 0xEDC3,
+ 0x783C, 0xEDC5,
+ 0x783E, 0xC0F9,
+ 0x7840, 0xB4A1,
+ 0x7845, 0xB9E8,
+ 0x7847, 0xEDD0,
+ 0x784C, 0xEDD1,
+ 0x784E, 0xEDCA,
+ 0x7850, 0xEDCF,
+ 0x7852, 0xCEF8,
+ 0x7855, 0xCBB6,
+ 0x7856, 0xEDCC,
+ 0x7857, 0xEDCD,
+ 0x785D, 0xCFF5,
+ 0x786A, 0xEDD2,
+ 0x786B, 0xC1F2,
+ 0x786C, 0xD3B2,
+ 0x786D, 0xEDCB,
+ 0x786E, 0xC8B7,
+ 0x7877, 0xBCEF,
+ 0x787C, 0xC5F0,
+ 0x7887, 0xEDD6,
+ 0x7889, 0xB5EF,
+ 0x788C, 0xC2B5,
+ 0x788D, 0xB0AD,
+ 0x788E, 0xCBE9,
+ 0x7891, 0xB1AE,
+ 0x7893, 0xEDD4,
+ 0x7897, 0xCDEB,
+ 0x7898, 0xB5E2,
+ 0x789A, 0xEDD5,
+ 0x789B, 0xEDD3,
+ 0x789C, 0xEDD7,
+ 0x789F, 0xB5FA,
+ 0x78A1, 0xEDD8,
+ 0x78A3, 0xEDD9,
+ 0x78A5, 0xEDDC,
+ 0x78A7, 0xB1CC,
+ 0x78B0, 0xC5F6,
+ 0x78B1, 0xBCEE,
+ 0x78B2, 0xEDDA,
+ 0x78B3, 0xCCBC,
+ 0x78B4, 0xB2EA,
+ 0x78B9, 0xEDDB,
+ 0x78BE, 0xC4EB,
+ 0x78C1, 0xB4C5,
+ 0x78C5, 0xB0F5,
+ 0x78C9, 0xEDDF,
+ 0x78CA, 0xC0DA,
+ 0x78CB, 0xB4E8,
+ 0x78D0, 0xC5CD,
+ 0x78D4, 0xEDDD,
+ 0x78D5, 0xBFC4,
+ 0x78D9, 0xEDDE,
+ 0x78E8, 0xC4A5,
+ 0x78EC, 0xEDE0,
+ 0x78F2, 0xEDE1,
+ 0x78F4, 0xEDE3,
+ 0x78F7, 0xC1D7,
+ 0x78FA, 0xBBC7,
+ 0x7901, 0xBDB8,
+ 0x7905, 0xEDE2,
+ 0x7913, 0xEDE4,
+ 0x791E, 0xEDE6,
+ 0x7924, 0xEDE5,
+ 0x7934, 0xEDE7,
+ 0x793A, 0xCABE,
+ 0x793B, 0xECEA,
+ 0x793C, 0xC0F1,
+ 0x793E, 0xC9E7,
+ 0x7940, 0xECEB,
+ 0x7941, 0xC6EE,
+ 0x7946, 0xECEC,
+ 0x7948, 0xC6ED,
+ 0x7949, 0xECED,
+ 0x7953, 0xECF0,
+ 0x7956, 0xD7E6,
+ 0x7957, 0xECF3,
+ 0x795A, 0xECF1,
+ 0x795B, 0xECEE,
+ 0x795C, 0xECEF,
+ 0x795D, 0xD7A3,
+ 0x795E, 0xC9F1,
+ 0x795F, 0xCBEE,
+ 0x7960, 0xECF4,
+ 0x7962, 0xECF2,
+ 0x7965, 0xCFE9,
+ 0x7967, 0xECF6,
+ 0x7968, 0xC6B1,
+ 0x796D, 0xBCC0,
+ 0x796F, 0xECF5,
+ 0x7977, 0xB5BB,
+ 0x7978, 0xBBF6,
+ 0x797A, 0xECF7,
+ 0x7980, 0xD9F7,
+ 0x7981, 0xBDFB,
+ 0x7984, 0xC2BB,
+ 0x7985, 0xECF8,
+ 0x798A, 0xECF9,
+ 0x798F, 0xB8A3,
+ 0x799A, 0xECFA,
+ 0x79A7, 0xECFB,
+ 0x79B3, 0xECFC,
+ 0x79B9, 0xD3ED,
+ 0x79BA, 0xD8AE,
+ 0x79BB, 0xC0EB,
+ 0x79BD, 0xC7DD,
+ 0x79BE, 0xBACC,
+ 0x79C0, 0xD0E3,
+ 0x79C1, 0xCBBD,
+ 0x79C3, 0xCDBA,
+ 0x79C6, 0xB8D1,
+ 0x79C9, 0xB1FC,
+ 0x79CB, 0xC7EF,
+ 0x79CD, 0xD6D6,
+ 0x79D1, 0xBFC6,
+ 0x79D2, 0xC3EB,
+ 0x79D5, 0xEFF5,
+ 0x79D8, 0xC3D8,
+ 0x79DF, 0xD7E2,
+ 0x79E3, 0xEFF7,
+ 0x79E4, 0xB3D3,
+ 0x79E6, 0xC7D8,
+ 0x79E7, 0xD1ED,
+ 0x79E9, 0xD6C8,
+ 0x79EB, 0xEFF8,
+ 0x79ED, 0xEFF6,
+ 0x79EF, 0xBBFD,
+ 0x79F0, 0xB3C6,
+ 0x79F8, 0xBDD5,
+ 0x79FB, 0xD2C6,
+ 0x79FD, 0xBBE0,
+ 0x7A00, 0xCFA1,
+ 0x7A02, 0xEFFC,
+ 0x7A03, 0xEFFB,
+ 0x7A06, 0xEFF9,
+ 0x7A0B, 0xB3CC,
+ 0x7A0D, 0xC9D4,
+ 0x7A0E, 0xCBB0,
+ 0x7A14, 0xEFFE,
+ 0x7A17, 0xB0DE,
+ 0x7A1A, 0xD6C9,
+ 0x7A1E, 0xEFFD,
+ 0x7A20, 0xB3ED,
+ 0x7A23, 0xF6D5,
+ 0x7A33, 0xCEC8,
+ 0x7A37, 0xF0A2,
+ 0x7A39, 0xF0A1,
+ 0x7A3B, 0xB5BE,
+ 0x7A3C, 0xBCDA,
+ 0x7A3D, 0xBBFC,
+ 0x7A3F, 0xB8E5,
+ 0x7A46, 0xC4C2,
+ 0x7A51, 0xF0A3,
+ 0x7A57, 0xCBEB,
+ 0x7A70, 0xF0A6,
+ 0x7A74, 0xD1A8,
+ 0x7A76, 0xBEBF,
+ 0x7A77, 0xC7EE,
+ 0x7A78, 0xF1B6,
+ 0x7A79, 0xF1B7,
+ 0x7A7A, 0xBFD5,
+ 0x7A7F, 0xB4A9,
+ 0x7A80, 0xF1B8,
+ 0x7A81, 0xCDBB,
+ 0x7A83, 0xC7D4,
+ 0x7A84, 0xD5AD,
+ 0x7A86, 0xF1B9,
+ 0x7A88, 0xF1BA,
+ 0x7A8D, 0xC7CF,
+ 0x7A91, 0xD2A4,
+ 0x7A92, 0xD6CF,
+ 0x7A95, 0xF1BB,
+ 0x7A96, 0xBDD1,
+ 0x7A97, 0xB4B0,
+ 0x7A98, 0xBEBD,
+ 0x7A9C, 0xB4DC,
+ 0x7A9D, 0xCED1,
+ 0x7A9F, 0xBFDF,
+ 0x7AA0, 0xF1BD,
+ 0x7AA5, 0xBFFA,
+ 0x7AA6, 0xF1BC,
+ 0x7AA8, 0xF1BF,
+ 0x7AAC, 0xF1BE,
+ 0x7AAD, 0xF1C0,
+ 0x7AB3, 0xF1C1,
+ 0x7ABF, 0xC1FE,
+ 0x7ACB, 0xC1A2,
+ 0x7AD6, 0xCAFA,
+ 0x7AD9, 0xD5BE,
+ 0x7ADE, 0xBEBA,
+ 0x7ADF, 0xBEB9,
+ 0x7AE0, 0xD5C2,
+ 0x7AE3, 0xBFA2,
+ 0x7AE5, 0xCDAF,
+ 0x7AE6, 0xF1B5,
+ 0x7AED, 0xBDDF,
+ 0x7AEF, 0xB6CB,
+ 0x7AF9, 0xD6F1,
+ 0x7AFA, 0xF3C3,
+ 0x7AFD, 0xF3C4,
+ 0x7AFF, 0xB8CD,
+ 0x7B03, 0xF3C6,
+ 0x7B04, 0xF3C7,
+ 0x7B06, 0xB0CA,
+ 0x7B08, 0xF3C5,
+ 0x7B0A, 0xF3C9,
+ 0x7B0B, 0xCBF1,
+ 0x7B0F, 0xF3CB,
+ 0x7B11, 0xD0A6,
+ 0x7B14, 0xB1CA,
+ 0x7B15, 0xF3C8,
+ 0x7B19, 0xF3CF,
+ 0x7B1B, 0xB5D1,
+ 0x7B1E, 0xF3D7,
+ 0x7B20, 0xF3D2,
+ 0x7B24, 0xF3D4,
+ 0x7B25, 0xF3D3,
+ 0x7B26, 0xB7FB,
+ 0x7B28, 0xB1BF,
+ 0x7B2A, 0xF3CE,
+ 0x7B2B, 0xF3CA,
+ 0x7B2C, 0xB5DA,
+ 0x7B2E, 0xF3D0,
+ 0x7B31, 0xF3D1,
+ 0x7B33, 0xF3D5,
+ 0x7B38, 0xF3CD,
+ 0x7B3A, 0xBCE3,
+ 0x7B3C, 0xC1FD,
+ 0x7B3E, 0xF3D6,
+ 0x7B45, 0xF3DA,
+ 0x7B47, 0xF3CC,
+ 0x7B49, 0xB5C8,
+ 0x7B4B, 0xBDEE,
+ 0x7B4C, 0xF3DC,
+ 0x7B4F, 0xB7A4,
+ 0x7B50, 0xBFF0,
+ 0x7B51, 0xD6FE,
+ 0x7B52, 0xCDB2,
+ 0x7B54, 0xB4F0,
+ 0x7B56, 0xB2DF,
+ 0x7B58, 0xF3D8,
+ 0x7B5A, 0xF3D9,
+ 0x7B5B, 0xC9B8,
+ 0x7B5D, 0xF3DD,
+ 0x7B60, 0xF3DE,
+ 0x7B62, 0xF3E1,
+ 0x7B6E, 0xF3DF,
+ 0x7B71, 0xF3E3,
+ 0x7B72, 0xF3E2,
+ 0x7B75, 0xF3DB,
+ 0x7B77, 0xBFEA,
+ 0x7B79, 0xB3EF,
+ 0x7B7B, 0xF3E0,
+ 0x7B7E, 0xC7A9,
+ 0x7B80, 0xBCF2,
+ 0x7B85, 0xF3EB,
+ 0x7B8D, 0xB9BF,
+ 0x7B90, 0xF3E4,
+ 0x7B94, 0xB2AD,
+ 0x7B95, 0xBBFE,
+ 0x7B97, 0xCBE3,
+ 0x7B9C, 0xF3ED,
+ 0x7B9D, 0xF3E9,
+ 0x7BA1, 0xB9DC,
+ 0x7BA2, 0xF3EE,
+ 0x7BA6, 0xF3E5,
+ 0x7BA7, 0xF3E6,
+ 0x7BA8, 0xF3EA,
+ 0x7BA9, 0xC2E1,
+ 0x7BAA, 0xF3EC,
+ 0x7BAB, 0xF3EF,
+ 0x7BAC, 0xF3E8,
+ 0x7BAD, 0xBCFD,
+ 0x7BB1, 0xCFE4,
+ 0x7BB4, 0xF3F0,
+ 0x7BB8, 0xF3E7,
+ 0x7BC1, 0xF3F2,
+ 0x7BC6, 0xD7AD,
+ 0x7BC7, 0xC6AA,
+ 0x7BCC, 0xF3F3,
+ 0x7BD1, 0xF3F1,
+ 0x7BD3, 0xC2A8,
+ 0x7BD9, 0xB8DD,
+ 0x7BDA, 0xF3F5,
+ 0x7BDD, 0xF3F4,
+ 0x7BE1, 0xB4DB,
+ 0x7BE5, 0xF3F6,
+ 0x7BE6, 0xF3F7,
+ 0x7BEA, 0xF3F8,
+ 0x7BEE, 0xC0BA,
+ 0x7BF1, 0xC0E9,
+ 0x7BF7, 0xC5F1,
+ 0x7BFC, 0xF3FB,
+ 0x7BFE, 0xF3FA,
+ 0x7C07, 0xB4D8,
+ 0x7C0B, 0xF3FE,
+ 0x7C0C, 0xF3F9,
+ 0x7C0F, 0xF3FC,
+ 0x7C16, 0xF3FD,
+ 0x7C1F, 0xF4A1,
+ 0x7C26, 0xF4A3,
+ 0x7C27, 0xBBC9,
+ 0x7C2A, 0xF4A2,
+ 0x7C38, 0xF4A4,
+ 0x7C3F, 0xB2BE,
+ 0x7C40, 0xF4A6,
+ 0x7C41, 0xF4A5,
+ 0x7C4D, 0xBCAE,
+ 0x7C73, 0xC3D7,
+ 0x7C74, 0xD9E1,
+ 0x7C7B, 0xC0E0,
+ 0x7C7C, 0xF4CC,
+ 0x7C7D, 0xD7D1,
+ 0x7C89, 0xB7DB,
+ 0x7C91, 0xF4CE,
+ 0x7C92, 0xC1A3,
+ 0x7C95, 0xC6C9,
+ 0x7C97, 0xB4D6,
+ 0x7C98, 0xD5B3,
+ 0x7C9C, 0xF4D0,
+ 0x7C9D, 0xF4CF,
+ 0x7C9E, 0xF4D1,
+ 0x7C9F, 0xCBDA,
+ 0x7CA2, 0xF4D2,
+ 0x7CA4, 0xD4C1,
+ 0x7CA5, 0xD6E0,
+ 0x7CAA, 0xB7E0,
+ 0x7CAE, 0xC1B8,
+ 0x7CB1, 0xC1BB,
+ 0x7CB2, 0xF4D3,
+ 0x7CB3, 0xBEAC,
+ 0x7CB9, 0xB4E2,
+ 0x7CBC, 0xF4D4,
+ 0x7CBD, 0xF4D5,
+ 0x7CBE, 0xBEAB,
+ 0x7CC1, 0xF4D6,
+ 0x7CC5, 0xF4DB,
+ 0x7CC7, 0xF4D7,
+ 0x7CC8, 0xF4DA,
+ 0x7CCA, 0xBAFD,
+ 0x7CCC, 0xF4D8,
+ 0x7CCD, 0xF4D9,
+ 0x7CD5, 0xB8E2,
+ 0x7CD6, 0xCCC7,
+ 0x7CD7, 0xF4DC,
+ 0x7CD9, 0xB2DA,
+ 0x7CDC, 0xC3D3,
+ 0x7CDF, 0xD4E3,
+ 0x7CE0, 0xBFB7,
+ 0x7CE8, 0xF4DD,
+ 0x7CEF, 0xC5B4,
+ 0x7CF8, 0xF4E9,
+ 0x7CFB, 0xCFB5,
+ 0x7D0A, 0xCEC9,
+ 0x7D20, 0xCBD8,
+ 0x7D22, 0xCBF7,
+ 0x7D27, 0xBDF4,
+ 0x7D2B, 0xD7CF,
+ 0x7D2F, 0xC0DB,
+ 0x7D6E, 0xD0F5,
+ 0x7D77, 0xF4EA,
+ 0x7DA6, 0xF4EB,
+ 0x7DAE, 0xF4EC,
+ 0x7E3B, 0xF7E3,
+ 0x7E41, 0xB7B1,
+ 0x7E47, 0xF4ED,
+ 0x7E82, 0xD7EB,
+ 0x7E9B, 0xF4EE,
+ 0x7E9F, 0xE6F9,
+ 0x7EA0, 0xBEC0,
+ 0x7EA1, 0xE6FA,
+ 0x7EA2, 0xBAEC,
+ 0x7EA3, 0xE6FB,
+ 0x7EA4, 0xCFCB,
+ 0x7EA5, 0xE6FC,
+ 0x7EA6, 0xD4BC,
+ 0x7EA7, 0xBCB6,
+ 0x7EA8, 0xE6FD,
+ 0x7EA9, 0xE6FE,
+ 0x7EAA, 0xBCCD,
+ 0x7EAB, 0xC8D2,
+ 0x7EAC, 0xCEB3,
+ 0x7EAD, 0xE7A1,
+ 0x7EAF, 0xB4BF,
+ 0x7EB0, 0xE7A2,
+ 0x7EB1, 0xC9B4,
+ 0x7EB2, 0xB8D9,
+ 0x7EB3, 0xC4C9,
+ 0x7EB5, 0xD7DD,
+ 0x7EB6, 0xC2DA,
+ 0x7EB7, 0xB7D7,
+ 0x7EB8, 0xD6BD,
+ 0x7EB9, 0xCEC6,
+ 0x7EBA, 0xB7C4,
+ 0x7EBD, 0xC5A6,
+ 0x7EBE, 0xE7A3,
+ 0x7EBF, 0xCFDF,
+ 0x7EC0, 0xE7A4,
+ 0x7EC1, 0xE7A5,
+ 0x7EC2, 0xE7A6,
+ 0x7EC3, 0xC1B7,
+ 0x7EC4, 0xD7E9,
+ 0x7EC5, 0xC9F0,
+ 0x7EC6, 0xCFB8,
+ 0x7EC7, 0xD6AF,
+ 0x7EC8, 0xD6D5,
+ 0x7EC9, 0xE7A7,
+ 0x7ECA, 0xB0ED,
+ 0x7ECB, 0xE7A8,
+ 0x7ECC, 0xE7A9,
+ 0x7ECD, 0xC9DC,
+ 0x7ECE, 0xD2EF,
+ 0x7ECF, 0xBEAD,
+ 0x7ED0, 0xE7AA,
+ 0x7ED1, 0xB0F3,
+ 0x7ED2, 0xC8DE,
+ 0x7ED3, 0xBDE1,
+ 0x7ED4, 0xE7AB,
+ 0x7ED5, 0xC8C6,
+ 0x7ED7, 0xE7AC,
+ 0x7ED8, 0xBBE6,
+ 0x7ED9, 0xB8F8,
+ 0x7EDA, 0xD1A4,
+ 0x7EDB, 0xE7AD,
+ 0x7EDC, 0xC2E7,
+ 0x7EDD, 0xBEF8,
+ 0x7EDE, 0xBDCA,
+ 0x7EDF, 0xCDB3,
+ 0x7EE0, 0xE7AE,
+ 0x7EE1, 0xE7AF,
+ 0x7EE2, 0xBEEE,
+ 0x7EE3, 0xD0E5,
+ 0x7EE5, 0xCBE7,
+ 0x7EE6, 0xCCD0,
+ 0x7EE7, 0xBCCC,
+ 0x7EE8, 0xE7B0,
+ 0x7EE9, 0xBCA8,
+ 0x7EEA, 0xD0F7,
+ 0x7EEB, 0xE7B1,
+ 0x7EED, 0xD0F8,
+ 0x7EEE, 0xE7B2,
+ 0x7EEF, 0xE7B3,
+ 0x7EF0, 0xB4C2,
+ 0x7EF1, 0xE7B4,
+ 0x7EF2, 0xE7B5,
+ 0x7EF3, 0xC9FE,
+ 0x7EF4, 0xCEAC,
+ 0x7EF5, 0xC3E0,
+ 0x7EF6, 0xE7B7,
+ 0x7EF7, 0xB1C1,
+ 0x7EF8, 0xB3F1,
+ 0x7EFA, 0xE7B8,
+ 0x7EFB, 0xE7B9,
+ 0x7EFC, 0xD7DB,
+ 0x7EFD, 0xD5C0,
+ 0x7EFE, 0xE7BA,
+ 0x7EFF, 0xC2CC,
+ 0x7F00, 0xD7BA,
+ 0x7F01, 0xE7BB,
+ 0x7F02, 0xE7BC,
+ 0x7F03, 0xE7BD,
+ 0x7F04, 0xBCEA,
+ 0x7F05, 0xC3E5,
+ 0x7F06, 0xC0C2,
+ 0x7F07, 0xE7BE,
+ 0x7F08, 0xE7BF,
+ 0x7F09, 0xBCA9,
+ 0x7F0B, 0xE7C0,
+ 0x7F0C, 0xE7C1,
+ 0x7F0D, 0xE7B6,
+ 0x7F0E, 0xB6D0,
+ 0x7F0F, 0xE7C2,
+ 0x7F11, 0xE7C3,
+ 0x7F12, 0xE7C4,
+ 0x7F13, 0xBBBA,
+ 0x7F14, 0xB5DE,
+ 0x7F15, 0xC2C6,
+ 0x7F16, 0xB1E0,
+ 0x7F17, 0xE7C5,
+ 0x7F18, 0xD4B5,
+ 0x7F19, 0xE7C6,
+ 0x7F1A, 0xB8BF,
+ 0x7F1B, 0xE7C8,
+ 0x7F1C, 0xE7C7,
+ 0x7F1D, 0xB7EC,
+ 0x7F1F, 0xE7C9,
+ 0x7F20, 0xB2F8,
+ 0x7F21, 0xE7CA,
+ 0x7F22, 0xE7CB,
+ 0x7F23, 0xE7CC,
+ 0x7F24, 0xE7CD,
+ 0x7F25, 0xE7CE,
+ 0x7F26, 0xE7CF,
+ 0x7F27, 0xE7D0,
+ 0x7F28, 0xD3A7,
+ 0x7F29, 0xCBF5,
+ 0x7F2A, 0xE7D1,
+ 0x7F2B, 0xE7D2,
+ 0x7F2C, 0xE7D3,
+ 0x7F2D, 0xE7D4,
+ 0x7F2E, 0xC9C9,
+ 0x7F2F, 0xE7D5,
+ 0x7F30, 0xE7D6,
+ 0x7F31, 0xE7D7,
+ 0x7F32, 0xE7D8,
+ 0x7F33, 0xE7D9,
+ 0x7F34, 0xBDC9,
+ 0x7F35, 0xE7DA,
+ 0x7F36, 0xF3BE,
+ 0x7F38, 0xB8D7,
+ 0x7F3A, 0xC8B1,
+ 0x7F42, 0xF3BF,
+ 0x7F44, 0xF3C0,
+ 0x7F45, 0xF3C1,
+ 0x7F50, 0xB9DE,
+ 0x7F51, 0xCDF8,
+ 0x7F54, 0xD8E8,
+ 0x7F55, 0xBAB1,
+ 0x7F57, 0xC2DE,
+ 0x7F58, 0xEEB7,
+ 0x7F5A, 0xB7A3,
+ 0x7F5F, 0xEEB9,
+ 0x7F61, 0xEEB8,
+ 0x7F62, 0xB0D5,
+ 0x7F68, 0xEEBB,
+ 0x7F69, 0xD5D6,
+ 0x7F6A, 0xD7EF,
+ 0x7F6E, 0xD6C3,
+ 0x7F71, 0xEEBD,
+ 0x7F72, 0xCAF0,
+ 0x7F74, 0xEEBC,
+ 0x7F79, 0xEEBE,
+ 0x7F7E, 0xEEC0,
+ 0x7F81, 0xEEBF,
+ 0x7F8A, 0xD1F2,
+ 0x7F8C, 0xC7BC,
+ 0x7F8E, 0xC3C0,
+ 0x7F94, 0xB8E1,
+ 0x7F9A, 0xC1E7,
+ 0x7F9D, 0xF4C6,
+ 0x7F9E, 0xD0DF,
+ 0x7F9F, 0xF4C7,
+ 0x7FA1, 0xCFDB,
+ 0x7FA4, 0xC8BA,
+ 0x7FA7, 0xF4C8,
+ 0x7FAF, 0xF4C9,
+ 0x7FB0, 0xF4CA,
+ 0x7FB2, 0xF4CB,
+ 0x7FB8, 0xD9FA,
+ 0x7FB9, 0xB8FE,
+ 0x7FBC, 0xE5F1,
+ 0x7FBD, 0xD3F0,
+ 0x7FBF, 0xF4E0,
+ 0x7FC1, 0xCECC,
+ 0x7FC5, 0xB3E1,
+ 0x7FCA, 0xF1B4,
+ 0x7FCC, 0xD2EE,
+ 0x7FCE, 0xF4E1,
+ 0x7FD4, 0xCFE8,
+ 0x7FD5, 0xF4E2,
+ 0x7FD8, 0xC7CC,
+ 0x7FDF, 0xB5D4,
+ 0x7FE0, 0xB4E4,
+ 0x7FE1, 0xF4E4,
+ 0x7FE5, 0xF4E3,
+ 0x7FE6, 0xF4E5,
+ 0x7FE9, 0xF4E6,
+ 0x7FEE, 0xF4E7,
+ 0x7FF0, 0xBAB2,
+ 0x7FF1, 0xB0BF,
+ 0x7FF3, 0xF4E8,
+ 0x7FFB, 0xB7AD,
+ 0x7FFC, 0xD2ED,
+ 0x8000, 0xD2AB,
+ 0x8001, 0xC0CF,
+ 0x8003, 0xBFBC,
+ 0x8004, 0xEBA3,
+ 0x8005, 0xD5DF,
+ 0x8006, 0xEAC8,
+ 0x800B, 0xF1F3,
+ 0x800C, 0xB6F8,
+ 0x800D, 0xCBA3,
+ 0x8010, 0xC4CD,
+ 0x8012, 0xF1E7,
+ 0x8014, 0xF1E8,
+ 0x8015, 0xB8FB,
+ 0x8016, 0xF1E9,
+ 0x8017, 0xBAC4,
+ 0x8018, 0xD4C5,
+ 0x8019, 0xB0D2,
+ 0x801C, 0xF1EA,
+ 0x8020, 0xF1EB,
+ 0x8022, 0xF1EC,
+ 0x8025, 0xF1ED,
+ 0x8026, 0xF1EE,
+ 0x8027, 0xF1EF,
+ 0x8028, 0xF1F1,
+ 0x8029, 0xF1F0,
+ 0x802A, 0xC5D5,
+ 0x8031, 0xF1F2,
+ 0x8033, 0xB6FA,
+ 0x8035, 0xF1F4,
+ 0x8036, 0xD2AE,
+ 0x8037, 0xDEC7,
+ 0x8038, 0xCBCA,
+ 0x803B, 0xB3DC,
+ 0x803D, 0xB5A2,
+ 0x803F, 0xB9A2,
+ 0x8042, 0xC4F4,
+ 0x8043, 0xF1F5,
+ 0x8046, 0xF1F6,
+ 0x804A, 0xC1C4,
+ 0x804B, 0xC1FB,
+ 0x804C, 0xD6B0,
+ 0x804D, 0xF1F7,
+ 0x8052, 0xF1F8,
+ 0x8054, 0xC1AA,
+ 0x8058, 0xC6B8,
+ 0x805A, 0xBEDB,
+ 0x8069, 0xF1F9,
+ 0x806A, 0xB4CF,
+ 0x8071, 0xF1FA,
+ 0x807F, 0xEDB2,
+ 0x8080, 0xEDB1,
+ 0x8083, 0xCBE0,
+ 0x8084, 0xD2DE,
+ 0x8086, 0xCBC1,
+ 0x8087, 0xD5D8,
+ 0x8089, 0xC8E2,
+ 0x808B, 0xC0DF,
+ 0x808C, 0xBCA1,
+ 0x8093, 0xEBC1,
+ 0x8096, 0xD0A4,
+ 0x8098, 0xD6E2,
+ 0x809A, 0xB6C7,
+ 0x809B, 0xB8D8,
+ 0x809C, 0xEBC0,
+ 0x809D, 0xB8CE,
+ 0x809F, 0xEBBF,
+ 0x80A0, 0xB3A6,
+ 0x80A1, 0xB9C9,
+ 0x80A2, 0xD6AB,
+ 0x80A4, 0xB7F4,
+ 0x80A5, 0xB7CA,
+ 0x80A9, 0xBCE7,
+ 0x80AA, 0xB7BE,
+ 0x80AB, 0xEBC6,
+ 0x80AD, 0xEBC7,
+ 0x80AE, 0xB0B9,
+ 0x80AF, 0xBFCF,
+ 0x80B1, 0xEBC5,
+ 0x80B2, 0xD3FD,
+ 0x80B4, 0xEBC8,
+ 0x80B7, 0xEBC9,
+ 0x80BA, 0xB7CE,
+ 0x80BC, 0xEBC2,
+ 0x80BD, 0xEBC4,
+ 0x80BE, 0xC9F6,
+ 0x80BF, 0xD6D7,
+ 0x80C0, 0xD5CD,
+ 0x80C1, 0xD0B2,
+ 0x80C2, 0xEBCF,
+ 0x80C3, 0xCEB8,
+ 0x80C4, 0xEBD0,
+ 0x80C6, 0xB5A8,
+ 0x80CC, 0xB1B3,
+ 0x80CD, 0xEBD2,
+ 0x80CE, 0xCCA5,
+ 0x80D6, 0xC5D6,
+ 0x80D7, 0xEBD3,
+ 0x80D9, 0xEBD1,
+ 0x80DA, 0xC5DF,
+ 0x80DB, 0xEBCE,
+ 0x80DC, 0xCAA4,
+ 0x80DD, 0xEBD5,
+ 0x80DE, 0xB0FB,
+ 0x80E1, 0xBAFA,
+ 0x80E4, 0xD8B7,
+ 0x80E5, 0xF1E3,
+ 0x80E7, 0xEBCA,
+ 0x80E8, 0xEBCB,
+ 0x80E9, 0xEBCC,
+ 0x80EA, 0xEBCD,
+ 0x80EB, 0xEBD6,
+ 0x80EC, 0xE6C0,
+ 0x80ED, 0xEBD9,
+ 0x80EF, 0xBFE8,
+ 0x80F0, 0xD2C8,
+ 0x80F1, 0xEBD7,
+ 0x80F2, 0xEBDC,
+ 0x80F3, 0xB8EC,
+ 0x80F4, 0xEBD8,
+ 0x80F6, 0xBDBA,
+ 0x80F8, 0xD0D8,
+ 0x80FA, 0xB0B7,
+ 0x80FC, 0xEBDD,
+ 0x80FD, 0xC4DC,
+ 0x8102, 0xD6AC,
+ 0x8106, 0xB4E0,
+ 0x8109, 0xC2F6,
+ 0x810A, 0xBCB9,
+ 0x810D, 0xEBDA,
+ 0x810E, 0xEBDB,
+ 0x810F, 0xD4E0,
+ 0x8110, 0xC6EA,
+ 0x8111, 0xC4D4,
+ 0x8112, 0xEBDF,
+ 0x8113, 0xC5A7,
+ 0x8114, 0xD9F5,
+ 0x8116, 0xB2B1,
+ 0x8118, 0xEBE4,
+ 0x811A, 0xBDC5,
+ 0x811E, 0xEBE2,
+ 0x812C, 0xEBE3,
+ 0x812F, 0xB8AC,
+ 0x8131, 0xCDD1,
+ 0x8132, 0xEBE5,
+ 0x8136, 0xEBE1,
+ 0x8138, 0xC1B3,
+ 0x813E, 0xC6A2,
+ 0x8146, 0xCCF3,
+ 0x8148, 0xEBE6,
+ 0x814A, 0xC0B0,
+ 0x814B, 0xD2B8,
+ 0x814C, 0xEBE7,
+ 0x8150, 0xB8AF,
+ 0x8151, 0xB8AD,
+ 0x8153, 0xEBE8,
+ 0x8154, 0xC7BB,
+ 0x8155, 0xCDF3,
+ 0x8159, 0xEBEA,
+ 0x815A, 0xEBEB,
+ 0x8160, 0xEBED,
+ 0x8165, 0xD0C8,
+ 0x8167, 0xEBF2,
+ 0x8169, 0xEBEE,
+ 0x816D, 0xEBF1,
+ 0x816E, 0xC8F9,
+ 0x8170, 0xD1FC,
+ 0x8171, 0xEBEC,
+ 0x8174, 0xEBE9,
+ 0x8179, 0xB8B9,
+ 0x817A, 0xCFD9,
+ 0x817B, 0xC4E5,
+ 0x817C, 0xEBEF,
+ 0x817D, 0xEBF0,
+ 0x817E, 0xCCDA,
+ 0x817F, 0xCDC8,
+ 0x8180, 0xB0F2,
+ 0x8182, 0xEBF6,
+ 0x8188, 0xEBF5,
+ 0x818A, 0xB2B2,
+ 0x818F, 0xB8E0,
+ 0x8191, 0xEBF7,
+ 0x8198, 0xB1EC,
+ 0x819B, 0xCCC5,
+ 0x819C, 0xC4A4,
+ 0x819D, 0xCFA5,
+ 0x81A3, 0xEBF9,
+ 0x81A6, 0xECA2,
+ 0x81A8, 0xC5F2,
+ 0x81AA, 0xEBFA,
+ 0x81B3, 0xC9C5,
+ 0x81BA, 0xE2DF,
+ 0x81BB, 0xEBFE,
+ 0x81C0, 0xCDCE,
+ 0x81C1, 0xECA1,
+ 0x81C2, 0xB1DB,
+ 0x81C3, 0xD3B7,
+ 0x81C6, 0xD2DC,
+ 0x81CA, 0xEBFD,
+ 0x81CC, 0xEBFB,
+ 0x81E3, 0xB3BC,
+ 0x81E7, 0xEAB0,
+ 0x81EA, 0xD7D4,
+ 0x81EC, 0xF4AB,
+ 0x81ED, 0xB3F4,
+ 0x81F3, 0xD6C1,
+ 0x81F4, 0xD6C2,
+ 0x81FB, 0xD5E9,
+ 0x81FC, 0xBECA,
+ 0x81FE, 0xF4A7,
+ 0x8200, 0xD2A8,
+ 0x8201, 0xF4A8,
+ 0x8202, 0xF4A9,
+ 0x8204, 0xF4AA,
+ 0x8205, 0xBECB,
+ 0x8206, 0xD3DF,
+ 0x820C, 0xC9E0,
+ 0x820D, 0xC9E1,
+ 0x8210, 0xF3C2,
+ 0x8212, 0xCAE6,
+ 0x8214, 0xCCF2,
+ 0x821B, 0xE2B6,
+ 0x821C, 0xCBB4,
+ 0x821E, 0xCEE8,
+ 0x821F, 0xD6DB,
+ 0x8221, 0xF4AD,
+ 0x8222, 0xF4AE,
+ 0x8223, 0xF4AF,
+ 0x8228, 0xF4B2,
+ 0x822A, 0xBABD,
+ 0x822B, 0xF4B3,
+ 0x822C, 0xB0E3,
+ 0x822D, 0xF4B0,
+ 0x822F, 0xF4B1,
+ 0x8230, 0xBDA2,
+ 0x8231, 0xB2D5,
+ 0x8233, 0xF4B6,
+ 0x8234, 0xF4B7,
+ 0x8235, 0xB6E6,
+ 0x8236, 0xB2B0,
+ 0x8237, 0xCFCF,
+ 0x8238, 0xF4B4,
+ 0x8239, 0xB4AC,
+ 0x823B, 0xF4B5,
+ 0x823E, 0xF4B8,
+ 0x8244, 0xF4B9,
+ 0x8247, 0xCDA7,
+ 0x8249, 0xF4BA,
+ 0x824B, 0xF4BB,
+ 0x824F, 0xF4BC,
+ 0x8258, 0xCBD2,
+ 0x825A, 0xF4BD,
+ 0x825F, 0xF4BE,
+ 0x8268, 0xF4BF,
+ 0x826E, 0xF4DE,
+ 0x826F, 0xC1BC,
+ 0x8270, 0xBCE8,
+ 0x8272, 0xC9AB,
+ 0x8273, 0xD1DE,
+ 0x8274, 0xE5F5,
+ 0x8279, 0xDCB3,
+ 0x827A, 0xD2D5,
+ 0x827D, 0xDCB4,
+ 0x827E, 0xB0AC,
+ 0x827F, 0xDCB5,
+ 0x8282, 0xBDDA,
+ 0x8284, 0xDCB9,
+ 0x8288, 0xD8C2,
+ 0x828A, 0xDCB7,
+ 0x828B, 0xD3F3,
+ 0x828D, 0xC9D6,
+ 0x828E, 0xDCBA,
+ 0x828F, 0xDCB6,
+ 0x8291, 0xDCBB,
+ 0x8292, 0xC3A2,
+ 0x8297, 0xDCBC,
+ 0x8298, 0xDCC5,
+ 0x8299, 0xDCBD,
+ 0x829C, 0xCEDF,
+ 0x829D, 0xD6A5,
+ 0x829F, 0xDCCF,
+ 0x82A1, 0xDCCD,
+ 0x82A4, 0xDCD2,
+ 0x82A5, 0xBDE6,
+ 0x82A6, 0xC2AB,
+ 0x82A8, 0xDCB8,
+ 0x82A9, 0xDCCB,
+ 0x82AA, 0xDCCE,
+ 0x82AB, 0xDCBE,
+ 0x82AC, 0xB7D2,
+ 0x82AD, 0xB0C5,
+ 0x82AE, 0xDCC7,
+ 0x82AF, 0xD0BE,
+ 0x82B0, 0xDCC1,
+ 0x82B1, 0xBBA8,
+ 0x82B3, 0xB7BC,
+ 0x82B4, 0xDCCC,
+ 0x82B7, 0xDCC6,
+ 0x82B8, 0xDCBF,
+ 0x82B9, 0xC7DB,
+ 0x82BD, 0xD1BF,
+ 0x82BE, 0xDCC0,
+ 0x82C1, 0xDCCA,
+ 0x82C4, 0xDCD0,
+ 0x82C7, 0xCEAD,
+ 0x82C8, 0xDCC2,
+ 0x82CA, 0xDCC3,
+ 0x82CB, 0xDCC8,
+ 0x82CC, 0xDCC9,
+ 0x82CD, 0xB2D4,
+ 0x82CE, 0xDCD1,
+ 0x82CF, 0xCBD5,
+ 0x82D1, 0xD4B7,
+ 0x82D2, 0xDCDB,
+ 0x82D3, 0xDCDF,
+ 0x82D4, 0xCCA6,
+ 0x82D5, 0xDCE6,
+ 0x82D7, 0xC3E7,
+ 0x82D8, 0xDCDC,
+ 0x82DB, 0xBFC1,
+ 0x82DC, 0xDCD9,
+ 0x82DE, 0xB0FA,
+ 0x82DF, 0xB9B6,
+ 0x82E0, 0xDCE5,
+ 0x82E1, 0xDCD3,
+ 0x82E3, 0xDCC4,
+ 0x82E4, 0xDCD6,
+ 0x82E5, 0xC8F4,
+ 0x82E6, 0xBFE0,
+ 0x82EB, 0xC9BB,
+ 0x82EF, 0xB1BD,
+ 0x82F1, 0xD3A2,
+ 0x82F4, 0xDCDA,
+ 0x82F7, 0xDCD5,
+ 0x82F9, 0xC6BB,
+ 0x82FB, 0xDCDE,
+ 0x8301, 0xD7C2,
+ 0x8302, 0xC3AF,
+ 0x8303, 0xB7B6,
+ 0x8304, 0xC7D1,
+ 0x8305, 0xC3A9,
+ 0x8306, 0xDCE2,
+ 0x8307, 0xDCD8,
+ 0x8308, 0xDCEB,
+ 0x8309, 0xDCD4,
+ 0x830C, 0xDCDD,
+ 0x830E, 0xBEA5,
+ 0x830F, 0xDCD7,
+ 0x8311, 0xDCE0,
+ 0x8314, 0xDCE3,
+ 0x8315, 0xDCE4,
+ 0x8317, 0xDCF8,
+ 0x831A, 0xDCE1,
+ 0x831B, 0xDDA2,
+ 0x831C, 0xDCE7,
+ 0x8327, 0xBCEB,
+ 0x8328, 0xB4C4,
+ 0x832B, 0xC3A3,
+ 0x832C, 0xB2E7,
+ 0x832D, 0xDCFA,
+ 0x832F, 0xDCF2,
+ 0x8331, 0xDCEF,
+ 0x8333, 0xDCFC,
+ 0x8334, 0xDCEE,
+ 0x8335, 0xD2F0,
+ 0x8336, 0xB2E8,
+ 0x8338, 0xC8D7,
+ 0x8339, 0xC8E3,
+ 0x833A, 0xDCFB,
+ 0x833C, 0xDCED,
+ 0x8340, 0xDCF7,
+ 0x8343, 0xDCF5,
+ 0x8346, 0xBEA3,
+ 0x8347, 0xDCF4,
+ 0x8349, 0xB2DD,
+ 0x834F, 0xDCF3,
+ 0x8350, 0xBCF6,
+ 0x8351, 0xDCE8,
+ 0x8352, 0xBBC4,
+ 0x8354, 0xC0F3,
+ 0x835A, 0xBCD4,
+ 0x835B, 0xDCE9,
+ 0x835C, 0xDCEA,
+ 0x835E, 0xDCF1,
+ 0x835F, 0xDCF6,
+ 0x8360, 0xDCF9,
+ 0x8361, 0xB5B4,
+ 0x8363, 0xC8D9,
+ 0x8364, 0xBBE7,
+ 0x8365, 0xDCFE,
+ 0x8366, 0xDCFD,
+ 0x8367, 0xD3AB,
+ 0x8368, 0xDDA1,
+ 0x8369, 0xDDA3,
+ 0x836A, 0xDDA5,
+ 0x836B, 0xD2F1,
+ 0x836C, 0xDDA4,
+ 0x836D, 0xDDA6,
+ 0x836E, 0xDDA7,
+ 0x836F, 0xD2A9,
+ 0x8377, 0xBAC9,
+ 0x8378, 0xDDA9,
+ 0x837B, 0xDDB6,
+ 0x837C, 0xDDB1,
+ 0x837D, 0xDDB4,
+ 0x8385, 0xDDB0,
+ 0x8386, 0xC6CE,
+ 0x8389, 0xC0F2,
+ 0x838E, 0xC9AF,
+ 0x8392, 0xDCEC,
+ 0x8393, 0xDDAE,
+ 0x8398, 0xDDB7,
+ 0x839B, 0xDCF0,
+ 0x839C, 0xDDAF,
+ 0x839E, 0xDDB8,
+ 0x83A0, 0xDDAC,
+ 0x83A8, 0xDDB9,
+ 0x83A9, 0xDDB3,
+ 0x83AA, 0xDDAD,
+ 0x83AB, 0xC4AA,
+ 0x83B0, 0xDDA8,
+ 0x83B1, 0xC0B3,
+ 0x83B2, 0xC1AB,
+ 0x83B3, 0xDDAA,
+ 0x83B4, 0xDDAB,
+ 0x83B6, 0xDDB2,
+ 0x83B7, 0xBBF1,
+ 0x83B8, 0xDDB5,
+ 0x83B9, 0xD3A8,
+ 0x83BA, 0xDDBA,
+ 0x83BC, 0xDDBB,
+ 0x83BD, 0xC3A7,
+ 0x83C0, 0xDDD2,
+ 0x83C1, 0xDDBC,
+ 0x83C5, 0xDDD1,
+ 0x83C7, 0xB9BD,
+ 0x83CA, 0xBED5,
+ 0x83CC, 0xBEFA,
+ 0x83CF, 0xBACA,
+ 0x83D4, 0xDDCA,
+ 0x83D6, 0xDDC5,
+ 0x83D8, 0xDDBF,
+ 0x83DC, 0xB2CB,
+ 0x83DD, 0xDDC3,
+ 0x83DF, 0xDDCB,
+ 0x83E0, 0xB2A4,
+ 0x83E1, 0xDDD5,
+ 0x83E5, 0xDDBE,
+ 0x83E9, 0xC6D0,
+ 0x83EA, 0xDDD0,
+ 0x83F0, 0xDDD4,
+ 0x83F1, 0xC1E2,
+ 0x83F2, 0xB7C6,
+ 0x83F8, 0xDDCE,
+ 0x83F9, 0xDDCF,
+ 0x83FD, 0xDDC4,
+ 0x8401, 0xDDBD,
+ 0x8403, 0xDDCD,
+ 0x8404, 0xCCD1,
+ 0x8406, 0xDDC9,
+ 0x840B, 0xDDC2,
+ 0x840C, 0xC3C8,
+ 0x840D, 0xC6BC,
+ 0x840E, 0xCEAE,
+ 0x840F, 0xDDCC,
+ 0x8411, 0xDDC8,
+ 0x8418, 0xDDC1,
+ 0x841C, 0xDDC6,
+ 0x841D, 0xC2DC,
+ 0x8424, 0xD3A9,
+ 0x8425, 0xD3AA,
+ 0x8426, 0xDDD3,
+ 0x8427, 0xCFF4,
+ 0x8428, 0xC8F8,
+ 0x8431, 0xDDE6,
+ 0x8438, 0xDDC7,
+ 0x843C, 0xDDE0,
+ 0x843D, 0xC2E4,
+ 0x8446, 0xDDE1,
+ 0x8451, 0xDDD7,
+ 0x8457, 0xD6F8,
+ 0x8459, 0xDDD9,
+ 0x845A, 0xDDD8,
+ 0x845B, 0xB8F0,
+ 0x845C, 0xDDD6,
+ 0x8461, 0xC6CF,
+ 0x8463, 0xB6AD,
+ 0x8469, 0xDDE2,
+ 0x846B, 0xBAF9,
+ 0x846C, 0xD4E1,
+ 0x846D, 0xDDE7,
+ 0x8471, 0xB4D0,
+ 0x8473, 0xDDDA,
+ 0x8475, 0xBFFB,
+ 0x8476, 0xDDE3,
+ 0x8478, 0xDDDF,
+ 0x847A, 0xDDDD,
+ 0x8482, 0xB5D9,
+ 0x8487, 0xDDDB,
+ 0x8488, 0xDDDC,
+ 0x8489, 0xDDDE,
+ 0x848B, 0xBDAF,
+ 0x848C, 0xDDE4,
+ 0x848E, 0xDDE5,
+ 0x8497, 0xDDF5,
+ 0x8499, 0xC3C9,
+ 0x849C, 0xCBE2,
+ 0x84A1, 0xDDF2,
+ 0x84AF, 0xD8E1,
+ 0x84B2, 0xC6D1,
+ 0x84B4, 0xDDF4,
+ 0x84B8, 0xD5F4,
+ 0x84B9, 0xDDF3,
+ 0x84BA, 0xDDF0,
+ 0x84BD, 0xDDEC,
+ 0x84BF, 0xDDEF,
+ 0x84C1, 0xDDE8,
+ 0x84C4, 0xD0EE,
+ 0x84C9, 0xC8D8,
+ 0x84CA, 0xDDEE,
+ 0x84CD, 0xDDE9,
+ 0x84D0, 0xDDEA,
+ 0x84D1, 0xCBF2,
+ 0x84D3, 0xDDED,
+ 0x84D6, 0xB1CD,
+ 0x84DD, 0xC0B6,
+ 0x84DF, 0xBCBB,
+ 0x84E0, 0xDDF1,
+ 0x84E3, 0xDDF7,
+ 0x84E5, 0xDDF6,
+ 0x84E6, 0xDDEB,
+ 0x84EC, 0xC5EE,
+ 0x84F0, 0xDDFB,
+ 0x84FC, 0xDEA4,
+ 0x84FF, 0xDEA3,
+ 0x850C, 0xDDF8,
+ 0x8511, 0xC3EF,
+ 0x8513, 0xC2FB,
+ 0x8517, 0xD5E1,
+ 0x851A, 0xCEB5,
+ 0x851F, 0xDDFD,
+ 0x8521, 0xB2CC,
+ 0x852B, 0xC4E8,
+ 0x852C, 0xCADF,
+ 0x8537, 0xC7BE,
+ 0x8538, 0xDDFA,
+ 0x8539, 0xDDFC,
+ 0x853A, 0xDDFE,
+ 0x853B, 0xDEA2,
+ 0x853C, 0xB0AA,
+ 0x853D, 0xB1CE,
+ 0x8543, 0xDEAC,
+ 0x8548, 0xDEA6,
+ 0x8549, 0xBDB6,
+ 0x854A, 0xC8EF,
+ 0x8556, 0xDEA1,
+ 0x8559, 0xDEA5,
+ 0x855E, 0xDEA9,
+ 0x8564, 0xDEA8,
+ 0x8568, 0xDEA7,
+ 0x8572, 0xDEAD,
+ 0x8574, 0xD4CC,
+ 0x8579, 0xDEB3,
+ 0x857A, 0xDEAA,
+ 0x857B, 0xDEAE,
+ 0x857E, 0xC0D9,
+ 0x8584, 0xB1A1,
+ 0x8585, 0xDEB6,
+ 0x8587, 0xDEB1,
+ 0x858F, 0xDEB2,
+ 0x859B, 0xD1A6,
+ 0x859C, 0xDEB5,
+ 0x85A4, 0xDEAF,
+ 0x85A8, 0xDEB0,
+ 0x85AA, 0xD0BD,
+ 0x85AE, 0xDEB4,
+ 0x85AF, 0xCAED,
+ 0x85B0, 0xDEB9,
+ 0x85B7, 0xDEB8,
+ 0x85B9, 0xDEB7,
+ 0x85C1, 0xDEBB,
+ 0x85C9, 0xBDE5,
+ 0x85CF, 0xB2D8,
+ 0x85D0, 0xC3EA,
+ 0x85D3, 0xDEBA,
+ 0x85D5, 0xC5BA,
+ 0x85DC, 0xDEBC,
+ 0x85E4, 0xCCD9,
+ 0x85E9, 0xB7AA,
+ 0x85FB, 0xD4E5,
+ 0x85FF, 0xDEBD,
+ 0x8605, 0xDEBF,
+ 0x8611, 0xC4A2,
+ 0x8616, 0xDEC1,
+ 0x8627, 0xDEBE,
+ 0x8629, 0xDEC0,
+ 0x8638, 0xD5BA,
+ 0x863C, 0xDEC2,
+ 0x864D, 0xF2AE,
+ 0x864E, 0xBBA2,
+ 0x864F, 0xC2B2,
+ 0x8650, 0xC5B0,
+ 0x8651, 0xC2C7,
+ 0x8654, 0xF2AF,
+ 0x865A, 0xD0E9,
+ 0x865E, 0xD3DD,
+ 0x8662, 0xEBBD,
+ 0x866B, 0xB3E6,
+ 0x866C, 0xF2B0,
+ 0x866E, 0xF2B1,
+ 0x8671, 0xCAAD,
+ 0x8679, 0xBAE7,
+ 0x867A, 0xF2B3,
+ 0x867B, 0xF2B5,
+ 0x867C, 0xF2B4,
+ 0x867D, 0xCBE4,
+ 0x867E, 0xCFBA,
+ 0x867F, 0xF2B2,
+ 0x8680, 0xCAB4,
+ 0x8681, 0xD2CF,
+ 0x8682, 0xC2EC,
+ 0x868A, 0xCEC3,
+ 0x868B, 0xF2B8,
+ 0x868C, 0xB0F6,
+ 0x868D, 0xF2B7,
+ 0x8693, 0xF2BE,
+ 0x8695, 0xB2CF,
+ 0x869C, 0xD1C1,
+ 0x869D, 0xF2BA,
+ 0x86A3, 0xF2BC,
+ 0x86A4, 0xD4E9,
+ 0x86A7, 0xF2BB,
+ 0x86A8, 0xF2B6,
+ 0x86A9, 0xF2BF,
+ 0x86AA, 0xF2BD,
+ 0x86AC, 0xF2B9,
+ 0x86AF, 0xF2C7,
+ 0x86B0, 0xF2C4,
+ 0x86B1, 0xF2C6,
+ 0x86B4, 0xF2CA,
+ 0x86B5, 0xF2C2,
+ 0x86B6, 0xF2C0,
+ 0x86BA, 0xF2C5,
+ 0x86C0, 0xD6FB,
+ 0x86C4, 0xF2C1,
+ 0x86C6, 0xC7F9,
+ 0x86C7, 0xC9DF,
+ 0x86C9, 0xF2C8,
+ 0x86CA, 0xB9C6,
+ 0x86CB, 0xB5B0,
+ 0x86CE, 0xF2C3,
+ 0x86CF, 0xF2C9,
+ 0x86D0, 0xF2D0,
+ 0x86D1, 0xF2D6,
+ 0x86D4, 0xBBD7,
+ 0x86D8, 0xF2D5,
+ 0x86D9, 0xCDDC,
+ 0x86DB, 0xD6EB,
+ 0x86DE, 0xF2D2,
+ 0x86DF, 0xF2D4,
+ 0x86E4, 0xB8F2,
+ 0x86E9, 0xF2CB,
+ 0x86ED, 0xF2CE,
+ 0x86EE, 0xC2F9,
+ 0x86F0, 0xD5DD,
+ 0x86F1, 0xF2CC,
+ 0x86F2, 0xF2CD,
+ 0x86F3, 0xF2CF,
+ 0x86F4, 0xF2D3,
+ 0x86F8, 0xF2D9,
+ 0x86F9, 0xD3BC,
+ 0x86FE, 0xB6EA,
+ 0x8700, 0xCAF1,
+ 0x8702, 0xB7E4,
+ 0x8703, 0xF2D7,
+ 0x8707, 0xF2D8,
+ 0x8708, 0xF2DA,
+ 0x8709, 0xF2DD,
+ 0x870A, 0xF2DB,
+ 0x870D, 0xF2DC,
+ 0x8712, 0xD1D1,
+ 0x8713, 0xF2D1,
+ 0x8715, 0xCDC9,
+ 0x8717, 0xCECF,
+ 0x8718, 0xD6A9,
+ 0x871A, 0xF2E3,
+ 0x871C, 0xC3DB,
+ 0x871E, 0xF2E0,
+ 0x8721, 0xC0AF,
+ 0x8722, 0xF2EC,
+ 0x8723, 0xF2DE,
+ 0x8725, 0xF2E1,
+ 0x8729, 0xF2E8,
+ 0x872E, 0xF2E2,
+ 0x8731, 0xF2E7,
+ 0x8734, 0xF2E6,
+ 0x8737, 0xF2E9,
+ 0x873B, 0xF2DF,
+ 0x873E, 0xF2E4,
+ 0x873F, 0xF2EA,
+ 0x8747, 0xD3AC,
+ 0x8748, 0xF2E5,
+ 0x8749, 0xB2F5,
+ 0x874C, 0xF2F2,
+ 0x874E, 0xD0AB,
+ 0x8753, 0xF2F5,
+ 0x8757, 0xBBC8,
+ 0x8759, 0xF2F9,
+ 0x8760, 0xF2F0,
+ 0x8763, 0xF2F6,
+ 0x8764, 0xF2F8,
+ 0x8765, 0xF2FA,
+ 0x876E, 0xF2F3,
+ 0x8770, 0xF2F1,
+ 0x8774, 0xBAFB,
+ 0x8776, 0xB5FB,
+ 0x877B, 0xF2EF,
+ 0x877C, 0xF2F7,
+ 0x877D, 0xF2ED,
+ 0x877E, 0xF2EE,
+ 0x8782, 0xF2EB,
+ 0x8783, 0xF3A6,
+ 0x8785, 0xF3A3,
+ 0x8788, 0xF3A2,
+ 0x878B, 0xF2F4,
+ 0x878D, 0xC8DA,
+ 0x8793, 0xF2FB,
+ 0x8797, 0xF3A5,
+ 0x879F, 0xC3F8,
+ 0x87A8, 0xF2FD,
+ 0x87AB, 0xF3A7,
+ 0x87AC, 0xF3A9,
+ 0x87AD, 0xF3A4,
+ 0x87AF, 0xF2FC,
+ 0x87B3, 0xF3AB,
+ 0x87B5, 0xF3AA,
+ 0x87BA, 0xC2DD,
+ 0x87BD, 0xF3AE,
+ 0x87C0, 0xF3B0,
+ 0x87C6, 0xF3A1,
+ 0x87CA, 0xF3B1,
+ 0x87CB, 0xF3AC,
+ 0x87D1, 0xF3AF,
+ 0x87D2, 0xF2FE,
+ 0x87D3, 0xF3AD,
+ 0x87DB, 0xF3B2,
+ 0x87E0, 0xF3B4,
+ 0x87E5, 0xF3A8,
+ 0x87EA, 0xF3B3,
+ 0x87EE, 0xF3B5,
+ 0x87F9, 0xD0B7,
+ 0x87FE, 0xF3B8,
+ 0x8803, 0xD9F9,
+ 0x880A, 0xF3B9,
+ 0x8813, 0xF3B7,
+ 0x8815, 0xC8E4,
+ 0x8816, 0xF3B6,
+ 0x881B, 0xF3BA,
+ 0x8821, 0xF3BB,
+ 0x8822, 0xB4C0,
+ 0x8832, 0xEEC3,
+ 0x8839, 0xF3BC,
+ 0x883C, 0xF3BD,
+ 0x8840, 0xD1AA,
+ 0x8844, 0xF4AC,
+ 0x8845, 0xD0C6,
+ 0x884C, 0xD0D0,
+ 0x884D, 0xD1DC,
+ 0x8854, 0xCFCE,
+ 0x8857, 0xBDD6,
+ 0x8859, 0xD1C3,
+ 0x8861, 0xBAE2,
+ 0x8862, 0xE1E9,
+ 0x8863, 0xD2C2,
+ 0x8864, 0xF1C2,
+ 0x8865, 0xB2B9,
+ 0x8868, 0xB1ED,
+ 0x8869, 0xF1C3,
+ 0x886B, 0xC9C0,
+ 0x886C, 0xB3C4,
+ 0x886E, 0xD9F2,
+ 0x8870, 0xCBA5,
+ 0x8872, 0xF1C4,
+ 0x8877, 0xD6D4,
+ 0x887D, 0xF1C5,
+ 0x887E, 0xF4C0,
+ 0x887F, 0xF1C6,
+ 0x8881, 0xD4AC,
+ 0x8882, 0xF1C7,
+ 0x8884, 0xB0C0,
+ 0x8885, 0xF4C1,
+ 0x8888, 0xF4C2,
+ 0x888B, 0xB4FC,
+ 0x888D, 0xC5DB,
+ 0x8892, 0xCCBB,
+ 0x8896, 0xD0E4,
+ 0x889C, 0xCDE0,
+ 0x88A2, 0xF1C8,
+ 0x88A4, 0xD9F3,
+ 0x88AB, 0xB1BB,
+ 0x88AD, 0xCFAE,
+ 0x88B1, 0xB8A4,
+ 0x88B7, 0xF1CA,
+ 0x88BC, 0xF1CB,
+ 0x88C1, 0xB2C3,
+ 0x88C2, 0xC1D1,
+ 0x88C5, 0xD7B0,
+ 0x88C6, 0xF1C9,
+ 0x88C9, 0xF1CC,
+ 0x88CE, 0xF1CE,
+ 0x88D2, 0xD9F6,
+ 0x88D4, 0xD2E1,
+ 0x88D5, 0xD4A3,
+ 0x88D8, 0xF4C3,
+ 0x88D9, 0xC8B9,
+ 0x88DF, 0xF4C4,
+ 0x88E2, 0xF1CD,
+ 0x88E3, 0xF1CF,
+ 0x88E4, 0xBFE3,
+ 0x88E5, 0xF1D0,
+ 0x88E8, 0xF1D4,
+ 0x88F0, 0xF1D6,
+ 0x88F1, 0xF1D1,
+ 0x88F3, 0xC9D1,
+ 0x88F4, 0xC5E1,
+ 0x88F8, 0xC2E3,
+ 0x88F9, 0xB9FC,
+ 0x88FC, 0xF1D3,
+ 0x88FE, 0xF1D5,
+ 0x8902, 0xB9D3,
+ 0x890A, 0xF1DB,
+ 0x8910, 0xBAD6,
+ 0x8912, 0xB0FD,
+ 0x8913, 0xF1D9,
+ 0x8919, 0xF1D8,
+ 0x891A, 0xF1D2,
+ 0x891B, 0xF1DA,
+ 0x8921, 0xF1D7,
+ 0x8925, 0xC8EC,
+ 0x892A, 0xCDCA,
+ 0x892B, 0xF1DD,
+ 0x8930, 0xE5BD,
+ 0x8934, 0xF1DC,
+ 0x8936, 0xF1DE,
+ 0x8941, 0xF1DF,
+ 0x8944, 0xCFE5,
+ 0x895E, 0xF4C5,
+ 0x895F, 0xBDF3,
+ 0x8966, 0xF1E0,
+ 0x897B, 0xF1E1,
+ 0x897F, 0xCEF7,
+ 0x8981, 0xD2AA,
+ 0x8983, 0xF1FB,
+ 0x8986, 0xB8B2,
+ 0x89C1, 0xBCFB,
+ 0x89C2, 0xB9DB,
+ 0x89C4, 0xB9E6,
+ 0x89C5, 0xC3D9,
+ 0x89C6, 0xCAD3,
+ 0x89C7, 0xEAE8,
+ 0x89C8, 0xC0C0,
+ 0x89C9, 0xBEF5,
+ 0x89CA, 0xEAE9,
+ 0x89CB, 0xEAEA,
+ 0x89CC, 0xEAEB,
+ 0x89CE, 0xEAEC,
+ 0x89CF, 0xEAED,
+ 0x89D0, 0xEAEE,
+ 0x89D1, 0xEAEF,
+ 0x89D2, 0xBDC7,
+ 0x89D6, 0xF5FB,
+ 0x89DA, 0xF5FD,
+ 0x89DC, 0xF5FE,
+ 0x89DE, 0xF5FC,
+ 0x89E3, 0xBDE2,
+ 0x89E5, 0xF6A1,
+ 0x89E6, 0xB4A5,
+ 0x89EB, 0xF6A2,
+ 0x89EF, 0xF6A3,
+ 0x89F3, 0xECB2,
+ 0x8A00, 0xD1D4,
+ 0x8A07, 0xD9EA,
+ 0x8A3E, 0xF6A4,
+ 0x8A48, 0xEEBA,
+ 0x8A79, 0xD5B2,
+ 0x8A89, 0xD3FE,
+ 0x8A8A, 0xCCDC,
+ 0x8A93, 0xCAC4,
+ 0x8B07, 0xE5C0,
+ 0x8B26, 0xF6A5,
+ 0x8B66, 0xBEAF,
+ 0x8B6C, 0xC6A9,
+ 0x8BA0, 0xDAA5,
+ 0x8BA1, 0xBCC6,
+ 0x8BA2, 0xB6A9,
+ 0x8BA3, 0xB8BC,
+ 0x8BA4, 0xC8CF,
+ 0x8BA5, 0xBCA5,
+ 0x8BA6, 0xDAA6,
+ 0x8BA7, 0xDAA7,
+ 0x8BA8, 0xCCD6,
+ 0x8BA9, 0xC8C3,
+ 0x8BAA, 0xDAA8,
+ 0x8BAB, 0xC6FD,
+ 0x8BAD, 0xD1B5,
+ 0x8BAE, 0xD2E9,
+ 0x8BAF, 0xD1B6,
+ 0x8BB0, 0xBCC7,
+ 0x8BB2, 0xBDB2,
+ 0x8BB3, 0xBBE4,
+ 0x8BB4, 0xDAA9,
+ 0x8BB5, 0xDAAA,
+ 0x8BB6, 0xD1C8,
+ 0x8BB7, 0xDAAB,
+ 0x8BB8, 0xD0ED,
+ 0x8BB9, 0xB6EF,
+ 0x8BBA, 0xC2DB,
+ 0x8BBC, 0xCBCF,
+ 0x8BBD, 0xB7ED,
+ 0x8BBE, 0xC9E8,
+ 0x8BBF, 0xB7C3,
+ 0x8BC0, 0xBEF7,
+ 0x8BC1, 0xD6A4,
+ 0x8BC2, 0xDAAC,
+ 0x8BC3, 0xDAAD,
+ 0x8BC4, 0xC6C0,
+ 0x8BC5, 0xD7E7,
+ 0x8BC6, 0xCAB6,
+ 0x8BC8, 0xD5A9,
+ 0x8BC9, 0xCBDF,
+ 0x8BCA, 0xD5EF,
+ 0x8BCB, 0xDAAE,
+ 0x8BCC, 0xD6DF,
+ 0x8BCD, 0xB4CA,
+ 0x8BCE, 0xDAB0,
+ 0x8BCF, 0xDAAF,
+ 0x8BD1, 0xD2EB,
+ 0x8BD2, 0xDAB1,
+ 0x8BD3, 0xDAB2,
+ 0x8BD4, 0xDAB3,
+ 0x8BD5, 0xCAD4,
+ 0x8BD6, 0xDAB4,
+ 0x8BD7, 0xCAAB,
+ 0x8BD8, 0xDAB5,
+ 0x8BD9, 0xDAB6,
+ 0x8BDA, 0xB3CF,
+ 0x8BDB, 0xD6EF,
+ 0x8BDC, 0xDAB7,
+ 0x8BDD, 0xBBB0,
+ 0x8BDE, 0xB5AE,
+ 0x8BDF, 0xDAB8,
+ 0x8BE0, 0xDAB9,
+ 0x8BE1, 0xB9EE,
+ 0x8BE2, 0xD1AF,
+ 0x8BE3, 0xD2E8,
+ 0x8BE4, 0xDABA,
+ 0x8BE5, 0xB8C3,
+ 0x8BE6, 0xCFEA,
+ 0x8BE7, 0xB2EF,
+ 0x8BE8, 0xDABB,
+ 0x8BE9, 0xDABC,
+ 0x8BEB, 0xBDEB,
+ 0x8BEC, 0xCEDC,
+ 0x8BED, 0xD3EF,
+ 0x8BEE, 0xDABD,
+ 0x8BEF, 0xCEF3,
+ 0x8BF0, 0xDABE,
+ 0x8BF1, 0xD3D5,
+ 0x8BF2, 0xBBE5,
+ 0x8BF3, 0xDABF,
+ 0x8BF4, 0xCBB5,
+ 0x8BF5, 0xCBD0,
+ 0x8BF6, 0xDAC0,
+ 0x8BF7, 0xC7EB,
+ 0x8BF8, 0xD6EE,
+ 0x8BF9, 0xDAC1,
+ 0x8BFA, 0xC5B5,
+ 0x8BFB, 0xB6C1,
+ 0x8BFC, 0xDAC2,
+ 0x8BFD, 0xB7CC,
+ 0x8BFE, 0xBFCE,
+ 0x8BFF, 0xDAC3,
+ 0x8C00, 0xDAC4,
+ 0x8C01, 0xCBAD,
+ 0x8C02, 0xDAC5,
+ 0x8C03, 0xB5F7,
+ 0x8C04, 0xDAC6,
+ 0x8C05, 0xC1C2,
+ 0x8C06, 0xD7BB,
+ 0x8C07, 0xDAC7,
+ 0x8C08, 0xCCB8,
+ 0x8C0A, 0xD2EA,
+ 0x8C0B, 0xC4B1,
+ 0x8C0C, 0xDAC8,
+ 0x8C0D, 0xB5FD,
+ 0x8C0E, 0xBBD1,
+ 0x8C0F, 0xDAC9,
+ 0x8C10, 0xD0B3,
+ 0x8C11, 0xDACA,
+ 0x8C12, 0xDACB,
+ 0x8C13, 0xCEBD,
+ 0x8C14, 0xDACC,
+ 0x8C15, 0xDACD,
+ 0x8C16, 0xDACE,
+ 0x8C17, 0xB2F7,
+ 0x8C18, 0xDAD1,
+ 0x8C19, 0xDACF,
+ 0x8C1A, 0xD1E8,
+ 0x8C1B, 0xDAD0,
+ 0x8C1C, 0xC3D5,
+ 0x8C1D, 0xDAD2,
+ 0x8C1F, 0xDAD3,
+ 0x8C20, 0xDAD4,
+ 0x8C21, 0xDAD5,
+ 0x8C22, 0xD0BB,
+ 0x8C23, 0xD2A5,
+ 0x8C24, 0xB0F9,
+ 0x8C25, 0xDAD6,
+ 0x8C26, 0xC7AB,
+ 0x8C27, 0xDAD7,
+ 0x8C28, 0xBDF7,
+ 0x8C29, 0xC3A1,
+ 0x8C2A, 0xDAD8,
+ 0x8C2B, 0xDAD9,
+ 0x8C2C, 0xC3FD,
+ 0x8C2D, 0xCCB7,
+ 0x8C2E, 0xDADA,
+ 0x8C2F, 0xDADB,
+ 0x8C30, 0xC0BE,
+ 0x8C31, 0xC6D7,
+ 0x8C32, 0xDADC,
+ 0x8C33, 0xDADD,
+ 0x8C34, 0xC7B4,
+ 0x8C35, 0xDADE,
+ 0x8C36, 0xDADF,
+ 0x8C37, 0xB9C8,
+ 0x8C41, 0xBBED,
+ 0x8C46, 0xB6B9,
+ 0x8C47, 0xF4F8,
+ 0x8C49, 0xF4F9,
+ 0x8C4C, 0xCDE3,
+ 0x8C55, 0xF5B9,
+ 0x8C5A, 0xEBE0,
+ 0x8C61, 0xCFF3,
+ 0x8C62, 0xBBBF,
+ 0x8C6A, 0xBAC0,
+ 0x8C6B, 0xD4A5,
+ 0x8C73, 0xE1D9,
+ 0x8C78, 0xF5F4,
+ 0x8C79, 0xB1AA,
+ 0x8C7A, 0xB2F2,
+ 0x8C82, 0xF5F5,
+ 0x8C85, 0xF5F7,
+ 0x8C89, 0xBAD1,
+ 0x8C8A, 0xF5F6,
+ 0x8C8C, 0xC3B2,
+ 0x8C94, 0xF5F9,
+ 0x8C98, 0xF5F8,
+ 0x8D1D, 0xB1B4,
+ 0x8D1E, 0xD5EA,
+ 0x8D1F, 0xB8BA,
+ 0x8D21, 0xB9B1,
+ 0x8D22, 0xB2C6,
+ 0x8D23, 0xD4F0,
+ 0x8D24, 0xCFCD,
+ 0x8D25, 0xB0DC,
+ 0x8D26, 0xD5CB,
+ 0x8D27, 0xBBF5,
+ 0x8D28, 0xD6CA,
+ 0x8D29, 0xB7B7,
+ 0x8D2A, 0xCCB0,
+ 0x8D2B, 0xC6B6,
+ 0x8D2C, 0xB1E1,
+ 0x8D2D, 0xB9BA,
+ 0x8D2E, 0xD6FC,
+ 0x8D2F, 0xB9E1,
+ 0x8D30, 0xB7A1,
+ 0x8D31, 0xBCFA,
+ 0x8D32, 0xEADA,
+ 0x8D33, 0xEADB,
+ 0x8D34, 0xCCF9,
+ 0x8D35, 0xB9F3,
+ 0x8D36, 0xEADC,
+ 0x8D37, 0xB4FB,
+ 0x8D38, 0xC3B3,
+ 0x8D39, 0xB7D1,
+ 0x8D3A, 0xBAD8,
+ 0x8D3B, 0xEADD,
+ 0x8D3C, 0xD4F4,
+ 0x8D3D, 0xEADE,
+ 0x8D3E, 0xBCD6,
+ 0x8D3F, 0xBBDF,
+ 0x8D40, 0xEADF,
+ 0x8D41, 0xC1DE,
+ 0x8D42, 0xC2B8,
+ 0x8D43, 0xD4DF,
+ 0x8D44, 0xD7CA,
+ 0x8D45, 0xEAE0,
+ 0x8D46, 0xEAE1,
+ 0x8D47, 0xEAE4,
+ 0x8D48, 0xEAE2,
+ 0x8D49, 0xEAE3,
+ 0x8D4A, 0xC9DE,
+ 0x8D4B, 0xB8B3,
+ 0x8D4C, 0xB6C4,
+ 0x8D4D, 0xEAE5,
+ 0x8D4E, 0xCAEA,
+ 0x8D4F, 0xC9CD,
+ 0x8D50, 0xB4CD,
+ 0x8D53, 0xE2D9,
+ 0x8D54, 0xC5E2,
+ 0x8D55, 0xEAE6,
+ 0x8D56, 0xC0B5,
+ 0x8D58, 0xD7B8,
+ 0x8D59, 0xEAE7,
+ 0x8D5A, 0xD7AC,
+ 0x8D5B, 0xC8FC,
+ 0x8D5C, 0xD8D3,
+ 0x8D5D, 0xD8CD,
+ 0x8D5E, 0xD4DE,
+ 0x8D60, 0xD4F9,
+ 0x8D61, 0xC9C4,
+ 0x8D62, 0xD3AE,
+ 0x8D63, 0xB8D3,
+ 0x8D64, 0xB3E0,
+ 0x8D66, 0xC9E2,
+ 0x8D67, 0xF4F6,
+ 0x8D6B, 0xBAD5,
+ 0x8D6D, 0xF4F7,
+ 0x8D70, 0xD7DF,
+ 0x8D73, 0xF4F1,
+ 0x8D74, 0xB8B0,
+ 0x8D75, 0xD5D4,
+ 0x8D76, 0xB8CF,
+ 0x8D77, 0xC6F0,
+ 0x8D81, 0xB3C3,
+ 0x8D84, 0xF4F2,
+ 0x8D85, 0xB3AC,
+ 0x8D8A, 0xD4BD,
+ 0x8D8B, 0xC7F7,
+ 0x8D91, 0xF4F4,
+ 0x8D94, 0xF4F3,
+ 0x8D9F, 0xCCCB,
+ 0x8DA3, 0xC8A4,
+ 0x8DB1, 0xF4F5,
+ 0x8DB3, 0xD7E3,
+ 0x8DB4, 0xC5BF,
+ 0x8DB5, 0xF5C0,
+ 0x8DB8, 0xF5BB,
+ 0x8DBA, 0xF5C3,
+ 0x8DBC, 0xF5C2,
+ 0x8DBE, 0xD6BA,
+ 0x8DBF, 0xF5C1,
+ 0x8DC3, 0xD4BE,
+ 0x8DC4, 0xF5C4,
+ 0x8DC6, 0xF5CC,
+ 0x8DCB, 0xB0CF,
+ 0x8DCC, 0xB5F8,
+ 0x8DCE, 0xF5C9,
+ 0x8DCF, 0xF5CA,
+ 0x8DD1, 0xC5DC,
+ 0x8DD6, 0xF5C5,
+ 0x8DD7, 0xF5C6,
+ 0x8DDA, 0xF5C7,
+ 0x8DDB, 0xF5CB,
+ 0x8DDD, 0xBEE0,
+ 0x8DDE, 0xF5C8,
+ 0x8DDF, 0xB8FA,
+ 0x8DE3, 0xF5D0,
+ 0x8DE4, 0xF5D3,
+ 0x8DE8, 0xBFE7,
+ 0x8DEA, 0xB9F2,
+ 0x8DEB, 0xF5BC,
+ 0x8DEC, 0xF5CD,
+ 0x8DEF, 0xC2B7,
+ 0x8DF3, 0xCCF8,
+ 0x8DF5, 0xBCF9,
+ 0x8DF7, 0xF5CE,
+ 0x8DF8, 0xF5CF,
+ 0x8DF9, 0xF5D1,
+ 0x8DFA, 0xB6E5,
+ 0x8DFB, 0xF5D2,
+ 0x8DFD, 0xF5D5,
+ 0x8E05, 0xF5BD,
+ 0x8E09, 0xF5D4,
+ 0x8E0A, 0xD3BB,
+ 0x8E0C, 0xB3EC,
+ 0x8E0F, 0xCCA4,
+ 0x8E14, 0xF5D6,
+ 0x8E1D, 0xF5D7,
+ 0x8E1E, 0xBEE1,
+ 0x8E1F, 0xF5D8,
+ 0x8E22, 0xCCDF,
+ 0x8E23, 0xF5DB,
+ 0x8E29, 0xB2C8,
+ 0x8E2A, 0xD7D9,
+ 0x8E2C, 0xF5D9,
+ 0x8E2E, 0xF5DA,
+ 0x8E2F, 0xF5DC,
+ 0x8E31, 0xF5E2,
+ 0x8E35, 0xF5E0,
+ 0x8E39, 0xF5DF,
+ 0x8E3A, 0xF5DD,
+ 0x8E3D, 0xF5E1,
+ 0x8E40, 0xF5DE,
+ 0x8E41, 0xF5E4,
+ 0x8E42, 0xF5E5,
+ 0x8E44, 0xCCE3,
+ 0x8E47, 0xE5BF,
+ 0x8E48, 0xB5B8,
+ 0x8E49, 0xF5E3,
+ 0x8E4A, 0xF5E8,
+ 0x8E4B, 0xCCA3,
+ 0x8E51, 0xF5E6,
+ 0x8E52, 0xF5E7,
+ 0x8E59, 0xF5BE,
+ 0x8E66, 0xB1C4,
+ 0x8E69, 0xF5BF,
+ 0x8E6C, 0xB5C5,
+ 0x8E6D, 0xB2E4,
+ 0x8E6F, 0xF5EC,
+ 0x8E70, 0xF5E9,
+ 0x8E72, 0xB6D7,
+ 0x8E74, 0xF5ED,
+ 0x8E76, 0xF5EA,
+ 0x8E7C, 0xF5EB,
+ 0x8E7F, 0xB4DA,
+ 0x8E81, 0xD4EA,
+ 0x8E85, 0xF5EE,
+ 0x8E87, 0xB3F9,
+ 0x8E8F, 0xF5EF,
+ 0x8E90, 0xF5F1,
+ 0x8E94, 0xF5F0,
+ 0x8E9C, 0xF5F2,
+ 0x8E9E, 0xF5F3,
+ 0x8EAB, 0xC9ED,
+ 0x8EAC, 0xB9AA,
+ 0x8EAF, 0xC7FB,
+ 0x8EB2, 0xB6E3,
+ 0x8EBA, 0xCCC9,
+ 0x8ECE, 0xEAA6,
+ 0x8F66, 0xB3B5,
+ 0x8F67, 0xD4FE,
+ 0x8F68, 0xB9EC,
+ 0x8F69, 0xD0F9,
+ 0x8F6B, 0xE9ED,
+ 0x8F6C, 0xD7AA,
+ 0x8F6D, 0xE9EE,
+ 0x8F6E, 0xC2D6,
+ 0x8F6F, 0xC8ED,
+ 0x8F70, 0xBAE4,
+ 0x8F71, 0xE9EF,
+ 0x8F72, 0xE9F0,
+ 0x8F73, 0xE9F1,
+ 0x8F74, 0xD6E1,
+ 0x8F75, 0xE9F2,
+ 0x8F76, 0xE9F3,
+ 0x8F77, 0xE9F5,
+ 0x8F78, 0xE9F4,
+ 0x8F79, 0xE9F6,
+ 0x8F7A, 0xE9F7,
+ 0x8F7B, 0xC7E1,
+ 0x8F7C, 0xE9F8,
+ 0x8F7D, 0xD4D8,
+ 0x8F7E, 0xE9F9,
+ 0x8F7F, 0xBDCE,
+ 0x8F81, 0xE9FA,
+ 0x8F82, 0xE9FB,
+ 0x8F83, 0xBDCF,
+ 0x8F84, 0xE9FC,
+ 0x8F85, 0xB8A8,
+ 0x8F86, 0xC1BE,
+ 0x8F87, 0xE9FD,
+ 0x8F88, 0xB1B2,
+ 0x8F89, 0xBBD4,
+ 0x8F8A, 0xB9F5,
+ 0x8F8B, 0xE9FE,
+ 0x8F8D, 0xEAA1,
+ 0x8F8E, 0xEAA2,
+ 0x8F8F, 0xEAA3,
+ 0x8F90, 0xB7F8,
+ 0x8F91, 0xBCAD,
+ 0x8F93, 0xCAE4,
+ 0x8F94, 0xE0CE,
+ 0x8F95, 0xD4AF,
+ 0x8F96, 0xCFBD,
+ 0x8F97, 0xD5B7,
+ 0x8F98, 0xEAA4,
+ 0x8F99, 0xD5DE,
+ 0x8F9A, 0xEAA5,
+ 0x8F9B, 0xD0C1,
+ 0x8F9C, 0xB9BC,
+ 0x8F9E, 0xB4C7,
+ 0x8F9F, 0xB1D9,
+ 0x8FA3, 0xC0B1,
+ 0x8FA8, 0xB1E6,
+ 0x8FA9, 0xB1E7,
+ 0x8FAB, 0xB1E8,
+ 0x8FB0, 0xB3BD,
+ 0x8FB1, 0xC8E8,
+ 0x8FB6, 0xE5C1,
+ 0x8FB9, 0xB1DF,
+ 0x8FBD, 0xC1C9,
+ 0x8FBE, 0xB4EF,
+ 0x8FC1, 0xC7A8,
+ 0x8FC2, 0xD3D8,
+ 0x8FC4, 0xC6F9,
+ 0x8FC5, 0xD1B8,
+ 0x8FC7, 0xB9FD,
+ 0x8FC8, 0xC2F5,
+ 0x8FCE, 0xD3AD,
+ 0x8FD0, 0xD4CB,
+ 0x8FD1, 0xBDFC,
+ 0x8FD3, 0xE5C2,
+ 0x8FD4, 0xB7B5,
+ 0x8FD5, 0xE5C3,
+ 0x8FD8, 0xBBB9,
+ 0x8FD9, 0xD5E2,
+ 0x8FDB, 0xBDF8,
+ 0x8FDC, 0xD4B6,
+ 0x8FDD, 0xCEA5,
+ 0x8FDE, 0xC1AC,
+ 0x8FDF, 0xB3D9,
+ 0x8FE2, 0xCCF6,
+ 0x8FE4, 0xE5C6,
+ 0x8FE5, 0xE5C4,
+ 0x8FE6, 0xE5C8,
+ 0x8FE8, 0xE5CA,
+ 0x8FE9, 0xE5C7,
+ 0x8FEA, 0xB5CF,
+ 0x8FEB, 0xC6C8,
+ 0x8FED, 0xB5FC,
+ 0x8FEE, 0xE5C5,
+ 0x8FF0, 0xCAF6,
+ 0x8FF3, 0xE5C9,
+ 0x8FF7, 0xC3D4,
+ 0x8FF8, 0xB1C5,
+ 0x8FF9, 0xBCA3,
+ 0x8FFD, 0xD7B7,
+ 0x9000, 0xCDCB,
+ 0x9001, 0xCBCD,
+ 0x9002, 0xCACA,
+ 0x9003, 0xCCD3,
+ 0x9004, 0xE5CC,
+ 0x9005, 0xE5CB,
+ 0x9006, 0xC4E6,
+ 0x9009, 0xD1A1,
+ 0x900A, 0xD1B7,
+ 0x900B, 0xE5CD,
+ 0x900D, 0xE5D0,
+ 0x900F, 0xCDB8,
+ 0x9010, 0xD6F0,
+ 0x9011, 0xE5CF,
+ 0x9012, 0xB5DD,
+ 0x9014, 0xCDBE,
+ 0x9016, 0xE5D1,
+ 0x9017, 0xB6BA,
+ 0x901A, 0xCDA8,
+ 0x901B, 0xB9E4,
+ 0x901D, 0xCAC5,
+ 0x901E, 0xB3D1,
+ 0x901F, 0xCBD9,
+ 0x9020, 0xD4EC,
+ 0x9021, 0xE5D2,
+ 0x9022, 0xB7EA,
+ 0x9026, 0xE5CE,
+ 0x902D, 0xE5D5,
+ 0x902E, 0xB4FE,
+ 0x902F, 0xE5D6,
+ 0x9035, 0xE5D3,
+ 0x9036, 0xE5D4,
+ 0x9038, 0xD2DD,
+ 0x903B, 0xC2DF,
+ 0x903C, 0xB1C6,
+ 0x903E, 0xD3E2,
+ 0x9041, 0xB6DD,
+ 0x9042, 0xCBEC,
+ 0x9044, 0xE5D7,
+ 0x9047, 0xD3F6,
+ 0x904D, 0xB1E9,
+ 0x904F, 0xB6F4,
+ 0x9050, 0xE5DA,
+ 0x9051, 0xE5D8,
+ 0x9052, 0xE5D9,
+ 0x9053, 0xB5C0,
+ 0x9057, 0xD2C5,
+ 0x9058, 0xE5DC,
+ 0x905B, 0xE5DE,
+ 0x9062, 0xE5DD,
+ 0x9063, 0xC7B2,
+ 0x9065, 0xD2A3,
+ 0x9068, 0xE5DB,
+ 0x906D, 0xD4E2,
+ 0x906E, 0xD5DA,
+ 0x9074, 0xE5E0,
+ 0x9075, 0xD7F1,
+ 0x907D, 0xE5E1,
+ 0x907F, 0xB1DC,
+ 0x9080, 0xD1FB,
+ 0x9082, 0xE5E2,
+ 0x9083, 0xE5E4,
+ 0x9088, 0xE5E3,
+ 0x908B, 0xE5E5,
+ 0x9091, 0xD2D8,
+ 0x9093, 0xB5CB,
+ 0x9095, 0xE7DF,
+ 0x9097, 0xDAF5,
+ 0x9099, 0xDAF8,
+ 0x909B, 0xDAF6,
+ 0x909D, 0xDAF7,
+ 0x90A1, 0xDAFA,
+ 0x90A2, 0xD0CF,
+ 0x90A3, 0xC4C7,
+ 0x90A6, 0xB0EE,
+ 0x90AA, 0xD0B0,
+ 0x90AC, 0xDAF9,
+ 0x90AE, 0xD3CA,
+ 0x90AF, 0xBAAA,
+ 0x90B0, 0xDBA2,
+ 0x90B1, 0xC7F1,
+ 0x90B3, 0xDAFC,
+ 0x90B4, 0xDAFB,
+ 0x90B5, 0xC9DB,
+ 0x90B6, 0xDAFD,
+ 0x90B8, 0xDBA1,
+ 0x90B9, 0xD7DE,
+ 0x90BA, 0xDAFE,
+ 0x90BB, 0xC1DA,
+ 0x90BE, 0xDBA5,
+ 0x90C1, 0xD3F4,
+ 0x90C4, 0xDBA7,
+ 0x90C5, 0xDBA4,
+ 0x90C7, 0xDBA8,
+ 0x90CA, 0xBDBC,
+ 0x90CE, 0xC0C9,
+ 0x90CF, 0xDBA3,
+ 0x90D0, 0xDBA6,
+ 0x90D1, 0xD6A3,
+ 0x90D3, 0xDBA9,
+ 0x90D7, 0xDBAD,
+ 0x90DB, 0xDBAE,
+ 0x90DC, 0xDBAC,
+ 0x90DD, 0xBAC2,
+ 0x90E1, 0xBFA4,
+ 0x90E2, 0xDBAB,
+ 0x90E6, 0xDBAA,
+ 0x90E7, 0xD4C7,
+ 0x90E8, 0xB2BF,
+ 0x90EB, 0xDBAF,
+ 0x90ED, 0xB9F9,
+ 0x90EF, 0xDBB0,
+ 0x90F4, 0xB3BB,
+ 0x90F8, 0xB5A6,
+ 0x90FD, 0xB6BC,
+ 0x90FE, 0xDBB1,
+ 0x9102, 0xB6F5,
+ 0x9104, 0xDBB2,
+ 0x9119, 0xB1C9,
+ 0x911E, 0xDBB4,
+ 0x9122, 0xDBB3,
+ 0x9123, 0xDBB5,
+ 0x912F, 0xDBB7,
+ 0x9131, 0xDBB6,
+ 0x9139, 0xDBB8,
+ 0x9143, 0xDBB9,
+ 0x9146, 0xDBBA,
+ 0x9149, 0xD3CF,
+ 0x914A, 0xF4FA,
+ 0x914B, 0xC7F5,
+ 0x914C, 0xD7C3,
+ 0x914D, 0xC5E4,
+ 0x914E, 0xF4FC,
+ 0x914F, 0xF4FD,
+ 0x9150, 0xF4FB,
+ 0x9152, 0xBEC6,
+ 0x9157, 0xD0EF,
+ 0x915A, 0xB7D3,
+ 0x915D, 0xD4CD,
+ 0x915E, 0xCCAA,
+ 0x9161, 0xF5A2,
+ 0x9162, 0xF5A1,
+ 0x9163, 0xBAA8,
+ 0x9164, 0xF4FE,
+ 0x9165, 0xCBD6,
+ 0x9169, 0xF5A4,
+ 0x916A, 0xC0D2,
+ 0x916C, 0xB3EA,
+ 0x916E, 0xCDAA,
+ 0x916F, 0xF5A5,
+ 0x9170, 0xF5A3,
+ 0x9171, 0xBDB4,
+ 0x9172, 0xF5A8,
+ 0x9174, 0xF5A9,
+ 0x9175, 0xBDCD,
+ 0x9176, 0xC3B8,
+ 0x9177, 0xBFE1,
+ 0x9178, 0xCBE1,
+ 0x9179, 0xF5AA,
+ 0x917D, 0xF5A6,
+ 0x917E, 0xF5A7,
+ 0x917F, 0xC4F0,
+ 0x9185, 0xF5AC,
+ 0x9187, 0xB4BC,
+ 0x9189, 0xD7ED,
+ 0x918B, 0xB4D7,
+ 0x918C, 0xF5AB,
+ 0x918D, 0xF5AE,
+ 0x9190, 0xF5AD,
+ 0x9191, 0xF5AF,
+ 0x9192, 0xD0D1,
+ 0x919A, 0xC3D1,
+ 0x919B, 0xC8A9,
+ 0x91A2, 0xF5B0,
+ 0x91A3, 0xF5B1,
+ 0x91AA, 0xF5B2,
+ 0x91AD, 0xF5B3,
+ 0x91AE, 0xF5B4,
+ 0x91AF, 0xF5B5,
+ 0x91B4, 0xF5B7,
+ 0x91B5, 0xF5B6,
+ 0x91BA, 0xF5B8,
+ 0x91C7, 0xB2C9,
+ 0x91C9, 0xD3D4,
+ 0x91CA, 0xCACD,
+ 0x91CC, 0xC0EF,
+ 0x91CD, 0xD6D8,
+ 0x91CE, 0xD2B0,
+ 0x91CF, 0xC1BF,
+ 0x91D1, 0xBDF0,
+ 0x91DC, 0xB8AA,
+ 0x9274, 0xBCF8,
+ 0x928E, 0xF6C6,
+ 0x92AE, 0xF6C7,
+ 0x92C8, 0xF6C8,
+ 0x933E, 0xF6C9,
+ 0x936A, 0xF6CA,
+ 0x938F, 0xF6CC,
+ 0x93CA, 0xF6CB,
+ 0x93D6, 0xF7E9,
+ 0x943E, 0xF6CD,
+ 0x946B, 0xF6CE,
+ 0x9485, 0xEEC4,
+ 0x9486, 0xEEC5,
+ 0x9487, 0xEEC6,
+ 0x9488, 0xD5EB,
+ 0x9489, 0xB6A4,
+ 0x948A, 0xEEC8,
+ 0x948B, 0xEEC7,
+ 0x948C, 0xEEC9,
+ 0x948D, 0xEECA,
+ 0x948E, 0xC7A5,
+ 0x948F, 0xEECB,
+ 0x9490, 0xEECC,
+ 0x9492, 0xB7B0,
+ 0x9493, 0xB5F6,
+ 0x9494, 0xEECD,
+ 0x9495, 0xEECF,
+ 0x9497, 0xEECE,
+ 0x9499, 0xB8C6,
+ 0x949A, 0xEED0,
+ 0x949B, 0xEED1,
+ 0x949C, 0xEED2,
+ 0x949D, 0xB6DB,
+ 0x949E, 0xB3AE,
+ 0x949F, 0xD6D3,
+ 0x94A0, 0xC4C6,
+ 0x94A1, 0xB1B5,
+ 0x94A2, 0xB8D6,
+ 0x94A3, 0xEED3,
+ 0x94A4, 0xEED4,
+ 0x94A5, 0xD4BF,
+ 0x94A6, 0xC7D5,
+ 0x94A7, 0xBEFB,
+ 0x94A8, 0xCED9,
+ 0x94A9, 0xB9B3,
+ 0x94AA, 0xEED6,
+ 0x94AB, 0xEED5,
+ 0x94AC, 0xEED8,
+ 0x94AD, 0xEED7,
+ 0x94AE, 0xC5A5,
+ 0x94AF, 0xEED9,
+ 0x94B0, 0xEEDA,
+ 0x94B1, 0xC7AE,
+ 0x94B2, 0xEEDB,
+ 0x94B3, 0xC7AF,
+ 0x94B4, 0xEEDC,
+ 0x94B5, 0xB2A7,
+ 0x94B6, 0xEEDD,
+ 0x94B7, 0xEEDE,
+ 0x94B8, 0xEEDF,
+ 0x94B9, 0xEEE0,
+ 0x94BA, 0xEEE1,
+ 0x94BB, 0xD7EA,
+ 0x94BC, 0xEEE2,
+ 0x94BD, 0xEEE3,
+ 0x94BE, 0xBCD8,
+ 0x94BF, 0xEEE4,
+ 0x94C0, 0xD3CB,
+ 0x94C1, 0xCCFA,
+ 0x94C2, 0xB2AC,
+ 0x94C3, 0xC1E5,
+ 0x94C4, 0xEEE5,
+ 0x94C5, 0xC7A6,
+ 0x94C6, 0xC3AD,
+ 0x94C8, 0xEEE6,
+ 0x94C9, 0xEEE7,
+ 0x94CA, 0xEEE8,
+ 0x94CB, 0xEEE9,
+ 0x94CC, 0xEEEA,
+ 0x94CD, 0xEEEB,
+ 0x94CE, 0xEEEC,
+ 0x94D0, 0xEEED,
+ 0x94D1, 0xEEEE,
+ 0x94D2, 0xEEEF,
+ 0x94D5, 0xEEF0,
+ 0x94D6, 0xEEF1,
+ 0x94D7, 0xEEF2,
+ 0x94D8, 0xEEF4,
+ 0x94D9, 0xEEF3,
+ 0x94DB, 0xEEF5,
+ 0x94DC, 0xCDAD,
+ 0x94DD, 0xC2C1,
+ 0x94DE, 0xEEF6,
+ 0x94DF, 0xEEF7,
+ 0x94E0, 0xEEF8,
+ 0x94E1, 0xD5A1,
+ 0x94E2, 0xEEF9,
+ 0x94E3, 0xCFB3,
+ 0x94E4, 0xEEFA,
+ 0x94E5, 0xEEFB,
+ 0x94E7, 0xEEFC,
+ 0x94E8, 0xEEFD,
+ 0x94E9, 0xEFA1,
+ 0x94EA, 0xEEFE,
+ 0x94EB, 0xEFA2,
+ 0x94EC, 0xB8F5,
+ 0x94ED, 0xC3FA,
+ 0x94EE, 0xEFA3,
+ 0x94EF, 0xEFA4,
+ 0x94F0, 0xBDC2,
+ 0x94F1, 0xD2BF,
+ 0x94F2, 0xB2F9,
+ 0x94F3, 0xEFA5,
+ 0x94F4, 0xEFA6,
+ 0x94F5, 0xEFA7,
+ 0x94F6, 0xD2F8,
+ 0x94F7, 0xEFA8,
+ 0x94F8, 0xD6FD,
+ 0x94F9, 0xEFA9,
+ 0x94FA, 0xC6CC,
+ 0x94FC, 0xEFAA,
+ 0x94FD, 0xEFAB,
+ 0x94FE, 0xC1B4,
+ 0x94FF, 0xEFAC,
+ 0x9500, 0xCFFA,
+ 0x9501, 0xCBF8,
+ 0x9502, 0xEFAE,
+ 0x9503, 0xEFAD,
+ 0x9504, 0xB3FA,
+ 0x9505, 0xB9F8,
+ 0x9506, 0xEFAF,
+ 0x9507, 0xEFB0,
+ 0x9508, 0xD0E2,
+ 0x9509, 0xEFB1,
+ 0x950A, 0xEFB2,
+ 0x950B, 0xB7E6,
+ 0x950C, 0xD0BF,
+ 0x950D, 0xEFB3,
+ 0x950E, 0xEFB4,
+ 0x950F, 0xEFB5,
+ 0x9510, 0xC8F1,
+ 0x9511, 0xCCE0,
+ 0x9512, 0xEFB6,
+ 0x9513, 0xEFB7,
+ 0x9514, 0xEFB8,
+ 0x9515, 0xEFB9,
+ 0x9516, 0xEFBA,
+ 0x9517, 0xD5E0,
+ 0x9518, 0xEFBB,
+ 0x9519, 0xB4ED,
+ 0x951A, 0xC3AA,
+ 0x951B, 0xEFBC,
+ 0x951D, 0xEFBD,
+ 0x951E, 0xEFBE,
+ 0x951F, 0xEFBF,
+ 0x9521, 0xCEFD,
+ 0x9522, 0xEFC0,
+ 0x9523, 0xC2E0,
+ 0x9524, 0xB4B8,
+ 0x9525, 0xD7B6,
+ 0x9526, 0xBDF5,
+ 0x9528, 0xCFC7,
+ 0x9529, 0xEFC3,
+ 0x952A, 0xEFC1,
+ 0x952B, 0xEFC2,
+ 0x952C, 0xEFC4,
+ 0x952D, 0xB6A7,
+ 0x952E, 0xBCFC,
+ 0x952F, 0xBEE2,
+ 0x9530, 0xC3CC,
+ 0x9531, 0xEFC5,
+ 0x9532, 0xEFC6,
+ 0x9534, 0xEFC7,
+ 0x9535, 0xEFCF,
+ 0x9536, 0xEFC8,
+ 0x9537, 0xEFC9,
+ 0x9538, 0xEFCA,
+ 0x9539, 0xC7C2,
+ 0x953A, 0xEFF1,
+ 0x953B, 0xB6CD,
+ 0x953C, 0xEFCB,
+ 0x953E, 0xEFCC,
+ 0x953F, 0xEFCD,
+ 0x9540, 0xB6C6,
+ 0x9541, 0xC3BE,
+ 0x9542, 0xEFCE,
+ 0x9544, 0xEFD0,
+ 0x9545, 0xEFD1,
+ 0x9546, 0xEFD2,
+ 0x9547, 0xD5F2,
+ 0x9549, 0xEFD3,
+ 0x954A, 0xC4F7,
+ 0x954C, 0xEFD4,
+ 0x954D, 0xC4F8,
+ 0x954E, 0xEFD5,
+ 0x954F, 0xEFD6,
+ 0x9550, 0xB8E4,
+ 0x9551, 0xB0F7,
+ 0x9552, 0xEFD7,
+ 0x9553, 0xEFD8,
+ 0x9554, 0xEFD9,
+ 0x9556, 0xEFDA,
+ 0x9557, 0xEFDB,
+ 0x9558, 0xEFDC,
+ 0x9559, 0xEFDD,
+ 0x955B, 0xEFDE,
+ 0x955C, 0xBEB5,
+ 0x955D, 0xEFE1,
+ 0x955E, 0xEFDF,
+ 0x955F, 0xEFE0,
+ 0x9561, 0xEFE2,
+ 0x9562, 0xEFE3,
+ 0x9563, 0xC1CD,
+ 0x9564, 0xEFE4,
+ 0x9565, 0xEFE5,
+ 0x9566, 0xEFE6,
+ 0x9567, 0xEFE7,
+ 0x9568, 0xEFE8,
+ 0x9569, 0xEFE9,
+ 0x956A, 0xEFEA,
+ 0x956B, 0xEFEB,
+ 0x956C, 0xEFEC,
+ 0x956D, 0xC0D8,
+ 0x956F, 0xEFED,
+ 0x9570, 0xC1AD,
+ 0x9571, 0xEFEE,
+ 0x9572, 0xEFEF,
+ 0x9573, 0xEFF0,
+ 0x9576, 0xCFE2,
+ 0x957F, 0xB3A4,
+ 0x95E8, 0xC3C5,
+ 0x95E9, 0xE3C5,
+ 0x95EA, 0xC9C1,
+ 0x95EB, 0xE3C6,
+ 0x95ED, 0xB1D5,
+ 0x95EE, 0xCECA,
+ 0x95EF, 0xB4B3,
+ 0x95F0, 0xC8F2,
+ 0x95F1, 0xE3C7,
+ 0x95F2, 0xCFD0,
+ 0x95F3, 0xE3C8,
+ 0x95F4, 0xBCE4,
+ 0x95F5, 0xE3C9,
+ 0x95F6, 0xE3CA,
+ 0x95F7, 0xC3C6,
+ 0x95F8, 0xD5A2,
+ 0x95F9, 0xC4D6,
+ 0x95FA, 0xB9EB,
+ 0x95FB, 0xCEC5,
+ 0x95FC, 0xE3CB,
+ 0x95FD, 0xC3F6,
+ 0x95FE, 0xE3CC,
+ 0x9600, 0xB7A7,
+ 0x9601, 0xB8F3,
+ 0x9602, 0xBAD2,
+ 0x9603, 0xE3CD,
+ 0x9604, 0xE3CE,
+ 0x9605, 0xD4C4,
+ 0x9606, 0xE3CF,
+ 0x9608, 0xE3D0,
+ 0x9609, 0xD1CB,
+ 0x960A, 0xE3D1,
+ 0x960B, 0xE3D2,
+ 0x960C, 0xE3D3,
+ 0x960D, 0xE3D4,
+ 0x960E, 0xD1D6,
+ 0x960F, 0xE3D5,
+ 0x9610, 0xB2FB,
+ 0x9611, 0xC0BB,
+ 0x9612, 0xE3D6,
+ 0x9614, 0xC0AB,
+ 0x9615, 0xE3D7,
+ 0x9616, 0xE3D8,
+ 0x9617, 0xE3D9,
+ 0x9619, 0xE3DA,
+ 0x961A, 0xE3DB,
+ 0x961C, 0xB8B7,
+ 0x961D, 0xDAE2,
+ 0x961F, 0xB6D3,
+ 0x9621, 0xDAE4,
+ 0x9622, 0xDAE3,
+ 0x962A, 0xDAE6,
+ 0x962E, 0xC8EE,
+ 0x9631, 0xDAE5,
+ 0x9632, 0xB7C0,
+ 0x9633, 0xD1F4,
+ 0x9634, 0xD2F5,
+ 0x9635, 0xD5F3,
+ 0x9636, 0xBDD7,
+ 0x963B, 0xD7E8,
+ 0x963C, 0xDAE8,
+ 0x963D, 0xDAE7,
+ 0x963F, 0xB0A2,
+ 0x9640, 0xCDD3,
+ 0x9642, 0xDAE9,
+ 0x9644, 0xB8BD,
+ 0x9645, 0xBCCA,
+ 0x9646, 0xC2BD,
+ 0x9647, 0xC2A4,
+ 0x9648, 0xB3C2,
+ 0x9649, 0xDAEA,
+ 0x964B, 0xC2AA,
+ 0x964C, 0xC4B0,
+ 0x964D, 0xBDB5,
+ 0x9650, 0xCFDE,
+ 0x9654, 0xDAEB,
+ 0x9655, 0xC9C2,
+ 0x965B, 0xB1DD,
+ 0x965F, 0xDAEC,
+ 0x9661, 0xB6B8,
+ 0x9662, 0xD4BA,
+ 0x9664, 0xB3FD,
+ 0x9667, 0xDAED,
+ 0x9668, 0xD4C9,
+ 0x9669, 0xCFD5,
+ 0x966A, 0xC5E3,
+ 0x966C, 0xDAEE,
+ 0x9672, 0xDAEF,
+ 0x9674, 0xDAF0,
+ 0x9675, 0xC1EA,
+ 0x9676, 0xCCD5,
+ 0x9677, 0xCFDD,
+ 0x9685, 0xD3E7,
+ 0x9686, 0xC2A1,
+ 0x9688, 0xDAF1,
+ 0x968B, 0xCBE5,
+ 0x968D, 0xDAF2,
+ 0x968F, 0xCBE6,
+ 0x9690, 0xD2FE,
+ 0x9694, 0xB8F4,
+ 0x9697, 0xDAF3,
+ 0x9698, 0xB0AF,
+ 0x9699, 0xCFB6,
+ 0x969C, 0xD5CF,
+ 0x96A7, 0xCBED,
+ 0x96B0, 0xDAF4,
+ 0x96B3, 0xE3C4,
+ 0x96B6, 0xC1A5,
+ 0x96B9, 0xF6BF,
+ 0x96BC, 0xF6C0,
+ 0x96BD, 0xF6C1,
+ 0x96BE, 0xC4D1,
+ 0x96C0, 0xC8B8,
+ 0x96C1, 0xD1E3,
+ 0x96C4, 0xD0DB,
+ 0x96C5, 0xD1C5,
+ 0x96C6, 0xBCAF,
+ 0x96C7, 0xB9CD,
+ 0x96C9, 0xEFF4,
+ 0x96CC, 0xB4C6,
+ 0x96CD, 0xD3BA,
+ 0x96CE, 0xF6C2,
+ 0x96CF, 0xB3FB,
+ 0x96D2, 0xF6C3,
+ 0x96D5, 0xB5F1,
+ 0x96E0, 0xF6C5,
+ 0x96E8, 0xD3EA,
+ 0x96E9, 0xF6A7,
+ 0x96EA, 0xD1A9,
+ 0x96EF, 0xF6A9,
+ 0x96F3, 0xF6A8,
+ 0x96F6, 0xC1E3,
+ 0x96F7, 0xC0D7,
+ 0x96F9, 0xB1A2,
+ 0x96FE, 0xCEED,
+ 0x9700, 0xD0E8,
+ 0x9701, 0xF6AB,
+ 0x9704, 0xCFF6,
+ 0x9706, 0xF6AA,
+ 0x9707, 0xD5F0,
+ 0x9708, 0xF6AC,
+ 0x9709, 0xC3B9,
+ 0x970D, 0xBBF4,
+ 0x970E, 0xF6AE,
+ 0x970F, 0xF6AD,
+ 0x9713, 0xC4DE,
+ 0x9716, 0xC1D8,
+ 0x971C, 0xCBAA,
+ 0x971E, 0xCFBC,
+ 0x972A, 0xF6AF,
+ 0x972D, 0xF6B0,
+ 0x9730, 0xF6B1,
+ 0x9732, 0xC2B6,
+ 0x9738, 0xB0D4,
+ 0x9739, 0xC5F9,
+ 0x973E, 0xF6B2,
+ 0x9752, 0xC7E0,
+ 0x9753, 0xF6A6,
+ 0x9756, 0xBEB8,
+ 0x9759, 0xBEB2,
+ 0x975B, 0xB5E5,
+ 0x975E, 0xB7C7,
+ 0x9760, 0xBFBF,
+ 0x9761, 0xC3D2,
+ 0x9762, 0xC3E6,
+ 0x9765, 0xD8CC,
+ 0x9769, 0xB8EF,
+ 0x9773, 0xBDF9,
+ 0x9774, 0xD1A5,
+ 0x9776, 0xB0D0,
+ 0x977C, 0xF7B0,
+ 0x9785, 0xF7B1,
+ 0x978B, 0xD0AC,
+ 0x978D, 0xB0B0,
+ 0x9791, 0xF7B2,
+ 0x9792, 0xF7B3,
+ 0x9794, 0xF7B4,
+ 0x9798, 0xC7CA,
+ 0x97A0, 0xBECF,
+ 0x97A3, 0xF7B7,
+ 0x97AB, 0xF7B6,
+ 0x97AD, 0xB1DE,
+ 0x97AF, 0xF7B5,
+ 0x97B2, 0xF7B8,
+ 0x97B4, 0xF7B9,
+ 0x97E6, 0xCEA4,
+ 0x97E7, 0xC8CD,
+ 0x97E9, 0xBAAB,
+ 0x97EA, 0xE8B8,
+ 0x97EB, 0xE8B9,
+ 0x97EC, 0xE8BA,
+ 0x97ED, 0xBEC2,
+ 0x97F3, 0xD2F4,
+ 0x97F5, 0xD4CF,
+ 0x97F6, 0xC9D8,
+ 0x9875, 0xD2B3,
+ 0x9876, 0xB6A5,
+ 0x9877, 0xC7EA,
+ 0x9878, 0xF1FC,
+ 0x9879, 0xCFEE,
+ 0x987A, 0xCBB3,
+ 0x987B, 0xD0EB,
+ 0x987C, 0xE7EF,
+ 0x987D, 0xCDE7,
+ 0x987E, 0xB9CB,
+ 0x987F, 0xB6D9,
+ 0x9880, 0xF1FD,
+ 0x9881, 0xB0E4,
+ 0x9882, 0xCBCC,
+ 0x9883, 0xF1FE,
+ 0x9884, 0xD4A4,
+ 0x9885, 0xC2AD,
+ 0x9886, 0xC1EC,
+ 0x9887, 0xC6C4,
+ 0x9888, 0xBEB1,
+ 0x9889, 0xF2A1,
+ 0x988A, 0xBCD5,
+ 0x988C, 0xF2A2,
+ 0x988D, 0xF2A3,
+ 0x988F, 0xF2A4,
+ 0x9890, 0xD2C3,
+ 0x9891, 0xC6B5,
+ 0x9893, 0xCDC7,
+ 0x9894, 0xF2A5,
+ 0x9896, 0xD3B1,
+ 0x9897, 0xBFC5,
+ 0x9898, 0xCCE2,
+ 0x989A, 0xF2A6,
+ 0x989B, 0xF2A7,
+ 0x989C, 0xD1D5,
+ 0x989D, 0xB6EE,
+ 0x989E, 0xF2A8,
+ 0x989F, 0xF2A9,
+ 0x98A0, 0xB5DF,
+ 0x98A1, 0xF2AA,
+ 0x98A2, 0xF2AB,
+ 0x98A4, 0xB2FC,
+ 0x98A5, 0xF2AC,
+ 0x98A6, 0xF2AD,
+ 0x98A7, 0xC8A7,
+ 0x98CE, 0xB7E7,
+ 0x98D1, 0xECA9,
+ 0x98D2, 0xECAA,
+ 0x98D3, 0xECAB,
+ 0x98D5, 0xECAC,
+ 0x98D8, 0xC6AE,
+ 0x98D9, 0xECAD,
+ 0x98DA, 0xECAE,
+ 0x98DE, 0xB7C9,
+ 0x98DF, 0xCAB3,
+ 0x98E7, 0xE2B8,
+ 0x98E8, 0xF7CF,
+ 0x990D, 0xF7D0,
+ 0x9910, 0xB2CD,
+ 0x992E, 0xF7D1,
+ 0x9954, 0xF7D3,
+ 0x9955, 0xF7D2,
+ 0x9963, 0xE2BB,
+ 0x9965, 0xBCA2,
+ 0x9967, 0xE2BC,
+ 0x9968, 0xE2BD,
+ 0x9969, 0xE2BE,
+ 0x996A, 0xE2BF,
+ 0x996B, 0xE2C0,
+ 0x996C, 0xE2C1,
+ 0x996D, 0xB7B9,
+ 0x996E, 0xD2FB,
+ 0x996F, 0xBDA4,
+ 0x9970, 0xCACE,
+ 0x9971, 0xB1A5,
+ 0x9972, 0xCBC7,
+ 0x9974, 0xE2C2,
+ 0x9975, 0xB6FC,
+ 0x9976, 0xC8C4,
+ 0x9977, 0xE2C3,
+ 0x997A, 0xBDC8,
+ 0x997C, 0xB1FD,
+ 0x997D, 0xE2C4,
+ 0x997F, 0xB6F6,
+ 0x9980, 0xE2C5,
+ 0x9981, 0xC4D9,
+ 0x9984, 0xE2C6,
+ 0x9985, 0xCFDA,
+ 0x9986, 0xB9DD,
+ 0x9987, 0xE2C7,
+ 0x9988, 0xC0A1,
+ 0x998A, 0xE2C8,
+ 0x998B, 0xB2F6,
+ 0x998D, 0xE2C9,
+ 0x998F, 0xC1F3,
+ 0x9990, 0xE2CA,
+ 0x9991, 0xE2CB,
+ 0x9992, 0xC2F8,
+ 0x9993, 0xE2CC,
+ 0x9994, 0xE2CD,
+ 0x9995, 0xE2CE,
+ 0x9996, 0xCAD7,
+ 0x9997, 0xD8B8,
+ 0x9998, 0xD9E5,
+ 0x9999, 0xCFE3,
+ 0x99A5, 0xF0A5,
+ 0x99A8, 0xDCB0,
+ 0x9A6C, 0xC2ED,
+ 0x9A6D, 0xD4A6,
+ 0x9A6E, 0xCDD4,
+ 0x9A6F, 0xD1B1,
+ 0x9A70, 0xB3DB,
+ 0x9A71, 0xC7FD,
+ 0x9A73, 0xB2B5,
+ 0x9A74, 0xC2BF,
+ 0x9A75, 0xE6E0,
+ 0x9A76, 0xCABB,
+ 0x9A77, 0xE6E1,
+ 0x9A78, 0xE6E2,
+ 0x9A79, 0xBED4,
+ 0x9A7A, 0xE6E3,
+ 0x9A7B, 0xD7A4,
+ 0x9A7C, 0xCDD5,
+ 0x9A7D, 0xE6E5,
+ 0x9A7E, 0xBCDD,
+ 0x9A7F, 0xE6E4,
+ 0x9A80, 0xE6E6,
+ 0x9A81, 0xE6E7,
+ 0x9A82, 0xC2EE,
+ 0x9A84, 0xBDBE,
+ 0x9A85, 0xE6E8,
+ 0x9A86, 0xC2E6,
+ 0x9A87, 0xBAA7,
+ 0x9A88, 0xE6E9,
+ 0x9A8A, 0xE6EA,
+ 0x9A8B, 0xB3D2,
+ 0x9A8C, 0xD1E9,
+ 0x9A8F, 0xBFA5,
+ 0x9A90, 0xE6EB,
+ 0x9A91, 0xC6EF,
+ 0x9A92, 0xE6EC,
+ 0x9A93, 0xE6ED,
+ 0x9A96, 0xE6EE,
+ 0x9A97, 0xC6AD,
+ 0x9A98, 0xE6EF,
+ 0x9A9A, 0xC9A7,
+ 0x9A9B, 0xE6F0,
+ 0x9A9C, 0xE6F1,
+ 0x9A9D, 0xE6F2,
+ 0x9A9E, 0xE5B9,
+ 0x9A9F, 0xE6F3,
+ 0x9AA0, 0xE6F4,
+ 0x9AA1, 0xC2E2,
+ 0x9AA2, 0xE6F5,
+ 0x9AA3, 0xE6F6,
+ 0x9AA4, 0xD6E8,
+ 0x9AA5, 0xE6F7,
+ 0x9AA7, 0xE6F8,
+ 0x9AA8, 0xB9C7,
+ 0x9AB0, 0xF7BB,
+ 0x9AB1, 0xF7BA,
+ 0x9AB6, 0xF7BE,
+ 0x9AB7, 0xF7BC,
+ 0x9AB8, 0xBAA1,
+ 0x9ABA, 0xF7BF,
+ 0x9ABC, 0xF7C0,
+ 0x9AC0, 0xF7C2,
+ 0x9AC1, 0xF7C1,
+ 0x9AC2, 0xF7C4,
+ 0x9AC5, 0xF7C3,
+ 0x9ACB, 0xF7C5,
+ 0x9ACC, 0xF7C6,
+ 0x9AD1, 0xF7C7,
+ 0x9AD3, 0xCBE8,
+ 0x9AD8, 0xB8DF,
+ 0x9ADF, 0xF7D4,
+ 0x9AE1, 0xF7D5,
+ 0x9AE6, 0xF7D6,
+ 0x9AEB, 0xF7D8,
+ 0x9AED, 0xF7DA,
+ 0x9AEF, 0xF7D7,
+ 0x9AF9, 0xF7DB,
+ 0x9AFB, 0xF7D9,
+ 0x9B03, 0xD7D7,
+ 0x9B08, 0xF7DC,
+ 0x9B0F, 0xF7DD,
+ 0x9B13, 0xF7DE,
+ 0x9B1F, 0xF7DF,
+ 0x9B23, 0xF7E0,
+ 0x9B2F, 0xDBCB,
+ 0x9B32, 0xD8AA,
+ 0x9B3B, 0xE5F7,
+ 0x9B3C, 0xB9ED,
+ 0x9B41, 0xBFFD,
+ 0x9B42, 0xBBEA,
+ 0x9B43, 0xF7C9,
+ 0x9B44, 0xC6C7,
+ 0x9B45, 0xF7C8,
+ 0x9B47, 0xF7CA,
+ 0x9B48, 0xF7CC,
+ 0x9B49, 0xF7CB,
+ 0x9B4D, 0xF7CD,
+ 0x9B4F, 0xCEBA,
+ 0x9B51, 0xF7CE,
+ 0x9B54, 0xC4A7,
+ 0x9C7C, 0xD3E3,
+ 0x9C7F, 0xF6CF,
+ 0x9C81, 0xC2B3,
+ 0x9C82, 0xF6D0,
+ 0x9C85, 0xF6D1,
+ 0x9C86, 0xF6D2,
+ 0x9C87, 0xF6D3,
+ 0x9C88, 0xF6D4,
+ 0x9C8B, 0xF6D6,
+ 0x9C8D, 0xB1AB,
+ 0x9C8E, 0xF6D7,
+ 0x9C90, 0xF6D8,
+ 0x9C91, 0xF6D9,
+ 0x9C92, 0xF6DA,
+ 0x9C94, 0xF6DB,
+ 0x9C95, 0xF6DC,
+ 0x9C9A, 0xF6DD,
+ 0x9C9B, 0xF6DE,
+ 0x9C9C, 0xCFCA,
+ 0x9C9E, 0xF6DF,
+ 0x9C9F, 0xF6E0,
+ 0x9CA0, 0xF6E1,
+ 0x9CA1, 0xF6E2,
+ 0x9CA2, 0xF6E3,
+ 0x9CA3, 0xF6E4,
+ 0x9CA4, 0xC0F0,
+ 0x9CA5, 0xF6E5,
+ 0x9CA6, 0xF6E6,
+ 0x9CA7, 0xF6E7,
+ 0x9CA8, 0xF6E8,
+ 0x9CA9, 0xF6E9,
+ 0x9CAB, 0xF6EA,
+ 0x9CAD, 0xF6EB,
+ 0x9CAE, 0xF6EC,
+ 0x9CB0, 0xF6ED,
+ 0x9CB1, 0xF6EE,
+ 0x9CB2, 0xF6EF,
+ 0x9CB3, 0xF6F0,
+ 0x9CB4, 0xF6F1,
+ 0x9CB5, 0xF6F2,
+ 0x9CB6, 0xF6F3,
+ 0x9CB7, 0xF6F4,
+ 0x9CB8, 0xBEA8,
+ 0x9CBA, 0xF6F5,
+ 0x9CBB, 0xF6F6,
+ 0x9CBC, 0xF6F7,
+ 0x9CBD, 0xF6F8,
+ 0x9CC3, 0xC8FA,
+ 0x9CC4, 0xF6F9,
+ 0x9CC5, 0xF6FA,
+ 0x9CC6, 0xF6FB,
+ 0x9CC7, 0xF6FC,
+ 0x9CCA, 0xF6FD,
+ 0x9CCB, 0xF6FE,
+ 0x9CCC, 0xF7A1,
+ 0x9CCD, 0xF7A2,
+ 0x9CCE, 0xF7A3,
+ 0x9CCF, 0xF7A4,
+ 0x9CD0, 0xF7A5,
+ 0x9CD3, 0xF7A6,
+ 0x9CD4, 0xF7A7,
+ 0x9CD5, 0xF7A8,
+ 0x9CD6, 0xB1EE,
+ 0x9CD7, 0xF7A9,
+ 0x9CD8, 0xF7AA,
+ 0x9CD9, 0xF7AB,
+ 0x9CDC, 0xF7AC,
+ 0x9CDD, 0xF7AD,
+ 0x9CDE, 0xC1DB,
+ 0x9CDF, 0xF7AE,
+ 0x9CE2, 0xF7AF,
+ 0x9E1F, 0xC4F1,
+ 0x9E20, 0xF0AF,
+ 0x9E21, 0xBCA6,
+ 0x9E22, 0xF0B0,
+ 0x9E23, 0xC3F9,
+ 0x9E25, 0xC5B8,
+ 0x9E26, 0xD1BB,
+ 0x9E28, 0xF0B1,
+ 0x9E29, 0xF0B2,
+ 0x9E2A, 0xF0B3,
+ 0x9E2B, 0xF0B4,
+ 0x9E2C, 0xF0B5,
+ 0x9E2D, 0xD1BC,
+ 0x9E2F, 0xD1EC,
+ 0x9E31, 0xF0B7,
+ 0x9E32, 0xF0B6,
+ 0x9E33, 0xD4A7,
+ 0x9E35, 0xCDD2,
+ 0x9E36, 0xF0B8,
+ 0x9E37, 0xF0BA,
+ 0x9E38, 0xF0B9,
+ 0x9E39, 0xF0BB,
+ 0x9E3A, 0xF0BC,
+ 0x9E3D, 0xB8EB,
+ 0x9E3E, 0xF0BD,
+ 0x9E3F, 0xBAE8,
+ 0x9E41, 0xF0BE,
+ 0x9E42, 0xF0BF,
+ 0x9E43, 0xBEE9,
+ 0x9E44, 0xF0C0,
+ 0x9E45, 0xB6EC,
+ 0x9E46, 0xF0C1,
+ 0x9E47, 0xF0C2,
+ 0x9E48, 0xF0C3,
+ 0x9E49, 0xF0C4,
+ 0x9E4A, 0xC8B5,
+ 0x9E4B, 0xF0C5,
+ 0x9E4C, 0xF0C6,
+ 0x9E4E, 0xF0C7,
+ 0x9E4F, 0xC5F4,
+ 0x9E51, 0xF0C8,
+ 0x9E55, 0xF0C9,
+ 0x9E57, 0xF0CA,
+ 0x9E58, 0xF7BD,
+ 0x9E5A, 0xF0CB,
+ 0x9E5B, 0xF0CC,
+ 0x9E5C, 0xF0CD,
+ 0x9E5E, 0xF0CE,
+ 0x9E63, 0xF0CF,
+ 0x9E64, 0xBAD7,
+ 0x9E66, 0xF0D0,
+ 0x9E67, 0xF0D1,
+ 0x9E68, 0xF0D2,
+ 0x9E69, 0xF0D3,
+ 0x9E6A, 0xF0D4,
+ 0x9E6B, 0xF0D5,
+ 0x9E6C, 0xF0D6,
+ 0x9E6D, 0xF0D8,
+ 0x9E70, 0xD3A5,
+ 0x9E71, 0xF0D7,
+ 0x9E73, 0xF0D9,
+ 0x9E7E, 0xF5BA,
+ 0x9E7F, 0xC2B9,
+ 0x9E82, 0xF7E4,
+ 0x9E87, 0xF7E5,
+ 0x9E88, 0xF7E6,
+ 0x9E8B, 0xF7E7,
+ 0x9E92, 0xF7E8,
+ 0x9E93, 0xC2B4,
+ 0x9E9D, 0xF7EA,
+ 0x9E9F, 0xF7EB,
+ 0x9EA6, 0xC2F3,
+ 0x9EB4, 0xF4F0,
+ 0x9EB8, 0xF4EF,
+ 0x9EBB, 0xC2E9,
+ 0x9EBD, 0xF7E1,
+ 0x9EBE, 0xF7E2,
+ 0x9EC4, 0xBBC6,
+ 0x9EC9, 0xD9E4,
+ 0x9ECD, 0xCAF2,
+ 0x9ECE, 0xC0E8,
+ 0x9ECF, 0xF0A4,
+ 0x9ED1, 0xBADA,
+ 0x9ED4, 0xC7AD,
+ 0x9ED8, 0xC4AC,
+ 0x9EDB, 0xF7EC,
+ 0x9EDC, 0xF7ED,
+ 0x9EDD, 0xF7EE,
+ 0x9EDF, 0xF7F0,
+ 0x9EE0, 0xF7EF,
+ 0x9EE2, 0xF7F1,
+ 0x9EE5, 0xF7F4,
+ 0x9EE7, 0xF7F3,
+ 0x9EE9, 0xF7F2,
+ 0x9EEA, 0xF7F5,
+ 0x9EEF, 0xF7F6,
+ 0x9EF9, 0xEDE9,
+ 0x9EFB, 0xEDEA,
+ 0x9EFC, 0xEDEB,
+ 0x9EFE, 0xF6BC,
+ 0x9F0B, 0xF6BD,
+ 0x9F0D, 0xF6BE,
+ 0x9F0E, 0xB6A6,
+ 0x9F10, 0xD8BE,
+ 0x9F13, 0xB9C4,
+ 0x9F17, 0xD8BB,
+ 0x9F19, 0xDCB1,
+ 0x9F20, 0xCAF3,
+ 0x9F22, 0xF7F7,
+ 0x9F2C, 0xF7F8,
+ 0x9F2F, 0xF7F9,
+ 0x9F37, 0xF7FB,
+ 0x9F39, 0xF7FA,
+ 0x9F3B, 0xB1C7,
+ 0x9F3D, 0xF7FC,
+ 0x9F3E, 0xF7FD,
+ 0x9F44, 0xF7FE,
+ 0x9F50, 0xC6EB,
+ 0x9F51, 0xECB4,
+ 0x9F7F, 0xB3DD,
+ 0x9F80, 0xF6B3,
+ 0x9F83, 0xF6B4,
+ 0x9F84, 0xC1E4,
+ 0x9F85, 0xF6B5,
+ 0x9F86, 0xF6B6,
+ 0x9F87, 0xF6B7,
+ 0x9F88, 0xF6B8,
+ 0x9F89, 0xF6B9,
+ 0x9F8A, 0xF6BA,
+ 0x9F8B, 0xC8A3,
+ 0x9F8C, 0xF6BB,
+ 0x9F99, 0xC1FA,
+ 0x9F9A, 0xB9A8,
+ 0x9F9B, 0xEDE8,
+ 0x9F9F, 0xB9EA,
+ 0x9FA0, 0xD9DF,
+ 0xFF01, 0xA3A1,
+ 0xFF02, 0xA3A2,
+ 0xFF03, 0xA3A3,
+ 0xFF04, 0xA1E7,
+ 0xFF05, 0xA3A5,
+ 0xFF06, 0xA3A6,
+ 0xFF07, 0xA3A7,
+ 0xFF08, 0xA3A8,
+ 0xFF09, 0xA3A9,
+ 0xFF0A, 0xA3AA,
+ 0xFF0B, 0xA3AB,
+ 0xFF0C, 0xA3AC,
+ 0xFF0D, 0xA3AD,
+ 0xFF0E, 0xA3AE,
+ 0xFF0F, 0xA3AF,
+ 0xFF10, 0xA3B0,
+ 0xFF11, 0xA3B1,
+ 0xFF12, 0xA3B2,
+ 0xFF13, 0xA3B3,
+ 0xFF14, 0xA3B4,
+ 0xFF15, 0xA3B5,
+ 0xFF16, 0xA3B6,
+ 0xFF17, 0xA3B7,
+ 0xFF18, 0xA3B8,
+ 0xFF19, 0xA3B9,
+ 0xFF1A, 0xA3BA,
+ 0xFF1B, 0xA3BB,
+ 0xFF1C, 0xA3BC,
+ 0xFF1D, 0xA3BD,
+ 0xFF1E, 0xA3BE,
+ 0xFF1F, 0xA3BF,
+ 0xFF20, 0xA3C0,
+ 0xFF21, 0xA3C1,
+ 0xFF22, 0xA3C2,
+ 0xFF23, 0xA3C3,
+ 0xFF24, 0xA3C4,
+ 0xFF25, 0xA3C5,
+ 0xFF26, 0xA3C6,
+ 0xFF27, 0xA3C7,
+ 0xFF28, 0xA3C8,
+ 0xFF29, 0xA3C9,
+ 0xFF2A, 0xA3CA,
+ 0xFF2B, 0xA3CB,
+ 0xFF2C, 0xA3CC,
+ 0xFF2D, 0xA3CD,
+ 0xFF2E, 0xA3CE,
+ 0xFF2F, 0xA3CF,
+ 0xFF30, 0xA3D0,
+ 0xFF31, 0xA3D1,
+ 0xFF32, 0xA3D2,
+ 0xFF33, 0xA3D3,
+ 0xFF34, 0xA3D4,
+ 0xFF35, 0xA3D5,
+ 0xFF36, 0xA3D6,
+ 0xFF37, 0xA3D7,
+ 0xFF38, 0xA3D8,
+ 0xFF39, 0xA3D9,
+ 0xFF3A, 0xA3DA,
+ 0xFF3B, 0xA3DB,
+ 0xFF3C, 0xA3DC,
+ 0xFF3D, 0xA3DD,
+ 0xFF3E, 0xA3DE,
+ 0xFF3F, 0xA3DF,
+ 0xFF40, 0xA3E0,
+ 0xFF41, 0xA3E1,
+ 0xFF42, 0xA3E2,
+ 0xFF43, 0xA3E3,
+ 0xFF44, 0xA3E4,
+ 0xFF45, 0xA3E5,
+ 0xFF46, 0xA3E6,
+ 0xFF47, 0xA3E7,
+ 0xFF48, 0xA3E8,
+ 0xFF49, 0xA3E9,
+ 0xFF4A, 0xA3EA,
+ 0xFF4B, 0xA3EB,
+ 0xFF4C, 0xA3EC,
+ 0xFF4D, 0xA3ED,
+ 0xFF4E, 0xA3EE,
+ 0xFF4F, 0xA3EF,
+ 0xFF50, 0xA3F0,
+ 0xFF51, 0xA3F1,
+ 0xFF52, 0xA3F2,
+ 0xFF53, 0xA3F3,
+ 0xFF54, 0xA3F4,
+ 0xFF55, 0xA3F5,
+ 0xFF56, 0xA3F6,
+ 0xFF57, 0xA3F7,
+ 0xFF58, 0xA3F8,
+ 0xFF59, 0xA3F9,
+ 0xFF5A, 0xA3FA,
+ 0xFF5B, 0xA3FB,
+ 0xFF5C, 0xA3FC,
+ 0xFF5D, 0xA3FD,
+ 0xFF5E, 0xA1AB,
+ 0xFFE0, 0xA1E9,
+ 0xFFE1, 0xA1EA,
+ 0xFFE3, 0xA3FE,
+ 0xFFE5, 0xA3A4
+};
diff --git a/backend/gs1.c b/backend/gs1.c
new file mode 100644
index 0000000..dbad2ca
--- /dev/null
+++ b/backend/gs1.c
@@ -0,0 +1,322 @@
+/* gs1.c - Verifies GS1 data */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef _MSC_VER
+#include <malloc.h>
+#endif
+#include "common.h"
+#include "gs1.h"
+
+/* This code does some checks on the integrity of GS1 data. It is not intended
+ to be bulletproof, nor does it report very accurately what problem was found
+ or where, but should prevent some of the more common encoding errors */
+
+void itostr(char ai_string[], int ai_value)
+{
+ int thou, hund, ten, unit;
+ char temp[2];
+
+ strcpy(ai_string, "(");
+ thou = ai_value / 1000;
+ hund = (ai_value - (1000 * thou)) / 100;
+ ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10;
+ unit = ai_value - ((1000 * thou) + (100 * hund) + (10 * ten));
+
+ temp[1] = '\0';
+ if(ai_value >= 1000) { temp[0] = itoc(thou); concat(ai_string, temp); }
+ if(ai_value >= 100) { temp[0] = itoc(hund); concat(ai_string, temp); }
+ temp[0] = itoc(ten);
+ concat(ai_string, temp);
+ temp[0] = itoc(unit);
+ concat(ai_string, temp);
+ concat(ai_string, ")");
+}
+
+int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[])
+{
+ int i, j, last_ai, ai_latch;
+ char ai_string[6];
+ int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length;
+ int ai_value[100], ai_location[100], ai_count, data_location[100], data_length[100];
+ int error_latch;
+
+ /* Detect extended ASCII characters */
+ for(i = 0; i < src_len; i++) {
+ if(source[i] >=128) {
+ strcpy(symbol->errtxt, "Extended ASCII characters are not supported by GS1");
+ return ERROR_INVALID_DATA;
+ }
+ if(source[i] < 32) {
+ strcpy(symbol->errtxt, "Control characters are not supported by GS1");
+ return ERROR_INVALID_DATA;
+ }
+ }
+
+ if(source[0] != '[') {
+ strcpy(symbol->errtxt, "Data does not start with an AI");
+ return ERROR_INVALID_DATA;
+ }
+
+ /* Check the position of the brackets */
+ bracket_level = 0;
+ max_bracket_level = 0;
+ ai_length = 0;
+ max_ai_length = 0;
+ min_ai_length = 5;
+ j = 0;
+ ai_latch = 0;
+ for(i = 0; i < src_len; i++) {
+ ai_length += j;
+ if(((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { ai_latch = 1; }
+ if(source[i] == '[') { bracket_level++; j = 1; }
+ if(source[i] == ']') {
+ bracket_level--;
+ if(ai_length < min_ai_length) { min_ai_length = ai_length; }
+ j = 0;
+ ai_length = 0;
+ }
+ if(bracket_level > max_bracket_level) { max_bracket_level = bracket_level; }
+ if(ai_length > max_ai_length) { max_ai_length = ai_length; }
+ }
+ min_ai_length--;
+
+ if(bracket_level != 0) {
+ /* Not all brackets are closed */
+ strcpy(symbol->errtxt, "Malformed AI in input data (brackets don\'t match)");
+ return ERROR_INVALID_DATA;
+ }
+
+ if(max_bracket_level > 1) {
+ /* Nested brackets */
+ strcpy(symbol->errtxt, "Found nested brackets in input data");
+ return ERROR_INVALID_DATA;
+ }
+
+ if(max_ai_length > 4) {
+ /* AI is too long */
+ strcpy(symbol->errtxt, "Invalid AI in input data (AI too long)");
+ return ERROR_INVALID_DATA;
+ }
+
+ if(min_ai_length <= 1) {
+ /* AI is too short */
+ strcpy(symbol->errtxt, "Invalid AI in input data (AI too short)");
+ return ERROR_INVALID_DATA;
+ }
+
+ if(ai_latch == 1) {
+ /* Non-numeric data in AI */
+ strcpy(symbol->errtxt, "Invalid AI in input data (non-numeric characters in AI)");
+ return ERROR_INVALID_DATA;
+ }
+
+ ai_count = 0;
+ for(i = 1; i < src_len; i++) {
+ if(source[i - 1] == '[') {
+ ai_location[ai_count] = i;
+ j = 0;
+ do {
+ ai_string[j] = source[i + j];
+ j++;
+ } while (ai_string[j - 1] != ']');
+ ai_string[j - 1] = '\0';
+ ai_value[ai_count] = atoi(ai_string);
+ ai_count++;
+ }
+ }
+
+ for(i = 0; i < ai_count; i++) {
+ data_location[i] = ai_location[i] + 3;
+ if(ai_value[i] >= 100) { data_location[i]++; }
+ if(ai_value[i] >= 1000) { data_location[i]++; }
+ data_length[i] = 0;
+ do {
+ data_length[i]++;
+ } while ((source[data_location[i] + data_length[i] - 1] != '[') && (source[data_location[i] + data_length[i] - 1] != '\0'));
+ data_length[i]--;
+ }
+
+ for(i = 0; i < ai_count; i++) {
+ if(data_length[i] == 0) {
+ /* No data for given AI */
+ strcpy(symbol->errtxt, "Empty data field in input data");
+ return ERROR_INVALID_DATA;
+ }
+ }
+
+ error_latch = 0;
+ strcpy(ai_string, "");
+ for(i = 0; i < ai_count; i++) {
+ switch (ai_value[i]) {
+ case 0: if(data_length[i] != 18) { error_latch = 1; } break;
+ case 1:
+ case 2:
+ case 3: if(data_length[i] != 14) { error_latch = 1; } break;
+ case 4: if(data_length[i] != 16) { error_latch = 1; } break;
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ case 18:
+ case 19: if(data_length[i] != 6) { error_latch = 1; } break;
+ case 20: if(data_length[i] != 2) { error_latch = 1; } break;
+ case 23:
+ case 24:
+ case 25:
+ case 39:
+ case 40:
+ case 41:
+ case 42:
+ case 70:
+ case 80:
+ case 81: error_latch = 2; break;
+ }
+ if(
+ ((ai_value[i] >= 100) && (ai_value[i] <= 179))
+ || ((ai_value[i] >= 1000) && (ai_value[i] <= 1799))
+ || ((ai_value[i] >= 200) && (ai_value[i] <= 229))
+ || ((ai_value[i] >= 2000) && (ai_value[i] <= 2299))
+ || ((ai_value[i] >= 300) && (ai_value[i] <= 309))
+ || ((ai_value[i] >= 3000) && (ai_value[i] <= 3099))
+ || ((ai_value[i] >= 31) && (ai_value[i] <= 36))
+ || ((ai_value[i] >= 310) && (ai_value[i] <= 369))
+ ) {
+ error_latch = 2;
+ }
+ if((ai_value[i] >= 3100) && (ai_value[i] <= 3699)) {
+ if(data_length[i] != 6) {
+ error_latch = 1;
+ }
+ }
+ if(
+ ((ai_value[i] >= 370) && (ai_value[i] <= 379))
+ || ((ai_value[i] >= 3700) && (ai_value[i] <= 3799))
+ ) {
+ error_latch = 2;
+ }
+ if((ai_value[i] >= 410) && (ai_value[i] <= 415)) {
+ if(data_length[i] != 13) {
+ error_latch = 1;
+ }
+ }
+ if(
+ ((ai_value[i] >= 4100) && (ai_value[i] <= 4199))
+ || ((ai_value[i] >= 700) && (ai_value[i] <= 703))
+ || ((ai_value[i] >= 800) && (ai_value[i] <= 810))
+ || ((ai_value[i] >= 900) && (ai_value[i] <= 999))
+ || ((ai_value[i] >= 9000) && (ai_value[i] <= 9999))
+ ) {
+ error_latch = 2;
+ }
+ if((error_latch < 4) && (error_latch > 0)) {
+ /* error has just been detected: capture AI */
+ itostr(ai_string, ai_value[i]);
+ error_latch += 4;
+ }
+ }
+
+ if(error_latch == 5) {
+ strcpy(symbol->errtxt, "Invalid data length for AI ");
+ concat(symbol->errtxt, ai_string);
+ return ERROR_INVALID_DATA;
+ }
+
+ if(error_latch == 6) {
+ strcpy(symbol->errtxt, "Invalid AI value ");
+ concat(symbol->errtxt, ai_string);
+ return ERROR_INVALID_DATA;
+ }
+
+ /* Resolve AI data - put resulting string in 'reduced' */
+ j = 0;
+ last_ai = 0;
+ ai_latch = 1;
+ for(i = 0; i < src_len; i++) {
+ if((source[i] != '[') && (source[i] != ']')) {
+ reduced[j++] = source[i];
+ }
+ if(source[i] == '[') {
+ /* Start of an AI string */
+ if(ai_latch == 0) {
+ reduced[j++] = '[';
+ }
+ ai_string[0] = source[i + 1];
+ ai_string[1] = source[i + 2];
+ ai_string[2] = '\0';
+ last_ai = atoi(ai_string);
+ ai_latch = 0;
+ /* The following values from "GS-1 General Specification version 8.0 issue 2, May 2008"
+ figure 5.4.8.2.1 - 1 "Element Strings with Pre-Defined Length Using Application Identifiers" */
+ if(
+ ((last_ai >= 0) && (last_ai <= 4))
+ || ((last_ai >= 11) && (last_ai <= 20))
+ || (last_ai == 23) /* legacy support - see 5.3.8.2.2 */
+ || ((last_ai >= 31) && (last_ai <= 36))
+ || (last_ai == 41)
+ ) {
+ ai_latch = 1;
+ }
+ }
+ /* The ']' character is simply dropped from the input */
+ }
+ reduced[j] = '\0';
+
+ /* the character '[' in the reduced string refers to the FNC1 character */
+ return 0;
+}
+
+int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[])
+{
+ /* Only to keep the compiler happy */
+#ifndef _MSC_VER
+ char temp[src_len + 5];
+#else
+ char* temp = (char*)_alloca(src_len + 5);
+#endif
+ int error_number;
+
+ error_number = gs1_verify(symbol, source, src_len, temp);
+ if(error_number != 0) { return error_number; }
+
+ if (strlen(temp) < src_len + 5) {
+ ustrcpy(reduced, (unsigned char*)temp);
+ return 0;
+ }
+ strcpy(symbol->errtxt, "ugs1_verify overflow");
+ return ERROR_INVALID_DATA;
+}
diff --git a/backend/gs1.h b/backend/gs1.h
new file mode 100644
index 0000000..8b345a2
--- /dev/null
+++ b/backend/gs1.h
@@ -0,0 +1,46 @@
+/* gs1.h - Verifies GS1 data */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+#ifndef __GS1_H
+#define __GS1_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+extern int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]);
+extern int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GS1_H */ \ No newline at end of file
diff --git a/backend/large.c b/backend/large.c
new file mode 100644
index 0000000..ff44ecd
--- /dev/null
+++ b/backend/large.c
@@ -0,0 +1,238 @@
+/* large.c - Handles binary manipulation of large numbers */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+#include "large.h"
+
+static const short int BCD[40] = {
+ 0, 0, 0, 0,
+ 1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 1, 1, 0, 0,
+ 0, 0, 1, 0,
+ 1, 0, 1, 0,
+ 0, 1, 1, 0,
+ 1, 1, 1, 0,
+ 0, 0, 0, 1,
+ 1, 0, 0, 1 };
+
+void binary_add(short int accumulator[], short int input_buffer[])
+{ /* Binary addition */
+ int i, carry, done;
+ carry = 0;
+
+ for(i = 0; i < 112; i++) {
+ done = 0;
+ if(((input_buffer[i] == 0) && (accumulator[i] == 0)) && ((carry == 0) && (done == 0))) {
+ accumulator[i] = 0;
+ carry = 0;
+ done = 1;
+ }
+ if(((input_buffer[i] == 0) && (accumulator[i] == 0)) && ((carry == 1) && (done == 0))) {
+ accumulator[i] = 1;
+ carry = 0;
+ done = 1;
+ }
+ if(((input_buffer[i] == 0) && (accumulator[i] == 1)) && ((carry == 0) && (done == 0))) {
+ accumulator[i] = 1;
+ carry = 0;
+ done = 1;
+ }
+ if(((input_buffer[i] == 0) && (accumulator[i] == 1)) && ((carry == 1) && (done == 0))) {
+ accumulator[i] = 0;
+ carry = 1;
+ done = 1;
+ }
+ if(((input_buffer[i] == 1) && (accumulator[i] == 0)) && ((carry == 0) && (done == 0))) {
+ accumulator[i] = 1;
+ carry = 0;
+ done = 1;
+ }
+ if(((input_buffer[i] == 1) && (accumulator[i] == 0)) && ((carry == 1) && (done == 0))) {
+ accumulator[i] = 0;
+ carry = 1;
+ done = 1;
+ }
+ if(((input_buffer[i] == 1) && (accumulator[i] == 1)) && ((carry == 0) && (done == 0))) {
+ accumulator[i] = 0;
+ carry = 1;
+ done = 1;
+ }
+ if(((input_buffer[i] == 1) && (accumulator[i] == 1)) && ((carry == 1) && (done == 0))) {
+ accumulator[i] = 1;
+ carry = 1;
+ done = 1;
+ }
+ }
+}
+
+void binary_subtract(short int accumulator[], short int input_buffer[])
+{ /* 2's compliment subtraction */
+ /* take input_buffer from accumulator and put answer in accumulator */
+ int i;
+ short int sub_buffer[112];
+
+ for(i = 0; i < 112; i++) {
+ if(input_buffer[i] == 0) {
+ sub_buffer[i] = 1;
+ } else {
+ sub_buffer[i] = 0;
+ }
+ }
+ binary_add(accumulator, sub_buffer);
+
+ sub_buffer[0] = 1;
+
+ for(i = 1; i < 112; i++) {
+ sub_buffer[i] = 0;
+ }
+ binary_add(accumulator, sub_buffer);
+}
+
+void shiftdown(short int buffer[])
+{
+ int i;
+
+ buffer[102] = 0;
+ buffer[103] = 0;
+
+ for(i = 0; i < 102; i++) {
+ buffer[i] = buffer[i + 1];
+ }
+}
+
+void shiftup(short int buffer[])
+{
+ int i;
+
+ for(i = 102; i > 0; i--) {
+ buffer[i] = buffer[i - 1];
+ }
+
+ buffer[0] = 0;
+}
+
+short int islarger(short int accum[], short int reg[])
+{
+ /* Returns 1 if accum[] is larger than reg[], else 0 */
+ int i, latch, larger;
+ latch = 0;
+ i = 103;
+ larger = 0;
+
+
+ do {
+ if((accum[i] == 1) && (reg[i] == 0)) {
+ latch = 1;
+ larger = 1;
+ }
+ if((accum[i] == 0) && (reg[i] == 1)) {
+ latch = 1;
+ }
+ i--;
+ } while ((latch == 0) && (i >= -1));
+
+ return larger;
+}
+
+void binary_load(short int reg[], char data[], const unsigned int src_len)
+{
+ int read, i;
+ short int temp[112] = { 0 };
+
+ for(i = 0; i < 112; i++) {
+ reg[i] = 0;
+ }
+
+ for(read = 0; read < src_len; read++) {
+
+ for(i = 0; i < 112; i++) {
+ temp[i] = reg[i];
+ }
+
+ for(i = 0; i < 9; i++) {
+ binary_add(reg, temp);
+ }
+
+ temp[0] = BCD[ctoi(data[read]) * 4];
+ temp[1] = BCD[(ctoi(data[read]) * 4) + 1];
+ temp[2] = BCD[(ctoi(data[read]) * 4) + 2];
+ temp[3] = BCD[(ctoi(data[read]) * 4) + 3];
+ for(i = 4; i < 112; i++) {
+ temp[i] = 0;
+ }
+
+ binary_add(reg, temp);
+ }
+}
+
+void hex_dump(short int input_buffer[])
+{
+ int i, digit, byte_space;
+
+ byte_space = 1;
+ for(i = 100; i >= 0; i-=4) {
+ digit = 0;
+ digit += 1 * input_buffer[i];
+ digit += 2 * input_buffer[i + 1];
+ digit += 4 * input_buffer[i + 2];
+ digit += 8 * input_buffer[i + 3];
+
+ switch(digit) {
+ case 0: printf("0"); break;
+ case 1: printf("1"); break;
+ case 2: printf("2"); break;
+ case 3: printf("3"); break;
+ case 4: printf("4"); break;
+ case 5: printf("5"); break;
+ case 6: printf("6"); break;
+ case 7: printf("7"); break;
+ case 8: printf("8"); break;
+ case 9: printf("9"); break;
+ case 10: printf("A"); break;
+ case 11: printf("B"); break;
+ case 12: printf("C"); break;
+ case 13: printf("D"); break;
+ case 14: printf("E"); break;
+ case 15: printf("F"); break;
+ }
+ if(byte_space == 1) {
+ byte_space = 0;
+ } else {
+ byte_space = 1;
+ printf(" ");
+ }
+ }
+ printf("\n");
+}
diff --git a/backend/large.h b/backend/large.h
new file mode 100644
index 0000000..74f9a61
--- /dev/null
+++ b/backend/large.h
@@ -0,0 +1,51 @@
+/* large.h - Handles binary manipulation of large numbers */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+#ifndef __LARGE_H
+#define __LARGE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+extern void binary_load(short int reg[], char data[], const unsigned int src_len);
+extern void binary_add(short int accumulator[], short int input_buffer[]);
+extern void binary_subtract(short int accumulator[], short int input_buffer[]);
+extern void shiftdown(short int buffer[]);
+extern void shiftup(short int buffer[]);
+extern short int islarger(short int accum[], short int reg[]);
+extern void hex_dump(short int input_buffer[]);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __LARGE_H */
diff --git a/backend/library.c b/backend/library.c
new file mode 100644
index 0000000..cbedb1f
--- /dev/null
+++ b/backend/library.c
@@ -0,0 +1,722 @@
+/* library.c - external functions of libzint
+
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#ifdef _MSC_VER
+#include <malloc.h>
+#endif
+#include "common.h"
+#include "gs1.h"
+
+#define TECHNETIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"
+
+struct zint_symbol *ZBarcode_Create()
+{
+ struct zint_symbol *symbol = (struct zint_symbol*)calloc(1, sizeof(struct zint_symbol));
+
+ if (!symbol) return NULL;
+
+ symbol->symbology = BARCODE_CODE128;
+ strcpy(symbol->fgcolour, "000000");
+ strcpy(symbol->bgcolour, "ffffff");
+ strcpy(symbol->outfile, "out.png");
+ symbol->scale = 1.0;
+ symbol->option_1 = -1;
+ symbol->option_3 = 928; // PDF_MAX
+ symbol->show_hrt = 1; // Show human readable text
+ return symbol;
+}
+
+void ZBarcode_Clear(struct zint_symbol *symbol)
+{
+ int i, j;
+
+ for(i = 0; i < symbol->rows; i++) {
+ for(j = 0; j < symbol->width; j++) {
+ unset_module(symbol, i, j);
+ }
+ }
+ symbol->rows = 0;
+ symbol->width = 0;
+ symbol->text[0] = '\0';
+ symbol->errtxt[0] = '\0';
+ if (symbol->bitmap != NULL) {
+ free(symbol->bitmap);
+ symbol->bitmap = NULL;
+ }
+ symbol->bitmap_width = 0;
+ symbol->bitmap_height = 0;
+}
+
+void ZBarcode_Delete(struct zint_symbol *symbol)
+{
+ if (symbol->bitmap != NULL)
+ free(symbol->bitmap);
+
+ // If there is a rendered version, ensure it's memory is released
+ if (symbol->rendered != NULL) {
+ struct zint_render_line *line, *l;
+ struct zint_render_string *string, *s;
+
+ // Free lines
+ line = symbol->rendered->lines;
+ while(line) {
+ l = line;
+ line = line->next;
+ free(l);
+ }
+ // Free Strings
+ string = symbol->rendered->strings;
+ while (string) {
+ s = string;
+ string = string->next;
+ free(s->text);
+ free(s);
+ }
+
+ // Free Render
+ free(symbol->rendered);
+ }
+ free(symbol);
+}
+
+extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN system barcodes */
+extern int c39(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 3 from 9 (or Code 39) */
+extern int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Interleaved */
+extern int code_128(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 128 and NVE-18 */
+extern int qr_code(struct zint_symbol *symbol, unsigned char source[], int length); /* QR Code */
+
+extern int render_plot(struct zint_symbol *symbol, float width, float height);
+
+extern int bmp_handle(struct zint_symbol *symbol, int rotate_angle);
+
+void error_tag(char error_string[], int error_number)
+{
+ char error_buffer[100];
+
+ if(error_number != 0) {
+ strcpy(error_buffer, error_string);
+
+ if(error_number > 4) {
+ strcpy(error_string, "error: ");
+ } else {
+ strcpy(error_string, "warning: ");
+ }
+
+ concat(error_string, error_buffer);
+ }
+}
+
+int dump_plot(struct zint_symbol *symbol)
+{
+ FILE *f;
+ int i, r;
+
+ if(symbol->output_options & BARCODE_STDOUT) {
+ f = stdout;
+ } else {
+ f = fopen(symbol->outfile, "w");
+ if(!f) {
+ strcpy(symbol->errtxt, "Could not open output file");
+ return ERROR_FILE_ACCESS;
+ }
+ }
+
+ fputs("[\n", f);
+ for (r = 0; r < symbol->rows; r++) {
+ fputs(" [ ", f);
+ for (i = 0; i < symbol->width; i++) {
+ fputs(module_is_set(symbol, r, i) ? "1 " : "0 ", f);
+ }
+ fputs("]\n", f);
+ }
+ fputs("]\n", f);
+
+ if(!(symbol->output_options & BARCODE_STDOUT))
+ fclose(f);
+
+ return 0;
+}
+
+int hibc(struct zint_symbol *symbol, unsigned char source[], int length)
+{
+ int counter, error_number, i;
+ char to_process[40], temp[2], check_digit;
+
+ if(length > 36) {
+ strcpy(symbol->errtxt, "Data too long for HIBC LIC");
+ return ERROR_TOO_LONG;
+ }
+ to_upper(source);
+ error_number = is_sane(TECHNETIUM , source, length);
+ if(error_number == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Invalid characters in data");
+ return error_number;
+ }
+
+ strcpy(to_process, "+");
+ counter = 41;
+ for(i = 0; i < length; i++) {
+ counter += posn(TECHNETIUM, source[i]);
+ }
+ counter = counter % 43;
+
+ if(counter < 10) {
+ check_digit = itoc(counter);
+ } else {
+ if(counter < 36) {
+ check_digit = (counter - 10) + 'A';
+ } else {
+ switch(counter) {
+ case 36: check_digit = '-'; break;
+ case 37: check_digit = '.'; break;
+ case 38: check_digit = ' '; break;
+ case 39: check_digit = '$'; break;
+ case 40: check_digit = '/'; break;
+ case 41: check_digit = '+'; break;
+ case 42: check_digit = '%'; break;
+ default: check_digit = ' '; break; /* Keep compiler happy */
+ }
+ }
+ }
+
+ temp[0] = check_digit;
+ temp[1] = '\0';
+
+ concat(to_process, (char *)source);
+ concat(to_process, temp);
+ length = strlen(to_process);
+
+ switch(symbol->symbology) {
+ case BARCODE_HIBC_128:
+ error_number = code_128(symbol, (unsigned char *)to_process, length);
+ ustrcpy(symbol->text, (unsigned char*)"*");
+ uconcat(symbol->text, (unsigned char*)to_process);
+ uconcat(symbol->text, (unsigned char*)"*");
+ break;
+ case BARCODE_HIBC_39:
+ symbol->option_2 = 0;
+ error_number = c39(symbol, (unsigned char *)to_process, length);
+ ustrcpy(symbol->text, (unsigned char*)"*");
+ uconcat(symbol->text, (unsigned char*)to_process);
+ uconcat(symbol->text, (unsigned char*)"*");
+ break;
+ case BARCODE_HIBC_QR:
+ error_number = qr_code(symbol, (unsigned char *)to_process, length);
+ break;
+ }
+
+ return error_number;
+}
+
+int gs1_compliant(int symbology)
+{
+ /* Returns 1 if symbology supports GS1 data */
+
+ int result = 0;
+
+ switch(symbology) {
+ case BARCODE_EAN128:
+ case BARCODE_RSS_EXP:
+ case BARCODE_RSS_EXPSTACK:
+ case BARCODE_EANX_CC:
+ case BARCODE_EAN128_CC:
+ case BARCODE_RSS14_CC:
+ case BARCODE_RSS_LTD_CC:
+ case BARCODE_RSS_EXP_CC:
+ case BARCODE_UPCA_CC:
+ case BARCODE_UPCE_CC:
+ case BARCODE_RSS14STACK_CC:
+ case BARCODE_RSS14_OMNI_CC:
+ case BARCODE_RSS_EXPSTACK_CC:
+ case BARCODE_CODE16K:
+ case BARCODE_AZTEC:
+ case BARCODE_DATAMATRIX:
+ case BARCODE_CODEONE:
+ case BARCODE_CODE49:
+ case BARCODE_QRCODE:
+ result = 1;
+ break;
+ }
+
+ return result;
+}
+
+int ZBarcode_ValidID(int symbol_id)
+{
+ /* Checks whether a symbology is supported */
+
+ int result = 0;
+
+ switch(symbol_id) {
+ case BARCODE_CODE11:
+ case BARCODE_C25MATRIX:
+ case BARCODE_C25INTER:
+ case BARCODE_C25IATA:
+ case BARCODE_C25LOGIC:
+ case BARCODE_C25IND:
+ case BARCODE_CODE39:
+ case BARCODE_EXCODE39:
+ case BARCODE_EANX:
+ case BARCODE_EAN128:
+ case BARCODE_CODABAR:
+ case BARCODE_CODE128:
+ case BARCODE_DPLEIT:
+ case BARCODE_DPIDENT:
+ case BARCODE_CODE16K:
+ case BARCODE_CODE49:
+ case BARCODE_CODE93:
+ case BARCODE_FLAT:
+ case BARCODE_RSS14:
+ case BARCODE_RSS_LTD:
+ case BARCODE_RSS_EXP:
+ case BARCODE_TELEPEN:
+ case BARCODE_UPCA:
+ case BARCODE_UPCE:
+ case BARCODE_POSTNET:
+ case BARCODE_MSI_PLESSEY:
+ case BARCODE_FIM:
+ case BARCODE_LOGMARS:
+ case BARCODE_PHARMA:
+ case BARCODE_PZN:
+ case BARCODE_PHARMA_TWO:
+ case BARCODE_PDF417:
+ case BARCODE_PDF417TRUNC:
+ case BARCODE_MAXICODE:
+ case BARCODE_QRCODE:
+ case BARCODE_CODE128B:
+ case BARCODE_AUSPOST:
+ case BARCODE_AUSREPLY:
+ case BARCODE_AUSROUTE:
+ case BARCODE_AUSREDIRECT:
+ case BARCODE_ISBNX:
+ case BARCODE_RM4SCC:
+ case BARCODE_DATAMATRIX:
+ case BARCODE_EAN14:
+ case BARCODE_NVE18:
+ case BARCODE_JAPANPOST:
+ case BARCODE_KOREAPOST:
+ case BARCODE_RSS14STACK:
+ case BARCODE_RSS14STACK_OMNI:
+ case BARCODE_RSS_EXPSTACK:
+ case BARCODE_PLANET:
+ case BARCODE_MICROPDF417:
+ case BARCODE_ONECODE:
+ case BARCODE_PLESSEY:
+ case BARCODE_TELEPEN_NUM:
+ case BARCODE_ITF14:
+ case BARCODE_KIX:
+ case BARCODE_AZTEC:
+ case BARCODE_DAFT:
+ case BARCODE_MICROQR:
+ case BARCODE_HIBC_128:
+ case BARCODE_HIBC_39:
+ case BARCODE_HIBC_DM:
+ case BARCODE_HIBC_QR:
+ case BARCODE_HIBC_PDF:
+ case BARCODE_HIBC_MICPDF:
+ case BARCODE_HIBC_AZTEC:
+ case BARCODE_AZRUNE:
+ case BARCODE_CODE32:
+ case BARCODE_EANX_CC:
+ case BARCODE_EAN128_CC:
+ case BARCODE_RSS14_CC:
+ case BARCODE_RSS_LTD_CC:
+ case BARCODE_RSS_EXP_CC:
+ case BARCODE_UPCA_CC:
+ case BARCODE_UPCE_CC:
+ case BARCODE_RSS14STACK_CC:
+ case BARCODE_RSS14_OMNI_CC:
+ case BARCODE_RSS_EXPSTACK_CC:
+ case BARCODE_CHANNEL:
+ case BARCODE_CODEONE:
+ case BARCODE_GRIDMATRIX:
+ result = 1;
+ break;
+ }
+
+ return result;
+}
+
+int extended_charset(struct zint_symbol *symbol, unsigned char *source, int length)
+{
+ int error_number = 0;
+
+ /* These are the "elite" standards which can support multiple character sets */
+ switch(symbol->symbology) {
+ case BARCODE_QRCODE: error_number = qr_code(symbol, source, length); break;
+ }
+
+ return error_number;
+}
+
+int reduced_charset(struct zint_symbol *symbol, unsigned char *source, int length)
+{
+ /* These are the "norm" standards which only support Latin-1 at most */
+ int error_number = 0;
+
+#ifndef _MSC_VER
+ unsigned char preprocessed[length + 1];
+#else
+ unsigned char* preprocessed = (unsigned char*)_alloca(length + 1);
+#endif
+
+ if(symbol->symbology == BARCODE_CODE16K) {
+ symbol->whitespace_width = 16;
+ symbol->border_width = 2;
+ symbol->output_options = BARCODE_BIND;
+ }
+
+ if(symbol->symbology == BARCODE_ITF14) {
+ symbol->whitespace_width = 20;
+ symbol->border_width = 8;
+ symbol->output_options = BARCODE_BOX;
+ }
+
+ switch(symbol->input_mode) {
+ case DATA_MODE:
+ case GS1_MODE:
+ memcpy(preprocessed, source, length);
+ preprocessed[length] = '\0';
+ break;
+ case UNICODE_MODE:
+ error_number = latin1_process(source, preprocessed, &length);
+ if(error_number != 0) {
+ strcpy(symbol->errtxt, "error: Invalid character in input string (only Latin-1 characters supported)");
+ return error_number;
+ }
+ break;
+ }
+
+ switch(symbol->symbology) {
+ case BARCODE_C25INTER: error_number = interleaved_two_of_five(symbol, preprocessed, length); break;
+ case BARCODE_UPCA: error_number = eanx(symbol, preprocessed, length); break;
+ case BARCODE_UPCE: error_number = eanx(symbol, preprocessed, length); break;
+ case BARCODE_EANX: error_number = eanx(symbol, preprocessed, length); break;
+ case BARCODE_CODE39: error_number = c39(symbol, preprocessed, length); break;
+ case BARCODE_LOGMARS: error_number = c39(symbol, preprocessed, length); break;
+ case BARCODE_CODE128: error_number = code_128(symbol, preprocessed, length); break;
+ case BARCODE_CODE128B: error_number = code_128(symbol, preprocessed, length); break;
+ case BARCODE_ISBNX: error_number = eanx(symbol, preprocessed, length); break;
+ case BARCODE_HIBC_128: error_number = hibc(symbol, preprocessed, length); break;
+ case BARCODE_HIBC_39: error_number = hibc(symbol, preprocessed, length); break;
+ case BARCODE_HIBC_DM: error_number = hibc(symbol, preprocessed, length); break;
+ case BARCODE_HIBC_QR: error_number = hibc(symbol, preprocessed, length); break;
+ case BARCODE_HIBC_PDF: error_number = hibc(symbol, preprocessed, length); break;
+ case BARCODE_HIBC_MICPDF: error_number = hibc(symbol, preprocessed, length); break;
+ case BARCODE_HIBC_AZTEC: error_number = hibc(symbol, preprocessed, length); break;
+ }
+
+ return error_number;
+}
+
+int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *source, int length)
+{
+ int error_number, error_buffer, i;
+ error_number = 0;
+
+ if(length == 0) {
+ length = ustrlen(source);
+ }
+ if(length == 0) {
+ strcpy(symbol->errtxt, "No input data");
+ error_tag(symbol->errtxt, ERROR_INVALID_DATA);
+ return ERROR_INVALID_DATA;
+ }
+
+
+#ifndef _MSC_VER
+ unsigned char local_source[length + 1];
+#else
+ unsigned char* local_source = (unsigned char*)_alloca(length + 1);
+#endif
+
+ /* First check the symbology field */
+ if(symbol->symbology < 1) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; }
+
+ /* symbol->symbologys 1 to 86 are defined by tbarcode */
+ if(symbol->symbology == 5) { symbol->symbology = BARCODE_C25MATRIX; }
+ if((symbol->symbology >= 10) && (symbol->symbology <= 12)) { symbol->symbology = BARCODE_EANX; }
+ if((symbol->symbology == 14) || (symbol->symbology == 15)) { symbol->symbology = BARCODE_EANX; }
+ if(symbol->symbology == 17) { symbol->symbology = BARCODE_UPCA; }
+ if(symbol->symbology == 19) { strcpy(symbol->errtxt, "Codabar 18 not supported, using Codabar"); symbol->symbology = BARCODE_CODABAR; error_number = WARN_INVALID_OPTION; }
+ if(symbol->symbology == 26) { symbol->symbology = BARCODE_UPCA; }
+ if(symbol->symbology == 27) { strcpy(symbol->errtxt, "UPCD1 not supported"); error_number = ERROR_INVALID_OPTION; }
+ if(symbol->symbology == 33) { symbol->symbology = BARCODE_EAN128; }
+ if((symbol->symbology == 35) || (symbol->symbology == 36)) { symbol->symbology = BARCODE_UPCA; }
+ if((symbol->symbology == 38) || (symbol->symbology == 39)) { symbol->symbology = BARCODE_UPCE; }
+ if((symbol->symbology >= 41) && (symbol->symbology <= 45)) { symbol->symbology = BARCODE_POSTNET; }
+ if(symbol->symbology == 46) { symbol->symbology = BARCODE_PLESSEY; }
+ if(symbol->symbology == 48) { symbol->symbology = BARCODE_NVE18; }
+ if(symbol->symbology == 54) { strcpy(symbol->errtxt, "General Parcel Code not supported, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; }
+ if((symbol->symbology == 59) || (symbol->symbology == 61)) { symbol->symbology = BARCODE_CODE128; }
+ if(symbol->symbology == 62) { symbol->symbology = BARCODE_CODE93; }
+ if((symbol->symbology == 64) || (symbol->symbology == 65)) { symbol->symbology = BARCODE_AUSPOST; }
+ if(symbol->symbology == 73) { strcpy(symbol->errtxt, "Codablock E not supported"); error_number = ERROR_INVALID_OPTION; }
+ if(symbol->symbology == 78) { symbol->symbology = BARCODE_RSS14; }
+ if(symbol->symbology == 83) { symbol->symbology = BARCODE_PLANET; }
+ if(symbol->symbology == 88) { symbol->symbology = BARCODE_EAN128; }
+ if(symbol->symbology == 91) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; }
+ if((symbol->symbology >= 94) && (symbol->symbology <= 96)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; }
+ if(symbol->symbology == 100) { symbol->symbology = BARCODE_HIBC_128; }
+ if(symbol->symbology == 101) { symbol->symbology = BARCODE_HIBC_39; }
+ if(symbol->symbology == 103) { symbol->symbology = BARCODE_HIBC_DM; }
+ if(symbol->symbology == 105) { symbol->symbology = BARCODE_HIBC_QR; }
+ if(symbol->symbology == 107) { symbol->symbology = BARCODE_HIBC_PDF; }
+ if(symbol->symbology == 109) { symbol->symbology = BARCODE_HIBC_MICPDF; }
+ if(symbol->symbology == 111) { symbol->symbology = BARCODE_HIBC_BLOCKF; }
+ if((symbol->symbology >= 113) && (symbol->symbology <= 127)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; }
+ /* Everything from 128 up is Zint-specific */
+ if(symbol->symbology >= 143) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; }
+ if((symbol->symbology == BARCODE_CODABLOCKF) || (symbol->symbology == BARCODE_HIBC_BLOCKF)) { strcpy(symbol->errtxt, "Codablock F not supported"); error_number = ERROR_INVALID_OPTION; }
+
+ if(error_number > 4) {
+ error_tag(symbol->errtxt, error_number);
+ return error_number;
+ } else {
+ error_buffer = error_number;
+ }
+
+ if((symbol->input_mode < 0) || (symbol->input_mode > 2)) { symbol->input_mode = DATA_MODE; }
+
+ if(symbol->input_mode == GS1_MODE) {
+ for(i = 0; i < length; i++) {
+ if(source[i] == '\0') {
+ strcpy(symbol->errtxt, "NULL characters not permitted in GS1 mode");
+ return ERROR_INVALID_DATA;
+ }
+ }
+ if(gs1_compliant(symbol->symbology) == 1) {
+ error_number = ugs1_verify(symbol, source, length, local_source);
+ if(error_number != 0) { return error_number; }
+ length = ustrlen(local_source);
+ } else {
+ strcpy(symbol->errtxt, "Selected symbology does not support GS1 mode");
+ return ERROR_INVALID_OPTION;
+ }
+ } else {
+ memcpy(local_source, source, length);
+ local_source[length] = '\0';
+ }
+
+ switch(symbol->symbology) {
+ case BARCODE_QRCODE:
+ case BARCODE_MICROQR:
+ case BARCODE_GRIDMATRIX:
+ error_number = extended_charset(symbol, local_source, length);
+ break;
+ default:
+ error_number = reduced_charset(symbol, local_source, length);
+ break;
+ }
+
+ if((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) {
+ for(i = 0; i < length; i++) {
+ if(local_source[i] == '\0') {
+ symbol->text[i] = ' ';
+ } else {
+ symbol->text[i] = local_source[i];
+ }
+ }
+ }
+
+ if(error_number == 0) {
+ error_number = error_buffer;
+ }
+ error_tag(symbol->errtxt, error_number);
+ /*printf("%s\n",symbol->text);*/
+ return error_number;
+}
+
+int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle)
+{
+ return ERROR_INVALID_OPTION;
+}
+
+int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle)
+{
+ int error_number;
+
+ switch(rotate_angle) {
+ case 0:
+ case 90:
+ case 180:
+ case 270:
+ break;
+ default:
+ strcpy(symbol->errtxt, "Invalid rotation angle");
+ return ERROR_INVALID_OPTION;
+ break;
+ }
+
+ error_number = bmp_handle(symbol, rotate_angle);
+ error_tag(symbol->errtxt, error_number);
+ return error_number;
+}
+
+int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle)
+{
+ int error_number;
+
+ error_number = 0;
+
+ error_number = ZBarcode_Encode(symbol, input, length);
+ if(error_number != 0) {
+ return error_number;
+ }
+
+ error_number = ZBarcode_Print(symbol, rotate_angle);
+ return error_number;
+}
+
+int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle)
+{
+ int error_number;
+
+ error_number = 0;
+
+ error_number = ZBarcode_Encode(symbol, input, length);
+ if(error_number != 0) {
+ return error_number;
+ }
+
+ error_number = ZBarcode_Buffer(symbol, rotate_angle);
+ return error_number;
+}
+
+int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename)
+{
+ FILE *file;
+ unsigned char *buffer;
+ unsigned long fileLen;
+ unsigned int nRead = 0, n = 0;
+ int ret;
+
+ if (!strcmp(filename, "-")) {
+ file = stdin;
+ fileLen = 7100;
+ } else {
+ file = fopen(filename, "rb");
+ if (!file) {
+ strcpy(symbol->errtxt, "Unable to read input file");
+ return ERROR_INVALID_DATA;
+ }
+
+ /* Get file length */
+ fseek(file, 0, SEEK_END);
+ fileLen = ftell(file);
+ fseek(file, 0, SEEK_SET);
+
+ if(fileLen > 7100) {
+ /* The largest amount of data that can be encoded is 7089 numeric digits in QR Code */
+ strcpy(symbol->errtxt, "Input file too long");
+ fclose(file);
+ return ERROR_INVALID_DATA;
+ }
+ }
+
+ /* Allocate memory */
+ buffer = (unsigned char *)malloc(fileLen * sizeof(unsigned char));
+ if(!buffer) {
+ strcpy(symbol->errtxt, "Internal memory error");
+ if (strcmp(filename, "-"))
+ fclose(file);
+ return ERROR_MEMORY;
+ }
+
+ /* Read file contents into buffer */
+
+ do
+ {
+ n = fread(buffer + nRead, 1, fileLen - nRead, file);
+ if (ferror(file))
+ {
+ strcpy(symbol->errtxt, strerror(errno));
+ nRead = 0;
+ return ERROR_INVALID_DATA;
+ }
+ nRead += n;
+ } while (!feof(file) && (0 < n) && (nRead < fileLen));
+
+ if (strcmp(filename, "-"))
+ fclose(file);
+
+ ret = ZBarcode_Encode(symbol, buffer, nRead);
+ free(buffer);
+ return ret;
+}
+
+int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle)
+{
+ int error_number;
+
+ error_number = 0;
+
+ error_number = ZBarcode_Encode_File(symbol, filename);
+ if(error_number != 0) {
+ return error_number;
+ }
+
+ return ZBarcode_Print(symbol, rotate_angle);
+}
+
+int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle)
+{
+ int error_number;
+
+ error_number = 0;
+
+ error_number = ZBarcode_Encode_File(symbol, filename);
+ if(error_number != 0) {
+ return error_number;
+ }
+
+ return ZBarcode_Buffer(symbol, rotate_angle);
+}
+
+/*
+ * Rendering support, initially added by Sam Lown.
+ *
+ * Converts encoded data into an intermediate format to be interpreted
+ * in other applications using this library.
+ *
+ * If the width and height are not set to zero, the barcode will be resized to those
+ * dimensions. The symbol->scale and symbol->height values are totally ignored in this case.
+ *
+ */
+int ZBarcode_Render(struct zint_symbol *symbol, float width, float height)
+{
+ // Send the request to the render_plot method
+ return render_plot(symbol, width, height);
+}
diff --git a/backend/libzint.la b/backend/libzint.la
new file mode 100644
index 0000000..d077ad1
--- /dev/null
+++ b/backend/libzint.la
@@ -0,0 +1,40 @@
+# libzint.la - a libtool library file
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='../bin/zint.dll'
+
+# Names of this library.
+library_names='libzint.dll.a'
+
+# The name of the static archive.
+old_library='libzint.a'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags=''
+
+# Libraries that this one depends upon.
+dependency_libs=''
+
+# Names of additional weak libraries provided by this library
+weak_library_names=''
+
+# Version information for libz.
+current=2
+age=4
+revision=1
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=no
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/mingw/lib'
diff --git a/backend/libzint.rc b/backend/libzint.rc
new file mode 100644
index 0000000..1930f69
--- /dev/null
+++ b/backend/libzint.rc
@@ -0,0 +1,40 @@
+#include <windows.h>
+
+#ifdef GCC_WINDRES
+VS_VERSION_INFO VERSIONINFO
+#else
+VS_VERSION_INFO VERSIONINFO
+#endif
+ FILEVERSION 2,3,0,0
+ PRODUCTVERSION 2,3,0,0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0
+#endif
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VFT2_UNKNOWN
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+ BEGIN
+ VALUE "FileDescription", "libzint barcode library\0"
+ VALUE "FileVersion", "2.3.0.0\0"
+ VALUE "InternalName", "zint.dll\0"
+ VALUE "LegalCopyright", "Copyright 2009 Robin Stuart & BogDan Vatra\0"
+ VALUE "OriginalFilename", "zint.dll\0"
+ VALUE "ProductName", "libzint\0"
+ VALUE "ProductVersion", "2.3.0.0\0"
+ VALUE "License", "BSD License version 3\0"
+ VALUE "WWW", "http://www.sourceforge.net/projects/zint\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1250
+ END
+END
diff --git a/backend/maxipng.h b/backend/maxipng.h
new file mode 100644
index 0000000..f39c51e
--- /dev/null
+++ b/backend/maxipng.h
@@ -0,0 +1,149 @@
+/* maxipng.h - Shapes for Maxicode output to PNG file */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+/* This file contains the pixel-by-pixel representation of maxicode glyphs
+ at a resolution of 12 pixels per millimeter. hexagon[] is taken directly
+ from ISO 16023 Annex J. bullseye[] was calculated by the Gimp */
+
+#define SSET "0123456789ABCDEF"
+
+static const int hexagon[120] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
+ 0, 0, 0, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static const unsigned int bullseye_compressed[] = {
+ 0,0,0,0,0,255,248,0,0,0,0,0,
+ 0,0,0,0,31,255,255,192,0,0,0,0,
+ 0,0,0,1,255,255,255,252,0,0,0,0,
+ 0,0,0,7,255,255,255,255,0,0,0,0,
+ 0,0,0,31,255,255,255,255,192,0,0,0,
+ 0,0,0,127,255,255,255,255,240,0,0,0,
+ 0,0,1,255,255,255,255,255,252,0,0,0,
+ 0,0,7,255,255,255,255,255,255,0,0,0,
+ 0,0,15,255,255,0,7,255,255,128,0,0,
+ 0,0,63,255,240,0,0,127,255,224,0,0,
+ 0,0,127,255,128,0,0,15,255,240,0,0,
+ 0,0,255,252,0,0,0,1,255,248,0,0,
+ 0,1,255,240,0,0,0,0,127,252,0,0,
+ 0,3,255,224,0,0,0,0,63,254,0,0,
+ 0,7,255,128,0,0,0,0,15,255,0,0,
+ 0,15,255,0,0,0,0,0,7,255,128,0,
+ 0,31,252,0,0,127,240,0,1,255,192,0,
+ 0,63,248,0,7,255,255,0,0,255,224,0,
+ 0,127,240,0,63,255,255,224,0,127,240,0,
+ 0,127,224,0,255,255,255,248,0,63,240,0,
+ 0,255,192,1,255,255,255,252,0,31,248,0,
+ 1,255,128,7,255,255,255,255,0,15,252,0,
+ 1,255,0,15,255,255,255,255,128,7,252,0,
+ 3,255,0,63,255,255,255,255,224,7,254,0,
+ 3,254,0,127,255,192,31,255,240,3,254,0,
+ 7,252,0,255,252,0,1,255,248,1,255,0,
+ 7,252,1,255,240,0,0,127,252,1,255,0,
+ 15,248,1,255,192,0,0,31,252,0,255,128,
+ 15,240,3,255,128,0,0,15,254,0,127,128,
+ 31,240,7,255,0,0,0,7,255,0,127,192,
+ 31,224,7,254,0,0,0,3,255,0,63,192,
+ 63,224,15,252,0,0,0,1,255,128,63,224,
+ 63,224,31,248,0,63,192,0,255,192,63,224,
+ 63,192,31,240,0,255,240,0,127,192,31,224,
+ 63,192,63,224,3,255,252,0,63,224,31,224,
+ 127,192,63,224,7,255,254,0,63,224,31,240,
+ 127,128,63,192,15,255,255,0,31,224,15,240,
+ 127,128,127,192,31,255,255,128,31,240,15,240,
+ 127,128,127,128,63,255,255,192,15,240,15,240,
+ 127,128,127,128,63,255,255,192,15,240,15,240,
+ 255,0,127,128,127,240,255,224,15,240,7,240,
+ 255,0,255,128,127,192,63,224,15,248,7,240,
+ 255,0,255,0,255,128,31,240,7,248,7,240,
+ 255,0,255,0,255,128,31,240,7,248,7,240,
+ 255,0,255,0,255,0,15,240,7,248,7,240,
+ 255,0,255,0,255,0,15,240,7,248,7,240,
+ 255,0,255,0,255,0,15,240,7,248,7,240,
+ 255,0,255,0,255,0,15,240,7,248,7,240,
+ 255,0,255,0,255,128,31,240,7,248,7,240,
+ 255,0,255,0,255,128,31,240,7,248,7,240,
+ 255,0,255,0,127,192,63,224,7,248,7,240,
+ 255,0,255,128,127,240,255,224,15,248,7,240,
+ 255,0,127,128,63,255,255,192,15,240,7,240,
+ 127,128,127,128,63,255,255,192,15,240,15,240,
+ 127,128,127,128,31,255,255,128,15,240,15,240,
+ 127,128,127,192,15,255,255,0,31,240,15,240,
+ 127,128,63,192,7,255,254,0,31,224,15,240,
+ 127,192,63,224,3,255,252,0,63,224,31,240,
+ 63,192,63,224,0,255,240,0,63,224,31,224,
+ 63,192,31,240,0,63,192,0,127,192,31,224,
+ 63,224,31,248,0,0,0,0,255,192,63,224,
+ 63,224,15,252,0,0,0,1,255,128,63,224,
+ 31,224,7,254,0,0,0,3,255,0,63,192,
+ 31,240,7,255,0,0,0,7,255,0,127,192,
+ 15,240,3,255,128,0,0,15,254,0,127,128,
+ 15,248,1,255,192,0,0,31,252,0,255,128,
+ 7,252,1,255,240,0,0,127,252,1,255,0,
+ 7,252,0,255,252,0,1,255,248,1,255,0,
+ 3,254,0,127,255,192,31,255,240,3,254,0,
+ 3,255,0,63,255,255,255,255,224,7,254,0,
+ 1,255,0,15,255,255,255,255,128,7,252,0,
+ 1,255,128,7,255,255,255,255,0,15,252,0,
+ 0,255,192,1,255,255,255,252,0,31,248,0,
+ 0,127,224,0,255,255,255,248,0,63,240,0,
+ 0,127,240,0,63,255,255,224,0,127,240,0,
+ 0,63,248,0,7,255,255,0,0,255,224,0,
+ 0,31,252,0,0,127,240,0,1,255,192,0,
+ 0,15,255,0,0,0,0,0,7,255,128,0,
+ 0,7,255,128,0,0,0,0,15,255,0,0,
+ 0,3,255,224,0,0,0,0,63,254,0,0,
+ 0,1,255,240,0,0,0,0,127,252,0,0,
+ 0,0,255,252,0,0,0,1,255,248,0,0,
+ 0,0,127,255,128,0,0,15,255,240,0,0,
+ 0,0,63,255,240,0,0,127,255,224,0,0,
+ 0,0,15,255,255,0,7,255,255,128,0,0,
+ 0,0,7,255,255,255,255,255,255,0,0,0,
+ 0,0,1,255,255,255,255,255,252,0,0,0,
+ 0,0,0,127,255,255,255,255,240,0,0,0,
+ 0,0,0,31,255,255,255,255,192,0,0,0,
+ 0,0,0,7,255,255,255,255,0,0,0,0,
+ 0,0,0,1,255,255,255,252,0,0,0,0,
+ 0,0,0,0,31,255,255,192,0,0,0,0,
+ 0,0,0,0,0,255,248,0,0,0,0,0
+};
+
diff --git a/backend/png.c b/backend/png.c
new file mode 100644
index 0000000..e3522fe
--- /dev/null
+++ b/backend/png.c
@@ -0,0 +1,1146 @@
+/* png.c - Handles output to PNG file */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+#ifdef _MSC_VER
+#include <fcntl.h>
+#include <io.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include "common.h"
+
+#ifdef _MSC_VER
+#include <malloc.h>
+#endif /* _MSC_VER */
+
+#ifndef NO_PNG
+#include "png.h" /* libpng header; includes zlib.h and setjmp.h */
+#endif /* NO_PNG */
+#include "maxipng.h" /* Maxicode shapes */
+
+#include "font.h" /* Font for human readable text */
+
+#define SSET "0123456789ABCDEF"
+
+#define PNG_DATA 100
+#define BMP_DATA 200
+
+#ifndef NO_PNG
+struct mainprog_info_type {
+ long width;
+ long height;
+ FILE *outfile;
+ jmp_buf jmpbuf;
+};
+
+static void writepng_error_handler(png_structp png_ptr, png_const_charp msg)
+{
+ struct mainprog_info_type *graphic;
+
+ fprintf(stderr, "writepng libpng error: %s\n", msg);
+ fflush(stderr);
+
+ graphic = (struct mainprog_info_type*)png_get_error_ptr(png_ptr);
+ if (graphic == NULL) { /* we are completely hosed now */
+ fprintf(stderr,
+ "writepng severe error: jmpbuf not recoverable; terminating.\n");
+ fflush(stderr);
+ return;
+ }
+ longjmp(graphic->jmpbuf, 1);
+}
+
+int png_pixel_plot(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle)
+{
+ struct mainprog_info_type wpng_info;
+ struct mainprog_info_type *graphic;
+
+#ifndef _MSC_VER
+ unsigned char outdata[image_width * 3];
+#else
+ unsigned char* outdata = (unsigned char*)_alloca(image_width * 3);
+#endif
+ png_structp png_ptr;
+ png_infop info_ptr;
+ graphic = &wpng_info;
+ unsigned char *image_data;
+ int i, row, column, err_no;
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+
+ switch(rotate_angle) {
+ case 0:
+ case 180:
+ graphic->width = image_width;
+ graphic->height = image_height;
+ break;
+ case 90:
+ case 270:
+ graphic->width = image_height;
+ graphic->height = image_width;
+ break;
+ }
+
+ /* sort out colour options */
+ to_upper((unsigned char*)symbol->fgcolour);
+ to_upper((unsigned char*)symbol->bgcolour);
+
+ if(strlen(symbol->fgcolour) != 6) {
+ strcpy(symbol->errtxt, "Malformed foreground colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ if(strlen(symbol->bgcolour) != 6) {
+ strcpy(symbol->errtxt, "Malformed background colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ err_no = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour));
+ if (err_no == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Malformed foreground colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ err_no = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->bgcolour));
+ if (err_no == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Malformed background colour target");
+ return ERROR_INVALID_OPTION;
+ }
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+
+ /* Open output file in binary mode */
+ if((symbol->output_options & BARCODE_STDOUT) != 0) {
+#ifdef _MSC_VER
+ if (-1 == _setmode(_fileno(stdout), _O_BINARY)) {
+ strcpy(symbol->errtxt, "Can't open output file");
+ return ERROR_FILE_ACCESS;
+ }
+#endif
+ graphic->outfile = stdout;
+ } else {
+ if (!(graphic->outfile = fopen(symbol->outfile, "wb"))) {
+ strcpy(symbol->errtxt, "Can't open output file");
+ return ERROR_FILE_ACCESS;
+ }
+ }
+
+ /* Set up error handling routine as proc() above */
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, graphic, writepng_error_handler, NULL);
+ if (!png_ptr) {
+ strcpy(symbol->errtxt, "Out of memory");
+ return ERROR_MEMORY;
+ }
+
+ info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr) {
+ png_destroy_write_struct(&png_ptr, NULL);
+ strcpy(symbol->errtxt, "Out of memory");
+ return ERROR_MEMORY;
+ }
+
+ /* catch jumping here */
+ if (setjmp(graphic->jmpbuf)) {
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ strcpy(symbol->errtxt, "libpng error occurred");
+ return ERROR_MEMORY;
+ }
+
+ /* open output file with libpng */
+ png_init_io(png_ptr, graphic->outfile);
+
+ /* set compression */
+ png_set_compression_level(png_ptr,9);
+
+ /* set Header block */
+ png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height,
+ 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+
+ /* write all chunks up to (but not including) first IDAT */
+ png_write_info(png_ptr, info_ptr);
+
+ /* set up the transformations: for now, just pack low-bit-depth pixels
+ into bytes (one, two or four pixels per byte) */
+ png_set_packing(png_ptr);
+
+ /* Pixel Plotting */
+
+ switch(rotate_angle) {
+ case 0: /* Plot the right way up */
+ for(row = 0; row < image_height; row++) {
+ for(column = 0; column < image_width; column++) {
+ i = column * 3;
+ switch(*(pixelbuf + (image_width * row) + column))
+ {
+ case '1':
+ outdata[i] = fgred;
+ outdata[i + 1] = fggrn;
+ outdata[i + 2] = fgblu;
+ break;
+ default:
+ outdata[i] = bgred;
+ outdata[i + 1] = bggrn;
+ outdata[i + 2] = bgblu;
+ break;
+
+ }
+ }
+ /* write row contents to file */
+ image_data = outdata;
+ png_write_row(png_ptr, image_data);
+ }
+ break;
+ case 90: /* Plot 90 degrees clockwise */
+ for(row = 0; row < image_width; row++) {
+ for(column = 0; column < image_height; column++) {
+ i = column * 3;
+ switch(*(pixelbuf + (image_width * (image_height - column - 1)) + row))
+ {
+ case '1':
+ outdata[i] = fgred;
+ outdata[i + 1] = fggrn;
+ outdata[i + 2] = fgblu;
+ break;
+ default:
+ outdata[i] = bgred;
+ outdata[i + 1] = bggrn;
+ outdata[i + 2] = bgblu;
+ break;
+
+ }
+ }
+
+ /* write row contents to file */
+ image_data = outdata;
+ png_write_row(png_ptr, image_data);
+ }
+ break;
+ case 180: /* Plot upside down */
+ for(row = 0; row < image_height; row++) {
+ for(column = 0; column < image_width; column++) {
+ i = column * 3;
+ switch(*(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1)))
+ {
+ case '1':
+ outdata[i] = fgred;
+ outdata[i + 1] = fggrn;
+ outdata[i + 2] = fgblu;
+ break;
+ default:
+ outdata[i] = bgred;
+ outdata[i + 1] = bggrn;
+ outdata[i + 2] = bgblu;
+ break;
+
+ }
+ }
+
+ /* write row contents to file */
+ image_data = outdata;
+ png_write_row(png_ptr, image_data);
+ }
+ break;
+ case 270: /* Plot 90 degrees anti-clockwise */
+ for(row = 0; row < image_width; row++) {
+ for(column = 0; column < image_height; column++) {
+ i = column * 3;
+ switch(*(pixelbuf + (image_width * column) + (image_width - row - 1)))
+ {
+ case '1':
+ outdata[i] = fgred;
+ outdata[i + 1] = fggrn;
+ outdata[i + 2] = fgblu;
+ break;
+ default:
+ outdata[i] = bgred;
+ outdata[i + 1] = bggrn;
+ outdata[i + 2] = bgblu;
+ break;
+
+ }
+ }
+
+ /* write row contents to file */
+ image_data = outdata;
+ png_write_row(png_ptr, image_data);
+ }
+ break;
+ }
+
+ /* End the file */
+ png_write_end(png_ptr, NULL);
+
+ /* make sure we have disengaged */
+ if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr);
+ fclose(wpng_info.outfile);
+ return 0;
+}
+#endif /* NO_PNG */
+
+int bmp_pixel_plot(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle)
+{
+ int i, row, column, err_no;
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+
+ switch(rotate_angle) {
+ case 0:
+ case 180:
+ symbol->bitmap_width = image_width;
+ symbol->bitmap_height = image_height;
+ break;
+ case 90:
+ case 270:
+ symbol->bitmap_width = image_height;
+ symbol->bitmap_height = image_width;
+ break;
+ }
+
+ if (symbol->bitmap != NULL)
+ free(symbol->bitmap);
+
+ symbol->bitmap = (char *) malloc(image_width * image_height * 3);
+
+
+ /* sort out colour options */
+ to_upper((unsigned char*)symbol->fgcolour);
+ to_upper((unsigned char*)symbol->bgcolour);
+
+ if(strlen(symbol->fgcolour) != 6) {
+ strcpy(symbol->errtxt, "Malformed foreground colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ if(strlen(symbol->bgcolour) != 6) {
+ strcpy(symbol->errtxt, "Malformed background colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ err_no = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour));
+ if (err_no == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Malformed foreground colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ err_no = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->fgcolour));
+ if (err_no == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Malformed background colour target");
+ return ERROR_INVALID_OPTION;
+ }
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+
+ /* Pixel Plotting */
+ i = 0;
+ switch(rotate_angle) {
+ case 0: /* Plot the right way up */
+ for(row = 0; row < image_height; row++) {
+ for(column = 0; column < image_width; column++) {
+ switch(*(pixelbuf + (image_width * row) + column))
+ {
+ case '1':
+ symbol->bitmap[i++] = fgred;
+ symbol->bitmap[i++] = fggrn;
+ symbol->bitmap[i++] = fgblu;
+ break;
+ default:
+ symbol->bitmap[i++] = bgred;
+ symbol->bitmap[i++] = bggrn;
+ symbol->bitmap[i++] = bgblu;
+ break;
+
+ }
+ }
+ }
+ break;
+ case 90: /* Plot 90 degrees clockwise */
+ for(row = 0; row < image_width; row++) {
+ for(column = 0; column < image_height; column++) {
+ switch(*(pixelbuf + (image_width * (image_height - column - 1)) + row))
+ {
+ case '1':
+ symbol->bitmap[i++] = fgred;
+ symbol->bitmap[i++] = fggrn;
+ symbol->bitmap[i++] = fgblu;
+ break;
+ default:
+ symbol->bitmap[i++] = bgred;
+ symbol->bitmap[i++] = bggrn;
+ symbol->bitmap[i++] = bgblu;
+ break;
+
+ }
+ }
+ }
+ break;
+ case 180: /* Plot upside down */
+ for(row = 0; row < image_height; row++) {
+ for(column = 0; column < image_width; column++) {
+ switch(*(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1)))
+ {
+ case '1':
+ symbol->bitmap[i++] = fgred;
+ symbol->bitmap[i++] = fggrn;
+ symbol->bitmap[i++] = fgblu;
+ break;
+ default:
+ symbol->bitmap[i++] = bgred;
+ symbol->bitmap[i++] = bggrn;
+ symbol->bitmap[i++] = bgblu;
+ break;
+
+ }
+ }
+ }
+ break;
+ case 270: /* Plot 90 degrees anti-clockwise */
+ for(row = 0; row < image_width; row++) {
+ for(column = 0; column < image_height; column++) {
+ switch(*(pixelbuf + (image_width * column) + (image_width - row - 1)))
+ {
+ case '1':
+ symbol->bitmap[i++] = fgred;
+ symbol->bitmap[i++] = fggrn;
+ symbol->bitmap[i++] = fgblu;
+ break;
+ default:
+ symbol->bitmap[i++] = bgred;
+ symbol->bitmap[i++] = bggrn;
+ symbol->bitmap[i++] = bgblu;
+ break;
+
+ }
+ }
+ }
+ break;
+ }
+
+ return 0;
+}
+
+int png_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle, int image_type)
+{
+ int error_number;
+ float scaler = symbol->scale;
+ char *scaled_pixelbuf;
+ int horiz, vert;
+ int scale_width, scale_height;
+
+ if(scaler == 0) { scaler = 0.5; }
+ scale_width = image_width * scaler;
+ scale_height = image_height * scaler;
+
+ /* Apply scale options by creating another pixel buffer */
+ if ((scaled_pixelbuf = (char *) malloc(scale_width * scale_height)) == NULL) {
+ printf("Insufficient memory for pixel buffer");
+ return ERROR_ENCODING_PROBLEM;
+ }
+ memset(scaled_pixelbuf, '0', scale_width * scale_height);
+
+ for(vert = 0; vert < scale_height; vert++) {
+ for(horiz = 0; horiz < scale_width; horiz++) {
+ *(scaled_pixelbuf + (vert * scale_width) + horiz) = *(pixelbuf + ((int)(vert / scaler) * image_width) + (int)(horiz / scaler));
+ }
+ }
+
+ if(image_type == PNG_DATA) {
+#ifndef NO_PNG
+ error_number = png_pixel_plot(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle);
+#else
+ error_number = ERROR_INVALID_OPTION;
+#endif
+ } else {
+ error_number = bmp_pixel_plot(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle);
+ }
+
+ free(scaled_pixelbuf);
+
+ return error_number;
+}
+
+void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height)
+{
+ /* Draw a rectangle */
+ int i, j, png_ypos;
+
+ png_ypos = image_height - ypos - ylen;
+ /* This fudge is needed because EPS measures height from the bottom up but
+ PNG measures y position from the top down */
+
+ for(i = (xpos); i < (xpos + xlen); i++) {
+ for( j = (png_ypos); j < (png_ypos + ylen); j++) {
+ *(pixelbuf + (image_width * j) + i) = '1';
+ }
+ }
+}
+
+int bullseye_pixel(int row, int col) {
+ int block_val, block_pos, return_val;
+
+ block_val = bullseye_compressed[(row * 12) + (col / 8)];
+ return_val = 0;
+ block_pos = col % 8;
+
+ switch(block_pos) {
+ case 0: if((block_val & 0x80) != 0) { return_val = 1; } break;
+ case 1: if((block_val & 0x40) != 0) { return_val = 1; } break;
+ case 2: if((block_val & 0x20) != 0) { return_val = 1; } break;
+ case 3: if((block_val & 0x10) != 0) { return_val = 1; } break;
+ case 4: if((block_val & 0x08) != 0) { return_val = 1; } break;
+ case 5: if((block_val & 0x04) != 0) { return_val = 1; } break;
+ case 6: if((block_val & 0x02) != 0) { return_val = 1; } break;
+ case 7: if((block_val & 0x01) != 0) { return_val = 1; } break;
+ }
+
+ return return_val;
+}
+
+void draw_bullseye(char *pixelbuf, int image_width, int xoffset, int yoffset)
+{
+ /* Central bullseye in Maxicode symbols */
+ int i, j;
+
+ for(j = 103; j < 196; j++) {
+ for(i = 0; i < 93; i++) {
+ if(bullseye_pixel(j - 103, i)) {
+ /* if(bullseye[(((j - 103) * 93) + i)] == 1) { */
+ *(pixelbuf + (image_width * j) + (image_width * yoffset) + i + 99 + xoffset) = '1';
+ }
+ }
+ }
+}
+
+void draw_hexagon(char *pixelbuf, int image_width, int xposn, int yposn)
+{
+ /* Put a hexagon into the pixel buffer */
+ int i, j;
+
+ for(i = 0; i < 12; i++) {
+ for(j = 0; j < 10; j++) {
+ if(hexagon[(i * 10) + j] == 1) {
+ *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) = '1';
+ }
+ }
+ }
+}
+
+void draw_letter(char *pixelbuf, unsigned char letter, int xposn, int yposn, int smalltext, int image_width, int image_height)
+{
+ /* Put a letter into a position */
+ int skip, i, j, glyph_no, alphabet;
+
+ skip = 0;
+ alphabet = 0;
+
+ if(letter < 33) { skip = 1; }
+ if((letter > 127) && (letter < 161)) { skip = 1; }
+
+ if(skip == 0) {
+ if(letter > 128) {
+ alphabet = 1;
+ glyph_no = letter - 161;
+ } else {
+ glyph_no = letter - 33;
+ }
+
+ if(smalltext) {
+ for(i = 0; i <= 8; i++) {
+ for(j = 0; j < 5; j++) {
+ if(alphabet == 0) {
+ if(small_font[(glyph_no * 5) + (i * 475) + j - 1] == 1) {
+ *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1';
+ }
+ } else {
+ if(small_font_extended[(glyph_no * 5) + (i * 475) + j - 1] == 1) {
+ *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1';
+ }
+ }
+ }
+ }
+ } else {
+ for(i = 0; i <= 13; i++) {
+ for(j = 0; j < 7; j++) {
+ if(alphabet == 0) {
+ if(ascii_font[(glyph_no * 7) + (i * 665) + j - 1] == 1) {
+ *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1';
+ }
+ } else {
+ if(ascii_ext_font[(glyph_no * 7) + (i * 665) + j - 1] == 1) {
+ *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1';
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int smalltext, int image_width, int image_height)
+{
+ /* Plot a string into the pixel buffer */
+ int i, string_length, string_left_hand;
+
+ string_length = strlen(input_string);
+ string_left_hand = xposn - ((7 * string_length) / 2);
+
+ for(i = 0; i < string_length; i++) {
+ draw_letter(pixbuf, input_string[i], string_left_hand + (i * 7), yposn, smalltext, image_width, image_height);
+ }
+
+}
+
+int maxi_png_plot(struct zint_symbol *symbol, int rotate_angle, int data_type)
+{
+ int i, row, column, xposn, yposn;
+ int image_height, image_width;
+ char *pixelbuf;
+ int error_number;
+ int xoffset, yoffset;
+
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+ image_width = 300 + (2 * xoffset * 2);
+ image_height = 300 + (2 * yoffset * 2);
+
+ if (!(pixelbuf = (char *) malloc(image_width * image_height))) {
+ printf("Insifficient memory for pixel buffer");
+ return ERROR_ENCODING_PROBLEM;
+ } else {
+ for(i = 0; i < (image_width * image_height); i++) {
+ *(pixelbuf + i) = '0';
+ }
+ }
+
+ draw_bullseye(pixelbuf, image_width, (2 * xoffset), (2 * yoffset));
+
+ for(row = 0; row < symbol->rows; row++) {
+ yposn = row * 9;
+ for(column = 0; column < symbol->width; column++) {
+ xposn = column * 10;
+ if(module_is_set(symbol, row, column)) {
+ if(row & 1) {
+ /* Odd (reduced) row */
+ xposn += 5;
+ draw_hexagon(pixelbuf, image_width, xposn + (2 * xoffset), yposn + (2 * yoffset));
+ } else {
+ /* Even (full) row */
+ draw_hexagon(pixelbuf, image_width, xposn + (2 * xoffset), yposn + (2 * yoffset));
+ }
+ }
+ }
+ }
+
+ if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ /* boundary bars */
+ draw_bar(pixelbuf, 0, image_width, 0, symbol->border_width * 2, image_width, image_height);
+ draw_bar(pixelbuf, 0, image_width, 300 + (symbol->border_width * 2), symbol->border_width * 2, image_width, image_height);
+ }
+
+ if((symbol->output_options & BARCODE_BOX) != 0) {
+ /* side bars */
+ draw_bar(pixelbuf, 0, symbol->border_width * 2, 0, image_height, image_width, image_height);
+ draw_bar(pixelbuf, 300 + ((symbol->border_width + symbol->whitespace_width + symbol->whitespace_width) * 2), symbol->border_width * 2, 0, image_height, image_width, image_height);
+ }
+
+ error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type);
+ free(pixelbuf);
+ return error_number;
+}
+
+void to_latin1(unsigned char source[], unsigned char preprocessed[])
+{
+ int j, i, input_length;
+
+ input_length = ustrlen(source);
+
+ j = 0;
+ i = 0;
+ do {
+ if(source[i] < 128) {
+ preprocessed[j] = source[i];
+ j++;
+ i++;
+ } else {
+ if(source[i] == 0xC2) {
+ preprocessed[j] = source[i + 1];
+ j++;
+ i += 2;
+ }
+ if(source[i] == 0xC3) {
+ preprocessed[j] = source[i + 1] + 64;
+ j++;
+ i += 2;
+ }
+ }
+ } while (i < input_length);
+ preprocessed[j] = '\0';
+
+ return;
+}
+
+int png_plot(struct zint_symbol *symbol, int rotate_angle, int data_type)
+{
+ int textdone, main_width, comp_offset, large_bar_count;
+ char textpart[10], addon[6];
+ float addon_text_posn, preset_height, large_bar_height;
+ int i, r, textoffset, yoffset, xoffset, latch, image_width, image_height;
+ char *pixelbuf = NULL;
+ int addon_latch = 0, smalltext = 0;
+ int this_row, block_width, plot_height, plot_yposn, textpos;
+ float row_height, row_posn;
+ int error_number;
+ int default_text_posn;
+ int next_yposn;
+ int tlen = ustrlen(symbol->text);
+#ifndef _MSC_VER
+ unsigned char local_text[tlen + 1];
+#else
+ unsigned char* local_text = (unsigned char*)_alloca(tlen+ 1);
+#endif
+
+ if(symbol->show_hrt != 0) {
+ to_latin1(symbol->text, local_text);
+ } else {
+ local_text[0] = '\0';
+ }
+
+ textdone = 0;
+ main_width = symbol->width;
+ strcpy(addon, "");
+ comp_offset = 0;
+ addon_text_posn = 0.0;
+ row_height = 0;
+ if(symbol->output_options & SMALL_TEXT) {
+ smalltext = 1;
+ }
+
+ if (symbol->height == 0) {
+ symbol->height = 50;
+ }
+
+ large_bar_count = 0;
+ preset_height = 0.0;
+ for(i = 0; i < symbol->rows; i++) {
+ preset_height += symbol->row_height[i];
+ if(symbol->row_height[i] == 0) {
+ large_bar_count++;
+ }
+ }
+
+ if (large_bar_count == 0) {
+ symbol->height = preset_height;
+ large_bar_height = 10;
+ } else {
+ large_bar_height = (symbol->height - preset_height) / large_bar_count;
+ }
+
+ while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
+ comp_offset++;
+ }
+
+ /* Certain symbols need whitespace otherwise characters get chopped off the sides */
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC))
+ || (symbol->symbology == BARCODE_ISBNX)) {
+ switch(tlen) {
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ if(symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ }
+ main_width = 96 + comp_offset;
+ break;
+ default:
+ main_width = 68 + comp_offset;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ if(symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_width = 96 + comp_offset;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ if(symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_width = 51 + comp_offset;
+ }
+ }
+
+ latch = 0;
+ r = 0;
+ /* Isolate add-on text */
+ if(is_extendable(symbol->symbology)) {
+ for(i = 0; i < tlen; i++) {
+ if (latch == 1) {
+ addon[r] = local_text[i];
+ r++;
+ }
+ if (symbol->text[i] == '+') {
+ latch = 1;
+ }
+ }
+ }
+ addon[r] = '\0';
+
+ if(tlen) {
+ textoffset = 9;
+ } else {
+ textoffset = 0;
+ }
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+ image_width = 2 * (symbol->width + xoffset + xoffset);
+ image_height = 2 * (symbol->height + textoffset + yoffset + yoffset);
+
+ if (!(pixelbuf = (char *) malloc(image_width * image_height))) {
+ printf("Insufficient memory for pixel buffer");
+ return ERROR_ENCODING_PROBLEM;
+ } else {
+ for(i = 0; i < (image_width * image_height); i++) {
+ *(pixelbuf + i) = '0';
+ }
+ }
+
+ if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ default_text_posn = image_height - 17;
+ } else {
+ default_text_posn = image_height - 17 - symbol->border_width - symbol->border_width;
+ }
+
+ row_posn = textoffset + yoffset;
+ next_yposn = textoffset + yoffset;
+ row_height = 0;
+
+ /* Plot the body of the symbol to the pixel buffer */
+ for(r = 0; r < symbol->rows; r++) {
+ this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */
+ row_posn += row_height;
+ plot_yposn = next_yposn;
+ if(symbol->row_height[this_row] == 0) {
+ row_height = large_bar_height;
+ } else {
+ row_height = symbol->row_height[this_row];
+ }
+ next_yposn = (int)(row_posn + row_height);
+ plot_height = next_yposn - plot_yposn;
+
+ i = 0;
+ if(module_is_set(symbol, this_row, 0)) {
+ latch = 1;
+ } else {
+ latch = 0;
+ }
+
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
+ if((addon_latch == 0) && (r == 0) && (i > main_width)) {
+ plot_height = (int)(row_height - 5.0);
+ plot_yposn = (int)(row_posn - 5.0);
+ addon_text_posn = row_posn + row_height - 8.0;
+ addon_latch = 1;
+ }
+ if(latch == 1) {
+ /* a bar */
+ draw_bar(pixelbuf, (i + xoffset) * 2, block_width * 2, plot_yposn * 2, plot_height * 2, image_width, image_height);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+
+ } while (i < symbol->width);
+ }
+
+ xoffset += comp_offset;
+
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || (symbol->symbology == BARCODE_ISBNX)) {
+ /* guard bar extensions and text formatting for EAN8 and EAN13 */
+ switch(tlen) {
+ case 8: /* EAN-8 */
+ case 11:
+ case 14:
+ draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (32 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (34 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (64 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (66 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ for(i = 0; i < 4; i++) {
+ textpart[i] = symbol->text[i];
+ }
+ textpart[4] = '\0';
+ textpos = 2 * (17 + xoffset);
+
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ for(i = 0; i < 4; i++) {
+ textpart[i] = symbol->text[i + 4];
+ }
+ textpart[4] = '\0';
+ textpos = 2 * (50 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ textpos = 2 * (xoffset + 86);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height);
+ break;
+ case 5:
+ textpos = 2 * (xoffset + 100);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height);
+ break;
+ }
+
+ break;
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (92 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (94 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ textpos = 2 * (-7 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[6] = '\0';
+ textpos = 2 * (24 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 7];
+ }
+ textpart[6] = '\0';
+ textpos = 2 * (71 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ textpos = 2 * (xoffset + 114);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height);
+ break;
+ case 5:
+ textpos = 2 * (xoffset + 128);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height);
+ break;
+ }
+ break;
+
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ /* guard bar extensions and text formatting for UPCA */
+ latch = 1;
+
+ i = 0 + comp_offset;
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
+ if(latch == 1) {
+ /* a bar */
+ draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+ } while (i < 11 + comp_offset);
+ draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ latch = 1;
+ i = 85 + comp_offset;
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
+ if(latch == 1) {
+ /* a bar */
+ draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+ } while (i < 96 + comp_offset);
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ textpos = 2 * (-5 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ for(i = 0; i < 5; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[5] = '\0';
+ textpos = 2 * (27 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ for(i = 0; i < 5; i++) {
+ textpart[i] = symbol->text[i + 6];
+ }
+ textpart[6] = '\0';
+ textpos = 2 * (68 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ textpart[0] = symbol->text[11];
+ textpart[1] = '\0';
+ textpos = 2 * (100 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ textpos = 2 * (xoffset + 116);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height);
+ break;
+ case 5:
+ textpos = 2 * (xoffset + 130);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height);
+ break;
+ }
+
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ /* guard bar extensions and text formatting for UPCE */
+ draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height);
+
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ textpos = 2 * (-5 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[6] = '\0';
+ textpos = 2 * (24 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ textpart[0] = symbol->text[7];
+ textpart[1] = '\0';
+ textpos = 2 * (55 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height);
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ textpos = 2 * (xoffset + 70);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height);
+ break;
+ case 5:
+ textpos = 2 * (xoffset + 84);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height);
+ break;
+ }
+
+ }
+
+ xoffset -= comp_offset;
+
+ /* Put boundary bars or box around symbol */
+ if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ /* boundary bars */
+ draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, textoffset * 2, symbol->border_width * 2, image_width, image_height);
+ draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, (textoffset + symbol->height + symbol->border_width) * 2, symbol->border_width * 2, image_width, image_height);
+ if((symbol->output_options & BARCODE_BIND) != 0) {
+ if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) {
+ /* row binding */
+ for(r = 1; r < symbol->rows; r++) {
+ draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, ((r * row_height) + textoffset + yoffset - 1) * 2, 2 * 2, image_width, image_height);
+ }
+ }
+ }
+ }
+
+ if((symbol->output_options & BARCODE_BOX) != 0) {
+ /* side bars */
+ draw_bar(pixelbuf, 0, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height);
+ draw_bar(pixelbuf, (symbol->width + xoffset + xoffset - symbol->border_width) * 2, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height);
+ }
+
+ /* Put the human readable text at the bottom */
+ if((textdone == 0) && tlen) {
+ textpos = (image_width / 2);
+ draw_string(pixelbuf, (char*)local_text, textpos, default_text_posn, smalltext, image_width, image_height);
+ }
+
+ error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type);
+ free(pixelbuf);
+ return error_number;
+}
+
+#ifndef NO_PNG
+int png_handle(struct zint_symbol *symbol, int rotate_angle)
+{
+ int error;
+
+ if(symbol->symbology == BARCODE_MAXICODE) {
+ error = maxi_png_plot(symbol, rotate_angle, PNG_DATA);
+ } else {
+ error = png_plot(symbol, rotate_angle, PNG_DATA);
+ }
+
+ return error;
+}
+#endif /* NO_PNG */
+
+int bmp_handle(struct zint_symbol *symbol, int rotate_angle)
+{
+ int error;
+
+ if(symbol->symbology == BARCODE_MAXICODE) {
+ error = maxi_png_plot(symbol, rotate_angle, BMP_DATA);
+ } else {
+ error = png_plot(symbol, rotate_angle, BMP_DATA);
+ }
+
+ return error;
+}
+
diff --git a/backend/ps.c b/backend/ps.c
new file mode 100644
index 0000000..ce7fca1
--- /dev/null
+++ b/backend/ps.c
@@ -0,0 +1,772 @@
+/* ps.c - Post Script output */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "common.h"
+
+#define SSET "0123456789ABCDEF"
+
+/* This file has expanded quite a bit since version 1.5 in order to accomodate
+ the formatting rules for EAN and UPC symbols as set out in EN 797:1995 - the
+ down side of this support is that the code is now vertually unreadable! */
+
+int ps_plot(struct zint_symbol *symbol)
+{
+ int i, block_width, latch, r, this_row;
+ float textpos, large_bar_height, preset_height, row_height, row_posn;
+ FILE *feps;
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+ float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper;
+ int error_number = 0;
+ int textoffset, xoffset, yoffset, textdone, main_width;
+ char textpart[10], addon[6];
+ int large_bar_count, comp_offset;
+ float addon_text_posn;
+ float scaler = symbol->scale;
+ float default_text_posn;
+ int plot_text = 1;
+ const char *locale = NULL;
+
+ row_height=0;
+ textdone = 0;
+ main_width = symbol->width;
+ strcpy(addon, "");
+ comp_offset = 0;
+ addon_text_posn = 0.0;
+
+ if((symbol->output_options & BARCODE_STDOUT) != 0) {
+ feps = stdout;
+ } else {
+ feps = fopen(symbol->outfile, "w");
+ }
+ if(feps == NULL) {
+ strcpy(symbol->errtxt, "Could not open output file");
+ return ERROR_FILE_ACCESS;
+ }
+
+ /* sort out colour options */
+ to_upper((unsigned char*)symbol->fgcolour);
+ to_upper((unsigned char*)symbol->bgcolour);
+
+ if(strlen(symbol->fgcolour) != 6) {
+ strcpy(symbol->errtxt, "Malformed foreground colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ if(strlen(symbol->bgcolour) != 6) {
+ strcpy(symbol->errtxt, "Malformed background colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ error_number = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour));
+ if (error_number == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Malformed foreground colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ error_number = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->bgcolour));
+ if (error_number == ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "Malformed background colour target");
+ return ERROR_INVALID_OPTION;
+ }
+ locale = setlocale(LC_ALL, "C");
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+ red_ink = fgred / 256.0;
+ green_ink = fggrn / 256.0;
+ blue_ink = fgblu / 256.0;
+ red_paper = bgred / 256.0;
+ green_paper = bggrn / 256.0;
+ blue_paper = bgblu / 256.0;
+
+ if (symbol->height == 0) {
+ symbol->height = 50;
+ }
+
+ large_bar_count = 0;
+ preset_height = 0.0;
+ for(i = 0; i < symbol->rows; i++) {
+ preset_height += symbol->row_height[i];
+ if(symbol->row_height[i] == 0) {
+ large_bar_count++;
+ }
+ }
+ large_bar_height = (symbol->height - preset_height) / large_bar_count;
+
+ if (large_bar_count == 0) {
+ symbol->height = preset_height;
+ }
+
+ while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
+ comp_offset++;
+ }
+
+ /* Certain symbols need whitespace otherwise characters get chopped off the sides */
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC))
+ || (symbol->symbology == BARCODE_ISBNX)) {
+ switch(ustrlen(symbol->text)) {
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ if(symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ }
+ main_width = 96 + comp_offset;
+ break;
+ default:
+ main_width = 68 + comp_offset;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ if(symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_width = 96 + comp_offset;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ if(symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_width = 51 + comp_offset;
+ }
+ }
+
+ latch = 0;
+ r = 0;
+ /* Isolate add-on text */
+ if(is_extendable(symbol->symbology)) {
+ for(i = 0; i < ustrlen(symbol->text); i++) {
+ if (latch == 1) {
+ addon[r] = symbol->text[i];
+ r++;
+ }
+ if (symbol->text[i] == '+') {
+ latch = 1;
+ }
+ }
+ }
+ addon[r] = '\0';
+
+ if((symbol->show_hrt == 0) || (ustrlen(symbol->text) == 0)) {
+ plot_text = 0;
+ }
+ if(plot_text) {
+ textoffset = 9;
+ } else {
+ textoffset = 0;
+ }
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+
+ /* Start writing the header */
+ fprintf(feps, "%%!PS-Adobe-3.0 EPSF-3.0\n");
+ fprintf(feps, "%%%%Creator: Zint %s\n", ZINT_VERSION);
+ if(ustrlen(symbol->text) != 0) {
+ fprintf(feps, "%%%%Title: %s\n",symbol->text);
+ } else {
+ fprintf(feps, "%%%%Title: Zint Generated Symbol\n");
+ }
+ fprintf(feps, "%%%%Pages: 0\n");
+ if(symbol->symbology != BARCODE_MAXICODE) {
+ fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", roundup((symbol->width + xoffset + xoffset) * scaler), roundup((symbol->height + textoffset + yoffset + yoffset) * scaler));
+ } else {
+ fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", roundup((74.0 + xoffset + xoffset) * scaler), roundup((72.0 + yoffset + yoffset) * scaler));
+ }
+ fprintf(feps, "%%%%EndComments\n");
+
+ /* Definitions */
+ fprintf(feps, "/TL { setlinewidth moveto lineto stroke } bind def\n");
+ fprintf(feps, "/TC { moveto 0 360 arc 360 0 arcn fill } bind def\n");
+ fprintf(feps, "/TH { 0 setlinewidth moveto lineto lineto lineto lineto lineto closepath fill } bind def\n");
+ fprintf(feps, "/TB { 2 copy } bind def\n");
+ fprintf(feps, "/TR { newpath 4 1 roll exch moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath fill } bind def\n");
+ fprintf(feps, "/TE { pop pop } bind def\n");
+
+ fprintf(feps, "newpath\n");
+
+ /* Now the actual representation */
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_paper, green_paper, blue_paper);
+ fprintf(feps, "%.2f 0.00 TB 0.00 %.2f TR\n", (symbol->height + textoffset + yoffset + yoffset) * scaler, (symbol->width + xoffset + xoffset) * scaler);
+
+ if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ default_text_posn = 0.5 * scaler;
+ } else {
+ default_text_posn = (symbol->border_width + 0.5) * scaler;
+ }
+
+ if(symbol->symbology == BARCODE_MAXICODE) {
+ /* Maxicode uses hexagons */
+ float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my;
+
+
+ textoffset = 0.0;
+ if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + 72.0 + symbol->border_width) * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler);
+ }
+ if((symbol->output_options & BARCODE_BOX) != 0) {
+ /* side bars */
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, (74.0 + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler);
+ }
+
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 10.85 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 8.97 * scaler, (44.73 + xoffset) * scaler, (35.60 + yoffset) * scaler);
+ fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 7.10 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 5.22 * scaler, (40.98 + xoffset) * scaler, (35.60 + yoffset) * scaler);
+ fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 3.31 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 1.43 * scaler, (37.19 + xoffset) * scaler, (35.60 + yoffset) * scaler);
+ for(r = 0; r < symbol->rows; r++) {
+ for(i = 0; i < symbol->width; i++) {
+ if(module_is_set(symbol, r, i)) {
+ /* Dump a hexagon */
+ my = ((symbol->rows - r - 1)) * 2.135 + 1.43;
+ ay = my + 1.0 + yoffset;
+ by = my + 0.5 + yoffset;
+ cy = my - 0.5 + yoffset;
+ dy = my - 1.0 + yoffset;
+ ey = my - 0.5 + yoffset;
+ fy = my + 0.5 + yoffset;
+
+ mx = 2.46 * i + 1.23 + (r & 1 ? 1.23 : 0);
+
+ ax = mx + xoffset;
+ bx = mx + 0.86 + xoffset;
+ cx = mx + 0.86 + xoffset;
+ dx = mx + xoffset;
+ ex = mx - 0.86 + xoffset;
+ fx = mx - 0.86 + xoffset;
+ fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TH\n", ax * scaler, ay * scaler, bx * scaler, by * scaler, cx * scaler, cy * scaler, dx * scaler, dy * scaler, ex * scaler, ey * scaler, fx * scaler, fy * scaler);
+ }
+ }
+ }
+ }
+
+ if(symbol->symbology != BARCODE_MAXICODE) {
+ /* everything else uses rectangles (or squares) */
+ /* Works from the bottom of the symbol up */
+ int addon_latch = 0;
+
+ for(r = 0; r < symbol->rows; r++) {
+ this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */
+ if(symbol->row_height[this_row] == 0) {
+ row_height = large_bar_height;
+ } else {
+ row_height = symbol->row_height[this_row];
+ }
+ row_posn = 0;
+ for(i = 0; i < r; i++) {
+ if(symbol->row_height[symbol->rows - i - 1] == 0) {
+ row_posn += large_bar_height;
+ } else {
+ row_posn += symbol->row_height[symbol->rows - i - 1];
+ }
+ }
+ row_posn += (textoffset + yoffset);
+
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f ", row_height * scaler, row_posn * scaler);
+ i = 0;
+ if(module_is_set(symbol, this_row, 0)) {
+ latch = 1;
+ } else {
+ latch = 0;
+ }
+
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
+ if((addon_latch == 0) && (r == 0) && (i > main_width)) {
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f ", (row_height - 5.0) * scaler, (row_posn - 5.0) * scaler);
+ addon_text_posn = row_posn + row_height - 8.0;
+ addon_latch = 1;
+ }
+ if(latch == 1) {
+ /* a bar */
+ fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset) * scaler, block_width * scaler);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+
+ } while (i < symbol->width);
+ }
+ }
+ /* That's done the actual data area, everything else is human-friendly */
+
+ xoffset += comp_offset;
+
+ if (plot_text) {
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) ||
+ (symbol->symbology == BARCODE_ISBNX)) {
+ /* guard bar extensions and text formatting for EAN8 and EAN13 */
+ switch(ustrlen(symbol->text)) {
+ case 8: /* EAN-8 */
+ case 11:
+ case 14:
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (32 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (34 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (64 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (66 + xoffset) * scaler, 1 * scaler);
+ for(i = 0; i < 4; i++) {
+ textpart[i] = symbol->text[i];
+ }
+ textpart[4] = '\0';
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 17;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for(i = 0; i < 4; i++) {
+ textpart[i] = symbol->text[i + 4];
+ }
+ textpart[4] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 50;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 86;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ case 5:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 100;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ }
+
+ break;
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (92 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (94 + xoffset) * scaler, 1 * scaler);
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = -7;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[6] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 24;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 7];
+ }
+ textpart[6] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 71;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 114;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ case 5:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 128;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ }
+ break;
+
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ /* guard bar extensions and text formatting for UPCA */
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler);
+ latch = 1;
+
+ i = 0 + comp_offset;
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
+ if(latch == 1) {
+ /* a bar */
+ fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+ } while (i < 11 + comp_offset);
+ fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler);
+ latch = 1;
+ i = 85 + comp_offset;
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
+ if(latch == 1) {
+ /* a bar */
+ fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+ } while (i < 96 + comp_offset);
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = -5;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for(i = 0; i < 5; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[5] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 27;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for(i = 0; i < 5; i++) {
+ textpart[i] = symbol->text[i + 6];
+ }
+ textpart[6] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 68;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textpart[0] = symbol->text[11];
+ textpart[1] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = 100;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 116;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ case 5:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 130;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ }
+
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ /* guard bar extensions and text formatting for UPCE */
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (50 + xoffset) * scaler, 1 * scaler);
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = -5;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[6] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 24;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textpart[0] = symbol->text[7];
+ textpart[1] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = 55;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 70;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ case 5:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 84;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ }
+
+ }
+ } /* if (plot_text) */
+
+ xoffset -= comp_offset;
+
+ switch(symbol->symbology) {
+ case BARCODE_MAXICODE:
+ /* Do nothing! (It's already been done) */
+ break;
+ default:
+ if((symbol->output_options & BARCODE_BIND) != 0) {
+ if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) {
+ /* row binding */
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ for(r = 1; r < symbol->rows; r++) {
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", 2.0 * scaler, ((r * row_height) + textoffset + yoffset - 1) * scaler, xoffset * scaler, symbol->width * scaler);
+ }
+ }
+ }
+ if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + symbol->height + symbol->border_width) * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler);
+ }
+ if((symbol->output_options & BARCODE_BOX) != 0) {
+ /* side bars */
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, (symbol->width + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler);
+ }
+ break;
+ }
+
+ /* Put the human readable text at the bottom */
+ if(plot_text && (textdone == 0)) {
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = symbol->width / 2.0;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", symbol->text);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", symbol->text);
+ fprintf(feps, "setmatrix\n");
+ }
+ fprintf(feps, "\nshowpage\n");
+ if((symbol->output_options & BARCODE_STDOUT) == 0)
+ fclose(feps);
+
+ if (locale)
+ setlocale(LC_ALL, locale);
+
+ return error_number;
+}
+
diff --git a/backend/qr.c b/backend/qr.c
new file mode 100644
index 0000000..6af0755
--- /dev/null
+++ b/backend/qr.c
@@ -0,0 +1,2361 @@
+/* qr.c Handles QR Code */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <string.h>
+#ifdef _MSC_VER
+#include <malloc.h>
+#endif
+#include "common.h"
+#include <stdio.h>
+#include "sjis.h"
+#include "qr.h"
+#include "reedsol.h"
+
+int in_alpha(int glyph) {
+ /* Returns true if input glyph is in the Alphanumeric set */
+ int retval = 0;
+ char cglyph = (char) glyph;
+
+ if((cglyph >= '0') && (cglyph <= '9')) {
+ retval = 1;
+ }
+ if((cglyph >= 'A') && (cglyph <= 'Z')) {
+ retval = 1;
+ }
+ switch (cglyph) {
+ case ' ':
+ case '$':
+ case '%':
+ case '*':
+ case '+':
+ case '-':
+ case '.':
+ case '/':
+ case ':':
+ retval = 1;
+ break;
+ }
+
+ return retval;
+}
+
+void define_mode(char mode[], int jisdata[], int length, int gs1)
+{
+ /* Values placed into mode[] are: K = Kanji, B = Binary, A = Alphanumeric, N = Numeric */
+ int i, mlen, j;
+
+ for(i = 0; i < length; i++) {
+ if(jisdata[i] > 0xff) {
+ mode[i] = 'K';
+ } else {
+ mode[i] = 'B';
+ if(in_alpha(jisdata[i])) { mode[i] = 'A'; }
+ if(gs1 && (jisdata[i] == '[')) { mode[i] = 'A'; }
+ if((jisdata[i] >= '0') && (jisdata[i] <= '9')) { mode[i] = 'N'; }
+ }
+ }
+
+ /* If less than 6 numeric digits together then don't use numeric mode */
+ for(i = 0; i < length; i++) {
+ if(mode[i] == 'N') {
+ if(((i != 0) && (mode[i - 1] != 'N')) || (i == 0)) {
+ mlen = 0;
+ while (((mlen + i) < length) && (mode[mlen + i] == 'N')) {
+ mlen++;
+ };
+ if(mlen < 6) {
+ for(j = 0; j < mlen; j++) {
+ mode[i + j] = 'A';
+ }
+ }
+ }
+ }
+ }
+
+ /* If less than 4 alphanumeric characters together then don't use alphanumeric mode */
+ for(i = 0; i < length; i++) {
+ if(mode[i] == 'A') {
+ if(((i != 0) && (mode[i - 1] != 'A')) || (i == 0)) {
+ mlen = 0;
+ while (((mlen + i) < length) && (mode[mlen + i] == 'A')) {
+ mlen++;
+ };
+ if(mlen < 6) {
+ for(j = 0; j < mlen; j++) {
+ mode[i + j] = 'B';
+ }
+ }
+ }
+ }
+ }
+}
+
+int estimate_binary_length(char mode[], int length, int gs1)
+{
+ /* Make an estimate (worst case scenario) of how long the binary string will be */
+ int i, count = 0;
+ char current = 0;
+ int a_count = 0;
+ int n_count = 0;
+
+ if(gs1) { count += 4; }
+
+ for(i = 0; i < length; i++) {
+ if(mode[i] != current) {
+ switch(mode[i]) {
+ case 'K': count += 12 + 4; current = 'K'; break;
+ case 'B': count += 16 + 4; current = 'B'; break;
+ case 'A': count += 13 + 4; current = 'A'; a_count = 0; break;
+ case 'N': count += 14 + 4; current = 'N'; n_count = 0; break;
+ }
+ }
+
+ switch(mode[i]) {
+ case 'K': count += 13; break;
+ case 'B': count += 8; break;
+ case 'A':
+ a_count++;
+ if((a_count & 1) == 0) {
+ count += 5; // 11 in total
+ a_count = 0;
+ }
+ else
+ count += 6;
+ break;
+ case 'N':
+ n_count++;
+ if((n_count % 3) == 0) {
+ count += 3; // 10 in total
+ n_count = 0;
+ }
+ else if ((n_count & 1) == 0)
+ count += 3; // 7 in total
+ else
+ count += 4;
+ break;
+ }
+ }
+
+ return count;
+}
+
+static inline void qr_bscan(char *binary, int data, int h)
+{
+ for (; h; h>>=1) {
+ concat(binary, data & h ? "1" : "0");
+ }
+}
+
+void qr_binary(int datastream[], int version, int target_binlen, char mode[], int jisdata[], int length, int gs1, int est_binlen)
+{
+ /* Convert input data to a binary stream and add padding */
+ int position = 0, debug = 0;
+ int short_data_block_length, i, scheme = 1;
+ char data_block, padbits;
+ int current_binlen, current_bytes;
+ int toggle, percent;
+
+#ifndef _MSC_VER
+ char binary[est_binlen + 12];
+#else
+ char* binary = (char *)_alloca(est_binlen + 12);
+#endif
+ strcpy(binary, "");
+
+ if(gs1) {
+ concat(binary, "0101"); /* FNC1 */
+ }
+
+ if(version <= 9) {
+ scheme = 1;
+ } else if((version >= 10) && (version <= 26)) {
+ scheme = 2;
+ } else if(version >= 27) {
+ scheme = 3;
+ }
+
+ if(debug) {
+ for(i = 0; i < length; i++) {
+ printf("%c", mode[i]);
+ }
+ printf("\n");
+ }
+
+ percent = 0;
+
+ do {
+ data_block = mode[position];
+ short_data_block_length = 0;
+ do {
+ short_data_block_length++;
+ } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block));
+
+ switch(data_block) {
+ case 'K':
+ /* Kanji mode */
+ /* Mode indicator */
+ concat(binary, "1000");
+
+ /* Character count indicator */
+ qr_bscan(binary, short_data_block_length, 0x20 << (scheme*2)); /* scheme = 1..3 */
+
+ if(debug) { printf("Kanji block (length %d)\n\t", short_data_block_length); }
+
+ /* Character representation */
+ for(i = 0; i < short_data_block_length; i++) {
+ int jis = jisdata[position + i];
+ int msb, lsb, prod;
+
+ if(jis > 0x9fff) { jis -= 0xc140; }
+ msb = (jis & 0xff00) >> 4;
+ lsb = (jis & 0xff);
+ prod = (msb * 0xc0) + lsb;
+
+ qr_bscan(binary, prod, 0x1000);
+
+ if(debug) { printf("0x%4X ", prod); }
+ }
+
+ if(debug) { printf("\n"); }
+
+ break;
+ case 'B':
+ /* Byte mode */
+ /* Mode indicator */
+ concat(binary, "0100");
+
+ /* Character count indicator */
+ qr_bscan(binary, short_data_block_length, scheme > 1 ? 0x8000 : 0x80); /* scheme = 1..3 */
+
+ if(debug) { printf("Byte block (length %d)\n\t", short_data_block_length); }
+
+ /* Character representation */
+ for(i = 0; i < short_data_block_length; i++) {
+ int byte = jisdata[position + i];
+
+ if(gs1 && (byte == '[')) {
+ byte = 0x1d; /* FNC1 */
+ }
+
+ qr_bscan(binary, byte, 0x80);
+
+ if(debug) { printf("0x%2X(%d) ", byte, byte); }
+ }
+
+ if(debug) { printf("\n"); }
+
+ break;
+ case 'A':
+ /* Alphanumeric mode */
+ /* Mode indicator */
+ concat(binary, "0010");
+
+ /* Character count indicator */
+ qr_bscan(binary, short_data_block_length, 0x40 << (2 * scheme)); /* scheme = 1..3 */
+
+ if(debug) { printf("Alpha block (length %d)\n\t", short_data_block_length); }
+
+ /* Character representation */
+ i = 0;
+ while ( i < short_data_block_length ) {
+ int count;
+ int first = 0, second = 0, prod;
+
+ if(percent == 0) {
+ if(gs1 && (jisdata[position + i] == '%')) {
+ first = posn(RHODIUM, '%');
+ second = posn(RHODIUM, '%');
+ count = 2;
+ prod = (first * 45) + second;
+ i++;
+ } else {
+ if(gs1 && (jisdata[position + i] == '[')) {
+ first = posn(RHODIUM, '%'); /* FNC1 */
+ } else {
+ first = posn(RHODIUM, (char) jisdata[position + i]);
+ }
+ count = 1;
+ i++;
+ prod = first;
+
+ if(mode[position + i] == 'A') {
+ if(gs1 && (jisdata[position + i] == '%')) {
+ second = posn(RHODIUM, '%');
+ count = 2;
+ prod = (first * 45) + second;
+ percent = 1;
+ } else {
+ if(gs1 && (jisdata[position + i] == '[')) {
+ second = posn(RHODIUM, '%'); /* FNC1 */
+ } else {
+ second = posn(RHODIUM, (char) jisdata[position + i]);
+ }
+ count = 2;
+ i++;
+ prod = (first * 45) + second;
+ }
+ }
+ }
+ } else {
+ first = posn(RHODIUM, '%');
+ count = 1;
+ i++;
+ prod = first;
+ percent = 0;
+
+ if(mode[position + i] == 'A') {
+ if(gs1 && (jisdata[position + i] == '%')) {
+ second = posn(RHODIUM, '%');
+ count = 2;
+ prod = (first * 45) + second;
+ percent = 1;
+ } else {
+ if(gs1 && (jisdata[position + i] == '[')) {
+ second = posn(RHODIUM, '%'); /* FNC1 */
+ } else {
+ second = posn(RHODIUM, (char) jisdata[position + i]);
+ }
+ count = 2;
+ i++;
+ prod = (first * 45) + second;
+ }
+ }
+ }
+
+ qr_bscan(binary, prod, count == 2 ? 0x400 : 0x20); /* count = 1..2 */
+
+ if(debug) { printf("0x%4X ", prod); }
+ };
+
+ if(debug) { printf("\n"); }
+
+ break;
+ case 'N':
+ /* Numeric mode */
+ /* Mode indicator */
+ concat(binary, "0001");
+
+ /* Character count indicator */
+ qr_bscan(binary, short_data_block_length, 0x80 << (2 * scheme)); /* scheme = 1..3 */
+
+ if(debug) { printf("Number block (length %d)\n\t", short_data_block_length); }
+
+ /* Character representation */
+ i = 0;
+ while ( i < short_data_block_length ) {
+ int count;
+ int first = 0, second = 0, third = 0, prod;
+
+ first = posn(NEON, (char) jisdata[position + i]);
+ count = 1;
+ prod = first;
+
+ if(mode[position + i + 1] == 'N') {
+ second = posn(NEON, (char) jisdata[position + i + 1]);
+ count = 2;
+ prod = (prod * 10) + second;
+
+ if(mode[position + i + 2] == 'N') {
+ third = posn(NEON, (char) jisdata[position + i + 2]);
+ count = 3;
+ prod = (prod * 10) + third;
+ }
+ }
+
+ qr_bscan(binary, prod, 1 << (3 * count)); /* count = 1..3 */
+
+ if(debug) { printf("0x%4X (%d)", prod, prod); }
+
+ i += count;
+ };
+
+ if(debug) { printf("\n"); }
+
+ break;
+ }
+
+ position += short_data_block_length;
+ } while (position < length) ;
+
+ /* Terminator */
+ concat(binary, "0000");
+
+ current_binlen = strlen(binary);
+ padbits = 8 - (current_binlen % 8);
+ if(padbits == 8) { padbits = 0; }
+ current_bytes = (current_binlen + padbits) / 8;
+
+ /* Padding bits */
+ for(i = 0; i < padbits; i++) {
+ concat(binary, "0");
+ }
+
+ /* Put data into 8-bit codewords */
+ for(i = 0; i < current_bytes; i++) {
+ datastream[i] = 0x00;
+ if(binary[i * 8] == '1') { datastream[i] += 0x80; }
+ if(binary[i * 8 + 1] == '1') { datastream[i] += 0x40; }
+ if(binary[i * 8 + 2] == '1') { datastream[i] += 0x20; }
+ if(binary[i * 8 + 3] == '1') { datastream[i] += 0x10; }
+ if(binary[i * 8 + 4] == '1') { datastream[i] += 0x08; }
+ if(binary[i * 8 + 5] == '1') { datastream[i] += 0x04; }
+ if(binary[i * 8 + 6] == '1') { datastream[i] += 0x02; }
+ if(binary[i * 8 + 7] == '1') { datastream[i] += 0x01; }
+ }
+
+ /* Add pad codewords */
+ toggle = 0;
+ for(i = current_bytes; i < target_binlen; i++) {
+ if(toggle == 0) {
+ datastream[i] = 0xec;
+ toggle = 1;
+ } else {
+ datastream[i] = 0x11;
+ toggle = 0;
+ }
+ }
+
+ if(debug) {
+ printf("Resulting codewords:\n\t");
+ for(i = 0; i < target_binlen; i++) {
+ printf("0x%2X ", datastream[i]);
+ }
+ printf("\n");
+ }
+}
+
+void add_ecc(int fullstream[], int datastream[], int version, int data_cw, int blocks)
+{
+ /* Split data into blocks, add error correction and then interleave the blocks and error correction data */
+ int ecc_cw = qr_total_codewords[version - 1] - data_cw;
+ int short_data_block_length = data_cw / blocks;
+ int qty_long_blocks = data_cw % blocks;
+ int qty_short_blocks = blocks - qty_long_blocks;
+ int ecc_block_length = ecc_cw / blocks;
+ int i, j, length_this_block, posn, debug = 0;
+
+
+#ifndef _MSC_VER
+ unsigned char data_block[short_data_block_length + 2];
+ unsigned char ecc_block[ecc_block_length + 2];
+ int interleaved_data[data_cw + 2];
+ int interleaved_ecc[ecc_cw + 2];
+#else
+ unsigned char* data_block = (unsigned char *)_alloca(short_data_block_length + 2);
+ unsigned char* ecc_block = (unsigned char *)_alloca(ecc_block_length + 2);
+ int* interleaved_data = (int *)_alloca((data_cw + 2) * sizeof(int));
+ int* interleaved_ecc = (int *)_alloca((ecc_cw + 2) * sizeof(int));
+#endif
+
+ posn = 0;
+
+ for(i = 0; i < blocks; i++) {
+ if(i < qty_short_blocks) { length_this_block = short_data_block_length; } else { length_this_block = short_data_block_length + 1; }
+
+ for(j = 0; j < ecc_block_length; j++) {
+ ecc_block[j] = 0;
+ }
+
+ for(j = 0; j < length_this_block; j++) {
+ data_block[j] = (unsigned char) datastream[posn + j];
+ }
+
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_block_length, 0);
+ rs_encode(length_this_block, data_block, ecc_block);
+ rs_free();
+
+ if(debug) {
+ printf("Block %d: ", i + 1);
+ for(j = 0; j < length_this_block; j++) {
+ printf("%2X ", data_block[j]);
+ }
+ if(i < qty_short_blocks) {
+ printf(" ");
+ }
+ printf(" // ");
+ for(j = 0; j < ecc_block_length; j++) {
+ printf("%2X ", ecc_block[ecc_block_length - j - 1]);
+ }
+ printf("\n");
+ }
+
+ for(j = 0; j < short_data_block_length; j++) {
+ interleaved_data[(j * blocks) + i] = (int) data_block[j];
+ }
+
+ if(i >= qty_short_blocks){
+ interleaved_data[(short_data_block_length * blocks) + (i - qty_short_blocks)] = (int) data_block[short_data_block_length];
+ }
+
+ for(j = 0; j < ecc_block_length; j++) {
+ interleaved_ecc[(j * blocks) + i] = (int) ecc_block[ecc_block_length - j - 1];
+ }
+
+ posn += length_this_block;
+ }
+
+ for(j = 0; j < data_cw; j++) {
+ fullstream[j] = interleaved_data[j];
+ }
+ for(j = 0; j < ecc_cw; j++) {
+ fullstream[j + data_cw] = interleaved_ecc[j];
+ }
+
+ if(debug) {
+ printf("\nData Stream: \n");
+ for(j = 0; j < (data_cw + ecc_cw); j++) {
+ printf("%2X ", fullstream[j]);
+ }
+ printf("\n");
+ }
+}
+
+void place_finder(unsigned char grid[], int size, int x, int y)
+{
+ int xp, yp;
+
+ int finder[] = {
+ 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 1,
+ 1, 0, 1, 1, 1, 0, 1,
+ 1, 0, 1, 1, 1, 0, 1,
+ 1, 0, 1, 1, 1, 0, 1,
+ 1, 0, 0, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1
+ };
+
+ for(xp = 0; xp < 7; xp++) {
+ for(yp = 0; yp < 7; yp++) {
+ if (finder[xp + (7 * yp)] == 1) {
+ grid[((yp + y) * size) + (xp + x)] = 0x11;
+ } else {
+ grid[((yp + y) * size) + (xp + x)] = 0x10;
+ }
+ }
+ }
+}
+
+void place_align(unsigned char grid[], int size, int x, int y)
+{
+ int xp, yp;
+
+ int alignment[] = {
+ 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 1,
+ 1, 0, 1, 0, 1,
+ 1, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1
+ };
+
+ x -= 2;
+ y -= 2; /* Input values represent centre of pattern */
+
+ for(xp = 0; xp < 5; xp++) {
+ for(yp = 0; yp < 5; yp++) {
+ if (alignment[xp + (5 * yp)] == 1) {
+ grid[((yp + y) * size) + (xp + x)] = 0x11;
+ } else {
+ grid[((yp + y) * size) + (xp + x)] = 0x10;
+ }
+ }
+ }
+}
+
+void setup_grid(unsigned char* grid, int size, int version)
+{
+ int i, toggle = 1;
+ int loopsize, x, y, xcoord, ycoord;
+
+ /* Add timing patterns */
+ for(i = 0; i < size; i++) {
+ if(toggle == 1) {
+ grid[(6 * size) + i] = 0x21;
+ grid[(i * size) + 6] = 0x21;
+ toggle = 0;
+ } else {
+ grid[(6 * size) + i] = 0x20;
+ grid[(i * size) + 6] = 0x20;
+ toggle = 1;
+ }
+ }
+
+ /* Add finder patterns */
+ place_finder(grid, size, 0, 0);
+ place_finder(grid, size, 0, size - 7);
+ place_finder(grid, size, size - 7, 0);
+
+ /* Add separators */
+ for(i = 0; i < 7; i++) {
+ grid[(7 * size) + i] = 0x10;
+ grid[(i * size) + 7] = 0x10;
+ grid[(7 * size) + (size - 1 - i)] = 0x10;
+ grid[(i * size) + (size - 8)] = 0x10;
+ grid[((size - 8) * size) + i] = 0x10;
+ grid[((size - 1 - i) * size) + 7] = 0x10;
+ }
+ grid[(7 * size) + 7] = 0x10;
+ grid[(7 * size) + (size - 8)] = 0x10;
+ grid[((size - 8) * size) + 7] = 0x10;
+
+ /* Add alignment patterns */
+ if(version != 1) {
+ /* Version 1 does not have alignment patterns */
+
+ loopsize = qr_align_loopsize[version - 1];
+ for(x = 0; x < loopsize; x++) {
+ for(y = 0; y < loopsize; y++) {
+ xcoord = qr_table_e1[((version - 2) * 7) + x];
+ ycoord = qr_table_e1[((version - 2) * 7) + y];
+
+ if(!(grid[(ycoord * size) + xcoord] & 0x10)) {
+ place_align(grid, size, xcoord, ycoord);
+ }
+ }
+ }
+ }
+
+ /* Reserve space for format information */
+ for(i = 0; i < 8; i++) {
+ grid[(8 * size) + i] += 0x20;
+ grid[(i * size) + 8] += 0x20;
+ grid[(8 * size) + (size - 1 - i)] = 0x20;
+ grid[((size - 1 - i) * size) + 8] = 0x20;
+ }
+ grid[(8 * size) + 8] += 20;
+ grid[((size - 1 - 7) * size) + 8] = 0x21; /* Dark Module from Figure 25 */
+
+ /* Reserve space for version information */
+ if(version >= 7) {
+ for(i = 0; i < 6; i++) {
+ grid[((size - 9) * size) + i] = 0x20;
+ grid[((size - 10) * size) + i] = 0x20;
+ grid[((size - 11) * size) + i] = 0x20;
+ grid[(i * size) + (size - 9)] = 0x20;
+ grid[(i * size) + (size - 10)] = 0x20;
+ grid[(i * size) + (size - 11)] = 0x20;
+ }
+ }
+}
+
+int cwbit(int* datastream, int i) {
+ int word = i / 8;
+ int bit = i % 8;
+ int resultant = 0;
+
+ switch(bit) {
+ case 0: if(datastream[word] & 0x80) { resultant = 1; } else { resultant = 0; } break;
+ case 1: if(datastream[word] & 0x40) { resultant = 1; } else { resultant = 0; } break;
+ case 2: if(datastream[word] & 0x20) { resultant = 1; } else { resultant = 0; } break;
+ case 3: if(datastream[word] & 0x10) { resultant = 1; } else { resultant = 0; } break;
+ case 4: if(datastream[word] & 0x08) { resultant = 1; } else { resultant = 0; } break;
+ case 5: if(datastream[word] & 0x04) { resultant = 1; } else { resultant = 0; } break;
+ case 6: if(datastream[word] & 0x02) { resultant = 1; } else { resultant = 0; } break;
+ case 7: if(datastream[word] & 0x01) { resultant = 1; } else { resultant = 0; } break;
+ }
+
+ return resultant;
+}
+
+void populate_grid(unsigned char* grid, int size, int* datastream, int cw)
+{
+ int direction = 1; /* up */
+ int row = 0; /* right hand side */
+
+ int i, n, x, y;
+
+ n = cw * 8;
+ y = size - 1;
+ i = 0;
+ do {
+ x = (size - 2) - (row * 2);
+ if(x < 6)
+ x--; /* skip over vertical timing pattern */
+
+ if(!(grid[(y * size) + (x + 1)] & 0xf0)) {
+ if (cwbit(datastream, i)) {
+ grid[(y * size) + (x + 1)] = 0x01;
+ } else {
+ grid[(y * size) + (x + 1)] = 0x00;
+ }
+ i++;
+ }
+
+ if(i < n) {
+ if(!(grid[(y * size) + x] & 0xf0)) {
+ if (cwbit(datastream, i)) {
+ grid[(y * size) + x] = 0x01;
+ } else {
+ grid[(y * size) + x] = 0x00;
+ }
+ i++;
+ }
+ }
+
+ if(direction) { y--; } else { y++; }
+ if(y == -1) {
+ /* reached the top */
+ row++;
+ y = 0;
+ direction = 0;
+ }
+ if(y == size) {
+ /* reached the bottom */
+ row++;
+ y = size - 1;
+ direction = 1;
+ }
+ } while (i < n);
+}
+
+int evaluate(unsigned char *grid, int size, int pattern)
+{
+ int x, y, block;
+ int result = 0;
+ char state;
+ int p;
+ int dark_mods;
+ int percentage, k, k2;
+
+#ifndef _MSC_VER
+ char local[size * size];
+#else
+ char* local = (char *)_alloca((size * size) * sizeof(char));
+#endif
+
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < size; y++) {
+ switch(pattern) {
+ case 0: if (grid[(y * size) + x] & 0x01) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break;
+ case 1: if (grid[(y * size) + x] & 0x02) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break;
+ case 2: if (grid[(y * size) + x] & 0x04) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break;
+ case 3: if (grid[(y * size) + x] & 0x08) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break;
+ case 4: if (grid[(y * size) + x] & 0x10) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break;
+ case 5: if (grid[(y * size) + x] & 0x20) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break;
+ case 6: if (grid[(y * size) + x] & 0x40) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break;
+ case 7: if (grid[(y * size) + x] & 0x80) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break;
+ }
+ }
+ }
+
+ /* Test 1: Adjacent modules in row/column in same colour */
+ /* Vertical */
+ for(x = 0; x < size; x++) {
+ state = local[x];
+ block = 0;
+ for(y = 0; y < size; y++) {
+ if(local[(y * size) + x] == state) {
+ block++;
+ if(block ==5)
+ result += 3;
+
+ if(block>5)
+ result +=1;
+ } else {
+ block=0;
+ }
+ }
+ }
+
+ /* Horizontal */
+ for(y = 0; y < size; y++) {
+ state = local[y * size];
+ block = 0;
+ for(x = 0; x < size; x++) {
+ if(local[(y * size) + x] == state) {
+ block++;
+ if(block ==5)
+ result += 3;
+
+ if(block>5)
+ result +=1;
+ } else {
+ block=0;
+ }
+ }
+ }
+
+ /* Test 2 fd02131114 */
+ for(x = 0; x < size-1; x++) {
+ for(y = 0; y < (size - 7) -1; y++) {
+ // y + 1???
+ if((local[((y + 1) * size) + x] == '1') &&
+ (local[((y + 1) * size) + x+1] == '1') &&
+ (local[(((y + 1)+1) * size) + x] == '1') &&
+ (local[(((y + 1)+1) * size) + x+1] == '1')
+ ) { result += 3; }
+
+ if((local[((y + 1) * size) + x] == '0') &&
+ (local[((y + 1) * size) + x+1] == '0') &&
+ (local[(((y + 1)+1) * size) + x] == '0') &&
+ (local[(((y + 1)+1) * size) + x+1] == '0')
+ ) { result += 3; }
+ }
+ }
+
+ /* Test 3: fd02131114 */
+ /*pattern 10111010000 */
+ /* Vertical */
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < (size - 11); y++) {
+ p = 0;
+ if(local[(y * size) + x] == '1') { p += 1; }
+ if(local[((y + 1) * size) + x] == '0') { p += 1; }
+ if(local[((y + 2) * size) + x] == '1') { p += 1; }
+ if(local[((y + 3) * size) + x] == '1') { p += 1; }
+ if(local[((y + 4) * size) + x] == '1') { p += 1; }
+ if(local[((y + 5) * size) + x] == '0') { p += 1; }
+ if(local[((y + 6) * size) + x] == '1') { p += 1; }
+ if(local[((y + 7) * size) + x] == '0') { p += 1; }
+ if(local[((y + 8) * size) + x] == '0') { p += 1; }
+ if(local[((y + 9) * size) + x] == '0') { p += 1; }
+ if(local[((y + 10) * size) + x] == '0') { p += 1; }
+ if(p == 11) {
+ result += 40;
+ }
+ }
+ }
+
+ /* Horizontal */
+ for(y = 0; y < size; y++) {
+ for(x = 0; x < (size - 11); x++) {
+ p = 0;
+ if(local[(y * size) + x] == '1') { p += 1; }
+ if(local[(y * size) + x + 1] == '0') { p += 1; }
+ if(local[(y * size) + x + 2] == '1') { p += 1; }
+ if(local[(y * size) + x + 3] == '1') { p += 1; }
+ if(local[(y * size) + x + 4] == '1') { p += 1; }
+ if(local[(y * size) + x + 5] == '0') { p += 1; }
+ if(local[(y * size) + x + 6] == '1') { p += 1; }
+ if(local[(y * size) + x + 7] == '0') { p += 1; }
+ if(local[(y * size) + x + 8] == '0') { p += 1; }
+ if(local[(y * size) + x + 9] == '0') { p += 1; }
+ if(local[(y * size) + x + 10] == '0') { p += 1; }
+ if(p == 11) {
+ result += 40;
+ }
+ }
+ }
+
+ /*pattern 00001011101 */
+ /* Vertical */
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < (size - 11); y++) {
+ p = 0;
+ if(local[(y * size) + x] == '0') { p += 1; }
+ if(local[((y + 1) * size) + x] == '0') { p += 1; }
+ if(local[((y + 2) * size) + x] == '0') { p += 1; }
+ if(local[((y + 3) * size) + x] == '0') { p += 1; }
+ if(local[((y + 4) * size) + x] == '1') { p += 1; }
+ if(local[((y + 5) * size) + x] == '0') { p += 1; }
+ if(local[((y + 6) * size) + x] == '1') { p += 1; }
+ if(local[((y + 7) * size) + x] == '1') { p += 1; }
+ if(local[((y + 8) * size) + x] == '1') { p += 1; }
+ if(local[((y + 9) * size) + x] == '0') { p += 1; }
+ if(local[((y + 10) * size) + x] == '1') { p += 1; }
+ if(p == 11) {
+ result += 40;
+ }
+ }
+ }
+
+ /* Horizontal */
+ for(y = 0; y < size; y++) {
+ for(x = 0; x < (size - 11); x++) {
+ p = 0;
+ if(local[(y * size) + x] == '0') { p += 1; }
+ if(local[(y * size) + x + 1] == '0') { p += 1; }
+ if(local[(y * size) + x + 2] == '0') { p += 1; }
+ if(local[(y * size) + x + 3] == '0') { p += 1; }
+ if(local[(y * size) + x + 4] == '1') { p += 1; }
+ if(local[(y * size) + x + 5] == '0') { p += 1; }
+ if(local[(y * size) + x + 6] == '1') { p += 1; }
+ if(local[(y * size) + x + 7] == '1') { p += 1; }
+ if(local[(y * size) + x + 8] == '1') { p += 1; }
+ if(local[(y * size) + x + 9] == '0') { p += 1; }
+ if(local[(y * size) + x + 10] == '1') { p += 1; }
+ if(p == 11) {
+ result += 40;
+ }
+ }
+ }
+
+ /* Test 4: Proportion of dark modules in entire symbol */
+ dark_mods = 0;
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < size; y++) {
+ if(local[(y * size) + x] == '1') {
+ dark_mods++;
+ }
+ }
+ }
+ percentage = 100 * (dark_mods / (size * size));
+ int m=0;
+ for(x = 0; x < 100; x+=5) {
+ if(x<percentage)
+ m=x;
+ }
+
+ k=abs((m-50)/5);
+ k2=abs((m+5-50)/5);
+
+ int smallest=k;
+ if(k2<smallest)
+ smallest=k2;
+
+ result += 10 * smallest;
+
+ return result;
+}
+
+void add_format_info_eval(unsigned char *eval, int size, int ecc_level, int pattern)
+{
+ /* Add format information to grid */
+
+ int format = pattern;
+ unsigned int seq;
+ int i;
+
+ switch(ecc_level) {
+ case LEVEL_L: format += 0x08; break;
+ case LEVEL_Q: format += 0x18; break;
+ case LEVEL_H: format += 0x10; break;
+ }
+
+ seq = qr_annex_c[format];
+
+ for(i = 0; i < 6; i++) {
+ eval[(i * size) + 8] = (seq >> i) & 0x01 ? (0x01 >> pattern) : 0x00;
+ }
+
+ for(i = 0; i < 8; i++) {
+ eval[(8 * size) + (size - i - 1)] = (seq >> i) & 0x01 ? (0x01 >> pattern) : 0x00;
+ }
+
+ for(i = 0; i < 6; i++) {
+ eval[(8 * size) + (5 - i)] = (seq >> (i + 9)) & 0x01 ? (0x01 >> pattern) : 0x00;
+ }
+
+ for(i = 0; i < 7; i++) {
+ eval[(((size - 7) + i) * size) + 8] = (seq >> (i + 8)) & 0x01 ? (0x01 >> pattern) : 0x00;
+ }
+
+ eval[(7 * size) + 8] = (seq >> 6) & 0x01 ? (0x01 >> pattern) : 0x00;
+ eval[(8 * size) + 8] = (seq >> 7) & 0x01 ? (0x01 >> pattern) : 0x00;
+ eval[(8 * size) + 7] = (seq >> 8) & 0x01 ? (0x01 >> pattern) : 0x00;
+}
+
+int apply_bitmask(unsigned char *grid, int size, int ecc_level)
+{
+ int x, y;
+ unsigned char p;
+ int pattern, penalty[8];
+ int best_val, best_pattern;
+ int bit;
+
+#ifndef _MSC_VER
+ unsigned char mask[size * size];
+ unsigned char eval[size * size];
+#else
+ unsigned char* mask = (unsigned char *)_alloca((size * size) * sizeof(unsigned char));
+ unsigned char* eval = (unsigned char *)_alloca((size * size) * sizeof(unsigned char));
+#endif
+
+ /* Perform data masking */
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < size; y++) {
+ mask[(y * size) + x] = 0x00;
+
+ // all eight bitmask variants are encoded in the 8 bits of the bytes that make up the mask array.
+ if (!(grid[(y * size) + x] & 0xf0)) { // exclude areas not to be masked.
+ if(((y + x) & 1) == 0) { mask[(y * size) + x] += 0x01; }
+ if((y & 1) == 0) { mask[(y * size) + x] += 0x02; }
+ if((x % 3) == 0) { mask[(y * size) + x] += 0x04; }
+ if(((y + x) % 3) == 0) { mask[(y * size) + x] += 0x08; }
+ if((((y / 2) + (x / 3)) & 1) == 0) { mask[(y * size) + x] += 0x10; }
+ if((((y * x) & 1) + ((y * x) % 3)) == 0) { mask[(y * size) + x] += 0x20; }
+ if(((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) { mask[(y * size) + x] += 0x40; }
+ if(((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) { mask[(y * size) + x] += 0x80; }
+ }
+ }
+ }
+
+ // apply data masks to grid, result in eval
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < size; y++) {
+ if(grid[(y * size) + x] & 0x01) { p = 0xff; } else { p = 0x00; }
+
+ eval[(y * size) + x] = mask[(y * size) + x] ^ p;
+ }
+ }
+
+ /* Evaluate result */
+ for(pattern = 0; pattern < 8; pattern++) {
+ add_format_info_eval(eval, size, ecc_level, pattern);
+
+ penalty[pattern] = evaluate(eval, size, pattern);
+ }
+
+ best_pattern = 0;
+ best_val = penalty[0];
+ for(pattern = 1; pattern < 8; pattern++) {
+ if(penalty[pattern] < best_val) {
+ best_pattern = pattern;
+ best_val = penalty[pattern];
+ }
+ }
+
+ /* Apply mask */
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < size; y++) {
+ bit = 0;
+ switch(best_pattern) {
+ case 0: if(mask[(y * size) + x] & 0x01) { bit = 1; } break;
+ case 1: if(mask[(y * size) + x] & 0x02) { bit = 1; } break;
+ case 2: if(mask[(y * size) + x] & 0x04) { bit = 1; } break;
+ case 3: if(mask[(y * size) + x] & 0x08) { bit = 1; } break;
+ case 4: if(mask[(y * size) + x] & 0x10) { bit = 1; } break;
+ case 5: if(mask[(y * size) + x] & 0x20) { bit = 1; } break;
+ case 6: if(mask[(y * size) + x] & 0x40) { bit = 1; } break;
+ case 7: if(mask[(y * size) + x] & 0x80) { bit = 1; } break;
+ }
+ if(bit == 1) {
+ if(grid[(y * size) + x] & 0x01) {
+ grid[(y * size) + x] = 0x00;
+ } else {
+ grid[(y * size) + x] = 0x01;
+ }
+ }
+ }
+ }
+
+ return best_pattern;
+}
+
+void add_format_info(unsigned char *grid, int size, int ecc_level, int pattern)
+{
+ /* Add format information to grid */
+
+ int format = pattern;
+ unsigned int seq;
+ int i;
+
+ switch(ecc_level) {
+ case LEVEL_L: format += 0x08; break;
+ case LEVEL_Q: format += 0x18; break;
+ case LEVEL_H: format += 0x10; break;
+ }
+
+ seq = qr_annex_c[format];
+
+ for(i = 0; i < 6; i++) {
+ grid[(i * size) + 8] += (seq >> i) & 0x01;
+ }
+
+ for(i = 0; i < 8; i++) {
+ grid[(8 * size) + (size - i - 1)] += (seq >> i) & 0x01;
+ }
+
+ for(i = 0; i < 6; i++) {
+ grid[(8 * size) + (5 - i)] += (seq >> (i + 9)) & 0x01;
+ }
+
+ for(i = 0; i < 7; i++) {
+ grid[(((size - 7) + i) * size) + 8] += (seq >> (i + 8)) & 0x01;
+ }
+
+ grid[(7 * size) + 8] += (seq >> 6) & 0x01;
+ grid[(8 * size) + 8] += (seq >> 7) & 0x01;
+ grid[(8 * size) + 7] += (seq >> 8) & 0x01;
+}
+
+void add_version_info(unsigned char *grid, int size, int version)
+{
+ /* Add version information */
+ int i;
+
+ long int version_data = qr_annex_d[version - 7];
+ for(i = 0; i < 6; i++) {
+ grid[((size - 11) * size) + i] += (version_data >> (i * 3)) & 0x41;
+ grid[((size - 10) * size) + i] += (version_data >> ((i * 3) + 1)) & 0x41;
+ grid[((size - 9) * size) + i] += (version_data >> ((i * 3) + 2)) & 0x41;
+ grid[(i * size) + (size - 11)] += (version_data >> (i * 3)) & 0x41;
+ grid[(i * size) + (size - 10)] += (version_data >> ((i * 3) + 1)) & 0x41;
+ grid[(i * size) + (size - 9)] += (version_data >> ((i * 3) + 2)) & 0x41;
+ }
+}
+
+int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
+{
+ int error_number, i, j, glyph, est_binlen;
+ int ecc_level, autosize, version, max_cw, target_binlen, blocks, size;
+ int bitmask, gs1;
+
+#ifndef _MSC_VER
+ int utfdata[length + 1];
+ int jisdata[length + 1];
+ char mode[length + 1];
+#else
+ int* utfdata = (int *)_alloca((length + 1) * sizeof(int));
+ int* jisdata = (int *)_alloca((length + 1) * sizeof(int));
+ char* mode = (char *)_alloca(length + 1);
+#endif
+
+ gs1 = (symbol->input_mode == GS1_MODE);
+
+ switch(symbol->input_mode) {
+ case DATA_MODE:
+ for(i = 0; i < length; i++) {
+ jisdata[i] = (int)source[i];
+ }
+ break;
+ default:
+ /* Convert Unicode input to Shift-JIS */
+ error_number = utf8toutf16(symbol, source, utfdata, &length);
+ if(error_number != 0) { return error_number; }
+
+ for(i = 0; i < length; i++) {
+ if(utfdata[i] <= 0xff) {
+ jisdata[i] = utfdata[i];
+ } else {
+ j = 0;
+ glyph = 0;
+ do {
+ if(sjis_lookup[j * 2] == utfdata[i]) {
+ glyph = sjis_lookup[(j * 2) + 1];
+ }
+ j++;
+ } while ((j < 6843) && (glyph == 0));
+ if(glyph == 0) {
+ strcpy(symbol->errtxt, "Invalid character in input data");
+ return ERROR_INVALID_DATA;
+ }
+ jisdata[i] = glyph;
+ }
+ }
+ break;
+ }
+
+ define_mode(mode, jisdata, length, gs1);
+ est_binlen = estimate_binary_length(mode, length, gs1);
+
+ ecc_level = LEVEL_L;
+ max_cw = 2956;
+ if((symbol->option_1 >= 1) && (symbol->option_1 <= 4)) {
+ switch (symbol->option_1) {
+ case 1: ecc_level = LEVEL_L; max_cw = 2956; break;
+ case 2: ecc_level = LEVEL_M; max_cw = 2334; break;
+ case 3: ecc_level = LEVEL_Q; max_cw = 1666; break;
+ case 4: ecc_level = LEVEL_H; max_cw = 1276; break;
+ }
+ }
+
+ if(est_binlen > (8 * max_cw)) {
+ strcpy(symbol->errtxt, "Input too long for selected error correction level");
+ return ERROR_TOO_LONG;
+ }
+
+ autosize = 40;
+ for(i = 39; i >= 0; i--) {
+ switch(ecc_level) {
+ case LEVEL_L:
+ if ((8 * qr_data_codewords_L[i]) >= est_binlen) {
+ autosize = i + 1;
+ }
+ break;
+ case LEVEL_M:
+ if ((8 * qr_data_codewords_M[i]) >= est_binlen) {
+ autosize = i + 1;
+ }
+ break;
+ case LEVEL_Q:
+ if ((8 * qr_data_codewords_Q[i]) >= est_binlen) {
+ autosize = i + 1;
+ }
+ break;
+ case LEVEL_H:
+ if ((8 * qr_data_codewords_H[i]) >= est_binlen) {
+ autosize = i + 1;
+ }
+ break;
+ }
+ }
+
+ if((symbol->option_2 >= 1) && (symbol->option_2 <= 40)) {
+ if (symbol->option_2 > autosize) {
+ version = symbol->option_2;
+ } else {
+ version = autosize;
+ }
+ } else {
+ version = autosize;
+ }
+
+ /* Ensure maxium error correction capacity */
+ if(est_binlen <= qr_data_codewords_M[version - 1]) { ecc_level = LEVEL_M; }
+ if(est_binlen <= qr_data_codewords_Q[version - 1]) { ecc_level = LEVEL_Q; }
+ if(est_binlen <= qr_data_codewords_H[version - 1]) { ecc_level = LEVEL_H; }
+
+ target_binlen = qr_data_codewords_L[version - 1]; blocks = qr_blocks_L[version - 1];
+ switch(ecc_level) {
+ case LEVEL_M: target_binlen = qr_data_codewords_M[version - 1]; blocks = qr_blocks_M[version - 1]; break;
+ case LEVEL_Q: target_binlen = qr_data_codewords_Q[version - 1]; blocks = qr_blocks_Q[version - 1]; break;
+ case LEVEL_H: target_binlen = qr_data_codewords_H[version - 1]; blocks = qr_blocks_H[version - 1]; break;
+ }
+
+#ifndef _MSC_VER
+ int datastream[target_binlen + 1];
+ int fullstream[qr_total_codewords[version - 1] + 1];
+#else
+ int* datastream = (int *)_alloca((target_binlen + 1) * sizeof(int));
+ int* fullstream = (int *)_alloca((qr_total_codewords[version - 1] + 1) * sizeof(int));
+#endif
+
+ qr_binary(datastream, version, target_binlen, mode, jisdata, length, gs1, est_binlen);
+ add_ecc(fullstream, datastream, version, target_binlen, blocks);
+
+ size = qr_sizes[version - 1];
+#ifndef _MSC_VER
+ unsigned char grid[size * size];
+#else
+ unsigned char* grid = (unsigned char *)_alloca((size * size) * sizeof(unsigned char));
+#endif
+
+ for(i = 0; i < size; i++) {
+ for(j = 0; j < size; j++) {
+ grid[(i * size) + j] = 0;
+ }
+ }
+
+ setup_grid(grid, size, version);
+ populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]);
+
+ if(version >= 7) {
+ add_version_info(grid, size, version);
+ }
+
+ bitmask = apply_bitmask(grid, size, ecc_level);
+
+ add_format_info(grid, size, ecc_level, bitmask);
+
+ symbol->width = size;
+ symbol->rows = size;
+
+ for(i = 0; i < size; i++) {
+ for(j = 0; j < size; j++) {
+ if(grid[(i * size) + j] & 0x01) {
+ set_module(symbol, i, j);
+ }
+ }
+ symbol->row_height[i] = 1;
+ }
+
+ return 0;
+}
+
+/* NOTE: From this point forward concerns Micro QR Code only */
+
+int micro_qr_intermediate(char binary[], int jisdata[], char mode[], int length, int *kanji_used, int *alphanum_used, int *byte_used)
+{
+ /* Convert input data to an "intermediate stage" where data is binary encoded but
+ control information is not */
+ int position = 0, debug = 0;
+ int short_data_block_length, i;
+ char data_block;
+ char buffer[2];
+
+ strcpy(binary, "");
+
+ if(debug) {
+ for(i = 0; i < length; i++) {
+ printf("%c", mode[i]);
+ }
+ printf("\n");
+ }
+
+ do {
+ if(strlen(binary) > 128) {
+ return ERROR_TOO_LONG;
+ }
+
+ data_block = mode[position];
+ short_data_block_length = 0;
+ do {
+ short_data_block_length++;
+ } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block));
+
+ switch(data_block) {
+ case 'K':
+ /* Kanji mode */
+ /* Mode indicator */
+ concat(binary, "K");
+ *kanji_used = 1;
+
+ /* Character count indicator */
+ buffer[0] = short_data_block_length;
+ buffer[1] = '\0';
+ concat(binary, buffer);
+
+ if(debug) { printf("Kanji block (length %d)\n\t", short_data_block_length); }
+
+ /* Character representation */
+ for(i = 0; i < short_data_block_length; i++) {
+ int jis = jisdata[position + i];
+ int msb, lsb, prod;
+
+ if(jis > 0x9fff) { jis -= 0xc140; }
+ msb = (jis & 0xff00) >> 4;
+ lsb = (jis & 0xff);
+ prod = (msb * 0xc0) + lsb;
+
+ qr_bscan(binary, prod, 0x1000);
+
+ if(debug) { printf("0x%4X ", prod); }
+
+ if(strlen(binary) > 128) {
+ return ERROR_TOO_LONG;
+ }
+ }
+
+ if(debug) { printf("\n"); }
+
+ break;
+ case 'B':
+ /* Byte mode */
+ /* Mode indicator */
+ concat(binary, "B");
+ *byte_used = 1;
+
+ /* Character count indicator */
+ buffer[0] = short_data_block_length;
+ buffer[1] = '\0';
+ concat(binary, buffer);
+
+ if(debug) { printf("Byte block (length %d)\n\t", short_data_block_length); }
+
+ /* Character representation */
+ for(i = 0; i < short_data_block_length; i++) {
+ int byte = jisdata[position + i];
+
+ qr_bscan(binary, byte, 0x80);
+
+ if(debug) { printf("0x%4X ", byte); }
+
+ if(strlen(binary) > 128) {
+ return ERROR_TOO_LONG;
+ }
+ }
+
+ if(debug) { printf("\n"); }
+
+ break;
+ case 'A':
+ /* Alphanumeric mode */
+ /* Mode indicator */
+ concat(binary, "A");
+ *alphanum_used = 1;
+
+ /* Character count indicator */
+ buffer[0] = short_data_block_length;
+ buffer[1] = '\0';
+ concat(binary, buffer);
+
+ if(debug) { printf("Alpha block (length %d)\n\t", short_data_block_length); }
+
+ /* Character representation */
+ i = 0;
+ while ( i < short_data_block_length ) {
+ int count;
+ int first = 0, second = 0, prod;
+
+ first = posn(RHODIUM, (char) jisdata[position + i]);
+ count = 1;
+ prod = first;
+
+ if(mode[position + i + 1] == 'A') {
+ second = posn(RHODIUM, (char) jisdata[position + i + 1]);
+ count = 2;
+ prod = (first * 45) + second;
+ }
+
+ qr_bscan(binary, prod, 1 << (5 * count)); /* count = 1..2 */
+
+ if(debug) { printf("0x%4X ", prod); }
+
+ if(strlen(binary) > 128) {
+ return ERROR_TOO_LONG;
+ }
+
+ i += 2;
+ };
+
+ if(debug) { printf("\n"); }
+
+ break;
+ case 'N':
+ /* Numeric mode */
+ /* Mode indicator */
+ concat(binary, "N");
+
+ /* Character count indicator */
+ buffer[0] = short_data_block_length;
+ buffer[1] = '\0';
+ concat(binary, buffer);
+
+ if(debug) { printf("Number block (length %d)\n\t", short_data_block_length); }
+
+ /* Character representation */
+ i = 0;
+ while ( i < short_data_block_length ) {
+ int count;
+ int first = 0, second = 0, third = 0, prod;
+
+ first = posn(NEON, (char) jisdata[position + i]);
+ count = 1;
+ prod = first;
+
+ if(mode[position + i + 1] == 'N') {
+ second = posn(NEON, (char) jisdata[position + i + 1]);
+ count = 2;
+ prod = (prod * 10) + second;
+ }
+
+ if(mode[position + i + 2] == 'N') {
+ third = posn(NEON, (char) jisdata[position + i + 2]);
+ count = 3;
+ prod = (prod * 10) + third;
+ }
+
+ qr_bscan(binary, prod, 1 << (3 * count)); /* count = 1..3 */
+
+ if(debug) { printf("0x%4X (%d)", prod, prod); }
+
+ if(strlen(binary) > 128) {
+ return ERROR_TOO_LONG;
+ }
+
+ i += 3;
+ };
+
+ if(debug) { printf("\n"); }
+
+ break;
+ }
+
+ position += short_data_block_length;
+ } while (position < length - 1) ;
+
+ return 0;
+}
+
+void get_bitlength(int count[], char stream[]) {
+ int length, i;
+
+ length = strlen(stream);
+
+ for(i = 0; i < 4; i++) {
+ count[i] = 0;
+ }
+
+ i = 0;
+ do {
+ if((stream[i] == '0') || (stream[i] == '1')) {
+ count[0]++;
+ count[1]++;
+ count[2]++;
+ count[3]++;
+ i++;
+ } else {
+ switch(stream[i]) {
+ case 'K':
+ count[2] += 5;
+ count[3] += 7;
+ i += 2;
+ break;
+ case 'B':
+ count[2] += 6;
+ count[3] += 8;
+ i += 2;
+ break;
+ case 'A':
+ count[1] += 4;
+ count[2] += 6;
+ count[3] += 8;
+ i += 2;
+ break;
+ case 'N':
+ count[0] += 3;
+ count[1] += 5;
+ count[2] += 7;
+ count[3] += 9;
+ i += 2;
+ break;
+ }
+ }
+ } while (i < length);
+}
+
+void microqr_expand_binary(char binary_stream[], char full_stream[], int version)
+{
+ int i, length;
+
+ length = strlen(binary_stream);
+
+ i = 0;
+ do {
+ switch(binary_stream[i]) {
+ case '1': concat(full_stream, "1"); i++; break;
+ case '0': concat(full_stream, "0"); i++; break;
+ case 'N':
+ /* Numeric Mode */
+ /* Mode indicator */
+ switch(version) {
+ case 1: concat(full_stream, "0"); break;
+ case 2: concat(full_stream, "00"); break;
+ case 3: concat(full_stream, "000"); break;
+ }
+
+ /* Character count indicator */
+ qr_bscan(full_stream, binary_stream[i + 1], 4 << version); /* version = 0..3 */
+
+ i += 2;
+ break;
+ case 'A':
+ /* Alphanumeric Mode */
+ /* Mode indicator */
+ switch(version) {
+ case 1: concat(full_stream, "1"); break;
+ case 2: concat(full_stream, "01"); break;
+ case 3: concat(full_stream, "001"); break;
+ }
+
+ /* Character count indicator */
+ qr_bscan(full_stream, binary_stream[i + 1], 2 << version); /* version = 1..3 */
+
+ i += 2;
+ break;
+ case 'B':
+ /* Byte Mode */
+ /* Mode indicator */
+ switch(version) {
+ case 2: concat(full_stream, "10"); break;
+ case 3: concat(full_stream, "010"); break;
+ }
+
+ /* Character count indicator */
+ qr_bscan(full_stream, binary_stream[i + 1], 2 << version); /* version = 2..3 */
+
+ i += 2;
+ break;
+ case 'K':
+ /* Kanji Mode */
+ /* Mode indicator */
+ switch(version) {
+ case 2: concat(full_stream, "11"); break;
+ case 3: concat(full_stream, "011"); break;
+ }
+
+ /* Character count indicator */
+ qr_bscan(full_stream, binary_stream[i + 1], 1 << version); /* version = 2..3 */
+
+ i += 2;
+ break;
+ }
+
+ } while (i < length);
+}
+
+void micro_qr_m1(char binary_data[])
+{
+ int i, latch;
+ int bits_total, bits_left, remainder;
+ int data_codewords, ecc_codewords;
+ unsigned char data_blocks[4], ecc_blocks[3];
+
+ bits_total = 20;
+ latch = 0;
+
+ /* Add terminator */
+ bits_left = bits_total - strlen(binary_data);
+ if(bits_left <= 3) {
+ for(i = 0; i < bits_left; i++) {
+ concat(binary_data, "0");
+ }
+ latch = 1;
+ } else {
+ concat(binary_data, "000");
+ }
+
+ if(latch == 0) {
+ /* Manage last (4-bit) block */
+ bits_left = bits_total - strlen(binary_data);
+ if(bits_left <= 4) {
+ for(i = 0; i < bits_left; i++) {
+ concat(binary_data, "0");
+ }
+ latch = 1;
+ }
+ }
+
+ if(latch == 0) {
+ /* Complete current byte */
+ remainder = 8 - (strlen(binary_data) % 8);
+ if(remainder == 8) { remainder = 0; }
+ for(i = 0; i < remainder; i++) {
+ concat(binary_data, "0");
+ }
+
+ /* Add padding */
+ bits_left = bits_total - strlen(binary_data);
+ if(bits_left > 4) {
+ remainder = (bits_left - 4) / 8;
+ for(i = 0; i < remainder; i++) {
+ concat(binary_data, i & 1 ? "00010001" : "11101100");
+ }
+ }
+ concat(binary_data, "0000");
+ }
+
+ data_codewords = 3;
+ ecc_codewords = 2;
+
+ /* Copy data into codewords */
+ for(i = 0; i < (data_codewords - 1); i++) {
+ data_blocks[i] = 0;
+ if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; }
+ if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; }
+ if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; }
+ if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; }
+ if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; }
+ if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; }
+ if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; }
+ if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; }
+ }
+ data_blocks[2] = 0;
+ if(binary_data[16] == '1') { data_blocks[2] += 0x08; }
+ if(binary_data[17] == '1') { data_blocks[2] += 0x04; }
+ if(binary_data[18] == '1') { data_blocks[2] += 0x02; }
+ if(binary_data[19] == '1') { data_blocks[2] += 0x01; }
+
+ /* Calculate Reed-Solomon error codewords */
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_codewords, 0);
+ rs_encode(data_codewords,data_blocks,ecc_blocks);
+ rs_free();
+
+ /* Add Reed-Solomon codewords to binary data */
+ for(i = 0; i < ecc_codewords; i++) {
+ qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80);
+ }
+}
+
+void micro_qr_m2(char binary_data[], int ecc_mode)
+{
+ int i, latch;
+ int bits_total, bits_left, remainder;
+ int data_codewords, ecc_codewords;
+ unsigned char data_blocks[6], ecc_blocks[7];
+
+ latch = 0;
+
+ if(ecc_mode == LEVEL_L) { bits_total = 40; }
+ if(ecc_mode == LEVEL_M) { bits_total = 32; }
+
+ /* Add terminator */
+ bits_left = bits_total - strlen(binary_data);
+ if(bits_left <= 5) {
+ for(i = 0; i < bits_left; i++) {
+ concat(binary_data, "0");
+ }
+ latch = 1;
+ } else {
+ concat(binary_data, "00000");
+ }
+
+ if(latch == 0) {
+ /* Complete current byte */
+ remainder = 8 - (strlen(binary_data) % 8);
+ if(remainder == 8) { remainder = 0; }
+ for(i = 0; i < remainder; i++) {
+ concat(binary_data, "0");
+ }
+
+ /* Add padding */
+ bits_left = bits_total - strlen(binary_data);
+ remainder = bits_left / 8;
+ for(i = 0; i < remainder; i++) {
+ concat(binary_data, i & 1 ? "00010001" : "11101100");
+ }
+ }
+
+ if(ecc_mode == LEVEL_L) { data_codewords = 5; ecc_codewords = 5; }
+ if(ecc_mode == LEVEL_M) { data_codewords = 4; ecc_codewords = 6; }
+
+ /* Copy data into codewords */
+ for(i = 0; i < data_codewords; i++) {
+ data_blocks[i] = 0;
+ if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; }
+ if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; }
+ if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; }
+ if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; }
+ if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; }
+ if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; }
+ if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; }
+ if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; }
+ }
+
+ /* Calculate Reed-Solomon error codewords */
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_codewords, 0);
+ rs_encode(data_codewords,data_blocks,ecc_blocks);
+ rs_free();
+
+ /* Add Reed-Solomon codewords to binary data */
+ for(i = 0; i < ecc_codewords; i++) {
+ qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80);
+ }
+
+ return;
+}
+
+void micro_qr_m3(char binary_data[], int ecc_mode)
+{
+ int i, latch;
+ int bits_total, bits_left, remainder;
+ int data_codewords, ecc_codewords;
+ unsigned char data_blocks[12], ecc_blocks[9];
+
+ latch = 0;
+
+ if(ecc_mode == LEVEL_L) { bits_total = 84; }
+ if(ecc_mode == LEVEL_M) { bits_total = 68; }
+
+ /* Add terminator */
+ bits_left = bits_total - strlen(binary_data);
+ if(bits_left <= 7) {
+ for(i = 0; i < bits_left; i++) {
+ concat(binary_data, "0");
+ }
+ latch = 1;
+ } else {
+ concat(binary_data, "0000000");
+ }
+
+ if(latch == 0) {
+ /* Manage last (4-bit) block */
+ bits_left = bits_total - strlen(binary_data);
+ if(bits_left <= 4) {
+ for(i = 0; i < bits_left; i++) {
+ concat(binary_data, "0");
+ }
+ latch = 1;
+ }
+ }
+
+ if(latch == 0) {
+ /* Complete current byte */
+ remainder = 8 - (strlen(binary_data) % 8);
+ if(remainder == 8) { remainder = 0; }
+ for(i = 0; i < remainder; i++) {
+ concat(binary_data, "0");
+ }
+
+ /* Add padding */
+ bits_left = bits_total - strlen(binary_data);
+ if(bits_left > 4) {
+ remainder = (bits_left - 4) / 8;
+ for(i = 0; i < remainder; i++) {
+ concat(binary_data, i & 1 ? "00010001" : "11101100");
+ }
+ }
+ concat(binary_data, "0000");
+ }
+
+ if(ecc_mode == LEVEL_L) { data_codewords = 11; ecc_codewords = 6; }
+ if(ecc_mode == LEVEL_M) { data_codewords = 9; ecc_codewords = 8; }
+
+ /* Copy data into codewords */
+ for(i = 0; i < (data_codewords - 1); i++) {
+ data_blocks[i] = 0;
+ if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; }
+ if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; }
+ if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; }
+ if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; }
+ if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; }
+ if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; }
+ if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; }
+ if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; }
+ }
+
+ if(ecc_mode == LEVEL_L) {
+ data_blocks[11] = 0;
+ if(binary_data[80] == '1') { data_blocks[2] += 0x08; }
+ if(binary_data[81] == '1') { data_blocks[2] += 0x04; }
+ if(binary_data[82] == '1') { data_blocks[2] += 0x02; }
+ if(binary_data[83] == '1') { data_blocks[2] += 0x01; }
+ }
+
+ if(ecc_mode == LEVEL_M) {
+ data_blocks[9] = 0;
+ if(binary_data[64] == '1') { data_blocks[2] += 0x08; }
+ if(binary_data[65] == '1') { data_blocks[2] += 0x04; }
+ if(binary_data[66] == '1') { data_blocks[2] += 0x02; }
+ if(binary_data[67] == '1') { data_blocks[2] += 0x01; }
+ }
+
+ /* Calculate Reed-Solomon error codewords */
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_codewords, 0);
+ rs_encode(data_codewords,data_blocks,ecc_blocks);
+ rs_free();
+
+ /* Add Reed-Solomon codewords to binary data */
+ for(i = 0; i < ecc_codewords; i++) {
+ qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80);
+ }
+
+ return;
+}
+
+void micro_qr_m4(char binary_data[], int ecc_mode)
+{
+ int i, latch;
+ int bits_total, bits_left, remainder;
+ int data_codewords, ecc_codewords;
+ unsigned char data_blocks[17], ecc_blocks[15];
+
+ latch = 0;
+
+ if(ecc_mode == LEVEL_L) { bits_total = 128; }
+ if(ecc_mode == LEVEL_M) { bits_total = 112; }
+ if(ecc_mode == LEVEL_Q) { bits_total = 80; }
+
+ /* Add terminator */
+ bits_left = bits_total - strlen(binary_data);
+ if(bits_left <= 9) {
+ for(i = 0; i < bits_left; i++) {
+ concat(binary_data, "0");
+ }
+ latch = 1;
+ } else {
+ concat(binary_data, "000000000");
+ }
+
+ if(latch == 0) {
+ /* Complete current byte */
+ remainder = 8 - (strlen(binary_data) % 8);
+ if(remainder == 8) { remainder = 0; }
+ for(i = 0; i < remainder; i++) {
+ concat(binary_data, "0");
+ }
+
+ /* Add padding */
+ bits_left = bits_total - strlen(binary_data);
+ remainder = bits_left / 8;
+ for(i = 0; i < remainder; i++) {
+ concat(binary_data, i & 1 ? "00010001" : "11101100");
+ }
+ }
+
+ if(ecc_mode == LEVEL_L) { data_codewords = 16; ecc_codewords = 8; }
+ if(ecc_mode == LEVEL_M) { data_codewords = 14; ecc_codewords = 10; }
+ if(ecc_mode == LEVEL_Q) { data_codewords = 10; ecc_codewords = 14; }
+
+ /* Copy data into codewords */
+ for(i = 0; i < data_codewords; i++) {
+ data_blocks[i] = 0;
+ if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; }
+ if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; }
+ if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; }
+ if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; }
+ if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; }
+ if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; }
+ if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; }
+ if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; }
+ }
+
+ /* Calculate Reed-Solomon error codewords */
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_codewords, 0);
+ rs_encode(data_codewords,data_blocks,ecc_blocks);
+ rs_free();
+
+ /* Add Reed-Solomon codewords to binary data */
+ for(i = 0; i < ecc_codewords; i++) {
+ qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80);
+ }
+}
+
+void micro_setup_grid(unsigned char* grid, int size)
+{
+ int i, toggle = 1;
+
+ /* Add timing patterns */
+ for(i = 0; i < size; i++) {
+ if(toggle == 1) {
+ grid[i] = 0x21;
+ grid[(i * size)] = 0x21;
+ toggle = 0;
+ } else {
+ grid[i] = 0x20;
+ grid[(i * size)] = 0x20;
+ toggle = 1;
+ }
+ }
+
+ /* Add finder patterns */
+ place_finder(grid, size, 0, 0);
+
+ /* Add separators */
+ for(i = 0; i < 7; i++) {
+ grid[(7 * size) + i] = 0x10;
+ grid[(i * size) + 7] = 0x10;
+ }
+ grid[(7 * size) + 7] = 0x10;
+
+
+ /* Reserve space for format information */
+ for(i = 0; i < 8; i++) {
+ grid[(8 * size) + i] += 0x20;
+ grid[(i * size) + 8] += 0x20;
+ }
+ grid[(8 * size) + 8] += 20;
+}
+
+void micro_populate_grid(unsigned char* grid, int size, char full_stream[])
+{
+ int direction = 1; /* up */
+ int row = 0; /* right hand side */
+
+ int i, n, x, y;
+
+ n = strlen(full_stream);
+ y = size - 1;
+ i = 0;
+ do {
+ x = (size - 2) - (row * 2);
+
+ if(!(grid[(y * size) + (x + 1)] & 0xf0)) {
+ if (full_stream[i] == '1') {
+ grid[(y * size) + (x + 1)] = 0x01;
+ } else {
+ grid[(y * size) + (x + 1)] = 0x00;
+ }
+ i++;
+ }
+
+ if(i < n) {
+ if(!(grid[(y * size) + x] & 0xf0)) {
+ if (full_stream[i] == '1') {
+ grid[(y * size) + x] = 0x01;
+ } else {
+ grid[(y * size) + x] = 0x00;
+ }
+ i++;
+ }
+ }
+
+ if(direction) { y--; } else { y++; }
+ if(y == 0) {
+ /* reached the top */
+ row++;
+ y = 1;
+ direction = 0;
+ }
+ if(y == size) {
+ /* reached the bottom */
+ row++;
+ y = size - 1;
+ direction = 1;
+ }
+ } while (i < n);
+}
+
+int micro_evaluate(unsigned char *grid, int size, int pattern)
+{
+ int sum1, sum2, i, filter = 0, retval;
+
+ switch(pattern) {
+ case 0: filter = 0x01; break;
+ case 1: filter = 0x02; break;
+ case 2: filter = 0x04; break;
+ case 3: filter = 0x08; break;
+ }
+
+ sum1 = 0;
+ sum2 = 0;
+ for(i = 1; i < size; i++) {
+ if(grid[(i * size) + size - 1] & filter) { sum1++; }
+ if(grid[((size - 1) * size) + i] & filter) { sum2++; }
+ }
+
+ if(sum1 <= sum2) { retval = (sum1 * 16) + sum2; } else { retval = (sum2 * 16) + sum1; }
+
+ return retval;
+}
+
+int micro_apply_bitmask(unsigned char *grid, int size)
+{
+ int x, y;
+ unsigned char p;
+ int pattern, value[8];
+ int best_val, best_pattern;
+ int bit;
+
+#ifndef _MSC_VER
+ unsigned char mask[size * size];
+ unsigned char eval[size * size];
+#else
+ unsigned char* mask = (unsigned char *)_alloca((size * size) * sizeof(unsigned char));
+ unsigned char* eval = (unsigned char *)_alloca((size * size) * sizeof(unsigned char));
+#endif
+
+ /* Perform data masking */
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < size; y++) {
+ mask[(y * size) + x] = 0x00;
+
+ if (!(grid[(y * size) + x] & 0xf0)) {
+ if((y & 1) == 0) {
+ mask[(y * size) + x] += 0x01;
+ }
+
+ if((((y / 2) + (x / 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x02;
+ }
+
+ if(((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x04;
+ }
+
+ if(((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x08;
+ }
+ }
+ }
+ }
+
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < size; y++) {
+ if(grid[(y * size) + x] & 0x01) { p = 0xff; } else { p = 0x00; }
+
+ eval[(y * size) + x] = mask[(y * size) + x] ^ p;
+ }
+ }
+
+
+ /* Evaluate result */
+ for(pattern = 0; pattern < 8; pattern++) {
+ value[pattern] = micro_evaluate(eval, size, pattern);
+ }
+
+ best_pattern = 0;
+ best_val = value[0];
+ for(pattern = 1; pattern < 4; pattern++) {
+ if(value[pattern] > best_val) {
+ best_pattern = pattern;
+ best_val = value[pattern];
+ }
+ }
+
+ /* Apply mask */
+ for(x = 0; x < size; x++) {
+ for(y = 0; y < size; y++) {
+ bit = 0;
+ switch(best_pattern) {
+ case 0: if(mask[(y * size) + x] & 0x01) { bit = 1; } break;
+ case 1: if(mask[(y * size) + x] & 0x02) { bit = 1; } break;
+ case 2: if(mask[(y * size) + x] & 0x04) { bit = 1; } break;
+ case 3: if(mask[(y * size) + x] & 0x08) { bit = 1; } break;
+ }
+ if(bit == 1) {
+ if(grid[(y * size) + x] & 0x01) {
+ grid[(y * size) + x] = 0x00;
+ } else {
+ grid[(y * size) + x] = 0x01;
+ }
+ }
+ }
+ }
+
+ return best_pattern;
+}
+
+int microqr(struct zint_symbol *symbol, unsigned char source[], int length)
+{
+ int i, j, glyph, size;
+ char binary_stream[200];
+ char full_stream[200];
+ int utfdata[40];
+ int jisdata[40];
+ char mode[40];
+ int error_number, kanji_used = 0, alphanum_used = 0, byte_used = 0;
+ int version_valid[4];
+ int binary_count[4];
+ int ecc_level, autoversion, version;
+ int n_count, a_count, bitmask, format, format_full;
+
+ if(length > 35) {
+ strcpy(symbol->errtxt, "Input data too long");
+ return ERROR_TOO_LONG;
+ }
+
+ for(i = 0; i < 4; i++) {
+ version_valid[i] = 1;
+ }
+
+ switch(symbol->input_mode) {
+ case DATA_MODE:
+ for(i = 0; i < length; i++) {
+ jisdata[i] = (int)source[i];
+ }
+ break;
+ default:
+ /* Convert Unicode input to Shift-JIS */
+ error_number = utf8toutf16(symbol, source, utfdata, &length);
+ if(error_number != 0) { return error_number; }
+
+ for(i = 0; i < length; i++) {
+ if(utfdata[i] <= 0xff) {
+ jisdata[i] = utfdata[i];
+ } else {
+ j = 0;
+ glyph = 0;
+ do {
+ if(sjis_lookup[j * 2] == utfdata[i]) {
+ glyph = sjis_lookup[(j * 2) + 1];
+ }
+ j++;
+ } while ((j < 6843) && (glyph == 0));
+ if(glyph == 0) {
+ strcpy(symbol->errtxt, "Invalid character in input data");
+ return ERROR_INVALID_DATA;
+ }
+ jisdata[i] = glyph;
+ }
+ }
+ break;
+ }
+
+ define_mode(mode, jisdata, length, 0);
+
+ n_count = 0;
+ a_count = 0;
+ for(i = 0; i < length; i++) {
+ if((jisdata[i] >= '0') && (jisdata[i] <= '9')) { n_count++; }
+ if(in_alpha(jisdata[i])) { a_count++; }
+ }
+
+ if(a_count == length) {
+ /* All data can be encoded in Alphanumeric mode */
+ for(i = 0; i < length; i++) {
+ mode[i] = 'A';
+ }
+ }
+
+ if(n_count == length) {
+ /* All data can be encoded in Numeric mode */
+ for(i = 0; i < length; i++) {
+ mode[i] = 'N';
+ }
+ }
+
+ error_number = micro_qr_intermediate(binary_stream, jisdata, mode, length, &kanji_used, &alphanum_used, &byte_used);
+ if(error_number != 0) {
+ strcpy(symbol->errtxt, "Input data too long");
+ return error_number;
+ }
+
+ get_bitlength(binary_count, binary_stream);
+
+ /* Eliminate possivle versions depending on type of content */
+ if(byte_used) {
+ version_valid[0] = 0;
+ version_valid[1] = 0;
+ }
+
+ if(alphanum_used) {
+ version_valid[0] = 0;
+ }
+
+ if(kanji_used) {
+ version_valid[0] = 0;
+ version_valid[1] = 0;
+ }
+
+ /* Eliminate possible versions depending on length of binary data */
+ if(binary_count[0] > 20) { version_valid[0] = 0; }
+ if(binary_count[1] > 40) { version_valid[1] = 0; }
+ if(binary_count[2] > 84) { version_valid[2] = 0; }
+ if(binary_count[3] > 128) {
+ strcpy(symbol->errtxt, "Input data too long");
+ return ERROR_TOO_LONG;
+ }
+
+ /* Eliminate possible versions depending on error correction level specified */
+ ecc_level = LEVEL_L;
+ if((symbol->option_1 >= 1) && (symbol->option_2 <= 4)) {
+ ecc_level = symbol->option_1;
+ }
+
+ if(ecc_level == LEVEL_H) {
+ strcpy(symbol->errtxt, "Error correction level H not available");
+ return ERROR_INVALID_OPTION;
+ }
+
+ if(ecc_level == LEVEL_Q) {
+ version_valid[0] = 0;
+ version_valid[1] = 0;
+ version_valid[2] = 0;
+ if(binary_count[3] > 80) {
+ strcpy(symbol->errtxt, "Input data too long");
+ return ERROR_TOO_LONG;
+ }
+ }
+
+ if(ecc_level == LEVEL_M) {
+ version_valid[0] = 0;
+ if(binary_count[1] > 32) { version_valid[1] = 0; }
+ if(binary_count[2] > 68) { version_valid[2] = 0; }
+ if(binary_count[3] > 112) {
+ strcpy(symbol->errtxt, "Input data too long");
+ return ERROR_TOO_LONG;
+ }
+ }
+
+ autoversion = 3;
+ if(version_valid[2]) { autoversion = 2; }
+ if(version_valid[1]) { autoversion = 1; }
+ if(version_valid[0]) { autoversion = 0; }
+
+ version = autoversion;
+ /* Get version from user */
+ if((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) {
+ if(symbol->option_2 >= autoversion) {
+ version = symbol->option_2;
+ }
+ }
+
+ /* If there is enough unused space then increase the error correction level */
+ if(version == 3) {
+ if(binary_count[3] <= 112) { ecc_level = LEVEL_M; }
+ if(binary_count[3] <= 80) { ecc_level = LEVEL_Q; }
+ }
+
+ if(version == 2) {
+ if(binary_count[2] <= 68) { ecc_level = LEVEL_M; }
+ }
+
+ if(version == 1) {
+ if(binary_count[1] <= 32) { ecc_level = LEVEL_M; }
+ }
+
+ strcpy(full_stream, "");
+ microqr_expand_binary(binary_stream, full_stream, version);
+
+ switch(version) {
+ case 0: micro_qr_m1(full_stream); break;
+ case 1: micro_qr_m2(full_stream, ecc_level); break;
+ case 2: micro_qr_m3(full_stream, ecc_level); break;
+ case 3: micro_qr_m4(full_stream, ecc_level); break;
+ }
+
+ size = micro_qr_sizes[version];
+#ifndef _MSC_VER
+ unsigned char grid[size * size];
+#else
+ unsigned char* grid = (unsigned char *)_alloca((size * size) * sizeof(unsigned char));
+#endif
+
+ for(i = 0; i < size; i++) {
+ for(j = 0; j < size; j++) {
+ grid[(i * size) + j] = 0;
+ }
+ }
+
+ micro_setup_grid(grid, size);
+ micro_populate_grid(grid, size, full_stream);
+ bitmask = micro_apply_bitmask(grid, size);
+
+ /* Add format data */
+ format = 0;
+ switch(version) {
+ case 1: switch(ecc_level) {
+ case 1: format = 1; break;
+ case 2: format = 2; break;
+ }
+ break;
+ case 2: switch(ecc_level) {
+ case 1: format = 3; break;
+ case 2: format = 4; break;
+ }
+ break;
+ case 3: switch(ecc_level) {
+ case 1: format = 5; break;
+ case 2: format = 6; break;
+ case 3: format = 7; break;
+ }
+ break;
+ }
+
+ format_full = qr_annex_c1[(format << 2) + bitmask];
+
+ if(format_full & 0x4000) { grid[(8 * size) + 1] += 0x01; }
+ if(format_full & 0x2000) { grid[(8 * size) + 2] += 0x01; }
+ if(format_full & 0x1000) { grid[(8 * size) + 3] += 0x01; }
+ if(format_full & 0x800) { grid[(8 * size) + 4] += 0x01; }
+ if(format_full & 0x400) { grid[(8 * size) + 5] += 0x01; }
+ if(format_full & 0x200) { grid[(8 * size) + 6] += 0x01; }
+ if(format_full & 0x100) { grid[(8 * size) + 7] += 0x01; }
+ if(format_full & 0x80) { grid[(8 * size) + 8] += 0x01; }
+ if(format_full & 0x40) { grid[(7 * size) + 8] += 0x01; }
+ if(format_full & 0x20) { grid[(6 * size) + 8] += 0x01; }
+ if(format_full & 0x10) { grid[(5 * size) + 8] += 0x01; }
+ if(format_full & 0x08) { grid[(4 * size) + 8] += 0x01; }
+ if(format_full & 0x04) { grid[(3 * size) + 8] += 0x01; }
+ if(format_full & 0x02) { grid[(2 * size) + 8] += 0x01; }
+ if(format_full & 0x01) { grid[(1 * size) + 8] += 0x01; }
+
+ symbol->width = size;
+ symbol->rows = size;
+
+ for(i = 0; i < size; i++) {
+ for(j = 0; j < size; j++) {
+ if(grid[(i * size) + j] & 0x01) {
+ set_module(symbol, i, j);
+ }
+ }
+ symbol->row_height[i] = 1;
+ }
+
+ return 0;
+}
diff --git a/backend/qr.h b/backend/qr.h
new file mode 100644
index 0000000..0efb263
--- /dev/null
+++ b/backend/qr.h
@@ -0,0 +1,167 @@
+/* qr.h Data for QR Code */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
+ Copyright (C) 2006 Kentaro Fukuchi <fukuchi@megaui.net>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#define LEVEL_L 1
+#define LEVEL_M 2
+#define LEVEL_Q 3
+#define LEVEL_H 4
+
+#define RHODIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"
+
+/* From ISO/IEC 18004:2006 Table 7 */
+static int qr_data_codewords_L[] = {
+ 19, 34, 55, 80, 108, 136, 156, 194, 232, 274, 324, 370, 428, 461, 523, 589, 647,
+ 721, 795, 861, 932, 1006, 1094, 1174, 1276, 1370, 1468, 1531, 1631,
+ 1735, 1843, 1955, 2071, 2191, 2306, 2434, 2566, 2702, 2812, 2956
+};
+
+static int qr_data_codewords_M[] = {
+ 16, 28, 44, 64, 86, 108, 124, 154, 182, 216, 254, 290, 334, 365, 415, 453, 507,
+ 563, 627, 669, 714, 782, 860, 914, 1000, 1062, 1128, 1193, 1267,
+ 1373, 1455, 1541, 1631, 1725, 1812, 1914, 1992, 2102, 2216, 2334
+};
+
+static int qr_data_codewords_Q[] = {
+ 13, 22, 34, 48, 62, 76, 88, 110, 132, 154, 180, 206, 244, 261, 295, 325, 367,
+ 397, 445, 485, 512, 568, 614, 664, 718, 754, 808, 871, 911,
+ 985, 1033, 1115, 1171, 1231, 1286, 1354, 1426, 1502, 1582, 1666
+};
+
+static int qr_data_codewords_H[] = {
+ 9, 16, 26, 36, 46, 60, 66, 86, 100, 122, 140, 158, 180, 197, 223, 253, 283,
+ 313, 341, 385, 406, 442, 464, 514, 538, 596, 628, 661, 701,
+ 745, 793, 845, 901, 961, 986, 1054, 1096, 1142, 1222, 1276
+};
+
+static int qr_total_codewords[] = {
+ 26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815,
+ 901, 991, 1085, 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051,
+ 2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706
+};
+
+static int qr_blocks_L[] = {
+ 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12,
+ 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25
+};
+
+static int qr_blocks_M[] = {
+ 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20,
+ 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49
+};
+
+static int qr_blocks_Q[] = {
+ 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25,
+ 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68
+};
+
+static int qr_blocks_H[] = {
+ 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30,
+ 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81
+};
+
+static int qr_sizes[] = {
+ 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97,
+ 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177
+};
+
+static int micro_qr_sizes[] = {
+ 11, 13, 15, 17
+};
+
+static int qr_align_loopsize[] = {
+ 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7
+};
+
+static int qr_table_e1[] = {
+ 6, 18, 0, 0, 0, 0, 0,
+ 6, 22, 0, 0, 0, 0, 0,
+ 6, 26, 0, 0, 0, 0, 0,
+ 6, 30, 0, 0, 0, 0, 0,
+ 6, 34, 0, 0, 0, 0, 0,
+ 6, 22, 38, 0, 0, 0, 0,
+ 6, 24, 42, 0, 0, 0, 0,
+ 6, 26, 46, 0, 0, 0, 0,
+ 6, 28, 50, 0, 0, 0, 0,
+ 6, 30, 54, 0, 0, 0, 0,
+ 6, 32, 58, 0, 0, 0, 0,
+ 6, 34, 62, 0, 0, 0, 0,
+ 6, 26, 46, 66, 0, 0, 0,
+ 6, 26, 48, 70, 0, 0, 0,
+ 6, 26, 50, 74, 0, 0, 0,
+ 6, 30, 54, 78, 0, 0, 0,
+ 6, 30, 56, 82, 0, 0, 0,
+ 6, 30, 58, 86, 0, 0, 0,
+ 6, 34, 62, 90, 0, 0, 0,
+ 6, 28, 50, 72, 94, 0, 0,
+ 6, 26, 50, 74, 98, 0, 0,
+ 6, 30, 54, 78, 102, 0, 0,
+ 6, 28, 54, 80, 106, 0, 0,
+ 6, 32, 58, 84, 110, 0, 0,
+ 6, 30, 58, 86, 114, 0, 0,
+ 6, 34, 62, 90, 118, 0, 0,
+ 6, 26, 50, 74, 98, 122, 0,
+ 6, 30, 54, 78, 102, 126, 0,
+ 6, 26, 52, 78, 104, 130, 0,
+ 6, 30, 56, 82, 108, 134, 0,
+ 6, 34, 60, 86, 112, 138, 0,
+ 6, 30, 58, 86, 114, 142, 0,
+ 6, 34, 62, 90, 118, 146, 0,
+ 6, 30, 54, 78, 102, 126, 150,
+ 6, 24, 50, 76, 102, 128, 154,
+ 6, 28, 54, 80, 106, 132, 158,
+ 6, 32, 58, 84, 110, 136, 162,
+ 6, 26, 54, 82, 110, 138, 166,
+ 6, 30, 58, 86, 114, 142, 170
+};
+
+static unsigned int qr_annex_c[] = {
+ /* Format information bit sequences */
+ 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, 0x77c4, 0x72f3, 0x7daa, 0x789d,
+ 0x662f, 0x6318, 0x6c41, 0x6976, 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b,
+ 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed
+};
+
+static long int qr_annex_d[] = {
+ /* Version information bit sequences */
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78,
+ 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab,
+ 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b,
+ 0x2542e, 0x26a64, 0x27541, 0x28c69
+};
+
+static int qr_annex_c1[] = {
+ /* Micro QR Code format information */
+ 0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4, 0x6dfd, 0x68ca, 0x7678, 0x734f,
+ 0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987, 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3,
+ 0x31d4, 0x3e8d, 0x3bba
+}; \ No newline at end of file
diff --git a/backend/reedsol.c b/backend/reedsol.c
new file mode 100644
index 0000000..ef9e402
--- /dev/null
+++ b/backend/reedsol.c
@@ -0,0 +1,171 @@
+/**
+
+ This is a simple Reed-Solomon encoder
+ (C) Cliff Hones 2004
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+// It is not written with high efficiency in mind, so is probably
+// not suitable for real-time encoding. The aim was to keep it
+// simple, general and clear.
+//
+// <Some notes on the theory and implementation need to be added here>
+
+// Usage:
+// First call rs_init_gf(poly) to set up the Galois Field parameters.
+// Then call rs_init_code(size, index) to set the encoding size
+// Then call rs_encode(datasize, data, out) to encode the data.
+//
+// These can be called repeatedly as required - but note that
+// rs_init_code must be called following any rs_init_gf call.
+//
+// If the parameters are fixed, some of the statics below can be
+// replaced with constants in the obvious way, and additionally
+// malloc/free can be avoided by using static arrays of a suitable
+// size.
+
+#include <stdio.h> // only needed for debug (main)
+#include <stdlib.h> // only needed for malloc/free
+#include "reedsol.h"
+static int gfpoly;
+static int symsize; // in bits
+static int logmod; // 2**symsize - 1
+static int rlen;
+
+static int *logt = NULL, *alog = NULL, *rspoly = NULL;
+
+// rs_init_gf(poly) initialises the parameters for the Galois Field.
+// The symbol size is determined from the highest bit set in poly
+// This implementation will support sizes up to 30 bits (though that
+// will result in very large log/antilog tables) - bit sizes of
+// 8 or 4 are typical
+//
+// The poly is the bit pattern representing the GF characteristic
+// polynomial. e.g. for ECC200 (8-bit symbols) the polynomial is
+// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d.
+
+void rs_init_gf(int poly)
+{
+ int m, b, p, v;
+
+ // Find the top bit, and hence the symbol size
+ for (b = 1, m = 0; b <= poly; b <<= 1)
+ m++;
+ b >>= 1;
+ m--;
+ gfpoly = poly;
+ symsize = m;
+
+ // Calculate the log/alog tables
+ logmod = (1 << m) - 1;
+ logt = (int *)malloc(sizeof(int) * (logmod + 1));
+ alog = (int *)malloc(sizeof(int) * logmod);
+
+ for (p = 1, v = 0; v < logmod; v++) {
+ alog[v] = p;
+ logt[p] = v;
+ p <<= 1;
+ if (p & b)
+ p ^= poly;
+ }
+}
+
+// rs_init_code(nsym, index) initialises the Reed-Solomon encoder
+// nsym is the number of symbols to be generated (to be appended
+// to the input data). index is usually 1 - it is the index of
+// the constant in the first term (i) of the RS generator polynomial:
+// (x + 2**i)*(x + 2**(i+1))*... [nsym terms]
+// For ECC200, index is 1.
+
+void rs_init_code(int nsym, int index)
+{
+ int i, k;
+
+ rspoly = (int *)malloc(sizeof(int) * (nsym + 1));
+
+ rlen = nsym;
+
+ rspoly[0] = 1;
+ for (i = 1; i <= nsym; i++) {
+ rspoly[i] = 1;
+ for (k = i - 1; k > 0; k--) {
+ if (rspoly[k])
+ rspoly[k] = alog[(logt[rspoly[k]] + index) % logmod];
+ rspoly[k] ^= rspoly[k - 1];
+ }
+ rspoly[0] = alog[(logt[rspoly[0]] + index) % logmod];
+ index++;
+ }
+}
+
+void rs_encode(int len, unsigned char *data, unsigned char *res)
+{
+ int i, k, m;
+ for (i = 0; i < rlen; i++)
+ res[i] = 0;
+ for (i = 0; i < len; i++) {
+ m = res[rlen - 1] ^ data[i];
+ for (k = rlen - 1; k > 0; k--) {
+ if (m && rspoly[k])
+ res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod];
+ else
+ res[k] = res[k - 1];
+ }
+ if (m && rspoly[0])
+ res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod];
+ else
+ res[0] = 0;
+ }
+}
+
+void rs_encode_long(int len, unsigned int *data, unsigned int *res)
+{ /* The same as above but for larger bitlengths - Aztec code compatible */
+ int i, k, m;
+ for (i = 0; i < rlen; i++)
+ res[i] = 0;
+ for (i = 0; i < len; i++) {
+ m = res[rlen - 1] ^ data[i];
+ for (k = rlen - 1; k > 0; k--) {
+ if (m && rspoly[k])
+ res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod];
+ else
+ res[k] = res[k - 1];
+ }
+ if (m && rspoly[0])
+ res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod];
+ else
+ res[0] = 0;
+ }
+}
+
+void rs_free(void)
+{ /* Free memory */
+ free(logt);
+ free(alog);
+ free(rspoly);
+ rspoly = NULL;
+}
diff --git a/backend/reedsol.h b/backend/reedsol.h
new file mode 100644
index 0000000..d61af2c
--- /dev/null
+++ b/backend/reedsol.h
@@ -0,0 +1,51 @@
+/*
+
+ This is a simple Reed-Solomon encoder
+ (C) Cliff Hones 2004
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+*/
+
+#ifndef __REEDSOL_H
+#define __REEDSOL_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+extern void rs_init_gf(int poly);
+extern void rs_init_code(int nsym, int index);
+extern void rs_encode(int len, unsigned char *data, unsigned char *res);
+extern void rs_encode_long(int len, unsigned int *data, unsigned int *res);
+extern void rs_free(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __REEDSOL_H */
diff --git a/backend/render.c b/backend/render.c
new file mode 100644
index 0000000..6c7968c
--- /dev/null
+++ b/backend/render.c
@@ -0,0 +1,792 @@
+/*
+ * render.c - Generic Rendered Format
+ *
+ * Initiall written by Sam Lown for use in gLabels. Converts encoded
+ * data into a generic internal structure of lines and characters
+ * usable in external applications.
+ */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "common.h"
+
+#define GL_CONST 2.8346
+
+struct zint_render_line *render_plot_create_line(float x, float y, float width, float length);
+int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line);
+struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width);
+int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring);
+struct zint_render_hexagon *render_plot_create_hexagon(float x, float y);
+int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *ring, struct zint_render_hexagon **last_hexagon);
+
+int render_plot_add_string(struct zint_symbol *symbol, unsigned char *text, float x, float y, float fsize, float width, struct zint_render_string **last_string);
+
+int render_plot(struct zint_symbol *symbol, float width, float height)
+{
+ struct zint_render *render;
+ struct zint_render_line *line, *last_line = NULL;
+ struct zint_render_string *last_string = NULL;
+ struct zint_render_ring *ring, *last_ring = NULL;
+ struct zint_render_hexagon *hexagon, *last_hexagon = NULL;
+
+ int i, r, block_width, latch, this_row;
+ float textpos, textwidth, large_bar_height, preset_height, row_height, row_posn = 0.0;
+ // int error_number = 0;
+ int text_offset, text_height, xoffset, yoffset, textdone, main_symbol_width_x, addon_width_x;
+ char addon[6], textpart[10];
+ int large_bar_count, symbol_lead_in, total_symbol_width_x, total_area_width_x;
+ float addon_text_posn;
+ float default_text_posn;
+ float scaler;
+ const char *locale = NULL;
+ int hide_text = 0;
+ float required_aspect;
+ float symbol_aspect = 1;
+ float x_dimension;
+ int upceanflag = 0;
+
+ // Allocate memory for the rendered version
+ render = symbol->rendered = (struct zint_render*)malloc(sizeof(struct zint_render));
+ render->lines = NULL;
+ render->strings = NULL;
+ render->rings = NULL;
+ render->hexagons = NULL;
+
+ locale = setlocale(LC_ALL, "C");
+
+ row_height = 0;
+ textdone = 0;
+ textpos = 0.0;
+ main_symbol_width_x = symbol->width;
+ strcpy(addon, "");
+ symbol_lead_in = 0;
+ addon_text_posn = 0.0;
+ addon_width_x = 0;
+
+ /*
+ * Determine if there will be any addon texts and text height
+ */
+ latch = 0;
+ r = 0;
+ /* Isolate add-on text */
+ if(is_extendable(symbol->symbology)) {
+ for(i = 0; i < ustrlen(symbol->text); i++) {
+ if (latch == 1) {
+ addon[r] = symbol->text[i];
+ r++;
+ }
+ if (symbol->text[i] == '+') {
+ latch = 1;
+ }
+ }
+ }
+ addon[r] = '\0';
+
+ if((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)) {
+ hide_text = 1;
+ text_height = text_offset = 0.0;
+ } else {
+ text_height = 9.0;
+ text_offset = 2.0;
+ }
+
+
+ /*
+ * Calculate the width of the barcode, especially if there are any extra
+ * borders or white space to add.
+ */
+
+ while(!(module_is_set(symbol, symbol->rows - 1, symbol_lead_in))) {
+ symbol_lead_in++;
+ }
+
+ /* Certain symbols need whitespace otherwise characters get chopped off the sides */
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC))
+ || (symbol->symbology == BARCODE_ISBNX)) {
+ switch(ustrlen(symbol->text)) {
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ if(symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ }
+ main_symbol_width_x = 96 + symbol_lead_in;
+ upceanflag = 13;
+ break;
+ case 2:
+ main_symbol_width_x = 22 + symbol_lead_in;
+ upceanflag = 2;
+ break;
+ case 5:
+ main_symbol_width_x = 49 + symbol_lead_in;
+ upceanflag = 5;
+ break;
+ default:
+ main_symbol_width_x = 68 + symbol_lead_in;
+ upceanflag = 8;
+ }
+ switch(ustrlen(symbol->text)) {
+ case 11:
+ case 16:
+ /* EAN-2 add-on */
+ addon_width_x = 31;
+ break;
+ case 14:
+ case 19:
+ /* EAN-5 add-on */
+ addon_width_x = 58;
+ break;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ upceanflag = 12;
+ if(symbol->whitespace_width < 10) {
+ symbol->whitespace_width = 10;
+ main_symbol_width_x = 96 + symbol_lead_in;
+ }
+ switch(ustrlen(symbol->text)) {
+ case 15:
+ /* EAN-2 add-on */
+ addon_width_x = 31;
+ break;
+ case 18:
+ /* EAN-5 add-on */
+ addon_width_x = 58;
+ break;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ upceanflag = 6;
+ if(symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_symbol_width_x = 51 + symbol_lead_in;
+ }
+ switch(ustrlen(symbol->text)) {
+ case 11:
+ /* EAN-2 add-on */
+ addon_width_x = 31;
+ break;
+ case 14:
+ /* EAN-5 add-on */
+ addon_width_x = 58;
+ break;
+ }
+ }
+
+ total_symbol_width_x = main_symbol_width_x + addon_width_x;
+ total_area_width_x = total_symbol_width_x + (2 * (symbol->border_width + symbol->whitespace_width));
+
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+
+ // Determine if height should be overridden
+ large_bar_count = 0;
+ preset_height = 0.0;
+ for(i = 0; i < symbol->rows; i++) {
+ preset_height += symbol->row_height[i];
+ if(symbol->row_height[i] == 0) {
+ large_bar_count++;
+ }
+ }
+
+ if (large_bar_count == 0) {
+ required_aspect = width / height;
+ symbol_aspect = (total_symbol_width_x + (2 * xoffset)) / (preset_height + (2 * yoffset) + text_offset + text_height);
+ symbol->height = preset_height;
+ if (required_aspect > symbol_aspect) {
+ /* the area is too wide */
+ scaler = height / (preset_height + (2 * yoffset) + text_offset + text_height);
+ render->width = symbol_aspect * height;
+ render->height = height;
+ } else {
+ /* the area is too high */
+ scaler = width / (total_symbol_width_x + (2 * xoffset));
+ render->width = width;
+ render->height = width / symbol_aspect;
+ }
+ } else {
+ scaler = width / (total_symbol_width_x + (2 * xoffset));
+ symbol->height = (height / scaler) - ((2 * yoffset) + text_offset + text_height);
+
+ render->width = width;
+ render->height = height;
+ }
+ large_bar_height = (symbol->height - preset_height) / large_bar_count;
+
+ if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ default_text_posn = (symbol->height + text_offset + symbol->border_width + symbol->border_width) * scaler;
+ } else {
+ default_text_posn = (symbol->height + text_offset + symbol->border_width) * scaler;
+ }
+
+ x_dimension = render->width / total_area_width_x;
+ x_dimension /= GL_CONST;
+
+ /* Set minimum size of symbol */
+ /* Barcode must be at least 2mm high by 2mm across */
+ if(render->height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST) {
+ render->height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST;
+ }
+ if(render->width < (2.0 * GL_CONST)) {
+ render->width = (2.0 * GL_CONST);
+ }
+
+ if(symbol->symbology == BARCODE_CODABAR) {
+ /* The minimum X-dimension of Codabar is 0.191mm. The minimum bar height is 5mm */
+ if(x_dimension < 0.191) {
+ render->width = 0.191 * GL_CONST * total_area_width_x;
+ }
+ if(render->height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST) {
+ render->height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST;
+ }
+ }
+
+ if(symbol->symbology == BARCODE_CODE49) {
+ /* The minimum X-dimension of Code 49 is 0.191mm */
+ if(x_dimension < 0.191) {
+ render->width = 0.191 * GL_CONST * total_area_width_x;
+ render->height = render->width / symbol_aspect;
+ }
+ }
+
+ if(upceanflag != 0) {
+ /* The X-dimension of UPC/EAN symbols is fixed at 0.330mm */
+ /* NOTE: This code will need adjustment before it correctly deals with composite symbols */
+ render->width = 0.330 * GL_CONST * total_area_width_x;
+ /* The height is also fixed */
+ switch (upceanflag) {
+ case 6:
+ case 12:
+ case 13:
+ /* UPC-A, UPC-E and EAN-13 */
+ /* Height of bars should be 22.85mm */
+ render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 22.85) * GL_CONST;
+ break;
+ case 8:
+ /* EAN-8 */
+ /* Height of bars should be 18.23mm */
+ render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 18.23) * GL_CONST;
+ break;
+ default:
+ /* EAN-2 and EAN-5 */
+ /* Height of bars should be 21.10mm */
+ render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 21.10) * GL_CONST;
+ }
+ }
+
+ if(symbol->symbology == BARCODE_ONECODE) {
+ /* The size of USPS Intelligent Mail barcode is fixed */
+ render->width = 0.508 * GL_CONST * total_area_width_x;
+ render->height = 4.064 * GL_CONST;
+ }
+
+ if((symbol->symbology == BARCODE_POSTNET) || (symbol->symbology == BARCODE_PLANET)) {
+ /* The size of PostNet and PLANET are fized */
+ render->width = 0.508 * GL_CONST * total_area_width_x;
+ render->height = 2.921 * GL_CONST;
+ }
+
+ if(((symbol->symbology == BARCODE_AUSPOST) || (symbol->symbology == BARCODE_AUSREPLY)) ||
+ ((symbol->symbology == BARCODE_AUSROUTE) || (symbol->symbology == BARCODE_AUSREDIRECT))) {
+ /* Australia Post use the same sizes as USPS */
+ render->width = 0.508 * GL_CONST * total_area_width_x;
+ render->height = 4.064 * GL_CONST;
+ }
+
+ if((symbol->symbology == BARCODE_RM4SCC) || (symbol->symbology == BARCODE_KIX)) {
+ /* Royal Mail and KIX Code uses 22 bars per inch */
+ render->width = 0.577 * GL_CONST * total_area_width_x;
+ render->height = 5.22 * GL_CONST;
+ }
+
+ if(symbol->symbology == BARCODE_MAXICODE) {
+ /* Maxicode is a fixed size */
+ scaler = GL_CONST; /* Converts from millimeters to the scale used by glabels */
+ render->width = 28.16 * scaler;
+ render->height = 26.86 * scaler;
+
+ /* Central bullseye pattern */
+ ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 0.85 * scaler, 0.67 * scaler);
+ render_plot_add_ring(symbol, ring, &last_ring);
+ ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 2.20 * scaler, 0.67 * scaler);
+ render_plot_add_ring(symbol, ring, &last_ring);
+ ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 3.54 * scaler, 0.67 * scaler);
+ render_plot_add_ring(symbol, ring, &last_ring);
+
+ /* Hexagons */
+ for(r = 0; r < symbol->rows; r++) {
+ for(i = 0; i < symbol->width; i++) {
+ if(module_is_set(symbol, r, i)) {
+ hexagon = render_plot_create_hexagon(((i * 0.88) + (r & 1 ? 1.76 : 1.32)) * scaler, ((r * 0.76) + 0.76) * scaler);
+ render_plot_add_hexagon(symbol, hexagon, &last_hexagon);
+ }
+ }
+ }
+
+ } else {
+ /* everything else uses rectangles (or squares) */
+ /* Works from the bottom of the symbol up */
+ int addon_latch = 0;
+
+ for(r = 0; r < symbol->rows; r++) {
+ this_row = r;
+ if(symbol->row_height[this_row] == 0) {
+ row_height = large_bar_height;
+ } else {
+ row_height = symbol->row_height[this_row];
+ }
+ row_posn = 0;
+ for(i = 0; i < r; i++) {
+ if(symbol->row_height[i] == 0) {
+ row_posn += large_bar_height;
+ } else {
+ row_posn += symbol->row_height[i];
+ }
+ }
+ row_posn += yoffset;
+
+ i = 0;
+ if(module_is_set(symbol, this_row, 0)) {
+ latch = 1;
+ } else {
+ latch = 0;
+ }
+
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
+ if((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_symbol_width_x)) {
+ addon_text_posn = row_posn * scaler;
+ addon_latch = 1;
+ }
+ if(latch == 1) {
+ /* a bar */
+ if(addon_latch == 0) {
+ line = render_plot_create_line((i + xoffset) * scaler, (row_posn) * scaler, block_width * scaler, row_height * scaler);
+ } else {
+ line = render_plot_create_line((i + xoffset) * scaler, (row_posn + 10.0) * scaler, block_width * scaler, (row_height - 5.0) * scaler);
+ }
+ latch = 0;
+
+ render_plot_add_line(symbol, line, &last_line);
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+
+ } while (i < symbol->width);
+ }
+ }
+ /* That's done the actual data area, everything else is human-friendly */
+
+
+ /* Add the text */
+ xoffset -= symbol_lead_in;
+ row_posn = (row_posn + large_bar_height) * scaler;
+
+ if (!hide_text) {
+ if(upceanflag == 8) {
+ /* guard bar extensions and text formatting for EAN-8 */
+ i = 0;
+ for (line = symbol->rendered->lines; line != NULL; line = line->next) {
+ switch(i) {
+ case 0:
+ case 1:
+ case 10:
+ case 11:
+ case 20:
+ case 21:
+ line->length += (5.0 * scaler);
+ break;
+ }
+ i++;
+ }
+
+ for(i = 0; i < 4; i++) {
+ textpart[i] = symbol->text[i];
+ }
+ textpart[4] = '\0';
+ textpos = 17;
+ textwidth = 4.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string);
+ for(i = 0; i < 4; i++) {
+ textpart[i] = symbol->text[i + 4];
+ }
+ textpart[4] = '\0';
+ textpos = 50;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string);
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ textpos = xoffset + 86;
+ textwidth = 2.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string);
+ break;
+ case 5:
+ textpos = xoffset + 100;
+ textwidth = 5.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string);
+ break;
+ }
+
+ }
+
+ if(upceanflag == 13) {
+ /* guard bar extensions and text formatting for EAN-13 */
+ i = 0;
+ for (line = symbol->rendered->lines; line != NULL; line = line->next) {
+ switch(i) {
+ case 0:
+ case 1:
+ case 14:
+ case 15:
+ case 28:
+ case 29:
+ line->length += (5.0 * scaler);
+ break;
+ }
+ i++;
+ }
+
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ textpos = -5; // 7
+ textwidth = 8.5;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string);
+
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[6] = '\0';
+ textpos = 25;
+ textwidth = 6.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string);
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 7];
+ }
+ textpart[6] = '\0';
+ textpos = 72;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string);
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ textpos = xoffset + 114;
+ textwidth = 2.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string);
+ break;
+ case 5:
+ textpos = xoffset + 128;
+ textwidth = 5.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string);
+ break;
+ }
+ }
+
+ if (upceanflag == 12) {
+ /* guard bar extensions and text formatting for UPCA */
+ i = 0;
+ for (line = symbol->rendered->lines; line != NULL; line = line->next) {
+ switch(i) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 14:
+ case 15:
+ case 26:
+ case 27:
+ case 28:
+ case 29:
+ line->length += (5.0 * scaler);
+ break;
+ }
+ i++;
+ }
+
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ textpos = -5;
+ textwidth = 6.2;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string);
+ for(i = 0; i < 5; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[5] = '\0';
+ textpos = 27;
+ textwidth = 5.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string);
+ for(i = 0; i < 5; i++) {
+ textpart[i] = symbol->text[i + 6];
+ }
+ textpos = 68;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string);
+ textpart[0] = symbol->text[11];
+ textpart[1] = '\0';
+ textpos = 100;
+ textwidth = 6.2;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string);
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ textpos = xoffset + 116;
+ textwidth = 2.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string);
+ break;
+ case 5:
+ textpos = xoffset + 130;
+ textwidth = 5.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string);
+ break;
+ }
+ }
+
+ if (upceanflag == 6) {
+ /* guard bar extensions and text formatting for UPCE */
+ i = 0;
+ for (line = symbol->rendered->lines; line != NULL; line = line->next) {
+ switch(i) {
+ case 0:
+ case 1:
+ case 14:
+ case 15:
+ case 16:
+ line->length += (5.0 * scaler);
+ break;
+ }
+ i++;
+ }
+
+ textpart[0] = symbol->text[0];
+ textpart[1] = '\0';
+ textpos = -5;
+ textwidth = 6.2;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string);
+ for(i = 0; i < 6; i++) {
+ textpart[i] = symbol->text[i + 1];
+ }
+ textpart[6] = '\0';
+ textpos = 24;
+ textwidth = 6.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string);
+ textpart[0] = symbol->text[7];
+ textpart[1] = '\0';
+ textpos = 55;
+ textwidth = 6.2;
+ render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string);
+ textdone = 1;
+ switch(strlen(addon)) {
+ case 2:
+ textpos = xoffset + 70;
+ textwidth = 2.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string);
+ break;
+ case 5:
+ textpos = xoffset + 84;
+ textwidth = 5.0 * 8.5;
+ render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string);
+ break;
+ }
+ }
+
+ /* Put normal human readable text at the bottom (and centered) */
+ if (textdone == 0) {
+ // caculate start xoffset to center text
+ render_plot_add_string(symbol, symbol->text, ((symbol->width / 2.0) + xoffset) * scaler, default_text_posn, 9.0 * scaler, 0.0, &last_string);
+ }
+ }
+
+ switch(symbol->symbology) {
+ case BARCODE_MAXICODE:
+ /* Do nothing! */
+ break;
+ default:
+ if((symbol->output_options & BARCODE_BIND) != 0) {
+ if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) {
+ /* row binding */
+ for(r = 1; r < symbol->rows; r++) {
+ line = render_plot_create_line(xoffset * scaler, ((r * row_height) + yoffset - 1) * scaler, symbol->width * scaler, 2.0 * scaler);
+ render_plot_add_line(symbol, line, &last_line);
+ }
+ }
+ }
+ if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ line = render_plot_create_line(0, 0, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler);
+ render_plot_add_line(symbol, line, &last_line);
+ line = render_plot_create_line(0, (symbol->height + symbol->border_width) * scaler, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler);
+ render_plot_add_line(symbol, line, &last_line);
+ }
+ if((symbol->output_options & BARCODE_BOX) != 0) {
+ /* side bars */
+ line = render_plot_create_line(0, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler);
+ render_plot_add_line(symbol, line, &last_line);
+ line = render_plot_create_line((symbol->width + xoffset + xoffset - symbol->border_width) * scaler, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler);
+ render_plot_add_line(symbol, line, &last_line);
+ }
+ break;
+ }
+
+ if (locale)
+ setlocale(LC_ALL, locale);
+
+ return 1;
+}
+
+
+/*
+ * Create a new line with its memory allocated ready for adding to the
+ * rendered structure.
+ *
+ * This is much quicker than writing out each line manually (in some cases!)
+ */
+struct zint_render_line *render_plot_create_line(float x, float y, float width, float length)
+{
+ struct zint_render_line *line;
+
+ line = (struct zint_render_line*)malloc(sizeof(struct zint_render_line));
+ if (line)
+ {
+ line->next = NULL;
+ line->x = x;
+ line->y = y;
+ line->width = width;
+ line->length = length;
+ }
+ return line;
+}
+
+/*
+ * Add the line to the current rendering and update the last line's
+ * next value.
+ */
+int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line)
+{
+ if (*last_line)
+ (*last_line)->next = line;
+ else
+ symbol->rendered->lines = line; // first line
+
+ *last_line = line;
+ return 1;
+}
+
+struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width)
+{
+ struct zint_render_ring *ring;
+
+ ring = (struct zint_render_ring*)malloc(sizeof(struct zint_render_ring));
+ if (ring)
+ {
+ ring->next = NULL;
+ ring->x = x;
+ ring->y = y;
+ ring->radius = radius;
+ ring->line_width = line_width;
+ }
+ return ring;
+}
+
+int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring)
+{
+ if (*last_ring)
+ (*last_ring)->next = ring;
+ else
+ symbol->rendered->rings = ring; // first ring
+
+ *last_ring = ring;
+ return 1;
+}
+
+struct zint_render_hexagon *render_plot_create_hexagon(float x, float y)
+{
+ struct zint_render_hexagon *hexagon;
+
+ hexagon = (struct zint_render_hexagon*)malloc(sizeof(struct zint_render_hexagon));
+ if (hexagon)
+ {
+ hexagon->next = NULL;
+ hexagon->x = x;
+ hexagon->y = y;
+ }
+ return hexagon;
+}
+
+int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *hexagon, struct zint_render_hexagon **last_hexagon)
+{
+ if (*last_hexagon)
+ (*last_hexagon)->next = hexagon;
+ else
+ symbol->rendered->hexagons = hexagon; // first hexagon
+
+ *last_hexagon = hexagon;
+ return 1;
+}
+
+/*
+ * Add a string structure to the symbol.
+ * Coordinates assumed to be from top-center.
+ */
+int render_plot_add_string(struct zint_symbol *symbol,
+ unsigned char *text, float x, float y, float fsize, float width,
+ struct zint_render_string **last_string)
+{
+ struct zint_render_string *string;
+
+ string = (struct zint_render_string*)malloc(sizeof(struct zint_render_string));
+ if (string)
+ {
+ string->next = NULL;
+ string->x = x;
+ string->y = y;
+ string->width = width;
+ string->fsize = fsize;
+ string->length = ustrlen(text);
+ string->text = (unsigned char*)malloc(sizeof(unsigned char) * (ustrlen(text) + 1));
+
+ if (string->text)
+ ustrcpy(string->text, text);
+
+ if (*last_string)
+ (*last_string)->next = string;
+ else
+ symbol->rendered->strings = string; // First character
+ *last_string = string;
+ }
+ return 1;
+}
diff --git a/backend/sjis.h b/backend/sjis.h
new file mode 100644
index 0000000..d5dd6e1
--- /dev/null
+++ b/backend/sjis.h
@@ -0,0 +1,6886 @@
+/* sjis.h - Unicode to Shift JIS lookup table
+
+ libzint - the open source barcode library
+ Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+
+/* Derived from :
+## Shift_JIS (JIS X 0208:1997 Appendix 1) vs Unicode mapping table
+##
+## Date: 06 Mar 2002 06:01:22 GMT
+## License:
+## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
+## Copyright (C) 2001 I'O, All Rights Reserved.
+## You can use, modify, distribute this table freely.
+*/
+
+unsigned long int sjis_lookup[] = {
+ 0x005C,0x815F, // REVERSE SOLIDUS
+ 0x00A2,0x8191, // CENT SIGN
+ 0x00A3,0x8192, // POUND SIGN
+ 0x00A7,0x8198, // SECTION SIGN
+ 0x00A8,0x814E, // DIAERESIS
+ 0x00AC,0x81CA, // NOT SIGN
+ 0x00B0,0x818B, // DEGREE SIGN
+ 0x00B1,0x817D, // PLUS-MINUS SIGN
+ 0x00B4,0x814C, // ACUTE ACCENT
+ 0x00B6,0x81F7, // PILCROW SIGN
+ 0x00D7,0x817E, // MULTIPLICATION SIGN
+ 0x00F7,0x8180, // DIVISION SIGN
+ 0x0391,0x839F, // GREEK CAPITAL LETTER ALPHA
+ 0x0392,0x83A0, // GREEK CAPITAL LETTER BETA
+ 0x0393,0x83A1, // GREEK CAPITAL LETTER GAMMA
+ 0x0394,0x83A2, // GREEK CAPITAL LETTER DELTA
+ 0x0395,0x83A3, // GREEK CAPITAL LETTER EPSILON
+ 0x0396,0x83A4, // GREEK CAPITAL LETTER ZETA
+ 0x0397,0x83A5, // GREEK CAPITAL LETTER ETA
+ 0x0398,0x83A6, // GREEK CAPITAL LETTER THETA
+ 0x0399,0x83A7, // GREEK CAPITAL LETTER IOTA
+ 0x039A,0x83A8, // GREEK CAPITAL LETTER KAPPA
+ 0x039B,0x83A9, // GREEK CAPITAL LETTER LAMDA
+ 0x039C,0x83AA, // GREEK CAPITAL LETTER MU
+ 0x039D,0x83AB, // GREEK CAPITAL LETTER NU
+ 0x039E,0x83AC, // GREEK CAPITAL LETTER XI
+ 0x039F,0x83AD, // GREEK CAPITAL LETTER OMICRON
+ 0x03A0,0x83AE, // GREEK CAPITAL LETTER PI
+ 0x03A1,0x83AF, // GREEK CAPITAL LETTER RHO
+ 0x03A3,0x83B0, // GREEK CAPITAL LETTER SIGMA
+ 0x03A4,0x83B1, // GREEK CAPITAL LETTER TAU
+ 0x03A5,0x83B2, // GREEK CAPITAL LETTER UPSILON
+ 0x03A6,0x83B3, // GREEK CAPITAL LETTER PHI
+ 0x03A7,0x83B4, // GREEK CAPITAL LETTER CHI
+ 0x03A8,0x83B5, // GREEK CAPITAL LETTER PSI
+ 0x03A9,0x83B6, // GREEK CAPITAL LETTER OMEGA
+ 0x03B1,0x83BF, // GREEK SMALL LETTER ALPHA
+ 0x03B2,0x83C0, // GREEK SMALL LETTER BETA
+ 0x03B3,0x83C1, // GREEK SMALL LETTER GAMMA
+ 0x03B4,0x83C2, // GREEK SMALL LETTER DELTA
+ 0x03B5,0x83C3, // GREEK SMALL LETTER EPSILON
+ 0x03B6,0x83C4, // GREEK SMALL LETTER ZETA
+ 0x03B7,0x83C5, // GREEK SMALL LETTER ETA
+ 0x03B8,0x83C6, // GREEK SMALL LETTER THETA
+ 0x03B9,0x83C7, // GREEK SMALL LETTER IOTA
+ 0x03BA,0x83C8, // GREEK SMALL LETTER KAPPA
+ 0x03BB,0x83C9, // GREEK SMALL LETTER LAMDA
+ 0x03BC,0x83CA, // GREEK SMALL LETTER MU
+ 0x03BD,0x83CB, // GREEK SMALL LETTER NU
+ 0x03BE,0x83CC, // GREEK SMALL LETTER XI
+ 0x03BF,0x83CD, // GREEK SMALL LETTER OMICRON
+ 0x03C0,0x83CE, // GREEK SMALL LETTER PI
+ 0x03C1,0x83CF, // GREEK SMALL LETTER RHO
+ 0x03C3,0x83D0, // GREEK SMALL LETTER SIGMA
+ 0x03C4,0x83D1, // GREEK SMALL LETTER TAU
+ 0x03C5,0x83D2, // GREEK SMALL LETTER UPSILON
+ 0x03C6,0x83D3, // GREEK SMALL LETTER PHI
+ 0x03C7,0x83D4, // GREEK SMALL LETTER CHI
+ 0x03C8,0x83D5, // GREEK SMALL LETTER PSI
+ 0x03C9,0x83D6, // GREEK SMALL LETTER OMEGA
+ 0x0401,0x8446, // CYRILLIC CAPITAL LETTER IO
+ 0x0410,0x8440, // CYRILLIC CAPITAL LETTER A
+ 0x0411,0x8441, // CYRILLIC CAPITAL LETTER BE
+ 0x0412,0x8442, // CYRILLIC CAPITAL LETTER VE
+ 0x0413,0x8443, // CYRILLIC CAPITAL LETTER GHE
+ 0x0414,0x8444, // CYRILLIC CAPITAL LETTER DE
+ 0x0415,0x8445, // CYRILLIC CAPITAL LETTER IE
+ 0x0416,0x8447, // CYRILLIC CAPITAL LETTER ZHE
+ 0x0417,0x8448, // CYRILLIC CAPITAL LETTER ZE
+ 0x0418,0x8449, // CYRILLIC CAPITAL LETTER I
+ 0x0419,0x844A, // CYRILLIC CAPITAL LETTER SHORT I
+ 0x041A,0x844B, // CYRILLIC CAPITAL LETTER KA
+ 0x041B,0x844C, // CYRILLIC CAPITAL LETTER EL
+ 0x041C,0x844D, // CYRILLIC CAPITAL LETTER EM
+ 0x041D,0x844E, // CYRILLIC CAPITAL LETTER EN
+ 0x041E,0x844F, // CYRILLIC CAPITAL LETTER O
+ 0x041F,0x8450, // CYRILLIC CAPITAL LETTER PE
+ 0x0420,0x8451, // CYRILLIC CAPITAL LETTER ER
+ 0x0421,0x8452, // CYRILLIC CAPITAL LETTER ES
+ 0x0422,0x8453, // CYRILLIC CAPITAL LETTER TE
+ 0x0423,0x8454, // CYRILLIC CAPITAL LETTER U
+ 0x0424,0x8455, // CYRILLIC CAPITAL LETTER EF
+ 0x0425,0x8456, // CYRILLIC CAPITAL LETTER HA
+ 0x0426,0x8457, // CYRILLIC CAPITAL LETTER TSE
+ 0x0427,0x8458, // CYRILLIC CAPITAL LETTER CHE
+ 0x0428,0x8459, // CYRILLIC CAPITAL LETTER SHA
+ 0x0429,0x845A, // CYRILLIC CAPITAL LETTER SHCHA
+ 0x042B,0x845C, // CYRILLIC CAPITAL LETTER YERU
+ 0x042C,0x845D, // CYRILLIC CAPITAL LETTER SOFT SIGN
+ 0x042D,0x845E, // CYRILLIC CAPITAL LETTER E
+ 0x042E,0x845F, // CYRILLIC CAPITAL LETTER YU
+ 0x042F,0x8460, // CYRILLIC CAPITAL LETTER YA
+ 0x0430,0x8470, // CYRILLIC SMALL LETTER A
+ 0x0431,0x8471, // CYRILLIC SMALL LETTER BE
+ 0x0432,0x8472, // CYRILLIC SMALL LETTER VE
+ 0x0433,0x8473, // CYRILLIC SMALL LETTER GHE
+ 0x0434,0x8474, // CYRILLIC SMALL LETTER DE
+ 0x0435,0x8475, // CYRILLIC SMALL LETTER IE
+ 0x0436,0x8477, // CYRILLIC SMALL LETTER ZHE
+ 0x0437,0x8478, // CYRILLIC SMALL LETTER ZE
+ 0x0438,0x8479, // CYRILLIC SMALL LETTER I
+ 0x0439,0x847A, // CYRILLIC SMALL LETTER SHORT I
+ 0x043A,0x847B, // CYRILLIC SMALL LETTER KA
+ 0x043B,0x847C, // CYRILLIC SMALL LETTER EL
+ 0x043C,0x847D, // CYRILLIC SMALL LETTER EM
+ 0x043D,0x847E, // CYRILLIC SMALL LETTER EN
+ 0x043E,0x8480, // CYRILLIC SMALL LETTER O
+ 0x043F,0x8481, // CYRILLIC SMALL LETTER PE
+ 0x0440,0x8482, // CYRILLIC SMALL LETTER ER
+ 0x0441,0x8483, // CYRILLIC SMALL LETTER ES
+ 0x0442,0x8484, // CYRILLIC SMALL LETTER TE
+ 0x0443,0x8485, // CYRILLIC SMALL LETTER U
+ 0x0444,0x8486, // CYRILLIC SMALL LETTER EF
+ 0x0445,0x8487, // CYRILLIC SMALL LETTER HA
+ 0x0446,0x8488, // CYRILLIC SMALL LETTER TSE
+ 0x0447,0x8489, // CYRILLIC SMALL LETTER CHE
+ 0x0448,0x848A, // CYRILLIC SMALL LETTER SHA
+ 0x0449,0x848B, // CYRILLIC SMALL LETTER SHCHA
+ 0x044A,0x848C, // CYRILLIC SMALL LETTER HARD SIGN
+ 0x044B,0x848D, // CYRILLIC SMALL LETTER YERU
+ 0x044C,0x848E, // CYRILLIC SMALL LETTER SOFT SIGN
+ 0x044D,0x848F, // CYRILLIC SMALL LETTER E
+ 0x044E,0x8490, // CYRILLIC SMALL LETTER YU
+ 0x044F,0x8491, // CYRILLIC SMALL LETTER YA
+ 0x0451,0x8476, // CYRILLIC SMALL LETTER IO
+ 0x2010,0x815D, // HYPHEN
+ 0x2014,0x815C, // EM DASH
+ 0x2016,0x8161, // DOUBLE VERTICAL LINE
+ 0x2018,0x8165, // LEFT SINGLE QUOTATION MARK
+ 0x2019,0x8166, // RIGHT SINGLE QUOTATION MARK
+ 0x201C,0x8167, // LEFT DOUBLE QUOTATION MARK
+ 0x201D,0x8168, // RIGHT DOUBLE QUOTATION MARK
+ 0x2020,0x81F5, // DAGGER
+ 0x2021,0x81F6, // DOUBLE DAGGER
+ 0x2025,0x8164, // TWO DOT LEADER
+ 0x2026,0x8163, // HORIZONTAL ELLIPSIS
+ 0x2030,0x81F1, // PER MILLE SIGN
+ 0x2032,0x818C, // PRIME
+ 0x2033,0x818D, // DOUBLE PRIME
+ 0x203B,0x81A6, // REFERENCE MARK
+ 0x2103,0x818E, // DEGREE CELSIUS
+ 0x212B,0x81F0, // ANGSTROM SIGN
+ 0x2190,0x81A9, // LEFTWARDS ARROW
+ 0x2191,0x81AA, // UPWARDS ARROW
+ 0x2192,0x81A8, // RIGHTWARDS ARROW
+ 0x2193,0x81AB, // DOWNWARDS ARROW
+ 0x21D2,0x81CB, // RIGHTWARDS DOUBLE ARROW
+ 0x21D4,0x81CC, // LEFT RIGHT DOUBLE ARROW
+ 0x2200,0x81CD, // FOR ALL
+ 0x2202,0x81DD, // PARTIAL DIFFERENTIAL
+ 0x2203,0x81CE, // THERE EXISTS
+ 0x2207,0x81DE, // NABLA
+ 0x2208,0x81B8, // ELEMENT OF
+ 0x220B,0x81B9, // CONTAINS AS MEMBER
+ 0x2212,0x817C, // MINUS SIGN
+ 0x221A,0x81E3, // SQUARE ROOT
+ 0x221D,0x81E5, // PROPORTIONAL TO
+ 0x221E,0x8187, // INFINITY
+ 0x2220,0x81DA, // ANGLE
+ 0x2227,0x81C8, // LOGICAL AND
+ 0x2228,0x81C9, // LOGICAL OR
+ 0x2229,0x81BF, // INTERSECTION
+ 0x222A,0x81BE, // UNION
+ 0x222B,0x81E7, // INTEGRAL
+ 0x222C,0x81E8, // DOUBLE INTEGRAL
+ 0x2234,0x8188, // THEREFORE
+ 0x2235,0x81E6, // BECAUSE
+ 0x223D,0x81E4, // REVERSED TILDE
+ 0x2252,0x81E0, // APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ 0x2260,0x8182, // NOT EQUAL TO
+ 0x2261,0x81DF, // IDENTICAL TO
+ 0x2266,0x8185, // LESS-THAN OVER EQUAL TO
+ 0x2267,0x8186, // GREATER-THAN OVER EQUAL TO
+ 0x226A,0x81E1, // MUCH LESS-THAN
+ 0x226B,0x81E2, // MUCH GREATER-THAN
+ 0x2282,0x81BC, // SUBSET OF
+ 0x2283,0x81BD, // SUPERSET OF
+ 0x2286,0x81BA, // SUBSET OF OR EQUAL TO
+ 0x2287,0x81BB, // SUPERSET OF OR EQUAL TO
+ 0x22A5,0x81DB, // UP TACK
+ 0x2312,0x81DC, // ARC
+ 0x2500,0x849F, // BOX DRAWINGS LIGHT HORIZONTAL
+ 0x2501,0x84AA, // BOX DRAWINGS HEAVY HORIZONTAL
+ 0x2502,0x84A0, // BOX DRAWINGS LIGHT VERTICAL
+ 0x2503,0x84AB, // BOX DRAWINGS HEAVY VERTICAL
+ 0x250C,0x84A1, // BOX DRAWINGS LIGHT DOWN AND RIGHT
+ 0x250F,0x84AC, // BOX DRAWINGS HEAVY DOWN AND RIGHT
+ 0x2510,0x84A2, // BOX DRAWINGS LIGHT DOWN AND LEFT
+ 0x2513,0x84AD, // BOX DRAWINGS HEAVY DOWN AND LEFT
+ 0x2514,0x84A4, // BOX DRAWINGS LIGHT UP AND RIGHT
+ 0x2517,0x84AF, // BOX DRAWINGS HEAVY UP AND RIGHT
+ 0x2518,0x84A3, // BOX DRAWINGS LIGHT UP AND LEFT
+ 0x251B,0x84AE, // BOX DRAWINGS HEAVY UP AND LEFT
+ 0x251C,0x84A5, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ 0x251D,0x84BA, // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ 0x2520,0x84B5, // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ 0x2523,0x84B0, // BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ 0x2524,0x84A7, // BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ 0x2525,0x84BC, // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ 0x2528,0x84B7, // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ 0x252B,0x84B2, // BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ 0x252C,0x84A6, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ 0x252F,0x84B6, // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ 0x2530,0x84BB, // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ 0x2533,0x84B1, // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ 0x2534,0x84A8, // BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ 0x2537,0x84B8, // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ 0x2538,0x84BD, // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ 0x253B,0x84B3, // BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ 0x253C,0x84A9, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ 0x253F,0x84B9, // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ 0x2542,0x84BE, // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ 0x254B,0x84B4, // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ 0x25A0,0x81A1, // BLACK SQUARE
+ 0x25A1,0x81A0, // WHITE SQUARE
+ 0x25B2,0x81A3, // BLACK UP-POINTING TRIANGLE
+ 0x25B3,0x81A2, // WHITE UP-POINTING TRIANGLE
+ 0x25BC,0x81A5, // BLACK DOWN-POINTING TRIANGLE
+ 0x25BD,0x81A4, // WHITE DOWN-POINTING TRIANGLE
+ 0x25C6,0x819F, // BLACK DIAMOND
+ 0x25C7,0x819E, // WHITE DIAMOND
+ 0x25CB,0x819B, // WHITE CIRCLE
+ 0x25CE,0x819D, // BULLSEYE
+ 0x25CF,0x819C, // BLACK CIRCLE
+ 0x25EF,0x81FC, // LARGE CIRCLE
+ 0x2605,0x819A, // BLACK STAR
+ 0x2606,0x8199, // WHITE STAR
+ 0x2640,0x818A, // FEMALE SIGN
+ 0x2642,0x8189, // MALE SIGN
+ 0x266A,0x81F4, // EIGHTH NOTE
+ 0x266D,0x81F3, // MUSIC FLAT SIGN
+ 0x266F,0x81F2, // MUSIC SHARP SIGN
+ 0x3000,0x8140, // IDEOGRAPHIC SPACE
+ 0x3001,0x8141, // IDEOGRAPHIC COMMA
+ 0x3002,0x8142, // IDEOGRAPHIC FULL STOP
+ 0x3003,0x8156, // DITTO MARK
+ 0x3005,0x8158, // IDEOGRAPHIC ITERATION MARK
+ 0x3006,0x8159, // IDEOGRAPHIC CLOSING MARK
+ 0x3007,0x815A, // IDEOGRAPHIC NUMBER ZERO
+ 0x3008,0x8171, // LEFT ANGLE BRACKET
+ 0x3009,0x8172, // RIGHT ANGLE BRACKET
+ 0x300A,0x8173, // LEFT DOUBLE ANGLE BRACKET
+ 0x300B,0x8174, // RIGHT DOUBLE ANGLE BRACKET
+ 0x300C,0x8175, // LEFT CORNER BRACKET
+ 0x300D,0x8176, // RIGHT CORNER BRACKET
+ 0x300E,0x8177, // LEFT WHITE CORNER BRACKET
+ 0x300F,0x8178, // RIGHT WHITE CORNER BRACKET
+ 0x3010,0x8179, // LEFT BLACK LENTICULAR BRACKET
+ 0x3011,0x817A, // RIGHT BLACK LENTICULAR BRACKET
+ 0x3012,0x81A7, // POSTAL MARK
+ 0x3013,0x81AC, // GETA MARK
+ 0x3014,0x816B, // LEFT TORTOISE SHELL BRACKET
+ 0x3015,0x816C, // RIGHT TORTOISE SHELL BRACKET
+ 0x301C,0x8160, // WAVE DASH
+ 0x3041,0x829F, // HIRAGANA LETTER SMALL A
+ 0x3042,0x82A0, // HIRAGANA LETTER A
+ 0x3043,0x82A1, // HIRAGANA LETTER SMALL I
+ 0x3044,0x82A2, // HIRAGANA LETTER I
+ 0x3045,0x82A3, // HIRAGANA LETTER SMALL U
+ 0x3046,0x82A4, // HIRAGANA LETTER U
+ 0x3047,0x82A5, // HIRAGANA LETTER SMALL E
+ 0x3048,0x82A6, // HIRAGANA LETTER E
+ 0x3049,0x82A7, // HIRAGANA LETTER SMALL O
+ 0x304A,0x82A8, // HIRAGANA LETTER O
+ 0x304B,0x82A9, // HIRAGANA LETTER KA
+ 0x304C,0x82AA, // HIRAGANA LETTER GA
+ 0x304D,0x82AB, // HIRAGANA LETTER KI
+ 0x304E,0x82AC, // HIRAGANA LETTER GI
+ 0x304F,0x82AD, // HIRAGANA LETTER KU
+ 0x3050,0x82AE, // HIRAGANA LETTER GU
+ 0x3051,0x82AF, // HIRAGANA LETTER KE
+ 0x3052,0x82B0, // HIRAGANA LETTER GE
+ 0x3053,0x82B1, // HIRAGANA LETTER KO
+ 0x3054,0x82B2, // HIRAGANA LETTER GO
+ 0x3055,0x82B3, // HIRAGANA LETTER SA
+ 0x3056,0x82B4, // HIRAGANA LETTER ZA
+ 0x3057,0x82B5, // HIRAGANA LETTER SI
+ 0x3058,0x82B6, // HIRAGANA LETTER ZI
+ 0x3059,0x82B7, // HIRAGANA LETTER SU
+ 0x305A,0x82B8, // HIRAGANA LETTER ZU
+ 0x305B,0x82B9, // HIRAGANA LETTER SE
+ 0x305C,0x82BA, // HIRAGANA LETTER ZE
+ 0x305D,0x82BB, // HIRAGANA LETTER SO
+ 0x305E,0x82BC, // HIRAGANA LETTER ZO
+ 0x305F,0x82BD, // HIRAGANA LETTER TA
+ 0x3060,0x82BE, // HIRAGANA LETTER DA
+ 0x3061,0x82BF, // HIRAGANA LETTER TI
+ 0x3062,0x82C0, // HIRAGANA LETTER DI
+ 0x3063,0x82C1, // HIRAGANA LETTER SMALL TU
+ 0x3064,0x82C2, // HIRAGANA LETTER TU
+ 0x3065,0x82C3, // HIRAGANA LETTER DU
+ 0x3066,0x82C4, // HIRAGANA LETTER TE
+ 0x3067,0x82C5, // HIRAGANA LETTER DE
+ 0x3068,0x82C6, // HIRAGANA LETTER TO
+ 0x3069,0x82C7, // HIRAGANA LETTER DO
+ 0x306A,0x82C8, // HIRAGANA LETTER NA
+ 0x306B,0x82C9, // HIRAGANA LETTER NI
+ 0x306C,0x82CA, // HIRAGANA LETTER NU
+ 0x306D,0x82CB, // HIRAGANA LETTER NE
+ 0x306E,0x82CC, // HIRAGANA LETTER NO
+ 0x306F,0x82CD, // HIRAGANA LETTER HA
+ 0x3070,0x82CE, // HIRAGANA LETTER BA
+ 0x3071,0x82CF, // HIRAGANA LETTER PA
+ 0x3072,0x82D0, // HIRAGANA LETTER HI
+ 0x3073,0x82D1, // HIRAGANA LETTER BI
+ 0x3074,0x82D2, // HIRAGANA LETTER PI
+ 0x3075,0x82D3, // HIRAGANA LETTER HU
+ 0x3076,0x82D4, // HIRAGANA LETTER BU
+ 0x3077,0x82D5, // HIRAGANA LETTER PU
+ 0x3078,0x82D6, // HIRAGANA LETTER HE
+ 0x3079,0x82D7, // HIRAGANA LETTER BE
+ 0x307A,0x82D8, // HIRAGANA LETTER PE
+ 0x307B,0x82D9, // HIRAGANA LETTER HO
+ 0x307C,0x82DA, // HIRAGANA LETTER BO
+ 0x307D,0x82DB, // HIRAGANA LETTER PO
+ 0x307E,0x82DC, // HIRAGANA LETTER MA
+ 0x307F,0x82DD, // HIRAGANA LETTER MI
+ 0x3080,0x82DE, // HIRAGANA LETTER MU
+ 0x3081,0x82DF, // HIRAGANA LETTER ME
+ 0x3082,0x82E0, // HIRAGANA LETTER MO
+ 0x3083,0x82E1, // HIRAGANA LETTER SMALL YA
+ 0x3084,0x82E2, // HIRAGANA LETTER YA
+ 0x3085,0x82E3, // HIRAGANA LETTER SMALL YU
+ 0x3086,0x82E4, // HIRAGANA LETTER YU
+ 0x3087,0x82E5, // HIRAGANA LETTER SMALL YO
+ 0x3088,0x82E6, // HIRAGANA LETTER YO
+ 0x3089,0x82E7, // HIRAGANA LETTER RA
+ 0x308A,0x82E8, // HIRAGANA LETTER RI
+ 0x308B,0x82E9, // HIRAGANA LETTER RU
+ 0x308C,0x82EA, // HIRAGANA LETTER RE
+ 0x308D,0x82EB, // HIRAGANA LETTER RO
+ 0x308E,0x82EC, // HIRAGANA LETTER SMALL WA
+ 0x308F,0x82ED, // HIRAGANA LETTER WA
+ 0x3090,0x82EE, // HIRAGANA LETTER WI
+ 0x3091,0x82EF, // HIRAGANA LETTER WE
+ 0x3092,0x82F0, // HIRAGANA LETTER WO
+ 0x3093,0x82F1, // HIRAGANA LETTER N
+ 0x309B,0x814A, // KATAKANA-HIRAGANA VOICED SOUND MARK
+ 0x309C,0x814B, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ 0x309D,0x8154, // HIRAGANA ITERATION MARK
+ 0x309E,0x8155, // HIRAGANA VOICED ITERATION MARK
+ 0x30A1,0x8340, // KATAKANA LETTER SMALL A
+ 0x30A2,0x8341, // KATAKANA LETTER A
+ 0x30A3,0x8342, // KATAKANA LETTER SMALL I
+ 0x30A4,0x8343, // KATAKANA LETTER I
+ 0x30A5,0x8344, // KATAKANA LETTER SMALL U
+ 0x30A6,0x8345, // KATAKANA LETTER U
+ 0x30A7,0x8346, // KATAKANA LETTER SMALL E
+ 0x30A8,0x8347, // KATAKANA LETTER E
+ 0x30A9,0x8348, // KATAKANA LETTER SMALL O
+ 0x30AA,0x8349, // KATAKANA LETTER O
+ 0x30AB,0x834A, // KATAKANA LETTER KA
+ 0x30AC,0x834B, // KATAKANA LETTER GA
+ 0x30AD,0x834C, // KATAKANA LETTER KI
+ 0x30AE,0x834D, // KATAKANA LETTER GI
+ 0x30AF,0x834E, // KATAKANA LETTER KU
+ 0x30B0,0x834F, // KATAKANA LETTER GU
+ 0x30B1,0x8350, // KATAKANA LETTER KE
+ 0x30B2,0x8351, // KATAKANA LETTER GE
+ 0x30B3,0x8352, // KATAKANA LETTER KO
+ 0x30B4,0x8353, // KATAKANA LETTER GO
+ 0x30B5,0x8354, // KATAKANA LETTER SA
+ 0x30B6,0x8355, // KATAKANA LETTER ZA
+ 0x30B7,0x8356, // KATAKANA LETTER SI
+ 0x30B8,0x8357, // KATAKANA LETTER ZI
+ 0x30B9,0x8358, // KATAKANA LETTER SU
+ 0x30BA,0x8359, // KATAKANA LETTER ZU
+ 0x30BB,0x835A, // KATAKANA LETTER SE
+ 0x30BD,0x835C, // KATAKANA LETTER SO
+ 0x30BE,0x835D, // KATAKANA LETTER ZO
+ 0x30BF,0x835E, // KATAKANA LETTER TA
+ 0x30C0,0x835F, // KATAKANA LETTER DA
+ 0x30C1,0x8360, // KATAKANA LETTER TI
+ 0x30C2,0x8361, // KATAKANA LETTER DI
+ 0x30C3,0x8362, // KATAKANA LETTER SMALL TU
+ 0x30C4,0x8363, // KATAKANA LETTER TU
+ 0x30C5,0x8364, // KATAKANA LETTER DU
+ 0x30C6,0x8365, // KATAKANA LETTER TE
+ 0x30C7,0x8366, // KATAKANA LETTER DE
+ 0x30C8,0x8367, // KATAKANA LETTER TO
+ 0x30C9,0x8368, // KATAKANA LETTER DO
+ 0x30CA,0x8369, // KATAKANA LETTER NA
+ 0x30CB,0x836A, // KATAKANA LETTER NI
+ 0x30CC,0x836B, // KATAKANA LETTER NU
+ 0x30CD,0x836C, // KATAKANA LETTER NE
+ 0x30CE,0x836D, // KATAKANA LETTER NO
+ 0x30CF,0x836E, // KATAKANA LETTER HA
+ 0x30D0,0x836F, // KATAKANA LETTER BA
+ 0x30D1,0x8370, // KATAKANA LETTER PA
+ 0x30D2,0x8371, // KATAKANA LETTER HI
+ 0x30D3,0x8372, // KATAKANA LETTER BI
+ 0x30D4,0x8373, // KATAKANA LETTER PI
+ 0x30D5,0x8374, // KATAKANA LETTER HU
+ 0x30D6,0x8375, // KATAKANA LETTER BU
+ 0x30D7,0x8376, // KATAKANA LETTER PU
+ 0x30D8,0x8377, // KATAKANA LETTER HE
+ 0x30D9,0x8378, // KATAKANA LETTER BE
+ 0x30DA,0x8379, // KATAKANA LETTER PE
+ 0x30DB,0x837A, // KATAKANA LETTER HO
+ 0x30DC,0x837B, // KATAKANA LETTER BO
+ 0x30DD,0x837C, // KATAKANA LETTER PO
+ 0x30DE,0x837D, // KATAKANA LETTER MA
+ 0x30DF,0x837E, // KATAKANA LETTER MI
+ 0x30E0,0x8380, // KATAKANA LETTER MU
+ 0x30E1,0x8381, // KATAKANA LETTER ME
+ 0x30E2,0x8382, // KATAKANA LETTER MO
+ 0x30E3,0x8383, // KATAKANA LETTER SMALL YA
+ 0x30E4,0x8384, // KATAKANA LETTER YA
+ 0x30E5,0x8385, // KATAKANA LETTER SMALL YU
+ 0x30E6,0x8386, // KATAKANA LETTER YU
+ 0x30E7,0x8387, // KATAKANA LETTER SMALL YO
+ 0x30E8,0x8388, // KATAKANA LETTER YO
+ 0x30E9,0x8389, // KATAKANA LETTER RA
+ 0x30EA,0x838A, // KATAKANA LETTER RI
+ 0x30EB,0x838B, // KATAKANA LETTER RU
+ 0x30EC,0x838C, // KATAKANA LETTER RE
+ 0x30ED,0x838D, // KATAKANA LETTER RO
+ 0x30EE,0x838E, // KATAKANA LETTER SMALL WA
+ 0x30EF,0x838F, // KATAKANA LETTER WA
+ 0x30F0,0x8390, // KATAKANA LETTER WI
+ 0x30F1,0x8391, // KATAKANA LETTER WE
+ 0x30F2,0x8392, // KATAKANA LETTER WO
+ 0x30F3,0x8393, // KATAKANA LETTER N
+ 0x30F4,0x8394, // KATAKANA LETTER VU
+ 0x30F5,0x8395, // KATAKANA LETTER SMALL KA
+ 0x30F6,0x8396, // KATAKANA LETTER SMALL KE
+ 0x30FB,0x8145, // KATAKANA MIDDLE DOT
+ 0x30FD,0x8152, // KATAKANA ITERATION MARK
+ 0x30FE,0x8153, // KATAKANA VOICED ITERATION MARK
+ 0x4E00,0x88EA, // <cjk>
+ 0x4E01,0x929A, // <cjk>
+ 0x4E03,0x8EB5, // <cjk>
+ 0x4E07,0x969C, // <cjk>
+ 0x4E08,0x8FE4, // <cjk>
+ 0x4E09,0x8E4F, // <cjk>
+ 0x4E0A,0x8FE3, // <cjk>
+ 0x4E0B,0x89BA, // <cjk>
+ 0x4E0D,0x9573, // <cjk>
+ 0x4E0E,0x975E, // <cjk>
+ 0x4E10,0x98A0, // <cjk>
+ 0x4E11,0x894E, // <cjk>
+ 0x4E14,0x8A8E, // <cjk>
+ 0x4E15,0x98A1, // <cjk>
+ 0x4E16,0x90A2, // <cjk>
+ 0x4E17,0x99C0, // <cjk>
+ 0x4E18,0x8B75, // <cjk>
+ 0x4E19,0x95B8, // <cjk>
+ 0x4E1E,0x8FE5, // <cjk>
+ 0x4E21,0x97BC, // <cjk>
+ 0x4E26,0x95C0, // <cjk>
+ 0x4E2A,0x98A2, // <cjk>
+ 0x4E2D,0x9286, // <cjk>
+ 0x4E31,0x98A3, // <cjk>
+ 0x4E32,0x8BF8, // <cjk>
+ 0x4E36,0x98A4, // <cjk>
+ 0x4E38,0x8ADB, // <cjk>
+ 0x4E39,0x924F, // <cjk>
+ 0x4E3B,0x8EE5, // <cjk>
+ 0x4E3C,0x98A5, // <cjk>
+ 0x4E3F,0x98A6, // <cjk>
+ 0x4E42,0x98A7, // <cjk>
+ 0x4E43,0x9454, // <cjk>
+ 0x4E45,0x8B76, // <cjk>
+ 0x4E4B,0x9456, // <cjk>
+ 0x4E4D,0x93E1, // <cjk>
+ 0x4E4E,0x8CC1, // <cjk>
+ 0x4E4F,0x9652, // <cjk>
+ 0x4E55,0xE568, // <cjk>
+ 0x4E56,0x98A8, // <cjk>
+ 0x4E57,0x8FE6, // <cjk>
+ 0x4E58,0x98A9, // <cjk>
+ 0x4E59,0x89B3, // <cjk>
+ 0x4E5D,0x8BE3, // <cjk>
+ 0x4E5E,0x8CEE, // <cjk>
+ 0x4E5F,0x96E7, // <cjk>
+ 0x4E62,0x9BA4, // <cjk>
+ 0x4E71,0x9790, // <cjk>
+ 0x4E73,0x93FB, // <cjk>
+ 0x4E7E,0x8AA3, // <cjk>
+ 0x4E80,0x8B54, // <cjk>
+ 0x4E82,0x98AA, // <cjk>
+ 0x4E85,0x98AB, // <cjk>
+ 0x4E86,0x97B9, // <cjk>
+ 0x4E88,0x975C, // <cjk>
+ 0x4E89,0x9188, // <cjk>
+ 0x4E8A,0x98AD, // <cjk>
+ 0x4E8B,0x8E96, // <cjk>
+ 0x4E8C,0x93F1, // <cjk>
+ 0x4E8E,0x98B0, // <cjk>
+ 0x4E91,0x895D, // <cjk>
+ 0x4E92,0x8CDD, // <cjk>
+ 0x4E94,0x8CDC, // <cjk>
+ 0x4E95,0x88E4, // <cjk>
+ 0x4E98,0x986A, // <cjk>
+ 0x4E99,0x9869, // <cjk>
+ 0x4E9B,0x8DB1, // <cjk>
+ 0x4E9C,0x889F, // <cjk>
+ 0x4E9E,0x98B1, // <cjk>
+ 0x4E9F,0x98B2, // <cjk>
+ 0x4EA0,0x98B3, // <cjk>
+ 0x4EA1,0x9653, // <cjk>
+ 0x4EA2,0x98B4, // <cjk>
+ 0x4EA4,0x8CF0, // <cjk>
+ 0x4EA5,0x88E5, // <cjk>
+ 0x4EA6,0x9692, // <cjk>
+ 0x4EA8,0x8B9C, // <cjk>
+ 0x4EAB,0x8B9D, // <cjk>
+ 0x4EAC,0x8B9E, // <cjk>
+ 0x4EAD,0x92E0, // <cjk>
+ 0x4EAE,0x97BA, // <cjk>
+ 0x4EB0,0x98B5, // <cjk>
+ 0x4EB3,0x98B6, // <cjk>
+ 0x4EB6,0x98B7, // <cjk>
+ 0x4EBA,0x906C, // <cjk>
+ 0x4EC0,0x8F59, // <cjk>
+ 0x4EC1,0x906D, // <cjk>
+ 0x4EC2,0x98BC, // <cjk>
+ 0x4EC4,0x98BA, // <cjk>
+ 0x4EC6,0x98BB, // <cjk>
+ 0x4EC7,0x8B77, // <cjk>
+ 0x4ECA,0x8DA1, // <cjk>
+ 0x4ECB,0x89EE, // <cjk>
+ 0x4ECD,0x98B9, // <cjk>
+ 0x4ECE,0x98B8, // <cjk>
+ 0x4ECF,0x95A7, // <cjk>
+ 0x4ED4,0x8E65, // <cjk>
+ 0x4ED5,0x8E64, // <cjk>
+ 0x4ED6,0x91BC, // <cjk>
+ 0x4ED7,0x98BD, // <cjk>
+ 0x4ED8,0x9574, // <cjk>
+ 0x4ED9,0x90E5, // <cjk>
+ 0x4EDD,0x8157, // <cjk>
+ 0x4EDE,0x98BE, // <cjk>
+ 0x4EDF,0x98C0, // <cjk>
+ 0x4EE3,0x91E3, // <cjk>
+ 0x4EE4,0x97DF, // <cjk>
+ 0x4EE5,0x88C8, // <cjk>
+ 0x4EED,0x98BF, // <cjk>
+ 0x4EEE,0x89BC, // <cjk>
+ 0x4EF0,0x8BC2, // <cjk>
+ 0x4EF2,0x9287, // <cjk>
+ 0x4EF6,0x8C8F, // <cjk>
+ 0x4EF7,0x98C1, // <cjk>
+ 0x4EFB,0x9443, // <cjk>
+ 0x4F01,0x8AE9, // <cjk>
+ 0x4F09,0x98C2, // <cjk>
+ 0x4F0A,0x88C9, // <cjk>
+ 0x4F0D,0x8CDE, // <cjk>
+ 0x4F0E,0x8AEA, // <cjk>
+ 0x4F0F,0x959A, // <cjk>
+ 0x4F10,0x94B0, // <cjk>
+ 0x4F11,0x8B78, // <cjk>
+ 0x4F1A,0x89EF, // <cjk>
+ 0x4F1C,0x98E5, // <cjk>
+ 0x4F1D,0x9360, // <cjk>
+ 0x4F2F,0x948C, // <cjk>
+ 0x4F30,0x98C4, // <cjk>
+ 0x4F34,0x94BA, // <cjk>
+ 0x4F36,0x97E0, // <cjk>
+ 0x4F38,0x904C, // <cjk>
+ 0x4F3A,0x8E66, // <cjk>
+ 0x4F3C,0x8E97, // <cjk>
+ 0x4F3D,0x89BE, // <cjk>
+ 0x4F43,0x92CF, // <cjk>
+ 0x4F46,0x9241, // <cjk>
+ 0x4F47,0x98C8, // <cjk>
+ 0x4F4D,0x88CA, // <cjk>
+ 0x4F4E,0x92E1, // <cjk>
+ 0x4F4F,0x8F5A, // <cjk>
+ 0x4F50,0x8DB2, // <cjk>
+ 0x4F51,0x9743, // <cjk>
+ 0x4F53,0x91CC, // <cjk>
+ 0x4F55,0x89BD, // <cjk>
+ 0x4F57,0x98C7, // <cjk>
+ 0x4F59,0x975D, // <cjk>
+ 0x4F5A,0x98C3, // <cjk>
+ 0x4F5B,0x98C5, // <cjk>
+ 0x4F5C,0x8DEC, // <cjk>
+ 0x4F5D,0x98C6, // <cjk>
+ 0x4F5E,0x9B43, // <cjk>
+ 0x4F69,0x98CE, // <cjk>
+ 0x4F6F,0x98D1, // <cjk>
+ 0x4F70,0x98CF, // <cjk>
+ 0x4F73,0x89C0, // <cjk>
+ 0x4F75,0x95B9, // <cjk>
+ 0x4F76,0x98C9, // <cjk>
+ 0x4F7B,0x98CD, // <cjk>
+ 0x4F7C,0x8CF1, // <cjk>
+ 0x4F7F,0x8E67, // <cjk>
+ 0x4F83,0x8AA4, // <cjk>
+ 0x4F86,0x98D2, // <cjk>
+ 0x4F88,0x98CA, // <cjk>
+ 0x4F8B,0x97E1, // <cjk>
+ 0x4F8D,0x8E98, // <cjk>
+ 0x4F8F,0x98CB, // <cjk>
+ 0x4F91,0x98D0, // <cjk>
+ 0x4F96,0x98D3, // <cjk>
+ 0x4F98,0x98CC, // <cjk>
+ 0x4F9B,0x8B9F, // <cjk>
+ 0x4F9D,0x88CB, // <cjk>
+ 0x4FA0,0x8BA0, // <cjk>
+ 0x4FA1,0x89BF, // <cjk>
+ 0x4FAB,0x9B44, // <cjk>
+ 0x4FAD,0x9699, // <cjk>
+ 0x4FAE,0x958E, // <cjk>
+ 0x4FAF,0x8CF2, // <cjk>
+ 0x4FB5,0x904E, // <cjk>
+ 0x4FB6,0x97B5, // <cjk>
+ 0x4FBF,0x95D6, // <cjk>
+ 0x4FC2,0x8C57, // <cjk>
+ 0x4FC3,0x91A3, // <cjk>
+ 0x4FC4,0x89E2, // <cjk>
+ 0x4FCA,0x8F72, // <cjk>
+ 0x4FCE,0x98D7, // <cjk>
+ 0x4FD0,0x98DC, // <cjk>
+ 0x4FD1,0x98DA, // <cjk>
+ 0x4FD4,0x98D5, // <cjk>
+ 0x4FD7,0x91AD, // <cjk>
+ 0x4FD8,0x98D8, // <cjk>
+ 0x4FDA,0x98DB, // <cjk>
+ 0x4FDB,0x98D9, // <cjk>
+ 0x4FDD,0x95DB, // <cjk>
+ 0x4FDF,0x98D6, // <cjk>
+ 0x4FE1,0x904D, // <cjk>
+ 0x4FE3,0x9693, // <cjk>
+ 0x4FE4,0x98DD, // <cjk>
+ 0x4FE5,0x98DE, // <cjk>
+ 0x4FEE,0x8F43, // <cjk>
+ 0x4FEF,0x98EB, // <cjk>
+ 0x4FF3,0x946F, // <cjk>
+ 0x4FF5,0x9555, // <cjk>
+ 0x4FF6,0x98E6, // <cjk>
+ 0x4FF8,0x95EE, // <cjk>
+ 0x4FFA,0x89B4, // <cjk>
+ 0x4FFE,0x98EA, // <cjk>
+ 0x5005,0x98E4, // <cjk>
+ 0x5006,0x98ED, // <cjk>
+ 0x5009,0x9171, // <cjk>
+ 0x500B,0x8CC2, // <cjk>
+ 0x500D,0x947B, // <cjk>
+ 0x500F,0xE0C5, // <cjk>
+ 0x5011,0x98EC, // <cjk>
+ 0x5012,0x937C, // <cjk>
+ 0x5014,0x98E1, // <cjk>
+ 0x5016,0x8CF4, // <cjk>
+ 0x5019,0x8CF3, // <cjk>
+ 0x501A,0x98DF, // <cjk>
+ 0x501F,0x8ED8, // <cjk>
+ 0x5021,0x98E7, // <cjk>
+ 0x5023,0x95ED, // <cjk>
+ 0x5024,0x926C, // <cjk>
+ 0x5025,0x98E3, // <cjk>
+ 0x5026,0x8C91, // <cjk>
+ 0x5028,0x98E0, // <cjk>
+ 0x5029,0x98E8, // <cjk>
+ 0x502A,0x98E2, // <cjk>
+ 0x502B,0x97CF, // <cjk>
+ 0x502C,0x98E9, // <cjk>
+ 0x502D,0x9860, // <cjk>
+ 0x5036,0x8BE4, // <cjk>
+ 0x5039,0x8C90, // <cjk>
+ 0x5043,0x98EE, // <cjk>
+ 0x5047,0x98EF, // <cjk>
+ 0x5048,0x98F3, // <cjk>
+ 0x5049,0x88CC, // <cjk>
+ 0x504F,0x95CE, // <cjk>
+ 0x5050,0x98F2, // <cjk>
+ 0x5055,0x98F1, // <cjk>
+ 0x5056,0x98F5, // <cjk>
+ 0x505A,0x98F4, // <cjk>
+ 0x505C,0x92E2, // <cjk>
+ 0x5065,0x8C92, // <cjk>
+ 0x506C,0x98F6, // <cjk>
+ 0x5072,0x8EC3, // <cjk>
+ 0x5074,0x91A4, // <cjk>
+ 0x5075,0x92E3, // <cjk>
+ 0x5076,0x8BF4, // <cjk>
+ 0x5078,0x98F7, // <cjk>
+ 0x507D,0x8B55, // <cjk>
+ 0x5080,0x98F8, // <cjk>
+ 0x5085,0x98FA, // <cjk>
+ 0x508D,0x9654, // <cjk>
+ 0x5091,0x8C86, // <cjk>
+ 0x5098,0x8E50, // <cjk>
+ 0x5099,0x94F5, // <cjk>
+ 0x509A,0x98F9, // <cjk>
+ 0x50AC,0x8DC3, // <cjk>
+ 0x50AD,0x9762, // <cjk>
+ 0x50B2,0x98FC, // <cjk>
+ 0x50B3,0x9942, // <cjk>
+ 0x50B4,0x98FB, // <cjk>
+ 0x50B5,0x8DC2, // <cjk>
+ 0x50B7,0x8F9D, // <cjk>
+ 0x50BE,0x8C58, // <cjk>
+ 0x50C2,0x9943, // <cjk>
+ 0x50C5,0x8BCD, // <cjk>
+ 0x50C9,0x9940, // <cjk>
+ 0x50CA,0x9941, // <cjk>
+ 0x50CD,0x93AD, // <cjk>
+ 0x50CF,0x919C, // <cjk>
+ 0x50D1,0x8BA1, // <cjk>
+ 0x50D5,0x966C, // <cjk>
+ 0x50D6,0x9944, // <cjk>
+ 0x50DA,0x97BB, // <cjk>
+ 0x50DE,0x9945, // <cjk>
+ 0x50E3,0x9948, // <cjk>
+ 0x50E5,0x9946, // <cjk>
+ 0x50E7,0x916D, // <cjk>
+ 0x50ED,0x9947, // <cjk>
+ 0x50EE,0x9949, // <cjk>
+ 0x50F5,0x994B, // <cjk>
+ 0x50F9,0x994A, // <cjk>
+ 0x50FB,0x95C6, // <cjk>
+ 0x5100,0x8B56, // <cjk>
+ 0x5101,0x994D, // <cjk>
+ 0x5102,0x994E, // <cjk>
+ 0x5104,0x89AD, // <cjk>
+ 0x5109,0x994C, // <cjk>
+ 0x5112,0x8EF2, // <cjk>
+ 0x5114,0x9951, // <cjk>
+ 0x5115,0x9950, // <cjk>
+ 0x5116,0x994F, // <cjk>
+ 0x5118,0x98D4, // <cjk>
+ 0x511A,0x9952, // <cjk>
+ 0x511F,0x8F9E, // <cjk>
+ 0x5121,0x9953, // <cjk>
+ 0x512A,0x9744, // <cjk>
+ 0x5132,0x96D7, // <cjk>
+ 0x5137,0x9955, // <cjk>
+ 0x513A,0x9954, // <cjk>
+ 0x513B,0x9957, // <cjk>
+ 0x513C,0x9956, // <cjk>
+ 0x513F,0x9958, // <cjk>
+ 0x5140,0x9959, // <cjk>
+ 0x5141,0x88F2, // <cjk>
+ 0x5143,0x8CB3, // <cjk>
+ 0x5144,0x8C5A, // <cjk>
+ 0x5146,0x929B, // <cjk>
+ 0x5147,0x8BA2, // <cjk>
+ 0x5148,0x90E6, // <cjk>
+ 0x5149,0x8CF5, // <cjk>
+ 0x514B,0x8D8E, // <cjk>
+ 0x514D,0x96C6, // <cjk>
+ 0x514E,0x9365, // <cjk>
+ 0x5150,0x8E99, // <cjk>
+ 0x5152,0x995A, // <cjk>
+ 0x5154,0x995C, // <cjk>
+ 0x515A,0x937D, // <cjk>
+ 0x515C,0x8A95, // <cjk>
+ 0x5162,0x995D, // <cjk>
+ 0x5165,0x93FC, // <cjk>
+ 0x5168,0x9153, // <cjk>
+ 0x5169,0x995F, // <cjk>
+ 0x516A,0x9960, // <cjk>
+ 0x516B,0x94AA, // <cjk>
+ 0x516C,0x8CF6, // <cjk>
+ 0x516D,0x985A, // <cjk>
+ 0x516E,0x9961, // <cjk>
+ 0x5171,0x8BA4, // <cjk>
+ 0x5175,0x95BA, // <cjk>
+ 0x5176,0x91B4, // <cjk>
+ 0x5177,0x8BEF, // <cjk>
+ 0x5178,0x9354, // <cjk>
+ 0x517C,0x8C93, // <cjk>
+ 0x5180,0x9962, // <cjk>
+ 0x5182,0x9963, // <cjk>
+ 0x5185,0x93E0, // <cjk>
+ 0x5186,0x897E, // <cjk>
+ 0x5189,0x9966, // <cjk>
+ 0x518A,0x8DFB, // <cjk>
+ 0x518C,0x9965, // <cjk>
+ 0x518D,0x8DC4, // <cjk>
+ 0x518F,0x9967, // <cjk>
+ 0x5190,0xE3EC, // <cjk>
+ 0x5191,0x9968, // <cjk>
+ 0x5192,0x9660, // <cjk>
+ 0x5193,0x9969, // <cjk>
+ 0x5195,0x996A, // <cjk>
+ 0x5196,0x996B, // <cjk>
+ 0x5197,0x8FE7, // <cjk>
+ 0x5199,0x8ECA, // <cjk>
+ 0x51A0,0x8AA5, // <cjk>
+ 0x51A2,0x996E, // <cjk>
+ 0x51A4,0x996C, // <cjk>
+ 0x51A5,0x96BB, // <cjk>
+ 0x51A6,0x996D, // <cjk>
+ 0x51A8,0x9579, // <cjk>
+ 0x51A9,0x996F, // <cjk>
+ 0x51AA,0x9970, // <cjk>
+ 0x51AB,0x9971, // <cjk>
+ 0x51AC,0x937E, // <cjk>
+ 0x51B0,0x9975, // <cjk>
+ 0x51B1,0x9973, // <cjk>
+ 0x51B2,0x9974, // <cjk>
+ 0x51B3,0x9972, // <cjk>
+ 0x51B4,0x8DE1, // <cjk>
+ 0x51B5,0x9976, // <cjk>
+ 0x51B6,0x96E8, // <cjk>
+ 0x51B7,0x97E2, // <cjk>
+ 0x51BD,0x9977, // <cjk>
+ 0x51C4,0x90A6, // <cjk>
+ 0x51C5,0x9978, // <cjk>
+ 0x51C6,0x8F79, // <cjk>
+ 0x51C9,0x9979, // <cjk>
+ 0x51CB,0x929C, // <cjk>
+ 0x51CC,0x97BD, // <cjk>
+ 0x51CD,0x9380, // <cjk>
+ 0x51D6,0x99C3, // <cjk>
+ 0x51DB,0x997A, // <cjk>
+ 0x51DC,0xEAA3, // <cjk>
+ 0x51DD,0x8BC3, // <cjk>
+ 0x51E0,0x997B, // <cjk>
+ 0x51E1,0x967D, // <cjk>
+ 0x51E6,0x8F88, // <cjk>
+ 0x51E7,0x91FA, // <cjk>
+ 0x51E9,0x997D, // <cjk>
+ 0x51EA,0x93E2, // <cjk>
+ 0x51ED,0x997E, // <cjk>
+ 0x51F0,0x9980, // <cjk>
+ 0x51F1,0x8A4D, // <cjk>
+ 0x51F5,0x9981, // <cjk>
+ 0x51F6,0x8BA5, // <cjk>
+ 0x51F8,0x93CA, // <cjk>
+ 0x51F9,0x899A, // <cjk>
+ 0x51FA,0x8F6F, // <cjk>
+ 0x51FD,0x949F, // <cjk>
+ 0x51FE,0x9982, // <cjk>
+ 0x5200,0x9381, // <cjk>
+ 0x5203,0x906E, // <cjk>
+ 0x5204,0x9983, // <cjk>
+ 0x5206,0x95AA, // <cjk>
+ 0x5207,0x90D8, // <cjk>
+ 0x5208,0x8AA0, // <cjk>
+ 0x520A,0x8AA7, // <cjk>
+ 0x520B,0x9984, // <cjk>
+ 0x520E,0x9986, // <cjk>
+ 0x5211,0x8C59, // <cjk>
+ 0x5214,0x9985, // <cjk>
+ 0x5217,0x97F1, // <cjk>
+ 0x521D,0x8F89, // <cjk>
+ 0x5224,0x94BB, // <cjk>
+ 0x5225,0x95CA, // <cjk>
+ 0x5227,0x9987, // <cjk>
+ 0x5229,0x9798, // <cjk>
+ 0x522A,0x9988, // <cjk>
+ 0x522E,0x9989, // <cjk>
+ 0x5230,0x939E, // <cjk>
+ 0x5233,0x998A, // <cjk>
+ 0x5236,0x90A7, // <cjk>
+ 0x5237,0x8DFC, // <cjk>
+ 0x5238,0x8C94, // <cjk>
+ 0x5239,0x998B, // <cjk>
+ 0x523A,0x8E68, // <cjk>
+ 0x523B,0x8D8F, // <cjk>
+ 0x5243,0x92E4, // <cjk>
+ 0x5244,0x998D, // <cjk>
+ 0x5247,0x91A5, // <cjk>
+ 0x524A,0x8DED, // <cjk>
+ 0x524B,0x998E, // <cjk>
+ 0x524C,0x998F, // <cjk>
+ 0x524D,0x914F, // <cjk>
+ 0x524F,0x998C, // <cjk>
+ 0x5254,0x9991, // <cjk>
+ 0x5256,0x9655, // <cjk>
+ 0x525B,0x8D84, // <cjk>
+ 0x525E,0x9990, // <cjk>
+ 0x5263,0x8C95, // <cjk>
+ 0x5264,0x8DDC, // <cjk>
+ 0x5265,0x948D, // <cjk>
+ 0x5269,0x9994, // <cjk>
+ 0x526A,0x9992, // <cjk>
+ 0x526F,0x959B, // <cjk>
+ 0x5270,0x8FE8, // <cjk>
+ 0x5271,0x999B, // <cjk>
+ 0x5272,0x8A84, // <cjk>
+ 0x5273,0x9995, // <cjk>
+ 0x5274,0x9993, // <cjk>
+ 0x5275,0x916E, // <cjk>
+ 0x527D,0x9997, // <cjk>
+ 0x527F,0x9996, // <cjk>
+ 0x5283,0x8A63, // <cjk>
+ 0x5287,0x8C80, // <cjk>
+ 0x5288,0x999C, // <cjk>
+ 0x5289,0x97AB, // <cjk>
+ 0x528D,0x9998, // <cjk>
+ 0x5291,0x999D, // <cjk>
+ 0x5292,0x999A, // <cjk>
+ 0x5294,0x9999, // <cjk>
+ 0x529B,0x97CD, // <cjk>
+ 0x529F,0x8CF7, // <cjk>
+ 0x52A0,0x89C1, // <cjk>
+ 0x52A3,0x97F2, // <cjk>
+ 0x52A9,0x8F95, // <cjk>
+ 0x52AA,0x9377, // <cjk>
+ 0x52AB,0x8D85, // <cjk>
+ 0x52AC,0x99A0, // <cjk>
+ 0x52AD,0x99A1, // <cjk>
+ 0x52B1,0x97E3, // <cjk>
+ 0x52B4,0x984A, // <cjk>
+ 0x52B5,0x99A3, // <cjk>
+ 0x52B9,0x8CF8, // <cjk>
+ 0x52BC,0x99A2, // <cjk>
+ 0x52BE,0x8A4E, // <cjk>
+ 0x52C1,0x99A4, // <cjk>
+ 0x52C3,0x9675, // <cjk>
+ 0x52C5,0x92BA, // <cjk>
+ 0x52C7,0x9745, // <cjk>
+ 0x52C9,0x95D7, // <cjk>
+ 0x52CD,0x99A5, // <cjk>
+ 0x52D2,0xE8D3, // <cjk>
+ 0x52D5,0x93AE, // <cjk>
+ 0x52D7,0x99A6, // <cjk>
+ 0x52D8,0x8AA8, // <cjk>
+ 0x52D9,0x96B1, // <cjk>
+ 0x52DD,0x8F9F, // <cjk>
+ 0x52DE,0x99A7, // <cjk>
+ 0x52DF,0x95E5, // <cjk>
+ 0x52E0,0x99AB, // <cjk>
+ 0x52E2,0x90A8, // <cjk>
+ 0x52E3,0x99A8, // <cjk>
+ 0x52E4,0x8BCE, // <cjk>
+ 0x52E6,0x99A9, // <cjk>
+ 0x52E7,0x8AA9, // <cjk>
+ 0x52F2,0x8C4D, // <cjk>
+ 0x52F3,0x99AC, // <cjk>
+ 0x52F5,0x99AD, // <cjk>
+ 0x52F8,0x99AE, // <cjk>
+ 0x52F9,0x99AF, // <cjk>
+ 0x52FA,0x8ED9, // <cjk>
+ 0x52FE,0x8CF9, // <cjk>
+ 0x52FF,0x96DC, // <cjk>
+ 0x5301,0x96E6, // <cjk>
+ 0x5302,0x93F5, // <cjk>
+ 0x5305,0x95EF, // <cjk>
+ 0x5306,0x99B0, // <cjk>
+ 0x5308,0x99B1, // <cjk>
+ 0x530D,0x99B3, // <cjk>
+ 0x530F,0x99B5, // <cjk>
+ 0x5310,0x99B4, // <cjk>
+ 0x5315,0x99B6, // <cjk>
+ 0x5316,0x89BB, // <cjk>
+ 0x5317,0x966B, // <cjk>
+ 0x5319,0x8DFA, // <cjk>
+ 0x531A,0x99B7, // <cjk>
+ 0x531D,0x9178, // <cjk>
+ 0x5320,0x8FA0, // <cjk>
+ 0x5321,0x8BA7, // <cjk>
+ 0x5323,0x99B8, // <cjk>
+ 0x532A,0x94D9, // <cjk>
+ 0x532F,0x99B9, // <cjk>
+ 0x5331,0x99BA, // <cjk>
+ 0x5333,0x99BB, // <cjk>
+ 0x5338,0x99BC, // <cjk>
+ 0x5339,0x9543, // <cjk>
+ 0x533A,0x8BE6, // <cjk>
+ 0x533B,0x88E3, // <cjk>
+ 0x533F,0x93BD, // <cjk>
+ 0x5340,0x99BD, // <cjk>
+ 0x5341,0x8F5C, // <cjk>
+ 0x5343,0x90E7, // <cjk>
+ 0x5345,0x99BF, // <cjk>
+ 0x5346,0x99BE, // <cjk>
+ 0x5347,0x8FA1, // <cjk>
+ 0x5348,0x8CDF, // <cjk>
+ 0x5349,0x99C1, // <cjk>
+ 0x534A,0x94BC, // <cjk>
+ 0x534D,0x99C2, // <cjk>
+ 0x5351,0x94DA, // <cjk>
+ 0x5352,0x91B2, // <cjk>
+ 0x5353,0x91EC, // <cjk>
+ 0x5354,0x8BA6, // <cjk>
+ 0x5357,0x93EC, // <cjk>
+ 0x5358,0x9250, // <cjk>
+ 0x535A,0x948E, // <cjk>
+ 0x535C,0x966D, // <cjk>
+ 0x535E,0x99C4, // <cjk>
+ 0x5360,0x90E8, // <cjk>
+ 0x5366,0x8C54, // <cjk>
+ 0x5369,0x99C5, // <cjk>
+ 0x536E,0x99C6, // <cjk>
+ 0x536F,0x894B, // <cjk>
+ 0x5370,0x88F3, // <cjk>
+ 0x5371,0x8AEB, // <cjk>
+ 0x5373,0x91A6, // <cjk>
+ 0x5374,0x8B70, // <cjk>
+ 0x5375,0x9791, // <cjk>
+ 0x5377,0x99C9, // <cjk>
+ 0x5378,0x89B5, // <cjk>
+ 0x537B,0x99C8, // <cjk>
+ 0x537F,0x8BA8, // <cjk>
+ 0x5382,0x99CA, // <cjk>
+ 0x5384,0x96EF, // <cjk>
+ 0x5396,0x99CB, // <cjk>
+ 0x5398,0x97D0, // <cjk>
+ 0x539A,0x8CFA, // <cjk>
+ 0x539F,0x8CB4, // <cjk>
+ 0x53A0,0x99CC, // <cjk>
+ 0x53A5,0x99CE, // <cjk>
+ 0x53A6,0x99CD, // <cjk>
+ 0x53A8,0x907E, // <cjk>
+ 0x53A9,0x8958, // <cjk>
+ 0x53AD,0x897D, // <cjk>
+ 0x53AE,0x99CF, // <cjk>
+ 0x53B0,0x99D0, // <cjk>
+ 0x53B3,0x8CB5, // <cjk>
+ 0x53B6,0x99D1, // <cjk>
+ 0x53BB,0x8B8E, // <cjk>
+ 0x53C2,0x8E51, // <cjk>
+ 0x53C3,0x99D2, // <cjk>
+ 0x53C8,0x9694, // <cjk>
+ 0x53C9,0x8DB3, // <cjk>
+ 0x53CA,0x8B79, // <cjk>
+ 0x53CB,0x9746, // <cjk>
+ 0x53CC,0x916F, // <cjk>
+ 0x53CD,0x94BD, // <cjk>
+ 0x53CE,0x8EFB, // <cjk>
+ 0x53D4,0x8F66, // <cjk>
+ 0x53D6,0x8EE6, // <cjk>
+ 0x53D7,0x8EF3, // <cjk>
+ 0x53D9,0x8F96, // <cjk>
+ 0x53DB,0x94BE, // <cjk>
+ 0x53DF,0x99D5, // <cjk>
+ 0x53E1,0x8962, // <cjk>
+ 0x53E2,0x9170, // <cjk>
+ 0x53E3,0x8CFB, // <cjk>
+ 0x53E4,0x8CC3, // <cjk>
+ 0x53E5,0x8BE5, // <cjk>
+ 0x53E8,0x99D9, // <cjk>
+ 0x53E9,0x9240, // <cjk>
+ 0x53EA,0x91FC, // <cjk>
+ 0x53EB,0x8BA9, // <cjk>
+ 0x53EC,0x8FA2, // <cjk>
+ 0x53ED,0x99DA, // <cjk>
+ 0x53EE,0x99D8, // <cjk>
+ 0x53EF,0x89C2, // <cjk>
+ 0x53F0,0x91E4, // <cjk>
+ 0x53F1,0x8EB6, // <cjk>
+ 0x53F2,0x8E6A, // <cjk>
+ 0x53F3,0x8945, // <cjk>
+ 0x53F6,0x8A90, // <cjk>
+ 0x53F7,0x8D86, // <cjk>
+ 0x53F8,0x8E69, // <cjk>
+ 0x53FA,0x99DB, // <cjk>
+ 0x5401,0x99DC, // <cjk>
+ 0x5403,0x8B68, // <cjk>
+ 0x5404,0x8A65, // <cjk>
+ 0x5408,0x8D87, // <cjk>
+ 0x5409,0x8B67, // <cjk>
+ 0x540A,0x92DD, // <cjk>
+ 0x540B,0x8944, // <cjk>
+ 0x540C,0x93AF, // <cjk>
+ 0x540D,0x96BC, // <cjk>
+ 0x540E,0x8D40, // <cjk>
+ 0x540F,0x9799, // <cjk>
+ 0x5410,0x9366, // <cjk>
+ 0x5411,0x8CFC, // <cjk>
+ 0x541B,0x8C4E, // <cjk>
+ 0x541D,0x99E5, // <cjk>
+ 0x541F,0x8BE1, // <cjk>
+ 0x5420,0x9669, // <cjk>
+ 0x5426,0x94DB, // <cjk>
+ 0x5429,0x99E4, // <cjk>
+ 0x542B,0x8ADC, // <cjk>
+ 0x542C,0x99DF, // <cjk>
+ 0x542D,0x99E0, // <cjk>
+ 0x542E,0x99E2, // <cjk>
+ 0x5436,0x99E3, // <cjk>
+ 0x5438,0x8B7A, // <cjk>
+ 0x5439,0x9081, // <cjk>
+ 0x543B,0x95AB, // <cjk>
+ 0x543C,0x99E1, // <cjk>
+ 0x543D,0x99DD, // <cjk>
+ 0x543E,0x8CE1, // <cjk>
+ 0x5440,0x99DE, // <cjk>
+ 0x5442,0x9843, // <cjk>
+ 0x5446,0x95F0, // <cjk>
+ 0x5448,0x92E6, // <cjk>
+ 0x5449,0x8CE0, // <cjk>
+ 0x544A,0x8D90, // <cjk>
+ 0x544E,0x99E6, // <cjk>
+ 0x5451,0x93DB, // <cjk>
+ 0x545F,0x99EA, // <cjk>
+ 0x5468,0x8EFC, // <cjk>
+ 0x546A,0x8EF4, // <cjk>
+ 0x5470,0x99ED, // <cjk>
+ 0x5471,0x99EB, // <cjk>
+ 0x5473,0x96A1, // <cjk>
+ 0x5475,0x99E8, // <cjk>
+ 0x5476,0x99F1, // <cjk>
+ 0x5477,0x99EC, // <cjk>
+ 0x547B,0x99EF, // <cjk>
+ 0x547C,0x8CC4, // <cjk>
+ 0x547D,0x96BD, // <cjk>
+ 0x5480,0x99F0, // <cjk>
+ 0x5484,0x99F2, // <cjk>
+ 0x5486,0x99F4, // <cjk>
+ 0x548B,0x8DEE, // <cjk>
+ 0x548C,0x9861, // <cjk>
+ 0x548E,0x99E9, // <cjk>
+ 0x548F,0x99E7, // <cjk>
+ 0x5490,0x99F3, // <cjk>
+ 0x5492,0x99EE, // <cjk>
+ 0x54A2,0x99F6, // <cjk>
+ 0x54A4,0x9A42, // <cjk>
+ 0x54A5,0x99F8, // <cjk>
+ 0x54A8,0x99FC, // <cjk>
+ 0x54AB,0x9A40, // <cjk>
+ 0x54AC,0x99F9, // <cjk>
+ 0x54AF,0x9A5D, // <cjk>
+ 0x54B2,0x8DE7, // <cjk>
+ 0x54B3,0x8A50, // <cjk>
+ 0x54B8,0x99F7, // <cjk>
+ 0x54BC,0x9A44, // <cjk>
+ 0x54BD,0x88F4, // <cjk>
+ 0x54BE,0x9A43, // <cjk>
+ 0x54C0,0x88A3, // <cjk>
+ 0x54C1,0x9569, // <cjk>
+ 0x54C2,0x9A41, // <cjk>
+ 0x54C4,0x99FA, // <cjk>
+ 0x54C7,0x99F5, // <cjk>
+ 0x54C8,0x99FB, // <cjk>
+ 0x54C9,0x8DC6, // <cjk>
+ 0x54D8,0x9A45, // <cjk>
+ 0x54E1,0x88F5, // <cjk>
+ 0x54E2,0x9A4E, // <cjk>
+ 0x54E5,0x9A46, // <cjk>
+ 0x54E6,0x9A47, // <cjk>
+ 0x54E8,0x8FA3, // <cjk>
+ 0x54E9,0x9689, // <cjk>
+ 0x54ED,0x9A4C, // <cjk>
+ 0x54EE,0x9A4B, // <cjk>
+ 0x54F2,0x934E, // <cjk>
+ 0x54FA,0x9A4D, // <cjk>
+ 0x54FD,0x9A4A, // <cjk>
+ 0x5504,0x8953, // <cjk>
+ 0x5506,0x8DB4, // <cjk>
+ 0x5507,0x904F, // <cjk>
+ 0x550F,0x9A48, // <cjk>
+ 0x5510,0x9382, // <cjk>
+ 0x5514,0x9A49, // <cjk>
+ 0x5516,0x88A0, // <cjk>
+ 0x552E,0x9A53, // <cjk>
+ 0x552F,0x9742, // <cjk>
+ 0x5531,0x8FA5, // <cjk>
+ 0x5533,0x9A59, // <cjk>
+ 0x5538,0x9A58, // <cjk>
+ 0x5539,0x9A4F, // <cjk>
+ 0x553E,0x91C1, // <cjk>
+ 0x5540,0x9A50, // <cjk>
+ 0x5544,0x91ED, // <cjk>
+ 0x5545,0x9A55, // <cjk>
+ 0x5546,0x8FA4, // <cjk>
+ 0x554C,0x9A52, // <cjk>
+ 0x554F,0x96E2, // <cjk>
+ 0x5556,0x9A56, // <cjk>
+ 0x5557,0x9A57, // <cjk>
+ 0x555C,0x9A54, // <cjk>
+ 0x555D,0x9A5A, // <cjk>
+ 0x5563,0x9A51, // <cjk>
+ 0x557B,0x9A60, // <cjk>
+ 0x557C,0x9A65, // <cjk>
+ 0x557E,0x9A61, // <cjk>
+ 0x5580,0x9A5C, // <cjk>
+ 0x5583,0x9A66, // <cjk>
+ 0x5584,0x9150, // <cjk>
+ 0x5587,0x9A68, // <cjk>
+ 0x5589,0x8D41, // <cjk>
+ 0x558A,0x9A5E, // <cjk>
+ 0x558B,0x929D, // <cjk>
+ 0x5598,0x9A62, // <cjk>
+ 0x559A,0x8AAB, // <cjk>
+ 0x559C,0x8AEC, // <cjk>
+ 0x559D,0x8A85, // <cjk>
+ 0x559E,0x9A63, // <cjk>
+ 0x559F,0x9A5F, // <cjk>
+ 0x55A7,0x8C96, // <cjk>
+ 0x55A8,0x9A69, // <cjk>
+ 0x55A9,0x9A67, // <cjk>
+ 0x55AA,0x9172, // <cjk>
+ 0x55AB,0x8B69, // <cjk>
+ 0x55AC,0x8BAA, // <cjk>
+ 0x55AE,0x9A64, // <cjk>
+ 0x55B0,0x8BF2, // <cjk>
+ 0x55B6,0x8963, // <cjk>
+ 0x55C4,0x9A6D, // <cjk>
+ 0x55C5,0x9A6B, // <cjk>
+ 0x55C7,0x9AA5, // <cjk>
+ 0x55D4,0x9A70, // <cjk>
+ 0x55DA,0x9A6A, // <cjk>
+ 0x55DC,0x9A6E, // <cjk>
+ 0x55DF,0x9A6C, // <cjk>
+ 0x55E3,0x8E6B, // <cjk>
+ 0x55E4,0x9A6F, // <cjk>
+ 0x55F7,0x9A72, // <cjk>
+ 0x55F9,0x9A77, // <cjk>
+ 0x55FD,0x9A75, // <cjk>
+ 0x55FE,0x9A74, // <cjk>
+ 0x5606,0x9251, // <cjk>
+ 0x5609,0x89C3, // <cjk>
+ 0x5614,0x9A71, // <cjk>
+ 0x5616,0x9A73, // <cjk>
+ 0x5617,0x8FA6, // <cjk>
+ 0x5618,0x8952, // <cjk>
+ 0x561B,0x9A76, // <cjk>
+ 0x5629,0x89DC, // <cjk>
+ 0x562F,0x9A82, // <cjk>
+ 0x5631,0x8FFA, // <cjk>
+ 0x5632,0x9A7D, // <cjk>
+ 0x5634,0x9A7B, // <cjk>
+ 0x5636,0x9A7C, // <cjk>
+ 0x5638,0x9A7E, // <cjk>
+ 0x5642,0x895C, // <cjk>
+ 0x564C,0x9158, // <cjk>
+ 0x564E,0x9A78, // <cjk>
+ 0x5650,0x9A79, // <cjk>
+ 0x565B,0x8A9A, // <cjk>
+ 0x5664,0x9A81, // <cjk>
+ 0x5668,0x8AED, // <cjk>
+ 0x566A,0x9A84, // <cjk>
+ 0x566B,0x9A80, // <cjk>
+ 0x566C,0x9A83, // <cjk>
+ 0x5674,0x95AC, // <cjk>
+ 0x5678,0x93D3, // <cjk>
+ 0x567A,0x94B6, // <cjk>
+ 0x5680,0x9A86, // <cjk>
+ 0x5686,0x9A85, // <cjk>
+ 0x5687,0x8A64, // <cjk>
+ 0x568A,0x9A87, // <cjk>
+ 0x568F,0x9A8A, // <cjk>
+ 0x5694,0x9A89, // <cjk>
+ 0x56A0,0x9A88, // <cjk>
+ 0x56A2,0x9458, // <cjk>
+ 0x56A5,0x9A8B, // <cjk>
+ 0x56AE,0x9A8C, // <cjk>
+ 0x56B4,0x9A8E, // <cjk>
+ 0x56B6,0x9A8D, // <cjk>
+ 0x56BC,0x9A90, // <cjk>
+ 0x56C0,0x9A93, // <cjk>
+ 0x56C1,0x9A91, // <cjk>
+ 0x56C2,0x9A8F, // <cjk>
+ 0x56C3,0x9A92, // <cjk>
+ 0x56C8,0x9A94, // <cjk>
+ 0x56CE,0x9A95, // <cjk>
+ 0x56D1,0x9A96, // <cjk>
+ 0x56D3,0x9A97, // <cjk>
+ 0x56D7,0x9A98, // <cjk>
+ 0x56D8,0x9964, // <cjk>
+ 0x56DA,0x8EFA, // <cjk>
+ 0x56DB,0x8E6C, // <cjk>
+ 0x56DE,0x89F1, // <cjk>
+ 0x56E0,0x88F6, // <cjk>
+ 0x56E3,0x9263, // <cjk>
+ 0x56EE,0x9A99, // <cjk>
+ 0x56F0,0x8DA2, // <cjk>
+ 0x56F2,0x88CD, // <cjk>
+ 0x56F3,0x907D, // <cjk>
+ 0x56F9,0x9A9A, // <cjk>
+ 0x56FA,0x8CC5, // <cjk>
+ 0x56FD,0x8D91, // <cjk>
+ 0x56FF,0x9A9C, // <cjk>
+ 0x5700,0x9A9B, // <cjk>
+ 0x5703,0x95DE, // <cjk>
+ 0x5704,0x9A9D, // <cjk>
+ 0x5708,0x9A9F, // <cjk>
+ 0x5709,0x9A9E, // <cjk>
+ 0x570B,0x9AA0, // <cjk>
+ 0x570D,0x9AA1, // <cjk>
+ 0x570F,0x8C97, // <cjk>
+ 0x5712,0x8980, // <cjk>
+ 0x5713,0x9AA2, // <cjk>
+ 0x5716,0x9AA4, // <cjk>
+ 0x5718,0x9AA3, // <cjk>
+ 0x571C,0x9AA6, // <cjk>
+ 0x571F,0x9379, // <cjk>
+ 0x5726,0x9AA7, // <cjk>
+ 0x5727,0x88B3, // <cjk>
+ 0x5728,0x8DDD, // <cjk>
+ 0x572D,0x8C5C, // <cjk>
+ 0x5730,0x926E, // <cjk>
+ 0x5737,0x9AA8, // <cjk>
+ 0x5738,0x9AA9, // <cjk>
+ 0x573B,0x9AAB, // <cjk>
+ 0x5740,0x9AAC, // <cjk>
+ 0x5742,0x8DE2, // <cjk>
+ 0x5747,0x8BCF, // <cjk>
+ 0x574A,0x9656, // <cjk>
+ 0x574E,0x9AAA, // <cjk>
+ 0x574F,0x9AAD, // <cjk>
+ 0x5750,0x8DBF, // <cjk>
+ 0x5751,0x8D42, // <cjk>
+ 0x5761,0x9AB1, // <cjk>
+ 0x5764,0x8DA3, // <cjk>
+ 0x5766,0x9252, // <cjk>
+ 0x5769,0x9AAE, // <cjk>
+ 0x576A,0x92D8, // <cjk>
+ 0x577F,0x9AB2, // <cjk>
+ 0x5782,0x9082, // <cjk>
+ 0x5788,0x9AB0, // <cjk>
+ 0x5789,0x9AB3, // <cjk>
+ 0x578B,0x8C5E, // <cjk>
+ 0x5793,0x9AB4, // <cjk>
+ 0x57A0,0x9AB5, // <cjk>
+ 0x57A2,0x8D43, // <cjk>
+ 0x57A3,0x8A5F, // <cjk>
+ 0x57A4,0x9AB7, // <cjk>
+ 0x57AA,0x9AB8, // <cjk>
+ 0x57B0,0x9AB9, // <cjk>
+ 0x57B3,0x9AB6, // <cjk>
+ 0x57C0,0x9AAF, // <cjk>
+ 0x57C3,0x9ABA, // <cjk>
+ 0x57C6,0x9ABB, // <cjk>
+ 0x57CB,0x9684, // <cjk>
+ 0x57CE,0x8FE9, // <cjk>
+ 0x57D2,0x9ABD, // <cjk>
+ 0x57D3,0x9ABE, // <cjk>
+ 0x57D4,0x9ABC, // <cjk>
+ 0x57D6,0x9AC0, // <cjk>
+ 0x57DC,0x9457, // <cjk>
+ 0x57DF,0x88E6, // <cjk>
+ 0x57E0,0x9575, // <cjk>
+ 0x57E3,0x9AC1, // <cjk>
+ 0x57F4,0x8FFB, // <cjk>
+ 0x57F7,0x8EB7, // <cjk>
+ 0x57F9,0x947C, // <cjk>
+ 0x57FA,0x8AEE, // <cjk>
+ 0x57FC,0x8DE9, // <cjk>
+ 0x5800,0x9678, // <cjk>
+ 0x5802,0x93B0, // <cjk>
+ 0x5805,0x8C98, // <cjk>
+ 0x5806,0x91CD, // <cjk>
+ 0x580A,0x9ABF, // <cjk>
+ 0x580B,0x9AC2, // <cjk>
+ 0x5815,0x91C2, // <cjk>
+ 0x5819,0x9AC3, // <cjk>
+ 0x581D,0x9AC4, // <cjk>
+ 0x5821,0x9AC6, // <cjk>
+ 0x5824,0x92E7, // <cjk>
+ 0x582A,0x8AAC, // <cjk>
+ 0x582F,0xEA9F, // <cjk>
+ 0x5830,0x8981, // <cjk>
+ 0x5831,0x95F1, // <cjk>
+ 0x5834,0x8FEA, // <cjk>
+ 0x5835,0x9367, // <cjk>
+ 0x583A,0x8DE4, // <cjk>
+ 0x583D,0x9ACC, // <cjk>
+ 0x5840,0x95BB, // <cjk>
+ 0x5841,0x97DB, // <cjk>
+ 0x584A,0x89F2, // <cjk>
+ 0x584B,0x9AC8, // <cjk>
+ 0x5851,0x9159, // <cjk>
+ 0x5852,0x9ACB, // <cjk>
+ 0x5854,0x9383, // &